13ae02089SMasatake YAMATO /*
23ae02089SMasatake YAMATO * Copyright (c) 2011, 2012 Steven Oliver <oliver.steven@gmail.com>
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 Falcon language
83ae02089SMasatake YAMATO * files.
93ae02089SMasatake YAMATO */
103ae02089SMasatake YAMATO
113ae02089SMasatake YAMATO
123ae02089SMasatake YAMATO /*
133ae02089SMasatake YAMATO * INCLUDE FILES
143ae02089SMasatake YAMATO */
153ae02089SMasatake YAMATO #include "general.h"
163ae02089SMasatake YAMATO
173ae02089SMasatake YAMATO #include <string.h>
183ae02089SMasatake YAMATO #include <ctype.h>
193ae02089SMasatake YAMATO
203ae02089SMasatake YAMATO #include "read.h"
21*0d502ef0SMasatake YAMATO #include "kind.h"
22*0d502ef0SMasatake YAMATO #include "parse.h"
233db72c21SMasatake YAMATO #include "routines.h"
243ae02089SMasatake YAMATO
253ae02089SMasatake YAMATO /*
263ae02089SMasatake YAMATO * Data Definitions
273ae02089SMasatake YAMATO */
283ae02089SMasatake YAMATO typedef enum eFalconKinds {
293ae02089SMasatake YAMATO K_CLASS,
303ae02089SMasatake YAMATO K_FUNCTION,
313ae02089SMasatake YAMATO K_MEMBER,
323ae02089SMasatake YAMATO K_VARIABLE,
333ae02089SMasatake YAMATO K_NAMESPACE
343ae02089SMasatake YAMATO } falconKind;
353ae02089SMasatake YAMATO
36e112e8abSMasatake YAMATO static kindDefinition FalconKinds [] = {
37ce990805SThomas Braun {true, 'c', "class", "classes" },
38ce990805SThomas Braun {true, 'f', "function", "functions"},
39ce990805SThomas Braun {true, 'm', "member", "class members"},
40ce990805SThomas Braun {true, 'v', "variable", "variables"},
41ce990805SThomas Braun {true, 'i', "namespace", "imports"}
423ae02089SMasatake YAMATO };
433ae02089SMasatake YAMATO
443ae02089SMasatake YAMATO /*
453ae02089SMasatake YAMATO * Function Definitions
463ae02089SMasatake YAMATO */
473ae02089SMasatake YAMATO
isIdentifierChar(int c)48ce990805SThomas Braun static bool isIdentifierChar (int c)
493ae02089SMasatake YAMATO {
50ce990805SThomas Braun return (bool) (isalnum (c));
513ae02089SMasatake YAMATO }
523ae02089SMasatake YAMATO
skipSpace(const unsigned char * cp)533ae02089SMasatake YAMATO static const unsigned char *skipSpace (const unsigned char *cp)
543ae02089SMasatake YAMATO {
553ae02089SMasatake YAMATO while (isspace ((int) *cp))
563ae02089SMasatake YAMATO ++cp;
573ae02089SMasatake YAMATO
583ae02089SMasatake YAMATO return cp;
593ae02089SMasatake YAMATO }
603ae02089SMasatake YAMATO
613ae02089SMasatake YAMATO /*
623ae02089SMasatake YAMATO * Main parsing function
633ae02089SMasatake YAMATO */
643ae02089SMasatake YAMATO
findFalconTags(void)653ae02089SMasatake YAMATO static void findFalconTags (void)
663ae02089SMasatake YAMATO {
673ae02089SMasatake YAMATO vString *name = vStringNew ();
683ae02089SMasatake YAMATO const unsigned char *line;
693ae02089SMasatake YAMATO
701b312fe7SMasatake YAMATO while ((line = readLineFromInputFile ()) != NULL)
713ae02089SMasatake YAMATO {
723ae02089SMasatake YAMATO const unsigned char *cp = line;
733ae02089SMasatake YAMATO
743ae02089SMasatake YAMATO // Skip lines starting with # which in falcon
753ae02089SMasatake YAMATO // would only be the "crunch bang" statement
763ae02089SMasatake YAMATO if (*cp == '#')
773ae02089SMasatake YAMATO continue;
783ae02089SMasatake YAMATO
793ae02089SMasatake YAMATO if (strncmp ((const char*) cp, "function", (size_t) 8) == 0)
803ae02089SMasatake YAMATO {
813ae02089SMasatake YAMATO cp += 8;
823ae02089SMasatake YAMATO cp = skipSpace (cp);
833ae02089SMasatake YAMATO
843ae02089SMasatake YAMATO while (isIdentifierChar ((int) *cp))
853ae02089SMasatake YAMATO {
863ae02089SMasatake YAMATO vStringPut (name, (int) *cp);
873ae02089SMasatake YAMATO ++cp;
883ae02089SMasatake YAMATO }
8916a2541cSMasatake YAMATO makeSimpleTag (name, K_FUNCTION);
903ae02089SMasatake YAMATO vStringClear (name);
913ae02089SMasatake YAMATO }
923ae02089SMasatake YAMATO else if (strncmp ((const char*) cp, "class", (size_t) 5) == 0)
933ae02089SMasatake YAMATO {
943ae02089SMasatake YAMATO cp += 5;
953ae02089SMasatake YAMATO cp = skipSpace (cp);
963ae02089SMasatake YAMATO
973ae02089SMasatake YAMATO while (isIdentifierChar ((int) *cp))
983ae02089SMasatake YAMATO {
993ae02089SMasatake YAMATO vStringPut (name, (int) *cp);
1003ae02089SMasatake YAMATO ++cp;
1013ae02089SMasatake YAMATO }
10216a2541cSMasatake YAMATO makeSimpleTag (name, K_CLASS);
1033ae02089SMasatake YAMATO vStringClear (name);
1043ae02089SMasatake YAMATO }
1053ae02089SMasatake YAMATO else if (strncmp ((const char*) cp, "load", (size_t) 4) == 0)
1063ae02089SMasatake YAMATO {
1073ae02089SMasatake YAMATO cp += 4;
1083ae02089SMasatake YAMATO cp = skipSpace (cp);
1093ae02089SMasatake YAMATO
1103ae02089SMasatake YAMATO while (isIdentifierChar ((int) *cp))
1113ae02089SMasatake YAMATO {
1123ae02089SMasatake YAMATO vStringPut (name, (int) *cp);
1133ae02089SMasatake YAMATO ++cp;
1143ae02089SMasatake YAMATO }
11516a2541cSMasatake YAMATO makeSimpleTag (name, K_NAMESPACE);
1163ae02089SMasatake YAMATO vStringClear (name);
1173ae02089SMasatake YAMATO }
1183ae02089SMasatake YAMATO else if (strncmp ((const char*) cp, "import from", (size_t) 11) == 0)
1193ae02089SMasatake YAMATO {
1203ae02089SMasatake YAMATO cp += 12;
1213ae02089SMasatake YAMATO cp = skipSpace (cp);
1223ae02089SMasatake YAMATO
1233ae02089SMasatake YAMATO while (isIdentifierChar ((int) *cp))
1243ae02089SMasatake YAMATO {
1253ae02089SMasatake YAMATO vStringPut (name, (int) *cp);
1263ae02089SMasatake YAMATO ++cp;
1273ae02089SMasatake YAMATO }
12816a2541cSMasatake YAMATO makeSimpleTag (name, K_NAMESPACE);
1293ae02089SMasatake YAMATO vStringClear (name);
1303ae02089SMasatake YAMATO }
1313ae02089SMasatake YAMATO }
1323ae02089SMasatake YAMATO vStringDelete (name);
1333ae02089SMasatake YAMATO }
1343ae02089SMasatake YAMATO
1353ae02089SMasatake YAMATO /*
1363ae02089SMasatake YAMATO * Parser definition structure
1373ae02089SMasatake YAMATO */
FalconParser(void)1383ae02089SMasatake YAMATO extern parserDefinition* FalconParser (void)
1393ae02089SMasatake YAMATO {
1403ae02089SMasatake YAMATO static const char *const extensions [] = { "fal", "ftd", NULL };
1413ae02089SMasatake YAMATO parserDefinition *def = parserNew ("Falcon");
14209ae690fSMasatake YAMATO def->kindTable = FalconKinds;
1433db72c21SMasatake YAMATO def->kindCount = ARRAY_SIZE (FalconKinds);
1443ae02089SMasatake YAMATO def->extensions = extensions;
1453ae02089SMasatake YAMATO def->parser = findFalconTags;
1463ae02089SMasatake YAMATO return def;
1473ae02089SMasatake YAMATO }
148