194:     src++;

195:     if (!*src) {

196:      fprintf(stderr,

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

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 == '>')

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

254:     else

255:      prog->redirections[i].fd = 0;

256:    }

257:

258:    if (*src++ == '>') {

259:     if (*src == '>') {

260:      prog->redirections[i].type = REDIRECT_APPEND;

261:      src++;

262:     } else {

263:      prog->redirections[i].type = REDIRECT_OVERWRIТЕ;

264:     }

265:    } else {

266:     prog->redirections[i].type = REDIRECT_INPUT;

267:    }

268:

269:    /* Это не соответствует стандарту sh POSIX. Ну и ладно. */

270:    chptr = src;

271:    while (isspace(*chptr)) chptr++;

272:

273:    if (!*chptr) {

274:     fprintf(stderr, 'после %c ожидалось имя файла ',

275:      *src);

276:     freeJob(job);

277:     return 1;

278:    }

279:

280:    prog->redirections[i].filename = buf;

281:    while (*chptr && !isspace(*chptr))

282:     *buf++ = *chptr++;

283:

284:    src = chptr - 1; /* src++ будет сделано позже */

285:    prog->argv[argc] = ++buf;

286:    break;

287:

288:   case '|': /* канал */

289:    /* завершение этой команды */

290:    if (*prog->argv[argc]) argc++;

291:    if (large) {

292:     fprintf(stderr, 'пустая команда в канале ');

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату