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

📄 basic3.c

📁 用C语言写的YABasic解释器
💻 C
📖 第 1 页 / 共 3 页
字号:
/*		
	if ((i.var = (char *)MemAlloc(Strlen(token)+1)) == (char *)Null) serror(1);
	else 
	{
	        Strcpy(i.var,token);
	        *(i.var + Strlen(token)) = 0;
	}
*/	
	get_token(0);
	if(*token != '=')
	{
/*		MemFree(i.var);*/
		serror(38);
	}
/*	value = GetAllocBuf();
	get_exp(value);*/
	temp = TmpBuf + 18 * 120;
	Memset(temp, 0, 120);
	get_exp(temp);
	if ((value = (char *)MemAlloc( Strlen(temp) + 1 )) != (char *)Null) 
	{
		Strcpy(value,temp);
		*(value+Strlen(value)) = 0;		
	}
	else
	{
		/*MemFree(i.var);*/
		serror(1);
	}
	if (*value!=REAL_TYPE&&*value!=INTEGER_TYPE)
	{
		/*MemFree(i.var);*/
		MemFree(value);
		serror(38);
	}
	if ((i.var = (char *)MemAlloc( Strlen(var_tmp) + 1 )) == (char *)Null) 
	{
		MemFree(value);
		serror(1);
	}
	else 
	{
	        Strcpy(i.var,var_tmp);
	        *(i.var + Strlen(i.var)) = 0;
	}
	value1 = atof(value+1);
	if (!agree_v(i.var,value))
	{
		MemFree(i.var);
		MemFree(value);
		serror(38);
	}
	p = search_vartree(i.var);
	if (p==(bitnode *)Null) doingassign(i.var,value);
	else 
	{	     
	        MemFree(p->value_addr);
	        p->value_addr = value;
	        MemFree(i.var);
	        i.var = p->var_addr;
	}
	get_token(0);
	if(tok != TO) serror(38);
	temp = GetAllocBuf();
	get_exp(temp);
	if (*temp != INTEGER_TYPE&&*temp != REAL_TYPE) serror(38);
	i.target = atof(temp + 1);
	get_token(0);
	if (tok != STEP) i.step = 1;
	else 
	{
	        temp = GetAllocBuf();
	        get_exp(temp);
	        if (*temp!=INTEGER_TYPE&&*temp!=REAL_TYPE) serror(38);
	        if ((i.step = atof(temp+1))==0) serror(38);
	}
	if (i.step > 0)
	{
	        if(value1 <= i.target)
	        {
		     i.loc = prog;
		     fpush(&i);
	        } 
	        else
	        {
		     while((tok != NEXT)&&(tok != FINISHED)) get_token(0);
		     if (tok == NEXT) get_token(0);
		}
		     
	}
	else
	{
	        if (value1 >= i.target)
	        {
		     i.loc = prog;
		     fpush(&i);
	        }
	        else
	        {
	             while((tok != NEXT)&&(tok != FINISHED)) get_token(0);
	             if (tok == NEXT) get_token(0);
	        }
	}
}

FAR void next()
{
	for_stack_str i;
	double value;
	int    value1;
	bitnode *p;
	char *result, *value_tmp;
	
	result = GetAllocBuf();
	get_next();
	if (Stricmp(token,"next")==0) get_next();
	p = (bitnode *)Null;
	fpop(&i);
	if (Stricmp(token,i.var)!=0) serror(38);
	p = search_vartree(i.var);
	if (Strchr(i.var,'%'))
	{
	       value1 = atoi((char *)get_variables(i.var)+1) + (Int16)i.step;
	       sprintf(result+1,_Far("%d"), value1);
	       *result = INTEGER_TYPE;
	       value = value1;
	}
	else 
	{
	       value = atof((char *)get_variables(i.var)+1) + i.step;
	       gcvt(value,16,result+1);
	       /*sprintf(result+1,_Far("%.12f"), value);*/
	       *result = REAL_TYPE;	       
	}
	if ((value_tmp = (char*)MemAlloc(Strlen(result)+1))==(char*)Null) serror(1);
	Strcpy(value_tmp,result);
	MemFree(p->value_addr);
	p->value_addr = value_tmp;
	if (i.step>0&&value>i.target||i.step<0&&value<i.target) return;	
	fpush(&i);
	prog = i.loc;
}

FAR void exec_read()
{
        char *var, *fb; 

        bitnode *p;
        p = (bitnode *)Null;
        do {
	      get_token(0);
	      if (token_type==VARIABLE) ckvar(token);
	      if ((var = (char *)MemAlloc(Strlen(token)+1))==(char *)Null) serror(1);    /***内存不足***/
	      Strcpy(var,token);
	      if (cur_buf==(data_str *)Null) {
	      	     MemFree(var);
	      	     serror(39);
	      }
	      if (!agree_v(var,cur_buf->value_addr)) {
	      	     MemFree(var);
	      	     serror(40);
	      }
	      p = search_vartree(var);
	      if (p!=(bitnode *)Null) {
	      	     MemFree(var);	      	     
	      	     fb = p->value_addr;
	      	     p->value_addr = cur_buf->value_addr; 
	      	     MemFree(fb);
	      } else 
	      	     doingassign(var,cur_buf->value_addr);
	      cur_buf = cur_buf->next;
	      get_token(0);
	      if ((tok!=EOL)&&(*token!=',')) serror(0);
        } while (tok!=EOL);
}

FAR void exec_input()
{					
	char  *pToken, *pTmpOut;
	UInt8 *hEditWin;
        
        if(setjmp(e_buf)) return;
        InputFlag = 1;
        InputError = 0;
	get_token(0);
	if(token_type==QUOTE)
	{		
		Strcat(TmpOut,token);
	        get_token(0);
	        if(*token!=',') serror(41); /***Input语句出现语法错误***/	      
	        get_token(0);
	}
	if (token_type!=VARIABLE) serror(42);	           	
	ckvar(token);
	if (Strstr(token,"()"))
	{
	 	pToken = token;
	        pTmpOut = TmpOut + Strlen(TmpOut);
	        while (*pToken!='(') *pTmpOut++ = *pToken++;
	        pToken += 2;
	        *pTmpOut = 0;
	        Strcat(TmpOut,pToken);
	}
	else
	        Strcat(TmpOut,token);
	Strcat(TmpOut," : ");
	Strcat(TmpOut,"?");	
	adjust_poutbuf(TmpOut);
	hEditWin = GuiScrnEditGetEdit(hBasicWnd);
	GuiEditSetText(hEditWin,TmpOut);
	while (*prog==0x20||*prog==0x09) prog++;
	if (*prog==',') 
	{
		InputFlag = 1;
		prog++;
	}
	else if (*prog==':'||*prog==0x0D)
	{
		InputFlag = 0;
		prog++;
	}
	else 
	        serror(41);
	return;
}


FAR bitnode *search_vartree(char *s)
{
	bitnode *p;
	p = Variables;
	while (p!=(bitnode *)Null) 
	{
	     if (Stricmp(p->var_addr,s)>0) p = p->lch;
	     else if (Stricmp(p->var_addr,s)<0) p = p->rch;
	     else break;
	}
	return p;
}

FAR void exec_GraphModeInput()
{
	
	char  *pToken, *pTmpOut, *tmp_buf;
	UInt8 *hEditWin;
	MEvent ev;		
	
	for(;;)
	{
	get_token(0);
	if(token_type==QUOTE)
	{		
		Strcat(TmpOut,token);
	        get_token(0);
	        if(*token!=',') serror(41); /***Input语句出现语法错误***/	      
	        get_token(0);
	}
	if (token_type!=VARIABLE) serror(42);
	ckvar(token);
	if (Strstr(token,"()"))
	{
	 	pToken = token;
	        pTmpOut = TmpOut + Strlen(TmpOut);
	        while (*pToken!='(') *pTmpOut++ = *pToken++;
	        pToken += 2;
	        *pTmpOut = 0;
	        Strcat(TmpOut,pToken);
	}
	else
	        Strcat(TmpOut,token);
	Strcat(TmpOut," : ");
	Strcat(TmpOut,"?");	
	adjust_poutbuf(TmpOut);
	hEditWin = GuiScrnEditGetEdit(hBasicWnd);
	GuiEditSetText((UInt8 *)hEditWin,(UInt8 *)TmpOut);
	while (*prog==0x20||*prog==0x09) prog++;
	tmp_buf = GetAllocBuf();
	Strcpy(tmp_buf,TmpOut);	
	for (;;)
	{
		MsgGet(&ev);
		if (ev.type==evKeyDown)
		{			
			if (ev.x==cmVkEnter) break;
			if (ev.x==cmVkEscape) serror(41);
			if (ev.x<0x20||ev.x>0x80) continue;			
			*(TmpOut + Strlen(TmpOut) + 1 ) = 0;
			*(TmpOut + Strlen(TmpOut)) = ev.x;
			if (Strlen(TmpOut)>100) serror(1);
			/*adjust_poutbuf(TmpOut);*/
			GuiEditSetText(hEditWin,TmpOut);			
		}
	}
	Strcpy(TmpOut,tmp_buf);
	SaveInputData();
	if (*prog == ',')
	{
		prog++;		
	}
	else if (*prog == 0x0d||*prog==':')
	{
		prog++;
		break;
	}
	else 
	        serror(41);	
	}
}

FAR void exec_circle()  /***circle x0,y0,r,fill,type***/
{
	
	UInt8 *hEditWin, saveBKMode;
	char *value1, *value2, *value3, *option1, *option2, pCurBuf_s, *save;	
	
	if (!GTflag) serror(0);
	save = (char *)Null;
	hEditWin = GuiScrnEditGetEdit(hBasicWnd);
        while (*prog==32) prog++;
        if (*prog=='(') 
        {
	          option1 = prog;
	          while (*option1!=')'&&*option1!=0x0D&&*option1!=':') option1++;
	          if (*option1!=')') serror(0);
	          save = option1; 
	          *option1 = 0x0D;
	          prog++;
        }
        value1 = GetAllocBuf();        
        pCurBuf_s = pCurBuf;
        get_exp(value1);          /***value1 = x0***/
        pCurBuf = pCurBuf_s;
        value2 = GetAllocBuf();
        pCurBuf_s = pCurBuf;
        while (*prog==0x20) prog++;
        if (*prog!=',') serror(0);
        prog++;
        token_type = COMMAND;
        get_exp(value2);         /***value2 = y0***/
        pCurBuf = pCurBuf_s;
        value3 = GetAllocBuf();
        pCurBuf_s = pCurBuf;
        while (*prog==0x20) prog++;
        if (*prog!=',') serror(0);
        prog++;
        token_type = COMMAND;
        get_exp(value3);         /***value = r***/
        if (*value3!=INTEGER_TYPE&&*value3!=REAL_TYPE||Strchr(value3,'-')) serror(0);      /***半径只可以为正数***/
        pCurBuf = pCurBuf_s;
        option1 = GetAllocBuf();
        option2 = option1 + 25;
        while (*prog==0x20) prog++;
        if (*prog!=',')
        {
        	if (*prog!=0x0D&&*prog!=':') serror(0);
                Strcpy(option1,"11");      /***option1 = fill***/
                Strcpy(option2,"11");      /***option2 = type***/
        }
        else
        {
        	prog++;
        	token_type = COMMAND;
        	get_exp(option1);          /*** option1 = fill ***/
        	if (*(option1+2)!=0) serror(0);     
        	while (*prog==0x20) prog++;
                if (*prog!=','&&*prog!=0x0D&&*prog!=':') serror(0);
                if (*prog!=',') Strcpy(option2,"11");     /*** option2 = type ***/
                else
                {
                     prog++;
                     token_type = COMMAND;
                     get_exp(option2);     /*** option2 = type ***/
                     if (*(option2 + 2) != 0) serror(0);
                }                
        }	                        
        while (*prog==0x20) prog++;
        if (*prog!=0x0D&&*prog!=':') serror(0);
        
        saveBKMode = GraphGetBKMode((MDC*)hEditWin);
        switch (*(option2+1)) {      /*** type value ***/

⌨️ 快捷键说明

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