OSDN Git Service

[Implement] #37285 Expanded buffer size of monsters' name
authorHourier <hourier@users.sourceforge.jp>
Tue, 22 Sep 2020 10:25:48 +0000 (19:25 +0900)
committeriks <iks@users.sorceforge.jp>
Sun, 22 Nov 2020 08:46:54 +0000 (17:46 +0900)
src/info-reader/info-reader-util.h
src/info-reader/parse-error-types.h
src/info-reader/race-reader.c
src/main/info-initializer.c

index 47cb25a..8e3408a 100644 (file)
@@ -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 /*!< ゲーム情報の種別毎に用意されるタグ用バッファの容量 */
 
index 7ff0757..3f899cf 100644 (file)
@@ -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,
index b7a4b69..78a87ce 100644 (file)
@@ -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"
 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;
 }
index e64ea0e..d4212dd 100644 (file)
@@ -29,7 +29,7 @@
 #include "world/world.h"
 #include <sys/stat.h>
 #ifndef WINDOWS
-#include <sys/types.h> // Windows �ł͎g�����Ă��Ȃ�.
+#include <sys/types.h>
 #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] : _("未知の", "unknown"));
+        concptr oops = (((err > 0) && (err < PARSE_ERROR_MAX)) ? err_str[err] : _("未知の", "unknown"));
 #ifdef JP
         msg_format("'%s.txt'ファイルの %d 行目にエラー。", filename, error_line);
 #else