X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=lib%2Fconf-input.c;h=37147a8de336b8eff886f5a1a21354ff92f85980;hb=e4c695d49529d03352d241872493a5161e646288;hp=2abb7a219b3bdb2c54841de225f50f834f402f5e;hpb=87ce453f37bc02a5d38b7ef8fd8ddfe6ae6c84ca;p=libucw.git diff --git a/lib/conf-input.c b/lib/conf-input.c index 2abb7a21..37147a8d 100644 --- a/lib/conf-input.c +++ b/lib/conf-input.c @@ -43,11 +43,14 @@ static uns words; static uns ends_by_brace; // the line is ended by "{" static int -get_line(void) +get_line(byte **msg) { - if (!bgets(parse_fb, line_buf, MAX_LINE)) - return 0; + int err = bgets_nodie(parse_fb, line_buf, MAX_LINE); line_num++; + if (err <= 0) { + *msg = err < 0 ? "Line too long" : NULL; + return 0; + } line = line_buf; while (Cblank(*line)) line++; @@ -67,6 +70,7 @@ append(byte *start, byte *end) static byte * get_word(uns is_command_name) { + byte *msg; if (*line == '\'') { line++; while (1) { @@ -77,8 +81,8 @@ get_word(uns is_command_name) if (*line) break; copy_buf.ptr[copied-1] = '\n'; - if (!get_line()) - return "Unterminated apostrophe word at the end"; + if (!get_line(&msg)) + return msg ? : (byte*) "Unterminated apostrophe word at the end"; } line++; @@ -104,8 +108,8 @@ get_word(uns is_command_name) copy_buf.ptr[copied-1] = '\n'; else // merge two lines copied -= 2; - if (!get_line()) - return "Unterminated quoted word at the end"; + if (!get_line(&msg)) + return msg ? : (byte*) "Unterminated quoted word at the end"; } line++; @@ -142,15 +146,16 @@ get_token(uns is_command_name, byte **msg) *msg = NULL; while (1) { if (!*line || *line == '#') { - if (!is_command_name || !get_line()) + if (!is_command_name || !get_line(msg)) return NULL; } else if (*line == ';') { *msg = get_word(0); if (!is_command_name || *msg) return NULL; } else if (*line == '\\' && !line[1]) { - if (!get_line()) { - *msg = "Last line ends by a backslash"; + if (!get_line(msg)) { + if (!*msg) + *msg = "Last line ends by a backslash"; return NULL; } if (!*line || *line == '#') @@ -242,7 +247,11 @@ parse_fastbuf(byte *name_fb, struct fastbuf *fb, uns depth) switch (Clocase(*c)) { case 's': op = OP_SET; break; case 'c': op = Clocase(c[1]) == 'l' ? OP_CLEAR: OP_COPY; break; - case 'a': op = Clocase(c[1]) == 'p' ? OP_APPEND : OP_AFTER; break; + case 'a': switch (Clocase(c[1])) { + case 'p': op = OP_APPEND; break; + case 'f': op = OP_AFTER; break; + default: op = OP_ALL; + }; break; case 'p': op = OP_PREPEND; break; case 'r': op = OP_REMOVE; break; case 'e': op = OP_EDIT; break;