LoginSignup
1
1

More than 5 years have passed since last update.

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個バージョン。
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1