Чтение онлайн

на главную

Жанры

Разработка приложений в среде Linux. Второе издание

Троан Эрик В.

Шрифт:

151: int count;

152: struct childProgram * prog;

153:

154: /* пропускаем первое свободное место (например, пробел) */

155: while (**commandPtr && isspace(**commandPtr)) (*commandPtr)++;

156:

157: /* обрабатываем пустые строки и первые символы '#' */

158: if (!**commandPtr || (**commandPtr=='#')) {

159: job->numProgs = 0;

160: *commandPtr = NULL;

161: return 0;

162: }

163:

164: *isBg = 0;

165: job->numProgs = 1;

166: job->progs = malloc(sizeof(*job->progs));

167:

168: /*
Мы задаем элементы массива argv для ссылки внутри строки.

169: Освобождение памяти осуществляется с помощью функции freeJob.

170:

171: Получив незанятую память, нам не нужно будет использовать завершающие

172: значения NULL, поэтому оставшаяся часть будет выглядеть аккуратнее

173: (хотя, честно говоря, менее эффективно). */

174: job->cmdBuf = command = calloc(1, strlen(*commandPtr) + 1);

175: job->text = NULL;

176:

177: prog = job->progs;

178: prog->numRedirections = 0;

179: prog->redirections = NULL;

180: prog->freeGlob = 0;

181: prog->isStopped = 0;

182:

183: argvAlloced = 5;

184: prog->argv = malloc(sizeof(*prog->argv) * argvAlloced);

185: prog->argv[0] = job->cmdBuf;

186:

187: buf = command;

188: src = *commandPtr;

189: while (*src && !done) {

190: if (quote == *src) {

191: quote = '\0';

192: } else if (quote) {

193: if (*src ==0 '\\') {

194: src++;

195: if (!*src) {

196: fprintf(stderr,

197: "после \\ ожидался символ\n");

198: freeJob(job);

199: return 1;

200: }

201:

202: /* в оболочке сочетание "\'" должно дать */

203: if (*src != quote) *buf++ = '\\';

204: } else if (*src == '*' | | *src == ' ?' | | *src == '[' ||

205: *src == ']')

206: *buf++ = '\\';

207: *buf++ = *src;

208: } else if (isspace(*src)) {

209: if (*prog->argv[argc]) {

210: buf++, argc++;

211: /* +1 здесь оставляет место для NULL, которое

212: завершает массив argv */

213: if ((argc + 1) == argvAlloced) {

214: argvAlloced += 5;

215: prog->argv = realloc(prog->argv,

216: sizeof(*prog->argv) * argvAlloced);

217: }

218: prog->argv[argc] = buf;

219:

220: globLastArgument(prog, &argc, &argvAlloced);

221: }

222: } else switch (*src) {

223: case '"':

224: case '\'':

225: quote = *src;

226: break;

227:

228: case '#': /* комментарий */

229: done = 1;

230: break;

231:

232: case '>': /* переадресации */

233: case '<':

234: i = prog->numRedirections++;

235: prog->redirections = realloc(prog->redirections,

236: sizeof(*prog->redirections) * (i+1));

237:

238: prog->redirections[i].fd= -1;

239: if (buf != prog->argv[argc]) {

240: /* перед этим символом может быть указан номер

241: переадресовываемого файла */

242: prog->redirections[i].fd =

243: strtol(prog->argv[argc], &chptr, 10);

244:

245: if (*chptr && *prog->argv[argc]) {

246: buf++, argc++;

247: globLastArgument(prog, &argc, &argvAlloced);

248: }

249: }

250:

251: if (prog->redirections[i].fd == -1) {

252: if (*src == '>')

Поделиться:
Популярные книги

Гарем вне закона 18+

Тесленок Кирилл Геннадьевич
1. Гарем вне закона
Фантастика:
фэнтези
юмористическая фантастика
6.73
рейтинг книги
Гарем вне закона 18+

Разведчик. Заброшенный в 43-й

Корчевский Юрий Григорьевич
Героическая фантастика
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.93
рейтинг книги
Разведчик. Заброшенный в 43-й

Академия

Кондакова Анна
2. Клан Волка
Фантастика:
боевая фантастика
5.40
рейтинг книги
Академия

Проклятый Лекарь IV

Скабер Артемий
4. Каратель
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Проклятый Лекарь IV

Третий. Том 3

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий. Том 3

СД. Том 17

Клеванский Кирилл Сергеевич
17. Сердце дракона
Фантастика:
боевая фантастика
6.70
рейтинг книги
СД. Том 17

Чемпион

Демиров Леонид
3. Мания крафта
Фантастика:
фэнтези
рпг
5.38
рейтинг книги
Чемпион

Краш-тест для майора

Рам Янка
3. Серьёзные мальчики в форме
Любовные романы:
современные любовные романы
эро литература
6.25
рейтинг книги
Краш-тест для майора

На границе империй. Том 7. Часть 3

INDIGO
9. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.40
рейтинг книги
На границе империй. Том 7. Часть 3

Случайная жена для лорда Дракона

Волконская Оксана
Фантастика:
юмористическая фантастика
попаданцы
5.00
рейтинг книги
Случайная жена для лорда Дракона

Не грози Дубровскому! Том II

Панарин Антон
2. РОС: Не грози Дубровскому!
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Не грози Дубровскому! Том II

Барон устанавливает правила

Ренгач Евгений
6. Закон сильного
Старинная литература:
прочая старинная литература
5.00
рейтинг книги
Барон устанавливает правила

Возвращение

Кораблев Родион
5. Другая сторона
Фантастика:
боевая фантастика
6.23
рейтинг книги
Возвращение

Кодекс Охотника. Книга XXV

Винокуров Юрий
25. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
6.25
рейтинг книги
Кодекс Охотника. Книга XXV