]> granicus.if.org Git - vim/commitdiff
updated for version 7.2.348 v7.2.348
authorBram Moolenaar <Bram@vim.org>
Wed, 27 Jan 2010 17:29:26 +0000 (18:29 +0100)
committerBram Moolenaar <Bram@vim.org>
Wed, 27 Jan 2010 17:29:26 +0000 (18:29 +0100)
Problem:    Unicode double-width characters are not up-to date.
Solution:   Produce the double-width table like the others.

runtime/tools/unicode.vim
src/mbyte.c
src/version.c

index f33df4206d8e5a4e515bfce13d93d21058d12270..f3c58ed35a10164873f3d700dec4281fe97abbd0 100644 (file)
@@ -187,16 +187,27 @@ func! BuildCombiningTable()
   wincmd p
 endfunc
 
-" Build the ambiguous table in a new buffer.
+" Build the double width or ambiguous width table in a new buffer.
 " Uses s:widthprops and s:dataprops.
-func! BuildAmbiguousTable()
+func! BuildWidthTable(pattern, tableName)
   let start = -1
   let end = -1
   let ranges = []
   let dataidx = 0
   for p in s:widthprops
-    if p[1][0] == 'A'
-      let n = ('0x' . p[0]) + 0
+    if p[1][0] =~ a:pattern
+      if p[0] =~ '\.\.'
+       " It is a range.  we don't check for composing char then.
+       let rng = split(p[0], '\.\.')
+       if len(rng) != 2
+         echoerr "Cannot parse range: '" . p[0] . "' in width table"
+       endif
+       let n = ('0x' . rng[0]) + 0
+       let n_last =  ('0x' . rng[1]) + 0
+      else
+       let n = ('0x' . p[0]) + 0
+       let n_last = n
+      endif
       " Find this char in the data table.
       while 1
        let dn = ('0x' . s:dataprops[dataidx][0]) + 0
@@ -205,27 +216,23 @@ func! BuildAmbiguousTable()
        endif
        let dataidx += 1
       endwhile
-      if dn != n
+      if dn != n && n_last == n
        echoerr "Cannot find character " . n . " in data table"
       endif
       " Only use the char when it's not a composing char.
+      " But use all chars from a range.
       let dp = s:dataprops[dataidx]
-      if dp[2] != 'Mn' && dp[2] != 'Mc' && dp[2] != 'Me'
+      if n_last > n || (dp[2] != 'Mn' && dp[2] != 'Mc' && dp[2] != 'Me')
        if start >= 0 && end + 1 == n
          " continue with same range.
-         let end = n
        else
          if start >= 0
            " produce previous range
            call add(ranges, printf("\t{0x%04x, 0x%04x},", start, end))
          endif
          let start = n
-         if p[0] =~ '\.\.'
-           let end = ('0x' . substitute(p[0], '.*\.\.', '', '')) + 0
-         else
-           let end = n
-         endif
        endif
+       let end = n_last
       endif
     endif
   endfor
@@ -235,8 +242,8 @@ func! BuildAmbiguousTable()
 
   " New buffer to put the result in.
   new
-  file ambiguous
-  call setline(1, "    static struct interval ambiguous[] =")
+  exe "file " . a:tableName
+  call setline(1, "    static struct interval " . a:tableName . "[] =")
   call setline(2, "    {")
   call append('$', ranges)
   call setline('$', getline('$')[:-2])  " remove last comma
@@ -276,5 +283,8 @@ edit http://www.unicode.org/Public/UNIDATA/EastAsianWidth.txt
 " Parse each line, create a list of lists.
 call ParseWidthProps()
 
-" Build the ambiguous table.
-call BuildAmbiguousTable()
+" Build the double width table.
+call BuildWidthTable('[WF]', 'doublewidth')
+
+" Build the ambiguous width table.
+call BuildWidthTable('A', 'ambiguous')
index b5ea2920460692b6a40cf88e568e317d14f21a48..7a3a27e06e937a7598860b7b0609ed127d86c207 100644 (file)
@@ -1200,6 +1200,49 @@ intable(table, size, c)
 utf_char2cells(c)
     int                c;
 {
+    /* Sorted list of non-overlapping intervals of East Asian double width
+     * characters, generated with ../runtime/tools/unicode.vim. */
+    static struct interval doublewidth[] =
+    {
+       {0x1100, 0x115f},
+       {0x11a3, 0x11a7},
+       {0x11fa, 0x11ff},
+       {0x2329, 0x232a},
+       {0x2e80, 0x2e99},
+       {0x2e9b, 0x2ef3},
+       {0x2f00, 0x2fd5},
+       {0x2ff0, 0x2ffb},
+       {0x3000, 0x3029},
+       {0x3030, 0x303e},
+       {0x3041, 0x3096},
+       {0x309b, 0x30ff},
+       {0x3105, 0x312d},
+       {0x3131, 0x318e},
+       {0x3190, 0x31b7},
+       {0x31c0, 0x31e3},
+       {0x31f0, 0x321e},
+       {0x3220, 0x3247},
+       {0x3250, 0x32fe},
+       {0x3300, 0x4dbf},
+       {0x4e00, 0xa48c},
+       {0xa490, 0xa4c6},
+       {0xa960, 0xa97c},
+       {0xac00, 0xd7a3},
+       {0xd7b0, 0xd7c6},
+       {0xd7cb, 0xd7fb},
+       {0xf900, 0xfaff},
+       {0xfe10, 0xfe19},
+       {0xfe30, 0xfe52},
+       {0xfe54, 0xfe66},
+       {0xfe68, 0xfe6b},
+       {0xff01, 0xff60},
+       {0xffe0, 0xffe6},
+       {0x1f200, 0x1f200},
+       {0x1f210, 0x1f231},
+       {0x1f240, 0x1f248},
+       {0x20000, 0x2fffd},
+       {0x30000, 0x3fffd}
+    };
     /* Sorted list of non-overlapping intervals of East Asian Ambiguous
      * characters, generated with ../runtime/tools/unicode.vim. */
     static struct interval ambiguous[] =
@@ -1403,20 +1446,7 @@ utf_char2cells(c)
 #else
        if (!utf_printable(c))
            return 6;           /* unprintable, displays <xxxx> */
-       if (c >= 0x1100
-           && (c <= 0x115f                     /* Hangul Jamo */
-               || c == 0x2329
-               || c == 0x232a
-               || (c >= 0x2e80 && c <= 0xa4cf
-                   && c != 0x303f)             /* CJK ... Yi */
-               || (c >= 0xac00 && c <= 0xd7a3) /* Hangul Syllables */
-               || (c >= 0xf900 && c <= 0xfaff) /* CJK Compatibility
-                                                  Ideographs */
-               || (c >= 0xfe30 && c <= 0xfe6f) /* CJK Compatibility Forms */
-               || (c >= 0xff00 && c <= 0xff60) /* Fullwidth Forms */
-               || (c >= 0xffe0 && c <= 0xffe6)
-               || (c >= 0x20000 && c <= 0x2fffd)
-               || (c >= 0x30000 && c <= 0x3fffd)))
+       if (intable(doublewidth, sizeof(doublewidth), c))
            return 2;
 #endif
     }
index 8b9013f4768eb9bc5a5f5647ce23ddadcea92722..2f48ecb6480688b5dba7b60fefed96cb50a41288 100644 (file)
@@ -681,6 +681,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    348,
 /**/
     347,
 /**/