음 재미가 있는 관계로 코딩을 계속하다보니 어느새 프로토타입에서 벗어나 어느정도 구조를 갖추고 되었습니다. 리다이렉션을 비롯해서 Dir, Exit 등의 기능도 들어가게 되었습니다. 아직 미완성 적인 부분도 많이 존재하고 수정중인 버그도 존재합니다. 하지만 이런 진행과정을 남기고 싶어서 포스팅하게 되었습니다. 어느정도 되는 프로그램이 갑자기 어디서 뚝 떨어질리는 없지 않겠습니까?^^
예전엔 Main코드 상에서 바로 측정을 진행하였지만 객체화를 안시켜놓으니 new를 통한 객체할당에 대한 해제가 이루어지지 않는 문제점이 존재한다고 생각하여 클래스화 하였습니다. 지금 생각중인 것은 TShell을 Singleton 인터페이스화 하여 alias 같은 명령어가 작동할 수 있도록 하는 것입니다.
나중에 한 번 수정을 해봐야 겠네요..
음 여기서 다른 부분은 예전 버젼과 동일하지만 getch 함수가 C 표준함수가 아니다보니 실질적으로 프로그램에 문제가 있었고 그로인해 glibc환경에서 동작하는 getch소스를 가져와서 구현하게 되었습니다. getch는 아마도 CShellCommand 클래스로 자리를 이동해야 할 것 같군요. 어차피 private 상속이니까요.
그리고 키 입력을 통한 처리를 DoInputWork라는 함수 안에서 getch를 통하여 구현을 하게 되었는데, 아직 화살표키 등의 처리를 진행하지 않았기 때문에 그에 따른 처리가 추가적으로 등록되어야 할 것같습니다.
SetRedirection 과 ResetRedirection 함수를 통하여 만약 > 파일명, < 파일명이 있다면 리다이렉션 기능이 수행 되게 하였습니다. dup함수와 dup2함수를 통하여 제작을 하였습니다. 실질적으로 CActionObject 클래스가 하는 역할은 거의 없다고 봐도 무방하죠^^;
cd 를 통한 디렉토리 이동 기능을 구현해놓은 클래스입니다. CShellCommand 클래스를 private 상속 받은 것은 아시다시피 GetCurrentWorkingDirectory 함수를 사용하기 위해서 입니다. 보시면 cd .. 을 하지 않고 cd . 했을때 현재의 프로젝트를 출력하기만 하기에 이렇게 구현할 수 밖에 없었죠.
디렉토리 들어가지 못했을 때의 경우를 chdir 리턴값을 체크하여 에러메시지 출력을 따로 해야겠습니다.
exit 명령을 통하여 쉘을 종료하기 위하여 제작한 클래스인데, 실질적으로 tshell.cpp 구현부에서 해당 DoAction함수의 실행 리턴값을 체크하여 프로그램을 종료할 것인가 결정하는 부분이 존재하다보니 그냥 false를 리턴하는 코드만 넣게 되었습니다.
주력 기능으로 제작하기 위하여 많은 코딩량이 들어간 CDirObject 입니다. 기능은 /w /p /s 디렉토리 나열 등이 있는데, 현재 /s 버젼 및, 디렉토리 나열 기능에 대하여는 버그가 존재합니다. S_ISDIR 부분이 왠일인지 이상하게 파일인데도 불구하고 DIR로 인식하는지 true가 리턴되더군요. 만약 해결 된다면 문제가 어느정도 괜찮을 것 같습니다.
디렉토리 내용의 출력은 함수 객체를 사용하였는데, CDirObject.h 파일에 존재하는 ???Print 구조체의 ()연산자를 오버로딩하여 출력을 구성했습니다. 역시 편리한 점이 없지않아 있더군요. 출력 형식은 윈도우즈 cmd.exe 에서 dir 했을 때와 비슷하게 구현했습니다.
private 상속을 위한 Shell과 관련된 기능 구현 CShellCommand 클래스이다 보니 마지막으로 밀리게 되었군요. 지금 현재는 GetCurrentWorkingDirectory 함수만 존재하지만 getch 함수도 이동하고 그러면 어느정도 채워 지겠군요. 또한 기능이 복잡해지고 한다면 여러모로 많이 복잡할 것 같이 보입니다^^;
이 외에도 쉘 스크립트 기능, 파일 실행 기능들도 넣으려고 하는데 아직 작업을 진행하지 못하였군요. 버그를 수정하여 완벽한 쉘이 될 수 있도록 개정해봐야 겠습니다.^^; 다른 것도 아니고 스스로 사용할 것인데요. 그럼 오늘도 즐거운 하루 되시길.
=뱀다리=
그나저나 이번에도 올려놓고 보니 + 연산으로 임시객체를 남발하는 코드가 몇 군데 있고 효율을 떨어트리는 코드가 존재하는군요. 다음버젼엔 수정하여 올려야 겠습니다.
"Programming" 분류의 다른 글
| DebuggerOnC (0) | 2010/09/01 |
| Script Interpreter - boost::spirit (0) | 2010/03/09 |
| VirtualHttpServer - 가상URL 처리 서버 (4) | 2010/02/22 |
| Gradient 작성중에 있습니다. (3) | 2008/12/18 |
| 한게임 자동테트리스 Ver 0.6 (39) | 2008/11/15 |

댓글을 달아 주세요