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