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

2008年2月27日水曜日

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

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

さて、まだApache起動直後の初期化中。
デバッグログを出力しようとしているところで、
printfのAPR版部分で、そのコア部分。

今日やったところは以下のとおり。

  • INS_CHARローカルマクロ(apr_snprintf)/Apache2.2.8
  • boolean_e列挙型/Apache2.2.8
  • NUM_BUF_SIZEローカルマクロ(apr_snprintf)/Apache2.2.8
  • apr_uint64_t/Apache2.2.8
  • apr_islowerマクロ/Apache2.2.8
  • NULローカルマクロ(apr_snprintf)/Apache2.2.8
  • apr_isdigitマクロ/Apache2.2.8
  • NUMローカルマクロ(apr_snprintf)/Apache2.2.8
  • STR_TO_DECローカルマクロ(apr_snprintf)/Apache2.2.8
らへん。

INS_CHARマクロ
バッファに1文字セットするマクロ。
中で、file_printf_flushがコールされる。
コードは、

255 #define INS_CHAR(c, sp, bep, cc) \
256 { \
257 if (sp) { \
258 if (sp >= bep) { \
259 vbuff->curpos = sp; \
260 if (flush_func(vbuff)) \
261 return -1; \
262 sp = vbuff->curpos; \
263 bep = vbuff->endpos; \
264 } \
265 *sp++ = (c); \
266 } \
267 cc++; \
268 }
 

な感じ。flush_funcは、関数へのポインタで、今回の場合は
file_printf_flush。

バッファがいっぱいになったら、file_printf_flushがコールされる。
file_printf_flush内で、バッファを出力すると、vbuffのcurposは
バッファの先頭をさすように更新されるので、262行目でspの値を
更新している。file_printf_flush内でバッファを出力しなかった場合は
curposは259行目で代入した値のままで、262行目で代入しても
値は同じ。

で、spのさしている先にc(文字)を代入している。
代入後sp++。ccの値も更新。

ccが何なのかは今のところ良く分からない。が、多分出力文字数ではないかと
思う。多分。

263行目の

263 bep = vbuff->endpos; \
 

の部分。
endposか、bepがどこかで更新されているのであれば、
ここでendposの値をbepに入れるのは分かるのだが、
少なくともINS_CHARマクロ、apr_vformatter関数では
endposも、bepも触っていないようだ。

このマクロは別のところでも使っているのだろうか・・・?

後のために、一応
  • INS_CHARマクロの263行目は必要なのか?
という疑問をメモっておく。
file_printf_flushでは触っていないが、snprintf用とかvnprintf用とかで
endposかbepどちらかが更新されるのだろうか。



apr_islower、apr_isdigit
この辺はctype.hのislower、isdigitそのまま。
#defineしているだけ。


NUMマクロ
'0'を差し引いて数字を数値にしているだけ。

STR_TO_DECマクロ
数字列をNUMマクロを使用して数値にしているだけ。


今日のところはここまで。
apr_vformatterは時間がかかりそう。。



おしまい。
.

0 コメント: