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