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

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

Жанры

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

Троан Эрик В.

Шрифт:

330: src++;

331: if (!*src) {

332: freeJob(job);

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

334: return 1;

335: }

336: if (* src == '*' || *srс == '[' | | *src == ']'

337: || *srс == '?')

338: *buf++ = '\\';

339: /* сквозная обработка */

340: default:

341: *buf++ = *src;

Для

заключения знаков универсализации в кавычки здесь был добавлен тот же самый код.

Эти две кодовые последовательности обеспечивают передачу каждого аргумента в

glob
без поиска неожиданных совпадений.

Теперь добавим функцию

globLastArgument
, которая универсализирует самый последний аргумент для дочерней программы и замещает его любым найденным совпадением.

Для облегчения управления памяти к

struct childProgram
добавляется элемент
globResult
типа
glob_t
, используемый для хранения результатов всех операций универсализации. Кроме того, добавляется целочисленный элемент
freeGlob
, не равный нулю, если
freeJob
должна освободить
globResult
. Ниже показано полное описание
struct childProgram
в
ladsh3.c
.

35: struct childProgram {

36: pid; /* 0, если завершена */

37: char ** argv; /* имя и аргументы программы */

38: int numRedirections; /* элементы в массиве перенаправлений */

39: struct redirection Specifier * redirections; /* перенаправления ввода-вывода */

40: glob_t globResult; /* результат универсализации параметров */

41: int freeGlob; /* нужно ли освобождать globResult? */

42: };

Во время первого запуска для командной строки функция

globLastArgument
(когда
argc
для текущей дочерней оболочки равно 1) инициализирует
globResult
. Для остальных аргументов она пользуется преимуществом
GLOB_APPEND
для добавления новых совпадений к существующим. Это избавляет от необходимости распределения собственной памяти для целей универсализации, поскольку одиночный
glob_t
при необходимости автоматически расширяется.

Если

globLastArgument
не находит совпадений, символы
\
с кавычками удаляются из аргумента. В противном случае все новые совпадения копируются в список аргументов, создаваемый для дочерней программы.

Ниже приведена полная реализация

globLastArgument
. Все сложные ее части относятся к управлению памятью; фактическая универсализация похожа на реализованную в программе
globit.с
, которая представлена ранее в главе.

 87: void globLastArgument(struct childProgram * prog, int * argcPtr,

 88: int * argcAllocedPtr) {

 89: int argc = *argcPtr;

 90: int argcAlloced = *argcAllocedPtr;

 91: int rc;

 92: int flags;

 93: int i;

 94: char * src, * dst;

 95:

 96: if (argc >1) {/* cmd->globResult
уже инициализирован */

 97: flags = GLOB_APPEND;

 98: i = prog->globResult.gl_pathc;

 99: } else {

100: prog->freeGlob = 1;

101: flags = 0;

102: i = 0;

103: }

104:

105: rc = glob(prog->argv[argc - 1], flags, NULL, &prog->globResult);

106: if (rc == GLOB_NOSPACE) {

107: fprintf (stderr, "не хватает памяти для выполнения универсализации\n");

108: return;

109: } else if (rc == GLOB_NOMATCH ||

110: (!rc && (prog->globResult.gl_path - i) == 1 &&

111: !strcmp(prog->argv[argc - 1],

112: prog->globResult.gl_pathv[i]))) {

113: /* необходимо удалить кавычки в \, если они все еще присутствуют */

114: src = dst = prog->argv[argc - 1];

115: while (*src) {

116: if (*src ! = '\\') *dst++ = *src;

117: src++;

118: }

119: *dst = '\0';

120: } else if (!rc) {

121: argcAlloced += (prog->globResult.gl_pathc - i);

122: prog->argv = realloc(prog->argv,

123: argcAlloced * sizeof(*prog->argv));

124: memcpy(prog->argv + (argc - 1),

125: prog->globResult.gl_pathv + i,

126: sizeof(*(prog->argv)) *

127: (prog->globResult.gl_pathc - i));

128: argc += (prog->globResult.gl_pathc - i - 1);

129: }

130:

131: *argcAllocedPtr = argcAlloced;

132: *argcPtr = argc;

133: }

Последними изменениями касаются вызовов

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

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

Тройняшки не по плану. Идеальный генофонд

Лесневская Вероника
Роковые подмены
Любовные романы:
современные любовные романы
6.80
рейтинг книги
Тройняшки не по плану. Идеальный генофонд

Барон играет по своим правилам

Ренгач Евгений
5. Закон сильного
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Барон играет по своим правилам

Завод-3: назад в СССР

Гуров Валерий Александрович
3. Завод
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Завод-3: назад в СССР

Секретарь лорда Демона

Лунёва Мария
Фантастика:
попаданцы
фэнтези
5.00
рейтинг книги
Секретарь лорда Демона

Отец моего жениха

Салах Алайна
Любовные романы:
современные любовные романы
7.79
рейтинг книги
Отец моего жениха

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

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

Я тебя не отпущу

Коваленко Марья Сергеевна
4. Оголенные чувства
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Я тебя не отпущу

Бастард Императора. Том 7

Орлов Андрей Юрьевич
7. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 7

Девочка из прошлого

Тоцка Тала
3. Айдаровы
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Девочка из прошлого

Вернуть невесту. Ловушка для попаданки 2

Ардова Алиса
2. Вернуть невесту
Любовные романы:
любовно-фантастические романы
7.88
рейтинг книги
Вернуть невесту. Ловушка для попаданки 2

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

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

Хозяйка дома на холме

Скор Элен
1. Хозяйка своей судьбы
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Хозяйка дома на холме

Жена проклятого некроманта

Рахманова Диана
Фантастика:
фэнтези
6.60
рейтинг книги
Жена проклятого некроманта

Имя нам Легион. Том 9

Дорничев Дмитрий
9. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 9