From f176a0caea3a7f1fa96258a1e0ac3058a55e1373 Mon Sep 17 00:00:00 2001 From: Hourier Date: Tue, 22 Sep 2020 19:25:48 +0900 Subject: [PATCH] [Implement] #37285 Expanded buffer size of monsters' name --- src/info-reader/info-reader-util.h | 2 +- src/info-reader/parse-error-types.h | 6 +-- src/info-reader/race-reader.c | 101 +++++++++++++++++------------------- src/main/info-initializer.c | 5 +- 4 files changed, 53 insertions(+), 61 deletions(-) diff --git a/src/info-reader/info-reader-util.h b/src/info-reader/info-reader-util.h index 47cb25ab6..8e3408a24 100644 --- a/src/info-reader/info-reader-util.h +++ b/src/info-reader/info-reader-util.h @@ -5,7 +5,7 @@ /* * Size of memory reserved for initialization of some arrays */ -#define FAKE_NAME_SIZE 40 * 1024L /*!< ゲーム情報の種別毎に用意される名前用バッファの容量 */ +#define FAKE_NAME_SIZE 100 * 1024L /*!< ゲーム情報の種別毎に用意される名前用バッファの容量 */ #define FAKE_TEXT_SIZE 150 * 1024L /*!< ゲーム情報の種別毎に用意されるテキスト用バッファの容量 */ #define FAKE_TAG_SIZE 10 * 1024L /*!< ゲーム情報の種別毎に用意されるタグ用バッファの容量 */ diff --git a/src/info-reader/parse-error-types.h b/src/info-reader/parse-error-types.h index 7ff0757d8..3f899cf57 100644 --- a/src/info-reader/parse-error-types.h +++ b/src/info-reader/parse-error-types.h @@ -1,11 +1,11 @@ #pragma once -/* - * @details 2 - 4は使われなくなったので欠番 - */ typedef enum parse_error_type { PARSE_ERROR_NONE = 0, PARSE_ERROR_GENERIC = 1, + PARSE_ERROR_ABSOLETE_FILE = 2, + PARSE_ERROR_MISSING_RECORD_HEADER = 3, + PARSE_ERROR_NON_SEQUENTIAL_RECORDS = 4, PARSE_ERROR_INVALID_FLAG = 5, PARSE_ERROR_UNDEFINED_DIRECTIVE = 6, PARSE_ERROR_OUT_OF_MEMORY = 7, diff --git a/src/info-reader/race-reader.c b/src/info-reader/race-reader.c index b7a4b69b1..78a87ce36 100644 --- a/src/info-reader/race-reader.c +++ b/src/info-reader/race-reader.c @@ -1,4 +1,5 @@ #include "info-reader/race-reader.h" +#include "info-reader/parse-error-types.h" #include "info-reader/race-info-tokens-table.h" #include "main/angband-headers.h" #include "monster-race/monster-race.h" @@ -16,28 +17,28 @@ static errr grab_one_basic_flag(monster_race *r_ptr, concptr what) { if (grab_one_flag(&r_ptr->flags1, r_info_flags1, what) == 0) - return 0; + return PARSE_ERROR_NONE; if (grab_one_flag(&r_ptr->flags2, r_info_flags2, what) == 0) - return 0; + return PARSE_ERROR_NONE; if (grab_one_flag(&r_ptr->flags3, r_info_flags3, what) == 0) - return 0; + return PARSE_ERROR_NONE; if (grab_one_flag(&r_ptr->flags7, r_info_flags7, what) == 0) - return 0; + return PARSE_ERROR_NONE; if (grab_one_flag(&r_ptr->flags8, r_info_flags8, what) == 0) - return 0; + return PARSE_ERROR_NONE; if (grab_one_flag(&r_ptr->flags9, r_info_flags9, what) == 0) - return 0; + return PARSE_ERROR_NONE; if (grab_one_flag(&r_ptr->flagsr, r_info_flagsr, what) == 0) - return 0; + return PARSE_ERROR_NONE; msg_format(_("未知のモンスター・フラグ '%s'。", "Unknown monster flag '%s'."), what); - return 1; + return PARSE_ERROR_GENERIC; } /*! @@ -50,16 +51,16 @@ static errr grab_one_basic_flag(monster_race *r_ptr, concptr what) static errr grab_one_spell_flag(monster_race *r_ptr, concptr what) { if (grab_one_flag(&r_ptr->flags4, r_info_flags4, what) == 0) - return 0; + return PARSE_ERROR_NONE; if (grab_one_flag(&r_ptr->a_ability_flags1, r_a_ability_flags1, what) == 0) - return 0; + return PARSE_ERROR_NONE; if (grab_one_flag(&r_ptr->a_ability_flags2, r_a_ability_flags2, what) == 0) - return 0; + return PARSE_ERROR_NONE; msg_format(_("未知のモンスター・フラグ '%s'。", "Unknown monster flag '%s'."), what); - return 1; + return PARSE_ERROR_GENERIC; } /*! @@ -76,28 +77,29 @@ errr parse_r_info(char *buf, angband_header *head) if (buf[0] == 'N') { s = angband_strchr(buf + 2, ':'); if (!s) - return 1; + return PARSE_ERROR_GENERIC; *s++ = '\0'; #ifdef JP if (!*s) - return 1; + return PARSE_ERROR_GENERIC; #endif int i = atoi(buf + 2); if (i < error_idx) - return 4; + return PARSE_ERROR_NON_SEQUENTIAL_RECORDS; + if (i >= head->info_num) - return 2; + return PARSE_ERROR_ABSOLETE_FILE; error_idx = i; r_ptr = &r_info[i]; #ifdef JP if (!add_name(&r_ptr->name, head, s)) - return 7; + return PARSE_ERROR_OUT_OF_MEMORY; #endif } else if (!r_ptr) { - return 3; + return PARSE_ERROR_MISSING_RECORD_HEADER; } #ifdef JP /* 英語名を読むルーチンを追加 */ @@ -105,49 +107,43 @@ errr parse_r_info(char *buf, angband_header *head) else if (buf[0] == 'E') { s = buf + 2; if (!add_name(&r_ptr->E_name, head, s)) - return 7; + return PARSE_ERROR_OUT_OF_MEMORY; } #else else if (buf[0] == 'E') { s = buf + 2; if (!add_name(&r_ptr->name, head, s)) - return 7; + return PARSE_ERROR_OUT_OF_MEMORY; } #endif else if (buf[0] == 'D') { #ifdef JP if (buf[2] == '$') - return 0; + return PARSE_ERROR_NONE; + s = buf + 2; #else if (buf[2] != '$') - return 0; + return PARSE_ERROR_NONE; s = buf + 3; #endif if (!add_text(&r_ptr->text, head, s, TRUE)) - return 7; + return PARSE_ERROR_OUT_OF_MEMORY; } else if (buf[0] == 'G') { - if (buf[1] != ':') - return 1; - if (!buf[2]) - return 1; - if (buf[3] != ':') - return 1; - if (!buf[4]) - return 1; + if ((buf[1] != ':') || !buf[2] || (buf[3] != ':') || !buf[4]) + return PARSE_ERROR_GENERIC; char sym = buf[2]; byte tmp = color_char_to_attr(buf[4]); if (tmp > 127) - return 1; + return PARSE_ERROR_GENERIC; r_ptr->d_char = sym; r_ptr->d_attr = tmp; } else if (buf[0] == 'I') { int spd, hp1, hp2, aaf, ac, slp; - - if (6 != sscanf(buf + 2, "%d:%dd%d:%d:%d:%d", &spd, &hp1, &hp2, &aaf, &ac, &slp)) - return 1; + if (sscanf(buf + 2, "%d:%dd%d:%d:%d:%d", &spd, &hp1, &hp2, &aaf, &ac, &slp) != 6) + return PARSE_ERROR_GENERIC; r_ptr->speed = (SPEED)spd; r_ptr->hdice = (DICE_NUMBER)MAX(hp1, 1); @@ -160,8 +156,8 @@ errr parse_r_info(char *buf, angband_header *head) long exp; long nextexp; int nextmon; - if (6 != sscanf(buf + 2, "%d:%d:%d:%ld:%ld:%d", &lev, &rar, &pad, &exp, &nextexp, &nextmon)) - return 1; + if (sscanf(buf + 2, "%d:%d:%d:%ld:%ld:%d", &lev, &rar, &pad, &exp, &nextexp, &nextmon) != 6) + return PARSE_ERROR_GENERIC; r_ptr->level = (DEPTH)lev; r_ptr->rarity = (RARITY)rar; @@ -176,11 +172,9 @@ errr parse_r_info(char *buf, angband_header *head) if (r_ptr->reinforce_id[i] == 0) break; - if (i == 6) - return 1; + if ((i == 6) || (sscanf(buf + 2, "%d:%dd%d", &id, &dd, &ds) != 3)) + return PARSE_ERROR_GENERIC; - if (3 != sscanf(buf + 2, "%d:%dd%d", &id, &dd, &ds)) - return 1; r_ptr->reinforce_id[i] = (MONRACE_IDX)id; r_ptr->reinforce_dd[i] = (DICE_NUMBER)dd; r_ptr->reinforce_ds[i] = (DICE_SID)ds; @@ -192,7 +186,7 @@ errr parse_r_info(char *buf, angband_header *head) break; if (i == 4) - return 1; + return PARSE_ERROR_GENERIC; /* loop */ for (s = t = buf + 2; *t && (*t != ':'); t++) @@ -207,7 +201,7 @@ errr parse_r_info(char *buf, angband_header *head) } if (!r_info_blow_method[n1]) - return 1; + return PARSE_ERROR_GENERIC; /* loop */ for (s = t; *t && (*t != ':'); t++) @@ -222,7 +216,7 @@ errr parse_r_info(char *buf, angband_header *head) } if (!r_info_blow_effect[n2]) - return 1; + return PARSE_ERROR_GENERIC; /* loop */ for (s = t; *t && (*t != 'd'); t++) @@ -248,7 +242,7 @@ errr parse_r_info(char *buf, angband_header *head) } if (0 != grab_one_basic_flag(r_ptr, s)) - return 5; + return PARSE_ERROR_INVALID_FLAG; s = t; } @@ -272,8 +266,8 @@ errr parse_r_info(char *buf, angband_header *head) continue; } - if (0 != grab_one_spell_flag(r_ptr, s)) - return 5; + if (grab_one_spell_flag(r_ptr, s) != PARSE_ERROR_NONE) + return PARSE_ERROR_INVALID_FLAG; s = t; } @@ -284,22 +278,21 @@ errr parse_r_info(char *buf, angband_header *head) if (!r_ptr->artifact_id[i]) break; - if (i == 4) - return 1; + if ((i == 4) || (sscanf(buf + 2, "%d:%d:%d", &id, &rarity, &per) != 3)) + return PARSE_ERROR_GENERIC; - if (3 != sscanf(buf + 2, "%d:%d:%d", &id, &rarity, &per)) - return 1; r_ptr->artifact_id[i] = (ARTIFACT_IDX)id; r_ptr->artifact_rarity[i] = (RARITY)rarity; r_ptr->artifact_percent[i] = (PERCENTAGE)per; } else if (buf[0] == 'V') { int val; - if (3 != sscanf(buf + 2, "%d", &val)) + if (sscanf(buf + 2, "%d", &val) != 3) return 1; + r_ptr->arena_ratio = (PERCENTAGE)val; } else { - return 6; + return PARSE_ERROR_UNDEFINED_DIRECTIVE; } - return 0; + return PARSE_ERROR_NONE; } diff --git a/src/main/info-initializer.c b/src/main/info-initializer.c index 71721213a..9e8ef342b 100644 --- a/src/main/info-initializer.c +++ b/src/main/info-initializer.c @@ -29,7 +29,7 @@ #include "world/world.h" #include #ifndef WINDOWS -#include // Windows ‚Å‚ÍŽg‚í‚ê‚Ä‚¢‚È‚¢. +#include #endif /*! @@ -203,8 +203,7 @@ static errr init_info(player_type *player_ptr, concptr filename, angband_header err = init_info_txt(fp, buf, head, head->parse_info_txt); angband_fclose(fp); if (err) { - concptr oops; - oops = (((err > 0) && (err < PARSE_ERROR_MAX)) ? err_str[err] : _("–¢’m‚Ì", "unknown")); + concptr oops = (((err > 0) && (err < PARSE_ERROR_MAX)) ? err_str[err] : _("–¢’m‚Ì", "unknown")); #ifdef JP msg_format("'%s.txt'ƒtƒ@ƒCƒ‹‚Ì %d s–ڂɃGƒ‰[B", filename, error_line); #else -- 2.11.0