fbdoc  1.0.1
FreeBASIC documentation tool
fbdoc_emit_csource.bas
Go to the documentation of this file.
1 
16 
17 #INCLUDE ONCE "fbdoc_options.bi"
18 
19 
20 
21 DIM SHARED AS STRING LOFN
22 
23 
24 
31 SUB c_CTOR CDECL(BYVAL O AS Options PTR)
32  WITH *O
33  IF 0 = LEN(.LfnPnN) THEN .LfnPnN = .OutPath & LFN_FILE
34  MSG_LINE(.LfnPnN)
35  VAR fnr = FREEFILE
36  IF OPEN(.LfnPnN FOR INPUT AS #fnr) THEN
37  MSG_CONT("not present (List fo Function Names)")
38  ELSE
39  LOFN = STRING(LOF(fnr), 0)
40  GET #fnr, , LOFN
41  CLOSE #fnr
42  MSG_CONT("loaded")
43  END IF
44  END WITH
45 END SUB
46 
47 
48 
55 SUB c_Init CDECL(BYVAL P AS Parser PTR)
56  P->SrcBgn = 0
57 END SUB
58 
59 
60 
67 SUB c_exit CDECL(BYVAL P AS Parser PTR)
68  emit_comments(P, P->Fin)
69 END SUB
70 
71 
72 
82 SUB c_include CDECL(BYVAL P AS Parser PTR)
83  WITH *P '&Parser* P;
84  emit_comments(P, .Tk1[1])
85  VAR fnam = .SubStr(.NamTok)
86  IF OPT->Types = OPT->C_STYLE THEN
87  VAR i = INSTRREV(fnam, ".")
88  Code("#include " & LEFT(fnam, i))
89  IF LCASE(RIGHT(fnam, 4)) = ".bi""" THEN Code("h""") ELSE Code("c""")
90  ELSE
91  Code("#include " & fnam)
92  END IF
93  IF OPT->InTree THEN .Include(TRIM(fnam, """"))
94  END WITH
95 END SUB
96 
97 
98 
106 SUB c_defi_ CDECL(BYVAL P AS Parser PTR)
107  WITH *P '&Parser* P;
108  emit_comments(P, .Tk1[1])
109 
110  Code("#define ")
111  VAR e = .EndTok[1]
112  IF *.StaTok = .TOK_MACR THEN
113  VAR a = .NamTok[1], l = .CurTok[1] - a
114  Code(MID(.Buf, a + 1, l) & " /* (multi line FreeBASIC #MACRO) ")
115  a += l
116  Code(MID(.Buf, a + 1, e - a) & " */ ")
117  ELSE
118  VAR a = .NamTok[1], l = .DivTok[-2] + .DivTok[-1] - a
119  Code(MID(.Buf, a + 1, l))
120  a += l
121  l = e - a
122  IF l > 0 THEN Code(" /* " & MID(.Buf, a + 1, e - a) & " */")
123  END IF
124  .SrcBgn = e
125  END WITH
126 END SUB
127 
128 
129 
139 SUB c_func_ CDECL(BYVAL P AS Parser PTR) ' ToDo: internal function calls for diagrams
140  WITH *P '&Parser* P;
141  var futo = .FunTok, nato = .NamTok
142  emit_comments(P, .Tk1[1])
143 
144  OPT->CreateFunction(P)
145  Code(" {")
146 
147  IF LEN(LOFN) THEN
148  'VAR cfl = .TOK_CTOR = *futo ORELSE _
149  '.TOK_DTOR = *futo ORELSE _
150  '.TOK_DOT = nato[3]
151  VAR cna = UCASE(.SubStr(nato)) _
152  , wtype = "" _
153  , t = .CurTok _
154  , e = .EndTok - 6
155  WHILE t < e
156  SELECT CASE AS CONST *t
157  CASE .TOK_END
158  t += 3
159  IF *t = .TOK_WITH THEN wtype = ""
160  CASE .TOK_WITH
161  VAR p = t[1] + t[2]
162  t += 3
163  WHILE t < e
164  IF *t > .TOK_EOS andalso *t < .TOK_COMSL THEN t += 3 ELSE EXIT WHILE
165  WEND
166  wtype = TRIM(MID(.Buf, p + 2, *(t-2) + *(t-1) - p - 1))
167  IF wtype[0] = ASC("*") THEN wtype = MID(wtype, 2) & "->" ELSE wtype &= "."
168  CASE .TOK_BROPN
169  VAR a = *(t - 2) _
170  , l = *(t - 1) _
171  , g = 0
172  FOR i AS INTEGER = LEN(LOFN) - 2 TO 0 STEP -1
173  VAR x = a + l - 1
174  WHILE (.Buf[x] AND &b11011111) = (LOFN[i] AND &b11011111)
175  i -= 1
176  x -= 1
177  IF x < a THEN ' end of source word
178  VAR tt = t - 6
179  SELECT CASE AS CONST LOFN[i]
180  CASE ASC(LFN_SEP) : g = 0 : x += 2 ' global function `symbol()`
181  CASE ASC(".") ' member function `udtname.symbol()`
182  IF .Buf[x] = ASC(".") ORELSE .Buf[x] = ASC(">") THEN ' chain of one or more member functions
183  WHILE tt > .Tk1
184  IF *tt = .TOK_MEOP ORELSE *tt = .TOK_DOT _
185  THEN tt -= 3 ELSE tt += 3 : x = tt[1] + 1 : g = 0 : EXIT WHILE ' `symbol.symbol()`, `symbol->symbol()`
186  IF .Buf[tt[4] - 1] < ASC("A") THEN tt += 3 : x = tt[1] + 2 : g = 1 : EXIT WHILE ' .symbol()
187  IF *tt = .TOK_WORD THEN tt -= 3 ELSE tt += 6 : x = tt[1] + 1 : g = 1 : EXIT WHILE ' .symbol()
188  WEND
189  l += a - x + 1
190  ELSE ' no chain, just a single name
191  'IF 0 = cfl THEN EXIT WHILE
192  VAR z = i : i = INSTRREV(LOFN, LFN_SEP, z)
193  IF cna <> UCASE(MID(LOFN, i + 1, z - i)) THEN
194 'MSG_LINE(cna & " / " & MID(LOFN, i + 1, z - i) & " / " & MID(LOFN, z + 2, l))
195  if MID(LOFN, i + 1, z - i) <> MID(LOFN, z + 2, l) then EXIT WHILE
196  g = 1 : x += 2 : wtype = MID(.Buf, z, l) & "." ' CTOR
197  else
198  g = 0 : x += 2
199  END IF
200  END IF
201  CASE ELSE : EXIT WHILE ' no match
202  END SELECT
203  emit_comments(P, a)
204  IF g THEN Code(" " & wtype & MID(.Buf, x, l) & "();") _
205  ELSE Code(" " & MID(.Buf, x, l) & "();")
206  EXIT FOR
207  END IF
208  WEND
209 
210  WHILE i > 0 ANDALSO LOFN[i] <> ASC(LFN_SEP) : i -= 1 : WEND
211  NEXT
212  END SELECT : t += 3
213  WEND
214  END IF
215 
216  emit_comments(P, .EndTok[1] - 1)
217  Code("};")
218  END WITH
219 END SUB
220 
221 
222 
234 SUB c_decl_ CDECL(BYVAL P AS Parser PTR)
235  WITH *P '&Parser* P;
236  emit_comments(P, .Tk1[1])
237 
238  IF 0 = .ListCount THEN
239  SELECT CASE AS CONST *.StaTok
240  CASE .TOK_CONS : Code("const ")
241  CASE .TOK_STAT : Code("static ")
242  CASE .TOK_COMM : Code("common ")
243  CASE .TOK_EXRN : Code("extern ")
244  CASE .TOK_TYPE : Code("typedef ")
245  IF 0 = .FunTok ANDALSO .TypTok > .NamTok THEN Code("struct ")
246  END SELECT
247  END IF
248 
249  IF .FunTok THEN : OPT->CreateFunction(P)
250  ELSEIF .TypTok THEN : OPT->CreateVariable(P)
251  ELSE
252  IF 0 = .ListCount ANDALSO *.StaTok = .TOK_VAR THEN Code("VAR ")
253  Code(.SubStr(.NamTok))
254  IF .BitTok THEN Code(.BitIni)
255  IF .IniTok THEN CreateIni(P)
256  END IF
257  IF *.CurTok <= .TOK_EOS THEN Code(";") : EXIT SUB
258  IF .NamTok > .TypTok THEN Code(", ") _
259  ELSE Code("; ")
260  END WITH
261 END SUB
262 
263 
264 DECLARE SUB c_Block CDECL(BYVAL AS Parser PTR)
265 
266 
274 SUB cEntryBlockENUM CDECL(BYVAL P AS Parser PTR)
275  WITH *P '&Parser* P;
276  emit_comments(P, .Tk1[1])
277 
278  IF 0 = .ListCount THEN Code(STRING(.LevelCount * 2, " "))
279  Code(.SubStr(.NamTok))
280  IF .IniTok THEN CreateIni(P)
281  IF *.CurTok <> .TOK_END THEN Code(", ")
282  END WITH
283 END SUB
284 
285 
286 
294 SUB cEntryBlockTypeUnion CDECL(BYVAL P AS Parser PTR)
295  WITH *P '&Parser* P;
296  emit_comments(P, .Tk1[1])
297 
298  SELECT CASE AS CONST *.Tk1
299  CASE .TOK_PRIV : Code("private:")
300  CASE .TOK_PROT : Code("protected:")
301  CASE .TOK_PUBL : Code("public:")
302  CASE .TOK_ENUM, .TOK_UNIO, .TOK_TYPE, .TOK_CLAS : c_Block(P)
303  CASE ELSE
304  IF 0 = .ListCount THEN Code(STRING(.LevelCount * 2, " "))
305  IF *.Tk1 = .TOK_DECL THEN OPT->CreateFunction(P) : Code(";") : EXIT SUB
306  IF .FunTok THEN OPT->CreateFunction(P) _
307  ELSE OPT->CreateVariable(P)
308  IF *.CurTok <= .TOK_EOS THEN Code(";") : EXIT SUB
309  IF .NamTok > .TypTok THEN Code(",") ELSE Code("; ")
310  END SELECT
311  END WITH
312 END SUB
313 
314 
315 
325 SUB c_Block CDECL(BYVAL P AS Parser PTR)
326  WITH *P '&Parser* P;
327  emit_comments(P, .Tk1[1])
328 
329  IF .LevelCount THEN Code(STRING(.LevelCount * 2, " "))
330  SELECT CASE AS CONST IIF(.LevelCount, *.Tk1, *.StaTok)
331  CASE .TOK_TYPE, .TOK_CLAS
332  IF OPT->Types = OPT->FB_STYLE THEN
333  Code("class " & .BlockNam)
334  VAR t = .Tk1 + 3
335  IF *t = .TOK_EXDS THEN Code(" : public " & .SubStr(t + 3)) ' ToDo: parse list of names
336  Code("{ public:")
337  .parseBlockTyUn(@cEntryBlockTypeUnion())
338  .BlockNam = ""
339  ELSE
340  IF 0 = .LevelCount ANDALSO LEN(.BlockNam) THEN Code("typedef ")
341  Code("struct " & .BlockNam & "{")
342  .parseBlockTyUn(@cEntryBlockTypeUnion())
343  END IF
344  CASE .TOK_UNIO
345  IF 0 = .LevelCount ANDALSO LEN(.BlockNam) THEN Code("typedef ")
346  Code("union " & .BlockNam & "{")
347  .parseBlockTyUn(@cEntryBlockTypeUnion())
348  CASE .TOK_ENUM
349  IF 0 = .LevelCount ANDALSO LEN(.BlockNam) THEN Code("typedef ")
350  Code("enum " & .BlockNam & "{")
351  .parseBlockEnum(@cEntryBlockENUM())
352  CASE ELSE : Code("-???-")
353  END SELECT
354 
355  VAR fin = "}"
356  IF OPT->Types = OPT->C_STYLE ANDALSO LEN(.BlockNam) THEN
357  SELECT CASE AS CONST IIF(.LevelCount, *.Tk1, *.StaTok)
358  CASE .TOK_TYPE, .TOK_CLAS, .TOK_ENUM, .TOK_UNIO
359  fin &= " " & .BlockNam
360  END SELECT
361  END IF
362 
363  emit_comments(P, .Tk1[1])
364  IF .LevelCount THEN Code(STRING(.LevelCount * 2, " "))
365  Code(fin & ";")
366  END WITH
367 END SUB
368 
369 
370 
377 SUB init_csource(byval Emi as EmitterIF PTR)
378  WITH *Emi
379  .Error_ = @emit_error()
380 
381  .Defi_ = @c_defi_()
382  .Incl_ = @c_include()
383  .Func_ = @c_func_()
384  .Decl_ = @c_decl_()
385  .Enum_ = @c_Block()
386  .Unio_ = @c_Block()
387  .Clas_ = @c_Block()
388 
389  .Init_ = @c_Init()
390  .Exit_ = @c_exit()
391  .CTOR_ = @c_CTOR()
392  END WITH
393 END SUB
394 
395 
396