s$parse_command を複数回呼ぶ2009年01月20日 11時21分30秒

s$parse_command は UNIX で言う getopt + argc/argv の様な物だ。プログラムへの引数を処理する。getopt と違うのは、s$parse_command が form と言う対話的なユーザインターフェースを司り、より細かい入力制限などが出来ることだろう。

s$parse_command をプログラム中に何回でも呼ぶことも出来る。"end,form" と form を指定することで、強制的に対話的インターフェースを起動する事により、活用する。

例えば、電話帳や住所録のようなプログラムを考えてみよう。edit_addressbook は最初に一つの引数をとる。編集する人の名前だ。edit_addressbook uyota と起動するとしよう。一度、電話番号や住所などを取得してから、それらを編集するために、二度目の form をあげる事が出来る。

実は、s$parse_command を単純に呼ぶだけのやり方だと、全ての呼び出しにて、プログラム起動時に渡された引数を受け取る。その為、プログラムが取得したデータを表示しようとした場合に、予期せずに書き換えられてしまうことがある。例えば、最初の s$parse_command では、最初の引数はユーザ名で、二度目の s$parse_command での最初の引数が電話番号だった場合、表示しようとしている電話番号がユーザ名に上書きされてしまうのである。

完全な形の対話プログラムを作る時には s$monitor を使ってここら辺の処理をするのだが、物によってはそこまでするのは大がかり過ぎる。その様な時には、全ての s$parse_command で共通の引数を作ることで、回避できる。二回目の s$parse_command では、最初にユーザ名を表示して、それ以降に電話番号を表示することで、業とユーザ名を引き受ける場所を作る。


...
    s$parse_command( &(char_varying(32)) "modify_addressbook", &ret_code,  
        &(char_varying(256)) "index:string,length(14),disable_input,value",
            &user.account,       
        &(char_varying(256)) "end");              

...

    s$parse_command( &(char_varying(32)) "modify_phone", &ret_code,  
        &(char_varying(256)) "index:string,length(14),disable_input,value",
            &user.account,                     
        &(char_varying(256)) "phone:string,value"      
            &user.phone,
        &(char_varying(256)) "end,form");

...

    s$parse_command( &(char_varying(32)) "modify_address", &ret_code,
        &(char_varying(256)) "index:string,length(14),disable_input,value",
            &user.account,
        &(char_varying(256)) "address:string,value"
            &user.address,
        &(char_varying(256)) "zipcode:string,value"
            &user.zipcode,
        &(char_varying(256)) "end,form");

s$monitor を使うと色々と大がかりになるので、小さいプログラムの時は、この様な特徴を抑えつつ、s$parse_command だけで仕上げたい。