xref: /vim-8.2.3635/src/misc2.c (revision 6ef8f9ea)
1 /* vi:set ts=8 sts=4 sw=4 noet:
2  *
3  * VIM - Vi IMproved	by Bram Moolenaar
4  *
5  * Do ":help uganda"  in Vim to read copying and usage conditions.
6  * Do ":help credits" in Vim to see a list of people who contributed.
7  * See README.txt for an overview of the Vim source code.
8  */
9 
10 /*
11  * misc2.c: Various functions.
12  */
13 #include "vim.h"
14 
15 static char_u	*username = NULL; /* cached result of mch_get_user_name() */
16 
17 static int coladvance2(pos_T *pos, int addspaces, int finetune, colnr_T wcol);
18 
19 /*
20  * Return TRUE if in the current mode we need to use virtual.
21  */
22     int
23 virtual_active(void)
24 {
25     /* While an operator is being executed we return "virtual_op", because
26      * VIsual_active has already been reset, thus we can't check for "block"
27      * being used. */
28     if (virtual_op != MAYBE)
29 	return virtual_op;
30     return (ve_flags == VE_ALL
31 	    || ((ve_flags & VE_BLOCK) && VIsual_active && VIsual_mode == Ctrl_V)
32 	    || ((ve_flags & VE_INSERT) && (State & INSERT)));
33 }
34 
35 /*
36  * Get the screen position of the cursor.
37  */
38     int
39 getviscol(void)
40 {
41     colnr_T	x;
42 
43     getvvcol(curwin, &curwin->w_cursor, &x, NULL, NULL);
44     return (int)x;
45 }
46 
47 /*
48  * Go to column "wcol", and add/insert white space as necessary to get the
49  * cursor in that column.
50  * The caller must have saved the cursor line for undo!
51  */
52     int
53 coladvance_force(colnr_T wcol)
54 {
55     int rc = coladvance2(&curwin->w_cursor, TRUE, FALSE, wcol);
56 
57     if (wcol == MAXCOL)
58 	curwin->w_valid &= ~VALID_VIRTCOL;
59     else
60     {
61 	/* Virtcol is valid */
62 	curwin->w_valid |= VALID_VIRTCOL;
63 	curwin->w_virtcol = wcol;
64     }
65     return rc;
66 }
67 
68 /*
69  * Get the screen position of character col with a coladd in the cursor line.
70  */
71     int
72 getviscol2(colnr_T col, colnr_T coladd UNUSED)
73 {
74     colnr_T	x;
75     pos_T	pos;
76 
77     pos.lnum = curwin->w_cursor.lnum;
78     pos.col = col;
79     pos.coladd = coladd;
80     getvvcol(curwin, &pos, &x, NULL, NULL);
81     return (int)x;
82 }
83 
84 /*
85  * Try to advance the Cursor to the specified screen column.
86  * If virtual editing: fine tune the cursor position.
87  * Note that all virtual positions off the end of a line should share
88  * a curwin->w_cursor.col value (n.b. this is equal to STRLEN(line)),
89  * beginning at coladd 0.
90  *
91  * return OK if desired column is reached, FAIL if not
92  */
93     int
94 coladvance(colnr_T wcol)
95 {
96     int rc = getvpos(&curwin->w_cursor, wcol);
97 
98     if (wcol == MAXCOL || rc == FAIL)
99 	curwin->w_valid &= ~VALID_VIRTCOL;
100     else if (*ml_get_cursor() != TAB)
101     {
102 	/* Virtcol is valid when not on a TAB */
103 	curwin->w_valid |= VALID_VIRTCOL;
104 	curwin->w_virtcol = wcol;
105     }
106     return rc;
107 }
108 
109 /*
110  * Return in "pos" the position of the cursor advanced to screen column "wcol".
111  * return OK if desired column is reached, FAIL if not
112  */
113     int
114 getvpos(pos_T *pos, colnr_T wcol)
115 {
116     return coladvance2(pos, FALSE, virtual_active(), wcol);
117 }
118 
119     static int
120 coladvance2(
121     pos_T	*pos,
122     int		addspaces,	/* change the text to achieve our goal? */
123     int		finetune,	/* change char offset for the exact column */
124     colnr_T	wcol)		/* column to move to */
125 {
126     int		idx;
127     char_u	*ptr;
128     char_u	*line;
129     colnr_T	col = 0;
130     int		csize = 0;
131     int		one_more;
132 #ifdef FEAT_LINEBREAK
133     int		head = 0;
134 #endif
135 
136     one_more = (State & INSERT)
137 		    || restart_edit != NUL
138 		    || (VIsual_active && *p_sel != 'o')
139 		    || ((ve_flags & VE_ONEMORE) && wcol < MAXCOL) ;
140     line = ml_get_buf(curbuf, pos->lnum, FALSE);
141 
142     if (wcol >= MAXCOL)
143     {
144 	    idx = (int)STRLEN(line) - 1 + one_more;
145 	    col = wcol;
146 
147 	    if ((addspaces || finetune) && !VIsual_active)
148 	    {
149 		curwin->w_curswant = linetabsize(line) + one_more;
150 		if (curwin->w_curswant > 0)
151 		    --curwin->w_curswant;
152 	    }
153     }
154     else
155     {
156 	int width = curwin->w_width - win_col_off(curwin);
157 
158 	if (finetune
159 		&& curwin->w_p_wrap
160 		&& curwin->w_width != 0
161 		&& wcol >= (colnr_T)width)
162 	{
163 	    csize = linetabsize(line);
164 	    if (csize > 0)
165 		csize--;
166 
167 	    if (wcol / width > (colnr_T)csize / width
168 		    && ((State & INSERT) == 0 || (int)wcol > csize + 1))
169 	    {
170 		/* In case of line wrapping don't move the cursor beyond the
171 		 * right screen edge.  In Insert mode allow going just beyond
172 		 * the last character (like what happens when typing and
173 		 * reaching the right window edge). */
174 		wcol = (csize / width + 1) * width - 1;
175 	    }
176 	}
177 
178 	ptr = line;
179 	while (col <= wcol && *ptr != NUL)
180 	{
181 	    /* Count a tab for what it's worth (if list mode not on) */
182 #ifdef FEAT_LINEBREAK
183 	    csize = win_lbr_chartabsize(curwin, line, ptr, col, &head);
184 	    MB_PTR_ADV(ptr);
185 #else
186 	    csize = lbr_chartabsize_adv(line, &ptr, col);
187 #endif
188 	    col += csize;
189 	}
190 	idx = (int)(ptr - line);
191 	/*
192 	 * Handle all the special cases.  The virtual_active() check
193 	 * is needed to ensure that a virtual position off the end of
194 	 * a line has the correct indexing.  The one_more comparison
195 	 * replaces an explicit add of one_more later on.
196 	 */
197 	if (col > wcol || (!virtual_active() && one_more == 0))
198 	{
199 	    idx -= 1;
200 # ifdef FEAT_LINEBREAK
201 	    /* Don't count the chars from 'showbreak'. */
202 	    csize -= head;
203 # endif
204 	    col -= csize;
205 	}
206 
207 	if (virtual_active()
208 		&& addspaces
209 		&& ((col != wcol && col != wcol + 1) || csize > 1))
210 	{
211 	    /* 'virtualedit' is set: The difference between wcol and col is
212 	     * filled with spaces. */
213 
214 	    if (line[idx] == NUL)
215 	    {
216 		/* Append spaces */
217 		int	correct = wcol - col;
218 		char_u	*newline = alloc(idx + correct + 1);
219 		int	t;
220 
221 		if (newline == NULL)
222 		    return FAIL;
223 
224 		for (t = 0; t < idx; ++t)
225 		    newline[t] = line[t];
226 
227 		for (t = 0; t < correct; ++t)
228 		    newline[t + idx] = ' ';
229 
230 		newline[idx + correct] = NUL;
231 
232 		ml_replace(pos->lnum, newline, FALSE);
233 		changed_bytes(pos->lnum, (colnr_T)idx);
234 		idx += correct;
235 		col = wcol;
236 	    }
237 	    else
238 	    {
239 		/* Break a tab */
240 		int	linelen = (int)STRLEN(line);
241 		int	correct = wcol - col - csize + 1; /* negative!! */
242 		char_u	*newline;
243 		int	t, s = 0;
244 		int	v;
245 
246 		if (-correct > csize)
247 		    return FAIL;
248 
249 		newline = alloc(linelen + csize);
250 		if (newline == NULL)
251 		    return FAIL;
252 
253 		for (t = 0; t < linelen; t++)
254 		{
255 		    if (t != idx)
256 			newline[s++] = line[t];
257 		    else
258 			for (v = 0; v < csize; v++)
259 			    newline[s++] = ' ';
260 		}
261 
262 		newline[linelen + csize - 1] = NUL;
263 
264 		ml_replace(pos->lnum, newline, FALSE);
265 		changed_bytes(pos->lnum, idx);
266 		idx += (csize - 1 + correct);
267 		col += correct;
268 	    }
269 	}
270     }
271 
272     if (idx < 0)
273 	pos->col = 0;
274     else
275 	pos->col = idx;
276 
277     pos->coladd = 0;
278 
279     if (finetune)
280     {
281 	if (wcol == MAXCOL)
282 	{
283 	    /* The width of the last character is used to set coladd. */
284 	    if (!one_more)
285 	    {
286 		colnr_T	    scol, ecol;
287 
288 		getvcol(curwin, pos, &scol, NULL, &ecol);
289 		pos->coladd = ecol - scol;
290 	    }
291 	}
292 	else
293 	{
294 	    int b = (int)wcol - (int)col;
295 
296 	    /* The difference between wcol and col is used to set coladd. */
297 	    if (b > 0 && b < (MAXCOL - 2 * curwin->w_width))
298 		pos->coladd = b;
299 
300 	    col += b;
301 	}
302     }
303 
304     /* prevent from moving onto a trail byte */
305     if (has_mbyte)
306 	mb_adjustpos(curbuf, pos);
307 
308     if (col < wcol)
309 	return FAIL;
310     return OK;
311 }
312 
313 /*
314  * Increment the cursor position.  See inc() for return values.
315  */
316     int
317 inc_cursor(void)
318 {
319     return inc(&curwin->w_cursor);
320 }
321 
322 /*
323  * Increment the line pointer "lp" crossing line boundaries as necessary.
324  * Return 1 when going to the next line.
325  * Return 2 when moving forward onto a NUL at the end of the line).
326  * Return -1 when at the end of file.
327  * Return 0 otherwise.
328  */
329     int
330 inc(pos_T *lp)
331 {
332     char_u  *p;
333 
334     /* when searching position may be set to end of a line */
335     if (lp->col != MAXCOL)
336     {
337 	p = ml_get_pos(lp);
338 	if (*p != NUL)	/* still within line, move to next char (may be NUL) */
339 	{
340 	    if (has_mbyte)
341 	    {
342 		int l = (*mb_ptr2len)(p);
343 
344 		lp->col += l;
345 		return ((p[l] != NUL) ? 0 : 2);
346 	    }
347 	    lp->col++;
348 	    lp->coladd = 0;
349 	    return ((p[1] != NUL) ? 0 : 2);
350 	}
351     }
352     if (lp->lnum != curbuf->b_ml.ml_line_count)     /* there is a next line */
353     {
354 	lp->col = 0;
355 	lp->lnum++;
356 	lp->coladd = 0;
357 	return 1;
358     }
359     return -1;
360 }
361 
362 /*
363  * incl(lp): same as inc(), but skip the NUL at the end of non-empty lines
364  */
365     int
366 incl(pos_T *lp)
367 {
368     int	    r;
369 
370     if ((r = inc(lp)) >= 1 && lp->col)
371 	r = inc(lp);
372     return r;
373 }
374 
375 /*
376  * dec(p)
377  *
378  * Decrement the line pointer 'p' crossing line boundaries as necessary.
379  * Return 1 when crossing a line, -1 when at start of file, 0 otherwise.
380  */
381     int
382 dec_cursor(void)
383 {
384     return dec(&curwin->w_cursor);
385 }
386 
387     int
388 dec(pos_T *lp)
389 {
390     char_u	*p;
391 
392     lp->coladd = 0;
393     if (lp->col == MAXCOL)
394     {
395 	/* past end of line */
396 	p = ml_get(lp->lnum);
397 	lp->col = (colnr_T)STRLEN(p);
398 	if (has_mbyte)
399 	    lp->col -= (*mb_head_off)(p, p + lp->col);
400 	return 0;
401     }
402 
403     if (lp->col > 0)
404     {
405 	/* still within line */
406 	lp->col--;
407 	if (has_mbyte)
408 	{
409 	    p = ml_get(lp->lnum);
410 	    lp->col -= (*mb_head_off)(p, p + lp->col);
411 	}
412 	return 0;
413     }
414 
415     if (lp->lnum > 1)
416     {
417 	/* there is a prior line */
418 	lp->lnum--;
419 	p = ml_get(lp->lnum);
420 	lp->col = (colnr_T)STRLEN(p);
421 	if (has_mbyte)
422 	    lp->col -= (*mb_head_off)(p, p + lp->col);
423 	return 1;
424     }
425 
426     /* at start of file */
427     return -1;
428 }
429 
430 /*
431  * decl(lp): same as dec(), but skip the NUL at the end of non-empty lines
432  */
433     int
434 decl(pos_T *lp)
435 {
436     int	    r;
437 
438     if ((r = dec(lp)) == 1 && lp->col)
439 	r = dec(lp);
440     return r;
441 }
442 
443 /*
444  * Get the line number relative to the current cursor position, i.e. the
445  * difference between line number and cursor position. Only look for lines that
446  * can be visible, folded lines don't count.
447  */
448     linenr_T
449 get_cursor_rel_lnum(
450     win_T	*wp,
451     linenr_T	lnum)		    /* line number to get the result for */
452 {
453     linenr_T	cursor = wp->w_cursor.lnum;
454     linenr_T	retval = 0;
455 
456 #ifdef FEAT_FOLDING
457     if (hasAnyFolding(wp))
458     {
459 	if (lnum > cursor)
460 	{
461 	    while (lnum > cursor)
462 	    {
463 		(void)hasFoldingWin(wp, lnum, &lnum, NULL, TRUE, NULL);
464 		/* if lnum and cursor are in the same fold,
465 		 * now lnum <= cursor */
466 		if (lnum > cursor)
467 		    retval++;
468 		lnum--;
469 	    }
470 	}
471 	else if (lnum < cursor)
472 	{
473 	    while (lnum < cursor)
474 	    {
475 		(void)hasFoldingWin(wp, lnum, NULL, &lnum, TRUE, NULL);
476 		/* if lnum and cursor are in the same fold,
477 		 * now lnum >= cursor */
478 		if (lnum < cursor)
479 		    retval--;
480 		lnum++;
481 	    }
482 	}
483 	/* else if (lnum == cursor)
484 	 *     retval = 0;
485 	 */
486     }
487     else
488 #endif
489 	retval = lnum - cursor;
490 
491     return retval;
492 }
493 
494 /*
495  * Make sure "pos.lnum" and "pos.col" are valid in "buf".
496  * This allows for the col to be on the NUL byte.
497  */
498     void
499 check_pos(buf_T *buf, pos_T *pos)
500 {
501     char_u *line;
502     colnr_T len;
503 
504     if (pos->lnum > buf->b_ml.ml_line_count)
505 	pos->lnum = buf->b_ml.ml_line_count;
506 
507     if (pos->col > 0)
508     {
509 	line = ml_get_buf(buf, pos->lnum, FALSE);
510 	len = (colnr_T)STRLEN(line);
511 	if (pos->col > len)
512 	    pos->col = len;
513     }
514 }
515 
516 /*
517  * Make sure curwin->w_cursor.lnum is valid.
518  */
519     void
520 check_cursor_lnum(void)
521 {
522     if (curwin->w_cursor.lnum > curbuf->b_ml.ml_line_count)
523     {
524 #ifdef FEAT_FOLDING
525 	/* If there is a closed fold at the end of the file, put the cursor in
526 	 * its first line.  Otherwise in the last line. */
527 	if (!hasFolding(curbuf->b_ml.ml_line_count,
528 						&curwin->w_cursor.lnum, NULL))
529 #endif
530 	    curwin->w_cursor.lnum = curbuf->b_ml.ml_line_count;
531     }
532     if (curwin->w_cursor.lnum <= 0)
533 	curwin->w_cursor.lnum = 1;
534 }
535 
536 /*
537  * Make sure curwin->w_cursor.col is valid.
538  */
539     void
540 check_cursor_col(void)
541 {
542     check_cursor_col_win(curwin);
543 }
544 
545 /*
546  * Make sure win->w_cursor.col is valid.
547  */
548     void
549 check_cursor_col_win(win_T *win)
550 {
551     colnr_T len;
552     colnr_T oldcol = win->w_cursor.col;
553     colnr_T oldcoladd = win->w_cursor.col + win->w_cursor.coladd;
554 
555     len = (colnr_T)STRLEN(ml_get_buf(win->w_buffer, win->w_cursor.lnum, FALSE));
556     if (len == 0)
557 	win->w_cursor.col = 0;
558     else if (win->w_cursor.col >= len)
559     {
560 	/* Allow cursor past end-of-line when:
561 	 * - in Insert mode or restarting Insert mode
562 	 * - in Visual mode and 'selection' isn't "old"
563 	 * - 'virtualedit' is set */
564 	if ((State & INSERT) || restart_edit
565 		|| (VIsual_active && *p_sel != 'o')
566 		|| (ve_flags & VE_ONEMORE)
567 		|| virtual_active())
568 	    win->w_cursor.col = len;
569 	else
570 	{
571 	    win->w_cursor.col = len - 1;
572 	    /* Move the cursor to the head byte. */
573 	    if (has_mbyte)
574 		mb_adjustpos(win->w_buffer, &win->w_cursor);
575 	}
576     }
577     else if (win->w_cursor.col < 0)
578 	win->w_cursor.col = 0;
579 
580     /* If virtual editing is on, we can leave the cursor on the old position,
581      * only we must set it to virtual.  But don't do it when at the end of the
582      * line. */
583     if (oldcol == MAXCOL)
584 	win->w_cursor.coladd = 0;
585     else if (ve_flags == VE_ALL)
586     {
587 	if (oldcoladd > win->w_cursor.col)
588 	{
589 	    win->w_cursor.coladd = oldcoladd - win->w_cursor.col;
590 
591 	    /* Make sure that coladd is not more than the char width.
592 	     * Not for the last character, coladd is then used when the cursor
593 	     * is actually after the last character. */
594 	    if (win->w_cursor.col + 1 < len && win->w_cursor.coladd > 0)
595 	    {
596 		int cs, ce;
597 
598 		getvcol(win, &win->w_cursor, &cs, NULL, &ce);
599 		if (win->w_cursor.coladd > ce - cs)
600 		    win->w_cursor.coladd = ce - cs;
601 	    }
602 	}
603 	else
604 	    /* avoid weird number when there is a miscalculation or overflow */
605 	    win->w_cursor.coladd = 0;
606     }
607 }
608 
609 /*
610  * make sure curwin->w_cursor in on a valid character
611  */
612     void
613 check_cursor(void)
614 {
615     check_cursor_lnum();
616     check_cursor_col();
617 }
618 
619 #if defined(FEAT_TEXTOBJ) || defined(PROTO)
620 /*
621  * Make sure curwin->w_cursor is not on the NUL at the end of the line.
622  * Allow it when in Visual mode and 'selection' is not "old".
623  */
624     void
625 adjust_cursor_col(void)
626 {
627     if (curwin->w_cursor.col > 0
628 	    && (!VIsual_active || *p_sel == 'o')
629 	    && gchar_cursor() == NUL)
630 	--curwin->w_cursor.col;
631 }
632 #endif
633 
634 /*
635  * When curwin->w_leftcol has changed, adjust the cursor position.
636  * Return TRUE if the cursor was moved.
637  */
638     int
639 leftcol_changed(void)
640 {
641     long	lastcol;
642     colnr_T	s, e;
643     int		retval = FALSE;
644     long        siso = get_sidescrolloff_value();
645 
646     changed_cline_bef_curs();
647     lastcol = curwin->w_leftcol + curwin->w_width - curwin_col_off() - 1;
648     validate_virtcol();
649 
650     /*
651      * If the cursor is right or left of the screen, move it to last or first
652      * character.
653      */
654     if (curwin->w_virtcol > (colnr_T)(lastcol - siso))
655     {
656 	retval = TRUE;
657 	coladvance((colnr_T)(lastcol - siso));
658     }
659     else if (curwin->w_virtcol < curwin->w_leftcol + siso)
660     {
661 	retval = TRUE;
662 	(void)coladvance((colnr_T)(curwin->w_leftcol + siso));
663     }
664 
665     /*
666      * If the start of the character under the cursor is not on the screen,
667      * advance the cursor one more char.  If this fails (last char of the
668      * line) adjust the scrolling.
669      */
670     getvvcol(curwin, &curwin->w_cursor, &s, NULL, &e);
671     if (e > (colnr_T)lastcol)
672     {
673 	retval = TRUE;
674 	coladvance(s - 1);
675     }
676     else if (s < curwin->w_leftcol)
677     {
678 	retval = TRUE;
679 	if (coladvance(e + 1) == FAIL)	/* there isn't another character */
680 	{
681 	    curwin->w_leftcol = s;	/* adjust w_leftcol instead */
682 	    changed_cline_bef_curs();
683 	}
684     }
685 
686     if (retval)
687 	curwin->w_set_curswant = TRUE;
688     redraw_later(NOT_VALID);
689     return retval;
690 }
691 
692 /**********************************************************************
693  * Various routines dealing with allocation and deallocation of memory.
694  */
695 
696 #if defined(MEM_PROFILE) || defined(PROTO)
697 
698 # define MEM_SIZES  8200
699 static long_u mem_allocs[MEM_SIZES];
700 static long_u mem_frees[MEM_SIZES];
701 static long_u mem_allocated;
702 static long_u mem_freed;
703 static long_u mem_peak;
704 static long_u num_alloc;
705 static long_u num_freed;
706 
707     static void
708 mem_pre_alloc_s(size_t *sizep)
709 {
710     *sizep += sizeof(size_t);
711 }
712 
713     static void
714 mem_pre_alloc_l(long_u *sizep)
715 {
716     *sizep += sizeof(size_t);
717 }
718 
719     static void
720 mem_post_alloc(
721     void **pp,
722     size_t size)
723 {
724     if (*pp == NULL)
725 	return;
726     size -= sizeof(size_t);
727     *(long_u *)*pp = size;
728     if (size <= MEM_SIZES-1)
729 	mem_allocs[size-1]++;
730     else
731 	mem_allocs[MEM_SIZES-1]++;
732     mem_allocated += size;
733     if (mem_allocated - mem_freed > mem_peak)
734 	mem_peak = mem_allocated - mem_freed;
735     num_alloc++;
736     *pp = (void *)((char *)*pp + sizeof(size_t));
737 }
738 
739     static void
740 mem_pre_free(void **pp)
741 {
742     long_u size;
743 
744     *pp = (void *)((char *)*pp - sizeof(size_t));
745     size = *(size_t *)*pp;
746     if (size <= MEM_SIZES-1)
747 	mem_frees[size-1]++;
748     else
749 	mem_frees[MEM_SIZES-1]++;
750     mem_freed += size;
751     num_freed++;
752 }
753 
754 /*
755  * called on exit via atexit()
756  */
757     void
758 vim_mem_profile_dump(void)
759 {
760     int i, j;
761 
762     printf("\r\n");
763     j = 0;
764     for (i = 0; i < MEM_SIZES - 1; i++)
765     {
766 	if (mem_allocs[i] || mem_frees[i])
767 	{
768 	    if (mem_frees[i] > mem_allocs[i])
769 		printf("\r\n%s", _("ERROR: "));
770 	    printf("[%4d / %4lu-%-4lu] ", i + 1, mem_allocs[i], mem_frees[i]);
771 	    j++;
772 	    if (j > 3)
773 	    {
774 		j = 0;
775 		printf("\r\n");
776 	    }
777 	}
778     }
779 
780     i = MEM_SIZES - 1;
781     if (mem_allocs[i])
782     {
783 	printf("\r\n");
784 	if (mem_frees[i] > mem_allocs[i])
785 	    puts(_("ERROR: "));
786 	printf("[>%d / %4lu-%-4lu]", i, mem_allocs[i], mem_frees[i]);
787     }
788 
789     printf(_("\n[bytes] total alloc-freed %lu-%lu, in use %lu, peak use %lu\n"),
790 	    mem_allocated, mem_freed, mem_allocated - mem_freed, mem_peak);
791     printf(_("[calls] total re/malloc()'s %lu, total free()'s %lu\n\n"),
792 	    num_alloc, num_freed);
793 }
794 
795 #endif /* MEM_PROFILE */
796 
797 #ifdef FEAT_EVAL
798     int
799 alloc_does_fail(long_u size)
800 {
801     if (alloc_fail_countdown == 0)
802     {
803 	if (--alloc_fail_repeat <= 0)
804 	    alloc_fail_id = 0;
805 	do_outofmem_msg(size);
806 	return TRUE;
807     }
808     --alloc_fail_countdown;
809     return FALSE;
810 }
811 #endif
812 
813 /*
814  * Some memory is reserved for error messages and for being able to
815  * call mf_release_all(), which needs some memory for mf_trans_add().
816  */
817 #define KEEP_ROOM (2 * 8192L)
818 #define KEEP_ROOM_KB (KEEP_ROOM / 1024L)
819 
820 /*
821  * Note: if unsigned is 16 bits we can only allocate up to 64K with alloc().
822  * Use lalloc for larger blocks.
823  */
824     char_u *
825 alloc(unsigned size)
826 {
827     return (lalloc((long_u)size, TRUE));
828 }
829 
830 /*
831  * alloc() with an ID for alloc_fail().
832  */
833     char_u *
834 alloc_id(unsigned size, alloc_id_T id UNUSED)
835 {
836 #ifdef FEAT_EVAL
837     if (alloc_fail_id == id && alloc_does_fail((long_u)size))
838 	return NULL;
839 #endif
840     return (lalloc((long_u)size, TRUE));
841 }
842 
843 /*
844  * Allocate memory and set all bytes to zero.
845  */
846     char_u *
847 alloc_clear(unsigned size)
848 {
849     char_u *p;
850 
851     p = lalloc((long_u)size, TRUE);
852     if (p != NULL)
853 	(void)vim_memset(p, 0, (size_t)size);
854     return p;
855 }
856 
857 /*
858  * Same as alloc_clear() but with allocation id for testing
859  */
860     char_u *
861 alloc_clear_id(unsigned size, alloc_id_T id UNUSED)
862 {
863 #ifdef FEAT_EVAL
864     if (alloc_fail_id == id && alloc_does_fail((long_u)size))
865 	return NULL;
866 #endif
867     return alloc_clear(size);
868 }
869 
870 /*
871  * alloc() with check for maximum line length
872  */
873     char_u *
874 alloc_check(unsigned size)
875 {
876 #if !defined(UNIX)
877     if (sizeof(int) == 2 && size > 0x7fff)
878     {
879 	/* Don't hide this message */
880 	emsg_silent = 0;
881 	emsg(_("E340: Line is becoming too long"));
882 	return NULL;
883     }
884 #endif
885     return (lalloc((long_u)size, TRUE));
886 }
887 
888 /*
889  * Allocate memory like lalloc() and set all bytes to zero.
890  */
891     char_u *
892 lalloc_clear(long_u size, int message)
893 {
894     char_u *p;
895 
896     p = (lalloc(size, message));
897     if (p != NULL)
898 	(void)vim_memset(p, 0, (size_t)size);
899     return p;
900 }
901 
902 /*
903  * Low level memory allocation function.
904  * This is used often, KEEP IT FAST!
905  */
906     char_u *
907 lalloc(long_u size, int message)
908 {
909     char_u	*p;		    /* pointer to new storage space */
910     static int	releasing = FALSE;  /* don't do mf_release_all() recursive */
911     int		try_again;
912 #if defined(HAVE_AVAIL_MEM)
913     static long_u allocated = 0;    /* allocated since last avail check */
914 #endif
915 
916     /* Safety check for allocating zero bytes */
917     if (size == 0)
918     {
919 	/* Don't hide this message */
920 	emsg_silent = 0;
921 	siemsg(_("E341: Internal error: lalloc(%ld, )"), size);
922 	return NULL;
923     }
924 
925 #ifdef MEM_PROFILE
926     mem_pre_alloc_l(&size);
927 #endif
928 
929     /*
930      * Loop when out of memory: Try to release some memfile blocks and
931      * if some blocks are released call malloc again.
932      */
933     for (;;)
934     {
935 	/*
936 	 * Handle three kind of systems:
937 	 * 1. No check for available memory: Just return.
938 	 * 2. Slow check for available memory: call mch_avail_mem() after
939 	 *    allocating KEEP_ROOM amount of memory.
940 	 * 3. Strict check for available memory: call mch_avail_mem()
941 	 */
942 	if ((p = (char_u *)malloc((size_t)size)) != NULL)
943 	{
944 #ifndef HAVE_AVAIL_MEM
945 	    /* 1. No check for available memory: Just return. */
946 	    goto theend;
947 #else
948 	    /* 2. Slow check for available memory: call mch_avail_mem() after
949 	     *    allocating (KEEP_ROOM / 2) amount of memory. */
950 	    allocated += size;
951 	    if (allocated < KEEP_ROOM / 2)
952 		goto theend;
953 	    allocated = 0;
954 
955 	    /* 3. check for available memory: call mch_avail_mem() */
956 	    if (mch_avail_mem(TRUE) < KEEP_ROOM_KB && !releasing)
957 	    {
958 		free((char *)p);	/* System is low... no go! */
959 		p = NULL;
960 	    }
961 	    else
962 		goto theend;
963 #endif
964 	}
965 	/*
966 	 * Remember that mf_release_all() is being called to avoid an endless
967 	 * loop, because mf_release_all() may call alloc() recursively.
968 	 */
969 	if (releasing)
970 	    break;
971 	releasing = TRUE;
972 
973 	clear_sb_text(TRUE);	      /* free any scrollback text */
974 	try_again = mf_release_all(); /* release as many blocks as possible */
975 
976 	releasing = FALSE;
977 	if (!try_again)
978 	    break;
979     }
980 
981     if (message && p == NULL)
982 	do_outofmem_msg(size);
983 
984 theend:
985 #ifdef MEM_PROFILE
986     mem_post_alloc((void **)&p, (size_t)size);
987 #endif
988     return p;
989 }
990 
991 /*
992  * lalloc() with an ID for alloc_fail().
993  */
994 #if defined(FEAT_SIGNS) || defined(PROTO)
995     char_u *
996 lalloc_id(long_u size, int message, alloc_id_T id UNUSED)
997 {
998 #ifdef FEAT_EVAL
999     if (alloc_fail_id == id && alloc_does_fail(size))
1000 	return NULL;
1001 #endif
1002     return (lalloc((long_u)size, message));
1003 }
1004 #endif
1005 
1006 #if defined(MEM_PROFILE) || defined(PROTO)
1007 /*
1008  * realloc() with memory profiling.
1009  */
1010     void *
1011 mem_realloc(void *ptr, size_t size)
1012 {
1013     void *p;
1014 
1015     mem_pre_free(&ptr);
1016     mem_pre_alloc_s(&size);
1017 
1018     p = realloc(ptr, size);
1019 
1020     mem_post_alloc(&p, size);
1021 
1022     return p;
1023 }
1024 #endif
1025 
1026 /*
1027 * Avoid repeating the error message many times (they take 1 second each).
1028 * Did_outofmem_msg is reset when a character is read.
1029 */
1030     void
1031 do_outofmem_msg(long_u size)
1032 {
1033     if (!did_outofmem_msg)
1034     {
1035 	/* Don't hide this message */
1036 	emsg_silent = 0;
1037 
1038 	/* Must come first to avoid coming back here when printing the error
1039 	 * message fails, e.g. when setting v:errmsg. */
1040 	did_outofmem_msg = TRUE;
1041 
1042 	semsg(_("E342: Out of memory!  (allocating %lu bytes)"), size);
1043     }
1044 }
1045 
1046 #if defined(EXITFREE) || defined(PROTO)
1047 
1048 /*
1049  * Free everything that we allocated.
1050  * Can be used to detect memory leaks, e.g., with ccmalloc.
1051  * NOTE: This is tricky!  Things are freed that functions depend on.  Don't be
1052  * surprised if Vim crashes...
1053  * Some things can't be freed, esp. things local to a library function.
1054  */
1055     void
1056 free_all_mem(void)
1057 {
1058     buf_T	*buf, *nextbuf;
1059 
1060     /* When we cause a crash here it is caught and Vim tries to exit cleanly.
1061      * Don't try freeing everything again. */
1062     if (entered_free_all_mem)
1063 	return;
1064     entered_free_all_mem = TRUE;
1065 
1066     /* Don't want to trigger autocommands from here on. */
1067     block_autocmds();
1068 
1069     /* Close all tabs and windows.  Reset 'equalalways' to avoid redraws. */
1070     p_ea = FALSE;
1071     if (first_tabpage->tp_next != NULL)
1072 	do_cmdline_cmd((char_u *)"tabonly!");
1073     if (!ONE_WINDOW)
1074 	do_cmdline_cmd((char_u *)"only!");
1075 
1076 # if defined(FEAT_SPELL)
1077     /* Free all spell info. */
1078     spell_free_all();
1079 # endif
1080 
1081 #if defined(FEAT_INS_EXPAND) && defined(FEAT_BEVAL_TERM)
1082     ui_remove_balloon();
1083 # endif
1084 
1085 # if defined(FEAT_USR_CMDS)
1086     /* Clear user commands (before deleting buffers). */
1087     ex_comclear(NULL);
1088 # endif
1089 
1090 # ifdef FEAT_MENU
1091     /* Clear menus. */
1092     do_cmdline_cmd((char_u *)"aunmenu *");
1093 #  ifdef FEAT_MULTI_LANG
1094     do_cmdline_cmd((char_u *)"menutranslate clear");
1095 #  endif
1096 # endif
1097 
1098     /* Clear mappings, abbreviations, breakpoints. */
1099     do_cmdline_cmd((char_u *)"lmapclear");
1100     do_cmdline_cmd((char_u *)"xmapclear");
1101     do_cmdline_cmd((char_u *)"mapclear");
1102     do_cmdline_cmd((char_u *)"mapclear!");
1103     do_cmdline_cmd((char_u *)"abclear");
1104 # if defined(FEAT_EVAL)
1105     do_cmdline_cmd((char_u *)"breakdel *");
1106 # endif
1107 # if defined(FEAT_PROFILE)
1108     do_cmdline_cmd((char_u *)"profdel *");
1109 # endif
1110 # if defined(FEAT_KEYMAP)
1111     do_cmdline_cmd((char_u *)"set keymap=");
1112 #endif
1113 
1114 # ifdef FEAT_TITLE
1115     free_titles();
1116 # endif
1117 # if defined(FEAT_SEARCHPATH)
1118     free_findfile();
1119 # endif
1120 
1121     /* Obviously named calls. */
1122     free_all_autocmds();
1123     clear_termcodes();
1124     free_all_marks();
1125     alist_clear(&global_alist);
1126     free_homedir();
1127 # if defined(FEAT_CMDL_COMPL)
1128     free_users();
1129 # endif
1130     free_search_patterns();
1131     free_old_sub();
1132     free_last_insert();
1133     free_prev_shellcmd();
1134     free_regexp_stuff();
1135     free_tag_stuff();
1136     free_cd_dir();
1137 # ifdef FEAT_SIGNS
1138     free_signs();
1139 # endif
1140 # ifdef FEAT_EVAL
1141     set_expr_line(NULL);
1142 # endif
1143 # ifdef FEAT_DIFF
1144     diff_clear(curtab);
1145 # endif
1146     clear_sb_text(TRUE);	      /* free any scrollback text */
1147 
1148     /* Free some global vars. */
1149     vim_free(username);
1150 # ifdef FEAT_CLIPBOARD
1151     vim_regfree(clip_exclude_prog);
1152 # endif
1153     vim_free(last_cmdline);
1154 # ifdef FEAT_CMDHIST
1155     vim_free(new_last_cmdline);
1156 # endif
1157     set_keep_msg(NULL, 0);
1158 
1159     /* Clear cmdline history. */
1160     p_hi = 0;
1161 # ifdef FEAT_CMDHIST
1162     init_history();
1163 # endif
1164 #ifdef FEAT_TEXT_PROP
1165     clear_global_prop_types();
1166 #endif
1167 
1168 #ifdef FEAT_QUICKFIX
1169     {
1170 	win_T	    *win;
1171 	tabpage_T   *tab;
1172 
1173 	qf_free_all(NULL);
1174 	/* Free all location lists */
1175 	FOR_ALL_TAB_WINDOWS(tab, win)
1176 	    qf_free_all(win);
1177     }
1178 #endif
1179 
1180     /* Close all script inputs. */
1181     close_all_scripts();
1182 
1183     /* Destroy all windows.  Must come before freeing buffers. */
1184     win_free_all();
1185 
1186     /* Free all option values.  Must come after closing windows. */
1187     free_all_options();
1188 
1189     /* Free all buffers.  Reset 'autochdir' to avoid accessing things that
1190      * were freed already. */
1191 #ifdef FEAT_AUTOCHDIR
1192     p_acd = FALSE;
1193 #endif
1194     for (buf = firstbuf; buf != NULL; )
1195     {
1196 	bufref_T    bufref;
1197 
1198 	set_bufref(&bufref, buf);
1199 	nextbuf = buf->b_next;
1200 	close_buffer(NULL, buf, DOBUF_WIPE, FALSE);
1201 	if (bufref_valid(&bufref))
1202 	    buf = nextbuf;	/* didn't work, try next one */
1203 	else
1204 	    buf = firstbuf;
1205     }
1206 
1207 # ifdef FEAT_ARABIC
1208     free_cmdline_buf();
1209 # endif
1210 
1211     /* Clear registers. */
1212     clear_registers();
1213     ResetRedobuff();
1214     ResetRedobuff();
1215 
1216 # if defined(FEAT_CLIENTSERVER) && defined(FEAT_X11)
1217     vim_free(serverDelayedStartName);
1218 # endif
1219 
1220     /* highlight info */
1221     free_highlight();
1222 
1223     reset_last_sourcing();
1224 
1225     free_tabpage(first_tabpage);
1226     first_tabpage = NULL;
1227 
1228 # ifdef UNIX
1229     /* Machine-specific free. */
1230     mch_free_mem();
1231 # endif
1232 
1233     /* message history */
1234     for (;;)
1235 	if (delete_first_msg() == FAIL)
1236 	    break;
1237 
1238 # ifdef FEAT_JOB_CHANNEL
1239     channel_free_all();
1240 # endif
1241 # ifdef FEAT_TIMERS
1242     timer_free_all();
1243 # endif
1244 # ifdef FEAT_EVAL
1245     /* must be after channel_free_all() with unrefs partials */
1246     eval_clear();
1247 # endif
1248 # ifdef FEAT_JOB_CHANNEL
1249     /* must be after eval_clear() with unrefs jobs */
1250     job_free_all();
1251 # endif
1252 
1253     free_termoptions();
1254 
1255     /* screenlines (can't display anything now!) */
1256     free_screenlines();
1257 
1258 # if defined(USE_XSMP)
1259     xsmp_close();
1260 # endif
1261 # ifdef FEAT_GUI_GTK
1262     gui_mch_free_all();
1263 # endif
1264     clear_hl_tables();
1265 
1266     vim_free(IObuff);
1267     vim_free(NameBuff);
1268 # ifdef FEAT_QUICKFIX
1269     check_quickfix_busy();
1270 # endif
1271 }
1272 #endif
1273 
1274 /*
1275  * Copy "string" into newly allocated memory.
1276  */
1277     char_u *
1278 vim_strsave(char_u *string)
1279 {
1280     char_u	*p;
1281     unsigned	len;
1282 
1283     len = (unsigned)STRLEN(string) + 1;
1284     p = alloc(len);
1285     if (p != NULL)
1286 	mch_memmove(p, string, (size_t)len);
1287     return p;
1288 }
1289 
1290 /*
1291  * Copy up to "len" bytes of "string" into newly allocated memory and
1292  * terminate with a NUL.
1293  * The allocated memory always has size "len + 1", also when "string" is
1294  * shorter.
1295  */
1296     char_u *
1297 vim_strnsave(char_u *string, int len)
1298 {
1299     char_u	*p;
1300 
1301     p = alloc((unsigned)(len + 1));
1302     if (p != NULL)
1303     {
1304 	STRNCPY(p, string, len);
1305 	p[len] = NUL;
1306     }
1307     return p;
1308 }
1309 
1310 /*
1311  * Copy "p[len]" into allocated memory, ignoring NUL characters.
1312  * Returns NULL when out of memory.
1313  */
1314     char_u *
1315 vim_memsave(char_u *p, int len)
1316 {
1317     char_u *ret = alloc((unsigned)len);
1318 
1319     if (ret != NULL)
1320 	mch_memmove(ret, p, (size_t)len);
1321     return ret;
1322 }
1323 
1324 /*
1325  * Same as vim_strsave(), but any characters found in esc_chars are preceded
1326  * by a backslash.
1327  */
1328     char_u *
1329 vim_strsave_escaped(char_u *string, char_u *esc_chars)
1330 {
1331     return vim_strsave_escaped_ext(string, esc_chars, '\\', FALSE);
1332 }
1333 
1334 /*
1335  * Same as vim_strsave_escaped(), but when "bsl" is TRUE also escape
1336  * characters where rem_backslash() would remove the backslash.
1337  * Escape the characters with "cc".
1338  */
1339     char_u *
1340 vim_strsave_escaped_ext(
1341     char_u	*string,
1342     char_u	*esc_chars,
1343     int		cc,
1344     int		bsl)
1345 {
1346     char_u	*p;
1347     char_u	*p2;
1348     char_u	*escaped_string;
1349     unsigned	length;
1350     int		l;
1351 
1352     /*
1353      * First count the number of backslashes required.
1354      * Then allocate the memory and insert them.
1355      */
1356     length = 1;				/* count the trailing NUL */
1357     for (p = string; *p; p++)
1358     {
1359 	if (has_mbyte && (l = (*mb_ptr2len)(p)) > 1)
1360 	{
1361 	    length += l;		/* count a multibyte char */
1362 	    p += l - 1;
1363 	    continue;
1364 	}
1365 	if (vim_strchr(esc_chars, *p) != NULL || (bsl && rem_backslash(p)))
1366 	    ++length;			/* count a backslash */
1367 	++length;			/* count an ordinary char */
1368     }
1369     escaped_string = alloc(length);
1370     if (escaped_string != NULL)
1371     {
1372 	p2 = escaped_string;
1373 	for (p = string; *p; p++)
1374 	{
1375 	    if (has_mbyte && (l = (*mb_ptr2len)(p)) > 1)
1376 	    {
1377 		mch_memmove(p2, p, (size_t)l);
1378 		p2 += l;
1379 		p += l - 1;		/* skip multibyte char  */
1380 		continue;
1381 	    }
1382 	    if (vim_strchr(esc_chars, *p) != NULL || (bsl && rem_backslash(p)))
1383 		*p2++ = cc;
1384 	    *p2++ = *p;
1385 	}
1386 	*p2 = NUL;
1387     }
1388     return escaped_string;
1389 }
1390 
1391 /*
1392  * Return TRUE when 'shell' has "csh" in the tail.
1393  */
1394     int
1395 csh_like_shell(void)
1396 {
1397     return (strstr((char *)gettail(p_sh), "csh") != NULL);
1398 }
1399 
1400 /*
1401  * Escape "string" for use as a shell argument with system().
1402  * This uses single quotes, except when we know we need to use double quotes
1403  * (MS-DOS and MS-Windows without 'shellslash' set).
1404  * Escape a newline, depending on the 'shell' option.
1405  * When "do_special" is TRUE also replace "!", "%", "#" and things starting
1406  * with "<" like "<cfile>".
1407  * When "do_newline" is FALSE do not escape newline unless it is csh shell.
1408  * Returns the result in allocated memory, NULL if we have run out.
1409  */
1410     char_u *
1411 vim_strsave_shellescape(char_u *string, int do_special, int do_newline)
1412 {
1413     unsigned	length;
1414     char_u	*p;
1415     char_u	*d;
1416     char_u	*escaped_string;
1417     int		l;
1418     int		csh_like;
1419 
1420     /* Only csh and similar shells expand '!' within single quotes.  For sh and
1421      * the like we must not put a backslash before it, it will be taken
1422      * literally.  If do_special is set the '!' will be escaped twice.
1423      * Csh also needs to have "\n" escaped twice when do_special is set. */
1424     csh_like = csh_like_shell();
1425 
1426     /* First count the number of extra bytes required. */
1427     length = (unsigned)STRLEN(string) + 3;  /* two quotes and a trailing NUL */
1428     for (p = string; *p != NUL; MB_PTR_ADV(p))
1429     {
1430 # ifdef MSWIN
1431 	if (!p_ssl)
1432 	{
1433 	    if (*p == '"')
1434 		++length;		/* " -> "" */
1435 	}
1436 	else
1437 # endif
1438 	if (*p == '\'')
1439 	    length += 3;		/* ' => '\'' */
1440 	if ((*p == '\n' && (csh_like || do_newline))
1441 		|| (*p == '!' && (csh_like || do_special)))
1442 	{
1443 	    ++length;			/* insert backslash */
1444 	    if (csh_like && do_special)
1445 		++length;		/* insert backslash */
1446 	}
1447 	if (do_special && find_cmdline_var(p, &l) >= 0)
1448 	{
1449 	    ++length;			/* insert backslash */
1450 	    p += l - 1;
1451 	}
1452     }
1453 
1454     /* Allocate memory for the result and fill it. */
1455     escaped_string = alloc(length);
1456     if (escaped_string != NULL)
1457     {
1458 	d = escaped_string;
1459 
1460 	/* add opening quote */
1461 # ifdef MSWIN
1462 	if (!p_ssl)
1463 	    *d++ = '"';
1464 	else
1465 # endif
1466 	    *d++ = '\'';
1467 
1468 	for (p = string; *p != NUL; )
1469 	{
1470 # ifdef MSWIN
1471 	    if (!p_ssl)
1472 	    {
1473 		if (*p == '"')
1474 		{
1475 		    *d++ = '"';
1476 		    *d++ = '"';
1477 		    ++p;
1478 		    continue;
1479 		}
1480 	    }
1481 	    else
1482 # endif
1483 	    if (*p == '\'')
1484 	    {
1485 		*d++ = '\'';
1486 		*d++ = '\\';
1487 		*d++ = '\'';
1488 		*d++ = '\'';
1489 		++p;
1490 		continue;
1491 	    }
1492 	    if ((*p == '\n' && (csh_like || do_newline))
1493 		    || (*p == '!' && (csh_like || do_special)))
1494 	    {
1495 		*d++ = '\\';
1496 		if (csh_like && do_special)
1497 		    *d++ = '\\';
1498 		*d++ = *p++;
1499 		continue;
1500 	    }
1501 	    if (do_special && find_cmdline_var(p, &l) >= 0)
1502 	    {
1503 		*d++ = '\\';		/* insert backslash */
1504 		while (--l >= 0)	/* copy the var */
1505 		    *d++ = *p++;
1506 		continue;
1507 	    }
1508 
1509 	    MB_COPY_CHAR(p, d);
1510 	}
1511 
1512 	/* add terminating quote and finish with a NUL */
1513 # ifdef MSWIN
1514 	if (!p_ssl)
1515 	    *d++ = '"';
1516 	else
1517 # endif
1518 	    *d++ = '\'';
1519 	*d = NUL;
1520     }
1521 
1522     return escaped_string;
1523 }
1524 
1525 /*
1526  * Like vim_strsave(), but make all characters uppercase.
1527  * This uses ASCII lower-to-upper case translation, language independent.
1528  */
1529     char_u *
1530 vim_strsave_up(char_u *string)
1531 {
1532     char_u *p1;
1533 
1534     p1 = vim_strsave(string);
1535     vim_strup(p1);
1536     return p1;
1537 }
1538 
1539 /*
1540  * Like vim_strnsave(), but make all characters uppercase.
1541  * This uses ASCII lower-to-upper case translation, language independent.
1542  */
1543     char_u *
1544 vim_strnsave_up(char_u *string, int len)
1545 {
1546     char_u *p1;
1547 
1548     p1 = vim_strnsave(string, len);
1549     vim_strup(p1);
1550     return p1;
1551 }
1552 
1553 /*
1554  * ASCII lower-to-upper case translation, language independent.
1555  */
1556     void
1557 vim_strup(
1558     char_u	*p)
1559 {
1560     char_u  *p2;
1561     int	    c;
1562 
1563     if (p != NULL)
1564     {
1565 	p2 = p;
1566 	while ((c = *p2) != NUL)
1567 #ifdef EBCDIC
1568 	    *p2++ = isalpha(c) ? toupper(c) : c;
1569 #else
1570 	    *p2++ = (c < 'a' || c > 'z') ? c : (c - 0x20);
1571 #endif
1572     }
1573 }
1574 
1575 #if defined(FEAT_EVAL) || defined(FEAT_SPELL) || defined(PROTO)
1576 /*
1577  * Make string "s" all upper-case and return it in allocated memory.
1578  * Handles multi-byte characters as well as possible.
1579  * Returns NULL when out of memory.
1580  */
1581     char_u *
1582 strup_save(char_u *orig)
1583 {
1584     char_u	*p;
1585     char_u	*res;
1586 
1587     res = p = vim_strsave(orig);
1588 
1589     if (res != NULL)
1590 	while (*p != NUL)
1591 	{
1592 	    int		l;
1593 
1594 	    if (enc_utf8)
1595 	    {
1596 		int	c, uc;
1597 		int	newl;
1598 		char_u	*s;
1599 
1600 		c = utf_ptr2char(p);
1601 		l = utf_ptr2len(p);
1602 		if (c == 0)
1603 		{
1604 		    /* overlong sequence, use only the first byte */
1605 		    c = *p;
1606 		    l = 1;
1607 		}
1608 		uc = utf_toupper(c);
1609 
1610 		/* Reallocate string when byte count changes.  This is rare,
1611 		 * thus it's OK to do another malloc()/free(). */
1612 		newl = utf_char2len(uc);
1613 		if (newl != l)
1614 		{
1615 		    s = alloc((unsigned)STRLEN(res) + 1 + newl - l);
1616 		    if (s == NULL)
1617 		    {
1618 			vim_free(res);
1619 			return NULL;
1620 		    }
1621 		    mch_memmove(s, res, p - res);
1622 		    STRCPY(s + (p - res) + newl, p + l);
1623 		    p = s + (p - res);
1624 		    vim_free(res);
1625 		    res = s;
1626 		}
1627 
1628 		utf_char2bytes(uc, p);
1629 		p += newl;
1630 	    }
1631 	    else if (has_mbyte && (l = (*mb_ptr2len)(p)) > 1)
1632 		p += l;		/* skip multi-byte character */
1633 	    else
1634 	    {
1635 		*p = TOUPPER_LOC(*p); /* note that toupper() can be a macro */
1636 		p++;
1637 	    }
1638 	}
1639 
1640     return res;
1641 }
1642 
1643 /*
1644  * Make string "s" all lower-case and return it in allocated memory.
1645  * Handles multi-byte characters as well as possible.
1646  * Returns NULL when out of memory.
1647  */
1648     char_u *
1649 strlow_save(char_u *orig)
1650 {
1651     char_u	*p;
1652     char_u	*res;
1653 
1654     res = p = vim_strsave(orig);
1655 
1656     if (res != NULL)
1657 	while (*p != NUL)
1658 	{
1659 	    int		l;
1660 
1661 	    if (enc_utf8)
1662 	    {
1663 		int	c, lc;
1664 		int	newl;
1665 		char_u	*s;
1666 
1667 		c = utf_ptr2char(p);
1668 		l = utf_ptr2len(p);
1669 		if (c == 0)
1670 		{
1671 		    /* overlong sequence, use only the first byte */
1672 		    c = *p;
1673 		    l = 1;
1674 		}
1675 		lc = utf_tolower(c);
1676 
1677 		/* Reallocate string when byte count changes.  This is rare,
1678 		 * thus it's OK to do another malloc()/free(). */
1679 		newl = utf_char2len(lc);
1680 		if (newl != l)
1681 		{
1682 		    s = alloc((unsigned)STRLEN(res) + 1 + newl - l);
1683 		    if (s == NULL)
1684 		    {
1685 			vim_free(res);
1686 			return NULL;
1687 		    }
1688 		    mch_memmove(s, res, p - res);
1689 		    STRCPY(s + (p - res) + newl, p + l);
1690 		    p = s + (p - res);
1691 		    vim_free(res);
1692 		    res = s;
1693 		}
1694 
1695 		utf_char2bytes(lc, p);
1696 		p += newl;
1697 	    }
1698 	    else if (has_mbyte && (l = (*mb_ptr2len)(p)) > 1)
1699 		p += l;		/* skip multi-byte character */
1700 	    else
1701 	    {
1702 		*p = TOLOWER_LOC(*p); /* note that tolower() can be a macro */
1703 		p++;
1704 	    }
1705 	}
1706 
1707     return res;
1708 }
1709 #endif
1710 
1711 /*
1712  * delete spaces at the end of a string
1713  */
1714     void
1715 del_trailing_spaces(char_u *ptr)
1716 {
1717     char_u	*q;
1718 
1719     q = ptr + STRLEN(ptr);
1720     while (--q > ptr && VIM_ISWHITE(q[0]) && q[-1] != '\\' && q[-1] != Ctrl_V)
1721 	*q = NUL;
1722 }
1723 
1724 /*
1725  * Like strncpy(), but always terminate the result with one NUL.
1726  * "to" must be "len + 1" long!
1727  */
1728     void
1729 vim_strncpy(char_u *to, char_u *from, size_t len)
1730 {
1731     STRNCPY(to, from, len);
1732     to[len] = NUL;
1733 }
1734 
1735 /*
1736  * Like strcat(), but make sure the result fits in "tosize" bytes and is
1737  * always NUL terminated. "from" and "to" may overlap.
1738  */
1739     void
1740 vim_strcat(char_u *to, char_u *from, size_t tosize)
1741 {
1742     size_t tolen = STRLEN(to);
1743     size_t fromlen = STRLEN(from);
1744 
1745     if (tolen + fromlen + 1 > tosize)
1746     {
1747 	mch_memmove(to + tolen, from, tosize - tolen - 1);
1748 	to[tosize - 1] = NUL;
1749     }
1750     else
1751 	mch_memmove(to + tolen, from, fromlen + 1);
1752 }
1753 
1754 /*
1755  * Isolate one part of a string option where parts are separated with
1756  * "sep_chars".
1757  * The part is copied into "buf[maxlen]".
1758  * "*option" is advanced to the next part.
1759  * The length is returned.
1760  */
1761     int
1762 copy_option_part(
1763     char_u	**option,
1764     char_u	*buf,
1765     int		maxlen,
1766     char	*sep_chars)
1767 {
1768     int	    len = 0;
1769     char_u  *p = *option;
1770 
1771     /* skip '.' at start of option part, for 'suffixes' */
1772     if (*p == '.')
1773 	buf[len++] = *p++;
1774     while (*p != NUL && vim_strchr((char_u *)sep_chars, *p) == NULL)
1775     {
1776 	/*
1777 	 * Skip backslash before a separator character and space.
1778 	 */
1779 	if (p[0] == '\\' && vim_strchr((char_u *)sep_chars, p[1]) != NULL)
1780 	    ++p;
1781 	if (len < maxlen - 1)
1782 	    buf[len++] = *p;
1783 	++p;
1784     }
1785     buf[len] = NUL;
1786 
1787     if (*p != NUL && *p != ',')	/* skip non-standard separator */
1788 	++p;
1789     p = skip_to_option_part(p);	/* p points to next file name */
1790 
1791     *option = p;
1792     return len;
1793 }
1794 
1795 /*
1796  * Replacement for free() that ignores NULL pointers.
1797  * Also skip free() when exiting for sure, this helps when we caught a deadly
1798  * signal that was caused by a crash in free().
1799  * If you want to set NULL after calling this function, you should use
1800  * VIM_CLEAR() instead.
1801  */
1802     void
1803 vim_free(void *x)
1804 {
1805     if (x != NULL && !really_exiting)
1806     {
1807 #ifdef MEM_PROFILE
1808 	mem_pre_free(&x);
1809 #endif
1810 	free(x);
1811     }
1812 }
1813 
1814 #ifndef HAVE_MEMSET
1815     void *
1816 vim_memset(void *ptr, int c, size_t size)
1817 {
1818     char *p = ptr;
1819 
1820     while (size-- > 0)
1821 	*p++ = c;
1822     return ptr;
1823 }
1824 #endif
1825 
1826 #if (!defined(HAVE_STRCASECMP) && !defined(HAVE_STRICMP)) || defined(PROTO)
1827 /*
1828  * Compare two strings, ignoring case, using current locale.
1829  * Doesn't work for multi-byte characters.
1830  * return 0 for match, < 0 for smaller, > 0 for bigger
1831  */
1832     int
1833 vim_stricmp(char *s1, char *s2)
1834 {
1835     int		i;
1836 
1837     for (;;)
1838     {
1839 	i = (int)TOLOWER_LOC(*s1) - (int)TOLOWER_LOC(*s2);
1840 	if (i != 0)
1841 	    return i;			    /* this character different */
1842 	if (*s1 == NUL)
1843 	    break;			    /* strings match until NUL */
1844 	++s1;
1845 	++s2;
1846     }
1847     return 0;				    /* strings match */
1848 }
1849 #endif
1850 
1851 #if (!defined(HAVE_STRNCASECMP) && !defined(HAVE_STRNICMP)) || defined(PROTO)
1852 /*
1853  * Compare two strings, for length "len", ignoring case, using current locale.
1854  * Doesn't work for multi-byte characters.
1855  * return 0 for match, < 0 for smaller, > 0 for bigger
1856  */
1857     int
1858 vim_strnicmp(char *s1, char *s2, size_t len)
1859 {
1860     int		i;
1861 
1862     while (len > 0)
1863     {
1864 	i = (int)TOLOWER_LOC(*s1) - (int)TOLOWER_LOC(*s2);
1865 	if (i != 0)
1866 	    return i;			    /* this character different */
1867 	if (*s1 == NUL)
1868 	    break;			    /* strings match until NUL */
1869 	++s1;
1870 	++s2;
1871 	--len;
1872     }
1873     return 0;				    /* strings match */
1874 }
1875 #endif
1876 
1877 /*
1878  * Version of strchr() and strrchr() that handle unsigned char strings
1879  * with characters from 128 to 255 correctly.  It also doesn't return a
1880  * pointer to the NUL at the end of the string.
1881  */
1882     char_u  *
1883 vim_strchr(char_u *string, int c)
1884 {
1885     char_u	*p;
1886     int		b;
1887 
1888     p = string;
1889     if (enc_utf8 && c >= 0x80)
1890     {
1891 	while (*p != NUL)
1892 	{
1893 	    int l = utfc_ptr2len(p);
1894 
1895 	    /* Avoid matching an illegal byte here. */
1896 	    if (utf_ptr2char(p) == c && l > 1)
1897 		return p;
1898 	    p += l;
1899 	}
1900 	return NULL;
1901     }
1902     if (enc_dbcs != 0 && c > 255)
1903     {
1904 	int	n2 = c & 0xff;
1905 
1906 	c = ((unsigned)c >> 8) & 0xff;
1907 	while ((b = *p) != NUL)
1908 	{
1909 	    if (b == c && p[1] == n2)
1910 		return p;
1911 	    p += (*mb_ptr2len)(p);
1912 	}
1913 	return NULL;
1914     }
1915     if (has_mbyte)
1916     {
1917 	while ((b = *p) != NUL)
1918 	{
1919 	    if (b == c)
1920 		return p;
1921 	    p += (*mb_ptr2len)(p);
1922 	}
1923 	return NULL;
1924     }
1925     while ((b = *p) != NUL)
1926     {
1927 	if (b == c)
1928 	    return p;
1929 	++p;
1930     }
1931     return NULL;
1932 }
1933 
1934 /*
1935  * Version of strchr() that only works for bytes and handles unsigned char
1936  * strings with characters above 128 correctly. It also doesn't return a
1937  * pointer to the NUL at the end of the string.
1938  */
1939     char_u  *
1940 vim_strbyte(char_u *string, int c)
1941 {
1942     char_u	*p = string;
1943 
1944     while (*p != NUL)
1945     {
1946 	if (*p == c)
1947 	    return p;
1948 	++p;
1949     }
1950     return NULL;
1951 }
1952 
1953 /*
1954  * Search for last occurrence of "c" in "string".
1955  * Return NULL if not found.
1956  * Does not handle multi-byte char for "c"!
1957  */
1958     char_u  *
1959 vim_strrchr(char_u *string, int c)
1960 {
1961     char_u	*retval = NULL;
1962     char_u	*p = string;
1963 
1964     while (*p)
1965     {
1966 	if (*p == c)
1967 	    retval = p;
1968 	MB_PTR_ADV(p);
1969     }
1970     return retval;
1971 }
1972 
1973 /*
1974  * Vim's version of strpbrk(), in case it's missing.
1975  * Don't generate a prototype for this, causes problems when it's not used.
1976  */
1977 #ifndef PROTO
1978 # ifndef HAVE_STRPBRK
1979 #  ifdef vim_strpbrk
1980 #   undef vim_strpbrk
1981 #  endif
1982     char_u *
1983 vim_strpbrk(char_u *s, char_u *charset)
1984 {
1985     while (*s)
1986     {
1987 	if (vim_strchr(charset, *s) != NULL)
1988 	    return s;
1989 	MB_PTR_ADV(s);
1990     }
1991     return NULL;
1992 }
1993 # endif
1994 #endif
1995 
1996 /*
1997  * Vim has its own isspace() function, because on some machines isspace()
1998  * can't handle characters above 128.
1999  */
2000     int
2001 vim_isspace(int x)
2002 {
2003     return ((x >= 9 && x <= 13) || x == ' ');
2004 }
2005 
2006 /************************************************************************
2007  * Functions for handling growing arrays.
2008  */
2009 
2010 /*
2011  * Clear an allocated growing array.
2012  */
2013     void
2014 ga_clear(garray_T *gap)
2015 {
2016     vim_free(gap->ga_data);
2017     ga_init(gap);
2018 }
2019 
2020 /*
2021  * Clear a growing array that contains a list of strings.
2022  */
2023     void
2024 ga_clear_strings(garray_T *gap)
2025 {
2026     int		i;
2027 
2028     for (i = 0; i < gap->ga_len; ++i)
2029 	vim_free(((char_u **)(gap->ga_data))[i]);
2030     ga_clear(gap);
2031 }
2032 
2033 /*
2034  * Initialize a growing array.	Don't forget to set ga_itemsize and
2035  * ga_growsize!  Or use ga_init2().
2036  */
2037     void
2038 ga_init(garray_T *gap)
2039 {
2040     gap->ga_data = NULL;
2041     gap->ga_maxlen = 0;
2042     gap->ga_len = 0;
2043 }
2044 
2045     void
2046 ga_init2(garray_T *gap, int itemsize, int growsize)
2047 {
2048     ga_init(gap);
2049     gap->ga_itemsize = itemsize;
2050     gap->ga_growsize = growsize;
2051 }
2052 
2053 /*
2054  * Make room in growing array "gap" for at least "n" items.
2055  * Return FAIL for failure, OK otherwise.
2056  */
2057     int
2058 ga_grow(garray_T *gap, int n)
2059 {
2060     size_t	old_len;
2061     size_t	new_len;
2062     char_u	*pp;
2063 
2064     if (gap->ga_maxlen - gap->ga_len < n)
2065     {
2066 	if (n < gap->ga_growsize)
2067 	    n = gap->ga_growsize;
2068 	new_len = gap->ga_itemsize * (gap->ga_len + n);
2069 	pp = (gap->ga_data == NULL)
2070 	      ? alloc((unsigned)new_len) : vim_realloc(gap->ga_data, new_len);
2071 	if (pp == NULL)
2072 	    return FAIL;
2073 	old_len = gap->ga_itemsize * gap->ga_maxlen;
2074 	vim_memset(pp + old_len, 0, new_len - old_len);
2075 	gap->ga_maxlen = gap->ga_len + n;
2076 	gap->ga_data = pp;
2077     }
2078     return OK;
2079 }
2080 
2081 #if defined(FEAT_EVAL) || defined(FEAT_SEARCHPATH) || defined(PROTO)
2082 /*
2083  * For a growing array that contains a list of strings: concatenate all the
2084  * strings with a separating "sep".
2085  * Returns NULL when out of memory.
2086  */
2087     char_u *
2088 ga_concat_strings(garray_T *gap, char *sep)
2089 {
2090     int		i;
2091     int		len = 0;
2092     int		sep_len = (int)STRLEN(sep);
2093     char_u	*s;
2094     char_u	*p;
2095 
2096     for (i = 0; i < gap->ga_len; ++i)
2097 	len += (int)STRLEN(((char_u **)(gap->ga_data))[i]) + sep_len;
2098 
2099     s = alloc(len + 1);
2100     if (s != NULL)
2101     {
2102 	*s = NUL;
2103 	p = s;
2104 	for (i = 0; i < gap->ga_len; ++i)
2105 	{
2106 	    if (p != s)
2107 	    {
2108 		STRCPY(p, sep);
2109 		p += sep_len;
2110 	    }
2111 	    STRCPY(p, ((char_u **)(gap->ga_data))[i]);
2112 	    p += STRLEN(p);
2113 	}
2114     }
2115     return s;
2116 }
2117 #endif
2118 
2119 #if defined(FEAT_VIMINFO) || defined(FEAT_EVAL) || defined(PROTO)
2120 /*
2121  * Make a copy of string "p" and add it to "gap".
2122  * When out of memory nothing changes.
2123  */
2124     void
2125 ga_add_string(garray_T *gap, char_u *p)
2126 {
2127     char_u *cp = vim_strsave(p);
2128 
2129     if (cp != NULL)
2130     {
2131 	if (ga_grow(gap, 1) == OK)
2132 	    ((char_u **)(gap->ga_data))[gap->ga_len++] = cp;
2133 	else
2134 	    vim_free(cp);
2135     }
2136 }
2137 #endif
2138 
2139 /*
2140  * Concatenate a string to a growarray which contains bytes.
2141  * When "s" is NULL does not do anything.
2142  * Note: Does NOT copy the NUL at the end!
2143  */
2144     void
2145 ga_concat(garray_T *gap, char_u *s)
2146 {
2147     int    len;
2148 
2149     if (s == NULL || *s == NUL)
2150 	return;
2151     len = (int)STRLEN(s);
2152     if (ga_grow(gap, len) == OK)
2153     {
2154 	mch_memmove((char *)gap->ga_data + gap->ga_len, s, (size_t)len);
2155 	gap->ga_len += len;
2156     }
2157 }
2158 
2159 /*
2160  * Append one byte to a growarray which contains bytes.
2161  */
2162     void
2163 ga_append(garray_T *gap, int c)
2164 {
2165     if (ga_grow(gap, 1) == OK)
2166     {
2167 	*((char *)gap->ga_data + gap->ga_len) = c;
2168 	++gap->ga_len;
2169     }
2170 }
2171 
2172 #if (defined(UNIX) && !defined(USE_SYSTEM)) || defined(MSWIN) \
2173 	|| defined(PROTO)
2174 /*
2175  * Append the text in "gap" below the cursor line and clear "gap".
2176  */
2177     void
2178 append_ga_line(garray_T *gap)
2179 {
2180     /* Remove trailing CR. */
2181     if (gap->ga_len > 0
2182 	    && !curbuf->b_p_bin
2183 	    && ((char_u *)gap->ga_data)[gap->ga_len - 1] == CAR)
2184 	--gap->ga_len;
2185     ga_append(gap, NUL);
2186     ml_append(curwin->w_cursor.lnum++, gap->ga_data, 0, FALSE);
2187     gap->ga_len = 0;
2188 }
2189 #endif
2190 
2191 /************************************************************************
2192  * functions that use lookup tables for various things, generally to do with
2193  * special key codes.
2194  */
2195 
2196 /*
2197  * Some useful tables.
2198  */
2199 
2200 static struct modmasktable
2201 {
2202     short	mod_mask;	/* Bit-mask for particular key modifier */
2203     short	mod_flag;	/* Bit(s) for particular key modifier */
2204     char_u	name;		/* Single letter name of modifier */
2205 } mod_mask_table[] =
2206 {
2207     {MOD_MASK_ALT,		MOD_MASK_ALT,		(char_u)'M'},
2208     {MOD_MASK_META,		MOD_MASK_META,		(char_u)'T'},
2209     {MOD_MASK_CTRL,		MOD_MASK_CTRL,		(char_u)'C'},
2210     {MOD_MASK_SHIFT,		MOD_MASK_SHIFT,		(char_u)'S'},
2211     {MOD_MASK_MULTI_CLICK,	MOD_MASK_2CLICK,	(char_u)'2'},
2212     {MOD_MASK_MULTI_CLICK,	MOD_MASK_3CLICK,	(char_u)'3'},
2213     {MOD_MASK_MULTI_CLICK,	MOD_MASK_4CLICK,	(char_u)'4'},
2214 #ifdef MACOS_X
2215     {MOD_MASK_CMD,		MOD_MASK_CMD,		(char_u)'D'},
2216 #endif
2217     /* 'A' must be the last one */
2218     {MOD_MASK_ALT,		MOD_MASK_ALT,		(char_u)'A'},
2219     {0, 0, NUL}
2220     /* NOTE: when adding an entry, update MAX_KEY_NAME_LEN! */
2221 };
2222 
2223 /*
2224  * Shifted key terminal codes and their unshifted equivalent.
2225  * Don't add mouse codes here, they are handled separately!
2226  */
2227 #define MOD_KEYS_ENTRY_SIZE 5
2228 
2229 static char_u modifier_keys_table[] =
2230 {
2231 /*  mod mask	    with modifier		without modifier */
2232     MOD_MASK_SHIFT, '&', '9',			'@', '1',	/* begin */
2233     MOD_MASK_SHIFT, '&', '0',			'@', '2',	/* cancel */
2234     MOD_MASK_SHIFT, '*', '1',			'@', '4',	/* command */
2235     MOD_MASK_SHIFT, '*', '2',			'@', '5',	/* copy */
2236     MOD_MASK_SHIFT, '*', '3',			'@', '6',	/* create */
2237     MOD_MASK_SHIFT, '*', '4',			'k', 'D',	/* delete char */
2238     MOD_MASK_SHIFT, '*', '5',			'k', 'L',	/* delete line */
2239     MOD_MASK_SHIFT, '*', '7',			'@', '7',	/* end */
2240     MOD_MASK_CTRL,  KS_EXTRA, (int)KE_C_END,	'@', '7',	/* end */
2241     MOD_MASK_SHIFT, '*', '9',			'@', '9',	/* exit */
2242     MOD_MASK_SHIFT, '*', '0',			'@', '0',	/* find */
2243     MOD_MASK_SHIFT, '#', '1',			'%', '1',	/* help */
2244     MOD_MASK_SHIFT, '#', '2',			'k', 'h',	/* home */
2245     MOD_MASK_CTRL,  KS_EXTRA, (int)KE_C_HOME,	'k', 'h',	/* home */
2246     MOD_MASK_SHIFT, '#', '3',			'k', 'I',	/* insert */
2247     MOD_MASK_SHIFT, '#', '4',			'k', 'l',	/* left arrow */
2248     MOD_MASK_CTRL,  KS_EXTRA, (int)KE_C_LEFT,	'k', 'l',	/* left arrow */
2249     MOD_MASK_SHIFT, '%', 'a',			'%', '3',	/* message */
2250     MOD_MASK_SHIFT, '%', 'b',			'%', '4',	/* move */
2251     MOD_MASK_SHIFT, '%', 'c',			'%', '5',	/* next */
2252     MOD_MASK_SHIFT, '%', 'd',			'%', '7',	/* options */
2253     MOD_MASK_SHIFT, '%', 'e',			'%', '8',	/* previous */
2254     MOD_MASK_SHIFT, '%', 'f',			'%', '9',	/* print */
2255     MOD_MASK_SHIFT, '%', 'g',			'%', '0',	/* redo */
2256     MOD_MASK_SHIFT, '%', 'h',			'&', '3',	/* replace */
2257     MOD_MASK_SHIFT, '%', 'i',			'k', 'r',	/* right arr. */
2258     MOD_MASK_CTRL,  KS_EXTRA, (int)KE_C_RIGHT,	'k', 'r',	/* right arr. */
2259     MOD_MASK_SHIFT, '%', 'j',			'&', '5',	/* resume */
2260     MOD_MASK_SHIFT, '!', '1',			'&', '6',	/* save */
2261     MOD_MASK_SHIFT, '!', '2',			'&', '7',	/* suspend */
2262     MOD_MASK_SHIFT, '!', '3',			'&', '8',	/* undo */
2263     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_UP,	'k', 'u',	/* up arrow */
2264     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_DOWN,	'k', 'd',	/* down arrow */
2265 
2266 								/* vt100 F1 */
2267     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_XF1,	KS_EXTRA, (int)KE_XF1,
2268     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_XF2,	KS_EXTRA, (int)KE_XF2,
2269     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_XF3,	KS_EXTRA, (int)KE_XF3,
2270     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_XF4,	KS_EXTRA, (int)KE_XF4,
2271 
2272     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F1,	'k', '1',	/* F1 */
2273     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F2,	'k', '2',
2274     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F3,	'k', '3',
2275     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F4,	'k', '4',
2276     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F5,	'k', '5',
2277     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F6,	'k', '6',
2278     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F7,	'k', '7',
2279     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F8,	'k', '8',
2280     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F9,	'k', '9',
2281     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F10,	'k', ';',	/* F10 */
2282 
2283     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F11,	'F', '1',
2284     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F12,	'F', '2',
2285     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F13,	'F', '3',
2286     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F14,	'F', '4',
2287     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F15,	'F', '5',
2288     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F16,	'F', '6',
2289     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F17,	'F', '7',
2290     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F18,	'F', '8',
2291     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F19,	'F', '9',
2292     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F20,	'F', 'A',
2293 
2294     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F21,	'F', 'B',
2295     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F22,	'F', 'C',
2296     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F23,	'F', 'D',
2297     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F24,	'F', 'E',
2298     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F25,	'F', 'F',
2299     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F26,	'F', 'G',
2300     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F27,	'F', 'H',
2301     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F28,	'F', 'I',
2302     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F29,	'F', 'J',
2303     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F30,	'F', 'K',
2304 
2305     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F31,	'F', 'L',
2306     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F32,	'F', 'M',
2307     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F33,	'F', 'N',
2308     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F34,	'F', 'O',
2309     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F35,	'F', 'P',
2310     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F36,	'F', 'Q',
2311     MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F37,	'F', 'R',
2312 
2313 							    /* TAB pseudo code*/
2314     MOD_MASK_SHIFT, 'k', 'B',			KS_EXTRA, (int)KE_TAB,
2315 
2316     NUL
2317 };
2318 
2319 static struct key_name_entry
2320 {
2321     int	    key;	/* Special key code or ascii value */
2322     char_u  *name;	/* Name of key */
2323 } key_names_table[] =
2324 {
2325     {' ',		(char_u *)"Space"},
2326     {TAB,		(char_u *)"Tab"},
2327     {K_TAB,		(char_u *)"Tab"},
2328     {NL,		(char_u *)"NL"},
2329     {NL,		(char_u *)"NewLine"},	/* Alternative name */
2330     {NL,		(char_u *)"LineFeed"},	/* Alternative name */
2331     {NL,		(char_u *)"LF"},	/* Alternative name */
2332     {CAR,		(char_u *)"CR"},
2333     {CAR,		(char_u *)"Return"},	/* Alternative name */
2334     {CAR,		(char_u *)"Enter"},	/* Alternative name */
2335     {K_BS,		(char_u *)"BS"},
2336     {K_BS,		(char_u *)"BackSpace"},	/* Alternative name */
2337     {ESC,		(char_u *)"Esc"},
2338     {CSI,		(char_u *)"CSI"},
2339     {K_CSI,		(char_u *)"xCSI"},
2340     {'|',		(char_u *)"Bar"},
2341     {'\\',		(char_u *)"Bslash"},
2342     {K_DEL,		(char_u *)"Del"},
2343     {K_DEL,		(char_u *)"Delete"},	/* Alternative name */
2344     {K_KDEL,		(char_u *)"kDel"},
2345     {K_UP,		(char_u *)"Up"},
2346     {K_DOWN,		(char_u *)"Down"},
2347     {K_LEFT,		(char_u *)"Left"},
2348     {K_RIGHT,		(char_u *)"Right"},
2349     {K_XUP,		(char_u *)"xUp"},
2350     {K_XDOWN,		(char_u *)"xDown"},
2351     {K_XLEFT,		(char_u *)"xLeft"},
2352     {K_XRIGHT,		(char_u *)"xRight"},
2353     {K_PS,		(char_u *)"PasteStart"},
2354     {K_PE,		(char_u *)"PasteEnd"},
2355 
2356     {K_F1,		(char_u *)"F1"},
2357     {K_F2,		(char_u *)"F2"},
2358     {K_F3,		(char_u *)"F3"},
2359     {K_F4,		(char_u *)"F4"},
2360     {K_F5,		(char_u *)"F5"},
2361     {K_F6,		(char_u *)"F6"},
2362     {K_F7,		(char_u *)"F7"},
2363     {K_F8,		(char_u *)"F8"},
2364     {K_F9,		(char_u *)"F9"},
2365     {K_F10,		(char_u *)"F10"},
2366 
2367     {K_F11,		(char_u *)"F11"},
2368     {K_F12,		(char_u *)"F12"},
2369     {K_F13,		(char_u *)"F13"},
2370     {K_F14,		(char_u *)"F14"},
2371     {K_F15,		(char_u *)"F15"},
2372     {K_F16,		(char_u *)"F16"},
2373     {K_F17,		(char_u *)"F17"},
2374     {K_F18,		(char_u *)"F18"},
2375     {K_F19,		(char_u *)"F19"},
2376     {K_F20,		(char_u *)"F20"},
2377 
2378     {K_F21,		(char_u *)"F21"},
2379     {K_F22,		(char_u *)"F22"},
2380     {K_F23,		(char_u *)"F23"},
2381     {K_F24,		(char_u *)"F24"},
2382     {K_F25,		(char_u *)"F25"},
2383     {K_F26,		(char_u *)"F26"},
2384     {K_F27,		(char_u *)"F27"},
2385     {K_F28,		(char_u *)"F28"},
2386     {K_F29,		(char_u *)"F29"},
2387     {K_F30,		(char_u *)"F30"},
2388 
2389     {K_F31,		(char_u *)"F31"},
2390     {K_F32,		(char_u *)"F32"},
2391     {K_F33,		(char_u *)"F33"},
2392     {K_F34,		(char_u *)"F34"},
2393     {K_F35,		(char_u *)"F35"},
2394     {K_F36,		(char_u *)"F36"},
2395     {K_F37,		(char_u *)"F37"},
2396 
2397     {K_XF1,		(char_u *)"xF1"},
2398     {K_XF2,		(char_u *)"xF2"},
2399     {K_XF3,		(char_u *)"xF3"},
2400     {K_XF4,		(char_u *)"xF4"},
2401 
2402     {K_HELP,		(char_u *)"Help"},
2403     {K_UNDO,		(char_u *)"Undo"},
2404     {K_INS,		(char_u *)"Insert"},
2405     {K_INS,		(char_u *)"Ins"},	/* Alternative name */
2406     {K_KINS,		(char_u *)"kInsert"},
2407     {K_HOME,		(char_u *)"Home"},
2408     {K_KHOME,		(char_u *)"kHome"},
2409     {K_XHOME,		(char_u *)"xHome"},
2410     {K_ZHOME,		(char_u *)"zHome"},
2411     {K_END,		(char_u *)"End"},
2412     {K_KEND,		(char_u *)"kEnd"},
2413     {K_XEND,		(char_u *)"xEnd"},
2414     {K_ZEND,		(char_u *)"zEnd"},
2415     {K_PAGEUP,		(char_u *)"PageUp"},
2416     {K_PAGEDOWN,	(char_u *)"PageDown"},
2417     {K_KPAGEUP,		(char_u *)"kPageUp"},
2418     {K_KPAGEDOWN,	(char_u *)"kPageDown"},
2419 
2420     {K_KPLUS,		(char_u *)"kPlus"},
2421     {K_KMINUS,		(char_u *)"kMinus"},
2422     {K_KDIVIDE,		(char_u *)"kDivide"},
2423     {K_KMULTIPLY,	(char_u *)"kMultiply"},
2424     {K_KENTER,		(char_u *)"kEnter"},
2425     {K_KPOINT,		(char_u *)"kPoint"},
2426 
2427     {K_K0,		(char_u *)"k0"},
2428     {K_K1,		(char_u *)"k1"},
2429     {K_K2,		(char_u *)"k2"},
2430     {K_K3,		(char_u *)"k3"},
2431     {K_K4,		(char_u *)"k4"},
2432     {K_K5,		(char_u *)"k5"},
2433     {K_K6,		(char_u *)"k6"},
2434     {K_K7,		(char_u *)"k7"},
2435     {K_K8,		(char_u *)"k8"},
2436     {K_K9,		(char_u *)"k9"},
2437 
2438     {'<',		(char_u *)"lt"},
2439 
2440     {K_MOUSE,		(char_u *)"Mouse"},
2441 #ifdef FEAT_MOUSE_NET
2442     {K_NETTERM_MOUSE,	(char_u *)"NetMouse"},
2443 #endif
2444 #ifdef FEAT_MOUSE_DEC
2445     {K_DEC_MOUSE,	(char_u *)"DecMouse"},
2446 #endif
2447 #ifdef FEAT_MOUSE_JSB
2448     {K_JSBTERM_MOUSE,	(char_u *)"JsbMouse"},
2449 #endif
2450 #ifdef FEAT_MOUSE_PTERM
2451     {K_PTERM_MOUSE,	(char_u *)"PtermMouse"},
2452 #endif
2453 #ifdef FEAT_MOUSE_URXVT
2454     {K_URXVT_MOUSE,	(char_u *)"UrxvtMouse"},
2455 #endif
2456 #ifdef FEAT_MOUSE_SGR
2457     {K_SGR_MOUSE,	(char_u *)"SgrMouse"},
2458     {K_SGR_MOUSERELEASE, (char_u *)"SgrMouseRelelase"},
2459 #endif
2460     {K_LEFTMOUSE,	(char_u *)"LeftMouse"},
2461     {K_LEFTMOUSE_NM,	(char_u *)"LeftMouseNM"},
2462     {K_LEFTDRAG,	(char_u *)"LeftDrag"},
2463     {K_LEFTRELEASE,	(char_u *)"LeftRelease"},
2464     {K_LEFTRELEASE_NM,	(char_u *)"LeftReleaseNM"},
2465     {K_MOUSEMOVE,	(char_u *)"MouseMove"},
2466     {K_MIDDLEMOUSE,	(char_u *)"MiddleMouse"},
2467     {K_MIDDLEDRAG,	(char_u *)"MiddleDrag"},
2468     {K_MIDDLERELEASE,	(char_u *)"MiddleRelease"},
2469     {K_RIGHTMOUSE,	(char_u *)"RightMouse"},
2470     {K_RIGHTDRAG,	(char_u *)"RightDrag"},
2471     {K_RIGHTRELEASE,	(char_u *)"RightRelease"},
2472     {K_MOUSEDOWN,	(char_u *)"ScrollWheelUp"},
2473     {K_MOUSEUP,		(char_u *)"ScrollWheelDown"},
2474     {K_MOUSELEFT,	(char_u *)"ScrollWheelRight"},
2475     {K_MOUSERIGHT,	(char_u *)"ScrollWheelLeft"},
2476     {K_MOUSEDOWN,	(char_u *)"MouseDown"}, /* OBSOLETE: Use	  */
2477     {K_MOUSEUP,		(char_u *)"MouseUp"},	/* ScrollWheelXXX instead */
2478     {K_X1MOUSE,		(char_u *)"X1Mouse"},
2479     {K_X1DRAG,		(char_u *)"X1Drag"},
2480     {K_X1RELEASE,		(char_u *)"X1Release"},
2481     {K_X2MOUSE,		(char_u *)"X2Mouse"},
2482     {K_X2DRAG,		(char_u *)"X2Drag"},
2483     {K_X2RELEASE,		(char_u *)"X2Release"},
2484     {K_DROP,		(char_u *)"Drop"},
2485     {K_ZERO,		(char_u *)"Nul"},
2486 #ifdef FEAT_EVAL
2487     {K_SNR,		(char_u *)"SNR"},
2488 #endif
2489     {K_PLUG,		(char_u *)"Plug"},
2490     {K_CURSORHOLD,	(char_u *)"CursorHold"},
2491     {0,			NULL}
2492     /* NOTE: When adding a long name update MAX_KEY_NAME_LEN. */
2493 };
2494 
2495 #define KEY_NAMES_TABLE_LEN (sizeof(key_names_table) / sizeof(struct key_name_entry))
2496 
2497 #ifdef FEAT_MOUSE
2498 static struct mousetable
2499 {
2500     int	    pseudo_code;	/* Code for pseudo mouse event */
2501     int	    button;		/* Which mouse button is it? */
2502     int	    is_click;		/* Is it a mouse button click event? */
2503     int	    is_drag;		/* Is it a mouse drag event? */
2504 } mouse_table[] =
2505 {
2506     {(int)KE_LEFTMOUSE,		MOUSE_LEFT,	TRUE,	FALSE},
2507 #ifdef FEAT_GUI
2508     {(int)KE_LEFTMOUSE_NM,	MOUSE_LEFT,	TRUE,	FALSE},
2509 #endif
2510     {(int)KE_LEFTDRAG,		MOUSE_LEFT,	FALSE,	TRUE},
2511     {(int)KE_LEFTRELEASE,	MOUSE_LEFT,	FALSE,	FALSE},
2512 #ifdef FEAT_GUI
2513     {(int)KE_LEFTRELEASE_NM,	MOUSE_LEFT,	FALSE,	FALSE},
2514 #endif
2515     {(int)KE_MIDDLEMOUSE,	MOUSE_MIDDLE,	TRUE,	FALSE},
2516     {(int)KE_MIDDLEDRAG,	MOUSE_MIDDLE,	FALSE,	TRUE},
2517     {(int)KE_MIDDLERELEASE,	MOUSE_MIDDLE,	FALSE,	FALSE},
2518     {(int)KE_RIGHTMOUSE,	MOUSE_RIGHT,	TRUE,	FALSE},
2519     {(int)KE_RIGHTDRAG,		MOUSE_RIGHT,	FALSE,	TRUE},
2520     {(int)KE_RIGHTRELEASE,	MOUSE_RIGHT,	FALSE,	FALSE},
2521     {(int)KE_X1MOUSE,		MOUSE_X1,	TRUE,	FALSE},
2522     {(int)KE_X1DRAG,		MOUSE_X1,	FALSE,	TRUE},
2523     {(int)KE_X1RELEASE,		MOUSE_X1,	FALSE,	FALSE},
2524     {(int)KE_X2MOUSE,		MOUSE_X2,	TRUE,	FALSE},
2525     {(int)KE_X2DRAG,		MOUSE_X2,	FALSE,	TRUE},
2526     {(int)KE_X2RELEASE,		MOUSE_X2,	FALSE,	FALSE},
2527     /* DRAG without CLICK */
2528     {(int)KE_MOUSEMOVE,		MOUSE_RELEASE,	FALSE,	TRUE},
2529     /* RELEASE without CLICK */
2530     {(int)KE_IGNORE,		MOUSE_RELEASE,	FALSE,	FALSE},
2531     {0,				0,		0,	0},
2532 };
2533 #endif /* FEAT_MOUSE */
2534 
2535 /*
2536  * Return the modifier mask bit (MOD_MASK_*) which corresponds to the given
2537  * modifier name ('S' for Shift, 'C' for Ctrl etc).
2538  */
2539     int
2540 name_to_mod_mask(int c)
2541 {
2542     int	    i;
2543 
2544     c = TOUPPER_ASC(c);
2545     for (i = 0; mod_mask_table[i].mod_mask != 0; i++)
2546 	if (c == mod_mask_table[i].name)
2547 	    return mod_mask_table[i].mod_flag;
2548     return 0;
2549 }
2550 
2551 /*
2552  * Check if if there is a special key code for "key" that includes the
2553  * modifiers specified.
2554  */
2555     int
2556 simplify_key(int key, int *modifiers)
2557 {
2558     int	    i;
2559     int	    key0;
2560     int	    key1;
2561 
2562     if (*modifiers & (MOD_MASK_SHIFT | MOD_MASK_CTRL | MOD_MASK_ALT))
2563     {
2564 	/* TAB is a special case */
2565 	if (key == TAB && (*modifiers & MOD_MASK_SHIFT))
2566 	{
2567 	    *modifiers &= ~MOD_MASK_SHIFT;
2568 	    return K_S_TAB;
2569 	}
2570 	key0 = KEY2TERMCAP0(key);
2571 	key1 = KEY2TERMCAP1(key);
2572 	for (i = 0; modifier_keys_table[i] != NUL; i += MOD_KEYS_ENTRY_SIZE)
2573 	    if (key0 == modifier_keys_table[i + 3]
2574 		    && key1 == modifier_keys_table[i + 4]
2575 		    && (*modifiers & modifier_keys_table[i]))
2576 	    {
2577 		*modifiers &= ~modifier_keys_table[i];
2578 		return TERMCAP2KEY(modifier_keys_table[i + 1],
2579 						   modifier_keys_table[i + 2]);
2580 	    }
2581     }
2582     return key;
2583 }
2584 
2585 /*
2586  * Change <xHome> to <Home>, <xUp> to <Up>, etc.
2587  */
2588     int
2589 handle_x_keys(int key)
2590 {
2591     switch (key)
2592     {
2593 	case K_XUP:	return K_UP;
2594 	case K_XDOWN:	return K_DOWN;
2595 	case K_XLEFT:	return K_LEFT;
2596 	case K_XRIGHT:	return K_RIGHT;
2597 	case K_XHOME:	return K_HOME;
2598 	case K_ZHOME:	return K_HOME;
2599 	case K_XEND:	return K_END;
2600 	case K_ZEND:	return K_END;
2601 	case K_XF1:	return K_F1;
2602 	case K_XF2:	return K_F2;
2603 	case K_XF3:	return K_F3;
2604 	case K_XF4:	return K_F4;
2605 	case K_S_XF1:	return K_S_F1;
2606 	case K_S_XF2:	return K_S_F2;
2607 	case K_S_XF3:	return K_S_F3;
2608 	case K_S_XF4:	return K_S_F4;
2609     }
2610     return key;
2611 }
2612 
2613 /*
2614  * Return a string which contains the name of the given key when the given
2615  * modifiers are down.
2616  */
2617     char_u *
2618 get_special_key_name(int c, int modifiers)
2619 {
2620     static char_u string[MAX_KEY_NAME_LEN + 1];
2621 
2622     int	    i, idx;
2623     int	    table_idx;
2624     char_u  *s;
2625 
2626     string[0] = '<';
2627     idx = 1;
2628 
2629     /* Key that stands for a normal character. */
2630     if (IS_SPECIAL(c) && KEY2TERMCAP0(c) == KS_KEY)
2631 	c = KEY2TERMCAP1(c);
2632 
2633     /*
2634      * Translate shifted special keys into unshifted keys and set modifier.
2635      * Same for CTRL and ALT modifiers.
2636      */
2637     if (IS_SPECIAL(c))
2638     {
2639 	for (i = 0; modifier_keys_table[i] != 0; i += MOD_KEYS_ENTRY_SIZE)
2640 	    if (       KEY2TERMCAP0(c) == (int)modifier_keys_table[i + 1]
2641 		    && (int)KEY2TERMCAP1(c) == (int)modifier_keys_table[i + 2])
2642 	    {
2643 		modifiers |= modifier_keys_table[i];
2644 		c = TERMCAP2KEY(modifier_keys_table[i + 3],
2645 						   modifier_keys_table[i + 4]);
2646 		break;
2647 	    }
2648     }
2649 
2650     /* try to find the key in the special key table */
2651     table_idx = find_special_key_in_table(c);
2652 
2653     /*
2654      * When not a known special key, and not a printable character, try to
2655      * extract modifiers.
2656      */
2657     if (c > 0 && (*mb_char2len)(c) == 1)
2658     {
2659 	if (table_idx < 0
2660 		&& (!vim_isprintc(c) || (c & 0x7f) == ' ')
2661 		&& (c & 0x80))
2662 	{
2663 	    c &= 0x7f;
2664 	    modifiers |= MOD_MASK_ALT;
2665 	    /* try again, to find the un-alted key in the special key table */
2666 	    table_idx = find_special_key_in_table(c);
2667 	}
2668 	if (table_idx < 0 && !vim_isprintc(c) && c < ' ')
2669 	{
2670 #ifdef EBCDIC
2671 	    c = CtrlChar(c);
2672 #else
2673 	    c += '@';
2674 #endif
2675 	    modifiers |= MOD_MASK_CTRL;
2676 	}
2677     }
2678 
2679     /* translate the modifier into a string */
2680     for (i = 0; mod_mask_table[i].name != 'A'; i++)
2681 	if ((modifiers & mod_mask_table[i].mod_mask)
2682 						== mod_mask_table[i].mod_flag)
2683 	{
2684 	    string[idx++] = mod_mask_table[i].name;
2685 	    string[idx++] = (char_u)'-';
2686 	}
2687 
2688     if (table_idx < 0)		/* unknown special key, may output t_xx */
2689     {
2690 	if (IS_SPECIAL(c))
2691 	{
2692 	    string[idx++] = 't';
2693 	    string[idx++] = '_';
2694 	    string[idx++] = KEY2TERMCAP0(c);
2695 	    string[idx++] = KEY2TERMCAP1(c);
2696 	}
2697 	/* Not a special key, only modifiers, output directly */
2698 	else
2699 	{
2700 	    if (has_mbyte && (*mb_char2len)(c) > 1)
2701 		idx += (*mb_char2bytes)(c, string + idx);
2702 	    else if (vim_isprintc(c))
2703 		string[idx++] = c;
2704 	    else
2705 	    {
2706 		s = transchar(c);
2707 		while (*s)
2708 		    string[idx++] = *s++;
2709 	    }
2710 	}
2711     }
2712     else		/* use name of special key */
2713     {
2714 	size_t len = STRLEN(key_names_table[table_idx].name);
2715 
2716 	if (len + idx + 2 <= MAX_KEY_NAME_LEN)
2717 	{
2718 	    STRCPY(string + idx, key_names_table[table_idx].name);
2719 	    idx += (int)len;
2720 	}
2721     }
2722     string[idx++] = '>';
2723     string[idx] = NUL;
2724     return string;
2725 }
2726 
2727 /*
2728  * Try translating a <> name at (*srcp)[] to dst[].
2729  * Return the number of characters added to dst[], zero for no match.
2730  * If there is a match, srcp is advanced to after the <> name.
2731  * dst[] must be big enough to hold the result (up to six characters)!
2732  */
2733     int
2734 trans_special(
2735     char_u	**srcp,
2736     char_u	*dst,
2737     int		keycode, /* prefer key code, e.g. K_DEL instead of DEL */
2738     int		in_string) /* TRUE when inside a double quoted string */
2739 {
2740     int		modifiers = 0;
2741     int		key;
2742     int		dlen = 0;
2743 
2744     key = find_special_key(srcp, &modifiers, keycode, FALSE, in_string);
2745     if (key == 0)
2746 	return 0;
2747 
2748     /* Put the appropriate modifier in a string */
2749     if (modifiers != 0)
2750     {
2751 	dst[dlen++] = K_SPECIAL;
2752 	dst[dlen++] = KS_MODIFIER;
2753 	dst[dlen++] = modifiers;
2754     }
2755 
2756     if (IS_SPECIAL(key))
2757     {
2758 	dst[dlen++] = K_SPECIAL;
2759 	dst[dlen++] = KEY2TERMCAP0(key);
2760 	dst[dlen++] = KEY2TERMCAP1(key);
2761     }
2762     else if (has_mbyte && !keycode)
2763 	dlen += (*mb_char2bytes)(key, dst + dlen);
2764     else if (keycode)
2765 	dlen = (int)(add_char2buf(key, dst + dlen) - dst);
2766     else
2767 	dst[dlen++] = key;
2768 
2769     return dlen;
2770 }
2771 
2772 /*
2773  * Try translating a <> name at (*srcp)[], return the key and modifiers.
2774  * srcp is advanced to after the <> name.
2775  * returns 0 if there is no match.
2776  */
2777     int
2778 find_special_key(
2779     char_u	**srcp,
2780     int		*modp,
2781     int		keycode,     /* prefer key code, e.g. K_DEL instead of DEL */
2782     int		keep_x_key,  /* don't translate xHome to Home key */
2783     int		in_string)   /* TRUE in string, double quote is escaped */
2784 {
2785     char_u	*last_dash;
2786     char_u	*end_of_name;
2787     char_u	*src;
2788     char_u	*bp;
2789     int		modifiers;
2790     int		bit;
2791     int		key;
2792     uvarnumber_T	n;
2793     int		l;
2794 
2795     src = *srcp;
2796     if (src[0] != '<')
2797 	return 0;
2798 
2799     /* Find end of modifier list */
2800     last_dash = src;
2801     for (bp = src + 1; *bp == '-' || vim_isIDc(*bp); bp++)
2802     {
2803 	if (*bp == '-')
2804 	{
2805 	    last_dash = bp;
2806 	    if (bp[1] != NUL)
2807 	    {
2808 		if (has_mbyte)
2809 		    l = mb_ptr2len(bp + 1);
2810 		else
2811 		    l = 1;
2812 		/* Anything accepted, like <C-?>.
2813 		 * <C-"> or <M-"> are not special in strings as " is
2814 		 * the string delimiter. With a backslash it works: <M-\"> */
2815 		if (!(in_string && bp[1] == '"') && bp[2] == '>')
2816 		    bp += l;
2817 		else if (in_string && bp[1] == '\\' && bp[2] == '"'
2818 							       && bp[3] == '>')
2819 		    bp += 2;
2820 	    }
2821 	}
2822 	if (bp[0] == 't' && bp[1] == '_' && bp[2] && bp[3])
2823 	    bp += 3;	/* skip t_xx, xx may be '-' or '>' */
2824 	else if (STRNICMP(bp, "char-", 5) == 0)
2825 	{
2826 	    vim_str2nr(bp + 5, NULL, &l, STR2NR_ALL, NULL, NULL, 0);
2827 	    bp += l + 5;
2828 	    break;
2829 	}
2830     }
2831 
2832     if (*bp == '>')	/* found matching '>' */
2833     {
2834 	end_of_name = bp + 1;
2835 
2836 	/* Which modifiers are given? */
2837 	modifiers = 0x0;
2838 	for (bp = src + 1; bp < last_dash; bp++)
2839 	{
2840 	    if (*bp != '-')
2841 	    {
2842 		bit = name_to_mod_mask(*bp);
2843 		if (bit == 0x0)
2844 		    break;	/* Illegal modifier name */
2845 		modifiers |= bit;
2846 	    }
2847 	}
2848 
2849 	/*
2850 	 * Legal modifier name.
2851 	 */
2852 	if (bp >= last_dash)
2853 	{
2854 	    if (STRNICMP(last_dash + 1, "char-", 5) == 0
2855 						 && VIM_ISDIGIT(last_dash[6]))
2856 	    {
2857 		/* <Char-123> or <Char-033> or <Char-0x33> */
2858 		vim_str2nr(last_dash + 6, NULL, NULL, STR2NR_ALL, NULL, &n, 0);
2859 		key = (int)n;
2860 	    }
2861 	    else
2862 	    {
2863 		int off = 1;
2864 
2865 		/* Modifier with single letter, or special key name.  */
2866 		if (in_string && last_dash[1] == '\\' && last_dash[2] == '"')
2867 		    off = 2;
2868 		if (has_mbyte)
2869 		    l = mb_ptr2len(last_dash + off);
2870 		else
2871 		    l = 1;
2872 		if (modifiers != 0 && last_dash[l + off] == '>')
2873 		    key = PTR2CHAR(last_dash + off);
2874 		else
2875 		{
2876 		    key = get_special_key_code(last_dash + off);
2877 		    if (!keep_x_key)
2878 			key = handle_x_keys(key);
2879 		}
2880 	    }
2881 
2882 	    /*
2883 	     * get_special_key_code() may return NUL for invalid
2884 	     * special key name.
2885 	     */
2886 	    if (key != NUL)
2887 	    {
2888 		/*
2889 		 * Only use a modifier when there is no special key code that
2890 		 * includes the modifier.
2891 		 */
2892 		key = simplify_key(key, &modifiers);
2893 
2894 		if (!keycode)
2895 		{
2896 		    /* don't want keycode, use single byte code */
2897 		    if (key == K_BS)
2898 			key = BS;
2899 		    else if (key == K_DEL || key == K_KDEL)
2900 			key = DEL;
2901 		}
2902 
2903 		/*
2904 		 * Normal Key with modifier: Try to make a single byte code.
2905 		 */
2906 		if (!IS_SPECIAL(key))
2907 		    key = extract_modifiers(key, &modifiers);
2908 
2909 		*modp = modifiers;
2910 		*srcp = end_of_name;
2911 		return key;
2912 	    }
2913 	}
2914     }
2915     return 0;
2916 }
2917 
2918 /*
2919  * Try to include modifiers in the key.
2920  * Changes "Shift-a" to 'A', "Alt-A" to 0xc0, etc.
2921  */
2922     int
2923 extract_modifiers(int key, int *modp)
2924 {
2925     int	modifiers = *modp;
2926 
2927 #ifdef MACOS_X
2928     /* Command-key really special, no fancynest */
2929     if (!(modifiers & MOD_MASK_CMD))
2930 #endif
2931     if ((modifiers & MOD_MASK_SHIFT) && ASCII_ISALPHA(key))
2932     {
2933 	key = TOUPPER_ASC(key);
2934 	modifiers &= ~MOD_MASK_SHIFT;
2935     }
2936     if ((modifiers & MOD_MASK_CTRL)
2937 #ifdef EBCDIC
2938 	    /* * TODO: EBCDIC Better use:
2939 	     * && (Ctrl_chr(key) || key == '?')
2940 	     * ???  */
2941 	    && strchr("?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_", key)
2942 						       != NULL
2943 #else
2944 	    && ((key >= '?' && key <= '_') || ASCII_ISALPHA(key))
2945 #endif
2946 	    )
2947     {
2948 	key = Ctrl_chr(key);
2949 	modifiers &= ~MOD_MASK_CTRL;
2950 	/* <C-@> is <Nul> */
2951 	if (key == 0)
2952 	    key = K_ZERO;
2953     }
2954 #ifdef MACOS_X
2955     /* Command-key really special, no fancynest */
2956     if (!(modifiers & MOD_MASK_CMD))
2957 #endif
2958     if ((modifiers & MOD_MASK_ALT) && key < 0x80
2959 	    && !enc_dbcs)		// avoid creating a lead byte
2960     {
2961 	key |= 0x80;
2962 	modifiers &= ~MOD_MASK_ALT;	/* remove the META modifier */
2963     }
2964 
2965     *modp = modifiers;
2966     return key;
2967 }
2968 
2969 /*
2970  * Try to find key "c" in the special key table.
2971  * Return the index when found, -1 when not found.
2972  */
2973     int
2974 find_special_key_in_table(int c)
2975 {
2976     int	    i;
2977 
2978     for (i = 0; key_names_table[i].name != NULL; i++)
2979 	if (c == key_names_table[i].key)
2980 	    break;
2981     if (key_names_table[i].name == NULL)
2982 	i = -1;
2983     return i;
2984 }
2985 
2986 /*
2987  * Find the special key with the given name (the given string does not have to
2988  * end with NUL, the name is assumed to end before the first non-idchar).
2989  * If the name starts with "t_" the next two characters are interpreted as a
2990  * termcap name.
2991  * Return the key code, or 0 if not found.
2992  */
2993     int
2994 get_special_key_code(char_u *name)
2995 {
2996     char_u  *table_name;
2997     char_u  string[3];
2998     int	    i, j;
2999 
3000     /*
3001      * If it's <t_xx> we get the code for xx from the termcap
3002      */
3003     if (name[0] == 't' && name[1] == '_' && name[2] != NUL && name[3] != NUL)
3004     {
3005 	string[0] = name[2];
3006 	string[1] = name[3];
3007 	string[2] = NUL;
3008 	if (add_termcap_entry(string, FALSE) == OK)
3009 	    return TERMCAP2KEY(name[2], name[3]);
3010     }
3011     else
3012 	for (i = 0; key_names_table[i].name != NULL; i++)
3013 	{
3014 	    table_name = key_names_table[i].name;
3015 	    for (j = 0; vim_isIDc(name[j]) && table_name[j] != NUL; j++)
3016 		if (TOLOWER_ASC(table_name[j]) != TOLOWER_ASC(name[j]))
3017 		    break;
3018 	    if (!vim_isIDc(name[j]) && table_name[j] == NUL)
3019 		return key_names_table[i].key;
3020 	}
3021     return 0;
3022 }
3023 
3024 #if defined(FEAT_CMDL_COMPL) || defined(PROTO)
3025     char_u *
3026 get_key_name(int i)
3027 {
3028     if (i >= (int)KEY_NAMES_TABLE_LEN)
3029 	return NULL;
3030     return  key_names_table[i].name;
3031 }
3032 #endif
3033 
3034 #if defined(FEAT_MOUSE) || defined(PROTO)
3035 /*
3036  * Look up the given mouse code to return the relevant information in the other
3037  * arguments.  Return which button is down or was released.
3038  */
3039     int
3040 get_mouse_button(int code, int *is_click, int *is_drag)
3041 {
3042     int	    i;
3043 
3044     for (i = 0; mouse_table[i].pseudo_code; i++)
3045 	if (code == mouse_table[i].pseudo_code)
3046 	{
3047 	    *is_click = mouse_table[i].is_click;
3048 	    *is_drag = mouse_table[i].is_drag;
3049 	    return mouse_table[i].button;
3050 	}
3051     return 0;	    /* Shouldn't get here */
3052 }
3053 
3054 /*
3055  * Return the appropriate pseudo mouse event token (KE_LEFTMOUSE etc) based on
3056  * the given information about which mouse button is down, and whether the
3057  * mouse was clicked, dragged or released.
3058  */
3059     int
3060 get_pseudo_mouse_code(
3061     int	    button,	/* eg MOUSE_LEFT */
3062     int	    is_click,
3063     int	    is_drag)
3064 {
3065     int	    i;
3066 
3067     for (i = 0; mouse_table[i].pseudo_code; i++)
3068 	if (button == mouse_table[i].button
3069 	    && is_click == mouse_table[i].is_click
3070 	    && is_drag == mouse_table[i].is_drag)
3071 	{
3072 #ifdef FEAT_GUI
3073 	    /* Trick: a non mappable left click and release has mouse_col -1
3074 	     * or added MOUSE_COLOFF.  Used for 'mousefocus' in
3075 	     * gui_mouse_moved() */
3076 	    if (mouse_col < 0 || mouse_col > MOUSE_COLOFF)
3077 	    {
3078 		if (mouse_col < 0)
3079 		    mouse_col = 0;
3080 		else
3081 		    mouse_col -= MOUSE_COLOFF;
3082 		if (mouse_table[i].pseudo_code == (int)KE_LEFTMOUSE)
3083 		    return (int)KE_LEFTMOUSE_NM;
3084 		if (mouse_table[i].pseudo_code == (int)KE_LEFTRELEASE)
3085 		    return (int)KE_LEFTRELEASE_NM;
3086 	    }
3087 #endif
3088 	    return mouse_table[i].pseudo_code;
3089 	}
3090     return (int)KE_IGNORE;	    /* not recognized, ignore it */
3091 }
3092 #endif /* FEAT_MOUSE */
3093 
3094 /*
3095  * Return the current end-of-line type: EOL_DOS, EOL_UNIX or EOL_MAC.
3096  */
3097     int
3098 get_fileformat(buf_T *buf)
3099 {
3100     int		c = *buf->b_p_ff;
3101 
3102     if (buf->b_p_bin || c == 'u')
3103 	return EOL_UNIX;
3104     if (c == 'm')
3105 	return EOL_MAC;
3106     return EOL_DOS;
3107 }
3108 
3109 /*
3110  * Like get_fileformat(), but override 'fileformat' with "p" for "++opt=val"
3111  * argument.
3112  */
3113     int
3114 get_fileformat_force(
3115     buf_T	*buf,
3116     exarg_T	*eap)	    /* can be NULL! */
3117 {
3118     int		c;
3119 
3120     if (eap != NULL && eap->force_ff != 0)
3121 	c = eap->force_ff;
3122     else
3123     {
3124 	if ((eap != NULL && eap->force_bin != 0)
3125 			       ? (eap->force_bin == FORCE_BIN) : buf->b_p_bin)
3126 	    return EOL_UNIX;
3127 	c = *buf->b_p_ff;
3128     }
3129     if (c == 'u')
3130 	return EOL_UNIX;
3131     if (c == 'm')
3132 	return EOL_MAC;
3133     return EOL_DOS;
3134 }
3135 
3136 /*
3137  * Set the current end-of-line type to EOL_DOS, EOL_UNIX or EOL_MAC.
3138  * Sets both 'textmode' and 'fileformat'.
3139  * Note: Does _not_ set global value of 'textmode'!
3140  */
3141     void
3142 set_fileformat(
3143     int		t,
3144     int		opt_flags)	/* OPT_LOCAL and/or OPT_GLOBAL */
3145 {
3146     char	*p = NULL;
3147 
3148     switch (t)
3149     {
3150     case EOL_DOS:
3151 	p = FF_DOS;
3152 	curbuf->b_p_tx = TRUE;
3153 	break;
3154     case EOL_UNIX:
3155 	p = FF_UNIX;
3156 	curbuf->b_p_tx = FALSE;
3157 	break;
3158     case EOL_MAC:
3159 	p = FF_MAC;
3160 	curbuf->b_p_tx = FALSE;
3161 	break;
3162     }
3163     if (p != NULL)
3164 	set_string_option_direct((char_u *)"ff", -1, (char_u *)p,
3165 						     OPT_FREE | opt_flags, 0);
3166 
3167     /* This may cause the buffer to become (un)modified. */
3168     check_status(curbuf);
3169     redraw_tabline = TRUE;
3170 #ifdef FEAT_TITLE
3171     need_maketitle = TRUE;	    /* set window title later */
3172 #endif
3173 }
3174 
3175 /*
3176  * Return the default fileformat from 'fileformats'.
3177  */
3178     int
3179 default_fileformat(void)
3180 {
3181     switch (*p_ffs)
3182     {
3183 	case 'm':   return EOL_MAC;
3184 	case 'd':   return EOL_DOS;
3185     }
3186     return EOL_UNIX;
3187 }
3188 
3189 /*
3190  * Call shell.	Calls mch_call_shell, with 'shellxquote' added.
3191  */
3192     int
3193 call_shell(char_u *cmd, int opt)
3194 {
3195     char_u	*ncmd;
3196     int		retval;
3197 #ifdef FEAT_PROFILE
3198     proftime_T	wait_time;
3199 #endif
3200 
3201     if (p_verbose > 3)
3202     {
3203 	verbose_enter();
3204 	smsg(_("Calling shell to execute: \"%s\""),
3205 						    cmd == NULL ? p_sh : cmd);
3206 	out_char('\n');
3207 	cursor_on();
3208 	verbose_leave();
3209     }
3210 
3211 #ifdef FEAT_PROFILE
3212     if (do_profiling == PROF_YES)
3213 	prof_child_enter(&wait_time);
3214 #endif
3215 
3216     if (*p_sh == NUL)
3217     {
3218 	emsg(_(e_shellempty));
3219 	retval = -1;
3220     }
3221     else
3222     {
3223 #ifdef FEAT_GUI_MSWIN
3224 	/* Don't hide the pointer while executing a shell command. */
3225 	gui_mch_mousehide(FALSE);
3226 #endif
3227 #ifdef FEAT_GUI
3228 	++hold_gui_events;
3229 #endif
3230 	/* The external command may update a tags file, clear cached tags. */
3231 	tag_freematch();
3232 
3233 	if (cmd == NULL || *p_sxq == NUL)
3234 	    retval = mch_call_shell(cmd, opt);
3235 	else
3236 	{
3237 	    char_u *ecmd = cmd;
3238 
3239 	    if (*p_sxe != NUL && STRCMP(p_sxq, "(") == 0)
3240 	    {
3241 		ecmd = vim_strsave_escaped_ext(cmd, p_sxe, '^', FALSE);
3242 		if (ecmd == NULL)
3243 		    ecmd = cmd;
3244 	    }
3245 	    ncmd = alloc((unsigned)(STRLEN(ecmd) + STRLEN(p_sxq) * 2 + 1));
3246 	    if (ncmd != NULL)
3247 	    {
3248 		STRCPY(ncmd, p_sxq);
3249 		STRCAT(ncmd, ecmd);
3250 		/* When 'shellxquote' is ( append ).
3251 		 * When 'shellxquote' is "( append )". */
3252 		STRCAT(ncmd, STRCMP(p_sxq, "(") == 0 ? (char_u *)")"
3253 			   : STRCMP(p_sxq, "\"(") == 0 ? (char_u *)")\""
3254 			   : p_sxq);
3255 		retval = mch_call_shell(ncmd, opt);
3256 		vim_free(ncmd);
3257 	    }
3258 	    else
3259 		retval = -1;
3260 	    if (ecmd != cmd)
3261 		vim_free(ecmd);
3262 	}
3263 #ifdef FEAT_GUI
3264 	--hold_gui_events;
3265 #endif
3266 	/*
3267 	 * Check the window size, in case it changed while executing the
3268 	 * external command.
3269 	 */
3270 	shell_resized_check();
3271     }
3272 
3273 #ifdef FEAT_EVAL
3274     set_vim_var_nr(VV_SHELL_ERROR, (long)retval);
3275 # ifdef FEAT_PROFILE
3276     if (do_profiling == PROF_YES)
3277 	prof_child_exit(&wait_time);
3278 # endif
3279 #endif
3280 
3281     return retval;
3282 }
3283 
3284 /*
3285  * VISUAL, SELECTMODE and OP_PENDING State are never set, they are equal to
3286  * NORMAL State with a condition.  This function returns the real State.
3287  */
3288     int
3289 get_real_state(void)
3290 {
3291     if (State & NORMAL)
3292     {
3293 	if (VIsual_active)
3294 	{
3295 	    if (VIsual_select)
3296 		return SELECTMODE;
3297 	    return VISUAL;
3298 	}
3299 	else if (finish_op)
3300 	    return OP_PENDING;
3301     }
3302     return State;
3303 }
3304 
3305 /*
3306  * Return TRUE if "p" points to just after a path separator.
3307  * Takes care of multi-byte characters.
3308  * "b" must point to the start of the file name
3309  */
3310     int
3311 after_pathsep(char_u *b, char_u *p)
3312 {
3313     return p > b && vim_ispathsep(p[-1])
3314 			     && (!has_mbyte || (*mb_head_off)(b, p - 1) == 0);
3315 }
3316 
3317 /*
3318  * Return TRUE if file names "f1" and "f2" are in the same directory.
3319  * "f1" may be a short name, "f2" must be a full path.
3320  */
3321     int
3322 same_directory(char_u *f1, char_u *f2)
3323 {
3324     char_u	ffname[MAXPATHL];
3325     char_u	*t1;
3326     char_u	*t2;
3327 
3328     /* safety check */
3329     if (f1 == NULL || f2 == NULL)
3330 	return FALSE;
3331 
3332     (void)vim_FullName(f1, ffname, MAXPATHL, FALSE);
3333     t1 = gettail_sep(ffname);
3334     t2 = gettail_sep(f2);
3335     return (t1 - ffname == t2 - f2
3336 	     && pathcmp((char *)ffname, (char *)f2, (int)(t1 - ffname)) == 0);
3337 }
3338 
3339 #if defined(FEAT_SESSION) || defined(FEAT_AUTOCHDIR) \
3340 	|| defined(MSWIN) || defined(FEAT_GUI_MAC) || defined(FEAT_GUI_GTK) \
3341 	|| defined(FEAT_NETBEANS_INTG) \
3342 	|| defined(PROTO)
3343 /*
3344  * Change to a file's directory.
3345  * Caller must call shorten_fnames()!
3346  * Return OK or FAIL.
3347  */
3348     int
3349 vim_chdirfile(char_u *fname, char *trigger_autocmd)
3350 {
3351     char_u	old_dir[MAXPATHL];
3352     char_u	new_dir[MAXPATHL];
3353     int		res;
3354 
3355     if (mch_dirname(old_dir, MAXPATHL) != OK)
3356 	*old_dir = NUL;
3357 
3358     vim_strncpy(new_dir, fname, MAXPATHL - 1);
3359     *gettail_sep(new_dir) = NUL;
3360 
3361     if (pathcmp((char *)old_dir, (char *)new_dir, -1) == 0)
3362 	// nothing to do
3363 	res = OK;
3364     else
3365     {
3366 	res = mch_chdir((char *)new_dir) == 0 ? OK : FAIL;
3367 
3368 	if (res == OK && trigger_autocmd != NULL)
3369 	    apply_autocmds(EVENT_DIRCHANGED, (char_u *)trigger_autocmd,
3370 						       new_dir, FALSE, curbuf);
3371     }
3372     return res;
3373 }
3374 #endif
3375 
3376 #if defined(STAT_IGNORES_SLASH) || defined(PROTO)
3377 /*
3378  * Check if "name" ends in a slash and is not a directory.
3379  * Used for systems where stat() ignores a trailing slash on a file name.
3380  * The Vim code assumes a trailing slash is only ignored for a directory.
3381  */
3382     static int
3383 illegal_slash(const char *name)
3384 {
3385     if (name[0] == NUL)
3386 	return FALSE;	    /* no file name is not illegal */
3387     if (name[strlen(name) - 1] != '/')
3388 	return FALSE;	    /* no trailing slash */
3389     if (mch_isdir((char_u *)name))
3390 	return FALSE;	    /* trailing slash for a directory */
3391     return TRUE;
3392 }
3393 
3394 /*
3395  * Special implementation of mch_stat() for Solaris.
3396  */
3397     int
3398 vim_stat(const char *name, stat_T *stp)
3399 {
3400     /* On Solaris stat() accepts "file/" as if it was "file".  Return -1 if
3401      * the name ends in "/" and it's not a directory. */
3402     return illegal_slash(name) ? -1 : stat(name, stp);
3403 }
3404 #endif
3405 
3406 #if defined(CURSOR_SHAPE) || defined(PROTO)
3407 
3408 /*
3409  * Handling of cursor and mouse pointer shapes in various modes.
3410  */
3411 
3412 cursorentry_T shape_table[SHAPE_IDX_COUNT] =
3413 {
3414     /* The values will be filled in from the 'guicursor' and 'mouseshape'
3415      * defaults when Vim starts.
3416      * Adjust the SHAPE_IDX_ defines when making changes! */
3417     {0,	0, 0, 700L, 400L, 250L, 0, 0, "n", SHAPE_CURSOR+SHAPE_MOUSE},
3418     {0,	0, 0, 700L, 400L, 250L, 0, 0, "v", SHAPE_CURSOR+SHAPE_MOUSE},
3419     {0,	0, 0, 700L, 400L, 250L, 0, 0, "i", SHAPE_CURSOR+SHAPE_MOUSE},
3420     {0,	0, 0, 700L, 400L, 250L, 0, 0, "r", SHAPE_CURSOR+SHAPE_MOUSE},
3421     {0,	0, 0, 700L, 400L, 250L, 0, 0, "c", SHAPE_CURSOR+SHAPE_MOUSE},
3422     {0,	0, 0, 700L, 400L, 250L, 0, 0, "ci", SHAPE_CURSOR+SHAPE_MOUSE},
3423     {0,	0, 0, 700L, 400L, 250L, 0, 0, "cr", SHAPE_CURSOR+SHAPE_MOUSE},
3424     {0,	0, 0, 700L, 400L, 250L, 0, 0, "o", SHAPE_CURSOR+SHAPE_MOUSE},
3425     {0,	0, 0, 700L, 400L, 250L, 0, 0, "ve", SHAPE_CURSOR+SHAPE_MOUSE},
3426     {0,	0, 0,   0L,   0L,   0L, 0, 0, "e", SHAPE_MOUSE},
3427     {0,	0, 0,   0L,   0L,   0L, 0, 0, "s", SHAPE_MOUSE},
3428     {0,	0, 0,   0L,   0L,   0L, 0, 0, "sd", SHAPE_MOUSE},
3429     {0,	0, 0,   0L,   0L,   0L, 0, 0, "vs", SHAPE_MOUSE},
3430     {0,	0, 0,   0L,   0L,   0L, 0, 0, "vd", SHAPE_MOUSE},
3431     {0,	0, 0,   0L,   0L,   0L, 0, 0, "m", SHAPE_MOUSE},
3432     {0,	0, 0,   0L,   0L,   0L, 0, 0, "ml", SHAPE_MOUSE},
3433     {0,	0, 0, 100L, 100L, 100L, 0, 0, "sm", SHAPE_CURSOR},
3434 };
3435 
3436 #ifdef FEAT_MOUSESHAPE
3437 /*
3438  * Table with names for mouse shapes.  Keep in sync with all the tables for
3439  * mch_set_mouse_shape()!.
3440  */
3441 static char * mshape_names[] =
3442 {
3443     "arrow",	/* default, must be the first one */
3444     "blank",	/* hidden */
3445     "beam",
3446     "updown",
3447     "udsizing",
3448     "leftright",
3449     "lrsizing",
3450     "busy",
3451     "no",
3452     "crosshair",
3453     "hand1",
3454     "hand2",
3455     "pencil",
3456     "question",
3457     "rightup-arrow",
3458     "up-arrow",
3459     NULL
3460 };
3461 #endif
3462 
3463 /*
3464  * Parse the 'guicursor' option ("what" is SHAPE_CURSOR) or 'mouseshape'
3465  * ("what" is SHAPE_MOUSE).
3466  * Returns error message for an illegal option, NULL otherwise.
3467  */
3468     char *
3469 parse_shape_opt(int what)
3470 {
3471     char_u	*modep;
3472     char_u	*colonp;
3473     char_u	*commap;
3474     char_u	*slashp;
3475     char_u	*p, *endp;
3476     int		idx = 0;		/* init for GCC */
3477     int		all_idx;
3478     int		len;
3479     int		i;
3480     long	n;
3481     int		found_ve = FALSE;	/* found "ve" flag */
3482     int		round;
3483 
3484     /*
3485      * First round: check for errors; second round: do it for real.
3486      */
3487     for (round = 1; round <= 2; ++round)
3488     {
3489 	/*
3490 	 * Repeat for all comma separated parts.
3491 	 */
3492 #ifdef FEAT_MOUSESHAPE
3493 	if (what == SHAPE_MOUSE)
3494 	    modep = p_mouseshape;
3495 	else
3496 #endif
3497 	    modep = p_guicursor;
3498 	while (*modep != NUL)
3499 	{
3500 	    colonp = vim_strchr(modep, ':');
3501 	    commap = vim_strchr(modep, ',');
3502 
3503 	    if (colonp == NULL || (commap != NULL && commap < colonp))
3504 		return N_("E545: Missing colon");
3505 	    if (colonp == modep)
3506 		return N_("E546: Illegal mode");
3507 
3508 	    /*
3509 	     * Repeat for all mode's before the colon.
3510 	     * For the 'a' mode, we loop to handle all the modes.
3511 	     */
3512 	    all_idx = -1;
3513 	    while (modep < colonp || all_idx >= 0)
3514 	    {
3515 		if (all_idx < 0)
3516 		{
3517 		    /* Find the mode. */
3518 		    if (modep[1] == '-' || modep[1] == ':')
3519 			len = 1;
3520 		    else
3521 			len = 2;
3522 		    if (len == 1 && TOLOWER_ASC(modep[0]) == 'a')
3523 			all_idx = SHAPE_IDX_COUNT - 1;
3524 		    else
3525 		    {
3526 			for (idx = 0; idx < SHAPE_IDX_COUNT; ++idx)
3527 			    if (STRNICMP(modep, shape_table[idx].name, len)
3528 									 == 0)
3529 				break;
3530 			if (idx == SHAPE_IDX_COUNT
3531 				   || (shape_table[idx].used_for & what) == 0)
3532 			    return N_("E546: Illegal mode");
3533 			if (len == 2 && modep[0] == 'v' && modep[1] == 'e')
3534 			    found_ve = TRUE;
3535 		    }
3536 		    modep += len + 1;
3537 		}
3538 
3539 		if (all_idx >= 0)
3540 		    idx = all_idx--;
3541 		else if (round == 2)
3542 		{
3543 #ifdef FEAT_MOUSESHAPE
3544 		    if (what == SHAPE_MOUSE)
3545 		    {
3546 			/* Set the default, for the missing parts */
3547 			shape_table[idx].mshape = 0;
3548 		    }
3549 		    else
3550 #endif
3551 		    {
3552 			/* Set the defaults, for the missing parts */
3553 			shape_table[idx].shape = SHAPE_BLOCK;
3554 			shape_table[idx].blinkwait = 700L;
3555 			shape_table[idx].blinkon = 400L;
3556 			shape_table[idx].blinkoff = 250L;
3557 		    }
3558 		}
3559 
3560 		/* Parse the part after the colon */
3561 		for (p = colonp + 1; *p && *p != ','; )
3562 		{
3563 #ifdef FEAT_MOUSESHAPE
3564 		    if (what == SHAPE_MOUSE)
3565 		    {
3566 			for (i = 0; ; ++i)
3567 			{
3568 			    if (mshape_names[i] == NULL)
3569 			    {
3570 				if (!VIM_ISDIGIT(*p))
3571 				    return N_("E547: Illegal mouseshape");
3572 				if (round == 2)
3573 				    shape_table[idx].mshape =
3574 					      getdigits(&p) + MSHAPE_NUMBERED;
3575 				else
3576 				    (void)getdigits(&p);
3577 				break;
3578 			    }
3579 			    len = (int)STRLEN(mshape_names[i]);
3580 			    if (STRNICMP(p, mshape_names[i], len) == 0)
3581 			    {
3582 				if (round == 2)
3583 				    shape_table[idx].mshape = i;
3584 				p += len;
3585 				break;
3586 			    }
3587 			}
3588 		    }
3589 		    else /* if (what == SHAPE_MOUSE) */
3590 #endif
3591 		    {
3592 			/*
3593 			 * First handle the ones with a number argument.
3594 			 */
3595 			i = *p;
3596 			len = 0;
3597 			if (STRNICMP(p, "ver", 3) == 0)
3598 			    len = 3;
3599 			else if (STRNICMP(p, "hor", 3) == 0)
3600 			    len = 3;
3601 			else if (STRNICMP(p, "blinkwait", 9) == 0)
3602 			    len = 9;
3603 			else if (STRNICMP(p, "blinkon", 7) == 0)
3604 			    len = 7;
3605 			else if (STRNICMP(p, "blinkoff", 8) == 0)
3606 			    len = 8;
3607 			if (len != 0)
3608 			{
3609 			    p += len;
3610 			    if (!VIM_ISDIGIT(*p))
3611 				return N_("E548: digit expected");
3612 			    n = getdigits(&p);
3613 			    if (len == 3)   /* "ver" or "hor" */
3614 			    {
3615 				if (n == 0)
3616 				    return N_("E549: Illegal percentage");
3617 				if (round == 2)
3618 				{
3619 				    if (TOLOWER_ASC(i) == 'v')
3620 					shape_table[idx].shape = SHAPE_VER;
3621 				    else
3622 					shape_table[idx].shape = SHAPE_HOR;
3623 				    shape_table[idx].percentage = n;
3624 				}
3625 			    }
3626 			    else if (round == 2)
3627 			    {
3628 				if (len == 9)
3629 				    shape_table[idx].blinkwait = n;
3630 				else if (len == 7)
3631 				    shape_table[idx].blinkon = n;
3632 				else
3633 				    shape_table[idx].blinkoff = n;
3634 			    }
3635 			}
3636 			else if (STRNICMP(p, "block", 5) == 0)
3637 			{
3638 			    if (round == 2)
3639 				shape_table[idx].shape = SHAPE_BLOCK;
3640 			    p += 5;
3641 			}
3642 			else	/* must be a highlight group name then */
3643 			{
3644 			    endp = vim_strchr(p, '-');
3645 			    if (commap == NULL)		    /* last part */
3646 			    {
3647 				if (endp == NULL)
3648 				    endp = p + STRLEN(p);   /* find end of part */
3649 			    }
3650 			    else if (endp > commap || endp == NULL)
3651 				endp = commap;
3652 			    slashp = vim_strchr(p, '/');
3653 			    if (slashp != NULL && slashp < endp)
3654 			    {
3655 				/* "group/langmap_group" */
3656 				i = syn_check_group(p, (int)(slashp - p));
3657 				p = slashp + 1;
3658 			    }
3659 			    if (round == 2)
3660 			    {
3661 				shape_table[idx].id = syn_check_group(p,
3662 							     (int)(endp - p));
3663 				shape_table[idx].id_lm = shape_table[idx].id;
3664 				if (slashp != NULL && slashp < endp)
3665 				    shape_table[idx].id = i;
3666 			    }
3667 			    p = endp;
3668 			}
3669 		    } /* if (what != SHAPE_MOUSE) */
3670 
3671 		    if (*p == '-')
3672 			++p;
3673 		}
3674 	    }
3675 	    modep = p;
3676 	    if (*modep == ',')
3677 		++modep;
3678 	}
3679     }
3680 
3681     /* If the 's' flag is not given, use the 'v' cursor for 's' */
3682     if (!found_ve)
3683     {
3684 #ifdef FEAT_MOUSESHAPE
3685 	if (what == SHAPE_MOUSE)
3686 	{
3687 	    shape_table[SHAPE_IDX_VE].mshape = shape_table[SHAPE_IDX_V].mshape;
3688 	}
3689 	else
3690 #endif
3691 	{
3692 	    shape_table[SHAPE_IDX_VE].shape = shape_table[SHAPE_IDX_V].shape;
3693 	    shape_table[SHAPE_IDX_VE].percentage =
3694 					 shape_table[SHAPE_IDX_V].percentage;
3695 	    shape_table[SHAPE_IDX_VE].blinkwait =
3696 					  shape_table[SHAPE_IDX_V].blinkwait;
3697 	    shape_table[SHAPE_IDX_VE].blinkon =
3698 					    shape_table[SHAPE_IDX_V].blinkon;
3699 	    shape_table[SHAPE_IDX_VE].blinkoff =
3700 					   shape_table[SHAPE_IDX_V].blinkoff;
3701 	    shape_table[SHAPE_IDX_VE].id = shape_table[SHAPE_IDX_V].id;
3702 	    shape_table[SHAPE_IDX_VE].id_lm = shape_table[SHAPE_IDX_V].id_lm;
3703 	}
3704     }
3705 
3706     return NULL;
3707 }
3708 
3709 # if defined(MCH_CURSOR_SHAPE) || defined(FEAT_GUI) \
3710 	|| defined(FEAT_MOUSESHAPE) || defined(PROTO)
3711 /*
3712  * Return the index into shape_table[] for the current mode.
3713  * When "mouse" is TRUE, consider indexes valid for the mouse pointer.
3714  */
3715     int
3716 get_shape_idx(int mouse)
3717 {
3718 #ifdef FEAT_MOUSESHAPE
3719     if (mouse && (State == HITRETURN || State == ASKMORE))
3720     {
3721 # ifdef FEAT_GUI
3722 	int x, y;
3723 	gui_mch_getmouse(&x, &y);
3724 	if (Y_2_ROW(y) == Rows - 1)
3725 	    return SHAPE_IDX_MOREL;
3726 # endif
3727 	return SHAPE_IDX_MORE;
3728     }
3729     if (mouse && drag_status_line)
3730 	return SHAPE_IDX_SDRAG;
3731     if (mouse && drag_sep_line)
3732 	return SHAPE_IDX_VDRAG;
3733 #endif
3734     if (!mouse && State == SHOWMATCH)
3735 	return SHAPE_IDX_SM;
3736     if (State & VREPLACE_FLAG)
3737 	return SHAPE_IDX_R;
3738     if (State & REPLACE_FLAG)
3739 	return SHAPE_IDX_R;
3740     if (State & INSERT)
3741 	return SHAPE_IDX_I;
3742     if (State & CMDLINE)
3743     {
3744 	if (cmdline_at_end())
3745 	    return SHAPE_IDX_C;
3746 	if (cmdline_overstrike())
3747 	    return SHAPE_IDX_CR;
3748 	return SHAPE_IDX_CI;
3749     }
3750     if (finish_op)
3751 	return SHAPE_IDX_O;
3752     if (VIsual_active)
3753     {
3754 	if (*p_sel == 'e')
3755 	    return SHAPE_IDX_VE;
3756 	else
3757 	    return SHAPE_IDX_V;
3758     }
3759     return SHAPE_IDX_N;
3760 }
3761 #endif
3762 
3763 # if defined(FEAT_MOUSESHAPE) || defined(PROTO)
3764 static int old_mouse_shape = 0;
3765 
3766 /*
3767  * Set the mouse shape:
3768  * If "shape" is -1, use shape depending on the current mode,
3769  * depending on the current state.
3770  * If "shape" is -2, only update the shape when it's CLINE or STATUS (used
3771  * when the mouse moves off the status or command line).
3772  */
3773     void
3774 update_mouseshape(int shape_idx)
3775 {
3776     int new_mouse_shape;
3777 
3778     /* Only works in GUI mode. */
3779     if (!gui.in_use || gui.starting)
3780 	return;
3781 
3782     /* Postpone the updating when more is to come.  Speeds up executing of
3783      * mappings. */
3784     if (shape_idx == -1 && char_avail())
3785     {
3786 	postponed_mouseshape = TRUE;
3787 	return;
3788     }
3789 
3790     /* When ignoring the mouse don't change shape on the statusline. */
3791     if (*p_mouse == NUL
3792 	    && (shape_idx == SHAPE_IDX_CLINE
3793 		|| shape_idx == SHAPE_IDX_STATUS
3794 		|| shape_idx == SHAPE_IDX_VSEP))
3795 	shape_idx = -2;
3796 
3797     if (shape_idx == -2
3798 	    && old_mouse_shape != shape_table[SHAPE_IDX_CLINE].mshape
3799 	    && old_mouse_shape != shape_table[SHAPE_IDX_STATUS].mshape
3800 	    && old_mouse_shape != shape_table[SHAPE_IDX_VSEP].mshape)
3801 	return;
3802     if (shape_idx < 0)
3803 	new_mouse_shape = shape_table[get_shape_idx(TRUE)].mshape;
3804     else
3805 	new_mouse_shape = shape_table[shape_idx].mshape;
3806     if (new_mouse_shape != old_mouse_shape)
3807     {
3808 	mch_set_mouse_shape(new_mouse_shape);
3809 	old_mouse_shape = new_mouse_shape;
3810     }
3811     postponed_mouseshape = FALSE;
3812 }
3813 # endif
3814 
3815 #endif /* CURSOR_SHAPE */
3816 
3817 
3818 /*
3819  * Change directory to "new_dir".  If FEAT_SEARCHPATH is defined, search
3820  * 'cdpath' for relative directory names, otherwise just mch_chdir().
3821  */
3822     int
3823 vim_chdir(char_u *new_dir)
3824 {
3825 #ifndef FEAT_SEARCHPATH
3826     return mch_chdir((char *)new_dir);
3827 #else
3828     char_u	*dir_name;
3829     int		r;
3830 
3831     dir_name = find_directory_in_path(new_dir, (int)STRLEN(new_dir),
3832 						FNAME_MESS, curbuf->b_ffname);
3833     if (dir_name == NULL)
3834 	return -1;
3835     r = mch_chdir((char *)dir_name);
3836     vim_free(dir_name);
3837     return r;
3838 #endif
3839 }
3840 
3841 /*
3842  * Get user name from machine-specific function.
3843  * Returns the user name in "buf[len]".
3844  * Some systems are quite slow in obtaining the user name (Windows NT), thus
3845  * cache the result.
3846  * Returns OK or FAIL.
3847  */
3848     int
3849 get_user_name(char_u *buf, int len)
3850 {
3851     if (username == NULL)
3852     {
3853 	if (mch_get_user_name(buf, len) == FAIL)
3854 	    return FAIL;
3855 	username = vim_strsave(buf);
3856     }
3857     else
3858 	vim_strncpy(buf, username, len - 1);
3859     return OK;
3860 }
3861 
3862 #ifndef HAVE_QSORT
3863 /*
3864  * Our own qsort(), for systems that don't have it.
3865  * It's simple and slow.  From the K&R C book.
3866  */
3867     void
3868 qsort(
3869     void	*base,
3870     size_t	elm_count,
3871     size_t	elm_size,
3872     int (*cmp)(const void *, const void *))
3873 {
3874     char_u	*buf;
3875     char_u	*p1;
3876     char_u	*p2;
3877     int		i, j;
3878     int		gap;
3879 
3880     buf = alloc((unsigned)elm_size);
3881     if (buf == NULL)
3882 	return;
3883 
3884     for (gap = elm_count / 2; gap > 0; gap /= 2)
3885 	for (i = gap; i < elm_count; ++i)
3886 	    for (j = i - gap; j >= 0; j -= gap)
3887 	    {
3888 		/* Compare the elements. */
3889 		p1 = (char_u *)base + j * elm_size;
3890 		p2 = (char_u *)base + (j + gap) * elm_size;
3891 		if ((*cmp)((void *)p1, (void *)p2) <= 0)
3892 		    break;
3893 		/* Exchange the elements. */
3894 		mch_memmove(buf, p1, elm_size);
3895 		mch_memmove(p1, p2, elm_size);
3896 		mch_memmove(p2, buf, elm_size);
3897 	    }
3898 
3899     vim_free(buf);
3900 }
3901 #endif
3902 
3903 /*
3904  * Sort an array of strings.
3905  */
3906 static int
3907 #ifdef __BORLANDC__
3908 _RTLENTRYF
3909 #endif
3910 sort_compare(const void *s1, const void *s2);
3911 
3912     static int
3913 #ifdef __BORLANDC__
3914 _RTLENTRYF
3915 #endif
3916 sort_compare(const void *s1, const void *s2)
3917 {
3918     return STRCMP(*(char **)s1, *(char **)s2);
3919 }
3920 
3921     void
3922 sort_strings(
3923     char_u	**files,
3924     int		count)
3925 {
3926     qsort((void *)files, (size_t)count, sizeof(char_u *), sort_compare);
3927 }
3928 
3929 #if !defined(NO_EXPANDPATH) || defined(PROTO)
3930 /*
3931  * Compare path "p[]" to "q[]".
3932  * If "maxlen" >= 0 compare "p[maxlen]" to "q[maxlen]"
3933  * Return value like strcmp(p, q), but consider path separators.
3934  */
3935     int
3936 pathcmp(const char *p, const char *q, int maxlen)
3937 {
3938     int		i, j;
3939     int		c1, c2;
3940     const char	*s = NULL;
3941 
3942     for (i = 0, j = 0; maxlen < 0 || (i < maxlen && j < maxlen);)
3943     {
3944 	c1 = PTR2CHAR((char_u *)p + i);
3945 	c2 = PTR2CHAR((char_u *)q + j);
3946 
3947 	/* End of "p": check if "q" also ends or just has a slash. */
3948 	if (c1 == NUL)
3949 	{
3950 	    if (c2 == NUL)  /* full match */
3951 		return 0;
3952 	    s = q;
3953 	    i = j;
3954 	    break;
3955 	}
3956 
3957 	/* End of "q": check if "p" just has a slash. */
3958 	if (c2 == NUL)
3959 	{
3960 	    s = p;
3961 	    break;
3962 	}
3963 
3964 	if ((p_fic ? MB_TOUPPER(c1) != MB_TOUPPER(c2) : c1 != c2)
3965 #ifdef BACKSLASH_IN_FILENAME
3966 		/* consider '/' and '\\' to be equal */
3967 		&& !((c1 == '/' && c2 == '\\')
3968 		    || (c1 == '\\' && c2 == '/'))
3969 #endif
3970 		)
3971 	{
3972 	    if (vim_ispathsep(c1))
3973 		return -1;
3974 	    if (vim_ispathsep(c2))
3975 		return 1;
3976 	    return p_fic ? MB_TOUPPER(c1) - MB_TOUPPER(c2)
3977 		    : c1 - c2;  /* no match */
3978 	}
3979 
3980 	i += MB_PTR2LEN((char_u *)p + i);
3981 	j += MB_PTR2LEN((char_u *)q + j);
3982     }
3983     if (s == NULL)	/* "i" or "j" ran into "maxlen" */
3984 	return 0;
3985 
3986     c1 = PTR2CHAR((char_u *)s + i);
3987     c2 = PTR2CHAR((char_u *)s + i + MB_PTR2LEN((char_u *)s + i));
3988     /* ignore a trailing slash, but not "//" or ":/" */
3989     if (c2 == NUL
3990 	    && i > 0
3991 	    && !after_pathsep((char_u *)s, (char_u *)s + i)
3992 #ifdef BACKSLASH_IN_FILENAME
3993 	    && (c1 == '/' || c1 == '\\')
3994 #else
3995 	    && c1 == '/'
3996 #endif
3997        )
3998 	return 0;   /* match with trailing slash */
3999     if (s == q)
4000 	return -1;	    /* no match */
4001     return 1;
4002 }
4003 #endif
4004 
4005 /*
4006  * The putenv() implementation below comes from the "screen" program.
4007  * Included with permission from Juergen Weigert.
4008  * See pty.c for the copyright notice.
4009  */
4010 
4011 /*
4012  *  putenv  --	put value into environment
4013  *
4014  *  Usage:  i = putenv (string)
4015  *    int i;
4016  *    char  *string;
4017  *
4018  *  where string is of the form <name>=<value>.
4019  *  Putenv returns 0 normally, -1 on error (not enough core for malloc).
4020  *
4021  *  Putenv may need to add a new name into the environment, or to
4022  *  associate a value longer than the current value with a particular
4023  *  name.  So, to make life simpler, putenv() copies your entire
4024  *  environment into the heap (i.e. malloc()) from the stack
4025  *  (i.e. where it resides when your process is initiated) the first
4026  *  time you call it.
4027  *
4028  *  (history removed, not very interesting.  See the "screen" sources.)
4029  */
4030 
4031 #if !defined(HAVE_SETENV) && !defined(HAVE_PUTENV)
4032 
4033 #define EXTRASIZE 5		/* increment to add to env. size */
4034 
4035 static int  envsize = -1;	/* current size of environment */
4036 extern char **environ;		/* the global which is your env. */
4037 
4038 static int  findenv(char *name); /* look for a name in the env. */
4039 static int  newenv(void);	/* copy env. from stack to heap */
4040 static int  moreenv(void);	/* incr. size of env. */
4041 
4042     int
4043 putenv(const char *string)
4044 {
4045     int	    i;
4046     char    *p;
4047 
4048     if (envsize < 0)
4049     {				/* first time putenv called */
4050 	if (newenv() < 0)	/* copy env. to heap */
4051 	    return -1;
4052     }
4053 
4054     i = findenv((char *)string); /* look for name in environment */
4055 
4056     if (i < 0)
4057     {				/* name must be added */
4058 	for (i = 0; environ[i]; i++);
4059 	if (i >= (envsize - 1))
4060 	{			/* need new slot */
4061 	    if (moreenv() < 0)
4062 		return -1;
4063 	}
4064 	p = (char *)alloc((unsigned)(strlen(string) + 1));
4065 	if (p == NULL)		/* not enough core */
4066 	    return -1;
4067 	environ[i + 1] = 0;	/* new end of env. */
4068     }
4069     else
4070     {				/* name already in env. */
4071 	p = vim_realloc(environ[i], strlen(string) + 1);
4072 	if (p == NULL)
4073 	    return -1;
4074     }
4075     sprintf(p, "%s", string);	/* copy into env. */
4076     environ[i] = p;
4077 
4078     return 0;
4079 }
4080 
4081     static int
4082 findenv(char *name)
4083 {
4084     char    *namechar, *envchar;
4085     int	    i, found;
4086 
4087     found = 0;
4088     for (i = 0; environ[i] && !found; i++)
4089     {
4090 	envchar = environ[i];
4091 	namechar = name;
4092 	while (*namechar && *namechar != '=' && (*namechar == *envchar))
4093 	{
4094 	    namechar++;
4095 	    envchar++;
4096 	}
4097 	found = ((*namechar == '\0' || *namechar == '=') && *envchar == '=');
4098     }
4099     return found ? i - 1 : -1;
4100 }
4101 
4102     static int
4103 newenv(void)
4104 {
4105     char    **env, *elem;
4106     int	    i, esize;
4107 
4108     for (i = 0; environ[i]; i++)
4109 	;
4110 
4111     esize = i + EXTRASIZE + 1;
4112     env = (char **)alloc((unsigned)(esize * sizeof (elem)));
4113     if (env == NULL)
4114 	return -1;
4115 
4116     for (i = 0; environ[i]; i++)
4117     {
4118 	elem = (char *)alloc((unsigned)(strlen(environ[i]) + 1));
4119 	if (elem == NULL)
4120 	    return -1;
4121 	env[i] = elem;
4122 	strcpy(elem, environ[i]);
4123     }
4124 
4125     env[i] = 0;
4126     environ = env;
4127     envsize = esize;
4128     return 0;
4129 }
4130 
4131     static int
4132 moreenv(void)
4133 {
4134     int	    esize;
4135     char    **env;
4136 
4137     esize = envsize + EXTRASIZE;
4138     env = (char **)vim_realloc((char *)environ, esize * sizeof (*env));
4139     if (env == 0)
4140 	return -1;
4141     environ = env;
4142     envsize = esize;
4143     return 0;
4144 }
4145 
4146 # ifdef USE_VIMPTY_GETENV
4147 /*
4148  * Used for mch_getenv() for Mac.
4149  */
4150     char_u *
4151 vimpty_getenv(const char_u *string)
4152 {
4153     int i;
4154     char_u *p;
4155 
4156     if (envsize < 0)
4157 	return NULL;
4158 
4159     i = findenv((char *)string);
4160 
4161     if (i < 0)
4162 	return NULL;
4163 
4164     p = vim_strchr((char_u *)environ[i], '=');
4165     return (p + 1);
4166 }
4167 # endif
4168 
4169 #endif /* !defined(HAVE_SETENV) && !defined(HAVE_PUTENV) */
4170 
4171 #if defined(FEAT_EVAL) || defined(FEAT_SPELL) || defined(PROTO)
4172 /*
4173  * Return 0 for not writable, 1 for writable file, 2 for a dir which we have
4174  * rights to write into.
4175  */
4176     int
4177 filewritable(char_u *fname)
4178 {
4179     int		retval = 0;
4180 #if defined(UNIX) || defined(VMS)
4181     int		perm = 0;
4182 #endif
4183 
4184 #if defined(UNIX) || defined(VMS)
4185     perm = mch_getperm(fname);
4186 #endif
4187     if (
4188 # ifdef MSWIN
4189 	    mch_writable(fname) &&
4190 # else
4191 # if defined(UNIX) || defined(VMS)
4192 	    (perm & 0222) &&
4193 #  endif
4194 # endif
4195 	    mch_access((char *)fname, W_OK) == 0
4196        )
4197     {
4198 	++retval;
4199 	if (mch_isdir(fname))
4200 	    ++retval;
4201     }
4202     return retval;
4203 }
4204 #endif
4205 
4206 #if defined(FEAT_SPELL) || defined(FEAT_PERSISTENT_UNDO) || defined(PROTO)
4207 /*
4208  * Read 2 bytes from "fd" and turn them into an int, MSB first.
4209  * Returns -1 when encountering EOF.
4210  */
4211     int
4212 get2c(FILE *fd)
4213 {
4214     int		c, n;
4215 
4216     n = getc(fd);
4217     if (n == EOF) return -1;
4218     c = getc(fd);
4219     if (c == EOF) return -1;
4220     return (n << 8) + c;
4221 }
4222 
4223 /*
4224  * Read 3 bytes from "fd" and turn them into an int, MSB first.
4225  * Returns -1 when encountering EOF.
4226  */
4227     int
4228 get3c(FILE *fd)
4229 {
4230     int		c, n;
4231 
4232     n = getc(fd);
4233     if (n == EOF) return -1;
4234     c = getc(fd);
4235     if (c == EOF) return -1;
4236     n = (n << 8) + c;
4237     c = getc(fd);
4238     if (c == EOF) return -1;
4239     return (n << 8) + c;
4240 }
4241 
4242 /*
4243  * Read 4 bytes from "fd" and turn them into an int, MSB first.
4244  * Returns -1 when encountering EOF.
4245  */
4246     int
4247 get4c(FILE *fd)
4248 {
4249     int		c;
4250     /* Use unsigned rather than int otherwise result is undefined
4251      * when left-shift sets the MSB. */
4252     unsigned	n;
4253 
4254     c = getc(fd);
4255     if (c == EOF) return -1;
4256     n = (unsigned)c;
4257     c = getc(fd);
4258     if (c == EOF) return -1;
4259     n = (n << 8) + (unsigned)c;
4260     c = getc(fd);
4261     if (c == EOF) return -1;
4262     n = (n << 8) + (unsigned)c;
4263     c = getc(fd);
4264     if (c == EOF) return -1;
4265     n = (n << 8) + (unsigned)c;
4266     return (int)n;
4267 }
4268 
4269 /*
4270  * Read 8 bytes from "fd" and turn them into a time_T, MSB first.
4271  * Returns -1 when encountering EOF.
4272  */
4273     time_T
4274 get8ctime(FILE *fd)
4275 {
4276     int		c;
4277     time_T	n = 0;
4278     int		i;
4279 
4280     for (i = 0; i < 8; ++i)
4281     {
4282 	c = getc(fd);
4283 	if (c == EOF) return -1;
4284 	n = (n << 8) + c;
4285     }
4286     return n;
4287 }
4288 
4289 /*
4290  * Read a string of length "cnt" from "fd" into allocated memory.
4291  * Returns NULL when out of memory or unable to read that many bytes.
4292  */
4293     char_u *
4294 read_string(FILE *fd, int cnt)
4295 {
4296     char_u	*str;
4297     int		i;
4298     int		c;
4299 
4300     /* allocate memory */
4301     str = alloc((unsigned)cnt + 1);
4302     if (str != NULL)
4303     {
4304 	/* Read the string.  Quit when running into the EOF. */
4305 	for (i = 0; i < cnt; ++i)
4306 	{
4307 	    c = getc(fd);
4308 	    if (c == EOF)
4309 	    {
4310 		vim_free(str);
4311 		return NULL;
4312 	    }
4313 	    str[i] = c;
4314 	}
4315 	str[i] = NUL;
4316     }
4317     return str;
4318 }
4319 
4320 /*
4321  * Write a number to file "fd", MSB first, in "len" bytes.
4322  */
4323     int
4324 put_bytes(FILE *fd, long_u nr, int len)
4325 {
4326     int	    i;
4327 
4328     for (i = len - 1; i >= 0; --i)
4329 	if (putc((int)(nr >> (i * 8)), fd) == EOF)
4330 	    return FAIL;
4331     return OK;
4332 }
4333 
4334 #ifdef _MSC_VER
4335 # if (_MSC_VER <= 1200)
4336 /* This line is required for VC6 without the service pack.  Also see the
4337  * matching #pragma below. */
4338  #  pragma optimize("", off)
4339 # endif
4340 #endif
4341 
4342 /*
4343  * Write time_T to file "fd" in 8 bytes.
4344  * Returns FAIL when the write failed.
4345  */
4346     int
4347 put_time(FILE *fd, time_T the_time)
4348 {
4349     char_u	buf[8];
4350 
4351     time_to_bytes(the_time, buf);
4352     return fwrite(buf, (size_t)8, (size_t)1, fd) == 1 ? OK : FAIL;
4353 }
4354 
4355 /*
4356  * Write time_T to "buf[8]".
4357  */
4358     void
4359 time_to_bytes(time_T the_time, char_u *buf)
4360 {
4361     int		c;
4362     int		i;
4363     int		bi = 0;
4364     time_T	wtime = the_time;
4365 
4366     /* time_T can be up to 8 bytes in size, more than long_u, thus we
4367      * can't use put_bytes() here.
4368      * Another problem is that ">>" may do an arithmetic shift that keeps the
4369      * sign.  This happens for large values of wtime.  A cast to long_u may
4370      * truncate if time_T is 8 bytes.  So only use a cast when it is 4 bytes,
4371      * it's safe to assume that long_u is 4 bytes or more and when using 8
4372      * bytes the top bit won't be set. */
4373     for (i = 7; i >= 0; --i)
4374     {
4375 	if (i + 1 > (int)sizeof(time_T))
4376 	    /* ">>" doesn't work well when shifting more bits than avail */
4377 	    buf[bi++] = 0;
4378 	else
4379 	{
4380 #if defined(SIZEOF_TIME_T) && SIZEOF_TIME_T > 4
4381 	    c = (int)(wtime >> (i * 8));
4382 #else
4383 	    c = (int)((long_u)wtime >> (i * 8));
4384 #endif
4385 	    buf[bi++] = c;
4386 	}
4387     }
4388 }
4389 
4390 #ifdef _MSC_VER
4391 # if (_MSC_VER <= 1200)
4392  #  pragma optimize("", on)
4393 # endif
4394 #endif
4395 
4396 #endif
4397 
4398 #if defined(FEAT_QUICKFIX) || defined(FEAT_SPELL) || defined(PROTO)
4399 /*
4400  * Return TRUE if string "s" contains a non-ASCII character (128 or higher).
4401  * When "s" is NULL FALSE is returned.
4402  */
4403     int
4404 has_non_ascii(char_u *s)
4405 {
4406     char_u	*p;
4407 
4408     if (s != NULL)
4409 	for (p = s; *p != NUL; ++p)
4410 	    if (*p >= 128)
4411 		return TRUE;
4412     return FALSE;
4413 }
4414 #endif
4415 
4416 #if defined(MESSAGE_QUEUE) || defined(PROTO)
4417 # define MAX_REPEAT_PARSE 8
4418 
4419 /*
4420  * Process messages that have been queued for netbeans or clientserver.
4421  * Also check if any jobs have ended.
4422  * These functions can call arbitrary vimscript and should only be called when
4423  * it is safe to do so.
4424  */
4425     void
4426 parse_queued_messages(void)
4427 {
4428     win_T   *old_curwin = curwin;
4429     int	    i;
4430 
4431     // Do not handle messages while redrawing, because it may cause buffers to
4432     // change or be wiped while they are being redrawn.
4433     if (updating_screen)
4434 	return;
4435 
4436     // Loop when a job ended, but don't keep looping forever.
4437     for (i = 0; i < MAX_REPEAT_PARSE; ++i)
4438     {
4439 	// For Win32 mch_breakcheck() does not check for input, do it here.
4440 # if defined(MSWIN) && defined(FEAT_JOB_CHANNEL)
4441 	channel_handle_events(FALSE);
4442 # endif
4443 
4444 # ifdef FEAT_NETBEANS_INTG
4445 	// Process the queued netbeans messages.
4446 	netbeans_parse_messages();
4447 # endif
4448 # ifdef FEAT_JOB_CHANNEL
4449 	// Write any buffer lines still to be written.
4450 	channel_write_any_lines();
4451 
4452 	// Process the messages queued on channels.
4453 	channel_parse_messages();
4454 # endif
4455 # if defined(FEAT_CLIENTSERVER) && defined(FEAT_X11)
4456 	// Process the queued clientserver messages.
4457 	server_parse_messages();
4458 # endif
4459 # ifdef FEAT_JOB_CHANNEL
4460 	// Check if any jobs have ended.  If so, repeat the above to handle
4461 	// changes, e.g. stdin may have been closed.
4462 	if (job_check_ended())
4463 	    continue;
4464 # endif
4465 # ifdef FEAT_TERMINAL
4466 	free_unused_terminals();
4467 # endif
4468 	break;
4469     }
4470 
4471     // If the current window changed we need to bail out of the waiting loop.
4472     // E.g. when a job exit callback closes the terminal window.
4473     if (curwin != old_curwin)
4474 	ins_char_typebuf(K_IGNORE);
4475 }
4476 #endif
4477 
4478 #ifndef PROTO  /* proto is defined in vim.h */
4479 # ifdef ELAPSED_TIMEVAL
4480 /*
4481  * Return time in msec since "start_tv".
4482  */
4483     long
4484 elapsed(struct timeval *start_tv)
4485 {
4486     struct timeval  now_tv;
4487 
4488     gettimeofday(&now_tv, NULL);
4489     return (now_tv.tv_sec - start_tv->tv_sec) * 1000L
4490 	 + (now_tv.tv_usec - start_tv->tv_usec) / 1000L;
4491 }
4492 # endif
4493 
4494 # ifdef ELAPSED_TICKCOUNT
4495 /*
4496  * Return time in msec since "start_tick".
4497  */
4498     long
4499 elapsed(DWORD start_tick)
4500 {
4501     DWORD	now = GetTickCount();
4502 
4503     return (long)now - (long)start_tick;
4504 }
4505 # endif
4506 #endif
4507 
4508 #if defined(FEAT_JOB_CHANNEL) \
4509 	|| (defined(UNIX) && (!defined(USE_SYSTEM) \
4510 	|| (defined(FEAT_GUI) && defined(FEAT_TERMINAL)))) \
4511 	|| defined(PROTO)
4512 /*
4513  * Parse "cmd" and put the white-separated parts in "argv".
4514  * "argv" is an allocated array with "argc" entries and room for 4 more.
4515  * Returns FAIL when out of memory.
4516  */
4517     int
4518 mch_parse_cmd(char_u *cmd, int use_shcf, char ***argv, int *argc)
4519 {
4520     int		i;
4521     char_u	*p, *d;
4522     int		inquote;
4523 
4524     /*
4525      * Do this loop twice:
4526      * 1: find number of arguments
4527      * 2: separate them and build argv[]
4528      */
4529     for (i = 0; i < 2; ++i)
4530     {
4531 	p = skipwhite(cmd);
4532 	inquote = FALSE;
4533 	*argc = 0;
4534 	for (;;)
4535 	{
4536 	    if (i == 1)
4537 		(*argv)[*argc] = (char *)p;
4538 	    ++*argc;
4539 	    d = p;
4540 	    while (*p != NUL && (inquote || (*p != ' ' && *p != TAB)))
4541 	    {
4542 		if (p[0] == '"')
4543 		    // quotes surrounding an argument and are dropped
4544 		    inquote = !inquote;
4545 		else
4546 		{
4547 		    if (rem_backslash(p))
4548 		    {
4549 			// First pass: skip over "\ " and "\"".
4550 			// Second pass: Remove the backslash.
4551 			++p;
4552 		    }
4553 		    if (i == 1)
4554 			*d++ = *p;
4555 		}
4556 		++p;
4557 	    }
4558 	    if (*p == NUL)
4559 	    {
4560 		if (i == 1)
4561 		    *d++ = NUL;
4562 		break;
4563 	    }
4564 	    if (i == 1)
4565 		*d++ = NUL;
4566 	    p = skipwhite(p + 1);
4567 	}
4568 	if (*argv == NULL)
4569 	{
4570 	    if (use_shcf)
4571 	    {
4572 		/* Account for possible multiple args in p_shcf. */
4573 		p = p_shcf;
4574 		for (;;)
4575 		{
4576 		    p = skiptowhite(p);
4577 		    if (*p == NUL)
4578 			break;
4579 		    ++*argc;
4580 		    p = skipwhite(p);
4581 		}
4582 	    }
4583 
4584 	    *argv = (char **)alloc((unsigned)((*argc + 4) * sizeof(char *)));
4585 	    if (*argv == NULL)	    /* out of memory */
4586 		return FAIL;
4587 	}
4588     }
4589     return OK;
4590 }
4591 
4592 # if defined(FEAT_JOB_CHANNEL) || defined(PROTO)
4593 /*
4594  * Build "argv[argc]" from the string "cmd".
4595  * "argv[argc]" is set to NULL;
4596  * Return FAIL when out of memory.
4597  */
4598     int
4599 build_argv_from_string(char_u *cmd, char ***argv, int *argc)
4600 {
4601     char_u	*cmd_copy;
4602     int		i;
4603 
4604     /* Make a copy, parsing will modify "cmd". */
4605     cmd_copy = vim_strsave(cmd);
4606     if (cmd_copy == NULL
4607 	    || mch_parse_cmd(cmd_copy, FALSE, argv, argc) == FAIL)
4608     {
4609 	vim_free(cmd_copy);
4610 	return FAIL;
4611     }
4612     for (i = 0; i < *argc; i++)
4613 	(*argv)[i] = (char *)vim_strsave((char_u *)(*argv)[i]);
4614     (*argv)[*argc] = NULL;
4615     vim_free(cmd_copy);
4616     return OK;
4617 }
4618 
4619 /*
4620  * Build "argv[argc]" from the list "l".
4621  * "argv[argc]" is set to NULL;
4622  * Return FAIL when out of memory.
4623  */
4624     int
4625 build_argv_from_list(list_T *l, char ***argv, int *argc)
4626 {
4627     listitem_T  *li;
4628     char_u	*s;
4629 
4630     /* Pass argv[] to mch_call_shell(). */
4631     *argv = (char **)alloc(sizeof(char *) * (l->lv_len + 1));
4632     if (*argv == NULL)
4633 	return FAIL;
4634     *argc = 0;
4635     for (li = l->lv_first; li != NULL; li = li->li_next)
4636     {
4637 	s = tv_get_string_chk(&li->li_tv);
4638 	if (s == NULL)
4639 	{
4640 	    int i;
4641 
4642 	    for (i = 0; i < *argc; ++i)
4643 		vim_free((*argv)[i]);
4644 	    return FAIL;
4645 	}
4646 	(*argv)[*argc] = (char *)vim_strsave(s);
4647 	*argc += 1;
4648     }
4649     (*argv)[*argc] = NULL;
4650     return OK;
4651 }
4652 # endif
4653 #endif
4654