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

📄 basic6.c

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

FAR Int8 inkey();
FAR void exec_inkey();
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;

FAR void exec_mid()
{
        char *value, *slen, *llen, *p, *temp, *exp_buf;
        int i, stop, j;
        
        temp = GetAllocBuf();
        slen = temp;
        llen = temp + 50;
        value = GetAllocBuf();
        if (*prog++!='(') serror(18);
        get_exp(value);
        if (*value!=STRING_TYPE) serror(18); /***Mid语句出现语法错误***/
        if (*prog==',')
        	prog++;
        else
                serror(18);
        get_exp(slen);
        if (Strchr(slen,'-')||!IsInteger(slen)) serror(18);
        if (*prog==',')
                prog++;
        else
                serror(18);
        p = prog;
        exp_buf = GetAllocBuf();
        while (*p!=')'&&*p!=0x0d&&!Strchr(":,;#",*p)) p++;
        if (*p!=')') serror(18);        
        *p = 0;
        exp_buf = GetAllocBuf();
        Strcpy(exp_buf,prog);
        *p = ')'; 
        p = prog;
        prog = exp_buf;
        get_exp(llen);
        prog = p + Strlen(exp_buf) + 1;        
        if (Strchr(llen,'-')||!IsInteger(llen)) serror(18);
        if ((i=atoi(slen+1))<1) serror(18);  /***Mid语句出现语法错误***/
        stop = atoi(llen+1);
        j = 1;
        p = value + 1;
        while ( j++ < i && *p != 0 )
        {
              if ((UInt8)*p >= 0x80) p += 2;
              else p++;
        }
        j = 0;
        *token = 0;
        temp = token;
        while ( j++ < stop && *p != 0 ) 
        {        	
        	*temp++ = *p++;
        	if ((UInt8)*(p-1) >= 0x80) *temp++ = *p++;
        }	
        *temp = 0; 
}

FAR char *GetAllocBuf()
{
	char *p;
	p = TmpBuf+(int)pCurBuf * 120;
	Memset(p,0,120);
	pCurBuf++;
	if (pCurBuf == 18) pCurBuf = 0;
	return p;
}

FAR int gcvt(double i, char flag, char *result)
{
	double c, r;
	int num, total;
	char *temp_buf;	
		
	temp_buf = pBasicFileName + 14;
	r = i;
	if (r < 0) r = -r;
	c = 1; num = 0;	
	while ( c<= r)
	{
		c *= 10;
		num++;
	}
	if (num >= 16 && flag == 16) return 0;
	if (num >= 15 && flag == 15) return 0;
	Strcpy(temp_buf,"%.");	
	sprintf(temp_buf+2,_Far("%d"), (UInt16)flag - num - 1);
	Strcat(temp_buf,"f");
	sprintf(result,(FarPtr)temp_buf,i);	
	return 1;
}

⌨️ 快捷键说明

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