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