commit 788540d4a424924c494826a8897c6fcccf0e15fa
parent f0d20c50522d925f96b013d63c1d5e67bfbf6988
Author: nibo <nibo@relim.de>
Date: Thu, 13 Jun 2024 13:04:48 +0200
Add comment parsing
Diffstat:
2 files changed, 17 insertions(+), 2 deletions(-)
diff --git a/chordpro.c b/chordpro.c
@@ -52,6 +52,8 @@ static const char *the_state(enum State state)
return "STATE_MARKUP_ATTR_NAME";
case STATE_MARKUP_ATTR_VALUE:
return "STATE_MARKUP_ATTR_VALUE";
+ case STATE_COMMENT:
+ return "STATE_COMMENT";
}
return "";
}
@@ -1041,6 +1043,7 @@ END:
struct ChoSong **cho_parse(FILE *fp)
{
char buf;
+ char prev_buf;
char directive_name[16];
char directive_value[512];
char chord[15];
@@ -1082,9 +1085,13 @@ struct ChoSong **cho_parse(FILE *fp)
while (feof(fp) == 0) {
read = fread(&buf, 1, 1, fp);
if (read == 1) {
- // printf("state: %s, buf: %c\n", the_state(state), buf);
+ // printf("state: %s, prev_buf: %c, buf: %c\n", the_state(state), prev_buf, buf);
switch (state) {
case STATE_LYRICS:
+ if (prev_buf == '\n' && buf == '#') {
+ state = STATE_COMMENT;
+ break;
+ }
if (buf == '{') {
state = STATE_DIRECTIVE_NAME;
break;
@@ -1529,7 +1536,14 @@ struct ChoSong **cho_parse(FILE *fp)
tags[ta]->attrs[at]->value[atv] = buf;
atv++;
break;
+ case STATE_COMMENT:
+ if (buf == '\n') {
+ state = STATE_LYRICS;
+ break;
+ }
+ break;
}
+ prev_buf = buf;
} else if (ferror(fp) != 0) {
fprintf(stderr, "fread failed.\n");
return NULL;
diff --git a/chordpro.h b/chordpro.h
@@ -83,7 +83,8 @@ enum State {
STATE_MARKUP_TAG_END,
STATE_MARKUP_TAG,
STATE_MARKUP_ATTR_NAME,
- STATE_MARKUP_ATTR_VALUE
+ STATE_MARKUP_ATTR_VALUE,
+ STATE_COMMENT
};
enum DirectiveType {