diff options
author | pommicket <pommicket@gmail.com> | 2025-09-15 15:11:13 -0400 |
---|---|---|
committer | pommicket <pommicket@gmail.com> | 2025-09-15 15:11:59 -0400 |
commit | dc989291eb6b9b20a25a78f35d6f04968a88ed0b (patch) | |
tree | ca494122e2169cbfdb776bfbeadc4b791af03ab9 /pom.c | |
parent | 627278a0cb84bca7751e97f13d9c235abac678f0 (diff) |
Switch to cmake
meson builds "thin" archives by default (this is basically undocumented).
You can avoid this by setting install: true supposedly. Whatever I hate it anyways.
Diffstat (limited to 'pom.c')
-rw-r--r-- | pom.c | 86 |
1 files changed, 47 insertions, 39 deletions
@@ -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; |