summaryrefslogtreecommitdiffstats
path: root/gvim/vim-7.2/7.2.245
blob: d046c97f15ba52c454e4626fc4fe639a02d1a693 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
To: vim-dev@vim.org
Subject: Patch 7.2.245
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
------------

Patch 7.2.245
Problem:    When 'enc' is "utf-16" and 'fenc' is "utf-8" writing a file does
	    conversion while none should be done. (Yukihiro Nakadaira) When
	    'fenc' is empty the file is written as utf-8 instead of utf-16.
Solution:   Do proper comparison of encodings, taking into account that all
	    Unicode values for 'enc' use utf-8 internally.
Files:	    src/fileio.c


*** ../vim-7.2.244/src/fileio.c	2009-07-29 18:05:57.000000000 +0200
--- src/fileio.c	2009-07-29 17:04:06.000000000 +0200
***************
*** 134,140 ****
  #ifdef FEAT_MBYTE
  static linenr_T readfile_linenr __ARGS((linenr_T linecnt, char_u *p, char_u *endp));
  static int ucs2bytes __ARGS((unsigned c, char_u **pp, int flags));
! static int same_encoding __ARGS((char_u *a, char_u *b));
  static int get_fio_flags __ARGS((char_u *ptr));
  static char_u *check_for_bom __ARGS((char_u *p, long size, int *lenp, int flags));
  static int make_bom __ARGS((char_u *buf, char_u *name));
--- 134,140 ----
  #ifdef FEAT_MBYTE
  static linenr_T readfile_linenr __ARGS((linenr_T linecnt, char_u *p, char_u *endp));
  static int ucs2bytes __ARGS((unsigned c, char_u **pp, int flags));
! static int need_conversion __ARGS((char_u *fenc));
  static int get_fio_flags __ARGS((char_u *ptr));
  static char_u *check_for_bom __ARGS((char_u *p, long size, int *lenp, int flags));
  static int make_bom __ARGS((char_u *buf, char_u *name));
***************
*** 1043,1055 ****
      }
  
      /*
!      * Conversion is required when the encoding of the file is different
!      * from 'encoding' or 'encoding' is UTF-16, UCS-2 or UCS-4 (requires
!      * conversion to UTF-8).
       */
      fio_flags = 0;
!     converted = (*fenc != NUL && !same_encoding(p_enc, fenc));
!     if (converted || enc_unicode != 0)
      {
  
  	/* "ucs-bom" means we need to check the first bytes of the file
--- 1043,1054 ----
      }
  
      /*
!      * Conversion may be required when the encoding of the file is different
!      * from 'encoding' or 'encoding' is UTF-16, UCS-2 or UCS-4.
       */
      fio_flags = 0;
!     converted = need_conversion(fenc);
!     if (converted)
      {
  
  	/* "ucs-bom" means we need to check the first bytes of the file
***************
*** 3969,3978 ****
  	fenc = buf->b_p_fenc;
  
      /*
!      * The file needs to be converted when 'fileencoding' is set and
!      * 'fileencoding' differs from 'encoding'.
       */
!     converted = (*fenc != NUL && !same_encoding(p_enc, fenc));
  
      /*
       * Check if UTF-8 to UCS-2/4 or Latin1 conversion needs to be done.  Or
--- 3968,3976 ----
  	fenc = buf->b_p_fenc;
  
      /*
!      * Check if the file needs to be converted.
       */
!     converted = need_conversion(fenc);
  
      /*
       * Check if UTF-8 to UCS-2/4 or Latin1 conversion needs to be done.  Or
***************
*** 5502,5521 ****
  }
  
  /*
!  * Return TRUE if "a" and "b" are the same 'encoding'.
!  * Ignores difference between "ansi" and "latin1", "ucs-4" and "ucs-4be", etc.
   */
      static int
! same_encoding(a, b)
!     char_u	*a;
!     char_u	*b;
  {
!     int		f;
  
!     if (STRCMP(a, b) == 0)
! 	return TRUE;
!     f = get_fio_flags(a);
!     return (f != 0 && get_fio_flags(b) == f);
  }
  
  /*
--- 5500,5536 ----
  }
  
  /*
!  * Return TRUE if file encoding "fenc" requires conversion from or to
!  * 'encoding'.
   */
      static int
! need_conversion(fenc)
!     char_u	*fenc;
  {
!     int		same_encoding;
!     int		enc_flags;
!     int		fenc_flags;
  
!     if (*fenc == NUL || STRCMP(p_enc, fenc) == 0)
! 	same_encoding = TRUE;
!     else
!     {
! 	/* Ignore difference between "ansi" and "latin1", "ucs-4" and
! 	 * "ucs-4be", etc. */
! 	enc_flags = get_fio_flags(p_enc);
! 	fenc_flags = get_fio_flags(fenc);
! 	same_encoding = (enc_flags != 0 && fenc_flags == enc_flags);
!     }
!     if (same_encoding)
!     {
! 	/* Specified encoding matches with 'encoding'.  This requires
! 	 * conversion when 'encoding' is Unicode but not UTF-8. */
! 	return enc_unicode != 0;
!     }
! 
!     /* Encodings differ.  However, conversion is not needed when 'enc' is any
!      * Unicode encoding and the file is UTF-8. */
!     return !(enc_utf8 && fenc_flags == FIO_UTF8);
  }
  
  /*
*** ../vim-7.2.244/src/version.c	2009-07-29 18:05:57.000000000 +0200
--- src/version.c	2009-07-29 18:20:08.000000000 +0200
***************
*** 678,679 ****
--- 678,681 ----
  {   /* Add new patch number below this line */
+ /**/
+     245,
  /**/

-- 
An actual excerpt from a classified section of a city newspaper:
"Illiterate?  Write today for free help!"

 /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\        download, build and distribute -- http://www.A-A-P.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///