]>
Commit | Line | Data |
---|---|---|
e4816a84 ER |
1 | To: vim-dev@vim.org |
2 | Subject: Patch 7.2.244 | |
3 | Fcc: outbox | |
4 | From: Bram Moolenaar <Bram@moolenaar.net> | |
5 | Mime-Version: 1.0 | |
6 | Content-Type: text/plain; charset=UTF-8 | |
7 | Content-Transfer-Encoding: 8bit | |
8 | ------------ | |
9 | ||
10 | Patch 7.2.244 | |
11 | Problem: When 'enc' is utf-8 and 'fenc' is latin1, writing a non-latin1 | |
12 | character gives a conversion error without any hint what is wrong. | |
13 | Solution: When known add the line number to the error message. | |
14 | Files: src/fileio.c | |
15 | ||
16 | ||
17 | *** ../vim-7.2.243/src/fileio.c 2009-07-29 12:09:49.000000000 +0200 | |
18 | --- src/fileio.c 2009-07-29 17:04:06.000000000 +0200 | |
19 | *************** | |
20 | *** 121,126 **** | |
21 | --- 121,128 ---- | |
22 | char_u *bw_conv_buf; /* buffer for writing converted chars */ | |
23 | int bw_conv_buflen; /* size of bw_conv_buf */ | |
24 | int bw_conv_error; /* set for conversion error */ | |
25 | + linenr_T bw_conv_error_lnum; /* first line with error or zero */ | |
26 | + linenr_T bw_start_lnum; /* line number at start of buffer */ | |
27 | # ifdef USE_ICONV | |
28 | iconv_t bw_iconv_fd; /* descriptor for iconv() or -1 */ | |
29 | # endif | |
30 | *************** | |
31 | *** 2924,2929 **** | |
32 | --- 2925,2931 ---- | |
33 | linenr_T lnum; | |
34 | long nchars; | |
35 | char_u *errmsg = NULL; | |
36 | + int errmsg_allocated = FALSE; | |
37 | char_u *errnum = NULL; | |
38 | char_u *buffer; | |
39 | char_u smallbuf[SMBUFSIZE]; | |
40 | *************** | |
41 | *** 2987,2992 **** | |
42 | --- 2989,2995 ---- | |
43 | /* must init bw_conv_buf and bw_iconv_fd before jumping to "fail" */ | |
44 | write_info.bw_conv_buf = NULL; | |
45 | write_info.bw_conv_error = FALSE; | |
46 | + write_info.bw_conv_error_lnum = 0; | |
47 | write_info.bw_restlen = 0; | |
48 | # ifdef USE_ICONV | |
49 | write_info.bw_iconv_fd = (iconv_t)-1; | |
50 | *************** | |
51 | *** 4243,4248 **** | |
52 | --- 4245,4251 ---- | |
53 | nchars += write_info.bw_len; | |
54 | } | |
55 | } | |
56 | + write_info.bw_start_lnum = start; | |
57 | #endif | |
58 | ||
59 | write_info.bw_len = bufsize; | |
60 | *************** | |
61 | *** 4278,4283 **** | |
62 | --- 4281,4289 ---- | |
63 | nchars += bufsize; | |
64 | s = buffer; | |
65 | len = 0; | |
66 | + #ifdef FEAT_MBYTE | |
67 | + write_info.bw_start_lnum = lnum; | |
68 | + #endif | |
69 | } | |
70 | /* write failed or last line has no EOL: stop here */ | |
71 | if (end == 0 | |
72 | *************** | |
73 | *** 4474,4480 **** | |
74 | { | |
75 | #ifdef FEAT_MBYTE | |
76 | if (write_info.bw_conv_error) | |
77 | ! errmsg = (char_u *)_("E513: write error, conversion failed (make 'fenc' empty to override)"); | |
78 | else | |
79 | #endif | |
80 | if (got_int) | |
81 | --- 4480,4496 ---- | |
82 | { | |
83 | #ifdef FEAT_MBYTE | |
84 | if (write_info.bw_conv_error) | |
85 | ! { | |
86 | ! if (write_info.bw_conv_error_lnum == 0) | |
87 | ! errmsg = (char_u *)_("E513: write error, conversion failed (make 'fenc' empty to override)"); | |
88 | ! else | |
89 | ! { | |
90 | ! errmsg_allocated = TRUE; | |
91 | ! errmsg = alloc(300); | |
92 | ! vim_snprintf((char *)errmsg, 300, _("E513: write error, conversion failed in line %ld (make 'fenc' empty to override)"), | |
93 | ! (long)write_info.bw_conv_error_lnum); | |
94 | ! } | |
95 | ! } | |
96 | else | |
97 | #endif | |
98 | if (got_int) | |
99 | *************** | |
100 | *** 4550,4555 **** | |
101 | --- 4566,4577 ---- | |
102 | { | |
103 | STRCAT(IObuff, _(" CONVERSION ERROR")); | |
104 | c = TRUE; | |
105 | + if (write_info.bw_conv_error_lnum != 0) | |
106 | + { | |
107 | + int l = STRLEN(IObuff); | |
108 | + vim_snprintf((char *)IObuff + l, IOSIZE - l, _(" in line %ld;"), | |
109 | + (long)write_info.bw_conv_error_lnum); | |
110 | + } | |
111 | } | |
112 | else if (notconverted) | |
113 | { | |
114 | *************** | |
115 | *** 4746,4751 **** | |
116 | --- 4768,4775 ---- | |
117 | } | |
118 | STRCAT(IObuff, errmsg); | |
119 | emsg(IObuff); | |
120 | + if (errmsg_allocated) | |
121 | + vim_free(errmsg); | |
122 | ||
123 | retval = FAIL; | |
124 | if (end == 0) | |
125 | *************** | |
126 | *** 5105,5111 **** | |
127 | c = buf[wlen]; | |
128 | } | |
129 | ||
130 | ! ip->bw_conv_error |= ucs2bytes(c, &p, flags); | |
131 | } | |
132 | if (flags & FIO_LATIN1) | |
133 | len = (int)(p - buf); | |
134 | --- 5129,5141 ---- | |
135 | c = buf[wlen]; | |
136 | } | |
137 | ||
138 | ! if (ucs2bytes(c, &p, flags) && !ip->bw_conv_error) | |
139 | ! { | |
140 | ! ip->bw_conv_error = TRUE; | |
141 | ! ip->bw_conv_error_lnum = ip->bw_start_lnum; | |
142 | ! } | |
143 | ! if (c == NL) | |
144 | ! ++ip->bw_start_lnum; | |
145 | } | |
146 | if (flags & FIO_LATIN1) | |
147 | len = (int)(p - buf); | |
148 | *************** | |
149 | *** 5386,5391 **** | |
150 | --- 5416,5422 ---- | |
151 | #ifdef FEAT_MBYTE | |
152 | /* | |
153 | * Convert a Unicode character to bytes. | |
154 | + * Return TRUE for an error, FALSE when it's OK. | |
155 | */ | |
156 | static int | |
157 | ucs2bytes(c, pp, flags) | |
158 | *** ../vim-7.2.243/src/version.c 2009-07-29 16:13:35.000000000 +0200 | |
159 | --- src/version.c 2009-07-29 18:01:27.000000000 +0200 | |
160 | *************** | |
161 | *** 678,679 **** | |
162 | --- 678,681 ---- | |
163 | { /* Add new patch number below this line */ | |
164 | + /**/ | |
165 | + 244, | |
166 | /**/ | |
167 | ||
168 | -- | |
169 | Support your right to bare arms! Wear short sleeves! | |
170 | ||
171 | /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ | |
172 | /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ | |
173 | \\\ download, build and distribute -- http://www.A-A-P.org /// | |
174 | \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |