fbdoc  1.0.1
FreeBASIC documentation tool
fbdoc_emitters.bas
Go to the documentation of this file.
1 
25 
26 #INCLUDE ONCE "fbdoc_options.bi"
27 #INCLUDE ONCE "fbdoc_version.bi"
28 
29 
30 
39 SUB emit_comments CDECL(BYVAL P AS Parser PTR, BYVAL Stop_ AS INTEGER)
40  WITH *P '&Parser* P;
41  VAR i = .SrcBgn
42  WHILE i <= Stop_
43  SELECT CASE AS CONST .Buf[i]
44  CASE 0 : EXIT WHILE
45  CASE ASC(!"\n") : Code(NL)
46  CASE ASC("""")
47  SCAN_QUOTE(.Buf,i)
48  CASE ASC("'")
49  VAR c = i + 1
50  SCAN_SL_COMM(.Buf,i)
51  IF .Buf[c] = OPT->JoComm THEN c += 1 : Code("//!" & MID(.Buf, c + 1, i - c))
52  IF .Buf[c] = OPT->AdLine THEN c += 1 : Code(MID(.Buf, c + 1, i - c))
53  CONTINUE WHILE
54  CASE ASC("/") : IF .Buf[i + 1] <> ASC("'") THEN EXIT SELECT
55  i += 2
56  VAR c = IIF(.Buf[i] = OPT->JoComm, i + 1, 0)
57  IF c THEN Code(*IIF(OPT->Types = OPT->C_STYLE ,@"/**", @"/*!"))
58  DO
59  SELECT CASE AS CONST .Buf[i]
60  CASE 0 : EXIT DO
61  CASE ASC(!"\n") : IF 0 = c THEN Code(NL) : EXIT SELECT
62  Code(MID(.Buf, c + 1, i - c + 1))
63  c = i + 1
64  IF .Buf[c] = ASC("'") ANDALSO .Buf[c + 1] = ASC("/") THEN EXIT SELECT
65  IF OPT->Asterix THEN Code("* ")
66  CASE ASC("'")
67  SELECT CASE AS CONST .Buf[i + 1]
68  CASE 0 : EXIT SUB
69  CASE ASC("/") : i += 1 : EXIT DO
70  END SELECT
71  END SELECT : i += 1
72  LOOP
73  IF c THEN Code(MID(.Buf, c + 1, i - c - 1) & "*/")
74  END SELECT : i += 1
75  WEND : IF .SrcBgn < i THEN .SrcBgn = i
76  END WITH
77 END SUB
78 
79 
80 
89 SUB cppNam CDECL(BYVAL P AS Parser PTR)
90  WITH *P '&Parser* P;
91  VAR t = .NamTok
92  Code(.SubStr(t))
93  WHILE t < .EndTok
94  t += 3
95  SELECT CASE AS CONST *t
96  CASE .TOK_DOT : Code("::")
97  CASE .TOK_WORD : Code(.SubStr(t))
98  CASE ELSE : EXIT WHILE
99  END SELECT
100  WEND
101  END WITH
102 END SUB
103 
104 
105 
114 SUB cNam CDECL(BYVAL P AS Parser PTR)
115  WITH *P '&Parser* P;
116  FOR i AS INTEGER = 1 TO .PtrCount : Code("*") : NEXT
117  VAR t = .NamTok, a = t[1], l = t[2]
118  WHILE t < .EndTok
119  t += 3
120  SELECT CASE AS CONST *t
121  CASE .TOK_DOT, .TOK_WORD : l += t[2]
122  CASE ELSE : EXIT WHILE
123  END SELECT
124  WEND : Code(MID(.Buf, a + 1, l))
125  END WITH
126 END SUB
127 
128 
129 
136 SUB CreateIni CDECL(BYVAL P AS Parser PTR)
137  WITH *P '&Parser* P;
138  VAR kl = 0, i = .IniTok[1], a = i, e = 0, atc = 0
139  Code(" ")
140  DO
141  i += 1
142  SELECT CASE AS CONST .Buf[i]
143  CASE 0 : EXIT DO
144  CASE ASC(!"\n")
145  Code(MID(.Buf, a + 1, IIF(e, e, i) - a))
146  a = i + 1
147  IF kl <= 0 ANDALSO (e = 0 ORELSE .Buf[e] <> ASC("_")) THEN EXIT SUB
148  emit_comments(P, i)
149  e = 0
150  CASE ASC("@")
151  IF kl <= 0 THEN atc = i
152  CASE ASC("_")
153  IF .Buf[i + 1] < ASC("0") ANDALSO .Buf[i - 1] < ASC("0") THEN e = IIF(e, e, i)
154  CASE ASC("'")
155  e = IIF(e, e, i)
156  CASE ASC("/")
157  IF .Buf[i + 1] = ASC("'") THEN e = IIF(e, e, i)
158  CASE ASC("""")
159  VAR esc = IIF(.Buf[i - 1] = ASC("!"), 1, 0)
160  IF atc THEN .Buf[atc] = ASC(" ")
161  DO
162  i += 1
163  SELECT CASE AS CONST .Buf[i]
164  CASE 0, ASC(!"\n") : i -= 1 : EXIT DO
165  CASE ASC("\") : IF esc THEN i += 1
166  CASE ASC("""") : IF .Buf[i + 1] = ASC("""") THEN i += 1 ELSE EXIT DO
167  END SELECT
168  LOOP
169  CASE ASC("("), ASC("{"), ASC("[") : kl += 1
170  CASE ASC(")"), ASC("}"), ASC("]") : kl -= 1 : IF kl < 0 THEN EXIT DO
171  CASE ASC(",") : IF kl <= 0 THEN EXIT DO
172  END SELECT
173  LOOP UNTIL i >= .EndTok[1] : IF i <= a THEN EXIT SUB
174  Code(MID(.Buf, a + 1, IIF(e, e, i) - a))
175  IF atc THEN .Buf[atc] = ASC("@")
176  END WITH
177 END SUB
178 
179 
180 
188 SUB cArrDim CDECL(BYVAL P AS Parser PTR)
189  WITH *P '&Parser* P;
190  VAR t = .DimTok, kl = 0
191  DO
192  SELECT CASE AS CONST *t
193  CASE .TOK_COMMA
194  SELECT CASE AS CONST t[-3]
195  CASE .TOK_3DOT, .TOK_ANY : Code("][")
196  CASE ELSE : Code(" + 1][")
197  END SELECT
198  CASE .TOK_BROPN : kl += 1 : Code("[")
199  IF t[3] = .TOK_COMMA ORELSE t[3] = .TOK_BRCLO THEN _
200  Code(MID(.Buf, t[1] + 2, t[4] - t[1] - 1))
201  CASE .TOK_BRCLO : kl -= 1
202  SELECT CASE AS CONST t[-3]
203  CASE .TOK_3DOT, .TOK_ANY : Code("]")
204  CASE ELSE : Code(" + 1]")
205  END SELECT
206  IF kl <= 0 THEN EXIT DO
207  CASE ELSE : Code(.SubStr(t))
208  END SELECT : t += 3
209  LOOP UNTIL t >= .EndTok
210  END WITH
211 END SUB
212 
213 
214 
238 SUB cppCreateTypNam CDECL(BYVAL P AS Parser PTR)
239  WITH *P '&Parser* P;
240  IF .TypTok THEN
241  IF .ShaTok THEN Code(.SubStr(.ShaTok) & "_")
242  IF .Co1Tok THEN Code(.SubStr(.Co1Tok) & "_")
243  Code(.SubStr(.TypTok))
244  IF .Co2Tok THEN Code("_" & .SubStr(.Co2Tok))
245  FOR i AS INTEGER = 1 TO .PtrCount
246  Code("_" & .SubStr(.PtrTok)) : NEXT
247  IF .NamTok THEN Code(" ") ELSE EXIT SUB
248  ELSE
249  Code(" ")
250  END IF
251 
252  IF .NamTok > .TypTok _
253  THEN emit_comments(P, .NamTok[1])
254 
255  IF .NamTok THEN cppNam(P)
256  IF .DimTok THEN cArrDim(P)
257  IF .BitTok THEN Code(.BitIni)
258  IF .IniTok THEN CreateIni(P)
259  END WITH
260 END SUB
261 
262 
263 
289 SUB cCreateTypNam CDECL(BYVAL P AS Parser PTR)
290  WITH *P '&Parser* P;
291  IF .TypTok THEN
292  IF .Co1Tok THEN Code("const ")
293 
294  SELECT CASE AS CONST *.TypTok
295  CASE .TOK_BYTE : Code("signed char")
296  CASE .TOK_UBYT : Code("unsigned char")
297  CASE .TOK_SHOR : Code("short")
298  CASE .TOK_USHO : Code("unsigned short")
299  CASE .TOK_STRI : Code("char*") ' ??? FB_STRING, g_string
300  CASE .TOK_SING : Code("float")
301  CASE .TOK_DOUB : Code("double")
302  CASE .TOK_ZSTR : Code("char")
303  CASE .TOK_WSTR : Code("wchar")
304  CASE .TOK_INT, .TOK_LONG : Code("int")
305  CASE .TOK_UINT, .TOK_ULNG : Code("unsigned int")
306  CASE .TOK_LINT : Code("LONG int")
307  CASE .TOK_ULIN : Code("unsigned LONG int")
308  CASE ELSE : Code(.SubStr(.TypTok))
309  END SELECT
310 
311  IF .Co2Tok THEN Code(" " & .SubStr(.Co2Tok))
312  IF .By_Tok ANDALSO *.By_Tok = .TOK_BYRE THEN .PtrCount += 1
313  IF .NamTok THEN Code(" ") ELSE EXIT SUB
314  END IF
315 
316  IF .NamTok > .TypTok _
317  THEN emit_comments(P, .NamTok[1])
318 
319  IF .FunTok THEN
320  SELECT CASE AS CONST *.StaTok
321  CASE .TOK_TYPE, .TOK_DIM, .TOK_RDIM, .TOK_COMM, .TOK_EXRN
322  FOR i AS INTEGER = 1 TO .PtrCount : Code("*") : NEXT
323  .PtrCount = 0
324  Code(" (*") : cNam(P) : Code(")") : EXIT SUB
325  END SELECT
326  END IF
327  IF .NamTok THEN cNam(P)
328  IF .ParTok THEN EXIT SUB
329  IF .BitTok THEN Code(.BitIni)
330  IF .DimTok THEN cArrDim(P) ': Code()
331  IF .IniTok THEN CreateIni(P)
332  END WITH
333 END SUB
334 
335 
336 
348 SUB cppEntryListParameter CDECL(BYVAL P AS Parser PTR)
349  WITH *P '&Parser* P;
350  emit_comments(P, .Tk1[1])
351 
352  IF .FunTok THEN
353  IF .By_Tok THEN Code(.SubStr(.By_Tok) & "_")
354  IF .DivTok THEN Code("_" & .SubStr(.DivTok))
356  ELSEIF .TypTok THEN
357  IF .By_Tok THEN Code(.SubStr(.By_Tok) & "_")
358  Code(.SubStr(.As_Tok) & "_")
359  cppCreateTypNam(P)
360  ELSE
361  IF *.NamTok = .TOK_3DOT THEN Code("...") _
362  ELSE Code("void")
363  END IF
364 
365  IF *.CurTok <> .TOK_BRCLO THEN Code(", ") : EXIT SUB
366  emit_comments(P, .CurTok[1]) : Code(")")
367  END WITH
368 END SUB
369 
370 
371 
385 SUB cEntryListParameter CDECL(BYVAL P AS Parser PTR)
386  WITH *P '&Parser* P;
387  emit_comments(P, .Tk1[1])
388 
389  IF .FunTok THEN
390  cCreateFunction(P)
391  ELSEIF .TypTok THEN
392  cCreateTypNam(P)
393  ELSE
394  IF *.NamTok = .TOK_3DOT THEN Code("...") _
395  ELSE Code("void")
396  END IF
397 
398  IF *.CurTok <> .TOK_BRCLO THEN Code(", ") : EXIT SUB
399  emit_comments(P, .CurTok[1]) : Code(")")
400  END WITH
401 END SUB
402 
403 
404 
415 SUB cppCreateFunction CDECL(BYVAL P AS Parser PTR)
416  WITH *P '&Parser* P;
417  'IF .DivTok THEN Code(.SubStr(.DivTok) & " ")
418  IF .DivTok THEN Code(LCASE(.SubStr(.DivTok)) & " ")
419 
420  SELECT CASE AS CONST *.FunTok
421  CASE .TOK_CTOR
422  IF .NamTok THEN Code(.SubStr(.NamTok) & "::" & .SubStr(.NamTok)) ELSE _
423  Code(.BlockNam)
424  CASE .TOK_DTOR
425  IF .NamTok THEN Code(.SubStr(.NamTok) & "::~" & .SubStr(.NamTok)) ELSE _
426  Code("~" & .BlockNam)
427  CASE ELSE
428  Code(.SubStr(.FunTok))
429  IF .CalTok THEN Code("_" & .SubStr(.CalTok))
430  IF .AliTok THEN Code("_" & .SubStr(.AliTok))
431  IF .TypTok ANDALSO .As_Tok THEN _
432  Code("_" & .SubStr(.As_Tok) & "_")
433  cppCreateTypNam(P)
434  END SELECT : IF 0 = .ParTok THEN Code("(void)") : EXIT SUB
435 
436  emit_comments(P, .ParTok[1])
437  Code(" (")
438  .parseListPara(@cppEntryListParameter())
439  IF .ListCount <= 0 THEN Code(")")
440  END WITH
441 END SUB
442 
443 
444 
456 SUB cCreateFunction CDECL(BYVAL P AS Parser PTR)
457  WITH *P '&Parser* P;
458  IF .DivTok THEN Code(.SubStr(.DivTok) & " ")
459 
460  SELECT CASE AS CONST *.FunTok
461  CASE .TOK_CTOR
462  Code(.SubStr(.FunTok) & " ")
463  IF .NamTok THEN Code(.SubStr(.NamTok) & "." & .SubStr(.NamTok)) _
464  ELSE Code(.BlockNam)
465  CASE .TOK_DTOR
466  Code(.SubStr(.FunTok) & " ")
467  IF .NamTok THEN Code(.SubStr(.NamTok) & "." & .SubStr(.NamTok)) _
468  ELSE Code(.BlockNam)
469  CASE ELSE
470  IF 0 = .TypTok THEN Code("void ")
471  cCreateTypNam(P)
472  END SELECT : IF 0 = .ParTok THEN Code("(void)") : EXIT SUB
473 
474  emit_comments(P, .ParTok[1])
475  Code(" (")
476  .parseListPara(@cEntryListParameter())
477  IF .ListCount <= 0 THEN Code("void)")
478  END WITH
479 END SUB
480 
481 
482 
491 SUB emit_error CDECL(BYVAL P AS Parser PTR)
492  WITH *P '&Parser* P;
493  SELECT CASE AS CONST OPT->RunMode
494  CASE OPT->GEANY_MODE ': EXIT SUB ' or shall we output?
495  Code(NL & "'!!! " & PROJ_NAME & .ErrMsg & "!" & NL)
496  CASE ELSE
497  ERROUT("==> " & PROJ_NAME & .ErrMsg & "!")
498  END SELECT
499  END WITH
500 END SUB
501 
502 
503 
513 SUB emit_source CDECL(BYVAL P AS Parser PTR, BYVAL E AS INTEGER)
514  WITH *P '&Parser* P;
515  DO : IF E > 0 THEN E -= 1 ELSE EXIT SUB
516  LOOP UNTIL .Buf[E] = ASC(!"\n")
517  VAR a = .SrcBgn, l = E - a : .SrcBgn = E + 1
518  Code(MID(.Buf, a + 1, l + 1))
519  END WITH
520 END SUB
521 
522 
523 
530 SUB geany_init CDECL(BYVAL P AS Parser PTR)
531  P->SrcBgn = 0
532 END SUB
533 
534 
535 
542 SUB geany_exit CDECL(BYVAL P AS Parser PTR)
543  WITH *P '&Parser* P;
544  Code(MID(.Buf, .SrcBgn + 1))
545  END WITH
546 END SUB
547 
548 
549 '/'* \brief Emitter with no action, to initialize the interface
550 '\param P the parser calling this handler '/
551 'SUB null_emitter CDECL(BYVAL P AS Parser PTR) : END SUB
552