xref: /Universal-ctags/parsers/awk.c (revision ba6da7fe4dea7d44306cc949fde6a58fcfb8e2ba)
13ae02089SMasatake YAMATO /*
23ae02089SMasatake YAMATO  *   Copyright (c) 2000-2002, Darren Hiebert
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 AWK functions.
83ae02089SMasatake YAMATO  */
93ae02089SMasatake YAMATO 
103ae02089SMasatake YAMATO /*
113ae02089SMasatake YAMATO  *   INCLUDE FILES
123ae02089SMasatake YAMATO  */
133ae02089SMasatake YAMATO #include "general.h"  /* must always come first */
143ae02089SMasatake YAMATO 
153ae02089SMasatake YAMATO #include <string.h>
163ae02089SMasatake YAMATO 
173ae02089SMasatake YAMATO #include "parse.h"
183ae02089SMasatake YAMATO #include "read.h"
193db72c21SMasatake YAMATO #include "routines.h"
203ae02089SMasatake YAMATO #include "vstring.h"
213ae02089SMasatake YAMATO 
223ae02089SMasatake YAMATO /*
233ae02089SMasatake YAMATO  *   DATA DEFINITIONS
243ae02089SMasatake YAMATO  */
253ae02089SMasatake YAMATO typedef enum eAwkKinds {
263ae02089SMasatake YAMATO 	K_FUNCTION
273ae02089SMasatake YAMATO } awkKind;
283ae02089SMasatake YAMATO 
29e112e8abSMasatake YAMATO static kindDefinition AwkKinds [] = {
30ce990805SThomas Braun 	{ true, 'f', "function", "functions" }
313ae02089SMasatake YAMATO };
323ae02089SMasatake YAMATO 
333ae02089SMasatake YAMATO /*
343ae02089SMasatake YAMATO  *   FUNCTION DEFINITIONS
353ae02089SMasatake YAMATO  */
363ae02089SMasatake YAMATO 
findAwkTags(void)373ae02089SMasatake YAMATO static void findAwkTags (void)
383ae02089SMasatake YAMATO {
393ae02089SMasatake YAMATO 	vString *name = vStringNew ();
403ae02089SMasatake YAMATO 	const unsigned char *line;
413ae02089SMasatake YAMATO 
421b312fe7SMasatake YAMATO 	while ((line = readLineFromInputFile ()) != NULL)
433ae02089SMasatake YAMATO 	{
44*b1e612edSDoug Kearns 		while (isspace ((int) *line))
45*b1e612edSDoug Kearns 			++line;
46*b1e612edSDoug Kearns 
473ae02089SMasatake YAMATO 		if (strncmp ((const char *) line, "function", (size_t) 8) == 0  &&
483ae02089SMasatake YAMATO 			isspace ((int) line [8]))
493ae02089SMasatake YAMATO 		{
503ae02089SMasatake YAMATO 			const unsigned char *cp = line + 8;
513ae02089SMasatake YAMATO 
523ae02089SMasatake YAMATO 			while (isspace ((int) *cp))
533ae02089SMasatake YAMATO 				++cp;
543ae02089SMasatake YAMATO 			while (isalnum ((int) *cp)  ||  *cp == '_')
553ae02089SMasatake YAMATO 			{
563ae02089SMasatake YAMATO 				vStringPut (name, (int) *cp);
573ae02089SMasatake YAMATO 				++cp;
583ae02089SMasatake YAMATO 			}
593ae02089SMasatake YAMATO 			while (isspace ((int) *cp))
603ae02089SMasatake YAMATO 				++cp;
613ae02089SMasatake YAMATO 			if (*cp == '(')
6216a2541cSMasatake YAMATO 				makeSimpleTag (name, K_FUNCTION);
633ae02089SMasatake YAMATO 			vStringClear (name);
643ae02089SMasatake YAMATO 			if (*cp != '\0')
653ae02089SMasatake YAMATO 				++cp;
663ae02089SMasatake YAMATO 		}
673ae02089SMasatake YAMATO 	}
683ae02089SMasatake YAMATO 	vStringDelete (name);
693ae02089SMasatake YAMATO }
703ae02089SMasatake YAMATO 
AwkParser(void)713ae02089SMasatake YAMATO extern parserDefinition *AwkParser (void)
723ae02089SMasatake YAMATO {
733ae02089SMasatake YAMATO 	static const char *const extensions [] = { "awk", "gawk", "mawk", NULL };
741eb00ca9SDoug Kearns 	static const char *const aliases [] = { "gawk", "mawk", NULL };
753ae02089SMasatake YAMATO 	parserDefinition *def = parserNew ("Awk");
7609ae690fSMasatake YAMATO 	def->kindTable  = AwkKinds;
773db72c21SMasatake YAMATO 	def->kindCount  = ARRAY_SIZE (AwkKinds);
783ae02089SMasatake YAMATO 	def->extensions = extensions;
7990119000SMasatake YAMATO 	def->aliases    = aliases;
803ae02089SMasatake YAMATO 	def->parser     = findAwkTags;
813ae02089SMasatake YAMATO 	return def;
823ae02089SMasatake YAMATO }
83