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

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

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

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

크리에이티브 커먼즈 라이센스
Creative Commons License
2008/03/31 22:45 2008/03/31 22:45

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

댓글을 달아 주세요