annotate toys/pending/uuencode.c @ 823:0429050a224b

uuencode and uudecode by Erich Plondke.
author Rob Landley <rob@landley.net>
date Mon, 18 Mar 2013 09:11:21 -0500
parents
children 1fdaba9a7124
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
823
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
1 /* uuencode.c - uuencode / base64 encode
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
2 *
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
3 * Copyright 2013 Erich Plondke <toybox@erich.wreck.org>
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
4 *
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
5 * See http://pubs.opengroup.org/onlinepubs/9699919799/utilities/uuencode.html
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
6
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
7 USE_UUENCODE(NEWTOY(uuencode, "<1>2m", TOYFLAG_USR|TOYFLAG_BIN))
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
8
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
9 config UUENCODE
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
10 bool "uuencode"
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
11 default n
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
12 help
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
13 usage: uuencode [-m] [file] encode-filename
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
14
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
15 Uuencode or (with -m option) base64-encode stdin or [file],
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
16 with encode-filename in the output, which is sent to stdout.
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
17 */
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
18
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
19 #define FOR_uuencode
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
20 #include "toys.h"
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
21
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
22
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
23
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
24 static void uuencode_b64_3bytes(char *out, const char *in, int bytes)
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
25 {
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
26 static const char *table = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
27 "abcdefghijklmnopqrstuvwxyz"
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
28 "0123456789+/";
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
29 unsigned int i,x=0;
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
30 for (i = 0; i < bytes; i++) {
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
31 x |= (in[i] & 0x0ff) << (8*(2-i));
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
32 }
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
33 out[0] = table[(x>>(3*6)) & 0x3f];
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
34 out[1] = table[(x>>(2*6)) & 0x3f];
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
35 out[2] = table[(x>>(1*6)) & 0x3f];
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
36 out[3] = table[(x>>(0*6)) & 0x3f];
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
37 if (bytes <= 1) out[2] = '=';
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
38 if (bytes <= 2) out[3] = '=';
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
39 }
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
40
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
41 static void uuencode_b64_line(char *out, const char *in, int len)
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
42 {
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
43 while (len > 0) {
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
44 uuencode_b64_3bytes(out,in,len < 3 ? len : 3);
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
45 xprintf("%c%c%c%c",out[0],out[1],out[2],out[3]);
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
46 in += 3;
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
47 len -= 3;
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
48 };
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
49 xprintf("\n");
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
50 }
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
51
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
52 static void uuencode_b64(int fd, const char *name)
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
53 {
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
54 int len;
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
55 char *inbuf = toybuf;
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
56 char *outbuf = toybuf+64;
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
57 xprintf("begin-base64 744 %s\n",name);
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
58 do {
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
59 len = xread(fd,inbuf,48);
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
60 uuencode_b64_line(outbuf,inbuf,len);
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
61 } while (len > 0);
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
62 xprintf("====\n");
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
63 }
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
64
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
65
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
66 static void uuencode_uu_3bytes(char *out, const char *in)
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
67 {
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
68 unsigned int i,x=0;
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
69 for (i = 0; i <= 2; i++) {
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
70 x |= (in[i] & 0x0ff) << (8*(2-i));
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
71 }
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
72 for (i = 0; i <= 3; i++) {
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
73 out[i] = 32 + ((x >> (6*(3-i))) & 0x3f);
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
74 }
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
75 }
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
76
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
77 static void uuencode_uu_line(char *out, const char *in, int len)
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
78 {
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
79 int i;
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
80 if (len == 0) {
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
81 xprintf("`\n");
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
82 return;
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
83 }
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
84 xprintf("%c",len+32);
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
85 for (i = 0; i < len; i += 3) {
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
86 uuencode_uu_3bytes(out,in+i);
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
87 xprintf("%c%c%c%c",out[0],out[1],out[2],out[3]);
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
88 }
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
89 xprintf("\n");
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
90 }
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
91
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
92 static void uuencode_uu(int fd, const char *name)
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
93 {
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
94 int len;
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
95 char *inbuf = toybuf;
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
96 char *outbuf = toybuf+64;
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
97 xprintf("begin 744 %s\n",name);
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
98 do {
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
99 len = xread(fd,inbuf,45);
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
100 uuencode_uu_line(outbuf,inbuf,len);
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
101 } while (len > 0);
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
102 xprintf("end\n");
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
103 }
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
104
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
105 void uuencode_main(void)
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
106 {
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
107 char *encode_filename = toys.optargs[0];
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
108 int fd = 0; /* STDIN */
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
109
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
110 if (toys.optc == 2) {
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
111 fd = xopen(toys.optargs[0],O_RDONLY); // dies if error
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
112 encode_filename = toys.optargs[1];
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
113 }
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
114 if (toys.optflags & FLAG_m) uuencode_b64(fd,encode_filename);
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
115 else uuencode_uu(fd,encode_filename);
0429050a224b uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff changeset
116 }