xref: /vim-8.2.3635/src/message_test.c (revision bc869874)
1edf3f97aSBram Moolenaar /* vi:set ts=8 sts=4 sw=4 noet:
2502ae4baSBram Moolenaar  *
3502ae4baSBram Moolenaar  * VIM - Vi IMproved	by Bram Moolenaar
4502ae4baSBram Moolenaar  *
5502ae4baSBram Moolenaar  * Do ":help uganda"  in Vim to read copying and usage conditions.
6502ae4baSBram Moolenaar  * Do ":help credits" in Vim to see a list of people who contributed.
7502ae4baSBram Moolenaar  * See README.txt for an overview of the Vim source code.
8502ae4baSBram Moolenaar  */
9502ae4baSBram Moolenaar 
10502ae4baSBram Moolenaar /*
11502ae4baSBram Moolenaar  * message_test.c: Unittests for message.c
12502ae4baSBram Moolenaar  */
13502ae4baSBram Moolenaar 
14502ae4baSBram Moolenaar #undef NDEBUG
15502ae4baSBram Moolenaar #include <assert.h>
16502ae4baSBram Moolenaar 
1785a2002aSBram Moolenaar // Must include main.c because it contains much more than just main()
18502ae4baSBram Moolenaar #define NO_VIM_MAIN
19502ae4baSBram Moolenaar #include "main.c"
20502ae4baSBram Moolenaar 
2185a2002aSBram Moolenaar // This file has to be included because some of the tested functions are
2285a2002aSBram Moolenaar // static.
23502ae4baSBram Moolenaar #include "message.c"
24502ae4baSBram Moolenaar 
25d2c946baSBram Moolenaar #ifndef MIN
26d2c946baSBram Moolenaar # define MIN(x,y) ((x) < (y) ? (x) : (y))
27d2c946baSBram Moolenaar #endif
28d2c946baSBram Moolenaar 
29d2c946baSBram Moolenaar // These formats are not standard in C printf() function.
30d2c946baSBram Moolenaar // Use a global variable rather than a literal format to disable
31d2c946baSBram Moolenaar // -Wformat compiler warnings:
32d2c946baSBram Moolenaar //
33d2c946baSBram Moolenaar // - warning: '0' flag used with ‘%p’ gnu_printf format
34d2c946baSBram Moolenaar // - warning: format ‘%S’ expects argument of type ‘wchar_t *’, but argument 4 has type ‘char *’
35d2c946baSBram Moolenaar // - warning: unknown conversion type character ‘b’ in format
36d2c946baSBram Moolenaar //
37d2c946baSBram Moolenaar // These formats are in practise only used from vim script printf()
38d2c946baSBram Moolenaar // function and never as literals in C code.
39d2c946baSBram Moolenaar char *fmt_012p = "%012p";
40d2c946baSBram Moolenaar char *fmt_5S   = "%5S";
41d2c946baSBram Moolenaar char *fmt_06b  = "%06b";
42d2c946baSBram Moolenaar 
43502ae4baSBram Moolenaar /*
44502ae4baSBram Moolenaar  * Test trunc_string().
45502ae4baSBram Moolenaar  */
46502ae4baSBram Moolenaar     static void
test_trunc_string(void)47502ae4baSBram Moolenaar test_trunc_string(void)
48502ae4baSBram Moolenaar {
49b9644433SBram Moolenaar     char_u  *buf; /*allocated every time to find uninit errors */
50b9644433SBram Moolenaar     char_u  *s;
51502ae4baSBram Moolenaar 
526281815eSBram Moolenaar     // Should not write anything to destination if buflen is 0.
536281815eSBram Moolenaar     trunc_string((char_u *)"", NULL, 1, 0);
546281815eSBram Moolenaar 
556281815eSBram Moolenaar     // Truncating an empty string does nothing.
566281815eSBram Moolenaar     buf = alloc(1);
576281815eSBram Moolenaar     trunc_string((char_u *)"", buf, 1, 1);
586281815eSBram Moolenaar     assert(buf[0] == NUL);
596281815eSBram Moolenaar     vim_free(buf);
606281815eSBram Moolenaar 
6185a2002aSBram Moolenaar     // in place
62b9644433SBram Moolenaar     buf = alloc(40);
63502ae4baSBram Moolenaar     STRCPY(buf, "text");
64502ae4baSBram Moolenaar     trunc_string(buf, buf, 20, 40);
65502ae4baSBram Moolenaar     assert(STRCMP(buf, "text") == 0);
66b9644433SBram Moolenaar     vim_free(buf);
67502ae4baSBram Moolenaar 
68b9644433SBram Moolenaar     buf = alloc(40);
69502ae4baSBram Moolenaar     STRCPY(buf, "a short text");
70502ae4baSBram Moolenaar     trunc_string(buf, buf, 20, 40);
71502ae4baSBram Moolenaar     assert(STRCMP(buf, "a short text") == 0);
72b9644433SBram Moolenaar     vim_free(buf);
73502ae4baSBram Moolenaar 
74b9644433SBram Moolenaar     buf = alloc(40);
75502ae4baSBram Moolenaar     STRCPY(buf, "a text tha just fits");
76502ae4baSBram Moolenaar     trunc_string(buf, buf, 20, 40);
77502ae4baSBram Moolenaar     assert(STRCMP(buf, "a text tha just fits") == 0);
78b9644433SBram Moolenaar     vim_free(buf);
79502ae4baSBram Moolenaar 
80b9644433SBram Moolenaar     buf = alloc(40);
81502ae4baSBram Moolenaar     STRCPY(buf, "a text that nott fits");
82502ae4baSBram Moolenaar     trunc_string(buf, buf, 20, 40);
83502ae4baSBram Moolenaar     assert(STRCMP(buf, "a text t...nott fits") == 0);
84b9644433SBram Moolenaar     vim_free(buf);
85502ae4baSBram Moolenaar 
8685a2002aSBram Moolenaar     // copy from string to buf
87b9644433SBram Moolenaar     buf = alloc(40);
88b9644433SBram Moolenaar     s = vim_strsave((char_u *)"text");
89b9644433SBram Moolenaar     trunc_string(s, buf, 20, 40);
90502ae4baSBram Moolenaar     assert(STRCMP(buf, "text") == 0);
91b9644433SBram Moolenaar     vim_free(buf);
92b9644433SBram Moolenaar     vim_free(s);
93502ae4baSBram Moolenaar 
94b9644433SBram Moolenaar     buf = alloc(40);
95b9644433SBram Moolenaar     s = vim_strsave((char_u *)"a text that fits");
96b9644433SBram Moolenaar     trunc_string(s, buf, 34, 40);
97b9644433SBram Moolenaar     assert(STRCMP(buf, "a text that fits") == 0);
98b9644433SBram Moolenaar     vim_free(buf);
99b9644433SBram Moolenaar     vim_free(s);
100b9644433SBram Moolenaar 
101b9644433SBram Moolenaar     buf = alloc(40);
102b9644433SBram Moolenaar     s = vim_strsave((char_u *)"a short text");
103b9644433SBram Moolenaar     trunc_string(s, buf, 20, 40);
104502ae4baSBram Moolenaar     assert(STRCMP(buf, "a short text") == 0);
105b9644433SBram Moolenaar     vim_free(buf);
106b9644433SBram Moolenaar     vim_free(s);
107502ae4baSBram Moolenaar 
108b9644433SBram Moolenaar     buf = alloc(40);
109b9644433SBram Moolenaar     s = vim_strsave((char_u *)"a text tha just fits");
110b9644433SBram Moolenaar     trunc_string(s, buf, 20, 40);
111502ae4baSBram Moolenaar     assert(STRCMP(buf, "a text tha just fits") == 0);
112b9644433SBram Moolenaar     vim_free(buf);
113b9644433SBram Moolenaar     vim_free(s);
114502ae4baSBram Moolenaar 
115b9644433SBram Moolenaar     buf = alloc(40);
116b9644433SBram Moolenaar     s = vim_strsave((char_u *)"a text that nott fits");
117b9644433SBram Moolenaar     trunc_string(s, buf, 20, 40);
118502ae4baSBram Moolenaar     assert(STRCMP(buf, "a text t...nott fits") == 0);
119b9644433SBram Moolenaar     vim_free(buf);
120b9644433SBram Moolenaar     vim_free(s);
121502ae4baSBram Moolenaar }
122502ae4baSBram Moolenaar 
123d2c946baSBram Moolenaar /*
124*bc869874SRalf Schandl  * Test trunc_string() with mbyte chars.
125*bc869874SRalf Schandl  */
126*bc869874SRalf Schandl     static void
test_trunc_string_mbyte(void)127*bc869874SRalf Schandl test_trunc_string_mbyte(void)
128*bc869874SRalf Schandl {
129*bc869874SRalf Schandl     char_u  *buf; // allocated every time to find uninit errors
130*bc869874SRalf Schandl     char_u  *s;
131*bc869874SRalf Schandl 
132*bc869874SRalf Schandl     buf = alloc(40);
133*bc869874SRalf Schandl     s = vim_strsave((char_u *)"Ä text tha just fits");
134*bc869874SRalf Schandl     trunc_string(s, buf, 20, 40);
135*bc869874SRalf Schandl     assert(STRCMP(buf, "Ä text tha just fits") == 0);
136*bc869874SRalf Schandl     vim_free(buf);
137*bc869874SRalf Schandl     vim_free(s);
138*bc869874SRalf Schandl 
139*bc869874SRalf Schandl     buf = alloc(40);
140*bc869874SRalf Schandl     s = vim_strsave((char_u *)"a text ÄÖÜä nott fits");
141*bc869874SRalf Schandl     trunc_string(s, buf, 20, 40);
142*bc869874SRalf Schandl     assert(STRCMP(buf, "a text Ä...nott fits") == 0);
143*bc869874SRalf Schandl     vim_free(buf);
144*bc869874SRalf Schandl     vim_free(s);
145*bc869874SRalf Schandl 
146*bc869874SRalf Schandl     buf = alloc(40);
147*bc869874SRalf Schandl     s = vim_strsave((char_u *)"a text that not fitsÄ");
148*bc869874SRalf Schandl     trunc_string(s, buf, 20, 40);
149*bc869874SRalf Schandl     assert(STRCMP(buf, "a text t...not fitsÄ") == 0);
150*bc869874SRalf Schandl     vim_free(buf);
151*bc869874SRalf Schandl     vim_free(s);
152*bc869874SRalf Schandl }
153*bc869874SRalf Schandl 
154*bc869874SRalf Schandl /*
155d2c946baSBram Moolenaar  * Test vim_snprintf() with a focus on checking that truncation is
156d2c946baSBram Moolenaar  * correct when buffer is small, since it cannot be tested from
157d2c946baSBram Moolenaar  * vim scrip tests. Check that:
158d2c946baSBram Moolenaar  * - no buffer overflows happens (with valgrind or asan)
159d2c946baSBram Moolenaar  * - output string is always NUL terminated.
160d2c946baSBram Moolenaar  *
161d2c946baSBram Moolenaar  * Not all formats of vim_snprintf() are checked here. They are
162d2c946baSBram Moolenaar  * checked more exhaustively in Test_printf*() vim script tests.
163d2c946baSBram Moolenaar  */
164d2c946baSBram Moolenaar     static void
test_vim_snprintf(void)165d2c946baSBram Moolenaar test_vim_snprintf(void)
166d2c946baSBram Moolenaar {
167d2c946baSBram Moolenaar     int		n;
168d2c946baSBram Moolenaar     size_t	bsize;
169d2c946baSBram Moolenaar     int		bsize_int;
1704da6df40SBram Moolenaar     void	*ptr = (void *)0x87654321;
171d2c946baSBram Moolenaar 
172d2c946baSBram Moolenaar     // Loop on various buffer sizes to make sure that truncation of
173d2c946baSBram Moolenaar     // vim_snprintf() is correct.
174d2c946baSBram Moolenaar     for (bsize = 0; bsize < 15; ++bsize)
175d2c946baSBram Moolenaar     {
176d2c946baSBram Moolenaar 	bsize_int = (int)bsize - 1;
177d2c946baSBram Moolenaar 
178d2c946baSBram Moolenaar 	// buf is the heap rather than in the stack
179d2c946baSBram Moolenaar 	// so valgrind can detect buffer overflows if any.
180d2c946baSBram Moolenaar 	// Use malloc() rather than alloc() as test checks with 0-size
181d2c946baSBram Moolenaar 	// buffer and its content should then never be used.
182d2c946baSBram Moolenaar 	char *buf = malloc(bsize);
183d2c946baSBram Moolenaar 
184d2c946baSBram Moolenaar 	n = vim_snprintf(buf, bsize, "%d", 1234567);
185d2c946baSBram Moolenaar 	assert(n == 7);
186d2c946baSBram Moolenaar 	assert(bsize == 0 || STRNCMP(buf, "1234567", bsize_int) == 0);
187d2c946baSBram Moolenaar 	assert(bsize == 0 || buf[MIN(n, bsize_int)] == '\0');
188d2c946baSBram Moolenaar 
189d2c946baSBram Moolenaar 	n = vim_snprintf(buf, bsize, "%ld", 1234567L);
190d2c946baSBram Moolenaar 	assert(n == 7);
191d2c946baSBram Moolenaar 	assert(bsize == 0 || STRNCMP(buf, "1234567", bsize_int) == 0);
192d2c946baSBram Moolenaar 	assert(bsize == 0 || buf[MIN(n, bsize_int)] == '\0');
193d2c946baSBram Moolenaar 
194d2c946baSBram Moolenaar 	n = vim_snprintf(buf, bsize, "%9ld", 1234567L);
195d2c946baSBram Moolenaar 	assert(n == 9);
196d2c946baSBram Moolenaar 	assert(bsize == 0 || STRNCMP(buf, "  1234567", bsize_int) == 0);
197d2c946baSBram Moolenaar 	assert(bsize == 0 || buf[MIN(n, bsize_int)] == '\0');
198d2c946baSBram Moolenaar 
199d2c946baSBram Moolenaar 	n = vim_snprintf(buf, bsize, "%-9ld", 1234567L);
200d2c946baSBram Moolenaar 	assert(n == 9);
201d2c946baSBram Moolenaar 	assert(bsize == 0 || STRNCMP(buf, "1234567  ", bsize_int) == 0);
202d2c946baSBram Moolenaar 	assert(bsize == 0 || buf[MIN(n, bsize_int)] == '\0');
203d2c946baSBram Moolenaar 
204d2c946baSBram Moolenaar 	n = vim_snprintf(buf, bsize, "%x", 0xdeadbeef);
205d2c946baSBram Moolenaar 	assert(n == 8);
206d2c946baSBram Moolenaar 	assert(bsize == 0 || STRNCMP(buf, "deadbeef", bsize_int) == 0);
207d2c946baSBram Moolenaar 	assert(bsize == 0 || buf[MIN(n, bsize_int)] == '\0');
208d2c946baSBram Moolenaar 
2091470dc35SBram Moolenaar 	n = vim_snprintf(buf, bsize, fmt_06b, (uvarnumber_T)12);
210d2c946baSBram Moolenaar 	assert(n == 6);
211d2c946baSBram Moolenaar 	assert(bsize == 0 || STRNCMP(buf, "001100", bsize_int) == 0);
212d2c946baSBram Moolenaar 	assert(bsize == 0 || buf[MIN(n, bsize_int)] == '\0');
213d2c946baSBram Moolenaar 
214d2c946baSBram Moolenaar #ifdef FEAT_FLOAT
215d2c946baSBram Moolenaar 	n = vim_snprintf(buf, bsize, "%f", 1.234);
216d2c946baSBram Moolenaar 	assert(n == 8);
217d2c946baSBram Moolenaar 	assert(bsize == 0 || STRNCMP(buf, "1.234000", bsize_int) == 0);
218d2c946baSBram Moolenaar 	assert(bsize == 0 || buf[MIN(n, bsize_int)] == '\0');
219d2c946baSBram Moolenaar 
220d2c946baSBram Moolenaar 	n = vim_snprintf(buf, bsize, "%e", 1.234);
221d2c946baSBram Moolenaar 	assert(n == 12);
222d2c946baSBram Moolenaar 	assert(bsize == 0 || STRNCMP(buf, "1.234000e+00", bsize_int) == 0);
223d2c946baSBram Moolenaar 	assert(bsize == 0 || buf[MIN(n, bsize_int)] == '\0');
224d2c946baSBram Moolenaar 
225d2c946baSBram Moolenaar 	n = vim_snprintf(buf, bsize, "%f", 0.0/0.0);
226d2c946baSBram Moolenaar 	assert(n == 3);
227d2c946baSBram Moolenaar 	assert(bsize == 0 || STRNCMP(buf, "nan", bsize_int) == 0);
228d2c946baSBram Moolenaar 	assert(bsize == 0 || buf[MIN(n, bsize_int)] == '\0');
229d2c946baSBram Moolenaar 
230d2c946baSBram Moolenaar 	n = vim_snprintf(buf, bsize, "%f", 1.0/0.0);
231d2c946baSBram Moolenaar 	assert(n == 3);
232d2c946baSBram Moolenaar 	assert(bsize == 0 || STRNCMP(buf, "inf", bsize_int) == 0);
233d2c946baSBram Moolenaar 	assert(bsize == 0 || buf[MIN(n, bsize_int)] == '\0');
234d2c946baSBram Moolenaar 
235d2c946baSBram Moolenaar 	n = vim_snprintf(buf, bsize, "%f", -1.0/0.0);
236d2c946baSBram Moolenaar 	assert(n == 4);
237d2c946baSBram Moolenaar 	assert(bsize == 0 || STRNCMP(buf, "-inf", bsize_int) == 0);
238d2c946baSBram Moolenaar 	assert(bsize == 0 || buf[MIN(n, bsize_int)] == '\0');
239d2c946baSBram Moolenaar 
240d2c946baSBram Moolenaar 	n = vim_snprintf(buf, bsize, "%f", -0.0);
241d2c946baSBram Moolenaar 	assert(n == 9);
242d2c946baSBram Moolenaar 	assert(bsize == 0 || STRNCMP(buf, "-0.000000", bsize_int) == 0);
243d2c946baSBram Moolenaar 	assert(bsize == 0 || buf[MIN(n, bsize_int)] == '\0');
244d2c946baSBram Moolenaar #endif
245d2c946baSBram Moolenaar 
246d2c946baSBram Moolenaar 	n = vim_snprintf(buf, bsize, "%s", "漢語");
247d2c946baSBram Moolenaar 	assert(n == 6);
248d2c946baSBram Moolenaar 	assert(bsize == 0 || STRNCMP(buf, "漢語", bsize_int) == 0);
249d2c946baSBram Moolenaar 	assert(bsize == 0 || buf[MIN(n, bsize_int)] == '\0');
250d2c946baSBram Moolenaar 
251d2c946baSBram Moolenaar 	n = vim_snprintf(buf, bsize, "%8s", "漢語");
252d2c946baSBram Moolenaar 	assert(n == 8);
253d2c946baSBram Moolenaar 	assert(bsize == 0 || STRNCMP(buf, "  漢語", bsize_int) == 0);
254d2c946baSBram Moolenaar 	assert(bsize == 0 || buf[MIN(n, bsize_int)] == '\0');
255d2c946baSBram Moolenaar 
256d2c946baSBram Moolenaar 	n = vim_snprintf(buf, bsize, "%-8s", "漢語");
257d2c946baSBram Moolenaar 	assert(n == 8);
258d2c946baSBram Moolenaar 	assert(bsize == 0 || STRNCMP(buf, "漢語  ", bsize_int) == 0);
259d2c946baSBram Moolenaar 	assert(bsize == 0 || buf[MIN(n, bsize_int)] == '\0');
260d2c946baSBram Moolenaar 
261d2c946baSBram Moolenaar 	n = vim_snprintf(buf, bsize, "%.3s", "漢語");
262d2c946baSBram Moolenaar 	assert(n == 3);
263d2c946baSBram Moolenaar 	assert(bsize == 0 || STRNCMP(buf, "漢", bsize_int) == 0);
264d2c946baSBram Moolenaar 	assert(bsize == 0 || buf[MIN(n, bsize_int)] == '\0');
265d2c946baSBram Moolenaar 
266d2c946baSBram Moolenaar 	n = vim_snprintf(buf, bsize, fmt_5S, "foo");
267d2c946baSBram Moolenaar 	assert(n == 5);
268d2c946baSBram Moolenaar 	assert(bsize == 0 || STRNCMP(buf, "  foo", bsize_int) == 0);
269d2c946baSBram Moolenaar 	assert(bsize == 0 || buf[MIN(n, bsize_int)] == '\0');
270d2c946baSBram Moolenaar 
271d2c946baSBram Moolenaar 	n = vim_snprintf(buf, bsize, "%%%%%%");
272d2c946baSBram Moolenaar 	assert(n == 3);
273d2c946baSBram Moolenaar 	assert(bsize == 0 || STRNCMP(buf, "%%%", bsize_int) == 0);
274d2c946baSBram Moolenaar 	assert(bsize == 0 || buf[MIN(n, bsize_int)] == '\0');
275d2c946baSBram Moolenaar 
276d2c946baSBram Moolenaar 	n = vim_snprintf(buf, bsize, "%c%c", 1, 2);
277d2c946baSBram Moolenaar 	assert(n == 2);
278d2c946baSBram Moolenaar 	assert(bsize == 0 || STRNCMP(buf, "\x01\x02", bsize_int) == 0);
279d2c946baSBram Moolenaar 	assert(bsize == 0 || buf[MIN(n, bsize_int)] == '\0');
280d2c946baSBram Moolenaar 
281d2c946baSBram Moolenaar 	// %p format is not tested in vim script tests Test_printf*()
282d2c946baSBram Moolenaar 	// as it only makes sense in C code.
283d5b99149SBram Moolenaar 	// NOTE: SunOS libc doesn't use the prefix "0x" on %p.
284d5b99149SBram Moolenaar #ifdef SUN_SYSTEM
285d5b99149SBram Moolenaar # define PREFIX_LEN  0
286d5b99149SBram Moolenaar # define PREFIX_STR1 ""
287d5b99149SBram Moolenaar # define PREFIX_STR2 "00"
288d5b99149SBram Moolenaar #else
289d5b99149SBram Moolenaar # define PREFIX_LEN  2
290d5b99149SBram Moolenaar # define PREFIX_STR1 "0x"
291d5b99149SBram Moolenaar # define PREFIX_STR2 "0x"
292d5b99149SBram Moolenaar #endif
293d2c946baSBram Moolenaar 	n = vim_snprintf(buf, bsize, "%p", ptr);
294d5b99149SBram Moolenaar 	assert(n == 8 + PREFIX_LEN);
295d5b99149SBram Moolenaar 	assert(bsize == 0
296d5b99149SBram Moolenaar 		     || STRNCMP(buf, PREFIX_STR1 "87654321", bsize_int) == 0);
297d2c946baSBram Moolenaar 	assert(bsize == 0 || buf[MIN(n, bsize_int)] == '\0');
298d2c946baSBram Moolenaar 
299d2c946baSBram Moolenaar 	n = vim_snprintf(buf, bsize, fmt_012p, ptr);
300d2c946baSBram Moolenaar 	assert(n == 12);
301d5b99149SBram Moolenaar 	assert(bsize == 0
302d5b99149SBram Moolenaar 		   || STRNCMP(buf, PREFIX_STR2 "0087654321", bsize_int) == 0);
303d2c946baSBram Moolenaar 	assert(bsize == 0 || buf[MIN(n, bsize_int)] == '\0');
304d2c946baSBram Moolenaar 
305d2c946baSBram Moolenaar 	free(buf);
306d2c946baSBram Moolenaar     }
307d2c946baSBram Moolenaar }
308d2c946baSBram Moolenaar 
309502ae4baSBram Moolenaar     int
main(int argc,char ** argv)310502ae4baSBram Moolenaar main(int argc, char **argv)
311502ae4baSBram Moolenaar {
312a80faa89SBram Moolenaar     CLEAR_FIELD(params);
313502ae4baSBram Moolenaar     params.argc = argc;
314502ae4baSBram Moolenaar     params.argv = argv;
315502ae4baSBram Moolenaar     common_init(&params);
316502ae4baSBram Moolenaar 
317d0337e36SBram Moolenaar     set_option_value((char_u *)"encoding", 0, (char_u *)"utf-8", 0);
318d0337e36SBram Moolenaar     init_chartab();
319502ae4baSBram Moolenaar     test_trunc_string();
320*bc869874SRalf Schandl     test_trunc_string_mbyte();
321d2c946baSBram Moolenaar     test_vim_snprintf();
322d0337e36SBram Moolenaar 
323d0337e36SBram Moolenaar     set_option_value((char_u *)"encoding", 0, (char_u *)"latin1", 0);
324d0337e36SBram Moolenaar     init_chartab();
325d0337e36SBram Moolenaar     test_trunc_string();
326d2c946baSBram Moolenaar     test_vim_snprintf();
327d0337e36SBram Moolenaar 
328502ae4baSBram Moolenaar     return 0;
329502ae4baSBram Moolenaar }
330