X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Flibgame%2Fsetup.c;h=31c92c8e1f2d92a1b19558dddfaf7d3c321ad509;hb=bd4911b7d2f6abd30f73852e79807f06885fcba2;hp=bfe8d94b2bf0aa5d3f6eb843f73bc376c434700a;hpb=7a7efc88f5ed7fc06eb85b95d263d6a98b04a02a;p=rocksndiamonds.git diff --git a/src/libgame/setup.c b/src/libgame/setup.c index bfe8d94b..31c92c8e 100644 --- a/src/libgame/setup.c +++ b/src/libgame/setup.c @@ -2326,25 +2326,51 @@ static boolean loadSetupFileData(void *setup_file_data, char *filename, return TRUE; } +static int compareSetupFileData(const void *object1, const void *object2) +{ + const struct ConfigInfo *entry1 = (struct ConfigInfo *)object1; + const struct ConfigInfo *entry2 = (struct ConfigInfo *)object2; + + return strcmp(entry1->token, entry2->token); +} + static void saveSetupFileHash(SetupFileHash *hash, char *filename) { + int item_count = hashtable_count(hash); + int item_size = sizeof(struct ConfigInfo); + struct ConfigInfo *sort_array = checked_malloc(item_count * item_size); FILE *file; + int i = 0; - if (!(file = fopen(filename, MODE_WRITE))) + // copy string pointers from hash to array + BEGIN_HASH_ITERATION(hash, itr) { - Warn("cannot write configuration file '%s'", filename); + sort_array[i].token = HASH_ITERATION_TOKEN(itr); + sort_array[i].value = HASH_ITERATION_VALUE(itr); - return; + i++; + + if (i > item_count) // should never happen + break; } + END_HASH_ITERATION(hash, itr) - BEGIN_HASH_ITERATION(hash, itr) + // sort string pointers from hash in array + qsort(sort_array, item_count, item_size, compareSetupFileData); + + if (!(file = fopen(filename, MODE_WRITE))) { - fprintf(file, "%s\n", getFormattedSetupEntry(HASH_ITERATION_TOKEN(itr), - HASH_ITERATION_VALUE(itr))); + Warn("cannot write configuration file '%s'", filename); + + return; } - END_HASH_ITERATION(hash, itr) + for (i = 0; i < item_count; i++) + fprintf(file, "%s\n", getFormattedSetupEntry(sort_array[i].token, + sort_array[i].value)); fclose(file); + + checked_free(sort_array); } SetupFileList *loadSetupFileList(char *filename) @@ -2851,16 +2877,10 @@ static int compareTreeInfoEntries(const void *object1, const void *object2) if (entry1->parent_link || entry2->parent_link) compare_result = (entry1->parent_link ? -1 : +1); + else if (entry1->level_group != entry2->level_group) + compare_result = (entry1->level_group ? -1 : +1); else if (entry1->sort_priority == entry2->sort_priority) - { - char *name1 = getStringToLower(entry1->name_sorting); - char *name2 = getStringToLower(entry2->name_sorting); - - compare_result = strcmp(name1, name2); - - free(name1); - free(name2); - } + compare_result = strcasecmp(entry1->name_sorting, entry2->name_sorting); else if (class_sorting1 == class_sorting2) compare_result = entry1->sort_priority - entry2->sort_priority; else @@ -3026,6 +3046,9 @@ static boolean modifiedFileTimestamp(char *filename, char *timestamp_string) if (timestamp_string == NULL) return TRUE; + if (!fileExists(filename)) // file does not exist + return (atoi(timestamp_string) != 0); + if (stat(filename, &file_status) != 0) // cannot stat file return TRUE; @@ -3945,7 +3968,7 @@ void LoadArtworkInfo(void) static void MoveArtworkInfoIntoSubTree(ArtworkDirTree **artwork_node) { ArtworkDirTree *artwork_new = newTreeInfo(); - char *top_node_name = "dedicated custom artwork"; + char *top_node_name = "standalone artwork"; setTreeInfoToDefaults(artwork_new, (*artwork_node)->type); @@ -4036,8 +4059,8 @@ static void LoadArtworkInfoFromLevelInfoExt(ArtworkDirTree **artwork_node, if (node_parent == NULL) // check for top tree node { char *top_node_name = (empty_level_set_mode ? - "artwork-only level sets" : - "artwork from level sets"); + "artwork for certain level sets" : + "artwork included in level sets"); setString(&artwork_new->name, top_node_name); setString(&artwork_new->name_sorting, top_node_name);