📄 basic1.c
字号:
#include "os.h"
#include "ptype.h"
/***basic func***/
FAR char *GetAllocBuf();
FAR void serror(Int8 error);
/***basic1 func***/
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 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);
/***basic4 func***/
FAR void exec_mid();
FAR void exec_right();
FAR void exec_left();
FAR void exec_fn();
FAR void exec_eof(char *v, char *result);
FAR UInt8 IsInteger(char *value_ptr);
/***basic2 func***/
FAR char *get_variables(char *s);
FAR void putback();
FAR char get_token(char tflag);
FAR int isalpha(char c);
FAR int isdigit(char c);
FAR char tolower(char c);
FAR char get_priority(char *s);
FAR Boolean GetValidNumber(char *p, int n);
extern Do_List *dl;
extern char *prog;
extern char *token, *pBasicFileName;;
extern char token_type, tok;
extern char op_b[4];
char *cod_trace;
extern double PreRndNum;
extern UInt16 seed;
FAR int atoi(char *x)
{
int i, j, b, sign;
char *len;
/* sscanf(x,_Far("%d"),&i);
return i;
*/
GetValidNumber(x, 16);
if (*x=='-' )
{
sign = -1;
x++;
} else
sign = 1;
if (len = Strchr(x,'.')) *len = 0;
i = 0;
b = 1;
for ( j = Strlen(x); j > 0 ; j--)
{
i += b * ( *(x + j -1) - 0x30);
b *= 10;
}
return i*sign ;
}
FAR double atof(char *x)
{
double i,sign, b;
int k, j;
char *p;
/*
sscanf(x,_Far("%f"),&i);
return i;*/
GetValidNumber(x, 16);
b = 1;
j = 0;
sign = 1;
if (*x=='-') {
sign = 0;
x++;
}
p = x;
while ( *p != '.' && *p != 0 ) {
p++;
j++;
}
for (k=1; k<j; k++)
b *= 10;
p = x;
i = 0;
while (*p!=0) {
if (*p!='.') {
i += (*p - 0x30) * b;
b /= 10;
}
p++;
}
if (i==0) return (double)0;
else if (sign) return i;
else return -i;
}
FAR void itoa(int i, char *result, char flag)
{
sprintf(result,_Far("%d"), i);
}
FAR char get_result_type(char o, char *r, char *h)
{
if (o<OP_BIG)
{
if (o!=OP_ADD&&(*r==STRING_TYPE||*h==STRING_TYPE))
{
MemFree(r);
MemFree(h);
serror(22);
}
if (*r==*h) return *r;
if (*r-*h>1||*h-*r>1)
{
MemFree(r);
MemFree(h);
serror(22); /***运算过程中,操作数的类型发生错误***/
}
return REAL_TYPE;
}
else
{
if (o>OP_UNE&&(*r==STRING_TYPE||*h==STRING_TYPE))
{
MemFree(r);
MemFree(h);
serror(22); /***运算过程中,操作数的类型发生错误***/
}
if (o>OP_POW&&o<OP_AND&&(*r-*h>1||*h-*r>1||*r==BOOL_TYPE||*h==BOOL_TYPE))
{
MemFree(r);
MemFree(h);
serror(22); /***运算过程中,操作数的类型发生错误***/
}
return BOOL_TYPE;
}
}
FAR void add_type(char *result, int data_type)
{
int i;
i = Strlen(result);
*(result + i + 1) = 0;
for (; i > 0; i--)
*(result + i) = *(result + i - 1);
*result = data_type;
}
void arith(char o, char *r, char *h, char *result)
{
int t, ex, i1, result_type;
double r1, rex;
result_type = get_result_type(o, r, h);
switch (result_type)
{
case INTEGER_TYPE:
switch(o)
{
case OP_SUB : i1 = atoi(r+1) - atoi(h+1);
itoa(i1,result + 1,10);
*result = result_type;
break;
case OP_ADD : i1 = atoi(r+1) + atoi(h+1);
itoa( i1,result+1,10);
*result = result_type;
break;
case OP_MUL : i1 = atoi(r+1) * atoi(h+1);
itoa(i1,result+1,10);
*result = result_type;
break;
case OP_DIV : if (atof(h+1)==0)
{
MemFree(r);
MemFree(h);
serror(23); /***运算出错,出现除数为零***/
}
r1 = atof(r+1)/atof(h+1);
if (!gcvt(r1,16,result+1))
{
MemFree(r);MemFree(h);
serror(1);
}
*result = REAL_TYPE;
break;
case OP_POW : if (*(h+1)=='0') { Strcpy(result,"11"); break; }
if ((t=atoi(h+1))>0)
{
i1 = atoi(r+1);
ex = i1;
for (--t;t>0;--t) i1 *= ex;
itoa(i1,result+1,10);
*result = result_type;
}
else
{
r1 = 1/atof(r+1);
rex = r1;
while (++t) r1 *= rex;
if(!gcvt(r1,16,result+1))
{
MemFree(r); MemFree(h);
serror(1);
}
*result = REAL_TYPE;
}
break;
}
break;
case REAL_TYPE:
switch(o) {
case OP_SUB : r1 = atof(r+1) - atof(h+1);
if(!gcvt(r1,16,result+1))
{
MemFree(r); MemFree(h);
serror(1);
}
*result = result_type;
break;
case OP_ADD : r1 = atof(r+1) + atof(h+1);
if (!gcvt(r1,16,result+1))
{
MemFree(r); MemFree(h);
serror(1);
}
*result = result_type;
break;
case OP_MUL : r1 = atof(r+1) * atof(h+1);
if(!gcvt(r1,16,result+1))
{
MemFree(r); MemFree(h);
serror(1);
}
*result = result_type;
break;
case OP_DIV : if (atof(h+1)==0)
{
MemFree(r);
MemFree(h);
serror(23); /***运算出错,出现除数为零***/
}
r1 = atof(r+1)/atof(h+1);
if (!gcvt(r1,16,result+1))
{
MemFree(r); MemFree(h);
serror(1);
}
*result = result_type;
break;
case OP_POW :
if (atof(r+1)==0&&atof(h+1)<0)
{
MemFree(r);
MemFree(h);
serror(28);
}
r1 = xthy(atof(r+1),atof(h+1));
if (r1 == 1E17 || !gcvt(r1,16,result+1))
{
MemFree(r); MemFree(h);
serror(1);
}
*result = result_type;
break;
}
break;
case BOOL_TYPE :
switch (o)
{
case OP_BIG : if (*r==STRING_TYPE&&Strcmp(r+1,h+1)>0)
Strcpy(result,"91");
else if (atof(r+1)>atof(h+1))
Strcpy(result,"91");
else
Strcpy(result,"90");
break;
case OP_SMA : if (*r==STRING_TYPE&&Strcmp(r+1,h+1)<0)
Strcpy(result,"91");
else if (atof(r+1)<atof(h+1))
Strcpy(result,"91");
else
Strcpy(result,"90");
break;
case OP_BaE : if (*r==STRING_TYPE&&Strcmp(r+1,h+1)>=0)
Strcpy(result,"91");
else if (atof(r+1)>=atof(h+1))
Strcpy(result,"91");
else
Strcpy(result,"90");
break;
case OP_SaE : if (*r==STRING_TYPE&&Strcmp(r+1,h+1)<=0)
Strcpy(result,"91");
else if (atof(r+1)<=atof(h+1))
Strcpy(result,"91");
else
Strcpy(result,"90");
break;
case OP_UNE : if (*r==STRING_TYPE)
{
if (Strcmp(r+1,h+1)!=0)
Strcpy(result,"91");
else
Strcpy(result,"90");
}
else if (atof(r+1)!=atof(h+1))
Strcpy(result,"91");
else
Strcpy(result,"90");
break;
case OP_EQU : if (*r==STRING_TYPE)
{
if (!Strcmp(r+1,h+1))
Strcpy(result,"91");
else
Strcpy(result,"90");
}
else if (atof(r+1)==atof(h+1))
Strcpy(result,"91");
else
Strcpy(result,"90");
break;
case OP_AND : if (*r==BOOL_TYPE)
{
if (*(r+1)=='1') *r=1;
else *r=0;
}
else
{
if (atof(r+1)!=0) *r=1;
else *r=0;
}
if (*h==BOOL_TYPE)
{
if (*(h+1)=='1') *h=1;
else *h=0;
}
else
{
if (atof(h+1)!=0) *h=1;
else *h=0;
}
if (*r&&*h) Strcpy(result,"91");
else Strcpy(result,"90");
break;
case OP_OR : if (*r==BOOL_TYPE)
{
if (*(r+1)=='1') *r=1;
else *r=0;
}
else
{
if (atof(r+1)!=0) *r=1;
else *r=0;
}
if (*h==BOOL_TYPE)
{
if (*(h+1)=='1') *h=1;
else *h=0;
}
else
{
if (atof(h+1)!=0) *h=1;
else *h=0;
}
if (*r||*h) Strcpy(result,"91");
else Strcpy(result,"90");
break;
}
break;
default :
switch (o)
{
case OP_ADD :
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -