xref: /Universal-ctags/parsers/scheme.c (revision dbeba0347d706a300f7fccd163ee5dbaf6dc71b2)
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 Scheme language
83ae02089SMasatake YAMATO *   files.
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_FUNCTION, K_SET
283ae02089SMasatake YAMATO } schemeKind;
293ae02089SMasatake YAMATO 
30e112e8abSMasatake YAMATO static kindDefinition SchemeKinds [] = {
31ce990805SThomas Braun 	{ true, 'f', "function", "functions" },
32ce990805SThomas Braun 	{ true, 's', "set",      "sets" }
333ae02089SMasatake YAMATO };
343ae02089SMasatake YAMATO 
353ae02089SMasatake YAMATO /*
363ae02089SMasatake YAMATO *   FUNCTION DEFINITIONS
373ae02089SMasatake YAMATO */
383ae02089SMasatake YAMATO 
393ae02089SMasatake YAMATO /* Algorithm adapted from from GNU etags.
403ae02089SMasatake YAMATO  * Scheme tag functions
413ae02089SMasatake YAMATO  * look for (def... xyzzy
423ae02089SMasatake YAMATO  * look for (def... (xyzzy
433ae02089SMasatake YAMATO  * look for (def ... ((... (xyzzy ....
443ae02089SMasatake YAMATO  * look for (set! xyzzy
453ae02089SMasatake YAMATO  */
readIdentifier(vString * const name,const unsigned char * cp)463ae02089SMasatake YAMATO static void readIdentifier (vString *const name, const unsigned char *cp)
473ae02089SMasatake YAMATO {
483ae02089SMasatake YAMATO 	const unsigned char *p;
493ae02089SMasatake YAMATO 	vStringClear (name);
503ae02089SMasatake YAMATO 	/* Go till you get to white space or a syntactic break */
513ae02089SMasatake YAMATO 	for (p = cp; *p != '\0' && *p != '(' && *p != ')' && !isspace (*p); p++)
523ae02089SMasatake YAMATO 		vStringPut (name, (int) *p);
533ae02089SMasatake YAMATO }
543ae02089SMasatake YAMATO 
findSchemeTags(void)553ae02089SMasatake YAMATO static void findSchemeTags (void)
563ae02089SMasatake YAMATO {
573ae02089SMasatake YAMATO 	vString *name = vStringNew ();
583ae02089SMasatake YAMATO 	const unsigned char *line;
593ae02089SMasatake YAMATO 
601b312fe7SMasatake YAMATO 	while ((line = readLineFromInputFile ()) != NULL)
613ae02089SMasatake YAMATO 	{
623ae02089SMasatake YAMATO 		const unsigned char *cp = line;
633ae02089SMasatake YAMATO 
643ae02089SMasatake YAMATO 		if (cp [0] == '(' &&
653ae02089SMasatake YAMATO 			(cp [1] == 'D' || cp [1] == 'd') &&
663ae02089SMasatake YAMATO 			(cp [2] == 'E' || cp [2] == 'e') &&
673ae02089SMasatake YAMATO 			(cp [3] == 'F' || cp [3] == 'f'))
683ae02089SMasatake YAMATO 		{
69f49b9a7bSMasatake YAMATO 			while (*cp != '\0'  &&  !isspace (*cp))
703ae02089SMasatake YAMATO 				cp++;
713ae02089SMasatake YAMATO 			/* Skip over open parens and white space */
72f49b9a7bSMasatake YAMATO 			do {
733ae02089SMasatake YAMATO 				while (*cp != '\0' && (isspace (*cp) || *cp == '('))
743ae02089SMasatake YAMATO 					cp++;
75f49b9a7bSMasatake YAMATO 				if (*cp == '\0')
761b312fe7SMasatake YAMATO 					cp = line = readLineFromInputFile ();
77f49b9a7bSMasatake YAMATO 				else
78f49b9a7bSMasatake YAMATO 					break;
79f49b9a7bSMasatake YAMATO 			} while (line);
80f49b9a7bSMasatake YAMATO 			if (line == NULL)
81f49b9a7bSMasatake YAMATO 				break;
823ae02089SMasatake YAMATO 			readIdentifier (name, cp);
8316a2541cSMasatake YAMATO 			makeSimpleTag (name, K_FUNCTION);
843ae02089SMasatake YAMATO 		}
853ae02089SMasatake YAMATO 		if (cp [0] == '(' &&
863ae02089SMasatake YAMATO 			(cp [1] == 'S' || cp [1] == 's') &&
873ae02089SMasatake YAMATO 			(cp [2] == 'E' || cp [2] == 'e') &&
883ae02089SMasatake YAMATO 			(cp [3] == 'T' || cp [3] == 't') &&
8912830437SMasatake YAMATO 			(cp [4] == '!') &&
90d193e812SMasatake YAMATO 			(isspace (cp [5]) || cp[5] == '\0'))
913ae02089SMasatake YAMATO 		{
92d193e812SMasatake YAMATO 			cp += 5;
933ae02089SMasatake YAMATO 			/* Skip over white space */
94d193e812SMasatake YAMATO 			do {
95d193e812SMasatake YAMATO 				while (*cp != '\0' && isspace (*cp))
963ae02089SMasatake YAMATO 					cp++;
97d193e812SMasatake YAMATO 				if (*cp == '\0')
981b312fe7SMasatake YAMATO 					cp = line = readLineFromInputFile ();
99d193e812SMasatake YAMATO 				else
100d193e812SMasatake YAMATO 					break;
101d193e812SMasatake YAMATO 			} while (line);
102d193e812SMasatake YAMATO 			if (line == NULL)
103d193e812SMasatake YAMATO 				break;
1043ae02089SMasatake YAMATO 			readIdentifier (name, cp);
10516a2541cSMasatake YAMATO 			makeSimpleTag (name, K_SET);
1063ae02089SMasatake YAMATO 		}
1073ae02089SMasatake YAMATO 	}
1083ae02089SMasatake YAMATO 	vStringDelete (name);
1093ae02089SMasatake YAMATO }
1103ae02089SMasatake YAMATO 
SchemeParser(void)1113ae02089SMasatake YAMATO extern parserDefinition* SchemeParser (void)
1123ae02089SMasatake YAMATO {
1133ae02089SMasatake YAMATO 	static const char *const extensions [] = {
114*dbeba034SPaul Vorobyev 		"SCM", "SM", "sch", "scheme", "scm", "sm", "rkt", NULL
1153ae02089SMasatake YAMATO 	};
1163ae02089SMasatake YAMATO 	static const char *const aliases [] = {
117*dbeba034SPaul Vorobyev 		"gosh", "guile", "racket", NULL
1183ae02089SMasatake YAMATO 	};
1193ae02089SMasatake YAMATO 	parserDefinition* def = parserNew ("Scheme");
12009ae690fSMasatake YAMATO 	def->kindTable      = SchemeKinds;
1213db72c21SMasatake YAMATO 	def->kindCount  = ARRAY_SIZE (SchemeKinds);
1223ae02089SMasatake YAMATO 	def->extensions = extensions;
1233ae02089SMasatake YAMATO 	def->aliases    = aliases;
1243ae02089SMasatake YAMATO 	def->parser     = findSchemeTags;
1253ae02089SMasatake YAMATO 	return def;
1263ae02089SMasatake YAMATO }
127