чување 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:
| M | slweb.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);