guigui01の仕様の整理とかそういうの。
・・・解ってきたぞ。つまり、これは単なるUsage表示だけじゃなくて、このアプリのコマンドライン引数の定義も兼ねているのか・・・
#include <guigui01.h>
/* これは関数の外で宣言するのが望ましい */
unsigned char cmdusage[] = {
0x86, 0x55, /* この2つは決まり文句なのでとりあえず変更しない */
0x0c, 0, 'n', 0x1c, 1, '#', /* この説明は本文で */
0x40 /* 最後のこれも決まり文句なので変更しない */
};
この設定で表示されるUsage。
usage>ex0012.g01 n:#どうもUsage表示は関数化されているようだ。どうすれば自由にUsageが表示できるだろう・・・
| 0x86, 0x55 | これは頭に付ける決まり文句らしい。(でも0x50とかが確認されている) |
| 0x0c, 0, 'n', 0x1c, 1, '#', | これらはコマンドになるらしい |
| 0x40 | お尻につける決まり文句 |
どうもこれでワンセットになるらしい。
| 0x0c | (引数名の文字数-1) | (引数名) | 0x1c | (説明部分の文字数) | (説明) |
たとえば上の例だと・・・
| 0x0c | コマンド | |
| (引数名の文字数-1) | 0 | 引数名はn。一個。 1 - 1 = 0 |
| (引数名) | 'n' | 一個しか置けない。 |
| 0x1c | コマンド | |
| (説明部分の文字数) | 1 | 説明は一文字だけなので1? |
| (説明) | '#' | この#一文字が説明ってことかな?? |
この部分はUsageを表示するんじゃなくて、そもそもコマンドライン引数を定義すると。
で!
この定義に沿って、自動的にUsageメッセージを作って表示してくれると!
| 0x86, 0x55 | 通常モード |
| 0x86, 0x5c, 0 | 引数名省略可能モード |
http://osask.net/w/264.html[2]
省略が可能。
上記 0x86, 0x5c, 0 は、 0x86, 0x50 と縮めて書くことができる。
おそらく、0x5x の一桁目が合成できるってことだろう
省略したり順番が違うとエラーになってほしい引数
| 0x0c | (引数名の文字数-1) | (引数名) | 0x1c | (説明部分の文字数) | (説明) |
| これは省略不可の引数だというサイン | この引数は数値であるというサイン | ||||
| 合成が可能。コマンドの一桁目を引数名の文字列-に置き換える | 合成が可能。コマンドの一桁目を引数名の文字列-に置き換える | ||||
省略することもある引数
| 0x1c | (引数名の文字数-1) | (引数名) | 0x1c | (説明部分の文字数) | (説明) |
| これは省略可能な引数だというサイン | この引数は数値であるというサイン |
0x0c, 0, 's', 0x3c, 3, 's', 't', 'r', /* 0x3cは文字列型引数 */
| 0x0c | (引数名の文字数-1) | (引数名) | 0x3c | (説明部分の文字数) | (説明) |
| これは省略不可な引数だというサイン | この引数は文字列だというサイン |
0x0c, 1, 'i','n', 0x3c, 10, 'i', 'n', 'p','u','t','-','f','i','l','e' /* 0x0cはファイルパス型引数 */
| 0x0c | (引数名の文字数-1) | (引数名) | 0x0c | (説明部分の文字数) | (説明) |
| これは省略不可な引数だというサイン | この引数はファイルパスだというサイン |
引数名はよく略称を使われる。たとえば、文字列(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」)に置換してくれる。
ただし注意。上記のようにベタに書くと「string]は6文字なので6を指定しているが、置換を使う場合は残りの文字数+1になる。(つまり0x01で一文字)
0x0c, 2, 's', 't', 'r', 0x3c, 4, 0x01, 'i', 'n', 'g'
0x87,
引数ではなくスイッチ?な場合。
0x1c, 3, 'd', 'o', 'w', 'n', 0x20,
| 0x1c | 3 | 'd', 'o', 'w', 'n' | 0x20 |
| 省略可能なオプションであるサイン | downなので、4-1で3 | スイッチには引数内容がないのでそのサイン |
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 /* 最後のこれも決まり文句なので変更しない */
};第一引数をプログラム内に受け取るにはどうしたらえぇんじゃろ・・・見つからないなぁ・・・
関数で、戻り値があるのかないのかは、guiguo01.h内を見ればわかるらしい。strct inlune int なんてやってるのは、int型の戻り値を持つもの!・・・だと思う。多分・・・
引数をプログラム内に受け取ると思われる関数は以下のとおり。
引数には、定義した順に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);
}こういう処理をしてあげればいい・・・のかな・・・(これ合ってるかな)
まいったなこんなにあるよ・・・どれがどれだがよくわからん・・・
各関数のfopenの後ろの文字の意味。
数字タイプの引数を受け取るもの。(intなので多分int型変数の制限を受けると思う。0~4294967295 or -2147483648~2147483647 とかの。)
省略不可(普通?シングル型というらしい)の引数を取得する。省略不可なのだから、指定がなかったりすればエラーとなる(・・・はず・・・)
int g; ←引数を受け取る変数 int i; i = 0; ←引数番号を指定する。0なので、一番最初に定義された引数 g = g01_getcmdlin_int_s(i); ←問題なければgに引数の内容が入る
省略可能(オプショナル型というらしい)の引数を取得する。省略可能なのだから、指定がなかったりしてもエラーにならない
省略された場合の規定値が必要になる。第二引数の int d がこれを担当する。
int g; ←引数を受け取る変数
int i; i = 0; ←引数番号を指定する。0なので、一番最初に定義された引数
g = g01_getcmdlin_int_o(i,100); ←問題なければgに引数の内容が入る。
もしこの引数が指定されてなかった場合は、100が指定された
(規定値)とみなしてgに100が返される。文字列型のデータを受け取る。
シングル型。省略不可の引数の場合に使う。(s0となっているのは「文字列として受け取り、末尾に0をつけるという働きのためだと思われる。
戻り値を持たないことに注意!
int i; i = 0; ←取得する引数番号 int n; n = 16; ←取得する文字列の最大長(この場合は16バイト分) char s[16]; ←取得した引数(文字列)を格納する配列orポインタ g01_getcmdlin_str_s0(i, n, s) ←戻り値なし。引数がs[]に格納され、末尾に0が付く
ダメダ・・・これも規定値の扱いがわからん・・・・
うっちゃんの予測を検証すべく、実験をしてみた
ちなみにオイラの予想してたこと。intタイプと同じように、コード内に規定値を打ち込むような形式だと思ってた
例:
intタイプは戻り値として取得したコマンドラインパラメータを返してくれる。
g = g01_getcmdlin_int_s(0); // 0番目の引数を取得し、gに渡す
省略可能の場合・・・
g = g01_getcmdlin_int_o(0,100); // 0番目の引数を取得し、もしなかったら規定値として
100を返す
この流れで行くとstrタイプも・・・・
*g = g01_getcmdlin_str_s0(0); // 0番目の文字型引数を取得し、gに渡す
省略可能の場合・・・
*g = g01_getcmdlin_str_s0(0,"イカ自身"); // 0番目の文字型引数を取得し、gに渡すが、
もし指定がなかったら規定値として
「イカ自身」という文字を返すしかし、実際には戻り値がないタイプだったのでこれは間違い。
こんなコードを書いてみる。
#include <guigui01.h>
#include <stdio.h>
unsigned char cmdusage[] = {
0x86, /* これは決まり文句なのでとりあえず変更しない */
0x55, /* 通常モード(引数名省略不可) */
0x0c, 2, 'o','p','t', 0x3c, 9, 0x01, 'i', 'o', 'n', '-', 'f', 'i', 'l', 'e',
0x40 /* 最後のこれも決まり文句なので変更しない */
};
void G01Main()
{
g01_setcmdlin(cmdusage); //コマンドライン定義
char *buffer = g01_bss1a1; //お便利バッファ2MBを宣言
g01_getcmdlin_str_s0(0,100,buffer); //引数受け取り
g01_putstr0(buffer);
return;
}うーん・・・やはり、intが特殊だったって法則でいいのかな。本来は規定値なんて概念はない。自分で戻り値を検証するコードを書け。・・・で。intだけは便利にしといたよ!・・・みたいな? www
ファイルパスタイプのデータを受け取る。(ファイルパスを受け取って開かないわけはない!ということで、fopenと一体型になっているのだろう。きっと)
省略不可に設定されたファイルパスを取得し、オープンする???
・・・この流れで行けばoは省略可能の場合だと思うのだが、じゃ、規定値はどうするのこれ???
iは?? スロットの指摘? 引数番号??
困ったなぁ 載ってないぞ・・・・
うっちゃんの予測を検証すべく、実験をしてみた
こんなコードを書く。
#include <guigui01.h>
#include <stdio.h>
unsigned char cmdusage[] = {
0x86, /* これは決まり文句なのでとりあえず変更しない */
0x55, /* 通常モード(引数名省略不可) */
0x0c, 2, 'o','p','t', 0x0c, 9, 0x01, 'i', 'o', 'n', '-', 'f', 'i', 'l', 'e',
0x40 /* 最後のこれも決まり文句なので変更しない */
};
void G01Main()
{
g01_setcmdlin(cmdusage); //コマンドライン定義
char *buffer = g01_bss1a1; //お便利バッファ2MBを宣言
g01_getcmdlin_fopen_s_0_4(0); //引数受け取り&ファイルオープン
jg01_fread0_4(2 * 1024 * 1024, buffer); /* 最大2MB, 終端に0がつく */
g01_putstr0(buffer);
return;
}debug: cmdlin_fopen: 4 56 test.txt c_api: junk_fopen: error
省略可能引数なので、それに合わせるべく、fopen側をイジる。つまり、g01_getcmdlin_fopen_o_0_4(0);
if (g01_getcmdlin_fopen_m_0_4(0, j) == 0)
cpyのソース内でこんなことしてる・・・ぞ? m系列はあえて後回しにしてたんだけど、これは戻り値をもっている??
指定した引数番号の引数が指定されているかどうかを判定する。
int g; ←引数の状態を受け取る変数
int i; i = 0; ←何番の引数について調べるか?
g = g01_getcmdlin_argc(i); ←引数番号0の引数が指定されているかどうかの答えがgに入る。
指定されていれば1、なければ0が返される。g01_getcmdlin_flag_o(0)
このUsage表示(コマンドライン定義)では、省略形を使う場合はかならずソースにベタ書きをのこしておくといいと思う。
(This host) = http://osask.net