diff options
| -rw-r--r-- | Makefile | 4 | ||||
| -rw-r--r-- | builtins/array.c | 4 | ||||
| -rw-r--r-- | builtins/color.c | 17 | ||||
| -rw-r--r-- | builtins/color.h | 9 | ||||
| -rw-r--r-- | builtins/functions.c | 6 | ||||
| -rw-r--r-- | builtins/functions.h | 3 | ||||
| -rw-r--r-- | builtins/integers.c | 9 | ||||
| -rw-r--r-- | builtins/integers.h | 19 | ||||
| -rw-r--r-- | builtins/nums.h | 4 | ||||
| -rw-r--r-- | builtins/pointer.c | 2 | ||||
| -rw-r--r-- | builtins/string.c | 2 | ||||
| -rw-r--r-- | builtins/table.c | 3 | ||||
| -rw-r--r-- | builtins/types.c | 2 | ||||
| -rw-r--r-- | compile.c | 4 | ||||
| -rw-r--r-- | nextlang.c | 3 | ||||
| -rw-r--r-- | nextlang.h | 5 |
16 files changed, 57 insertions, 39 deletions
@@ -24,14 +24,14 @@ G=-ggdb O=-Og CFLAGS=$(CCONFIG) $(EXTRA) $(CWARN) $(G) $(O) $(OSFLAGS) LDLIBS=-lgc -lgccjit -lcord -lm -lunistring -BUILTIN_OBJS=builtins/array.o builtins/bool.o builtins/nums.o builtins/functions.o builtins/integers.o \ +BUILTIN_OBJS=builtins/array.o builtins/bool.o builtins/color.o builtins/nums.o builtins/functions.o builtins/integers.o \ builtins/pointer.o builtins/memory.o builtins/string.o builtins/table.o builtins/types.o all: libnext.so nextlang nextlang: nextlang.c SipHash/halfsiphash.o util.o files.o ast.o parse.o environment.o types.o typecheck.o compile.o $(BUILTIN_OBJS) -libnext.so: util.o $(BUILTIN_OBJS) SipHash/halfsiphash.o +libnext.so: util.o files.o $(BUILTIN_OBJS) SipHash/halfsiphash.o $(CC) $^ $(CFLAGS) $(EXTRA) $(CWARN) $(G) $(O) $(OSFLAGS) $(LDLIBS) -Wl,-soname,libnext.so -shared -o $@ SipHash/halfsiphash.c: diff --git a/builtins/array.c b/builtins/array.c index 447650fc..bf1b9309 100644 --- a/builtins/array.c +++ b/builtins/array.c @@ -15,8 +15,6 @@ #include "../SipHash/halfsiphash.h" #include "../util.h" -extern const void *SSS_HASH_VECTOR; - static inline size_t get_item_size(const TypeInfo *info) { return info->ArrayInfo.item->size; @@ -278,7 +276,7 @@ public bool Array__equal(const array_t *x, const array_t *y, const TypeInfo *typ return (Array__compare(x, y, type) == 0); } -public CORD Array__cord(const array_t *arr, bool colorize, const TypeInfo *type) +public CORD Array__as_str(const array_t *arr, bool colorize, const TypeInfo *type) { if (!arr) return CORD_all("[", generic_as_str(NULL, false, type->ArrayInfo.item), "]"); diff --git a/builtins/color.c b/builtins/color.c new file mode 100644 index 00000000..b84d8a71 --- /dev/null +++ b/builtins/color.c @@ -0,0 +1,17 @@ + +#include <stdbool.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#include "../util.h" +#include "color.h" + +public bool USE_COLOR = true; + +public void detect_color(void) +{ + USE_COLOR = getenv("COLOR") ? strcmp(getenv("COLOR"), "1") == 0 : isatty(STDOUT_FILENO); +} + +// vim: ts=4 sw=0 et cino=L2,l1,(0,W4,m1,\:0 diff --git a/builtins/color.h b/builtins/color.h new file mode 100644 index 00000000..d9e5c9f1 --- /dev/null +++ b/builtins/color.h @@ -0,0 +1,9 @@ +#pragma once + +#include <stdbool.h> + +extern bool USE_COLOR; + +void detect_color(void); + +// vim: ts=4 sw=0 et cino=L2,l1,(0,W4,m1,\:0 diff --git a/builtins/functions.c b/builtins/functions.c index f2b2fa82..03dfe738 100644 --- a/builtins/functions.c +++ b/builtins/functions.c @@ -90,7 +90,7 @@ public CORD generic_as_str(const void *obj, bool colorize, const TypeInfo *type) case TypeInfoInfo: return Type__as_str(obj, colorize, type); case CustomInfo: if (!type->CustomInfo.as_str) - builtin_fail("No cord function provided for type!\n"); + fail("No cord function provided for type!\n"); return type->CustomInfo.as_str(obj, colorize, type); default: errx(1, "Invalid type tag: %d", type->tag); } @@ -146,8 +146,8 @@ public void __doctest(CORD label, void *expr, TypeInfo *type, CORD expected, con if (!success) { if (filename && file) fprint_span(stderr, file, file->text+start, file->text+end, "\x1b[31;1m", 2, USE_COLOR); - builtin_fail(USE_COLOR ? "\x1b[31;1mExpected: \x1b[32;7m%s\x1b[0m\n\x1b[31;1m But got: \x1b[31;7m%s\x1b[0m\n" : "Expected: %s\n But got: %s\n", - expected, expr_str); + fail(USE_COLOR ? "\x1b[31;1mExpected: \x1b[32;7m%s\x1b[0m\n\x1b[31;1m But got: \x1b[31;7m%s\x1b[0m\n" : "Expected: %s\n But got: %s\n", + expected, expr_str); } } } diff --git a/builtins/functions.h b/builtins/functions.h index 0f4beacf..133c76fc 100644 --- a/builtins/functions.h +++ b/builtins/functions.h @@ -8,8 +8,7 @@ extern const char *SSS_HASH_VECTOR; -void builtin_say(CORD str, CORD end); -void builtin_fail(CORD fmt, ...); +void fail(CORD fmt, ...); CORD builtin_last_err(); void __doctest(CORD label, void *expr, TypeInfo *type, CORD expected, const char *filename, int start, int end); diff --git a/builtins/integers.c b/builtins/integers.c index 36e7d7a8..b4170f7b 100644 --- a/builtins/integers.c +++ b/builtins/integers.c @@ -39,11 +39,11 @@ return CORD_asprintf(octal_fmt, (int)digits, (uint64_t)i); \ } \ public c_type KindOfInt ## __random(int64_t min, int64_t max) { \ - if (min > max) builtin_fail("Random min (%ld) is larger than max (%ld)", min, max); \ - if (min < (int64_t)min_val) builtin_fail("Random min (%ld) is smaller than the minimum "#KindOfInt" value", min); \ - if (max > (int64_t)max_val) builtin_fail("Random max (%ld) is smaller than the maximum "#KindOfInt" value", max); \ + if (min > max) fail("Random min (%ld) is larger than max (%ld)", min, max); \ + if (min < (int64_t)min_val) fail("Random min (%ld) is smaller than the minimum "#KindOfInt" value", min); \ + if (max > (int64_t)max_val) fail("Random max (%ld) is smaller than the maximum "#KindOfInt" value", max); \ int64_t range = max - min; \ - if (range > UINT32_MAX) builtin_fail("Random range (%ld) is larger than the maximum allowed (%ld)", range, UINT32_MAX); \ + if (range > UINT32_MAX) fail("Random range (%ld) is larger than the maximum allowed (%ld)", range, UINT32_MAX); \ uint32_t r = arc4random_uniform((uint32_t)range); \ return min + (c_type)r; \ } \ @@ -63,6 +63,7 @@ .random=KindOfInt##__random, \ }; +DEFINE_INT_TYPE(int64_t, Int, "ld", labs, INT64_MIN, INT64_MAX); DEFINE_INT_TYPE(int64_t, Int64, "ld", labs, INT64_MIN, INT64_MAX); DEFINE_INT_TYPE(int32_t, Int32, "d_i32", abs, INT32_MIN, INT32_MAX); DEFINE_INT_TYPE(int16_t, Int16, "d_i16", abs, INT16_MIN, INT16_MAX); diff --git a/builtins/integers.h b/builtins/integers.h index 3e00d962..5eec40a8 100644 --- a/builtins/integers.h +++ b/builtins/integers.h @@ -5,13 +5,13 @@ #include "types.h" -#define DEFINE_INT_TYPE(c_type, KindOfInt)\ - CORD KindOfInt ## __as_str(const c_type *i, bool colorize, const TypeInfo *type); \ - int32_t KindOfInt ## __compare(const c_type *x, const c_type *y, const TypeInfo *type); \ - CORD KindOfInt ## __format(c_type i, int64_t digits); \ - CORD KindOfInt ## __hex(c_type i, int64_t digits, bool uppercase, bool prefix); \ - CORD KindOfInt ## __octal(c_type i, int64_t digits, bool prefix); \ - c_type KindOfInt ## __random(int64_t min, int64_t max); \ +#define DEFINE_INT_TYPE(c_type, type_name) \ + CORD type_name ## __as_str(const c_type *i, bool colorize, const TypeInfo *type); \ + int32_t type_name ## __compare(const c_type *x, const c_type *y, const TypeInfo *type); \ + CORD type_name ## __format(c_type i, int64_t digits); \ + CORD type_name ## __hex(c_type i, int64_t digits, bool uppercase, bool prefix); \ + CORD type_name ## __octal(c_type i, int64_t digits, bool prefix); \ + c_type type_name ## __random(int64_t min, int64_t max); \ typedef struct { \ TypeInfo type; \ c_type min, max; \ @@ -20,7 +20,10 @@ CORD (*hex)(c_type i, int64_t digits, bool uppercase, bool prefix); \ CORD (*octal)(c_type i, int64_t digits, bool prefix); \ c_type (*random)(int64_t min, int64_t max); \ - } KindOfInt##_namespace_t; + } type_name##_namespace_t; \ + extern type_name##_namespace_t type_name##_type; + +DEFINE_INT_TYPE(int64_t, Int); DEFINE_INT_TYPE(int64_t, Int64); DEFINE_INT_TYPE(int32_t, Int32); DEFINE_INT_TYPE(int16_t, Int16); diff --git a/builtins/nums.h b/builtins/nums.h index 5e2cb062..1f755047 100644 --- a/builtins/nums.h +++ b/builtins/nums.h @@ -5,10 +5,6 @@ #include "types.h" -typedef struct { - TypeInfo type; -} Bool_namespace_t; - CORD Num__as_str(const double *f, bool colorize, const TypeInfo *type); int32_t Num__compare(const double *x, const double *y, const TypeInfo *type); bool Num__equal(const double *x, const double *y, const TypeInfo *type); diff --git a/builtins/pointer.c b/builtins/pointer.c index f978acab..bc358488 100644 --- a/builtins/pointer.c +++ b/builtins/pointer.c @@ -14,8 +14,6 @@ #include "functions.h" #include "types.h" -extern const void *SSS_HASH_VECTOR; - typedef struct recursion_s { const void *ptr; struct recursion_s *next; diff --git a/builtins/string.c b/builtins/string.c index dd56893a..6f692b64 100644 --- a/builtins/string.c +++ b/builtins/string.c @@ -19,8 +19,6 @@ #define CLAMP(x, lo, hi) MIN(hi, MAX(x,lo)) -extern const void *SSS_HASH_VECTOR; - public CORD Str__as_str(const void *str, bool colorize, const TypeInfo *info) { (void)info; diff --git a/builtins/table.c b/builtins/table.c index 6db29186..0b377bb1 100644 --- a/builtins/table.c +++ b/builtins/table.c @@ -11,7 +11,6 @@ #include <assert.h> #include <gc.h> -#include <stdalign.h> #include <stdarg.h> #include <stdio.h> #include <stdlib.h> @@ -42,8 +41,6 @@ #define GET_ENTRY(t, i) ((t)->entries.data + (t)->entries.stride*(i)) #define ENTRIES_TYPE(type) (&(TypeInfo){.size=sizeof(array_t), .align=alignof(array_t), .tag=ArrayInfo, .ArrayInfo.item=(&(TypeInfo){.size=entry_size(type), .align=entry_align(type), .tag=OpaqueInfo})}) -extern const void *SSS_HASH_VECTOR; - TypeInfo MemoryPointer_typeinfo = { .size=sizeof(void*), .align=alignof(void*), diff --git a/builtins/types.c b/builtins/types.c index f77a36f9..d8b90021 100644 --- a/builtins/types.c +++ b/builtins/types.c @@ -13,8 +13,6 @@ #include "../util.h" #include "../SipHash/halfsiphash.h" -extern const void *SSS_HASH_VECTOR; - public CORD Type__as_str(const void *typeinfo, bool colorize, const TypeInfo *type) { if (!typeinfo) return "TypeInfo"; @@ -422,8 +422,8 @@ CORD compile_type_info(env_t *env, type_t *t) { switch (t->tag) { case BoolType: return "&Bool_type"; - case IntType: return CORD_asprintf("&Int%ld_type", Match(t, IntType)->bits); - case NumType: return CORD_asprintf("&Num%ld_type", Match(t, NumType)->bits); + case IntType: return CORD_asprintf("&Int%ld_type.type", Match(t, IntType)->bits); + case NumType: return CORD_asprintf("&Num%ld_type.type", Match(t, NumType)->bits); case StringType: return CORD_all("&", Match(t, StringType)->dsl ? Match(t, StringType)->dsl : "Str", "_type"); case StructType: return CORD_all("&", Match(t, StructType)->name, "_type"); case EnumType: return CORD_all("&", Match(t, EnumType)->name, "_type"); @@ -45,7 +45,6 @@ int main(int argc, char *argv[]) env_t *env = new_compilation_unit(); CORD_appendf(&env->code->imports, "#include \"nextlang.h\"\n"); - CORD_appendf(&env->code->staticdefs, "static bool USE_COLOR = true;\n"); // Main body: for (ast_list_t *stmt = Match(ast, Block)->statements; stmt; stmt = stmt->next) { @@ -72,7 +71,7 @@ int main(int argc, char *argv[]) "(void)argc;\n" "(void)argv;\n" "GC_INIT();\n" - "USE_COLOR = getenv(\"COLOR\") ? strcmp(getenv(\"COLOR\"), \"1\") == 0 : isatty(STDOUT_FILENO);\n" + "detect_color();\n" "$load();\n" "return 0;\n" "}\n" @@ -12,8 +12,13 @@ #include <unistd.h> #include "builtins/array.h" +#include "builtins/bool.h" +#include "builtins/color.h" #include "builtins/datatypes.h" #include "builtins/functions.h" +#include "builtins/integers.h" +#include "builtins/memory.h" +#include "builtins/nums.h" #include "builtins/pointer.h" #include "builtins/string.h" #include "builtins/table.h" |
