* 「ぐいぐい01」のコマンドライン -(by [[K]], 2008.12.26) *** (0) -cpyをnaskで書いてみたら一体どのくらい小さくなるのか興味があって、さっそくやってみたくなったけど、現在のコマンドラインAPIはjunk中のjnukで本仕様ではないことが確実だから、そんな段階でアセンブラ化するというのもばかばかしい。 -と考えているうちにいろいろ本仕様についてアイデアが浮かんだのでメモ。 *** (1) -アイデアリスト: -コマンドライン取得APIの中にサブパケットを入れる。 --.dataに置きたい場合は、!6_4_2_0_lenを使え。 -!5:usage設定。コマンド名以降から、というかオプション説明だけでいい。このサブパケットがコマンドライン取得APIの最初に来るように期待されている。ラベル番号の定義にもなっている。これは複雑なフォーマットを取る。.textの中か、.dataの中の定数でなければいけない。 --将来シェルがこの情報をタグに登録する場合、一度カラ実行してこのサブパケットが来た時点でポインタをとりexitさせればいい。.dataの範囲内であれば、ベースを引けばいいだけ。 --(ボツ)理解できないラベルをいくつ許容するか指定(0でも無限(= !5)でもいい)。省略しうるタグかどうかも指定。 --理解できない引数をどれと見なすかを指定(エラーにするのは!5)。省略しうるタグかどうかも指定。 --二度目以降の!5はusage表示。 --!3bはusage表示してexit1。 --!3fはusage表示してexit1。 -プリセット番号<<2が4はtermだが、5(0x85だけど)だとtermではなくレガシーコマンドライン(文字列)。6(0x86だけど)だとargv[](文字列)。いずれもマッチしたものやシングルコロン部分は除外される。7(0x87だけど)はリザーブ。ラベル番号0からユーザ定義。 -usage設定を呼ばずにいきなり3以降を使う場合は、ラベル0でプリセット5。ラベル1でプリセット6が指定されたものと見なす。 -レガシーなコマンドラインの渡し方: --シングルコロンを全く含まずに書く。そういうものについてもこのコマンドは使える。 --ダブルコロンはシングルコロンへエスケープ。トリプルコロンは・・・未定義。エスケープすればレガシーで扱える。 --echo abc::def -> "echo abc:def" -calcはこれを使っていいのなら、opt4でラベル番号1-1を使えば、もはや計算の必要がない。 -in:abc in:def in:ghi と書いてもいいし、in[0]:abc in[2]:ghi in[1]:def と書いてもいい。 -フォーマット記述例: --cpy [6 0 0 0x8a 0x8c 4] -- ボツ [6 !5 0 10 (!5 ...) 12 4] ---最初の0は不一致をin:に見なすという意味 ---bit0:1=省略可能 ---bit1:1=複数指定可能 ---bit2-:プリセット番号 { (user), (term), in, out } 15番までは1バイト --nask [6 0 0 0x88 0x8d 1 3 "list" 4] [3] -- ボツ [6 !5 !5 8 13 (!5 ...) 1 3 "list" 0 3 "\1-\2" (!5 ...) 4] -これなら本仕様に格上げしてもいいかもしれない。そしたら番号6だな。 -ファイルにデフォルト値があることが珍しくないか? --echo [6 6 0 3 0x7fff 2 1] [5 0 3 2] [3] -- ボツ 86 86 03 f7 ff f2 15 03 23 - 9B+3B=12B -- ボツ [6 0 3 1fb 2] [5 0 3 2] [3] 86 03 df b2 50 32 30 - 7B+3B=10B -おっとしまった。これだと説明がない。input file, output file。それ以外の説明を付けたい場合はどうする?!5でつなげる。長さ指定の後に文字列。ユーザ定義には説明フィールドが必要。0x01はラベル名がはいる。0x02はfile。 -0回以上の繰り返し。 [in:input-file] [in:input-file]... -1回以上の繰りかえし。 in:input-file [in:input-file]... -普通のgh4のAPI拡張 --3c-3f : 40, 80, 100, 200 --1f0-1f7 : 1K, 2K, 4K, 8K, 16K, 32K, 64K, 128K --1f8-1ff : 256K, 512K, 1M, 2M, 4M, 8M, 16M, 32M --0fc0-0fc5 : 64M, 128M, 256M, 512M, 1G, 2G --これにともない6_1f8を6_1e8に。 -32bitレジスタ番号の0x34以降はリザーブにする。8bit形式のみ。 --38-3f : 8bitレジスタ --34 : void --35 : バイトアラインで4バイト定数 ---- -ボツ案 -サブパケット0:NOP -サブパケット1:サブパケット終端 -opt0:usage設定。コマンド名以降から、というかオプション説明だけでいい。このサブパケットがコマンドライン取得APIの最初に来るように期待されている。ラベル番号の定義にもなっている。これは複雑なフォーマットを取る。.textの中か、.dataの中の定数でなければいけない。 -opt1:usage表示してexit(1)。 -opt2:ラベル番号を指定してfopenを実施。opt>>3とslotが後続。 -opt3:ラベル番号を指定して存在を検出。主に省略可能なものや複数可能なものをチェック。フラグ代わりにもなる。(!6_0) -opt4:ラベル番号を指定して整数値を取得。マイナスもOK。(!6_0) -opt5:ラベル番号を指定してフラグ。これはコロンがなくてもいい。(!6_0) コロン以降に何かあればエラー。 -opt6:ラベル番号を指定して文字列を取得。(!6_x) -opt7:usage表示だけ。 -defaultは? --省略可能、複数可能なときだけ検出フィールドやデフォルトフィールド --opt2:ラベル番号, 検出用(!6_0), opt>>3とslotが後続, !5でデフォルトなし。 --opt4:ラベル番号, 検出用(!6_0), (!6_0), 5!でデフォルトなし。 * こめんと欄 #comment