📄 str_pro.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 + -