メモ代わり。てきとーに。 いや、ですからてきとーですって。 2年前ぐらいにPythonあたりでメールくれた方、ごめんなさい。メール紛失してしまい無視した形になってしまいました。。。

2008年2月29日金曜日

[Apache][CodeReading] Apache2.2.8コードリーディング29日目

今日もApache2.2.8コードリーディング。
ひらメソッドでリーディング。

今日はapr_vformatterがコールしている関数群を中心に読んだ。
で、

  • NDIGローカルマクロ(apr_snprintf)/Apache2.2.8
  • HAVE_ISINFマクロ/Apache2.2.8
  • HAVE_ISNANマクロ/Apache2.2.8
  • S_NULL_LENローカルマクロ(apr_snprintf)/Apache2.2.8
  • S_NULLローカルマクロ(apr_snprintf)/Apache2.2.8
  • conv_p2_quad()/Apache2.2.8
  • conv_p2()/Apache2.2.8
らへん。

S_NULLは"(null)"っていう文字列。
S_NULL_LENはその文字列長。

メインはconv_p2_quad()とconv_p2()あたりか。

conv_p2_quad()
conv_p2_quad()は、64ビット整数を、8進表記文字列か16進表記文字列へ変換する関数。
以下、その関数。

638 static char *conv_p2_quad(apr_uint64_t num, register int nbits,
639 char format, char *buf_end, register apr_size_t *len)
640 {
641 register int mask = (1 << nbits) - 1;
642 register char *p = buf_end;
643 static const char low_digits[] = "0123456789abcdef";
644 static const char upper_digits[] = "0123456789ABCDEF";
645 register const char *digits = (format == 'X') ? upper_digits : low_digits;
646
647 if (num <= APR_UINT32_MAX)
648 return(conv_p2((apr_uint32_t)num, nbits, format, buf_end, len));
649
650 do {
651 *--p = digits[num & mask];
652 num >>= nbits;
653 }
654 while (num);
655
656 *len = buf_end - p;
657 return (p);
658 }
 

パラメータのnumを、nbits、formatの値に従って文字列に変換する。
nbitsが3の場合は8進に、nbitsが4の場合は16進表記になる。
nbitsが4の場合で、formatが'X'(大文字のX)である場合は、
0xa~0xfまでの数字に大文字が使われる。

numがINT32の範囲内であれば、conv_p2()を使用して変換する。

conv_p2()
ほとんどconv_p2_quad()と一緒。
で、以下コード。

619 static char *conv_p2(register apr_uint32_t num, register int nbits,
620 char format, char *buf_end, register apr_size_t *len)
621 {
622 register int mask = (1 << nbits) - 1;
623 register char *p = buf_end;
624 static const char low_digits[] = "0123456789abcdef";
625 static const char upper_digits[] = "0123456789ABCDEF";
626 register const char *digits = (format == 'X') ? upper_digits : low_digits;
627
628 do {
629 *--p = digits[num & mask];
630 num >>= nbits;
631 }
632 while (num);
633
634 *len = buf_end - p;
635 return (p);
636 }
 

こちらは32ビット整数を8進表記文字列か16進表記文字列に変換する関数になっている。
型が違うだけでconv_p2_quad()と一緒。


あとは特になしな感じ。



おしまい。
.

0 コメント: