lorid

convert chordpro to pdf
git clone git://git.relim.de/lorid.git
Log | Files | Refs | README | LICENSE

commit 788540d4a424924c494826a8897c6fcccf0e15fa
parent f0d20c50522d925f96b013d63c1d5e67bfbf6988
Author: nibo <nibo@relim.de>
Date:   Thu, 13 Jun 2024 13:04:48 +0200

Add comment parsing

Diffstat:
Mchordpro.c | 16+++++++++++++++-
Mchordpro.h | 3++-
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 {