X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=src%2Frecdb.c;h=9b8ac1455e67c1df3e9bff0d6764aa4caef0c9f6;hb=HEAD;hp=cba98139082c0d1e03a6fb7c431d52d471f8642b;hpb=5c54660f454c28a83d4b3c35b57cca9ad855f7e4;p=srvx.git diff --git a/src/recdb.c b/src/recdb.c index cba9813..9b8ac14 100644 --- a/src/recdb.c +++ b/src/recdb.c @@ -109,6 +109,7 @@ ABORT(RECDB *recdb, int code, unsigned char ch) { enum fail_codes { UNTERMINATED_STRING, + UNTERMINATED_COMMENT, EXPECTED_OPEN_QUOTE, EXPECTED_OPEN_BRACE, EXPECTED_OPEN_PAREN, @@ -345,8 +346,10 @@ parse_skip_ws(RECDB *recdb) do { do { c = dbgetc(recdb); - } while (c != '*' && c != EOF); + if (c == EOF) ABORT(recdb, UNTERMINATED_COMMENT, c); + } while (c != '*'); if ((c = dbgetc(recdb)) == '/') in_comment = 0; + if (c == EOF) ABORT(recdb, UNTERMINATED_COMMENT, c); } while (in_comment); } else if (d == '/') { /* C++ style comment, with slash slash comment newline */ @@ -552,6 +555,7 @@ failure_reason(int code) const char *reason; switch (code >> 8) { case UNTERMINATED_STRING: reason = "Unterminated string"; break; + case UNTERMINATED_COMMENT: reason = "Unterminated comment"; break; case EXPECTED_OPEN_QUOTE: reason = "Expected '\"'"; break; case EXPECTED_OPEN_BRACE: reason = "Expected '{'"; break; case EXPECTED_OPEN_PAREN: reason = "Expected '('"; break; @@ -568,9 +572,16 @@ failure_reason(int code) void explain_failure(RECDB *recdb, int code) { - log_module(MAIN_LOG, LOG_ERROR, "%s (got '%c') at %s line %d column %d.", - failure_reason(code), code & 255, - recdb->source, recdb->ctx.line, recdb->ctx.col); + static char msg[1024]; + snprintf(msg, sizeof(msg), "%s (got '%c') at %s line %d column %d.", + failure_reason(code), code & 255, + recdb->source, recdb->ctx.line, recdb->ctx.col); + if (MAIN_LOG == NULL) { + fputs(msg, stderr); + fputc('\n', stderr); + fflush(stderr); + } else + log_module(MAIN_LOG, LOG_ERROR, "%s", msg); } const char * @@ -613,10 +624,12 @@ parse_database(const char *filename) if (fstat(fileno(recdb.f), &statinfo)) { log_module(MAIN_LOG, LOG_ERROR, "Unable to fstat database file '%s': %s", filename, strerror(errno)); + fclose(recdb.f); return NULL; } recdb.length = (size_t)statinfo.st_size; if (recdb.length == 0) { + fclose(recdb.f); return alloc_database(); }