サマリ: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月。今日から入社の若者をたくさん見ました。辛いこともいっぱいあるけど、楽しいこともたくさんあるので頑張ってください。