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