You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

99 lines
3.0 KiB

  1. %{
  2. /*
  3. * cue_scan.l -- lexer for cue files
  4. *
  5. * Copyright (C) 2004 Svend Sorensen
  6. * For license terms, see the file COPYING in this distribution.
  7. */
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include "cd.h"
  11. #include "cue_parse_prefix.h"
  12. #include "cue_parse.h"
  13. int cue_lineno = 1;
  14. %}
  15. ws [ \t\r]
  16. nonws [^ \t\r\n]
  17. %option noyywrap
  18. %option prefix="cue_yy"
  19. %s NAME
  20. %%
  21. \'([^\']|\\\')*\' |
  22. \"([^\"]|\\\")*\" {
  23. yylval.sval = strdup(yytext + 1);
  24. yylval.sval[strlen(yylval.sval) - 1] = '\0';
  25. BEGIN(INITIAL);
  26. return STRING;
  27. }
  28. <NAME>{nonws}+ {
  29. yylval.sval = strdup(yytext);
  30. BEGIN(INITIAL);
  31. return STRING;
  32. }
  33. CATALOG { BEGIN(NAME); return CATALOG; }
  34. CDTEXTFILE { BEGIN(NAME); return CDTEXTFILE; }
  35. FILE { BEGIN(NAME); return FFILE; }
  36. BINARY { return BINARY; }
  37. MOTOROLA { return MOTOROLA; }
  38. AIFF { return AIFF; }
  39. WAVE { return WAVE; }
  40. MP3 { return MP3; }
  41. TRACK { return TRACK; }
  42. AUDIO { yylval.ival = MODE_AUDIO; return AUDIO; }
  43. MODE1\/2048 { yylval.ival = MODE_MODE1; return MODE1_2048; }
  44. MODE1\/2352 { yylval.ival = MODE_MODE1_RAW; return MODE1_2352; }
  45. MODE2\/2336 { yylval.ival = MODE_MODE2; return MODE2_2336; }
  46. MODE2\/2048 { yylval.ival = MODE_MODE2_FORM1; return MODE2_2048; }
  47. MODE2\/2342 { yylval.ival = MODE_MODE2_FORM2; return MODE2_2342; }
  48. MODE2\/2332 { yylval.ival = MODE_MODE2_FORM_MIX; return MODE2_2332; }
  49. MODE2\/2352 { yylval.ival = MODE_MODE2_RAW; return MODE2_2352; }
  50. FLAGS { return FLAGS; }
  51. PRE { yylval.ival = FLAG_PRE_EMPHASIS; return PRE; }
  52. DCP { yylval.ival = FLAG_COPY_PERMITTED; return DCP; }
  53. 4CH { yylval.ival = FLAG_FOUR_CHANNEL; return FOUR_CH; }
  54. SCMS { yylval.ival = FLAG_SCMS; return SCMS; }
  55. PREGAP { return PREGAP; }
  56. INDEX { return INDEX; }
  57. POSTGAP { return POSTGAP; }
  58. TITLE { BEGIN(NAME); yylval.ival = PTI_TITLE; return TITLE; }
  59. PERFORMER { BEGIN(NAME); yylval.ival = PTI_PERFORMER; return PERFORMER; }
  60. SONGWRITER { BEGIN(NAME); yylval.ival = PTI_SONGWRITER; return SONGWRITER; }
  61. COMPOSER { BEGIN(NAME); yylval.ival = PTI_COMPOSER; return COMPOSER; }
  62. ARRANGER { BEGIN(NAME); yylval.ival = PTI_ARRANGER; return ARRANGER; }
  63. MESSAGE { BEGIN(NAME); yylval.ival = PTI_MESSAGE; return MESSAGE; }
  64. DISC_ID { BEGIN(NAME); yylval.ival = PTI_DISC_ID; return DISC_ID; }
  65. GENRE { BEGIN(NAME); yylval.ival = PTI_GENRE; return GENRE; }
  66. TOC_INFO1 { BEGIN(NAME); yylval.ival = PTI_TOC_INFO1; return TOC_INFO1; }
  67. TOC_INFO2 { BEGIN(NAME); yylval.ival = PTI_TOC_INFO2; return TOC_INFO2; }
  68. UPC_EAN { BEGIN(NAME); yylval.ival = PTI_UPC_ISRC; return UPC_EAN; }
  69. ISRC/{ws}+\" { BEGIN(NAME); yylval.ival = PTI_UPC_ISRC; return ISRC; }
  70. SIZE_INFO { BEGIN(NAME); yylval.ival = PTI_SIZE_INFO; return SIZE_INFO; }
  71. ISRC { BEGIN(NAME); return TRACK_ISRC; }
  72. ^{ws}*REM.*\n { cue_lineno++; /* ignore comments */ }
  73. {ws}+ { /* ignore whitespace */ }
  74. [[:digit:]]+ { yylval.ival = atoi(yytext); return NUMBER; }
  75. : { return yytext[0]; }
  76. ^{ws}*\n { cue_lineno++; /* blank line */ }
  77. \n { cue_lineno++; return '\n'; }
  78. . { fprintf(stderr, "bad character '%c'\n", yytext[0]); }
  79. %%