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

ЖАНРЫ

Разработка приложений в среде Linux. Второе издание

Троан Эрик В.

Шрифт:

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

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 ожидалось имя файла\n",

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, "пустая команда в канале\n");

293: freeJob(job);

294: return 1;

295: }

296: prog->argv[argc] = NULL;

297:

298: /* и начало следующей */

299: job->numProgs++;

300: job->progs = realloc(job->progs,

301: sizeof (*job->progs) *

302: job->numProgs);

303: prog = job->progs + (job->numProgs - 1);

304: prog->numRedirections = 0;

305: prog->redirections = NULL;

306: prog->freeGlob = 0;

Поделиться с друзьями: