블로그는 귀차니즘

First Sensation
  • 공지
  • 지역로그
  • 태그
  • 방명록

Shell Programming 의 프로토타입

Programming 2008/03/31 22:45 귀차니스트

 저 랑은 다르게 복학하여 학교를 다니고 있는 친구가 어제 OS 숙제를 한다고 하면서 Shell 을 짜야한다고 하더군요. 그래서 심심한 김에 간단하게 프로토타입을 만들어보았습니다. 제 목표가 C++로 OS를 만들어보는 것이니 만큼 다음에 또 사용할 코드가 될 수도 있기 때문이죠. 간단히 만들어보았습니다.

Shell.cpp (Language : cpp)
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <map>
  5.  
  6. #include "ActionObject.h"
  7.  
  8. typedef std::map< std::string, CActionObject * > CommandVector;
  9.  
  10. void InitializeCommandMap( CommandVector &CommandMap );
  11. void TerminalizeCommandMap( CommandVector &CommandMap );
  12. void StringTokenizer( const std::string &Str, std::vector< std::string > &Token, const std::string &Delimiter );
  13.  
  14. int main( int argc, char **argv)
  15. {
  16.     const int BufferSize = 500;
  17.     char InputBuffer[ BufferSize ] = { 0, };
  18.  
  19.     CommandVector CommandTable;
  20.     InitializeCommandMap( CommandTable );
  21.  
  22.     while( std::cin.getline( InputBuffer, BufferSize ) )    {
  23.  
  24.         std::vector< std::string > ArgumentTable;
  25.         StringTokenizer( InputBuffer, ArgumentTable, " \t\r\n" );
  26.        
  27.         if( ArgumentTable.size() != 0 ) {
  28.  
  29.             CommandVector::const_iterator Accessor = CommandTable.find( ArgumentTable[ 0 ] );
  30.             if( Accessor != CommandTable.end() )    {
  31.                 /// 내장 커맨드 실행 부분
  32.                
  33.                 if( !Accessor->second->DoAction( ArgumentTable ) )
  34.                     break;
  35.             }
  36.             else    {
  37.                 /// 파일 실행 하는 부분
  38.  
  39.             }
  40.         }
  41.     }
  42.  
  43.     TerminalizeCommandMap( CommandTable );
  44.  
  45.     return 0;
  46. }
  47.  
  48. void InitializeCommandMap( CommandVector &CommandMap )
  49. {
  50.     // CommandMap에 추가하는 부분
  51.     // CActionObject를 상속받은 개체. std::string과 연관하여 Map
  52.     // ex) CommandMap.insert( make_pair( "dir", CDirObject ) );
  53.     // dir의 Case Sensitive문제는 한 곳에서 lower, upper호출 후 비교
  54. }
  55.  
  56. void TerminalizeCommandMap( CommandVector &CommandMap )
  57. {
  58.     // CommandMap 할당 객체 삭제
  59. }
  60.  
  61. void StringTokenizer( const std::string &Str, std::vector< std::string > &Token, const std::string &Delimiter )
  62. {
  63.     std::string::size_type LastPos = Str.find_first_not_of( Delimiter, 0 );
  64.     std::string::size_type Pos     = Str.find_first_of( Delimiter, LastPos );
  65.  
  66.     while( std::string::npos != Pos || std::string::npos != LastPos )
  67.     {
  68.         Token.push_back( Str.substr( LastPos, Pos - LastPos ) );
  69.         LastPos = Str.find_first_not_of( Delimiter, Pos );
  70.         Pos = Str.find_first_of( Delimiter, LastPos );
  71.     }
  72. }

  CActionObject가 명령에 따라서 작동할 수 있도록 DoAction을 작성하도록 하고, 상속을 받아 CommandMap에 맵핑을 하여야 합니다.

CActionObject.h (Language : cpp)
  1. #pragma once
  2.  
  3. #include <string>
  4. #include <vector>
  5.  
  6. class CActionObject
  7. {
  8. public:
  9.     CActionObject(void);
  10.     virtual ~CActionObject(void);
  11.  
  12.     virtual bool DoAction( std::vector< std::string > &Argument );
  13. };
  14.  
CActionObject.cpp (Language : cpp)
  1. #include "ActionObject.h"
  2.  
  3. CActionObject::CActionObject(void)
  4. {
  5. }
  6.  
  7. CActionObject::~CActionObject(void)
  8. {
  9. }
  10.  
  11. bool CActionObject::DoAction( std::vector< std::string > &Argument )
  12. {
  13.     return true;
  14. }
  15.  

  이렇게 하여 해당 작업을 DoAction에 작성하면 됩니다. return 값이 bool 인 이유는 혹시 프로그램이 잘못되어 종료해야 한다거나, exit같은 명령으로 프로그램이 종료되어야함에 있어서 조건 판단을 하기 위해서 사용했습니다. 그리고 인자로 오는 Argument에 해당하는 std::vector에 존재하는 string 개체들로써 "dir /w"같은 명령이 옵션으로 추가되어 전달되었을 때, 추가작업을 수행할 수 있게됩니다.
  빨리 목표작업을 수행하여 이 코드를 사용할 날이 있었으면 합니다.

크리에이티브 커먼즈 라이센스
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.

"Programming" 분류의 다른 글

Gradient에 대한 정리 (0)2009/01/07
한게임 자동테트리스 Ver 0.6 (24)2008/11/15
한게임 자동테트리스 Ver 0.2 (25)2008/11/03
Read Sector From Floppy (0)2008/07/17
어제 무작정 맹글어봤던 것입니다.. (2)2008/07/16
2008/03/31 22:45 2008/03/31 22:45
TAG C++, Shell, 프로토타입
받은 트랙백이 없고, 댓글이 없습니다.

트랙백 주소 :: http://www.filewiki.net/tc/trackback/42

댓글을 달아 주세요

◀ 이전페이지 1 다음페이지 ▶

블로그 이미지
First Sensation 귀차니스트
rss
  • 관리자
  • 글쓰기

카테고리

  • 전체 (111)
    • Computer (3)
    • Language (14)
    • Reverse Engineering (1)
    • Algorithm (9)
    • TopCoder (3)
    • Library (2)
    • Programming (20)
    • Programming Tip (9)
    • PSP-Programming (10)
    • Program (5)
    • Small Talk (31)
    • Document (4)

최근에 올라온 글

  • Gradient에 대한 정리.
  • Gradient 작성중에 있습.... (3)
  • 게임&인터랙티브 애플리....
  • 한게임 자동테트리스 Ve.... (27)
  • Intel 64 And IA32 Arch.... (2)

최근에 달린 댓글

  • 관리자만 볼 수 있는 댓글입.... 비밀방문자 01/08
  • 글쎄요.. 프로그램이라는게.... 귀차니스트 01/08
  • 관리자만 볼 수 있는 댓글입.... 비밀방문자 01/07
  • 본문에 배포는 하지 않는다고.... 귀차니스트 01/07
  • 다운어덯게 받아요. difl 2008

달력

«   2009/01   »
일 월 화 수 목 금 토
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

링크

  • kkamagui 프로그래밍 세상.
  • 류광의 번역 이야기.
  • 서광열의 프로그래밍 언....
  • 준호씨의 블로그.
  • 최익필의 이름없는 블로그.
  • 위키는 귀차니즘.

최근에 받은 트랙백

  • 궁극의 예외처리. 이름없는 블로그 2008
  • Maximum sum. 티스토리 지점 2008

글 보관함

  • 2009/01 (1)
  • 2008/12 (1)
  • 2008/11 (4)
  • 2008/10 (2)
  • 2008/09 (3)

태그목록

  • Freetype2
  • 재귀적합성
  • ICPC
  • XQuared
  • 상속
  • Gradient
  • Codegear
  • IPangYa
  • auto_ptr
  • 디자인패턴
  • RLE
  • Application.Run
  • 전위연산
  • 개발
  • 어쌔신 크리드
  • 파일입출력
  • HDTV
  • 디아블로3
  • 디코딩
  • C
  • SSD
  • Codejock
  • Parent
  • 인코딩
  • Mine Sweeper
  • \r\n
  • Image Processing
  • 해로
  • Graphi
  • 압축

지역로그 : 태그 : 방명록 : 관리자 : 글쓰기
귀차니스트’s Blog is powered by Textcube 1.7.5 : Risoluto / Designed by DesignNia.net