Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 
 
 
 
 

105 righe
3.3 KiB

  1. %{
  2. /*
  3. * toc_scan.l -- lexer for toc files
  4. *
  5. * Copyright (C) 2004, 2005, 2006, 2007, 2013 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. yylval.sval = strdup(yytext + 1);
  23. yylval.sval[strlen(yylval.sval) - 1] = '\0';
  24. BEGIN(INITIAL);
  25. return STRING;
  26. }
  27. <NAME>{nonws}+ {
  28. yylval.sval = strdup(yytext);
  29. BEGIN(INITIAL);
  30. return STRING;
  31. }
  32. CATALOG { BEGIN(NAME); return CATALOG; }
  33. CD_DA { yylval.ival = MODE_CD_DA; return CD_DA; }
  34. CD_ROM { yylval.ival = MODE_CD_ROM; return CD_ROM; }
  35. CD_ROM_XA { yylval.ival = MODE_CD_ROM_XA; return CD_ROM_XA; }
  36. TRACK { return TRACK; }
  37. AUDIO { yylval.ival = MODE_AUDIO; return AUDIO; }
  38. MODE1 { yylval.ival = MODE_MODE1; return MODE1; }
  39. MODE1_RAW { yylval.ival = MODE_MODE1_RAW; return MODE1_RAW; }
  40. MODE2 { yylval.ival = MODE_MODE2; return MODE2; }
  41. MODE2_FORM1 { yylval.ival = MODE_MODE2_FORM1; return MODE2_FORM1; }
  42. MODE2_FORM2 { yylval.ival = MODE_MODE2_FORM2; return MODE2_FORM2; }
  43. MODE2_FORM_MIX { yylval.ival = MODE_MODE2_FORM_MIX; return MODE2_FORM_MIX; }
  44. MODE2_RAW { yylval.ival = MODE_MODE2_RAW; return MODE2_RAW; }
  45. RW { yylval.ival = SUB_MODE_RW; return RW; }
  46. RW_RAW { yylval.ival = SUB_MODE_RW_RAW; return RW_RAW; }
  47. NO { return NO; }
  48. COPY { yylval.ival = FLAG_COPY_PERMITTED; return COPY; }
  49. PRE_EMPHASIS { yylval.ival = FLAG_PRE_EMPHASIS; return PRE_EMPHASIS; }
  50. FOUR_CHANNEL_AUDIO { yylval.ival = FLAG_FOUR_CHANNEL; return FOUR_CHANNEL_AUDIO; }
  51. TWO_CHANNEL_AUDIO { yylval.ival = FLAG_FOUR_CHANNEL; return TWO_CHANNEL_AUDIO; }
  52. /* ISRC is with CD-TEXT items */
  53. SILENCE { return SILENCE; }
  54. ZERO { return ZERO; }
  55. (AUDIO)?FILE { BEGIN(NAME); return AUDIOFILE; }
  56. DATAFILE { BEGIN(NAME); return DATAFILE; }
  57. FIFO { BEGIN(NAME); return FIFO; }
  58. START { return START; }
  59. PREGAP { return PREGAP; }
  60. INDEX { return INDEX; }
  61. CD_TEXT { return CD_TEXT; }
  62. LANGUAGE_MAP { return LANGUAGE_MAP; }
  63. LANGUAGE { return LANGUAGE; }
  64. TITLE { BEGIN(NAME); yylval.ival = PTI_TITLE; return TITLE; }
  65. PERFORMER { BEGIN(NAME); yylval.ival = PTI_PERFORMER; return PERFORMER; }
  66. SONGWRITER { BEGIN(NAME); yylval.ival = PTI_SONGWRITER; return SONGWRITER; }
  67. COMPOSER { BEGIN(NAME); yylval.ival = PTI_COMPOSER; return COMPOSER; }
  68. ARRANGER { BEGIN(NAME); yylval.ival = PTI_ARRANGER; return ARRANGER; }
  69. MESSAGE { BEGIN(NAME); yylval.ival = PTI_MESSAGE; return MESSAGE; }
  70. DISC_ID { BEGIN(NAME); yylval.ival = PTI_DISC_ID; return DISC_ID; }
  71. GENRE { BEGIN(NAME); yylval.ival = PTI_GENRE; return GENRE; }
  72. TOC_INFO1 { BEGIN(NAME); yylval.ival = PTI_TOC_INFO1; return TOC_INFO1; }
  73. TOC_INFO2 { BEGIN(NAME); yylval.ival = PTI_TOC_INFO2; return TOC_INFO2; }
  74. UPC_EAN { BEGIN(NAME); yylval.ival = PTI_UPC_ISRC; return UPC_EAN; }
  75. ISRC { BEGIN(NAME); yylval.ival = PTI_UPC_ISRC; return ISRC; }
  76. SIZE_INFO { BEGIN(NAME); yylval.ival = PTI_SIZE_INFO; return SIZE_INFO; }
  77. "//".*\n { toc_lineno++; /* ignore comments */ }
  78. {ws}+ { /* ignore whitespace */ }
  79. [[:digit:]]+ { yylval.ival = atoi(yytext); return NUMBER; }
  80. :|,|\{|\} { return yytext[0]; }
  81. ^{ws}*\n { toc_lineno++; /* blank line */ }
  82. \n { toc_lineno++; return '\n'; }
  83. . { fprintf(stderr, "bad character '%c'\n", yytext[0]); }
  84. %%