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

ruby-changes:2710

From: ko1@a...
Date: 12 Dec 2007 22:23:38 +0900
Subject: [ruby-changes:2710] matz - Ruby:r14201 (trunk): * io.c (rb_io_mode_enc): allow specifying external encoding in

matz	2007-12-12 22:23:07 +0900 (Wed, 12 Dec 2007)

  New Revision: 14201

  Modified files:
    trunk/ChangeLog
    trunk/io.c

  Log:
    * io.c (rb_io_mode_enc): allow specifying external encoding in
      open mode, e.g. open(path, "r:utf-8").

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=14201&r2=14200
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/io.c?r1=14201&r2=14200

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 14200)
+++ ChangeLog	(revision 14201)
@@ -1,3 +1,8 @@
+Wed Dec 12 22:21:34 2007  Yukihiro Matsumoto  <matz@r...>
+
+	* io.c (rb_io_mode_enc): allow specifying external encoding in
+	  open mode, e.g. open(path, "r:utf-8").
+
 Wed Dec 12 21:26:03 2007  Yukihiro Matsumoto  <matz@r...>
 
 	* eval_method.ci (rb_alias): no need to skip aliasing when new
Index: io.c
===================================================================
--- io.c	(revision 14200)
+++ io.c	(revision 14201)
@@ -2932,14 +2932,16 @@
 
     while (*m) {
         switch (*m++) {
-        case 'b':
+	  case 'b':
             flags |= FMODE_BINMODE;
             break;
-        case '+':
+	  case '+':
             flags |= FMODE_READWRITE;
             break;
-        default:
+	  default:
             goto error;
+	  case ':':
+	    return flags;
         }
     }
 
@@ -3001,16 +3003,18 @@
 
     while (*m) {
         switch (*m++) {
-        case 'b':
+	  case 'b':
 #ifdef O_BINARY
             flags |= O_BINARY;
 #endif
             break;
-        case '+':
+	  case '+':
             flags = (flags & ~O_ACCMODE) | O_RDWR;
             break;
-        default:
+	  default:
             goto error;
+	  case ':':
+	    return flags;
         }
     }
 
@@ -3045,6 +3049,26 @@
     return NULL;		/* not reached */
 }
 
+void
+rb_io_mode_enc(rb_io_t *fptr, const char *mode)
+{
+    const char *p0, *p1;
+    int idx;
+    
+    p0 = strrchr(mode, ':');
+    if (p0) {
+	idx = rb_enc_find_index(p0+1);
+	if (idx >= 0) {
+	    fptr->enc = rb_enc_from_index(idx);
+	}
+#if 0
+	p1 = strchr(mode, ':');
+	if (p1 < p0) {
+	}
+#endif
+    }
+}
+
 struct sysopen_struct {
     char *fname;
     int flag;
@@ -3163,6 +3187,7 @@
     rb_io_t *fptr;
 
     MakeOpenFile(io, fptr);
+    rb_io_mode_enc(fptr, mode);
     fptr->mode = rb_io_mode_flags(mode);
     fptr->path = strdup(fname);
     fptr->fd = rb_sysopen(fptr->path, rb_io_mode_modenum(rb_io_flags_mode(fptr->mode)), 0666);
@@ -3471,6 +3496,7 @@
 
     port = io_alloc(rb_cIO);
     MakeOpenFile(port, fptr);
+    rb_io_mode_enc(fptr, mode);
     fptr->fd = fd;
     fptr->stdio_file = fp;
     fptr->mode = modef | FMODE_SYNC|FMODE_DUPLEX;
@@ -3585,7 +3611,7 @@
 	mode = rb_io_modenum_mode(FIX2INT(pmode));
     }
     else {
-	mode = rb_io_flags_mode(rb_io_mode_flags(StringValuePtr(pmode)));
+	mode = StringValuePtr(pmode);
     }
     tmp = rb_check_array_type(pname);
     if (!NIL_P(tmp)) {
@@ -3639,6 +3665,7 @@
 	rb_file_sysopen_internal(io, RSTRING_PTR(fname), flags, fmode);
     }
     else {
+
 	mode = NIL_P(vmode) ? "r" : StringValuePtr(vmode);
 	rb_file_open_internal(io, RSTRING_PTR(fname), mode);
     }
@@ -3975,6 +4002,7 @@
 		     rb_io_flags_mode(flags));
 	}
 	fptr->mode = flags;
+	rb_io_mode_enc(fptr, StringValuePtr(nmode));
     }
 
     if (fptr->path) {

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

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