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

📄 basic7.c

📁 用C语言写的YABasic解释器
💻 C
字号:
#include "os.h"
#include "ptype.h"
#include "res.h"

FAR Int8 inkey();
FAR void exec_inkey();
FAR void exec_getkey();
FAR void exec_kbhit();
FAR void exec_mid();
FAR char *GetAllocBuf();
FAR void get_exp(char *result);
FAR UInt8 IsInteger(char *value_ptr);
FAR void serror(Int8 error);
FAR int atoi(char *x);
FAR Boolean GetValidNumber(char *p, int n);
FAR void SaveInputData();
FAR bitnode *search_vartree(char *s);
FAR char *get_type(char *s);
FAR void doingassign(char *var, char *value);
FAR void add_type(char *result, int data_type);
FAR int gcvt(double i, char flag, char *result);

extern jmp_buf          e_buf;
extern char 		*prog;
extern char 		*token;
extern char             *TmpOut;
extern char             *pOutBuf;
extern char             InputFlag;
extern UInt8            GTflag;
extern Int8            *TmpBuf, *TmpOut, pCurBuf, *pBasicFileName;
extern UInt16          keydown_buffer;


FAR void SaveInputData()
{
	char *value_tmp, *value, *var, *fb, backup_inputflag;
	bitnode *p;
	int i,j;
		
	if (!GTflag)
	{
		if(setjmp(e_buf)) return;
	}
	backup_inputflag = InputFlag;
	InputFlag = 1;
	value_tmp = GetAllocBuf();
	if (Strlen(pOutBuf + Strlen(TmpOut)) > 100) serror(1);
	Strcpy(value_tmp,pOutBuf + Strlen(TmpOut));
	if (*value_tmp == 0) serror(41);
	Strcpy(TmpOut,pOutBuf);
	*(TmpOut + Strlen(TmpOut) + 1 ) = 0;
	*(TmpOut + Strlen(TmpOut)) = 0x0D;
	
           p = search_vartree(token);
	   if (p)
	   {
	   	if (Strchr(token,'$')) 
	   	{
	   		add_type(value_tmp,STRING_TYPE);
	   		if ((value = (char *)MemAlloc(Strlen(value_tmp)+1)) == (char*)Null)
	   		       serror(1);	   		
	   		else 
	   		{
	   			Strcpy(value,value_tmp);
	   			*(value+Strlen(value_tmp)) = 0;
	   		}
	   		fb = p->value_addr;
	   		p->value_addr = value;
	   		MemFree(fb);
	   	} 
	   	else if (Strchr(token,'%'))
	   	{		   		
	   		if (*get_type(value_tmp)==REAL_TYPE)
	   		{
	   			if (value = Strchr(value_tmp,'.')) 
	   			{
	   				 *value = 0;
	   				 *value_tmp = INTEGER_TYPE;		   			         
	   			}
	   			if ((value = (char *)MemAlloc(Strlen(value_tmp)+1))==(char*)Null) 
	   			{
	   			        serror(1);
	   			}
	   			else 
	   			{
	   				Strcpy(value,value_tmp);
	   				*(value+Strlen(value_tmp))=0;
	   			}
	   			fb = p->value_addr;
	   			p->value_addr = value;
	   			MemFree(fb);
	   		} 
	   		else 
	   		{		   			
	   			MemFree(value);	   			
	   			serror(41);
	   		}
	   	} 
	   	else 
	   	{
	   		if (get_type(value_tmp)==(char *)Null) add_type(value_tmp,STRING_TYPE);
	   	        if ((value = (char *)MemAlloc(Strlen(value_tmp)+1))==(char*)Null) 
	   	        {	   	        	
	   	        	serror(1);
	   	        }
	   	        else 
	   	        {
	   	        	Strcpy(value,value_tmp);
	   	        	*(value+Strlen(value_tmp)) = 0;
	   	        }
	   	        fb = p->value_addr;
	   		p->value_addr = value;
	   		MemFree(fb);
	   	}		   	 		   	 		   	
	   } 
	   else 
	   {
	   	if (!(var=(char *)MemAlloc(Strlen(token)+1))) 
	   	{	   		
	   	        serror(1);
	   	}
                Strcpy(var,token);
                if (Strchr(token,'$'))
                {
	   		add_type(value_tmp,STRING_TYPE);
	   		if ((value = (char *)MemAlloc(Strlen(value_tmp)+1))==(char*)Null) 
	   		{	   			
	   			MemFree(var);	   		
	   			serror(1);
	   		}
	   		else 
	   		{
	   			Strcpy(value,value_tmp);
	   			*(value+Strlen(value_tmp))=0;
	   		}
                        doingassign(var,value);
	   	} 
	   	else if (Strchr(token,'%')) 
	   	{		   		
	   		if (*get_type(value_tmp)==REAL_TYPE) 
	   		{
	   			if (value = Strchr(value_tmp,'.')) 
	   			{
	   			      *value = 0;
	   			      *value_tmp = INTEGER_TYPE;
	   			}
	   			if ((value = (char *)MemAlloc(Strlen(value_tmp)+1))==(char*)Null) 
	   			{	   				
	   				MemFree(var);	   				
	   				serror(1);
	   			}
	   			else 
	   			{ 		   			
	   				Strcpy(value,value_tmp);
	   				*(value+Strlen(value_tmp)) = 0;
	   			}
	   			doingassign(var,value);
	   		} 
	   		else 
	   		{
	   			MemFree(var);
	   			MemFree(value);	   				   			
	   			serror(41);
	   		}
	   	} 
	   	else 
	   	{
	   		if (get_type(value_tmp)==(char *)Null) add_type(value_tmp,STRING_TYPE);
	   	        if ((value = (char *)MemAlloc(Strlen(value_tmp)+1))==(char*)Null) 
	   	        {	   	        	
	   	        	MemFree(var);
	   	        	serror(1);	   	        	
	   	        }
	   	        else 
	   	        {		   	        
	   	        	Strcpy(value,value_tmp);
	   	        	*(value+Strlen(value_tmp)) = 0;
	   	        }
	   	        doingassign(var,value);
	   	}
	   }	
	   InputFlag = backup_inputflag;
}

FAR Int8 inkey()
{
        MEvent ev;
        for (;;) 
        {
             if (MsgScanKeyMsg(&ev)) break;
        }                
        if (ev.x>255||ev.x<32) return (Int8)0;
        else return (Int8)ev.x;
}

FAR void exec_inkey()
{
        *token = inkey();
        if (*token == 0) *token = 0xff;
        *(token + 1) = 0;
}


FAR void exec_getkey()
{	
	sprintf(token,_Far("%d"),keydown_buffer);
	keydown_buffer = 0;
}

FAR void exec_kbhit()
{
	MEvent ev;
	if (MsgScanKeyMsg(&ev))
	{
		keydown_buffer = ev.x;
		Strcpy(token,"91");
        }
        else        
        	Strcpy(token,"90");        	        
}

⌨️ 快捷键说明

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