📄 anongame_infos.c
字号:
{"gametype_2v2_short", gametype_2v2_short}, {"gametype_2v2_long", gametype_2v2_long}, {"gametype_3v3_short", gametype_3v3_short}, {"gametype_3v3_long", gametype_3v3_long}, {"gametype_4v4_short", gametype_4v4_short}, {"gametype_4v4_long", gametype_4v4_long}, {"gametype_sffa_short", gametype_sffa_short}, {"gametype_sffa_long", gametype_sffa_long}, {"gametype_tffa_short", gametype_tffa_short}, {"gametype_tffa_long", gametype_tffa_long}, {"gametype_2v2v2_short", gametype_2v2v2_short}, {"gametype_2v2v2_long", gametype_2v2v2_long}, {"gametype_3v3v3_short", gametype_3v3v3_short}, {"gametype_3v3v3_long", gametype_3v3v3_long}, {"gametype_4v4v4_short", gametype_4v4v4_short}, {"gametype_4v4v4_long", gametype_4v4v4_long}, {"gametype_2v2v2v2_short", gametype_2v2v2v2_short}, {"gametype_2v2v2v2_long", gametype_2v2v2v2_long}, {"gametype_3v3v3v3_short", gametype_3v3v3v3_short}, {"gametype_3v3v3v3_long", gametype_3v3v3v3_long}, {"gametype_5v5_short", gametype_5v5_short}, {"gametype_5v5_long", gametype_5v5_long}, {"gametype_6v6_short", gametype_6v6_short}, {"gametype_6v6_long", gametype_6v6_long}, {NULL, -1}};static const t_anongame_infos_THUMBSDOWN_table_row THUMBSDOWN_handler_table[] = { {"PG_1v1", PG_1v1}, {"PG_2v2", PG_2v2}, {"PG_3v3", PG_3v3}, {"PG_4v4", PG_4v4}, {"PG_ffa", PG_ffa}, {"AT_2v2", AT_2v2}, {"AT_3v3", AT_3v3}, {"AT_4v4", AT_4v4}, {"AT_ffa", AT_ffa}, {"PG_5v5", PG_5v5}, {"PG_6v6", PG_6v6}, {"PG_2v2v2", PG_2v2v2}, {"PG_3v3v3", PG_3v3v3}, {"PG_4v4v4", PG_4v4v4}, {"PG_2v2v2v2", PG_2v2v2v2}, {"PG_3v3v3v3", PG_3v3v3v3}, {"AT_2v2v2", AT_2v2v2}, {NULL, -1}};static const t_anongame_infos_ICON_REQ_WAR3_table_row ICON_REQ_WAR3_handler_table[] = { {"Level1", ICON_REQ_WAR3_Level1}, {"Level2", ICON_REQ_WAR3_Level2}, {"Level3", ICON_REQ_WAR3_Level3}, {"Level4", ICON_REQ_WAR3_Level4}, {NULL, -1}};static const t_anongame_infos_ICON_REQ_W3XP_table_row ICON_REQ_W3XP_handler_table[] = { {"Level1", ICON_REQ_W3XP_Level1}, {"Level2", ICON_REQ_W3XP_Level2}, {"Level3", ICON_REQ_W3XP_Level3}, {"Level4", ICON_REQ_W3XP_Level4}, {"Level5", ICON_REQ_W3XP_Level5}, {NULL, -1}};static const t_anongame_infos_ICON_REQ_TOURNEY_table_row ICON_REQ_TOURNEY_handler_table[] = { {"Level1", ICON_REQ_TRNY_Level1}, {"Level2", ICON_REQ_TRNY_Level2}, {"Level3", ICON_REQ_TRNY_Level3}, {"Level4", ICON_REQ_TRNY_Level4}, {"Level5", ICON_REQ_TRNY_Level5}, {NULL, -1}};typedef enum { parse_UNKNOWN, parse_URL, parse_DESC, parse_THUMBSDOWN, parse_ICON_REQ_WAR3, parse_ICON_REQ_W3XP, parse_ICON_REQ_TOURNEY} t_parse_mode;typedef enum { changed, unchanged} t_parse_state;static t_parse_mode switch_parse_mode(char *text, char *langID){ if (!(text)) return parse_UNKNOWN; else if (strcmp(text, "[URL]") == 0) return parse_URL; else if (strcmp(text, "[THUMBS_DOWN_LIMIT]") == 0) return parse_THUMBSDOWN; else if (strcmp(text, "[ICON_REQUIRED_RACE_WINS_WAR3]") == 0) return parse_ICON_REQ_WAR3; else if (strcmp(text, "[ICON_REQUIRED_RACE_WINS_W3XP]") == 0) return parse_ICON_REQ_W3XP; else if (strcmp(text, "[ICON_REQUIRED_TOURNEY_WINS]") == 0) return parse_ICON_REQ_TOURNEY; else if (strcmp(text, "[DEFAULT_DESC]") == 0) { langID[0] = '\0'; return parse_DESC; } else if (strlen(text) == 6) { strncpy(langID, &(text[1]), 4); langID[4] = '\0'; return parse_DESC; } else eventlog(eventlog_level_error, __FUNCTION__, "got invalid section name: %s", text); return parse_UNKNOWN;}extern int anongame_infos_load(char const *filename){ unsigned int line; unsigned int pos; char *buff; char *temp; char langID[5]; t_parse_mode parse_mode = parse_UNKNOWN; t_parse_state parse_state = unchanged; t_anongame_infos_DESC *anongame_infos_DESC = NULL; char *pointer; char *variable; char *value = NULL; t_anongame_infos_DESC_table_row const *DESC_table_row; t_anongame_infos_URL_table_row const *URL_table_row; t_anongame_infos_THUMBSDOWN_table_row const *THUMBSDOWN_table_row; t_anongame_infos_ICON_REQ_WAR3_table_row const *ICON_REQ_WAR3_table_row; t_anongame_infos_ICON_REQ_W3XP_table_row const *ICON_REQ_W3XP_table_row; t_anongame_infos_ICON_REQ_TOURNEY_table_row const *ICON_REQ_TOURNEY_table_row; int int_value; char char_value; langID[0] = '\0'; if (!filename) { eventlog(eventlog_level_error, __FUNCTION__, "got NULL filename"); return -1; } if (!(anongame_infos = anongame_infos_init())) { eventlog(eventlog_level_error, __FUNCTION__, "could not init anongame_infos"); return -1; } if (!(fp = fopen(filename, "r"))) { eventlog(eventlog_level_error, "anongameinfo_load", "could not open file \"%s\" for reading (fopen: %s), using default values", filename, pstrerror(errno)); goto anongame_infos_loading_failure; } for (line = 1; (buff = file_get_line(fp)); line++) { for (pos = 0; buff[pos] == '\t' || buff[pos] == ' '; pos++); if (buff[pos] == '\0' || buff[pos] == '#') { continue; } if ((temp = strrchr(buff, '#'))) { unsigned int len; unsigned int endpos; *temp = '\0'; len = strlen(buff) + 1; for (endpos = len - 1; buff[endpos] == '\t' || buff[endpos] == ' '; endpos--); buff[endpos + 1] = '\0'; } if ((buff[0] == '[') && (buff[strlen(buff) - 1] == ']')) { if ((parse_state == unchanged) && (anongame_infos_DESC != NULL)) { if (langID[0] != '\0') list_append_data(anongame_infos->anongame_infos_DESC_list, anongame_infos_DESC); else { if (anongame_infos->anongame_infos_DESC == NULL) anongame_infos->anongame_infos_DESC = anongame_infos_DESC; else { eventlog(eventlog_level_error, __FUNCTION__, "found another default_DESC block, deleting previous"); anongame_infos_DESC_destroy(anongame_infos->anongame_infos_DESC); anongame_infos->anongame_infos_DESC = anongame_infos_DESC; } } anongame_infos_DESC = NULL; } parse_mode = switch_parse_mode(buff, langID); parse_state = changed; } else if (buff[0] != '\0') switch (parse_mode) { case parse_UNKNOWN: { if ((buff[0] != '[') || (buff[strlen(buff) - 1] != ']')) { eventlog(eventlog_level_error, __FUNCTION__, "expected [] section start, but found %s on line %u", buff, line); } else { parse_mode = switch_parse_mode(buff, langID); parse_state = changed; } break; } case parse_URL: { parse_state = unchanged; variable = buff; pointer = strchr(variable, '='); for (pointer--; pointer[0] == ' '; pointer--); pointer[1] = '\0'; pointer++; pointer++; pointer = strchr(pointer, '\"'); pointer++; value = pointer; pointer = strchr(pointer, '\"'); pointer[0] = '\0'; for (URL_table_row = URL_handler_table; URL_table_row->anongame_infos_URL_string != NULL; URL_table_row++) if (strcmp(URL_table_row->anongame_infos_URL_string, variable) == 0) { if (URL_table_row->member != -1) anongame_infos_URL_set_URL(URL_table_row->member, value); } break; } case parse_DESC: { if (parse_state == changed) { anongame_infos_DESC = anongame_infos_DESC_init(); parse_state = unchanged; eventlog(eventlog_level_info, __FUNCTION__, "got langID: [%s]", langID); if (langID[0] != '\0') anongame_infos_DESC->langID = xstrdup(langID); } variable = buff; pointer = strchr(variable, '='); for (pointer--; pointer[0] == ' '; pointer--); pointer[1] = '\0'; pointer++; pointer++; pointer = strchr(pointer, '\"'); pointer++; value = pointer; pointer = strchr(pointer, '\"'); pointer[0] = '\0'; for (DESC_table_row = DESC_handler_table; DESC_table_row->anongame_infos_DESC_string != NULL; DESC_table_row++) if (strcmp(DESC_table_row->anongame_infos_DESC_string, variable) == 0) { if (DESC_table_row->member != -1) anongame_infos_DESC_set_DESC(anongame_infos_DESC, DESC_table_row->member, value); } break; } case parse_THUMBSDOWN: { parse_state = unchanged; variable = buff; pointer = strchr(variable, '='); for (pointer--; pointer[0] == ' '; pointer--); pointer[1] = '\0'; pointer++; pointer++; pointer = strchr(pointer, '='); pointer++; int_value = atoi(pointer); if (int_value < 0) int_value = 0; if (int_value > 127) int_value = 127; char_value = (char) int_value; for (THUMBSDOWN_table_row = THUMBSDOWN_handler_table; THUMBSDOWN_table_row->anongame_infos_THUMBSDOWN_string != NULL; THUMBSDOWN_table_row++) if (strcmp(THUMBSDOWN_table_row->anongame_infos_THUMBSDOWN_string, variable) == 0) { if (THUMBSDOWN_table_row->member != -1) anongame_infos_THUMBSDOWN_set_THUMBSDOWN(anongame_infos->anongame_infos_THUMBSDOWN, THUMBSDOWN_table_row->member,char_value); } break; } case parse_ICON_REQ_WAR3: { parse_state = unchanged; variable = buff; pointer = strchr(variable, '='); for (pointer--; pointer[0] == ' '; pointer--); pointer[1] = '\0'; pointer++; pointer++; pointer = strchr(pointer, '='); pointer++; int_value = atoi(pointer); if (int_value < 0) int_value = 0; for (ICON_REQ_WAR3_table_row = ICON_REQ_WAR3_handler_table; ICON_REQ_WAR3_table_row->anongame_infos_ICON_REQ_WAR3_string != NULL; ICON_REQ_WAR3_table_row++) if (strcmp(ICON_REQ_WAR3_table_row->anongame_infos_ICON_REQ_WAR3_string, variable) == 0) { if (ICON_REQ_WAR3_table_row->member != -1) anongame_infos_ICON_REQ_set_REQ(anongame_infos,ICON_REQ_WAR3_table_row->member,int_value); } break; } case parse_ICON_REQ_W3XP: { parse_state = unchanged; variable = buff; pointer = strchr(variable, '='); for (pointer--; pointer[0] == ' '; pointer--); pointer[1] = '\0'; pointer++; pointer++; pointer = strchr(pointer, '='); pointer++; int_value = atoi(pointer); if (int_value < 0) int_value = 0; for (ICON_REQ_W3XP_table_row = ICON_REQ_W3XP_handler_table; ICON_REQ_W3XP_table_row->anongame_infos_ICON_REQ_W3XP_string != NULL; ICON_REQ_W3XP_table_row++) if (strcmp(ICON_REQ_W3XP_table_row->anongame_infos_ICON_REQ_W3XP_string, variable) == 0) { if (ICON_REQ_W3XP_table_row->member != -1) anongame_infos_ICON_REQ_set_REQ(anongame_infos,ICON_REQ_W3XP_table_row->member,int_value); } break; } case parse_ICON_REQ_TOURNEY: { parse_state = unchanged; variable = buff; pointer = strchr(variable, '='); for (pointer--; pointer[0] == ' '; pointer--); pointer[1] = '\0'; pointer++; pointer++; pointer = strchr(pointer, '='); pointer++; int_value = atoi(pointer); if (int_value < 0) int_value = 0; for (ICON_REQ_TOURNEY_table_row = ICON_REQ_TOURNEY_handler_table; ICON_REQ_TOURNEY_table_row->anongame_infos_ICON_REQ_TOURNEY_string != NULL; ICON_REQ_TOURNEY_table_row++) if (strcmp(ICON_REQ_TOURNEY_table_row->anongame_infos_ICON_REQ_TOURNEY_string, variable) == 0) { if (ICON_REQ_TOURNEY_table_row->member != -1) anongame_infos_ICON_REQ_set_REQ(anongame_infos,ICON_REQ_TOURNEY_table_row->member,int_value); } break; } } } if (anongame_infos_DESC) { if (langID[0] != '\0') { list_append_data(anongame_infos->anongame_infos_DESC_list, anongame_infos_DESC); } else { if (anongame_infos->anongame_infos_DESC == NULL) anongame_infos->anongame_infos_DESC = anongame_infos_DESC; else { eventlog(eventlog_level_error, __FUNCTION__, "found another default_DESC block, deleting previous"); anongame_infos_DESC_destroy(anongame_infos->anongame_infos_DESC); anongame_infos->anongame_infos_DESC = anongame_infos_DESC; } } } file_get_line(NULL); // clear file_get_line buffer
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -