summaryrefslogtreecommitdiff
path: root/libguile/print.c
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 /libguile/print.c
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 'libguile/print.c')
-rw-r--r--libguile/print.c31
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);