//Default handler if no proper handler is located. VOID DefaultHandler(LPSTR pstr) { CD_ChangeLine(); CD_PrintString(ERROR_STR,FALSE); return; }
//打印字符串,cl表示是否换行 VOID CD_PrintString(LPSTR pStr,BOOL cl) { #ifdef __I386__ VGA_PrintString(pStr,FALSE); if(cl) { CD_GotoHome(); CD_ChangeLine(); } #endif #ifdef __CFG_SYS_CONSOLE Console.PrintStr(pStr); if(cl == TRUE) { CD_ChangeLine(); } #endif }
//Print out command prompt. static VOID PrintPrompt() { WORD CursorX = 0; WORD CursorY = 0; CD_GetCursorPos(&CursorX,&CursorY); if(CursorX != 0) { CD_ChangeLine(); CD_GetCursorPos(&CursorX,&CursorY); } CD_PrintString(s_szPrompt,FALSE); CursorX = strlen(s_szPrompt); CD_SetCursorPos(CursorX,CursorY); }
void ChangeLine() { CD_ChangeLine(); }
//Command analyzing routine,it analyzes user's input and search //command array to find a proper handler,then call it. //Default handler will be called if no proper command handler is //located. static BOOL DoCommand() { __KERNEL_THREAD_OBJECT* hKernelThread = NULL; BOOL bResult = FALSE; //If find the correct command object,then static CHAR szCmdBuffer[CMD_MAX_LEN] = {0}; DWORD dwIndex = 0; //Used for 'for' loop. WORD CursorX = 0; WORD CursorY = 0; //µÃµ½ÃüÁîÊäÈë´® CD_GetCursorPos(&CursorX,&CursorY); memset(szCmdBuffer,0,sizeof(szCmdBuffer)); CD_GetString(SHELL_INPUT_START_X,CursorY,szCmdBuffer,sizeof(szCmdBuffer)); strtrim(szCmdBuffer,TRIM_LEFT|TRIM_RIGHT); if(strlen(szCmdBuffer) <= 0) { return FALSE; } dwIndex = 0; while(CmdObj[dwIndex].CmdStr) { if(strcmp(szCmdBuffer,CmdObj[dwIndex].CmdStr) == 0) { CD_ChangeLine(); CmdObj[dwIndex].CmdHandler(szCmdBuffer); //Call the command handler. bResult = TRUE; //Set the flag. break; } dwIndex ++; } if(bResult) { goto __END; } dwIndex = 0; //Now,should search external command array. while(ExtCmdArray[dwIndex].lpszCmdName) { if(strcmp(szCmdBuffer,ExtCmdArray[dwIndex].lpszCmdName) == 0) //Found. { CD_ChangeLine(); hKernelThread = KernelThreadManager.CreateKernelThread( (__COMMON_OBJECT*)&KernelThreadManager, 0, KERNEL_THREAD_STATUS_READY, PRIORITY_LEVEL_NORMAL, ExtCmdArray[dwIndex].ExtCmdHandler, (LPVOID)szCmdBuffer, //? NULL, NULL); if(!ExtCmdArray[dwIndex].bBackground) //Should wait. { DeviceInputManager.SetFocusThread((__COMMON_OBJECT*)&DeviceInputManager, (__COMMON_OBJECT*)hKernelThread); //Give the current input focus to this thread. hKernelThread->WaitForThisObject((__COMMON_OBJECT*)hKernelThread); KernelThreadManager.DestroyKernelThread( (__COMMON_OBJECT*)&KernelThreadManager, (__COMMON_OBJECT*)hKernelThread); //Destroy it. //Set focus thread to shell. DeviceInputManager.SetFocusThread((__COMMON_OBJECT*)&DeviceInputManager,NULL); } bResult = TRUE; goto __END; } dwIndex ++; } if(!bResult) { DefaultHandler(NULL); //Call the default command handler. } __END: His_SaveCmd(s_hHiscmdInoObj,szCmdBuffer); //SaveCmdStr(szCmdBuffer); return bResult; }