diff options
author | Michael Gran <spk121@yahoo.com> | 2009-07-29 06:38:32 -0700 |
---|---|---|
committer | Michael Gran <spk121@yahoo.com> | 2009-07-29 06:38:32 -0700 |
commit | 904a78f11d2d11a58d5df365a44c4fbbd4c96df3 (patch) | |
tree | c0df0bc8bfcb70ce62ce7de6d42b9df26352b7e8 /libguile/print.c | |
parent | 77332b21a01fac906ae4707426e00f01e62c0415 (diff) | |
download | guile-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 'libguile/print.c')
-rw-r--r-- | libguile/print.c | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/libguile/print.c b/libguile/print.c index 604571820..1a5aebe1b 100644 --- a/libguile/print.c +++ b/libguile/print.c @@ -23,6 +23,7 @@ #endif #include <errno.h> +#include <unictype.h> #include "libguile/_scm.h" #include "libguile/chars.h" @@ -436,7 +437,7 @@ iprin1 (SCM exp, SCM port, scm_print_state *pstate) case scm_tc3_imm24: if (SCM_CHARP (exp)) { - long i = SCM_CHAR (exp); + scm_t_wchar i = SCM_CHAR (exp); const char *name; if (SCM_WRITINGP (pstate)) @@ -445,10 +446,30 @@ iprin1 (SCM exp, SCM port, scm_print_state *pstate) name = scm_i_charname (exp); if (name != NULL) scm_puts (name, port); - else if (i < 0 || i > '\177') - scm_intprint (i, 8, port); - else - scm_putc (i, port); + else if (uc_is_general_category_withtable (i, UC_CATEGORY_MASK_L + | UC_CATEGORY_MASK_M + | UC_CATEGORY_MASK_N + | UC_CATEGORY_MASK_P + | UC_CATEGORY_MASK_S)) + /* Print the character if is graphic character. */ + { + if (i<256) + { + /* Character is graphic. Print it. */ + scm_putc (i, port); + } + else + { + /* Character is graphic but unrepresentable in + this port's encoding. */ + scm_intprint (i, 8, port); + } + } + else + { + /* Character is a non-graphical character. */ + scm_intprint (i, 8, port); + } } else scm_putc (i, port); |