Вход/Регистрация
Разработка приложений в среде Linux. Второе издание
вернуться

Троан Эрик В.

Шрифт:

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
  • ...
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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