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

на главную

Жанры

Разработка приложений в среде 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;

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

Клан

Русич Антон
2. Долгий путь домой
Фантастика:
боевая фантастика
космическая фантастика
5.60
рейтинг книги
Клан

Не кровный Брат

Безрукова Елена
Любовные романы:
эро литература
6.83
рейтинг книги
Не кровный Брат

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

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

Последний Паладин. Том 2

Саваровский Роман
2. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 2

Кодекс Охотника. Книга XXI

Винокуров Юрий
21. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXI

Кодекс Охотника. Книга XIII

Винокуров Юрий
13. Кодекс Охотника
Фантастика:
боевая фантастика
попаданцы
аниме
7.50
рейтинг книги
Кодекс Охотника. Книга XIII

Как я строил магическую империю 2

Зубов Константин
2. Как я строил магическую империю
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Как я строил магическую империю 2

Вдова на выданье

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Вдова на выданье

Пустоши

Сай Ярослав
1. Медорфенов
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Пустоши

Последний попаданец 5

Зубов Константин
5. Последний попаданец
Фантастика:
юмористическая фантастика
рпг
5.00
рейтинг книги
Последний попаданец 5

Заставь меня остановиться 2

Юнина Наталья
2. Заставь меня остановиться
Любовные романы:
современные любовные романы
6.29
рейтинг книги
Заставь меня остановиться 2

Курсант: Назад в СССР 7

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

Эволюция мага

Лисина Александра
2. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эволюция мага

Болотник 3

Панченко Андрей Алексеевич
3. Болотник
Фантастика:
попаданцы
альтернативная история
6.25
рейтинг книги
Болотник 3