X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fmisc.c;h=bd93e1ce170af1cc4f74a2a2a37b5869f11e50f6;hb=224535bfe9ef9bfae63168c8ed99c2b70d2f44b1;hp=36e576bc59c15a8e2945cb7e24f199f6de372026;hpb=6d4b6a4bebf4a5b6f759aaf032d3ce2e5f82385f;p=rocksndiamonds.git diff --git a/src/libgame/misc.c b/src/libgame/misc.c index 36e576bc..bd93e1ce 100644 --- a/src/libgame/misc.c +++ b/src/libgame/misc.c @@ -549,6 +549,61 @@ boolean getTokenValueFromString(char *string, char **token, char **value) } +// ---------------------------------------------------------------------------- +// UUID functions +// ---------------------------------------------------------------------------- + +#define UUID_BYTES 16 +#define UUID_CHARS (UUID_BYTES * 2) +#define UUID_LENGTH (UUID_CHARS + 4) + +static char *getUUID(void) +{ + static char uuid[UUID_LENGTH + 1]; + int data[UUID_BYTES]; + int count = 0; + int i; + + for (i = 0; i < UUID_BYTES; i++) + data[i] = GetSimpleRandom(256); + + data[6] = 0x40 | (data[6] & 0x0f); + data[8] = 0x80 | (data[8] & 0x3f); + + for (i = 0; i < UUID_BYTES; i++) + { + sprintf(&uuid[count], "%02x", data[i]); + count += 2; + + if (i == 3 || i == 5 || i == 7 || i == 9) + strcat(&uuid[count++], "-"); + } + + return uuid; +} + +char *GetPlayerUUID(void) +{ + return getUUID(); +} + +char *GetSystemUUID(void) +{ + if (program.system_uuid != NULL) + return program.system_uuid; + + return getUUID(); +} + +void SetSystemUUID(char *uuid) +{ + if (program.system_uuid != NULL) + checked_free(program.system_uuid); + + program.system_uuid = getStringCopy(uuid); +} + + // ---------------------------------------------------------------------------- // counter functions // ---------------------------------------------------------------------------- @@ -1262,6 +1317,7 @@ void GetOptions(int argc, char *argv[], options.conf_directory = getPath2(base_path, CONF_DIRECTORY); options.execute_command = NULL; + options.tape_log_filename = NULL; options.special_flags = NULL; options.debug_mode = NULL; @@ -1428,6 +1484,15 @@ void GetOptions(int argc, char *argv[], // when doing batch processing, always enable verbose mode (warnings) options.verbose = TRUE; } + else if (strncmp(option, "-tape_logfile", option_len) == 0) + { + if (option_arg == NULL) + FailWithHelp("option '%s' requires an argument", option_str); + + options.tape_log_filename = getStringCopy(option_arg); + if (option_arg == next_option) + options_left++; + } #if defined(PLATFORM_MACOSX) else if (strPrefix(option, "-psn")) { @@ -1840,6 +1905,49 @@ char *getLatin1FromUTF8(char *utf8) } +// ---------------------------------------------------------------------------- +// functions for JSON handling +// ---------------------------------------------------------------------------- + +char *getEscapedJSON(char *s) +{ + int max_json_size = 2 * strlen(s) + 1; + char *json = checked_calloc(max_json_size); + unsigned char *src = (unsigned char *)s; + unsigned char *dst = (unsigned char *)json; + char *escaped[256] = + { + ['\b'] = "\\b", + ['\f'] = "\\f", + ['\n'] = "\\n", + ['\r'] = "\\r", + ['\t'] = "\\t", + ['\"'] = "\\\"", + ['\\'] = "\\\\", + }; + + while (*src) + { + if (escaped[*src] != NULL) + { + char *esc = escaped[*src++]; + + while (*esc) + *dst++ = *esc++; + } + else + { + *dst++ = *src++; + } + } + + // only use the smallest possible string buffer size + json = checked_realloc(json, strlen(json) + 1); + + return json; +} + + // ---------------------------------------------------------------------------- // functions to translate key identifiers between different format // ----------------------------------------------------------------------------