aboutsummaryrefslogtreecommitdiff
path: root/src/builtins.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/builtins.c')
-rw-r--r--src/builtins.c98
1 files changed, 98 insertions, 0 deletions
diff --git a/src/builtins.c b/src/builtins.c
index 9ab38d5..950c2c7 100644
--- a/src/builtins.c
+++ b/src/builtins.c
@@ -2,10 +2,108 @@
#include "interp.h"
#include "sexp.h"
#include <algds/str.h>
+#include <ctype.h>
#include <stdint.h>
#include <float.h>
#include <math.h>
+SExpRef builtin_charp(Interp *interp, SExpRef args) {
+ if (LENGTH(args) != 1) return new_error(interp, "char?: arg num error.");
+ return new_boolean(interp, VALTYPE(CAR(args)) == kCharSExp);
+}
+
+SExpRef builtin_char_eq(Interp *interp, SExpRef args) {
+ if (LENGTH(args) != 2) return new_error(interp, "char=: arg num error.");
+ if (VALTYPE(CAR(args)) != kCharSExp || VALTYPE(CADR(args)) != kCharSExp) {
+ return new_error(interp, "char=: type error.\n");
+ }
+ char a = REF(CAR(args))->character;
+ char b = REF(CADR(args))->character;
+ return new_boolean(interp, a == b);
+}
+
+SExpRef builtin_char_gt(Interp *interp, SExpRef args) {
+ if (LENGTH(args) != 2) return new_error(interp, "char>: arg num error.");
+ if (VALTYPE(CAR(args)) != kCharSExp || VALTYPE(CADR(args)) != kCharSExp) {
+ return new_error(interp, "char>: type error.\n");
+ }
+ char a = REF(CAR(args))->character;
+ char b = REF(CADR(args))->character;
+ return new_boolean(interp, a > b);
+}
+
+SExpRef builtin_char_lt(Interp *interp, SExpRef args) {
+ if (LENGTH(args) != 2) return new_error(interp, "char<: arg num error.");
+ if (VALTYPE(CAR(args)) != kCharSExp || VALTYPE(CADR(args)) != kCharSExp) {
+ return new_error(interp, "char<: type error.\n");
+ }
+ char a = REF(CAR(args))->character;
+ char b = REF(CADR(args))->character;
+ return new_boolean(interp, a < b);
+}
+#undef FUNC
+
+SExpRef builtin_char_ge(Interp *interp, SExpRef args) {
+ if (LENGTH(args) != 2) return new_error(interp, "char>=: arg num error.");
+ if (VALTYPE(CAR(args)) != kCharSExp || VALTYPE(CADR(args)) != kCharSExp) {
+ return new_error(interp, "char>=: type error.\n");
+ }
+ char a = REF(CAR(args))->character;
+ char b = REF(CADR(args))->character;
+ return new_boolean(interp, a >= b);
+}
+
+SExpRef builtin_char_le(Interp *interp, SExpRef args) {
+ if (LENGTH(args) != 2) return new_error(interp, "char<=: arg num error.\n");
+ if (VALTYPE(CAR(args)) != kCharSExp || VALTYPE(CADR(args)) != kCharSExp) {
+ return new_error(interp, "char<=: type error.\n");
+ }
+ char a = REF(CAR(args))->character;
+ char b = REF(CADR(args))->character;
+ return new_boolean(interp, a <= b);
+}
+#undef FUNC
+
+SExpRef builtin_char_neq(Interp *interp, SExpRef args) {
+ if (LENGTH(args) != 2) return new_error(interp, "char/=: arg num error.\n");
+ if (VALTYPE(CAR(args)) != kCharSExp || VALTYPE(CADR(args)) != kCharSExp) {
+ return new_error(interp, "char/=: type error.\n");
+ }
+ char a = REF(CAR(args))->character;
+ char b = REF(CADR(args))->character;
+ return new_boolean(interp, a != b);
+}
+
+SExpRef builtin_char2int(Interp *interp, SExpRef args) {
+ if (LENGTH(args) != 1) return new_error(interp, "char->int: arg num error.\n");
+ if (VALTYPE(CAR(args)) != kCharSExp) return new_error(interp, "char->int: type error.\n");
+ return new_integer(interp, REF(CAR(args))->character);
+}
+
+SExpRef builtin_int2char(Interp *interp, SExpRef args) {
+ if (LENGTH(args) != 1) return new_error(interp, "int->char: arg num error.\n");
+ if (VALTYPE(CAR(args)) != kIntegerSExp) return new_error(interp, "int->char: type error.\n");
+ return new_char(interp, REF(CAR(args))->integer);
+}
+
+SExpRef builtin_alphabeticp(Interp *interp, SExpRef args) {
+ if (LENGTH(args) != 1) return new_error(interp, "alphabetic?: arg num error.\n");
+ if (VALTYPE(CAR(args)) != kCharSExp) return new_error(interp, "alphabetic?: type error.\n");
+ return new_boolean(interp, isalpha(REF(CAR(args))->character));
+}
+
+SExpRef builtin_numericp(Interp *interp, SExpRef args) {
+ if (LENGTH(args) != 1) return new_error(interp, "numeric?: arg num error.\n");
+ if (VALTYPE(CAR(args)) != kCharSExp) return new_error(interp, "numeric?: type error.\n");
+ return new_boolean(interp, isdigit(REF(CAR(args))->character));
+}
+
+SExpRef builtin_alphanump(Interp *interp, SExpRef args) {
+ if (LENGTH(args) != 1) return new_error(interp, "alphanum?: arg num error.\n");
+ if (VALTYPE(CAR(args)) != kCharSExp) return new_error(interp, "alphanum?: type error.\n");
+ return new_boolean(interp, isalnum(REF(CAR(args))->character));
+}
+
SExpRef builtin_listp(Interp *interp, SExpRef args) {
if (LENGTH(args) != 1) return new_error(interp, "list?: arg num error.\n");
return new_boolean(interp, lisp_check_list(interp, CAR(args)));