apr_psprintfはかなり楽(apache2.x系)

apacheモジュールのメンテとかをしているんだが、メモリ管理系のapahceAPIはかなり楽だ。

本来なら、変数のサイズを常に気にしてcallocしたりfreeしたりする必要があるんだが、apacheAPIを使ってリソースpoolに管理を任せたら、その辺を全く気にしなくて良い。

sprintfするのも一苦労だけど、ここでもメモリ系を考えなくて良いAPIのapr_psprintfなどがあって、sprintfの第一引数は本来メモリを割り当てておく必要があるが、その必要も無い。

例えばこんなの。↓

if (x != NULL)
    buf_len += strlen(x);
else
    buf_len += NULL_LENGTH;
if (y != NULL)
    buf_len += strlen(y);
else
    buf_len += NULL_LENGTH;
buf = calloc(buf_len + 1, sizeof(char));
if  (buf == NULL)
    return "allocate error";
sprintf(buf, "x=%s y=%s", x, y)

free(buf);

この例だとbufには元々char方のxとかyだけを使っているが、ここにアドレスとかintを使うと、桁数計算とかでcharとしてのサイズがどれだけになるかとかが非常に面倒。

しかし、APIだと上のより面倒になりそうな実装がこんな風にかけちゃう。↓

buf = (char *)apr_psprintf(apr_pool_t *p,"x=%s y=%s z=%d adr=%x", x, y, z, adr);

こんな風に、整形した文字列に必要なサイズを自動で判断しリソースプールで確保してくれる。

こんなに楽だと、C書いてることを忘れそうだ・・・