Разработка приложений в среде Linux - [208]

Шрифт
Интервал

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

>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;

>307:    argc = 0;

>308:

>309:    argvAlloced = 5;

>310:    prog->argv = malloc(sizeof(*prog->argv) *

>311:     argvAlloced);

>312:    prog->argv[0] = ++buf;

>313:

>314:    src++;

>315:    while (*src && isspace(*src)) src++;

>316:

>317:    if (!*src) {

>318:     fprintf(stderr, "пустая команда в канале\n");

>319:     return 1;

>320:    }

>321:    src--; /* инкремент ++ мы сделаем в конце цикла */

>322:

>323:    break;

>324:

>325:   case '&': /* фон */

>326:    *isBg = 1;

>327:   case ';': /* разнообразные команды */

>328:    done = 1;

>329:    returnCommand = *commandPtr + (src - * commandPtr) + 1;

>330:    break;

>331:

>332:   case '\\':

>333:    src++;

>334:    if (!*src) {

>335:     freeJob(job);

>336:     fprintf(stderr, "после \\ ожидался символ\n");

>337:     return 1;

>338:    }

>339:    if (*src == '*' | | *src == '[' || *src == '] '

>340:     || *src == '?')

>341:     *buf++ = '\\';

>342:    /* неудача */

>343:   default:

>344:    *buf++ = *src;

>345:   }

>346:

>347:   src++;

>348:  }

>349:

>350:  if (*prog->argv[argc]) {

>351:   argc++;

>352:   globLastArgument(prog, &argc, &argvAlloced);

>353:  }

>354:  if (!argc) {

>355:   freeJob(job);

>356:   return 0;

>357:  }

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

>359:

>360:  if (!returnCommand) {

>361:   job->text = malloc(strlen(*commandPtr) + 1);

>362:   strcpy(job->text, *commandPtr);

>363:  } else {

>364:   /*Оставляем любые хвостовые пробелы, хотя и получится это несколько небрежно*/

>365:

>366:   count = returnCommand - *commandPtr;

>367:   job->text = malloc(count + 1);


Рекомендуем почитать
Виртуальные  машины: несколько компьютеров в  одном

Применение виртуальных машин дает различным категориям пользователей — от начинающих до IT-специалистов — множество преимуществ. Это и повышенная безопасность работы, и простота развертывания новых платформ, и снижение стоимости владения. И потому не случайно сегодня виртуальные машины переживают второе рождение.В книге рассмотрены три наиболее популярных на сегодняшний день инструмента, предназначенных для создания виртуальных машин и управления ими: Virtual PC 2004 компании Microsoft, VMware Workstation от компании VMware и относительно «свежий» продукт — Parallels Workstation, созданный в компании Parallels.


Недокументированные и малоизвестные возможности Windows XP

Книга содержит подробные сведения о таких недокументированных или малоизвестных возможностях Windows XP, как принципы работы с программами rundll32.exe и regsvr32.exe, написание скриптов сервера сценариев Windows и создание INF-файлов. В ней приведено описание оснасток, изложены принципы работы с консолью управления mmc.exe и параметрами реестра, которые изменяются с ее помощью. Кроме того, рассмотрено большое количество средств, позволяющих выполнить тонкую настройку Windows XP.Эта книга предназначена для опытных пользователей и администраторов, которым интересно узнать о нестандартных возможностях Windows.


Windows Vista. Мультимедийный курс

Эта книга поможет вам разобраться в премудростях операционной системы Windows Vista.Информационная насыщенность учебного материала позволяет утверждать, что мультимедийный курс будет интересен и новичкам, и опытным пользователям.


FAQ по смартфону Qtek 8300/8310

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Домашние и офисные сети под Vista и XP

Количество персональных компьютеров в нашей стране растет год от года. Сегодня во многих семьях имеется два или даже три компьютера.Чтобы воспользоваться всеми преимуществами такой ситуации, компьютеры в вашей квартире стоит объединить сетью. Это позволит вам играть по сети в компьютерные игры, совместно использовать дисковое пространство, принтеры, модемы и другие устройства, всю сеть можно соединить с Интернетом. А в офисах сеть между компьютерами просто необходима.Открывающиеся перспективы выглядят очень заманчиво.


Свободные программы и системы в школе

Курс лекций, включенных в брошюру, знакомит читателя с популярными свободными программами и системами, полезными при преподавании информатики в средней школе. В обзор вошли основы открытых операционных систем, сведения о пакете «офисных» программ OpenOffice.org, коммуникационном пакете Mozilla, графическом редакторе GIMP, современных графических средах GNOME и KDE и других программах.Для преподавателей информатики и методистов, а также для студентов и аспирантов соответствующих специальностей.© 2002-3, Максим Отставнов.© 2002, Андрей Добровольский (раздел 3.1).Использован текст лекций, публиковавшихся автором в приложении к газете «Первое сентября» «Информатика» (http://inf.1september.ru) в 2002-3 г., материалы брошюры «Прикладные свободные программы в школе» (М.: 2003 г.), а также фрагменты статей, ранее публиковавшихся в журналах «Компьютерра» и «Домашний компьютер».Материалы, представленные в этой книге, также доступны в Интернет на странице www.otstavnov.com/fsft на условиях Свободной лицензии ГНУ на документацию (GNU FDL)