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

📄 command.c

📁 redboy for gba 是BPNS为GBA编写的一个小软件。软件的邹形是BASIC高级语言解释执行器。几经修改和扩展
💻 C
字号:
#include <CsAgb.h>
#include <rbasic.h>
#include <Qgraph.h>
#include <rb_var.h>
#include <rb_string.h>
#include <rb_stdio.h>

extern double rb_cal(char *exp);
extern void rb_get_str(char *exp,char *str);
extern int get_pstr(char lp,char rp,char *exp,char *sv);
extern void rb_input(char *str,u8 tp);
extern void rb_run(char *com);
extern int logic_exe(char *exp);
extern void rb_gosub(char *exp);
extern int get_para(char *exp,double *nump,char *strp,char *tp);
extern void show_text(char *tit,char *txt);
extern u32 myfopen(char *name,u32 *size);
extern void show_text(char *tit,char *txt);

int is_num_type(char ch)
{
   return (ch=='M'||ch=='D'||ch=='F'||ch=='f'||ch=='I'||ch=='i'||is_number(ch));
}
int str_is_num(char *str)
{
   int i=0;
   int dot=0;
   int exp=0;
   while (str[i]!='\0')
   {
      if (str[i]=='E' || str[i]=='e')
      {
         if (exp) return 0;
         exp=i+1;
      }
      else if(str[i]=='.')
      {
         if (dot) return 0;
         dot=i+1;
      }
      else if((str[i]>'9' || str[i]<'0') && str[i]!='+' && str[i]!='-') return 0;
      i++;
   }
   if (exp==1 || exp==i) return 0;
   if (dot && exp && dot>exp) return 0;
   return 1;
}
void rb_cls(char *exp)//CLS
{
   rb_xp=0;
   rb_yp=0;
   Q_box(0,0,239,159,rb_bg);
}

void rb_let(char *exp)
{
   int i;
   u8 indx;
   char *strp;
   char temp[str_max_len];
   switch(exp[0])
   {
      case 'F':
         if (exp[2]!='=')
         {
            rb_error=6;
            return;
         }
         give_float_val(exp[1]-bg_id,rb_cal(exp+3));
         break;
      case 'f':
         indx=get_pstr('[',']',exp+3,temp);
         if (indx==0) {rb_error=6;return;}
         i=3+indx;
         if (exp[i]!='=') {rb_error=6;return;}
         give_float_dim_val(exp[1]-bg_id,rb_cal(temp),rb_cal(exp+i+1));
         break;
      case 'I':
         if (exp[2]!='=')
         {
            rb_error=6;
            return;
         }
         give_int_val(exp[1]-bg_id,rb_cal(exp+3));
         break;
      case 'i':
         indx=get_pstr('[',']',exp+3,temp);
         if (indx==0) {rb_error=6;return;}
         i=3+indx;
         if (exp[i]!='=') {rb_error=6;return;}
         give_int_dim_val(exp[1]-bg_id,rb_cal(temp),rb_cal(exp+i+1));
         break;
      case 'C':
         if (exp[2]!='=')
         {
            rb_error=6;
            return;
         }
         rb_get_str(exp+3,temp);
         give_str_val(exp[1]-bg_id,temp);
         break;
      case 'c':
         indx=get_pstr('[',']',exp+3,temp);
         if (indx==0) {rb_error=6;return;}
         i=3+indx;
         if (exp[i]!='=') {rb_error=6;return;}
         strp=get_str_val(exp[1]-bg_id);
         indx=rb_cal(temp);
         rb_get_str(exp+i+1,temp);
         if (indx>=str_max_len) {rb_error=3;return;}
         strp[indx]=temp[0];
         break;
      default:
         rb_error=6;
         return;
   }
}

void rb_print(char *exp)
{
   int i,sp,flg;
   u8 is_num,inis;
   char temp[str_max_len];
   char str[str_max_len];
   i=0;
   while (1)
   {
      is_num=is_num_type(exp[i]);//是数字类型
      sp=0;
      inis=1;
      flg=0;
      while (1)
      {
         if (exp[i]=='\"') inis=!inis;
         else if (inis && exp[i]=='(') flg++;
         else if (inis && exp[i]==')') flg--;
         if (inis && ((exp[i]==',' && flg==0) || exp[i]==';')) break;
         if (exp[i]=='\0') break;
         temp[sp]=exp[i];
         sp++;
         i++;
      }
      temp[sp]='\0';
      if (is_num || exp[0]=='(') show_float(rb_cal(temp),rb_co);
      else
      {
         rb_get_str(temp,str);
         RBprint(str);
      }
      if (exp[i]==',') {RBprint("   ");i++;if (exp[i]=='\0') return;}
      else if (exp[i]==';') {i++;if (exp[i]=='\0') return;}
      else {endl();return;}
   }
}

void rb_inputs(char *exp)
{
   u8 is_num=0,indx=0,id;
   int i,tp;
   char temp[str_max_len]="\0";
   switch(exp[0])
   {
      case 'F':
         is_num=1;
         break;
      case 'f':
         is_num=1;
         indx=1;
         break;
      case 'I':
         is_num=2;
         break;
      case 'i':
         is_num=2;
         indx=1;
         break;
      case 'C':
         break;
      case 'c':
         indx=1;
         break;
      default:
         rb_error=6;
         return;
   }
   if (indx)
   {
      id=get_pstr('[',']',exp+3,temp);
      i=3+id;
      if (id==0 || exp[i]!='\0') {rb_error=6;return;}
      id=rb_cal(temp);
   }
   else if(exp[2]!='\0') {rb_error=6;return;}
   if (is_num)
   {
   num_again:
      rb_input(temp,1);
      if (str_is_num(temp)==0) {endl();goto num_again;}
      switch(is_num)
      {
         case 1://float
            if(indx) give_float_dim_val(exp[1]-bg_id,id,rb_cal(temp));
            else give_float_val(exp[1]-bg_id,rb_cal(temp));
            break;
         case 2://int
            if(indx) give_int_dim_val(exp[1]-bg_id,id,rb_cal(temp));
            else give_int_val(exp[1]-bg_id,rb_cal(temp));
            break;
      }
   }
   else
   {
      rb_input(temp,0);
      if (indx) temp[1]='\0';
      give_str_val(exp[1]-bg_id,temp);
   }
   endl();
}

void rb_edit(char *exp)
{
   char temp[str_max_len]="\0";
   if (exp[0]!='C') {rb_error=6;return;}
   str_copy(temp,get_str_val(exp[1]-bg_id));
   rb_input(temp,0);
   give_str_val(exp[1]-bg_id,temp);
   endl();
}

void rb_tab(char *exp)
{
   int i;
   int indx=rb_cal(exp);
   for (i=0;i<indx;i++) RBprint(" ");
}

void rb_end(char *exp)
{
   is_basic_run=basic_end;
}

void rb_restore(char *exp)
{
   dat_restore();
}
void rb_clean(char *exp)
{
   dat_clean();
}
void rb_stop(char *exp)
{
   is_basic_run=basic_stop;
}

void rb_if(char *exp)
{
   int is_ture;
   int i=0,tp=0;
   char temp[str_max_len];
   while (1)
   {
      if (exp[i]=='K' && exp[i+1]==11+bg_id) break;
      if (exp[i]=='\0') {rb_error=6;return;}
      temp[tp]=exp[i];
      i++;
      tp++;
   }
   temp[tp]='\0';
   is_ture=logic_exe(temp);
   tp=0;
   i+=3;
   while (1)
   {
      if (exp[i]=='\0' || (exp[i]=='K' && exp[i+1]==12+bg_id)) break;
      temp[tp]=exp[i];
      i++;tp++;
   }
   if (exp[i]=='K') tp--;
   temp[tp]='\0';
   if (is_ture) rb_run(temp);//条件为真
   else if (exp[i]=='K')//条件为假
   {
      tp=0;
      i+=3;
      while (exp[i]!='\0')
      {
         temp[tp]=exp[i];
         tp++;
         i++;
      }
      temp[tp]='\0';
      rb_run(temp);
   }
}

void rb_goto(char *exp)
{
   if (exp[0]!='@') {rb_error=6;return;}
   rb_pc=rb_marks[exp[1]-bg_id];
   if (rb_pc==0) rb_error=31;//行未来标识
}

void rb_on(char *exp)
{
   int i,cnt=0;
   int val;
   if (exp[0]!='F' || exp[3]!='K') {rb_error=6;return;}//只能是浮点数
   val=get_float_val(exp[1]-bg_id);
   i=6;
   while (1)
   {
      if (exp[i]!='@') {rb_error=6;return;}
      //if (cnt==val) {exp[i+2]='\0';break;}
      i+=2;
      if (exp[i]=='\0' || exp[i]==',')
      {
         if (val==cnt) {exp[i]='\0';break;}
         cnt++;
         if (exp[i]=='\0') return;
         i++;
      }
      else {rb_error=6;return;}
   }
   switch (exp[4])
   {
      case bg_id+13:
         rb_goto(exp+i-2);
         break;
      case bg_id+41:
         rb_gosub(exp+i-2);
         break;
      default:
         rb_error=6;
         return;
   }
}

void rb_dim(char *exp)
{
   u8 indx,id,is_int;
   int i=0,sp=0;
   char str[str_max_len];
   while (1)
   {
      if (exp[i]=='i') is_int=1;
      else if (exp[i]=='f') is_int=0;
      else {rb_error=6;return;}
      id=exp[i+1]-bg_id;
      i+=3;
      sp=0;
      indx=get_pstr('[',']',exp+i,str);
      if (indx==0) {rb_error=6;return;}
      i+=indx;
      indx=rb_cal(str);
      if (is_int) int_dim_reg(id,indx);
      else float_dim_reg(id,indx);
      if (rb_error || exp[i]=='\0') break;
      if (exp[i]=='=')//赋初值
      {
         i++;
         if (exp[i]!='{') {rb_error=6;return;}
         i++;
         sp=0;
         indx=1;
         while (1)
         {
            if (exp[i]==',' || exp[i]=='}')
            {
               str[sp]='\0';
               if (is_int) give_int_dim_val(id,indx,rb_cal(str));
               else give_float_dim_val(id,indx,rb_cal(str));
               sp=0;
               indx++;
               if (exp[i]=='}') {i++;break;}
               else i++;
            }
            else
            {
               str[sp]=exp[i];
               i++;
               sp++;
            }
         }
      }
      if (exp[i]=='\0') break;
      else if(exp[i]==',') i++;
      else {rb_error=6;return;}
   }
}
void rb_poke(char *exp)
{
   double x[1];
   if (get_para(exp,x,NULL,"2NN")) return;
   if (x[0]<0 || x[0]>2047 || x[1]<0 || x[2]>255) {rb_error=12;return;}
   rb_peek_M[(int)x[0]]=x[1];
}

void rb_swap(char *exp)
{
   int i,sp;
   int type[1];
   int id;
   int indx[2];
   double num[2];
   char str[str_max_len];
   if (exp[0]=='F' || exp[0]=='f' || exp[0]=='I' || exp[0]=='i') type[0]=1;
   else if (exp[0]=='C') type[0]=2;
   else {rb_error=6;return;}
   if (exp[0]=='f' || exp[0]=='i')//是数组
   {
      i=3+get_pstr('[',']',exp+3,str);
      if (i==3) {rb_error=6;return;}
      indx[0]=rb_cal(str);
   }
   else i=2;
   if (exp[i]!=',') {rb_error=6;return;}
   i++;
   if (exp[i]=='F' || exp[i]=='f' || exp[i]=='I' || exp[i]=='i') type[1]=1;
   else if (exp[i]=='C') type[1]=2;
   else {rb_error=6;return;}
   if (type[0]!=type[1]) {rb_error=22;return;}
   if (exp[i]=='C')
   {
      str_copy(str,get_str_val(exp[1]-bg_id));
      give_str_val(exp[1]-bg_id,get_str_val(exp[i+1]-bg_id));
      give_str_val(exp[i+1]-bg_id,str);
      return;
   }
   id=i;
   if (exp[0]=='f' || exp[0]=='i')//是数组
   {
      i=i+3+get_pstr('[',']',exp+i+3,str);
      if (i==id+3) {rb_error=6;return;}
      indx[1]=rb_cal(str);
   }
   switch(exp[0])
   {
      case 'F':
         num[0]=get_float_val(exp[1]-bg_id);
         break;
      case 'f':
         num[0]=get_float_dim_val(exp[1]-bg_id,indx[0]);
         break;
      case 'I':
         num[0]=get_int_val(exp[1]-bg_id);
         break;
      case 'i':
         num[0]=get_int_dim_val(exp[1]-bg_id,indx[0]);
         break;
   }
   switch(exp[id])
   {
      case 'F':
         num[1]=get_float_val(exp[id+1]-bg_id);
         break;
      case 'f':
         num[1]=get_float_dim_val(exp[id+1]-bg_id,indx[1]);
         break;
      case 'I':
         num[1]=get_int_val(exp[id+1]-bg_id);
         break;
      case 'i':
         num[1]=get_int_dim_val(exp[id+1]-bg_id,indx[1]);
         break;
   }
   switch(exp[0])
   {
      case 'F':
         give_float_val(exp[1]-bg_id,num[1]);
         break;
      case 'f':
         give_float_dim_val(exp[1]-bg_id,indx[0],num[1]);
         break;
      case 'I':
         give_int_val(exp[1]-bg_id,num[1]);
         break;
      case 'i':
         give_int_dim_val(exp[1]-bg_id,indx[0],num[1]);
         break;
   }
   switch(exp[id])
   {
      case 'F':
         give_float_val(exp[id+1]-bg_id,num[0]);
         break;
      case 'f':
         give_float_dim_val(exp[id+1]-bg_id,indx[1],num[0]);
         break;
      case 'I':
         give_int_val(exp[id+1]-bg_id,num[0]);
         break;
      case 'i':
         give_int_dim_val(exp[id+1]-bg_id,indx[1],num[0]);
         break;
   }
}
void rb_sort(char *exp)
{
   switch (exp[0])
   {
      case 'f':
         sort(rb_float_dim[exp[1]-bg_id],rb_float_dim_indx[exp[1]-bg_id]);
         break;
      case 'i':
         sort_int(rb_int_dim[exp[1]-bg_id],rb_int_dim_indx[exp[1]-bg_id]);
         break;
      default:
         rb_error=6;
   }
}
void rb_text(char *exp)
{
   u32 loc,size;
   char fname[str_max_len];
   loc=myfopen(fname,&size);
   if (loc==0) {rb_error=17;return;}
   else show_text(fname,(char *)loc);
   rb_cls(NULL);
}

⌨️ 快捷键说明

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