| 92 | } |
| 93 | |
| 94 | int CScriptVarsTable::load(IReader& memory_stream) |
| 95 | { |
| 96 | clear(); |
| 97 | u32 var_count = memory_stream.r_u32(); |
| 98 | is_array = true; |
| 99 | int loaded = 0; |
| 100 | // while (var_count-- > 0 && ) |
| 101 | for (u32 n_var = 0; n_var < var_count && memory_stream.elapsed() >= 4; n_var++) |
| 102 | { |
| 103 | loaded++; |
| 104 | u32 pos = memory_stream.tell(); |
| 105 | if (-1 == memory_stream.r_s32()) |
| 106 | { |
| 107 | Msg("!#ERROR: script vars table %s loaded vars %d from %d, and found EOT flag ", name(), n_var, var_count); |
| 108 | // return; |
| 109 | } |
| 110 | else |
| 111 | memory_stream.seek(pos); |
| 112 | |
| 113 | shared_str var_name; |
| 114 | SCRIPT_VAR sv; |
| 115 | memory_stream.r_stringZ(var_name); |
| 116 | sv.type = (int)memory_stream.r_u32(); |
| 117 | sv.size = memory_stream.r_u32(); |
| 118 | // MsgV ("3SCRIPT_VARS", "#DBG: CScriptVarsTable::load n_var = %3d type = 0x%08x size = %5d name = %s.%s ", n_var, sv.type, sv.size, name(), *var_name); |
| 119 | if (LUA_TTABLE == sv.eff_type()) |
| 120 | { |
| 121 | memory_stream.seek(memory_stream.tell() - 4); |
| 122 | sv.T = xr_new<CScriptVarsTable>(); |
| 123 | sv.T->add_ref(); |
| 124 | sv.T->is_array = (sv.type & SVT_ARRAY_TABLE) > 0; |
| 125 | sv.T->zero_key = (sv.type & SVT_ARRAY_ZEROK) > 0; |
| 126 | sv.T->m_name.sprintf("%s.%s", name(), *var_name); |
| 127 | loaded += sv.T->load(memory_stream); |
| 128 | m_map[var_name] = sv; |
| 129 | continue; |
| 130 | } |
| 131 | |
| 132 | if (LUA_TNETPACKET == sv.eff_type()) |
| 133 | { |
| 134 | sv.P = xr_new<NET_Packet>(); |
| 135 | sv.P->B.count = sv.size; |
| 136 | sv.P->r_seek(memory_stream.r_u32()); |
| 137 | memory_stream.r(sv.P->B.data, sv.size); |
| 138 | m_map[var_name] = sv; |
| 139 | continue; |
| 140 | } |
| 141 | |
| 142 | { // default var type |
| 143 | if (sv.size > sizeof(sv.s_value)) |
| 144 | { |
| 145 | sv.data = xr_malloc(sv.size); |
| 146 | memory_stream.r(sv.data, sv.size); |
| 147 | |
| 148 | if (LUA_TSTRING == sv.eff_type() && -1 == *(int*)sv.data) // явный выход за пределы чтения |
| 149 | Msg("!#WARN: probably string load failed = %s ", (LPCSTR)sv.data); |
| 150 | } |
| 151 | else |
no test coverage detected