| 18 | | #include "hspcmp.as" |
| 19 | | |
| 20 | | #define TYPE_MARK 0 |
| 21 | | #define TYPE_VAR 1 |
| 22 | | #define TYPE_STRING 2 |
| 23 | | #define TYPE_DNUM 3 |
| 24 | | #define TYPE_INUM 4 |
| 25 | | #define TYPE_STRUCT 5 |
| 26 | | #define TYPE_XLABEL 6 |
| 27 | | #define TYPE_LABEL 7 |
| 28 | | #define TYPE_INTCMD 8 |
| 29 | | #define TYPE_EXTCMD 9 |
| 30 | | #define TYPE_EXTSYSVAR 10 |
| 31 | | #define TYPE_CMPCMD 11 |
| 32 | | #define TYPE_MODCMD 12 |
| 33 | | #define TYPE_INTFUNC 13 |
| 34 | | #define TYPE_SYSVAR 14 |
| 35 | | #define TYPE_PROGCMD 15 |
| 36 | | #define TYPE_DLLFUNC 16 |
| 37 | | #define TYPE_DLLCTRL 17 |
| 38 | | #define TYPE_USERDEF 18 |
| 39 | | |
| 40 | | title "Unused Variable Lister" |
| 41 | | path = "" |
| 42 | | input path, 540 |
| 43 | | path_input_objid = stat |
| 44 | | pos 640 - 50 - 50, 0 |
| 45 | | objsize 50 |
| 46 | | button gosub "�Q��..", *open_dialog |
| 47 | | pos 640 - 50, 0 |
| 48 | | button gosub "��s", *start |
| 49 | | result = "" |
| 50 | | pos 0 |
| 51 | | mesbox result, 640, 480 - 24, 0 |
| 52 | | result_mesbox_objid = stat |
| 53 | | sdim hr, 65 |
| 54 | | hr = "-" |
| 55 | | repeat 6 |
| 56 | | hr += hr |
| 57 | | loop |
| 58 | | stop |
| | 23 | #define global TYPE_MARK 0 |
| | 24 | #define global TYPE_VAR 1 |
| | 25 | #define global TYPE_STRING 2 |
| | 26 | #define global TYPE_DNUM 3 |
| | 27 | #define global TYPE_INUM 4 |
| | 28 | #define global TYPE_STRUCT 5 |
| | 29 | #define global TYPE_XLABEL 6 |
| | 30 | #define global TYPE_LABEL 7 |
| | 31 | #define global TYPE_INTCMD 8 |
| | 32 | #define global TYPE_EXTCMD 9 |
| | 33 | #define global TYPE_EXTSYSVAR 10 |
| | 34 | #define global TYPE_CMPCMD 11 |
| | 35 | #define global TYPE_MODCMD 12 |
| | 36 | #define global TYPE_INTFUNC 13 |
| | 37 | #define global TYPE_SYSVAR 14 |
| | 38 | #define global TYPE_PROGCMD 15 |
| | 39 | #define global TYPE_DLLFUNC 16 |
| | 40 | #define global TYPE_DLLCTRL 17 |
| | 41 | #define global TYPE_USERDEF 18 |
| | 42 | |
| | 43 | // �u�p�����[�^�̕ϐ��ɑ����閽�߁v�idim�Ȃǁj������郂�W���[�� |
| | 44 | #module mod_var_cmd t |
| | 45 | #modinit |
| | 46 | dim t |
| | 47 | return |
| | 48 | #modfunc define_var_cmd0 int sub_id, int prm_no |
| | 49 | t.sub_id = prm_no |
| | 50 | return |
| | 51 | #deffunc define_var_cmd int type, int sub_id, int prm_no |
| | 52 | if varuse(table.type) == 0 { |
| | 53 | newmod mvars, mod_var_cmd |
| | 54 | table.type = mvars.mvars_cnt |
| | 55 | mvars_cnt ++ |
| | 56 | } |
| | 57 | define_var_cmd0 table.type, sub_id, prm_no |
| | 58 | return |
| | 59 | #modfunc get_var_cmd_prm_no0 int sub_id |
| | 60 | if sub_id >= length(t) : return 0 |
| | 61 | return t.sub_id |
| | 62 | #defcfunc get_var_cmd_prm_no int type, int sub_id |
| | 63 | if varuse(table.type) == 0 : return 0 |
| | 64 | get_var_cmd_prm_no0 table.type, sub_id |
| | 65 | return stat |
| | 66 | #deffunc init_var_cmd |
| | 67 | #define define define_var_cmd |
| | 68 | dimtype table, 5, 18 |
| | 69 | // �p�����[�^�̕ϐ��ɑ����閽�߈ꗗ |
| | 70 | define TYPE_INTCMD, 0x015, 1 // dirlist |
| | 71 | ; define TYPE_INTCMD, 0x016, 2 // bload |
| | 72 | define TYPE_INTCMD, 0x01a, 1 // poke |
| | 73 | define TYPE_INTCMD, 0x01b, 1 // wpoke |
| | 74 | define TYPE_INTCMD, 0x01c, 1 // lpoke |
| | 75 | define TYPE_INTCMD, 0x01d, 1 // getstr |
| | 76 | ; define TYPE_INTCMD, 0x01f, 1 // memexpand |
| | 77 | ; define TYPE_INTCMD, 0x020, 1 // memcpy |
| | 78 | ; define TYPE_INTCMD, 0x021, 1 // memset |
| | 79 | define TYPE_INTCMD, 0x022, 1 // notesel |
| | 80 | define TYPE_INTCMD, 0x029, 1 // noteget |
| | 81 | define TYPE_EXTCMD, 0x023, 1 // getkey |
| | 82 | define TYPE_EXTCMD, 0x024, 1 // listbox |
| | 83 | define TYPE_EXTCMD, 0x025, 2 // chkbox |
| | 84 | define TYPE_EXTCMD, 0x026, 1 // combox |
| | 85 | define TYPE_EXTCMD, 0x027, 1 // input |
| | 86 | ; define TYPE_EXTCMD, 0x028, 1 // mesbox |
| | 87 | define TYPE_EXTCMD, 0x034, 1 // stick |
| | 88 | define TYPE_PROGCMD, 0x009, 1 // dim |
| | 89 | define TYPE_PROGCMD, 0x00a, 1 // sdim |
| | 90 | define TYPE_PROGCMD, 0x00d, 1 // dimtype |
| | 91 | define TYPE_PROGCMD, 0x00e, 1 // dup |
| | 92 | define TYPE_PROGCMD, 0x00f, 1 // dupptr |
| | 93 | define TYPE_PROGCMD, 0x012, 1 // newmod |
| | 94 | define TYPE_PROGCMD, 0x016, 1 // mref |
| | 95 | define TYPE_DLLCTRL, 0x000, 1 // newcom |
| | 96 | define TYPE_DLLCTRL, 0x001, 1 // querycom |
| | 97 | ; define TYPE_DLLCTRL, 0x003, 1 // cnvstow |
| | 98 | define TYPE_DLLCTRL, 0x004, 1 // comres |
| | 99 | define TYPE_DLLCTRL, 0x005, 1 // axobj |
| | 100 | define TYPE_DLLCTRL, 0x008, 1 // comevent |
| | 101 | define TYPE_DLLCTRL, 0x009, 1 // comevarg |
| | 102 | define TYPE_DLLCTRL, 0x00a, 1 // sarrayconv |
| | 103 | return |
| | 104 | #global |
| | 105 | init_var_cmd |
| | 106 | |
| | 107 | title "Unused Variable Lister" |
| | 108 | path = "" |
| | 109 | input path, 640 - 50 - 50 |
| | 110 | path_input_objid = stat |
| | 111 | pos 640 - 50 - 50, 0 |
| | 112 | objsize 50 |
| | 113 | button gosub "�Q��..", *open_dialog |
| | 114 | pos 640 - 50, 0 |
| | 115 | button gosub "��s", *start |
| | 116 | result = "" |
| | 117 | pos 0 |
| | 118 | mesbox result, 640, 480 - 24, 0 |
| | 119 | result_mesbox_objid = stat |
| | 120 | sdim hr, 101 |
| | 121 | memset hr, '-', 100 |
| | 122 | stop |
| 81 | | ext = getpath(path, 2 + 16) |
| 82 | | if ext == ".hsp" or ext == ".as" { |
| 83 | | script_file_name = getpath(path, 8) |
| 84 | | obj_path = "obj" |
| 85 | | hsc_ini script_file_name |
| 86 | | hsc_objname obj_path |
| 87 | | hsc_comp 1, 0 |
| 88 | | if stat { |
| 89 | | result += "�R���p�C���Ɏ��s���܂���\n" |
| 90 | | hsc3_messize size |
| 91 | | sdim error_message, size + 1 |
| 92 | | hsc_getmes error_message |
| 93 | | result += error_message |
| 94 | | return |
| 95 | | } |
| 96 | | } else { |
| 97 | | obj_path = path |
| 98 | | } |
| 99 | | exist obj_path |
| 100 | | if strsize < 0 { |
| 101 | | result += "�I�u�W�F�N�g�t�@�C�� " + obj_path + " �͑��݂��܂��� |
| 102 | | return |
| 103 | | } |
| 104 | | sdim ax, strsize |
| 105 | | bload obj_path, ax |
| 106 | | if lpeek(ax) != 0x33505348 { // header magic number check |
| 107 | | result += "�s���ȃI�u�W�F�N�g�t�@�C���ł�\n" |
| 108 | | return |
| 109 | | } |
| 110 | | gosub *list_unused_variables |
| 111 | | result += path + "���� |
| 112 | | if unused_variables_count { |
| 113 | | result += "���g�p�ϐ���+ unused_variables_count + " �����܂���\n" |
| 114 | | } else { |
| 115 | | result += "���g�p�ϐ��͌������������\n" |
| 116 | | } |
| 117 | | repeat unused_variables_count |
| 118 | | result += varnames(unused_variables.cnt) + "\n" |
| 119 | | loop |
| 120 | | return |
| | 146 | ext = getpath(path, 2 + 16) |
| | 147 | if ext == ".hsp" or ext == ".as" { |
| | 148 | script_file_name = getpath(path, 8) |
| | 149 | obj_path = "obj" |
| | 150 | hsc_ini script_file_name |
| | 151 | hsc_objname obj_path |
| | 152 | hsc_comp 1, 0 |
| | 153 | if stat { |
| | 154 | result += "�R���p�C���Ɏ��s���܂���\n" |
| | 155 | hsc3_messize size |
| | 156 | sdim error_message, size + 1 |
| | 157 | hsc_getmes error_message |
| | 158 | result += error_message |
| | 159 | return |
| | 160 | } |
| | 161 | } else { |
| | 162 | obj_path = path |
| | 163 | } |
| | 164 | exist obj_path |
| | 165 | if strsize < 0 { |
| | 166 | result += "�I�u�W�F�N�g�t�@�C�������݂��܂��� |
| | 167 | return |
| | 168 | } |
| | 169 | sdim ax, strsize |
| | 170 | bload obj_path, ax |
| | 171 | if lpeek(ax) != 0x33505348 { // header magic number check |
| | 172 | result += "�s���ȃI�u�W�F�N�g�t�@�C���ł�\n" |
| | 173 | return |
| | 174 | } |
| | 175 | gosub *list_unused_variables |
| | 176 | if unused_variables_count { |
| | 177 | result += "���g�p�ϐ���+ unused_variables_count + " �����܂���\n" |
| | 178 | } else { |
| | 179 | result += "���g�p�ϐ��͌������������\n" |
| | 180 | } |
| | 181 | repeat unused_variables_count |
| | 182 | varid = unused_variables.cnt |
| | 183 | result += var_ref_filename(varid) + "(" + var_ref_lineno(varid) + "): " + varnames(varid) + "\n" |
| | 184 | loop |
| | 185 | return |
| 123 | | max_val = lpeek(ax, 8) |
| 124 | | |
| 125 | | pt_cs = lpeek(ax, 16) |
| 126 | | max_cs = lpeek(ax, 20) |
| 127 | | pt_ds = lpeek(ax, 24) |
| 128 | | max_ds = lpeek(ax, 28) |
| 129 | | pt_ot = lpeek(ax, 32) |
| 130 | | max_ot = lpeek(ax, 36) |
| 131 | | pt_dinfo = lpeek(ax, 40) |
| 132 | | max_dinfo = lpeek(ax, 44) |
| 133 | | |
| 134 | | sdim cs, max_cs |
| 135 | | sdim ds, max_ds |
| 136 | | sdim ot, max_ot |
| 137 | | sdim dinfo, max_dinfo |
| 138 | | memcpy cs, ax, max_cs, 0, pt_cs |
| 139 | | memcpy ds, ax, max_ds, 0, pt_ds |
| 140 | | memcpy ot, ax, max_ot, 0, pt_ot |
| 141 | | memcpy dinfo, ax, max_dinfo, 0, pt_dinfo |
| 142 | | |
| 143 | | sdim varnames,, max_val |
| 144 | | i = 0 |
| 145 | | repeat max_dinfo |
| 146 | | ofs = peek(dinfo,cnt) |
| 147 | | if ofs == 255 : break |
| 148 | | if ofs == 254 { |
| 149 | | continue cnt + 1 + 3 + 2 |
| 150 | | } |
| 151 | | if ofs == 253 { |
| 152 | | varnames.i = get_ds(ds, lpeek(dinfo, cnt + 1) & 0x00ffffff) |
| 153 | | i ++ |
| 154 | | continue cnt + 1 + 3 + 2 |
| 155 | | } |
| 156 | | if ofs == 252 { |
| 157 | | continue cnt + 1 + 2 |
| 158 | | } |
| 159 | | loop |
| 160 | | |
| 161 | | dim var_used_flags, max_val |
| 162 | | repeat max_cs |
| 163 | | c = wpeek(cs, cnt) |
| 164 | | sz = 2 |
| 165 | | type = c & 0x1fff |
| 166 | | ex1 = (c & 0x2000) != 0 |
| 167 | | ex2 = (c & 0x4000) != 0 |
| 168 | | if c & 0x8000 { |
| 169 | | code = lpeek(cs, cnt + sz) |
| 170 | | sz += 4 |
| 171 | | } else { |
| 172 | | code = wpeek(cs, cnt + sz) |
| 173 | | sz += 2 |
| 174 | | } |
| 175 | | if type == TYPE_CMPCMD { |
| 176 | | sz += 2 |
| 177 | | } |
| 178 | | if ex1 and type == TYPE_VAR { |
| 179 | | var_used_flags.code = 1 |
| 180 | | } |
| 181 | | continue cnt + sz |
| 182 | | loop |
| 183 | | |
| 184 | | unused_variables_count = 0 |
| 185 | | unused_variables = 0 |
| 186 | | repeat max_val |
| 187 | | if var_used_flags.cnt : continue |
| 188 | | unused_variables.unused_variables_count = cnt |
| 189 | | unused_variables_count ++ |
| 190 | | loop |
| 191 | | return |
| | 188 | max_val = lpeek(ax, 8) |
| | 189 | |
| | 190 | pt_cs = lpeek(ax, 16) |
| | 191 | max_cs = lpeek(ax, 20) |
| | 192 | pt_ds = lpeek(ax, 24) |
| | 193 | max_ds = lpeek(ax, 28) |
| | 194 | pt_ot = lpeek(ax, 32) |
| | 195 | max_ot = lpeek(ax, 36) |
| | 196 | pt_dinfo = lpeek(ax, 40) |
| | 197 | max_dinfo = lpeek(ax, 44) |
| | 198 | |
| | 199 | dupptr cs, varptr(ax) + pt_cs, max_cs, 2 |
| | 200 | dupptr ds, varptr(ax) + pt_ds, max_ds, 2 |
| | 201 | dupptr ot, varptr(ax) + pt_ot, max_ot, 2 |
| | 202 | dupptr dinfo, varptr(ax) + pt_dinfo, max_dinfo, 2 |
| | 203 | |
| | 204 | sdim varnames,, max_val |
| | 205 | i = 0 |
| | 206 | repeat max_dinfo |
| | 207 | ofs = peek(dinfo, cnt) |
| | 208 | if ofs == 255 : break |
| | 209 | if ofs == 254 { |
| | 210 | continue cnt + 1 + 3 + 2 |
| | 211 | } |
| | 212 | if ofs == 253 { |
| | 213 | varnames.i = get_cstr(ds, lpeek(dinfo, cnt + 1) & 0x00ffffff) |
| | 214 | i ++ |
| | 215 | continue cnt + 1 + 3 + 2 |
| | 216 | } |
| | 217 | if ofs == 252 { |
| | 218 | continue cnt + 1 + 2 |
| | 219 | } |
| | 220 | loop |
| | 221 | |
| | 222 | dim var_used_flags, max_val |
| | 223 | sdim var_ref_filename,, max_val // �ϐ���Ƃ��Ă����@�C���� |
| | 224 | dim var_ref_lineno, max_val // �ϐ���Ƃ��Ă����ԍ� |
| | 225 | |
| | 226 | dinfo_pos = 0 |
| | 227 | filename = "" |
| | 228 | lineno = 0 |
| | 229 | line_size = 0 |
| | 230 | |
| | 231 | var_prm_no = 0 : prm_no = 0 |
| | 232 | repeat max_cs |
| | 233 | c = wpeek(cs, cnt) |
| | 234 | sz = 2 |
| | 235 | type = c & 0x1fff |
| | 236 | ex1 = (c & 0x2000) != 0 |
| | 237 | ex2 = (c & 0x4000) != 0 |
| | 238 | if c & 0x8000 { |
| | 239 | code = lpeek(cs, cnt + sz) |
| | 240 | sz += 4 |
| | 241 | } else { |
| | 242 | code = wpeek(cs, cnt + sz) |
| | 243 | sz += 2 |
| | 244 | } |
| | 245 | if type == TYPE_CMPCMD { |
| | 246 | sz += 2 |
| | 247 | } |
| | 248 | gosub *line_next |
| | 249 | ;logmes filename+"("+lineno+")"+get_type_name(type)+", ex1:"+ex1+", ex2:"+ex2+", code:"+code |
| | 250 | if ex2 and paren_level == 0 { |
| | 251 | prm_no ++ |
| | 252 | } |
| | 253 | if type == TYPE_MARK and code == '(' { |
| | 254 | paren_level ++ |
| | 255 | } |
| | 256 | if type == TYPE_MARK and code == ')' { |
| | 257 | paren_level -- |
| | 258 | } |
| | 259 | if type == TYPE_VAR { |
| | 260 | if ex1 { |
| | 261 | var_used_flags.code = 1 |
| | 262 | } else : if var_prm_no != 0 and prm_no == var_prm_no and paren_level == 0 { |
| | 263 | var_used_flags.code = 1 |
| | 264 | var_prm_no = 0 |
| | 265 | } else : if var_ref_lineno.code == 0 { |
| | 266 | var_ref_filename.code = filename |
| | 267 | var_ref_lineno.code = lineno |
| | 268 | } |
| | 269 | } |
| | 270 | if ex1 { |
| | 271 | var_prm_no = get_var_cmd_prm_no(type, code) |
| | 272 | paren_level = 0 |
| | 273 | prm_no = 1 |
| | 274 | } |
| | 275 | continue cnt + sz |
| | 276 | loop |
| | 277 | |
| | 278 | unused_variables_count = 0 |
| | 279 | unused_variables = 0 |
| | 280 | repeat max_val |
| | 281 | if var_used_flags.cnt : continue |
| | 282 | unused_variables.unused_variables_count = cnt |
| | 283 | unused_variables_count ++ |
| | 284 | loop |
| | 285 | return |
| | 286 | |
| | 287 | *line_next |
| | 288 | repeat |
| | 289 | dpos = dinfo_pos |
| | 290 | if dpos >= max_dinfo : break |
| | 291 | ofs = peek(dinfo, dpos) |
| | 292 | dpos ++ |
| | 293 | if ofs == 255 : break |
| | 294 | if ofs == 254 { |
| | 295 | ds_offset = lpeek(dinfo, dpos) & 0xffffff |
| | 296 | dpos += 3 |
| | 297 | if ds_offset { |
| | 298 | filename = get_cstr(ds, ds_offset) |
| | 299 | ;logmes "set filename to "+filename |
| | 300 | } |
| | 301 | lineno = wpeek(dinfo, dpos) |
| | 302 | ;logmes "set lineno to "+lineno |
| | 303 | dinfo_pos = dpos + 2 |
| | 304 | continue |
| | 305 | } |
| | 306 | if ofs == 253 { |
| | 307 | dinfo_pos = dpos + 3 + 2 |
| | 308 | continue |
| | 309 | } |
| | 310 | if ofs == 252 { |
| | 311 | ofs = wpeek(dinfo, dpos) |
| | 312 | dpos += 2 |
| | 313 | } |
| | 314 | if line_size < ofs : break |
| | 315 | line_size = 0 |
| | 316 | lineno ++ |
| | 317 | ;logmes "increment lineno to "+lineno |
| | 318 | dinfo_pos = dpos |
| | 319 | loop |
| | 320 | line_size += sz / 2 |
| | 321 | return |