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