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

📄 str_pro.c

📁 可以在嵌入式应用中
💻 C
字号:
//字符函数处理//
#include <CsAgb.h>
#include <variable.h>
#include <rb_stdio.h>
#include <cal.h>
#include <rb_string.h>
#include <rbasic.h>
#include <string.h>
extern void rb_inkey(char *name,u8 mod);//INKEY$
void get_str(char *str,char *exp);
void str_fun(char *str,u8 id,char *para);

void rb_inkey_p(char *str,char *exp)
{
   double mod=rb_cal(exp);
   if (rb_error) return;
   mod=mod?1:0;
   rb_inkey(str,mod);
}
u8 get_para(char *str,char *para,u8 num)//分离参数
{
   u16 i=0;
   u8 fla=0;
   u8 flag=0;
   u8 j=0;
   u8 loc=0;
   u8 istr=0;
   while (para[loc]!='\0' && j<num)
   {
      if (para[loc]==',' && fla==0 && flag==0 && istr==0)//参数结束
      {
         str[i]=loc+1;
         para[loc]='\0';
         loc++;
         j++;
         i++;
      }
      if (para[loc]=='\"') istr=!istr;
      if (para[loc]=='(' && istr==0) fla++;
      if (para[loc]=='[' && istr==0) flag++;
      if (para[loc]==')' && istr==0) fla--;
      if (para[loc]==']' && istr==0) flag--;
      loc++;
   }
   str[i]='\0';
   if (j<num-1)
   {
      rb_error=14;
      return 1;
   }//缺少参数
   else if (j>num-1)
   {
      rb_error=6;
      return 2;
   }//多余数
   return 0;//OK
}
   
void rb_num_str(char *str,char *exp)//STR$数字转字符
{
   num_to_str(rb_cal(exp),str);
}

void rb_left(char *str,char *exp)//LEFT$取左子串
{
   char temp[2];
   char para[str_max_len];
   u8 fla=get_para(temp,exp,2);//分离参数
   if (fla)//参数有误
   {
      str[0]='\0';
      return;
   }
   get_str(para,exp);
   str_left(str,para,rb_cal(exp+temp[0]));
}

void rb_right(char *str,char *exp)//RIGHT$取右子串
{
   char temp[2];
   char para[str_max_len]="abc,efg";
   u8 fla=get_para(temp,exp,2);//分离参数
   if (fla)//参数有误
   {
      str[0]='\0';
      return;
   }
   get_str(para,exp);
   str_right(str,para,rb_cal(exp+temp[0]));
}

void rb_mid(char *str,char *exp)//MID$
{
   char temp[3];
   char para[str_max_len];
   u8 fla=get_para(temp,exp,3);//分离参数
   if (fla)//参数有误
   {
      str[0]='\0';
      return;
   }
   get_str(para,exp);
   str_sub(str,para,rb_cal(exp+temp[0]),rb_cal(exp+temp[1]));
}

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

void rb_strings(char *str,char *exp)//STRING$
{
   u8 len;
   u8 i;
   int steps;
   char temp[2];
   char para[str_max_len];
   u8 fla=get_para(temp,exp,2);//分离参数
   if (fla)//参数有误
   {
      str[0]='\0';
      return;
   }
   get_str(para,exp);
   len=str_len(para);
   str[0]='\0';
   if (len==0) return;
   steps=rb_cal(exp+temp[0]);
   for (i=0;i<steps;i++)
   {
      if (i*len>=str_max_len-1) return;
      str_cat(str,para);
   }
}
void rb_reverse(char *str,char *exp)//REVERSE$
{
   get_str(str,exp);
   str_reverse(str);
}
   
void rb_lowstr(char *str,char *exp)//LOWSTR$
{
   get_str(str,exp);
   str_low(str);
}
void rb_upstr(char *str,char *exp)//UPSTR$
{
   get_str(str,exp);
   str_up(str);
}
void rb_replace(char *str,char *exp)//REPLACE$
{
   char temp[3];
   char para[2][str_max_len];
   u8 fla=get_para(temp,exp,3);//分离参数
   if (fla)//参数有误
   {
      str[0]='\0';
      return;
   }
   get_str(str,exp);
   get_str(para[0],exp+temp[0]);
   get_str(para[1],exp+temp[1]);
   str_replace(str,para[0],para[1]);
}
void rb_cover(char *str,char *exp)//COVER$
{
   char temp[3];
   char para[str_max_len];
   u8 fla=get_para(temp,exp,3);//分离参数
   if (fla)//参数有误
   {
      str[0]='\0';
      return;
   }
   get_str(str,exp);
   get_str(para,exp+temp[0]);
   fla=(u8)rb_cal(exp+temp[1]);
   str_cover(str,para,fla);
}

void rb_cvstr(char *str,char *exp)//CVSTR$
{
   char temp[4];
   char para[str_max_len];
   u8 num;
   u8 fla=get_para(temp,exp,4);//分离参数
   if (fla)//参数有误
   {
      str[0]='\0';
      return;
   }
   get_str(str,exp);
   get_str(para,exp+temp[0]);
   fla=(u8)rb_cal(exp+temp[1]);
   num=(u8)rb_cal(exp+temp[2]);
   str_cv(str,para,fla,num);
}
void rb_noblank(char *str,char *exp)//NOBLANK$
{
   get_str(str,exp);
   no_blank(str);
}
void rb_trop(char *str,char *exp)//TROP$
{
   get_str(str,exp);
   del_blank(str);
}
void rb_strmv(char *str,char *exp)//STRMV$
{
   char temp[3];
   char para[str_max_len];
   u8 fla=get_para(temp,exp,3);//分离参数
   u8 dre;
   if (fla)//参数有误
   {
      str[0]='\0';
      return;
   }
   get_str(str,exp);
   dre=(u8)rb_cal(exp+temp[0]);
   fla=(u8)rb_cal(exp+temp[1]);
   str_mv(str,dre,fla);
}
void str_fun(char *str,u8 id,char *para)
{
   static void (* strfun[])()={
      rb_num_str,rb_left,rb_right,rb_mid,rb_chr,rb_strings,rb_reverse,
      rb_lowstr,rb_upstr,rb_replace,rb_cover,rb_cvstr,rb_noblank,
      rb_trop,rb_strmv,rb_inkey_p};//函数入口指针
   strfun[id-1](str,para);
}
void get_str(char *str,char *exp)//字符串函数处理
{
   u8 i;
   u8 j;
   u8 len;
   char *strp;
   char fun[str_max_len];
   str[0]='\0';
   exp_adj(exp);
   len=str_len(exp);
   if (len<2)//空串
   {
      rb_error=6;
      return;
   }
   if (exp[0]=='\"')//是字符串常量
   {
      i=1;
      j=0;
      while (exp[i]!='\"' && exp[i]!='\0')//读取字符串
      {
         str[j]=exp[i];
         i++;
         j++;
      }
      str[j]='\0';
      if (exp[i]!='\"') rb_error=6;//语法错误
      return;
   }
   if (exp[len-1]==')')//是函数
   {
      i=0;
      while(exp[i]!='(' && exp[i]!='\0')//获得函数名称
      {
         fun[i]=exp[i];
         exp[i]=32;//清空
         i++;
      }
      if (exp[i]!='(' || i==0)//语法错误
      {
         rb_error=6;
         return;
      }
      exp[i]=' ';
      exp[len-1]=' ';
      fun[i]='\0';
      str_up(fun);//大写
      j=is_keyword(rb_str_key,fun);//获得字符串处理函数编号
      if (j==0) {rb_error=6;return;}//相应的字符串处理函数找不到
      exp_adj(exp);
      str_fun(str,j,exp);
      return;
   }
   if (exp[len-1]=='$')//是变量
   {
      exp[len-1]='\0';
      /*if (check_var_name(exp))
      {
         rb_error=6;
         return;
      }//非法变量名*/
      strp=rb_get_str(exp);//获得字符串指针
      if (strp==NULL) return;
      i=0;
      while(strp[i]!='\0')//复制字符串
      {
         str[i]=strp[i];
         i++;
      }
      str[i]='\0';
      return;
   }
   if (exp[len-1]==']')//是数组
   {
      i=0;
      while (exp[i]!='[' && exp[i]!='\0')
      {
         fun[i]=exp[i];
         exp[i]=' ';
         i++;
      }
      if (exp[i]!='[' || i==0)//语法错误
      {
         rb_error=6;
         return;
      }
      exp[i]=' ';
      exp[len-1]=' ';
      if (fun[i-1]!='$')//错误参数
      {
         rb_error=12;
         return;
      }
      fun[i-1]='\0';
      /*if (check_var_name(fun))//非法的变量名
      {
         rb_error=6;
         return;
      }*/
      exp_adj(exp);
      len=(u8)rb_cal(exp);
      strp=rb_get_str(fun);
      if (strp==NULL) return;
      str[0]=strp[len?len-1:0];
      str[1]='\0';
      return;
   }
   rb_error=6;//其它情况视为语法错误
}

⌨️ 快捷键说明

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