From 16d9679b800ecafb3a12e339a290e7a5ff8b9e53 Mon Sep 17 00:00:00 2001 From: Cycloctane Date: Sun, 28 Sep 2025 02:24:10 +0800 Subject: [PATCH 1/3] parse "REM DISCNUMBER" and "REM TOTALDISCS" lines (cherry picked from commit e1925a9aee14fa8ecb8240277d5925671fca539e) --- cue_parser.y | 4 ++++ cue_scanner.l | 2 ++ libcue.h | 2 ++ rem.c | 2 ++ 4 files changed, 10 insertions(+) diff --git a/cue_parser.y b/cue_parser.y index 3b74ea5..01b172e 100644 --- a/cue_parser.y +++ b/cue_parser.y @@ -123,6 +123,8 @@ Cd *cue_parse_string(const char*); %type rem_item %token DATE %token COMMENT +%token DISCNUMBER +%token TOTALDISCS %token XXX_GENRE /* parsed in REM but stored in CD-TEXT */ %token REPLAYGAIN_ALBUM_GAIN %token REPLAYGAIN_ALBUM_PEAK @@ -313,6 +315,8 @@ rem rem_item : DATE | COMMENT + | DISCNUMBER + | TOTALDISCS | REPLAYGAIN_ALBUM_GAIN | REPLAYGAIN_ALBUM_PEAK | REPLAYGAIN_TRACK_GAIN diff --git a/cue_scanner.l b/cue_scanner.l index 8a190b7..c9b3d06 100644 --- a/cue_scanner.l +++ b/cue_scanner.l @@ -103,6 +103,8 @@ REM { BEGIN(REM); /* exclusive rules for special exceptions */ } DATE { BEGIN(NAME); yylval.ival = REM_DATE; return DATE; } COMMENT { BEGIN(NAME); yylval.ival = REM_COMMENT; return COMMENT; } +DISCNUMBER { BEGIN(NAME); yylval.ival = REM_DISCNUMBER; return DISCNUMBER; } +TOTALDISCS { BEGIN(NAME); yylval.ival = REM_TOTALDISCS; return TOTALDISCS; } GENRE { BEGIN(NAME); yylval.ival = PTI_GENRE; return XXX_GENRE; } REPLAYGAIN_ALBUM_GAIN { BEGIN(RPG); yylval.ival = REM_REPLAYGAIN_ALBUM_GAIN; return REPLAYGAIN_ALBUM_GAIN; } diff --git a/libcue.h b/libcue.h index 642042e..bad7cc5 100644 --- a/libcue.h +++ b/libcue.h @@ -99,6 +99,8 @@ enum Pti { enum RemType { REM_DATE, /* date of cd/track */ REM_COMMENT, + REM_DISCNUMBER, + REM_TOTALDISCS, REM_REPLAYGAIN_ALBUM_GAIN, REM_REPLAYGAIN_ALBUM_PEAK, REM_REPLAYGAIN_TRACK_GAIN, diff --git a/rem.c b/rem.c index 3ebd099..56074f2 100644 --- a/rem.c +++ b/rem.c @@ -39,6 +39,8 @@ rem_new( void) Rem rem[] = { {REM_DATE, NULL}, {REM_COMMENT, NULL}, + {REM_DISCNUMBER, NULL}, + {REM_TOTALDISCS, NULL}, {REM_REPLAYGAIN_ALBUM_GAIN, NULL}, {REM_REPLAYGAIN_ALBUM_PEAK, NULL}, {REM_REPLAYGAIN_TRACK_GAIN, NULL}, From f1d212e3d0418822a7cf85d177a203a86a14e6bb Mon Sep 17 00:00:00 2001 From: Cycloctane Date: Mon, 29 Sep 2025 02:38:02 +0800 Subject: [PATCH 2/3] add test for disc number and total discs --- t/standard_cue.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/t/standard_cue.c b/t/standard_cue.c index 52846a7..4177bf9 100644 --- a/t/standard_cue.c +++ b/t/standard_cue.c @@ -13,6 +13,8 @@ int tests_run; static char cue[] = "REM GENRE Alternative\n" "REM DATE 1991\n" "REM DISCID 860B640B\n" + "REM DISCNUMBER 1\n" + "REM TOTALDISCS 2\n" "REM COMMENT \"ExactAudioCopy v0.95b4\"\n" "PERFORMER \"My Bloody Valentine\"\n" "TITLE \"Loveless\"\n" @@ -54,6 +56,14 @@ static char* cue_test() mu_assert ("error getting CD date", val != NULL); mu_assert ("error validating CD date", strcmp (val, "1991") == 0); + val = rem_get (REM_DISCNUMBER, rem); + mu_assert ("error getting CD disc number", val != NULL); + mu_assert ("error validating CD disc number", strcmp (val, "1") == 0); + + val = rem_get (REM_TOTALDISCS, rem); + mu_assert ("error getting CD total discs", val != NULL); + mu_assert ("error validating CD total discs", strcmp (val, "2") == 0); + val = rem_get (REM_COMMENT, rem); mu_assert ("error getting CD comment", val != NULL); mu_assert ("error validating CD comment", strcmp (val, "ExactAudioCopy v0.95b4") == 0); From b4acf6fb885188466f32bfe598206507f71b7ed2 Mon Sep 17 00:00:00 2001 From: Cycloctane Date: Mon, 29 Sep 2025 11:37:42 +0800 Subject: [PATCH 3/3] move new REM fields to the end --- cue_parser.y | 12 ++++++------ cue_scanner.l | 6 +++--- libcue.h | 6 +++--- rem.c | 6 +++--- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/cue_parser.y b/cue_parser.y index 01b172e..c648e04 100644 --- a/cue_parser.y +++ b/cue_parser.y @@ -122,14 +122,14 @@ Cd *cue_parse_string(const char*); /* REM */ %type rem_item %token DATE -%token COMMENT -%token DISCNUMBER -%token TOTALDISCS %token XXX_GENRE /* parsed in REM but stored in CD-TEXT */ %token REPLAYGAIN_ALBUM_GAIN %token REPLAYGAIN_ALBUM_PEAK %token REPLAYGAIN_TRACK_GAIN %token REPLAYGAIN_TRACK_PEAK +%token COMMENT +%token DISCNUMBER +%token TOTALDISCS %% cuefile @@ -314,13 +314,13 @@ rem rem_item : DATE - | COMMENT - | DISCNUMBER - | TOTALDISCS | REPLAYGAIN_ALBUM_GAIN | REPLAYGAIN_ALBUM_PEAK | REPLAYGAIN_TRACK_GAIN | REPLAYGAIN_TRACK_PEAK + | COMMENT + | DISCNUMBER + | TOTALDISCS ; end_cd diff --git a/cue_scanner.l b/cue_scanner.l index c9b3d06..7ea71d0 100644 --- a/cue_scanner.l +++ b/cue_scanner.l @@ -102,9 +102,6 @@ ISRC { BEGIN(NAME); return TRACK_ISRC; } REM { BEGIN(REM); /* exclusive rules for special exceptions */ } DATE { BEGIN(NAME); yylval.ival = REM_DATE; return DATE; } -COMMENT { BEGIN(NAME); yylval.ival = REM_COMMENT; return COMMENT; } -DISCNUMBER { BEGIN(NAME); yylval.ival = REM_DISCNUMBER; return DISCNUMBER; } -TOTALDISCS { BEGIN(NAME); yylval.ival = REM_TOTALDISCS; return TOTALDISCS; } GENRE { BEGIN(NAME); yylval.ival = PTI_GENRE; return XXX_GENRE; } REPLAYGAIN_ALBUM_GAIN { BEGIN(RPG); yylval.ival = REM_REPLAYGAIN_ALBUM_GAIN; return REPLAYGAIN_ALBUM_GAIN; } @@ -114,6 +111,9 @@ REM { BEGIN(REM); /* exclusive rules for special exceptions */ } return REPLAYGAIN_TRACK_GAIN; } REPLAYGAIN_TRACK_PEAK { BEGIN(RPG); yylval.ival = REM_REPLAYGAIN_TRACK_PEAK; return REPLAYGAIN_TRACK_PEAK; } +COMMENT { BEGIN(NAME); yylval.ival = REM_COMMENT; return COMMENT; } +DISCNUMBER { BEGIN(NAME); yylval.ival = REM_DISCNUMBER; return DISCNUMBER; } +TOTALDISCS { BEGIN(NAME); yylval.ival = REM_TOTALDISCS; return TOTALDISCS; } {ws}+ { BEGIN(REM); } . { BEGIN(REM); } diff --git a/libcue.h b/libcue.h index bad7cc5..e2c70f8 100644 --- a/libcue.h +++ b/libcue.h @@ -98,13 +98,13 @@ enum Pti { enum RemType { REM_DATE, /* date of cd/track */ - REM_COMMENT, - REM_DISCNUMBER, - REM_TOTALDISCS, REM_REPLAYGAIN_ALBUM_GAIN, REM_REPLAYGAIN_ALBUM_PEAK, REM_REPLAYGAIN_TRACK_GAIN, REM_REPLAYGAIN_TRACK_PEAK, + REM_COMMENT, + REM_DISCNUMBER, + REM_TOTALDISCS, REM_END /* terminating REM (for stepping through REMs) */ }; diff --git a/rem.c b/rem.c index 56074f2..3900a44 100644 --- a/rem.c +++ b/rem.c @@ -38,13 +38,13 @@ rem_new( void) Rem rem[] = { {REM_DATE, NULL}, - {REM_COMMENT, NULL}, - {REM_DISCNUMBER, NULL}, - {REM_TOTALDISCS, NULL}, {REM_REPLAYGAIN_ALBUM_GAIN, NULL}, {REM_REPLAYGAIN_ALBUM_PEAK, NULL}, {REM_REPLAYGAIN_TRACK_GAIN, NULL}, {REM_REPLAYGAIN_TRACK_PEAK, NULL}, + {REM_COMMENT, NULL}, + {REM_DISCNUMBER, NULL}, + {REM_TOTALDISCS, NULL}, {REM_END, NULL} };