sj3/kigou.c

295 lines
6.3 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 "kctype.h"
#include "key.h"
#define BEGIN_CODE 0x2121
#define END_CODE 0x7f7e
#define INCRESE 16
static int lastcode = BEGIN_CODE;
static unsigned short row, col;
void input_kigou();
kigou() {
extern int keyvalue;
int increse, code, basecode;
int inc, ki, low;
unsigned short num, CheckCcode(), strtocode();
int rval;
increse = INCRESE;
disp_mode();
basecode = lastcode & 0xfff0;
code = lastcode;
StartGuide(&row, &col);
Clear_EOL();
guide_kigou(basecode, code, increse);
rval = 0;
ki = 1;
SaveConversion();
while(ki) {
inc = inkey();
if(AnotherConversion()) {
unget_key(inc);
break;
}
top:
switch(keyvalue) {
case KEY_CONV:
rval = 1;
ki = 0;
break;
case KEY_RIGHT:
if(code >= END_CODE) {
code = BEGIN_CODE;
basecode = code & 0xfff0;
} else {
low = ++code & 0xff;
if(low > 0x7e) {
code &= 0xff00;
code += 0x121;
low = 0x21;
}
if(code >= basecode + increse) {
if(low <= 0x21)
basecode = code & 0xfff0;
else
basecode += increse;
}
}
guide_kigou(basecode, code, increse);
break;
case KEY_LEFT:
if(code <= BEGIN_CODE) {
code = END_CODE;
basecode = code & 0xfff0;
} else {
low = --code & 0xff;
if(low < 0x21) {
code &= 0xff00;
code -= 0x82;
low = 0x7e;
}
if(code < basecode) {
if(low >= 0x7e)
basecode = code & 0xfff0;
else
basecode -= increse;
}
}
guide_kigou(basecode, code, increse);
break;
case KEY_UP:
if(basecode <= BEGIN_CODE) {
code = basecode = END_CODE & 0xfff0;
} else {
basecode -= increse;
low = basecode & 0xff;
if(low == 0x20) {
code = (basecode & 0xff00) + 0x21;
} else {
if(low < 0x20) {
basecode &= 0xff00;
basecode -= 0x90;
}
code = basecode;
}
}
guide_kigou(basecode, code, increse);
break;
case KEY_DOWN:
if(basecode >= (END_CODE & 0xfff0)) {
code = BEGIN_CODE;
basecode = code & 0xfff0;
} else {
basecode += increse;
low = basecode & 0xff;
if(low > 0x70) {
basecode &= 0xff00;
basecode += 0x120;
code = basecode + 1;
} else
code = basecode;
}
guide_kigou(basecode, code, increse);
break;
case KEY_HENKAN:
input_kigou(basecode, code, increse);
break;
case KEY_KETTEI:
input_kigou(basecode, code, increse);
ki = 0;
break;
default:
if((keyvalue = IsCKey(inc)) != KEY_NORMAL)
goto top;
if(CheckCcode(inc)) {
if((num = strtocode()) > 0) {
code = num;
basecode = code & 0xfff0;
guide_kigou(basecode, code, increse);
}
} else if(inc == ESC)
ki = 0;
else if(inc == '\n' || inc == '\r' || inc == ' ')
input_kigou(basecode, code, increse);
else if(IsRedraw(inc))
guide_kigou(basecode, code, increse);
else
beep();
break;
}
}
EndGuide(row, col);
disp_mode();
return (rval);
}
IsRedraw(c) int c;
{
if(c == 0x0c)
return (1);
else
return (0);
}
IsCKey(inc) int inc;
{
switch(inc) {
case 'l':
return (KEY_RIGHT);
case 'k':
return (KEY_UP);
case 'j':
return (KEY_DOWN);
case 'h':
return (KEY_LEFT);
default:
return (KEY_NORMAL);
}
}
guide_kigou(bcode, code, increse) int bcode, code, increse;
{
int i;
extern wchar16_t Mguide[];
wchar16_t wtmp[20];
char tmp[20];
unsigned short prcode;
TopGuide();
printR(Mguide);
put_space(1);
put_space(1);
for(i = 0; i < increse; i++)
pkigou(bcode + i);
prcode = code;
if(((i = GetCcode()) == CODE_KUTEN) || (i == CODE_KUTEN2)) {
prcode -= 0x2020;
sprintf(tmp, " [%02d%02d]", prcode >> 8, prcode & 0xff);
} else {
if(i == CODE_SJIS)
prcode = jis2sjis(prcode);
else if((i == CODE_EUC) || (i == CODE_EUC2))
prcode |= 0x8080;
sprintf(tmp, " [%04x]", prcode);
}
(void)mbstowcs(wtmp, tmp, 20);
SJ_print(wtmp);
backspace(8 + (bcode + increse - code) * 2);
Flush();
}
pkigou(code) int code;
{
wchar16_t tmp[3];
unsigned short ccode;
if(jis2euc(code) == 0) {
ccode = BEGIN_CODE;
} else {
ccode = code;
}
if((GetCcode() == CODE_EUC2) || (GetCcode() == CODE_JIS2) ||
(GetCcode() == CODE_KUTEN2)) {
ccode = WcJIS2X0212(ccode);
} else {
ccode = WcJIS2X0208(ccode);
}
tmp[0] = ccode;
tmp[1] = '\0';
SJ_print(tmp);
}
void
input_kigou(basecode, code, increse) int basecode,
code, increse;
{
wchar16_t s[2];
unsigned short ccode, svlen;
Conversion* cv;
if(jis2euc(code) == 0) {
beep();
return;
}
if((GetCcode() == CODE_EUC2) || (GetCcode() == CODE_JIS2) ||
(GetCcode() == CODE_KUTEN2)) {
ccode = WcJIS2X0212(code);
} else {
ccode = WcJIS2X0208(code);
}
EndGuide(row, col);
s[0] = ccode;
s[1] = '\0';
if(BuffYes()) {
cv = GetConversion();
save_obuf();
(void)exec_romaji(s[0]);
if(os_point > 0) {
svlen = cv->Vlen;
vprintU(osave_buf, 1);
Cgoto(svlen);
}
restore_obuf();
} else {
master_out(s, 2);
master_flush();
}
StartGuide(&row, &col);
guide_kigou(basecode, code, increse);
lastcode = code;
}