X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fmisc.c;h=7ff3a94781e0ed66ab23597f99b5a19935c9484c;hb=5d50a7e10873581345ee63a5afafd43dbd45809b;hp=9aec199e92e8a442a56922fdcb7c080a14776317;hpb=efd80a08bd5de21956872a615f1d03f2dd90cee2;p=rocksndiamonds.git diff --git a/src/misc.c b/src/misc.c index 9aec199e..7ff3a947 100644 --- a/src/misc.c +++ b/src/misc.c @@ -243,6 +243,7 @@ char *getLoginName() char *getRealName() { +#ifndef MSDOS struct passwd *pwd; if ((pwd = getpwuid(getuid())) == NULL || strlen(pwd->pw_gecos) == 0) @@ -272,6 +273,9 @@ char *getRealName() return real_name; } +#else + return ANONYMOUS_NAME; +#endif } char *getHomeDir() @@ -375,8 +379,9 @@ void GetOptions(char *argv[]) options.display_name = NULL; options.server_host = NULL; options.server_port = 0; - options.base_directory = BASE_PATH; - options.level_directory = BASE_PATH "/" LEVELS_DIRECTORY; + options.ro_base_directory = RO_BASE_PATH; + options.rw_base_directory = RW_BASE_PATH; + options.level_directory = RO_BASE_PATH "/" LEVELS_DIRECTORY; options.serveronly = FALSE; options.network = FALSE; options.verbose = FALSE; @@ -442,13 +447,15 @@ void GetOptions(char *argv[]) if (option_arg == NULL) Error(ERR_EXIT_HELP, "option '%s' requires an argument", option_str); - options.base_directory = option_arg; + /* this should be extended to separate options for ro and rw data */ + options.ro_base_directory = option_arg; + options.rw_base_directory = option_arg; if (option_arg == next_option) options_left++; /* adjust path for level directory accordingly */ options.level_directory = - getPath2(options.base_directory, LEVELS_DIRECTORY); + getPath2(options.ro_base_directory, LEVELS_DIRECTORY); } else if (strncmp(option, "-levels", option_len) == 0) { @@ -575,6 +582,84 @@ void *checked_calloc(unsigned long size) return ptr; } +short getFile16BitInteger(FILE *file, int byte_order) +{ + if (byte_order == BYTE_ORDER_BIG_ENDIAN) + return ((fgetc(file) << 8) | + (fgetc(file) << 0)); + else /* BYTE_ORDER_LITTLE_ENDIAN */ + return ((fgetc(file) << 0) | + (fgetc(file) << 8)); +} + +void putFile16BitInteger(FILE *file, short value, int byte_order) +{ + if (byte_order == BYTE_ORDER_BIG_ENDIAN) + { + fputc((value >> 8) & 0xff, file); + fputc((value >> 0) & 0xff, file); + } + else /* BYTE_ORDER_LITTLE_ENDIAN */ + { + fputc((value >> 0) & 0xff, file); + fputc((value >> 8) & 0xff, file); + } +} + +int getFile32BitInteger(FILE *file, int byte_order) +{ + if (byte_order == BYTE_ORDER_BIG_ENDIAN) + return ((fgetc(file) << 24) | + (fgetc(file) << 16) | + (fgetc(file) << 8) | + (fgetc(file) << 0)); + else /* BYTE_ORDER_LITTLE_ENDIAN */ + return ((fgetc(file) << 0) | + (fgetc(file) << 8) | + (fgetc(file) << 16) | + (fgetc(file) << 24)); +} + +void putFile32BitInteger(FILE *file, int value, int byte_order) +{ + if (byte_order == BYTE_ORDER_BIG_ENDIAN) + { + fputc((value >> 24) & 0xff, file); + fputc((value >> 16) & 0xff, file); + fputc((value >> 8) & 0xff, file); + fputc((value >> 0) & 0xff, file); + } + else /* BYTE_ORDER_LITTLE_ENDIAN */ + { + fputc((value >> 0) & 0xff, file); + fputc((value >> 8) & 0xff, file); + fputc((value >> 16) & 0xff, file); + fputc((value >> 24) & 0xff, file); + } +} + +void getFileChunk(FILE *file, char *chunk_buffer, int *chunk_length, + int byte_order) +{ + const int chunk_identifier_length = 4; + + /* read chunk identifier */ + fgets(chunk_buffer, chunk_identifier_length + 1, file); + + /* read chunk length */ + *chunk_length = getFile32BitInteger(file, byte_order); +} + +void putFileChunk(FILE *file, char *chunk_name, int chunk_length, + int byte_order) +{ + /* write chunk identifier */ + fputs(chunk_name, file); + + /* write chunk length */ + putFile32BitInteger(file, chunk_length, byte_order); +} + #define TRANSLATE_KEYSYM_TO_KEYNAME 0 #define TRANSLATE_KEYSYM_TO_X11KEYNAME 1 #define TRANSLATE_X11KEYNAME_TO_KEYSYM 2