Path: utzoo!utgpu!news-server.csri.toronto.edu!rutgers!usc!wuarchive!mit-eddie!uw-beaver!cornell!vern From: vern@fjalar.cs.cornell.edu (Vern Paxson) Newsgroups: comp.sources.bugs Subject: flex 2.3 patch #4 Summary: fixes bug in hexadecimal escape sequences Message-ID: <44491@cornell.UUCP> Date: 14 Aug 90 04:30:58 GMT Sender: nobody@cornell.UUCP Reply-To: vern@cs.cornell.edu (Vern Paxson) Distribution: comp Organization: Cornell Univ. CS Dept, Ithaca NY Lines: 184 Keywords: Here's a patch for flex release 2.3 which fixes a bug in the handling of hexadecimal escape sequences (only digits were recognized in such sequences, not the letters 'a' through 'f'). Vern *** Patch-3/Changes Fri Aug 3 14:17:00 1990 --- Patch-4/Changes Tue Aug 14 00:08:22 1990 *************** *** 1,4 **** ! Changes between 2.3 Patch #3 (03Aug90) and original 2.3 release: - Correction to patch #2 for gcc compilation; thanks goes to Paul Eggert for catching this. --- 1,11 ---- ! Changes between 2.3 Patch #4 (14Aug90) and 2.3 Patch #3: ! ! - Fixed bug in hexadecimal escapes which allowed only digits, ! not letters, in escapes ! - Fixed bug in previous "Changes" file! ! ! ! Changes between 2.3 Patch #3 (03Aug90) and 2.3 Patch #2: - Correction to patch #2 for gcc compilation; thanks goes to Paul Eggert for catching this. *** Original/misc.c Thu Jun 28 00:44:40 1990 --- Patch-4/misc.c Tue Aug 14 00:11:19 1990 *************** *** 28,34 **** #ifndef lint static char rcsid[] = ! "@(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/misc.c,v 2.7 90/06/27 23:48:27 vern Exp $ (LBL)"; #endif #include --- 28,34 ---- #ifndef lint static char rcsid[] = ! "@(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/misc.c,v 2.9 90/08/14 00:10:24 vern Exp $ (LBL)"; #endif #include *************** *** 477,482 **** --- 477,514 ---- } + /* is_hex_digit - returns true if a character is a valid hex digit, false + * otherwise + * + * synopsis: + * int true_or_false, is_hex_digit(); + * int ch; + * val = is_hex_digit( ch ); + */ + + int is_hex_digit( ch ) + int ch; + + { + if ( isdigit( ch ) ) + return ( 1 ); + + switch ( clower( ch ) ) + { + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + return ( 1 ); + + default: + return ( 0 ); + } + } + + /* line_directive_out - spit out a "# line" statement */ void line_directive_out( output_file_name ) *************** *** 584,589 **** --- 616,624 ---- Char array[]; { + Char c, esc_char; + register int sptr; + switch ( array[1] ) { case 'a': return ( '\a' ); *************** *** 594,602 **** case 't': return ( '\t' ); case 'v': return ( '\v' ); - case 'x': - /* fall through */ - case '0': case '1': case '2': --- 629,634 ---- *************** *** 607,623 **** case '7': case '8': case '9': ! { /* \ or \x */ ! Char c, esc_char; ! register int sptr = 1; ! ! if ( array[1] == 'x' ) ++sptr; ! while ( isascii( array[sptr] ) && isdigit( array[sptr] ) ) /* don't increment inside loop control because if ! * isdigit() is a macro it will expand it to two * increments ... */ ++sptr; --- 639,671 ---- case '7': case '8': case '9': + { /* \ */ + sptr = 1; ! while ( isascii( array[sptr] ) && isdigit( array[sptr] ) ) ! /* don't increment inside loop control because if ! * isdigit() is a macro it might expand into multiple ! * increments ... ! */ ++sptr; ! c = array[sptr]; ! array[sptr] = '\0'; ! ! esc_char = otoi( array + 1 ); ! ! array[sptr] = c; ! ! return ( esc_char ); ! } ! ! case 'x': ! { /* \x */ ! int sptr = 2; ! ! while ( isascii( array[sptr] ) && is_hex_digit( array[sptr] ) ) /* don't increment inside loop control because if ! * isdigit() is a macro it might expand into multiple * increments ... */ ++sptr; *************** *** 625,634 **** c = array[sptr]; array[sptr] = '\0'; ! if ( array[1] == 'x' ) ! esc_char = htoi( array + 2 ); ! else ! esc_char = otoi( array + 1 ); array[sptr] = c; --- 673,679 ---- c = array[sptr]; array[sptr] = '\0'; ! esc_char = htoi( array + 2 ); array[sptr] = c;