Вход/Регистрация
Разработка приложений в среде Linux. Второе издание
вернуться

Троан Эрик В.

Шрифт:

 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;

  • Читать дальше
  • 1
  • ...
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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