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
|
To: vim-dev@vim.org
Subject: Patch 7.2.100
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit
------------
Patch 7.2.100
Problem: When using ":source" on a FIFO or something else that can't rewind
the first three bytes are skipped.
Solution: Instead of rewinding read the first line and detect a BOM in that.
(mostly by James Vega)
Files: src/ex_cmds2.c
*** ../vim-7.2.099/src/ex_cmds2.c Sat Nov 15 14:10:23 2008
--- src/ex_cmds2.c Wed Feb 4 16:05:51 2009
***************
*** 2842,2847 ****
--- 2842,2848 ----
linenr_T save_sourcing_lnum;
char_u *p;
char_u *fname_exp;
+ char_u *firstline = NULL;
int retval = FAIL;
#ifdef FEAT_EVAL
scid_T save_current_SID;
***************
*** 2992,3014 ****
cookie.level = ex_nesting_level;
#endif
- #ifdef FEAT_MBYTE
- cookie.conv.vc_type = CONV_NONE; /* no conversion */
-
- /* Try reading the first few bytes to check for a UTF-8 BOM. */
- {
- char_u buf[3];
-
- if (fread((char *)buf, sizeof(char_u), (size_t)3, cookie.fp)
- == (size_t)3
- && buf[0] == 0xef && buf[1] == 0xbb && buf[2] == 0xbf)
- /* Found BOM, setup conversion and skip over it. */
- convert_setup(&cookie.conv, (char_u *)"utf-8", p_enc);
- else
- /* No BOM found, rewind. */
- fseek(cookie.fp, 0L, SEEK_SET);
- }
- #endif
/*
* Keep the sourcing name/lnum, for recursive calls.
--- 2993,2998 ----
***************
*** 3018,3023 ****
--- 3002,3026 ----
save_sourcing_lnum = sourcing_lnum;
sourcing_lnum = 0;
+ #ifdef FEAT_MBYTE
+ cookie.conv.vc_type = CONV_NONE; /* no conversion */
+
+ /* Read the first line so we can check for a UTF-8 BOM. */
+ firstline = getsourceline(0, (void *)&cookie, 0);
+ if (firstline != NULL && STRLEN(firstline) >= 3 && firstline[0] == 0xef
+ && firstline[1] == 0xbb && firstline[2] == 0xbf)
+ {
+ /* Found BOM; setup conversion, skip over BOM and recode the line. */
+ convert_setup(&cookie.conv, (char_u *)"utf-8", p_enc);
+ p = string_convert(&cookie.conv, firstline + 3, NULL);
+ if (p != NULL)
+ {
+ vim_free(firstline);
+ firstline = p;
+ }
+ }
+ #endif
+
#ifdef STARTUPTIME
time_push(&tv_rel, &tv_start);
#endif
***************
*** 3111,3119 ****
/*
* Call do_cmdline, which will call getsourceline() to get the lines.
*/
! do_cmdline(NULL, getsourceline, (void *)&cookie,
DOCMD_VERBOSE|DOCMD_NOWAIT|DOCMD_REPEAT);
-
retval = OK;
#ifdef FEAT_PROFILE
--- 3114,3121 ----
/*
* Call do_cmdline, which will call getsourceline() to get the lines.
*/
! do_cmdline(firstline, getsourceline, (void *)&cookie,
DOCMD_VERBOSE|DOCMD_NOWAIT|DOCMD_REPEAT);
retval = OK;
#ifdef FEAT_PROFILE
***************
*** 3171,3176 ****
--- 3173,3179 ----
#endif
fclose(cookie.fp);
vim_free(cookie.nextline);
+ vim_free(firstline);
#ifdef FEAT_MBYTE
convert_setup(&cookie.conv, NULL, NULL);
#endif
*** ../vim-7.2.099/src/version.c Wed Feb 4 17:27:50 2009
--- src/version.c Wed Feb 4 17:48:47 2009
***************
*** 678,679 ****
--- 678,681 ----
{ /* Add new patch number below this line */
+ /**/
+ 100,
/**/
--
Well, you come from nothing, you go back to nothing... What have you
lost? Nothing!
-- Monty Python: The life of Brian
/// 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 ///
|