More exception stuff
This commit is contained in:
+29
-2
@@ -1,5 +1,7 @@
|
||||
#include "lisp_string.h"
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
LispVal *make_lisp_string(const char *data, size_t length, bool take,
|
||||
@@ -17,9 +19,24 @@ LispVal *make_lisp_string(const char *data, size_t length, bool take,
|
||||
return obj;
|
||||
}
|
||||
|
||||
LispVal *lisp_sprintf(const char *format, ...) {
|
||||
va_list args;
|
||||
va_start(args, format);
|
||||
va_list args2;
|
||||
va_copy(args2, args);
|
||||
int needed = vsnprintf(NULL, 0, format, args2);
|
||||
va_end(args2);
|
||||
char *buffer = lisp_malloc(needed + 1);
|
||||
int printed = vsnprintf(buffer, needed + 1, format, args);
|
||||
va_end(args);
|
||||
assert(printed == needed);
|
||||
return make_lisp_string(buffer, printed, true, false);
|
||||
}
|
||||
|
||||
DEFUN(strings_equal, "strings-equal", (LispVal * string1, LispVal *string2),
|
||||
"(string1 string2)", "") {
|
||||
// TODO type checking
|
||||
CHECK_TYPE(string1, TYPE_STRING);
|
||||
CHECK_TYPE(string2, TYPE_STRING);
|
||||
if (((LispString *) string1)->length != ((LispString *) string2)->length) {
|
||||
return Qnil;
|
||||
}
|
||||
@@ -32,7 +49,7 @@ DEFUN(strings_equal, "strings-equal", (LispVal * string1, LispVal *string2),
|
||||
}
|
||||
|
||||
DEFUN(hash_string, "hash-string", (LispVal * string), "(string)", "") {
|
||||
// TODO type checking
|
||||
CHECK_TYPE(string, TYPE_STRING);
|
||||
size_t len = ((LispString *) string)->length;
|
||||
const char *str = ((LispString *) string)->data;
|
||||
uintptr_t hash = 5381;
|
||||
@@ -41,3 +58,13 @@ DEFUN(hash_string, "hash-string", (LispVal * string), "(string)", "") {
|
||||
}
|
||||
return MAKE_FIXNUM(hash);
|
||||
}
|
||||
|
||||
DEFUN(charp, "charp", (LispVal * obj), "(obj)", "") {
|
||||
if (!FIXNUMP(obj)) {
|
||||
return Qnil;
|
||||
}
|
||||
fixnum_t val = XFIXNUM(obj);
|
||||
return (val >= 0 && val <= 255) ? Qt : Qnil;
|
||||
}
|
||||
|
||||
DEFINE_SYMBOL(char, "char");
|
||||
|
||||
Reference in New Issue
Block a user