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

📄 basic.c

📁 用C语言写的YABasic解释器
💻 C
📖 第 1 页 / 共 3 页
字号:
#include "os.h"
#include "res.h"
#include "mask.h"
#include "ptype.h"
#include "project.h"
	
/***basic.c Func declare***/

UInt8 CreateListModeWindow();
UInt8 CreateNewModeWindow();
UInt8 CreateEditModeWindow();
UInt8 CreateBrowseModeWindow();
UInt8 CreateRunModeWindow();
UInt8 CreateSaveModeWindow();
UInt8 CreateRunInputModeWindow();

FAR void exec_GraphModeInput();
FAR void SaveInputData();
FAR void _PrjBeep(void);
FAR void _PrjBeepsStart(void);
FAR void _PrjBeepsEnd(void);

FAR void exec_print();
void _BasicExplain();
void BasicApInitialize(char *bAllBuf);
FAR UInt32 _BasicListModeHandleEvent(UInt8* handle, MEvent* pEvent);
FAR UInt32 _BasicNewModeHandleEvent(UInt8* handle, MEvent* pEvent);
FAR UInt32 _BasicEditModeHandleEvent(UInt8* handle, MEvent* pEvent);
FAR UInt32 _BasicBrowseModeHandleEvent(UInt8* handle, MEvent* pEvent);
FAR UInt32 _BasicRunModeHandleEvent(UInt8* handle, MEvent* pEvent);
FAR UInt32 _BasicSaveModeHandleEvent(UInt8* handle, MEvent* pEvent);
FAR UInt32 _BasicRunInputModeHandleEvent(UInt8* handle, MEvent* pEvent);
FAR void scan_labels();
FAR void InitialVariable();
FAR void FreeAllocMem();
FAR Int8 inkey();
FAR void exec_kbhit();
FAR void exec_getkey();
FAR UInt8 _BasicGetpInBuf();
FAR void _BasicFileDelete();
FAR UInt8 _BasicFileSave(FarPtr s);
FAR void serror(Int8 error);
FAR void exec_cls();
FAR char *GetAllocBuf();
FAR UInt8 agree_v(char *var, char *value);
FAR void assignment();
FAR void exec_goto();
/***basic3.c Func declare***/
FAR void exec_read();
FAR void exec_if();
FAR void exec_else();
FAR void dim();
FAR void exec_for();
FAR void next();
FAR void exec_input();
FAR void exec_circle();
FAR void exec_ellipse();
FAR void exec_box();
FAR void exec_line();
FAR void exec_draw();
/***basic1.c Func***/
FAR int atoi(char *x);
FAR void itoa(int i, char *result, char flag);
FAR double atof(char *x);
FAR int gcvt(double i, char flag, char *result);
FAR void exec_mid();
FAR void exec_right();
FAR void exec_left();
FAR void exec_fn();
FAR void exec_inkey();
FAR char get_result_type(char o, char *r, char *h);
FAR void add_type(char *result, int data_type);
FAR void get_exp(char *result);
FAR void FreeOpMem();
/***basic2.c Func***/
FAR void exec_swap();
FAR void exec_def();
FAR void get_data();
FAR bitnode *search_vartree(char *s);
FAR void doingassign(char *var, char *value);
FAR void IsArray();
FAR void assign_buf();
FAR char *get_type(char *s);
FAR char *find_label(char *s);
FAR void label_init();
FAR void get_next();
FAR char *gpop();
FAR void gpush(char *s);
FAR void fpush(for_stack_str *i);
FAR void fpop(for_stack_str *i);
FAR void find_eol();
FAR void wpop(while_stack_str *i);
FAR char *get_variables(char *s);
FAR void putback();
FAR char get_token(char tflag);
FAR void ckvar(char *s);
FAR char *get_token_last();
FAR int isalpha(char c);
FAR int isdigit(char c);
FAR char tolower(char c);
FAR int isdelim(char c);
FAR int iswhite(char c);
FAR char look_up(char *s);
FAR void exec_open();
FAR void exec_close();
FAR void exec_put();
FAR void exec_get();
/***Basic4.c Function***/
FAR void adjust_poutbuf(char *ad_ptr);
FAR void BasicCreateFileListBox();
FAR void BasicFileFind();
FAR void CreateBasicFileSaveWindow(char flag);
FAR UInt8 IsInteger(char *value_ptr);
FAR void exec_rset();
FAR void exec_lset();
FAR void IsEndOfLine();
/***global variables declare***/
Int8            InputError,InputFlag;
jmp_buf         e_buf;
extern UInt8 	*hDesktop;
bitnode 	*Variables;         /***存储变量二叉树的树根指针***/      
pfnode 		*pf;                /***存储自定义函数的指针***/
fsnode          *fl;                /***存储文件信息的指针***/
data_str 	*data_buf, *cur_buf;/***Data缓冲区指针***/
for_stack_str 	fstack[FOR_NEST];    
while_stack_str wstack[WHILE_WEND];
label_str 	*label_table;
Do_List 	*dl;                /*存储数学运算数值和运算符的指针*/
Tmp_List        *TmpList;           /*各函数中申请的临时变量*/
Int8 		*prog;              /*程序解释指针,指向程序目前待解释的位置*/
Int8 		*token;             /*取Basic程序词条缓冲区*/
Int8            *TmpBuf, *TmpOut, pCurBuf, *pBasicFileName;
Int8 		token_type;         /*取词类型*/
Int8            tok;                /*取词标志*/
Int8 		notdoelse;          /*判定Else词句是否该执行的标记*/
Int8 		*gstack[SUB_NEST];  /*go to 词句信息缓冲区*/
Int16 		ftos;               /*for 信息缓冲的标志*/
Int16           wtos;               /*while 信息缓冲的标志*/
Int16           gtos;               /*go 信息缓冲的标志*/
Int8 		op_b[4];            /*运算符号缓冲*/
Int8 		*pInBuf,*pOutBuf;   /*输入buffer,输出buffer*/
UInt8           *hBasicWnd, *hMainEdit;         /*主窗口*/
UInt8           *hListBox;          /*文件列表控件*/
UInt8           GTflag;             /*图形模式与文本模式切换标志,GTflag=1为图形模式,GTflag=0为文本模式*/
UInt8           nBasicRet, LastnBasieRet;
UInt8           current_mode, Lastcurrent_mode;
UInt8           ResetFlag, explain_over_flag; /*程序复位标志*/
Int16           CurLine;            /*文件列表当前条数*/
Int16           FileCount;
UInt8           bPosX,bPosY;

UInt16          seed;
Int8            sl_flag,HomeKeyDownFlag;            /***运行scan_label标志***/
double          PreRndNum;
UInt16          limit_pos;
UInt16          cur_pos;
UInt16          keydown_buffer;

const FunctionButtons Function_Button_Browse[] = {
	{IDS_AP_NEW, cmLL_new},
        {IDS_AP_MOD, cmLL_mod},
        {IDS_AP_DEL, cmLL_del},
        {IDS_BASIC_RUN,cmJS_run},
        {0, 0}};

const FunctionButtons Function_Button_New[] = {
	{IDS_AP_SAVE, cmXZ_sav},
        {IDS_AP_CUT, cmXZ_cut},
        {IDS_AP_COPY, cmXZ_cop},
        {IDS_AP_PASTE, cmXZ_pas},
        {0, 0}};
/*
const UInt8 (*basic_p[])() = { _CreateListModeWindow, _CreateNewModeWindow, _CreateEditModeWindow, _CreateBrowseModeWindow, 
                         _CreateRunModeWindow, _CreateSaveModeWindow, _CreateRunInputModeWindow};
*/

void exec_locate()
{
	char *posX, *posY;
	Int16 x1, y1;
	posX = GetAllocBuf();       /**posX:纵坐标位置**/ 
	posY = posX + 50;           /**posY:横坐标位置**/
	get_exp(posX);
	if (*posX!=INTEGER_TYPE&&*posX!=REAL_TYPE) serror(14);
	while ( *prog == 0x20 || *prog == 0x09 ) prog++;
	if (*prog++!=',') serror(14);                   /***Locate语句出现语法错误***/	
	get_exp(posY);
	if (*posY!=INTEGER_TYPE&&*posY!=REAL_TYPE) serror(14);
	x1 = atoi(posX+1);          /**x1:纵坐标位置**/ 
	y1 = atoi(posY+1);          /**y1:横坐标位置**/
	if (y1>20||x1>5||y1<1||x1<1) serror(14);		
	else 
	{	        
	        bPosY = (UInt8)(x1-1)*16;
	        bPosX = (UInt8)(y1-1)*8;
	}        
        IsEndOfLine();
}

/*Ap Basic Entry*/
FAR UInt32 _BasicMain(MEvent* pMsg)
{					
	UInt8 	nCWRet;
	UInt16  nMsgRet;		
	UInt32  nRet;	
	char    *bAllBuf;

        nRet = 0;
	if ((bAllBuf = (char*)MemAlloc(BUFFERPROGRAM + 3000))==(char *)Null) 
	{
		GuiMsgBox(hDesktop, ofStyle4|ofResource, IDS_SYS_NEICUNFULL,IDS_MAIN_BASIC, MT_OK_X);
		return nRet;
	} 
	else          
	        BasicApInitialize(bAllBuf);
	        
        while (current_mode<=RUNINPUTMODE && current_mode>=LISTMODE)
        {
        	if (current_mode == LISTMODE && HomeKeyDownFlag)
        	{
        	       nRet = 0;
        	       break;
        	}
        	switch (current_mode)
        	{
        		case LISTMODE :
        			nCWRet = CreateListModeWindow();
        			break;
        		case NEWMODE :
        			nCWRet = CreateNewModeWindow();
        			break;
        		case EDITMODE :
        			nCWRet = CreateEditModeWindow();
        			break;
        		case BROWSEMODE :
        			nCWRet = CreateBrowseModeWindow();
        			break;
        		case RUNMODE :
        			nCWRet = CreateRunModeWindow();
        			break;
        		case SAVEMODE :
        			nCWRet = CreateSaveModeWindow();
        			break;
        		case RUNINPUTMODE :
        			nCWRet = CreateRunInputModeWindow();
        			break;
        		default:
        			break; 
        	}
        	if (current_mode == LISTMODE && !nCWRet)
        	{        		
        		nMsgRet = GuiMsgBox(hDesktop,ofStyle4,_Far("没有记录,要新增吗?"),_Far("Basic编程"),MT_YESNO);
        		if (nMsgRet == cmMsgBoxYes)
        		{
        			Lastcurrent_mode = LISTMODE;
        			current_mode = NEWMODE;
        			nCWRet = CreateNewModeWindow();
        		}
        		else   
        		{
        			MemFree(bAllBuf);
        		        return nRet;
        		}
        	}
        	nRet = ApRun(hBasicWnd);
        	current_mode = (UInt8)nRet;        	
                GuiWindowDestroy(hBasicWnd);
        }
        MemFree(bAllBuf);
        return  nRet;
}

UInt8 CreateListModeWindow()
{		
	BasicFileFind();
       	if (FileCount > -1)
       	      BasicCreateFileListBox();
        else
              return 0;
        AssignFuncPtr((UInt8*)(&((MWindow*)hBasicWnd)->handleEvent), _Far(_BasicListModeHandleEvent));
        return 1;
}

FAR UInt32 _BasicListModeHandleEvent(UInt8* handle, MEvent* pEvent)
{
	UInt16   nMsgRet, temp;
	UInt8    ret_v;
        ListItem *item;
	
	if ( pEvent->type == evKeyDown && (pEvent->x == cmVkUp  || pEvent->x == cmVkPageUp || pEvent->x == cmVkPageDown || pEvent->x == cmVkDown || pEvent->x == cmVkEnter))
		GuiSetState(hListBox, sfFocused);
        switch(pEvent->type) 
        {
        	case evCommand :
			switch (pEvent->x)
        		{
        	        	case cmListPassData:
	                		item = (ListItem *)MAKEPOINTER(pEvent->infoPtr);
	                		item->pData = pInBuf + (item->lineNum*(UInt16)10);
	                		item->FieldLen[0] = 8;
                        		return ListDataReady;
                        	case cmDraw:
                        		GuiSoftKBSetCurrent(IMNone,False);
                        		break;
                        	default:
                        		break;
	        	}
	        	break;
        	case evKeyDown :
        		switch (pEvent->x) 
        	        {        	          	                   	 	                                                 
        	        	case cmVkEnter:
        	          	case cmVkF4:  /*运行程序*/        	          		
        	          	        CurLine = GuiListGetCurrentLine((UInt8*)hListBox);
        	          	        ret_v = _BasicGetpInBuf();
        	          	        if (ret_v == 0)
        	          	        {
        	          	             	GuiMsgBox(handle,ofStyle4,_Far("文件太大,请小于4K!"),_Far("Basic编程"),MT_NONE);
        	          	               	return 0;
        	          	        }else if (ret_v==2)
        	          	        {
        	          	               	GuiMsgBox(handle,ofStyle4,_Far("文件读取出错!"),_Far("Basic编程"),MT_NONE);
        	          	               	return 0;
        	          	        }else if (ret_v==3)
        	          	        {
        	          	               	GuiMsgBox(handle,ofStyle4,_Far("文件打开失败!"),_Far("Basic编程"),MT_NONE);
        	          	              	return 0;
        	          	        }
        		                InitialVariable();        	          	        
        	          	        Lastcurrent_mode = current_mode;
        	          	        ApExit(RUNMODE);
        	          	        return 0;
        	          	case cmVkF1 :  /***新增文件***/
        	          	        Lastcurrent_mode=current_mode;
        	          	        ApExit(NEWMODE);
        	          	        return 0;
        	          	case cmVkF2 :  /***浏览文件***/
        	          	        CurLine = GuiListGetCurrentLine((UInt8*)hListBox);
        	          	        ret_v = _BasicGetpInBuf();
        	          	        if (ret_v==0)
        	          	        {
        	          	         	GuiMsgBox(handle,ofStyle4,_Far("文件太大,请小于4K!"),_Far("Basic编程"),MT_NONE);
        	          	         	return 0;
        	          	        }else if (ret_v==2)
        	          	        {
        	          	              	GuiMsgBox(handle,ofStyle4,_Far("文件读取出错!"),_Far("Basic编程"),MT_NONE);
        	          	              	return 0;
        	          	        }else if (ret_v==3)
        	          	        {
        	          	              	GuiMsgBox(handle,ofStyle4,_Far("文件打开失败!"),_Far("Basic编程"),MT_NONE);
        	          	               	return 0;
        	          	        }        	          	                   	                        	          	                   	                
        	          	        Lastcurrent_mode=current_mode;
        	          	        ApExit(BROWSEMODE);
        	          	        return 0;
        	          	case cmVkF3 :  /***删除文件***/
        	          	        CurLine = GuiListGetCurrentLine((UInt8*)hListBox);
        	          	        nMsgRet=GuiMsgBox(handle,ofStyle4|ofResource,IDS_MSGBOX_DELETEASK,IDS_MAIN_BASIC,MT_YESNO);
        	          	        if (nMsgRet==cmMsgBoxYes)
        	          	        {
        	          	        	_BasicFileDelete();
        	          	                if (--FileCount<0) ApExit(pEvent->infoPtr);
        	          	                else ApExit(LISTMODE);
        	          	                return 0;
        	          	        }        	          	                   	                        	          	                   	                
        	          	        break;
        	          	default :
        	          	        if (pEvent->x >= 'a' && pEvent->x <= 'z'
        	          	          ||pEvent->x >= 'A' && pEvent->x <= 'Z'
        	          	          ||pEvent->x >= '0' && pEvent->x <= '9')
        	          	        {        	          	                   	                	
        	          	           	temp = 0;
        	          	           	while (tolower(*(pInBuf + temp * 10)) != tolower(pEvent->x) && temp <= FileCount)
        	          	               	        temp++;
        	          	          	if (temp<=FileCount)
        	          	               	{
        	          	              		CurLine = temp;
        	          	             		GuiListSetCurrentLine(hListBox,CurLine);
        	          	            	}
        	          	        }
        	          	        break;               
   	                }
        	        break;
        	case evQuit :        	          	                   
        	        ApExit(pEvent->infoPtr);
        	        break;
        }
        if(pEvent->type != evNothing) GuiWindowHandleEvent(handle, pEvent);
        return 0;
}

UInt8 CreateNewModeWindow()
{
	UInt16  	edit_style;
	MEditParam 	pEditParam;
	UInt32          func;
	UInt8           *hEditWnd;
	MEvent          ev;
	
	edit_style = EDS_ENABLE|EDS_EDITOR|EDS_VISIBLE;
        pEditParam.dwHandle = NullID;
	pEditParam.dwCaption = NullID;
	pEditParam.wAllowChar = EDITALLOW_ALL;
	pEditParam.wMaxEditLen = BUFFERPROGRAM;
        pEditParam.wFirstChar = EDITALLOW_ASCII;
	HomeKeyDownFlag = 0;
        if (Lastcurrent_mode != NEWMODE) *pInBuf = 0;
        func = _Far(Function_Button_New);
        hBasicWnd = GuiScrnEditCreate((UInt8*)0,0,_Far("Basic编程"),IDH_EDITOR_01, func, False, edit_style, (UInt8 *)pInBuf, BUFFERPROGRAM, 1, &pEditParam);
        hEditWnd = GuiScrnEditGetEdit(hBasicWnd);
        GuiSetState(hEditWnd,sfFocused);
        if (Lastcurrent_mode != NEWMODE)
        {
        	ev.type = evKeyDown;
                ev.x = 0x5D;
        	ev.y = 0;
        	ev.infoPtr = 0;
        	MsgPost(&ev);
        }                
	AssignFuncPtr((UInt8*)(&((MWindow*)hBasicWnd)->handleEvent), _Far(_BasicNewModeHandleEvent));
	return 1;
}

FAR UInt32 _BasicNewModeHandleEvent(UInt8* handle, MEvent* pEvent)
{
	MEvent   ev;
	UInt16   nMsgRet;
        UInt8    *hEditWnd;
	
	ev.type = evKeyDown;
        ev.x = 0x5D;
        ev.y = 0;
        ev.infoPtr = 0;	
	switch (pEvent->type)
	{
		case evCommand:
			switch (pEvent->x)
			{
				case cmEditorBufferFull :
				case cmEditorHaveMaxLen : 
					GuiMsgBox(handle,ofStyle4,_Far("编辑区已满,不能再编辑了!"),_Far("Basic编程"),MT_NONE);
					return 0;				
			}
			break;
		case evKeyDown:
			switch (pEvent->x)
			{
				case cmVkF1 :  /****存储文件****/
					if (Strlen(pInBuf)==0||Strlen(pInBuf)==1&&*pInBuf==']') 
						GuiMsgBox(handle,ofStyle4,_Far("请输入内容!"),_Far("Basic编程"),MT_NONE);
					else
					{       
						Lastcurrent_mode = current_mode;
						ApExit(SAVEMODE);
						return 0;
					}

⌨️ 快捷键说明

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