Link Search Menu Expand Document

サマリ:base64のソースコードリーディング5回目

base64を読もう⑤

                if (isbase (inbuf[sum + i]) || inbuf[sum + i] == '=')
                  i++;
                else
                  memmove (inbuf + sum + i, inbuf + sum + i + 1, --n - i);

isbaseがbase64で使用できる文字列か否かを判別する関数であるところまでは来た。=isbaseでは判別されない(FALSE)が、必要なので真値となる。

memmoveは使用できない文字列を潰して前詰めしている。これにより後ろにできた空隙を前述のfreadで埋め直している。なるほど、一回にブロック単位(まとまり)で扱うことができ、なおかつ、文字列に制限がある場合は、こうやって詰めれば良いのだろう。

ようやく先へ。

      /* The following "loop" is usually iterated just once.
         However, when it processes the final input buffer, we want
         to iterate it one additional time, but with an indicator
         telling it to flush what is in CTX.  */
      for (k = 0; k < 1 + !!feof (in); k++)
        {
          if (k == 1 && ctx.i == 0)
            break;
          n = DEC_BLOCKSIZE;
          ok = base_decode_ctx (&ctx, inbuf, (k == 0 ? sum : 0), outbuf, &n);

          if (fwrite (outbuf, 1, n, out) < n)
            error (EXIT_FAILURE, errno, _("write error"));

          if (!ok)
            error (EXIT_FAILURE, 0, _("invalid input"));
        }

『次のループは通常は1度しか使われない。しかしながら、入力の最後には1度だけ追加で回したいので、ctxの何をフラッシュすれば良いのかインジケータが教えてくれる』とある。ちょっと日本語でお願いします。

k < 1 + !!feof (in)は難解だ。入力のin終端に達していなければfeof(in)は0を返し、!feof(in)は1、!!feof(in)は0を返す(=入力が終端に達していなければ0を返す)。逆に入力のin終端に達していればfeof(in)は0以外を返し、!feof(in)は0、!!feof(in)は1を返す(=入力が終端に達していれば1を返す)。

we can treat ! as not. So if number is non-zero(either +ve or -Ve) it returns Zero. If it is zero, it return 1. [http://stackoverflow.com/questions/22855483/using-exclamation-marks-in-c:title]

なるほど。コメントの意味が理解できた。それにしても!!は有用。賢い子。

###理解できたこと

  • 数値に!をつけることで、0以外は1に、1は0にする
  • !!はできる子

###宿題

以上。

そろそろ春ですね。春はぽかぽか陽気が一番です。優しい日和になりますように。


Back to top

Copyright © 2021- Akira Otaka All rights reserved.