aboutsummaryrefslogtreecommitdiff
path: root/util
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@cs.berkeley.edu>2016-03-09 23:58:17 -0800
committerAndrew Waterman <waterman@cs.berkeley.edu>2016-03-09 23:58:17 -0800
commitb94c7a4b07f96f24ae7411780abf874416549f7b (patch)
treeb94ca015e49392f52e5abf1209ee184fcf874db4 /util
parentf5a96732cb81571a3ba6b081b8556187d564f678 (diff)
downloadriscv-pk-b94c7a4b07f96f24ae7411780abf874416549f7b.zip
riscv-pk-b94c7a4b07f96f24ae7411780abf874416549f7b.tar.gz
riscv-pk-b94c7a4b07f96f24ae7411780abf874416549f7b.tar.bz2
Refactor pk, bbl, machine into separate libraries
Yuck.
Diffstat (limited to 'util')
-rw-r--r--util/snprintf.c98
-rw-r--r--util/string.c87
-rw-r--r--util/util.ac0
-rw-r--r--util/util.mk.in9
4 files changed, 194 insertions, 0 deletions
diff --git a/util/snprintf.c b/util/snprintf.c
new file mode 100644
index 0000000..1544a6c
--- /dev/null
+++ b/util/snprintf.c
@@ -0,0 +1,98 @@
+// See LICENSE for license details.
+
+#include <stdint.h>
+#include <string.h>
+#include <stdarg.h>
+#include <stdbool.h>
+
+int vsnprintf(char* out, size_t n, const char* s, va_list vl)
+{
+ bool format = false;
+ bool longarg = false;
+ size_t pos = 0;
+ for( ; *s; s++)
+ {
+ if(format)
+ {
+ switch(*s)
+ {
+ case 'l':
+ longarg = true;
+ break;
+ case 'p':
+ longarg = true;
+ if (++pos < n) out[pos-1] = '0';
+ if (++pos < n) out[pos-1] = 'x';
+ case 'x':
+ {
+ long num = longarg ? va_arg(vl, long) : va_arg(vl, int);
+ for(int i = 2*(longarg ? sizeof(long) : sizeof(int))-1; i >= 0; i--) {
+ int d = (num >> (4*i)) & 0xF;
+ if (++pos < n) out[pos-1] = (d < 10 ? '0'+d : 'a'+d-10);
+ }
+ longarg = false;
+ format = false;
+ break;
+ }
+ case 'd':
+ {
+ long num = longarg ? va_arg(vl, long) : va_arg(vl, int);
+ if (num < 0) {
+ num = -num;
+ if (++pos < n) out[pos-1] = '-';
+ }
+ long digits = 1;
+ for (long nn = num; nn /= 10; digits++)
+ ;
+ for (int i = digits-1; i >= 0; i--) {
+ if (pos + i + 1 < n) out[pos + i] = '0' + (num % 10);
+ num /= 10;
+ }
+ pos += digits;
+ longarg = false;
+ format = false;
+ break;
+ }
+ case 's':
+ {
+ const char* s2 = va_arg(vl, const char*);
+ while (*s2) {
+ if (++pos < n)
+ out[pos-1] = *s2;
+ s2++;
+ }
+ longarg = false;
+ format = false;
+ break;
+ }
+ case 'c':
+ {
+ if (++pos < n) out[pos-1] = (char)va_arg(vl,int);
+ longarg = false;
+ format = false;
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ else if(*s == '%')
+ format = true;
+ else
+ if (++pos < n) out[pos-1] = *s;
+ }
+ if (pos < n)
+ out[pos] = 0;
+ else if (n)
+ out[n-1] = 0;
+ return pos;
+}
+
+int snprintf(char* out, size_t n, const char* s, ...)
+{
+ va_list vl;
+ va_start(vl, s);
+ int res = vsnprintf(out, n, s, vl);
+ va_end(vl);
+ return res;
+}
diff --git a/util/string.c b/util/string.c
new file mode 100644
index 0000000..e896379
--- /dev/null
+++ b/util/string.c
@@ -0,0 +1,87 @@
+#include <string.h>
+#include <stdint.h>
+#include <ctype.h>
+
+void* memcpy(void* dest, const void* src, size_t len)
+{
+ if ((((uintptr_t)dest | (uintptr_t)src | len) & (sizeof(uintptr_t)-1)) == 0) {
+ const uintptr_t* s = src;
+ uintptr_t *d = dest;
+ while (d < (uintptr_t*)(dest + len))
+ *d++ = *s++;
+ } else {
+ const char* s = src;
+ char *d = dest;
+ while (d < (char*)(dest + len))
+ *d++ = *s++;
+ }
+ return dest;
+}
+
+void* memset(void* dest, int byte, size_t len)
+{
+ if ((((uintptr_t)dest | len) & (sizeof(uintptr_t)-1)) == 0) {
+ uintptr_t word = byte & 0xFF;
+ word |= word << 8;
+ word |= word << 16;
+ word |= word << 16 << 16;
+
+ uintptr_t *d = dest;
+ while (d < (uintptr_t*)(dest + len))
+ *d++ = word;
+ } else {
+ char *d = dest;
+ while (d < (char*)(dest + len))
+ *d++ = byte;
+ }
+ return dest;
+}
+
+size_t strlen(const char *s)
+{
+ const char *p = s;
+ while (*p)
+ p++;
+ return p - s;
+}
+
+int strcmp(const char* s1, const char* s2)
+{
+ unsigned char c1, c2;
+
+ do {
+ c1 = *s1++;
+ c2 = *s2++;
+ } while (c1 != 0 && c1 == c2);
+
+ return c1 - c2;
+}
+
+char* strcpy(char* dest, const char* src)
+{
+ char* d = dest;
+ while ((*d++ = *src++))
+ ;
+ return dest;
+}
+
+long atol(const char* str)
+{
+ long res = 0;
+ int sign = 0;
+
+ while (*str == ' ')
+ str++;
+
+ if (*str == '-' || *str == '+') {
+ sign = *str == '-';
+ str++;
+ }
+
+ while (*str) {
+ res *= 10;
+ res += *str++ - '0';
+ }
+
+ return sign ? -res : res;
+}
diff --git a/util/util.ac b/util/util.ac
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/util/util.ac
diff --git a/util/util.mk.in b/util/util.mk.in
new file mode 100644
index 0000000..abbdbd1
--- /dev/null
+++ b/util/util.mk.in
@@ -0,0 +1,9 @@
+util_subproject_deps = \
+
+util_hdrs = \
+
+util_c_srcs = \
+ snprintf.c \
+ string.c \
+
+util_asm_srcs = \