Mercurial > hg > toybox
annotate toys/posix/uuencode.c @ 1605:c4c9267467f8 draft
Add base64.
The tizen guys wanted this. Yeah, I know there's base64 code in
uuencode/uudecode, but that this has -i, input lines aren't of fixed length,
encode/decode are in same file, there's no prefix/suffix code, it always
writes to stdout... Eliminating the code duplication wouldn't be worth
the if/else I'd have to add, so I just did a new one.
Factored out the base64 table init into lib.c though: that was worth sharing.
author | Rob Landley <rob@landley.net> |
---|---|
date | Sat, 13 Dec 2014 11:58:08 -0600 |
parents | 357b31ae2f04 |
children | 1c152e2c5b27 |
rev | line source |
---|---|
831
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1 /* uuencode.c - uuencode / base64 encode |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
2 * |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
3 * Copyright 2013 Erich Plondke <toybox@erich.wreck.org> |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
4 * |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
5 * See http://pubs.opengroup.org/onlinepubs/9699919799/utilities/uuencode.html |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
6 |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
7 USE_UUENCODE(NEWTOY(uuencode, "<1>2m", TOYFLAG_USR|TOYFLAG_BIN)) |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
8 |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
9 config UUENCODE |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
10 bool "uuencode" |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
11 default y |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
12 help |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
13 usage: uuencode [-m] [file] encode-filename |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
14 |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
15 Uuencode stdin (or file) to stdout, with encode-filename in the output. |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
16 |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
17 -m base64-encode |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
18 */ |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
19 |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
20 #define FOR_uuencode |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
21 #include "toys.h" |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
22 |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
23 void uuencode_main(void) |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
24 { |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
25 char *p, *name = toys.optargs[toys.optc-1], buf[(76/4)*3]; |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
26 |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
27 int i, m = toys.optflags & FLAG_m, fd = 0; |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
28 |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
29 if (toys.optc > 1) fd = xopen(toys.optargs[0], O_RDONLY); |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
30 |
1605 | 31 base64_init(toybuf); |
831
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
32 |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
33 xprintf("begin%s 744 %s\n", m ? "-base64" : "", name); |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
34 for (;;) { |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
35 char *in; |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
36 |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
37 if (!(i = xread(fd, buf, m ? sizeof(buf) : 45))) break; |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
38 |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
39 if (!m) xputc(i+32); |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
40 in = buf; |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
41 |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
42 for (in = buf; in-buf < i; ) { |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
43 int j, x, bytes = i - (in-buf); |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
44 |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
45 if (bytes > 3) bytes = 3; |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
46 |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
47 for (j = x = 0; j<4; j++) { |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
48 int out; |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
49 |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
50 if (j < bytes) x |= (*(in++) & 0x0ff) << (8*(2-j)); |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
51 out = (x>>((3-j)*6)) & 0x3f; |
853
357b31ae2f04
uuencode tweak: output a non-whitespace character for 0 in traditional mode.
Rob Landley <rob@landley.net>
parents:
831
diff
changeset
|
52 xputc(m ? (j > bytes ? '=' : toybuf[out]) : (out ? out + 0x20 : 0x60)); |
831
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
53 } |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
54 } |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
55 xputc('\n'); |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
56 } |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
57 xputs(m ? "====" : "end"); |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
58 } |