misc2.c
上传用户:gddssl
上传日期:2007-01-06
资源大小:1003k
文件大小:47k
源码类别:

编辑器/阅读器

开发平台:

DOS

  1. /* vi:set ts=8 sts=4 sw=4:
  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.  */
  8. /*
  9.  * misc2.c: Various functions.
  10.  */
  11. #include "vim.h"
  12. #ifdef HAVE_FCNTL_H
  13. # include <fcntl.h>     /* for chdir() */
  14. #endif
  15. /*
  16.  * coladvance(col)
  17.  *
  18.  * Try to advance the Cursor to the specified column.
  19.  *
  20.  * return OK if desired column is reached, FAIL if not
  21.  */
  22.     int
  23. coladvance(wcol)
  24.     colnr_t     wcol;
  25. {
  26.     int idx;
  27.     char_u *ptr;
  28.     colnr_t col;
  29.     ptr = ml_get_curline();
  30.     /* try to advance to the specified column */
  31.     idx = -1;
  32.     col = 0;
  33.     while (col <= wcol && *ptr)
  34.     {
  35. ++idx;
  36. /* Count a tab for what it's worth (if list mode not on) */
  37. col += lbr_chartabsize(ptr, col);
  38. ++ptr;
  39.     }
  40.     /*
  41.      * In Insert mode it is allowed to be one char beyond the end of the line.
  42.      * Also in Visual mode, when 'selection' is not "old".
  43.      */
  44.     if (((State & INSERT) || (VIsual_active && *p_sel != 'o')) && col <= wcol)
  45. ++idx;
  46.     if (idx < 0)
  47. curwin->w_cursor.col = 0;
  48.     else
  49. curwin->w_cursor.col = idx;
  50. #ifdef MULTI_BYTE
  51.     /* prevent cursor from moving on the trail byte */
  52.     if (is_dbcs)
  53. AdjustCursorForMultiByteCharacter();
  54. #endif
  55.     if (col <= wcol)
  56. return FAIL;     /* Couldn't reach column */
  57.     else
  58. return OK;     /* Reached column */
  59. }
  60. /*
  61.  * inc(p)
  62.  *
  63.  * Increment the line pointer 'p' crossing line boundaries as necessary.
  64.  * Return 1 when crossing a line, -1 when at end of file, 0 otherwise.
  65.  */
  66.     int
  67. inc_cursor()
  68. {
  69.     return inc(&curwin->w_cursor);
  70. }
  71.     int
  72. inc(lp)
  73.     FPOS  *lp;
  74. {
  75.     char_u  *p = ml_get_pos(lp);
  76.     if (*p != NUL) /* still within line, move to next char (may be NUL) */
  77.     {
  78. #ifdef MULTI_BYTE
  79. if (is_dbcs && IsLeadByte(p[0]) && p[1] != NUL)
  80. {
  81.     lp->col += 2;
  82.     return ((p[2] != NUL) ? 0 : 1);
  83. }
  84. #endif
  85. lp->col++;
  86. return ((p[1] != NUL) ? 0 : 1);
  87.     }
  88.     if (lp->lnum != curbuf->b_ml.ml_line_count)     /* there is a next line */
  89.     {
  90. lp->col = 0;
  91. lp->lnum++;
  92. return 1;
  93.     }
  94.     return -1;
  95. }
  96. /*
  97.  * incl(lp): same as inc(), but skip the NUL at the end of non-empty lines
  98.  */
  99.     int
  100. incl(lp)
  101.     FPOS    *lp;
  102. {
  103.     int     r;
  104.     if ((r = inc(lp)) == 1 && lp->col)
  105. r = inc(lp);
  106.     return r;
  107. }
  108. /*
  109.  * dec(p)
  110.  *
  111.  * Decrement the line pointer 'p' crossing line boundaries as necessary.
  112.  * Return 1 when crossing a line, -1 when at start of file, 0 otherwise.
  113.  */
  114.     int
  115. dec_cursor()
  116. {
  117. #ifdef MULTI_BYTE
  118.     return (is_dbcs ? han_dec(&curwin->w_cursor) : dec(&curwin->w_cursor));
  119. #else
  120.     return dec(&curwin->w_cursor);
  121. #endif
  122. }
  123.     int
  124. dec(lp)
  125.     FPOS  *lp;
  126. {
  127.     if (lp->col > 0)
  128.     { /* still within line */
  129. lp->col--;
  130. return 0;
  131.     }
  132.     if (lp->lnum > 1)
  133.     { /* there is a prior line */
  134. lp->lnum--;
  135. lp->col = STRLEN(ml_get(lp->lnum));
  136. return 1;
  137.     }
  138.     return -1; /* at start of file */
  139. }
  140. /*
  141.  * decl(lp): same as dec(), but skip the NUL at the end of non-empty lines
  142.  */
  143.     int
  144. decl(lp)
  145.     FPOS    *lp;
  146. {
  147.     int     r;
  148.     if ((r = dec(lp)) == 1 && lp->col)
  149. r = dec(lp);
  150.     return r;
  151. }
  152. /*
  153.  * Make sure curwin->w_cursor.lnum is valid.
  154.  */
  155.     void
  156. check_cursor_lnum()
  157. {
  158.     if (curwin->w_cursor.lnum > curbuf->b_ml.ml_line_count)
  159. curwin->w_cursor.lnum = curbuf->b_ml.ml_line_count;
  160.     if (curwin->w_cursor.lnum <= 0)
  161. curwin->w_cursor.lnum = 1;
  162. }
  163. /*
  164.  * Make sure curwin->w_cursor.col is valid.
  165.  */
  166.     void
  167. check_cursor_col()
  168. {
  169.     colnr_t len;
  170.     len = STRLEN(ml_get_curline());
  171.     if (len == 0)
  172. curwin->w_cursor.col = 0;
  173.     else if (curwin->w_cursor.col >= len)
  174.     {
  175. if (State & INSERT || restart_edit)
  176.     curwin->w_cursor.col = len;
  177. else
  178.     curwin->w_cursor.col = len - 1;
  179.     }
  180. }
  181. /*
  182.  * make sure curwin->w_cursor in on a valid character
  183.  */
  184.     void
  185. adjust_cursor()
  186. {
  187.     check_cursor_lnum();
  188.     check_cursor_col();
  189. }
  190. /*
  191.  * Make sure curwin->w_cursor is not on the NUL at the end of the line.
  192.  * Allow it when in Visual mode and 'selection' is not "old".
  193.  */
  194.     void
  195. adjust_cursor_col()
  196. {
  197.     if ((!VIsual_active || *p_sel == 'o')
  198.     && curwin->w_cursor.col && gchar_cursor() == NUL)
  199. --curwin->w_cursor.col;
  200. }
  201. /*
  202.  * When curwin->w_leftcol has changed, adjust the cursor position.
  203.  * Return TRUE if the cursor was moved.
  204.  */
  205.     int
  206. leftcol_changed()
  207. {
  208.     long lastcol;
  209.     colnr_t s, e;
  210.     int retval = FALSE;
  211.     changed_cline_bef_curs();
  212.     lastcol = curwin->w_leftcol + Columns - (curwin->w_p_nu ? 8 : 0) - 1;
  213.     validate_virtcol();
  214.     /*
  215.      * If the cursor is right or left of the screen, move it to last or first
  216.      * character.
  217.      */
  218.     if (curwin->w_virtcol > (colnr_t)lastcol)
  219.     {
  220. retval = TRUE;
  221. coladvance((colnr_t)lastcol);
  222.     }
  223.     else if (curwin->w_virtcol < curwin->w_leftcol)
  224.     {
  225. retval = TRUE;
  226. (void)coladvance(curwin->w_leftcol);
  227.     }
  228.     /*
  229.      * If the start of the character under the cursor is not on the screen,
  230.      * advance the cursor one more char.  If this fails (last char of the
  231.      * line) adjust the scrolling.
  232.      */
  233.     getvcol(curwin, &curwin->w_cursor, &s, NULL, &e);
  234.     if (e > (colnr_t)lastcol)
  235.     {
  236. retval = TRUE;
  237. coladvance(s - 1);
  238.     }
  239.     else if (s < curwin->w_leftcol)
  240.     {
  241. retval = TRUE;
  242. if (coladvance(e + 1) == FAIL) /* there isn't another character */
  243. {
  244.     curwin->w_leftcol = s; /* adjust w_leftcol instead */
  245.     changed_cline_bef_curs();
  246. }
  247.     }
  248.     redraw_later(NOT_VALID);
  249.     return retval;
  250. }
  251. /**********************************************************************
  252.  * Various routines dealing with allocation and deallocation of memory.
  253.  */
  254. #if defined(MEM_PROFILE) || defined(PROTO)
  255. # define MEM_SIZES  8200
  256. static long_u mem_allocs[MEM_SIZES];
  257. static long_u mem_frees[MEM_SIZES];
  258. static long_u mem_allocated;
  259. static long_u mem_freed;
  260. static long_u mem_peak;
  261. static long_u num_alloc;
  262. static long_u num_freed;
  263. static void mem_pre_alloc_s __ARGS((size_t *sizep));
  264. static void mem_pre_alloc_l __ARGS((long_u *sizep));
  265. static void mem_post_alloc __ARGS((void **pp, size_t size));
  266. static void mem_pre_free __ARGS((void **pp));
  267.     static void
  268. mem_pre_alloc_s(sizep)
  269.     size_t *sizep;
  270. {
  271.     *sizep += sizeof(size_t);
  272. }
  273.     static void
  274. mem_pre_alloc_l(sizep)
  275.     long_u *sizep;
  276. {
  277.     *sizep += sizeof(size_t);
  278. }
  279.     static void
  280. mem_post_alloc(pp, size)
  281.     void **pp;
  282.     size_t size;
  283. {
  284.     if (*pp == NULL)
  285. return;
  286.     size -= sizeof(size_t);
  287.     *(long_u *)*pp = size;
  288.     if (size <= MEM_SIZES-1)
  289. mem_allocs[size-1]++;
  290.     else
  291. mem_allocs[MEM_SIZES-1]++;
  292.     mem_allocated += size;
  293.     if (mem_allocated - mem_freed > mem_peak)
  294. mem_peak = mem_allocated - mem_freed;
  295.     num_alloc++;
  296.     *pp = (void *)((char *)*pp + sizeof(size_t));
  297. }
  298.     static void
  299. mem_pre_free(pp)
  300.     void **pp;
  301. {
  302.     long_u size;
  303.     *pp = (void *)((char *)*pp - sizeof(size_t));
  304.     size = *(size_t *)*pp;
  305.     if (size <= MEM_SIZES-1)
  306. mem_frees[size-1]++;
  307.     else
  308. mem_frees[MEM_SIZES-1]++;
  309.     mem_freed += size;
  310.     num_freed++;
  311. }
  312. /*
  313.  * called on exit via atexit()
  314.  */
  315.     void
  316. vim_mem_profile_dump()
  317. {
  318.     int i, j;
  319.     printf("rn");
  320.     j = 0;
  321.     for (i = 0; i < MEM_SIZES - 1; i++)
  322.     {
  323. if (mem_allocs[i] || mem_frees[i])
  324. {
  325.     if (mem_frees[i] > mem_allocs[i])
  326. printf("rnERROR: ");
  327.     printf("[%4d / %4lu-%-4lu] ", i + 1, mem_allocs[i], mem_frees[i]);
  328.     j++;
  329.     if (j > 3)
  330.     {
  331. j = 0;
  332. printf("rn");
  333.     }
  334. }
  335.     }
  336.     i = MEM_SIZES - 1;
  337.     if (mem_allocs[i])
  338.     {
  339. printf("rn");
  340. if (mem_frees[i] > mem_allocs[i])
  341.     printf("ERROR: ");
  342. printf("[>%d / %4lu-%-4lu]", i, mem_allocs[i], mem_frees[i]);
  343.     }
  344.     printf("rnn[bytes] total alloc-freed %lu-%lu, in use %lu, peak use %lurn",
  345.     mem_allocated, mem_freed, mem_allocated - mem_freed, mem_peak);
  346.     printf("[calls] total re/malloc()'s %lu, total free()'s %lurnn",
  347.     num_alloc, num_freed);
  348. }
  349. #endif /* MEM_PROFILE */
  350. /*
  351.  * Some memory is reserved for error messages and for being able to
  352.  * call mf_release_all(), which needs some memory for mf_trans_add().
  353.  */
  354. #define KEEP_ROOM 8192L
  355. static void vim_strup __ARGS((char_u *p));
  356. /*
  357.  * Note: if unsinged is 16 bits we can only allocate up to 64K with alloc().
  358.  * Use lalloc for larger blocks.
  359.  */
  360.     char_u *
  361. alloc(size)
  362.     unsigned     size;
  363. {
  364.     return (lalloc((long_u)size, TRUE));
  365. }
  366. /*
  367.  * Allocate memory and set all bytes to zero.
  368.  */
  369.     char_u *
  370. alloc_clear(size)
  371.     unsigned     size;
  372. {
  373.     char_u *p;
  374.     p = (lalloc((long_u)size, TRUE));
  375.     if (p != NULL)
  376. (void)vim_memset(p, 0, (size_t)size);
  377.     return p;
  378. }
  379. /*
  380.  * alloc() with check for maximum line length
  381.  */
  382.     char_u *
  383. alloc_check(size)
  384.     unsigned     size;
  385. {
  386. #if !defined(UNIX) && !defined(__EMX__)
  387.     if (sizeof(int) == 2 && size > 0x7fff)
  388.     {
  389. EMSG("Line is becoming too long");
  390. return NULL;
  391.     }
  392. #endif
  393.     return (lalloc((long_u)size, TRUE));
  394. }
  395. /*
  396.  * Allocate memory like lalloc() and set all bytes to zero.
  397.  */
  398.     char_u *
  399. lalloc_clear(size, message)
  400.     long_u size;
  401.     int message;
  402. {
  403.     char_u *p;
  404.     p = (lalloc(size, message));
  405.     if (p != NULL)
  406. (void)vim_memset(p, 0, (size_t)size);
  407.     return p;
  408. }
  409.     char_u *
  410. lalloc(size, message)
  411.     long_u size;
  412.     int message;
  413. {
  414.     char_u *p;     /* pointer to new storage space */
  415.     static int releasing = FALSE;  /* don't do mf_release_all() recursive */
  416.     int try_again;
  417.     if (size <= 0)
  418.     {
  419. EMSGN("Internal error: lalloc(%ld, )", size);
  420. return NULL;
  421.     }
  422. #ifdef MEM_PROFILE
  423.     mem_pre_alloc_l(&size);
  424. #endif
  425. #if defined(MSDOS) && !defined(DJGPP)
  426.     if (size >= 0xfff0) /* in MSDOS we can't deal with >64K blocks */
  427. p = NULL;
  428.     else
  429. #endif
  430.     /*
  431.      * If out of memory, try to release some memfile blocks.
  432.      * If some blocks are released call malloc again.
  433.      */
  434.     for (;;)
  435.     {
  436. if ((p = (char_u *)malloc((size_t)size)) != NULL)
  437. {
  438.     if (mch_avail_mem(TRUE) < KEEP_ROOM && !releasing)
  439.     {     /* System is low... no go! */
  440.     vim_free((char *)p);
  441.     p = NULL;
  442.     }
  443. }
  444.     /*
  445.      * Remember that mf_release_all() is being called to avoid an endless loop,
  446.      * because mf_release_all() may call alloc() recursively.
  447.      */
  448. if (p != NULL || releasing)
  449.     break;
  450. releasing = TRUE;
  451. try_again = mf_release_all();
  452. releasing = FALSE;
  453. if (!try_again)
  454.     break;
  455.     }
  456.     if (message && p == NULL)
  457. do_outofmem_msg();
  458. #ifdef MEM_PROFILE
  459.     mem_post_alloc((void **)&p, (size_t)size);
  460. #endif
  461.     return (p);
  462. }
  463. #if defined(MEM_PROFILE) || defined(PROTO)
  464. /*
  465.  * realloc(), with memory profiling.
  466.  */
  467.     void *
  468. vim_realloc(ptr, size)
  469.     void *ptr;
  470.     size_t size;
  471. {
  472.     void *p;
  473.     mem_pre_free(&ptr);
  474.     mem_pre_alloc_s(&size);
  475.     p = realloc(ptr, size);
  476.     mem_post_alloc(&p, size);
  477.     return p;
  478. }
  479. #endif
  480. /*
  481. * Avoid repeating the error message many times (they take 1 second each).
  482. * Did_outofmem_msg is reset when a character is read.
  483. */
  484.     void
  485. do_outofmem_msg()
  486. {
  487.     if (!did_outofmem_msg)
  488.     {
  489. emsg(e_outofmem);
  490. did_outofmem_msg = TRUE;
  491.     }
  492. }
  493. /*
  494.  * copy a string into newly allocated memory
  495.  */
  496.     char_u *
  497. vim_strsave(string)
  498.     char_u *string;
  499. {
  500.     char_u *p;
  501.     unsigned len;
  502.     len = STRLEN(string) + 1;
  503.     p = alloc(len);
  504.     if (p != NULL)
  505. mch_memmove(p, string, (size_t)len);
  506.     return p;
  507. }
  508.     char_u *
  509. vim_strnsave(string, len)
  510.     char_u *string;
  511.     int len;
  512. {
  513.     char_u *p;
  514.     p = alloc((unsigned)(len + 1));
  515.     if (p != NULL)
  516.     {
  517. STRNCPY(p, string, len);
  518. p[len] = NUL;
  519.     }
  520.     return p;
  521. }
  522. /*
  523.  * like vim_strnsave(), but remove backslashes from the string.
  524.  */
  525.     char_u *
  526. vim_strnsave_esc(string, len)
  527.     char_u *string;
  528.     int len;
  529. {
  530.     char_u *p1, *p2;
  531.     p1 = alloc((unsigned) (len + 1));
  532.     if (p1 != NULL)
  533.     {
  534. STRNCPY(p1, string, len);
  535. p1[len] = NUL;
  536. for (p2 = p1; *p2; ++p2)
  537.     if (*p2 == '\' && *(p2 + 1) != NUL)
  538. STRCPY(p2, p2 + 1);
  539.     }
  540.     return p1;
  541. }
  542. /*
  543.  * Same as vim_strsave(), but any characters found in esc_chars are preceded
  544.  * by a backslash.
  545.  */
  546.     char_u *
  547. vim_strsave_escaped(string, esc_chars)
  548.     char_u *string;
  549.     char_u *esc_chars;
  550. {
  551.     char_u *p;
  552.     char_u *p2;
  553.     char_u *escaped_string;
  554.     unsigned length;
  555.     /*
  556.      * First count the number of backslashes required.
  557.      * Then allocate the memory and insert them.
  558.      */
  559.     length = 1; /* count the trailing '/' and NUL */
  560.     for (p = string; *p; p++)
  561.     {
  562. if (vim_strchr(esc_chars, *p) != NULL)
  563.     ++length; /* count a backslash */
  564. ++length; /* count an ordinary char */
  565.     }
  566.     escaped_string = alloc(length);
  567.     if (escaped_string != NULL)
  568.     {
  569. p2 = escaped_string;
  570. for (p = string; *p; p++)
  571. {
  572.     if (vim_strchr(esc_chars, *p) != NULL)
  573. *p2++ = '\';
  574.     *p2++ = *p;
  575. }
  576. *p2 = NUL;
  577.     }
  578.     return escaped_string;
  579. }
  580. /*
  581.  * like vim_strsave(), but make all characters uppercase.
  582.  */
  583.     char_u *
  584. vim_strsave_up(string)
  585.     char_u *string;
  586. {
  587.     char_u *p1;
  588.     p1 = vim_strsave(string);
  589.     vim_strup(p1);
  590.     return p1;
  591. }
  592. /*
  593.  * like vim_strnsave(), but make all characters uppercase.
  594.  */
  595.     char_u *
  596. vim_strnsave_up(string, len)
  597.     char_u *string;
  598.     int len;
  599. {
  600.     char_u *p1;
  601.     p1 = vim_strnsave(string, len);
  602.     vim_strup(p1);
  603.     return p1;
  604. }
  605.     static void
  606. vim_strup(p)
  607.     char_u *p;
  608. {
  609.     char_u  *p2;
  610.     int     c;
  611.     if (p != NULL)
  612.     {
  613. p2 = p;
  614. while ((c = *p2) != NUL)
  615.     *p2++ = TO_UPPER(c);
  616.     }
  617. }
  618. /*
  619.  * copy a number of spaces
  620.  */
  621.     void
  622. copy_spaces(ptr, count)
  623.     char_u  *ptr;
  624.     size_t  count;
  625. {
  626.     size_t  i = count;
  627.     char_u  *p = ptr;
  628.     while (i--)
  629. *p++ = ' ';
  630. }
  631. /*
  632.  * delete spaces at the end of a string
  633.  */
  634.     void
  635. del_trailing_spaces(ptr)
  636.     char_u *ptr;
  637. {
  638.     char_u  *q;
  639.     q = ptr + STRLEN(ptr);
  640.     while (--q > ptr && vim_iswhite(q[0]) && q[-1] != '\' &&
  641.    q[-1] != Ctrl('V'))
  642. *q = NUL;
  643. }
  644. /*
  645.  * vim_strncpy()
  646.  *
  647.  * This is here because strncpy() does not guarantee successful results when
  648.  * the to and from strings overlap.  It is only currently called from nextwild()
  649.  * which copies part of the command line to another part of the command line.
  650.  * This produced garbage when expanding files etc in the middle of the command
  651.  * line (on my terminal, anyway) -- webb.
  652.  */
  653.     void
  654. vim_strncpy(to, from, len)
  655.     char_u *to;
  656.     char_u *from;
  657.     int len;
  658. {
  659.     int i;
  660.     if (to <= from)
  661.     {
  662. while (len-- && *from)
  663.     *to++ = *from++;
  664. if (len >= 0)
  665.     *to = *from;    /* Copy NUL */
  666.     }
  667.     else
  668.     {
  669. for (i = 0; i < len; i++)
  670. {
  671.     to++;
  672.     if (*from++ == NUL)
  673.     {
  674. i++;
  675. break;
  676.     }
  677. }
  678. for (; i > 0; i--)
  679.     *--to = *--from;
  680.     }
  681. }
  682. /*
  683.  * Isolate one part of a string option where parts are separated with commas.
  684.  * The part is copied into buf[maxlen].
  685.  * "*option" is advanced to the next part.
  686.  * The length is returned.
  687.  */
  688.     int
  689. copy_option_part(option, buf, maxlen, sep_chars)
  690.     char_u **option;
  691.     char_u *buf;
  692.     int maxlen;
  693.     char *sep_chars;
  694. {
  695.     int     len = 0;
  696.     char_u  *p = *option;
  697.     /* skip '.' at start of option part, for 'suffixes' */
  698.     if (*p == '.')
  699. buf[len++] = *p++;
  700.     while (*p && vim_strchr((char_u *)sep_chars, *p) == NULL)
  701.     {
  702. /*
  703.  * Skip backslash before a separator character and space.
  704.  */
  705. if (p[0] == '\' && vim_strchr((char_u *)sep_chars, p[1]) != NULL)
  706.     ++p;
  707. if (len < maxlen - 1)
  708.     buf[len++] = *p;
  709. ++p;
  710.     }
  711.     buf[len] = NUL;
  712.     p = skip_to_option_part(p); /* p points to next file name */
  713.     *option = p;
  714.     return len;
  715. }
  716. /*
  717.  * replacement for free() that ignores NULL pointers
  718.  */
  719.     void
  720. vim_free(x)
  721.     void *x;
  722. {
  723.     if (x != NULL)
  724.     {
  725. #ifdef MEM_PROFILE
  726. mem_pre_free(&x);
  727. #endif
  728. free(x);
  729.     }
  730. }
  731. #ifndef HAVE_MEMSET
  732.     void *
  733. vim_memset(ptr, c, size)
  734.     void    *ptr;
  735.     int     c;
  736.     size_t  size;
  737. {
  738.     char *p = ptr;
  739.     while (size-- > 0)
  740. *p++ = c;
  741.     return ptr;
  742. }
  743. #endif
  744. #ifdef VIM_MEMCMP
  745. /*
  746.  * Return zero when "b1" and "b2" are the same for "len" bytes.
  747.  * Return non-zero otherwise.
  748.  */
  749.     int
  750. vim_memcmp(b1, b2, len)
  751.     void    *b1;
  752.     void    *b2;
  753.     size_t  len;
  754. {
  755.     char_u  *p1 = (char_u *)b1, *p2 = (char_u *)b2;
  756.     for ( ; len > 0; --len)
  757.     {
  758. if (*p1 != *p2)
  759.     return 1;
  760. ++p1;
  761. ++p2;
  762.     }
  763.     return 0;
  764. }
  765. #endif
  766. #ifdef VIM_MEMMOVE
  767. /*
  768.  * Version of memmove that handles overlapping source and destination.
  769.  * For systems that don't have a function that is guaranteed to do that (SYSV).
  770.  */
  771.     void
  772. mch_memmove(dst_arg, src_arg, len)
  773.     void    *src_arg, *dst_arg;
  774.     size_t  len;
  775. {
  776.     /*
  777.      * A void doesn't have a size, we use char pointers.
  778.      */
  779.     char *dst = dst_arg, *src = src_arg;
  780. /* overlap, copy backwards */
  781.     if (dst > src && dst < src + len)
  782.     {
  783. src +=len;
  784. dst +=len;
  785. while (len-- > 0)
  786.     *--dst = *--src;
  787.     }
  788.     else /* copy forwards */
  789. while (len-- > 0)
  790.     *dst++ = *src++;
  791. }
  792. #endif
  793. #if (!defined(HAVE_STRCASECMP) && !defined(HAVE_STRICMP)) || defined(PROTO)
  794. /*
  795.  * Compare two strings, ignoring case.
  796.  * return 0 for match, 1 for difference
  797.  */
  798.     int
  799. vim_stricmp(s1, s2)
  800.     char    *s1;
  801.     char    *s2;
  802. {
  803.     for (;;)
  804.     {
  805. if (TO_LOWER(*s1) != TO_LOWER(*s2))
  806.     return 1;     /* this character different */
  807. if (*s1 == NUL)
  808.     break;     /* strings match until NUL */
  809. ++s1;
  810. ++s2;
  811.     }
  812.     return 0;     /* strings match */
  813. }
  814. #endif
  815. #if (!defined(HAVE_STRNCASECMP) && !defined(HAVE_STRNICMP)) || defined(PROTO)
  816. /*
  817.  * Compare two strings, for length "len", ignoring case.
  818.  * return 0 for match, 1 for difference
  819.  */
  820.     int
  821. vim_strnicmp(s1, s2, len)
  822.     char    *s1;
  823.     char    *s2;
  824.     size_t  len;
  825. {
  826.     while (len)
  827.     {
  828. if (TO_LOWER(*s1) != TO_LOWER(*s2))
  829.     return 1;     /* this character different */
  830. if (*s1 == NUL)
  831.     break;     /* strings match until NUL */
  832. ++s1;
  833. ++s2;
  834. --len;
  835.     }
  836.     return 0;     /* strings match */
  837. }
  838. #endif
  839. /*
  840.  * Version of strchr() and strrchr() that handle unsigned char strings
  841.  * with characters above 128 correctly. Also it doesn't return a pointer to
  842.  * the NUL at the end of the string.
  843.  */
  844.     char_u  *
  845. vim_strchr(string, n)
  846.     char_u  *string;
  847.     int     n;
  848. {
  849.     char_u *p;
  850.     int c;
  851.     p = string;
  852.     while ((c = *p) != NUL)
  853.     {
  854. if (c == n)
  855.     return p;
  856. ++p;
  857.     }
  858.     return NULL;
  859. }
  860.     char_u  *
  861. vim_strrchr(string, n)
  862.     char_u  *string;
  863.     int     n;
  864. {
  865.     char_u  *retval = NULL;
  866.     while (*string)
  867.     {
  868. if (*string == n)
  869.     retval = string;
  870. ++string;
  871.     }
  872.     return retval;
  873. }
  874. /*
  875.  * Vim's version of strpbrk(), in case it's missing.
  876.  * Don't generate a prototype for this, causes problems when it's not used.
  877.  */
  878. #ifndef PROTO
  879. # ifndef HAVE_STRPBRK
  880. #  ifdef vim_strpbrk
  881. #   undef vim_strpbrk
  882. #  endif
  883.     char_u *
  884. vim_strpbrk(s, charset)
  885.     char_u  *s;
  886.     char_u  *charset;
  887. {
  888.     while (*s)
  889.     {
  890. if (vim_strchr(charset, *s) != NULL)
  891.     return s;
  892. ++s;
  893.     }
  894.     return NULL;
  895. }
  896. # endif
  897. #endif
  898. /*
  899.  * Vim has its own isspace() function, because on some machines isspace()
  900.  * can't handle characters above 128.
  901.  */
  902.     int
  903. vim_isspace(x)
  904.     int     x;
  905. {
  906.     return ((x >= 9 && x <= 13) || x == ' ');
  907. }
  908. /************************************************************************
  909.  * Functions for hanlding growing arrays.
  910.  */
  911. /*
  912.  * Clear an allocated growing array.
  913.  */
  914.     void
  915. ga_clear(gap)
  916.     struct growarray *gap;
  917. {
  918.     vim_free(gap->ga_data);
  919.     ga_init(gap);
  920. }
  921. /*
  922.  * Clear a growing array that contains a list of strings.
  923.  */
  924.     void
  925. ga_clear_strings(gap)
  926.     struct growarray *gap;
  927. {
  928.     int i;
  929.     for (i = 0; i < gap->ga_len; ++i)
  930. vim_free(((char_u **)(gap->ga_data))[i]);
  931.     ga_clear(gap);
  932. }
  933. /*
  934.  * Initialize a growing array. Don't forget to set ga_itemsize and
  935.  * ga_growsize!  Or use ga_init2().
  936.  */
  937.     void
  938. ga_init(gap)
  939.     struct growarray *gap;
  940. {
  941.     gap->ga_data = NULL;
  942.     gap->ga_room = 0;
  943.     gap->ga_len = 0;
  944. }
  945.     void
  946. ga_init2(gap, itemsize, growsize)
  947.     struct growarray *gap;
  948.     int itemsize;
  949.     int growsize;
  950. {
  951.     ga_init(gap);
  952.     gap->ga_itemsize = itemsize;
  953.     gap->ga_growsize = growsize;
  954. }
  955. /*
  956.  * Make room in growing array "ga" for at least "n" items.
  957.  * Return FAIL for failure, OK otherwise.
  958.  */
  959.     int
  960. ga_grow(ga, n)
  961.     struct growarray *ga;
  962.     int n;
  963. {
  964.     size_t     len;
  965.     char_u     *pp;
  966.     if (ga->ga_room < n)
  967.     {
  968. if (n < ga->ga_growsize)
  969.     n = ga->ga_growsize;
  970. len = ga->ga_itemsize * (ga->ga_len + n);
  971. pp = alloc_clear((unsigned)len);
  972. if (pp == NULL)
  973.     return FAIL;
  974. ga->ga_room = n;
  975. if (ga->ga_data != NULL)
  976. {
  977.     mch_memmove(pp, ga->ga_data,
  978.       (size_t)(ga->ga_itemsize * ga->ga_len));
  979.     vim_free(ga->ga_data);
  980. }
  981. ga->ga_data = pp;
  982.     }
  983.     return OK;
  984. }
  985. /************************************************************************
  986.  * functions that use lookup tables for various things, generally to do with
  987.  * special key codes.
  988.  */
  989. /*
  990.  * Some useful tables.
  991.  */
  992. static struct modmasktable
  993. {
  994.     int     mod_mask;     /* Bit-mask for particular key modifier */
  995.     char_u  name;     /* Single letter name of modifier */
  996. } mod_mask_table[] =
  997. {
  998.     {MOD_MASK_ALT, (char_u)'M'},
  999.     {MOD_MASK_CTRL, (char_u)'C'},
  1000.     {MOD_MASK_SHIFT, (char_u)'S'},
  1001.     {MOD_MASK_2CLICK, (char_u)'2'},
  1002.     {MOD_MASK_3CLICK, (char_u)'3'},
  1003.     {MOD_MASK_4CLICK, (char_u)'4'},
  1004. #ifdef macintosh
  1005.     {MOD_MASK_CMD,      (char_u)'D'},
  1006. #endif
  1007.     {0x0, NUL}
  1008. };
  1009. /*
  1010.  * Shifted key terminal codes and their unshifted equivalent.
  1011.  * Don't add mouse codes here, they are handled seperately!
  1012.  */
  1013. static char_u shifted_keys_table[] =
  1014. {
  1015. /*  shifted unshifted  */
  1016.     '&', '9', '@', '1', /* begin */
  1017.     '&', '0', '@', '2', /* cancel */
  1018.     '*', '1', '@', '4', /* command */
  1019.     '*', '2', '@', '5', /* copy */
  1020.     '*', '3', '@', '6', /* create */
  1021.     '*', '4', 'k', 'D', /* delete char */
  1022.     '*', '5', 'k', 'L', /* delete line */
  1023.     '*', '7', '@', '7', /* end */
  1024.     '*', '9', '@', '9', /* exit */
  1025.     '*', '0', '@', '0', /* find */
  1026.     '#', '1', '%', '1', /* help */
  1027.     '#', '2', 'k', 'h', /* home */
  1028.     '#', '3', 'k', 'I', /* insert */
  1029.     '#', '4', 'k', 'l', /* left arrow */
  1030.     '%', 'a', '%', '3', /* message */
  1031.     '%', 'b', '%', '4', /* move */
  1032.     '%', 'c', '%', '5', /* next */
  1033.     '%', 'd', '%', '7', /* options */
  1034.     '%', 'e', '%', '8', /* previous */
  1035.     '%', 'f', '%', '9', /* print */
  1036.     '%', 'g', '%', '0', /* redo */
  1037.     '%', 'h', '&', '3', /* replace */
  1038.     '%', 'i', 'k', 'r', /* right arrow */
  1039.     '%', 'j', '&', '5', /* resume */
  1040.     '!', '1', '&', '6', /* save */
  1041.     '!', '2', '&', '7', /* suspend */
  1042.     '!', '3', '&', '8', /* undo */
  1043.     KS_EXTRA, (int)KE_S_UP, 'k', 'u', /* up arrow */
  1044.     KS_EXTRA, (int)KE_S_DOWN, 'k', 'd', /* down arrow */
  1045.     KS_EXTRA, (int)KE_S_F1, 'k', '1', /* F1 */
  1046.     KS_EXTRA, (int)KE_S_F2, 'k', '2',
  1047.     KS_EXTRA, (int)KE_S_F3, 'k', '3',
  1048.     KS_EXTRA, (int)KE_S_F4, 'k', '4',
  1049.     KS_EXTRA, (int)KE_S_F5, 'k', '5',
  1050.     KS_EXTRA, (int)KE_S_F6, 'k', '6',
  1051.     KS_EXTRA, (int)KE_S_F7, 'k', '7',
  1052.     KS_EXTRA, (int)KE_S_F8, 'k', '8',
  1053.     KS_EXTRA, (int)KE_S_F9, 'k', '9',
  1054.     KS_EXTRA, (int)KE_S_F10, 'k', ';', /* F10 */
  1055.     KS_EXTRA, (int)KE_S_F11, 'F', '1',
  1056.     KS_EXTRA, (int)KE_S_F12, 'F', '2',
  1057.     KS_EXTRA, (int)KE_S_F13, 'F', '3',
  1058.     KS_EXTRA, (int)KE_S_F14, 'F', '4',
  1059.     KS_EXTRA, (int)KE_S_F15, 'F', '5',
  1060.     KS_EXTRA, (int)KE_S_F16, 'F', '6',
  1061.     KS_EXTRA, (int)KE_S_F17, 'F', '7',
  1062.     KS_EXTRA, (int)KE_S_F18, 'F', '8',
  1063.     KS_EXTRA, (int)KE_S_F19, 'F', '9',
  1064.     KS_EXTRA, (int)KE_S_F20, 'F', 'A',
  1065.     KS_EXTRA, (int)KE_S_F21, 'F', 'B',
  1066.     KS_EXTRA, (int)KE_S_F22, 'F', 'C',
  1067.     KS_EXTRA, (int)KE_S_F23, 'F', 'D',
  1068.     KS_EXTRA, (int)KE_S_F24, 'F', 'E',
  1069.     KS_EXTRA, (int)KE_S_F25, 'F', 'F',
  1070.     KS_EXTRA, (int)KE_S_F26, 'F', 'G',
  1071.     KS_EXTRA, (int)KE_S_F27, 'F', 'H',
  1072.     KS_EXTRA, (int)KE_S_F28, 'F', 'I',
  1073.     KS_EXTRA, (int)KE_S_F29, 'F', 'J',
  1074.     KS_EXTRA, (int)KE_S_F30, 'F', 'K',
  1075.     KS_EXTRA, (int)KE_S_F31, 'F', 'L',
  1076.     KS_EXTRA, (int)KE_S_F32, 'F', 'M',
  1077.     KS_EXTRA, (int)KE_S_F33, 'F', 'N',
  1078.     KS_EXTRA, (int)KE_S_F34, 'F', 'O',
  1079.     KS_EXTRA, (int)KE_S_F35, 'F', 'P',
  1080.     KS_EXTRA, (int)KE_S_TAB, KS_EXTRA, (int)KE_TAB, /* TAB pseudo code*/
  1081.     NUL
  1082. };
  1083. static struct key_name_entry
  1084. {
  1085.     int     key; /* Special key code or ascii value */
  1086.     char_u  *name; /* Name of key */
  1087. } key_names_table[] =
  1088. {
  1089.     {' ', (char_u *)"Space"},
  1090.     {TAB, (char_u *)"Tab"},
  1091.     {K_TAB, (char_u *)"Tab"},
  1092.     {NL, (char_u *)"NL"},
  1093.     {NL, (char_u *)"NewLine"}, /* Alternative name */
  1094.     {NL, (char_u *)"LineFeed"}, /* Alternative name */
  1095.     {NL, (char_u *)"LF"}, /* Alternative name */
  1096.     {CR, (char_u *)"CR"},
  1097.     {CR, (char_u *)"Return"}, /* Alternative name */
  1098.     {K_BS, (char_u *)"BS"},
  1099.     {K_BS, (char_u *)"BackSpace"}, /* Alternative name */
  1100.     {ESC, (char_u *)"Esc"},
  1101.     {'|', (char_u *)"Bar"},
  1102.     {'\', (char_u *)"Bslash"},
  1103.     {K_DEL, (char_u *)"Del"},
  1104.     {K_DEL, (char_u *)"Delete"}, /* Alternative name */
  1105.     {K_UP, (char_u *)"Up"},
  1106.     {K_DOWN, (char_u *)"Down"},
  1107.     {K_LEFT, (char_u *)"Left"},
  1108.     {K_RIGHT, (char_u *)"Right"},
  1109.     {K_F1, (char_u *)"F1"},
  1110.     {K_F2, (char_u *)"F2"},
  1111.     {K_F3, (char_u *)"F3"},
  1112.     {K_F4, (char_u *)"F4"},
  1113.     {K_F5, (char_u *)"F5"},
  1114.     {K_F6, (char_u *)"F6"},
  1115.     {K_F7, (char_u *)"F7"},
  1116.     {K_F8, (char_u *)"F8"},
  1117.     {K_F9, (char_u *)"F9"},
  1118.     {K_F10, (char_u *)"F10"},
  1119.     {K_F11, (char_u *)"F11"},
  1120.     {K_F12, (char_u *)"F12"},
  1121.     {K_F13, (char_u *)"F13"},
  1122.     {K_F14, (char_u *)"F14"},
  1123.     {K_F15, (char_u *)"F15"},
  1124.     {K_F16, (char_u *)"F16"},
  1125.     {K_F17, (char_u *)"F17"},
  1126.     {K_F18, (char_u *)"F18"},
  1127.     {K_F19, (char_u *)"F19"},
  1128.     {K_F20, (char_u *)"F20"},
  1129.     {K_F21, (char_u *)"F21"},
  1130.     {K_F22, (char_u *)"F22"},
  1131.     {K_F23, (char_u *)"F23"},
  1132.     {K_F24, (char_u *)"F24"},
  1133.     {K_F25, (char_u *)"F25"},
  1134.     {K_F26, (char_u *)"F26"},
  1135.     {K_F27, (char_u *)"F27"},
  1136.     {K_F28, (char_u *)"F28"},
  1137.     {K_F29, (char_u *)"F29"},
  1138.     {K_F30, (char_u *)"F30"},
  1139.     {K_F31, (char_u *)"F31"},
  1140.     {K_F32, (char_u *)"F32"},
  1141.     {K_F33, (char_u *)"F33"},
  1142.     {K_F34, (char_u *)"F34"},
  1143.     {K_F35, (char_u *)"F35"},
  1144.     {K_XF1, (char_u *)"F1"},
  1145.     {K_XF2, (char_u *)"F2"},
  1146.     {K_XF3, (char_u *)"F3"},
  1147.     {K_XF4, (char_u *)"F4"},
  1148.     {K_HELP, (char_u *)"Help"},
  1149.     {K_UNDO, (char_u *)"Undo"},
  1150.     {K_INS, (char_u *)"Insert"},
  1151.     {K_INS, (char_u *)"Ins"}, /* Alternative name */
  1152.     {K_HOME, (char_u *)"Home"},
  1153.     {K_END, (char_u *)"End"},
  1154.     {K_PAGEUP, (char_u *)"PageUp"},
  1155.     {K_PAGEDOWN, (char_u *)"PageDown"},
  1156.     {K_KHOME, (char_u *)"kHome"},
  1157.     {K_KEND, (char_u *)"kEnd"},
  1158.     {K_KPAGEUP, (char_u *)"kPageUp"},
  1159.     {K_KPAGEDOWN, (char_u *)"kPageDown"},
  1160.     {K_KPLUS, (char_u *)"kPlus"},
  1161.     {K_KMINUS, (char_u *)"kMinus"},
  1162.     {K_KDIVIDE, (char_u *)"kDivide"},
  1163.     {K_KMULTIPLY, (char_u *)"kMultiply"},
  1164.     {K_KENTER, (char_u *)"kEnter"},
  1165.     {'<', (char_u *)"lt"},
  1166.     {K_MOUSE, (char_u *)"Mouse"},
  1167.     {K_LEFTMOUSE, (char_u *)"LeftMouse"},
  1168.     {K_LEFTDRAG, (char_u *)"LeftDrag"},
  1169.     {K_LEFTRELEASE, (char_u *)"LeftRelease"},
  1170.     {K_MIDDLEMOUSE, (char_u *)"MiddleMouse"},
  1171.     {K_MIDDLEDRAG, (char_u *)"MiddleDrag"},
  1172.     {K_MIDDLERELEASE, (char_u *)"MiddleRelease"},
  1173.     {K_RIGHTMOUSE, (char_u *)"RightMouse"},
  1174.     {K_RIGHTDRAG, (char_u *)"RightDrag"},
  1175.     {K_RIGHTRELEASE, (char_u *)"RightRelease"},
  1176.     {K_ZERO, (char_u *)"Nul"},
  1177.     {0, NULL}
  1178. };
  1179. #define KEY_NAMES_TABLE_LEN (sizeof(key_names_table) / sizeof(struct key_name_entry))
  1180. #ifdef USE_MOUSE
  1181. static struct mousetable
  1182. {
  1183.     int     pseudo_code; /* Code for pseudo mouse event */
  1184.     int     button; /* Which mouse button is it? */
  1185.     int     is_click; /* Is it a mouse button click event? */
  1186.     int     is_drag; /* Is it a mouse drag event? */
  1187. } mouse_table[] =
  1188. {
  1189.     {(int)KE_LEFTMOUSE, MOUSE_LEFT, TRUE, FALSE},
  1190.     {(int)KE_LEFTDRAG, MOUSE_LEFT, FALSE, TRUE},
  1191.     {(int)KE_LEFTRELEASE, MOUSE_LEFT, FALSE, FALSE},
  1192.     {(int)KE_MIDDLEMOUSE, MOUSE_MIDDLE, TRUE, FALSE},
  1193.     {(int)KE_MIDDLEDRAG, MOUSE_MIDDLE, FALSE, TRUE},
  1194.     {(int)KE_MIDDLERELEASE, MOUSE_MIDDLE, FALSE, FALSE},
  1195.     {(int)KE_RIGHTMOUSE, MOUSE_RIGHT, TRUE, FALSE},
  1196.     {(int)KE_RIGHTDRAG, MOUSE_RIGHT, FALSE, TRUE},
  1197.     {(int)KE_RIGHTRELEASE, MOUSE_RIGHT, FALSE, FALSE},
  1198.     /* DRAG without CLICK */
  1199.     {(int)KE_IGNORE, MOUSE_RELEASE, FALSE, TRUE},
  1200.     /* RELEASE without CLICK */
  1201.     {(int)KE_IGNORE, MOUSE_RELEASE, FALSE, FALSE},
  1202.     {0, 0, 0, 0},
  1203. };
  1204. #endif /* USE_MOUSE */
  1205. /*
  1206.  * Return the modifier mask bit (MOD_MASK_*) which corresponds to the given
  1207.  * modifier name ('S' for Shift, 'C' for Ctrl etc).
  1208.  */
  1209.     int
  1210. name_to_mod_mask(c)
  1211.     int     c;
  1212. {
  1213.     int     i;
  1214.     for (i = 0; mod_mask_table[i].mod_mask; i++)
  1215. if (TO_LOWER(c) == TO_LOWER(mod_mask_table[i].name))
  1216.     return mod_mask_table[i].mod_mask;
  1217.     return 0x0;
  1218. }
  1219. /*
  1220.  * Decide whether the given key code (K_*) is a shifted special
  1221.  * key (by looking at mod_mask).  If it is, then return the appropriate shifted
  1222.  * key code, otherwise just return the character as is.
  1223.  */
  1224.     int
  1225. check_shifted_spec_key(c)
  1226.     int     c;
  1227. {
  1228.     return simplify_key(c, &mod_mask);
  1229. }
  1230. /*
  1231.  * Check if if there is a special key code for "key" that includes the
  1232.  * modifiers specified.
  1233.  */
  1234.     int
  1235. simplify_key(key, modifiers)
  1236.     int     key;
  1237.     int     *modifiers;
  1238. {
  1239.     int     i;
  1240.     int     key0;
  1241.     int     key1;
  1242.     if (*modifiers & MOD_MASK_SHIFT)
  1243.     {
  1244. if (key == TAB) /* TAB is a special case */
  1245. {
  1246.     *modifiers &= ~MOD_MASK_SHIFT;
  1247.     return K_S_TAB;
  1248. }
  1249. key0 = KEY2TERMCAP0(key);
  1250. key1 = KEY2TERMCAP1(key);
  1251. for (i = 0; shifted_keys_table[i] != NUL; i += 4)
  1252.     if (key0 == shifted_keys_table[i + 2] &&
  1253.     key1 == shifted_keys_table[i + 3])
  1254.     {
  1255. *modifiers &= ~MOD_MASK_SHIFT;
  1256. return TERMCAP2KEY(shifted_keys_table[i],
  1257.    shifted_keys_table[i + 1]);
  1258.     }
  1259.     }
  1260.     return key;
  1261. }
  1262. /*
  1263.  * Return a string which contains the name of the given key when the given
  1264.  * modifiers are down.
  1265.  */
  1266.     char_u *
  1267. get_special_key_name(c, modifiers)
  1268.     int     c;
  1269.     int     modifiers;
  1270. {
  1271.     static char_u string[MAX_KEY_NAME_LEN + 1];
  1272.     int     i, idx;
  1273.     int     table_idx;
  1274.     char_u  *s;
  1275.     string[0] = '<';
  1276.     idx = 1;
  1277.     /*
  1278.      * Translate shifted special keys into unshifted keys and set modifier.
  1279.      */
  1280.     if (IS_SPECIAL(c))
  1281.     {
  1282. for (i = 0; shifted_keys_table[i]; i += 4)
  1283.     if (       KEY2TERMCAP0(c) == shifted_keys_table[i]
  1284.     && KEY2TERMCAP1(c) == shifted_keys_table[i + 1])
  1285.     {
  1286. modifiers |= MOD_MASK_SHIFT;
  1287. c = TERMCAP2KEY(shifted_keys_table[i + 2],
  1288.    shifted_keys_table[i + 3]);
  1289. break;
  1290.     }
  1291.     }
  1292.     /* try to find the key in the special key table */
  1293.     table_idx = find_special_key_in_table(c);
  1294.     /*
  1295.      * When not a known special key, and not a printable character, try to
  1296.      * extract modifiers.
  1297.      */
  1298.     if (table_idx < 0 && (!vim_isprintc(c) || (c & 0x7f) == ' ') && (c & 0x80))
  1299.     {
  1300. c &= 0x7f;
  1301. modifiers |= MOD_MASK_ALT;
  1302. /* try again, to find the un-alted key in the special key table */
  1303. table_idx = find_special_key_in_table(c);
  1304.     }
  1305.     if (table_idx < 0 && !vim_isprintc(c) && c < ' ')
  1306.     {
  1307. c += '@';
  1308. modifiers |= MOD_MASK_CTRL;
  1309.     }
  1310.     /* translate the modifier into a string */
  1311.     for (i = 0; mod_mask_table[i].mod_mask; i++)
  1312. if (modifiers & mod_mask_table[i].mod_mask)
  1313. {
  1314.     string[idx++] = mod_mask_table[i].name;
  1315.     string[idx++] = (char_u)'-';
  1316. }
  1317.     if (table_idx < 0) /* unknown special key, output t_xx */
  1318.     {
  1319. if (IS_SPECIAL(c))
  1320. {
  1321.     string[idx++] = 't';
  1322.     string[idx++] = '_';
  1323.     string[idx++] = KEY2TERMCAP0(c);
  1324.     string[idx++] = KEY2TERMCAP1(c);
  1325. }
  1326. /* Not a special key, only modifiers, output directly */
  1327. else
  1328. {
  1329.     if (vim_isprintc(c))
  1330. string[idx++] = c;
  1331.     else
  1332.     {
  1333. s = transchar(c);
  1334. while (*s)
  1335.     string[idx++] = *s++;
  1336.     }
  1337. }
  1338.     }
  1339.     else /* use name of special key */
  1340.     {
  1341. STRCPY(string + idx, key_names_table[table_idx].name);
  1342. idx = STRLEN(string);
  1343.     }
  1344.     string[idx++] = '>';
  1345.     string[idx] = NUL;
  1346.     return string;
  1347. }
  1348. /*
  1349.  * Try translating a <> name at (*srcp)[] to dst[].
  1350.  * Return the number of characters added to dst[], zero for no match.
  1351.  * If there is a match, srcp is advanced to after the <> name.
  1352.  * dst[] must be big enough to hold the result (up to six characters)!
  1353.  */
  1354.     int
  1355. trans_special(srcp, dst, keycode)
  1356.     char_u **srcp;
  1357.     char_u *dst;
  1358.     int keycode; /* prefer key code, e.g. K_DEL instead of DEL */
  1359. {
  1360.     int     modifiers;
  1361.     int     key;
  1362.     int     dlen = 0;
  1363.     key = find_special_key(srcp, &modifiers, keycode);
  1364.     if (key == 0)
  1365. return 0;
  1366.     /* Put the appropriate modifier in a string */
  1367.     if (modifiers != 0)
  1368.     {
  1369. dst[dlen++] = K_SPECIAL;
  1370. dst[dlen++] = KS_MODIFIER;
  1371. dst[dlen++] = modifiers;
  1372.     }
  1373.     if (IS_SPECIAL(key))
  1374.     {
  1375. dst[dlen++] = K_SPECIAL;
  1376. dst[dlen++] = KEY2TERMCAP0(key);
  1377. dst[dlen++] = KEY2TERMCAP1(key);
  1378.     }
  1379.     else
  1380. dst[dlen++] = key;
  1381.     return dlen;
  1382. }
  1383. /*
  1384.  * Try translating a <> name at (*srcp)[], return the key and modifiers.
  1385.  * srcp is advanced to after the <> name.
  1386.  * returns 0 if there is no match.
  1387.  */
  1388.     int
  1389. find_special_key(srcp, modp, keycode)
  1390.     char_u **srcp;
  1391.     int *modp;
  1392.     int keycode; /* prefer key code, e.g. K_DEL instead of DEL */
  1393. {
  1394.     char_u  *last_dash;
  1395.     char_u  *end_of_name;
  1396.     char_u  *src;
  1397.     char_u  *bp;
  1398.     int     modifiers;
  1399.     int     bit;
  1400.     int     key;
  1401.     src = *srcp;
  1402.     if (src[0] != '<')
  1403. return 0;
  1404.     /* Find end of modifier list */
  1405.     last_dash = src;
  1406.     for (bp = src + 1; *bp == '-' || vim_isIDc(*bp); bp++)
  1407.     {
  1408. if (*bp == '-')
  1409. {
  1410.     last_dash = bp;
  1411.     if (bp[1] != NUL && bp[2] == '>')
  1412. ++bp; /* anything accepted, like <C-?> */
  1413. }
  1414. if (bp[0] == 't' && bp[1] == '_' && bp[2] && bp[3])
  1415.     bp += 3; /* skip t_xx, xx may be '-' or '>' */
  1416.     }
  1417.     if (*bp == '>') /* found matching '>' */
  1418.     {
  1419. end_of_name = bp + 1;
  1420. /* Which modifiers are given? */
  1421. modifiers = 0x0;
  1422. for (bp = src + 1; bp < last_dash; bp++)
  1423. {
  1424.     if (*bp != '-')
  1425.     {
  1426. bit = name_to_mod_mask(*bp);
  1427. if (bit == 0x0)
  1428.     break; /* Illegal modifier name */
  1429. modifiers |= bit;
  1430.     }
  1431. }
  1432. /*
  1433.  * Legal modifier name.
  1434.  */
  1435. if (bp >= last_dash)
  1436. {
  1437.     /*
  1438.      * Modifier with single letter, or special key name.
  1439.      */
  1440.     if (modifiers != 0 && last_dash[2] == '>')
  1441. key = last_dash[1];
  1442.     else
  1443. key = get_special_key_code(last_dash + 1);
  1444.     /*
  1445.      * get_special_key_code() may return NUL for invalid
  1446.      * special key name.
  1447.      */
  1448.     if (key != NUL)
  1449.     {
  1450. /*
  1451.  * Only use a modifier when there is no special key code that
  1452.  * includes the modifier.
  1453.  */
  1454. key = simplify_key(key, &modifiers);
  1455. if (!keycode)
  1456. {
  1457.     /* don't want keycode, use single byte code */
  1458.     if (key == K_BS)
  1459. key = BS;
  1460.     else if (key == K_DEL)
  1461. key = DEL;
  1462. }
  1463. /*
  1464.  * Normal Key with modifier: Try to make a single byte code.
  1465.  */
  1466. if (!IS_SPECIAL(key))
  1467. {
  1468.     if ((modifiers & MOD_MASK_SHIFT) && isalpha(key))
  1469.     {
  1470. key = TO_UPPER(key);
  1471. modifiers &= ~MOD_MASK_SHIFT;
  1472.     }
  1473.     if ((modifiers & MOD_MASK_CTRL)
  1474.     && ((key >= '?' && key <= '_') || isalpha(key)))
  1475.     {
  1476. if (key == '?')
  1477.     key = DEL;
  1478. else
  1479.     key &= 0x1f;
  1480. modifiers &= ~MOD_MASK_CTRL;
  1481.     }
  1482.     if ((modifiers & MOD_MASK_ALT) && key < 0x80)
  1483.     {
  1484. key |= 0x80;
  1485. modifiers &= ~MOD_MASK_ALT;
  1486.     }
  1487. }
  1488. *modp = modifiers;
  1489. *srcp = end_of_name;
  1490. return key;
  1491.     }
  1492. }
  1493.     }
  1494.     return 0;
  1495. }
  1496. /*
  1497.  * Try to find key "c" in the special key table.
  1498.  * Return the index when found, -1 when not found.
  1499.  */
  1500.     int
  1501. find_special_key_in_table(c)
  1502.     int     c;
  1503. {
  1504.     int     i;
  1505.     for (i = 0; key_names_table[i].name != NULL; i++)
  1506. if (c == key_names_table[i].key)
  1507.     break;
  1508.     if (key_names_table[i].name == NULL)
  1509. i = -1;
  1510.     return i;
  1511. }
  1512. /*
  1513.  * Find the special key with the given name (the given string does not have to
  1514.  * end with NUL, the name is assumed to end before the first non-idchar).
  1515.  * If the name starts with "t_" the next two characters are interpreted as a
  1516.  * termcap name.
  1517.  * Return the key code, or 0 if not found.
  1518.  */
  1519.     int
  1520. get_special_key_code(name)
  1521.     char_u  *name;
  1522. {
  1523.     char_u  *table_name;
  1524.     char_u  string[3];
  1525.     int     i, j;
  1526.     /*
  1527.      * If it's <t_xx> we get the code for xx from the termcap
  1528.      */
  1529.     if (name[0] == 't' && name[1] == '_' && name[2] != NUL && name[3] != NUL)
  1530.     {
  1531. string[0] = name[2];
  1532. string[1] = name[3];
  1533. string[2] = NUL;
  1534. if (add_termcap_entry(string, FALSE) == OK)
  1535.     return TERMCAP2KEY(name[2], name[3]);
  1536.     }
  1537.     else
  1538. for (i = 0; key_names_table[i].name != NULL; i++)
  1539. {
  1540.     table_name = key_names_table[i].name;
  1541.     for (j = 0; vim_isIDc(name[j]) && table_name[j] != NUL; j++)
  1542. if (TO_LOWER(table_name[j]) != TO_LOWER(name[j]))
  1543.     break;
  1544.     if (!vim_isIDc(name[j]) && table_name[j] == NUL)
  1545. return key_names_table[i].key;
  1546. }
  1547.     return 0;
  1548. }
  1549.     char_u *
  1550. get_key_name(i)
  1551.     int     i;
  1552. {
  1553.     if (i >= KEY_NAMES_TABLE_LEN)
  1554. return NULL;
  1555.     return  key_names_table[i].name;
  1556. }
  1557. #ifdef USE_MOUSE
  1558. /*
  1559.  * Look up the given mouse code to return the relevant information in the other
  1560.  * arguments.  Return which button is down or was released.
  1561.  */
  1562.     int
  1563. get_mouse_button(code, is_click, is_drag)
  1564.     int     code;
  1565.     int     *is_click;
  1566.     int     *is_drag;
  1567. {
  1568.     int     i;
  1569.     for (i = 0; mouse_table[i].pseudo_code; i++)
  1570. if (code == mouse_table[i].pseudo_code)
  1571. {
  1572.     *is_click = mouse_table[i].is_click;
  1573.     *is_drag = mouse_table[i].is_drag;
  1574.     return mouse_table[i].button;
  1575. }
  1576.     return 0;     /* Shouldn't get here */
  1577. }
  1578. /*
  1579.  * Return the appropriate pseudo mouse event token (KE_LEFTMOUSE etc) based on
  1580.  * the given information about which mouse button is down, and whether the
  1581.  * mouse was clicked, dragged or released.
  1582.  */
  1583.     int
  1584. get_pseudo_mouse_code(button, is_click, is_drag)
  1585.     int     button; /* eg MOUSE_LEFT */
  1586.     int     is_click;
  1587.     int     is_drag;
  1588. {
  1589.     int     i;
  1590.     for (i = 0; mouse_table[i].pseudo_code; i++)
  1591. if (button == mouse_table[i].button
  1592.     && is_click == mouse_table[i].is_click
  1593.     && is_drag == mouse_table[i].is_drag)
  1594. {
  1595.     return mouse_table[i].pseudo_code;
  1596. }
  1597.     return (int)KE_IGNORE;     /* not recongnized, ignore it */
  1598. }
  1599. #endif /* USE_MOUSE */
  1600. /*
  1601.  * Return the current end-of-line type: EOL_DOS, EOL_UNIX or EOL_MAC.
  1602.  */
  1603.     int
  1604. get_fileformat(buf)
  1605.     BUF     *buf;
  1606. {
  1607.     int     c = *buf->b_p_ff;
  1608.     if (buf->b_p_bin || c == 'u')
  1609. return EOL_UNIX;
  1610.     if (c == 'm')
  1611. return EOL_MAC;
  1612.     return EOL_DOS;
  1613. }
  1614. /*
  1615.  * Set the current end-of-line type to EOL_DOS, EOL_UNIX or EOL_MAC.
  1616.  * Sets both 'textmode' and 'fileformat'.
  1617.  */
  1618.     void
  1619. set_fileformat(t)
  1620.     int t;
  1621. {
  1622.     switch (t)
  1623.     {
  1624.     case EOL_DOS:
  1625. set_string_option_direct((char_u *)"ff", -1, (char_u *)FF_DOS, TRUE);
  1626. curbuf->b_p_tx = TRUE;
  1627. break;
  1628.     case EOL_UNIX:
  1629. set_string_option_direct((char_u *)"ff", -1, (char_u *)FF_UNIX, TRUE);
  1630. curbuf->b_p_tx = FALSE;
  1631. break;
  1632.     case EOL_MAC:
  1633. set_string_option_direct((char_u *)"ff", -1, (char_u *)FF_MAC, TRUE);
  1634. curbuf->b_p_tx = FALSE;
  1635. break;
  1636.     }
  1637.     check_status(curbuf);
  1638. }
  1639. /*
  1640.  * Return the default fileformat from 'fileformats'.
  1641.  */
  1642.     int
  1643. default_fileformat()
  1644. {
  1645.     switch (*p_ffs)
  1646.     {
  1647. case 'm':   return EOL_MAC;
  1648. case 'd':   return EOL_DOS;
  1649.     }
  1650.     return EOL_UNIX;
  1651. }
  1652. /*
  1653.  * Call shell. Calls mch_call_shell, with 'shellxquote' added.
  1654.  */
  1655.     int
  1656. call_shell(cmd, opt)
  1657.     char_u *cmd;
  1658.     int opt;
  1659. {
  1660.     char_u *ncmd;
  1661. #ifdef USE_GUI_WIN32
  1662.     /* Don't hide the pointer while executing a shell command. */
  1663.     gui_mch_mousehide(FALSE);
  1664. #endif
  1665.     if (cmd == NULL || *p_sxq == NUL)
  1666. call_shell_retval = mch_call_shell(cmd, opt);
  1667.     else
  1668.     {
  1669. ncmd = alloc((unsigned)(STRLEN(cmd) + STRLEN(p_sxq) * 2 + 1));
  1670. if (ncmd != NULL)
  1671. {
  1672.     STRCPY(ncmd, p_sxq);
  1673.     STRCAT(ncmd, cmd);
  1674.     STRCAT(ncmd, p_sxq);
  1675.     call_shell_retval = mch_call_shell(ncmd, opt);
  1676.     vim_free(ncmd);
  1677. }
  1678. else
  1679.     call_shell_retval = -1;
  1680.     }
  1681.     return call_shell_retval;
  1682. }
  1683. /*
  1684.  * VISUAL and OP_PENDING State are never set, they are equal to NORMAL State
  1685.  * with a condition.  This function returns the real State.
  1686.  */
  1687.     int
  1688. get_real_state()
  1689. {
  1690.     if ((State & NORMAL))
  1691.     {
  1692. if (VIsual_active)
  1693.     return VISUAL;
  1694. else if (finish_op)
  1695.     return OP_PENDING;
  1696.     }
  1697.     return State;
  1698. }
  1699. /*
  1700.  * Change to a file's directory.
  1701.  */
  1702.     int
  1703. vim_chdirfile(fname)
  1704.     char_u *fname;
  1705. {
  1706.     char_u temp_string[MAXPATHL];
  1707.     char_u *p;
  1708.     char_u *t;
  1709.     STRCPY(temp_string, fname);
  1710.     p = get_past_head(temp_string);
  1711.     t = gettail(temp_string);
  1712.     while (t > p && vim_ispathsep(t[-1]))
  1713. --t;
  1714.     *t = NUL; /* chop off end of string */
  1715.     return mch_chdir((char *)temp_string);
  1716. }
  1717. #ifdef CURSOR_SHAPE
  1718. /*
  1719.  * Handling of cursor shapes in various modes.
  1720.  */
  1721. struct cursor_entry cursor_table[SHAPE_COUNT] =
  1722. {
  1723.     /* The values will be filled in from the guicursor' default when the GUI
  1724.      * starts. */
  1725.     {0, 0, 700L, 400L, 250L, 0, "n"},
  1726.     {0, 0, 700L, 400L, 250L, 0, "v"},
  1727.     {0, 0, 700L, 400L, 250L, 0, "i"},
  1728.     {0, 0, 700L, 400L, 250L, 0, "r"},
  1729.     {0, 0, 700L, 400L, 250L, 0, "c"},
  1730.     {0, 0, 700L, 400L, 250L, 0, "ci"},
  1731.     {0, 0, 700L, 400L, 250L, 0, "cr"},
  1732.     {0, 0, 100L, 100L, 100L, 0, "sm"},
  1733.     {0, 0, 700L, 400L, 250L, 0, "o"},
  1734.     {0, 0, 700L, 400L, 250L, 0, "ve"}
  1735. };
  1736. /*
  1737.  * Parse the 'guicursor' option.
  1738.  * Returns error message for an illegal option, NULL otherwise.
  1739.  */
  1740.     char_u *
  1741. parse_guicursor()
  1742. {
  1743.     char_u *modep;
  1744.     char_u *colonp;
  1745.     char_u *commap;
  1746.     char_u *p, *endp;
  1747.     int idx = 0; /* init for GCC */
  1748.     int all_idx;
  1749.     int len;
  1750.     int i;
  1751.     long n;
  1752.     int found_ve = FALSE; /* found "ve" flag */
  1753.     /*
  1754.      * Repeat for all comma separated parts.
  1755.      */
  1756.     modep = p_guicursor;
  1757.     while (*modep)
  1758.     {
  1759. colonp = vim_strchr(modep, ':');
  1760. if (colonp == NULL)
  1761.     return (char_u *)"Missing colon";
  1762. commap = vim_strchr(modep, ',');
  1763. /*
  1764.  * Repeat for all mode's before the colon.
  1765.  * For the 'a' mode, we loop to handle all the modes.
  1766.  */
  1767. all_idx = -1;
  1768. while (modep < colonp || all_idx >= 0)
  1769. {
  1770.     if (all_idx < 0)
  1771.     {
  1772. /* Find the mode. */
  1773. if (modep[1] == '-' || modep[1] == ':')
  1774.     len = 1;
  1775. else
  1776.     len = 2;
  1777. if (len == 1 && TO_LOWER(modep[0]) == 'a')
  1778.     all_idx = SHAPE_COUNT - 1;
  1779. else
  1780. {
  1781.     for (idx = 0; idx < SHAPE_COUNT; ++idx)
  1782. if (STRNICMP(modep, cursor_table[idx].name, len) == 0)
  1783.     break;
  1784.     if (idx == SHAPE_COUNT)
  1785. return (char_u *)"Illegal mode";
  1786.     if (len == 2 && modep[0] == 'v' && modep[1] == 'e')
  1787. found_ve = TRUE;
  1788. }
  1789. modep += len + 1;
  1790.     }
  1791.     if (all_idx >= 0)
  1792. idx = all_idx--;
  1793.     else
  1794.     {
  1795. /* Set the defaults, for the missing parts */
  1796. cursor_table[idx].shape = SHAPE_BLOCK;
  1797. cursor_table[idx].blinkwait = 700L;
  1798. cursor_table[idx].blinkon = 400L;
  1799. cursor_table[idx].blinkoff = 250L;
  1800.     }
  1801.     /* Parse the part after the colon */
  1802.     for (p = colonp + 1; *p && *p != ','; )
  1803.     {
  1804. /*
  1805.  * First handle the ones with a number argument.
  1806.  */
  1807. i = *p;
  1808. len = 0;
  1809. if (STRNICMP(p, "ver", 3) == 0)
  1810.     len = 3;
  1811. else if (STRNICMP(p, "hor", 3) == 0)
  1812.     len = 3;
  1813. else if (STRNICMP(p, "blinkwait", 9) == 0)
  1814.     len = 9;
  1815. else if (STRNICMP(p, "blinkon", 7) == 0)
  1816.     len = 7;
  1817. else if (STRNICMP(p, "blinkoff", 8) == 0)
  1818.     len = 8;
  1819. if (len)
  1820. {
  1821.     p += len;
  1822.     if (!isdigit(*p))
  1823. return (char_u *)"digit expected";
  1824.     n = getdigits(&p);
  1825.     if (len == 3)   /* "ver" or "hor" */
  1826.     {
  1827. if (n == 0)
  1828.     return (char_u *)"Illegal percentage";
  1829. if (TO_LOWER(i) == 'v')
  1830.     cursor_table[idx].shape = SHAPE_VER;
  1831. else
  1832.     cursor_table[idx].shape = SHAPE_HOR;
  1833. cursor_table[idx].percentage = n;
  1834.     }
  1835.     else if (len == 9)
  1836. cursor_table[idx].blinkwait = n;
  1837.     else if (len == 7)
  1838. cursor_table[idx].blinkon = n;
  1839.     else
  1840. cursor_table[idx].blinkoff = n;
  1841. }
  1842. else if (STRNICMP(p, "block", 5) == 0)
  1843. {
  1844.     cursor_table[idx].shape = SHAPE_BLOCK;
  1845.     p += 5;
  1846. }
  1847. else /* must be a highlight group name then */
  1848. {
  1849.     endp = vim_strchr(p, '-');
  1850.     if (commap == NULL)     /* last part */
  1851.     {
  1852. if (endp == NULL)
  1853.     endp = p + STRLEN(p);   /* find end of part */
  1854.     }
  1855.     else if (endp > commap || endp == NULL)
  1856. endp = commap;
  1857.     cursor_table[idx].id = syn_check_group(p, (int)(endp - p));
  1858.     p = endp;
  1859. }
  1860. if (*p == '-')
  1861.     ++p;
  1862.     }
  1863. }
  1864. modep = p;
  1865. if (*modep == ',')
  1866.     ++modep;
  1867.     }
  1868.     /* If the 's' flag is not given, use the 'v' cursor for 's' */
  1869.     if (!found_ve)
  1870.     {
  1871. cursor_table[SHAPE_VE].shape = cursor_table[SHAPE_V].shape;
  1872. cursor_table[SHAPE_VE].percentage = cursor_table[SHAPE_V].percentage;
  1873. cursor_table[SHAPE_VE].blinkwait = cursor_table[SHAPE_V].blinkwait;
  1874. cursor_table[SHAPE_VE].blinkon = cursor_table[SHAPE_V].blinkon;
  1875. cursor_table[SHAPE_VE].blinkoff = cursor_table[SHAPE_V].blinkoff;
  1876. cursor_table[SHAPE_VE].id = cursor_table[SHAPE_V].id;
  1877.     }
  1878.     return NULL;
  1879. }
  1880. /*
  1881.  * Return the index into cursor_table[] for the current mode.
  1882.  */
  1883.     int
  1884. get_cursor_idx()
  1885. {
  1886.     if (State == SHOWMATCH)
  1887. return SHAPE_SM;
  1888.     if (State == INSERT)
  1889. return SHAPE_I;
  1890.     if (State == REPLACE)
  1891. return SHAPE_R;
  1892.     if (State == CMDLINE)
  1893.     {
  1894. if (cmdline_at_end())
  1895.     return SHAPE_C;
  1896. if (cmdline_overstrike())
  1897.     return SHAPE_CR;
  1898. return SHAPE_CI;
  1899.     }
  1900.     if (finish_op)
  1901. return SHAPE_O;
  1902.     if (VIsual_active)
  1903.     {
  1904. if (*p_sel == 'e')
  1905.     return SHAPE_VE;
  1906. else
  1907.     return SHAPE_V;
  1908.     }
  1909.     return SHAPE_N;
  1910. }
  1911. #endif /* CURSOR_SHAPE */