バッファ内容の16進ダンプ

大好き車輪の再発明の時間がやってきました…。バッファ内容を 16 バイトごとにダンプするコード。
テストコードも書かずにざっと書き下しておもったとおりに動いたのがうれしくて、記録を残しておきたくなった。

static void dump(size_t offset, char *buf, size_t length) {
  size_t index = offset - (offset % 16);
  while(index < offset + length + 15) {
    size_t i;
    fprintf(stderr, "%08X: ", index);
    for(i = 0; i < 16; ++i) {
      size_t cur = i + index;
      if (cur < offset || offset + length <= cur)
        fprintf(stderr, "  ");
      else
        fprintf(stderr, "%02X", (unsigned char)buf[index - offset + i]);
      fprintf(stderr, "%s", (7 == i ? " - " : 15 == i ? "\n" : " "));
    }
    index += 16;
  }
}