[前][次][番号順一覧][スレッド一覧]

ruby-changes:7284

From: akr <ko1@a...>
Date: Sun, 24 Aug 2008 11:43:06 +0900 (JST)
Subject: [ruby-changes:7284] Ruby:r18803 (trunk): * include/ruby/encoding.h (rb_econv_open_exc): declared.

akr	2008-08-24 11:42:37 +0900 (Sun, 24 Aug 2008)

  New Revision: 18803

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=18803

  Log:
    * include/ruby/encoding.h (rb_econv_open_exc): declared.
    
    * transcode.c (rb_eNoConverter): new exception.
      (rb_econv_open_exc): new function.
      (transcode_loop): use rb_econv_open_exc.
    
    * io.c (make_writeconv): use rb_econv_open_exc.
      (make_readconv): ditto.

  Modified files:
    trunk/ChangeLog
    trunk/include/ruby/encoding.h
    trunk/io.c
    trunk/test/ruby/test_econv.rb
    trunk/test/ruby/test_transcode.rb
    trunk/transcode.c

Index: include/ruby/encoding.h
===================================================================
--- include/ruby/encoding.h	(revision 18802)
+++ include/ruby/encoding.h	(revision 18803)
@@ -256,6 +256,8 @@
     int flags);
 void rb_econv_close(rb_econv_t *ec);
 
+VALUE rb_econv_open_exc(const char *senc, const char *denc, int flags);
+
 /* result: 0:success -1:failure */
 int rb_econv_insert_output(rb_econv_t *ec,
     const unsigned char *str, size_t len, const char *str_encoding);
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 18802)
+++ ChangeLog	(revision 18803)
@@ -1,3 +1,14 @@
+Sun Aug 24 11:40:38 2008  Tanaka Akira  <akr@f...>
+
+	* include/ruby/encoding.h (rb_econv_open_exc): declared.
+
+	* transcode.c (rb_eNoConverter): new exception.
+	  (rb_econv_open_exc): new function.
+	  (transcode_loop): use rb_econv_open_exc.
+
+	* io.c (make_writeconv): use rb_econv_open_exc.
+	  (make_readconv): ditto.
+
 Sun Aug 24 11:26:54 2008  NARUSE, Yui  <naruse@r...>
 
 	* lib/cgi.rb (CGI::unescapeHTML): consider ISO-8859-1.
Index: io.c
===================================================================
--- io.c	(revision 18802)
+++ io.c	(revision 18803)
@@ -705,6 +705,8 @@
 
         if (!fptr->enc) {
             fptr->writeconv = rb_econv_open("", "", ecflags);
+            if (!fptr->writeconv)
+                rb_exc_raise(rb_econv_open_exc("", "", ecflags));
             fptr->writeconv_stateless = Qnil;
             return;
         }
@@ -723,7 +725,7 @@
         if (senc) {
             fptr->writeconv = rb_econv_open(senc, denc, ecflags);
             if (!fptr->writeconv)
-                rb_raise(rb_eIOError, "code converter open failed (%s to %s)", senc, denc);
+                rb_exc_raise(rb_econv_open_exc(senc, denc, ecflags));
         }
         else {
             fptr->writeconv = NULL;
@@ -1447,7 +1449,7 @@
         }
         fptr->readconv = rb_econv_open(sname, dname, ecflags);
         if (!fptr->readconv)
-            rb_raise(rb_eIOError, "code converter open failed (%s to %s)", sname, dname);
+            rb_exc_raise(rb_econv_open_exc(sname, dname, ecflags));
         fptr->crbuf_off = 0;
         fptr->crbuf_len = 0;
         fptr->crbuf_capa = 1024;
Index: test/ruby/test_transcode.rb
===================================================================
--- test/ruby/test_transcode.rb	(revision 18802)
+++ test/ruby/test_transcode.rb	(revision 18803)
@@ -21,10 +21,10 @@
   def test_errors
     assert_raise(ArgumentError) { 'abc'.encode }
     assert_raise(ArgumentError) { 'abc'.encode! }
-    assert_raise(ArgumentError) { 'abc'.encode('foo', 'bar') }
-    assert_raise(ArgumentError) { 'abc'.encode!('foo', 'bar') }
-    assert_raise(ArgumentError) { 'abc'.force_encoding('utf-8').encode('foo') }
-    assert_raise(ArgumentError) { 'abc'.force_encoding('utf-8').encode!('foo') }
+    assert_raise(Encoding::NoConverter) { 'abc'.encode('foo', 'bar') }
+    assert_raise(Encoding::NoConverter) { 'abc'.encode!('foo', 'bar') }
+    assert_raise(Encoding::NoConverter) { 'abc'.force_encoding('utf-8').encode('foo') }
+    assert_raise(Encoding::NoConverter) { 'abc'.force_encoding('utf-8').encode!('foo') }
     assert_raise(Encoding::ConversionUndefined) { "\x80".encode('utf-8','ASCII-8BIT') }
     assert_raise(Encoding::InvalidByteSequence) { "\x80".encode('utf-8','US-ASCII') }
     assert_raise(Encoding::ConversionUndefined) { "\xA5".encode('utf-8','iso-8859-3') }
Index: test/ruby/test_econv.rb
===================================================================
--- test/ruby/test_econv.rb	(revision 18802)
+++ test/ruby/test_econv.rb	(revision 18803)
@@ -37,7 +37,7 @@
     name1 = "encoding-which-is-not-exist-1"
     name2 = "encoding-which-is-not-exist-2"
 
-    assert_raise(ArgumentError) {
+    assert_raise(Encoding::NoConverter) {
       Encoding::Converter.new(name1, name2)
     }
 
Index: transcode.c
===================================================================
--- transcode.c	(revision 18802)
+++ transcode.c	(revision 18803)
@@ -17,6 +17,7 @@
 
 VALUE rb_eConversionUndefined;
 VALUE rb_eInvalidByteSequence;
+VALUE rb_eNoConverter;
 
 VALUE rb_cEncodingConverter;
 
@@ -1388,6 +1389,47 @@
     }
 }
 
+VALUE
+rb_econv_open_exc(const char *senc, const char *denc, int flags)
+{
+    VALUE mesg, exc;
+    int noenc = 0;
+    mesg = rb_str_new_cstr("code converter open failed (");
+    if (*senc == '\0' || *denc == '\0') {
+        if (*senc != '\0')
+            rb_str_cat2(mesg, senc);
+        else if (*denc != '\0')
+            rb_str_cat2(mesg, denc);
+        else
+            noenc = 1;
+    }
+    else {
+        rb_str_catf(mesg, "%s to %s", senc, denc);
+    }
+    if (flags & (ECONV_UNIVERSAL_NEWLINE_DECODER|
+                 ECONV_CRLF_NEWLINE_ENCODER|
+                 ECONV_CR_NEWLINE_ENCODER)) {
+        char *pre = "";
+        if (!noenc)
+            rb_str_cat2(mesg, " with ");
+        if (flags & ECONV_UNIVERSAL_NEWLINE_DECODER)  {
+            rb_str_cat2(mesg, pre); pre = ",";
+            rb_str_cat2(mesg, "Universal-newline");
+        }
+        if (flags & ECONV_CRLF_NEWLINE_ENCODER) {
+            rb_str_cat2(mesg, pre); pre = ",";
+            rb_str_cat2(mesg, "CRLF-newline");
+        }
+        if (flags & ECONV_CR_NEWLINE_ENCODER) {
+            rb_str_cat2(mesg, pre); pre = ",";
+            rb_str_cat2(mesg, "CR-newline");
+        }
+    }
+    rb_str_cat2(mesg, ")");
+    exc = rb_exc_new3(rb_eNoConverter, mesg);
+    return exc;
+}
+
 static VALUE
 make_econv_exception(rb_econv_t *ec)
 {
@@ -1491,10 +1533,12 @@
     unsigned char *out_start = *out_pos;
     int max_output;
     VALUE exc;
+    int ecflags;
 
-    ec = rb_econv_open(from_encoding, to_encoding, opt & (ECONV_INVALID_MASK|ECONV_UNDEF_MASK));
+    ecflags = opt & (ECONV_INVALID_MASK|ECONV_UNDEF_MASK);
+    ec = rb_econv_open(from_encoding, to_encoding, ecflags);
     if (!ec)
-        rb_raise(rb_eArgError, "transcoding not supported (from %s to %s)", from_encoding, to_encoding);
+        rb_exc_raise(rb_econv_open_exc(from_encoding, to_encoding, ecflags));
 
     last_tc = ec->last_tc;
     max_output = last_tc ? last_tc->transcoder->max_output : 1;
@@ -1539,10 +1583,12 @@
     const unsigned char *ptr;
     int max_output;
     VALUE exc;
+    int ecflags;
 
-    ec = rb_econv_open(from_encoding, to_encoding, opt & (ECONV_INVALID_MASK|ECONV_UNDEF_MASK));
+    ecflags = opt & (ECONV_INVALID_MASK|ECONV_UNDEF_MASK);
+    ec = rb_econv_open(from_encoding, to_encoding, ecflags);
     if (!ec)
-        rb_raise(rb_eArgError, "transcoding not supported (from %s to %s)", from_encoding, to_encoding);
+        rb_exc_raise(rb_econv_open_exc(from_encoding, to_encoding, ecflags));
 
     last_tc = ec->last_tc;
     max_output = last_tc ? last_tc->transcoder->max_output : 1;
@@ -1883,7 +1929,7 @@
 
     ec = rb_econv_open(sname, dname, flags);
     if (!ec) {
-        rb_raise(rb_eArgError, "encoding convewrter not supported (from %s to %s)", sname, dname);
+        rb_exc_raise(rb_econv_open_exc(sname, dname, flags));
     }
 
     if (*sname && *dname) { /* check "" to "universal_newline" */
@@ -2242,9 +2288,9 @@
     string = rb_str_transcode(string, rb_enc_from_encoding(rb_enc_find(insert_enc)));
 
     ret = rb_econv_insert_output(ec, (const unsigned char *)RSTRING_PTR(string), RSTRING_LEN(string), insert_enc);
-
     if (ret == -1)
         return Qfalse;
+
     return Qtrue;
 }
 
@@ -2311,6 +2357,7 @@
 {
     rb_eConversionUndefined = rb_define_class_under(rb_cEncoding, "ConversionUndefined", rb_eStandardError);
     rb_eInvalidByteSequence = rb_define_class_under(rb_cEncoding, "InvalidByteSequence", rb_eStandardError);
+    rb_eNoConverter = rb_define_class_under(rb_cEncoding, "NoConverter", rb_eStandardError);
 
     transcoder_table = st_init_strcasetable();
 

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]