[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