aboutsummaryrefslogtreecommitdiff
path: root/toys/other
diff options
context:
space:
mode:
Diffstat (limited to 'toys/other')
-rw-r--r--toys/other/base64.c46
1 files changed, 37 insertions, 9 deletions
diff --git a/toys/other/base64.c b/toys/other/base64.c
index ef7854a1..25e37d41 100644
--- a/toys/other/base64.c
+++ b/toys/other/base64.c
@@ -5,6 +5,7 @@
* No standard
USE_BASE64(NEWTOY(base64, "diw#<0=76[!dw]", TOYFLAG_USR|TOYFLAG_BIN))
+USE_BASE32(NEWTOY(base32, "diw#<0=76[!dw]", TOYFLAG_USR|TOYFLAG_BIN))
config BASE64
bool "base64"
@@ -17,6 +18,18 @@ config BASE64
-d Decode
-i Ignore non-alphabetic characters
-w Wrap output at COLUMNS (default 76 or 0 for no wrap)
+
+config BASE32
+ bool "base32"
+ default y
+ help
+ usage: base32 [-di] [-w COLUMNS] [FILE...]
+
+ Encode or decode in base32.
+
+ -d Decode
+ -i Ignore non-alphabetic characters
+ -w Wrap output at COLUMNS (default 76 or 0 for no wrap)
*/
#define FOR_base64
@@ -24,8 +37,9 @@ config BASE64
GLOBALS(
long w;
-
unsigned total;
+ unsigned n; // number of bits used in encoding. 5 for base32, 6 for base64
+ unsigned align; // number of bits to align to
)
static void wraputchar(int c, int *x)
@@ -38,7 +52,7 @@ static void wraputchar(int c, int *x)
};
}
-static void do_base64(int fd, char *name)
+static void do_base_n(int fd, char *name)
{
int out = 0, bits = 0, x = 0, i, len;
char *buf = toybuf+128;
@@ -49,8 +63,8 @@ static void do_base64(int fd, char *name)
// If no more data, flush buffer
if (!(len = xread(fd, buf, sizeof(toybuf)-128))) {
if (!FLAG(d)) {
- if (bits) wraputchar(toybuf[out<<(6-bits)], &x);
- while (TT.total&3) wraputchar('=', &x);
+ if (bits) wraputchar(toybuf[out<<(TT.n-bits)], &x);
+ while (TT.total&TT.align) wraputchar('=', &x);
if (x) xputc('\n');
}
@@ -62,8 +76,8 @@ static void do_base64(int fd, char *name)
if (buf[i] == '=') return;
if ((x = stridx(toybuf, buf[i])) != -1) {
- out = (out<<6) + x;
- bits += 6;
+ out = (out<<TT.n) + x;
+ bits += TT.n;
if (bits >= 8) {
putchar(out >> (bits -= 8));
out &= (1<<bits)-1;
@@ -78,8 +92,8 @@ static void do_base64(int fd, char *name)
} else {
out = (out<<8) + buf[i];
bits += 8;
- while (bits >= 6) {
- wraputchar(toybuf[out >> (bits -= 6)], &x);
+ while (bits >= TT.n) {
+ wraputchar(toybuf[out >> (bits -= TT.n)], &x);
out &= (1<<bits)-1;
}
}
@@ -89,6 +103,20 @@ static void do_base64(int fd, char *name)
void base64_main(void)
{
+ TT.n = 6;
+ TT.align = 3;
base64_init(toybuf);
- loopfiles(toys.optargs, do_base64);
+ loopfiles(toys.optargs, do_base_n);
+}
+
+#define CLEANUP_base64
+#define FOR_base32
+#include "generated/flags.h"
+
+void base32_main(void)
+{
+ TT.n = 5;
+ TT.align = 7;
+ base32_init(toybuf);
+ loopfiles(toys.optargs, do_base_n);
}