aboutsummaryrefslogtreecommitdiff
path: root/util.c
diff options
context:
space:
mode:
Diffstat (limited to 'util.c')
-rw-r--r--util.c115
1 files changed, 115 insertions, 0 deletions
diff --git a/util.c b/util.c
new file mode 100644
index 0000000..856b2af
--- /dev/null
+++ b/util.c
@@ -0,0 +1,115 @@
+/**
+ * Copyright (C) 2020 Evgeny Zinoviev
+ * This file is part of isv <https://github.com/gch1p/isv>.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <stdbool.h>
+
+#include "util.h"
+
+#define HEXDUMP_COLS 8
+
+/* based on: https://gist.github.com/richinseattle/c527a3acb6f152796a580401057c78b4 */
+void hexdump(void *mem, unsigned int len)
+{
+ unsigned int i, j;
+
+ for (i = 0; i < len + ((len % HEXDUMP_COLS) ? (HEXDUMP_COLS - len % HEXDUMP_COLS) : 0); i++) {
+ /* Print offset */
+ if (i % HEXDUMP_COLS == 0)
+ printf("0x%06x: ", i);
+
+ if (i < len)
+ /* Print hex data */
+ printf("%02x ", 0xFF & ((char *) mem)[i]);
+ else
+ /* End of block, just aligning for ASCII dump */
+ printf(" ");
+
+ /* Print ASCII dump */
+ if (i % HEXDUMP_COLS == (HEXDUMP_COLS - 1)) {
+ for (j = i - (HEXDUMP_COLS - 1); j <= i; j++) {
+ if (j >= len)
+ /* end of block, not really printing */
+ putchar(' ');
+ else if (isprint(((char *) mem)[j]))
+ /* printable char */
+ putchar(0xFF & ((char *) mem)[j]);
+ else
+ /* other char */
+ putchar('.');
+ }
+
+ putchar('\n');
+ }
+ }
+}
+
+/* dst buffer's length must be at least len+1 */
+void substr_copy(char *dst, const char *src, int len)
+{
+ strncpy(dst, src, len);
+ dst[len] = '\0';
+}
+
+bool isnumeric(const char *s)
+{
+ size_t len = strlen(s);
+ for (size_t i = 0; i < len; i++) {
+ if (!isdigit(s[i]))
+ return false;
+ }
+ return true;
+}
+
+bool isdatevalid(const int y, const int m, const int d)
+{
+ /* primitive out of range checks */
+ if (y < 2000 || y > 2099)
+ return false;
+
+ if (d < 1 || d > 31)
+ return false;
+
+ if (m < 1 || m > 12)
+ return false;
+
+ /* some more clever date validity checks */
+ if ((m == 4 || m == 6 || m == 9 || m == 11) && d == 31)
+ return false;
+
+ /* and finally a february check */
+ /* i always wondered, when do people born at feb 29 celebrate their bday? */
+ return m != 2 || ((y % 4 != 0 && d <= 28) || (y % 4 == 0 && d <= 29));
+}
+
+bool instrarray(const char *needle, const char **list, size_t list_size, int *index)
+{
+ bool found = false;
+ for (size_t i = 0; i < list_size; i++) {
+ /* LOG("%s: comparing %s == %s\n", __func__, list[i], needle); */
+ if (!strcmp(list[i], needle)) {
+ found = true;
+ if (index != NULL)
+ *index = (int)i;
+ break;
+ }
+ }
+ return found;
+}