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

Revision 13251, 7.1 kB (checked in by fujidig, 7 years ago)

「; ==hspmodule== 〜 ; ==/hspmodule==」のような埋め込みドキュメントの別の記法に対応。

  • 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 = 12345
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        logmes "status = " + status + ", ln = '" + ln +"'"
124       
125        if status == STATUS_DEFAULT | status == STATUS_DOC1 {
126                lnptr += spnspace(ln, lnptr)
127                if peek(ln, lnptr) != ';' {
128                        status = STATUS_DEFAULT
129                } else {
130                        lnptr ++
131                        lnptr += spnspace(ln, lnptr)
132                        if status == STATUS_DOC1 {
133                                if strmid(ln, lnptr, 14) == "==/hspmodule==" {
134                                        status = STATUS_DOCEND
135                                        continue
136                                }
137                                doc += strmid(ln, lnptr, 9999) + "\n"
138                                continue
139                        }
140                        logmes "strmid(ln, "+lnptr+", 13) = '"+strmid(ln, lnptr, 13)
141                        if strmid(ln, lnptr, 13) == "==hspmodule==" {
142                                doc = ""
143                                doc_start_lineno = cnt
144                                status = STATUS_DOC1
145                                continue
146                        }
147                }
148        }
149        if status == STATUS_DEFAULT | status == STATUS_DOC2 {
150                lnptr += spnspace(ln, lnptr)
151                if status == STATUS_DOC2 {
152                        if strmid(ln, lnptr, 2) == "*/" {
153                                status = STATUS_DOCEND
154                                continue
155                        }
156                        if peek(ln, lnptr) == '*' {
157                                lnptr ++
158                                lnptr += spnspace(ln, lnptr)
159                        }
160                        doc += strmid(ln, lnptr, 9999) + "\n"
161                        continue
162                }
163                if strmid(ln, lnptr, 3) == "/**" {
164                        doc = ""
165                        doc_start_lineno = cnt
166                        status = STATUS_DOC2
167                        continue
168                }
169        }
170        if status == STATUS_DEFAULT : continue
171
172        // �h�L�������g���
173        if status != STATUS_DOCEND : continue
174        doc_analyze
175        status = STATUS_DEFAULT
176
177        // �����
178
179        if doc_start_lineno == 0 {
180            // �t�@�C���擪
181            dest += "%dll\n"
182            dest += summary + "\n"
183            dest += "\n"
184            repeat TAG_MAX
185                if peek(tags.cnt) == 0 : continue
186                dest += "%" + tag_names.cnt + "\n"
187                dest += tags.cnt + "\n"
188                dest += "\n"
189            loop
190            continue
191        }
192
193        lnptr = spnspace(ln, lnptr)
194        if peek(ln, lnptr) != '#' : continue
195        lnptr ++
196        lnptr += spnspace(ln, lnptr)
197        lnptr += scanident(ln, lnptr, ident)
198        if ident != "deffunc" & ident != "defcfunc" : continue
199        ctype = ident == "defcfunc"
200        lnptr += spnspace(ln, lnptr)
201        lnptr += scanident(ln, lnptr, funcname)
202        lnptr += spnspace(ln, lnptr)
203
204        // �����X�g���
205        prm_types = ""
206        prm_names = ""
207        prms_cnt = 0
208
209        repeat
210            // TODO : �p�����[�^�^�C�v local �͒lj�������łȂ�
211            if cnt != 0 {
212                if peek(ln, lnptr) != ',' : break
213                lnptr ++
214            }
215            lnptr += spnspace(ln, lnptr)
216            sz = scanident(ln, lnptr, prm_types.cnt)
217            if sz == 0 : break
218            lnptr += sz
219            lnptr += spnspace(ln, lnptr)
220            sz = scanident(ln, lnptr, prm_names.cnt)
221            if sz == 0 : break
222            lnptr += sz
223            lnptr += spnspace(ln, lnptr)
224            prms_cnt ++
225        loop
226
227        // TODO : �h�L�������g�̃p�����[�^���Ǝ�ۂ̉����X�g��r���Ĉ����ȂLjႦ�Όx��
228
229        prm = ""
230        prm_list = ""
231        repeat dprms_cnt ;limit(dprms_cnt, 0, prms_cnt)
232            if cnt {
233                prm += ", "
234                prm_list += "\n"
235            }
236            prm += dprm_names.cnt
237            prm_list += dprm_names.cnt + "\t: " + dprm_summaries.cnt
238        loop
239        if ctype : prm = "(" + prm + ")"
240
241        dest += "%index\n"
242        dest += funcname + "\n"
243        dest += summary + "\n"
244        dest += "\n"
245        dest += "%prm\n"
246        dest += prm + "\n"
247        dest += prm_list + "\n"
248        dest += "\n"
249        dest += "%inst\n"
250        dest += inst + "\n"
251        dest += "\n"
252        if hrefs_cnt {
253            dest += "%href\n"
254            repeat hrefs_cnt
255                dest += hrefs.cnt + "\n"
256            loop
257            dest += "\n"
258        }
259        repeat TAG_MAX
260            if peek(tags.cnt) == 0 : continue
261            dest += "%" + tag_names.cnt + "\n"
262            dest += tags.cnt + "\n"
263            dest += "\n"
264        loop
265    loop
266    return
267#global
268#endif
Note: See TracBrowser for help on using the browser.