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

ruby-changes:7615

From: akr <ko1@a...>
Date: Thu, 4 Sep 2008 23:20:31 +0900 (JST)
Subject: [ruby-changes:7615] Ruby:r19136 (trunk): * enc/trans/newline.trans: record newline types met in universal

akr	2008-09-04 23:20:14 +0900 (Thu, 04 Sep 2008)

  New Revision: 19136

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

  Log:
    * enc/trans/newline.trans: record newline types met in universal
      newline decoder.

  Modified files:
    trunk/ChangeLog
    trunk/enc/trans/newline.trans

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 19135)
+++ ChangeLog	(revision 19136)
@@ -1,3 +1,8 @@
+Thu Sep  4 23:18:55 2008  Tanaka Akira  <akr@f...>
+
+	* enc/trans/newline.trans: record newline types met in universal
+	  newline decoder.
+
 Thu Sep  4 23:05:54 2008  Yuki Sonoda (Yugui)  <yugui@y...>
 
 	* lib/prime.rb (Prime::OldCompatibility#each): added compatibility to 
Index: enc/trans/newline.trans
===================================================================
--- enc/trans/newline.trans	(revision 19135)
+++ enc/trans/newline.trans	(revision 19136)
@@ -21,14 +21,22 @@
 
 <%= transcode_generated_code %>
 
+#define STATE (sp[0])
 #define NORMAL 0
 #define JUST_AFTER_CR 1
 
+/* no way to access this information, yet. */
+#define NEWLINES_MET (sp[1])
+#define MET_LF          0x01
+#define MET_CRLF        0x02
+#define MET_CR          0x04
+
 static int
 universal_newline_init(void *statep)
 {
     unsigned char *sp = statep;
-    *sp = NORMAL;
+    STATE = NORMAL;
+    NEWLINES_MET = 0;
     return 0;
 }
 
@@ -38,25 +46,32 @@
     unsigned char *sp = statep;
     int len;
     if (s[0] == '\n') {
-        if (*sp == NORMAL) {
+        if (STATE == NORMAL) {
+            NEWLINES_MET |= MET_LF;
             o[0] = '\n';
             len = 1;
         }
         else { /* JUST_AFTER_CR */
+            NEWLINES_MET |= MET_CRLF;
             len = 0;
         }
-        *sp = NORMAL;
+        STATE = NORMAL;
     }
-    else if (s[0] == '\r') {
-        o[0] = '\n';
-        len = 1;
-        *sp = JUST_AFTER_CR;
-    }
     else {
-        o[0] = s[0];
-        len = 1;
-        *sp = NORMAL;
+        if (STATE == JUST_AFTER_CR)
+            NEWLINES_MET |= MET_CR;
+        if (s[0] == '\r') {
+            o[0] = '\n';
+            len = 1;
+            STATE = JUST_AFTER_CR;
+        }
+        else {
+            o[0] = s[0];
+            len = 1;
+            STATE = NORMAL;
+        }
     }
+
     return len;
 }
 
@@ -68,7 +83,7 @@
     1, /* max_input */
     1, /* max_output */
     stateful_decoder, /* stateful_type */
-    1, universal_newline_init, universal_newline_init, /* state_size, state_init, state_fini */
+    2, universal_newline_init, universal_newline_init, /* state_size, state_init, state_fini */
     NULL, NULL, NULL, fun_so_universal_newline
 };
 

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

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