replace: u_char -> unsigned char u_short -> unsigned short u_int -> unsigned int u_long (not used) include <sys/types.h> is kept. dicttool.h: fix include guard DICTTOLL -> DICTTOOL addelcmn.c:unsigned int addel_arg() deldic.c:unsigned int deldic() change u_short err -> unsigned int err (used for return value) Signed-off-by: SASANO Takayoshi <uaa@uaa.org.uk>
872 lines
16 KiB
C
872 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.
|
|
*
|
|
*/
|
|
|
|
/*
|
|
* $SonyRCSfile: edit.c,v $
|
|
* $SonyRevision: 1.2 $
|
|
* $SonyDate: 1997/01/23 11:09:36 $
|
|
*/
|
|
|
|
|
|
|
|
#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 ();
|
|
}
|