X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fmisc.c;h=3da335978e5a2a539899ad89edc9c3e5bb77cabc;hb=eae2f3467caaaf64a9370c1acd8cecf11fd58328;hp=c3e5b205eaa0e83837b2ed5b13d5bf4db5000d71;hpb=ed4b7eed89c292042403561e1ed1449e60888b45;p=rocksndiamonds.git diff --git a/src/misc.c b/src/misc.c index c3e5b205..3da33597 100644 --- a/src/misc.c +++ b/src/misc.c @@ -167,9 +167,20 @@ void WaitUntilDelayReached(unsigned long *counter_var, unsigned long delay) *counter_var = actual_counter; } +/* int2str() returns a number converted to a string; + the used memory is static, but will be overwritten by later calls, + so if you want to save the result, copy it to a private string buffer; + there can be 10 local calls of int2str() without buffering the result -- + the 11th call will then destroy the result from the first call and so on. +*/ + char *int2str(int number, int size) { - static char s[40]; + static char shift_array[10][40]; + static int shift_counter = 0; + char *s = shift_array[shift_counter]; + + shift_counter = (shift_counter + 1) % 10; if (size > 20) size = 20; @@ -235,12 +246,49 @@ char *getLoginName() { struct passwd *pwd; - if (!(pwd = getpwuid(getuid()))) - return "ANONYMOUS"; + if ((pwd = getpwuid(getuid())) == NULL) + return ANONYMOUS_NAME; else return pwd->pw_name; } +char *getRealName() +{ +#ifndef MSDOS + struct passwd *pwd; + + if ((pwd = getpwuid(getuid())) == NULL || strlen(pwd->pw_gecos) == 0) + return ANONYMOUS_NAME; + else + { + static char real_name[1024]; + char *from_ptr = pwd->pw_gecos, *to_ptr = real_name; + + if (strchr(pwd->pw_gecos, 'ß') == NULL) + return pwd->pw_gecos; + + /* the user's real name contains a 'ß' character (german sharp s), + which has no equivalent in upper case letters (which our fonts use) */ + while (*from_ptr != '\0' && (long)(to_ptr - real_name) < 1024 - 2) + { + if (*from_ptr != 'ß') + *to_ptr++ = *from_ptr++; + else + { + from_ptr++; + *to_ptr++ = 's'; + *to_ptr++ = 's'; + } + } + *to_ptr = '\0'; + + return real_name; + } +#else + return ANONYMOUS_NAME; +#endif +} + char *getHomeDir() { #ifndef MSDOS @@ -299,6 +347,7 @@ char *getStringToLower(char *s) while (*s) *s_ptr++ = tolower(*s++); + *s_ptr = '\0'; return s_copy; } @@ -342,8 +391,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; @@ -409,13 +459,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) { @@ -542,6 +594,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