www.pudn.com > vim53src.zip > multbyte.c
/* vi:set ts=8 sts=4 sw=4: * * VIM - Vi IMproved by Bram Moolenaar * Multibyte extensions by Sung-Hoon Baek * * Do ":help uganda" in Vim to read copying and usage conditions. * Do ":help credits" in Vim to see a list of people who contributed. */ /* * file : multbyte.c */ #include "vim.h" #include "globals.h" #include "proto.h" #include "option.h" #ifdef WIN32 # include# include #endif #if defined(MULTI_BYTE) || defined(PROTO) /* * Is 'c' a lead byte of multi-byte character? */ int IsLeadByte(c) int c; { #ifdef WIN32 /* is_dbcs is set by setting 'fileencoding'. It becomes a Windows * CodePage identifier, which we can pass directly in to Windows API*/ return IsDBCSLeadByteEx(is_dbcs, (BYTE)c); #else return (c & 0x80); #endif } /* * Is *p a trail byte of multi-byte character? base : string pointer to line */ int IsTrailByte(base, p) char_u *base; char_u *p; { int lbc = 0; /* lead byte count*/ if (base >= p) return 0; while (p > base) { if (!IsLeadByte(*(--p))) break; lbc++; } return (lbc & 1); } /* * if the cursor moves on an trail byte, set the cursor on the lead byte. */ int AdjustCursorForMultiByteCharacter() { char_u *p; if (curwin->w_cursor.col > 0 ) { p = ml_get(curwin->w_cursor.lnum); if (IsTrailByte(p, p + curwin->w_cursor.col)) { --curwin->w_cursor.col; return 1; } } return 0; } /* * count the length of the str which has multi-byte characters. two-byte * character counts as one character. */ int MultiStrLen(str) char_u *str; { int count; if (str == NULL) return 0; for (count = 0; *str != NUL; count++) { if (IsLeadByte(*str)) { str++; if (*str != NUL) str++; } else str++; } return count; } int han_dec(lp) FPOS *lp; { char_u *p = ml_get(lp->lnum); if (lp->col > 0) { /* still within line */ lp->col--; if ( lp->col > 0 && IsTrailByte(p, p + lp->col)) lp->col--; return 0; } if (lp->lnum > 1) { /* there is a prior line */ lp->lnum--; lp->col = STRLEN(ml_get(lp->lnum)); if ( lp->col > 0 && IsTrailByte(p, p + lp->col)) lp->col--; return 1; } return -1; /* at start of file */ } #endif /* MULTI_BYTE */