840 lines
16 KiB
C
840 lines
16 KiB
C
/*
|
|
* Copyright (c) 1994 Sony Corporation
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining
|
|
* a copy of this software and associated documentation files (the
|
|
* "Software"), to deal in the Software without restriction, including
|
|
* without limitation the rights to use, copy, modify, merge, publish,
|
|
* distribute, sublicense, and/or sell copies of the Software, and to
|
|
* permit persons to whom the Software is furnished to do so, subject to
|
|
* the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be
|
|
* included in all copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
* IN NO EVENT SHALL SONY CORPORATION BE LIABLE FOR ANY CLAIM,
|
|
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
|
|
* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
*
|
|
* Except as contained in this notice, the name of Sony Corporation
|
|
* shall not be used in advertising or otherwise to promote the sale, use
|
|
* or other dealings in this Software without prior written authorization
|
|
* from Sony Corporation.
|
|
*
|
|
*/
|
|
|
|
#include "common.h"
|
|
#include "key.h"
|
|
|
|
void Chain();
|
|
|
|
static wchar16_t* jpoint;
|
|
static int iedit, jedit;
|
|
static int ilen, jlen;
|
|
|
|
push_obj(i, j) int i, j;
|
|
{
|
|
Conversion* cv;
|
|
|
|
cv = GetConversion();
|
|
jpoint = cv->Ppoint[j];
|
|
ilen = cv->Plen[i];
|
|
jlen = cv->Plen[j];
|
|
iedit = cv->Bkettei[i];
|
|
jedit = cv->Bkettei[j];
|
|
}
|
|
|
|
pop_obj(i, j) int i, j;
|
|
{
|
|
Conversion* cv;
|
|
|
|
cv = GetConversion();
|
|
cv->Ppoint[j] = jpoint;
|
|
cv->Plen[i] = ilen;
|
|
cv->Plen[j] = jlen;
|
|
cv->Bkettei[i] = iedit;
|
|
cv->Bkettei[j] = jedit;
|
|
}
|
|
|
|
Bbig() {
|
|
Conversion* cv;
|
|
int i, j, k;
|
|
int moji, last, val;
|
|
|
|
cv = GetConversion();
|
|
if(cv->CurBun < 0)
|
|
cv->CurBun = 0;
|
|
i = cv->CurBun;
|
|
j = i + 1;
|
|
while(j < cv->Bnum) {
|
|
if(cv->Plen[j] > 0) {
|
|
push_obj(i, j);
|
|
|
|
k = cv->Ppoint[j] - cv->Ppoint[0];
|
|
last = k + cv->Plen[j];
|
|
moji = 0;
|
|
for(; k < last; k++) {
|
|
if(k < last - 1 && (cv->out_mode[k + 1] & OMODE_ZEN)) {
|
|
moji += 2;
|
|
k++;
|
|
} else
|
|
moji++;
|
|
if(cv->out_mode[k + 1] & OMODE_MASK)
|
|
break;
|
|
}
|
|
cv->Plen[i] += moji;
|
|
cv->Plen[j] -= moji;
|
|
cv->Ppoint[j] = cv->Ppoint[i] + cv->Plen[i];
|
|
|
|
cv->PreBun = j;
|
|
|
|
if(cv->Bkettei[i] & Bhenkan) {
|
|
val = Sdouon(0);
|
|
|
|
} else {
|
|
cv->Bkettei[i] |= Bmuhenkan;
|
|
cv->Bkettei[i] &= ~Bhenkan;
|
|
cv->Bkettei[j] |= Bmuhenkan;
|
|
cv->Bkettei[j] &= ~Bhenkan;
|
|
val = 0;
|
|
}
|
|
if(!val) {
|
|
cv->Dflag = -1;
|
|
Rdisp();
|
|
return (1);
|
|
}
|
|
break;
|
|
} else
|
|
j++;
|
|
}
|
|
beep();
|
|
if(j < cv->Bnum)
|
|
pop_obj(i, j);
|
|
return (0);
|
|
}
|
|
|
|
Bsmall(small) int small;
|
|
{
|
|
Conversion* cv;
|
|
int i, j, k, moji;
|
|
int val;
|
|
|
|
cv = GetConversion();
|
|
if(cv->CurBun < 0)
|
|
cv->CurBun = 0;
|
|
i = cv->CurBun;
|
|
j = i + 1;
|
|
if(j <= cv->Bnum && cv->Plen[i] > 1) {
|
|
if(j == cv->Bnum) {
|
|
cv->Bnum++;
|
|
cv->Bkettei[cv->Bnum] = Bend;
|
|
cv->Plen[j] = 0;
|
|
cv->Pkettei[j] = cv->Pkettei[i];
|
|
cv->Bkettei[j] |= Bmuhenkan;
|
|
cv->Bkettei[j] &= ~Bhenkan;
|
|
} else if(small) {
|
|
while(j < cv->Bnum - 1 && cv->Plen[j] == 0)
|
|
j++;
|
|
if(j == cv->Bnum)
|
|
j--;
|
|
} else if(cv->Plen[j] != 0 && cv->Enum < MAXENUM) {
|
|
for(k = cv->Bnum; k > j; k--) {
|
|
cv->Plen[k] = cv->Plen[k - 1];
|
|
cv->Ppoint[k] = cv->Ppoint[k - 1];
|
|
cv->Pkettei[k] = cv->Pkettei[k - 1];
|
|
|
|
cv->Bpoint[k] = cv->Bpoint[k - 1];
|
|
cv->Bkettei[k] = cv->Bkettei[k - 1];
|
|
|
|
cv->Displen[k] = cv->Displen[k - 1];
|
|
cv->Dispmod[k] = cv->Dispmod[k - 1];
|
|
|
|
cv->Edit[k] = cv->Edit[k - 1];
|
|
}
|
|
cv->Bnum++;
|
|
cv->Plen[j] = 0;
|
|
cv->Bkettei[j] = Bmuhenkan;
|
|
cv->Displen[j] = 0;
|
|
} else if(cv->Plen[j] != 0) {
|
|
while(j < cv->Bnum - 1 && cv->Plen[j] == 0)
|
|
j++;
|
|
if(j == cv->Bnum)
|
|
j--;
|
|
} else {
|
|
while(j < cv->Bnum - 1 && cv->Plen[j] == 0 &&
|
|
cv->Plen[j + 1] == 0)
|
|
j++;
|
|
}
|
|
|
|
push_obj(i, j);
|
|
|
|
k = cv->Ppoint[i] - cv->Ppoint[0] + cv->Plen[i] - 1;
|
|
if(cv->out_mode[k] & OMODE_ZEN)
|
|
moji = 2;
|
|
else
|
|
moji = 1;
|
|
cv->Plen[i] -= moji;
|
|
cv->Plen[j] += moji;
|
|
cv->Ppoint[j] = cv->Ppoint[i] + cv->Plen[i];
|
|
|
|
if(cv->Plen[i] < 1) {
|
|
beep();
|
|
pop_obj(i, j);
|
|
return (0);
|
|
}
|
|
|
|
cv->PreBun = j;
|
|
|
|
if(cv->Bkettei[i] & Bhenkan) {
|
|
val = Sdouon(0);
|
|
|
|
} else {
|
|
cv->Bkettei[i] |= Bmuhenkan;
|
|
cv->Bkettei[i] &= ~Bhenkan;
|
|
cv->Bkettei[j] |= Bmuhenkan;
|
|
cv->Bkettei[j] &= ~Bhenkan;
|
|
val = 0;
|
|
}
|
|
if(!val) {
|
|
cv->Dflag = -1;
|
|
Rdisp();
|
|
return (1);
|
|
}
|
|
beep();
|
|
pop_obj(i, j);
|
|
} else {
|
|
beep();
|
|
}
|
|
return (0);
|
|
}
|
|
|
|
void Bdelete() {
|
|
Conversion* cv;
|
|
int i, j, deletelen, val;
|
|
|
|
cv = GetConversion();
|
|
if(cv->CurBun < 0) {
|
|
cv->CurBun = 0;
|
|
return;
|
|
}
|
|
i = cv->CurBun;
|
|
j = i + 1;
|
|
if(j <= cv->Bnum && cv->Plen[i] > 0) {
|
|
while(j < cv->Bnum && cv->Plen[j] == 0)
|
|
j++;
|
|
if(j == cv->Bnum) {
|
|
j = i - 1;
|
|
while(j >= 0 && cv->Plen[j] == 0)
|
|
j--;
|
|
if(j == -1)
|
|
j = i;
|
|
}
|
|
|
|
push_obj(i, j);
|
|
|
|
deletelen = cv->Plen[i];
|
|
cv->Plen[i] = 0;
|
|
|
|
cv->PreBun = i;
|
|
cv->CurBun = j;
|
|
|
|
val = Sdouon(0);
|
|
if(!val) {
|
|
cv->Dflag = -1;
|
|
Chain(i, deletelen);
|
|
Rdisp();
|
|
if(i == j)
|
|
all_set_up();
|
|
} else {
|
|
beep();
|
|
pop_obj(i, j);
|
|
}
|
|
} else {
|
|
beep();
|
|
all_set_up();
|
|
}
|
|
}
|
|
|
|
void
|
|
Chain(n, len) int n;
|
|
int len;
|
|
{
|
|
Conversion* cv;
|
|
int i;
|
|
wchar16_t* p;
|
|
unsigned short* pp;
|
|
int mlen, plen, ipos, rlen, imlen;
|
|
|
|
cv = GetConversion();
|
|
if(cv->Ppoint[n + 1] == 0)
|
|
return;
|
|
/*
|
|
* Remove warning.
|
|
* Patched by Hidekazu Kuroki(hidekazu@cs.titech.ac.jp) 1996/8/10
|
|
*/
|
|
mlen = strlen((char*)cv->Ppoint[n + 1]);
|
|
plen = cv->Ppoint[n] - cv->Ppoint[0];
|
|
p = cv->Ppoint[n];
|
|
pp = &cv->out_mode[plen];
|
|
ipos = getipos(plen);
|
|
if(cv->Ppoint[n + 1] > cv->Ppoint[0])
|
|
rlen = getipos(cv->Ppoint[n + 1] - cv->Ppoint[0]) - ipos;
|
|
else
|
|
rlen = 0;
|
|
imlen = 0;
|
|
for(i = 0; i < mlen; i++) {
|
|
p[i] = p[i + len];
|
|
pp[i] = pp[i + len];
|
|
imlen += pp[i] & OMODE_MASK;
|
|
}
|
|
p[mlen] = '\0';
|
|
cv->out_point -= len;
|
|
|
|
p = &cv->Halpha[ipos];
|
|
for(i = 0; i < imlen; i++)
|
|
p[i] = p[i + rlen];
|
|
p[imlen] = '\0';
|
|
cv->ha_point -= rlen;
|
|
|
|
for(i = n + 1; i < cv->Bnum; i++)
|
|
cv->Ppoint[i] -= len;
|
|
}
|
|
|
|
static int Elimit;
|
|
static int Ehlimit;
|
|
exec_edit() {
|
|
Conversion* cv;
|
|
int edit, inc, i;
|
|
wchar16_t* s;
|
|
wchar16_t Htmp[BUFFLENGTH], Ztmp[BUFFLENGTH * 2];
|
|
unsigned short Omode[BUFFLENGTH * 2];
|
|
int bun;
|
|
int edited, editlen;
|
|
int len, rlen, hlen, diff;
|
|
int Zcol, cur, icur, res, ncur;
|
|
extern int keyvalue;
|
|
wchar16_t number[3];
|
|
wchar16_t tmp[3];
|
|
int num, numpoint;
|
|
extern char* Gedit;
|
|
|
|
cv = GetConversion();
|
|
bun = cv->CurBun;
|
|
len = load_bun2(bun, Htmp, Ztmp, Omode);
|
|
rlen = wslen(Htmp);
|
|
if(len > DLEN) {
|
|
guide_print_pause(WCGedit, WCTooLong);
|
|
return (0);
|
|
}
|
|
TopGuide();
|
|
spaceR(WCGedit);
|
|
SJ_print(Ztmp);
|
|
Clear_EOL();
|
|
backspace(wcbyte(Ztmp));
|
|
Zcol = 0;
|
|
Flush();
|
|
|
|
cur = cv->Ppoint[bun] - cv->Ppoint[0];
|
|
ncur = cur + cv->Plen[bun];
|
|
s = cv->Ppoint[bun];
|
|
s += cv->Plen[bun];
|
|
res = wslen(s);
|
|
i = BUFFLENGTH * 2 - res - cur - 1;
|
|
if(i < DLEN)
|
|
Elimit = i;
|
|
else
|
|
Elimit = DLEN;
|
|
i = BUFFLENGTH - wslen(cv->Halpha) + rlen - 1;
|
|
if(i < DLEN)
|
|
Ehlimit = i;
|
|
else
|
|
Ehlimit = DLEN;
|
|
edited = 0;
|
|
edit = 1;
|
|
numpoint = 0;
|
|
SaveConversion();
|
|
while(edit) {
|
|
inc = inkey();
|
|
cv = GetConversion();
|
|
if(AnotherConversion()) {
|
|
unget_key(inc);
|
|
edited = 0;
|
|
break;
|
|
}
|
|
if(keyvalue == KEY_CONV)
|
|
return (0);
|
|
if(keyvalue == KEY_HENKAN || keyvalue == KEY_KETTEI)
|
|
break;
|
|
else if(keyvalue == KEY_UP)
|
|
inc = 'a';
|
|
else if(keyvalue == KEY_DOWN)
|
|
inc = 'i';
|
|
else if(keyvalue == KEY_RIGHT)
|
|
inc = 'l';
|
|
else if(keyvalue == KEY_LEFT)
|
|
inc = 'h';
|
|
switch(inc) {
|
|
case EOF:
|
|
case ESC:
|
|
edit = 0;
|
|
break;
|
|
case 'l':
|
|
case ' ':
|
|
num = getnum(number, &numpoint);
|
|
if(Zcol >= len - 1) {
|
|
beep();
|
|
break;
|
|
}
|
|
for(i = 0; i < num && Zcol < len - 1; i++) {
|
|
tmp[0] = Ztmp[Zcol];
|
|
tmp[1] = 0;
|
|
SJ_print(tmp);
|
|
Zcol++;
|
|
}
|
|
Flush();
|
|
break;
|
|
case 'h':
|
|
case BS:
|
|
num = getnum(number, &numpoint);
|
|
if(Zcol <= 0) {
|
|
beep();
|
|
break;
|
|
}
|
|
for(i = 0; i < num && Zcol >= 1; i++)
|
|
backspace(2);
|
|
Zcol -= 1;
|
|
Flush();
|
|
break;
|
|
case '\014':
|
|
case '$':
|
|
num = getnum(number, &numpoint);
|
|
if(len <= 0)
|
|
break;
|
|
Zcol = len - 1;
|
|
TopGuide();
|
|
spaceR(WCGedit);
|
|
SJ_print(Ztmp);
|
|
Clear_EOL();
|
|
backspace(2);
|
|
Flush();
|
|
break;
|
|
case 'a':
|
|
if(len >= 1) {
|
|
tmp[0] = Ztmp[Zcol];
|
|
tmp[1] = 0;
|
|
SJ_print(tmp);
|
|
Zcol++;
|
|
Flush();
|
|
}
|
|
|
|
case 'i':
|
|
num = getnum(number, &numpoint);
|
|
if(editlen = Insert(Htmp, Ztmp, Omode, Zcol)) {
|
|
len += editlen;
|
|
Zcol += editlen;
|
|
edited = 1;
|
|
}
|
|
if(Zcol >= 1) {
|
|
backspace(2);
|
|
Zcol -= 1;
|
|
}
|
|
Print_EOL(&Ztmp[Zcol]);
|
|
Flush();
|
|
break;
|
|
case DEL:
|
|
case 'x':
|
|
num = getnum(number, &numpoint);
|
|
if(len <= 0) {
|
|
beep();
|
|
break;
|
|
}
|
|
len -= EditDel(Htmp, Ztmp, Omode, Zcol, num);
|
|
if(Zcol >= len && Zcol >= 1) {
|
|
backspace(2);
|
|
Zcol -= 1;
|
|
}
|
|
Print_EOL(&Ztmp[Zcol]);
|
|
Flush();
|
|
edited = 1;
|
|
break;
|
|
case 'r':
|
|
num = getnum(number, &numpoint);
|
|
if(len <= 0) {
|
|
beep();
|
|
break;
|
|
}
|
|
i = Replace(Htmp, Ztmp, Omode, Zcol, num);
|
|
if(i > 0) {
|
|
i -= 1;
|
|
Zcol += i;
|
|
backspace(2);
|
|
edited = 1;
|
|
}
|
|
Print_EOL(&Ztmp[Zcol]);
|
|
Flush();
|
|
break;
|
|
case 's':
|
|
num = getnum(number, &numpoint);
|
|
if(len <= 0) {
|
|
beep();
|
|
break;
|
|
}
|
|
if(editlen = Substitute(Htmp, Ztmp, Omode, &Zcol, num)) {
|
|
len += editlen;
|
|
}
|
|
if(Zcol >= 1) {
|
|
backspace(2);
|
|
Zcol -= 1;
|
|
}
|
|
Print_EOL(&Ztmp[Zcol]);
|
|
Flush();
|
|
edited = 1;
|
|
break;
|
|
case '0':
|
|
if(numpoint == 0) {
|
|
num = getnum(number, &numpoint);
|
|
TopGuide();
|
|
spaceR(WCGedit);
|
|
Flush();
|
|
Zcol = 0;
|
|
break;
|
|
}
|
|
|
|
default:
|
|
if(iswdigit(inc)) {
|
|
if(numpoint > 1) {
|
|
|
|
number[0] = number[1];
|
|
number[1] = inc;
|
|
} else
|
|
number[numpoint++] = inc;
|
|
} else {
|
|
num = getnum(number, &numpoint);
|
|
beep();
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(edited) {
|
|
for(i = 0; i < res; i++) {
|
|
Ztmp[i + len] = *s++;
|
|
Omode[i + len] = cv->out_mode[i + ncur];
|
|
}
|
|
res += len;
|
|
s = cv->Ppoint[bun];
|
|
for(i = 0; i < res; i++) {
|
|
*s++ = Ztmp[i];
|
|
cv->out_mode[i + cur] = Omode[i];
|
|
}
|
|
*s = '\0';
|
|
hlen = wslen(Htmp);
|
|
icur = getipos(cur);
|
|
s = &cv->Halpha[icur];
|
|
s += rlen;
|
|
if(*s)
|
|
wscat(Htmp, s);
|
|
wscpy(&cv->Halpha[icur], Htmp);
|
|
if((diff = len - cv->Plen[bun]) != 0) {
|
|
cv->Plen[bun] = len;
|
|
cv->out_point += diff;
|
|
cv->out_epoint += diff;
|
|
for(i = bun + 1; i < cv->Bnum; i++)
|
|
cv->Ppoint[i] += diff;
|
|
}
|
|
if((diff = hlen - rlen) != 0) {
|
|
cv->ha_point += diff;
|
|
cv->ha_epoint += diff;
|
|
}
|
|
if((i = cv->Bpoint[bun]) < (unsigned int)cv->Bpoint[0])
|
|
i = cv->span_point;
|
|
cv->kettei[i - 1] = MODE_ZHIRA;
|
|
cv->Pedited[bun] = 1;
|
|
cv->Dflag = -1;
|
|
return (1);
|
|
}
|
|
return (0);
|
|
}
|
|
|
|
getnum(number, numpoint)
|
|
wchar16_t number[];
|
|
int* numpoint;
|
|
{
|
|
char temp[3];
|
|
int i = 0;
|
|
|
|
if(*numpoint == 0)
|
|
return (1);
|
|
number[*numpoint] = '\0';
|
|
*numpoint = 0;
|
|
do {
|
|
temp[i] = WcLowByte(number[i]);
|
|
} while(number[i++] != 0);
|
|
|
|
return (atoi(temp));
|
|
}
|
|
|
|
Replace(Hs, Zs, omode, cur, num)
|
|
wchar16_t* Hs,
|
|
*Zs;
|
|
unsigned short* omode;
|
|
int cur, num;
|
|
{
|
|
int i, len, inc;
|
|
int beep_on, icur1, icur2;
|
|
wchar16_t roma[SHORTBUFFSIZE + 1], kana[SHORTBUFFSIZE + 1];
|
|
wchar16_t work[DLEN + 1];
|
|
unsigned short otmp[SHORTBUFFSIZE + 1];
|
|
|
|
*roma = '\0';
|
|
*kana = '\0';
|
|
SaveConversion(GetConversion());
|
|
while(1) {
|
|
inc = inkey();
|
|
if(AnotherConversion(GetConversion())) {
|
|
unget_key(inc);
|
|
*kana = '\0';
|
|
break;
|
|
}
|
|
len = wslen(roma);
|
|
if(inc == ESC) {
|
|
if(len > 0)
|
|
(void)exec_romaji2(0, roma, kana, otmp,
|
|
wslen(kana), len);
|
|
break;
|
|
}
|
|
if(iswcntrl(inc) && !(len > 0 && is_bs(inc))) {
|
|
beep();
|
|
*kana = '\0';
|
|
break;
|
|
}
|
|
if(exec_romaji2(inc, roma, kana, otmp, wslen(kana), len))
|
|
break;
|
|
}
|
|
sj3_rkclear();
|
|
if((len = wslen(kana)) <= 0)
|
|
return (0);
|
|
if(kana[2] != '\0') {
|
|
beep_on = 1;
|
|
*otmp = sj_zentohan(roma, kana, 2);
|
|
kana[2] = '\0';
|
|
} else
|
|
beep_on = 0;
|
|
backspace(wcbyte(kana));
|
|
len = wslen(&Zs[cur]);
|
|
if(num <= 0)
|
|
num = 2;
|
|
if(!(omode[cur] & OMODE_MASK))
|
|
chhstr(Hs, Zs, omode, cur);
|
|
icur1 = getipos2(omode, cur);
|
|
if(len <= num) {
|
|
num = len;
|
|
*work = '\0';
|
|
} else {
|
|
if(!(omode[cur + num] & OMODE_MASK))
|
|
chhstr(Hs, Zs, omode, cur + num);
|
|
icur2 = getipos2(omode, cur + num);
|
|
wscpy(work, &Hs[icur2]);
|
|
}
|
|
Hs[icur1] = '\0';
|
|
for(i = 0; i < num; i += 2) {
|
|
SJ_print(kana);
|
|
Zs[cur] = kana[0];
|
|
omode[cur++] = otmp[0];
|
|
Zs[cur] = kana[1];
|
|
omode[cur++] = otmp[1];
|
|
wscat(Hs, roma);
|
|
}
|
|
Flush();
|
|
wscat(Hs, work);
|
|
if(beep_on)
|
|
beep();
|
|
return (num);
|
|
}
|
|
|
|
Substitute(Hs, Zs, omode, cur, num)
|
|
wchar16_t* Hs,
|
|
*Zs;
|
|
unsigned short* omode;
|
|
int * cur, num;
|
|
{
|
|
wchar16_t work[DLEN + 1];
|
|
wchar16_t work2[DLEN + 1];
|
|
int len;
|
|
|
|
len = wslen(&Zs[*cur]);
|
|
if(len < num)
|
|
num = len;
|
|
|
|
Strncpy(work, &Zs[*cur], num - 1);
|
|
work[num - 1] = '\0';
|
|
wscpy(work2, work);
|
|
wscat(work2, WCDollar);
|
|
SJ_print(work2);
|
|
backspace(wcbyte(&Zs[*cur]));
|
|
|
|
Flush();
|
|
(void)EditDel(Hs, Zs, omode, *cur, num);
|
|
if(len = Insert(Hs, Zs, omode, *cur))
|
|
*cur += len;
|
|
len -= num;
|
|
return (len);
|
|
}
|
|
|
|
Insert(Hs, Zs, omode, cur)
|
|
wchar16_t* Hs,
|
|
*Zs;
|
|
unsigned short* omode;
|
|
int cur;
|
|
{
|
|
int inc, len, i;
|
|
int limit, hlimit, ylen, res, icur, rlen;
|
|
wchar16_t ztmp[DLEN + 1], htmp[DLEN + 1];
|
|
unsigned short otmp[DLEN + 1];
|
|
|
|
ylen = wslen(Zs);
|
|
limit = Elimit - ylen;
|
|
/*
|
|
* Remove warning.
|
|
* Patched by Hidekazu Kuroki(hidekazu@cs.titech.ac.jp) 1996/8/10
|
|
*/
|
|
hlimit = Ehlimit - strlen((char*)Hs);
|
|
*ztmp = '\0';
|
|
*htmp = '\0';
|
|
SaveConversion(GetConversion());
|
|
while(1) {
|
|
inc = inkey();
|
|
if(AnotherConversion(GetConversion())) {
|
|
unget_key(inc);
|
|
sj3_rkclear();
|
|
return (0);
|
|
}
|
|
if(inc == ESC)
|
|
break;
|
|
if(iswcntrl(inc) && !is_bs(inc))
|
|
beep();
|
|
else if(((len = wslen(ztmp)) >= limit ||
|
|
(rlen = wslen(htmp)) >= hlimit) &&
|
|
!is_bs(inc))
|
|
beep();
|
|
else
|
|
(void)exec_romaji2(inc, htmp, ztmp, otmp, len, rlen);
|
|
}
|
|
/*
|
|
* Remove warning.
|
|
* Patched by Hidekazu Kuroki(hidekazu@cs.titech.ac.jp) 1996/8/10
|
|
*/
|
|
(void)exec_romaji2(0, htmp, ztmp, otmp, strlen((char*)ztmp), strlen((char*)htmp));
|
|
sj3_rkclear();
|
|
len = wslen(ztmp);
|
|
backspace(wcbyte(ztmp));
|
|
SJ_print(ztmp);
|
|
Flush();
|
|
if(len) {
|
|
if(!(omode[cur] & OMODE_MASK))
|
|
chhstr(Hs, Zs, omode, cur);
|
|
icur = getipos2(omode, cur);
|
|
res = ylen - cur;
|
|
for(i = 0; i < res; i++) {
|
|
ztmp[i + len] = Zs[i + cur];
|
|
otmp[i + len] = omode[i + cur];
|
|
}
|
|
res += len;
|
|
for(i = 0; i < res; i++) {
|
|
Zs[i + cur] = ztmp[i];
|
|
omode[i + cur] = otmp[i];
|
|
}
|
|
Zs[i + cur] = '\0';
|
|
wscat(htmp, &Hs[icur]);
|
|
wscpy(&Hs[icur], htmp);
|
|
}
|
|
return (len);
|
|
}
|
|
|
|
EditDel(Hs, Zs, omode, cur, num)
|
|
wchar16_t* Hs,
|
|
*Zs;
|
|
unsigned short* omode;
|
|
int cur, num;
|
|
{
|
|
int i, j;
|
|
int icur, len, rlen;
|
|
|
|
if(!(omode[cur] & OMODE_MASK))
|
|
chhstr(Hs, Zs, omode, cur);
|
|
len = wslen(&Zs[cur]);
|
|
icur = getipos2(omode, cur);
|
|
if(len < num) {
|
|
Zs[cur] = '\0';
|
|
Hs[icur] = '\0';
|
|
} else {
|
|
if(!(omode[cur + num] & OMODE_MASK))
|
|
chhstr(Hs, Zs, omode, cur + num);
|
|
rlen = getipos2(omode, cur + num) - icur;
|
|
j = len - num + cur;
|
|
for(i = cur; i < j; i++) {
|
|
Zs[i] = Zs[i + num];
|
|
omode[i] = omode[i + num];
|
|
}
|
|
Zs[i] = '\0';
|
|
j = wslen(Hs) - rlen;
|
|
for(i = icur; i < j; i++)
|
|
Hs[i] = Hs[i + rlen];
|
|
Hs[i] = '\0';
|
|
len = num;
|
|
}
|
|
return (len);
|
|
}
|
|
|
|
chhstr(Hs, Zs, omode, cur)
|
|
wchar16_t* Hs,
|
|
*Zs;
|
|
unsigned short* omode;
|
|
int cur;
|
|
{
|
|
int i, j, len;
|
|
int prep, nextp;
|
|
int hprep, hnextp;
|
|
wchar16_t hkana[BUFFLENGTH], *hkp;
|
|
|
|
len = wslen(Zs);
|
|
prep = cur;
|
|
hprep = getipos2(omode, prep);
|
|
nextp = cur + 1;
|
|
hnextp = getipos2(omode, nextp);
|
|
hkp = hkana;
|
|
for(i = prep; i < nextp; i++) {
|
|
if(i < nextp - 1 && (WcIsZENKAKU(Zs[i]))) {
|
|
j = sj_zentohan(hkp, &Zs[i], 1);
|
|
hkp += j;
|
|
omode[i] = j;
|
|
} else {
|
|
*hkp++ = Zs[i];
|
|
omode[i] = 1;
|
|
}
|
|
}
|
|
wscpy(hkp, &Hs[hnextp]);
|
|
wscpy(&Hs[hprep], hkana);
|
|
}
|
|
|
|
Print_EOL(s)
|
|
wchar16_t* s;
|
|
{
|
|
if(*s != '\0')
|
|
SJ_print(s);
|
|
Clear_EOL();
|
|
if(*s != '\0')
|
|
backspace(wcbyte(s));
|
|
}
|
|
|
|
backspace(n) int n;
|
|
{
|
|
int i;
|
|
|
|
for(i = 0; i < n; i++)
|
|
Backspace();
|
|
}
|