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

📄 string.c

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

extern double rb_cal(char *exp);
extern int get_pstr(char lp,char rp,char *exp,char *sv);

void rb_get_str(char *exp,char *str);

int apart(char *exp,u8 *sv)
{
   int p;
   int inis=1;
   int flg1=0,flg2=0;
   int i=0;
   sv[0]=0;
   p=1;
   while (exp[i]!='\0' && p<max_para)
   {
      switch (exp[i])
      {
         case '\"':
            inis=!inis;
            break;
         case '(':
            if (inis) flg1++;
            break;
         case ')':
            if (inis) flg1--;
            break;
         case '[':
            if (inis) flg2++;
            break;
         case ']':
            if (inis) flg2--;
            break;
         default:
            break;
      }
      if (inis && flg1==0 && flg2==0 && exp[i]==',')
      {
         exp[i]='\0';
         sv[p]=i+1;
         p++;
      }
      i++;
   }
   return p;
}

u8 get_para(char *exp,double *nump,char *strp,char *tp)
{
   u8 ps[max_para];
   int p=apart(exp,ps);
   int np=0,sp=0;
   int i,step;
   step=tp[0]-'0';
   if (p!=step)
   {
      rb_error=15;
      return 1;
   }
   for (i=1;i<=step;i++) //获得参数
   {
      if (tp[i]=='N') ////数值形
      {
         nump[np]=rb_cal(exp+ps[i-1]);
         np++;
      }
      else if (tp[i]=='S') //字符形
      {
         rb_get_str(exp+ps[i-1],strp+sp*str_max_len);
         sp++;
      }
      if (rb_error) return 1;
   }
   return 0;
}
void rb_str(char *exp,char *str)
{
   char temp[str_max_len]="\0";
   double x=rb_cal(exp);
   num_to_str(x,str);
}

void rb_left(char *exp,char *str)
{
   double num[1];
   char temp[str_max_len];
   str[0]='\0';
   if (get_para(exp,num,temp,"2SN")) return;
   if (num[0]<0.0)
   {
      rb_error=16;
      return;
   }
   str_left(str,temp,num[0]);
}

void rb_right(char *exp,char *str)
{
   double num[1];
   char temp[str_max_len];
   str[0]='\0';
   if (get_para(exp,num,temp,"2SN")) return;
   if (num[0]<0.0)
   {
      rb_error=16;
      return;
   }
   str_right(str,temp,num[0]);
}

void rb_mid(char *exp,char *str)
{
   double num[2];
   char temp[str_max_len];
   str[0]='\0';
   if (get_para(exp,num,temp,"3SNN")) return;
   if (num[0]<0.0 || num[1]<0.0)
   {
      rb_error=16;
      return;
   }
   str_sub(str,temp,num[0],num[1]);
}

void rb_chr(char *exp,char *str)//CHR$
{
   str[0]=(u8)rb_cal(exp);
   str[1]='\0';
   return;
}

void rb_string(char *exp,char *str)//STRING$
{
   double num[1];
   char temp[str_max_len];
   int len;
   int i,steps;
   str[0]='\0';
   if (get_para(exp,num,temp,"2SN")) return;
   if (num[0]<=0.0)
   {
      rb_error=16;
      return;
   }
   len=str_len(temp);
   str[0]='\0';
   if (len==0) return;
   steps=num[0];
   for (i=0;i<steps;i++)
   {
      if (i*len>=str_max_len-1) return;
      str_cat(str,temp);
   }
}
void rb_reverse(char *exp,char *str)//REVERSE$
{
   rb_get_str(exp,str);
   str_reverse(str);
}

void rb_lowstr(char *exp,char *str)//LOWSTR$
{
   rb_get_str(exp,str);
   str_low(str);
}
void rb_upstr(char *exp,char *str)//UPSTR$
{
   rb_get_str(exp,str);
   str_up(str);
}
void rb_replace(char *exp,char *str)//REPLACE$
{
   char temp[3*str_max_len];
   str[0]=0;
   if (get_para(exp,NULL,temp,"3SSS")) return;
   str_copy(str,temp);
   str_replace(str,temp+str_max_len,temp+str_max_len*2);
}
void rb_cover(char *exp,char *str)//COVER$
{
   u8 ps[max_para];
   char para[str_max_len];
   u8 fla=apart(exp,ps);//分离参数
   if (fla!=3)//参数有误
   {
      rb_error=15;
      str[0]='\0';
      return;
   }
   rb_get_str(exp,str);
   rb_get_str(exp+ps[1],para);
   fla=(u8)rb_cal(exp+ps[2]);
   str_cover(str,para,fla);
}
void rb_insert(char *exp,char *str)//insert$
{
   u8 ps[max_para];
   char para[str_max_len];
   u8 fla=apart(exp,ps);//分离参数
   if (fla!=3)//参数有误
   {
      rb_error=15;
      str[0]='\0';
      return;
   }
   rb_get_str(exp,str);
   rb_get_str(exp+ps[1],para);
   fla=(u8)rb_cal(exp+ps[2]);
   str_insert(str,para,fla);
}
void rb_cat(char *exp,char *str)//CAT$
{
   u8 ps[max_para];
   char para[str_max_len];
   u8 fla=apart(exp,ps);//分离参数
   if (fla!=2)//参数有误
   {
      str[0]='\0';
      rb_error=15;
      return;
   }
   rb_get_str(exp,str);
   rb_get_str(exp+ps[1],para);
   str_cat(str,para);
}
void rb_cvstr(char *exp,char *str)//CVSTR$
{
   u8 ps[max_para];
   char para[str_max_len];
   u8 num;
   u8 fla=apart(exp,ps);//分离参数
   if (fla!=4)//参数有误
   {
      str[0]='\0';
      rb_error=15;
      return;
   }
   rb_get_str(str,exp);
   rb_get_str(exp+ps[1],para);
   fla=(u8)rb_cal(exp+ps[2]);
   num=(u8)rb_cal(exp+ps[3]);
   str_cv(str,para,fla,num);
}
void rb_noblank(char *exp,char *str)//NOBLANK$
{
   rb_get_str(exp,str);
   no_blank(str);
}
void rb_trop(char *exp,char *str)//TROP$
{
   rb_get_str(exp,str);
   del_blank(str);
}
void rb_strmv(char *exp,char *str)//STRMV$
{
   u8 temp[max_para];
   char para[str_max_len];
   u8 fla=apart(exp,temp);//分离参数
   u8 dre;
   if (fla!=3)//参数有误
   {
      str[0]='\0';
      rb_error=15;
      return;
   }
   rb_get_str(exp,str);
   dre=(u8)rb_cal(exp+temp[1]);
   fla=(u8)rb_cal(exp+temp[2]);
   str_mv(str,dre,fla);
}
char rb_get_key()
{
   CS_ReadKey();
   if (CS_IsKeyDown(KEY_A)) return 'A';
   if (CS_IsKeyDown(KEY_B)) return 'B';
   if (CS_IsKeyDown(KEY_L)) return 'Y';
   if (CS_IsKeyDown(KEY_R)) return 'N';
   if (CS_IsKeyDown(KEY_SELECT)) return 'C';
   if (CS_IsKeyDown(KEY_START)) return 'D';
   if (CS_IsKeyDown(KEY_LEFT)) return '1';
   if (CS_IsKeyDown(KEY_RIGHT)) return '2';
   if (CS_IsKeyDown(KEY_UP)) return '3';
   if (CS_IsKeyDown(KEY_DOWN)) return '4';
}
void rb_inkey(char *exp,char *str)//INKEY$
{
   char ch=0;
   u8 count=0;
   u8 mod=rb_cal(exp);
   while (ch==0 && count<20)
   {
      ch=rb_get_key();
      count+=mod;
   }
   str[0]=ch;
   str[1]='\0';
}
void get_str_fun(u8 id,char *exp,char *str)
{
   static void (* strfun[])(char *,char *)={
      rb_str,rb_left,rb_right,rb_mid,rb_chr,rb_string,rb_reverse,rb_lowstr,rb_upstr,
      rb_replace,rb_cover,rb_cvstr,rb_noblank,rb_trop,rb_strmv,rb_inkey,rb_cat,
      rb_insert};
   strfun[id](exp,str);
}
void rb_get_str(char *exp,char *str)
{
   char *strp;
   int ep=0,sp=0;
   char temp[str_max_len];
   str[0]='\0';
   while (exp[ep]==' ') ep++;
   switch (exp[ep])
   {
      case '\"'://是字符串常数
      ep++;
      while (exp[ep]!='\"' && exp[ep]!='\0')
      {
         str[sp]=exp[ep];
         ep++;
         sp++;
      }
      str[sp]='\0';
      if (exp[ep]!='\"') rb_error=6;
      break;
      case 'C'://是字符串变量
      str_copy(str,get_str_val(exp[ep+1]-bg_id));
      break;
      case 'c'://是字符串数组
      strp=get_str_val(exp[ep+1]-bg_id);
      if (get_pstr('[',']',exp+(ep+3),temp)==0) {rb_error=6;return;}
      str[0]=strp[(int)rb_cal(temp)];
      str[1]='\0';
      break;
      case 'S'://字符串处理函数
      if (get_pstr('(',')',exp+(ep+3),temp)==0) {rb_error=6;return;}
      get_str_fun(exp[ep+1]-bg_id,temp,str);
      break;
      default://错误
      rb_error=6;
      break;
   }
}

⌨️ 快捷键说明

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