+extern void read_config_file(char * path, enum cleanup_flag cleanup,
+ size_t size, struct EntrySkeleton ** entry_start,
+ void (* read) (char *, uint32_t, char *,
+ struct EntrySkeleton *, FILE *))
+{
+ char * f_name = "init_map_object_defs()";
+ char * context_prefix = "Failed reading config file: ";
+ char context[strlen(context_prefix) + strlen(path) + 1];
+ sprintf(context, "%s%s", context_prefix, path);
+ char * err_uniq = "Declaration of ID already used.";
+ FILE * file = try_fopen(path, "r", f_name);
+ uint32_t linemax = textfile_width(file);
+ char line[linemax + 1];
+ reset_err_try_fgets_counter();
+ struct EntrySkeleton ** entry_ptr_ptr = entry_start;
+ while (1)
+ {
+ int test_for_end = try_fgetc(file, f_name);
+ if (EOF == test_for_end || '\n' == test_for_end)
+ {
+ break;
+ }
+ exit_trouble(EOF == ungetc(test_for_end, file), f_name, "ungetc()");
+ err_try_fgets(line, linemax, file, context, "nfi8");
+ struct EntrySkeleton * entry = try_malloc(size, f_name);
+ entry->id = atoi(line);
+ struct EntrySkeleton * entry_test = * entry_start;
+ for (; NULL != entry_test; entry_test = entry_test->next)
+ {
+ err_line(entry->id == entry_test->id, line, context, err_uniq);
+ }
+ read(line, linemax, context, entry, file);
+ entry->next = NULL;
+ * entry_ptr_ptr = entry;
+ entry_ptr_ptr = &entry->next;
+ err_try_fgets(line, linemax, file, context, "d");
+ }
+ try_fclose(file, f_name);
+ set_cleanup_flag(cleanup);
+}
+
+
+