Mercurial > hg > toybox
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 |
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 } |