Разработка приложений в среде 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 == '>')
Поделиться:
Популярные книги
Печать Пожирателя
1. Пожиратель
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Привет из Загса. Милый, ты не потерял кольцо?
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Мастер 2
2. Мастер
Фантастика:
фэнтези
городское фэнтези
попаданцы
технофэнтези
4.50
рейтинг книги
Нечто чудесное
2. Романтическая серия
Любовные романы:
исторические любовные романы
9.43
рейтинг книги
Клан
2. Долгий путь домой
Фантастика:
боевая фантастика
космическая фантастика
5.60
рейтинг книги
Имя нам Легион. Том 3
3. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Запасная дочь
Фантастика:
фэнтези
6.40
рейтинг книги
Убивать чтобы жить 7
7. УЧЖ
Фантастика:
героическая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
У врага за пазухой
5. Оголенные чувства
Любовные романы:
остросюжетные любовные романы
эро литература
5.00
рейтинг книги
Кодекс Охотника. Книга XXI
21. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Генерал Скала и ученица
2. Генерал Скала и Лидия
Любовные романы:
любовно-фантастические романы
6.30
рейтинг книги
Оцифрованный. Том 1
1. Линкор Михаил
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Его маленькая большая женщина
Любовные романы:
современные любовные романы
эро литература
8.78
рейтинг книги
Хуррит
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.00