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

📄 input.c

📁 这是一个简单的C编译器的词法分析和语法分析。
💻 C
字号:
#include "define.h"



#define BUFFER_SIZE 4096


extern int read (int, unsigned char *, int);

static int bit_size;								/* 记录最后一次读取的文件字符的个数 */
static unsigned char buffer[MAXLINE+1 + BUFSIZE+1];	/* 输入缓冲 */
int input_file_descr;								/* 输入文件句柄描述 */
unsigned char *curr_ptr;							/* 当前输入的字符的位置 */
char *filename;										/* 当前输入文件的名字 */
unsigned char *last_ptr;								/* 指向当前输入缓冲的末尾 + 1 */
char *line_ptr;											/* 当前输入的行指针 */
int line_no;											/* 当前输入文件的输入行号 */


void fill_buffer()
{
	if ( bit_size == 0 ){
		return ;	
	}
	
	if ( curr_ptr >= last_ptr )
	{	
		curr_ptr = last_ptr;
	}
	else
	{
		int n;
		unsigned char* s;
		n =  (char *)last_ptr - (char *)line_ptr;
		line_ptr = (char *)(&buffer[ MAXLINE ]) - n;
		assert(last_ptr - curr_ptr <= MAXLINE);
		s = &buffer[ MAXLINE ];
		while( last_ptr >= curr_ptr )
		{
			*s-- = * last_ptr;	
		}
		curr_ptr = s;
	}
	bit_size = read(input_file_descr, &buffer[ MAXLINE+1 ], BUFSIZE );
	if ( bit_size < 0 )
	{
		error("Input reading error");
	}else if( bit_size == 0 ){
		return;
	}else{
		last_ptr = &buffer[ MAXLINE + 1 + bit_size ];
		*last_ptr = '\n';
	}
}

void next_line()
{
	do {
		if ( curr_ptr >= last_ptr ){
			fill_buffer();
			if ( curr_ptr >= last_ptr ){
				curr_ptr = 	last_ptr;
				return ;	
			}
		} else {
			line_no++;	
		}
		line_ptr = (char *) curr_ptr;
		while ( *curr_ptr == ' ' || *curr_ptr=='\t' ){ curr_ptr ++; }
		
	} while ( *curr_ptr == '\n' && curr_ptr == last_ptr );
}



void init_input()
{
	last_ptr = curr_ptr = &buffer[MAXLINE + 1];
	bit_size = -1;
	line_no = 0;
	filename = NULL;
	fill_buffer();
	if ( curr_ptr >= last_ptr )
		curr_ptr = last_ptr;
	next_line();	
}




⌨️ 快捷键说明

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