ページへ戻る

− Links

 印刷 

hideyosi​/hijk​/引数やUsage のバックアップソース(No.5) :: OSASK計画

osaskwiki:hideyosi/hijk/引数やUsage のバックアップソース(No.5)

« Prev[4]  Next »[5]
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 /* 最後のこれも決まり文句なので変更しない */
 };

第一引数をプログラム内に受け取るにはどうしたらえぇんじゃろ・・・見つからないなぁ・・・

*COLOR(red){オイラ的な備考} [#o91a8f8f]

このUsage表示(コマンドライン定義)では、省略形を使う場合はかならずソースにベタ書きをのこしておくといいと思う。

« Prev[4]  Next »[5]