fbdoc  1.0.1
FreeBASIC documentation tool
fbdoc_doxyfile.bas
Go to the documentation of this file.
1 
12 
13 #INCLUDE ONCE "fbdoc_doxyfile.bi"
14 #INCLUDE ONCE "fbdoc_options.bi"
15 
16 
17 '#DEFINE PULL_TAG(_N_) IF LEN(d->Tags(_N_)) THEN Tags(_N_) = MKI(aa) & d->Tag(_N_)
18 
19 #DEFINE GET_TAG(_N_) t = Search(#_N_, a) : IF LEN(t) ANDALSO a > CVI(LEFT(Tags(_N_), LEN(INTEGER))) THEN Tags(_N_) = MKI(a) & t
20 
21 
35 CONSTRUCTOR DoxyUDT(BYREF Fnam AS STRING)
36  MSG_LINE("Doxyfile " & Fnam)
37  VAR fnr = FREEFILE
38  IF OPEN(Fnam FOR INPUT AS fnr) THEN Errr = "error (couldn't open)" : EXIT CONSTRUCTOR
39 
40  Length = LOF(fnr)
41  Buffer = ALLOCATE(Length + 1)
42  IF 0 = Buffer THEN Errr = "error (out of memory)" : CLOSE #fnr : Length = 0 : EXIT CONSTRUCTOR
43 
44  VAR bytes_red = 0
45  GET #fnr, 1, *Buffer, Length, bytes_red
46  IF Length <> bytes_red THEN
47  Errr = "read error (read " & bytes_red & " of " & Length & " bytes)" : CLOSE #fnr : Length = 0 : EXIT CONSTRUCTOR
48  END IF
49 
50  CLOSE #fnr
51  Buffer[bytes_red] = 0
52  Doxy = CAST(ZSTRING PTR, Buffer)
53 
54  VAR aa = INSTR(*Doxy, "@INCLUDE"), a = aa, t = ""
55  WHILE a
56  a += 9
57  VAR e = INSTR(a, *Doxy, !"\n")
58  VAR d = NEW DoxyUDT(TRIM(MID(*Doxy, a, e - a), ANY !"= \v\t\\"))
59  FOR i AS long = 0 TO ubound(d->Tags) ' transfer tags one level up, new position a
60  IF LEN(d->Tags(i)) THEN Tags(i) = MKI(a) & d->Tag(i)
61  NEXT
62  DELETE d
63  a = INSTR(e + 1, *Doxy, "@INCLUDE")
64  WEND
65 
66  GET_TAG(GENERATE_HTML)
67  GET_TAG(SOURCE_BROWSER)
68  GET_TAG(STRIP_CODE_COMMENTS)
69  GET_TAG(GENERATE_LATEX)
70  GET_TAG(LATEX_SOURCE_CODE)
71  GET_TAG(GENERATE_XML)
72  GET_TAG(XML_PROGRAMLISTING)
73  t = Search("INPUT", a) : IF LEN(t) ANDALSO a > CVI(LEFT(Tags(INPUT_TAG), LEN(INTEGER))) THEN Tags(INPUT_TAG) = MKI(a) & t
74  GET_TAG(RECURSIVE)
75  GET_TAG(OUTPUT_DIRECTORY)
76  GET_TAG(HTML_OUTPUT)
77  GET_TAG(HTML_FILE_EXTENSION)
78  GET_TAG(CREATE_SUBDIRS)
79  GET_TAG(LATEX_OUTPUT)
80  GET_TAG(XML_OUTPUT)
81 END CONSTRUCTOR
82 
83 
88 DESTRUCTOR DoxyUDT()
89  IF Buffer THEN DEALLOCATE(Buffer)
90 END DESTRUCTOR
91 
92 
93 
103 PROPERTY DoxyUDT.Tag(BYVAL I AS INTEGER) AS STRING
104  RETURN MID(Tags(I), LEN(INTEGER) + 1)
105 END PROPERTY
106 
107 
108 
118 PROPERTY DoxyUDT.Flag(BYVAL I AS INTEGER) AS BYTE
119  SELECT CASE UCASE(MID(Tags(I), LEN(INTEGER) + 1))
120  CASE "YES", "Y", "TRUE" : RETURN 1
121  END SELECT : RETURN 0
122 END PROPERTY
123 
124 
125 
141 FUNCTION DoxyUDT.Search(BYREF Su AS STRING, BYREF Po AS INTEGER) AS STRING
142  VAR i = Length - 1 _
143  , l = 0 _
144  , p = 0 _
145  , lsu = LEN(Su)
146  Po = 0
147  FOR i = i TO 0 STEP -1
148  SELECT CASE AS CONST Doxy[i]
149  CASE ASC(!"\n") : IF 0 = l THEN Po = 0 : p = i : CONTINUE FOR
150  CASE ASC(!"\r"), ASC(!"\t"), ASC(!"\v"), ASC(" ")
151  IF 0 = l THEN CONTINUE FOR
152  CASE ASC("=") : Po = i : CONTINUE FOR
153  CASE ASC("A") TO ASC("Z"), ASC("a") TO ASC("z"), ASC("0") TO ASC("9"), ASC("_"), ASC("@")
154  l += IIF(Po, 1, 0) : CONTINUE FOR
155  CASE ELSE : CONTINUE FOR
156  END SELECT
157  IF l = lsu ANDALSO MID(*Doxy, i + 2, lsu) = Su THEN EXIT FOR
158  l = 0 : Po = 0 : IF Doxy[i] = ASC(!"\n") THEN p = i
159  NEXT
160  IF Po = 0 ORELSE l = 0 THEN RETURN ""
161  IF i < 0 ANDALSO (l <> lsu ORELSE MID(*Doxy, i + 2, lsu) <> Su) THEN RETURN ""
162  RETURN TRIM(MID(*Doxy, Po + 2, p - Po - 1), ANY !" \t\v\\")
163 END FUNCTION
164 
165