libgit2の内部では、たまに生のメモリブロックを使います。 git_buf
構造体のポインタで関数間でデータを引き渡します。
-
buf->ptr
: データへのポインタ -
buf->asize
: 割り当てられているメモリ領域の大きさ -
buf->size
: データの量 (size <= asize)
ファイル名や、データのblobの読み込み、フィルタなどさまざまなところで登場します。ですが、ドキュメントに書かれてない関数も多数。ここでは関数の役割についての一覧しか書きませんので、詳しい関数定義はbuffer.hか、buf_text.hを参照してください。
C言語で文字列操作とかを実装するなら、これらの関数のコードをコピペすれば良さそうな気はします。GPLv2ですが。
パラメータ取得
-
git_buf_len
: buf->sizeを返す -
git_buf_cstr
: buf->ptrを返す
構造体の情報にアクセスします。が、libgit2内部のコードを見ると、直接値を参照してるコードもちらほら。
データの診断
git_buf_text_is_binary
git_buf_text_contains_nul
バッファがバイナリか、nullを含むか、の診断関数ですが、ドキュメントとは名前が変わってます。ドキュメントは_text_部がない名前で書かれてます。要注意。
git_buf_text_detect_bom
Unicode的なBOMが含まれていればそのバイト数を返します。ドキュメントにない関数。
git_buf_cmp
2つのバッファを比較します。
メモリ領域の拡張
- git_buf_grow
必要な領域がasizeよりも大きければ、この関数で大きなブロックを取得しなおします。失敗したら-1が返り、既存の領域も「不正な領域」となります。このあたりを細かくコントロールできる git_buf_try_grow
関数もあります。3つめの引数にfalseを入れると、領域は拡大してないものの、既存のデータ領域も維持されます。4つめに引数にtrueを入れると、可能な限り既存のデータをコピーするとのことですが、どう考えてもこの詳細版の関数名、あんまり名は体を表してないですよね。メモリの拡大が失敗したかどうかは、 git_buf_oom
関数で後から調べることも可能です。
テキストの編集
これらはドキュメントにない関数群です。
-
git_buf_sets
: バッファの先頭にC言語形式の文字列(const char *)を書き込みます。 -
git_buf_putc
: バッファの末尾にC言語形式の文字(char)を書き込みます。 -
git_buf_putcn
: バッファの末尾にC言語形式の文字を(char)を指定個数分書き込みます。 -
git_buf_put
: バッファの末尾にC言語形式の文字列(const char *)を指定バイト数分書き込みます。 -
git_buf_puts
: バッファの末尾にC言語形式の文字列(const char *)を書き込みます。 -
git_buf_printf
: 例のアレ -
git_buf_vprintf
: 例のアレ -
git_buf_clear
: バッファをサイズゼロに初期化します。 -
git_buf_consume
: バッファの先頭から、指定されたポインタのところまでを削除します。 -
git_buf_truncate
: バッファを指定サイズに縮めます。 -
git_buf_shorten
: バッファを指定サイズ分縮めます。 -
git_buf_rtruncate_at_char
: 特定の文字が出てくるところまでバッファを縮めます。 -
git_buf_rtrim
: バッファ末尾のスペースを削除します。 -
git_buf_cmp
: バッファの比較をします。 -
git_buf_splice
: JavaScriptでおなじみのアレ
データ変換
これもドキュメントにない関数です。
-
git_buf_encode_base64
: C言語文字列のデータをbase64にしてバッファに書き出します。 -
git_buf_decode_base64
: C言語文字列のBase64データをデコードしてバッファに書き出します。
パス名の編集
これもドキュメントにない関数です。
-
git_buf_join_n
: n個の任意個のバッファを結合します。結合時の文字を指定します。末尾に同じ文字が重ならないようにします。 -
git_buf_join
: 2個のバッファを結合します。結合時の文字を指定します。末尾に同じ文字が重ならないようにします。 -
git_buf_join3
: 上の関数の3個バージョン。