struct theme_color_system *theme_color_system_read(struct section_file *file) { int i; struct theme_color_system *colors = fc_malloc(sizeof(*colors)); fc_assert_ret_val(ARRAY_SIZE(color_names) == (THEME_COLOR_LAST - COLOR_LAST), NULL); for (i = 0; i < (THEME_COLOR_LAST - COLOR_LAST); i++) { colors->colors[i].r = secfile_lookup_int_default(file, 0, "colors.%s0.r", color_names[i]); colors->colors[i].g = secfile_lookup_int_default(file, 0, "colors.%s0.g", color_names[i]); colors->colors[i].b = secfile_lookup_int_default(file, 0, "colors.%s0.b", color_names[i]); colors->colors[i].a = secfile_lookup_int_default(file, 0, "colors.%s0.a", color_names[i]); colors->colors[i].color = NULL; } return colors; }
/************************************************************************** The server sends a stream in a registry 'ini' type format. Read it using secfile functions and fill the server_list structs. **************************************************************************/ static struct server_list *parse_metaserver_data(fz_FILE *f) { struct server_list *server_list; struct section_file the_file, *file = &the_file; int nservers, i, j; /* This call closes f. */ if (!section_file_load_from_stream(file, f)) { return NULL; } server_list = server_list_new(); nservers = secfile_lookup_int_default(file, 0, "main.nservers"); for (i = 0; i < nservers; i++) { char *host, *port, *version, *state, *message, *nplayers; int n; struct server *pserver = (struct server*)fc_malloc(sizeof(struct server)); host = secfile_lookup_str_default(file, "", "server%d.host", i); pserver->host = mystrdup(host); port = secfile_lookup_str_default(file, "", "server%d.port", i); pserver->port = atoi(port); version = secfile_lookup_str_default(file, "", "server%d.version", i); pserver->version = mystrdup(version); state = secfile_lookup_str_default(file, "", "server%d.state", i); pserver->state = mystrdup(state); message = secfile_lookup_str_default(file, "", "server%d.message", i); pserver->message = mystrdup(message); nplayers = secfile_lookup_str_default(file, "0", "server%d.nplayers", i); n = atoi(nplayers); pserver->nplayers = n; if (n > 0) { pserver->players = fc_malloc(n * sizeof(*pserver->players)); } else { pserver->players = NULL; } for (j = 0; j < n; j++) { char *name, *nation, *type, *host; name = secfile_lookup_str_default(file, "", "server%d.player%d.name", i, j); pserver->players[j].name = mystrdup(name); type = secfile_lookup_str_default(file, "", "server%d.player%d.type", i, j); pserver->players[j].type = mystrdup(type); host = secfile_lookup_str_default(file, "", "server%d.player%d.host", i, j); pserver->players[j].host = mystrdup(host); nation = secfile_lookup_str_default(file, "", "server%d.player%d.nation", i, j); pserver->players[j].nation = mystrdup(nation); } server_list_append(server_list, pserver); } section_file_free(file); return server_list; }
/********************************************************************** Finds and reads the toplevel themespec file based on given name. Sets global variables, including tile sizes and full names for intro files. ***********************************************************************/ struct theme *theme_read_toplevel(const char *theme_name) { struct section_file *file; char *fname; int i; size_t num_spec_files; const char **spec_filenames; const char *file_capstr; bool duplicates_ok; struct theme *t = theme_new(); const char *langname; const char *filename, *c; fname = themespec_fullname(theme_name); if (!fname) { log_error("Can't find theme \"%s\".", theme_name); theme_free(t); return NULL; } log_verbose("themespec file is \"%s\".", fname); if (!(file = secfile_load(fname, TRUE))) { log_error("Could not open '%s':\n%s", fname, secfile_error()); FC_FREE(fname); theme_free(t); return NULL; } if (!check_themespec_capabilities(file, "themespec", THEMESPEC_CAPSTR, fname)) { secfile_destroy(file); FC_FREE(fname); theme_free(t); return NULL; } file_capstr = secfile_lookup_str(file, "themespec.options"); duplicates_ok = has_capabilities("+duplicates_ok", file_capstr); (void) secfile_entry_by_path(file, "themespec.name"); /* currently unused */ sz_strlcpy(t->name, theme_name); t->priority = secfile_lookup_int_default(file, 0, "themespec.priority"); langname = get_langname(); if (langname) { if (strstr(langname, "zh_CN") != NULL) { c = secfile_lookup_str(file, "themespec.font_file_zh_CN"); } else if (strstr(langname, "ja") != NULL) { c = secfile_lookup_str(file, "themespec.font_file_ja"); } else if (strstr(langname, "ko") != NULL) { c = secfile_lookup_str(file, "themespec.font_file_ko"); } else { c = secfile_lookup_str(file, "themespec.font_file"); } } else { c = secfile_lookup_str(file, "themespec.font_file"); } if ((filename = fileinfoname(get_data_dirs(), c))) { t->font_filename = fc_strdup(filename); } else { log_fatal("Could not open font: %s", c); secfile_destroy(file); FC_FREE(fname); theme_free(t); return NULL; } log_debug("theme font file %s", t->font_filename); t->default_font_size = secfile_lookup_int_default(file, 10, "themespec.default_font_size"); log_debug("theme default font size %d", t->default_font_size); spec_filenames = secfile_lookup_str_vec(file, &num_spec_files, "themespec.files"); if (NULL == spec_filenames || 0 == num_spec_files) { log_error("No theme graphics files specified in \"%s\"", fname); secfile_destroy(file); FC_FREE(fname); theme_free(t); return NULL; } fc_assert(t->sprite_hash == NULL); t->sprite_hash = small_sprite_hash_new(); for (i = 0; i < num_spec_files; i++) { struct specfile *sf = fc_malloc(sizeof(*sf)); log_debug("spec file %s", spec_filenames[i]); sf->big_sprite = NULL; filename = fileinfoname(get_data_dirs(), spec_filenames[i]); if (!filename) { log_error("Can't find spec file \"%s\".", spec_filenames[i]); secfile_destroy(file); FC_FREE(fname); theme_free(t); return NULL; } sf->file_name = fc_strdup(filename); scan_specfile(t, sf, duplicates_ok); specfile_list_prepend(t->specfiles, sf); } FC_FREE(spec_filenames); t->background_system = theme_background_system_read(file); t->color_system = theme_color_system_read(file); secfile_check_unused(file); secfile_destroy(file); log_verbose("finished reading \"%s\".", fname); FC_FREE(fname); return t; }