38   IF OPEN ERR (
AS #Efnr) 
THEN ?PROJ_NAME & 
": " & 
"couldn't open STDERR" : Efnr = 0 : 
EXIT CONSTRUCTOR 
   53   IF DllEmitter 
THEN DYLIBFREE(DllEmitter)
 
   73   IF LEN(
COMMAND(p)) 
ANDALSO LEFT(
COMMAND(p), 1) <> 
"-" THEN 
   75     SELECT CASE AS CONST ASC(
COMMAND(p))
 
   76     CASE ASC(
""""), 
ASC(
"'") : 
RETURN MID(
COMMAND(p), 2, 
LEN(
COMMAND(p)) - 2)
 
   77     END SELECT : 
RETURN COMMAND(p)
 
   78   END IF : Errr = 
", parameter expected [" & 
COMMAND(Idx) & 
"]" : 
RETURN "" 
  101   VAR i = 1, emi = 
"", par = 
"" 
  102   WHILE LEN(
COMMAND(i)) 
 
  103     SELECT CASE AS CONST ASC(
COMMAND(i))
 
  105       SELECT CASE COMMAND(i)
 
  106       CASE "-f", 
"--file-mode" 
  107         IF RunMode <> DEF_MODE 
THEN Errr &= 
", multiple run modes" : 
RETURN ERROR_MESSAGE
 
  110       CASE "-g", 
"--geany-mode" 
  111         IF RunMode <> DEF_MODE 
THEN Errr &= 
", multiple run modes" : 
RETURN ERROR_MESSAGE
 
  113         EmitTyp = GTK_DOC_TEMPLATES
 
  115       CASE "-l", 
"--list-mode" 
  116         IF RunMode <> DEF_MODE 
THEN Errr &= 
", multiple run modes" : 
RETURN ERROR_MESSAGE
 
  118         EmitTyp = FUNCTION_NAMES
 
  119       CASE "-s", 
"--syntax-mode" 
  120         IF RunMode <> DEF_MODE 
THEN Errr &= 
", multiple run modes" : 
RETURN ERROR_MESSAGE
 
  122         EmitTyp = SYNTAX_REPAIR
 
  124       CASE "-a", 
"--asterix" : Asterix = 1
 
  125       CASE "-c", 
"--cstyle" 
  129       CASE "-d", 
"--doc-comments" : Docom = 1
 
  130       CASE "-t", 
"--tree" : InTree = 1
 
  132       CASE "-e", 
"--emitter" 
  133         IF LEN(emi) 
THEN      Errr &= 
", multiple emitter setting" : 
RETURN ERROR_MESSAGE
 
  135         IF 0 = 
LEN(emi) 
THEN   Errr &= 
", invalid emitter setting" : 
RETURN ERROR_MESSAGE
 
  136       CASE "-o", 
"--outpath" 
  137         IF LEN(OutPath) 
THEN         Errr &= 
", multiple outpaths" : 
RETURN ERROR_MESSAGE
 
  139         IF 0 = 
LEN(OutPath) 
THEN       Errr &= 
", invalid outpath" : 
RETURN ERROR_MESSAGE
 
  140       CASE "-r", 
"--recursiv" : InRecursiv = 1
 
  142       CASE "-h", 
"--help" : 
RETURN HELP_MESSAGE
 
  143       CASE "-v", 
"--version" : 
RETURN VERSION_MESSAGE
 
  145       CASE ELSE : par &= !
"\t" & 
COMMAND(i)
 
  148       SELECT CASE AS CONST ASC(
COMMAND(i))
 
  149       CASE ASC(
""""), 
ASC(
"'")
 
  150                   InFiles &= 
MID(
COMMAND(i), 2, 
LEN(
COMMAND(i)) - 2) & !
"\n" 
  151       CASE ELSE : InFiles &= 
COMMAND(i) & !
"\n" 
  157   IF LEN(par) 
THEN Errr &= 
"unknown options '" & par & 
"'" 
  159   IF 0 = 
LEN(InFiles) 
ANDALSO RunMode = DEF_MODE 
THEN RunMode = HELP_MESSAGE
 
  161   RETURN IIF(
LEN(Errr), ERROR_MESSAGE, RunMode)
 
  191     CASE LEFT(          
"C_SOURCE", l) : EmitTyp = C_SOURCE
 
  192     CASE LEFT(     
"FUNCTIONNAMES", l) : EmitTyp = FUNCTION_NAMES
 
  193     CASE LEFT(   
"GTKDOCTEMPLATES", l) : EmitTyp = GTK_DOC_TEMPLATES
 
  194     CASE LEFT(  
"DOXYGENTEMPLATES", l) : EmitTyp = DOXYGEN_TEMPLATES
 
  195     CASE LEFT(
"SYNTAXHIGHLIGHTING", l) : EmitTyp = SYNTAX_REPAIR
 
  196     CASE ELSE : EmitTyp = EXTERNAL
 
  200   VAR r = 
NEW EmitterIF
 
  202   Errr &= 
", no plugin support on DOS platform!" 
  204   SELECT CASE AS CONST EmitTyp
 
  207     CASE GTK_DOC_TEMPLATES : 
init_gtk(r)
 
  211     DllEmitter = 
DYLIBLOAD(F)
 
  212     IF 0 = DllEmitter 
THEN Errr &= 
", couldn't load plugin " & F : 
EXIT SELECT 
  213     DIM ini 
AS FUNCTION CDECL(
BYVAL AS EmitterIF 
PTR, 
BYREF AS STRING) 
AS EmitterIF 
PTR _
 
  214           = 
DYLIBSYMBOL(DllEmitter, 
"EMITTERINIT") 
 
  215     IF 0 = ini 
THEN Errr &= 
", no EMITTERINIT function in emitter " & F : 
EXIT SELECT 
  216     EmitIF = ini(r, P) : EmitTyp = EXTERNAL
 
  236   VAR path_l = 
LEN(p), f = 
"" 
  237   IF LEN(Path) 
THEN p &= Path & SLASH
 
  239   IF InRecursiv > 0 
THEN 
  240     VAR res = 0, n = 
DIR(
"*", fbDirectory, res), t = 
"" 
  242       IF res = fbDirectory 
ANDALSO n <> 
"." ANDALSO n <> 
".." THEN t &= n & NL
 
  246     VAR a = 1, e = a, l = 
LEN(t)
 
  250       IF 0 = 
CHDIR(n) 
THEN f &= 
scanFiles(Patt, n) : 
CHDIR (
"..")
 
  255   VAR n = 
DIR(Patt), f_l = 
LEN(f)
 
  261   IF RunMode = FILE_MODE 
ANDALSO f_l > 
LEN(f) 
ANDALSO checkDir(OutPath & p) 
THEN f = 
"" 
  277 FUNCTION Options.addPath(
BYREF P1 
AS STRING, 
BYREF P2 
AS STRING) 
AS STRING 
  278   IF LEN(P1) 
ANDALSO RIGHT(P1, 1) <> SLASH 
THEN P1 &= SLASH
 
  279   IF 0 = 
LEN(P2) 
ORELSE P2 = 
"." THEN RETURN P1
 
  280   IF RIGHT(P2, 1) <> SLASH 
THEN P2 &= SLASH
 
  282   IF P2[0] = 
ASC(
"/") 
THEN RETURN P2
 
  284   IF MID(P2, 2, 1) = 
":" THEN RETURN P2
 
  286   VAR i = 
LEN(P1), s = 1
 
  287   WHILE MID(P2, s, 3) = *DirUp
 
  288     i = 
INSTRREV(P1, SLASH, i - 1) : 
IF 0 = i 
THEN RETURN MID(P2, s)
 
  291   IF MID(P2, s, 2) = 
MID(*DirUp, 2) 
THEN s += 2
 
  292   RETURN LEFT(P1, i) & 
MID(P2, s)
 
  306   VAR a = 1, e = a, l = 
LEN(P), cupa = 
CURDIR()
 
  308   IF LEFT(P, 1) = 
"/" THEN a = 2 : 
CHDIR(
"/")
 
  310   IF MID(P, 2, 1) = 
":" THEN a = 4 : 
CHDIR(
LEFT(P, 3))
 
  314     e = 
INSTR(a, P, SLASH) : 
IF e = 0 
THEN e = l + 1
 
  315     VAR n = 
MID(P, a, e - a)
 
  316     IF 0 = 
CHDIR(n) 
THEN a = e + 1 : 
CONTINUE DO 
  318     IF 0 = 
CHDIR(n) 
THEN a = e + 1 : 
CONTINUE DO 
  320   LOOP UNTIL a > l : 
CHDIR(cupa) : 
RETURN IIF(a > l, 0, 1)
 
  335   IF 0 = 
LEN(InFiles) 
THEN  
  336     SELECT CASE AS CONST RunMode
 
  337     CASE SYNT_MODE, LIST_MODE : InFiles = !
"Doxyfile\n" 
  338     CASE ELSE : InFiles = !
"*.bas\n*.bi\n" 
  342   IF 0 = 
LEN(OutPath) 
ANDALSO RunMode = FILE_MODE 
THEN 
  343     OutPath = 
".." & SLASH                 
 
  344     SELECT CASE AS CONST EmitTyp 
 
  345     CASE C_SOURCE      : OutPath &= 
"c_src" 
  346     CASE SYNTAX_REPAIR : OutPath &= 
"fb_html" 
  347     CASE ELSE          : OutPath &= 
"src" 
  350   OutPath = 
addPath(cupa, OutPath)
 
  352   IF RunMode = DEF_MODE 
THEN 
  354     OPEN CONS FOR OUTPUT AS #Ocha
 
  357   IF EmitIF->CTOR_ 
THEN EmitIF->CTOR_(@
THIS)
 
  362     , l = 
LEN(InFiles) - 1 
 
  365     SELECT CASE AS CONST InFiles[i]
 
  367     CASE ASC(
"*"), 
ASC(
"?") : inpat = 1
 
  368     CASE ASC(SLASH) : inslsh = i
 
  371         doFile(
MID(InFiles, a + 1, i - a))
 
  375           VAR path = 
MID(InFiles, a + 1, inslsh - a)
 
  377             ERROUT(
"couldn't change dir to " & path)
 
  379             IF InTree 
THEN StartPath = 
addPath(cupa, path)
 
  380             in_pattern = 
scanFiles(
MID(InFiles, inslsh + 2, i - inslsh - 1), 
"")
 
  383           in_pattern = 
scanFiles(
MID(InFiles, a + 1, i - a), 
"")
 
  386         VAR aa = 1, ee = aa, ll = 
LEN(in_pattern)
 
  388           ee = 
INSTR(aa + 1, in_pattern, !
"\n")
 
  389           doFile(
MID(in_pattern, aa, ee - aa))
 
  392         IF inslsh 
THEN CHDIR(cupa) : StartPath = cupa : inslsh = 0
 
  398   IF EmitIF->DTOR_ 
THEN EmitIF->DTOR_(@
THIS)
 
  399   SELECT CASE AS CONST RunMode
 
  400   CASE LIST_MODE : 
IF Ocha 
THEN CLOSE #Ocha : MSG_LINE(LFN_FILE) : MSG_CONT(
"written")
 
  401   CASE ELSE      : 
IF Ocha 
THEN CLOSE #Ocha
 
  415   SELECT CASE AS CONST RunMode
 
  418     Pars->File_(Fnam, InTree)
 
  419     IF LEN(
Pars->ErrMsg) 
THEN MSG_CONT(
Pars->ErrMsg)
 
  421     IF LCASE(
RIGHT(Fnam, 4)) = 
".bas" ORELSE _
 
  422        LCASE(
RIGHT(Fnam, 3)) = 
".bi" THEN 
  424       Pars->File_(Fnam, InTree)
 
  425       IF LEN(
Pars->ErrMsg) 
THEN MSG_CONT(
Pars->ErrMsg)
 
  427       VAR nix = 
NEW Highlighter(
Pars)
 
  432     IF LCASE(
RIGHT(Fnam, 4)) = 
".bas" ORELSE _
 
  433        LCASE(
RIGHT(Fnam, 3)) = 
".bi" THEN 
  435         MSG_LINE(OutPath & LFN_FILE)
 
  437         IF 0 = Ocha 
THEN MSG_CONT(
"error (couldn't write)") : 
EXIT SUB 
  441       Pars->File_(Fnam, InTree)
 
  442       IF LEN(
Pars->ErrMsg) 
THEN MSG_CONT(
Pars->ErrMsg)
 
  446     VAR doxy = 
NEW DoxyUDT(Fnam) _
 
  447       , recu = InRecursiv _
 
  452     IF 0 = doxy->Length 
THEN 
  453       MSG_CONT(doxy->Errr) : 
DELETE doxy
 
  455       IF CHDIR(Fnam) 
THEN MSG_CONT(
"error (couldn't change directory)") : 
EXIT SUB 
  456       doxy = 
NEW DoxyUDT(
"Doxyfile")
 
  457       IF 0 = doxy->Length 
THEN MSG_CONT(doxy->Errr) : 
DELETE doxy : 
EXIT SUB 
  460     InRecursiv = 
IIF(doxy->Tag(RECURSIVE) = 
"YES", 1, 0)
 
  461     VAR in_path = 
addPath(StartPath, doxy->Tag(INPUT_TAG))
 
  463     IF CHDIR(in_path) 
THEN 
  464       MSG_CONT(
"error (couldn't change to " & in_path & 
")")
 
  467       IF 0 = 
LEN(patt) 
THEN 
  468         MSG_CONT(
"error (no input files in " & in_path & 
")")
 
  470         MSG_CONT(
"scanned") _
 
  472         MSG_LINE(StartPath & LFN_FILE)
 
  475           MSG_CONT(
"error (couldn't write)")
 
  478           VAR a = 1, e = a, l = 
LEN(patt)
 
  480             e = 
INSTR(a + 1, patt, !
"\n")
 
  481             Pars->File_(
MID(patt, a, e - a), InTree)
 
  482             MSG_LINE(
MID(patt, a, e - a)) : MSG_CONT(
"scanned")
 
  485           CLOSE #Ocha : MSG_LINE(StartPath & LFN_FILE) : MSG_CONT(
"written")
 
  495     STATIC AS STRING out_name
 
  496     VAR a = 1, i = 
INSTRREV(Fnam, 
".")
 
  497     out_name = 
LEFT(Fnam, i)
 
  500     IF LEFT(out_name, 1) = 
"/" THEN a = 2
 
  502     IF MID(out_name, 2, 1) = 
":" THEN a = 2 : out_name[1] = out_name[0]
 
  504     WHILE MID(out_name, a, 3) = *DirUp
 
  507     IF MID(out_name, a, 2) = 
MID(*DirUp, 2) 
THEN a += 2
 
  508     out_name = 
MID(out_name, a)
 
  510     VAR path = OutPath & 
LEFT(out_name, 
INSTRREV(out_name, SLASH))
 
  512       ERROUT(
"couldn't create directory " & path)
 
  514       out_name = OutPath & out_name & *
IIF(
RIGHT(FNam, 3) = 
".bi", @
"h", @
"c")
 
  516       IF OPEN(out_name 
FOR OUTPUT AS #Ocha) 
THEN 
  517         ERROUT(
"couldn't write " & out_name)
 
  519         Pars->File_(Fnam, InTree)
 
  521         MSG_LINE(Fnam) : 
IF LEN(
Pars->ErrMsg) 
THEN MSG_CONT(
Pars->ErrMsg)