16 #DEFINE PULL_TAG(_N_) 
IF LEN(d->Tags(_N_)) 
THEN Tags(_N_) = 
MKI(aa) & d->Tag(_N_)
 
   18 #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
 
   34 CONSTRUCTOR DoxyUDT(
BYREF Fnam 
AS STRING)
 
   36   IF OPEN(Fnam 
FOR INPUT AS fnr) 
THEN Errr = 
"error (couldn't open)" : 
EXIT CONSTRUCTOR 
   39   Buffer = 
ALLOCATE(Length + 1)
 
   40   IF 0 = Buffer 
THEN Errr = 
"error (out of memory)" : 
CLOSE #fnr : Length = 0 : 
EXIT CONSTRUCTOR 
   43   GET #fnr, 1, *Buffer, Length, bytes_red
 
   44   IF Length <> bytes_red 
THEN 
   45     Errr = 
"read error (read " & bytes_red & 
" of " & Length & 
" bytes)" : 
CLOSE #fnr : Length = 0 : 
EXIT CONSTRUCTOR 
   50   Doxy = 
CAST(
ZSTRING PTR, Buffer)
 
   52   VAR aa = 
INSTR(*Doxy, 
"@INCLUDE"), a = aa, t = 
"" 
   55     VAR e = 
INSTR(a, *Doxy, !
"\n")
 
   56     VAR d = 
NEW DoxyUDT(
TRIM(
MID(*Doxy, a, e - a), 
ANY !
"= \v\t\\"))
 
   57     PULL_TAG(GENERATE_HTML)
 
   58     PULL_TAG(SOURCE_BROWSER)
 
   59     PULL_TAG(GENERATE_LATEX)
 
   60     PULL_TAG(LATEX_SOURCE_CODE)
 
   61     PULL_TAG(GENERATE_XML)
 
   62     PULL_TAG(XML_PROGRAMLISTING)
 
   65     PULL_TAG(OUTPUT_DIRECTORY)
 
   67     PULL_TAG(HTML_FILE_EXTENSION)
 
   68     PULL_TAG(CREATE_SUBDIRS)
 
   69     PULL_TAG(LATEX_OUTPUT)
 
   72     a = 
INSTR(e + 1, *Doxy, 
"@INCLUDE")
 
   75   GET_TAG(GENERATE_HTML)
 
   76   GET_TAG(SOURCE_BROWSER)
 
   77   GET_TAG(GENERATE_LATEX)
 
   78   GET_TAG(LATEX_SOURCE_CODE)
 
   80   GET_TAG(XML_PROGRAMLISTING)
 
   81   t = 
Search(
"INPUT", a) : 
IF LEN(t) 
ANDALSO a > 
CVI(
LEFT(Tags(INPUT_TAG), 
LEN(
INTEGER))) 
THEN Tags(INPUT_TAG) = 
MKI(a) & t
 
   83   GET_TAG(OUTPUT_DIRECTORY)
 
   85   GET_TAG(HTML_FILE_EXTENSION)
 
   86   GET_TAG(CREATE_SUBDIRS)
 
   97   IF Buffer 
THEN DEALLOCATE(Buffer)
 
  112   RETURN MID(Tags(I), 
LEN(
INTEGER) + 1)
 
  132 FUNCTION DoxyUDT.Search(
BYREF Su 
AS STRING, 
BYREF Po 
AS INTEGER) 
AS STRING 
  138   FOR i = i 
TO 0 STEP -1
 
  139     SELECT CASE AS CONST Doxy[i]
 
  140     CASE ASC(!
"\n") :        
IF 0 = l 
THEN Po = 0 : p = i : 
CONTINUE FOR 
  141     CASE ASC(!
"\r"), 
ASC(!
"\t"), 
ASC(!
"\v"), 
ASC(
" ")
 
  142                                               IF 0 = l 
THEN CONTINUE FOR 
  143     CASE ASC(
"=") : Po = i :                                
CONTINUE FOR 
  144     CASE ASC(
"A") 
TO ASC(
"Z"), 
ASC(
"a") 
TO ASC(
"z"), 
ASC(
"0") 
TO ASC(
"9"), 
ASC(
"_"), 
ASC(
"@")
 
  145       l += 
IIF(Po, 1, 0) :                                  
CONTINUE FOR 
  146     CASE ELSE :                                             
CONTINUE FOR 
  148     IF l = lsu 
ANDALSO MID(*Doxy, i + 2, lsu) = Su         
THEN EXIT FOR 
  149     l = 0 : Po = 0 : 
IF Doxy[i] = 
ASC(!
"\n") 
THEN p = i
 
  151   IF Po = 0 
ORELSE l = 0 
THEN RETURN "" 
  152   IF i < 0 
ANDALSO (l <> lsu 
ORELSE MID(*Doxy, i + 2, lsu) <> Su) 
THEN RETURN "" 
  153   RETURN TRIM(
MID(*Doxy, Po + 2, p - Po - 1), 
ANY !
" \t\v\\")