xref: /Universal-ctags/parsers/falcon.c (revision 0d502ef01a06f2d53250c160a71a28508c360d68)
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