View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0003126 | FSSCP | tables | public | 2014-10-18 22:38 | 2014-10-24 20:20 |
Reporter | Axem | Assigned To | MageKing17 | ||
Priority | normal | Severity | minor | Reproducibility | always |
Status | resolved | Resolution | fixed | ||
Target Version | 3.7.2 | ||||
Summary | 0003126: FreeSpace can't load more than 32 of a modular table type | ||||
Description | I had a modular scripting table that suddenly stopped working without any warning. On looking in the debug log, the table wasn't being loaded, despite being in the root data/tables. Counting the number of loaded tables, there was 32 entries. I added one more modular scripting table to the bunch and re-ran debug. There were still 32 entries! I brought it up in #scp and Mageking seems to have found the limitation and has a patch to fix it. The test build does appear to fix the problem. | ||||
Tags | No tags attached. | ||||
|
tbm_fix.patch (3,393 bytes)
Index: code/fred2/textviewdlg.cpp =================================================================== --- code/fred2/textviewdlg.cpp (revision 11150) +++ code/fred2/textviewdlg.cpp (working copy) @@ -52,8 +52,7 @@ { char line[256], line2[256], file_text[82]; int i, j, n, found = 0, comment = 0, num_files = 0; - char tbl_file_arr[MAX_TBL_PARTS][MAX_FILENAME_LEN]; - char *tbl_file_names[MAX_TBL_PARTS]; + SCP_vector<SCP_string> tbl_file_names; CFILE *fp; if (ship_class < 0) @@ -112,12 +111,12 @@ // done with ships.tbl, so now check all modular ship tables... - num_files = cf_get_file_list_preallocated(MAX_TBL_PARTS, tbl_file_arr, tbl_file_names, CF_TYPE_TABLES, NOX("*-shp.tbm"), CF_SORT_REVERSE); + num_files = cf_get_file_list(tbl_file_names, CF_TYPE_TABLES, NOX("*-shp.tbm"), CF_SORT_REVERSE); for (n = 0; n < num_files; n++){ - strcat(tbl_file_names[n], ".tbm"); + tbl_file_names[n] += ".tbm"; - fp = cfopen(tbl_file_names[n], "r"); + fp = cfopen(tbl_file_names[n].c_str(), "r"); Assert(fp); memset( line, 0, sizeof(line) ); @@ -160,7 +159,7 @@ if (!stricmp(line2 + i, Ship_info[ship_class].name)) { memset( file_text, 0, sizeof(file_text) ); - snprintf(file_text, sizeof(file_text)-1, "-- %s -------------------------------\r\n", tbl_file_names[n]); + snprintf(file_text, sizeof(file_text)-1, "-- %s -------------------------------\r\n", tbl_file_names[n].c_str()); m_edit += file_text; found = 1; } Index: code/parse/parselo.cpp =================================================================== --- code/parse/parselo.cpp (revision 11150) +++ code/parse/parselo.cpp (working copy) @@ -4369,23 +4369,22 @@ // parse a modular table of type "name_check" and parse it using the specified function callback int parse_modular_table(const char *name_check, void (*parse_callback)(const char *filename), int path_type, int sort_type) { - char tbl_file_arr[MAX_TBL_PARTS][MAX_FILENAME_LEN]; - char *tbl_file_names[MAX_TBL_PARTS]; + SCP_vector<SCP_string> tbl_file_names; int i, num_files = 0; if ( (name_check == NULL) || (parse_callback == NULL) || ((*name_check) != '*') ) { - Int3(); + Assertion(false, "parse_modular_table() called with invalid arguments; get a coder!\n"); return 0; } - num_files = cf_get_file_list_preallocated(MAX_TBL_PARTS, tbl_file_arr, tbl_file_names, path_type, name_check, sort_type); + num_files = cf_get_file_list(tbl_file_names, path_type, name_check, sort_type); Parsing_modular_table = true; for (i = 0; i < num_files; i++){ - strcat(tbl_file_names[i], ".tbm"); - mprintf(("TBM => Starting parse of '%s' ...\n", tbl_file_names[i])); - (*parse_callback)(tbl_file_names[i]); + tbl_file_names[i] += ".tbm"; + mprintf(("TBM => Starting parse of '%s' ...\n", tbl_file_names[i].c_str())); + (*parse_callback)(tbl_file_names[i].c_str()); } Parsing_modular_table = false; Index: code/parse/parselo.h =================================================================== --- code/parse/parselo.h (revision 11150) +++ code/parse/parselo.h (working copy) @@ -49,10 +49,6 @@ #define PARSE_BUF_SIZE 4096 -//For modular TBL files -C -#define MAX_TBL_PARTS 32 - - #define SHIP_TYPE 0 // used to identify which kind of array to do a search for a name in #define SHIP_INFO_TYPE 1 #define WEAPON_LIST_TYPE 2 // to parse an int_list of weapons |
|
Basically, we had a hardcoded limitation for no immediately apparent reason. There was existing code to do the same thing with a vector, so I tried it, and apparently it worked. Patch attached. |
|
looks good to me; I'll commit... soon (tm) |
|
Fix committed to trunk@11156. |
fs2open: trunk r11156 2014-10-24 17:01 Ported: N/A Details Diff |
Fix mantis 0003126 (from MageKing17) Remove limit of 32 tbms being loaded for any given table type |
Affected Issues 0003126 |
|
mod - /trunk/fs2_open/code/fred2/textviewdlg.cpp | Diff File | ||
mod - /trunk/fs2_open/code/parse/parselo.cpp | Diff File | ||
mod - /trunk/fs2_open/code/parse/parselo.h | Diff File |
Date Modified | Username | Field | Change |
---|---|---|---|
2014-10-18 22:38 | Axem | New Issue | |
2014-10-18 22:39 | MageKing17 | File Added: tbm_fix.patch | |
2014-10-18 22:39 | MageKing17 | Note Added: 0016342 | |
2014-10-18 22:39 | MageKing17 | Assigned To | => MageKing17 |
2014-10-18 22:39 | MageKing17 | Status | new => code review |
2014-10-23 02:53 | MageKing17 | Target Version | => 3.7.2 |
2014-10-24 07:03 | niffiwan | Note Added: 0016347 | |
2014-10-24 20:20 | niffiwan | Changeset attached | => fs2open trunk r11156 |
2014-10-24 20:20 | niffiwan | Note Added: 0016349 | |
2014-10-24 20:20 | niffiwan | Status | code review => resolved |
2014-10-24 20:20 | niffiwan | Resolution | open => fixed |