xref: /Universal-ctags/parsers/asp.c (revision 16a2541c0698bd8ee03c1be8172ef3191f6e695a)
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