X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=lib%2Fconf-input.c;h=0272de21eb27722c68a1704cdb862d80640136c3;hb=d5e8872563f6fde8299db971ffb6494c2438c590;hp=2abb7a219b3bdb2c54841de225f50f834f402f5e;hpb=87ce453f37bc02a5d38b7ef8fd8ddfe6ae6c84ca;p=libucw.git diff --git a/lib/conf-input.c b/lib/conf-input.c index 2abb7a21..0272de21 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,19 +146,20 @@ 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 == '#') - log(L_WARN, "The line %s:%d following a backslash is empty", name_parse_fb, line_num); + log(L_WARN, "The line %s:%d following a backslash is empty", name_parse_fb ? : (byte*) "", line_num); } else { split_grow(&word_buf, words+1); uns start = copied; @@ -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; @@ -261,7 +270,12 @@ parse_fastbuf(byte *name_fb, struct fastbuf *fb, uns depth) goto error; } error: - log(L_ERROR, "File %s, line %d: %s", name_fb, line_num, msg); + if (name_fb) + log(L_ERROR, "File %s, line %d: %s", name_fb, line_num, msg); + else if (line_num == 1) + log(L_ERROR, "Manual setting of configuration: %s", msg); + else + log(L_ERROR, "Manual setting of configuration, line %d: %s", line_num, msg); return "included from here"; } @@ -308,7 +322,7 @@ load_string(byte *string) cf_init_stack(); struct fastbuf fb; fbbuf_init_read(&fb, string, strlen(string), 0); - byte *msg = parse_fastbuf("memory string", &fb, 0); + byte *msg = parse_fastbuf(NULL, &fb, 0); return !!msg || done_stack(); }