フィルタの勉強: バケットの分割

バケット(ブリッジではない)の分割にはapr_bucket_split(e)を使う。
apr_bucket_split(a)の実体(のひとつ?)。

APU_DECLARE_NONSTD(apr_status_t) apr_bucket_simple_split(apr_bucket *a,
                                                         apr_size_t point)
{
    apr_bucket *b;

    if (point > a->length) {
        return APR_EINVAL;
    }

    apr_bucket_simple_copy(a, &b);

    a->length  = point;
    b->length -= point;
    b->start  += point;

    APR_BUCKET_INSERT_AFTER(a, b);

    return APR_SUCCESS;
}

バケットaを長さpointで切り詰める。参照をずらすだけなのでメモリの操作は発生しない。
最初に見たとき「分割された後ろ側のバケットはどこにいくんだ?」と悩んだけど、たぶんリンクリストに挿入されるから、次のループで取り出せるんだと思う。