Skip to content
2010/10/22 / highmt

lv iso2022jp自動判定パッチ

CYGWIN_NT-6.0 z90ns-5ff7df0e 1.7.7(0.230/5/3) 2010-08-31 09:58 i686 Cygwin
lv v.4.51 (Jan.16th,2004)

調子にのってlvのパッチものっけてみる。

  • 第8bitが1のものがなく 0x1b 0x24 または 0x1b 0x28 のバイト列が見つかったときiso2022jpとして判定するようにする
  • 改行のない最終行が検索されたときにLFを出力するようにする
  • -n オプションを grep -nH オプション相当にする

ビルド方法についてはcygwin 1.7.6 + lgrep 4.51 on NTEmacs 23.2を参照。

diff -ur lv_4.51.orig/lv-4.51.orig/src/conv.c lv_4.51.orig-patched3/lv-4.51.orig/src/conv.c
--- lv_4.51.orig/lv-4.51.orig/src/conv.c	Thu Nov 13 12:08:19 2003
+++ lv_4.51.orig-patched3/lv-4.51.orig/src/conv.c	Sat Oct 09 12:13:13 2010
@@ -42,12 +42,16 @@
   byte *str;
   i_str_t *istr = NULL;
   int i, gc_count = 0;
+  boolean_t nolinebreak = FALSE;
 
   for( f->eof = FALSE ; FALSE == f->eof ; ){
     str = FileLoadLine( f, &len, &simple );
     if( 0 == len )
       return flagMatchedResult;
 
+    if( LF != str[ len - 1 ] )
+      nolinebreak = TRUE;
+
     if( NULL != istr )
       IstrFree( istr );
 
@@ -73,19 +77,19 @@
 	  flagMatched = FALSE;
 	else {
 	  flagMatchedResult = TRUE;
-	  if( TRUE == showFileName )
+	  if( TRUE == showFileName && TRUE == line_number ){
 	    printf( "%s:", f->fileName );
-	  if( TRUE == line_number )
 	    printf( "%ld:", lineNumber );
+	  }
 	}
       } else {
 	if( TRUE == grep_inverted ){
 	  flagMatched = TRUE;
 	  flagMatchedResult = TRUE;
-	  if( TRUE == showFileName )
+	  if( TRUE == showFileName && TRUE == line_number ){
 	    printf( "%s:", f->fileName );
-	  if( TRUE == line_number )
 	    printf( "%ld:", lineNumber );
+	  }
 	}
       }
     }
@@ -112,6 +116,12 @@
 	  for( len = 0 ; len inputCodingSystem ){
+    if( FALSE == flagEightBit ){
+      f->inputCodingSystem = GuessISO2022( str, len,
+					       f->defaultCodingSystem );
+      if( AUTOSELECT != f->inputCodingSystem ) {
+	if( NULL != f->find.pattern )
+	  FindResetPattern( f, f->find.pattern );
+      }
+    }
+  }
+  if( AUTOSELECT == f->inputCodingSystem ){
     if( TRUE == flagEightBit ){
       f->inputCodingSystem = GuessCodingSystem( str, len,
 					       f->defaultCodingSystem );
diff -ur lv_4.51.orig/lv-4.51.orig/src/guess.c lv_4.51.orig-patched3/lv-4.51.orig/src/guess.c
--- lv_4.51.orig/lv-4.51.orig/src/guess.c	Thu Nov 13 12:08:19 2003
+++ lv_4.51.orig-patched3/lv-4.51.orig/src/guess.c	Mon Sep 27 04:44:57 2010
@@ -322,6 +322,74 @@
   return 0 == hzPenalty;
 }
 
+public byte GuessISO2022( byte *str, int length, byte defaultEuc )
+{
+  int has8bit = 0;
+  int iso2022seq = 0;
+  int i;
+  byte ch;
+  byte c;
+  char *nl, language[6] = { 0 };
+  int use_locale = 1;
+#ifdef HAVE_SETLOCALE
+  nl = setlocale( LC_CTYPE, "" );
+  if (NULL == nl || !strcmp("C", nl))
+    use_locale = 0;
+#else
+  use_locale = 0;
+#endif
+
+  for( i = 0 ; i < length ; i++ ){
+    ch = str[ i ];
+    if( 0x7f < ch ) {
+      has8bit = has8bit | 1;
+      break;
+    }
+    if( 0 == iso2022seq ){
+      if( 0x1b == ch ){
+        iso2022seq = 1;
+      } else {
+        iso2022seq = 0;
+      }
+    } else if( 1 == iso2022seq ){
+      if( 0x24 == ch || 0x28 == ch ){
+        iso2022seq = 2;
+        break;
+      } else if( 0x1b == ch ){
+        iso2022seq = 1;
+      } else {
+        iso2022seq = 0;
+      }
+    }
+  }
+
+  if ( !has8bit && 2 == iso2022seq ){
+    if (use_locale){
+      c = LocaleCodingSystem(language);
+      if( !strncmp(language, "ja", 2) ){
+	return ISO_2022_JP;
+      }
+      if( !strncmp(language, "ko", 2) ){
+	return ISO_2022_KR;
+      }
+      if( !strncmp(language, "zh", 2) ){
+	return ISO_2022_CN;
+      }
+    }
+    if( EUC_JAPAN == defaultEuc ){
+	return ISO_2022_JP;
+    }
+    if( EUC_KOREA == defaultEuc ){
+	return ISO_2022_KR;
+    }
+    if( EUC_CHINA == defaultEuc || EUC_TAIWAN == defaultEuc ){
+	return ISO_2022_CN;
+    }
+    return ISO_2022_JP;
+  }
+  return 0;
+}
+
 
 public void AdjustPatternCharset( byte inputCodingSystem,
 				 byte keyboardCodingSystem,
diff -ur lv_4.51.orig/lv-4.51.orig/src/guess.h lv_4.51.orig-patched3/lv-4.51.orig/src/guess.h
--- lv_4.51.orig/lv-4.51.orig/src/guess.h	Thu Nov 13 12:08:19 2003
+++ lv_4.51.orig-patched3/lv-4.51.orig/src/guess.h	Mon Sep 27 04:09:02 2010
@@ -14,6 +14,7 @@
 
 public byte GuessCodingSystem( byte *str, int length, byte defaultEuc );
 public byte GuessHz( byte *str, int length );
+public byte GuessISO2022( byte *str, int length, byte defaultEuc );
 public void AdjustPatternCharset( byte inputCodingSystem,
 				 byte keyboardCodingSystem,
 				 byte defaultCodingSystem,
diff -ur lv_4.51.orig/lv-4.51.orig/src/lv.c lv_4.51.orig-patched3/lv-4.51.orig/src/lv.c
--- lv_4.51.orig/lv-4.51.orig/src/lv.c	Mon Jan 05 16:30:15 2004
+++ lv_4.51.orig-patched3/lv-4.51.orig/src/lv.c	Mon Aug 23 01:51:16 2010
@@ -251,7 +251,7 @@
       /*
        * 対象ファイルが一個
        */
-      if( TRUE == LvGrep( conf, FALSE ) )
+      if( TRUE == LvGrep( conf, TRUE ) )
 	flagMatched = TRUE;
     } else {
       /*

nkfつかえばいいじゃん、という話もあるが、
パイプでnkfをつなぐとファイル名の情報がなくなってしまうので…
ファイル名をつけてからgrepするとファイル名もひっかかってしまうし…
PowerShell的なパイプラインが使えればいいのかも。

広告
%d人のブロガーが「いいね」をつけました。