diff options
-rw-r--r-- | CMakeLists.txt | 16 | ||||
-rw-r--r-- | Makefile | 5 | ||||
-rw-r--r-- | meson.build | 8 | ||||
-rw-r--r-- | pom.c | 86 |
4 files changed, 66 insertions, 49 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..f14c696 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 3.0...3.31) +project(pom) + +if (MSVC) + add_compile_options(/W4) +else() + add_compile_options(-Wall -Wextra -Wpedantic -Wshadow) +endif() + + +add_library(pom-static STATIC pom.c) +add_library(pom SHARED pom.c) +add_executable(tests tests/errors.c tests/location.c tests/parsing.c tests/main.c) +target_include_directories(tests PRIVATE .) +target_link_libraries(tests pom-static) + @@ -1,7 +1,8 @@ PROFILE ?= release BUILD_DIR ?= $(PROFILE) __build: - @[ -d $(BUILD_DIR) ] || meson setup --buildtype $(PROFILE) $(BUILD_DIR) - ninja -C $(BUILD_DIR) + mkdir -p $(BUILD_DIR) + P=`pwd` && cd $(BUILD_DIR) && cmake $$P + make -j16 -C $(BUILD_DIR) .PHONY: __build diff --git a/meson.build b/meson.build deleted file mode 100644 index ab5080b..0000000 --- a/meson.build +++ /dev/null @@ -1,8 +0,0 @@ -project('pom', 'c', - # Note: Only C99 is strictly needed - default_options: ['c_std=c23']) -library('pom', 'pom.c') -static_lib = static_library('pom', 'pom.c') -tests = executable('tests', 'tests/main.c', 'tests/parsing.c', - 'tests/errors.c', 'tests/location.c', link_with: [static_lib]) -test('tests', tests) @@ -205,7 +205,7 @@ pom_realloc(const pom_settings *settings, void *ptr, size_t sz) { } static void pom_free(const pom_settings *settings, void *ptr) { - return settings->free(settings->allocator_udata, ptr); + settings->free(settings->allocator_udata, ptr); } static const char * @@ -254,7 +254,7 @@ make_error(const pom_settings *settings, const char *file, uint64_t line, enum e va_copy(args_copy, args); bool bad_fmt = false; int len = vsnprintf(NULL, 0, fmt, args); - if (len < 0 || len > INT_MAX - sizeof(pom_error) - 1) { + if (len < 0 || (size_t)len > INT_MAX - sizeof(pom_error) - 1) { // Could technically happen if %s gets a really long string. // Just use fmt as the error in this case. bad_fmt = true; @@ -491,7 +491,7 @@ parser_read_to_buf(struct parser *parser, bool skip_bom) { continue; } else if (byte == '\n') { parser->line_number++; - } else if (byte >= 0 && byte < 32 && byte != '\t') { + } else if (byte < 32 && byte != '\t') { parser_error(parser, ERROR_ASCII_CONTROL, byte); continue; } @@ -863,7 +863,7 @@ set_error(const pom_settings *settings, pom_error **error, pom_error *e) { if (error) { *error = e; } else { - free(e); + pom_free(settings, e); } } @@ -1099,17 +1099,58 @@ parser_finish(struct parser *parser) { } static void *libc_calloc(void *udata, size_t n, size_t sz) { + (void)udata; return calloc(n, sz); } static void *libc_realloc(void *udata, void *ptr, size_t new_size) { + (void)udata; return realloc(ptr, new_size); } static void libc_free(void *udata, void *ptr) { + (void)udata; free(ptr); } +// make single pom_error out of all of parser's errors. +static pom_error *parser_make_error(struct parser *parser) { + // shouldn't realistically overflow given that we cut off at 1000 errors + size_t len = (parser->errors.count + 1) * (sizeof(pom_error) + strlen(parser->filename) + 32) + + parser->error_messages.count * 2 + 64; + // convert parser_errors to pom_error. + pom_error *errors = pom_calloc(parser->settings, 1, len); + if (errors) { + char *messages = (char *)(errors + parser->errors.count); + memcpy(messages, + parser->error_messages.array, + parser->error_messages.count); + char *filename = (char *)messages + parser->error_messages.count; + strcpy(filename, parser->filename); + for (size_t i = 0; i < parser->errors.count; i++) { + const struct parser_error *parser_error = &parser->errors.array[i]; + errors[i].file = filename; + errors[i].line = parser_error->line; + errors[i].message = messages + parser_error->message; + errors[i].next = i == parser->errors.count - 1 ? NULL : &errors[i+1]; + errors[i].string = NULL; + } + // create string containing all error messages + char *string = strchr(filename, '\0') + 1, *s = string; + sprintf(s, "%s\n", get_error_message(parser->settings, ERROR_HEADER)); + s = strchr(s, 0); + for (size_t i = 0; i < parser->errors.count; i++) { + const pom_error *e = &errors[i]; + sprintf(s, "%s:%" PRIu64 ": %s\n", e->file, e->line, e->message); + s = strchr(s, 0); + } + errors->string = string; + return errors; + } else { + return parser->out_of_memory_error; + } +} + pom_conf * pom_load(const pom_settings *psettings, const char *filename, size_t (*read_func)(void *userdata, char *buf, size_t len), @@ -1157,40 +1198,7 @@ pom_load(const pom_settings *psettings, const char *filename, set_error(settings, error, out_of_memory); } else if (parser->errors.count) { if (error) { - // shouldn't realistically overflow given that we cut off at 1000 errors - size_t len = (parser->errors.count + 1) * (sizeof(pom_error) + strlen(filename) + 32) - + parser->error_messages.count * 2 + 64; - // convert parser_errors to pom_error. - pom_error *errors = pom_calloc(settings, 1, len); - if (errors) { - char *messages = (char *)(errors + parser->errors.count); - memcpy(messages, - parser->error_messages.array, - parser->error_messages.count); - char *filename = (char *)messages + parser->error_messages.count; - strcpy(filename, parser->filename); - for (size_t i = 0; i < parser->errors.count; i++) { - const struct parser_error *parser_error = &parser->errors.array[i]; - errors[i].file = filename; - errors[i].line = parser_error->line; - errors[i].message = messages + parser_error->message; - errors[i].next = i == parser->errors.count - 1 ? NULL : &errors[i+1]; - errors[i].string = NULL; - } - // create string containing all error messages - char *string = strchr(filename, '\0') + 1, *s = string; - sprintf(s, "%s\n", get_error_message(settings, ERROR_HEADER)); - s = strchr(s, 0); - for (size_t i = 0; i < parser->errors.count; i++) { - const pom_error *e = &errors[i]; - sprintf(s, "%s:%" PRIu64 ": %s\n", e->file, e->line, e->message); - s = strchr(s, 0); - } - errors->string = string; - *error = errors; - } else { - *error = parser->out_of_memory_error; - } + *error = parser_make_error(parser); } pom_free(settings, parser->errors.array); pom_free(settings, parser->error_messages.array); @@ -1423,7 +1431,7 @@ pom_conf_location(const pom_conf *conf, const char *key, const char **file, uint const struct conf_section *section = &conf->sections[i]; if (section->conf.items_count == 0) goto fail; - const struct conf_item *item = §ion->conf.items[0]; + item = §ion->conf.items[0]; if (file) *file = item->file; if (line) *line = item->line; return true; |