From 8ef3cb7e61e81c5f6958398b79e9fc276386b714 Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Tue, 29 Mar 2016 00:32:50 -0400 Subject: [PATCH] utf8/string functions --- include/cyclone/runtime.h | 2 ++ runtime.c | 13 ++++++++++++- scheme/base.sld | 14 ++++++++++++-- scheme/cyclone/cgen.sld | 10 ++++++++++ scheme/cyclone/transforms.sld | 2 ++ scheme/eval.sld | 2 ++ 6 files changed, 40 insertions(+), 3 deletions(-) diff --git a/include/cyclone/runtime.h b/include/cyclone/runtime.h index eab5bd07..944fe5f5 100644 --- a/include/cyclone/runtime.h +++ b/include/cyclone/runtime.h @@ -360,6 +360,8 @@ extern const object primitive_vector_91set_67; extern const object primitive_bytevector; extern const object primitive_bytevector_91append; extern const object primitive_Cyc_91bytevector_91copy; +extern const object primitive_Cyc_string_91_125utf8; +extern const object primitive_Cyc_utf8_91_125string; extern const object primitive_bytevector_91u8_91ref; extern const object primitive_bytevector_91u8_91set_67; extern const object primitive_string_91ref; diff --git a/runtime.c b/runtime.c index 61617cf1..10dc10f6 100644 --- a/runtime.c +++ b/runtime.c @@ -2068,6 +2068,14 @@ void _Cyc_91bytevector_91copy(void *data, object cont, object args) { object argc = Cyc_length(data, args); Cyc_check_num_args(data, "Cyc-bytevector-copy", 3, args); Cyc_bytevector_copy(data, cont, car(args), cadr(args), caddr(args)); } +void _Cyc_string_91_125utf8(void *data, object cont, object args) { + object argc = Cyc_length(data, args); + Cyc_check_num_args(data, "Cyc-string->utf8", 3, args); + Cyc_string2utf8(data, cont, car(args), cadr(args), caddr(args)); } +void _Cyc_utf8_91_125string(void *data, object cont, object args) { + object argc = Cyc_length(data, args); + Cyc_check_num_args(data, "Cyc-utf8->string", 3, args); + Cyc_utf82string(data, cont, car(args), cadr(args), caddr(args)); } void _vector_91length(void *data, object cont, object args){ Cyc_check_num_args(data, "vector_91length", 1, args); { object obj = Cyc_vector_length(data, car(args)); @@ -2904,7 +2912,8 @@ static primitive_type bytevector_91append_primitive = {{0}, primitive_tag, "byte static primitive_type Cyc_91bytevector_91copy_primitive = {{0}, primitive_tag, "Cyc-bytevector-copy", &_Cyc_91bytevector_91copy}; static primitive_type bytevector_91u8_91ref_primitive = {{0}, primitive_tag, "bytevector-u8-ref", &_bytevector_91u8_91ref}; static primitive_type bytevector_91u8_91set_67_primitive = {{0}, primitive_tag, "bytevector-u8-set!", &_bytevector_91u8_91set_67}; - +static primitive_type Cyc_string_91_125utf8_primitive = {{0}, primitive_tag, "Cyc-string->utf8", &_Cyc_string_91_125utf8}; +static primitive_type Cyc_utf8_91_125string_primitive = {{0}, primitive_tag, "Cyc-utf8->string", &_Cyc_utf8_91_125string}; static primitive_type make_91vector_primitive = {{0}, primitive_tag, "make-vector", &_make_91vector}; static primitive_type vector_91ref_primitive = {{0}, primitive_tag, "vector-ref", &_vector_91ref}; static primitive_type vector_91set_67_primitive = {{0}, primitive_tag, "vector-set!", &_vector_91set_67}; @@ -3034,6 +3043,8 @@ const object primitive_bytevector_91append = &bytevector_91append_primitive; const object primitive_Cyc_91bytevector_91copy = &Cyc_91bytevector_91copy_primitive; const object primitive_bytevector_91u8_91ref = &bytevector_91u8_91ref_primitive; const object primitive_bytevector_91u8_91set_67 = &bytevector_91u8_91set_67_primitive; +const object primitive_Cyc_string_91_125utf8 = & Cyc_string_91_125utf8_primitive; +const object primitive_Cyc_utf8_91_125string = &Cyc_utf8_91_125string_primitive; const object primitive_list_91_125vector = &list_91_125vector_primitive; const object primitive_boolean_127 = &boolean_127_primitive; const object primitive_char_127 = &char_127_primitive; diff --git a/scheme/base.sld b/scheme/base.sld index 8b9064a2..8461cfb4 100644 --- a/scheme/base.sld +++ b/scheme/base.sld @@ -153,6 +153,8 @@ eof-object syntax-error bytevector-copy + utf8->string + string->utf8 ;;;; ; Possibly missing functions: @@ -168,10 +170,8 @@ ; ; : No unicode support at this time ; peek-u8 -; string->utf8 ; read-u8 ; u8-ready? -; utf8->string ; write-u8 ; ; ; No complex or rational numbers at this time @@ -698,6 +698,16 @@ (start (if (> (length opts) 0) (car opts) 0)) (end (if (> (length opts) 1) (cadr opts) len))) (Cyc-bytevector-copy bv start end))) + (define (utf8->string bv . opts) + (letrec ((len (bytevector-length bv)) + (start (if (> (length opts) 0) (car opts) 0)) + (end (if (> (length opts) 1) (cadr opts) len))) + (Cyc-utf8->string bv start end))) + (define (string->utf8 str . opts) + (letrec ((len (string-length str)) + (start (if (> (length opts) 0) (car opts) 0)) + (end (if (> (length opts) 1) (cadr opts) len))) + (Cyc-string->utf8 str start end))) (define (vector->string vec . opts) (let ((lst (apply vector->list (cons vec opts)))) (list->string lst))) diff --git a/scheme/cyclone/cgen.sld b/scheme/cyclone/cgen.sld index a3c1ac9a..403773bb 100644 --- a/scheme/cyclone/cgen.sld +++ b/scheme/cyclone/cgen.sld @@ -575,6 +575,8 @@ ((eq? p 'bytevector) "Cyc_bytevector") ((eq? p 'bytevector-append) "Cyc_bytevector_append") ((eq? p 'Cyc-bytevector-copy) "Cyc_bytevector_copy") + ((eq? p 'Cyc-utf8->string) "Cyc_utf82string") + ((eq? p 'Cyc-string->utf8) "Cyc_string2utf8") ((eq? p 'bytevector-u8-ref) "Cyc_bytevector_u8_ref") ((eq? p 'bytevector-u8-set!) "Cyc_bytevector_u8_set") ((eq? p 'make-vector) "Cyc_make_vector") @@ -664,6 +666,8 @@ bytevector-length bytevector-append Cyc-bytevector-copy + Cyc-utf8->string + Cyc-string->utf8 bytevector bytevector-u8-ref bytevector-u8-set! @@ -722,6 +726,8 @@ ((eq? p 'bytevector) "object") ((eq? p 'bytevector-append) "object") ((eq? p 'Cyc-bytevector-copy) "object") + ((eq? p 'Cyc-utf8->string) "object") + ((eq? p 'Cyc-string->utf8) "object") ((eq? p 'make-vector) "object") ((eq? p 'list->string) "object") ((eq? p 'list->vector) "object") @@ -744,6 +750,8 @@ bytevector bytevector-append Cyc-bytevector-copy + Cyc-utf8->string + Cyc-string->utf8 make-vector list->vector symbol->string number->string substring @@ -763,6 +771,8 @@ make-bytevector bytevector-append Cyc-bytevector-copy + Cyc-utf8->string + Cyc-string->utf8 bytevector bytevector-u8-ref bytevector-u8-set! diff --git a/scheme/cyclone/transforms.sld b/scheme/cyclone/transforms.sld index 7c4217e4..3387b41b 100644 --- a/scheme/cyclone/transforms.sld +++ b/scheme/cyclone/transforms.sld @@ -518,6 +518,8 @@ bytevector bytevector-append Cyc-bytevector-copy + Cyc-utf8->string + Cyc-string->utf8 bytevector-u8-ref bytevector-u8-set! bytevector? diff --git a/scheme/eval.sld b/scheme/eval.sld index f187ce1a..5c6ef088 100644 --- a/scheme/eval.sld +++ b/scheme/eval.sld @@ -248,6 +248,8 @@ (list 'bytevector-length bytevector-length) (list 'bytevector-append bytevector-append) (list 'Cyc-bytevector-copy Cyc-bytevector-copy) + ;(list 'Cyc-utf8->string Cyc-utf8->string) + ;(list 'Cyc-string->utf8 Cyc-string->utf8) (list 'bytevector bytevector) (list 'bytevector-u8-ref bytevector-u8-ref) (list 'bytevector-u8-set! bytevector-u8-set!)