📄 basic3.c
字号:
#include "os.h"
#include "ptype.h"
/***self Func declare***/
FAR void SaveInputData();
FAR void exec_GraphModeInput();
FAR void exec_if();
FAR void exec_else();
FAR void dim();
FAR void exec_for();
FAR void next();
FAR void exec_read();
FAR void exec_input();
FAR void InitialVariable();
FAR void FreeAllocMem();
FAR Int8 inkey();
FAR void exec_circle();
FAR void exec_ellipse();
FAR void exec_line();
FAR void exec_box();
FAR void exec_draw();
FAR void exec_goto();
FAR void adjust_poutbuf(char *ad_ptr);
/***basic1.c Func declare***/
FAR int atoi(char *x);
FAR void itoa(int i, char *result, char flag);
FAR double atof(char *x);
FAR int gcvt(double i, char flag, char *result);
FAR void exec_mid();
FAR void exec_right();
FAR void exec_left();
FAR void exec_fn();
FAR void exec_inkey();
FAR char get_result_type(char o, char *r, char *h);
FAR void add_type(char *result, int data_type);
FAR void get_exp(char *result);
FAR char *GetAllocBuf();
/***basic2.c Func declare***/
FAR void skip_white();
FAR bitnode *search_vartree(char *s);
FAR void doingassign(char *var, char *value);
FAR void IsArray();
FAR void assign_buf();
FAR char *get_type(char *s);
FAR char *find_label(char *s);
FAR void label_init();
FAR void get_next();
FAR char *gpop();
FAR void gpush(char *s);
FAR void fpush(for_stack_str *i);
FAR void fpop(for_stack_str *i);
FAR void find_eol();
FAR void wpop(while_stack_str *i);
FAR char *get_variables(char *s);
FAR void putback();
FAR char get_token(char tflag);
FAR void serror(Int8 error);
FAR void ckvar(char *s);
FAR char *get_token_last();
FAR int isalpha(char c);
FAR int isdigit(char c);
FAR char tolower(char c);
FAR int isdelim(char c);
FAR int iswhite(char c);
FAR char look_up(char *s);
FAR UInt8 IsInteger(char *value_ptr);
FAR UInt8 agree_v(char *var, char *value);
FAR void exec_put();
FAR void exec_gvbasicif();
extern jmp_buf e_buf;
UInt8 GVBasicIf_flag;
extern UInt8 *hDesktop;
extern bitnode *Variables;
extern pfnode *pf;
extern Int8 *pInBuf, *pOutBuf, *TmpOut, *TmpBuf;
extern Int8 pCurBuf;
extern UInt8 *hBasicWnd;
extern data_str *data_buf, *cur_buf;
extern for_stack_str fstack[FOR_NEST];
extern while_stack_str wstack[WHILE_WEND];
extern label_str *label_table;
extern fsnode *fl;
extern char *prog;
extern char *token;
extern char token_type, tok;
extern char notdoelse;
extern char *gstack[SUB_NEST];
extern int ftos,wtos,gtos;
extern char op_b[4];
extern UInt8 GTflag;
extern UInt8 nBasicRet;
extern Int8 InputFlag, InputError;
extern Tmp_List *TmpList;
extern Int8 sl_flag, *pBasicFileName;
extern UInt16 limit_pos;
/*
FAR int gcvt(double i, char flag, char *result)
{
double c, r;
int num, total;
char *temp_buf;
temp_buf = pBasicFileName + 14;
r = i;
if (r < 0) r = -r;
c = 1; num = 0;
while ( c<= r)
{
c *= 10;
num++;
}
if (num >= 16 && flag == 16) return 0;
if (num >= 15 && flag == 15) return 0;
Strcpy(temp_buf,"%.");
sprintf(temp_buf+2,_Far("%d"), (UInt16)flag - num - 1);
Strcat(temp_buf,"f");
sprintf(result,(FarPtr)temp_buf,i);
return 1;
}
*/
FAR void exec_if() /*执行IF语句*/
{
char *x, *saveprog, ifn, endifn, elsen, *pre_pos;
x = prog;
GVBasicIf_flag = 0;
for(;;)
{
if (*x==0x0d||*x==':'||*x==0) break;
if (*x=='e'||*x=='E')
{
if (Strstr(x-1," else ")==x-1||Strstr(x-1," ELSE ")==x-1)
{
GVBasicIf_flag = 1;
exec_gvbasicif();
return;
}
}
x++;
}
ifn = 1;
endifn = 0;
elsen = 0;
x = GetAllocBuf();
get_exp(x);
get_token(0);
if (tok!=THEN) serror(35); /***if语句出现语法错误***/
sl_flag = 1;
if (*x == BOOL_TYPE && *(x+1) == '1' || *x!=BOOL_TYPE && *(x+1) != '0' && *(x+1) != 0 )
{
saveprog = prog;
get_token(0);
if (tok==EOL)
{
notdoelse++;
for (;;)
{
while (tok!=ENDIF&&tok!=END&&tok!=IF&&tok!=ELSE&&tok!=REM) get_token(2);
switch (tok)
{
case REM : while (*prog!=0x0D&&*prog!=':') prog++;
break;
case ENDIF : endifn++; break;
case IF : do {
get_token(0);
}while(tok!=THEN&&tok!=FINISHED);
if (tok!=THEN) serror(35);
get_token(0);
if (tok==EOL) ifn++;
break;
case ELSE : elsen++;
default : break;
}
if (endifn==ifn)
{
if (elsen!=ifn) notdoelse--;
break;
}
if (tok==END&&endifn!=ifn) serror(35);
get_token(0);
}
}
prog = saveprog;
if (token_type == NUMBER) exec_goto();
}
else
{
get_token(0);
if (tok==EOL)
{
for(;;)
{
while (tok!=ENDIF&&tok!=END&&tok!=IF&&tok!=ELSE&&tok!=REM) get_token(2);
switch (tok)
{
case REM : while (*prog!=0x0D&&*prog!=':') prog++;
break;
case ENDIF : endifn++; break;
case IF : do {
get_token(0);
} while(tok!=THEN&&tok!=FINISHED);
if (tok!=THEN) serror(35);
get_token(0);
if (tok==EOL) ifn++;
break;
case ELSE : elsen++; break;
default : break;
}
if (endifn==ifn||elsen==ifn) break;
if (tok==END&&endifn!=ifn) serror(35);
get_token(0);
}
}
else
{
while (tok!=EOL&&tok!=FINISHED)
{
while (*prog==32) prog++;
if (*prog==':') prog++;
get_token(0);
}
}
}
sl_flag = 0;
}
FAR void exec_else()
{
char endifn, ifn, elsen;
if (GVBasicIf_flag)
{
while (*prog!=0x0d&&*prog!=0) prog++;
GVBasicIf_flag = 0;
return;
}
endifn=0;
ifn=0;
elsen=0;
if (notdoelse)
{
notdoelse--;
get_token(0);
if (tok==EOL)
{
while (1)
{
while (tok!=ENDIF&&tok!=END&&tok!=IF&&tok!=ELSE) get_token(2);
switch (tok)
{
case ENDIF : endifn++; break;
case IF : do {
get_token(0);
} while(tok!=THEN&&tok!=FINISHED);
if (tok!=THEN) serror(32);
get_token(0);
if (tok==EOL) ifn++;
break;
case ELSE : elsen++; break;
default : break;
}
if (endifn-ifn==1) break;
if (tok==END) serror(0);
get_token(0);
}
}
else
{
while (tok!=ENDIF) get_token(0);
}
}
}
FAR void dim()
{
char *l, *var, *ibuf, *value, tag, *saveprog, *expbuf, *savetoken, savetok, *var_tmp, *value_tmp;
int i, j, total;
bitnode *p;
p=(bitnode *)Null;
i=0;
for (;;)
{
*token = 0;
var = token;
while (*prog == 0x20 || *prog == 0x09) prog++;
if (*prog == 0x0D||*prog == ':') break;
if (*prog==',') prog++;
while (*prog == 0x20 || *prog == 0x09) prog++;
while (*prog!=')'&&*prog!=0x0D&&*prog!=':') *var++ = *prog++;
if (*prog!=')') serror(36); /***数组定义非法***/
*var++ = *prog++;
*var = 0;
l = token;
if ((l = Strchr(token,'(')) == (char *)Null) serror(36);
var_tmp = GetAllocBuf();
value_tmp = var_tmp + 25 ;
if (*(l-1)=='$') tag = STRING_TYPE;
else if (*(l-1)=='%') tag = INTEGER_TYPE;
else tag = VAR_TYPE;
j = l-token;
if (j > 118) serror(1);
Strncpy(var_tmp,token,j);
Strcat(var_tmp,"()");
if ((p=search_vartree(var_tmp))!=(bitnode*)Null) serror(37); /***数组名重复定义***/
ckvar(var_tmp); /***检查数组变量名是否合法***/
l++;
*value_tmp = ARRAY_INFO;
*(value_tmp + 1) = '(';
*(value_tmp + 2) = 0;
ibuf = GetAllocBuf();
expbuf = ibuf + 20;
savetoken = GetAllocBuf();
Strcpy(savetoken,token);
savetok = tok;
i = 0;
total = 1;
while (*l!=')'&&*l!=0x0D&&*l!=0)
*(expbuf + i++) = *l++;
*(expbuf+i) = 0;
saveprog = prog;
prog = expbuf;
while (*prog!=0)
{
get_exp(ibuf);
if (!IsInteger(ibuf)||Strchr(ibuf,'-')) serror(36);
Strcat(value_tmp,ibuf+1);
if (*prog==',')
{
i = 1;
while (*(prog + i++)==0x20);
if (*(prog + i - 1)==0) serror(36);
Strcat(value_tmp,",");
*prog++;
}
}
Strcat(value_tmp,")");
if ((var = (char *)MemAlloc(Strlen(var_tmp)+1))==(char*)Null) serror(1);
else {
Strcpy(var,var_tmp);
*(var+Strlen(var_tmp)) = 0;
}
if ((value = (char *)MemAlloc(Strlen(value_tmp)+1))==(char*)Null) {
MemFree(var);
serror(1);
} else {
Strcpy(value,value_tmp);
*(value+Strlen(value_tmp))=0;
}
doingassign(var,value);
Strcpy(token,savetoken);
prog=saveprog;
tok=savetok;
}
}
FAR void exec_for()
{
for_stack_str i;
char *value, *temp, *var_tmp;
double value1;
int value2;
bitnode *p;
p = (bitnode *)Null;
get_token(0);
if(!isalpha(*token)) serror(38);
for (value2 = 0; value2 < ftos; value2++)
{
if (!Stricmp(token,fstack[value2].var)) serror(38);
}
var_tmp = GetAllocBuf();
Strcpy(var_tmp, token);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -