fbdoc  1.0.1
FreeBASIC documentation tool
fbdoc_emit_syntax.bas
Go to the documentation of this file.
1 
21 
22 #INCLUDE ONCE "fbdoc_emit_syntax.bi"
23 #INCLUDE ONCE "fbdoc_options.bi"
24 #INCLUDE ONCE "fbdoc_version.bi"
25 #INCLUDE ONCE "fbdoc_doxyfile.bi"
26 
27 
28 
43 FUNCTION RepData.add(BYREF S AS STRING, BYREF R AS STRING) AS ZSTRING PTR
44  IF S = "" THEN RETURN 0
45  IF INSTR(S, ANY !"\000\001\002") THEN RETURN @"undefined char (search)"
46  VAR c = CHR(1) & S & CHR(2) : IF INSTR(5, I, c) THEN RETURN @"already defined"
47  *CAST(LONG PTR, SADD(I)) += 1 : I &= MID(c, 2) & HEX(LEN(O) + 4) & CHR(1)
48  O &= MKl(0) & R & CHR(0) : RETURN 0
49 END FUNCTION
50 
51 
62 FUNCTION RepData.rep(BYREF S AS STRING) AS ZSTRING PTR
63  VAR a = INSTR(I, CHR(1) & S & CHR(2)) : IF a THEN a += LEN(S) + 2 ELSE RETURN SADD(S)
64  VAR e = INSTR(a, I, CHR(1)) + 1
65  DIM AS ZSTRING PTR z = SADD(O) + VALINT("&h" & MID(I, a, e - a))
66  *CAST(LONG PTR, z - 4) += 1 : RETURN z
67 END FUNCTION
68 
69 
70 
81 FUNCTION html_specials(BYVAL T AS UBYTE PTR, BYVAL A AS INTEGER, BYVAL L AS INTEGER) AS STRING
82  STATIC AS STRING r
83  r = ""
84  FOR i AS INTEGER = A TO A + L - 1
85  SELECT CASE AS CONST T[i]
86  CASE ASC("&") : r &= "&"
87  CASE ASC("<") : r &= "&lt;"
88  CASE ASC(">") : r &= "&gt;"
89  CASE ASC("""") : r &= "&quot;"
90  CASE ELSE : r &= CHR(T[i])
91  END SELECT
92  NEXT
93  RETURN r
94 END FUNCTION
95 
96 
107 FUNCTION tex_specials(BYVAL T AS UBYTE PTR, BYVAL A AS INTEGER, BYVAL L AS INTEGER) AS STRING
108  STATIC AS STRING r
109  r = ""
110  FOR i AS INTEGER = A TO A + L - 1
111  SELECT CASE AS CONST T[i]
112  CASE ASC("\") : r &= "\(\backslash\)"
113  CASE ASC("#") : r &= "\#"
114  CASE ASC("%") : r &= "\%"
115  CASE ASC("_") : r &= "\_"
116  CASE ASC("{") : r &= "\{"
117  CASE ASC("}") : r &= "\}"
118  CASE ELSE : r &= CHR(T[i])
119  END SELECT
120  NEXT
121  RETURN r
122 END FUNCTION
123 
124 
135 FUNCTION xml_specials(BYVAL T AS UBYTE PTR, BYVAL A AS INTEGER, BYVAL L AS INTEGER) AS STRING
136  STATIC AS STRING r
137  r = ""
138  FOR i AS INTEGER = A TO A + L - 1
139  SELECT CASE AS CONST T[i]
140  CASE ASC("&") : r &= "&amp;"
141  CASE ASC("<") : r &= "&lt;"
142  CASE ASC(">") : r &= "&gt;"
143  CASE ASC("""") : r &= "&quot;"
144  CASE ASC("'") : r &= "&apos;"
145  CASE ASC(" ") : r &= "<sp/>"
146  CASE ELSE : r &= CHR(T[i])
147  END SELECT
148  NEXT
149  RETURN r
150 END FUNCTION
151 
152 
153 
167 FUNCTION html_eol(BYVAL Symb AS RepData PTR, BYREF Nr AS INTEGER) AS STRING
168  IF Nr = 0 THEN RETURN "</div>"
169  VAR r = "<div class=""line"">", nstr = RIGHT(" " & Nr, 5)
170  IF Symb THEN
171  r &= "<a name=""l" & RIGHT("0000" & Nr, 5) & """></a>"
172  VAR res = Symb->rep(nstr)
173  IF res = SADD(nstr) THEN r &= "<span class=""lineno"">" & nstr _
174  ELSE r &= "<span class=""lineno"">" & *res
175  ELSE
176  r &= "<span class=""lineno"">" & nstr
177  END IF
178  Nr += 1
179  IF Nr = 2 THEN RETURN r & "</span>&#160;"
180  RETURN !"</div>" & NL & r & "</span>&#160;"
181 END FUNCTION
182 
183 
197 FUNCTION tex_eol(BYVAL Symb AS RepData PTR, BYREF Nr AS INTEGER) AS STRING
198  IF Nr = 0 THEN RETURN ""
199  VAR r = "" _
200  , nstr = RIGHT("0000" & Nr, 5) _
201  , res = IIF(Symb, Symb->rep(nstr), SADD(nstr))
202  IF res = SADD(nstr) THEN r &= nstr _
203  ELSE r &= *res
204  Nr += 1
205  IF Nr = 2 THEN RETURN r & " "
206  RETURN NL & r & " "
207 END FUNCTION
208 
209 
223 FUNCTION xml_eol(BYVAL Symb AS RepData PTR, BYREF Nr AS INTEGER) AS STRING
224  IF Nr = 0 THEN RETURN "</codeline>"
225  VAR r = "<codeline lineno=""" _
226  , nstr = "" & Nr _
227  , res = IIF(Symb, Symb->rep(nstr), SADD(nstr))
228  IF res = SADD(nstr) THEN r &= nstr &""">" _
229  ELSE r = *res
230  Nr += 1
231  IF Nr = 2 THEN RETURN r
232  RETURN "</codeline>" & NL & r
233 END FUNCTION
234 
235 
236 
243 CONSTRUCTOR Highlighter(BYVAL P AS Parser PTR)
244  Pars = P
245  Pars->UserTok = CAST(LONG PTR, @THIS)
246 END CONSTRUCTOR
247 
248 
249 
260 SUB Highlighter.doDoxy(BYREF Fnam AS STRING)
261  MSG_END(PROJ_NAME & " syntax highlighting")
262  Var doxy = NEW DoxyUDT(Fnam) _
263  , recu = OPT->InRecursiv _
264  , tree = OPT->InTree
265 
266  WHILE doxy->Length
267  GenHtm = doxy->Flag(GENERATE_HTML) AND _
268  doxy->Flag(SOURCE_BROWSER)
269  GenTex = doxy->Flag(GENERATE_LATEX) AND _
270  doxy->Flag(LATEX_SOURCE_CODE)
271  GenXml = doxy->Flag(GENERATE_XML) AND _
272  doxy->Flag(XML_PROGRAMLISTING)
273 
274  IF GenAny THEN MSG_CONT("parsed") _
275  ELSE MSG_CONT("nothing to do") : EXIT WHILE
276 
277  FbPath = doxy->Tag(INPUT_TAG)
278  OPT->InRecursiv = doxy->Flag(RECURSIVE)
279  OPT->DoCom = IIF(OPT->DoCom, OPT->DoCom _
280  , IIF(LEN(doxy->Tags(STRIP_CODE_COMMENTS)), 1-doxy->Flag(STRIP_CODE_COMMENTS), 0))
281 
282  MSG_LINE("FB source " & FbPath)
283  CHDIR(OPT->StartPath)
284  IF CHDIR(FbPath) THEN MSG_CONT("error (couldn't change directory)") : EXIT WHILE
285  FbFiles = NL & OPT->scanFiles("*.bas", "") _
286  & OPT->scanFiles("*.bi", "")
287  IF LEN(FbFiles) > 1 THEN MSG_CONT("scanned") _
288  ELSE MSG_CONT("error (no FB source files)") : EXIT WHILE
289  FbPath = OPT->addPath(OPT->StartPath, FbPath)
290 
291  OPT->InTree = 0
292  InPath = OPT->addPath(OPT->StartPath, doxy->Tag(OUTPUT_DIRECTORY))
293  IF GenHtm THEN
294  HtmlPath = OPT->addPath(InPath, doxy->Tag(HTML_OUTPUT))
295  HtmlSuff = doxy->Tag(HTML_FILE_EXTENSION)
296  IF 0 = LEN(HtmlSuff) THEN HtmlSuff = ".html"
297  OPT->InRecursiv = doxy->Flag(CREATE_SUBDIRS)
298  CHDIR(OPT->StartPath)
299  MSG_LINE("HTML source " & LEFT(HtmlPath, LEN(HtmlPath) - 1))
300  IF CHDIR(HtmlPath) THEN
301  MSG_CONT("error (couldn't change directory)")
302  ELSE
303  DoxyFiles = OPT->scanFiles("*_8bas_source" & HtmlSuff, "") _
304  & OPT->scanFiles("*_8bi_source" & HtmlSuff, "")
305 
306  IF LEN(DoxyFiles) > 1 THEN MSG_CONT("scanned") : do_files() _
307  ELSE MSG_CONT("scanned (no files)")
308  END IF '&html_eol();html_specials();Highlighter::prepare_html();
309  END IF
310  OPT->InRecursiv = 0
311  IF GenTex THEN
312  TexPath = OPT->addPath(InPath, doxy->Tag(LATEX_OUTPUT))
313  MSG_LINE("LaTeX source " & LEFT(TexPath, LEN(TexPath) - 1))
314  CHDIR(OPT->StartPath)
315  IF CHDIR(TexPath) THEN
316  MSG_CONT("error (couldn't change directory)")
317  ELSE
318  DoxyFiles = OPT->scanFiles("*_8bas_source.tex", "") _
319  & OPT->scanFiles("*_8bi_source.tex", "")
320  IF LEN(DoxyFiles) > 1 THEN
321  MSG_CONT("scanned")
322  FBDOC_MARK = @"%%% Syntax-highlighting by fbdoc %%%"
323  KEYW_A = @"\textcolor{keyword}{"
324  KWTP_A = @"\textcolor{keywordtype}{"
325  KWFL_A = @"\textcolor{keywordflow}{"
326  PREP_A = @"\textcolor{preprocessor}{"
327  CMNT_A = @"\textcolor{comment}{"
328  SPAN_E = @"}"
329  QUOT_A = @"\textcolor{stringliteral}{"""
330  QUOT_E = @"""}"
331  eol = @tex_eol()
332  special_chars = @tex_specials()
333  prepare = @prepare_tex()
334  do_files()
335  ELSE
336  MSG_CONT("scanned (no files)")
337  END IF
338  END IF
339  END IF '&tex_eol(); tex_specials(); Highlighter::prepare_tex();
340  IF GenXml THEN
341  XmlPath = OPT->addPath(InPath, doxy->Tag(XML_OUTPUT))
342  MSG_LINE("XML source " & LEFT(XmlPath, LEN(XmlPath) - 1))
343  CHDIR(OPT->StartPath)
344  IF CHDIR(XmlPath) THEN
345  MSG_CONT("error (couldn't change directory)")
346  ELSE
347  DoxyFiles = OPT->scanFiles("*_8bas.xml", "") _
348  & OPT->scanFiles("*_8bi.xml", "")
349  IF LEN(DoxyFiles) > 1 THEN
350  MSG_CONT("scanned")
351  FBDOC_MARK = @"<!-- Syntax-highlighting by fbdoc -->"
352  KEYW_A = @"<highlight class=""keyword"">"
353  KWTP_A = @"<highlight class=""keywordtype"">"
354  KWFL_A = @"<highlight class=""keywordflow"">"
355  PREP_A = @"<highlight class=""preprocessor"">"
356  CMNT_A = @"<highlight class=""comment"">"
357  SPAN_E = @"</highlight>"
358  QUOT_A = @"<highlight class=""stringliteral"">"""
359  QUOT_E = @"""</highlight>"
360  eol = @xml_eol()
361  special_chars = @xml_specials()
362  prepare = @prepare_xml()
363  do_files()
364  ELSE
365  MSG_CONT("scanned (no files)")
366  END IF
367  END IF
368  END IF '&xml_eol(); xml_specials(); Highlighter::prepare_xml();
369  EXIT WHILE
370  WEND
371  DELETE doxy
372  OPT->InTree = tree
373  OPT->InRecursiv = recu
374  CHDIR(OPT->StartPath)
375 END SUB
376 
377 
378 
393  VAR a = 1, e = a, l = LEN(DoxyFiles)
394  WHILE a < l
395  e = INSTR(a + 1, DoxyFiles, !"\n")
396  VAR in_fnam = MID(DoxyFiles, a, e - a)
397  Symbols = NEW RepData
398  MSG_LINE(in_fnam)
399  OPT->Ocha = FREEFILE
400  IF OPEN(in_fnam & "_" FOR OUTPUT AS OPT->Ocha) THEN
401  MSG_CONT("error (couldn't write)")
402  ELSE
403  Ifnr = FREEFILE
404  IF OPEN(in_fnam FOR INPUT AS Ifnr) THEN
405  MSG_CONT("error (couldn't read)")
406  CLOSE #OPT->Ocha
407  KILL(in_fnam & "_")
408  ELSE
409  VAR fb_nam = prepare(@THIS)
410  IF ASC(fb_nam) > 3 THEN
411  Pars->File_(FbPath & fb_nam, 0)
412  IF LEN(Pars->ErrMsg) THEN MSG_CONT(Pars->ErrMsg) ELSE MSG_CONT("done")
413 
414  PRINT #OPT->Ocha, LastLine
415  WHILE NOT EOF(Ifnr)
416  LINE INPUT #Ifnr, LastLine
417  PRINT #OPT->Ocha, LastLine
418  WEND
419  CLOSE #Ifnr
420  CLOSE #OPT->Ocha
421  KILL(in_fnam)
422  NAME(in_fnam & "_", in_fnam)
423  IF LEN(Pars->ErrMsg) THEN MSG_CONT(Pars->ErrMsg)
424  ELSE
425  CLOSE #Ifnr
426  CLOSE #OPT->Ocha
427  KILL(in_fnam & "_")
428  SELECT CASE AS CONST ASC(fb_nam)
429  CASE 1 : MSG_CONT("error (no source file)")
430  CASE 2 : MSG_CONT("error (cannot operate twice)")
431  CASE 3 : MSG_CONT("error (end of file)")
432  END SELECT
433  END IF
434  END IF
435  END IF
436  DELETE Symbols
437  a = e + 1
438  WEND
439 END SUB
440 
441 
442 
452 SUB Highlighter.generate_all(BYVAL Buf AS ZSTRING PTR, BYVAL Stop_ AS INTEGER)
453  WITH *Pars
454  VAR i = .SrcBgn, start = i
455  WHILE i <= Stop_
456  SELECT CASE AS CONST Buf[i]
457  CASE 0 : EXIT WHILE
458  CASE ASC(!"\n")
459  IF i <= start THEN Code(eol(Symbols, LineNo)) : start = i + 1 : EXIT SELECT
460  Code(generate_code(Buf, start, i - start) & eol(Symbols, LineNo))
461  start = i + 1
462  CASE ASC("""")
463  IF i >= start THEN Code(generate_code(Buf, start, i - start))
464  start = i
465  SCAN_QUOTE(Buf,i)
466  Code(*QUOT_A & special_chars(Buf, start + 1, i - start - 1) & *QUOT_E)
467  start = i + 1
468  CASE ASC("'")
469  IF i >= start THEN Code(generate_code(Buf, start, i - start))
470  start = i
471  SCAN_SL_COMM(Buf,i)
472  IF Buf[start + 1] <> OPT->JoComm ORELSE OPT->DoCom THEN _
473  Code(*CMNT_A & special_chars(Buf, start, i - start) & *SPAN_E)
474  start = i
475  CONTINUE WHILE
476  CASE ASC("/") : IF Buf[i + 1] <> ASC("'") THEN EXIT SELECT
477  IF i >= start THEN Code(generate_code(Buf, start, i - start))
478  start = i
479  i += 2
480  VAR fl = Buf[i] <> OPT->JoComm OR OPT->DoCom
481  DO
482  SELECT CASE AS CONST Buf[i]
483  CASE 0 : EXIT DO
484  CASE ASC(!"\n")
485  IF i <= start THEN
486  IF fl THEN Code(eol(Symbols, LineNo)) ELSE LineNo += 1
487  start = i + 1 : EXIT SELECT
488  END IF
489  IF fl THEN Code(*CMNT_A & special_chars(Buf, start, i - start) & *SPAN_E & eol(Symbols, LineNo)) ELSE LineNo += 1
490  start = i + 1
491  CASE ASC("'")
492  SELECT CASE AS CONST Buf[i + 1]
493  CASE 0 : EXIT WHILE
494  CASE ASC("/") : i += 1 : EXIT DO
495  END SELECT
496  END SELECT : i += 1
497  LOOP
498 
499  IF fl THEN Code(*CMNT_A & special_chars(Buf, start, i - start + 1) & *SPAN_E)
500  DO
501  SELECT CASE AS CONST Buf[i]
502  CASE 0 : EXIT WHILE
503  CASE ASC(!"\r")
504  CASE ASC(!"\n") : IF fl THEN Code(eol(Symbols, LineNo)) ELSE LineNo += 1
505  CASE ELSE : EXIT DO
506  END SELECT : i += 1
507  LOOP : start = i + 1
508  END SELECT : i += 1
509  WEND : IF .SrcBgn < i THEN .SrcBgn = i
510  END WITH
511 END SUB
512 
513 
514 
523 FUNCTION Highlighter.word_type(BYREF W AS STRING) AS ZSTRING PTR
524  SELECT CASE AS CONST W[0]
525  CASE ASC("_")
526  SELECT CASE W
527  CASE "__DATE__" : RETURN @!"\004__Date__"
528  CASE "__DATE_ISO__" : RETURN @!"\004__Date_Iso__"
529  CASE "__FB_64BIT__" : RETURN @!"\004__Fb_64Bit__"
530  CASE "__FB_ARG_EXTRACT__" : RETURN @!"\004__Fb_Arg_Extract__"
531  CASE "__FB_ARG_LEFTOF__" : RETURN @!"\004__Fb_Arg_Leftof__"
532  CASE "__FB_ARG_RIGHTOF__" : RETURN @!"\004__Fb_Arg_Rightof__"
533  CASE "__FB_ARGC__" : RETURN @!"\004__Fb_ArgC__"
534  CASE "__FB_ARGV__" : RETURN @!"\004__Fb_ArgV__"
535  CASE "__FB_BACKEND__" : RETURN @!"\004__Fb_Backend__"
536  CASE "__FB_BIGENDIAN__" : RETURN @!"\004__Fb_BigEndian__"
537  CASE "__FB_BUILD_DATE__" : RETURN @!"\004__Fb_Build_Date__"
538  CASE "__FB_BUILD_DATE_ISO__" : RETURN @!"\004__Fb_Build_Date_Iso__"
539  CASE "__FB_BUILD_SHA1__" : RETURN @!"\004__Fb_Build_Sha1__"
540  CASE "__FB_CYGWIN__" : RETURN @!"\004__Fb_Cygwin__"
541  CASE "__FB_DARWIN__" : RETURN @!"\004__Fb_Darwin__"
542  CASE "__FB_DEBUG__" : RETURN @!"\004__Fb_Debug__"
543  CASE "__FB_DOS__" : RETURN @!"\004__Fb_Dos__"
544  CASE "__FB_ERR__" : RETURN @!"\004__Fb_Err__"
545  CASE "__FB_FPMODE__" : RETURN @!"\004__Fb_FpMode__"
546  CASE "__FB_FPU__" : RETURN @!"\004__Fb_Fpu__"
547  CASE "__FB_FREEBSD__" : RETURN @!"\004__Fb_FreeBsd__"
548  CASE "__FB_GCC__" : RETURN @!"\004__Fb_Gcc__"
549  CASE "__FB_GUI__" : RETURN @!"\004__Fb_Gui__"
550  CASE "__FB_JOIN__" : RETURN @!"\004__Fb_Join__"
551  CASE "__FB_LANG__" : RETURN @!"\004__Fb_Lang__"
552  CASE "__FB_LINUX__" : RETURN @!"\004__Fb_Linux__"
553  CASE "__FB_MAIN__" : RETURN @!"\004__Fb_Main__"
554  CASE "__FB_MIN_VERSION__" : RETURN @!"\004__Fb_Min_Version__"
555  CASE "__FB_MT__" : RETURN @!"\004__Fb_Mt__"
556  CASE "__FB_NETBSD__" : RETURN @!"\004__Fb_NetBsd__"
557  CASE "__FB_OPENBSD__" : RETURN @!"\004__Fb_OpenBsd__"
558  CASE "__FB_OPTION_BYVAL__" : RETURN @!"\004__Fb_Option_ByVal__"
559  CASE "__FB_OPTION_DYNAMIC__" : RETURN @!"\004__Fb_Option_Dynamic__"
560  CASE "__FB_OPTION_ESCAPE__" : RETURN @!"\004__Fb_Option_Escape__"
561  CASE "__FB_OPTION_EXPLICIT__" : RETURN @!"\004__Fb_Option_Explicit__"
562  CASE "__FB_OPTION_GOSUB__" : RETURN @!"\004__Fb_Option_Gosub__"
563  CASE "__FB_OPTION_PRIVATE__" : RETURN @!"\004__Fb_Option_Private__"
564  CASE "__FB_OPTIMIZE__" : RETURN @!"\004__Fb_Optimize__"
565  CASE "__FB_OUT_DLL__" : RETURN @!"\004__Fb_Out_Dll__"
566  CASE "__FB_OUT_EXE__" : RETURN @!"\004__Fb_Out_Exe__"
567  CASE "__FB_OUT_LIB__" : RETURN @!"\004__Fb_Out_Lib__"
568  CASE "__FB_OUT_OBJ__" : RETURN @!"\004__Fb_Out_Obj__"
569  CASE "__FB_PCOS__" : RETURN @!"\004__Fb_Pcos__"
570  CASE "__FB_PPC__" : RETURN @!"\004__Fb_Ppc__"
571  CASE "__FB_QUOTE__" : RETURN @!"\004__Fb_Quote__"
572  CASE "__FB_SIGNATURE__" : RETURN @!"\004__Fb_Signature__"
573  CASE "__FB_SSE__" : RETURN @!"\004__Fb_Sse__"
574  CASE "__FB_UNIX__" : RETURN @!"\004__Fb_Unix__"
575  CASE "__FB_UNIQUEID_PUSH__" : RETURN @!"\004__Fb_Uniqueid_Push__"
576  CASE "__FB_UNIQUEID_POP__" : RETURN @!"\004__Fb_Uniqueid_Pop__"
577  CASE "__FB_UNIQUEID__" : RETURN @!"\004__Fb_Uniqueid__"
578  CASE "__FB_UNQUOTE__" : RETURN @!"\004__Fb_Unquote__"
579  CASE "__FB_VECTORIZE__" : RETURN @!"\004__Fb_Vectorize__"
580  CASE "__FB_VER_MAJOR__" : RETURN @!"\004__Fb_Ver_Major__"
581  CASE "__FB_VER_MINOR__" : RETURN @!"\004__Fb_Ver_Minor__"
582  CASE "__FB_VER_PATCH__" : RETURN @!"\004__Fb_Ver_Patch__"
583  CASE "__FB_VERSION__" : RETURN @!"\004__Fb_Version__"
584  CASE "__FB_WIN32__" : RETURN @!"\004__Fb_Win32__"
585  CASE "__FB_XBOX__" : RETURN @!"\004__Fb_Xbox__"
586  CASE "__FILE__" : RETURN @!"\004__File__"
587  CASE "__FILE_NQ__" : RETURN @!"\004__File_Nq__"
588  CASE "__FUNCTION__" : RETURN @!"\004__Function__"
589  CASE "__FUNCTION_NQ__" : RETURN @!"\004__Function_Nq__"
590  CASE "__LINE__" : RETURN @!"\004__Line__"
591  CASE "__PATH__" : RETURN @!"\004__Path__"
592  CASE "__TIME__" : RETURN @!"\004__Time__"
593  CASE "__FB_X86__" : RETURN @!"\004__Fb_X86__"
594  END SELECT
595  CASE ASC("#")
596  SELECT CASE W
597  CASE "#ASSERT" : RETURN @!"\004#Assert"
598  CASE "#CMDLINE" : RETURN @!"\004#Cmdline"
599  CASE "#DEF" : RETURN @!"\004#Def"
600  CASE "#DEFINE" : RETURN @!"\004#Define"
601  CASE "#ELSE" : RETURN @!"\004#Else"
602  CASE "#ELSEIF" : RETURN @!"\004#ElseIf"
603  CASE "#ENDIF" : RETURN @!"\004#EndIf"
604  CASE "#ENDMACRO" : RETURN @!"\004#EndMacro"
605  CASE "#ERROR" : RETURN @!"\004#Error"
606  CASE "#IF" : RETURN @!"\004#If"
607  CASE "#IFDEF" : RETURN @!"\004#IfDef"
608  CASE "#IFNDEF" : RETURN @!"\004#IfNDef"
609  CASE "#INCLUDE" : RETURN @!"\004#Include"
610  CASE "#INCLIB" : RETURN @!"\004#IncLib"
611  CASE "#LANG" : RETURN @!"\004#Lang"
612  CASE "#LIBPATH" : RETURN @!"\004#LibPath"
613  CASE "#LINE" : RETURN @!"\004#Line"
614  CASE "#MACRO" : RETURN @!"\004#Macro"
615  CASE "#PRAGMA" : RETURN @!"\004#Pragma"
616  CASE "#PRINT" : RETURN @!"\004#Print"
617  CASE "#UNDEF" : RETURN @!"\004#UnDef"
618  END SELECT
619  'CASE ASC("$") ' I don't wonna test this old stuff
620  'SELECT CASE W
621  'CASE "$INCLUDE" : RETURN @!"\004$Include"
622  'CASE "$DYNAMIC" : RETURN @!"\004$Dynamic"
623  'CASE "$LANG" : RETURN @!"\004$Lang"
624  'CASE "$STATIC" : RETURN @!"\004$Static"
625  'END SELECT
626  CASE ASC("A")
627  SELECT CASE W
628  CASE "ABS" : RETURN @!"\001Abs"
629  CASE "ABSTRACT" : RETURN @!"\001Abstract"
630  CASE "ACCESS" : RETURN @!"\001Access"
631  CASE "ACOS" : RETURN @!"\001Acos"
632  CASE "ADD" : RETURN @!"\001Add"
633  CASE "ALIAS" : RETURN @!"\001Alias"
634  CASE "ALLOCATE" : RETURN @!"\001Allocate"
635  CASE "ALPHA" : RETURN @!"\001Alpha"
636  CASE "AND" : RETURN @!"\001And"
637  CASE "ANDALSO" : RETURN @!"\001AndAlso"
638  CASE "ANY" : RETURN @!"\001Any"
639  CASE "APPEND" : RETURN @!"\001Append"
640  CASE "AS" : RETURN @!"\002As"
641  CASE "ASC" : RETURN @!"\001Asc"
642  CASE "ASIN" : RETURN @!"\001Asin"
643  CASE "ASM" : RETURN @!"\001Asm"
644  CASE "ASSERT" : RETURN @!"\001Assert"
645  CASE "ASSERTWARN" : RETURN @!"\001Assertwarn"
646  CASE "ATAN2" : RETURN @!"\001Atan2"
647  CASE "ATN" : RETURN @!"\001Atn"
648  END SELECT
649  CASE ASC("B")
650  SELECT CASE W
651  CASE "BASE" : RETURN @!"\001Base"
652  CASE "BEEP" : RETURN @!"\001Beep"
653  CASE "BIN" : RETURN @!"\001Bin"
654  CASE "BINARY" : RETURN @!"\001Binary"
655  CASE "BIT" : RETURN @!"\001Bit"
656  CASE "BITRESET" : RETURN @!"\001BitReset"
657  CASE "BITSET" : RETURN @!"\001BitSet"
658  CASE "BLOAD" : RETURN @!"\001Bload"
659  CASE "BOOLEAN" : RETURN @!"\001Boolean"
660  CASE "BSAVE" : RETURN @!"\001BSave"
661  CASE "BYTE" : RETURN @!"\002Byte"
662  CASE "BYREF" : RETURN @!"\002ByRef"
663  CASE "BYVAL" : RETURN @!"\002ByVal"
664  END SELECT
665  CASE ASC("C")
666  SELECT CASE W
667  CASE "CALL" : RETURN @!"\001Call"
668  CASE "CALLOCATE" : RETURN @!"\001CAllocate"
669  CASE "CALLS" : RETURN @!"\001Calls"
670  CASE "CASE" : RETURN @!"\001Case"
671  CASE "CAST" : RETURN @!"\001Cast"
672  CASE "CBOOL" : RETURN @!"\001CBool"
673  CASE "CBYTE" : RETURN @!"\001CByte"
674  CASE "CDBL" : RETURN @!"\001CDbl"
675  CASE "CDECL" : RETURN @!"\001CDecl"
676  CASE "CHAIN" : RETURN @!"\001Chain"
677  CASE "CHDIR" : RETURN @!"\001ChDir"
678  CASE "CHR" : RETURN @!"\001Chr"
679  CASE "CINT" : RETURN @!"\001CInt"
680  CASE "CIRCLE" : RETURN @!"\001Circle"
681  CASE "CLASS" : RETURN @!"\001Class"
682  CASE "CLEAR" : RETURN @!"\001Clear"
683  CASE "CLNG" : RETURN @!"\001CLng"
684  CASE "CLNGINT" : RETURN @!"\001CLngInt"
685  CASE "CLOSE" : RETURN @!"\001Close"
686  CASE "CLS" : RETURN @!"\001Cls"
687  CASE "COLOR" : RETURN @!"\001Color"
688  CASE "COM" : RETURN @!"\001Com"
689  CASE "COMMAND" : RETURN @!"\001Command"
690  CASE "COMMON" : RETURN @!"\002Common"
691  CASE "CONDBROADCAST" : RETURN @!"\001CondBroadcast"
692  CASE "CONDCREATE" : RETURN @!"\001CondCreate"
693  CASE "CONDDESTROY" : RETURN @!"\001CondDestroy"
694  CASE "CONDSIGNAL" : RETURN @!"\001CondSignal"
695  CASE "CONDWAIT" : RETURN @!"\001CondWait"
696  CASE "CONS" : RETURN @!"\001Cons"
697  CASE "CONST" : RETURN @!"\002Const"
698  CASE "CONSTRUCTOR" : RETURN @!"\001Constructor"
699  CASE "CONTINUE" : RETURN @!"\001Continue"
700  CASE "COS" : RETURN @!"\001Cos"
701  CASE "CPTR" : RETURN @!"\001CPtr"
702  CASE "CSHORT" : RETURN @!"\001CShort"
703  CASE "CSIGN" : RETURN @!"\001DSign"
704  CASE "CSNG" : RETURN @!"\001CSng"
705  CASE "CSRLIN" : RETURN @!"\001CsrLin"
706  CASE "CUBYTE" : RETURN @!"\001CUbyte"
707  CASE "CUINT" : RETURN @!"\001CUInt"
708  CASE "CULNG" : RETURN @!"\001CULng"
709  CASE "CULNGINT" : RETURN @!"\001CULngInt"
710  CASE "CUNSG" : RETURN @!"\001CUnSg"
711  CASE "CURDIR" : RETURN @!"\001CurDir"
712  CASE "CUSHORT" : RETURN @!"\001CUShort"
713  CASE "CUSTOM" : RETURN @!"\001Custom"
714  CASE "CVA_ARG" : RETURN @!"\001Cva_Arg"
715  CASE "CVA_COPY" : RETURN @!"\001Cva_Copy"
716  CASE "CVA_END" : RETURN @!"\001Cva_End"
717  CASE "CVA_LIST" : RETURN @!"\001Cva_List"
718  CASE "CVA_START" : RETURN @!"\001Cva_Start"
719  CASE "CVD" : RETURN @!"\001CvD"
720  CASE "CVI" : RETURN @!"\001CvI"
721  CASE "CVL" : RETURN @!"\001CvL"
722  CASE "CVLONGINT" : RETURN @!"\001CvLongInt"
723  CASE "CVS" : RETURN @!"\001CvS"
724  CASE "CVSHORT" : RETURN @!"\001CvShort"
725  END SELECT
726  CASE ASC("D")
727  SELECT CASE W
728  CASE "DATA" : RETURN @!"\001Data"
729  CASE "DATE" : RETURN @!"\001Date"
730  CASE "DATEADD" : RETURN @!"\001DateAdd"
731  CASE "DATEDIFF" : RETURN @!"\001DateDiff"
732  CASE "DATEPART" : RETURN @!"\001DatePart"
733  CASE "DATESERIAL" : RETURN @!"\001DateSerial"
734  CASE "DATEVALUE" : RETURN @!"\001DateValue"
735  CASE "DAY" : RETURN @!"\001Day"
736  CASE "DEALLOCATE" : RETURN @!"\001DeAllocate"
737  CASE "DECLARE" : RETURN @!"\001Declare"
738  CASE "DEFBYTE" : RETURN @!"\001DefByte"
739  CASE "DEFDBL" : RETURN @!"\001DefDbl"
740  CASE "DEFINED" : RETURN @!"\004Defined"
741  CASE "DEFINT" : RETURN @!"\001DefInt"
742  CASE "DEFLNG" : RETURN @!"\001DefLng"
743  CASE "DEFLONGINT" : RETURN @!"\001DefLongInt"
744  CASE "DEFSHORT" : RETURN @!"\001DefShort"
745  CASE "DEFSNG" : RETURN @!"\001DefSng"
746  CASE "DEFSTR" : RETURN @!"\001DefStr"
747  CASE "DEFUBYTE" : RETURN @!"\001DefUbyte"
748  CASE "DEFUINT" : RETURN @!"\001DefUInt"
749  CASE "DEFULONGINT" : RETURN @!"\001DefULongInt"
750  CASE "DEFUSHORT" : RETURN @!"\001DefUShort"
751  CASE "DELETE" : RETURN @!"\001Delete"
752  CASE "DESTRUCTOR" : RETURN @!"\001Destructor"
753  CASE "DIM" : RETURN @!"\002Dim"
754  CASE "DIR" : RETURN @!"\001Dir"
755  CASE "DO" : RETURN @!"\001Do"
756  CASE "DOUBLE" : RETURN @!"\002Double"
757  CASE "DRAW" : RETURN @!"\001Draw"
758  CASE "DYLIBFREE" : RETURN @!"\001DyLibFree"
759  CASE "DYLIBLOAD" : RETURN @!"\001DyLibLoad"
760  CASE "DYLIBSYMBOL" : RETURN @!"\001DyLibSymbol"
761  CASE "DYNAMIC" : RETURN @!"\001Dynamic"
762  END SELECT
763  CASE ASC("E")
764  SELECT CASE W
765  CASE "ELSE" : RETURN @!"\001Else"
766  CASE "ELSEIF" : RETURN @!"\001ElseIf"
767  CASE "ENCODING" : RETURN @!"\001Encoding"
768  CASE "END" : RETURN @!"\001End"
769  CASE "ENDIF" : RETURN @!"\001EndIf"
770  CASE "ENUM" : RETURN @!"\001Enum"
771  CASE "ENVIRON" : RETURN @!"\001Environ"
772  CASE "EOF" : RETURN @!"\001Eof"
773  CASE "EQV" : RETURN @!"\001Eqv"
774  CASE "ERASE" : RETURN @!"\001Erase"
775  CASE "ERFN" : RETURN @!"\001ErFn"
776  CASE "ERL" : RETURN @!"\001ErL"
777  CASE "ERMN" : RETURN @!"\001ErMn"
778  CASE "ERR" : RETURN @!"\001Err"
779  CASE "ERROR" : RETURN @!"\001Error"
780  CASE "ESCAPE" : RETURN @!"\001Escape"
781  CASE "EXEC" : RETURN @!"\001Exec"
782  CASE "EXEPATH" : RETURN @!"\001ExePath"
783  CASE "EXPLICIT" : RETURN @!"\001Explicit"
784  CASE "EXIT" : RETURN @!"\001Exit"
785  CASE "EXP" : RETURN @!"\001Exp"
786  CASE "EXPORT" : RETURN @!"\001Export"
787  CASE "EXTENDS" : RETURN @!"\001Extends"
788  CASE "EXTERN" : RETURN @!"\002Extern"
789  CASE "ESCAPE" : RETURN @!"\001Escape"
790  CASE "EXPLICIT" : RETURN @!"\001Explicit"
791  END SELECT
792  CASE ASC("F")
793  SELECT CASE W
794  CASE "FALSE" : RETURN @!"\001False"
795  CASE "FB_MEMCOPY" : RETURN @!"\001Fb_MemCopy"
796  CASE "FB_MEMCOPYCLEAR" : RETURN @!"\001Fb_MemCopyClear"
797  CASE "FB_MEMMOVE" : RETURN @!"\001Fb_MemMove"
798  CASE "FBARRAY" : RETURN @!"\001FbArray"
799  CASE "FIELD" : RETURN @!"\001Field"
800  CASE "FILEATTR" : RETURN @!"\001FileAttr"
801  CASE "FILECOPY" : RETURN @!"\001FileCopy"
802  CASE "FILEDATETIME" : RETURN @!"\001FileDateTime"
803  CASE "FILEEXISTS" : RETURN @!"\001FileExists"
804  CASE "FILEFLUSH" : RETURN @!"\001FileFlush"
805  CASE "FILELEN" : RETURN @!"\001FileLen"
806  CASE "FIX" : RETURN @!"\001Fix"
807  CASE "FLIP" : RETURN @!"\001Flip"
808  CASE "FOR" : RETURN @!"\001For"
809  CASE "FORMAT" : RETURN @!"\001Format"
810  CASE "FRAC" : RETURN @!"\001Frac"
811  CASE "FRE" : RETURN @!"\001Fre"
812  CASE "FREEFILE" : RETURN @!"\001FreeFile"
813  CASE "FUNCTION" : RETURN @!"\001Function"
814  END SELECT
815  CASE ASC("G")
816  SELECT CASE W
817  CASE "GET" : RETURN @!"\001Get"
818  CASE "GETJOYSTICK" : RETURN @!"\001GetJoyStick"
819  CASE "GETKEY" : RETURN @!"\001GetKey"
820  CASE "GETMOUSE" : RETURN @!"\001GetMouse"
821  CASE "GOSUB" : RETURN @!"\001GoSub"
822  CASE "GOTO" : RETURN @!"\001Goto"
823  END SELECT
824  CASE ASC("H")
825  SELECT CASE W
826  CASE "HEX" : RETURN @!"\001Hex"
827  CASE "HIBYTE" : RETURN @!"\001HiByte"
828  CASE "HIWORD" : RETURN @!"\001HiWord"
829  CASE "HOUR" : RETURN @!"\001Hour"
830  END SELECT
831  CASE ASC("I")
832  SELECT CASE W
833  CASE "IF" : RETURN @!"\001If"
834  CASE "IIF" : RETURN @!"\001IIf"
835  CASE "IMAGECONVERTROW" : RETURN @!"\001ImageConvertRow"
836  CASE "IMAGECREATE" : RETURN @!"\001ImageCreate"
837  CASE "IMAGEDESTROY" : RETURN @!"\001ImageDestroy"
838  CASE "IMAGEINFO" : RETURN @!"\001ImageInfo"
839  CASE "IMP" : RETURN @!"\001Imp"
840  CASE "IMPLEMENTS" : RETURN @!"\001Implements"
841  CASE "IMPORT" : RETURN @!"\001Import"
842  CASE "INKEY" : RETURN @!"\001InKey"
843  CASE "INP" : RETURN @!"\001Inp"
844  CASE "INPUT" : RETURN @!"\001Input"
845  CASE "INSTR" : RETURN @!"\001InStr"
846  CASE "INSTRREV" : RETURN @!"\001InStrRev"
847  CASE "INT" : RETURN @!"\001Int"
848  CASE "INTEGER" : RETURN @!"\002Integer"
849  CASE "IS" : RETURN @!"\001Is"
850  CASE "ISDATE" : RETURN @!"\001IsDate"
851  CASE "ISREDIRECTED" : RETURN @!"\001IsReDirected"
852  END SELECT
853  CASE ASC("K")
854  SELECT CASE W
855  CASE "KILL" : RETURN @!"\001Kill"
856  END SELECT
857  CASE ASC("L")
858  SELECT CASE W
859  CASE "LBOUND" : RETURN @!"\001LBound"
860  CASE "LCASE" : RETURN @!"\001LCase"
861  CASE "LEFT" : RETURN @!"\001Left"
862  CASE "LEN" : RETURN @!"\001Len"
863  CASE "LET" : RETURN @!"\001Let"
864  CASE "LIB" : RETURN @!"\001Lib"
865  CASE "LIBPATH" : RETURN @!"\001LibPath"
866  CASE "LINE" : RETURN @!"\001Line"
867  CASE "LOBYTE" : RETURN @!"\001LoByte"
868  CASE "LOC" : RETURN @!"\001Loc"
869  CASE "LOCAL" : RETURN @!"\001Local"
870  CASE "LOCATE" : RETURN @!"\001Locate"
871  CASE "LOCK" : RETURN @!"\001Lock"
872  CASE "LOF" : RETURN @!"\001Lof"
873  CASE "LOG" : RETURN @!"\001Log"
874  CASE "LONG" : RETURN @!"\002Long"
875  CASE "LONGINT" : RETURN @!"\002LongInt"
876  CASE "LOOP" : RETURN @!"\001Loop"
877  CASE "LOWORD" : RETURN @!"\001LoWord"
878  CASE "LPOS" : RETURN @!"\001LPos"
879  CASE "LPRINT" : RETURN @!"\001LPrint"
880  CASE "LPT" : RETURN @!"\001Lpt"
881  CASE "LSET" : RETURN @!"\001LSet"
882  CASE "LTRIM" : RETURN @!"\001LTrim"
883  END SELECT
884  CASE ASC("M")
885  SELECT CASE W
886  CASE "MID" : RETURN @!"\001Mid"
887  CASE "MINUTE" : RETURN @!"\001Minute"
888  CASE "MKD" : RETURN @!"\001MkD"
889  CASE "MKDIR" : RETURN @!"\001MkDir"
890  CASE "MKI" : RETURN @!"\001MkI"
891  CASE "MKL" : RETURN @!"\001MkL"
892  CASE "MKLONGINT" : RETURN @!"\001MKLongInt"
893  CASE "MKS" : RETURN @!"\001MkS"
894  CASE "MKSHORT" : RETURN @!"\001MkShort"
895  CASE "MOD" : RETURN @!"\001Mod"
896  CASE "MONTH" : RETURN @!"\001Month"
897  CASE "MONTHNAME" : RETURN @!"\001MonthName"
898  CASE "MULTIKEY" : RETURN @!"\001MultiKey"
899  CASE "MUTEXCREATE" : RETURN @!"\001MutexCreate"
900  CASE "MUTEXDESTROY" : RETURN @!"\001MutexDestroy"
901  CASE "MUTEXLOCK" : RETURN @!"\001MutexLock"
902  CASE "MUTEXUNLOCK" : RETURN @!"\001MutexUnLock"
903  END SELECT
904  CASE ASC("N")
905  SELECT CASE W
906  CASE "NAKED" : RETURN @!"\001Naked"
907  CASE "NAME" : RETURN @!"\001Name"
908  CASE "NAMESPACE" : RETURN @!"\001Namespace"
909  CASE "NEW" : RETURN @!"\001New"
910  CASE "NEXT" : RETURN @!"\001Next"
911  CASE "NOT" : RETURN @!"\001Not"
912  CASE "NOW" : RETURN @!"\001Now"
913  CASE "NOGOSUB" : RETURN @!"\001NoGoSub"
914  CASE "NOKEYWORD" : RETURN @!"\001NoKeyWord"
915  END SELECT
916  CASE ASC("O")
917  SELECT CASE W
918  CASE "OBJECT" : RETURN @!"\001Object"
919  CASE "OCT" : RETURN @!"\001Oct"
920  CASE "OFFSETOF" : RETURN @!"\001OffsetOf"
921  CASE "ON" : RETURN @!"\001On"
922  CASE "ONCE" : RETURN @!"\004Once"
923  CASE "OPEN" : RETURN @!"\001Open"
924  CASE "OPERATOR" : RETURN @!"\001Operator"
925  CASE "OPTION" : RETURN @!"\001Option"
926  CASE "OR" : RETURN @!"\001Or"
927  CASE "ORELSE" : RETURN @!"\001OrElse"
928  CASE "OUT" : RETURN @!"\001Out"
929  CASE "OUTPUT" : RETURN @!"\001Output"
930  CASE "OVERLOAD" : RETURN @!"\001Overload"
931  CASE "OVERRIDE" : RETURN @!"\001Override"
932  CASE "OPTION" : RETURN @!"\001Option"
933  END SELECT
934  CASE ASC("P")
935  SELECT CASE W
936  CASE "PAINT" : RETURN @!"\001Paint"
937  CASE "PALETTE" : RETURN @!"\001Palette"
938  CASE "PASCAL" : RETURN @!"\001Pascal"
939  CASE "PCOPY" : RETURN @!"\001PCopy"
940  CASE "PEEK" : RETURN @!"\001Peek"
941  CASE "PIPE" : RETURN @!"\001Pipe"
942  CASE "PMAP" : RETURN @!"\001PMap"
943  CASE "POINT" : RETURN @!"\001Point"
944  CASE "POINTCOORD" : RETURN @!"\001PointCoord"
945  CASE "POINTER" : RETURN @!"\001Pointer"
946  CASE "POKE" : RETURN @!"\001Poke"
947  CASE "POS" : RETURN @!"\001Pos"
948  CASE "POP" : RETURN @!"\001Pop"
949  CASE "PRESERVE" : RETURN @!"\001Preserve"
950  CASE "PRESET" : RETURN @!"\001PReset"
951  CASE "PRINT" : RETURN @!"\001Print"
952  CASE "PRIVATE" : RETURN @!"\001Private"
953  CASE "PROCPTR" : RETURN @!"\001ProcPtr"
954  CASE "PROPERTY" : RETURN @!"\001Property"
955  CASE "PROTECTED" : RETURN @!"\001Protected"
956  CASE "PSET" : RETURN @!"\001PSet"
957  CASE "PTR" : RETURN @!"\002Ptr"
958  CASE "PUBLIC" : RETURN @!"\001Public"
959  CASE "PUT" : RETURN @!"\001Put"
960  CASE "PUSH" : RETURN @!"\001Push"
961  END SELECT
962  CASE ASC("R")
963  SELECT CASE W
964  CASE "RANDOM" : RETURN @!"\001Random"
965  CASE "RANDOMIZE" : RETURN @!"\001Randomize"
966  CASE "READ" : RETURN @!"\001Read"
967  CASE "REALLOCATE" : RETURN @!"\001ReAllocate"
968  CASE "REDIM" : RETURN @!"\001ReDim"
969  CASE "REM" : RETURN @!"\001Rem"
970  CASE "RESET" : RETURN @!"\001Reset"
971  CASE "RESTORE" : RETURN @!"\001ReStore"
972  CASE "RESUME" : RETURN @!"\001Resume"
973  CASE "RETURN" : RETURN @!"\001Return"
974  CASE "RGB" : RETURN @!"\001RGB"
975  CASE "RGBA" : RETURN @!"\001RGBA"
976  CASE "RIGHT" : RETURN @!"\001Right"
977  CASE "RMDIR" : RETURN @!"\001RmDir"
978  CASE "RND" : RETURN @!"\001Rnd"
979  CASE "RSET" : RETURN @!"\001RSet"
980  CASE "RTRIM" : RETURN @!"\001RTrim"
981  CASE "RUN" : RETURN @!"\001Run"
982  END SELECT
983  CASE ASC("S")
984  SELECT CASE W
985  CASE "SADD" : RETURN @!"\001SAdd"
986  CASE "SCOPE" : RETURN @!"\001Scope"
987  CASE "SCREEN" : RETURN @!"\001Screen"
988  CASE "SCREENCONTROL" : RETURN @!"\001ScreenControl"
989  CASE "SCREENCOPY" : RETURN @!"\001ScreenCopy"
990  CASE "SCREENEVENT" : RETURN @!"\001ScreenEvent"
991  CASE "SCREENGLPROC" : RETURN @!"\001ScreenGlProc"
992  CASE "SCREENINFO" : RETURN @!"\001ScreenInfo"
993  CASE "SCREENLIST" : RETURN @!"\001ScreenList"
994  CASE "SCREENLOCK" : RETURN @!"\001ScreenLock"
995  CASE "SCREENPTR" : RETURN @!"\001ScreenPtr"
996  CASE "SCREENRES" : RETURN @!"\001ScreenRes"
997  CASE "SCREENSET" : RETURN @!"\001ScreenSet"
998  CASE "SCREENSYNC" : RETURN @!"\001ScreenSync"
999  CASE "SCREENUNLOCK" : RETURN @!"\001ScreenUnLock"
1000  CASE "SCRN" : RETURN @!"\001Scrn"
1001  CASE "SECOND" : RETURN @!"\001Second"
1002  CASE "SEEK" : RETURN @!"\001Seek"
1003  CASE "SELECT" : RETURN @!"\001Select"
1004  CASE "SETDATE" : RETURN @!"\001SetDate"
1005  CASE "SETENVIRON" : RETURN @!"\001SetEnviron"
1006  CASE "SETMOUSE" : RETURN @!"\001SetMouse"
1007  CASE "SETTIME" : RETURN @!"\001SetTime"
1008  CASE "SGN" : RETURN @!"\001Sgn"
1009  CASE "SHARED" : RETURN @!"\002Shared"
1010  CASE "SHELL" : RETURN @!"\001Shell"
1011  CASE "SHL" : RETURN @!"\001ShL"
1012  CASE "SHORT" : RETURN @!"\002Short"
1013  CASE "SHR" : RETURN @!"\001ShR"
1014  CASE "SIN" : RETURN @!"\001Sin"
1015  CASE "SINGLE" : RETURN @!"\002Single"
1016  CASE "SIZEOF" : RETURN @!"\001SizeOf"
1017  CASE "SLEEP" : RETURN @!"\001Sleep"
1018  CASE "SPACE" : RETURN @!"\001Space"
1019  CASE "SPC" : RETURN @!"\001Spc"
1020  CASE "SQR" : RETURN @!"\001Sqr"
1021  CASE "STATIC" : RETURN @!"\002Static"
1022  CASE "STDCALL" : RETURN @!"\001StdCall"
1023  CASE "STEP" : RETURN @!"\001Step"
1024  CASE "STICK" : RETURN @!"\001Stick"
1025  CASE "STOP" : RETURN @!"\001Stop"
1026  CASE "STR" : RETURN @!"\001Str"
1027  CASE "STRIG" : RETURN @!"\001Strig"
1028  CASE "STRING" : RETURN @!"\002String"
1029  CASE "STRPTR" : RETURN @!"\001StrPtr"
1030  CASE "SUB" : RETURN @!"\001Sub"
1031  CASE "SWAP" : RETURN @!"\001Swap"
1032  CASE "SYSTEM" : RETURN @!"\001System"
1033  END SELECT
1034  CASE ASC("T")
1035  SELECT CASE W
1036  CASE "TAB" : RETURN @!"\001Tab"
1037  CASE "TAN" : RETURN @!"\001Tan"
1038  CASE "THEN" : RETURN @!"\001Then"
1039  CASE "THIS" : RETURN @!"\001This"
1040  CASE "THISCALL" : RETURN @!"\001ThisCall"
1041  CASE "THREADCALL" : RETURN @!"\001ThreadCall"
1042  CASE "THREADCREATE" : RETURN @!"\001ThreadCreate"
1043  CASE "THREADDETACH" : RETURN @!"\001ThreadDetach"
1044  CASE "THREADSELF" : RETURN @!"\001ThreadSelf"
1045  CASE "THREADWAIT" : RETURN @!"\001ThreadWait"
1046  CASE "TIME" : RETURN @!"\001Time"
1047  CASE "TIMER" : RETURN @!"\001Timer"
1048  CASE "TIMESERIAL" : RETURN @!"\001TimeSerial"
1049  CASE "TIMEVALUE" : RETURN @!"\001TimeValue"
1050  CASE "TO" : RETURN @!"\001To"
1051  CASE "TRANS" : RETURN @!"\001Trans"
1052  CASE "TRIM" : RETURN @!"\001Trim"
1053  CASE "TRUE" : RETURN @!"\001True"
1054  CASE "TYPE" : RETURN @!"\001Type"
1055  CASE "TYPEOF" : RETURN @!"\004TypeOf"
1056  END SELECT
1057  CASE ASC("U")
1058  SELECT CASE W
1059  CASE "UBOUND" : RETURN @!"\001UBound"
1060  CASE "UBYTE" : RETURN @!"\002UByte"
1061  CASE "UCASE" : RETURN @!"\001UCase"
1062  CASE "UINTEGER" : RETURN @!"\002UInteger"
1063  CASE "ULONG" : RETURN @!"\002ULong"
1064  CASE "ULONGINT" : RETURN @!"\002ULongInt"
1065  CASE "UNION" : RETURN @!"\001Union"
1066  CASE "UNLOCK" : RETURN @!"\001Unlock"
1067  CASE "UNSIGNED" : RETURN @!"\002UnSigned"
1068  CASE "UNTIL" : RETURN @!"\001Until"
1069  CASE "USHORT" : RETURN @!"\002UShort"
1070  CASE "USING" : RETURN @!"\001Using"
1071  END SELECT
1072  CASE ASC("V")
1073  SELECT CASE W
1074  CASE "VA_ARG" : RETURN @!"\001Va_Arg"
1075  CASE "VA_FIRST" : RETURN @!"\001Va_First"
1076  CASE "VA_NEXT" : RETURN @!"\001Va_Next"
1077  CASE "VAL" : RETURN @!"\001Val"
1078  CASE "VAL64" : RETURN @!"\001Val64"
1079  CASE "VALINT" : RETURN @!"\001ValInt"
1080  CASE "VALLNG" : RETURN @!"\001ValLng"
1081  CASE "VALUINT" : RETURN @!"\001ValUInt"
1082  CASE "VALULNG" : RETURN @!"\001ValULng"
1083  CASE "VAR" : RETURN @!"\002Var"
1084  CASE "VARPTR" : RETURN @!"\001VarPtr"
1085  CASE "VIEW" : RETURN @!"\001View"
1086  CASE "VIRTUAL" : RETURN @!"\001Virtual"
1087  END SELECT
1088  CASE ASC("W")
1089  SELECT CASE W
1090  CASE "WAIT" : RETURN @!"\001Wait"
1091  CASE "WBIN" : RETURN @!"\001WBin"
1092  CASE "WCHR" : RETURN @!"\001WChr"
1093  CASE "WEEKDAY" : RETURN @!"\001WeekDay"
1094  CASE "WEEKDAYNAME" : RETURN @!"\001WeekDayName"
1095  CASE "WEND" : RETURN @!"\001Wend"
1096  CASE "WHEX" : RETURN @!"\001WHex"
1097  CASE "WHILE" : RETURN @!"\001While"
1098  CASE "WIDTH" : RETURN @!"\001Width"
1099  CASE "WINDOW" : RETURN @!"\001Window"
1100  CASE "WINDOWTITLE" : RETURN @!"\001WindowTitle"
1101  CASE "WINPUT" : RETURN @!"\001WInput"
1102  CASE "WITH" : RETURN @!"\001With"
1103  CASE "WOCT" : RETURN @!"\001WOct"
1104  CASE "WRITE" : RETURN @!"\001Write"
1105  CASE "WSPACE" : RETURN @!"\001WSpace"
1106  CASE "WSTR" : RETURN @!"\001WStr"
1107  CASE "WSTRING" : RETURN @!"\002WString"
1108  END SELECT
1109  CASE ASC("X")
1110  SELECT CASE W
1111  CASE "XOR" : RETURN @!"\001Xor"
1112  END SELECT
1113  CASE ASC("Y")
1114  SELECT CASE W
1115  CASE "YEAR" : RETURN @!"\001Year"
1116  END SELECT
1117  CASE ASC("Z")
1118  SELECT CASE W
1119  CASE "ZSTRING" : RETURN @!"\002ZString"
1120  END SELECT
1121  END SELECT : RETURN 0
1122 END FUNCTION
1123 
1124 
1139 #MACRO GET_WORD_TYPE()
1140  VAR word = MID(*T, start + 1, size)
1141  VAR res = IIF(Symbols, Symbols->rep(word), cast(zstring ptr, SADD(word))) ' !!! CAST is a workaround, to be replaced when fbc types OK again
1142  IF res = SADD(word) THEN ' no symbol, check keyword & preprocessor
1143  word = UCASE(word)
1144  res = word_type(word)
1145  typ = IIF(res, ASC(*res), FB_CODE)
1146 
1147  SELECT CASE AS CONST OPT->CaseMode ' reformat letter cases, if required
1148  CASE OPT->CASE_LOWER : MID(*T, start + 1, size) = LCASE(word)
1149  CASE OPT->CASE_MIXED : MID(*T, start + 1, size) = MID(*res, 2, size)
1150  CASE OPT->CASE_UPPER : MID(*T, start + 1, size) = word
1151  END SELECT
1152  ELSE
1153  typ = CAST(INTEGER, res) ' start of replacement string
1154  END IF
1155 #ENDMACRO
1156 
1157 
1171 FUNCTION Highlighter.generate_code(BYVAL T AS ZSTRING PTR, BYVAL A AS INTEGER, BYVAL L AS INTEGER) AS STRING
1172  VAR size = 0, start = -1, last = -1, typ = last, blcks = ""
1173  FOR i AS INTEGER = A TO A + L - 1
1174  SELECT CASE AS CONST T[i]
1175  CASE ASC("0") TO ASC("9")
1176  IF size THEN size += 1
1177  'CASE ASC("$") ' I don't wonna test this old stuff
1178  'if size = 0 then
1179  'size = 1 : start = i
1180  'else
1181  'IF last <> FB_CODE THEN blcks &= MKi(FB_CODE) & MKi(i) : last = FB_CODE
1182  'end if
1183  CASE ASC("#"), ASC("_"), ASC("A") TO ASC("Z"), ASC("a") TO ASC("z")
1184  size += 1 : IF size = 1 THEN start = i
1185  CASE ELSE
1186  IF size THEN
1187  GET_WORD_TYPE()
1188  IF typ <> last THEN blcks &= MKI(typ) & MKI(i - size) : last = typ
1189  size = 0
1190  ENDIF
1191 
1192  SELECT CASE AS CONST T[i]
1193  CASE ASC("?")
1194  IF last = FB_KEYW THEN EXIT SELECT
1195  blcks &= MKI(FB_KEYW) & MKI(i) : last = FB_KEYW
1196  CASE ASC(!"\t"), ASC(!"\v"), ASC(" ") ' skip these
1197  IF i > A ANDALSO typ < FB_SYMB THEN EXIT SELECT
1198  blcks &= MKI(FB_CODE) & MKI(i) : last = FB_CODE
1199  CASE ELSE
1200  IF last = FB_CODE THEN EXIT SELECT
1201  blcks &= MKI(FB_CODE) & MKI(i) : last = FB_CODE
1202  END SELECT
1203  END SELECT
1204  NEXT
1205 
1206  IF size THEN
1207  GET_WORD_TYPE()
1208  IF typ <> last THEN blcks &= MKI(typ) & MKI(A + L - size)
1209  ENDIF
1210  blcks &= MKI(-1) & MKI(A + L)
1211 
1212  VAR r = "" _
1213  , p = CAST(INTEGER PTR, SADD(blcks)) _
1214  , n = (LEN(blcks) \ SIZEOF(INTEGER)) - 3
1215  FOR i AS INTEGER = 0 TO n STEP 2
1216  VAR l = p[i + 3] - p[i + 1]
1217  IF l THEN
1218  SELECT CASE AS CONST p[i]
1219  CASE FB_KEYW : r &= *KEYW_A & special_chars(T, p[i + 1], l) & *SPAN_E
1220  CASE FB_KWTP : r &= *KWTP_A & special_chars(T, p[i + 1], l) & *SPAN_E
1221  CASE FB_KWFL : r &= *KWFL_A & special_chars(T, p[i + 1], l) & *SPAN_E
1222  CASE FB_PREP : r &= *PREP_A & special_chars(T, p[i + 1], l) & *SPAN_E
1223  CASE FB_CODE : r &= special_chars(T, p[i + 1], l)
1224  CASE ELSE : r &= PEEK(ZSTRING, p[i])
1225  END SELECT
1226  END IF
1227  NEXT : RETURN r
1228 END FUNCTION
1229 
1230 
1231 
1248 FUNCTION Highlighter.searchPathNam(BYREF Nam AS STRING) AS STRING
1249  VAR p = INSTR(FbFiles, Nam)
1250  WHILE p
1251  SELECT CASE AS CONST FbFiles[p - 2]
1252  CASE ASC(NL) : RETURN Nam ' in main folder
1253  CASE ASC(SLASH)
1254  VAR pp = INSTRREV(FbFiles, NL, p) + 1
1255  RETURN MID(FbFiles, pp, p - pp + LEN(Nam)) ' in subfolder
1256  END SELECT
1257  p = INSTR(p + LEN(Nam), FbFiles, Nam)
1258  WEND : RETURN "" ' nothing found
1259 END FUNCTION
1260 
1261 
1262 
1273 FUNCTION Highlighter.prepare_html(BYVAL Hgh AS Highlighter PTR) AS STRING
1274  WITH PEEK(Highlighter, Hgh)
1275  VAR pa = 0, fb_nam = ""
1276  DO
1277  IF EOF(.Ifnr) THEN RETURN CHR(3) ELSE LINE INPUT #.Ifnr, .LastLine
1278  pa = INSTR(.LastLine, "<div class=""line""><a name=""l00001""") : IF pa THEN EXIT DO
1279  Code(.LastLine & NL)
1280  pa = INSTR(.LastLine, "<div class=""title"">") ' extract file name
1281  IF pa THEN
1282  pa += 19
1283  VAR pe = INSTR(pa, .LastLine, "</div>")
1284  fb_nam = .searchPathNam(MID(.LastLine, pa, pe - pa))
1285  IF 0 = LEN(fb_nam) THEN RETURN CHR(1)
1286  END IF
1287  LOOP
1288  Code(LEFT(.LastLine, pa - 1) & NL)
1289  Code(*.FBDOC_MARK & NL)
1290 
1291  DO
1292  pa = INSTR(pa + 1, .LastLine, "<a class=""code""")
1293  WHILE pa ' extract all links from this line
1294  VAR pe = INSTR(pa + 14, .LastLine, "</a>"), pp = INSTRREV(.LastLine, ">", pe - 1) + 1
1295  VAR word = MID(.LastLine, pp, pe - pp)
1296  VAR res = .Symbols->add(word, MID(.LastLine, pa, pe - pa + 4))
1297  pa = INSTR(pa + 1, .LastLine, "<a class=""code""")
1298  WEND
1299  IF EOF(.Ifnr) THEN RETURN CHR(3) ELSE LINE INPUT #.Ifnr, .LastLine
1300  LOOP UNTIL LEFT(.LastLine, 6) = "</div>"
1301  IF EOF(.Ifnr) THEN RETURN CHR(3) ELSE RETURN fb_nam
1302  END WITH
1303 END FUNCTION
1304 
1305 
1316 FUNCTION Highlighter.prepare_tex(BYVAL Hgh AS Highlighter PTR) AS STRING
1317  WITH PEEK(Highlighter, Hgh)
1318  IF EOF(.Ifnr) THEN RETURN CHR(3) ELSE LINE INPUT #.Ifnr, .LastLine
1319  Code(.LastLine & NL) ' write first line and extract file name
1320  VAR p1 = INSTR(.LastLine, "\section{") _
1321  , p2 = INSTR(p1 + 10, .LastLine, "}") _
1322  , fb_nam = ""
1323 
1324  FOR i AS INTEGER = p1 + 8 TO p2 - 2 ' remove LaTeX formating
1325  IF .LastLine[i] = ASC("\") THEN
1326  SELECT CASE AS CONST .LastLine[i + 1]
1327  CASE ASC("+"), ASC("-"), ASC("/") : i += 1 : CONTINUE FOR
1328  CASE ASC("_") : CONTINUE FOR
1329  END SELECT
1330  END IF
1331  fb_nam &= CHR(.LastLine[i])
1332  NEXT
1333  fb_nam = .searchPathNam(fb_nam) : IF 0 = LEN(fb_nam) THEN RETURN CHR(1)
1334 
1335  DO
1336  IF EOF(.Ifnr) THEN RETURN CHR(3) ELSE LINE INPUT #.Ifnr, .LastLine
1337  Code(.LastLine & NL)
1338  LOOP UNTIL .LastLine = "\begin{DoxyCode}" ' search code section
1339 
1340  IF EOF(.Ifnr) THEN RETURN CHR(3) ELSE LINE INPUT #.Ifnr, .LastLine
1341  IF .LastLine = *.FBDOC_MARK THEN RETURN CHR(2)
1342  Code(*.FBDOC_MARK & NL)
1343 
1344  DO ' search for links
1345  VAR pa = INSTR(.LastLine, "\hyper")
1346  IF pa = 1 THEN ' link for line number
1347  pa = INSTR(14, .LastLine, "\hyperlink{")
1348  var pm = INSTR(pa + 10, .LastLine, "}{") + 2 _
1349  , pe = INSTR(pm, .LastLine, "}") _
1350  , t = LEFT(.LastLine, pa - 2) & MID(.LastLine, pm, pe - pm + 1)
1351  .Symbols->add(MID(.LastLine, pm, pe - pm), t)
1352  pa = INSTR(pe + 1, .LastLine, "\hyperlink{")
1353  END IF
1354  WHILE pa ' links in source code
1355  VAR pm = INSTR(pa + 11, .LastLine, "}{") + 2 _
1356  , pe = INSTR(pm, .LastLine, "}") + 1 _
1357  , word = ""
1358  FOR i AS INTEGER = pm - 1 TO pe - 3
1359  IF .LastLine[i] <> ASC("\") THEN word &= CHR(.LastLine[i])
1360  NEXT
1361  .Symbols->add(word, MID(.LastLine, pa, pe - pa))
1362  pa = INSTR(pe, .LastLine, "\hyperlink{")
1363  WEND
1364  IF EOF(.Ifnr) THEN RETURN CHR(3) ELSE LINE INPUT #.Ifnr, .LastLine
1365  LOOP UNTIL .LastLine = "\end{DoxyCode}" : RETURN fb_nam
1366  END WITH
1367 END FUNCTION
1368 
1369 
1380 FUNCTION Highlighter.prepare_xml(BYVAL Hgh AS Highlighter PTR) AS STRING
1381  WITH PEEK(Highlighter, Hgh)
1382  VAR fb_nam = ""
1383  DO
1384  IF EOF(.Ifnr) THEN RETURN CHR(3) ELSE LINE INPUT #.Ifnr, .LastLine
1385  Code(.LastLine & NL)
1386  IF INSTR(.LastLine, "<programlisting>") THEN EXIT DO
1387  VAR pa = INSTR(.LastLine, "<compoundname>")
1388  IF pa THEN
1389  pa += 14
1390  VAR pe = INSTR(pa, .LastLine, "</compoundname>")
1391  fb_nam = .searchPathNam(MID(.LastLine, pa, pe - pa))
1392  IF 0 = LEN(fb_nam) THEN RETURN CHR(1)
1393  END IF
1394  LOOP
1395 
1396  IF EOF(.Ifnr) THEN RETURN CHR(3) ELSE LINE INPUT #.Ifnr, .LastLine
1397  IF .LastLine = *.FBDOC_MARK THEN RETURN CHR(2)
1398  Code(*.FBDOC_MARK & NL)
1399  DO
1400  VAR word = "", pm = INSTR(.LastLine, "refid=""")
1401  IF pm THEN
1402  VAR pa = INSTRREV(.LastLine, "<", pm - 1)
1403  pm = INSTR(pm + 8, .LastLine, ">")
1404  IF MID(.LastLine, pa, 5) = "<ref " THEN
1405  VAR pe = INSTR(pm + 1, .LastLine, "</ref>")
1406  pm += 1
1407  .Symbols->add(MID(.LastLine, pm, pe - pm), MID(.LastLine, pa, pe - pa + 6))
1408  ELSE
1409  VAR pe = pm + 1
1410  pm = INSTR(pa + 1, .LastLine, "lineno=""") + 8
1411  .Symbols->add(MID(.LastLine, pm, INSTR(pm + 1, .LastLine, """") - pm), _
1412  MID(.LastLine, pa, pe - pa))
1413  END IF
1414  END IF
1415  IF EOF(.Ifnr) THEN RETURN CHR(3) ELSE LINE INPUT #.Ifnr, .LastLine
1416  LOOP UNTIL INSTR(.LastLine, "</programlisting>")
1417  IF EOF(.Ifnr) THEN RETURN CHR(3) ELSE RETURN fb_nam
1418  END WITH
1419 END FUNCTION
1420 
1421 
1422 
1429 SUB synt_init CDECL(BYVAL P AS Parser PTR)
1430  WITH *P '&Parser* P;
1431  IF 0 = .UserTok THEN ' not in --syntax.mode, create new Highlighter
1432  VAR x = NEW Highlighter(P)
1433  IF 0 = OPT->InTree THEN .Po = .Fin ' skip all parsing
1434  x->LineNo = 1
1435  END IF
1436  .SrcBgn = 0
1437  END WITH
1438  WITH *CAST(Highlighter PTR, P->UserTok) '&Highlighter* P->UserTok
1439  IF .GenAny THEN .LineNo = 1 ELSE .Pars = P
1440  Code(.eol(.Symbols, .LineNo))
1441  END WITH
1442 END SUB
1443 
1444 
1445 
1452 SUB synt_exit CDECL(BYVAL P AS Parser PTR)
1453  WITH *CAST(Highlighter PTR, P->UserTok) '&Highlighter* P->UserTok
1454  .generate_all(SADD(P->Buf), P->Fin)
1455  'IF OPT->Level > 0 ORELSE OPT->RunMode <> OPT->FILE_MODE THEN EXIT SUB ' we're in #INCLUDE
1456  IF OPT->Level > 0 THEN EXIT SUB ' we're in #INCLUDE
1457 
1458  Code(.eol(.Symbols, 0) & NL)
1459  IF 0 = .GenAny THEN DELETE P->UserTok : P->UserTok = 0 ' not in --syntax-mode
1460  END WITH
1461 END SUB
1462 
1463 
1464 
1477 SUB synt_incl CDECL(BYVAL P AS Parser PTR)
1478  WITH *CAST(Highlighter PTR, P->UserTok) '&Highlighter* P->UserTok
1479  VAR fnam = TRIM(P->SubStr(P->NamTok), """")
1480  fnam = .special_chars(SADD(fnam), 0, LEN(fnam)) ' LaTeX underscore
1481  VAR res = IIF(.Symbols, .Symbols->rep(fnam), SADD(fnam))
1482 
1483  IF res = SADD(fnam) THEN
1484  .generate_all(SADD(P->Buf), P->NamTok[1])
1485  ELSE
1486  VAR i = INSTR(*res, fnam) _
1487  , j = i + LEN(fnam) _
1488  , a = P->StaTok[1] - 1 _
1489  , l = P->NamTok[1] - a
1490  .generate_all(SADD(P->Buf), a)
1491  Code(.generate_code(SADD(P->Buf), a, l) _
1492  & *.QUOT_A & LEFT(*res, i - 1) & fnam & MID(*res, j) & *.QUOT_E)
1493  END IF
1494  P->SrcBgn = P->NamTok[1] + P->NamTok[2]
1495  END WITH
1496 END SUB
1497 
1498 
1499 
1514 SUB synt_func CDECL(BYVAL P AS Parser PTR)
1515  WITH *CAST(Highlighter PTR, P->UserTok) '&Highlighter* P->UserTok
1516  VAR t = P->NamTok, nam = P->SubStr(t)
1517 
1518  SELECT CASE AS CONST *P->FunTok ' create a Doxygen name to search link
1519  CASE P->TOK_CTOR : t += 3 : IF OPT->Types = OPT->FB_STYLE THEN nam &= "::" & nam
1520  CASE P->TOK_DTOR : t += 3 : IF OPT->Types = OPT->FB_STYLE THEN nam &= "::~" & nam
1521  CASE ELSE
1522  WHILE t < P->EndTok
1523  t += 3
1524  SELECT CASE AS CONST *t
1525  CASE P->TOK_DOT : IF OPT->Types = OPT->FB_STYLE THEN nam &= "::" ELSE nam &= "."
1526  CASE P->TOK_WORD : nam &= P->SubStr(t)
1527  CASE ELSE : EXIT WHILE
1528  END SELECT
1529  WEND
1530  END SELECT
1531  nam = .special_chars(SADD(nam), 0, LEN(nam)) ' LaTeX underscore
1532  VAR res = IIF(.Symbols, .Symbols->rep(nam), SADD(nam))
1533  IF res = SADD(nam) THEN EXIT SUB
1534 
1535  .generate_all(SADD(P->Buf), P->Tk1[1])
1536 
1537  VAR i = INSTR(*res, nam) _
1538  , j = i + LEN(nam) _
1539  , a = IIF(P->DivTok, P->DivTok[1], P->StaTok[1]) _ ' ABSTRACT, VIRTUAL, ...
1540  , l = P->NamTok[1] - a
1541  P->SrcBgn = *(t - 2) + *(t - 1)
1542  nam = .special_chars(SADD(P->Buf), a + l, P->SrcBgn - P->NamTok[1]) ' orig. name
1543  Code(.generate_code(SADD(P->Buf), a, l) _
1544  & LEFT(*res, i - 1) & nam & MID(*res, j))
1545  END WITH
1546 END SUB
1547 
1548 
1549 
1556 SUB init_syntax(BYVAL Emi AS EmitterIF PTR)
1557  WITH *Emi
1558  .Init_ = @synt_init()
1559  .Exit_ = @synt_exit()
1560  .Incl_ = @synt_incl()
1561  .Func_ = @synt_func()
1562  END WITH
1563 END SUB
1564