guigui01の仕様の整理とかそういうの。 *オレ様リンク集 [#n874540e] -http://osask.net/w/264.html -http://osask.net/w/174.html -http://osask.net/w/346.html *複雑・・・ [#p64cc7bf] ・・・解ってきたぞ。つまり、これは単なるUsage表示だけじゃなくて、このアプリのコマンドライン引数の定義も兼ねているのか・・・ #include <guigui01.h> /* これは関数の外で宣言するのが望ましい */ unsigned char cmdusage[] = { 0x86, 0x55, /* この2つは決まり文句なのでとりあえず変更しない */ 0x0c, 0, 'n', 0x1c, 1, '#', /* この説明は本文で */ 0x40 /* 最後のこれも決まり文句なので変更しない */ }; この設定で表示されるUsage。 usage>ex0012.g01 n:# どうもUsage表示は関数化されているようだ。どうすれば自由にUsageが表示できるだろう・・・ *解析 [#n8e8b86d] |0x86, 0x55|これは頭に付ける決まり文句らしい。(でも0x50とかが確認されている)| |0x0c, 0, 'n', 0x1c, 1, '#',|これらはコマンドになるらしい| |0x40|お尻につける決まり文句| どうもこれでワンセットになるらしい。 |0x0c | (引数名の文字数-1) | (引数名) | 0x1c | (説明部分の文字数) | (説明) | たとえば上の例だと・・・ |0x0c|コマンド| | |(引数名の文字数-1)|0|引数名は''n''。一個。 1 - 1 = 0| |(引数名)| 'n' | 一個しか置けない。| |0x1c|コマンド| | |(説明部分の文字数)|1| 説明は一文字だけなので1?| |(説明)|'#'| この#一文字が説明ってことかな??| *実験的に逆に考えてみる・・・ [#xaa2d4cb] この部分は''Usageを表示する''んじゃなくて、そもそも''コマンドライン引数を定義する''と。~ で!~ この定義に沿って、自動的にUsageメッセージを作って表示してくれると! **引数先頭のコマンド [#c0e9ab00] |0x86, 0x55|通常モード| |0x86, 0x5c, 0|引数名省略可能モード| http://osask.net/w/264.html 省略が可能。 上記 0x86, 0x5c, 0 は、 0x86, 0x50 と縮めて書くことができる。 COLOR(blue){おそらく、0x5x の一桁目が合成できるってことだろう} **省略できない引数 [#qc69ba57] 省略したり順番が違うとエラーになってほしい引数 |''0x0c''|(引数名の文字数-1)|(引数名)|''0x1c''|(説明部分の文字数)|(説明)| |これは省略不可の引数だというサイン| | |この引数は数値であるというサイン| | | |>|合成が可能。コマンドの一桁目を引数名の文字列-に置き換える| |>|合成が可能。コマンドの一桁目を引数名の文字列-に置き換える| | **省略可能な引数 [#a3d2f06c] 省略することもある引数 |''0x1c''|(引数名の文字数-1)|(引数名)|0x1c|(説明部分の文字数)|(説明)| |これは省略可能な引数だというサイン| | |この引数は数値であるというサイン| | | -Usage表示では自動的に [ ] で括られて表示される **引数が文字列の場合 [#j17ad8d0] 0x0c, 0, 's', 0x3c, 3, 's', 't', 'r', /* 0x3cは文字列型引数 */ |0x0c|(引数名の文字数-1)|(引数名)|''0x3c''|(説明部分の文字数)|(説明)| |これは省略不可な引数だというサイン| | |この引数は文字列だというサイン| | | **引数がファイルパスである場合 [#yb36c68d] 0x0c, 1, 'i','n', 0x3c, 10, 'i', 'n', 'p','u','t','-','f','i','l','e' /* 0x0cはファイルパス型引数 */ |0x0c|(引数名の文字数-1)|(引数名)|''0x0c''|(説明部分の文字数)|(説明)| |これは省略不可な引数だというサイン| | |この引数はファイルパスだというサイン| | | ***超省略形 [#lc16198d] -[in:]input-file の形でかまわないなら、 単に 0x88と書けばいい。 -↑と同じで、さらに省略可能形式なら、0x89と書けばいい。 *説明時に引数名の文字列を使う [#u78757f5] 引数名はよく略称を使われる。たとえば、文字列(string)の引数がほしい場合は、 str: なんてのを使う。Usageでは、str:引数の後の説明は当然、 str:string になる。(つまり、s と t と r がかぶっている。) 普通にUsage表示(コマンドライン定義)をしたい場合は、 0x0c, 2, 's', 't', 'r', 0x3c, 6, 's', 't', 'r', 'i', 'n', 'g' となるが、文字が勿体ない場合、0x01 を置くと前で定義した引数名(「str」)に置換してくれる。~ COLOR(red){ただし注意。上記のようにベタに書くと「string]は6文字なので6を指定しているが、置換を使う場合は残りの文字数+1になる。(つまり0x01で一文字)} 0x0c, 2, 's', 't', 'r', 0x3c, 4, 0x01, 'i', 'n', 'g' **改行 [#l7cd5b1a] 0x87, **スイッチ [#t0414b2f] 引数ではなくスイッチ?な場合。 0x1c, 3, 'd', 'o', 'w', 'n', 0x20, |0x1c| 3| 'd', 'o', 'w', 'n'| 0x20| |省略可能なオプションであるサイン|downなので、4-1で3| |スイッチには引数内容がないのでそのサイン| *引数の受け取り [#j8c6128d] getcmdline系で受け取るらしいんだけど、どうもわからん。例えばこんなことして・・・ unsigned char cmdusage[] = { 0x86, /* これは決まり文句なのでとりあえず変更しない */ 0x55, /* 引数名省略可能モード */ 0x1c, 2, 'o','p','t', 0x0c, 9, 0x01, 'i', 'o', 'n', '-', 'f', 'i', 'l', 'e', 0x0c, 2, 'o','u','t', 0x0c, 9, 0x01, 'p', 'u', 't', '-', 'f', 'i', 'l', 'e', 0x40 /* 最後のこれも決まり文句なので変更しない */ }; 第一引数をプログラム内に受け取るにはどうしたらえぇんじゃろ・・・見つからないなぁ・・・ 引数をプログラム内に受け取ると思われる関数は以下のとおり。 -g01_getcmdlin_exit1() __asm__ __volatile__("call _g01_execcmd0\n\t.byte 0x86,0xbf") -g01_getcmdlin_fopen_s(i) -g01_getcmdlin_fopen_o(i) -g01_getcmdlin_fopen_m(i, j) -g01_getcmdlin_fopen_s_0_4(i) __asm__ __volatile__("call _g01_execcmd0\n\t.byte 0x86,0x60,0x04"::"a"(i):"%esi","%edi","cc") -g01_getcmdlin_fopen_s_3_5(i) __asm__ __volatile__("call _g01_execcmd0\n\t.byte 0x86,0x60,0x35"::"a"(i):"%esi","%edi","cc") -g01_getcmdlin_fopen_m_0_4(int i, int j) -g01_getcmdlin_fopen_o_0_4(int i) -g01_getcmdlin_fopen_o_3_5(int i) -g01_getcmdlin_flag_s(int i) -g01_getcmdlin_flag_o(i) g01_getcmdlin_flag_s(i) -g01_getcmdlin_int_s(i) g01_getcmdlin_flag_s(i) -g01_getcmdlin_int_o(int i, int d) -g01_getcmdlin_str_s0(i, n, p) __asm__ __volatile__("call _g01_execcmd0\n\t.byte 0x86, 0x61, 0x36, 0x02"::"c"(i),"a"(n),"d"(p):"%esi","%edi","cc","memory") -g01_getcmdlin_str_s0_0(n, p) __asm__ __volatile__("call _g01_execcmd0\n\t.byte 0x86, 0x03, 0x60, 0x20"::"a"(n),"d"(p):"%esi","%edi","cc","memory") -g01_getcmdlin_str_o0(int i, int n, void *p) -int g01_getcmdlin_str_m0_1(int j, int n, void *p) -g01_getcmdlin_argc(int i) -g01_getcmdlin_put0_s(i) __asm__ __volatile__("call _g01_execcmd0\n\t.byte 0x86,0xbc,0x60"::"a"(i):"%esi","%edi","cc") -g01_getcmdlin_put1_s(i) __asm__ __volatile__("call _g01_execcmd0\n\t.byte 0x86,0xbd,0x60"::"a"(i):"%esi","%edi","cc") -g01_getcmdlin_put0_m_exit1(i, j) __asm__ __volatile__("call _g01_execcmd0\n\t.byte 0x38,0x6b,0xc6,0x01,0x43,0x10"::"a"(i),"c"(j)) -g01_getcmdlin_put1_m_exit1(i, j) __asm__ __volatile__("call _g01_execcmd0\n\t.byte 0x38,0x6b,0xd6,0x01,0x43,0x10"::"a"(i),"c"(j)) -g01_cmdlin3s(int l) {} -g01_cmdlin3m(int l, int i) {} -g01_cmdlin4s(int l) {} -g01_cmdlin4m(int l, int i) {} -g01_cmdlin5s(int l) {} -g01_cmdlin5m(int l, int i) {} -g01_cmdlin6s1(int l, int n, void *p) {} -g01_cmdlin6m1(int l, int i, int n, void *p) {} -jg01_getcmdline0 jg01_getcmdlin1 -jg01_getcmdline1 jg01_getcmdlin0 -jg01_getcmdlin0(int n, void *p) -jg01_getcmdlin1(n, p) __asm__ __volatile__("call _g01_execcmd0\n\t.byte 0x7b,0x99,0x80,0x10,0x36,0x02"::"a"(n),"d"(p):"%esi","%edi","cc") **引数受け取り関数の整理(予測ね。実験しながら・・・) [#y256f834] 引数には、定義した順に0から番号が付いているらしい。 -int g01_getcmdlin_argc(int 引数番号) --指定した番号の引数があるかないか。あれが1、なければ0を返す たとえばこういう設定をしたとする。 unsigned char cmdusage[] = { 0x86, /* これは決まり文句なのでとりあえず変更しない */ 0x55, /* 引数名省略可能モード */ 0x1c, 2, 'o','p','t', 0x0c, 9, 0x01, 'i', 'o', 'n', '-', 'f', 'i', 'l', 'e', ←引数番号0 0x0c, 2, 'o','u','t', 0x0c, 9, 0x01, 'p', 'u', 't', '-', 'f', 'i', 'l', 'e', ←引数番号1 0x40 /* 最後のこれも決まり文句なので変更しない */ }; ↓Usage表示(コマンドラインの設定)はこうなる。 usage>test.g01 [opt:option-file] out:output-file このプログラム内で int i; i = g01_getcmdlin_argc(0); こんなことしたとする。引数を付けて実行してみると・・・ >hijk.exe test.g01 opt:hogehoge.txt out:ugougo.txt i=1 ←0番目の引数が存在するぞ! >hijk.exe test.g01 out:ugougo.txt i=0 ←0番目の引数は指定されてない(空)だぞ! ・・・・・こういうことでいいのかな・・・・・ たとえばこの例だと、0番引数optは、「もし指定があればそのファイル名を使え。でもなければ、ディフォルトのosalink1.optを使用してくれ」という動作をさせたい。とういう場合は・・・ int i; i = g01_getcmdlin_argc(0); if( i == 0 ) { g01_fopen(1,4,"osalink1.opt"); }else { g01_fopen(1,4,getcmdlinexxxxxxx); } こういう処理をしてあげればいい・・・のかな・・・(これ合ってるかな) ***ファイル名取得&オープン系 [#e8caaf50] まいったなこんなにあるよ・・・どれがどれだがよくわからん・・・ -g01_getcmdlin_fopen_s(i) -g01_getcmdlin_fopen_o(i) -g01_getcmdlin_fopen_m(i, j) -g01_getcmdlin_fopen_s_0_4(i) -g01_getcmdlin_fopen_s_3_5(i) -g01_getcmdlin_fopen_m_0_4(int i, int j) -g01_getcmdlin_fopen_o_0_4(int i) -g01_getcmdlin_fopen_o_3_5(int i) 各関数のfopenの後ろの文字の意味。 -o --オプショナル型ということらしい。省略可能なものを扱うものらしい。 -s --シングル型。通常型らしい。つまり省略可能ではないものの場合に使う・・・のかな? *getcmdlin分類 [#e846e38b] ダメだ・・・ちょっと分類を組み立てなおし! -g01_getcmdlinは引数をプログラム内に受け取る関数郡。 **g01_getcmdlin_int系 [#b5c59937] 数字タイプの引数を受け取るもの。(intなので多分int型変数の制限を受けると思う。0~4294967295 or -2147483648~2147483647 とかの。) ***g01_getcmdlin_int_s系 [#v6ad5653] 省略不可(普通?シングル型というらしい)の引数を取得する。省略不可なのだから、指定がなかったりすればエラーとなる(・・・はず・・・) int g; ←引数を受け取る変数 int i; i = 0; ←引数番号を指定する。0なので、一番最初に定義された引数 g = g01_getcmdlin_int_s(i); ←問題なければgに引数の内容が入る -g01_getcmdlin_int_s(i) ***g01_getcmdlin_int_o系 [#l0f77b1a] 省略可能(オプショナル型というらしい)の引数を取得する。省略可能なのだから、指定がなかったりしてもエラーにならない 省略された場合の規定値が必要になる。第二引数の int d がこれを担当する。 int g; ←引数を受け取る変数 int i; i = 0; ←引数番号を指定する。0なので、一番最初に定義された引数 g = g01_getcmdlin_int_o(i,100); ←問題なければgに引数の内容が入る。 もしこの引数が指定されてなかった場合は、100が指定された (規定値)とみなしてgに100が返される。 -g01_getcmdlin_int_o(int i, int d) **g01_getcmdlin_str系 [#t4f1bd5b] 文字列型のデータを受け取る。 ***g01_getcmdlin_str_s0系 [#u8ec31e9] シングル型。省略不可の引数の場合に使う。(s0となっているのは「文字列として受け取り、末尾に0をつけるという働きのためだと思われる。~ COLOR(red){戻り値を持たないことに注意!} int i; i = 0; ←取得する引数番号 int n; n = 16; ←取得する文字列の最大長(この場合は16バイト分) char s[16]; ←取得した引数(文字列)を格納する配列orポインタ g01_getcmdlin_str_s0(i, n, s) ←戻り値なし。引数がs[]に格納され、末尾に0が付く -g01_getcmdlin_str_s0(i, n, p) -g01_getcmdlin_str_s0_0(n, p) COLOR(red){ダメダ・・・これも規定値の扱いがわからん・・・・} -g01_getcmdlin_str_o0(int i, int n, void *p) -g01_getcmdlin_str_m0_1(int j, int n, void *p) **g01_getcmdlin_fopen系 [#t3509916] ファイルパスタイプのデータを受け取る。(ファイルパスを受け取って開かないわけはない!ということで、fopenと一体型になっているのだろう。きっと) ***g01_getcmdlin_fopen_s系 [#s43bdb52] 省略不可に設定されたファイルパスを取得し、オープンする??? -g01_getcmdlin_fopen_s(i) COLOR(red){・・・この流れで行けばoは省略可能の場合だと思うのだが、じゃ、''規定値''はどうするのこれ???} COLOR(red){iは?? スロットの指摘? 引数番号??} COLOR(red){困ったなぁ 載ってないぞ・・・・} -g01_getcmdlin_fopen_o(i) -g01_getcmdlin_fopen_m(i, j) -g01_getcmdlin_fopen_s_0_4(i) COLOR(red){こいつの正体はわかってるけど省略形なので後回し・・・・・・} -g01_getcmdlin_fopen_s_3_5(i) -g01_getcmdlin_fopen_m_0_4(int i, int j) -g01_getcmdlin_fopen_o_0_4(int i) -g01_getcmdlin_fopen_o_3_5(int i) **g01_getcmdlin_argc [#t240815c] 指定した引数番号の引数が指定されているかどうかを判定する。 int g; ←引数の状態を受け取る変数 int i; i = 0; ←何番の引数について調べるか? g = g01_getcmdlin_argc(i); ←引数番号0の引数が指定されているかどうかの答えがgに入る。 指定されていれば1、なければ0が返される。 -g01_getcmdlin_argc(int i) **g01_getcmdlin_flag系 [#g99d3588] g01_getcmdlin_flag_o(0) -g01_getcmdlin_flag_s(int i) -g01_getcmdlin_flag_o(i) -g01_getcmdlin_flag_s(i) -g01_getcmdlin_flag_s(i) **未分類 [#pf4705d9] -g01_getcmdlin_exit1() -g01_getcmdlin_put0_s(i) -g01_getcmdlin_put1_s(i) -g01_getcmdlin_put0_m_exit1(i, j) -g01_getcmdlin_put1_m_exit1(i, j) -g01_cmdlin3s(int l) {} -g01_cmdlin3m(int l, int i) {} -g01_cmdlin4s(int l) {} -g01_cmdlin4m(int l, int i) {} -g01_cmdlin5s(int l) {} -g01_cmdlin5m(int l, int i) {} -g01_cmdlin6s1(int l, int n, void *p) {} -g01_cmdlin6m1(int l, int i, int n, void *p) {} -jg01_getcmdline0 -jg01_getcmdlin1 -jg01_getcmdline1 -jg01_getcmdlin0 -jg01_getcmdlin0(int n, void *p) -jg01_getcmdlin1(n, p) *COLOR(red){オイラ的な備考} [#o91a8f8f] このUsage表示(コマンドライン定義)では、省略形を使う場合はかならずソースにベタ書きをのこしておくといいと思う。
(This host) = http://osask.net