[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

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:        }