root/lang/hsp/misc/hsp2hs/mod_hsp2hs.hsp @ 13253

Revision 13253, 7.3 kB (checked in by fujidig, 5 years ago)

HSPファイルのOpen、HSファイルのSave機能を追加するなどした。

  • Property svn:executable set to *
Line 
1/**
2 * mod_hsp2hs
3 * HSP �X�N���v�g�����ߍ��݃h�L�������g����s �t�@�C���𐶐����郂�W���[��
4 * @author fujidig
5 * @date 2008/06/05
6 * @ver 1.0.1
7 */
8
9#ifndef mod_hsp2hs
10#include "mod_strutils.hsp"
11
12#module mod_hsp2hs
13
14// TODO : url, note, port, portinf, sample �͕����s�̎w���”\�ɂ���#enum TAG_AUTHOR = 0
15#enum TAG_DATE
16#enum TAG_VER
17#enum TAG_URL
18#enum TAG_NOTE
19#enum TAG_TYPE
20#enum TAG_GROUP
21#enum TAG_PORT
22#enum TAG_PORTINF
23#enum TAG_SAMPLE
24#enum TAG_MAX
25
26#deffunc doc_analyze
27        summary = ""
28        inst = ""
29        dprm_names = ""
30        dprm_summaries = ""
31        dprms_cnt = 0
32        hrefs = ""
33        hrefs_cnt = 0
34
35        sdim tags,, TAG_MAX
36
37        is_tag_started = 0 // @tag ���n�܂���� / @tag ���n�܂�Ă��������͎󂯕t���Ȃ�
38
39        docptr = 0
40        repeat
41            getstr dln, doc, docptr
42            if strsize == 0 : break
43            docptr += strsize
44            dlnptr = 0
45
46            dlnptr += spnspace(dln, dlnptr)
47            if peek(dln, dlnptr) == 0 : continue
48
49            if is_tag_started == 0 & peek(dln, dlnptr) != '@' {
50                // �O���X�y�[�X���Ă��܂��d�l���ƃX�N���v�g��������ɖ����H�i�X�y�[�X�ƃ^�u�̍��ʉ�����΂����H�j
51                astr = strmid(dln, dlnptr, 9999)
52                stripstr astr
53                if summary == "" {
54                    summary = astr
55                } else {
56                    if inst == "" {
57                        inst = astr
58                    } else {
59                        inst += "\n" + astr
60                    }
61                }
62                continue
63            }
64
65            if peek(dln, dlnptr) != '@' : continue
66            is_tag_started = 1
67            dlnptr ++ // '@'
68            ;dlnptr += spnspace(dln, dlnptr)
69            dlnptr += scanident(dln, dlnptr, tag)
70            dlnptr += spnspace(dln, dlnptr)
71
72            switch tag
73            case "param"
74                dlnptr += scanident(dln, dlnptr, dprm_names.dprms_cnt)
75                dlnptr += spnspace(dln, dlnptr)
76                dprm_summaries.dprms_cnt = strmid(dln, dlnptr, 9999)
77                stripstr dprm_summaries.dprms_cnt
78                dprms_cnt ++
79                swbreak
80            case "href"
81                hrefs.hrefs_cnt = strmid(dln, dlnptr, 9999)
82                stripstr hrefs.hrefs_cnt
83                hrefs_cnt ++
84                swbreak
85            default
86                i = -1
87                repeat TAG_MAX
88                    if tag_names.cnt == tag : i = cnt : break
89                loop
90                if i == -1 : swbreak
91                tags.i = strmid(dln, dlnptr, 9999)
92            swend
93        loop
94        return
95
96/**
97 * HSP �X�N���v�g�����ߍ��݃h�L�������g����s �t�@�C���𐶐�
98 * �ϐ� src �Ɋi�[���ꂽ HSP �X�N���v�g�̕����񂩂疄�ߍ��݃h�L�������g����A hs �t�@�C���֕ϊ����܂��B
99 * hs �t�@�C���̓��͕ϐ� dest �Ɋi�[���܂��B
100 * @params src  HSP �X�N���v�g�̕�����ϐ�
101 * @params dest ���ʂ�hs �t�@�C���̓���[������
102 */
103#deffunc hsp2hs var src, var dest
104    if inited == 0 { // ����        inited = 1
105        tag_names = "author", "date", "ver", "url", "note", "type", "group", "port", "portinf", "sample"
106    }
107    dest = ""
108    srcptr_n = 0
109   
110    #enum STATUS_DEFAULT = 1
111    #enum STATUS_DOC1 // ; ==hspmodule== �` ; ==/hspmodule==
112    #enum STATUS_DOC2 // /** �` */
113    #enum STATUS_DOCEND // �h�L�������g�I��
114    status = STATUS_DEFAULT
115    doc_start_lineno = -1
116   
117    repeat
118        srcptr = srcptr_n
119        getstr ln, src, srcptr
120        if strsize == 0 & status != STATUS_DOCEND : break
121        srcptr_n = srcptr + strsize
122        lnptr = 0
123       
124        if status == STATUS_DEFAULT | status == STATUS_DOC1 {
125                lnptr += spnspace(ln, lnptr)
126                if peek(ln, lnptr) != ';' {
127                        status = STATUS_DEFAULT
128                } else {
129                        lnptr ++
130                        lnptr += spnspace(ln, lnptr)
131                        if status == STATUS_DOC1 {
132                                if strmid(ln, lnptr, 14) == "==/hspmodule==" {
133                                        status = STATUS_DOCEND
134                                        continue
135                                }
136                                doc += strmid(ln, lnptr, 9999) + "\n"
137                                continue
138                        }
139                        if strmid(ln, lnptr, 13) == "==hspmodule==" {
140                                doc = ""
141                                doc_start_lineno = cnt
142                                status = STATUS_DOC1
143                                continue
144                        }
145                }
146        }
147        if status == STATUS_DEFAULT | status == STATUS_DOC2 {
148                lnptr += spnspace(ln, lnptr)
149                if status == STATUS_DOC2 {
150                        if strmid(ln, lnptr, 2) == "*/" {
151                                status = STATUS_DOCEND
152                                continue
153                        }
154                        if peek(ln, lnptr) == '*' {
155                                lnptr ++
156                                lnptr += spnspace(ln, lnptr)
157                        }
158                        doc += strmid(ln, lnptr, 9999) + "\n"
159                        continue
160                }
161                if strmid(ln, lnptr, 3) == "/**" {
162                        doc = ""
163                        doc_start_lineno = cnt
164                        status = STATUS_DOC2
165                        continue
166                }
167        }
168        if status == STATUS_DEFAULT : continue
169
170        // �h�L�������g���
171        if status != STATUS_DOCEND : continue
172        doc_analyze
173        status = STATUS_DEFAULT
174
175        // �����
176
177        if doc_start_lineno == 0 {
178            // �t�@�C���擪
179            dest += "%dll\n"
180            dest += summary + "\n"
181            dest += "\n"
182            repeat TAG_MAX
183                if peek(tags.cnt) == 0 : continue
184                dest += "%" + tag_names.cnt + "\n"
185                dest += tags.cnt + "\n"
186                dest += "\n"
187            loop
188            continue
189        }
190
191        lnptr = spnspace(ln, lnptr)
192        if peek(ln, lnptr) != '#' : continue
193        lnptr ++
194        lnptr += spnspace(ln, lnptr)
195        lnptr += scanident(ln, lnptr, ident)
196        if ident != "deffunc" & ident != "defcfunc" : continue
197        ctype = ident == "defcfunc"
198        lnptr += spnspace(ln, lnptr)
199        lnptr += scanident(ln, lnptr, funcname)
200        lnptr += spnspace(ln, lnptr)
201
202        // �����X�g���
203        prm_types = ""
204        prm_names = ""
205        prms_cnt = 0
206
207        repeat
208            if cnt != 0 {
209                if peek(ln, lnptr) != ',' : break
210                lnptr ++
211            }
212            lnptr += spnspace(ln, lnptr)
213            sz = scanident(ln, lnptr, prm_type)
214            if sz == 0 : break
215            lnptr += sz
216            lnptr += spnspace(ln, lnptr)
217            sz = scanident(ln, lnptr, prm_name)
218            if sz == 0 : break
219            lnptr += sz
220            lnptr += spnspace(ln, lnptr)
221            if prm_type == "local" : continue
222            prm_types.cnt = prm_type
223            prm_names.cnt = prm_name
224            prms_cnt ++
225        loop
226
227#ifdef _DEBUG
228                logmes "function " + funcname
229                logmes " dprms_cnt = "+dprms_cnt
230                repeat dprms_cnt
231                        logmes "  dprm_names."+cnt+"="+dprm_names.cnt + ", dprm_summaries."+cnt+"="+dprm_summaries.cnt
232                loop
233                logmes " prms_cnt = " + prms_cnt
234                repeat prms_cnt
235                        logmes "  prm_names."+cnt+"="+prm_names.cnt + ", prm_types."+cnt+"="+prm_types.cnt
236                loop
237#endif
238        // TODO : �h�L�������g�̃p�����[�^���Ǝ�ۂ̉����X�g��r���Ĉ����ȂLjႦ�Όx��
239
240        prm = ""
241        prm_list = ""
242        repeat dprms_cnt ;limit(dprms_cnt, 0, prms_cnt)
243            if cnt {
244                prm += ", "
245                prm_list += "\n"
246            }
247            prm += dprm_names.cnt
248            prm_list += dprm_names.cnt + "\t: " + dprm_summaries.cnt
249        loop
250        if ctype : prm = "(" + prm + ")"
251
252        dest += "%index\n"
253        dest += funcname + "\n"
254        dest += summary + "\n"
255        dest += "\n"
256        dest += "%prm\n"
257        dest += prm + "\n"
258        dest += prm_list + "\n"
259        dest += "\n"
260        dest += "%inst\n"
261        dest += inst + "\n"
262        dest += "\n"
263        if hrefs_cnt {
264            dest += "%href\n"
265            repeat hrefs_cnt
266                dest += hrefs.cnt + "\n"
267            loop
268            dest += "\n"
269        }
270        repeat TAG_MAX
271            if peek(tags.cnt) == 0 : continue
272            dest += "%" + tag_names.cnt + "\n"
273            dest += tags.cnt + "\n"
274            dest += "\n"
275        loop
276    loop
277    return
278#global
279#endif
Note: See TracBrowser for help on using the browser.