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