📄 basic.c
字号:
#include "os.h"
#include "res.h"
#include "mask.h"
#include "ptype.h"
#include "project.h"
/***basic.c Func declare***/
UInt8 CreateListModeWindow();
UInt8 CreateNewModeWindow();
UInt8 CreateEditModeWindow();
UInt8 CreateBrowseModeWindow();
UInt8 CreateRunModeWindow();
UInt8 CreateSaveModeWindow();
UInt8 CreateRunInputModeWindow();
FAR void exec_GraphModeInput();
FAR void SaveInputData();
FAR void _PrjBeep(void);
FAR void _PrjBeepsStart(void);
FAR void _PrjBeepsEnd(void);
FAR void exec_print();
void _BasicExplain();
void BasicApInitialize(char *bAllBuf);
FAR UInt32 _BasicListModeHandleEvent(UInt8* handle, MEvent* pEvent);
FAR UInt32 _BasicNewModeHandleEvent(UInt8* handle, MEvent* pEvent);
FAR UInt32 _BasicEditModeHandleEvent(UInt8* handle, MEvent* pEvent);
FAR UInt32 _BasicBrowseModeHandleEvent(UInt8* handle, MEvent* pEvent);
FAR UInt32 _BasicRunModeHandleEvent(UInt8* handle, MEvent* pEvent);
FAR UInt32 _BasicSaveModeHandleEvent(UInt8* handle, MEvent* pEvent);
FAR UInt32 _BasicRunInputModeHandleEvent(UInt8* handle, MEvent* pEvent);
FAR void scan_labels();
FAR void InitialVariable();
FAR void FreeAllocMem();
FAR Int8 inkey();
FAR void exec_kbhit();
FAR void exec_getkey();
FAR UInt8 _BasicGetpInBuf();
FAR void _BasicFileDelete();
FAR UInt8 _BasicFileSave(FarPtr s);
FAR void serror(Int8 error);
FAR void exec_cls();
FAR char *GetAllocBuf();
FAR UInt8 agree_v(char *var, char *value);
FAR void assignment();
FAR void exec_goto();
/***basic3.c Func declare***/
FAR void exec_read();
FAR void exec_if();
FAR void exec_else();
FAR void dim();
FAR void exec_for();
FAR void next();
FAR void exec_input();
FAR void exec_circle();
FAR void exec_ellipse();
FAR void exec_box();
FAR void exec_line();
FAR void exec_draw();
/***basic1.c 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 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 void FreeOpMem();
/***basic2.c Func***/
FAR void exec_swap();
FAR void exec_def();
FAR void get_data();
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 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 void exec_open();
FAR void exec_close();
FAR void exec_put();
FAR void exec_get();
/***Basic4.c Function***/
FAR void adjust_poutbuf(char *ad_ptr);
FAR void BasicCreateFileListBox();
FAR void BasicFileFind();
FAR void CreateBasicFileSaveWindow(char flag);
FAR UInt8 IsInteger(char *value_ptr);
FAR void exec_rset();
FAR void exec_lset();
FAR void IsEndOfLine();
/***global variables declare***/
Int8 InputError,InputFlag;
jmp_buf e_buf;
extern UInt8 *hDesktop;
bitnode *Variables; /***存储变量二叉树的树根指针***/
pfnode *pf; /***存储自定义函数的指针***/
fsnode *fl; /***存储文件信息的指针***/
data_str *data_buf, *cur_buf;/***Data缓冲区指针***/
for_stack_str fstack[FOR_NEST];
while_stack_str wstack[WHILE_WEND];
label_str *label_table;
Do_List *dl; /*存储数学运算数值和运算符的指针*/
Tmp_List *TmpList; /*各函数中申请的临时变量*/
Int8 *prog; /*程序解释指针,指向程序目前待解释的位置*/
Int8 *token; /*取Basic程序词条缓冲区*/
Int8 *TmpBuf, *TmpOut, pCurBuf, *pBasicFileName;
Int8 token_type; /*取词类型*/
Int8 tok; /*取词标志*/
Int8 notdoelse; /*判定Else词句是否该执行的标记*/
Int8 *gstack[SUB_NEST]; /*go to 词句信息缓冲区*/
Int16 ftos; /*for 信息缓冲的标志*/
Int16 wtos; /*while 信息缓冲的标志*/
Int16 gtos; /*go 信息缓冲的标志*/
Int8 op_b[4]; /*运算符号缓冲*/
Int8 *pInBuf,*pOutBuf; /*输入buffer,输出buffer*/
UInt8 *hBasicWnd, *hMainEdit; /*主窗口*/
UInt8 *hListBox; /*文件列表控件*/
UInt8 GTflag; /*图形模式与文本模式切换标志,GTflag=1为图形模式,GTflag=0为文本模式*/
UInt8 nBasicRet, LastnBasieRet;
UInt8 current_mode, Lastcurrent_mode;
UInt8 ResetFlag, explain_over_flag; /*程序复位标志*/
Int16 CurLine; /*文件列表当前条数*/
Int16 FileCount;
UInt8 bPosX,bPosY;
UInt16 seed;
Int8 sl_flag,HomeKeyDownFlag; /***运行scan_label标志***/
double PreRndNum;
UInt16 limit_pos;
UInt16 cur_pos;
UInt16 keydown_buffer;
const FunctionButtons Function_Button_Browse[] = {
{IDS_AP_NEW, cmLL_new},
{IDS_AP_MOD, cmLL_mod},
{IDS_AP_DEL, cmLL_del},
{IDS_BASIC_RUN,cmJS_run},
{0, 0}};
const FunctionButtons Function_Button_New[] = {
{IDS_AP_SAVE, cmXZ_sav},
{IDS_AP_CUT, cmXZ_cut},
{IDS_AP_COPY, cmXZ_cop},
{IDS_AP_PASTE, cmXZ_pas},
{0, 0}};
/*
const UInt8 (*basic_p[])() = { _CreateListModeWindow, _CreateNewModeWindow, _CreateEditModeWindow, _CreateBrowseModeWindow,
_CreateRunModeWindow, _CreateSaveModeWindow, _CreateRunInputModeWindow};
*/
void exec_locate()
{
char *posX, *posY;
Int16 x1, y1;
posX = GetAllocBuf(); /**posX:纵坐标位置**/
posY = posX + 50; /**posY:横坐标位置**/
get_exp(posX);
if (*posX!=INTEGER_TYPE&&*posX!=REAL_TYPE) serror(14);
while ( *prog == 0x20 || *prog == 0x09 ) prog++;
if (*prog++!=',') serror(14); /***Locate语句出现语法错误***/
get_exp(posY);
if (*posY!=INTEGER_TYPE&&*posY!=REAL_TYPE) serror(14);
x1 = atoi(posX+1); /**x1:纵坐标位置**/
y1 = atoi(posY+1); /**y1:横坐标位置**/
if (y1>20||x1>5||y1<1||x1<1) serror(14);
else
{
bPosY = (UInt8)(x1-1)*16;
bPosX = (UInt8)(y1-1)*8;
}
IsEndOfLine();
}
/*Ap Basic Entry*/
FAR UInt32 _BasicMain(MEvent* pMsg)
{
UInt8 nCWRet;
UInt16 nMsgRet;
UInt32 nRet;
char *bAllBuf;
nRet = 0;
if ((bAllBuf = (char*)MemAlloc(BUFFERPROGRAM + 3000))==(char *)Null)
{
GuiMsgBox(hDesktop, ofStyle4|ofResource, IDS_SYS_NEICUNFULL,IDS_MAIN_BASIC, MT_OK_X);
return nRet;
}
else
BasicApInitialize(bAllBuf);
while (current_mode<=RUNINPUTMODE && current_mode>=LISTMODE)
{
if (current_mode == LISTMODE && HomeKeyDownFlag)
{
nRet = 0;
break;
}
switch (current_mode)
{
case LISTMODE :
nCWRet = CreateListModeWindow();
break;
case NEWMODE :
nCWRet = CreateNewModeWindow();
break;
case EDITMODE :
nCWRet = CreateEditModeWindow();
break;
case BROWSEMODE :
nCWRet = CreateBrowseModeWindow();
break;
case RUNMODE :
nCWRet = CreateRunModeWindow();
break;
case SAVEMODE :
nCWRet = CreateSaveModeWindow();
break;
case RUNINPUTMODE :
nCWRet = CreateRunInputModeWindow();
break;
default:
break;
}
if (current_mode == LISTMODE && !nCWRet)
{
nMsgRet = GuiMsgBox(hDesktop,ofStyle4,_Far("没有记录,要新增吗?"),_Far("Basic编程"),MT_YESNO);
if (nMsgRet == cmMsgBoxYes)
{
Lastcurrent_mode = LISTMODE;
current_mode = NEWMODE;
nCWRet = CreateNewModeWindow();
}
else
{
MemFree(bAllBuf);
return nRet;
}
}
nRet = ApRun(hBasicWnd);
current_mode = (UInt8)nRet;
GuiWindowDestroy(hBasicWnd);
}
MemFree(bAllBuf);
return nRet;
}
UInt8 CreateListModeWindow()
{
BasicFileFind();
if (FileCount > -1)
BasicCreateFileListBox();
else
return 0;
AssignFuncPtr((UInt8*)(&((MWindow*)hBasicWnd)->handleEvent), _Far(_BasicListModeHandleEvent));
return 1;
}
FAR UInt32 _BasicListModeHandleEvent(UInt8* handle, MEvent* pEvent)
{
UInt16 nMsgRet, temp;
UInt8 ret_v;
ListItem *item;
if ( pEvent->type == evKeyDown && (pEvent->x == cmVkUp || pEvent->x == cmVkPageUp || pEvent->x == cmVkPageDown || pEvent->x == cmVkDown || pEvent->x == cmVkEnter))
GuiSetState(hListBox, sfFocused);
switch(pEvent->type)
{
case evCommand :
switch (pEvent->x)
{
case cmListPassData:
item = (ListItem *)MAKEPOINTER(pEvent->infoPtr);
item->pData = pInBuf + (item->lineNum*(UInt16)10);
item->FieldLen[0] = 8;
return ListDataReady;
case cmDraw:
GuiSoftKBSetCurrent(IMNone,False);
break;
default:
break;
}
break;
case evKeyDown :
switch (pEvent->x)
{
case cmVkEnter:
case cmVkF4: /*运行程序*/
CurLine = GuiListGetCurrentLine((UInt8*)hListBox);
ret_v = _BasicGetpInBuf();
if (ret_v == 0)
{
GuiMsgBox(handle,ofStyle4,_Far("文件太大,请小于4K!"),_Far("Basic编程"),MT_NONE);
return 0;
}else if (ret_v==2)
{
GuiMsgBox(handle,ofStyle4,_Far("文件读取出错!"),_Far("Basic编程"),MT_NONE);
return 0;
}else if (ret_v==3)
{
GuiMsgBox(handle,ofStyle4,_Far("文件打开失败!"),_Far("Basic编程"),MT_NONE);
return 0;
}
InitialVariable();
Lastcurrent_mode = current_mode;
ApExit(RUNMODE);
return 0;
case cmVkF1 : /***新增文件***/
Lastcurrent_mode=current_mode;
ApExit(NEWMODE);
return 0;
case cmVkF2 : /***浏览文件***/
CurLine = GuiListGetCurrentLine((UInt8*)hListBox);
ret_v = _BasicGetpInBuf();
if (ret_v==0)
{
GuiMsgBox(handle,ofStyle4,_Far("文件太大,请小于4K!"),_Far("Basic编程"),MT_NONE);
return 0;
}else if (ret_v==2)
{
GuiMsgBox(handle,ofStyle4,_Far("文件读取出错!"),_Far("Basic编程"),MT_NONE);
return 0;
}else if (ret_v==3)
{
GuiMsgBox(handle,ofStyle4,_Far("文件打开失败!"),_Far("Basic编程"),MT_NONE);
return 0;
}
Lastcurrent_mode=current_mode;
ApExit(BROWSEMODE);
return 0;
case cmVkF3 : /***删除文件***/
CurLine = GuiListGetCurrentLine((UInt8*)hListBox);
nMsgRet=GuiMsgBox(handle,ofStyle4|ofResource,IDS_MSGBOX_DELETEASK,IDS_MAIN_BASIC,MT_YESNO);
if (nMsgRet==cmMsgBoxYes)
{
_BasicFileDelete();
if (--FileCount<0) ApExit(pEvent->infoPtr);
else ApExit(LISTMODE);
return 0;
}
break;
default :
if (pEvent->x >= 'a' && pEvent->x <= 'z'
||pEvent->x >= 'A' && pEvent->x <= 'Z'
||pEvent->x >= '0' && pEvent->x <= '9')
{
temp = 0;
while (tolower(*(pInBuf + temp * 10)) != tolower(pEvent->x) && temp <= FileCount)
temp++;
if (temp<=FileCount)
{
CurLine = temp;
GuiListSetCurrentLine(hListBox,CurLine);
}
}
break;
}
break;
case evQuit :
ApExit(pEvent->infoPtr);
break;
}
if(pEvent->type != evNothing) GuiWindowHandleEvent(handle, pEvent);
return 0;
}
UInt8 CreateNewModeWindow()
{
UInt16 edit_style;
MEditParam pEditParam;
UInt32 func;
UInt8 *hEditWnd;
MEvent ev;
edit_style = EDS_ENABLE|EDS_EDITOR|EDS_VISIBLE;
pEditParam.dwHandle = NullID;
pEditParam.dwCaption = NullID;
pEditParam.wAllowChar = EDITALLOW_ALL;
pEditParam.wMaxEditLen = BUFFERPROGRAM;
pEditParam.wFirstChar = EDITALLOW_ASCII;
HomeKeyDownFlag = 0;
if (Lastcurrent_mode != NEWMODE) *pInBuf = 0;
func = _Far(Function_Button_New);
hBasicWnd = GuiScrnEditCreate((UInt8*)0,0,_Far("Basic编程"),IDH_EDITOR_01, func, False, edit_style, (UInt8 *)pInBuf, BUFFERPROGRAM, 1, &pEditParam);
hEditWnd = GuiScrnEditGetEdit(hBasicWnd);
GuiSetState(hEditWnd,sfFocused);
if (Lastcurrent_mode != NEWMODE)
{
ev.type = evKeyDown;
ev.x = 0x5D;
ev.y = 0;
ev.infoPtr = 0;
MsgPost(&ev);
}
AssignFuncPtr((UInt8*)(&((MWindow*)hBasicWnd)->handleEvent), _Far(_BasicNewModeHandleEvent));
return 1;
}
FAR UInt32 _BasicNewModeHandleEvent(UInt8* handle, MEvent* pEvent)
{
MEvent ev;
UInt16 nMsgRet;
UInt8 *hEditWnd;
ev.type = evKeyDown;
ev.x = 0x5D;
ev.y = 0;
ev.infoPtr = 0;
switch (pEvent->type)
{
case evCommand:
switch (pEvent->x)
{
case cmEditorBufferFull :
case cmEditorHaveMaxLen :
GuiMsgBox(handle,ofStyle4,_Far("编辑区已满,不能再编辑了!"),_Far("Basic编程"),MT_NONE);
return 0;
}
break;
case evKeyDown:
switch (pEvent->x)
{
case cmVkF1 : /****存储文件****/
if (Strlen(pInBuf)==0||Strlen(pInBuf)==1&&*pInBuf==']')
GuiMsgBox(handle,ofStyle4,_Far("请输入内容!"),_Far("Basic编程"),MT_NONE);
else
{
Lastcurrent_mode = current_mode;
ApExit(SAVEMODE);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -