slweb

Једноставни генератор статичких веб страна
git clone https://git.sr.ht/~strahinja/slweb
Дневник | Датотеке | Референце | ПРОЧИТАЈМЕ | ЛИЦЕНЦА

чување 15960c581e1f94845ee6300570efcfcee78d01b2
родитељ e874ce1be1aff7a8eb11739850db21331377c773
Аутор: Страхиња Радић <contact@strahinja.org>
Датум:   Sat,  4 May 2024 17:49:59 +0200

Add calling function name to error messages

Signed-off-by: Страхиња Радић <contact@strahinja.org>

Diffstat:
Mslweb.c | 164+++++++++++++++++++++++++++++++++++++++++++++++++------------------------------
измењених датотека: 1, додавања: 102(+), брисања: 62(-)

diff --git a/slweb.c b/slweb.c @@ -48,27 +48,28 @@ static int incdir_only_summary = 0; " See the file LICENSE for exact copyright and license " \ "details.") -#define CHECKEXITNOMEM(ptr) \ - do \ - { \ - if (!ptr) \ - exit(error(ENOMEM, \ - (u8*)"Memory allocation failed (out of " \ - "memory?)")); \ +#define CHECKEXITNOMEM(ptr, func) \ + do \ + { \ + if (!ptr) \ + exit(error(ENOMEM, \ + (u8*)"" #func ":%d: Memory allocation" \ + " failed (out of memory?)", \ + __LINE__)); \ } while (0) #define CALLOC(ptr, ptrtype, nmemb) \ do \ { \ ptr = calloc(nmemb, sizeof(ptrtype)); \ - CHECKEXITNOMEM(ptr); \ + CHECKEXITNOMEM(ptr, calloc); \ } while (0) #define REALLOC(ptr, ptrtype, newsize) \ do \ { \ ptrtype* newptr = realloc(ptr, newsize); \ - CHECKEXITNOMEM(newptr); \ + CHECKEXITNOMEM(newptr, realloc); \ ptr = newptr; \ } while (0) @@ -274,7 +275,7 @@ set_basedir(char** basedir, size_t* basedir_size, const char* arg) size_t arg_len = strlen(arg); if (arg_len < 1) - exit(error(1, (u8*)"--basedir: Argument required")); + exit(error(1, (u8*)"set_basedir: Argument required")); if (arg_len + 1 > *basedir_size) { @@ -298,7 +299,7 @@ set_global_link_prefix(char** global_link_prefix, size_t arg_len = strlen(arg); if (arg_len < 1) - exit(error(1, (u8*)"--global-link-prefix: Argument required")); + exit(error(1, (u8*)"set_global_link_prefix: Argument required")); if (arg_len + 1 > *global_link_prefix_size) { @@ -450,7 +451,7 @@ print_command(FILE* output, const char* command, const u8* pass_arguments[], exit(1); } else if (pid < 0) - exit(error(errno, (u8*)"Fork failed")); + exit(error(errno, (u8*)"print_command: fork failed")); /* Parent */ close(arg_pipe_fds[PIPE_READ_INDEX]); @@ -459,7 +460,7 @@ print_command(FILE* output, const char* command, const u8* pass_arguments[], FILE* cmd_output = fdopen(output_pipe_fds[PIPE_READ_INDEX], "r"); if (!cmd_input || !cmd_output) - exit(error(1, (u8*)"Cannot fdopen")); + exit(error(1, (u8*)"print_command: fdopen failed")); if (pipe_arguments) { @@ -515,7 +516,9 @@ read_file_into_buffer(FILE** input, u8** buffer, size_t* buffer_size, *input = fopen(input_filename, "r"); if (!*input) - return error(ENOENT, (u8*)"No such file: %s", input_filename); + return error(ENOENT, + (u8*)"read_file_into_buffer: No such file: %s", + input_filename); fstat(fileno(*input), &fs); free(*buffer); @@ -752,7 +755,9 @@ tsv_template_start: case '#': if (IN(tsv_state, ST_CS_HEADER)) { - error(1, (u8*)"tsv: Invalid header register mark"); + error(1, + (u8*)"print_tsv_row: Invalid header register" + " mark"); tsv_state &= ~(ST_CS_REGISTER | ST_CS_HEADER); } else if (IN(tsv_state, ST_CS_REGISTER)) @@ -767,7 +772,9 @@ tsv_template_start: case '?': if (IN(tsv_state, ST_CS_COND)) { - error(1, (u8*)"tsv: Invalid conditional mark"); + error(1, + (u8*)"print_tsv_row: Invalid conditional" + " mark"); tsv_state &= ~ST_CS_COND; } else if (IN(tsv_state, ST_CS_REGISTER)) @@ -788,8 +795,8 @@ tsv_template_start: else if (IN(tsv_state, ST_CS_COND)) { error(1, - (u8*)"Empty conditional before/without nonempty" - " conditional"); + (u8*)"print_tsv_row: Empty conditional" + " before/without nonempty conditional"); tsv_state &= ~(ST_CS_COND | ST_CS_COND_EMPTY); } else @@ -839,12 +846,14 @@ tsv_template_start: default: if (IN(tsv_state, ST_CS_HEADER)) { - error(1, (u8*)"tsv: Invalid header register mark"); + error(1, + (u8*)"print_tsv_row: Invalid header register" + " mark"); tsv_state &= ~ST_CS_HEADER; } else if (IN(tsv_state, ST_CS_REGISTER)) { - error(1, (u8*)"tsv: Invalid register mark"); + error(1, (u8*)"print_tsv_row: Invalid register mark"); tsv_state &= ~ST_CS_REGISTER; } else @@ -875,7 +884,7 @@ read_tsv(FILE* output, const char* filename, tsv_callback_t callback) UBYTE current_register = 0; if (!(tsv = fopen(filename, "rt"))) - exit(error(ENOENT, (u8*)"tsv: No such file: %s", filename)); + exit(error(ENOENT, (u8*)"read_tsv: No such file: %s", filename)); CALLOC(bufline, u8, BUFSIZE); token_size = BUFSIZE; @@ -1006,7 +1015,9 @@ process_tsv(FILE* output, const u8* arg_token, else { if (ANY(state, ST_CSV_BODY | ST_TSV_BODY)) - exit(error(1, (u8*)"Can't nest csv/tsv directives")); + exit(error(1, + (u8*)"process_tsv: Can't nest csv/tsv" + " directives")); state |= ST_TSV_BODY; @@ -1017,11 +1028,14 @@ process_tsv(FILE* output, const u8* arg_token, args = (u8*)strtok_r((char*)arg_token, " ", (char**)&saveptr); args = (u8*)strtok_r(NULL, " ", (char**)&saveptr); if (!args) - exit(error(EINVAL, (u8*)"tsv: Arguments required")); + exit(error(EINVAL, + (u8*)"process_tsv: Arguments" + " required")); args_len = strlen((char*)args); if (*args != '"' || *(args + args_len - 1) != '"') exit(error(EINVAL, - (u8*)"tsv: First argument must be a string")); + (u8*)"process_tsv: First argument must be a" + " string")); if (!tsv_filename) CALLOC(tsv_filename, u8, BUFSIZE); args_base = (u8*)strdup((char*)args + 1); @@ -1036,7 +1050,8 @@ process_tsv(FILE* output, const u8* arg_token, tsv_iter = strtol((char*)args, NULL, 10); if (errno) exit(error(errno, - (u8*)"tsv: Invalid argument '%s'", + (u8*)"process_tsv: Invalid argument" + " '%s'", args)); } } @@ -1162,7 +1177,9 @@ csv_template_start: case '#': if (IN(csv_state, ST_CS_HEADER)) { - error(1, (u8*)"csv: Invalid header register mark"); + error(1, + (u8*)"print_csv_row: Invalid header register" + " mark"); csv_state &= ~(ST_CS_REGISTER | ST_CS_HEADER); } else if (IN(csv_state, ST_CS_REGISTER)) @@ -1177,7 +1194,9 @@ csv_template_start: case '?': if (IN(csv_state, ST_CS_COND)) { - error(1, (u8*)"csv: Invalid conditional mark"); + error(1, + (u8*)"print_csv_row: Invalid conditional" + " mark"); csv_state &= ~ST_CS_COND; } else if (IN(csv_state, ST_CS_REGISTER)) @@ -1198,8 +1217,8 @@ csv_template_start: else if (IN(csv_state, ST_CS_COND)) { error(1, - (u8*)"Empty conditional before/without nonempty" - " conditional"); + (u8*)"print_csv_row: Empty conditional" + " before/without nonempty conditional"); csv_state &= ~(ST_CS_COND | ST_CS_COND_EMPTY); } else @@ -1249,12 +1268,14 @@ csv_template_start: default: if (IN(csv_state, ST_CS_HEADER)) { - error(1, (u8*)"csv: Invalid header register mark"); + error(1, + (u8*)"print_csv_row: Invalid header register" + " mark"); csv_state &= ~ST_CS_HEADER; } else if (IN(csv_state, ST_CS_REGISTER)) { - error(1, (u8*)"csv: Invalid register mark"); + error(1, (u8*)"print_csv_row: Invalid register mark"); csv_state &= ~ST_CS_REGISTER; } else @@ -1288,7 +1309,7 @@ read_csv(FILE* output, const char* filename, csv_callback_t callback) = get_value(vars, vars_count, (u8*)"csv-delimiter", NULL); if (!(csv = fopen(filename, "rt"))) - exit(error(ENOENT, (u8*)"csv: No such file: %s", filename)); + exit(error(ENOENT, (u8*)"read_csv: No such file: %s", filename)); CALLOC(bufline, u8, BUFSIZE); token_size = BUFSIZE; @@ -1458,7 +1479,9 @@ process_csv(FILE* output, const u8* arg_token, else { if (ANY(state, ST_CSV_BODY | ST_TSV_BODY)) - exit(error(1, (u8*)"Can't nest csv/tsv directives")); + exit(error(1, + (u8*)"process_csv: Can't nest csv/tsv" + " directives")); state |= ST_CSV_BODY; @@ -1471,11 +1494,13 @@ process_csv(FILE* output, const u8* arg_token, (char**)&saveptr); args = (u8*)strtok_r(NULL, " ", (char**)&saveptr); if (!args) - exit(error(EINVAL, (u8*)"csv: Arguments required")); + exit(error(EINVAL, + (u8*)"process_csv: Arguments required")); size_t args_len = strlen((char*)args); if (*args != '"' || *(args + args_len - 1) != '"') exit(error(EINVAL, - (u8*)"csv: First argument must be a string")); + (u8*)"process_csv: First argument must be a " + "string")); if (!csv_filename) CALLOC(csv_filename, u8, BUFSIZE); u8* args_base = (u8*)strdup((char*)args + 1); @@ -1490,7 +1515,8 @@ process_csv(FILE* output, const u8* arg_token, csv_iter = strtol((char*)args, NULL, 10); if (errno) exit(error(errno, - (u8*)"csv: Invalid argument '%s'", + (u8*)"process_csv: Invalid argument " + "'%s'", args)); } } @@ -1513,11 +1539,12 @@ process_include(FILE* output, const u8* token, ptoken = (u8*)strchr((char*)token, ' '); if (!input_filename) - return warning(1, (u8*)"Cannot use 'include' in stdin"); + return warning(1, + (u8*)"process_include: Cannot use 'include' in stdin"); if (!ptoken) exit(error(1, - (u8*)"Directive 'include' requires" + (u8*)"process_include: Directive 'include' requires" " an argument")); fflush(output); @@ -1535,7 +1562,7 @@ process_include(FILE* output, const u8* token, = fdopen(output_pipe_fds[PIPE_READ_INDEX], "r"))) { wait(&pstatus); - exit(error(1, (u8*)"Cannot fdopen")); + exit(error(1, (u8*)"process_include: fdopen failed")); } CALLOC(child_output_line, u8, BUFSIZE); @@ -1572,7 +1599,7 @@ process_include(FILE* output, const u8* token, close(output_pipe_fds[PIPE_READ_INDEX]); if (!(child_output = fdopen(output_pipe_fds[PIPE_WRITE_INDEX], "w"))) - exit(error(1, (u8*)"Cannot fdopen")); + exit(error(1, (u8*)"process_include: fdopen failed")); CALLOC(include_filename, char, BUFSIZE); pinclude_filename = include_filename; @@ -1636,7 +1663,7 @@ process_include(FILE* output, const u8* token, exit(result); } else - exit(error(1, (u8*)"Fork failed")); + exit(error(1, (u8*)"process_include: fork failed")); return 0; } @@ -1778,7 +1805,8 @@ process_incdir_subdir(FILE* output, const char* subdirname, < 0) { perror("scandir"); - exit(error(errno, (u8*)"incdir_subdir: scandir '%s' error", + exit(error(errno, + (u8*)"process_incdir_subdir: scandir '%s' error", abs_subdirname)); } @@ -1848,7 +1876,9 @@ process_incdir_subdir(FILE* output, const char* subdirname, result = slweb_parse(output, filename, buffer, 1, 1); if (result) { - warning(1, (u8*)"slweb_parse error"); + warning(1, + (u8*)"process_incdir_subdir: " + "slweb_parse error"); goto incdir_subdir_child_cleanup; } @@ -1857,7 +1887,9 @@ process_incdir_subdir(FILE* output, const char* subdirname, formatted_date = format_date(date, list_timestamp_format); if (!formatted_date) - exit(error(1, (u8*)"format_date error")); + exit(error(1, + (u8*)"process_incdir_subdir: " + "format_date error")); /* Have to temporarily reset this because of potential * interaction with print_output */ @@ -1942,7 +1974,8 @@ process_incdir_subdir(FILE* output, const char* subdirname, exit(result); } else - exit(error(1, (u8*)"Fork failed")); + exit(error(1, + (u8*)"process_incdir_subdir: fork failed")); if (!list_only) print_output(output, "</article>\n"); @@ -1991,12 +2024,12 @@ process_incdir(FILE* output, const u8* token, const u8* link_prefix, arg = (u8*)strtok_r((char*)token, " ", (char**)&saveptr); arg = (u8*)strtok_r(NULL, " ", (char**)&saveptr); if (!arg) - exit(error(1, (u8*)"incdir: Arguments required")); + exit(error(1, (u8*)"process_incdir: Arguments required")); arg_len = strlen((char*)arg); if (*arg != '"' || *(arg + arg_len - 1) != '"') - exit(error(1, (u8*)"incdir: First argument not string")); + exit(error(1, (u8*)"process_incdir: First argument not string")); incdir = strdup((char*)(arg + 1)); *(incdir + strlen(incdir) - 1) = 0; /* trim ending " */ @@ -2018,14 +2051,17 @@ incdir_next_arg: while (parg && *parg) { if (*parg < '0' || *parg > '9') - exit(error(1, (u8*)"incdir: Invalid argument")); + exit(error(1, + (u8*)"process_incdir: Invalid " + "argument")); parg++; } errno = 0; num = strtol((char*)arg, NULL, 10); if (errno) exit(error(errno, - (u8*)"incdir: Invalid parameter 'num'")); + (u8*)"process_incdir: Invalid parameter " + "'num'")); } pass++; if (pass < 3) @@ -2039,7 +2075,8 @@ incdir_done_args: < 0) { perror("scandir"); - exit(error(errno, (u8*)"incdir: scandir '%s' error", incdir)); + exit(error(errno, (u8*)"process_incdir: scandir '%s' error", + incdir)); } pnamelist = namelist; @@ -2183,7 +2220,8 @@ process_macro_def(FILE* output, const u8* token, } if (IN(state, ST_MACRO_BODY)) - exit(error(1, (u8*)"Cannot nest definitions")); + exit(error(1, + (u8*)"process_macro_def: Cannot nest definitions")); if (read_yaml_macros_and_links) { @@ -2222,7 +2260,8 @@ process_macro(FILE* output, const u8* token, const int end_tag) macro_body = get_value(macros, macros_count, token + 1, NULL); if (!macro_body) - exit(error(1, (u8*)"Macro '%s' undefined", token + 1)); + exit(error(1, (u8*)"process_macro: Macro '%s' undefined", + token + 1)); eol = (u8*)strrchr((char*)macro_body, '\n'); macro_body_len = strlen((char*)macro_body); @@ -2508,7 +2547,7 @@ print_image_dimensions(FILE* output, const u8* image_file_prefix, const u8* path snprintf(command, BUFSIZE - 1, CMD_IDENTIFY, image_path); cmd_output = popen(command, "r"); if (!cmd_output) - return error(errno, (u8*)"print_image_dimensions: Cannot popen"); + return error(errno, (u8*)"print_image_dimensions: popen failed"); if (!fgets(cmd_output_line, BUFSIZE, cmd_output)) goto print_dimensions_cleanup; @@ -3028,7 +3067,8 @@ simple_parse_yaml_line(const u8* line, KeyValue** vars, size_t* vars_count, var_key = (u8*)strdup((char*)token); if (!var_key) exit(error(ENOMEM, - (u8*)"Memory allocation failed (out of " + (u8*)"simple_parse_yaml_line: strdup " + "failed (out of " "memory?)")); ptoken = token; *ptoken = 0; @@ -3140,7 +3180,7 @@ slweb_parse(FILE* output, const char* source_filename, const u8* buffer, u8* eol = NULL; if (!buffer) - exit(error(1, (u8*)"Empty buffer")); + exit(error(1, (u8*)"slweb_parse: Empty buffer")); title = get_value(vars, vars_count, (u8*)"title", NULL); title_heading_level @@ -5032,8 +5072,8 @@ do_line: { if (IN(state, ST_FORMULA)) exit(error(1, - (u8*)"Display formula within an" - " open formula")); + (u8*)"slweb_parse: Display formula " + "within an open formula")); if (!(IN(state, ST_DISPLAY_FORMULA))) { @@ -5069,8 +5109,8 @@ do_line: { if (IN(state, ST_DISPLAY_FORMULA)) exit(error(1, - (u8*)"Formula within an open" - " display formula")); + (u8*)"slweb_parse: Formula within an " + "open display formula")); if (!(IN(state, ST_FORMULA))) { @@ -5633,7 +5673,7 @@ main(const int argc, const char** argv) else { error(EINVAL, - (u8*)"Invalid " + (u8*)"main: Invalid " "argument: --%s", arg); return usage(); @@ -5663,7 +5703,7 @@ main(const int argc, const char** argv) break; default: error(EINVAL, - (u8*)"Invalid " + (u8*)"main: Invalid " "argument: -%c", c); return usage(); @@ -5695,7 +5735,7 @@ main(const int argc, const char** argv) } if (cmd == CMD_BASEDIR) - return error(1, (u8*)"-d: Argument required"); + return error(1, (u8*)"main: set_basedir: Argument required"); if (cmd == CMD_FULL_VERSION) return version(1);