void BLT_lang_free(void) { #ifdef WITH_INTERNATIONAL free_locales(); #else #endif }
void sd_tournament_free(sd_tournament_file *trn) { if(trn == NULL) return; free_locales(trn); free_enemies(trn); if(trn->pic_file != NULL) { free(trn->pic_file); } }
void test_cleanup(void) { test_clear_terrains(); test_clear_resources(); global.functions.maintenance = NULL; global.functions.wage = NULL; default_locale = 0; free_locales(); free_spells(); free_spellbooks(); free_gamedata(); }
static void fill_locales(void) { const char * const languages_path = BKE_appdir_folder_id(BLENDER_DATAFILES, "locale"); char languages[FILE_MAX]; LinkNode *lines = NULL, *line; char *str; int idx = 0; free_locales(); BLI_join_dirfile(languages, FILE_MAX, languages_path, "languages"); line = lines = BLI_file_read_as_lines(languages); /* This whole "parsing" code is a bit weak, in that it expects strictly formatted input file... * Should not be a problem, though, as this file is script-generated! */ /* First loop to find highest locale ID */ while (line) { int t; str = (char *)line->link; if (str[0] == '#' || str[0] == '\0') { line = line->next; continue; /* Comment or void... */ } t = atoi(str); if (t >= num_locales) num_locales = t + 1; num_locales_menu++; line = line->next; } num_locales_menu++; /* The "closing" void item... */ /* And now, build locales and locale_menu! */ locales_menu = MEM_callocN(num_locales_menu * sizeof(EnumPropertyItem), __func__); line = lines; /* Do not allocate locales with zero-sized mem, as LOCALE macro uses NULL locales as invalid marker! */ if (num_locales > 0) { locales = MEM_callocN(num_locales * sizeof(char *), __func__); while (line) { int id; char *loc, *sep1, *sep2, *sep3; str = (char *)line->link; if (str[0] == '#' || str[0] == '\0') { line = line->next; continue; } id = atoi(str); sep1 = strchr(str, ':'); if (sep1) { sep1++; sep2 = strchr(sep1, ':'); if (sep2) { locales_menu[idx].value = id; locales_menu[idx].icon = 0; locales_menu[idx].name = BLI_strdupn(sep1, sep2 - sep1); sep2++; sep3 = strchr(sep2, ':'); if (sep3) { locales_menu[idx].identifier = loc = BLI_strdupn(sep2, sep3 - sep2); } else { locales_menu[idx].identifier = loc = BLI_strdup(sep2); } if (id == 0) { /* The DEFAULT item... */ if (BLI_strnlen(loc, 2)) { locales[id] = locales_menu[idx].description = BLI_strdup(""); } /* Menu "label", not to be stored in locales! */ else { locales_menu[idx].description = BLI_strdup(""); } } else { locales[id] = locales_menu[idx].description = BLI_strdup(loc); } idx++; } } line = line->next; } } /* Add closing item to menu! */ locales_menu[idx].identifier = NULL; locales_menu[idx].value = locales_menu[idx].icon = 0; locales_menu[idx].name = locales_menu[idx].description = ""; BLI_file_free_lines(lines); }
int sd_tournament_load(sd_tournament_file *trn, const char *filename) { int ret = SD_FILE_PARSE_ERROR; if(trn == NULL || filename == NULL) { return SD_INVALID_INPUT; } sd_reader *r = sd_reader_open(filename); if(!r) { return SD_FILE_OPEN_ERROR; } // Make sure that the file looks at least relatively okay // TODO: Add other checks. if(sd_reader_filesize(r) < 1582) { goto error_0; } // Read enemy count and make sure it seems somwhat correct int32_t enemy_count = sd_read_dword(r); if(enemy_count >= MAX_TRN_ENEMIES || enemy_count <= 0) { goto error_0; } trn->enemy_count = (int16_t)enemy_count; // Read tournament data int victory_text_offset = sd_read_dword(r); sd_read_buf(r, trn->bk_name, 14); trn->winnings_multiplier = sd_read_float(r); trn->unknown_a = sd_read_dword(r); trn->registration_fee = sd_read_dword(r); trn->assumed_initial_value = sd_read_dword(r); trn->tournament_id = sd_read_dword(r); // Read enemy block offsets sd_reader_set(r, 300); int offset_list[MAX_TRN_ENEMIES + 2]; // Should be large enough memset(offset_list, 0, sizeof(offset_list)); for(int i = 0; i < trn->enemy_count + 1; i++) { offset_list[i] = sd_read_dword(r); } // Read enemy data for(int i = 0; i < trn->enemy_count; i++) { trn->enemies[i] = malloc(sizeof(sd_pilot)); // Find data length sd_reader_set(r, offset_list[i]); // Read enemy pilot information sd_pilot_create(trn->enemies[i]); sd_pilot_load(r, trn->enemies[i]); // Check for errors if(!sd_reader_ok(r)) { goto error_1; } } // Seek sprite start offset sd_reader_set(r, offset_list[trn->enemy_count]); // Allocate locales for(int i = 0; i < MAX_TRN_LOCALES; i++) { trn->locales[i] = malloc(sizeof(sd_tournament_locale)); trn->locales[i]->logo = NULL; trn->locales[i]->description = NULL; trn->locales[i]->title = NULL; for(int har = 0; har < 11; har++) { for(int page = 0; page < 10; page++) { trn->locales[i]->end_texts[har][page] = NULL; } } } // Load logos to locales for(int i = 0; i < MAX_TRN_LOCALES; i++) { trn->locales[i]->logo = malloc(sizeof(sd_sprite)); sd_sprite_create(trn->locales[i]->logo); if((ret = sd_sprite_load(r, trn->locales[i]->logo)) != SD_SUCCESS) { goto error_2; } } // Read palette. Only 40 colors are defined, starting // from palette position 128. Remember to convert VGA pal. memset((void*)&trn->pal, 0, sizeof(sd_palette)); sd_palette_load_range(r, &trn->pal, 128, 40); // Read pic filename trn->pic_file = sd_read_variable_str(r); // Read tournament descriptions for(int i = 0; i < MAX_TRN_LOCALES; i++) { trn->locales[i]->title = sd_read_variable_str(r); trn->locales[i]->description = sd_read_variable_str(r); } // Make sure we are in correct position if(sd_reader_pos(r) != victory_text_offset) { goto error_2; } // Load texts for(int i = 0; i < MAX_TRN_LOCALES; i++) { for(int har = 0; har < 11; har++) { for(int page = 0; page < 10; page++) { trn->locales[i]->end_texts[har][page] = sd_read_variable_str(r); } } } // Close & return sd_reader_close(r); return SD_SUCCESS; error_2: free_locales(trn); error_1: free_enemies(trn); error_0: sd_reader_close(r); return ret; }