⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 misc.c

📁 flex 词法分析工具 类似于lex 此版本为较早前的版本
💻 C
📖 第 1 页 / 共 2 页
字号:
/* 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 + -