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 Veermanvoid 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