diff options
Diffstat (limited to 'std')
m--------- | std | 0 | ||||
-rw-r--r-- | std/bool.c | 79 | ||||
-rw-r--r-- | std/int.c | 127 | ||||
-rw-r--r-- | std/nil.c | 14 | ||||
-rw-r--r-- | std/ref.c | 20 | ||||
-rw-r--r-- | std/str.c | 36 |
6 files changed, 0 insertions, 276 deletions
diff --git a/std b/std new file mode 160000 +Subproject 7b375939be901cf2114916193da9f4b9864f050 diff --git a/std/bool.c b/std/bool.c deleted file mode 100644 index 72a52d3..0000000 --- a/std/bool.c +++ /dev/null @@ -1,79 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include "common/err.h" -#include "api/vm.h" -#include "api/util.h" -#include "api/bool.h" - -static inline bool get_bool_arg(UwUVMArgs *args, size_t i) -{ - return uwubool_get(uwuvm_get_arg(args, i)); -} - -UwUVMValue uwu_if(UwUVMArgs *args) -{ - uwuutil_require_exact("bool.if", args, 3); - - return uwuvm_clone_value(get_bool_arg(args, 0) - ? uwuvm_get_arg(args, 1) - : uwuvm_get_arg(args, 2) - ); -} - -UwUVMValue uwu_and(UwUVMArgs *args) -{ - uwuutil_require_min("bool.and", args, 1); - - for (size_t i = 0; i < args->num; i++) - if (! get_bool_arg(args, i)) - return uwubool_create(false); - - return uwubool_create(true); -} - -UwUVMValue uwu_or(UwUVMArgs *args) -{ - uwuutil_require_min("bool.or", args, 1); - - for (size_t i = 0; i < args->num; i++) - if (get_bool_arg(args, i)) - return uwubool_create(true); - - return uwubool_create(false); -} - -UwUVMValue uwu_equal(UwUVMArgs *args) -{ - uwuutil_require_min("bool.equal", args, 2); - - bool value = get_bool_arg(args, 0); - - for (size_t i = 1; i < args->num; i++) - if (get_bool_arg(args, i) != value) - return uwubool_create(false); - - return uwubool_create(true); -} - -UwUVMValue uwu_not(UwUVMArgs *args) -{ - uwuutil_require_exact("bool.not", args, 1); - return uwubool_create(! get_bool_arg(args, 0)); -} - -UwUVMValue uwu_true(UwUVMArgs *args) -{ - uwuutil_require_exact("bool.true", args, 0); - return uwubool_create(true); -} - -UwUVMValue uwu_false(UwUVMArgs *args) -{ - uwuutil_require_exact("bool.false", args, 0); - return uwubool_create(false); -} - -UwUVMValue uwu_is(UwUVMArgs *args) -{ - return uwuutil_is_type("bool.is", args, &uwubool_type); -} diff --git a/std/int.c b/std/int.c deleted file mode 100644 index 625595d..0000000 --- a/std/int.c +++ /dev/null @@ -1,127 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include "common/err.h" -#include "api/vm.h" -#include "api/int.h" -#include "api/bool.h" -#include "api/util.h" - -typedef enum -{ - BOP_SUB, - BOP_DIV, - BOP_MOD, - BOP_SML, - BOP_GRT, - BOP_EQU, -} BinaryOP; - -static long binary(const char *fnname, UwUVMArgs *args, BinaryOP op) -{ - uwuutil_require_exact(fnname, args, 2); - - UwUVMValue value0 = uwuvm_get_arg(args, 0); - - if (value0.type != &uwuint_type) - error("type error: %s requires an integer as $1\n", fnname); - - UwUVMValue value1 = uwuvm_get_arg(args, 1); - - if (value1.type != &uwuint_type) - error("type error: %s requires an integer as $2\n", fnname); - - long a = uwuint_get(value0); - long b = uwuint_get(value1); - - switch (op) { - case BOP_SUB: return a - b; - case BOP_DIV: return a / b; - case BOP_MOD: return a % b; - case BOP_SML: return a < b; - case BOP_GRT: return a > b; - case BOP_EQU: return a == b; - } - - return 0; -} - -typedef enum -{ - ROP_ADD, - ROP_MUL, - ROP_EQU, -} ReduceOP; - -static long reduce(const char *fnname, UwUVMArgs *args, ReduceOP op, long result) -{ - long first; - - for (size_t i = 0; i < args->num; i++) { - UwUVMValue value = uwuvm_get_arg(args, i); - - if (value.type != &uwuint_type) - error("type error: %s only accepts integers as arguments (invalid argument: $%lu)\n", fnname, i + 1); - - long this = uwuint_get(value); - - switch (op) { - case ROP_ADD: result += this; break; - case ROP_MUL: result *= this; break; - case ROP_EQU: - if (i == 0) - first = this; - else if (this != first) - return 0; - - break; - } - } - - return result; -} - -UwUVMValue uwu_add(UwUVMArgs *args) -{ - return uwuint_create(reduce("int.add", args, ROP_ADD, 0)); -} - -UwUVMValue uwu_sub(UwUVMArgs *args) -{ - return uwuint_create(binary("int.sub", args, BOP_SUB)); -} - -UwUVMValue uwu_mul(UwUVMArgs *args) -{ - return uwuint_create(reduce("int.mul", args, ROP_MUL, 1)); -} - -UwUVMValue uwu_div(UwUVMArgs *args) -{ - return uwuint_create(binary("int.div", args, BOP_DIV)); -} - -UwUVMValue uwu_mod(UwUVMArgs *args) -{ - return uwuint_create(binary("int.mod", args, BOP_MOD)); -} - -UwUVMValue uwu_smaller(UwUVMArgs *args) -{ - return uwubool_create(binary("int.smaller", args, BOP_SML) == 1); -} - -UwUVMValue uwu_greater(UwUVMArgs *args) -{ - return uwubool_create(binary("int.greater", args, BOP_GRT) == 1); -} - -UwUVMValue uwu_equal(UwUVMArgs *args) -{ - uwuutil_require_min("int.equal", args, 2); - return uwubool_create(reduce("int.equal", args, ROP_EQU, 1) == 1); -} - -UwUVMValue uwu_is(UwUVMArgs *args) -{ - return uwuutil_is_type("int.is", args, &uwuint_type); -} diff --git a/std/nil.c b/std/nil.c deleted file mode 100644 index cb27dbb..0000000 --- a/std/nil.c +++ /dev/null @@ -1,14 +0,0 @@ -#include "common/err.h" -#include "api/nil.h" -#include "api/util.h" - -UwUVMValue uwu_nil(UwUVMArgs *args) -{ - uwuutil_require_exact("nil.nil", args, 0); - return uwunil_create(); -} - -UwUVMValue uwu_is(UwUVMArgs *args) -{ - return uwuutil_is_type("nil.is", args, &uwunil_type); -} diff --git a/std/ref.c b/std/ref.c deleted file mode 100644 index 0147160..0000000 --- a/std/ref.c +++ /dev/null @@ -1,20 +0,0 @@ -#include "common/err.h" -#include "api/ref.h" -#include "api/util.h" - -UwUVMValue uwu_call(UwUVMArgs *args) -{ - uwuutil_require_min("ref.call", args, 1); - - UwUVMValue value = uwuvm_get_arg(args, 0); - - if (value.type != &uwuref_type) - error("ref.call requires a function reference as $1\n"); - - return uwuvm_call_function(value.data, args->num - 1, &args->unevaluated[1], args->super); -} - -UwUVMValue uwu_is(UwUVMArgs *args) -{ - return uwuutil_is_type("ref.is", args, &uwuref_type); -} diff --git a/std/str.c b/std/str.c deleted file mode 100644 index 29b94db..0000000 --- a/std/str.c +++ /dev/null @@ -1,36 +0,0 @@ -#include <string.h> -#include <stdlib.h> -#include "api/vm.h" -#include "api/str.h" -#include "api/util.h" - -UwUVMValue uwu_cat(UwUVMArgs *args) -{ - size_t total_len = 0; - size_t lengths[args->num]; - char *substrs[args->num]; - - for (size_t i = 0; i < args->num; i++) { - substrs[i] = uwustr_get(uwuvm_get_arg(args, i)); - lengths[i] = strlen(substrs[i]); - total_len += lengths[i]; - } - - char result[total_len + 1]; - char *result_ptr = result; - - for (size_t i = 0; i < args->num; i++) { - strcpy(result_ptr, substrs[i]); - free(substrs[i]); - result_ptr += lengths[i]; - } - - *result_ptr = 0; - - return uwustr_create(result); -} - -UwUVMValue uwu_is(UwUVMArgs *args) -{ - return uwuutil_is_type("str.is", args, &uwustr_type); -} |