Author: yamakenz
Date: Tue Jul 10 05:12:38 2007
New Revision: 4684

Modified:
   sigscheme-trunk/NEWS
   sigscheme-trunk/src/module-sscm-ext.c
   sigscheme-trunk/src/sigscheme.c
   sigscheme-trunk/src/sigscheme.h
   sigscheme-trunk/src/sigschemeinternal.h
   sigscheme-trunk/test/test-sscm-ext.scm

Log:
* This commit add new character codec procedures %%current-char-codec and
  %%set-current-char-codec!

* src/sigscheme.h
  - (scm_p_current_char_codec, scm_p_set_current_char_codecx): New function
    decl
* src/module-sscm-ext.c
  - (scm_p_current_char_codec, scm_p_set_current_char_codecx): New function
* src/sigscheme.c
  - (ERRMSG_UNSUPPORTED_ENCODING, ERRMSG_CODEC_SW_NOT_SUPPORTED): Moved to
    sigschemeinternal.h
* src/sigschemeinternal.h
  - (ERRMSG_UNSUPPORTED_ENCODING, ERRMSG_CODEC_SW_NOT_SUPPORTED): Moved from
    sigscheme.c
* test/test-sscm-ext.scm
  - Add tests for %%current-char-codec and %%set-current-char-codec!
* NEWS
  - Update


Modified: sigscheme-trunk/NEWS
==============================================================================
--- sigscheme-trunk/NEWS        (original)
+++ sigscheme-trunk/NEWS        Tue Jul 10 05:12:38 2007
@@ -6,6 +6,9 @@
   - New syntax let-optionals* compatible with Gauche for optional argument
     processing
 
+  - New character codec procedures %%current-char-codec and
+    %%set-current-char-codec!
+
   - New debugging procedures %pair-mutable?, %string-mutable?,
     %vector-mutable?
 

Modified: sigscheme-trunk/src/module-sscm-ext.c
==============================================================================
--- sigscheme-trunk/src/module-sscm-ext.c       (original)
+++ sigscheme-trunk/src/module-sscm-ext.c       Tue Jul 10 05:12:38 2007
@@ -118,6 +118,41 @@
 }
 
 SCM_EXPORT ScmObj
+scm_p_current_char_codec(void)
+{
+    const char *encoding;
+    DECLARE_FUNCTION("%%current-char-codec", procedure_fixed_0);
+
+#if SCM_USE_MULTIBYTE_CHAR
+    encoding = SCM_CHARCODEC_ENCODING(scm_current_char_codec);
+#else
+    encoding = "ISO-8859-1";
+#endif
+
+    return CONST_STRING(encoding);
+}
+
+SCM_EXPORT ScmObj
+scm_p_set_current_char_codecx(ScmObj encoding)
+{
+    ScmCharCodec *codec;    
+    DECLARE_FUNCTION("%%set-current-char-codec!", procedure_fixed_1);
+
+    ENSURE_STRING(encoding);
+
+#if SCM_USE_MULTIBYTE_CHAR
+    codec = scm_mb_find_codec(SCM_STRING_STR(encoding));
+    if (!codec)
+        ERR_OBJ(ERRMSG_UNSUPPORTED_ENCODING, encoding);
+    scm_current_char_codec = codec;
+#else
+    ERR(ERRMSG_CODEC_SW_NOT_SUPPORTED);
+#endif
+
+    return scm_p_current_char_codec();
+}
+
+SCM_EXPORT ScmObj
 scm_p_prealloc_heaps(ScmObj n)
 {
     DECLARE_FUNCTION("%%prealloc-heaps", procedure_fixed_1);

Modified: sigscheme-trunk/src/sigscheme.c
==============================================================================
--- sigscheme-trunk/src/sigscheme.c     (original)
+++ sigscheme-trunk/src/sigscheme.c     Tue Jul 10 05:12:38 2007
@@ -57,10 +57,6 @@
 /*=======================================
   File Local Macro Definitions
 =======================================*/
-#define ERRMSG_UNSUPPORTED_ENCODING "unsupported encoding"
-#define ERRMSG_CODEC_SW_NOT_SUPPORTED                                        \
-    "character encoding switching is not supported on this build"
-
 #if !SCM_USE_CONTINUATION
 #define scm_p_call_with_current_continuation NULL
 #define scm_p_dynamic_wind                   NULL

Modified: sigscheme-trunk/src/sigscheme.h
==============================================================================
--- sigscheme-trunk/src/sigscheme.h     (original)
+++ sigscheme-trunk/src/sigscheme.h     Tue Jul 10 05:12:38 2007
@@ -1643,6 +1643,8 @@
 SCM_EXPORT void scm_require(const char *filename);
 SCM_EXPORT ScmObj scm_p_symbol_boundp(ScmObj sym, ScmObj rest);
 SCM_EXPORT ScmObj scm_p_current_environment(ScmEvalState *eval_state);
+SCM_EXPORT ScmObj scm_p_current_char_codec(void);
+SCM_EXPORT ScmObj scm_p_set_current_char_codecx(ScmObj encoding);
 SCM_EXPORT ScmObj scm_p_prealloc_heaps(ScmObj n);
 SCM_EXPORT ScmObj scm_p_pair_mutablep(ScmObj kons);
 SCM_EXPORT ScmObj scm_p_fixnum_width(void);

Modified: sigscheme-trunk/src/sigschemeinternal.h
==============================================================================
--- sigscheme-trunk/src/sigschemeinternal.h     (original)
+++ sigscheme-trunk/src/sigschemeinternal.h     Tue Jul 10 05:12:38 2007
@@ -196,6 +196,9 @@
     "proper list required for function call but got"
 #define SCM_ERRMSG_NULL_IN_STRING                                            \
     "null character in a middle of string is not enabled"
+#define ERRMSG_UNSUPPORTED_ENCODING "unsupported encoding"
+#define ERRMSG_CODEC_SW_NOT_SUPPORTED                                        \
+    "character encoding switching is not supported on this build"
 
 #if SCM_STRICT_TOPLEVEL_DEFINITIONS
 /* FIXME: temporary hack. SCM_EOF is only used as an unique ID. */

Modified: sigscheme-trunk/test/test-sscm-ext.scm
==============================================================================
--- sigscheme-trunk/test/test-sscm-ext.scm      (original)
+++ sigscheme-trunk/test/test-sscm-ext.scm      Tue Jul 10 05:12:38 2007
@@ -42,6 +42,21 @@
 (define tn test-name)
 (define ud (undef))
 
+(tn "%%current-char-codec")
+(assert-equal? (tn) "UTF-8"      (%%current-char-codec))
+
+(tn "%%set-current-char-codec!")
+(assert-error  (tn) (lambda ()   (%%set-current-char-codec! "")))
+(assert-error  (tn) (lambda ()   (%%set-current-char-codec! "UTF-32")))
+(assert-equal? (tn) "UTF-8"      (%%set-current-char-codec! "UTF-8"))
+(assert-equal? (tn) "UTF-8"      (%%current-char-codec))
+(assert-equal? (tn) "ISO-8859-1" (%%set-current-char-codec! "ISO-8859-1"))
+(assert-equal? (tn) "ISO-8859-1" (%%current-char-codec))
+(assert-error  (tn) (lambda ()   (%%set-current-char-codec! "UTF-32")))
+(assert-equal? (tn) "ISO-8859-1" (%%current-char-codec))
+(assert-equal? (tn) "UTF-8"      (%%set-current-char-codec! "UTF-8"))
+(assert-equal? (tn) "UTF-8"      (%%current-char-codec))
+
 (tn "let-optionals* invalid forms")
 (assert-error  (tn) (lambda () (let-optionals* '() ())))
 (assert-error  (tn) (lambda () (let-optionals* #(0) () #t)))

Reply via email to