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/chars.h | |
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/chars.h')
-rw-r--r-- | libguile/chars.h | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/libguile/chars.h b/libguile/chars.h index 5bceea533..e68f06d21 100644 --- a/libguile/chars.h +++ b/libguile/chars.h @@ -3,7 +3,7 @@ #ifndef SCM_CHARS_H #define SCM_CHARS_H -/* Copyright (C) 1995,1996,2000,2001,2004, 2006, 2008 Free Software Foundation, Inc. +/* Copyright (C) 1995,1996,2000,2001,2004, 2006, 2008, 2009 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -28,9 +28,24 @@ /* Immediate Characters */ + +#ifndef SCM_WCHAR_DEFINED +typedef scm_t_int32 scm_t_wchar; +#define SCM_WCHAR_DEFINED +#endif + #define SCM_CHARP(x) (SCM_ITAG8(x) == scm_tc8_char) -#define SCM_CHAR(x) ((unsigned int)SCM_ITAG8_DATA(x)) -#define SCM_MAKE_CHAR(x) SCM_MAKE_ITAG8((scm_t_bits) (unsigned char) (x), scm_tc8_char) +#define SCM_CHAR(x) ((scm_t_wchar)SCM_ITAG8_DATA(x)) + +#define SCM_MAKE_CHAR(x) ({scm_t_int32 _x = (x); \ + _x < 0 \ + ? SCM_MAKE_ITAG8((scm_t_bits)(unsigned char)_x, scm_tc8_char) \ + : SCM_MAKE_ITAG8((scm_t_bits)_x, scm_tc8_char);}) + +#define SCM_CODEPOINT_MAX (0x10ffff) +#define SCM_IS_UNICODE_CHAR(c) \ + ((scm_t_wchar)(c)<=0xd7ff || \ + ((scm_t_wchar)(c)>=0xe000 && (scm_t_wchar)(c)<=SCM_CODEPOINT_MAX)) @@ -55,9 +70,9 @@ SCM_API SCM scm_char_to_integer (SCM chr); SCM_API SCM scm_integer_to_char (SCM n); SCM_API SCM scm_char_upcase (SCM chr); SCM_API SCM scm_char_downcase (SCM chr); -SCM_API int scm_c_upcase (unsigned int c); -SCM_API int scm_c_downcase (unsigned int c); -SCM_INTERNAL const char * scm_i_charname (SCM chr); +SCM_API scm_t_wchar scm_c_upcase (scm_t_wchar c); +SCM_API scm_t_wchar scm_c_downcase (scm_t_wchar c); +SCM_INTERNAL const char *scm_i_charname (SCM chr); SCM_INTERNAL SCM scm_i_charname_to_char (const char *charname, size_t charname_len); SCM_INTERNAL void scm_init_chars (void); |