今日も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 コメント:
コメントを投稿