[git commit] libbb/pw_ascii64.c: add forgotten source file

Denys Vlasenko vda.linux at googlemail.com
Sun Jul 6 22:04:10 UTC 2025


commit: https://git.busybox.net/busybox/commit/?id=a2a5db41a3ace98e7eff53aca231053be7717c66
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 libbb/pw_ascii64.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 91 insertions(+)

diff --git a/libbb/pw_ascii64.c b/libbb/pw_ascii64.c
new file mode 100644
index 000000000..3993932ca
--- /dev/null
+++ b/libbb/pw_ascii64.c
@@ -0,0 +1,91 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * Utility routines.
+ *
+ * Copyright (C) 1999-2004 by Erik Andersen <andersen at codepoet.org>
+ *
+ * Licensed under GPLv2 or later, see file LICENSE in this source tree.
+ */
+
+/* Returns >=64 for invalid chars */
+int FAST_FUNC a2i64(char c)
+{
+	unsigned char ch = c;
+	if (ch >= 'a')
+		/* "a..z" to 38..63 */
+		/* anything after "z": positive int >= 64 */
+		return (ch - 'a' + 38);
+
+	if (ch > 'Z')
+		/* after "Z" but before "a": positive byte >= 64 */
+		return ch;
+
+	if (ch >= 'A')
+		/* "A..Z" to 12..37 */
+		return (ch - 'A' + 12);
+
+	if (ch > '9')
+		return 64;
+
+	/* "./0123456789" to 0,1,2..11 */
+	/* anything before "." becomes positive byte >= 64 */
+	return (unsigned char)(ch - '.');
+}
+
+/* 0..63 ->
+ * "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+ */
+int FAST_FUNC i2a64(int i)
+{
+	i &= 0x3f;
+
+	i += '.';
+	/* the above maps 0..11 to "./0123456789":
+	 * ACSII codes of "./" are ('0'-2) and ('0'-1) */
+
+	if (i > '9')
+		i += ('A' - '9' - 1);
+	if (i > 'Z')
+		i += ('a' - 'Z' - 1);
+	return i;
+}
+
+char* FAST_FUNC
+num2str64_lsb_first(char *s, unsigned v, int n)
+{
+	while (--n >= 0) {
+		*s++ = i2a64(v);
+		v >>= 6;
+	}
+	return s;
+}
+
+static void
+num2str64_4chars_msb_first(char *s, unsigned v)
+{
+	*s++ = i2a64(v >> 18); /* bits 23..18 */
+	*s++ = i2a64(v >> 12); /* bits 17..12 */
+	*s++ = i2a64(v >> 6); /* bits 11..6 */
+	*s   = i2a64(v); /* bits 5..0 */
+}
+
+int FAST_FUNC crypt_make_rand64encoded(char *p, int cnt /*, int x */)
+{
+	/* was: x += ... */
+	unsigned x = getpid() + monotonic_us();
+	do {
+		/* x = (x*1664525 + 1013904223) % 2^32 generator is lame
+		 * (low-order bit is not "random", etc...),
+		 * but for our purposes it is good enough */
+		x = x*1664525 + 1013904223;
+		/* BTW, Park and Miller's "minimal standard generator" is
+		 * x = x*16807 % ((2^31)-1)
+		 * It has no problem with visibly alternating lowest bit
+		 * but is also weak in cryptographic sense + needs div,
+		 * which needs more code (and slower) on many CPUs */
+		*p++ = i2a64(x >> 16);
+		*p++ = i2a64(x >> 22);
+	} while (--cnt);
+	*p = '\0';
+	return x;
+}


More information about the busybox-cvs mailing list