Отделено отсюда:
viewtopic.php?f=7&t=2762

> -- Илья Ермаков писал(а):
> Например, использование break внутри цикла...Пример из практики: хотел портировать готовую реализацию Base64 с Си.Стандартприводит в качестве примера:> -- Цитата:
> An ISO C99 implementation of Base64 encoding and decoding that isbelieved to follow all recommendations in this RFC is available from:   This code is not normative....Когда увидел, понял, что дляменяспокойнее написать с нуля самому (с упором на читабельность), чем портировать тот код, которому надо либо "believe", либо сломать моск при проверянии. Процедуры кодирования:
http://cvs.savannah.gnu.org/viewvc/gnul ... ision=1.14
(пробелы с табуляциями намешаны, отступы при копировании испортились)## Код:
```
/* Base64 encode IN array of size INLEN into OUT array of size OUTLEN.
   If OUTLEN is less than BASE64_LENGTH(INLEN), write as many bytes as
   possible.  If OUTLEN is larger than BASE64_LENGTH(INLEN), also zero
   terminate the output buffer. */
void
base64_encode (const char *restrict in, size_t inlen,
          char *restrict out, size_t outlen)
{
  static const char b64str[64] =
    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

  while (inlen && outlen)
    {
      *out++ = b64str[(to_uchar (in[0]) >> 2) & 0x3f];
      if (!--outlen)
   break;
      *out++ = b64str[((to_uchar (in[0]) << 4)
             + (--inlen ? to_uchar (in[1]) >> 4 : 0))
            & 0x3f];
      if (!--outlen)
   break;
      *out++ =
   (inlen
    ? b64str[((to_uchar (in[1]) << 2)
         + (--inlen ? to_uchar (in[2]) >> 6 : 0))
        & 0x3f]
    : '=');
      if (!--outlen)
   break;
      *out++ = inlen ? b64str[to_uchar (in[2]) & 0x3f] : '=';
      if (!--outlen)
   break;
      if (inlen)
   inlen--;
      if (inlen)
   in += 3;
    }

  if (outlen)
    *out = '\0';
}
```
что получилось у меня:## Код:
```
PROCEDURE Encode* (IN x: ARRAY OF SHORTCHAR; VAR y: ARRAY OF SHORTCHAR; VAR p, q: INTEGER; len: INTEGER);
      VAR   t, n: INTEGER;
   BEGIN
      ASSERT(len >= 0, 20);
      n := len DIV 3;
      WHILE n > 0 DO
         (* Encode24bit *)
         t := ORD(x[p + 2]) + ASH(ORD(x[p + 1]), 8) + ASH(ORD(x[p]), 16); INC(p, 3);
         y[q] := ctable[ASH(t, -18)]; INC(q);
         y[q] := ctable[ORD(BITS(ASH(t, -12)) * {0..5})]; INC(q);
         y[q] := ctable[ORD(BITS(ASH(t, -6)) * {0..5})]; INC(q);
         y[q] := ctable[ORD(BITS(t) * {0..5})]; INC(q);
         DEC(n)
      END;
      CASE len MOD 3 OF
      | 0:
      | 1:   (* Encode8bit *)
         t := 0 + ASH(0, 8) + ASH(ORD(x[p]), 16); INC(p);
         y[q] := ctable[ASH(t, -18)]; INC(q);
         y[q] := ctable[ORD(BITS(ASH(t, -12)) * {0..5})]; INC(q);
         y[q] := ctable[64]; INC(q);
         y[q] := ctable[64]; INC(q)
      | 2:   (* Encode16bit *)
         t := 0 + ASH(ORD(x[p + 1]), 8) + ASH(ORD(x[p]), 16); INC(p, 2);
         y[q] := ctable[ASH(t, -18)]; INC(q);
         y[q] := ctable[ORD(BITS(ASH(t, -12)) * {0..5})]; INC(q);
         y[q] := ctable[ORD(BITS(ASH(t, -6)) * {0..5})]; INC(q);
         y[q] := ctable[64]; INC(q)
      END
   END Encode;
```
