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

📄 basic1.c

📁 用C语言写的YABasic解释器
💻 C
📖 第 1 页 / 共 3 页
字号:
	                    if (Strlen(r) + Strlen(h+1)>120)        /*因为result最多只能装120个字节*/
	                    {
	                    	MemFree(r);
	                    	MemFree(h);
	                    	serror(1);
	                    }
	                    Strcpy(result,r);
	                    Strcat(result,h+1); 
	                    break;
	      default : 
	      {
	      	    MemFree(r); 
	      	    MemFree(h);
	      	    serror(24);   /***字符串运算过程中,出现语法错误***/
	      }
	  }
	  break;
     }
     MemFree(r); 
     MemFree(h);
}

void exec_sin(char *v, char *result)
{
       char *dot_pos;       
       if (*v!=INTEGER_TYPE&&*v!=REAL_TYPE) 
       {
       	     MemFree(v);
       	     serror(28);
       }
/*       if (*v==REAL_TYPE&&(dot_pos = Strchr(v+1,'.'))!=(char*)Null&&Strlen(dot_pos)>11) 
       	     sprintf(v+1,_Far("%.10f"),atof(v+1));*/
       *result++ = REAL_TYPE;       
       *v = 1;
       gcvt(sin(atof(v+1)),16,result); 
}
void exec_cos(char *v, char *result)
{
       char *dot_pos;       
       if (*v!=INTEGER_TYPE&&*v!=REAL_TYPE) 
       {
       	     MemFree(v);
       	     serror(28);       	     
       }
/*       if (*v==REAL_TYPE&&(dot_pos = Strchr(v+1,'.'))!=(char*)Null&&Strlen(dot_pos)>11) 
             sprintf(v+1,_Far("%.10f"),atof(v+1));*/
       *result++ = REAL_TYPE;
       *v = 1;
       gcvt(cos(atof(v+1)),16,result); 
}
void exec_tan(char *v, char *result)
{
       char *dot_pos;
       if (*v!=INTEGER_TYPE&&*v!=REAL_TYPE) 
       {
       	     MemFree(v);
       	     serror(28);
       }
/*       if (*v==REAL_TYPE&&(dot_pos = Strchr(v+1,'.'))!=(char*)Null&&Strlen(dot_pos)>11) 
             sprintf(v+1,_Far("%.10f"),atof(v+1));*/
       *result++ = REAL_TYPE;
       *v = 1;
/*       gcvt(sin(atof(v+1))/cos(atof(v+1)),16,result); */
       gcvt(tan(atof(v+1)),16,result); 
}
void exec_abs(char *v, char *result)
{
       if (*v!=INTEGER_TYPE&&*v!=REAL_TYPE) 
       {
       	        MemFree(v);
       	        serror(28);  /***绝对运算过程中,变量类型发生错误***/
       }
       else *result++ = *v++;
       if (*v=='-') v++;
       while ( *v != 0 ) *result++ = *v++;
       *result = 0;
}
void exec_log(char *v, char *result)
{       	        
       char *dot_pos;
       *result++ = REAL_TYPE;
       if (*v!=INTEGER_TYPE&&*v!=REAL_TYPE)
       {
       	      MemFree(v);
       	      serror(28);
       }       
       if (*(v+1)=='-'||*(v+1)=='0'&&*(v+2)==0) 
       {
       	      MemFree(v);
       	      serror(25);     /***对数运算出错,零和负数没有对数***/
       }
/*       if (*v==REAL_TYPE&&(dot_pos = Strchr(v+1,'.'))!=(char*)Null&&Strlen(dot_pos)>11) 
       {       	
              sprintf(v+1,_Far("%.10f"),atof(v+1));
              if (atof(v+1)==0)
              {
       	             MemFree(v);
       	             serror(25);    
              }                     
       }*/
       if (!gcvt(ln(atof(v+1)),16,result)) 
       {
       	      MemFree(v);
       	      serror(1); 
       }
}
void exec_sqr(char *v, char *result)
{
       *result++ = REAL_TYPE;
       if (*v!=INTEGER_TYPE&&*v!=REAL_TYPE||*(v+1)=='-'&&atof(v + 2)!=0) 
       {
       	      MemFree(v);
       	      serror(28);           /***负数没有平方根***/
       }
       *v = 1;
       if (!gcvt(sqrt(atof(v+1)),16,result)) 
       {
       	     MemFree(v);
       	     serror(1);
       }
}
void exec_int(char *v, char *result)
{
       char *dot_ptr, *cursor, *r, convert_flag;
              
       if (*v!=INTEGER_TYPE&&*v!=REAL_TYPE) 
       {
       	      MemFree(v);
       	      serror(28); 
       }        
       convert_flag = 0;
       if (*(v+1)=='-'&&Strchr(v+1,'.')) 
       {
       	      dot_ptr = Strchr(v+1,'.');
       	      cursor = dot_ptr+1;
       	      while ( *cursor != 0) 
       	      {
       	      	      if (*cursor==0x30) cursor++;         
       	      	      else 
       	      	      {
       	      	      	    convert_flag = 1;
       	      	      	    break;
       	      	      }
       	      }       	             	      
       }
       r = result;
       *result++ = INTEGER_TYPE;
       v++;
       while (  *v != 0 && *v != '.' ) *result++ = *v++;
       *result = 0;
       if (convert_flag) itoa(atoi(r+1)-1,r+1,10); 
}
void exec_exp(char *v, char *result)
{
       char *dot_pos;	
       double temp_v;	
       if (*v!=INTEGER_TYPE&&*v!=REAL_TYPE) 
       {
       	      MemFree(v);
       	      serror(22);
       }
/*       if (*v==REAL_TYPE&&(dot_pos = Strchr(v+1,'.'))!=(char*)Null&&Strlen(dot_pos)>11) 
              sprintf(v+1,_Far("%.10f"),atof(v+1));*/
       *result++ = REAL_TYPE;
       *v = 1;
       /*temp_v = atof(v+1);*/
       temp_v = exp(atof(v+1));
       if (temp_v == 1E17 || !gcvt(temp_v,16,result)) 
       {
       	       MemFree(v);         
               serror(1);
       }       
      /*
       if (temp_v<0)
             gcvt(1/exp(-temp_v),10,result); 
       else
             gcvt(exp(temp_v),10,result);  */
}
void exec_atn(char *v, char *result)
{       
       char *dot_pos;
       if (*v!=INTEGER_TYPE&&*v!=REAL_TYPE) 
       {
       	      MemFree(v);
       	      serror(22);
       }
/*       if (*v==REAL_TYPE&&(dot_pos = Strchr(v+1,'.'))!=(char*)Null&&Strlen(dot_pos)>11) 
              sprintf(v+1,_Far("%.10f"),atof(v+1)); */
       *result++ = REAL_TYPE;
       *v = 1;
       gcvt(atan(atof(v+1)),16,result); 
}

double bGetRnd()
{
	TimeType time;
	
	TimGetCurrTime(_Far(&time));	
	seed = (seed*2621+1+time.seconds)%8192;	
	return (double)seed/8192;
}

void exec_rnd(char *v, char *result)
{
       if (*v!=INTEGER_TYPE&&*v!=REAL_TYPE) 
       {
       	       MemFree(v);
       	       serror(22);       	       
       }
       *result++ = REAL_TYPE;
       if (*(v+1)=='0') gcvt(PreRndNum,16,result);
       else if (*(v+1)!='-') 
       {
       	      PreRndNum = bGetRnd();
       	      gcvt(PreRndNum,16,result);
       }
       else 
       {
       	      PreRndNum = bGetRnd();
       	      gcvt(PreRndNum,16,result);
       }
}

void exec_not(char *v, char *result)
{
        if (*v==STRING_TYPE) 
        {        	
        	MemFree(v);
        	serror(26);   /***逻辑非运算中,出现语法错误***/     
        }        	        
        if (*v==BOOL_TYPE) 
        {
             *result++ = *v++;
	     if (*v=='1') *result++ = '0';
	     else *result++ = '1';
        } 
        else 
        {
             *result++==BOOL_TYPE;
	     if (atof(v+1)!=0) *result++ = '0';
	     else *result++ = '1';
        }
        *result = 0;
}
void exec_asc(char *v, char *result)
{
     if (*v != STRING_TYPE || *(v + 1) == 0) 
     {
     	MemFree(v);
     	serror(28);
     }
     if (*(v + 1) == 0xff) *(v + 1) = 0;
     
     *result++ = INTEGER_TYPE;     
     itoa((UInt8)*(v+1),result,10);
}

void exec_chr(char *v, char *result)
{	 
     int i;	            
     if (!IsInteger(v)||Strchr(v+1,'-')) 
     {
     	 MemFree(v);
     	 serror(28);
     }
     if ((i = atoi(v+1))>255||i<32) 
     {
     	 MemFree(v);
     	 serror(28);
     }
     *result++ = STRING_TYPE;
     *result++ = i;     
     *result = 0;
}

void exec_len(char *v, char *result)
{
     int l;
     char *p;
     if (*v!=STRING_TYPE) 
     {
     	  MemFree(v);
     	  serror(28);
     }
     *result++ = INTEGER_TYPE;
     l = 0;
     p = v + 1;
     while (*p != 0)
     {
     	  if ((UInt8)*p >= 0x80) p += 2;     	  		
     	  else p++;
     	  l++;
     }
     itoa(l,result,10);
}

void exec_str(char *v, char *result)
{
     char *zero_pos;
     if (*v!=INTEGER_TYPE&&*v!=REAL_TYPE)
     {
     	     MemFree(v);
             serror(22);
     }
     IsInteger(v);
     *result++ = STRING_TYPE;
     Strcpy(result,v + 1);
}

void exec_val(char *v, char *result)
{
     char *p, i, *v1;
     if (*v!=STRING_TYPE) 
     {
     	     MemFree(v);
     	     serror(22);
     }
     *result++ = REAL_TYPE;
     p = v + 1;
     if (*p == '+' || *p == '-') p++;
     if (*p == '.')
     {
     	      Strcpy(result,"0");
     	      return;
     }
     i = 0;
     while (*p == 0x30 && *(p + 1) == 0x30) p++;
     if (*p == 0x30 && isdigit(*(p + 1))) p++;
     v1 = p;
     while (*p != 0)
     {
     	     if ( ( *p < 0x30 || *p > 0x39 ) && *p != 46 )
     	     {
     	     	    *p = 0;
     	     	    break;
     	     }
     	     else
     	     {
     	     	    if (*p == 46) i++;
     	     	    if (i>1)
     	     	    {
     	     	    	   *p = 0;
     	     	    	   break;
     	     	    }
     	     	    p++;
     	     }
     }     
     if (*(v + 1)=='+') 
     {
     	     if (*(v+2)==0) Strcpy(result,"0");
             else Strcpy(result,v1);
     }        
     else 
     {
     	     if (*(v + 1)=='-')
     	     {
     	     	   if (*(v + 2) == 0) Strcpy(result,"0");
     	     	   else {
     	     	   	*result++='-';
     	     	   	Strcpy(result,v1);
     	     	   }
     	     }
     	     else
     	     {
     	     	   if (*(v + 1) == 0) Strcpy(result,"0");
     	     	   else Strcpy(result,v1);
     	     }
     }             
}

void exec_sgn(char *v, char *result)
{
     if (*v!=INTEGER_TYPE&&*v!=REAL_TYPE) 
     {
      	     MemFree(v);
       	     serror(22);
     } 
     else 
     {

⌨️ 快捷键说明

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