Author: yamakenz
Date: Sun Aug 19 05:15:04 2007
New Revision: 4865
Modified:
sigscheme-trunk/NEWS
sigscheme-trunk/QALog
sigscheme-trunk/src/sigscheme.h
sigscheme-trunk/src/string-procedure.c
sigscheme-trunk/src/string.c
sigscheme-trunk/test/test-string-proc.scm
Log:
* src/string.c
- (scm_p_string_length): Fix string-length on multibyte string invalidly
counted based on current char codec. It is inconsistent with string length
recorded in string object
* src/sigscheme.h
- (scm_p_string_reconstructx): New function decl
* src/string-procedure.c
- (scm_p_string_reconstructx): New function
* test/test-string-proc.scm
- Add tests for %%string-reconstruct!
* QALog
* NEWS
- Update
Modified: sigscheme-trunk/NEWS
==============================================================================
--- sigscheme-trunk/NEWS (original)
+++ sigscheme-trunk/NEWS Sun Aug 19 05:15:04 2007
@@ -27,8 +27,8 @@
- System-installed libraries written in Scheme are introduced. And to manage
them, scm_set_system_load_path() and %%system-load-path have been added
- - New character codec procedures %%current-char-codec,
- %%set-current-char-codec! and with-char-codec
+ - New character codec related procedures %%current-char-codec,
+ %%set-current-char-codec!, with-char-codec and %%string-reconstruct!
- New port handling procedures %%current-error-port,
%%set-current-input-port!, %%set-current-output-port!,
@@ -76,6 +76,9 @@
such as (receive (x y) (call/cc (lambda (k) (k 0 1))))
- [SRFI-38] Fix broken execution by misinitialized internal hash table
+
+ - Fix string-length on multibyte string invalidly counted based on current
+ char codec. It is inconsistent with string length recorded in string object
- [R5RS] Fix error on (integer->char 0) on non-Unicode codecs
Modified: sigscheme-trunk/QALog
==============================================================================
--- sigscheme-trunk/QALog (original)
+++ sigscheme-trunk/QALog Sun Aug 19 05:15:04 2007
@@ -853,24 +853,24 @@
file: string.c
category: r5rs
-spec by eyes: [EMAIL PROTECTED]
-spec by tests: [EMAIL PROTECTED]
+spec by eyes: [EMAIL PROTECTED], [EMAIL PROTECTED]
+spec by tests: [EMAIL PROTECTED], [EMAIL PROTECTED]
general review: [EMAIL PROTECTED]
64-bit by eyes: [EMAIL PROTECTED]
64-bit by tests:
coding style: [EMAIL PROTECTED]
-normal case tests: [EMAIL PROTECTED]
+normal case tests: [EMAIL PROTECTED], [EMAIL PROTECTED]
corner case tests: [EMAIL PROTECTED]
file: string-procedure.c
category: r5rs
-spec by eyes: [EMAIL PROTECTED], [EMAIL PROTECTED]
-spec by tests: [EMAIL PROTECTED], [EMAIL PROTECTED]
+spec by eyes: [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED]
+spec by tests: [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED]
general review: [EMAIL PROTECTED]
64-bit by eyes: [EMAIL PROTECTED]
64-bit by tests:
coding style: [EMAIL PROTECTED]
-normal case tests: [EMAIL PROTECTED]
+normal case tests: [EMAIL PROTECTED], [EMAIL PROTECTED]
corner case tests:
file: vector.c
@@ -1107,6 +1107,13 @@
Log
---
+2007-08-19 YamaKen <yamaken AT bp.iij4u.or.jp>
+ * string.c
+ * string-procedure.c
+ - QA done again @r4865 for multibyte string handlings. string-length
+ is fixed, and new procedure %%string-reconstruct! has been added
+ with tests in test-string-proc.scm
+
2007-08-11 YamaKen <yamaken AT bp.iij4u.or.jp>
* sigscheme.c
- QA done again @r4818 for array<->list conversion functions. The 3
Modified: sigscheme-trunk/src/sigscheme.h
==============================================================================
--- sigscheme-trunk/src/sigscheme.h (original)
+++ sigscheme-trunk/src/sigscheme.h Sun Aug 19 05:15:04 2007
@@ -1514,6 +1514,7 @@
SCM_EXPORT ScmObj scm_p_list2string(ScmObj lst);
SCM_EXPORT ScmObj scm_p_string_fillx(ScmObj str, ScmObj ch);
SCM_EXPORT ScmObj scm_p_string_mutablep(ScmObj str);
+SCM_EXPORT ScmObj scm_p_string_reconstructx(ScmObj str);
#endif /* SCM_USE_STRING_PROCEDURE */
/* vector.c */
Modified: sigscheme-trunk/src/string-procedure.c
==============================================================================
--- sigscheme-trunk/src/string-procedure.c (original)
+++ sigscheme-trunk/src/string-procedure.c Sun Aug 19 05:15:04 2007
@@ -615,3 +615,21 @@
return MAKE_BOOL(SCM_STRING_MUTABLEP(str));
}
+
+SCM_EXPORT ScmObj
+scm_p_string_reconstructx(ScmObj str)
+{
+ scm_int_t len;
+ DECLARE_FUNCTION("%%string-reconstruct!", procedure_fixed_1);
+
+ ENSURE_STRING(str);
+ ENSURE_MUTABLE_STRING(str);
+
+ /* recount string length in current char codec */
+#if SCM_USE_MULTIBYTE_CHAR
+ len = scm_mb_bare_c_strlen(scm_current_char_codec, SCM_STRING_STR(str));
+ SCM_STRING_SET_LEN(str, len);
+#endif
+
+ return str;
+}
Modified: sigscheme-trunk/src/string.c
==============================================================================
--- sigscheme-trunk/src/string.c (original)
+++ sigscheme-trunk/src/string.c Sun Aug 19 05:15:04 2007
@@ -81,11 +81,7 @@
ENSURE_STRING(str);
-#if SCM_USE_MULTIBYTE_CHAR
- len = scm_mb_bare_c_strlen(scm_current_char_codec, SCM_STRING_STR(str));
-#else
len = SCM_STRING_LEN(str);
-#endif
return MAKE_INT(len);
}
Modified: sigscheme-trunk/test/test-string-proc.scm
==============================================================================
--- sigscheme-trunk/test/test-string-proc.scm (original)
+++ sigscheme-trunk/test/test-string-proc.scm Sun Aug 19 05:15:04 2007
@@ -1034,4 +1034,31 @@
(assert-true (tn) (mutable? (my-string-fill! (cp "a b ") #\z)))
(assert-true (tn) (mutable? (my-string-fill! (cp " a b") #\z)))
+(tn "%%string-reconstruct!")
+(assert-error (tn) (lambda () (%%string-reconstruct! "")))
+(assert-error (tn) (lambda () (%%string-reconstruct! "const str")))
+(assert-error (tn) (lambda () (%%string-reconstruct! " a ")))
+(assert-equal? (tn) 0 (string-length (string-copy "")))
+(assert-equal? (tn) 9 (string-length (string-copy "const str")))
+(assert-equal? (tn) 3 (string-length (string-copy " a ")))
+(assert-equal? (tn) 0 (string-length (with-char-codec "ISO-8859-1"
+ (lambda ()
+ (%%string-reconstruct!
+ (string-copy ""))))))
+(assert-equal? (tn) 9 (string-length (with-char-codec "ISO-8859-1"
+ (lambda ()
+ (%%string-reconstruct!
+ (string-copy "const str"))))))
+(assert-equal? (tn) 7 (string-length (with-char-codec "ISO-8859-1"
+ (lambda ()
+ (%%string-reconstruct!
+ (string-copy " a "))))))
+(let ((byte-str (with-char-codec "ISO-8859-1"
+ (lambda ()
+ (%%string-reconstruct!
+ (string-copy " a "))))))
+ (assert-equal? (tn) 7 (string-length byte-str))
+ ;; reconstruct as UTF-8 string
+ (assert-equal? (tn) 3 (string-length (%%string-reconstruct! byte-str))))
+
(total-report)