-
-
-
-extern void parse_file(char * path, void (* token_to_entry) (struct Context *))
-{
- char * f_name = "read_new_config_file()";
- struct Context context;
- char * err_pre_prefix = "Failed reading config file: \"";
- char * err_pre_affix = "\". ";
- context.err_pre = try_malloc(strlen(err_pre_prefix) + strlen(path)
- + strlen(err_pre_affix) + 1, f_name);
- sprintf(context.err_pre, "%s%s%s", err_pre_prefix, path, err_pre_affix);
- exit_err(access(path, F_OK), context.err_pre);
- FILE * file = try_fopen(path, "r", f_name);
- uint32_t linemax = textfile_width(file);
- context.line = try_malloc(linemax + 1, f_name);
- reset_err_try_fgets_counter();
- err_line(0 == linemax, context.line, context.err_pre, "File is empty.");
- context.token0 = NULL; /* For token_to_entry() if while() stagnates. */
- char * err_val = "No value given.";
- char * err_many = "Too many values.";
- while (err_try_fgets(context.line, linemax + 1, file, context.err_pre, ""))
- {
- char * line_copy = strdup(context.line);
- context.token0 = token_from_line(line_copy);
- if (context.token0)
- {
- err_line(0 == (context.token1 = token_from_line(NULL)),
- context.line, context.err_pre, err_val);
- err_line(NULL != token_from_line(NULL),
- context.line, context.err_pre, err_many);
- token_to_entry(&context);
- context.token0 = NULL;
- }
- free(line_copy);
- }
- token_to_entry(&context);
- try_fclose(file, f_name);
- free(context.line);
- free(context.err_pre);
-}