X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fmisc.c;h=ed4c2606e81026f94c307d9da347eab39f3db3b8;hb=576a46a06a23264fbc2345cf591a0dbe7fd2a767;hp=a81f15532538efaa163fb591c1261108fc7dd53c;hpb=a4e95e0a6d4b53732ea0a585be0b6df55ae41e42;p=rocksndiamonds.git diff --git a/src/libgame/misc.c b/src/libgame/misc.c index a81f1553..ed4c2606 100644 --- a/src/libgame/misc.c +++ b/src/libgame/misc.c @@ -1240,7 +1240,7 @@ void GetOptions(int argc, char *argv[], void (*print_usage_function)(void), void (*print_version_function)(void)) { - char *ro_base_path = getProgramMainDataPath(argv[0], RO_BASE_PATH); + char *base_path = getProgramMainDataPath(argv[0], BASE_PATH); char **argvplus = checked_calloc((argc + 1) * sizeof(char **)); char **options_left = &argvplus[1]; @@ -1252,15 +1252,17 @@ void GetOptions(int argc, char *argv[], options.server_host = NULL; options.server_port = 0; - options.ro_base_directory = ro_base_path; - options.level_directory = getPath2(ro_base_path, LEVELS_DIRECTORY); - options.graphics_directory = getPath2(ro_base_path, GRAPHICS_DIRECTORY); - options.sounds_directory = getPath2(ro_base_path, SOUNDS_DIRECTORY); - options.music_directory = getPath2(ro_base_path, MUSIC_DIRECTORY); - options.docs_directory = getPath2(ro_base_path, DOCS_DIRECTORY); - options.conf_directory = getPath2(ro_base_path, CONF_DIRECTORY); + options.base_directory = base_path; + + options.level_directory = getPath2(base_path, LEVELS_DIRECTORY); + options.graphics_directory = getPath2(base_path, GRAPHICS_DIRECTORY); + options.sounds_directory = getPath2(base_path, SOUNDS_DIRECTORY); + options.music_directory = getPath2(base_path, MUSIC_DIRECTORY); + options.docs_directory = getPath2(base_path, DOCS_DIRECTORY); + 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; @@ -1332,17 +1334,17 @@ void GetOptions(int argc, char *argv[], if (option_arg == NULL) FailWithHelp("option '%s' requires an argument", option_str); - options.ro_base_directory = ro_base_path = getStringCopy(option_arg); + options.base_directory = base_path = getStringCopy(option_arg); if (option_arg == next_option) options_left++; // adjust paths for sub-directories in base directory accordingly - options.level_directory = getPath2(ro_base_path, LEVELS_DIRECTORY); - options.graphics_directory = getPath2(ro_base_path, GRAPHICS_DIRECTORY); - options.sounds_directory = getPath2(ro_base_path, SOUNDS_DIRECTORY); - options.music_directory = getPath2(ro_base_path, MUSIC_DIRECTORY); - options.docs_directory = getPath2(ro_base_path, DOCS_DIRECTORY); - options.conf_directory = getPath2(ro_base_path, CONF_DIRECTORY); + options.level_directory = getPath2(base_path, LEVELS_DIRECTORY); + options.graphics_directory = getPath2(base_path, GRAPHICS_DIRECTORY); + options.sounds_directory = getPath2(base_path, SOUNDS_DIRECTORY); + options.music_directory = getPath2(base_path, MUSIC_DIRECTORY); + options.docs_directory = getPath2(base_path, DOCS_DIRECTORY); + options.conf_directory = getPath2(base_path, CONF_DIRECTORY); } else if (strncmp(option, "-levels", option_len) == 0) { @@ -1427,6 +1429,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")) { @@ -1839,6 +1850,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 // ---------------------------------------------------------------------------- @@ -3768,6 +3822,11 @@ static void replaceArtworkListEntry(struct ArtworkListInfo *artwork_info, char *basename = file_list_entry->filename; char *filename = getCustomArtworkFilename(basename, artwork_info->type); + // mark all images from non-default graphics directory as "redefined" + if (artwork_info->type == ARTWORK_TYPE_GRAPHICS && + !strPrefix(filename, options.graphics_directory)) + file_list_entry->redefined = TRUE; + if (filename == NULL) { Warn("cannot find artwork file '%s'", basename);