📄 misc.c
字号:
/* misc - miscellaneous flex routines *//*- * Copyright (c) 1990 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Vern Paxson. * * The United States Government has rights in this work pursuant * to contract no. DE-AC03-76SF00098 between the United States * Department of Energy and the University of California. * * Redistribution and use in source and binary forms with or without * modification are permitted provided that: (1) source distributions retain * this entire copyright notice and comment, and (2) distributions including * binaries display the following acknowledgement: ``This product includes * software developed by the University of California, Berkeley and its * contributors'' in the documentation or other materials provided with the * distribution and in all advertising materials mentioning features or use * of this software. Neither the name of the University nor the names of * its contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. *//* $Header: /home/daffy/u0/vern/flex/RCS/misc.c,v 2.47 95/04/28 11:39:39 vern Exp $ */#include "flexdef.h"void action_define( defname, value )char *defname;int value; { char buf[MAXLINE]; if ( (int) strlen( defname ) > MAXLINE / 2 ) { format_pinpoint_message( _( "name \"%s\" ridiculously long" ), defname ); return; } sprintf( buf, "#define %s %d\n", defname, value ); add_action( buf ); }void add_action( new_text )char *new_text; { int len = strlen( new_text ); while ( len + action_index >= action_size - 10 /* slop */ ) { int new_size = action_size * 2; if ( new_size <= 0 ) /* Increase just a little, to try to avoid overflow * on 16-bit machines. */ action_size += action_size / 8; else action_size = new_size; action_array = reallocate_character_array( action_array, action_size ); } strcpy( &action_array[action_index], new_text ); action_index += len; }/* allocate_array - allocate memory for an integer array of the given size */void *allocate_array( size, element_size )int size;size_t element_size; { register void *mem; size_t num_bytes = element_size * size; mem = flex_alloc( num_bytes ); if ( ! mem ) flexfatal( _( "memory allocation failed in allocate_array()" ) ); return mem; }/* all_lower - true if a string is all lower-case */int all_lower( str )register char *str; { while ( *str ) { if ( ! isascii( (Char) *str ) || ! islower( *str ) ) return 0; ++str; } return 1; }/* all_upper - true if a string is all upper-case */int all_upper( str )register char *str; { while ( *str ) { if ( ! isascii( (Char) *str ) || ! isupper( *str ) ) return 0; ++str; } return 1; }/* bubble - bubble sort an integer array in increasing order * * synopsis * int v[n], n; * void bubble( v, n ); * * description * sorts the first n elements of array v and replaces them in * increasing order. * * passed * v - the array to be sorted * n - the number of elements of 'v' to be sorted */void bubble( v, n )int v[], n; { register int i, j, k; for ( i = n; i > 1; --i ) for ( j = 1; j < i; ++j ) if ( v[j] > v[j + 1] ) /* compare */ { k = v[j]; /* exchange */ v[j] = v[j + 1]; v[j + 1] = k; } }/* check_char - checks a character to make sure it's within the range * we're expecting. If not, generates fatal error message * and exits. */void check_char( c )int c; { if ( c >= CSIZE ) lerrsf( _( "bad character '%s' detected in check_char()" ), readable_form( c ) ); if ( c >= csize ) lerrsf( _( "scanner requires -8 flag to use the character %s" ), readable_form( c ) ); }/* clower - replace upper-case letter to lower-case */Char clower( c )register int c; { return (Char) ((isascii( c ) && isupper( c )) ? tolower( c ) : c); }/* copy_string - returns a dynamically allocated copy of a string */char *copy_string( str )register const char *str; { register const char *c1; register char *c2; char *copy; unsigned int size; /* find length */ for ( c1 = str; *c1; ++c1 ) ; size = (c1 - str + 1) * sizeof( char ); copy = (char *) flex_alloc( size ); if ( copy == NULL ) flexfatal( _( "dynamic memory failure in copy_string()" ) ); for ( c2 = copy; (*c2++ = *str++) != 0; ) ; return copy; }/* copy_unsigned_string - * returns a dynamically allocated copy of a (potentially) unsigned string */Char *copy_unsigned_string( str )register Char *str; { register Char *c; Char *copy; /* find length */ for ( c = str; *c; ++c ) ; copy = allocate_Character_array( c - str + 1 ); for ( c = copy; (*c++ = *str++) != 0; ) ; return copy; }/* cshell - shell sort a character array in increasing order * * synopsis * * Char v[n]; * int n, special_case_0; * cshell( v, n, special_case_0 ); * * description * Does a shell sort of the first n elements of array v. * If special_case_0 is true, then any element equal to 0 * is instead assumed to have infinite weight. * * passed * v - array to be sorted * n - number of elements of v to be sorted */void cshell( v, n, special_case_0 )Char v[];int n, special_case_0; { int gap, i, j, jg; Char k; for ( gap = n / 2; gap > 0; gap = gap / 2 ) for ( i = gap; i < n; ++i ) for ( j = i - gap; j >= 0; j = j - gap ) { jg = j + gap; if ( special_case_0 ) { if ( v[jg] == 0 ) break; else if ( v[j] != 0 && v[j] <= v[jg] ) break; } else if ( v[j] <= v[jg] ) break; k = v[j]; v[j] = v[jg]; v[jg] = k; } }/* dataend - finish up a block of data declarations */void dataend() { if ( datapos > 0 ) dataflush(); /* add terminator for initialization; { for vi */ outn( " } ;\n" ); dataline = 0; datapos = 0; }/* dataflush - flush generated data statements */void dataflush() { outc( '\n' ); if ( ++dataline >= NUMDATALINES ) { /* Put out a blank line so that the table is grouped into * large blocks that enable the user to find elements easily. */ outc( '\n' ); dataline = 0; } /* Reset the number of characters written on the current line. */ datapos = 0; }/* flexerror - report an error message and terminate */void flexerror( msg )const char msg[]; { fprintf( stderr, "%s: %s\n", program_name, msg ); flexend( 1 ); }/* flexfatal - report a fatal error message and terminate */void flexfatal( msg )const char msg[]; { fprintf( stderr, _( "%s: fatal internal error, %s\n" ), program_name, msg ); exit( 1 ); }/* htoi - convert a hexadecimal digit string to an integer value */int htoi( str )Char str[]; { unsigned int result; (void) sscanf( (char *) str, "%x", &result ); return result; }/* lerrif - report an error message formatted with one integer argument */void lerrif( msg, arg )const char msg[];int arg; { char errmsg[MAXLINE]; (void) sprintf( errmsg, msg, arg ); flexerror( errmsg ); }/* lerrsf - report an error message formatted with one string argument */void lerrsf( msg, arg )const char msg[], arg[]; { char errmsg[MAXLINE]; (void) sprintf( errmsg, msg, arg ); flexerror( errmsg ); }/* line_directive_out - spit out a "#line" statement */void line_directive_out( output_file, do_infile )FILE *output_file;int do_infile; { char directive[MAXLINE], filename[MAXLINE]; char *s1, *s2, *s3; static char line_fmt[] = "#line %d \"%s\"\n"; if ( ! gen_line_dirs ) return; if ( (do_infile && ! infilename) || (! do_infile && ! outfilename) ) /* don't know the filename to use, skip */ return; s1 = do_infile ? infilename : outfilename; s2 = filename; s3 = &filename[sizeof( filename ) - 2]; while ( s2 < s3 && *s1 ) { if ( *s1 == '\\' ) /* Escape the '\' */ *s2++ = '\\'; *s2++ = *s1++; } *s2 = '\0'; if ( do_infile ) sprintf( directive, line_fmt, linenum, filename ); else { if ( output_file == stdout ) /* Account for the line directive itself. */ ++out_linenum; sprintf( directive, line_fmt, out_linenum, filename ); } /* If output_file is nil then we should put the directive in * the accumulated actions. */ if ( output_file ) { fputs( directive, output_file ); } else add_action( directive ); }/* mark_defs1 - mark the current position in the action array as * representing where the user's section 1 definitions end * and the prolog begins */void mark_defs1() { defs1_offset = 0; action_array[action_index++] = '\0';
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -