標準入出力とpipeを実装中
入力されたアルファベット文字列を大文字化するプログラム upper は以下のような挙動を要求される。
1.コマンドライン引数で渡された文字列を大文字化する
%upper higepon => HIGEPON
2.キーボードで入力された文字列を大文字化する
%upper (キー入力で higepon + ENTER) => HIGEPON
3.他のプロセスからpipeで渡された場合
%print higepon | upper => HIGEPON
実は 2, 3はあまり違いは無い。
どちらも upper は標準入力を read して upper case すれば良いだけだ。
これを Mona で実現するためにシェルとAPIを用意してプリミティブな関数で書いてみたのが以下のコード。
#include <monapi.h> #include <monalibc.h> #include <string> using namespace std; void toUpper(char* text, int length); string readLine(); int MonaMain(List<char*>* pekoe) { // upper argument text if (pekoe->size() > 0) { char* text = pekoe->get(0); toUpper(text, strlen(text)); monapi_stdout_write((byte*)text, strlen(text) + 1); return 0; } // upper string which read from stdin monapi_stdin_lock_for_read(); string result = readLine(); monapi_stdin_unlock_for_read(); char* text = new char[result.size()]; strcpy(text, result.c_str()); toUpper(text, result.size()); monapi_stdout_write((byte*)text, result.size()); delete[] text; return 0; } string readLine() { string result(""); for (;;) { byte buffer[256]; dword size = monapi_stdin_read(buffer, 256); for (dword i = 0; i < size; i++) { result += buffer[i]; if (buffer[i] == '\n' || buffer[i] == '\0') return result; } } return result; } void toUpper(char* text, int length) { for (int i = 0; i < length; i++) { text[i] = toupper(text[i]); } }
プリミティブな関数たちを libc でwrapすればより一般的な方法で書けるところまで来たかな。
まだ課題は多いけど。