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

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

Жанры

Разработка приложений в среде 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 == '>')

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

Эпоха Опустошителя. Том I

Павлов Вел
1. Вечное Ристалище
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эпоха Опустошителя. Том I

Проблема майора Багирова

Майер Кристина
1. Спецназ
Любовные романы:
современные любовные романы
6.60
рейтинг книги
Проблема майора Багирова

Законы Рода. Том 13

Андрей Мельник
13. Граф Берестьев
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Законы Рода. Том 13

Газлайтер. Том 15

Володин Григорий Григорьевич
15. История Телепата
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Газлайтер. Том 15

О, Путник!

Арбеков Александр Анатольевич
1. Квинтет. Миры
Фантастика:
социально-философская фантастика
5.00
рейтинг книги
О, Путник!

Прометей: каменный век

Рави Ивар
1. Прометей
Фантастика:
альтернативная история
6.82
рейтинг книги
Прометей: каменный век

Её (мой) ребенок

Рам Янка
Любовные романы:
современные любовные романы
6.91
рейтинг книги
Её (мой) ребенок

Идеальный мир для Лекаря 8

Сапфир Олег
8. Лекарь
Фантастика:
юмористическое фэнтези
аниме
7.00
рейтинг книги
Идеальный мир для Лекаря 8

Прометей: каменный век II

Рави Ивар
2. Прометей
Фантастика:
альтернативная история
7.40
рейтинг книги
Прометей: каменный век II

Цвет сверхдержавы - красный. Трилогия

Симонов Сергей
Цвет сверхдержавы - красный
Фантастика:
попаданцы
альтернативная история
8.06
рейтинг книги
Цвет сверхдержавы - красный. Трилогия

Болтливый мертвец

Фрай Макс
7. Лабиринты Ехо
Фантастика:
фэнтези
9.41
рейтинг книги
Болтливый мертвец

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

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

Истребители. Трилогия

Поселягин Владимир Геннадьевич
Фантастика:
альтернативная история
7.30
рейтинг книги
Истребители. Трилогия

Лишняя дочь

Nata Zzika
Любовные романы:
любовно-фантастические романы
8.22
рейтинг книги
Лишняя дочь