[BACK]Return to misc.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / lex

Annotation of src/usr.bin/lex/misc.c, Revision 1.1

1.1     ! deraadt     1: /* misc - miscellaneous flex routines */
        !             2:
        !             3: /*-
        !             4:  * Copyright (c) 1990 The Regents of the University of California.
        !             5:  * All rights reserved.
        !             6:  *
        !             7:  * This code is derived from software contributed to Berkeley by
        !             8:  * Vern Paxson.
        !             9:  *
        !            10:  * The United States Government has rights in this work pursuant
        !            11:  * to contract no. DE-AC03-76SF00098 between the United States
        !            12:  * Department of Energy and the University of California.
        !            13:  *
        !            14:  * Redistribution and use in source and binary forms are permitted provided
        !            15:  * that: (1) source distributions retain this entire copyright notice and
        !            16:  * comment, and (2) distributions including binaries display the following
        !            17:  * acknowledgement:  ``This product includes software developed by the
        !            18:  * University of California, Berkeley and its contributors'' in the
        !            19:  * documentation or other materials provided with the distribution and in
        !            20:  * all advertising materials mentioning features or use of this software.
        !            21:  * Neither the name of the University nor the names of its contributors may
        !            22:  * be used to endorse or promote products derived from this software without
        !            23:  * specific prior written permission.
        !            24:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
        !            25:  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
        !            26:  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !            27:  */
        !            28:
        !            29: /* $Header: /a/cvsroot/src/usr.bin/lex/misc.c,v 1.7 1995/05/05 05:35:35 jtc Exp $ */
        !            30:
        !            31: #include "flexdef.h"
        !            32:
        !            33:
        !            34: void action_define( defname, value )
        !            35: char *defname;
        !            36: int value;
        !            37:        {
        !            38:        char buf[MAXLINE];
        !            39:
        !            40:        if ( (int) strlen( defname ) > MAXLINE / 2 )
        !            41:                {
        !            42:                format_pinpoint_message( _( "name \"%s\" ridiculously long" ),
        !            43:                        defname );
        !            44:                return;
        !            45:                }
        !            46:
        !            47:        sprintf( buf, "#define %s %d\n", defname, value );
        !            48:        add_action( buf );
        !            49:        }
        !            50:
        !            51:
        !            52: void add_action( new_text )
        !            53: char *new_text;
        !            54:        {
        !            55:        int len = strlen( new_text );
        !            56:
        !            57:        while ( len + action_index >= action_size - 10 /* slop */ )
        !            58:                {
        !            59:                int new_size = action_size * 2;
        !            60:
        !            61:                if ( new_size <= 0 )
        !            62:                        /* Increase just a little, to try to avoid overflow
        !            63:                         * on 16-bit machines.
        !            64:                         */
        !            65:                        action_size += action_size / 8;
        !            66:                else
        !            67:                        action_size = new_size;
        !            68:
        !            69:                action_array =
        !            70:                        reallocate_character_array( action_array, action_size );
        !            71:                }
        !            72:
        !            73:        strcpy( &action_array[action_index], new_text );
        !            74:
        !            75:        action_index += len;
        !            76:        }
        !            77:
        !            78:
        !            79: /* allocate_array - allocate memory for an integer array of the given size */
        !            80:
        !            81: void *allocate_array( size, element_size )
        !            82: int size;
        !            83: size_t element_size;
        !            84:        {
        !            85:        register void *mem;
        !            86:        size_t num_bytes = element_size * size;
        !            87:
        !            88:        mem = flex_alloc( num_bytes );
        !            89:        if ( ! mem )
        !            90:                flexfatal(
        !            91:                        _( "memory allocation failed in allocate_array()" ) );
        !            92:
        !            93:        return mem;
        !            94:        }
        !            95:
        !            96:
        !            97: /* all_lower - true if a string is all lower-case */
        !            98:
        !            99: int all_lower( str )
        !           100: register char *str;
        !           101:        {
        !           102:        while ( *str )
        !           103:                {
        !           104:                if ( ! isascii( (Char) *str ) || ! islower( *str ) )
        !           105:                        return 0;
        !           106:                ++str;
        !           107:                }
        !           108:
        !           109:        return 1;
        !           110:        }
        !           111:
        !           112:
        !           113: /* all_upper - true if a string is all upper-case */
        !           114:
        !           115: int all_upper( str )
        !           116: register char *str;
        !           117:        {
        !           118:        while ( *str )
        !           119:                {
        !           120:                if ( ! isascii( (Char) *str ) || ! isupper( *str ) )
        !           121:                        return 0;
        !           122:                ++str;
        !           123:                }
        !           124:
        !           125:        return 1;
        !           126:        }
        !           127:
        !           128:
        !           129: /* bubble - bubble sort an integer array in increasing order
        !           130:  *
        !           131:  * synopsis
        !           132:  *   int v[n], n;
        !           133:  *   void bubble( v, n );
        !           134:  *
        !           135:  * description
        !           136:  *   sorts the first n elements of array v and replaces them in
        !           137:  *   increasing order.
        !           138:  *
        !           139:  * passed
        !           140:  *   v - the array to be sorted
        !           141:  *   n - the number of elements of 'v' to be sorted
        !           142:  */
        !           143:
        !           144: void bubble( v, n )
        !           145: int v[], n;
        !           146:        {
        !           147:        register int i, j, k;
        !           148:
        !           149:        for ( i = n; i > 1; --i )
        !           150:                for ( j = 1; j < i; ++j )
        !           151:                        if ( v[j] > v[j + 1] )  /* compare */
        !           152:                                {
        !           153:                                k = v[j];       /* exchange */
        !           154:                                v[j] = v[j + 1];
        !           155:                                v[j + 1] = k;
        !           156:                                }
        !           157:        }
        !           158:
        !           159:
        !           160: /* check_char - checks a character to make sure it's within the range
        !           161:  *             we're expecting.  If not, generates fatal error message
        !           162:  *             and exits.
        !           163:  */
        !           164:
        !           165: void check_char( c )
        !           166: int c;
        !           167:        {
        !           168:        if ( c >= CSIZE )
        !           169:                lerrsf( _( "bad character '%s' detected in check_char()" ),
        !           170:                        readable_form( c ) );
        !           171:
        !           172:        if ( c >= csize )
        !           173:                lerrsf(
        !           174:                _( "scanner requires -8 flag to use the character %s" ),
        !           175:                        readable_form( c ) );
        !           176:        }
        !           177:
        !           178:
        !           179:
        !           180: /* clower - replace upper-case letter to lower-case */
        !           181:
        !           182: Char clower( c )
        !           183: register int c;
        !           184:        {
        !           185:        return (Char) ((isascii( c ) && isupper( c )) ? tolower( c ) : c);
        !           186:        }
        !           187:
        !           188:
        !           189: /* copy_string - returns a dynamically allocated copy of a string */
        !           190:
        !           191: char *copy_string( str )
        !           192: register const char *str;
        !           193:        {
        !           194:        register const char *c1;
        !           195:        register char *c2;
        !           196:        char *copy;
        !           197:        unsigned int size;
        !           198:
        !           199:        /* find length */
        !           200:        for ( c1 = str; *c1; ++c1 )
        !           201:                ;
        !           202:
        !           203:        size = (c1 - str + 1) * sizeof( char );
        !           204:        copy = (char *) flex_alloc( size );
        !           205:
        !           206:        if ( copy == NULL )
        !           207:                flexfatal( _( "dynamic memory failure in copy_string()" ) );
        !           208:
        !           209:        for ( c2 = copy; (*c2++ = *str++) != 0; )
        !           210:                ;
        !           211:
        !           212:        return copy;
        !           213:        }
        !           214:
        !           215:
        !           216: /* copy_unsigned_string -
        !           217:  *    returns a dynamically allocated copy of a (potentially) unsigned string
        !           218:  */
        !           219:
        !           220: Char *copy_unsigned_string( str )
        !           221: register Char *str;
        !           222:        {
        !           223:        register Char *c;
        !           224:        Char *copy;
        !           225:
        !           226:        /* find length */
        !           227:        for ( c = str; *c; ++c )
        !           228:                ;
        !           229:
        !           230:        copy = allocate_Character_array( c - str + 1 );
        !           231:
        !           232:        for ( c = copy; (*c++ = *str++) != 0; )
        !           233:                ;
        !           234:
        !           235:        return copy;
        !           236:        }
        !           237:
        !           238:
        !           239: /* cshell - shell sort a character array in increasing order
        !           240:  *
        !           241:  * synopsis
        !           242:  *
        !           243:  *   Char v[n];
        !           244:  *   int n, special_case_0;
        !           245:  *   cshell( v, n, special_case_0 );
        !           246:  *
        !           247:  * description
        !           248:  *   Does a shell sort of the first n elements of array v.
        !           249:  *   If special_case_0 is true, then any element equal to 0
        !           250:  *   is instead assumed to have infinite weight.
        !           251:  *
        !           252:  * passed
        !           253:  *   v - array to be sorted
        !           254:  *   n - number of elements of v to be sorted
        !           255:  */
        !           256:
        !           257: void cshell( v, n, special_case_0 )
        !           258: Char v[];
        !           259: int n, special_case_0;
        !           260:        {
        !           261:        int gap, i, j, jg;
        !           262:        Char k;
        !           263:
        !           264:        for ( gap = n / 2; gap > 0; gap = gap / 2 )
        !           265:                for ( i = gap; i < n; ++i )
        !           266:                        for ( j = i - gap; j >= 0; j = j - gap )
        !           267:                                {
        !           268:                                jg = j + gap;
        !           269:
        !           270:                                if ( special_case_0 )
        !           271:                                        {
        !           272:                                        if ( v[jg] == 0 )
        !           273:                                                break;
        !           274:
        !           275:                                        else if ( v[j] != 0 && v[j] <= v[jg] )
        !           276:                                                break;
        !           277:                                        }
        !           278:
        !           279:                                else if ( v[j] <= v[jg] )
        !           280:                                        break;
        !           281:
        !           282:                                k = v[j];
        !           283:                                v[j] = v[jg];
        !           284:                                v[jg] = k;
        !           285:                                }
        !           286:        }
        !           287:
        !           288:
        !           289: /* dataend - finish up a block of data declarations */
        !           290:
        !           291: void dataend()
        !           292:        {
        !           293:        if ( datapos > 0 )
        !           294:                dataflush();
        !           295:
        !           296:        /* add terminator for initialization; { for vi */
        !           297:        outn( "    } ;\n" );
        !           298:
        !           299:        dataline = 0;
        !           300:        datapos = 0;
        !           301:        }
        !           302:
        !           303:
        !           304: /* dataflush - flush generated data statements */
        !           305:
        !           306: void dataflush()
        !           307:        {
        !           308:        outc( '\n' );
        !           309:
        !           310:        if ( ++dataline >= NUMDATALINES )
        !           311:                {
        !           312:                /* Put out a blank line so that the table is grouped into
        !           313:                 * large blocks that enable the user to find elements easily.
        !           314:                 */
        !           315:                outc( '\n' );
        !           316:                dataline = 0;
        !           317:                }
        !           318:
        !           319:        /* Reset the number of characters written on the current line. */
        !           320:        datapos = 0;
        !           321:        }
        !           322:
        !           323:
        !           324: /* flexerror - report an error message and terminate */
        !           325:
        !           326: void flexerror( msg )
        !           327: const char msg[];
        !           328:        {
        !           329:        fprintf( stderr, "%s: %s\n", program_name, msg );
        !           330:        flexend( 1 );
        !           331:        }
        !           332:
        !           333:
        !           334: /* flexfatal - report a fatal error message and terminate */
        !           335:
        !           336: void flexfatal( msg )
        !           337: const char msg[];
        !           338:        {
        !           339:        fprintf( stderr, _( "%s: fatal internal error, %s\n" ),
        !           340:                program_name, msg );
        !           341:        exit( 1 );
        !           342:        }
        !           343:
        !           344:
        !           345: /* htoi - convert a hexadecimal digit string to an integer value */
        !           346:
        !           347: int htoi( str )
        !           348: Char str[];
        !           349:        {
        !           350:        unsigned int result;
        !           351:
        !           352:        (void) sscanf( (char *) str, "%x", &result );
        !           353:
        !           354:        return result;
        !           355:        }
        !           356:
        !           357:
        !           358: /* lerrif - report an error message formatted with one integer argument */
        !           359:
        !           360: void lerrif( msg, arg )
        !           361: const char msg[];
        !           362: int arg;
        !           363:        {
        !           364:        char errmsg[MAXLINE];
        !           365:        (void) sprintf( errmsg, msg, arg );
        !           366:        flexerror( errmsg );
        !           367:        }
        !           368:
        !           369:
        !           370: /* lerrsf - report an error message formatted with one string argument */
        !           371:
        !           372: void lerrsf( msg, arg )
        !           373: const char msg[], arg[];
        !           374:        {
        !           375:        char errmsg[MAXLINE];
        !           376:
        !           377:        (void) sprintf( errmsg, msg, arg );
        !           378:        flexerror( errmsg );
        !           379:        }
        !           380:
        !           381:
        !           382: /* line_directive_out - spit out a "#line" statement */
        !           383:
        !           384: void line_directive_out( output_file, do_infile )
        !           385: FILE *output_file;
        !           386: int do_infile;
        !           387:        {
        !           388:        char directive[MAXLINE], filename[MAXLINE];
        !           389:        char *s1, *s2, *s3;
        !           390:        static char line_fmt[] = "#line %d \"%s\"\n";
        !           391:
        !           392:        if ( ! gen_line_dirs )
        !           393:                return;
        !           394:
        !           395:        if ( (do_infile && ! infilename) || (! do_infile && ! outfilename) )
        !           396:                /* don't know the filename to use, skip */
        !           397:                return;
        !           398:
        !           399:        s1 = do_infile ? infilename : outfilename;
        !           400:        s2 = filename;
        !           401:        s3 = &filename[sizeof( filename ) - 2];
        !           402:
        !           403:        while ( s2 < s3 && *s1 )
        !           404:                {
        !           405:                if ( *s1 == '\\' )
        !           406:                        /* Escape the '\' */
        !           407:                        *s2++ = '\\';
        !           408:
        !           409:                *s2++ = *s1++;
        !           410:                }
        !           411:
        !           412:        *s2 = '\0';
        !           413:
        !           414:        if ( do_infile )
        !           415:                sprintf( directive, line_fmt, linenum, filename );
        !           416:        else
        !           417:                {
        !           418:                if ( output_file == stdout )
        !           419:                        /* Account for the line directive itself. */
        !           420:                        ++out_linenum;
        !           421:
        !           422:                sprintf( directive, line_fmt, out_linenum, filename );
        !           423:                }
        !           424:
        !           425:        /* If output_file is nil then we should put the directive in
        !           426:         * the accumulated actions.
        !           427:         */
        !           428:        if ( output_file )
        !           429:                {
        !           430:                fputs( directive, output_file );
        !           431:                }
        !           432:        else
        !           433:                add_action( directive );
        !           434:        }
        !           435:
        !           436:
        !           437: /* mark_defs1 - mark the current position in the action array as
        !           438:  *               representing where the user's section 1 definitions end
        !           439:  *              and the prolog begins
        !           440:  */
        !           441: void mark_defs1()
        !           442:        {
        !           443:        defs1_offset = 0;
        !           444:        action_array[action_index++] = '\0';
        !           445:        action_offset = prolog_offset = action_index;
        !           446:        action_array[action_index] = '\0';
        !           447:        }
        !           448:
        !           449:
        !           450: /* mark_prolog - mark the current position in the action array as
        !           451:  *               representing the end of the action prolog
        !           452:  */
        !           453: void mark_prolog()
        !           454:        {
        !           455:        action_array[action_index++] = '\0';
        !           456:        action_offset = action_index;
        !           457:        action_array[action_index] = '\0';
        !           458:        }
        !           459:
        !           460:
        !           461: /* mk2data - generate a data statement for a two-dimensional array
        !           462:  *
        !           463:  * Generates a data statement initializing the current 2-D array to "value".
        !           464:  */
        !           465: void mk2data( value )
        !           466: int value;
        !           467:        {
        !           468:        if ( datapos >= NUMDATAITEMS )
        !           469:                {
        !           470:                outc( ',' );
        !           471:                dataflush();
        !           472:                }
        !           473:
        !           474:        if ( datapos == 0 )
        !           475:                /* Indent. */
        !           476:                out( "    " );
        !           477:
        !           478:        else
        !           479:                outc( ',' );
        !           480:
        !           481:        ++datapos;
        !           482:
        !           483:        out_dec( "%5d", value );
        !           484:        }
        !           485:
        !           486:
        !           487: /* mkdata - generate a data statement
        !           488:  *
        !           489:  * Generates a data statement initializing the current array element to
        !           490:  * "value".
        !           491:  */
        !           492: void mkdata( value )
        !           493: int value;
        !           494:        {
        !           495:        if ( datapos >= NUMDATAITEMS )
        !           496:                {
        !           497:                outc( ',' );
        !           498:                dataflush();
        !           499:                }
        !           500:
        !           501:        if ( datapos == 0 )
        !           502:                /* Indent. */
        !           503:                out( "    " );
        !           504:        else
        !           505:                outc( ',' );
        !           506:
        !           507:        ++datapos;
        !           508:
        !           509:        out_dec( "%5d", value );
        !           510:        }
        !           511:
        !           512:
        !           513: /* myctoi - return the integer represented by a string of digits */
        !           514:
        !           515: int myctoi( array )
        !           516: char array[];
        !           517:        {
        !           518:        int val = 0;
        !           519:
        !           520:        (void) sscanf( array, "%d", &val );
        !           521:
        !           522:        return val;
        !           523:        }
        !           524:
        !           525:
        !           526: /* myesc - return character corresponding to escape sequence */
        !           527:
        !           528: Char myesc( array )
        !           529: Char array[];
        !           530:        {
        !           531:        Char c, esc_char;
        !           532:
        !           533:        switch ( array[1] )
        !           534:                {
        !           535:                case 'b': return '\b';
        !           536:                case 'f': return '\f';
        !           537:                case 'n': return '\n';
        !           538:                case 'r': return '\r';
        !           539:                case 't': return '\t';
        !           540:
        !           541: #if __STDC__
        !           542:                case 'a': return '\a';
        !           543:                case 'v': return '\v';
        !           544: #else
        !           545:                case 'a': return '\007';
        !           546:                case 'v': return '\013';
        !           547: #endif
        !           548:
        !           549:                case '0':
        !           550:                case '1':
        !           551:                case '2':
        !           552:                case '3':
        !           553:                case '4':
        !           554:                case '5':
        !           555:                case '6':
        !           556:                case '7':
        !           557:                        { /* \<octal> */
        !           558:                        int sptr = 1;
        !           559:
        !           560:                        while ( isascii( array[sptr] ) &&
        !           561:                                isdigit( array[sptr] ) )
        !           562:                                /* Don't increment inside loop control
        !           563:                                 * because if isdigit() is a macro it might
        !           564:                                 * expand into multiple increments ...
        !           565:                                 */
        !           566:                                ++sptr;
        !           567:
        !           568:                        c = array[sptr];
        !           569:                        array[sptr] = '\0';
        !           570:
        !           571:                        esc_char = otoi( array + 1 );
        !           572:
        !           573:                        array[sptr] = c;
        !           574:
        !           575:                        return esc_char;
        !           576:                        }
        !           577:
        !           578:                case 'x':
        !           579:                        { /* \x<hex> */
        !           580:                        int sptr = 2;
        !           581:
        !           582:                        while ( isascii( array[sptr] ) &&
        !           583:                                isxdigit( (char) array[sptr] ) )
        !           584:                                /* Don't increment inside loop control
        !           585:                                 * because if isdigit() is a macro it might
        !           586:                                 * expand into multiple increments ...
        !           587:                                 */
        !           588:                                ++sptr;
        !           589:
        !           590:                        c = array[sptr];
        !           591:                        array[sptr] = '\0';
        !           592:
        !           593:                        esc_char = htoi( array + 2 );
        !           594:
        !           595:                        array[sptr] = c;
        !           596:
        !           597:                        return esc_char;
        !           598:                        }
        !           599:
        !           600:                default:
        !           601:                        return array[1];
        !           602:                }
        !           603:        }
        !           604:
        !           605:
        !           606: /* otoi - convert an octal digit string to an integer value */
        !           607:
        !           608: int otoi( str )
        !           609: Char str[];
        !           610:        {
        !           611:        unsigned int result;
        !           612:
        !           613:        (void) sscanf( (char *) str, "%o", &result );
        !           614:        return result;
        !           615:        }
        !           616:
        !           617:
        !           618: /* out - various flavors of outputing a (possibly formatted) string for the
        !           619:  *      generated scanner, keeping track of the line count.
        !           620:  */
        !           621:
        !           622: void out( str )
        !           623: const char str[];
        !           624:        {
        !           625:        fputs( str, stdout );
        !           626:        out_line_count( str );
        !           627:        }
        !           628:
        !           629: void out_dec( fmt, n )
        !           630: const char fmt[];
        !           631: int n;
        !           632:        {
        !           633:        printf( fmt, n );
        !           634:        out_line_count( fmt );
        !           635:        }
        !           636:
        !           637: void out_dec2( fmt, n1, n2 )
        !           638: const char fmt[];
        !           639: int n1, n2;
        !           640:        {
        !           641:        printf( fmt, n1, n2 );
        !           642:        out_line_count( fmt );
        !           643:        }
        !           644:
        !           645: void out_hex( fmt, x )
        !           646: const char fmt[];
        !           647: unsigned int x;
        !           648:        {
        !           649:        printf( fmt, x );
        !           650:        out_line_count( fmt );
        !           651:        }
        !           652:
        !           653: void out_line_count( str )
        !           654: const char str[];
        !           655:        {
        !           656:        register int i;
        !           657:
        !           658:        for ( i = 0; str[i]; ++i )
        !           659:                if ( str[i] == '\n' )
        !           660:                        ++out_linenum;
        !           661:        }
        !           662:
        !           663: void out_str( fmt, str )
        !           664: const char fmt[], str[];
        !           665:        {
        !           666:        printf( fmt, str );
        !           667:        out_line_count( fmt );
        !           668:        out_line_count( str );
        !           669:        }
        !           670:
        !           671: void out_str3( fmt, s1, s2, s3 )
        !           672: const char fmt[], s1[], s2[], s3[];
        !           673:        {
        !           674:        printf( fmt, s1, s2, s3 );
        !           675:        out_line_count( fmt );
        !           676:        out_line_count( s1 );
        !           677:        out_line_count( s2 );
        !           678:        out_line_count( s3 );
        !           679:        }
        !           680:
        !           681: void out_str_dec( fmt, str, n )
        !           682: const char fmt[], str[];
        !           683: int n;
        !           684:        {
        !           685:        printf( fmt, str, n );
        !           686:        out_line_count( fmt );
        !           687:        out_line_count( str );
        !           688:        }
        !           689:
        !           690: void outc( c )
        !           691: int c;
        !           692:        {
        !           693:        putc( c, stdout );
        !           694:
        !           695:        if ( c == '\n' )
        !           696:                ++out_linenum;
        !           697:        }
        !           698:
        !           699: void outn( str )
        !           700: const char str[];
        !           701:        {
        !           702:        puts( str );
        !           703:        out_line_count( str );
        !           704:        ++out_linenum;
        !           705:        }
        !           706:
        !           707:
        !           708: /* readable_form - return the the human-readable form of a character
        !           709:  *
        !           710:  * The returned string is in static storage.
        !           711:  */
        !           712:
        !           713: char *readable_form( c )
        !           714: register int c;
        !           715:        {
        !           716:        static char rform[10];
        !           717:
        !           718:        if ( (c >= 0 && c < 32) || c >= 127 )
        !           719:                {
        !           720:                switch ( c )
        !           721:                        {
        !           722:                        case '\b': return "\\b";
        !           723:                        case '\f': return "\\f";
        !           724:                        case '\n': return "\\n";
        !           725:                        case '\r': return "\\r";
        !           726:                        case '\t': return "\\t";
        !           727:
        !           728: #if __STDC__
        !           729:                        case '\a': return "\\a";
        !           730:                        case '\v': return "\\v";
        !           731: #endif
        !           732:
        !           733:                        default:
        !           734:                                (void) sprintf( rform, "\\%.3o",
        !           735:                                                (unsigned int) c );
        !           736:                                return rform;
        !           737:                        }
        !           738:                }
        !           739:
        !           740:        else if ( c == ' ' )
        !           741:                return "' '";
        !           742:
        !           743:        else
        !           744:                {
        !           745:                rform[0] = c;
        !           746:                rform[1] = '\0';
        !           747:
        !           748:                return rform;
        !           749:                }
        !           750:        }
        !           751:
        !           752:
        !           753: /* reallocate_array - increase the size of a dynamic array */
        !           754:
        !           755: void *reallocate_array( array, size, element_size )
        !           756: void *array;
        !           757: int size;
        !           758: size_t element_size;
        !           759:        {
        !           760:        register void *new_array;
        !           761:        size_t num_bytes = element_size * size;
        !           762:
        !           763:        new_array = flex_realloc( array, num_bytes );
        !           764:        if ( ! new_array )
        !           765:                flexfatal( _( "attempt to increase array size failed" ) );
        !           766:
        !           767:        return new_array;
        !           768:        }
        !           769:
        !           770:
        !           771: /* skelout - write out one section of the skeleton file
        !           772:  *
        !           773:  * Description
        !           774:  *    Copies skelfile or skel array to stdout until a line beginning with
        !           775:  *    "%%" or EOF is found.
        !           776:  */
        !           777: void skelout()
        !           778:        {
        !           779:        char buf_storage[MAXLINE];
        !           780:        char *buf = buf_storage;
        !           781:        int do_copy = 1;
        !           782:
        !           783:        /* Loop pulling lines either from the skelfile, if we're using
        !           784:         * one, or from the skel[] array.
        !           785:         */
        !           786:        while ( skelfile ?
        !           787:                (fgets( buf, MAXLINE, skelfile ) != NULL) :
        !           788:                ((buf = (char *) skel[skel_ind++]) != 0) )
        !           789:                { /* copy from skel array */
        !           790:                if ( buf[0] == '%' )
        !           791:                        { /* control line */
        !           792:                        switch ( buf[1] )
        !           793:                                {
        !           794:                                case '%':
        !           795:                                        return;
        !           796:
        !           797:                                case '+':
        !           798:                                        do_copy = C_plus_plus;
        !           799:                                        break;
        !           800:
        !           801:                                case '-':
        !           802:                                        do_copy = ! C_plus_plus;
        !           803:                                        break;
        !           804:
        !           805:                                case '*':
        !           806:                                        do_copy = 1;
        !           807:                                        break;
        !           808:
        !           809:                                default:
        !           810:                                        flexfatal(
        !           811:                                        _( "bad line in skeleton file" ) );
        !           812:                                }
        !           813:                        }
        !           814:
        !           815:                else if ( do_copy )
        !           816:                        {
        !           817:                        if ( skelfile )
        !           818:                                /* Skeleton file reads include final
        !           819:                                 * newline, skel[] array does not.
        !           820:                                 */
        !           821:                                out( buf );
        !           822:                        else
        !           823:                                outn( buf );
        !           824:                        }
        !           825:                }
        !           826:        }
        !           827:
        !           828:
        !           829: /* transition_struct_out - output a yy_trans_info structure
        !           830:  *
        !           831:  * outputs the yy_trans_info structure with the two elements, element_v and
        !           832:  * element_n.  Formats the output with spaces and carriage returns.
        !           833:  */
        !           834:
        !           835: void transition_struct_out( element_v, element_n )
        !           836: int element_v, element_n;
        !           837:        {
        !           838:        out_dec2( " {%4d,%4d },", element_v, element_n );
        !           839:
        !           840:        datapos += TRANS_STRUCT_PRINT_LENGTH;
        !           841:
        !           842:        if ( datapos >= 79 - TRANS_STRUCT_PRINT_LENGTH )
        !           843:                {
        !           844:                outc( '\n' );
        !           845:
        !           846:                if ( ++dataline % 10 == 0 )
        !           847:                        outc( '\n' );
        !           848:
        !           849:                datapos = 0;
        !           850:                }
        !           851:        }
        !           852:
        !           853:
        !           854: /* The following is only needed when building flex's parser using certain
        !           855:  * broken versions of bison.
        !           856:  */
        !           857: void *yy_flex_xmalloc( size )
        !           858: int size;
        !           859:        {
        !           860:        void *result = flex_alloc( (size_t) size );
        !           861:
        !           862:        if ( ! result  )
        !           863:                flexfatal(
        !           864:                        _( "memory allocation failed in yy_flex_xmalloc()" ) );
        !           865:
        !           866:        return result;
        !           867:        }
        !           868:
        !           869:
        !           870: /* zero_out - set a region of memory to 0
        !           871:  *
        !           872:  * Sets region_ptr[0] through region_ptr[size_in_bytes - 1] to zero.
        !           873:  */
        !           874:
        !           875: void zero_out( region_ptr, size_in_bytes )
        !           876: char *region_ptr;
        !           877: size_t size_in_bytes;
        !           878:        {
        !           879:        register char *rp, *rp_end;
        !           880:
        !           881:        rp = region_ptr;
        !           882:        rp_end = region_ptr + size_in_bytes;
        !           883:
        !           884:        while ( rp < rp_end )
        !           885:                *rp++ = 0;
        !           886:        }