merge m17n patch
add libwc
This commit is contained in:
238
linein.c
238
linein.c
@@ -1,4 +1,4 @@
|
||||
/* $Id: linein.c,v 1.31 2003/04/14 16:19:28 ukai Exp $ */
|
||||
/* $Id: linein.c,v 1.32 2003/09/22 21:02:19 ukai Exp $ */
|
||||
#include "fm.h"
|
||||
#include "local.h"
|
||||
#include "myctype.h"
|
||||
@@ -75,9 +75,10 @@ static int move_word;
|
||||
static Hist *CurrentHist;
|
||||
static Str strCurrentBuf;
|
||||
static int use_hist;
|
||||
#ifdef JP_CHARSET
|
||||
static int in_kanji;
|
||||
static void ins_kanji(Str tmp);
|
||||
#ifdef USE_M17N
|
||||
static void ins_char(Str str);
|
||||
#else
|
||||
static void ins_char(char c);
|
||||
#endif
|
||||
|
||||
char *
|
||||
@@ -87,15 +88,10 @@ inputLineHistSearch(char *prompt, char *def_str, int flag, Hist *hist,
|
||||
int opos, x, y, lpos, rpos, epos;
|
||||
unsigned char c;
|
||||
char *p;
|
||||
Lineprop mode;
|
||||
#ifdef JP_CHARSET
|
||||
Str tmp = Strnew();
|
||||
#endif /* JP_CHARSET */
|
||||
|
||||
mode = PC_ASCII;
|
||||
#ifdef JP_CHARSET
|
||||
in_kanji = FALSE;
|
||||
#ifdef USE_M17N
|
||||
Str tmp;
|
||||
#endif
|
||||
|
||||
is_passwd = FALSE;
|
||||
move_word = TRUE;
|
||||
|
||||
@@ -122,7 +118,7 @@ inputLineHistSearch(char *prompt, char *def_str, int flag, Hist *hist,
|
||||
cm_mode = CPL_ON;
|
||||
else
|
||||
cm_mode = CPL_OFF;
|
||||
opos = strlen(prompt);
|
||||
opos = get_strwidth(prompt);
|
||||
epos = CLEN - opos;
|
||||
if (epos < 0)
|
||||
epos = 0;
|
||||
@@ -148,6 +144,10 @@ inputLineHistSearch(char *prompt, char *def_str, int flag, Hist *hist,
|
||||
cm_next = FALSE;
|
||||
cm_disp_next = -1;
|
||||
need_redraw = FALSE;
|
||||
|
||||
#ifdef USE_M17N
|
||||
wc_char_conv_init(wc_guess_8bit_charset(DisplayCharset), InnerCharset);
|
||||
#endif
|
||||
do {
|
||||
x = calcPosition(strBuf->ptr, strProp, CLen, CPos, 0, CP_FORCE);
|
||||
if (x - rpos > offset) {
|
||||
@@ -183,21 +183,6 @@ inputLineHistSearch(char *prompt, char *def_str, int flag, Hist *hist,
|
||||
#endif
|
||||
cm_clear = TRUE;
|
||||
cm_disp_clear = TRUE;
|
||||
#ifdef JP_CHARSET
|
||||
if (mode == PC_KANJI1) {
|
||||
mode = PC_KANJI2;
|
||||
if (CLen >= STR_LEN)
|
||||
goto next_char;
|
||||
Strcat_char(tmp, (c | (DisplayCode == CODE_SJIS ? 0 : 0x80)));
|
||||
tmp = conv_str(tmp,
|
||||
(DisplayCode == CODE_SJIS ? CODE_SJIS : CODE_EUC),
|
||||
InnerCode);
|
||||
ins_kanji(tmp);
|
||||
if (incrfunc)
|
||||
incrfunc(-1, strBuf, strProp);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
if (!i_quote &&
|
||||
(((cm_mode & CPL_ALWAYS) && (c == CTRL_I || c == ' ')) ||
|
||||
((cm_mode & CPL_ON) && (c == CTRL_I)))) {
|
||||
@@ -233,31 +218,23 @@ inputLineHistSearch(char *prompt, char *def_str, int flag, Hist *hist,
|
||||
if (cm_disp_clear)
|
||||
cm_disp_next = -1;
|
||||
}
|
||||
#ifdef JP_CHARSET
|
||||
else if (DisplayCode == CODE_SJIS && 0xa0 <= c && c <= 0xdf) {
|
||||
i_quote = FALSE;
|
||||
cm_next = FALSE;
|
||||
if (CLen >= STR_LEN)
|
||||
#ifdef USE_M17N
|
||||
else {
|
||||
tmp = wc_char_conv(c);
|
||||
if (tmp == NULL) {
|
||||
i_quote = TRUE;
|
||||
goto next_char;
|
||||
Strclear(tmp);
|
||||
Strcat_char(tmp, c);
|
||||
tmp = conv_str(tmp, DisplayCode, InnerCode);
|
||||
ins_kanji(tmp);
|
||||
if (incrfunc)
|
||||
incrfunc(-1, strBuf, strProp);
|
||||
}
|
||||
else if ((c & 0x80) || in_kanji) { /* Kanji 1 */
|
||||
}
|
||||
i_quote = FALSE;
|
||||
cm_next = FALSE;
|
||||
cm_disp_next = -1;
|
||||
if (CLen >= STR_LEN - 1)
|
||||
if (CLen + tmp->length > STR_LEN || !tmp->length)
|
||||
goto next_char;
|
||||
Strclear(tmp);
|
||||
Strcat_char(tmp, (c | 0x80));
|
||||
mode = PC_KANJI1;
|
||||
goto next_char;
|
||||
ins_char(tmp);
|
||||
if (incrfunc)
|
||||
incrfunc(-1, strBuf, strProp);
|
||||
}
|
||||
#endif /* JP_CHARSET */
|
||||
#else
|
||||
else {
|
||||
i_quote = FALSE;
|
||||
cm_next = FALSE;
|
||||
@@ -266,15 +243,15 @@ inputLineHistSearch(char *prompt, char *def_str, int flag, Hist *hist,
|
||||
goto next_char;
|
||||
insC();
|
||||
strBuf->ptr[CPos] = c;
|
||||
if (!is_passwd && IS_CNTRL(c))
|
||||
if (!is_passwd && get_mctype(&c) == PC_CTRL)
|
||||
strProp[CPos] = PC_CTRL;
|
||||
else
|
||||
strProp[CPos] = PC_ASCII;
|
||||
CPos++;
|
||||
mode = PC_ASCII;
|
||||
if (incrfunc)
|
||||
incrfunc(-1, strBuf, strProp);
|
||||
}
|
||||
#endif
|
||||
if (CLen && (flag & IN_CHAR))
|
||||
break;
|
||||
} while (i_cont);
|
||||
@@ -366,8 +343,8 @@ addStr(char *p, Lineprop *pr, int len, int offset, int limit)
|
||||
}
|
||||
if (i >= len)
|
||||
return;
|
||||
#ifdef JP_CHARSET
|
||||
while (pr[i] == PC_KANJI2)
|
||||
#ifdef USE_M17N
|
||||
while (pr[i] & PC_WCHAR2)
|
||||
i++;
|
||||
#endif
|
||||
addChar('{', 0);
|
||||
@@ -377,11 +354,8 @@ addStr(char *p, Lineprop *pr, int len, int offset, int limit)
|
||||
addChar(' ', 0);
|
||||
}
|
||||
for (; i < len; i += delta) {
|
||||
#ifdef JP_CHARSET
|
||||
if (CharType(pr[i]) == PC_KANJI1)
|
||||
delta = 2;
|
||||
else
|
||||
delta = 1;
|
||||
#ifdef USE_M17N
|
||||
delta = wtf_len((wc_uchar *) & p[i]);
|
||||
#endif
|
||||
ncol = calcPosition(p, pr, len, i + delta, 0, CP_AUTO);
|
||||
if (ncol - offset > limit)
|
||||
@@ -390,33 +364,51 @@ addStr(char *p, Lineprop *pr, int len, int offset, int limit)
|
||||
for (; rcol < ncol; rcol++)
|
||||
addChar(' ', 0);
|
||||
continue;
|
||||
#ifdef JP_CHARSET
|
||||
}
|
||||
else if (delta == 2) {
|
||||
else {
|
||||
#ifdef USE_M17N
|
||||
addMChar(&p[i], pr[i], delta);
|
||||
#else
|
||||
addChar(p[i], pr[i]);
|
||||
addChar(p[i + 1], pr[i + 1]);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
addChar(p[i], pr[i]);
|
||||
rcol = ncol;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef JP_CHARSET
|
||||
#ifdef USE_M17N
|
||||
static void
|
||||
ins_kanji(Str tmp)
|
||||
ins_char(Str str)
|
||||
{
|
||||
if (tmp->length != 2)
|
||||
char *p = str->ptr, *ep = p + str->length;
|
||||
Lineprop ctype;
|
||||
int len;
|
||||
|
||||
if (CLen + str->length >= STR_LEN)
|
||||
return;
|
||||
insC();
|
||||
strBuf->ptr[CPos] = tmp->ptr[0];
|
||||
strProp[CPos] = PC_KANJI1;
|
||||
CPos++;
|
||||
insC();
|
||||
strBuf->ptr[CPos] = tmp->ptr[1];
|
||||
strProp[CPos] = PC_KANJI2;
|
||||
CPos++;
|
||||
while (p < ep) {
|
||||
len = get_mclen(p);
|
||||
ctype = get_mctype(p);
|
||||
if (is_passwd) {
|
||||
if (ctype & PC_CTRL)
|
||||
ctype = PC_ASCII;
|
||||
if (ctype & PC_UNKNOWN)
|
||||
ctype = PC_WCHAR1;
|
||||
}
|
||||
insC();
|
||||
strBuf->ptr[CPos] = *(p++);
|
||||
strProp[CPos] = ctype;
|
||||
CPos++;
|
||||
if (--len) {
|
||||
ctype = (ctype & ~PC_WCHAR1) | PC_WCHAR2;
|
||||
while (len--) {
|
||||
insC();
|
||||
strBuf->ptr[CPos] = *(p++);
|
||||
strProp[CPos] = ctype;
|
||||
CPos++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -424,9 +416,6 @@ static void
|
||||
_esc(void)
|
||||
{
|
||||
char c;
|
||||
#ifdef JP_CHARSET
|
||||
char c2;
|
||||
#endif
|
||||
|
||||
switch (c = getch()) {
|
||||
case '[':
|
||||
@@ -473,17 +462,10 @@ _esc(void)
|
||||
if (emacs_like_lineedit)
|
||||
_bsw();
|
||||
break;
|
||||
#ifdef JP_CHARSET
|
||||
case '$':
|
||||
/* ISO-2022-jp characters */
|
||||
c2 = getch();
|
||||
in_kanji = TRUE;
|
||||
break;
|
||||
case '(':
|
||||
/* ISO-2022-jp characters */
|
||||
c2 = getch();
|
||||
in_kanji = FALSE;
|
||||
break;
|
||||
#ifdef USE_M17N
|
||||
default:
|
||||
if (wc_char_conv(ESC_CODE) == NULL && wc_char_conv(c) == NULL)
|
||||
i_quote = TRUE;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -508,10 +490,10 @@ delC(void)
|
||||
|
||||
if (CLen == CPos)
|
||||
return;
|
||||
#ifdef JP_CHARSET
|
||||
if (strProp[i] == PC_KANJI1)
|
||||
delta = 2;
|
||||
#endif /* JP_CHARSET */
|
||||
#ifdef USE_M17N
|
||||
while (i + delta < CLen && strProp[i + delta] & PC_WCHAR2)
|
||||
delta++;
|
||||
#endif
|
||||
for (i = CPos; i < CLen; i++) {
|
||||
strProp[i] = strProp[i + delta];
|
||||
}
|
||||
@@ -524,10 +506,10 @@ _mvL(void)
|
||||
{
|
||||
if (CPos > 0)
|
||||
CPos--;
|
||||
#ifdef JP_CHARSET
|
||||
if (strProp[CPos] == PC_KANJI2)
|
||||
#ifdef USE_M17N
|
||||
while (CPos > 0 && strProp[CPos] & PC_WCHAR2)
|
||||
CPos--;
|
||||
#endif /* JP_CHARSET */
|
||||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -537,10 +519,10 @@ _mvLw(void)
|
||||
while (CPos > 0 && (first || !terminated(strBuf->ptr[CPos - 1]))) {
|
||||
CPos--;
|
||||
first = 0;
|
||||
#ifdef JP_CHARSET
|
||||
if (strProp[CPos] == PC_KANJI2)
|
||||
#ifdef USE_M17N
|
||||
if (CPos > 0 && strProp[CPos] & PC_WCHAR2)
|
||||
CPos--;
|
||||
#endif /* JP_CHARSET */
|
||||
#endif
|
||||
if (!move_word)
|
||||
break;
|
||||
}
|
||||
@@ -553,10 +535,10 @@ _mvRw(void)
|
||||
while (CPos < CLen && (first || !terminated(strBuf->ptr[CPos - 1]))) {
|
||||
CPos++;
|
||||
first = 0;
|
||||
#ifdef JP_CHARSET
|
||||
if (strProp[CPos] == PC_KANJI2)
|
||||
#ifdef USE_M17N
|
||||
if (CPos < CLen && strProp[CPos] & PC_WCHAR2)
|
||||
CPos++;
|
||||
#endif /* JP_CHARSET */
|
||||
#endif
|
||||
if (!move_word)
|
||||
break;
|
||||
}
|
||||
@@ -567,10 +549,10 @@ _mvR(void)
|
||||
{
|
||||
if (CPos < CLen)
|
||||
CPos++;
|
||||
#ifdef JP_CHARSET
|
||||
if (strProp[CPos] == PC_KANJI2)
|
||||
#ifdef USE_M17N
|
||||
while (CPos < CLen && strProp[CPos] & PC_WCHAR2)
|
||||
CPos++;
|
||||
#endif /* JP_CHARSET */
|
||||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -745,7 +727,6 @@ next_dcompl(int next)
|
||||
cm_disp_clear = FALSE;
|
||||
if (CurrentTab)
|
||||
displayBuffer(Currentbuf, B_FORCE_REDRAW);
|
||||
|
||||
if (LASTLINE >= 3) {
|
||||
comment = TRUE;
|
||||
nline = LASTLINE - 2;
|
||||
@@ -757,6 +738,7 @@ next_dcompl(int next)
|
||||
else {
|
||||
return;
|
||||
}
|
||||
|
||||
if (cm_disp_next >= 0) {
|
||||
if (next == 1) {
|
||||
cm_disp_next += col * nline;
|
||||
@@ -1000,14 +982,9 @@ doComplete(Str ifn, int *status, int next)
|
||||
*status = CPL_MENU;
|
||||
}
|
||||
CompleteBuf = Strdup(CDirBuf);
|
||||
if (CompleteBuf->length == 0)
|
||||
Strcat(CompleteBuf, CFileName);
|
||||
else if (Strlastchar(CompleteBuf) == '/')
|
||||
Strcat(CompleteBuf, CFileName);
|
||||
else {
|
||||
if (CompleteBuf->length && Strlastchar(CompleteBuf) != '/')
|
||||
Strcat_char(CompleteBuf, '/');
|
||||
Strcat(CompleteBuf, CFileName);
|
||||
}
|
||||
Strcat(CompleteBuf, CFileName);
|
||||
if (*status != CPL_AMBIG) {
|
||||
p = CompleteBuf->ptr;
|
||||
if (cm_mode & CPL_URL) {
|
||||
@@ -1080,22 +1057,35 @@ static int
|
||||
setStrType(Str str, Lineprop *prop)
|
||||
{
|
||||
Lineprop ctype;
|
||||
int i = 0, delta;
|
||||
char *s = str->ptr;
|
||||
char *p = str->ptr, *ep = p + str->length;
|
||||
int i, len = 1;
|
||||
|
||||
for (; *s != '\0' && i < STR_LEN; s += delta, i += delta) {
|
||||
ctype = get_mctype(s);
|
||||
if (is_passwd && ctype & PC_CTRL)
|
||||
ctype = PC_ASCII;
|
||||
delta = get_mclen(ctype);
|
||||
#ifdef JP_CHARSET
|
||||
if (ctype == PC_KANJI) {
|
||||
prop[i] = PC_KANJI1;
|
||||
prop[i + 1] = PC_KANJI2;
|
||||
}
|
||||
else
|
||||
for (i = 0; p < ep;) {
|
||||
#ifdef USE_M17N
|
||||
len = get_mclen(p);
|
||||
#endif
|
||||
if (i + len > STR_LEN)
|
||||
break;
|
||||
ctype = get_mctype(p);
|
||||
if (is_passwd) {
|
||||
if (ctype & PC_CTRL)
|
||||
ctype = PC_ASCII;
|
||||
#ifdef USE_M17N
|
||||
if (ctype & PC_UNKNOWN)
|
||||
ctype = PC_WCHAR1;
|
||||
#endif
|
||||
}
|
||||
prop[i++] = ctype;
|
||||
#ifdef USE_M17N
|
||||
p += len;
|
||||
if (--len) {
|
||||
ctype = (ctype & ~PC_WCHAR1) | PC_WCHAR2;
|
||||
while (len--)
|
||||
prop[i++] = ctype;
|
||||
}
|
||||
#else
|
||||
p++;
|
||||
#endif
|
||||
prop[i] = ctype;
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
Reference in New Issue
Block a user