[PATCH] sharutils-4.15.2/src/uuencode.c

"Stefan Kanthak" <[email protected]> Sat, 18 Jun 2022 14:01:47 +0200
Newsgroups gmane.comp.gnu.utils
Organization Me, myself & IT
Message-ID <E744B4FD3B7949B89A8E8754644DDFBC@H270>
This is a multi-part message in MIME format.

------=_NextPart_000_05B9_01D8831B.F3247CC0
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: 7bit

Remove the almost duplicate code to process the last 1 or 2 input characters;
Access each input character only once, not twice;
Don't decrement 'in_len' AND increment 'in' inside the loop, one
loop counter is enough.
------=_NextPart_000_05B9_01D8831B.F3247CC0
Content-Type: application/octet-stream;
	name="uuencode.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
	filename="uuencode.patch"

--- old/uuencode.c=0A=
+++ new/uuencode.c=0A=
@@ -112,28 +112,33 @@=0A=
 `------------------------------------------------*/=0A=
 =0A=
 static size_t=0A=
-encode_block (char * out, unsigned char const * in, size_t in_len)=0A=
+encode_block (char * out, unsigned char * in, int in_len)=0A=
 {=0A=
   char * start =3D out;=0A=
+  unsigned char * in_end =3D in + in_len;=0A=
+  unsigned int triplet;=0A=
 =0A=
-  while (in_len >=3D 3)=0A=
+  switch (in_len % 3)=0A=
     {=0A=
-      *(out++) =3D ENC (in[0] >> 2);=0A=
-      *(out++) =3D ENC (((in[0] & 0x03) << 4) + ((in[1] >> 4) & 0x0F));=0A=
-      *(out++) =3D ENC (((in[1] & 0x0F) << 2) + ((in[2] >> 6) & 0x03));=0A=
-      *(out++) =3D ENC (in[2] & 0x3F);=0A=
-      in_len -=3D 3;=0A=
-      in +=3D 3;=0A=
+    case 1:=0A=
+      *(in_end++) =3D '\0';=0A=
+    case 2:=0A=
+      *(in_end++) =3D '\0';=0A=
     }=0A=
 =0A=
-  if (in_len > 0)=0A=
+  do=0A=
     {=0A=
-      unsigned char lc =3D (in_len > 1) ? in[1] : '\0';=0A=
-      *(out++) =3D ENC (in[0] >> 2);=0A=
-      *(out++) =3D ENC (((in[0] & 0x03) << 4) + ((lc >> 4) & 0x0F));=0A=
-      *(out++) =3D ENC ((lc & 0x0F) << 2);=0A=
-      *(out++) =3D ENC (0);=0A=
-    }=0A=
+      triplet =3D *(in++);=0A=
+      triplet <<=3D 8;=0A=
+      triplet =3D *(in++);=0A=
+      triplet <<=3D 8;=0A=
+      triplet =3D *(in++);=0A=
+=0A=
+      *(out++) =3D ENC (triplet >> 18);=0A=
+      *(out++) =3D ENC (triplet >> 12);=0A=
+      *(out++) =3D ENC (triplet >> 6);=0A=
+      *(out++) =3D ENC (triplet);=0A=
+    } while (in < in_end);=0A=
 =0A=
   return out - start;=0A=
 }=0A=

------=_NextPart_000_05B9_01D8831B.F3247CC0--