ref: 198fb0edeca92679c1d3dd49bae7359bbc18bcba
parent: b599779c7cd8b8beebbdf821995818dde17e70e1
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Thu Oct 24 22:20:27 EDT 2024
char.titlecase, char-{lower,upper,title}-case?, char-{numeric,whitespace}? (note: not necessarily correct)
--- a/aliases.scm
+++ b/aliases.scm
@@ -65,13 +65,12 @@
(define (integer->char i) (rune i))
(define char-upcase char.upcase)
(define char-downcase char.downcase)
+(define char-titlecase char.titlecase)
(define char=? eqv?)
(define char<? <)
(define char>? >)
(define char<=? <=)
(define char>=? >=)
-(define (char-whitespace? c) (not (not (string.find *whitespace* c))))
-(define (char-numeric? c) (not (not (string.find "0123456789" c))))
(define string=? eqv?)
(define string<? <)
--- a/string.c
+++ b/string.c
@@ -237,13 +237,67 @@
return mk_rune(tolowerrune(*(Rune*)cp_data(cp)));
}
+BUILTIN("char.titlecase", char_titlecase)+{+ argcount(nargs, 1);
+ cprim_t *cp = ptr(args[0]);
+ if(!iscprim(args[0]) || cp_class(cp) != runetype)
+ type_error("rune", args[0]);+ return mk_rune(totitlerune(*(Rune*)cp_data(cp)));
+}
+
BUILTIN("char-alphabetic?", char_alphabeticp) {argcount(nargs, 1);
- cprim_t *cp = (cprim_t*)ptr(args[0]);
+ cprim_t *cp = ptr(args[0]);
if(!iscprim(args[0]) || cp_class(cp) != runetype)
type_error("rune", args[0]);return isalpharune(*(Rune*)cp_data(cp)) ? FL_T : FL_F;
+}
+
+BUILTIN("char-lower-case?", char_lower_casep)+{+ argcount(nargs, 1);
+ cprim_t *cp = ptr(args[0]);
+ if(!iscprim(args[0]) || cp_class(cp) != runetype)
+ type_error("rune", args[0]);+ return islowerrune(*(Rune*)cp_data(cp)) ? FL_T : FL_F;
+}
+
+BUILTIN("char-upper-case?", char_upper_casep)+{+ argcount(nargs, 1);
+ cprim_t *cp = ptr(args[0]);
+ if(!iscprim(args[0]) || cp_class(cp) != runetype)
+ type_error("rune", args[0]);+ return isupperrune(*(Rune*)cp_data(cp)) ? FL_T : FL_F;
+}
+
+BUILTIN("char-title-case?", char_title_casep)+{+ argcount(nargs, 1);
+ cprim_t *cp = ptr(args[0]);
+ if(!iscprim(args[0]) || cp_class(cp) != runetype)
+ type_error("rune", args[0]);+ return istitlerune(*(Rune*)cp_data(cp)) ? FL_T : FL_F;
+}
+
+BUILTIN("char-numeric?", char_numericp)+{+ argcount(nargs, 1);
+ cprim_t *cp = ptr(args[0]);
+ if(!iscprim(args[0]) || cp_class(cp) != runetype)
+ type_error("rune", args[0]);+ return isdigitrune(*(Rune*)cp_data(cp)) ? FL_T : FL_F;
+}
+
+BUILTIN("char-whitespace?", char_whitespacep)+{+ argcount(nargs, 1);
+ cprim_t *cp = ptr(args[0]);
+ if(!iscprim(args[0]) || cp_class(cp) != runetype)
+ type_error("rune", args[0]);+ return isspacerune(*(Rune*)cp_data(cp)) ? FL_T : FL_F;
}
BUILTIN("string.find", string_find)--
⑨