13ae02089SMasatake YAMATO /*
23ae02089SMasatake YAMATO * Copyright (c) 2000, Patrick Dehne <patrick@steidle.net>
33ae02089SMasatake YAMATO *
43ae02089SMasatake YAMATO * This source code is released for free distribution under the terms of the
50ce38835Sviccuad * GNU General Public License version 2 or (at your option) any later version.
63ae02089SMasatake YAMATO *
73ae02089SMasatake YAMATO * This module contains functions for generating tags for the ASP (Active
83ae02089SMasatake YAMATO * Server Pages) web page scripting language.
93ae02089SMasatake YAMATO */
103ae02089SMasatake YAMATO
113ae02089SMasatake YAMATO /*
123ae02089SMasatake YAMATO * INCLUDE FILES
133ae02089SMasatake YAMATO */
143ae02089SMasatake YAMATO #include "general.h" /* must always come first */
153ae02089SMasatake YAMATO
163ae02089SMasatake YAMATO #include <string.h>
173ae02089SMasatake YAMATO
183ae02089SMasatake YAMATO #include "parse.h"
193ae02089SMasatake YAMATO #include "read.h"
203db72c21SMasatake YAMATO #include "routines.h"
213ae02089SMasatake YAMATO #include "vstring.h"
223ae02089SMasatake YAMATO
233ae02089SMasatake YAMATO /*
243ae02089SMasatake YAMATO * DATA DEFINITIONS
253ae02089SMasatake YAMATO */
263ae02089SMasatake YAMATO typedef enum {
273ae02089SMasatake YAMATO K_CONST, K_CLASS, K_FUNCTION, K_SUB, K_DIM
283ae02089SMasatake YAMATO } aspKind;
293ae02089SMasatake YAMATO
30e112e8abSMasatake YAMATO static kindDefinition AspKinds [] = {
31ce990805SThomas Braun { true, 'd', "constant", "constants"},
32ce990805SThomas Braun { true, 'c', "class", "classes"},
33ce990805SThomas Braun { true, 'f', "function", "functions"},
34ce990805SThomas Braun { true, 's', "subroutine", "subroutines"},
35ce990805SThomas Braun { true, 'v', "variable", "variables"}
363ae02089SMasatake YAMATO };
373ae02089SMasatake YAMATO
383ae02089SMasatake YAMATO /*
393ae02089SMasatake YAMATO * FUNCTION DEFINITIONS
403ae02089SMasatake YAMATO */
413ae02089SMasatake YAMATO
findAspTags(void)423ae02089SMasatake YAMATO static void findAspTags (void)
433ae02089SMasatake YAMATO {
443ae02089SMasatake YAMATO vString *name = vStringNew ();
453ae02089SMasatake YAMATO const unsigned char *line;
463ae02089SMasatake YAMATO
471b312fe7SMasatake YAMATO while ((line = readLineFromInputFile ()) != NULL)
483ae02089SMasatake YAMATO {
493ae02089SMasatake YAMATO const unsigned char *cp = line;
503ae02089SMasatake YAMATO
513ae02089SMasatake YAMATO while (*cp != '\0')
523ae02089SMasatake YAMATO {
533ae02089SMasatake YAMATO /* jump over whitespace */
543ae02089SMasatake YAMATO while (isspace ((int)*cp))
553ae02089SMasatake YAMATO cp++;
563ae02089SMasatake YAMATO
573ae02089SMasatake YAMATO /* jump over strings */
583ae02089SMasatake YAMATO if (*cp == '"')
593ae02089SMasatake YAMATO {
603ae02089SMasatake YAMATO cp++;
613ae02089SMasatake YAMATO while (*cp!='"' && *cp!='\0')
623ae02089SMasatake YAMATO cp++;
633ae02089SMasatake YAMATO }
643ae02089SMasatake YAMATO
653ae02089SMasatake YAMATO /* jump over comments */
663ae02089SMasatake YAMATO else if (*cp == '\'')
673ae02089SMasatake YAMATO break;
683ae02089SMasatake YAMATO
693ae02089SMasatake YAMATO /* jump over end function/sub lines */
703ae02089SMasatake YAMATO else if (strncasecmp ((const char*) cp, "end", (size_t) 3)== 0)
713ae02089SMasatake YAMATO {
723ae02089SMasatake YAMATO cp += 3;
733ae02089SMasatake YAMATO if (isspace ((int)*cp))
743ae02089SMasatake YAMATO {
753ae02089SMasatake YAMATO while (isspace ((int)*cp))
763ae02089SMasatake YAMATO ++cp;
773ae02089SMasatake YAMATO
783ae02089SMasatake YAMATO if (strncasecmp ((const char*) cp, "function", (size_t) 8) == 0)
793ae02089SMasatake YAMATO {
803ae02089SMasatake YAMATO cp+=8;
813ae02089SMasatake YAMATO break;
823ae02089SMasatake YAMATO }
833ae02089SMasatake YAMATO
843ae02089SMasatake YAMATO else if (strncasecmp ((const char*) cp, "sub", (size_t) 3) == 0)
853ae02089SMasatake YAMATO {
863ae02089SMasatake YAMATO cp+=3;
873ae02089SMasatake YAMATO break;
883ae02089SMasatake YAMATO }
893ae02089SMasatake YAMATO }
903ae02089SMasatake YAMATO }
913ae02089SMasatake YAMATO
923ae02089SMasatake YAMATO /* jump over exit function/sub lines */
933ae02089SMasatake YAMATO else if (strncasecmp ((const char*) cp, "exit", (size_t) 4)==0)
943ae02089SMasatake YAMATO {
953ae02089SMasatake YAMATO cp += 4;
963ae02089SMasatake YAMATO if (isspace ((int) *cp))
973ae02089SMasatake YAMATO {
983ae02089SMasatake YAMATO while (isspace ((int) *cp))
993ae02089SMasatake YAMATO ++cp;
1003ae02089SMasatake YAMATO
1013ae02089SMasatake YAMATO if (strncasecmp ((const char*) cp, "function", (size_t) 8) == 0)
1023ae02089SMasatake YAMATO {
1033ae02089SMasatake YAMATO cp+=8;
1043ae02089SMasatake YAMATO break;
1053ae02089SMasatake YAMATO }
1063ae02089SMasatake YAMATO
1073ae02089SMasatake YAMATO else if (strncasecmp ((const char*) cp, "sub", (size_t) 3) == 0)
1083ae02089SMasatake YAMATO {
1093ae02089SMasatake YAMATO cp+=3;
1103ae02089SMasatake YAMATO break;
1113ae02089SMasatake YAMATO }
1123ae02089SMasatake YAMATO }
1133ae02089SMasatake YAMATO }
1143ae02089SMasatake YAMATO
1153ae02089SMasatake YAMATO /* class member? */
1163ae02089SMasatake YAMATO else if (strncasecmp ((const char*) cp, "public", (size_t) 6) == 0)
1173ae02089SMasatake YAMATO {
1183ae02089SMasatake YAMATO cp += 6;
1193ae02089SMasatake YAMATO if (isspace ((int) *cp))
1203ae02089SMasatake YAMATO {
1213ae02089SMasatake YAMATO while (isspace ((int) *cp))
1223ae02089SMasatake YAMATO ++cp;
1233ae02089SMasatake YAMATO if (strncasecmp ((const char*) cp, "function", (size_t) 8) == 0)
1243ae02089SMasatake YAMATO {
1253ae02089SMasatake YAMATO cp+=8;
1263ae02089SMasatake YAMATO while (isspace ((int) *cp))
1273ae02089SMasatake YAMATO ++cp;
1283ae02089SMasatake YAMATO while (isalnum ((int) *cp) || *cp == '_')
1293ae02089SMasatake YAMATO {
1303ae02089SMasatake YAMATO vStringPut (name, (int) *cp);
1313ae02089SMasatake YAMATO ++cp;
1323ae02089SMasatake YAMATO }
133*16a2541cSMasatake YAMATO makeSimpleTag (name, K_FUNCTION);
1343ae02089SMasatake YAMATO vStringClear (name);
1353ae02089SMasatake YAMATO }
1363ae02089SMasatake YAMATO else if (strncasecmp ((const char*) cp, "sub", (size_t) 3) == 0)
1373ae02089SMasatake YAMATO {
1383ae02089SMasatake YAMATO cp+=3;
1393ae02089SMasatake YAMATO while (isspace ((int) *cp))
1403ae02089SMasatake YAMATO ++cp;
1413ae02089SMasatake YAMATO while (isalnum ((int) *cp) || *cp == '_')
1423ae02089SMasatake YAMATO {
1433ae02089SMasatake YAMATO vStringPut (name, (int) *cp);
1443ae02089SMasatake YAMATO ++cp;
1453ae02089SMasatake YAMATO }
146*16a2541cSMasatake YAMATO makeSimpleTag (name, K_SUB);
1473ae02089SMasatake YAMATO vStringClear (name);
1483ae02089SMasatake YAMATO }
1493ae02089SMasatake YAMATO else {
1503ae02089SMasatake YAMATO while (isalnum ((int) *cp) || *cp == '_')
1513ae02089SMasatake YAMATO {
1523ae02089SMasatake YAMATO vStringPut (name, (int) *cp);
1533ae02089SMasatake YAMATO ++cp;
1543ae02089SMasatake YAMATO }
155*16a2541cSMasatake YAMATO makeSimpleTag (name, K_DIM);
1563ae02089SMasatake YAMATO vStringClear (name);
1573ae02089SMasatake YAMATO }
1583ae02089SMasatake YAMATO }
1593ae02089SMasatake YAMATO }
1603ae02089SMasatake YAMATO else if (strncasecmp ((const char*) cp, "private", (size_t) 7) == 0)
1613ae02089SMasatake YAMATO {
1623ae02089SMasatake YAMATO cp += 7;
1633ae02089SMasatake YAMATO if (isspace ((int) *cp))
1643ae02089SMasatake YAMATO {
1653ae02089SMasatake YAMATO while (isspace ((int) *cp))
1663ae02089SMasatake YAMATO ++cp;
1673ae02089SMasatake YAMATO if (strncasecmp ((const char*) cp, "function", (size_t) 8) == 0)
1683ae02089SMasatake YAMATO {
1693ae02089SMasatake YAMATO cp+=8;
1703ae02089SMasatake YAMATO while (isspace ((int) *cp))
1713ae02089SMasatake YAMATO ++cp;
1723ae02089SMasatake YAMATO while (isalnum ((int) *cp) || *cp == '_')
1733ae02089SMasatake YAMATO {
1743ae02089SMasatake YAMATO vStringPut (name, (int) *cp);
1753ae02089SMasatake YAMATO ++cp;
1763ae02089SMasatake YAMATO }
177*16a2541cSMasatake YAMATO makeSimpleTag (name, K_FUNCTION);
1783ae02089SMasatake YAMATO vStringClear (name);
1793ae02089SMasatake YAMATO }
1803ae02089SMasatake YAMATO else if (strncasecmp ((const char*) cp, "sub", (size_t) 3) == 0)
1813ae02089SMasatake YAMATO {
1823ae02089SMasatake YAMATO cp+=3;
1833ae02089SMasatake YAMATO while (isspace ((int) *cp))
1843ae02089SMasatake YAMATO ++cp;
1853ae02089SMasatake YAMATO while (isalnum ((int) *cp) || *cp == '_')
1863ae02089SMasatake YAMATO {
1873ae02089SMasatake YAMATO vStringPut (name, (int) *cp);
1883ae02089SMasatake YAMATO ++cp;
1893ae02089SMasatake YAMATO }
190*16a2541cSMasatake YAMATO makeSimpleTag (name, K_SUB);
1913ae02089SMasatake YAMATO vStringClear (name);
1923ae02089SMasatake YAMATO }
1933ae02089SMasatake YAMATO else {
1943ae02089SMasatake YAMATO while (isalnum ((int) *cp) || *cp == '_')
1953ae02089SMasatake YAMATO {
1963ae02089SMasatake YAMATO vStringPut (name, (int) *cp);
1973ae02089SMasatake YAMATO ++cp;
1983ae02089SMasatake YAMATO }
199*16a2541cSMasatake YAMATO makeSimpleTag (name, K_DIM);
2003ae02089SMasatake YAMATO vStringClear (name);
2013ae02089SMasatake YAMATO }
2023ae02089SMasatake YAMATO }
2033ae02089SMasatake YAMATO }
2043ae02089SMasatake YAMATO
2053ae02089SMasatake YAMATO /* function? */
2063ae02089SMasatake YAMATO else if (strncasecmp ((const char*) cp, "function", (size_t) 8) == 0)
2073ae02089SMasatake YAMATO {
2083ae02089SMasatake YAMATO cp += 8;
2093ae02089SMasatake YAMATO
2103ae02089SMasatake YAMATO if (isspace ((int) *cp))
2113ae02089SMasatake YAMATO {
2123ae02089SMasatake YAMATO while (isspace ((int) *cp))
2133ae02089SMasatake YAMATO ++cp;
2143ae02089SMasatake YAMATO while (isalnum ((int) *cp) || *cp == '_')
2153ae02089SMasatake YAMATO {
2163ae02089SMasatake YAMATO vStringPut (name, (int) *cp);
2173ae02089SMasatake YAMATO ++cp;
2183ae02089SMasatake YAMATO }
219*16a2541cSMasatake YAMATO makeSimpleTag (name, K_FUNCTION);
2203ae02089SMasatake YAMATO vStringClear (name);
2213ae02089SMasatake YAMATO }
2223ae02089SMasatake YAMATO }
2233ae02089SMasatake YAMATO
2243ae02089SMasatake YAMATO /* sub? */
2253ae02089SMasatake YAMATO else if (strncasecmp ((const char*) cp, "sub", (size_t) 3) == 0)
2263ae02089SMasatake YAMATO {
2273ae02089SMasatake YAMATO cp += 3;
2283ae02089SMasatake YAMATO if (isspace ((int) *cp))
2293ae02089SMasatake YAMATO {
2303ae02089SMasatake YAMATO while (isspace ((int) *cp))
2313ae02089SMasatake YAMATO ++cp;
2323ae02089SMasatake YAMATO while (isalnum ((int) *cp) || *cp == '_')
2333ae02089SMasatake YAMATO {
2343ae02089SMasatake YAMATO vStringPut (name, (int) *cp);
2353ae02089SMasatake YAMATO ++cp;
2363ae02089SMasatake YAMATO }
237*16a2541cSMasatake YAMATO makeSimpleTag (name, K_SUB);
2383ae02089SMasatake YAMATO vStringClear (name);
2393ae02089SMasatake YAMATO }
2403ae02089SMasatake YAMATO }
2413ae02089SMasatake YAMATO
2423ae02089SMasatake YAMATO /* dim variable? */
2433ae02089SMasatake YAMATO else if (strncasecmp ((const char*) cp, "dim", (size_t) 3) == 0)
2443ae02089SMasatake YAMATO {
2453ae02089SMasatake YAMATO cp += 3;
2463ae02089SMasatake YAMATO if (isspace ((int) *cp))
2473ae02089SMasatake YAMATO {
2483ae02089SMasatake YAMATO while (isspace ((int) *cp))
2493ae02089SMasatake YAMATO ++cp;
2503ae02089SMasatake YAMATO while (isalnum ((int) *cp) || *cp == '_')
2513ae02089SMasatake YAMATO {
2523ae02089SMasatake YAMATO vStringPut (name, (int) *cp);
2533ae02089SMasatake YAMATO ++cp;
2543ae02089SMasatake YAMATO }
255*16a2541cSMasatake YAMATO makeSimpleTag (name, K_DIM);
2563ae02089SMasatake YAMATO vStringClear (name);
2573ae02089SMasatake YAMATO }
2583ae02089SMasatake YAMATO }
2593ae02089SMasatake YAMATO
2603ae02089SMasatake YAMATO /* class declaration? */
2613ae02089SMasatake YAMATO else if (strncasecmp ((const char*) cp, "class", (size_t) 5) == 0)
2623ae02089SMasatake YAMATO {
2633ae02089SMasatake YAMATO cp += 5;
2643ae02089SMasatake YAMATO if (isspace ((int) *cp))
2653ae02089SMasatake YAMATO {
2663ae02089SMasatake YAMATO while (isspace ((int) *cp))
2673ae02089SMasatake YAMATO ++cp;
2683ae02089SMasatake YAMATO while (isalnum ((int) *cp) || *cp == '_')
2693ae02089SMasatake YAMATO {
2703ae02089SMasatake YAMATO vStringPut (name, (int) *cp);
2713ae02089SMasatake YAMATO ++cp;
2723ae02089SMasatake YAMATO }
273*16a2541cSMasatake YAMATO makeSimpleTag (name, K_CLASS);
2743ae02089SMasatake YAMATO vStringClear (name);
2753ae02089SMasatake YAMATO }
2763ae02089SMasatake YAMATO }
2773ae02089SMasatake YAMATO
2783ae02089SMasatake YAMATO /* const declaration? */
2793ae02089SMasatake YAMATO else if (strncasecmp ((const char*) cp, "const", (size_t) 5) == 0)
2803ae02089SMasatake YAMATO {
2813ae02089SMasatake YAMATO cp += 5;
2823ae02089SMasatake YAMATO if (isspace ((int) *cp))
2833ae02089SMasatake YAMATO {
2843ae02089SMasatake YAMATO while (isspace ((int) *cp))
2853ae02089SMasatake YAMATO ++cp;
2863ae02089SMasatake YAMATO while (isalnum ((int) *cp) || *cp == '_')
2873ae02089SMasatake YAMATO {
2883ae02089SMasatake YAMATO vStringPut (name, (int) *cp);
2893ae02089SMasatake YAMATO ++cp;
2903ae02089SMasatake YAMATO }
291*16a2541cSMasatake YAMATO makeSimpleTag (name, K_CONST);
2923ae02089SMasatake YAMATO vStringClear (name);
2933ae02089SMasatake YAMATO }
2943ae02089SMasatake YAMATO }
2953ae02089SMasatake YAMATO
2963ae02089SMasatake YAMATO /* nothing relevant */
2973ae02089SMasatake YAMATO else if (*cp != '\0')
2983ae02089SMasatake YAMATO cp++;
2993ae02089SMasatake YAMATO }
3003ae02089SMasatake YAMATO }
3013ae02089SMasatake YAMATO vStringDelete (name);
3023ae02089SMasatake YAMATO }
3033ae02089SMasatake YAMATO
AspParser(void)3043ae02089SMasatake YAMATO extern parserDefinition* AspParser (void)
3053ae02089SMasatake YAMATO {
3063ae02089SMasatake YAMATO static const char *const extensions [] = { "asp", "asa", NULL };
3073ae02089SMasatake YAMATO parserDefinition* def = parserNew ("Asp");
30809ae690fSMasatake YAMATO def->kindTable = AspKinds;
3093db72c21SMasatake YAMATO def->kindCount = ARRAY_SIZE (AspKinds);
3103ae02089SMasatake YAMATO def->extensions = extensions;
3113ae02089SMasatake YAMATO def->parser = findAspTags;
3123ae02089SMasatake YAMATO return def;
3133ae02089SMasatake YAMATO }
314