サマリ:base64のソースコードリーディング6回目
base64を読もう⑥
decodeがそろそろ終わりそうです。
if (k == 1 && ctx.i == 0)
break;
ctx.iが0になるのは、 base_decode_ctx_init (&ctx);で初期化されたままの状態である場合。kが1になるのはファイルの終端に達した場合の2回目のループなので、「ファイルの終端に達し、コンテキストに何も入っていない場合はここで終了する」。
n = DEC_BLOCKSIZE;
ok = base_decode_ctx (&ctx, inbuf, (k == 0 ? sum : 0), outbuf, &n);
DEC_BLOCKSIZEは前述の通り、6828が既定。
base_decode_ctxは../gnulib/lib/base64.hで定義され、../gnulib/lib/base64.cに実体がある。
if (fwrite (outbuf, 1, n, out) < n)
error (EXIT_FAILURE, errno, _("write error"));
if (!ok)
error (EXIT_FAILURE, 0, _("invalid input"));
fwriteはoutbufから1バイト単位でnバイトをoutストリームに書き込む。エラーが生じた場合はnより小さな値が返される。
以上でデコード処理は終わり。
###理解できたこと
ここでの処理はファイル(もしくは標準入力)からデータを読み込み、ファイル(もしくは標準出力)にデータを出力するのみ。それ以外はgnulibで全てを賄っている。
###宿題
base_decode_ctxの詳細を少し追う。
以上。今日から4月。今日から入社の若者をたくさん見ました。辛いこともいっぱいあるけど、楽しいこともたくさんあるので頑張ってください。