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.

toc_scan.l 3.3 KiB

20 years ago
20 years ago
20 years ago
20 years ago
20 years ago
20 years ago
20 years ago
20 years ago
20 years ago
20 years ago
20 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. %{
  2. /*
  3. * toc_scan.l -- lexer for toc 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 "toc_parse_prefix.h"
  12. #include "toc_parse.h"
  13. int toc_lineno = 1;
  14. %}
  15. ws [ \t\r]
  16. nonws [^ \t\r\n]
  17. %option noyywrap
  18. %option prefix="toc_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. CD_DA { yylval.ival = MODE_CD_DA; return CD_DA; }
  35. CD_ROM { yylval.ival = MODE_CD_ROM; return CD_ROM; }
  36. CD_ROM_XA { yylval.ival = MODE_CD_ROM_XA; return CD_ROM_XA; }
  37. TRACK { return TRACK; }
  38. AUDIO { yylval.ival = MODE_AUDIO; return AUDIO; }
  39. MODE1 { yylval.ival = MODE_MODE1; return MODE1; }
  40. MODE1_RAW { yylval.ival = MODE_MODE1_RAW; return MODE1_RAW; }
  41. MODE2 { yylval.ival = MODE_MODE2; return MODE2; }
  42. MODE2_FORM1 { yylval.ival = MODE_MODE2_FORM1; return MODE2_FORM1; }
  43. MODE2_FORM2 { yylval.ival = MODE_MODE2_FORM2; return MODE2_FORM2; }
  44. MODE2_FORM_MIX { yylval.ival = MODE_MODE2_FORM_MIX; return MODE2_FORM_MIX; }
  45. MODE2_RAW { yylval.ival = MODE_MODE2_RAW; return MODE2_RAW; }
  46. RW { yylval.ival = SUB_MODE_RW; return RW; }
  47. RW_RAW { yylval.ival = SUB_MODE_RW_RAW; return RW_RAW; }
  48. NO { return NO; }
  49. COPY { yylval.ival = FLAG_PRE_EMPHASIS; return COPY; }
  50. PRE_EMPHASIS { yylval.ival = FLAG_COPY_PERMITTED; return PRE_EMPHASIS; }
  51. FOUR_CHANNEL_AUDIO { yylval.ival = FLAG_FOUR_CHANNEL; return FOUR_CHANNEL_AUDIO; }
  52. TWO_CHANNEL_AUDIO { yylval.ival = FLAG_FOUR_CHANNEL; return TWO_CHANNEL_AUDIO; }
  53. /* ISRC is with CD-TEXT items */
  54. SILENCE { return SILENCE; }
  55. ZERO { return ZERO; }
  56. (AUDIO)?FILE { BEGIN(NAME); return AUDIOFILE; }
  57. DATAFILE { BEGIN(NAME); return DATAFILE; }
  58. FIFO { BEGIN(NAME); return FIFO; }
  59. START { return START; }
  60. PREGAP { return PREGAP; }
  61. INDEX { return INDEX; }
  62. CD_TEXT { return CD_TEXT; }
  63. LANGUAGE_MAP { return LANGUAGE_MAP; }
  64. LANGUAGE { return LANGUAGE; }
  65. TITLE { BEGIN(NAME); yylval.ival = PTI_TITLE; return TITLE; }
  66. PERFORMER { BEGIN(NAME); yylval.ival = PTI_PERFORMER; return PERFORMER; }
  67. SONGWRITER { BEGIN(NAME); yylval.ival = PTI_SONGWRITER; return SONGWRITER; }
  68. COMPOSER { BEGIN(NAME); yylval.ival = PTI_COMPOSER; return COMPOSER; }
  69. ARRANGER { BEGIN(NAME); yylval.ival = PTI_ARRANGER; return ARRANGER; }
  70. MESSAGE { BEGIN(NAME); yylval.ival = PTI_MESSAGE; return MESSAGE; }
  71. DISC_ID { BEGIN(NAME); yylval.ival = PTI_DISC_ID; return DISC_ID; }
  72. GENRE { BEGIN(NAME); yylval.ival = PTI_GENRE; return GENRE; }
  73. TOC_INFO1 { BEGIN(NAME); yylval.ival = PTI_TOC_INFO1; return TOC_INFO1; }
  74. TOC_INFO2 { BEGIN(NAME); yylval.ival = PTI_TOC_INFO2; return TOC_INFO2; }
  75. UPC_EAN { BEGIN(NAME); yylval.ival = PTI_UPC_ISRC; return UPC_EAN; }
  76. ISRC { BEGIN(NAME); yylval.ival = PTI_UPC_ISRC; return ISRC; }
  77. SIZE_INFO { BEGIN(NAME); yylval.ival = PTI_SIZE_INFO; return SIZE_INFO; }
  78. "//".*\n { toc_lineno++; /* ignore comments */ }
  79. {ws}+ { /* ignore whitespace */ }
  80. [[:digit:]]+ { yylval.ival = atoi(yytext); return NUMBER; }
  81. :|,|\{|\} { return yytext[0]; }
  82. ^{ws}*\n { toc_lineno++; /* blank line */ }
  83. \n { toc_lineno++; return '\n'; }
  84. . { fprintf(stderr, "bad character '%c'\n", yytext[0]); }
  85. %%