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

📄 fbas.i

📁 c编译器实现
💻 I
📖 第 1 页 / 共 3 页
字号:
				if ( yywrap() )					{					 					yy_c_buf_p = yytext  + 0 ;					yy_act = (26  +  ((yy_start - 1) / 2)   + 1) ;					goto do_action;					}				else					{					if ( ! yy_did_buffer_switch_on_eof )						yyrestart( yyin ) ;					}				break;				}			case 0 :				yy_c_buf_p =					yytext  + yy_amount_of_matched_text;				yy_current_state = yy_get_previous_state();				yy_cp = yy_c_buf_p;				yy_bp = yytext  + 0 ;				goto yy_match;			case 2 :				yy_c_buf_p =				&yy_current_buffer->yy_ch_buf[yy_n_chars];				yy_current_state = yy_get_previous_state();				yy_cp = yy_c_buf_p;				yy_bp = yytext  + 0 ;				goto yy_find_action;			}		break;		}	default:		yy_fatal_error(  			"fatal flex scanner internal error--no action found"   ) ;	}  		}  	}   static int yy_get_next_buffer()	{	register char *dest = yy_current_buffer->yy_ch_buf;	register char *source = yytext ;	register int number_to_move, i;	int ret_val;	if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] )		yy_fatal_error(  		"fatal flex scanner internal error--end of buffer missed"   ) ;	if ( yy_current_buffer->yy_fill_buffer == 0 )		{  		if ( yy_c_buf_p - yytext  - 0  == 1 )			{			 			return 1 ;			}		else			{			 			return 2 ;			}		}	 	 	number_to_move = (int) (yy_c_buf_p - yytext ) - 1;	for ( i = 0; i < number_to_move; ++i )		*(dest++) = *(source++);	if ( yy_current_buffer->yy_buffer_status == 2  )		 		yy_n_chars = 0;	else		{		int num_to_read =			yy_current_buffer->yy_buf_size - number_to_move - 1;		while ( num_to_read <= 0 )			{  			 			YY_BUFFER_STATE b = yy_current_buffer;			int yy_c_buf_p_offset =				(int) (yy_c_buf_p - b->yy_ch_buf);			if ( b->yy_is_our_buffer )				{				int new_size = b->yy_buf_size * 2;				if ( new_size <= 0 )					b->yy_buf_size += b->yy_buf_size / 8;				else					b->yy_buf_size *= 2;				b->yy_ch_buf = (char *)					 					yy_flex_realloc( (void *) b->yy_ch_buf,							 b->yy_buf_size + 2 );				}			else				 				b->yy_ch_buf = 0;			if ( ! b->yy_ch_buf )				yy_fatal_error(  				"fatal error - scanner input buffer overflow"   ) ;			yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];			num_to_read = yy_current_buffer->yy_buf_size -						number_to_move - 1;			}		if ( num_to_read > 8192  )			num_to_read = 8192 ;		 		if ( yy_current_buffer->yy_is_interactive ) { int c = '*', n; for ( n = 0; n <   num_to_read   && (c = fgetc(  yyin  ) ) != (-1)  && c != '\n'; ++n )   (&yy_current_buffer->yy_ch_buf[number_to_move]) [n] = (char) c; if ( c == '\n' )   (&yy_current_buffer->yy_ch_buf[number_to_move]) [n++] = (char) c; if ( c == (-1)  && ferror( yyin ) ) yy_fatal_error(   "input in flex scanner failed"   ) ;  			yy_n_chars  = n; } else if ( ((  			yy_n_chars  = fread(   (&yy_current_buffer->yy_ch_buf[number_to_move]) , 1,   num_to_read  , yyin )) == 0) && ferror( yyin ) ) yy_fatal_error(   "input in flex scanner failed"   ) ; ;		}	if ( yy_n_chars == 0 )		{		if ( number_to_move == 0  )			{			ret_val = 1 ;			yyrestart( yyin );			}		else			{			ret_val = 2 ;			yy_current_buffer->yy_buffer_status =				2 ;			}		}	else		ret_val = 0 ;	yy_n_chars += number_to_move;	yy_current_buffer->yy_ch_buf[yy_n_chars] = 0 ;	yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = 0 ;	yytext  = &yy_current_buffer->yy_ch_buf[0];	return ret_val;	} static yy_state_type yy_get_previous_state()	{	register yy_state_type yy_current_state;	register char *yy_cp;	yy_current_state = yy_start;	for ( yy_cp = yytext  + 0 ; yy_cp < yy_c_buf_p; ++yy_cp )		{		register YY_CHAR yy_c = (*yy_cp ? yy_ec[((unsigned int) (unsigned char)  *yy_cp ) ] : 1);		if ( yy_accept[yy_current_state] )			{			yy_last_accepting_state = yy_current_state;			yy_last_accepting_cpos = yy_cp;			}		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )			{			yy_current_state = (int) yy_def[yy_current_state];			if ( yy_current_state >= 71 )				yy_c = yy_meta[(unsigned int) yy_c];			}		yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];		}	return yy_current_state;	} static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state )	{	register int yy_is_jam;	register char *yy_cp = yy_c_buf_p;	register YY_CHAR yy_c = 1;	if ( yy_accept[yy_current_state] )		{		yy_last_accepting_state = yy_current_state;		yy_last_accepting_cpos = yy_cp;		}	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )		{		yy_current_state = (int) yy_def[yy_current_state];		if ( yy_current_state >= 71 )			yy_c = yy_meta[(unsigned int) yy_c];		}	yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];	yy_is_jam = (yy_current_state == 70);	return yy_is_jam ? 0 : yy_current_state;	}static void yyunput( int c, register char *yy_bp )	{	register char *yy_cp = yy_c_buf_p;	 	*yy_cp = yy_hold_char;	if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )		{  		 		register int number_to_move = yy_n_chars + 2;		register char *dest = &yy_current_buffer->yy_ch_buf[					yy_current_buffer->yy_buf_size + 2];		register char *source =				&yy_current_buffer->yy_ch_buf[number_to_move];		while ( source > yy_current_buffer->yy_ch_buf )			*--dest = *--source;		yy_cp += (int) (dest - source);		yy_bp += (int) (dest - source);		yy_n_chars = yy_current_buffer->yy_buf_size;		if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )			yy_fatal_error(   "flex scanner push-back overflow"   ) ;		}	*--yy_cp = (char) c;	yytext  = yy_bp;	yy_hold_char = *yy_cp;	yy_c_buf_p = yy_cp;	}static int input()	{	int c;	*yy_c_buf_p = yy_hold_char;	if ( *yy_c_buf_p == 0  )		{		 		if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] )			 			*yy_c_buf_p = '\0';		else			{  			yytext  = yy_c_buf_p;			++yy_c_buf_p;			switch ( yy_get_next_buffer() )				{				case 1 :					{					if ( yywrap() )						{						yy_c_buf_p =						yytext  + 0 ;						return (-1) ;						}					if ( ! yy_did_buffer_switch_on_eof )						yyrestart( yyin ) ;					return input();					}				case 0 :					yy_c_buf_p = yytext  + 0 ;					break;				case 2 :					yy_fatal_error(  					"unexpected last match in input()"   ) ;				}			}		}	c = *(unsigned char *) yy_c_buf_p;	 	*yy_c_buf_p = '\0';	 	yy_hold_char = *++yy_c_buf_p;	return c;	}void yyrestart( FILE *input_file )	{	if ( ! yy_current_buffer )		yy_current_buffer = yy_create_buffer( yyin, 16384  );	yy_init_buffer( yy_current_buffer, input_file );	yy_load_buffer_state();	}void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )	{	if ( yy_current_buffer == new_buffer )		return;	if ( yy_current_buffer )		{		 		*yy_c_buf_p = yy_hold_char;		yy_current_buffer->yy_buf_pos = yy_c_buf_p;		yy_current_buffer->yy_n_chars = yy_n_chars;		}	yy_current_buffer = new_buffer;	yy_load_buffer_state();	 	yy_did_buffer_switch_on_eof = 1;	}void yy_load_buffer_state( void )	{	yy_n_chars = yy_current_buffer->yy_n_chars;	yytext  = yy_c_buf_p = yy_current_buffer->yy_buf_pos;	yyin = yy_current_buffer->yy_input_file;	yy_hold_char = *yy_c_buf_p;	}YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )	{	YY_BUFFER_STATE b;	b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );	if ( ! b )		yy_fatal_error(   "out of dynamic memory in yy_create_buffer()"   ) ;	b->yy_buf_size = size;	 	b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 );	if ( ! b->yy_ch_buf )		yy_fatal_error(   "out of dynamic memory in yy_create_buffer()"   ) ;	b->yy_is_our_buffer = 1;	yy_init_buffer( b, file );	return b;	}void yy_delete_buffer( YY_BUFFER_STATE b )	{	if ( ! b )		return;	if ( b == yy_current_buffer )		yy_current_buffer = (YY_BUFFER_STATE) 0;	if ( b->yy_is_our_buffer )		yy_flex_free( (void *) b->yy_ch_buf );	yy_flex_free( (void *) b );	}void yy_init_buffer( YY_BUFFER_STATE b, FILE *file )	{	yy_flush_buffer( b );	b->yy_input_file = file;	b->yy_fill_buffer = 1;	b->yy_is_interactive = 1;	}void yy_flush_buffer( YY_BUFFER_STATE b )	{	b->yy_n_chars = 0;	 	b->yy_ch_buf[0] = 0 ;	b->yy_ch_buf[1] = 0 ;	b->yy_buf_pos = &b->yy_ch_buf[0];	b->yy_at_bol = 1;	b->yy_buffer_status = 0 ;	if ( b == yy_current_buffer )		yy_load_buffer_state();	}YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size )	{	YY_BUFFER_STATE b;	if ( size < 2 ||	     base[size-2] != 0  ||	     base[size-1] != 0  )		 		return 0;	b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );	if ( ! b )		yy_fatal_error(   "out of dynamic memory in yy_scan_buffer()"   ) ;	b->yy_buf_size = size - 2;	 	b->yy_buf_pos = b->yy_ch_buf = base;	b->yy_is_our_buffer = 0;	b->yy_input_file = 0;	b->yy_n_chars = b->yy_buf_size;	b->yy_is_interactive = 0;	b->yy_at_bol = 1;	b->yy_fill_buffer = 0;	b->yy_buffer_status = 0 ;	yy_switch_to_buffer( b );	return b;	}YY_BUFFER_STATE yy_scan_string( const  char *str )	{	int len;	for ( len = 0; str[len]; ++len )		;	return yy_scan_bytes( str, len );	}YY_BUFFER_STATE yy_scan_bytes( const  char *bytes, int len )	{	YY_BUFFER_STATE b;	char *buf;	yy_size_t n;	int i;	 	n = len + 2;	buf = (char *) yy_flex_alloc( n );	if ( ! buf )		yy_fatal_error(   "out of dynamic memory in yy_scan_bytes()"   ) ;	for ( i = 0; i < len; ++i )		buf[i] = bytes[i];	buf[len] = buf[len+1] = 0 ;	b = yy_scan_buffer( buf, n );	if ( ! b )		yy_fatal_error(   "bad buffer in yy_scan_bytes()"   ) ;	 	b->yy_is_our_buffer = 1;	return b;	}# 1562 "lex.yy.c"# 1573 "lex.yy.c"static void yy_fatal_error( const  char msg[] )	{	(void) fprintf( stderr, "%s\n", msg );	exit( 2  );	} # 1614 "lex.yy.c" # 1632 "lex.yy.c"static void *yy_flex_alloc( yy_size_t size )	{	return (void *) malloc( size );	}static void *yy_flex_realloc( void *ptr, yy_size_t size )	{	 	return (void *) realloc( (char *) ptr, size );	}static void yy_flex_free( void *ptr )	{	free( ptr );	}# 93 "fbas_lex.l"	int yywrap(void){	 return 1;}	# 215 "fbas.y" 2 void Hash_Init(void){	 int i;	 	 for(i=0;i< 1001 ;i++) hash_tab[i]= ((void *)0) ;}int Hash_Func(char *name){	 unsigned int h;	 unsigned char *p;	 	 h=0;	 p=(unsigned char *)name;	 while (*p != 0) {			h=((h<<8)+(*p)) % 1001 ;			p++;	 }	 return h;}	 SYM_ENT *Hash_New(char *name,int sym_type){	 int h;	 SYM_ENT *a;	 a=malloc(sizeof(SYM_ENT));	 strcpy(a->name,name);	 a->reloc_first= ((void *)0) ;	 a->sym_type=sym_type;	 a->reloc_nb=0;	 	 h=Hash_Func(a->name);	 a->hash_next=hash_tab[h];	 hash_tab[h]=a;	 return a;}SYM_ENT *Hash_Search(char *name){	 int h;	 SYM_ENT *p;	 h=Hash_Func(name);	 p=hash_tab[h];	 while (p!= ((void *)0) ) {			if (strcmp(p->name,name)==0) return p;			p=p->hash_next;	 }	 return ((void *)0) ;}void Reloc_New(SYM_ENT *s,int seg,int offset){	 RELOC_ENT *e;	 	 s->reloc_nb++;	 e=malloc(sizeof(RELOC_ENT));	 e->next=s->reloc_first;	 s->reloc_first=e;	 e->seg=seg;	 e->offset=offset;}	 void Sym_Declare(char *name,int seg,int val){	 SYM_ENT *s;	 s=Hash_Search(name);	 if (s!= ((void *)0) ) {			if (s->sym_type!= 0 ) yyerror("Red閒inition de '%s'",name);			s->sym_type= 2 ;	 } else {			s=Hash_New(name,2 );	 }	 s->value=val;	 s->seg=seg;}void Sym_NewPrivate(void){	 int i;	 SYM_ENT *s;	 	 for(i=0;i< 1001 ;i++) {			s=hash_tab[i];			while (s!= ((void *)0) ) {				 if (s->sym_type== 2 ) {						strcpy(s->name,".");				 }				 s=s->hash_next;			}	 }}			 void Seg_PutByte(int c){	 if (seg_offset[seg_cur] == seg_maxsize[seg_cur]) {			seg_maxsize[seg_cur]+= 4096 ;			if (seg_data[seg_cur] == ((void *)0) ) {				 seg_data[seg_cur]=malloc(seg_maxsize[seg_cur]);			} else {				 seg_data[seg_cur]=realloc(seg_data[seg_cur],seg_maxsize[seg_cur]);			}	 }	 seg_data[seg_cur][seg_offset[seg_cur]]=c;	 seg_offset[seg_cur]++;}void Seg_PutSym(int data,char *sym_str){	 SYM_ENT *s;	 	 if (sym_str!= ((void *)0) ) {			s=Hash_Search(sym_str);			if (s== ((void *)0) ) {				 s=Hash_New(sym_str,0 );			}			Reloc_New(s,seg_cur,seg_offset[seg_cur]);	 }	 Seg_PutByte((data      ) & 0xFF);	 Seg_PutByte((data >> 8 ) & 0xFF);	 Seg_PutByte((data >> 16) & 0xFF);	 Seg_PutByte((data >> 24) & 0xFF);}	 void Seg_Init(void){	 int i;	 	 for(i=0;i< 2 ;i++) {			seg_offset[i]=0;			seg_maxsize[i]=0;			seg_data[i]= ((void *)0) ;	 }}void fput_i(FILE *f,unsigned int a){	 fputc((a >>24) & 0xFF,f);	 fputc((a >>16) & 0xFF,f);	 fputc((a >> 8) & 0xFF,f);	 fputc((a     ) & 0xFF,f);}# 394 "fbas.y"static void mput_i(unsigned char *p,unsigned int a){	 p[3]=a >> 24;	 p[2]=a >> 16;	 p[1]=a >> 8;	 p[0]=a;}static int mget_i(unsigned char *p){	 return (p[3]<<24) + (p[2]<<16) + (p[1]<<8) + (p[0]);}	  void Seg_ExecWrite(char *filename,int stack_size){	 FILE *f;	 int i,adr;	 SYM_ENT *s;	 RELOC_ENT *ent;	 unsigned char *buf;	 int code_size,data_size;	 int reloc_nb;	 	  	 for(i=0;i<2;i++) {			seg_cur=i;			while ((seg_offset[seg_cur] % 16 ) != 0) Seg_PutByte(0);	 }	 	 code_size=seg_offset[0];	 data_size=seg_offset[1];	 reloc_nb=0;	 	  	 for(i=0;i< 1001 ;i++) {			s=hash_tab[i];			while (s!= ((void *)0) ) {				 if (s->sym_type == 0 ) 					 yyerror("Symbole '%s' non r閟olu",s->name);				 ent=s->reloc_first;				 while (ent!= ((void *)0) ) {						if (s->seg!= -1 ) reloc_nb++;						buf=&seg_data[ent->seg][ent->offset];						adr=mget_i(buf); 						if (s->seg== 1 ) adr+=code_size+s->value;						else adr+=s->value;						mput_i(buf,adr);												ent=ent->next;				 }				 s=s->hash_next;			}	 }	 	 f=fopen(filename,"w");	 fput_i(f,(('f' << 24)|('b' << 16)|('v' << 8)|'m') );	 fput_i(f,reloc_nb);	 fput_i(f,code_size+data_size);	 fput_i(f,stack_size);	 	 for(i=0;i< 2 ;i++) {			fwrite(seg_data[i],1,seg_offset[i],f);	 }	  	 for(i=0;i< 1001 ;i++) {			s=hash_tab[i];			while (s!= ((void *)0) ) {				 if (s->seg != -1 ) {						ent=s->reloc_first;						while (ent!= ((void *)0) ) {							 if (ent->seg== 1 ) 								 fput_i(f,code_size+ent->offset);							 else								 fput_i(f,ent->offset);							 ent=ent->next;						}				 }				 s=s->hash_next;			}	 }	 	 fclose(f);}void Sym_Print(int type){	 int i;	 SYM_ENT *s;	 RELOC_ENT *ent;	 	 for(i=0;i< 1001 ;i++) {			s=hash_tab[i];			while (s!= ((void *)0) ) {				 if (s->sym_type==type) {						if (type!= 0 )							printf("%s: %d:0x%X @ ",s->name,s->seg,s->value);						else							printf("%s @ ",s->name);												ent=s->reloc_first;						while (ent!= ((void *)0) ) {							 printf("%d:0x%X ",ent->seg,ent->offset);							 ent=ent->next;						}						printf("\n");				 }				 s=s->hash_next;			}	 }}void Seg_Verbose(void){	 int i;	 	 for(i=0;i< 2 ;i++) {			printf("Segment %d: size=%d\n",i,seg_offset[i]);	 }	 printf("\nPrivate Symbols:\n");	 Sym_Print(2 );	 printf("\nExported Symbols:\n");	 Sym_Print(1 );	 printf("\nImported Symbols:\n");	 Sym_Print(0 );} 	 	 void yyerror(char *format,...){	 va_list ap;	 	 fprintf(stderr,"fbas: Error Line %d: ",lex_linenum);	 	  ap =(char *)&( format ); ;	 vfprintf(stderr,format,ap);	  ;	 	 fprintf(stderr,"\n");	 exit(1);}void print_help(void){	 printf("usage: fbas [-h] [-?] [-v] [-s stack_size] [-o exec_name]\n"					"Assembler (version 1.00) (c) 1996 Fabrice Bellard\n"					"(compiled for %s)\n"					"\n","i386" 					);}int main(int argc,char *argv[]){	 int c;	 char obj_filename[256 ];	 int verbose,stack_size;	 	 strcpy(obj_filename,"fba.out");	 verbose=0;	 stack_size=64 * 1024;	 	 while (1) {			c=getopt(argc,argv,"h?vo:s:");			if (c==-1) break;			switch (c) {			 case 'h':			 case '?':				 print_help();				 exit(0);				 break;			 case 'o':				 strcpy(obj_filename,optarg);				 break;			 case 'v':				 verbose=1;				 break;			 case 's':				 stack_size=atoi(optarg);				 break;			}	 }	 Seg_Init();	 Hash_Init();	 	 lex_linenum=1;	 yyparse();	 	 if (verbose) Seg_Verbose();	 	 Seg_ExecWrite(obj_filename,stack_size);	 return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -