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*3c3a7b76Schristosvoid 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