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

на главную - закладки

Жанры

Разработка приложений в среде 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. Мастер
Фантастика:
героическая фантастика
попаданцы
аниме
6.50
рейтинг книги
Мастер...

Жених из гроба

Сотис Майя
1. Гробокопательница
Фантастика:
юмористическое фэнтези
сказочная фантастика
фэнтези
5.00
рейтинг книги
Жених из гроба

Ищу жену с прицепом

Рам Янка
2. Спасатели
Любовные романы:
современные любовные романы
6.25
рейтинг книги
Ищу жену с прицепом

Гримуар тёмного лорда I

Грехов Тимофей
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Гримуар тёмного лорда I

Заклятие предков

Прозоров Александр Дмитриевич
3. Ведун
Фантастика:
фэнтези
альтернативная история
8.49
рейтинг книги
Заклятие предков

Крепость над бездной

Лисина Александра
4. Гибрид
Фантастика:
боевая фантастика
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Крепость над бездной

Рота Его Величества

Дроздов Анатолий Федорович
Новые герои
Фантастика:
боевая фантастика
8.55
рейтинг книги
Рота Его Величества

Экспансия: Сотрудничество. Том 5

Белов Артем
5. Планетарный десант
Фантастика:
боевая фантастика
аниме
5.00
рейтинг книги
Экспансия: Сотрудничество. Том 5

Отверженный III: Вызов

Опсокополос Алексис
3. Отверженный
Фантастика:
фэнтези
альтернативная история
7.73
рейтинг книги
Отверженный III: Вызов

Князь Серединного мира

Земляной Андрей Борисович
4. Страж
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Князь Серединного мира

Возвышение Меркурия. Книга 8

Кронос Александр
8. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 8

Эволюционер из трущоб. Том 5

Панарин Антон
5. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 5

Локки 7. Потомок бога

Решетов Евгений Валерьевич
7. Локки
Фантастика:
аниме
эпическая фантастика
фэнтези
5.00
рейтинг книги
Локки 7. Потомок бога

Черный Маг Императора 4

Герда Александр
4. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 4