/** * 셸의 메인 루프 */ void kStartConsoleShell( void ) { char vcCommandBuffer[ CONSOLESHELL_MAXCOMMANDBUFFERCOUNT ]; int iCommandBufferIndex = 0; BYTE bKey; int iCursorX, iCursorY; // 프롬프트 출력 kPrintf( CONSOLESHELL_PROMPTMESSAGE ); while( 1 ) { // 키가 수신될 때까지 대기 bKey = kGetCh(); // Backspace 키 처리 if( bKey == KEY_BACKSPACE ) { if( iCommandBufferIndex > 0 ) { // 현재 커서 위치를 얻어서 한 문자 앞으로 이동한 다음 공백을 출력하고 // 커맨드 버퍼에서 마지막 문자 삭제 kGetCursor( &iCursorX, &iCursorY ); kPrintStringXY( iCursorX - 1, iCursorY, " " ); kSetCursor( iCursorX - 1, iCursorY ); iCommandBufferIndex--; } } // 엔터 키 처리 else if( bKey == KEY_ENTER ) { kPrintf( "\n" ); if( iCommandBufferIndex > 0 ) { // 커맨드 버퍼에 있는 명령을 실행 vcCommandBuffer[ iCommandBufferIndex ] = '\0'; kExecuteCommand( vcCommandBuffer ); } // 프롬프트 출력 및 커맨드 버퍼 초기화 kPrintf( "%s", CONSOLESHELL_PROMPTMESSAGE ); kMemSet( vcCommandBuffer, '\0', CONSOLESHELL_MAXCOMMANDBUFFERCOUNT ); iCommandBufferIndex = 0; } // 시프트 키, CAPS Lock, NUM Lock, Scroll Lock은 무시 else if( ( bKey == KEY_LSHIFT ) || ( bKey == KEY_RSHIFT ) || ( bKey == KEY_CAPSLOCK ) || ( bKey == KEY_NUMLOCK ) || ( bKey == KEY_SCROLLLOCK ) ) { ; } else { // TAB은 공백으로 전환 if( bKey == KEY_TAB ) { bKey = ' '; } // 버퍼에 공간이 남아있을 때만 가능 if( iCommandBufferIndex < CONSOLESHELL_MAXCOMMANDBUFFERCOUNT ) { vcCommandBuffer[ iCommandBufferIndex++ ] = bKey; kPrintf( "%c", bKey ); } } } }
/** * 셸의 메인 루프 */ void kStartConsoleShell( void ) { char vcCommandBuffer[ CONSOLESHELL_MAXCOMMANDBUFFERCOUNT ]; int iCommandBufferIndex = 0; BYTE bKey; int iCursorX, iCursorY; CONSOLEMANAGER* pstConsoleManager; // 콘솔을 관리하는 자료구조를 반환 pstConsoleManager = kGetConsoleManager(); // 프롬프트 출력 kPrintf( CONSOLESHELL_PROMPTMESSAGE ); // 콘솔 셸 종료 플래그가 TRUE가 될 때까지 반복 while( pstConsoleManager->bExit == FALSE ) { bKey = kGetCh(); // 콘솔 셸 종료 플래그가 설정된 경우 루프를 종료 if( pstConsoleManager->bExit == TRUE ) { break; } if( bKey == KEY_BACKSPACE ) { if( iCommandBufferIndex > 0 ) { // 현재 커서 위치를 얻어서 한 문자 앞으로 이동한 다음 공백을 출력하고 // 커맨드 버퍼에서 마지막 문자 삭제 kGetCursor( &iCursorX, &iCursorY ); kPrintStringXY( iCursorX - 1, iCursorY, " " ); kSetCursor( iCursorX - 1, iCursorY ); iCommandBufferIndex--; } } else if( bKey == KEY_ENTER ) { kPrintf( "\n" ); if( iCommandBufferIndex > 0 ) { // 커맨드 버퍼에 있는 명령을 실행 vcCommandBuffer[ iCommandBufferIndex ] = '\0'; kExecuteCommand( vcCommandBuffer ); } // 프롬프트 출력 및 커맨드 버퍼 초기화 kPrintf( "%s", CONSOLESHELL_PROMPTMESSAGE ); kMemSet( vcCommandBuffer, '\0', CONSOLESHELL_MAXCOMMANDBUFFERCOUNT ); iCommandBufferIndex = 0; } // 시프트 키, CAPS Lock, NUM Lock, Scroll Lock은 무시 else if( ( bKey == KEY_LSHIFT ) || ( bKey == KEY_RSHIFT ) || ( bKey == KEY_CAPSLOCK ) || ( bKey == KEY_NUMLOCK ) || ( bKey == KEY_SCROLLLOCK ) ) { ; } else if( bKey < 128 ) { // TAB은 공백으로 전환 if( bKey == KEY_TAB ) { bKey = ' '; } // 버퍼가 남아있을 때만 가능 if( iCommandBufferIndex < CONSOLESHELL_MAXCOMMANDBUFFERCOUNT ) { vcCommandBuffer[ iCommandBufferIndex++ ] = bKey; kPrintf( "%c", bKey ); } } } }
//============================================================================= // Code for shell //============================================================================= // Main loop void kStartConsoleShell( void ) { char vcCommandBuffer[CONSOLESHELL_MAXCOMMANDBUFFERCOUNT]; int iCommandBufferIndex = 0; BYTE bKey; int iCursorX, iCursorY; // Print prompt kPrintf( CONSOLESHELL_PROMPTMESSAGE ); while( 1 ) { // Wait for key bKey = kGetCh(); // If backspace if ( bKey == KEY_BACKSPACE ) { if ( iCommandBufferIndex > 0 ) { // Get current cursor point, move back on point // print white space, // delete last character in command buffer kGetCursor( &iCursorX, &iCursorY ); kPrintStringXY( iCursorX - 1, iCursorY, " " ); kSetCursor( iCursorX - 1, iCursorY ); iCommandBufferIndex--; } } // Process enter key else if ( bKey == KEY_ENTER ) { kPrintf( "\n" ); if ( iCommandBufferIndex > 0 ) { // Execute command in buffer vcCommandBuffer[iCommandBufferIndex] = '\0'; kExecuteCommand( vcCommandBuffer ); } // Print prompt and Initialize command buffer kPrintf( "%s", CONSOLESHELL_PROMPTMESSAGE ); kMemSet( vcCommandBuffer, '\0', CONSOLESHELL_MAXCOMMANDBUFFERCOUNT ); iCommandBufferIndex = 0; } // Ignore Shift key, Caps lock, Num lock, Scroll lock else if ( ( bKey == KEY_LSHIFT ) || ( bKey == KEY_RSHIFT ) || ( bKey == KEY_CAPSLOCK ) || ( bKey == KEY_NUMLOCK ) || ( bKey == KEY_SCROLLLOCK ) ) { ; } else { // Switch TAB to white space if ( bKey == KEY_TAB ) { bKey = ' '; } // If buffer have room if ( iCommandBufferIndex < CONSOLESHELL_MAXCOMMANDBUFFERCOUNT ) { vcCommandBuffer[iCommandBufferIndex++] = bKey; kPrintf( "%c", bKey ); } } } }