search
LoginSignup
1

More than 5 years have passed since last update.

Organization

libgit2のbuffer関連の関数

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

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
What you can do with signing up
1