Changeset 18359 for lang/hsp

Show
Ignore:
Timestamp:
08/28/08 06:55:45 (3 months ago)
Author:
fujidig
Message:

* 変数を参照しているソースのファイル名と行番号を表示するように変更
* dim命令など「パラメータの変数に代入する命令」に指定した引数を拾わないように変更

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • lang/hsp/misc/unused_variable_lister/unused_variable_lister.hsp

    r18345 r18359  
    55// start.ax ���f�o�b�O�����t��������Ȃ��̂ŁB 
    66 
    7 // ���ӓ_: 
    8 // �u�����Ă��Ȃ�����sdim �Ƃ� dupptr �ł����ƕϐ�����Ă����悤�ȕϐ�����肵�Ă��܂��܂� 
    9  
    107// TODO: 
    11 // - �딻���Ȃ������// - �����Ă��Ȃ����̕ϐ�����ŎQ�Ƃ��Ă������t�@�C�����ƍs�ԍ���͂��� 
     8// - DLL �̖��߂⃆�[�U�[�����߂ŕϐ�����Ă����Ƃ�������悤�ɂ��悤���ȁ[�H 
     9 
     10#include "hspcmp.as" 
     11 
    1212#module 
    13 #defcfunc get_ds var ds, int offset 
    14     dupptr ret, varptr(ds) + offset, 1, 2 
    15     return ret 
     13#defcfunc get_cstr var buf, int offset 
     14        dupptr ret, varptr(buf) + offset, 1, 2 
     15        return ret 
     16#defcfunc get_type_name int type 
     17        if typenames == 0 { 
     18                typenames = "TYPE_MARK", "TYPE_VAR", "TYPE_STRING", "TYPE_DNUM", "TYPE_INUM", "TYPE_STRUCT", "TYPE_XLABEL", "TYPE_LABEL", "TYPE_INTCMD", "TYPE_EXTCMD", "TYPE_EXTSYSVAR", "TYPE_CMPCMD", "TYPE_MODCMD", "TYPE_INTFUNC", "TYPE_SYSVAR", "TYPE_PROGCMD", "TYPE_DLLFUNC", "TYPE_DLLCTRL", "TYPE_USERDEF" 
     19        } 
     20        return typenames.type + "(" + type + ")" 
    1621#global 
    1722 
    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 
    59123 
    60124*open_dialog 
    61     dialog "", 16 
    62     if stat == 0 : return 
    63     path = refstr 
    64     objprm path_input_objid, path 
    65     gosub *start 
    66     return 
     125        dialog "", 16 
     126        if stat == 0 : return 
     127        path = refstr 
     128        objprm path_input_objid, path 
     129        gosub *start 
     130        return 
    67131 
    68132*result_mesbox_notify 
    69     objprm result_mesbox_objid, result 
    70     return 
     133        objprm result_mesbox_objid, result 
     134        return 
    71135 
    72136*start 
    73     if peek(result) { 
    74         result += hr + "\n" 
    75     } 
    76     gosub *start_ 
    77     gosub *result_mesbox_notify 
    78     return 
     137        if peek(result) { 
     138                result += hr + "\n" 
     139        } 
     140        result += "[" + path + "]\n" 
     141        gosub *start_ 
     142        gosub *result_mesbox_notify 
     143        return 
    79144 
    80145*start_ 
    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 
    121186 
    122187*list_unused_variables 
    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