サマリ:base64のソースコードリーディング8回目
base64を読もう⑧〜base_decode_ctx編〜
size_t outleft = *outlen;
bool ignore_newlines = ctx != NULL;
bool flush_ctx = false;
unsigned int ctx_i = 0;
if (ignore_newlines)
{
ctx_i = ctx->i;
flush_ctx = inlen == 0;
}
コンテキストがNULLでないならtrue、NULLならfalseを入れています。更に、コンテキストがNULLでないなら、inlenをチェックし、0ならflush_ctxにtrueを入れています。ctx->iはイニシャライザで0が設定されますから、デコード対象データ(コンテキスト)が存在する場合、*outlen > 0、ignore_newlines==true、flush_ctx == false、ctx_i==0となっているはずです。
while (true)
{
size_t outleft_save = outleft;
if (ctx_i == 0 && !flush_ctx)
{
while (true)
{
/* Save a copy of outleft, in case we need to re-parse this
block of four bytes. */
outleft_save = outleft;
if (!decode_4 (in, inlen, &out, &outleft))
break;
in += 4;
inlen -= 4;
}
}
// :
}
コンテキストが存在した場合『4バイトごとに再解析を行うために、outleftのコピーを退避しておく』。その後、4バイトをデコード対象として処理し、デコードに失敗した場合は終了する。デコードに成功した場合は、入力ストリームのポインタを4移動させる。
###理解したこと
- ここが核心に近い
###宿題
decode_4がデコードの核心なので、後で読む