xref: /netbsd-src/external/bsd/flex/dist/examples/manual/string1.lex (revision 3c3a7b7603b4ed4cb76dd5c5a3e781ddca2349bb)
1*3c3a7b76Schristos /*
2*3c3a7b76Schristos  * string1.lex: Handling strings by using input()
3*3c3a7b76Schristos  */
4*3c3a7b76Schristos 
5*3c3a7b76Schristos %{
6*3c3a7b76Schristos #include <ctype.h>
7*3c3a7b76Schristos #include <malloc.h>
8*3c3a7b76Schristos 
9*3c3a7b76Schristos #define ALLOC_SIZE 32 /* for (re)allocating the buffer */
10*3c3a7b76Schristos 
11*3c3a7b76Schristos #define isodigit(x) ((x) >= '0' && (x) <= '7')
12*3c3a7b76Schristos #define hextoint(x) (isdigit((x)) ? (x) - '0' : ((x) - 'A') + 10)
13*3c3a7b76Schristos 
yyerror(char * message)14*3c3a7b76Schristos void yyerror(char *message)
15*3c3a7b76Schristos {
16*3c3a7b76Schristos   printf("\nError: %s\n",message);
17*3c3a7b76Schristos }
18*3c3a7b76Schristos 
19*3c3a7b76Schristos %}
20*3c3a7b76Schristos 
21*3c3a7b76Schristos %%
22*3c3a7b76Schristos 
23*3c3a7b76Schristos \" {
24*3c3a7b76Schristos      int  inch,count,max_size;
25*3c3a7b76Schristos      char *buffer;
26*3c3a7b76Schristos      int  temp;
27*3c3a7b76Schristos 
28*3c3a7b76Schristos      buffer   = malloc(ALLOC_SIZE);
29*3c3a7b76Schristos      max_size = ALLOC_SIZE;
30*3c3a7b76Schristos      inch     = input();
31*3c3a7b76Schristos      count    = 0;
32*3c3a7b76Schristos      while(inch != EOF && inch != '"' && inch != '\n'){
33*3c3a7b76Schristos         if(inch == '\\'){
34*3c3a7b76Schristos           inch = input();
35*3c3a7b76Schristos           switch(inch){
36*3c3a7b76Schristos           case '\n': inch = input(); break;
37*3c3a7b76Schristos           case 'b' : inch = '\b';    break;
38*3c3a7b76Schristos           case 't' : inch = '\t';    break;
39*3c3a7b76Schristos           case 'n' : inch = '\n';    break;
40*3c3a7b76Schristos           case 'v' : inch = '\v';    break;
41*3c3a7b76Schristos           case 'f' : inch = '\f';    break;
42*3c3a7b76Schristos           case 'r' : inch = '\r';    break;
43*3c3a7b76Schristos           case 'X' :
44*3c3a7b76Schristos           case 'x' : inch = input();
45*3c3a7b76Schristos                      if(isxdigit(inch)){
46*3c3a7b76Schristos                        temp = hextoint(toupper(inch));
47*3c3a7b76Schristos                        inch = input();
48*3c3a7b76Schristos                        if(isxdigit(inch)){
49*3c3a7b76Schristos                          temp = (temp << 4) + hextoint(toupper(inch));
50*3c3a7b76Schristos                        } else {
51*3c3a7b76Schristos                          unput(inch);
52*3c3a7b76Schristos                        }
53*3c3a7b76Schristos                        inch = temp;
54*3c3a7b76Schristos                      } else {
55*3c3a7b76Schristos                        unput(inch);
56*3c3a7b76Schristos                        inch = 'x';
57*3c3a7b76Schristos                      }
58*3c3a7b76Schristos              break;
59*3c3a7b76Schristos           default:
60*3c3a7b76Schristos              if(isodigit(inch)){
61*3c3a7b76Schristos                 temp = inch - '0';
62*3c3a7b76Schristos                 inch = input();
63*3c3a7b76Schristos                 if(isodigit(inch)){
64*3c3a7b76Schristos                   temp = (temp << 3) + (inch - '0');
65*3c3a7b76Schristos                 } else {
66*3c3a7b76Schristos                   unput(inch);
67*3c3a7b76Schristos                   goto done;
68*3c3a7b76Schristos                 }
69*3c3a7b76Schristos                 inch = input();
70*3c3a7b76Schristos                 if(isodigit(inch)){
71*3c3a7b76Schristos                   temp = (temp << 3) + (inch - '0');
72*3c3a7b76Schristos                 } else {
73*3c3a7b76Schristos                   unput(inch);
74*3c3a7b76Schristos                 }
75*3c3a7b76Schristos              done:
76*3c3a7b76Schristos                 inch = temp;
77*3c3a7b76Schristos              }
78*3c3a7b76Schristos           }
79*3c3a7b76Schristos         }
80*3c3a7b76Schristos         buffer[count++] = inch;
81*3c3a7b76Schristos         if(count >= max_size){
82*3c3a7b76Schristos            buffer = realloc(buffer,max_size + ALLOC_SIZE);
83*3c3a7b76Schristos            max_size += ALLOC_SIZE;
84*3c3a7b76Schristos         }
85*3c3a7b76Schristos         inch = input();
86*3c3a7b76Schristos      }
87*3c3a7b76Schristos      if(inch == EOF || inch == '\n'){
88*3c3a7b76Schristos        yyerror("Unterminated string.");
89*3c3a7b76Schristos      }
90*3c3a7b76Schristos      buffer[count] = '\0';
91*3c3a7b76Schristos      printf("String = \"%s\"\n",buffer);
92*3c3a7b76Schristos      free(buffer);
93*3c3a7b76Schristos    }
94*3c3a7b76Schristos .
95*3c3a7b76Schristos \n
96*3c3a7b76Schristos %%
97*3c3a7b76Schristos 
98*3c3a7b76Schristos 
99