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

📄 var.cpp

📁 一个basic语言的编译工具。
💻 CPP
字号:
#include"type.cpp"
#include"bastype.cpp"
/*-----------CLASS---------------*/

uchar VAR::SETFVAR(uchar a[],float x)
{register uchar i;
 strupr(a);
 if(strchr(a,'(')){setarray(a,x);return 0;}
 if(thelastchar(a)=='!')dellastchar(a);
 for(i=0;i<FVMAX;i++)
  if(strcmp(FLOATVARNAME.p+(i<<4),a)==0){*(FLOATVAR+i)=x;return i;}

 for(i=0;i<30;i++)
  if(*(FLOATVARNAME.p+(i<<4))==0)
   {
    strcpy(FLOATVARNAME.p+(i<<4),a);*(FLOATVAR+i)=x;
    if(i>=FVMAX)FVMAX=i+1;
    return i;
   }
}

uchar VAR::SETIVAR(uchar a[],int x)
{register uchar i;
 strupr(a);
 if(strchr(a,'(')){setarray(a,x);return 0;}
 if(thelastchar(a)=='%')dellastchar(a);
 for(i=0;i<IVMAX;i++)
  if(strcmp(INTVARNAME.p+(i<<4),a)==0){*(INTVAR+i)=x;return i;}

 for(i=0;i<30;i++)
  if(*(INTVARNAME.p+(i<<4))==0)
   {
    strcpy(INTVARNAME.p+(i<<4),a);*(INTVAR+i)=x;
    if(i>=IVMAX)IVMAX=i+1;
    return i;
   }
}

uchar VAR::SETSVAR(uchar a[],uchar far*x)
{register uchar i;
 strupr(a);
 if(thelastchar(a)=='$')dellastchar(a);
 for(i=0;i<SVMAX;i++)
  if(strcmp(STRVARNAME.p+(i<<4),a)==0){strcpy(STRVAR+(i<<8),x);return i;}

 for(i=0;i<30;i++)
  if(*(STRVARNAME.p+(i<<4))==0)
   {
    strcpy(STRVARNAME.p+(i<<4),a);strcpy(STRVAR+(i<<8),x);
    if(i>=SVMAX)SVMAX=i+1;
    return i;
   }
}

int VAR::GETIVAR(uchar a[])
{register uchar i;
 strupr(a);
 if(thelastchar(a)=='%')dellastchar(a);
 for(i=0;i<IVMAX;i++)
  if(strcmp(a,INTVARNAME.p+(i<<4))==0)
   return *(INTVAR+i);
 return 0;
}

float VAR::GETFVAR(uchar a[])
{register uchar i;
 strupr(a);
 if(thelastchar(a)=='!')dellastchar(a);
 for(i=0;i<FVMAX;i++)
  if(strcmp(a,FLOATVARNAME.p+(i<<4))==0)
   return *(FLOATVAR+i);
 return 0;
}

uchar far*VAR::GETSVAR(uchar a[])
{register uchar i;
 strupr(a);
 if(thelastchar(a)=='$')dellastchar(a);
 for(i=0;i<SVMAX;i++)
  if(strcmp(a,STRVARNAME.p+(i<<4))==0)
   return (STRVAR+(i<<8));
 return 0;
}

void VAR::DELIVAR(uchar a[])
{register uchar i;
 for(i=0;i<IVMAX;i++)
  if(strcmp(a,INTVARNAME.p+(i<<4))==0)
  {*(INTVARNAME.p+(i<<4))=0;if(i+1==SVMAX)SVMAX--;}
}

void VAR::DELFVAR(uchar a[])
{register uchar i;
 for(i=0;i<FVMAX;i++)
  if(strcmp(a,FLOATVARNAME.p+(i<<4))==0)
  {*(FLOATVARNAME.p+(i<<4))=0;if(i+1==SVMAX)SVMAX--;}
}

void VAR::DELSVAR(uchar a[])
{register uchar i;
 for(i=0;i<SVMAX;i++)
  if(strcmp(a,STRVARNAME.p+(i<<4))==0)
  {*(STRVARNAME.p+(i<<4))=0;if(i+1==SVMAX)SVMAX--;}
}


void VAR::CHGIVAR(uchar n,int f)
{
 *(INTVAR+(n<<1))=f;
}

void VAR::CHGFVAR(uchar n,float f)
{
 *(FLOATVAR+(n<<2))=f;
}

void VAR::CHGSVAR(uchar n,uchar far*f)
{
 strcpy(STRVAR+(n<<8),f);
}

void VAR::CLEANVAR()
{
 setmem(INTVARNAME.p,4096,0);
 setmem(FLOATVARNAME.p,8192,0);
}

uchar VAR::VARNUM(uchar a[])
{register uchar i,huge*namp;uint max;uchar a1[32];
 strcpy(a1,a);strupr(a1);
 switch(thelastchar(a1))
 {
  case '$':dellastchar(a1);namp=STRVARNAME.p;max=SVMAX;break;
  case '%':dellastchar(a1);namp=INTVARNAME.p;max=IVMAX;break;
  default :namp=FLOATVARNAME.p;max=FVMAX;break;
 }
 for(i=0;i<max;i++)
  if(strcmp((const char*)(namp+(i<<4)),a1)==0)return i;
 return 0xff;
}

/*---------------ARRAY-------------------*/
XMS*array[32];uint maxa=0;
uchar arraytype[32];
uchar arrayname[32][32];
uchar lengofvar[3]={2,4,255};

double getarray(uchar a[],uchar*i)
{uint cf=1;uchar far*p;uchar b[64],j;ulong xb;
 strcpy(b,a);j=*i;
 p=b+*i-1;b[*i]=0;
 while((isalnum(*p)||*p=='%'||*p=='!')&&p<=b)p--;
 p=b+*i+1;
 for(;;)
 {
  switch(*p)
  {case '(':cf++;break;
   case ')':cf--;break;
   case 0:ERR(1);return 0;
  }
  if(cf==0)break;
  p++;
 }
 *p=0;
 *i=p-b;xb=CALC(b+j+1);
 return getarraydat(b,xb);
}

double getarraydat(uchar*a,ulong b)
{register uint i;uchar at;uint r1;float r2;
 uchar a1[64];
oncemore:
 strcpy(a1,a);
 switch(thelastchar(a1))
 {case '%':dellastchar(a1);at=1;break;
  case '$':dellastchar(a1);at=3;break;
  case '!':dellastchar(a1);
  default: at=2;break;
 }
 for(i=0;i<maxa;i++)
  if(strcmp(a1,arrayname[i])==0&&arraytype[i]==at)
  {
   switch(at)
   {case 1:array[i]->X2B((ulong)b<<1,(uchar huge*)&r1,2);
	   return r1;
    case 2:array[i]->X2B((ulong)b<<2,(uchar huge*)&r2,4);
	   return r2;
   }
  }
 if(b>10){ERR(19);return 0;}
 creatarray(a,10);
 goto oncemore;
}

uchar creatarray(uchar a[],ulong b)
{register uint i;uchar at;uint r1;float r2;uchar buf0[1024];
 uchar a1[64];strcpy(a1,a);b++;
 switch(thelastchar(a1))
 {case '%':dellastchar(a1);at=1;break;
  case '$':dellastchar(a1);at=3;break;
  case '!':dellastchar(a1);
  default: at=2;break;
 }
 array[maxa]=new XMS((lengofvar[at]*(ulong)b+1023)/1024);
 r1=array[maxa]->xl/1024;
 setmem(buf0,1024,0);
 for(i=0;i<r1;i++)
  array[maxa]->B2X(buf0,i<<10,1024);
 strcpy(arrayname[maxa],a1);
 arraytype[maxa]=at;
 maxa++;
 return maxa-1;
}

void setarray(uchar a[],double b)
{uchar huge*p,a1[64];
 strcpy(a1,a);p=strchr(a1,'(');
 *p=0;
 p++;dellastchar(p);
 setarraydat(a1,CALC(p),b);
}

void setarraydat(uchar a[],ulong b,double d)
{register uint i;uchar at;uint r1;float r2;uchar a1[64];
oncemore:
 strcpy(a1,a);r1=d;r2=d;
 switch(thelastchar(a1))
 {case '%':dellastchar(a1);at=1;break;
  case '$':dellastchar(a1);at=3;break;
  case '!':dellastchar(a1);
  default: at=2;break;
 }
 for(i=0;i<maxa;i++)
  if(strcmp(a1,arrayname[i])==0&&arraytype[i]==at)
  {
   switch(at)
   {case 1:array[i]->B2X((uchar huge*)&r1,(ulong)b<<1,2);break;
    case 2:array[i]->B2X((uchar huge*)&r2,(ulong)b<<2,4);break;
   }
   return;
  }
 if(b>10){ERR(19);return;}
 creatarray(a,10);
 goto oncemore;
}

void cleanarray()
{register uint i;
 for(i=0;i<maxa;i++)
  delete array[i];
 maxa=0;
}

void delarray(uchar a[])
{register uchar i,j;uchar at;
 uchar a1[64];
 strcpy(a1,a);
 switch(thelastchar(a1))
 {case '%':dellastchar(a1);at=1;break;
  case '$':dellastchar(a1);at=3;break;
  case '!':dellastchar(a1);
  default: at=2;break;
 }
 for(i=0;i<maxa;i++)
  if(strcmp(a1,arrayname[i])==0&&arraytype[i]==at)
  {
   movmem(arraytype+i+1,arraytype+i,32-i);
   movmem(arrayname+i+1,arrayname+i,1024-(i<<5));
   for(j=i;j<32;j++)
    *array[j]=*array[j+1];
   maxa--;return;
  }
 ERR(19);
}

⌨️ 快捷键说明

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