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

на главную

Жанры

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

Троан Эрик В.

Шрифт:

 52: struct childProgram* progs; /* массив программ в задании */

 53: struct job* next; /* для отслеживания фоновых команд */

 54: int stoppedProgs; /* количество активных, но приостановленных программ */

 55: };

 56:

 57: void freeJob (struct job * cmd) {

 58: int i;

 59:

 60: for (i = 0; i <cmd->numProgs; i++) {

 61: free(cmd->progs[i].argv);

 62: if (cmd->progs[i].redirections)

 63: free(cmd->progs[i].redirections);

 64: if (cmd->progs[i].freeGlob)

 65: globfree(&cmd->progs[i].globResult);

 66: }

 67: free(cmd->progs);

 68: if (cmd->text) free(cmd->text);

 69: free(cmd->cmdBuf);

 70: }

 71:

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

 73: if (source == stdin) {

 74: printf("# ");

 75: fflush(stdout);

 76: }

 77:

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

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

 80: return 1;

 81: }

 82:

 83: /*
удаление хвостового символа новой строки */

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

 85:

 86: return 0;

 87: }

 88:

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

 90: int * argcAllocedPtr) {

 91: int argc = *argcPtr;

 92: int argcAlloced = *argcAllocedPtr;

 93: int rc;

 94: int flags;

 95: int i;

 96: char * src, * dst;

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

 99: flags = GLOB_APPEND;

100: i = prog->globResult.gl_pathc;

101: } else {

102: prog->freeGlob = 1;

103: flags = 0;

104: i = 0;

105: }

106:

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

108: if (rc == GLOB_NOSPACE) {

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

110: return;

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

112: (!rc && (prog->globResult.gl_pathc - i) == 1 &&

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

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

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

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

117: while (*src) {

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

119: src++;

120: }

121: *dst = '\0';

122: } else if (!rc) {

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

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

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

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

127: prog->globResult.gl_pathv + i,

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

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

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

131: }

132:

133: *argcAllocedPtr = argcAlloced;

134: *argcPtr = argc;

135: }

136:

137: /* Возвращаем cmd->numProgs как 0, если не представлено ни одной команды

138: (например, пустая строка). Если будет обнаружена допустимая команда,

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

140: команда была связана с несколькими заданиями) или будет равно NULL,

141: если больше не представлено ни одной команды. */

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

143: char * command;

144: char * returnCommand = NULL;

145: char * src, * buf, * chptr;

146: int argc = 0;

147: int done = 0;

148: int argvAlloced;

149: int i;

150: char quote = '\0';

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

Последний Паладин

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

Идущий в тени 8

Амврелий Марк
8. Идущий в тени
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
Идущий в тени 8

Все еще не Герой!. Том 2

Довыдовский Кирилл Сергеевич
2. Путешествие Героя
Фантастика:
боевая фантастика
юмористическое фэнтези
городское фэнтези
рпг
5.00
рейтинг книги
Все еще не Герой!. Том 2

Совпадений нет

Безрукова Елена
Любовные романы:
любовно-фантастические романы
5.50
рейтинг книги
Совпадений нет

Муж на сдачу

Зика Натаэль
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Муж на сдачу

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

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
На границе империй. Том 7. Часть 4

Довлатов. Сонный лекарь

Голд Джон
1. Не вывожу
Фантастика:
альтернативная история
аниме
5.00
рейтинг книги
Довлатов. Сонный лекарь

СД. Восемнадцатый том. Часть 1

Клеванский Кирилл Сергеевич
31. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
6.93
рейтинг книги
СД. Восемнадцатый том. Часть 1

Темный Охотник

Розальев Андрей
1. КО: Темный охотник
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Темный Охотник

Назад в СССР: 1985 Книга 3

Гаусс Максим
3. Спасти ЧАЭС
Фантастика:
попаданцы
альтернативная история
5.50
рейтинг книги
Назад в СССР: 1985 Книга 3

Целитель. Книга вторая

Первухин Андрей Евгеньевич
2. Целитель
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Целитель. Книга вторая

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

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

Огненный князь 3

Машуков Тимур
3. Багряный восход
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Огненный князь 3

Магия чистых душ

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.40
рейтинг книги
Магия чистых душ