xref: /minix3/external/bsd/flex/dist/examples/manual/string2.lex (revision 357f1050293be536ca8309aae20889945ce99fc1)
1*357f1050SThomas Veerman /*
2*357f1050SThomas Veerman  * string2.lex: An example of using scanning strings
3*357f1050SThomas Veerman  *              by using start states.
4*357f1050SThomas Veerman  */
5*357f1050SThomas Veerman 
6*357f1050SThomas Veerman %{
7*357f1050SThomas Veerman #include <ctype.h>
8*357f1050SThomas Veerman #include <malloc.h>
9*357f1050SThomas Veerman 
10*357f1050SThomas Veerman #define isodigit(x) ((x) >= '0' && (x) <= '7')
11*357f1050SThomas Veerman #define hextoint(x) (isdigit((x)) ? (x) - '0' : ((x) - 'A') + 10)
12*357f1050SThomas Veerman 
13*357f1050SThomas Veerman char *buffer      = NULL;
14*357f1050SThomas Veerman int  buffer_size  = 0;
15*357f1050SThomas Veerman 
yyerror(char * message)16*357f1050SThomas Veerman void yyerror(char *message)
17*357f1050SThomas Veerman {
18*357f1050SThomas Veerman   printf("\nError: %s\n",message);
19*357f1050SThomas Veerman }
20*357f1050SThomas Veerman 
21*357f1050SThomas Veerman %}
22*357f1050SThomas Veerman 
23*357f1050SThomas Veerman %x STRING
24*357f1050SThomas Veerman 
25*357f1050SThomas Veerman hex (x|X)[0-9a-fA-F]{1,2}
26*357f1050SThomas Veerman oct [0-7]{1,3}
27*357f1050SThomas Veerman 
28*357f1050SThomas Veerman %%
29*357f1050SThomas Veerman 
30*357f1050SThomas Veerman \"                 {
31*357f1050SThomas Veerman                      buffer      = malloc(1);
32*357f1050SThomas Veerman                      buffer_size = 1; strcpy(buffer,"");
33*357f1050SThomas Veerman                      BEGIN(STRING);
34*357f1050SThomas Veerman                    }
35*357f1050SThomas Veerman <STRING>\n         {
36*357f1050SThomas Veerman                       yyerror("Unterminated string");
37*357f1050SThomas Veerman                       free(buffer);
38*357f1050SThomas Veerman                       BEGIN(INITIAL);
39*357f1050SThomas Veerman                    }
40*357f1050SThomas Veerman <STRING><<EOF>>    {
41*357f1050SThomas Veerman                       yyerror("EOF in string");
42*357f1050SThomas Veerman                       free(buffer);
43*357f1050SThomas Veerman                       BEGIN(INITIAL);
44*357f1050SThomas Veerman                    }
45*357f1050SThomas Veerman <STRING>[^\\\n"]   {
46*357f1050SThomas Veerman                      buffer = realloc(buffer,buffer_size+yyleng+1);
47*357f1050SThomas Veerman                      buffer_size += yyleng;
48*357f1050SThomas Veerman                      strcat(buffer,yytext);
49*357f1050SThomas Veerman                    }
50*357f1050SThomas Veerman <STRING>\\\n       /* ignore this */
51*357f1050SThomas Veerman <STRING>\\{hex}    {
52*357f1050SThomas Veerman                      int temp =0,loop = 0;
53*357f1050SThomas Veerman                      for(loop=yyleng-2; loop>0; loop--){
54*357f1050SThomas Veerman                        temp  <<= 4;
55*357f1050SThomas Veerman                        temp  += hextoint(toupper(yytext[yyleng-loop]));
56*357f1050SThomas Veerman                      }
57*357f1050SThomas Veerman                      buffer = realloc(buffer,buffer_size+1);
58*357f1050SThomas Veerman                      buffer[buffer_size-1] = temp;
59*357f1050SThomas Veerman                      buffer[buffer_size]   = '\0';
60*357f1050SThomas Veerman                      buffer_size += 1;
61*357f1050SThomas Veerman                    }
62*357f1050SThomas Veerman <STRING>\\{oct}    {
63*357f1050SThomas Veerman                      int temp =0,loop = 0;
64*357f1050SThomas Veerman                      for(loop=yyleng-1; loop>0; loop--){
65*357f1050SThomas Veerman                        temp  <<= 3;
66*357f1050SThomas Veerman                        temp  += (yytext[yyleng-loop] - '0');
67*357f1050SThomas Veerman                      }
68*357f1050SThomas Veerman                      buffer = realloc(buffer,buffer_size+1);
69*357f1050SThomas Veerman                      buffer[buffer_size-1] = temp;
70*357f1050SThomas Veerman                      buffer[buffer_size]   = '\0';
71*357f1050SThomas Veerman                      buffer_size += 1;
72*357f1050SThomas Veerman                    }
73*357f1050SThomas Veerman <STRING>\\[^\n]    {
74*357f1050SThomas Veerman                      buffer = realloc(buffer,buffer_size+1);
75*357f1050SThomas Veerman                      switch(yytext[yyleng-1]){
76*357f1050SThomas Veerman                      case 'b' : buffer[buffer_size-1] = '\b';  break;
77*357f1050SThomas Veerman                      case 't' : buffer[buffer_size-1] = '\t';  break;
78*357f1050SThomas Veerman                      case 'n' : buffer[buffer_size-1] = '\n';  break;
79*357f1050SThomas Veerman                      case 'v' : buffer[buffer_size-1] = '\v';  break;
80*357f1050SThomas Veerman                      case 'f' : buffer[buffer_size-1] = '\f';  break;
81*357f1050SThomas Veerman                      case 'r' : buffer[buffer_size-1] = '\r';  break;
82*357f1050SThomas Veerman                      default  : buffer[buffer_size-1] = yytext[yyleng-1];
83*357f1050SThomas Veerman                      }
84*357f1050SThomas Veerman                      buffer[buffer_size] = '\0';
85*357f1050SThomas Veerman                      buffer_size += 1;
86*357f1050SThomas Veerman                    }
87*357f1050SThomas Veerman <STRING>\"         {
88*357f1050SThomas Veerman                      printf("string = \"%s\"",buffer);
89*357f1050SThomas Veerman                      free(buffer);
90*357f1050SThomas Veerman                      BEGIN(INITIAL);
91*357f1050SThomas Veerman                    }
92*357f1050SThomas Veerman %%
93*357f1050SThomas Veerman 
94*357f1050SThomas Veerman 
95