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

编辑器/阅读器

开发平台:

DOS

  1. /* vi:set ts=8 sts=4 sw=4:
  2.  *
  3.  * VIM - Vi IMproved by Bram Moolenaar
  4.  * Multibyte extensions by Sung-Hoon Baek
  5.  *
  6.  * Do ":help uganda"  in Vim to read copying and usage conditions.
  7.  * Do ":help credits" in Vim to see a list of people who contributed.
  8.  */
  9. /*
  10.  * file : multbyte.c
  11.  */
  12. #include "vim.h"
  13. #include "globals.h"
  14. #include "proto.h"
  15. #include "option.h"
  16. #ifdef WIN32
  17. # include <windows.h>
  18. # include <winnls.h>
  19. #endif
  20. #if defined(MULTI_BYTE) || defined(PROTO)
  21. /*
  22.  * Is 'c' a lead byte of multi-byte character?
  23.  */
  24.     int
  25. IsLeadByte(c)
  26.     int c;
  27. {
  28. #ifdef WIN32
  29.     /* is_dbcs is set by setting 'fileencoding'.  It becomes a Windows
  30.      * CodePage identifier, which we can pass directly in to Windows API*/
  31.     return IsDBCSLeadByteEx(is_dbcs, (BYTE)c);
  32. #else
  33.     return (c & 0x80);
  34. #endif
  35. }
  36. /*
  37.  * Is *p a trail byte of multi-byte character?  base : string pointer to line
  38.  */
  39.     int
  40. IsTrailByte(base, p)
  41.     char_u *base;
  42.     char_u *p;
  43. {
  44.     int lbc = 0;    /* lead byte count*/
  45.     if (base >= p)
  46. return 0;
  47.     while (p > base)
  48.     {
  49. if (!IsLeadByte(*(--p)))
  50.     break;
  51. lbc++;
  52.     }
  53.     return (lbc & 1);
  54. }
  55. /*
  56.  * if the cursor moves on an trail byte, set the cursor on the lead byte.
  57.  */
  58.     int
  59. AdjustCursorForMultiByteCharacter()
  60. {
  61.     char_u *p;
  62.     if (curwin->w_cursor.col > 0 )
  63.     {
  64. p = ml_get(curwin->w_cursor.lnum);
  65. if (IsTrailByte(p, p + curwin->w_cursor.col))
  66. {
  67.     --curwin->w_cursor.col;
  68.     return 1;
  69. }
  70.     }
  71.     return 0;
  72. }
  73. /*
  74.  * count the length of the str which has multi-byte characters.  two-byte
  75.  * character counts as one character.
  76.  */
  77.     int
  78. MultiStrLen(str)
  79.     char_u *str;
  80. {
  81.     int count;
  82.     if (str == NULL)
  83. return 0;
  84.     for (count = 0; *str != NUL; count++)
  85.     {
  86. if (IsLeadByte(*str))
  87. {
  88.     str++;
  89.     if (*str != NUL)
  90. str++;
  91. }
  92. else
  93.     str++;
  94.     }
  95.     return count;
  96. }
  97.     int
  98. han_dec(lp)
  99.     FPOS  *lp;
  100. {
  101.     char_u *p = ml_get(lp->lnum);
  102.     if (lp->col > 0)
  103.     { /* still within line */
  104. lp->col--;
  105. if ( lp->col > 0 && IsTrailByte(p, p + lp->col))
  106.     lp->col--;
  107. return 0;
  108.     }
  109.     if (lp->lnum > 1)
  110.     { /* there is a prior line */
  111. lp->lnum--;
  112. lp->col = STRLEN(ml_get(lp->lnum));
  113. if ( lp->col > 0 && IsTrailByte(p, p + lp->col))
  114.     lp->col--;
  115. return 1;
  116.     }
  117.     return -1; /* at start of file */
  118. }
  119. #endif /* MULTI_BYTE */