aboutsummaryrefslogtreecommitdiff
path: root/source/tools/helper.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/tools/helper.c')
-rw-r--r--source/tools/helper.c150
1 files changed, 150 insertions, 0 deletions
diff --git a/source/tools/helper.c b/source/tools/helper.c
new file mode 100644
index 0000000..a27da7e
--- /dev/null
+++ b/source/tools/helper.c
@@ -0,0 +1,150 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include <fcntl.h>
+#include <string.h>
+
+#include <sys/stat.h>
+
+#ifdef __MINGW32__
+#include <windows.h>
+#else
+#include <sys/mman.h> /* mmap - not available on windoze */
+#endif
+
+#include "helper.h"
+
+#ifdef _USE_PYTHON
+#undef _POSIX_C_SOURCE
+#undef _XOPEN_SOURCE
+#include <Python.h>
+#endif
+
+
+static const char hextable[] = "0123456789ABCDEF";
+
+
+#ifdef _USE_PYTHON
+void* MyPyMem_Calloc(size_t n, size_t s)
+{
+ void* ptr = PyMem_Malloc(n*s);
+ if (ptr)
+ memset(ptr, '\0', n*s);
+ return ptr;
+}
+#endif
+
+char* mapfile(const char* path, size_t* mapsizptr)
+{
+ /* TODO: MINGW alternative should to exactly the same as the linux one! (map file to memory without duplicating the mmap's buffer) */
+#ifdef __MINGW32__
+ HANDLE hfile = CreateFile(path, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+ if (hfile == INVALID_HANDLE_VALUE)
+ return NULL;
+ if (SetFilePointer(hfile, 0, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER)
+ return NULL;
+ *mapsizptr = GetFileSize(hfile, NULL);
+ if (*mapsizptr == INVALID_FILE_SIZE)
+ return NULL;
+ char* buf = calloc(*mapsizptr, sizeof(char));
+ DWORD szread = 0;
+ if (!buf)
+ return NULL;
+ if (ReadFile(hfile, buf, *mapsizptr, &szread, NULL) != TRUE) {
+ free(buf);
+ return NULL;
+ }
+ CloseHandle(hfile);
+ return buf;
+#else
+ int fd = open(path, O_RDWR);
+ if (fd == -1)
+ return NULL;
+ struct stat sb;
+ if (fstat(fd, &sb) == -1)
+ return NULL;
+ char* mapd = mmap(NULL, sb.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ if (mapd == MAP_FAILED)
+ return NULL;
+ *mapsizptr = sb.st_size;
+ close(fd);
+ return mapd;
+#endif
+}
+
+ssize_t writebuf(const char* path, unsigned char* buf, size_t siz)
+{
+ int ffd = open(path, O_WRONLY | O_CREAT | O_TRUNC,
+ S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+ ssize_t wrt = write(ffd, buf, siz);
+ close(ffd);
+ return wrt;
+}
+
+char* bintostr(const char* buf, size_t siz, size_t delim, size_t *strlenptr)
+{
+ register size_t i;
+ size_t allocLen = ( delim > 0 ? (int)(siz/delim) : 1 ) + siz*2;
+ char* result = calloc(allocLen+1, sizeof(char));
+ char tmp[4];
+
+ tmp[3] = '\0';
+ for (i = 0; i < siz; ++i) {
+ register unsigned char halfByte = buf[i] >> 4;
+ tmp[0] = hextable[halfByte%16];
+ halfByte = buf[i] & 0x0F;
+ tmp[1] = hextable[halfByte%16];
+ tmp[2] = '\0';
+ if (delim>0 && i%delim==delim-1)
+ tmp[2] = ' ';
+ strcat(result, tmp);
+ }
+ result[allocLen] = '\0';
+ if (strlenptr) {
+ *strlenptr = allocLen;
+ }
+ return result;
+}
+
+void printrimmed(char* str, size_t siz, size_t charsperline, bool printlinenmb)
+{
+ if (charsperline == 0) {
+ printf("%s\n", str);
+ } else {
+ unsigned long ln = 0;
+ for (size_t i = 0; i < siz; i+=charsperline) {
+ if (printlinenmb) {
+ printf("%04lu: ", ln++);
+ }
+ size_t psiz = (i+1 < siz-charsperline ? charsperline : siz-i);
+ printf("%.*s\n", (int)psiz, (str + i));
+ }
+ }
+}
+
+void printbytebuf(char* buf, size_t siz, size_t charsperline, bool printlinenmb)
+{
+ size_t hexlen = 0;
+ char* hexbuf = bintostr(buf, siz, 1, &hexlen);
+ printrimmed(hexbuf, hexlen, charsperline, printlinenmb);
+ free(hexbuf);
+}
+
+char *strnstr(const char *haystack, const char *needle, size_t len)
+{
+ int i;
+ size_t needle_len;
+
+ if (0 == (needle_len = strnlen(needle, len)))
+ return (char *)haystack;
+
+ for (i=0; i<=(int)(len-needle_len); i++) {
+ if ((haystack[0] == needle[0]) &&
+ (0 == strncmp(haystack, needle, needle_len)))
+ return (char *)haystack;
+ haystack++;
+ }
+ return NULL;
+}