summaryrefslogtreecommitdiff
path: root/module
diff options
context:
space:
mode:
authorMichael Gran <spk121@yahoo.com>2009-07-29 06:38:32 -0700
committerMichael Gran <spk121@yahoo.com>2009-07-29 06:38:32 -0700
commit904a78f11d2d11a58d5df365a44c4fbbd4c96df3 (patch)
treec0df0bc8bfcb70ce62ce7de6d42b9df26352b7e8 /module
parent77332b21a01fac906ae4707426e00f01e62c0415 (diff)
downloadguile-904a78f11d2d11a58d5df365a44c4fbbd4c96df3.tar.gz
Add 32-bit characters
This adds the 32-bit standalone characters. Strings are still 8-bit. Characters larger than 8-bit can only be entered or displayed in octal format at this point. At this point, the terminal's display encoding is expected to be Latin-1. * module/language/assembly/compile-bytecode.scm (write-bytecode): add 32-bit char * module/language/assembly.scm (object->assembly): add 32-bit char (assembly->object): add 32-bit char * libguile/vm-i-system.c (make-char32): new op * libguile/print.c (iprin1): print 32-bit char * libguile/numbers.h: add type scm_t_wchar * libguile/numbers.c: add type scm_t_wchar * libguile/chars.h: new type scm_t_wchar (SCM_CODEPOINT_MAX): new (SCM_IS_UNICODE_CHAR): new (SCM_MAKE_CHAR): operate on 32-bit char * libguile/chars.c: comparison operators now use Unicode codepoints (scm_c_upcase): now receives and returns scm_t_wchar (scm_c_downcase): now receives and returns scm_t_wchar
Diffstat (limited to 'module')
-rw-r--r--module/language/assembly.scm11
-rw-r--r--module/language/assembly/compile-bytecode.scm1
2 files changed, 11 insertions, 1 deletions
diff --git a/module/language/assembly.scm b/module/language/assembly.scm
index e7308ac6f..3a1da4fe3 100644
--- a/module/language/assembly.scm
+++ b/module/language/assembly.scm
@@ -131,7 +131,11 @@
(bytevector-s64-set! bv 0 x (endianness big))
bv))))
(else #f)))
- ((char? x) `(make-char8 ,(char->integer x)))
+ ((char? x)
+ (cond ((<= (char->integer x) #xff)
+ `(make-char8 ,(char->integer x)))
+ (else
+ `(make-char32 ,(char->integer x)))))
(else #f)))
(define (assembly->object code)
@@ -156,6 +160,11 @@
(endianness big)))
((make-char8 ,n)
(integer->char n))
+ ((make-char32 ,n1 ,n2 ,n3 ,n4)
+ (integer->char (+ (* n1 #x1000000)
+ (* n2 #x10000)
+ (* n3 #x100)
+ n4)))
((load-string ,s) s)
((load-symbol ,s) (string->symbol s))
((load-keyword ,s) (symbol->keyword (string->symbol s)))
diff --git a/module/language/assembly/compile-bytecode.scm b/module/language/assembly/compile-bytecode.scm
index bf6c5f7b5..bed0fb2dc 100644
--- a/module/language/assembly/compile-bytecode.scm
+++ b/module/language/assembly/compile-bytecode.scm
@@ -122,6 +122,7 @@
;; meets the alignment requirements of `scm_objcode'. See
;; `scm_c_make_objcode_slice ()'.
(write-bytecode meta write get-addr '()))))
+ ((make-char32 ,x) (write-uint32-be x))
((load-unsigned-integer ,str) (write-loader str))
((load-integer ,str) (write-loader str))
((load-number ,str) (write-loader str))