cliarg: コマンドライン引数取得(WASI / LLVM)
目的:
cliarg_count/cliarg_getで argv を読み出します。
実装(アルゴリズム):
- wasm は WASI
args_sizes_get/args_getを使います。 - llvm は Linux
/proc/self/cmdlineを syscall で読み、互換args_sizes_get/args_getを実装します。 - NUL 終端の文字列を [len][bytes] 形式の str にコピーします。
注意(重要):
- WASI ターゲット専用です(wasm では使用できません)。
cliarg_get/cliarg_programは返り値のstrを新しく確保します。- 内部の一時バッファは各呼び出し内で解放します。
- argv[0] はプログラム名相当です。
計算量:
- 引数取得は O(total_bytes)
cstr_len: NUL 終端文字列の長さを求める
目的:
MemPtr<u8>で与えられた C 文字列の長さを返します。
実装(アルゴリズム):
- 1 バイトずつ読み、0 に達したら停止します。
注意(重要):
pは NUL 終端済みの有効なバイト列を指している必要があります。
計算量:
- O(n)
cstr_len: 使い方の最小例
cstr_lenの典型的な使い方を最小構成で示します。- 値を返す関数は結果の受け取り方も合わせて確認できます。
- 例は用途が伝わる最短の呼び出しに絞っています。
- 境界条件や詳細な正当性検証は専用テストで扱います。
TESTskip
#entry main
#target std
#import "std/env/cliarg" as *
#import "core/mem" as *
fn main <()*>()> ():
cstr_len mem_ptr_wrap 0;cstr_to_str: NUL 終端文字列を str にコピーする
目的:
MemPtr<u8>から NUL 終端文字列を読み取り、独立したstrにコピーします。
実装(アルゴリズム):
- まず
cstr_lenで長さを数え、[len][bytes]形式の新領域へ転写します。
注意(重要):
- 呼び出しごとに新しい領域を確保します。
- 返り値は元の C 文字列の寿命と独立です。
計算量:
- O(n)
cstr_to_str: 使い方の最小例
cstr_to_strの典型的な使い方を最小構成で示します。- 値を返す関数は結果の受け取り方も合わせて確認できます。
- 例は用途が伝わる最短の呼び出しに絞っています。
- 境界条件や詳細な正当性検証は専用テストで扱います。
TESTskip
#entry main
#target std
#import "std/env/cliarg" as *
#import "core/mem" as *
fn main <()*>()> ():
cstr_to_str mem_ptr_wrap 0;cliarg_count: 引数の個数を返す
目的:
- argc を返します(argv[0] を含みます)。
実装(アルゴリズム):
- args_sizes_get で argc を取得します。
注意(重要):
- 失敗時は 0 を返します。
計算量:
- O(1)
cliarg_count: 使い方の最小例
cliarg_countの典型的な使い方を最小構成で示します。- 値を返す関数は結果の受け取り方も合わせて確認できます。
- 例は用途が伝わる最短の呼び出しに絞っています。
- 境界条件や詳細な正当性検証は専用テストで扱います。
TESTskip
#entry main
#target std
#import "std/env/cliarg" as *
fn main <()*>()> ():
cliarg_count ();cliarg_get: 指定 index の引数を取得する
目的:
- idx が範囲内なら Some(str)、範囲外なら None を返します。
実装(アルゴリズム):
- args_sizes_get/args_get を呼び出し、argv を取得します。
- argv[idx] を NUL 終端として読み取り、str にコピーします。
注意(重要):
- idx < 0 は None になります。
- 取得ごとにメモリを確保します。
計算量:
- O(total_bytes + len)
cliarg_get: 使い方の最小例
cliarg_getの典型的な使い方を最小構成で示します。- 値を返す関数は結果の受け取り方も合わせて確認できます。
- 例は用途が伝わる最短の呼び出しに絞っています。
- 境界条件や詳細な正当性検証は専用テストで扱います。
TESTskip
#entry main
#target std
#import "std/env/cliarg" as *
fn main <()*>()> ():
cliarg_get 0;cliarg_program: argv[0] を返す
目的:
- プログラム名相当の引数を返します。
実装(アルゴリズム):
- cliarg_get 0 を呼びます。
注意(重要):
- 取得に失敗した場合は None です。
計算量:
- O(total_bytes + len)
cliarg_program: 使い方の最小例
cliarg_programの典型的な使い方を最小構成で示します。- 値を返す関数は結果の受け取り方も合わせて確認できます。
- 例は用途が伝わる最短の呼び出しに絞っています。
- 境界条件や詳細な正当性検証は専用テストで扱います。
TESTskip
#entry main
#target std
#import "std/env/cliarg" as *
fn main <()*>()> ():
cliarg_program ();