annotate toys/other/base64.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
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1605
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
1 /* base64.c - Encode and decode base64
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
2 *
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
3 * Copyright 2014 Rob Landley <rob@landley.net>
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
4 *
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
5 * No standard
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
6
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
7 USE_BASE64(NEWTOY(base64, "diw#<1[!dw]", TOYFLAG_USR|TOYFLAG_BIN))
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
8
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
9 config BASE64
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
10 bool "base64"
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
11 default y
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
12 help
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
13 usage: base64 [-di] [-w COLUMNS] [FILE...]
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
14
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
15 Encode or decode in base64.
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
16
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
17 -d decode
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
18 -i ignore non-alphabetic characters
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
19 -w wrap output at COLUMNS (default 76)
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
20 */
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
21
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
22 #define FOR_base64
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
23 #include "toys.h"
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
24
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
25 GLOBALS(
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
26 long columns;
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
27 )
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
28
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
29 static void do_base64(int fd, char *name)
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
30 {
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
31 int out = 0, bits = 0, x = 0, i, len;
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
32 char *buf = toybuf+128;
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
33
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
34 for (;;) {
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
35 if (!(len = xread(fd, buf, sizeof(toybuf)-128))) {
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
36 if (!(toys.optflags & FLAG_d)) {
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
37 if (bits) {
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
38 putchar(toybuf[out<<(6-bits)]);
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
39 x++;
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
40 }
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
41 while (x++&3) putchar('=');
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
42 if (x != 1) xputc('\n');
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
43 }
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
44
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
45 return;
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
46 }
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
47 for (i=0; i<len; i++) {
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
48 if (toys.optflags & FLAG_d) {
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
49 if (buf[i] == '=') return;
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
50
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
51 if ((x = stridx(toybuf, buf[i])) != -1) {
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
52 out = (out<<6) + x;
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
53 bits += 6;
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
54 if (bits >= 8) {
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
55 putchar(out >> (bits -= 8));
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
56 out &= (1<<bits)-1;
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
57 if (ferror(stdout)) perror_exit(0);
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
58 }
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
59
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
60 continue;
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
61 }
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
62 if (buf[i] == '\n' || (toys.optflags & FLAG_i)) continue;
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
63
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
64 break;
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
65 } else {
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
66 out = (out<<8) + buf[i];
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
67 bits += 8;
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
68 while (bits >= 6) {
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
69 putchar(toybuf[out >> (bits -= 6)]);
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
70 out &= (1<<bits)-1;
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
71 if (TT.columns == ++x) {
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
72 xputc('\n');
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
73 x = 0;
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
74 }
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
75 }
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
76 }
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
77 }
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
78 }
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
79 }
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
80
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
81 void base64_main(void)
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
82 {
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
83 if (!TT.columns) TT.columns = 76;
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
84
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
85 base64_init(toybuf);
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
86 loopfiles(toys.optargs, do_base64);
c4c9267467f8 Add base64.
Rob Landley <rob@landley.net>
parents:
diff changeset
87 }