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