Mercurial > hg > toybox
annotate toys/pending/uudecode.c @ 835:89c65a45245a
Incremental cleanup of uudecode.
author | Rob Landley <rob@landley.net> |
---|---|
date | Wed, 27 Mar 2013 00:52:17 -0500 |
parents | 1c61f2827bf8 |
children | a60c572a8218 |
rev | line source |
---|---|
823
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1 /* uudecode.c - uudecode / base64 decode |
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/uudecode.html |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
6 |
835
89c65a45245a
Incremental cleanup of uudecode.
Rob Landley <rob@landley.net>
parents:
834
diff
changeset
|
7 USE_UUDECODE(NEWTOY(uudecode, ">1o:", TOYFLAG_USR|TOYFLAG_BIN|TOYFLAG_UMASK)) |
823
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 UUDECODE |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
10 bool "uudecode" |
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 |
834
1c61f2827bf8
Fix the USE() macro around NEWTOY, tweak help text, remove unnecessary wrapper, tweak whitespace and curly brackets.
Rob Landley <rob@landley.net>
parents:
828
diff
changeset
|
13 usage: uudecode [-o OUTFILE] [INFILE] |
823
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
14 |
834
1c61f2827bf8
Fix the USE() macro around NEWTOY, tweak help text, remove unnecessary wrapper, tweak whitespace and curly brackets.
Rob Landley <rob@landley.net>
parents:
828
diff
changeset
|
15 Decode file from stdin (or INFILE). |
1c61f2827bf8
Fix the USE() macro around NEWTOY, tweak help text, remove unnecessary wrapper, tweak whitespace and curly brackets.
Rob Landley <rob@landley.net>
parents:
828
diff
changeset
|
16 |
1c61f2827bf8
Fix the USE() macro around NEWTOY, tweak help text, remove unnecessary wrapper, tweak whitespace and curly brackets.
Rob Landley <rob@landley.net>
parents:
828
diff
changeset
|
17 -o write to OUTFILE instead of filename in header |
823
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 |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
20 #define FOR_uudecode |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
21 #include "toys.h" |
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 GLOBALS( |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
24 char *o; |
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 |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
27 /* |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
28 * Turn a character back into a value. |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
29 * The smallest valid character is 0x2B ('+') |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
30 * The biggest valid character is 0x7A ('z') |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
31 * We can make a table of 16*5 entries to cover 0x2B - 0x7A |
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 |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
34 static inline signed char uudecode_b64_1byte(char in) |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
35 { |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
36 char ret; |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
37 static const signed char table[16*5] = { |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
38 /* '+' (0x2B) is 62, '/'(0x2F) is 63, rest invalid */ |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
39 62, -1, -1, -1, 63, |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
40 /* '0'-'9' are values 52-61, rest of 0x3A - 0x3F is invalid, = is special... */ |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
41 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
42 /* '@' is invalid, 'A'-'Z' are values 0-25, 0x5b - 0x5F are invalid */ |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
43 -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
44 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
45 /* '`' is invalid, 'a'-'z' are values 26-51, 0x7B - 0x7F are invalid */ |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
46 -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
47 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51 |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
48 }; |
834
1c61f2827bf8
Fix the USE() macro around NEWTOY, tweak help text, remove unnecessary wrapper, tweak whitespace and curly brackets.
Rob Landley <rob@landley.net>
parents:
828
diff
changeset
|
49 |
823
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
50 in &= 0x7f; |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
51 if (in < '+') return -1; |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
52 if (in > 'z') return -1; |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
53 in -= '+'; |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
54 ret = table[in]; |
834
1c61f2827bf8
Fix the USE() macro around NEWTOY, tweak help text, remove unnecessary wrapper, tweak whitespace and curly brackets.
Rob Landley <rob@landley.net>
parents:
828
diff
changeset
|
55 |
823
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
56 return ret; |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
57 }; |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
58 |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
59 |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
60 /* Returns length put in out */ |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
61 static int uudecode_b64_4bytes(char *out, const char *in) |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
62 { |
834
1c61f2827bf8
Fix the USE() macro around NEWTOY, tweak help text, remove unnecessary wrapper, tweak whitespace and curly brackets.
Rob Landley <rob@landley.net>
parents:
828
diff
changeset
|
63 unsigned int i, x=0; |
1c61f2827bf8
Fix the USE() macro around NEWTOY, tweak help text, remove unnecessary wrapper, tweak whitespace and curly brackets.
Rob Landley <rob@landley.net>
parents:
828
diff
changeset
|
64 signed char b0, b1, b2, b3; |
823
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
65 int len = 3; |
834
1c61f2827bf8
Fix the USE() macro around NEWTOY, tweak help text, remove unnecessary wrapper, tweak whitespace and curly brackets.
Rob Landley <rob@landley.net>
parents:
828
diff
changeset
|
66 |
823
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
67 b0 = uudecode_b64_1byte(in[0]); |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
68 b1 = uudecode_b64_1byte(in[1]); |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
69 b2 = uudecode_b64_1byte(in[2]); |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
70 b3 = uudecode_b64_1byte(in[3]); |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
71 if ((b1 < 0) || (b0 < 0)) return 0; |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
72 if (b3 < 0) len--; |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
73 if (b2 < 0) len--; |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
74 x = ((b0 & 0x3f)<<18) | ((b1 & 0x3f)<<12) | ((b2 & 0x3f) << 6) | (b3 & 0x3f); |
834
1c61f2827bf8
Fix the USE() macro around NEWTOY, tweak help text, remove unnecessary wrapper, tweak whitespace and curly brackets.
Rob Landley <rob@landley.net>
parents:
828
diff
changeset
|
75 for (i = 0; i < len; i++) *out++ = (x>>(8*(2-i))) & 0x0ff; |
1c61f2827bf8
Fix the USE() macro around NEWTOY, tweak help text, remove unnecessary wrapper, tweak whitespace and curly brackets.
Rob Landley <rob@landley.net>
parents:
828
diff
changeset
|
76 |
823
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
77 return 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 |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
80 static void uudecode_b64_line(int ofd, const char *in, int ilen) |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
81 { |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
82 int olen; |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
83 char out[4]; |
834
1c61f2827bf8
Fix the USE() macro around NEWTOY, tweak help text, remove unnecessary wrapper, tweak whitespace and curly brackets.
Rob Landley <rob@landley.net>
parents:
828
diff
changeset
|
84 |
823
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
85 while (ilen >= 4) { |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
86 olen = uudecode_b64_4bytes(out,in); |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
87 xwrite(ofd,out,olen); |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
88 in += 4; |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
89 ilen -= 4; |
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 |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
93 static void uudecode_b64(int ifd, int ofd) |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
94 { |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
95 int len; |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
96 char *line; |
834
1c61f2827bf8
Fix the USE() macro around NEWTOY, tweak help text, remove unnecessary wrapper, tweak whitespace and curly brackets.
Rob Landley <rob@landley.net>
parents:
828
diff
changeset
|
97 |
823
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
98 while ((line = get_line(ifd)) != NULL) { |
834
1c61f2827bf8
Fix the USE() macro around NEWTOY, tweak help text, remove unnecessary wrapper, tweak whitespace and curly brackets.
Rob Landley <rob@landley.net>
parents:
828
diff
changeset
|
99 if ((len = strlen(line)) < 4) continue; |
1c61f2827bf8
Fix the USE() macro around NEWTOY, tweak help text, remove unnecessary wrapper, tweak whitespace and curly brackets.
Rob Landley <rob@landley.net>
parents:
828
diff
changeset
|
100 if (!strncmp(line, "====", 4)) return; |
823
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
101 uudecode_b64_line(ofd,line,len); |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
102 free(line); |
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 |
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 static void uudecode_uu_4bytes(char *out, const char *in, int len) |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
108 { |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
109 unsigned int i,x=0; |
834
1c61f2827bf8
Fix the USE() macro around NEWTOY, tweak help text, remove unnecessary wrapper, tweak whitespace and curly brackets.
Rob Landley <rob@landley.net>
parents:
828
diff
changeset
|
110 |
1c61f2827bf8
Fix the USE() macro around NEWTOY, tweak help text, remove unnecessary wrapper, tweak whitespace and curly brackets.
Rob Landley <rob@landley.net>
parents:
828
diff
changeset
|
111 for (i = 0; i < 4; i++) x |= ((in[i] - 32) & 0x03f) << (6*(3-i)); |
823
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
112 if (len > 3) len = 3; |
834
1c61f2827bf8
Fix the USE() macro around NEWTOY, tweak help text, remove unnecessary wrapper, tweak whitespace and curly brackets.
Rob Landley <rob@landley.net>
parents:
828
diff
changeset
|
113 for (i = 0; i < len; i++) *out++ = x >> (8*(2-i)); |
823
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
114 } |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
115 |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
116 static void uudecode_uu_line(int ofd, const char *in) |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
117 { |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
118 int olen = in[0] - 32; |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
119 char buf[4]; |
834
1c61f2827bf8
Fix the USE() macro around NEWTOY, tweak help text, remove unnecessary wrapper, tweak whitespace and curly brackets.
Rob Landley <rob@landley.net>
parents:
828
diff
changeset
|
120 |
823
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
121 in++; |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
122 while (olen > 0) { |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
123 uudecode_uu_4bytes(buf,in,olen); |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
124 xwrite(ofd,buf,olen < 3 ? olen : 3); |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
125 olen -= 3; |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
126 in += 4; |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
127 } |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
128 } |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
129 |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
130 static void uudecode_uu(int ifd, int ofd) |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
131 { |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
132 char *line = NULL; |
834
1c61f2827bf8
Fix the USE() macro around NEWTOY, tweak help text, remove unnecessary wrapper, tweak whitespace and curly brackets.
Rob Landley <rob@landley.net>
parents:
828
diff
changeset
|
133 |
823
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
134 while ((line = get_line(ifd)) != NULL) { |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
135 if (line[0] == '`') break; |
834
1c61f2827bf8
Fix the USE() macro around NEWTOY, tweak help text, remove unnecessary wrapper, tweak whitespace and curly brackets.
Rob Landley <rob@landley.net>
parents:
828
diff
changeset
|
136 if (!strncmp(line, "end", 3)) break; |
823
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
137 if (strlen(line) < 1) break; |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
138 uudecode_uu_line(ofd,line); |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
139 free(line); |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
140 } |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
141 } |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
142 |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
143 void uudecode_main(void) |
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
144 { |
835
89c65a45245a
Incremental cleanup of uudecode.
Rob Landley <rob@landley.net>
parents:
834
diff
changeset
|
145 int ifd = 0, ofd, idx = 0; |
89c65a45245a
Incremental cleanup of uudecode.
Rob Landley <rob@landley.net>
parents:
834
diff
changeset
|
146 char *line; |
823
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
147 void (*decoder)(int ifd, int ofd) = NULL; |
835
89c65a45245a
Incremental cleanup of uudecode.
Rob Landley <rob@landley.net>
parents:
834
diff
changeset
|
148 |
89c65a45245a
Incremental cleanup of uudecode.
Rob Landley <rob@landley.net>
parents:
834
diff
changeset
|
149 if (toys.optc) ifd = xopen(*toys.optargs, O_RDONLY); |
834
1c61f2827bf8
Fix the USE() macro around NEWTOY, tweak help text, remove unnecessary wrapper, tweak whitespace and curly brackets.
Rob Landley <rob@landley.net>
parents:
828
diff
changeset
|
150 |
835
89c65a45245a
Incremental cleanup of uudecode.
Rob Landley <rob@landley.net>
parents:
834
diff
changeset
|
151 for (;;) { |
89c65a45245a
Incremental cleanup of uudecode.
Rob Landley <rob@landley.net>
parents:
834
diff
changeset
|
152 char mode[16]; |
834
1c61f2827bf8
Fix the USE() macro around NEWTOY, tweak help text, remove unnecessary wrapper, tweak whitespace and curly brackets.
Rob Landley <rob@landley.net>
parents:
828
diff
changeset
|
153 |
835
89c65a45245a
Incremental cleanup of uudecode.
Rob Landley <rob@landley.net>
parents:
834
diff
changeset
|
154 if (!(line = get_line(ifd))) error_exit("no header"); |
89c65a45245a
Incremental cleanup of uudecode.
Rob Landley <rob@landley.net>
parents:
834
diff
changeset
|
155 sscanf(line, "begin%*[ ]%15s%*[ ]%n", mode, &idx); |
89c65a45245a
Incremental cleanup of uudecode.
Rob Landley <rob@landley.net>
parents:
834
diff
changeset
|
156 if (idx) decoder = uudecode_uu; |
89c65a45245a
Incremental cleanup of uudecode.
Rob Landley <rob@landley.net>
parents:
834
diff
changeset
|
157 else { |
89c65a45245a
Incremental cleanup of uudecode.
Rob Landley <rob@landley.net>
parents:
834
diff
changeset
|
158 sscanf(line, "begin-base64%*[ ]%15s%*[ ]%n", mode, &idx); |
89c65a45245a
Incremental cleanup of uudecode.
Rob Landley <rob@landley.net>
parents:
834
diff
changeset
|
159 if (idx) decoder = uudecode_b64; |
89c65a45245a
Incremental cleanup of uudecode.
Rob Landley <rob@landley.net>
parents:
834
diff
changeset
|
160 } |
89c65a45245a
Incremental cleanup of uudecode.
Rob Landley <rob@landley.net>
parents:
834
diff
changeset
|
161 |
89c65a45245a
Incremental cleanup of uudecode.
Rob Landley <rob@landley.net>
parents:
834
diff
changeset
|
162 if (!idx) continue; |
834
1c61f2827bf8
Fix the USE() macro around NEWTOY, tweak help text, remove unnecessary wrapper, tweak whitespace and curly brackets.
Rob Landley <rob@landley.net>
parents:
828
diff
changeset
|
163 |
835
89c65a45245a
Incremental cleanup of uudecode.
Rob Landley <rob@landley.net>
parents:
834
diff
changeset
|
164 ofd = xcreate(TT.o ? TT.o : line+idx, O_WRONLY|O_CREAT|O_TRUNC, |
89c65a45245a
Incremental cleanup of uudecode.
Rob Landley <rob@landley.net>
parents:
834
diff
changeset
|
165 string_to_mode(mode, 0777^toys.old_umask)); |
89c65a45245a
Incremental cleanup of uudecode.
Rob Landley <rob@landley.net>
parents:
834
diff
changeset
|
166 free(line); |
89c65a45245a
Incremental cleanup of uudecode.
Rob Landley <rob@landley.net>
parents:
834
diff
changeset
|
167 decoder(ifd,ofd); |
89c65a45245a
Incremental cleanup of uudecode.
Rob Landley <rob@landley.net>
parents:
834
diff
changeset
|
168 break; |
89c65a45245a
Incremental cleanup of uudecode.
Rob Landley <rob@landley.net>
parents:
834
diff
changeset
|
169 } |
89c65a45245a
Incremental cleanup of uudecode.
Rob Landley <rob@landley.net>
parents:
834
diff
changeset
|
170 |
89c65a45245a
Incremental cleanup of uudecode.
Rob Landley <rob@landley.net>
parents:
834
diff
changeset
|
171 if (CFG_TOYBOX_FREE) { |
89c65a45245a
Incremental cleanup of uudecode.
Rob Landley <rob@landley.net>
parents:
834
diff
changeset
|
172 if (ifd) close(ifd); |
89c65a45245a
Incremental cleanup of uudecode.
Rob Landley <rob@landley.net>
parents:
834
diff
changeset
|
173 close(ofd); |
89c65a45245a
Incremental cleanup of uudecode.
Rob Landley <rob@landley.net>
parents:
834
diff
changeset
|
174 } |
823
0429050a224b
uuencode and uudecode by Erich Plondke.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
175 } |