Mercurial > hg > toybox
annotate toys/posix/uuencode.c @ 902:36993c59a3d3
Tighten up lsusb, default to "y".
author | Rob Landley <rob@landley.net> |
---|---|
date | Tue, 14 May 2013 20:42:54 -0500 |
parents | 357b31ae2f04 |
children | c4c9267467f8 |
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 |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
31 // base64 table |
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 p = toybuf; |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
34 for (i = 'A'; i != ':'; i++) { |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
35 if (i == 'Z'+1) i = 'a'; |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
36 if (i == 'z'+1) i = '0'; |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
37 *(p++) = i; |
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 *(p++) = '+'; |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
40 *(p++) = '/'; |
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 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
|
43 for (;;) { |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
44 char *in; |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
45 |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
46 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
|
47 |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
48 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
|
49 in = buf; |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
50 |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
51 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
|
52 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
|
53 |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
54 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
|
55 |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
56 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
|
57 int out; |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
58 |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
59 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
|
60 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
|
61 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
|
62 } |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
63 } |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
64 xputc('\n'); |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
65 } |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
66 xputs(m ? "====" : "end"); |
4b9b7c9a194f
Finish uuencode cleanup, default y, move it from pending to posix.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
67 } |