📄 misc.c
字号:
int is_hex_digit( ch )
int ch;
{
if ( isdigit( ch ) )
return ( 1 );
switch ( clower( ch ) )
{
case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f':
return ( 1 );
default:
return ( 0 );
}
}
/* line_directive_out - spit out a "# line" statement */
void line_directive_out( output_file_name )
FILE *output_file_name;
{
if ( infilename && gen_line_dirs )
{char *p;
fprintf( output_file_name, "#line %d \"",linenum);
for(p=infilename;*p;p++)
if(*p=='"' || *p=='\\') fprintf(output_file_name,"\\%c",*p);
else if(!isprint(*p)) fprintf(output_file_name,"\\%3.3o",*p);
else fprintf(output_file_name,"%c",*p);
fprintf( output_file_name,"\"\n");
}
}
/* mk2data - generate a data statement for a two-dimensional array
*
* synopsis
* int value;
* mk2data( value );
*
* generates a data statement initializing the current 2-D array to "value"
*/
void mk2data( value )
int value;
{
if ( datapos >= NUMDATAITEMS )
{
putchar( ',' );
dataflush();
}
if ( datapos == 0 )
/* indent */
fputs( " ", stdout );
else
putchar( ',' );
++datapos;
printf( "%5d", value );
}
/* mkdata - generate a data statement
*
* synopsis
* int value;
* mkdata( value );
*
* generates a data statement initializing the current array element to
* "value"
*/
void mkdata( value )
int value;
{
if ( datapos >= NUMDATAITEMS )
{
putchar( ',' );
dataflush();
}
if ( datapos == 0 )
/* indent */
fputs( " ", stdout );
else
putchar( ',' );
++datapos;
printf( "%5d", value );
}
/* myctoi - return the integer represented by a string of digits
*
* synopsis
* Char array[];
* int val, myctoi();
* val = myctoi( array );
*
*/
int myctoi( array )
Char array[];
{
int val = 0;
(void) sscanf( (char *) array, "%d", &val );
return ( val );
}
/* myesc - return character corresponding to escape sequence
*
* synopsis
* Char array[], c, myesc();
* c = myesc( array );
*
*/
Char myesc( array )
Char array[];
{
Char c, esc_char;
register int sptr;
switch ( array[1] )
{
#ifdef __STDC__
case 'a': return ( '\a' );
#endif
case 'b': return ( '\b' );
case 'f': return ( '\f' );
case 'n': return ( '\n' );
case 'r': return ( '\r' );
case 't': return ( '\t' );
case 'v': return ( '\v' );
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
{ /* \<octal> */
sptr = 1;
while ( isascii( array[sptr] ) && isdigit( array[sptr] ) )
/* don't increment inside loop control because if
* isdigit() is a macro it might expand into multiple
* increments ...
*/
++sptr;
c = array[sptr];
array[sptr] = '\0';
esc_char = otoi( array + 1 );
array[sptr] = c;
return ( esc_char );
}
case 'x':
{ /* \x<hex> */
int sptr = 2;
while ( isascii( array[sptr] ) && is_hex_digit( array[sptr] ) )
/* don't increment inside loop control because if
* isdigit() is a macro it might expand into multiple
* increments ...
*/
++sptr;
c = array[sptr];
array[sptr] = '\0';
esc_char = htoi( array + 2 );
array[sptr] = c;
return ( esc_char );
}
default:
return ( array[1] );
}
}
/* otoi - convert an octal digit string to an integer value
*
* synopsis:
* int val, otoi();
* Char str[];
* val = otoi( str );
*/
int otoi( str )
Char str[];
{
int result;
(void) sscanf( (char *) str, "%o", &result );
return ( result );
}
/* readable_form - return the the human-readable form of a character
*
* synopsis:
* int c;
* char *readable_form();
* <string> = readable_form( c );
*
* The returned string is in static storage.
*/
char *readable_form( c )
register int c;
{
static char rform[10];
if ( (c >= 0 && c < 32) || c >= 127 )
{
switch ( c )
{
case '\n': return ( "\\n" );
case '\t': return ( "\\t" );
case '\f': return ( "\\f" );
case '\r': return ( "\\r" );
case '\b': return ( "\\b" );
default:
(void) sprintf( rform, "\\%.3o", c );
return ( rform );
}
}
else if ( c == ' ' )
return ( "' '" );
else
{
rform[0] = c;
rform[1] = '\0';
return ( rform );
}
}
/* reallocate_array - increase the size of a dynamic array */
void *reallocate_array( array, size, element_size )
void *array;
int size, element_size;
{
register void *new_array;
/* same worry as in allocate_array(): */
if ( size * element_size <= 0 )
flexfatal( "attempt to increase array size by less than 1 byte" );
new_array =
(void *) realloc( (char *)array, (unsigned) (size * element_size ));
if ( new_array == NULL )
flexfatal( "attempt to increase array size failed" );
return ( new_array );
}
/* any_skelout - write out one section of any skeleton file
*
* synopsis
* any_skelout(FILE *theskel,FILE *thefile,int *thecounter,char *thename,int use_name,int *back_lf);
*
* DESCRIPTION
* Copies from theskel to thefile until a line beginning with a single or more "%" or
* EOF is found.
* convert @ to the value of lexer_name in name_defined!=0 and use_name!=0
* generate comments and #line (#line only if thecounter!=NULL and *back_lf!=1)
* back_lf indicate that the last characters where backslash-newline
* and it forbide #line because #line are not accepted in macro defs
* do nothing if thefile==NULL
*/
void any_skelout(theskel,thefile,thecounter,thename,use_name,back_lf)
FILE *theskel,*thefile;
int *thecounter;
char *thename;
int use_name;
int *back_lf;
{int ch;
int col=0;
if(thefile==0 )
return;
if ( gen_line_dirs && thecounter!=(int *)0 && thename !=NULL && *back_lf!=1)
{char *p;
fprintf( thefile, "#line %d \"",*thecounter);
for(p=thename;*p;p++)
if(*p=='"' || *p=='\\') fprintf(thefile,"\\%c",*p);
else if(!isprint(*p)) fprintf(thefile,"\\%3.3o",*p);
else fprintf(thefile,"%c",*p);
fprintf( thefile,"\"\n");
}
while((ch=getc(theskel))!=EOF)
{col++;
if(ch=='\\') *back_lf=-1;
else if(ch=='\n' && *back_lf==-1) *back_lf=1;
else if(ch=='%' && *back_lf==1) *back_lf=1;
else *back_lf=0;
if(ch=='@' && use_name)
{if(name_defined==0)
{ fprintf(thefile,"@Undefined_name@");
if(thecounter!=(int *)0 && thename !=NULL)
fprintf( stderr, "bad skeleton: %s, line %d\n", thename, *thecounter );
flexfatal("@ found in skeleton before %%name \n");
}
else fprintf(thefile,"%s",lexer_name);
}
else if(ch=='\n')
{ putc(ch,thefile);
col=0;
if(thecounter!=(int *)0)
(*thecounter)++;}
else if(col==1 && ch=='%')
{fprintf(thefile,"/* ");
while((ch=getc(theskel))!=EOF && ch!='\n')
putc(ch,thefile);
fprintf(thefile," */ %s\n",(*back_lf==1)?"\\":""); /* use \\\n to continue macros def */
if(thecounter!=(int *)0)
(*thecounter)++;
return;
}
else putc(ch,thefile);
};
}
/* action_out - write the actions from the temporary file to lex.yy.c
*
* synopsis
* action_out();
*
* Copies the action file up to % (or end-of-file) to lex.yy.c
*/
void action_out()
{static int bklf=0;
any_skelout(temp_action_file,stdout,(int *)0,(char *)0,0,&bklf);
}
/* skelout - write out one section of the skeleton file
*
* synopsis
* skelout();
*
* DESCRIPTION
* Copies from skelfile to stdout until a line beginning with "%" or
* EOF is found....
*/
void skelout()
{static int skel_line=1,bklf=0;
any_skelout(skelfile,stdout,&skel_line,skelname,1,&bklf);
}
/* header_skeleton_out - write out one section of the skeleton header file
*
* synopsis
* header_skeleton_out();
*
* DESCRIPTION
* Copies from skelheaderfile to headerfile until a line beginning with a single or more "%" or
* EOF is found....
* convert ...
*/
void header_skeleton_out()
{static int hskel_line=1,bklf=0;
any_skelout(skelheaderfile,headerfile,&hskel_line,skelheaderfilename,1,&bklf);
}
/* transition_struct_out - output a yy_trans_info structure
*
* synopsis
* int element_v, element_n;
* transition_struct_out( element_v, element_n );
*
* outputs the yy_trans_info structure with the two elements, element_v and
* element_n. Formats the output with spaces and carriage returns.
*/
void transition_struct_out( element_v, element_n )
int element_v, element_n;
{
printf( "%7d, %5d,", element_v, element_n );
datapos += TRANS_STRUCT_PRINT_LENGTH;
if ( datapos >= 75 )
{
putchar( '\n' );
if ( ++dataline % 10 == 0 )
putchar( '\n' );
datapos = 0;
}
}
/* set lexer name. check redefinition. */
/* if name==NULL and not yet defined use default value as if defined */
/* include section of sheader skeleton if definition made */
void set_lexer_name(name)
char *name;
{if(name==NULL)
{
if(name_defined==0)
{name_defined++;
fprintf( stderr,"No %%name given before line %d . Assuming %%name %s\n",
linenum, lexer_name );
} else return;
}
else if(name_defined)
{synerr( "Multiple %%name declaration" );return;}
else
{strncpy(lexer_name,name,sizeof(lexer_name)-1);
name_defined++;
}
fprintf(stdout,"#define YY_%s_FLEX_SCANNER\n",lexer_name);
if ( ddebug )
fprintf(headerfile, "#define YY_%s_FLEX_DEBUG\n",lexer_name );
if ( csize == 256 )
fprintf(headerfile, "#define YY_%s_CHAR unsigned char\n",lexer_name );
else
fprintf(headerfile, "#define YY_%s_CHAR char\n",lexer_name );
header_skeleton_out();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -