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

на главную

Жанры

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

Троан Эрик В.

Шрифт:

 49:

 50: int getCommand(FILE *source, char *command) {

 51: if (source == stdin) {

 52: printf("#");

 53: fflush(stdout);

 54: }

 55:

 56: if (!fgets(command, MAX_COMMAND_LEN, source)) {

 57: if (source==stdin) printf("\n");

 58: return 1;

 59: }

 60:

 61: /*
удалить завершающий перевод строки */

 62: command[strlen(command) - 1] = '\0';

 63:

 64: return 0;

 65: }

 66:

 67: /* Возвратить cmd->numProgs как 0, если нет никаких команд (то есть пустая

 68: строка). Если найдена правильная команда, commandPtr устанавливается в

 69: указатель на начало следующей команды (если исходная команда имеет более

 70: одного задания, ассоциированного с ней) или NULL, если

 71: больше нет команд.*/

 72: int parseCommand(char **commandPtr, struct job *job, int *isBg) {

 73: char *command;

 74: char *returnCommand = NULL;

 75: char *src, *buf;

 76: int argc = 0;

 77: int done = 0;

 78: int argvAlloced;

 79: char quote = '\0';

 80: int count;

 81: struct childProgram *prog;

 82:

 83: /* Пропустить ведущие пробелы */

 84: while(**commandPtr && isspace(**commandPtr)) (*commandPtr)++;

 85:

 86: /* здесь обрабатываются пустые строки и ведущие символы '#' */

 87: if (!**commandPtr || (**commandPtr=='#')) {

 88: job->numProgs = 0;

 89: *commandPtr = NULL;

 90: return 0;

 91: }

 92:

 93: *isBg = 0;

 94: job->numProgs = 1;

 95: job->progs = malloc(sizeof(*job->progs));

 96:

 97: /* Мы устанавливаем элементы argv в указатели внутри строки.

 98: Память освобождается freeJob.

 99:

100: Получение чистой памяти позволяет далее иметь дело с

101: NULL-завершающимися вещами и делает все остальное немного

102:
яснее (к тому же, это добавляет эффективности) */

103: job->cmdBuf = command = calloc(1, strlen(*commandPtr) + 1);

104: job->text = NULL;

105:

106: prog = job->progs;

107:

108: argvAlloced = 5;

109: prog->argv = malloc(sizeof(*prog->argv) * argvAlloced);

110: prog->argv[0] = job->cmdBuf;

111:

112: buf = command;

113: src = *commandPtr;

114: while (*src && !done) {

115: if (quote==*src) {

116: quote='\0';

117: } else if (quote) {

118: if (*src == '\\') {

119: src++;

120: if (!*src) {

121: fprintf(stderr,

122: "ожидается символ после\\\n");

123: freeJob(job);

124: return 1;

125: }

126:

127: /* в оболочке, "\'" должно породить \' */

128: if (*src != quote) *buf++='\\';

129: }

130: *buf++ = *src;

131: } else if (isspace(*src)) {

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

133: buf++, argc++;

134: /* +1 здесь оставляет место для NULL,

135: которым завершается argv */

136: if ((argc+1) == argvAlloced) {

137: argvAlloced += 5;

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

139: sizeof(*prog->argv)*argvAlloced);

140: }

141: prog->argv[argc]=buf;

142: }

143: } else switch(*src) {

144: case '"':

145: case '\'':

146: quote = *src;

147: break;

148:

149: case '#' : /* комментарий */

150: done=1;

151: break;

152:

153: case '&': /* фоновый режим */

154: *isBg = 1;

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

Газлайтер. Том 10

Володин Григорий
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

На границе империй. Том 7. Часть 2

INDIGO
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 7. Часть 2

Звездная Кровь. Изгой

Елисеев Алексей Станиславович
1. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Звездная Кровь. Изгой

Хозяин Теней 4

Петров Максим Николаевич
4. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 4

Картофельное счастье попаданки

Иконникова Ольга
Фантастика:
фэнтези
5.00
рейтинг книги
Картофельное счастье попаданки

Экзорцист: Проклятый металл. Жнец. Мор. Осквернитель

Корнев Павел Николаевич
Фантастика:
фэнтези
героическая фантастика
5.50
рейтинг книги
Экзорцист: Проклятый металл. Жнец. Мор. Осквернитель

Доктора вызывали? или Трудовые будни попаданки

Марей Соня
Фантастика:
юмористическая фантастика
попаданцы
5.00
рейтинг книги
Доктора вызывали? или Трудовые будни попаданки

Метатель

Тарасов Ник
1. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель

Моя на одну ночь

Тоцка Тала
Любовные романы:
современные любовные романы
короткие любовные романы
5.50
рейтинг книги
Моя на одну ночь

Чехов. Книга 2

Гоблин (MeXXanik)
2. Адвокат Чехов
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Чехов. Книга 2

Хозяин Теней 2

Петров Максим Николаевич
2. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 2

Сумеречный стрелок 7

Карелин Сергей Витальевич
7. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный стрелок 7

Жизнь под чужим солнцем

Михалкова Елена Ивановна
Детективы:
прочие детективы
9.10
рейтинг книги
Жизнь под чужим солнцем

Красноармеец

Поселягин Владимир Геннадьевич
1. Красноармеец
Фантастика:
боевая фантастика
попаданцы
4.60
рейтинг книги
Красноармеец