summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt16
-rw-r--r--Makefile5
-rw-r--r--meson.build8
-rw-r--r--pom.c86
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)
+
diff --git a/Makefile b/Makefile
index 34e5195..5b495b4 100644
--- a/Makefile
+++ b/Makefile
@@ -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)
diff --git a/pom.c b/pom.c
index 945b729..2ca3ffa 100644
--- a/pom.c
+++ b/pom.c
@@ -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 = &section->conf.items[0];
+ item = &section->conf.items[0];
if (file) *file = item->file;
if (line) *line = item->line;
return true;