summaryrefslogtreecommitdiff
path: root/lib/nostd/sail.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/nostd/sail.c')
-rw-r--r--lib/nostd/sail.c119
1 files changed, 102 insertions, 17 deletions
diff --git a/lib/nostd/sail.c b/lib/nostd/sail.c
index 00394e27..fc42f620 100644
--- a/lib/nostd/sail.c
+++ b/lib/nostd/sail.c
@@ -1,21 +1,110 @@
-
-#ifndef SAIL_INT64
-#define SAIL_INT64
-#endif
-
-#ifndef SAIL_BITS64
-#define SAIL_BITS64
-#endif
-
#include <sail_alloc.h>
#include <sail_failure.h>
#include <sail.h>
/* ********************************************************************** */
-/* Sail integers */
+/* Sail strings */
/* ********************************************************************** */
-#if defined(SAIL_INT64) || defined(SAIL_INT128)
+/*
+ * Implementation is /incredibly/ inefficient... but we don't use
+ * strings that much anyway. A better implementation would not use
+ * char* due to immutability requirements, but that would make
+ * inter-operating with the C world harder.
+ */
+
+void CREATE(sail_string)(sail_string *str)
+{
+ char *istr = (char *) sail_malloc(1 * sizeof(char));
+ istr[0] = '\0';
+ *str = istr;
+}
+
+void RECREATE(sail_string)(sail_string *str)
+{
+ sail_free(*str);
+ char *istr = (char *) sail_malloc(1 * sizeof(char));
+ istr[0] = '\0';
+ *str = istr;
+}
+
+size_t sail_strlen(const sail_string str)
+{
+ size_t i = 0;
+ while (true) {
+ if (str[i] == '\0') {
+ return i;
+ }
+ i++;
+ }
+}
+
+char *sail_strcpy(char *dest, const char *src)
+{
+ size_t i;
+ for (i = 0; src[i] != '\0'; i++) {
+ dest[i] = src[i];
+ }
+ dest[i] = '\0';
+ return dest;
+}
+
+int sail_strcmp(const char *str1, const char *str2)
+{
+ size_t i = 0;
+ while (true) {
+ if (str1[i] == str2[i]) {
+ i++;
+ } else {
+ return str1[i] - str2[i];
+ }
+ }
+}
+
+char *sail_strcat(char *dest, const char *src)
+{
+ size_t i = 0;
+ while (dest[i] != '\0') {
+ i++;
+ }
+ return sail_strcpy(dest + i, src);
+}
+
+void COPY(sail_string)(sail_string *str1, const sail_string str2)
+{
+ size_t len = sail_strlen(str2);
+ *str1 = sail_realloc(*str1, len + 1);
+ *str1 = sail_strcpy(*str1, str2);
+}
+
+void KILL(sail_string)(sail_string *str)
+{
+ sail_free(*str);
+}
+
+bool eq_string(const sail_string str1, const sail_string str2)
+{
+ return sail_strcmp(str1, str2) == 0;
+}
+
+bool EQUAL(sail_string)(const sail_string str1, const sail_string str2)
+{
+ return sail_strcmp(str1, str2) == 0;
+}
+
+void undefined_string(sail_string *str, const unit u) {}
+
+void concat_str(sail_string *stro, const sail_string str1, const sail_string str2)
+{
+ *stro = sail_realloc(*stro, sail_strlen(str1) + sail_strlen(str2) + 1);
+ (*stro)[0] = '\0';
+ sail_strcat(*stro, str1);
+ sail_strcat(*stro, str2);
+}
+
+/* ********************************************************************** */
+/* Sail integers */
+/* ********************************************************************** */
sail_int CREATE_OF(sail_int, mach_int)(const mach_int op)
{
@@ -24,7 +113,7 @@ sail_int CREATE_OF(sail_int, mach_int)(const mach_int op)
mach_int CREATE_OF(mach_int, sail_int)(const sail_int op)
{
- if (MACH_INT_MIN < op && op < MACH_INT_MAX) {
+ if (MACH_INT_MIN <= op && op <= MACH_INT_MAX) {
return (mach_int) op;
} else {
sail_failure("Lost precision when converting from sail integer to machine integer");
@@ -34,7 +123,7 @@ mach_int CREATE_OF(mach_int, sail_int)(const sail_int op)
mach_int CONVERT_OF(mach_int, sail_int)(const sail_int op)
{
- if (MACH_INT_MIN < op && op < MACH_INT_MAX) {
+ if (MACH_INT_MIN <= op && op <= MACH_INT_MAX) {
return (mach_int) op;
} else {
sail_failure("Lost precision when converting from sail integer to machine integer");
@@ -246,10 +335,6 @@ sail_int pow2(const sail_int exp)
return pow_int(2, exp);
}
-#else
-
-#endif
-
/* ********************************************************************** */
/* Sail bitvectors */
/* ********************************************************************** */