fb-doc  0.4.0
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("/*!")
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 OPT->Asterix THEN Code("* ")
65  CASE ASC("'")
66  SELECT CASE AS CONST .Buf[i + 1]
67  CASE 0 : EXIT SUB
68  CASE ASC("/") : i += 1 : EXIT DO
69  END SELECT
70  END SELECT : i += 1
71  LOOP
72  IF c THEN Code(MID(.Buf, c + 1, i - c - 1) & "*/")
73  END SELECT : i += 1
74  WEND : IF .SrcBgn < i THEN .SrcBgn = i
75  END WITH
76 END SUB
77 
78 
79 
88 SUB cppNam CDECL(BYVAL P AS Parser PTR)
89  WITH *P '&Parser* P;
90  VAR t = .NamTok
91  Code(.SubStr(t))
92  WHILE t < .EndTok
93  t += 3
94  SELECT CASE AS CONST *t
95  CASE .TOK_DOT : Code("::")
96  CASE .TOK_WORD : Code(.SubStr(t))
97  CASE ELSE : EXIT WHILE
98  END SELECT
99  WEND
100  END WITH
101 END SUB
102 
103 
104 
113 SUB cNam CDECL(BYVAL P AS Parser PTR)
114  WITH *P '&Parser* P;
115  FOR i AS INTEGER = 1 TO .PtrCount : Code("*") : NEXT
116  VAR t = .NamTok, a = t[1], l = t[2]
117  WHILE t < .EndTok
118  t += 3
119  SELECT CASE AS CONST *t
120  CASE .TOK_DOT, .TOK_WORD : l += t[2]
121  CASE ELSE : EXIT WHILE
122  END SELECT
123  WEND : Code(MID(.Buf, a + 1, l))
124  END WITH
125 END SUB
126 
127 
128 
135 SUB CreateIni CDECL(BYVAL P AS Parser PTR)
136  WITH *P '&Parser* P;
137  VAR kl = 0, i = .IniTok[1], a = i, e = 0, atc = 0
138  Code(" ")
139  DO
140  i += 1
141  SELECT CASE AS CONST .Buf[i]
142  CASE 0 : EXIT DO
143  CASE ASC(!"\n")
144  Code(MID(.Buf, a + 1, IIF(e, e, i) - a))
145  a = i + 1
146  IF kl <= 0 ANDALSO (e = 0 ORELSE .Buf[e] <> ASC("_")) THEN EXIT SUB
147  emit_comments(P, i)
148  e = 0
149  CASE ASC("@")
150  IF kl <= 0 THEN atc = i
151  CASE ASC("_")
152  IF .Buf[i + 1] < ASC("0") ANDALSO .Buf[i - 1] < ASC("0") THEN e = IIF(e, e, i)
153  CASE ASC("'")
154  e = IIF(e, e, i)
155  CASE ASC("/")
156  IF .Buf[i + 1] = ASC("'") THEN e = IIF(e, e, i)
157  CASE ASC("""")
158  VAR esc = IIF(.Buf[i - 1] = ASC("!"), 1, 0)
159  IF atc THEN .Buf[atc] = ASC(" ")
160  DO
161  i += 1
162  SELECT CASE AS CONST .Buf[i]
163  CASE 0, ASC(!"\n") : i -= 1 : EXIT DO
164  CASE ASC("\") : IF esc THEN i += 1
165  CASE ASC("""") : IF .Buf[i + 1] = ASC("""") THEN i += 1 ELSE EXIT DO
166  END SELECT
167  LOOP
168  CASE ASC("("), ASC("{"), ASC("[") : kl += 1
169  CASE ASC(")"), ASC("}"), ASC("]") : kl -= 1 : IF kl < 0 THEN EXIT DO
170  CASE ASC(",") : IF kl <= 0 THEN EXIT DO
171  END SELECT
172  LOOP UNTIL i >= .EndTok[1] : IF i <= a THEN EXIT SUB
173  Code(MID(.Buf, a + 1, IIF(e, e, i) - a))
174  IF atc THEN .Buf[atc] = ASC("@")
175  END WITH
176 END SUB
177 
178 
179 
187 SUB cArrDim CDECL(BYVAL P AS Parser PTR)
188  WITH *P '&Parser* P;
189  VAR t = .DimTok, kl = 0
190  DO
191  SELECT CASE AS CONST *t
192  CASE .TOK_COMMA
193  SELECT CASE AS CONST t[-3]
194  CASE .TOK_3DOT, .TOK_ANY : Code("][")
195  CASE ELSE : Code(" + 1][")
196  END SELECT
197  CASE .TOK_BROPN : kl += 1 : Code("[")
198  IF t[3] = .TOK_COMMA ORELSE t[3] = .TOK_BRCLO THEN _
199  Code(MID(.Buf, t[1] + 2, t[4] - t[1] - 1))
200  CASE .TOK_BRCLO : kl -= 1
201  SELECT CASE AS CONST t[-3]
202  CASE .TOK_3DOT, .TOK_ANY : Code("]")
203  CASE ELSE : Code(" + 1]")
204  END SELECT
205  IF kl <= 0 THEN EXIT DO
206  CASE ELSE : Code(.SubStr(t))
207  END SELECT : t += 3
208  LOOP UNTIL t >= .EndTok
209  END WITH
210 END SUB
211 
212 
213 
237 SUB cppCreateTypNam CDECL(BYVAL P AS Parser PTR)
238  WITH *P '&Parser* P;
239  IF .TypTok THEN
240  IF .ShaTok THEN Code(.SubStr(.ShaTok) & "_")
241  IF .Co1Tok THEN Code(.SubStr(.Co1Tok) & "_")
242  Code(.SubStr(.TypTok))
243  IF .Co2Tok THEN Code("_" & .SubStr(.Co2Tok))
244  FOR i AS INTEGER = 1 TO .PtrCount
245  Code("_" & .SubStr(.PtrTok)) : NEXT
246  IF .NamTok THEN Code(" ") ELSE EXIT SUB
247  ELSE
248  Code(" ")
249  END IF
250 
251  IF .NamTok > .TypTok _
252  THEN emit_comments(P, .NamTok[1])
253 
254  IF .NamTok THEN cppNam(P)
255  IF .DimTok THEN cArrDim(P)
256  IF .BitTok THEN Code(.BitIni)
257  IF .IniTok THEN CreateIni(P)
258  END WITH
259 END SUB
260 
261 
262 
287 SUB cCreateTypNam CDECL(BYVAL P AS Parser PTR)
288  WITH *P '&Parser* P;
289  IF .TypTok THEN
290  IF .Co1Tok THEN Code("const ")
291 
292  SELECT CASE AS CONST *.TypTok
293  CASE .TOK_BYTE : Code("signed char")
294  CASE .TOK_UBYT : Code("unsigned char")
295  CASE .TOK_SHOR : Code("short")
296  CASE .TOK_USHO : Code("unsigned short")
297  CASE .TOK_STRI : Code("char*") ' ??? FB_STRING, g_string
298  CASE .TOK_SING : Code("float")
299  CASE .TOK_DOUB : Code("double")
300  CASE .TOK_ZSTR : Code("char")
301  CASE .TOK_WSTR : Code("wchar")
302  CASE .TOK_INT, .TOK_LONG : Code("int")
303  CASE .TOK_UINT, .TOK_ULNG : Code("unsigned int")
304  CASE .TOK_LINT : Code("LONG int")
305  CASE .TOK_ULIN : Code("unsigned LONG int")
306  CASE ELSE : Code(.SubStr(.TypTok))
307  END SELECT
308 
309  IF .Co2Tok THEN Code(" " & .SubStr(.Co2Tok))
310  IF .By_Tok ANDALSO *.By_Tok = .TOK_BYRE THEN .PtrCount += 1
311  IF .NamTok THEN Code(" ") ELSE EXIT SUB
312  END IF
313 
314  IF .NamTok > .TypTok _
315  THEN emit_comments(P, .NamTok[1])
316 
317  SELECT CASE AS CONST *.StaTok
318  CASE .TOK_TYPE, .TOK_DIM, .TOK_RDIM, .TOK_COMM, .TOK_EXRN
319  IF .FunTok THEN Code("(") : cNam(P) : Code(")") : EXIT SUB
320  END SELECT
321  IF .NamTok THEN cNam(P)
322  IF .BitTok THEN Code(.BitIni)
323  IF .DimTok THEN cArrDim(P) ': Code()
324  IF .IniTok THEN CreateIni(P)
325  END WITH
326 END SUB
327 
328 
329 
341 SUB cppEntryListParameter CDECL(BYVAL P AS Parser PTR)
342  WITH *P '&Parser* P;
343  emit_comments(P, .Tk1[1])
344 
345  IF .FunTok THEN
346  IF .By_Tok THEN Code(.SubStr(.By_Tok) & "_")
347  IF .DivTok THEN Code("_" & .SubStr(.DivTok))
349  ELSEIF .TypTok THEN
350  IF .By_Tok THEN Code(.SubStr(.By_Tok) & "_")
351  Code(.SubStr(.As_Tok) & "_")
352  cppCreateTypNam(P)
353  ELSEIF *.NamTok = .TOK_3DOT THEN
354  Code("...)") : EXIT SUB
355  END IF
356 
357  IF *.CurTok <> .TOK_BRCLO THEN Code(", ") : EXIT SUB
358  emit_comments(P, .CurTok[1]) : Code(")")
359  END WITH
360 END SUB
361 
362 
363 
377 SUB cEntryListParameter CDECL(BYVAL P AS Parser PTR)
378  WITH *P '&Parser* P;
379  emit_comments(P, .Tk1[1])
380 
381  IF .FunTok THEN
382  cCreateFunction(P)
383  ELSEIF .TypTok THEN
384  cCreateTypNam(P)
385  ELSEIF .NamTok = .TOK_3DOT THEN
386  Code("...")
387  ELSE
388  Code("void")
389  END IF
390 
391  IF *.CurTok <> .TOK_BRCLO THEN Code(", ") : EXIT SUB
392  emit_comments(P, .CurTok[1]) : Code(")")
393  END WITH
394 END SUB
395 
396 
397 
408 SUB cppCreateFunction CDECL(BYVAL P AS Parser PTR)
409  WITH *P '&Parser* P;
410  'IF .DivTok THEN Code(.SubStr(.DivTok) & " ")
411  IF .DivTok THEN Code(LCASE(.SubStr(.DivTok)) & " ")
412 
413  SELECT CASE AS CONST *.FunTok
414  CASE .TOK_CTOR
415  IF .NamTok THEN Code(.SubStr(.NamTok) & "::" & .SubStr(.NamTok)) ELSE _
416  Code(.BlockNam)
417  CASE .TOK_DTOR
418  IF .NamTok THEN Code(.SubStr(.NamTok) & "::~" & .SubStr(.NamTok)) ELSE _
419  Code("~" & .BlockNam)
420  CASE ELSE
421  Code(.SubStr(.FunTok))
422  IF .CalTok THEN Code("_" & .SubStr(.CalTok))
423  IF .AliTok THEN Code("_" & .SubStr(.AliTok))
424  IF .TypTok ANDALSO .As_Tok THEN _
425  Code("_" & .SubStr(.As_Tok) & "_")
426  cppCreateTypNam(P)
427  END SELECT : IF 0 = .ParTok THEN Code("(void)") : EXIT SUB
428 
429  emit_comments(P, .ParTok[1])
430  Code(" (")
432  IF .ListCount <= 0 THEN Code(")")
433  END WITH
434 END SUB
435 
436 
437 
449 SUB cCreateFunction CDECL(BYVAL P AS Parser PTR)
450  WITH *P '&Parser* P;
451  IF .DivTok THEN Code(.SubStr(.DivTok) & " ")
452 
453  SELECT CASE AS CONST *.FunTok
454  CASE .TOK_CTOR
455  Code(.SubStr(.FunTok) & " ")
456  IF .NamTok THEN Code(.SubStr(.NamTok) & "." & .SubStr(.NamTok)) _
457  ELSE Code(.BlockNam)
458  CASE .TOK_DTOR
459  Code(.SubStr(.FunTok) & " ")
460  IF .NamTok THEN Code(.SubStr(.NamTok) & "." & .SubStr(.NamTok)) _
461  ELSE Code(.BlockNam)
462  CASE ELSE
463  IF 0 = .TypTok THEN Code("void ")
464  cCreateTypNam(P)
465  END SELECT : IF 0 = .ParTok THEN Code("(void)") : EXIT SUB
466 
467  emit_comments(P, .ParTok[1])
468  Code(" (")
470  IF .ListCount <= 0 THEN Code("void)")
471  END WITH
472 END SUB
473 
474 
475 
484 SUB emit_error CDECL(BYVAL P AS Parser PTR)
485  WITH *P '&Parser* P;
486  SELECT CASE AS CONST OPT->RunMode
487  CASE OPT->GEANY_MODE ': EXIT SUB ' or shall we output?
488  Code(NL & "'!!! " & PROJ_NAME & .ErrMsg & "!" & NL)
489  CASE ELSE
490  ERROUT("==> " & PROJ_NAME & .ErrMsg & "!")
491  END SELECT
492  END WITH
493 END SUB
494 
495 
496 
506 SUB emit_source CDECL(BYVAL P AS Parser PTR, BYVAL E AS INTEGER)
507  WITH *P '&Parser* P;
508  DO : IF E > 0 THEN E -= 1 ELSE EXIT SUB
509  LOOP UNTIL .Buf[E] = ASC(!"\n")
510  VAR a = .SrcBgn, l = E - a : .SrcBgn = E + 1
511  Code(MID(.Buf, a + 1, l + 1))
512  END WITH
513 END SUB
514 
515 
516 
523 SUB geany_init CDECL(BYVAL P AS Parser PTR)
524  P->SrcBgn = 0
525 END SUB
526 
527 
528 
535 SUB geany_exit CDECL(BYVAL P AS Parser PTR)
536  WITH *P '&Parser* P;
537  Code(MID(.Buf, .SrcBgn + 1))
538  END WITH
539 END SUB
540 
541 
542 '/'* \brief Emitter with no action, to initialize the interface
543 '\param P the parser calling this handler '/
544 'SUB null_emitter CDECL(BYVAL P AS Parser PTR) : END SUB
545