X-Git-Url: https://plomlompom.com/repos/?a=blobdiff_plain;f=src%2Fserver%2Fio.c;h=079a8339c6bd3ac28d8a8932f3f952b0a4a7fec0;hb=f9d5829b125ef2df8d63bc08761be33f93c65691;hp=035f4fe1d0759436f6dc5aed53710df00e82177b;hpb=d12efb0addf420adc045cfb96647dff6241310ee;p=plomrogue diff --git a/src/server/io.c b/src/server/io.c index 035f4fe..079a833 100644 --- a/src/server/io.c +++ b/src/server/io.c @@ -5,16 +5,21 @@ #include /* PIPE_BUF */ #include /* size_t, NULL */ #include /* uint8_t, uint32_t */ -#include /* defines EOF, FILE, sprintf() */ -#include /* free() */ +#include /* defines EOF, FILE, sprintf(), ungetc() */ +#include /* free(), atoi() */ #include /* strlen(), memcpy() */ #include /* time_t */ #include /* time() */ +#include "../common/err_try_fgets.h" /* err_try_fgets(), err_line(), + * reset_err_try_fgets_counter() + */ #include "../common/readwrite.h" /* try_fopen(), try_fclose_unlink_rename(), - * try_fwrite(), try_fputc(), try_fgetc() + * try_fwrite(), try_fputc(), try_fgetc(), + * try_fclose() */ +#include "../common/rexit.h" /* exit_trouble() */ #include "../common/try_malloc.h" /* try_malloc() */ -#include "cleanup.h" /* set_cleanup_flag() */ +#include "cleanup.h" /* set_cleanup_flag(), enum cleanup_flag */ #include "map_objects.h" /* structs MapObj, MapObjDef, get_map_obj_def() */ #include "world.h" /* global world */ @@ -218,6 +223,49 @@ static void write_map(FILE * file) +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); +} + + + extern char * io_round() { char * f_name = "io_round()";