summaryrefslogtreecommitdiff
path: root/src/misc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/misc.c')
-rw-r--r--src/misc.c88
1 files changed, 88 insertions, 0 deletions
diff --git a/src/misc.c b/src/misc.c
new file mode 100644
index 0000000..2eec3c2
--- /dev/null
+++ b/src/misc.c
@@ -0,0 +1,88 @@
+/*
+ * Miscellaneous functions
+ * Copyright Jan Engelhardt, 1999-2010
+ *
+ * This file is part of libHX. libHX is free software; you can
+ * redistribute it and/or modify it under the terms of the GNU Lesser
+ * General Public License as published by the Free Software Foundation;
+ * either version 2.1 or (at your option) any later version.
+ */
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <libHX/ctype_helper.h>
+#include <libHX/misc.h>
+#include "internal.h"
+
+EXPORT_SYMBOL int HX_ffs(unsigned long n)
+{
+ int s = 0;
+ if (n == 0)
+ return -1;
+ while ((n >>= 1) >= 1)
+ ++s;
+ return s;
+}
+
+EXPORT_SYMBOL int HX_fls(unsigned long n)
+{
+ int i;
+ for (i = 31; i >= 0; --i)
+ if (n & (1 << i))
+ return i;
+ return -1;
+}
+
+static __inline__ void hexdump_ascii(FILE *fp, unsigned char c, bool tty)
+{
+ static const unsigned char ct_char[] = "31", up_char[] = "34";
+
+ if (HX_isprint(c))
+ fprintf(fp, "%c", c);
+ else if (tty && c == 0)
+ fprintf(fp, "\e[%sm@\e[0m", up_char); // ]]
+ else if (tty && c < 32)
+ fprintf(fp, "\e[%sm%c\e[0m", ct_char, '@' + c); // ]]
+ else if (tty)
+ fprintf(fp, "\e[%sm.\e[0m", up_char); // ]]
+ else
+ fprintf(fp, ".");
+}
+
+EXPORT_SYMBOL void HX_hexdump(FILE *fp, const void *vptr, unsigned int len)
+{
+ const unsigned char *ptr = vptr;
+ unsigned int i, j;
+ bool tty = isatty(fileno(fp));
+
+ fprintf(fp, "Dumping %u bytes\n", len);
+ for (i = 0; i < len / 16; ++i) {
+ fprintf(fp, "%04x | ", i * 16);
+ for (j = 0; j < 16; ++j)
+ fprintf(fp, "%02x%c", *ptr++, (j == 7) ? '-' : ' ');
+ ptr -= 16;
+ fprintf(fp, "| ");
+ for (j = 0; j < 16; ++j)
+ hexdump_ascii(fp, *ptr++, tty);
+ fprintf(fp, "\n");
+ }
+ fprintf(fp, "%04x | ", i * 16);
+ len -= i * 16;
+ for (i = 0; i < len; ++i)
+ fprintf(fp, "%02x%c", ptr[i], (i == 7) ? '-' : ' ');
+ for (; i < 16; ++i)
+ fprintf(fp, " ");
+ fprintf(fp, "| ");
+ for (i = 0; i < len; ++i)
+ hexdump_ascii(fp, *ptr++, tty);
+ fprintf(fp, "\n");
+}
+
+EXPORT_SYMBOL void HX_zvecfree(char **args)
+{
+ char **travp;
+ for (travp = args; *travp != NULL; ++travp)
+ free(*travp);
+ free(args);
+}