/* vi:ts=4:sw=4 * * VIM - Vi IMproved * * Code Contributions By: Bram Moolenaar mool@oce.nl * Tim Thompson twitch!tjt * Tony Andrews onecom!wldrdg!tony * G. R. (Fred) Walter watmath!watcgl!grwalter */ #include "vim.h" #include "globals.h" #include "proto.h" #include "param.h" #ifdef JP #include "jp.h" #endif char * transchar(c) unsigned c; { static char buf[3]; if (c < ' ') { if (c == NL) c = NUL; /* we use newline in place of a NUL */ buf[0] = '^'; buf[1] = '@' + c; buf[2] = NUL; } else if (c <= '~' || c > 0xa0 || p_gr) { buf[0] = c; buf[1] = NUL; } else { if (c == 0x7f) /* DEL displayed as ^?, not ~? */ buf[0] = '^'; else buf[0] = '~'; buf[1] = c - 0x80 + '@'; buf[2] = NUL; } return buf; } /* * output 'len' characters in 'str' (including NULs) with translation * if 'len' is -1, output upto a NUL character * return the number of characters it takes on the screen */ int outtrans(str, len) register char *str; register int len; { int retval = 0; #ifdef JP int kanji = FALSE; static int kinlen, koutlen; static char kcode = NUL, *kin, *kout; if (kcode != JP_DISP) { kcode = JP_DISP; kin = kanjiin(JP_DISP); kout= kanjiout(JP_DISP); kinlen = strlen(kin); koutlen= strlen(kout); } #endif if (len == -1) len = strlen(str); #ifndef JP while (--len >= 0) { outstrn(transchar(*(u_char *)str)); retval += charsize(*(u_char *)str); ++str; } #else while (--len >= 0) { if (IsKanji(*str) && kcode != JP_NONE) { char k1, k2; if (!kanji) { outstrn(kin); kanji = TRUE; char_count -= kinlen; } k1 = *str; k2 = *(str + 1); kanjito(&k1, &k2, kcode); outchar(k1); outchar(k2); retval += 2; str += 2; len--; } else { if (kanji) { outstrn(kout); kanji = FALSE; char_count -= koutlen; } outstrn(transchar(*(u_char *)str)); retval += charsize(*(u_char *)str); ++str; } } if (kanji) { outstrn(kout); kanji = FALSE; char_count -= koutlen; } #endif return retval; } /* * return the number of characters 'c' will take on the screen */ int charsize(c) int c; { #ifdef JP if (IsKanji(c)) return (c & 0x60 ? 1 : 2); else #endif return ((c >= ' ' && (p_gr || c <= '~')) || c > 0xa0 ? 1 : 2); } /* * return the number of characters string 's' will take on the screen */ int strsize(s) char *s; { int len = 0; while (*s) len += charsize(*s++); return len; } /* * return the number of characters 'c' will take on the screen, taking * into account the size of a tab */ int chartabsize(c, col) register int c; int col; { if ((c >= ' ' && (c <= '~' || p_gr)) || c > 0xa0) return 1; else if (c == TAB && !p_list) return (int)(p_ts - (col % p_ts)); #ifdef JP else if (IsKanji(c)) return (int)(col == Columns)? 0 : 1; #endif else return 2; } /* * return TRUE if 'c' is an identifier character */ int isidchar(c) u_char c; { #ifdef __STDC__ return (isalnum(c) || c == '_'); #else return (isalpha(c) || isdigit(c) || c == '_'); #endif }