xref: /Universal-ctags/parsers/abc.c (revision 42f590c59bf4cf61797679632de1249bcee3c3fb)
1*42f590c5SJiří Techet /*
2*42f590c5SJiří Techet *   Copyright (c) 2009, Eric Forgeot
3*42f590c5SJiří Techet *
4*42f590c5SJiří Techet *   Based on work by Jon Strait
5*42f590c5SJiří Techet *
6*42f590c5SJiří Techet *   This source code is released for free distribution under the terms of the
7*42f590c5SJiří Techet *   GNU General Public License version 2 or (at your opinion) any later version.
8*42f590c5SJiří Techet *
9*42f590c5SJiří Techet *   This module contains functions for generating tags for Abc files
10*42f590c5SJiří Techet *   (https://en.wikipedia.org/wiki/ABC_notation).
11*42f590c5SJiří Techet */
12*42f590c5SJiří Techet 
13*42f590c5SJiří Techet /*
14*42f590c5SJiří Techet *   INCLUDE FILES
15*42f590c5SJiří Techet */
16*42f590c5SJiří Techet #include "general.h"	/* must always come first */
17*42f590c5SJiří Techet 
18*42f590c5SJiří Techet #include <ctype.h>
19*42f590c5SJiří Techet #include <string.h>
20*42f590c5SJiří Techet 
21*42f590c5SJiří Techet #include "parse.h"
22*42f590c5SJiří Techet #include "read.h"
23*42f590c5SJiří Techet #include "vstring.h"
24*42f590c5SJiří Techet #include "routines.h"
25*42f590c5SJiří Techet #include "entry.h"
26*42f590c5SJiří Techet 
27*42f590c5SJiří Techet /*
28*42f590c5SJiří Techet *   DATA DEFINITIONS
29*42f590c5SJiří Techet */
30*42f590c5SJiří Techet 
31*42f590c5SJiří Techet typedef enum {
32*42f590c5SJiří Techet    K_SECTION,
33*42f590c5SJiří Techet } AbcKind;
34*42f590c5SJiří Techet 
35*42f590c5SJiří Techet static kindDefinition AbcKinds[] = {
36*42f590c5SJiří Techet 	{ true, 's', "section", "sections" },
37*42f590c5SJiří Techet };
38*42f590c5SJiří Techet 
39*42f590c5SJiří Techet /*
40*42f590c5SJiří Techet *   FUNCTION DEFINITIONS
41*42f590c5SJiří Techet */
42*42f590c5SJiří Techet 
findAbcTags(void)43*42f590c5SJiří Techet static void findAbcTags (void)
44*42f590c5SJiří Techet {
45*42f590c5SJiří Techet 	vString *name = vStringNew();
46*42f590c5SJiří Techet 	const unsigned char *line;
47*42f590c5SJiří Techet 
48*42f590c5SJiří Techet 	while ((line = readLineFromInputFile()) != NULL)
49*42f590c5SJiří Techet 	{
50*42f590c5SJiří Techet 		if (line[0] == 'T') {
51*42f590c5SJiří Techet 			vStringCatS(name, " / ");
52*42f590c5SJiří Techet 			vStringCatS(name, (const char *) line);
53*42f590c5SJiří Techet 			makeSimpleTag(name, K_SECTION);
54*42f590c5SJiří Techet 		}
55*42f590c5SJiří Techet 		else {
56*42f590c5SJiří Techet 			vStringClear (name);
57*42f590c5SJiří Techet 			if (! isspace(*line))
58*42f590c5SJiří Techet 				vStringCatS(name, (const char*) line);
59*42f590c5SJiří Techet 		}
60*42f590c5SJiří Techet 	}
61*42f590c5SJiří Techet 	vStringDelete (name);
62*42f590c5SJiří Techet }
63*42f590c5SJiří Techet 
AbcParser(void)64*42f590c5SJiří Techet extern parserDefinition* AbcParser (void)
65*42f590c5SJiří Techet {
66*42f590c5SJiří Techet 	static const char *const patterns [] = { "*.abc", NULL };
67*42f590c5SJiří Techet 	static const char *const extensions [] = { "abc", NULL };
68*42f590c5SJiří Techet 	parserDefinition* const def = parserNew ("Abc");
69*42f590c5SJiří Techet 
70*42f590c5SJiří Techet 	def->kindTable = AbcKinds;
71*42f590c5SJiří Techet 	def->kindCount = ARRAY_SIZE (AbcKinds);
72*42f590c5SJiří Techet 	def->patterns = patterns;
73*42f590c5SJiří Techet 	def->extensions = extensions;
74*42f590c5SJiří Techet 	def->parser = findAbcTags;
75*42f590c5SJiří Techet 	return def;
76*42f590c5SJiří Techet }
77*42f590c5SJiří Techet 
78