@@ -10,10 +10,13 @@ TOC_OBJS= toc_parse.o toc_scan.o toc_print.o | |||
# so we need a prefix to aviod conflicts. | |||
# (NOTE: these lines require GNU Make) | |||
toc_scan.c: LFLAGS+= -Ptoc_yy | |||
cue_scan.c: LFLAGS+= -Pcue_yy | |||
toc_parse.c: YFLAGS+= -p toc_yy | |||
cue_parse.c: YFLAGS+= -p cue_yy | |||
# these have been moved to the source files to prepare for automake | |||
# for flex, used %option prefix="cue_yy" | |||
#toc_scan.c: LFLAGS+= -Ptoc_yy | |||
#cue_scan.c: LFLAGS+= -Pcue_yy | |||
# for yacc, used cue_parse_prefix.h with defines | |||
#toc_parse.c: YFLAGS+= -p toc_yy | |||
#cue_parse.c: YFLAGS+= -p cue_yy | |||
all: $(TARGETS) | |||
@@ -11,10 +11,11 @@ | |||
#include <string.h> | |||
#include "cd.h" | |||
#include "time.h" | |||
#include "cue_parse_prefix.h" | |||
#define YYDEBUG 1 | |||
extern int cue_yylex(); | |||
extern int yylex(); | |||
void yyerror (char *s); | |||
static Cd *cd = NULL; | |||
@@ -259,7 +260,7 @@ time | |||
/* lexer interface */ | |||
extern int cue_lineno; | |||
extern int cue_yydebug; | |||
extern int yydebug; | |||
extern FILE *cue_yyin; | |||
void yyerror (char *s) | |||
@@ -270,9 +271,9 @@ void yyerror (char *s) | |||
Cd *cue_parse (FILE *fp) | |||
{ | |||
cue_yyin = fp; | |||
cue_yydebug = 0; | |||
yydebug = 0; | |||
if (0 == cue_yyparse()) | |||
if (0 == yyparse()) | |||
return cd; | |||
return NULL; | |||
@@ -0,0 +1,44 @@ | |||
/* Remap normal yacc names so we can have multiple parsers | |||
* see http://www.gnu.org/software/automake/manual/html_node/Yacc-and-Lex.html | |||
*/ | |||
#define yymaxdepth cue_yymaxdepth | |||
#define yyparse cue_yyparse | |||
#define yylex cue_yylex | |||
#define yyerror cue_yyerror | |||
#define yylval cue_yylval | |||
#define yychar cue_yychar | |||
#define yydebug cue_yydebug | |||
#define yypact cue_yypact | |||
#define yyr1 cue_yyr1 | |||
#define yyr2 cue_yyr2 | |||
#define yydef cue_yydef | |||
#define yychk cue_yychk | |||
#define yypgo cue_yypgo | |||
#define yyact cue_yyact | |||
#define yyexca cue_yyexca | |||
#define yyerrflag cue_yyerrflag | |||
#define yynerrs cue_yynerrs | |||
#define yyps cue_yyps | |||
#define yypv cue_yypv | |||
#define yys cue_yys | |||
#define yy_yys cue_yy_yys | |||
#define yystate cue_yystate | |||
#define yytmp cue_yytmp | |||
#define yyv cue_yyv | |||
#define yy_yyv cue_yy_yyv | |||
#define yyval cue_yyval | |||
#define yylloc cue_yylloc | |||
#define yyreds cue_yyreds | |||
#define yytoks cue_yytoks | |||
#define yylhs cue_yylhs | |||
#define yylen cue_yylen | |||
#define yydefred cue_yydefred | |||
#define yydgoto cue_yydgoto | |||
#define yysinde cue_yysindex | |||
#define yyrindex cue_yyrindex | |||
#define yygindex cue_yygindex | |||
#define yytable cue_yytable | |||
#define yycheck cue_yycheck | |||
#define yyname cue_yyname | |||
#define yyrule cue_yyrule |
@@ -9,6 +9,7 @@ | |||
#include <stdlib.h> | |||
#include <string.h> | |||
#include "cd.h" | |||
#include "cue_parse_prefix.h" | |||
#include "cue_parse.h" | |||
int cue_lineno = 1; | |||
@@ -18,6 +19,7 @@ ws [ \t\r] | |||
nonws [^ \t\r\n] | |||
%option noyywrap | |||
%option prefix="cue_yy" | |||
%s NAME | |||
@@ -25,14 +27,14 @@ nonws [^ \t\r\n] | |||
\'([^\']|\\\')*\' | | |||
\"([^\"]|\\\")*\" { | |||
cue_yylval.sval = strdup(yytext + 1); | |||
cue_yylval.sval[strlen(cue_yylval.sval) - 1] = '\0'; | |||
yylval.sval = strdup(yytext + 1); | |||
yylval.sval[strlen(yylval.sval) - 1] = '\0'; | |||
BEGIN(INITIAL); | |||
return STRING; | |||
} | |||
<NAME>{nonws}+ { | |||
cue_yylval.sval = strdup(yytext); | |||
yylval.sval = strdup(yytext); | |||
BEGIN(INITIAL); | |||
return STRING; | |||
} | |||
@@ -48,45 +50,45 @@ WAVE { return WAVE; } | |||
MP3 { return MP3; } | |||
TRACK { return TRACK; } | |||
AUDIO { cue_yylval.ival = MODE_AUDIO; return AUDIO; } | |||
MODE1\/2048 { cue_yylval.ival = MODE_MODE1; return MODE1_2048; } | |||
MODE1\/2352 { cue_yylval.ival = MODE_MODE1_RAW; return MODE1_2352; } | |||
MODE2\/2336 { cue_yylval.ival = MODE_MODE2; return MODE2_2336; } | |||
MODE2\/2048 { cue_yylval.ival = MODE_MODE2_FORM1; return MODE2_2048; } | |||
MODE2\/2342 { cue_yylval.ival = MODE_MODE2_FORM2; return MODE2_2342; } | |||
MODE2\/2332 { cue_yylval.ival = MODE_MODE2_FORM_MIX; return MODE2_2332; } | |||
MODE2\/2352 { cue_yylval.ival = MODE_MODE2_RAW; return MODE2_2352; } | |||
AUDIO { yylval.ival = MODE_AUDIO; return AUDIO; } | |||
MODE1\/2048 { yylval.ival = MODE_MODE1; return MODE1_2048; } | |||
MODE1\/2352 { yylval.ival = MODE_MODE1_RAW; return MODE1_2352; } | |||
MODE2\/2336 { yylval.ival = MODE_MODE2; return MODE2_2336; } | |||
MODE2\/2048 { yylval.ival = MODE_MODE2_FORM1; return MODE2_2048; } | |||
MODE2\/2342 { yylval.ival = MODE_MODE2_FORM2; return MODE2_2342; } | |||
MODE2\/2332 { yylval.ival = MODE_MODE2_FORM_MIX; return MODE2_2332; } | |||
MODE2\/2352 { yylval.ival = MODE_MODE2_RAW; return MODE2_2352; } | |||
FLAGS { return FLAGS; } | |||
PRE { cue_yylval.ival = FLAG_PRE_EMPHASIS; return PRE; } | |||
DCP { cue_yylval.ival = FLAG_COPY_PERMITTED; return DCP; } | |||
4CH { cue_yylval.ival = FLAG_FOUR_CHANNEL; return FOUR_CH; } | |||
SCMS { cue_yylval.ival = FLAG_SCMS; return SCMS; } | |||
PRE { yylval.ival = FLAG_PRE_EMPHASIS; return PRE; } | |||
DCP { yylval.ival = FLAG_COPY_PERMITTED; return DCP; } | |||
4CH { yylval.ival = FLAG_FOUR_CHANNEL; return FOUR_CH; } | |||
SCMS { yylval.ival = FLAG_SCMS; return SCMS; } | |||
PREGAP { return PREGAP; } | |||
INDEX { return INDEX; } | |||
POSTGAP { return POSTGAP; } | |||
TITLE { BEGIN(NAME); cue_yylval.ival = PTI_TITLE; return TITLE; } | |||
PERFORMER { BEGIN(NAME); cue_yylval.ival = PTI_PERFORMER; return PERFORMER; } | |||
SONGWRITER { BEGIN(NAME); cue_yylval.ival = PTI_SONGWRITER; return SONGWRITER; } | |||
COMPOSER { BEGIN(NAME); cue_yylval.ival = PTI_COMPOSER; return COMPOSER; } | |||
ARRANGER { BEGIN(NAME); cue_yylval.ival = PTI_ARRANGER; return ARRANGER; } | |||
MESSAGE { BEGIN(NAME); cue_yylval.ival = PTI_MESSAGE; return MESSAGE; } | |||
DISC_ID { BEGIN(NAME); cue_yylval.ival = PTI_DISC_ID; return DISC_ID; } | |||
GENRE { BEGIN(NAME); cue_yylval.ival = PTI_GENRE; return GENRE; } | |||
TOC_INFO1 { BEGIN(NAME); cue_yylval.ival = PTI_TOC_INFO1; return TOC_INFO1; } | |||
TOC_INFO2 { BEGIN(NAME); cue_yylval.ival = PTI_TOC_INFO2; return TOC_INFO2; } | |||
UPC_EAN { BEGIN(NAME); cue_yylval.ival = PTI_UPC_ISRC; return UPC_EAN; } | |||
ISRC/{ws}+\" { BEGIN(NAME); cue_yylval.ival = PTI_UPC_ISRC; return ISRC; } | |||
SIZE_INFO { BEGIN(NAME); cue_yylval.ival = PTI_SIZE_INFO; return SIZE_INFO; } | |||
TITLE { BEGIN(NAME); yylval.ival = PTI_TITLE; return TITLE; } | |||
PERFORMER { BEGIN(NAME); yylval.ival = PTI_PERFORMER; return PERFORMER; } | |||
SONGWRITER { BEGIN(NAME); yylval.ival = PTI_SONGWRITER; return SONGWRITER; } | |||
COMPOSER { BEGIN(NAME); yylval.ival = PTI_COMPOSER; return COMPOSER; } | |||
ARRANGER { BEGIN(NAME); yylval.ival = PTI_ARRANGER; return ARRANGER; } | |||
MESSAGE { BEGIN(NAME); yylval.ival = PTI_MESSAGE; return MESSAGE; } | |||
DISC_ID { BEGIN(NAME); yylval.ival = PTI_DISC_ID; return DISC_ID; } | |||
GENRE { BEGIN(NAME); yylval.ival = PTI_GENRE; return GENRE; } | |||
TOC_INFO1 { BEGIN(NAME); yylval.ival = PTI_TOC_INFO1; return TOC_INFO1; } | |||
TOC_INFO2 { BEGIN(NAME); yylval.ival = PTI_TOC_INFO2; return TOC_INFO2; } | |||
UPC_EAN { BEGIN(NAME); yylval.ival = PTI_UPC_ISRC; return UPC_EAN; } | |||
ISRC/{ws}+\" { BEGIN(NAME); yylval.ival = PTI_UPC_ISRC; return ISRC; } | |||
SIZE_INFO { BEGIN(NAME); yylval.ival = PTI_SIZE_INFO; return SIZE_INFO; } | |||
ISRC { BEGIN(NAME); return TRACK_ISRC; } | |||
^{ws}*REM.*\n { cue_lineno++; /* ignore comments */ } | |||
{ws}+ { /* ignore whitespace */ } | |||
[[:digit:]]+ { cue_yylval.ival = atoi(yytext); return NUMBER; } | |||
[[:digit:]]+ { yylval.ival = atoi(yytext); return NUMBER; } | |||
: { return yytext[0]; } | |||
^{ws}*\n { cue_lineno++; /* blank line */ } | |||
@@ -11,10 +11,11 @@ | |||
#include <string.h> | |||
#include "cd.h" | |||
#include "time.h" | |||
#include "toc_parse_prefix.h" | |||
#define YYDEBUG 1 | |||
extern int toc_yylex(); | |||
extern int yylex(); | |||
void yyerror (char *s); | |||
static Cd *cd = NULL; | |||
@@ -325,7 +326,7 @@ opt_nl | |||
/* lexer interface */ | |||
extern int toc_lineno; | |||
extern int toc_yydebug; | |||
extern int yydebug; | |||
extern FILE *toc_yyin; | |||
void yyerror (char *s) | |||
@@ -336,9 +337,9 @@ void yyerror (char *s) | |||
Cd *toc_parse (FILE *fp) | |||
{ | |||
toc_yyin = fp; | |||
toc_yydebug = 0; | |||
yydebug = 0; | |||
if (0 == toc_yyparse()) | |||
if (0 == yyparse()) | |||
return cd; | |||
return NULL; | |||
@@ -0,0 +1,44 @@ | |||
/* Remap normal yacc names so we can have multiple parsers | |||
* see http://www.gnu.org/software/automake/manual/html_node/Yacc-and-Lex.html | |||
*/ | |||
#define yymaxdepth toc_yymaxdepth | |||
#define yyparse toc_yyparse | |||
#define yylex toc_yylex | |||
#define yyerror toc_yyerror | |||
#define yylval toc_yylval | |||
#define yychar toc_ychar | |||
#define yydebug toc_yydebug | |||
#define yypact toc_yypact | |||
#define yyr1 toc_yyr1 | |||
#define yyr2 toc_yyr2 | |||
#define yydef toc_yydef | |||
#define yychk toc_yychk | |||
#define yypgo toc_yypgo | |||
#define yyact toc_yyact | |||
#define yyexca toc_yyexca | |||
#define yyerrflag toc_yyerrflag | |||
#define yynerrs toc_yynerrs | |||
#define yyps toc_yyps | |||
#define yypv toc_yypv | |||
#define yys toc_yys | |||
#define yy_yys toc_yy_yys | |||
#define yystate toc_yystate | |||
#define yytmp toc_yytmp | |||
#define yyv toc_yyv | |||
#define yy_yyv toc_yy_yyv | |||
#define yyval toc_yyval | |||
#define yylloc toc_yylloc | |||
#define yyreds toc_yyreds | |||
#define yytoks toc_yytoks | |||
#define yylhs toc_yylhs | |||
#define yylen toc_yylen | |||
#define yydefred toc_yydefred | |||
#define yydgoto toc_yydgoto | |||
#define yysinde toc_yysindex | |||
#define yyrindex toc_yyrindex | |||
#define yygindex toc_yygindex | |||
#define yytable toc_yytable | |||
#define yycheck toc_yycheck | |||
#define yyname toc_yyname | |||
#define yyrule toc_yyrule |
@@ -9,6 +9,7 @@ | |||
#include <stdlib.h> | |||
#include <string.h> | |||
#include "cd.h" | |||
#include "toc_parse_prefix.h" | |||
#include "toc_parse.h" | |||
int toc_lineno = 1; | |||
@@ -18,6 +19,7 @@ ws [ \t\r] | |||
nonws [^ \t\r\n] | |||
%option noyywrap | |||
%option prefix="toc_yy" | |||
%s NAME | |||
@@ -25,41 +27,41 @@ nonws [^ \t\r\n] | |||
\'([^\']|\\\')*\' | | |||
\"([^\"]|\\\")*\" { | |||
toc_yylval.sval = strdup(yytext + 1); | |||
toc_yylval.sval[strlen(toc_yylval.sval) - 1] = '\0'; | |||
yylval.sval = strdup(yytext + 1); | |||
yylval.sval[strlen(yylval.sval) - 1] = '\0'; | |||
BEGIN(INITIAL); | |||
return STRING; | |||
} | |||
<NAME>{nonws}+ { | |||
toc_yylval.sval = strdup(yytext); | |||
yylval.sval = strdup(yytext); | |||
BEGIN(INITIAL); | |||
return STRING; | |||
} | |||
CATALOG { BEGIN(NAME); return CATALOG; } | |||
CD_DA { toc_yylval.ival = MODE_CD_DA; return CD_DA; } | |||
CD_ROM { toc_yylval.ival = MODE_CD_ROM; return CD_ROM; } | |||
CD_ROM_XA { toc_yylval.ival = MODE_CD_ROM_XA; return CD_ROM_XA; } | |||
CD_DA { yylval.ival = MODE_CD_DA; return CD_DA; } | |||
CD_ROM { yylval.ival = MODE_CD_ROM; return CD_ROM; } | |||
CD_ROM_XA { yylval.ival = MODE_CD_ROM_XA; return CD_ROM_XA; } | |||
TRACK { return TRACK; } | |||
AUDIO { toc_yylval.ival = MODE_AUDIO; return AUDIO; } | |||
MODE1 { toc_yylval.ival = MODE_MODE1; return MODE1; } | |||
MODE1_RAW { toc_yylval.ival = MODE_MODE1_RAW; return MODE1_RAW; } | |||
MODE2 { toc_yylval.ival = MODE_MODE2; return MODE2; } | |||
MODE2_FORM1 { toc_yylval.ival = MODE_MODE2_FORM1; return MODE2_FORM1; } | |||
MODE2_FORM2 { toc_yylval.ival = MODE_MODE2_FORM2; return MODE2_FORM2; } | |||
MODE2_FORM_MIX { toc_yylval.ival = MODE_MODE2_FORM_MIX; return MODE2_FORM_MIX; } | |||
MODE2_RAW { toc_yylval.ival = MODE_MODE2_RAW; return MODE2_RAW; } | |||
RW { toc_yylval.ival = SUB_MODE_RW; return RW; } | |||
RW_RAW { toc_yylval.ival = SUB_MODE_RW_RAW; return RW_RAW; } | |||
AUDIO { yylval.ival = MODE_AUDIO; return AUDIO; } | |||
MODE1 { yylval.ival = MODE_MODE1; return MODE1; } | |||
MODE1_RAW { yylval.ival = MODE_MODE1_RAW; return MODE1_RAW; } | |||
MODE2 { yylval.ival = MODE_MODE2; return MODE2; } | |||
MODE2_FORM1 { yylval.ival = MODE_MODE2_FORM1; return MODE2_FORM1; } | |||
MODE2_FORM2 { yylval.ival = MODE_MODE2_FORM2; return MODE2_FORM2; } | |||
MODE2_FORM_MIX { yylval.ival = MODE_MODE2_FORM_MIX; return MODE2_FORM_MIX; } | |||
MODE2_RAW { yylval.ival = MODE_MODE2_RAW; return MODE2_RAW; } | |||
RW { yylval.ival = SUB_MODE_RW; return RW; } | |||
RW_RAW { yylval.ival = SUB_MODE_RW_RAW; return RW_RAW; } | |||
NO { return NO; } | |||
COPY { toc_yylval.ival = FLAG_PRE_EMPHASIS; return COPY; } | |||
PRE_EMPHASIS { toc_yylval.ival = FLAG_COPY_PERMITTED; return PRE_EMPHASIS; } | |||
FOUR_CHANNEL_AUDIO { toc_yylval.ival = FLAG_FOUR_CHANNEL; return FOUR_CHANNEL_AUDIO; } | |||
TWO_CHANNEL_AUDIO { toc_yylval.ival = FLAG_FOUR_CHANNEL; return TWO_CHANNEL_AUDIO; } | |||
COPY { yylval.ival = FLAG_PRE_EMPHASIS; return COPY; } | |||
PRE_EMPHASIS { yylval.ival = FLAG_COPY_PERMITTED; return PRE_EMPHASIS; } | |||
FOUR_CHANNEL_AUDIO { yylval.ival = FLAG_FOUR_CHANNEL; return FOUR_CHANNEL_AUDIO; } | |||
TWO_CHANNEL_AUDIO { yylval.ival = FLAG_FOUR_CHANNEL; return TWO_CHANNEL_AUDIO; } | |||
/* ISRC is with CD-TEXT items */ | |||
@@ -76,24 +78,24 @@ CD_TEXT { return CD_TEXT; } | |||
LANGUAGE_MAP { return LANGUAGE_MAP; } | |||
LANGUAGE { return LANGUAGE; } | |||
TITLE { BEGIN(NAME); toc_yylval.ival = PTI_TITLE; return TITLE; } | |||
PERFORMER { BEGIN(NAME); toc_yylval.ival = PTI_PERFORMER; return PERFORMER; } | |||
SONGWRITER { BEGIN(NAME); toc_yylval.ival = PTI_SONGWRITER; return SONGWRITER; } | |||
COMPOSER { BEGIN(NAME); toc_yylval.ival = PTI_COMPOSER; return COMPOSER; } | |||
ARRANGER { BEGIN(NAME); toc_yylval.ival = PTI_ARRANGER; return ARRANGER; } | |||
MESSAGE { BEGIN(NAME); toc_yylval.ival = PTI_MESSAGE; return MESSAGE; } | |||
DISC_ID { BEGIN(NAME); toc_yylval.ival = PTI_DISC_ID; return DISC_ID; } | |||
GENRE { BEGIN(NAME); toc_yylval.ival = PTI_GENRE; return GENRE; } | |||
TOC_INFO1 { BEGIN(NAME); toc_yylval.ival = PTI_TOC_INFO1; return TOC_INFO1; } | |||
TOC_INFO2 { BEGIN(NAME); toc_yylval.ival = PTI_TOC_INFO2; return TOC_INFO2; } | |||
UPC_EAN { BEGIN(NAME); toc_yylval.ival = PTI_UPC_ISRC; return UPC_EAN; } | |||
ISRC { BEGIN(NAME); toc_yylval.ival = PTI_UPC_ISRC; return ISRC; } | |||
SIZE_INFO { BEGIN(NAME); toc_yylval.ival = PTI_SIZE_INFO; return SIZE_INFO; } | |||
TITLE { BEGIN(NAME); yylval.ival = PTI_TITLE; return TITLE; } | |||
PERFORMER { BEGIN(NAME); yylval.ival = PTI_PERFORMER; return PERFORMER; } | |||
SONGWRITER { BEGIN(NAME); yylval.ival = PTI_SONGWRITER; return SONGWRITER; } | |||
COMPOSER { BEGIN(NAME); yylval.ival = PTI_COMPOSER; return COMPOSER; } | |||
ARRANGER { BEGIN(NAME); yylval.ival = PTI_ARRANGER; return ARRANGER; } | |||
MESSAGE { BEGIN(NAME); yylval.ival = PTI_MESSAGE; return MESSAGE; } | |||
DISC_ID { BEGIN(NAME); yylval.ival = PTI_DISC_ID; return DISC_ID; } | |||
GENRE { BEGIN(NAME); yylval.ival = PTI_GENRE; return GENRE; } | |||
TOC_INFO1 { BEGIN(NAME); yylval.ival = PTI_TOC_INFO1; return TOC_INFO1; } | |||
TOC_INFO2 { BEGIN(NAME); yylval.ival = PTI_TOC_INFO2; return TOC_INFO2; } | |||
UPC_EAN { BEGIN(NAME); yylval.ival = PTI_UPC_ISRC; return UPC_EAN; } | |||
ISRC { BEGIN(NAME); yylval.ival = PTI_UPC_ISRC; return ISRC; } | |||
SIZE_INFO { BEGIN(NAME); yylval.ival = PTI_SIZE_INFO; return SIZE_INFO; } | |||
"//".*\n { toc_lineno++; /* ignore comments */ } | |||
{ws}+ { /* ignore whitespace */ } | |||
[[:digit:]]+ { toc_yylval.ival = atoi(yytext); return NUMBER; } | |||
[[:digit:]]+ { yylval.ival = atoi(yytext); return NUMBER; } | |||
:|,|\{|\} { return yytext[0]; } | |||
^{ws}*\n { toc_lineno++; /* blank line */ } | |||