sj3/screen.c

447 lines
7.9 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"
#define LINE_LENGTH 80
static wchar16_t* Guide;
static wchar16_t Nguide[LINE_LENGTH + 1];
static wchar16_t Cguide[LINE_LENGTH + 1];
wchar16_t Mguide[LINE_LENGTH + 1];
vbackchar(n) int n;
{
int i;
for(i = 0; i < n; i++)
VBackspace();
for(i = 0; i < n; i++)
Vput_space();
for(i = 0; i < n; i++)
VBackspace();
Flush();
}
wrap_off() {
Conversion* cv;
cv = GetConversion();
cv->wrap = 0;
cv->PushCurrentVcol = cv->CurrentVcol;
}
wrap_on() {
Conversion* cv;
cv = GetConversion();
cv->wrap = 1;
cv->CurrentVcol = cv->PushCurrentVcol;
}
Vput_space() {
Conversion* cv;
cv = GetConversion();
put_space(1);
cv->Vindex[cv->Vlen++] = cv->CurrentVcol++;
if(cv->wrap && ((cv->CurrentVcol % cv->column) == 1)) {
put_space(1);
Backspace();
}
}
VBackspace() {
Conversion* cv;
int i;
cv = GetConversion();
if(cv->wrap && ((cv->CurrentVcol % cv->column) == 1)) {
Ccheck();
i = cv->Vindex[cv->Vlen - 1] % cv->column;
if(cv->Vlen > 0 && i > 1) {
CursorSet(
cv->SavedRow + (cv->CurrentVcol / cv->column) - 1,
cv->Vindex[cv->Vlen - 1] % cv->column);
} else
CursorSet(
cv->SavedRow + (cv->CurrentVcol / cv->column) - 1,
cv->column);
} else
Backspace();
if(cv->Vlen > 0)
cv->CurrentVcol = cv->Vindex[--(cv->Vlen)];
else {
cv->Vlen = 0;
cv->CurrentVcol = cv->Vindex[cv->Vlen];
}
}
master_out(s, n)
wchar16_t* s;
int n;
{
master_write(s, n);
master_flush();
}
master_write(s, n)
wchar16_t* s;
int n;
{
SJ_write(s, n);
}
vprintU(s, mod)
wchar16_t* s;
char mod;
{
Conversion* cv;
int i, col, oldcol, len;
unsigned short* p;
cv = GetConversion();
printU(s);
oldcol = cv->CurrentVcol % cv->column;
if(cv->wrap && (mod == 1) && (oldcol == 0))
cv->CurrentVcol++;
len = wcbyte(s);
p = &(cv->Vindex[cv->Vlen]);
cv->Vlen += len;
for(i = 0; i < len; i++)
*(p++) = cv->CurrentVcol++;
if(cv->wrap) {
col = cv->CurrentVcol % cv->column;
if(col == 1) {
put_space(1);
Backspace();
}
if((mod == 1) && (oldcol + len > (unsigned int)cv->column) && ((col & 1) == 0)) {
cv->CurrentVcol++;
}
}
*p = cv->CurrentVcol;
if(cv->CurrentVcol > cv->MaxVcol)
cv->MaxVcol = cv->CurrentVcol;
Flush();
}
vprintR(s, mod)
wchar16_t* s;
char mod;
{
Conversion* cv;
int i, col, oldcol, len;
unsigned short* p;
cv = GetConversion();
printR(s);
oldcol = cv->CurrentVcol % cv->column;
if(cv->wrap && (mod == 1) && (oldcol == 0))
cv->CurrentVcol++;
len = wcbyte(s);
p = &(cv->Vindex[cv->Vlen]);
cv->Vlen += len;
for(i = 0; i < len; i++)
*(p++) = cv->CurrentVcol++;
if(cv->wrap) {
col = cv->CurrentVcol % cv->column;
if(col == 1) {
put_space(1);
Backspace();
}
if((mod == 1) && (oldcol + len > (unsigned int)cv->column) && ((col & 1) == 0)) {
cv->CurrentVcol++;
}
}
*p = cv->CurrentVcol;
if(cv->CurrentVcol > cv->MaxVcol)
cv->MaxVcol = cv->CurrentVcol;
Flush();
}
IprintU(s, index)
wchar16_t* s;
int index;
{
Cgoto(index);
printU(s);
Flush();
}
IprintR(s, index)
wchar16_t* s;
int index;
{
Cgoto(index);
printR(s);
Flush();
}
printU(s)
wchar16_t* s;
{
under_in();
SJ_print(s);
under_out();
}
printR(s)
wchar16_t* s;
{
reverse_in();
SJ_print(s);
reverse_out();
}
Csave() {
Conversion* cv;
cv = GetConversion();
CursorRead(&(cv->SavedRow), &(cv->SavedCol));
cv->CurrentVcol = cv->SavedCol;
cv->Vlen = 0;
cv->Vindex[cv->Vlen] = cv->MaxVcol = cv->CurrentVcol;
}
SetVcol(index) int index;
{
Conversion* cv;
cv = GetConversion();
cv->Vlen = index;
cv->CurrentVcol = cv->Vindex[cv->Vlen];
}
Cload() {
Conversion* cv;
cv = GetConversion();
CursorSet(cv->SavedRow, cv->SavedCol);
}
Cclear(redraw) int redraw;
{
Conversion* cv;
int spaces;
unsigned short row, col;
if(redraw) {
cv = GetConversion();
CursorRead(&row, &col);
spaces = (row - cv->SavedRow) * cv->column + (col - cv->SavedCol) + 1;
Cload();
put_space(spaces);
}
Cload();
Flush();
}
Cgoto(index) int index;
{
Conversion* cv;
int row, col;
cv = GetConversion();
SetVcol(index);
row = cv->SavedRow + (int)(cv->CurrentVcol / cv->column);
col = cv->CurrentVcol % cv->column;
CursorSet(row, col);
}
ClearToMax() {
Conversion* cv;
int space;
cv = GetConversion();
space = cv->MaxVcol - cv->CurrentVcol;
put_space(space);
}
Ccheck() {
Conversion* cv;
int row, tmp, diff;
if(Cscroll()) {
cv = GetConversion();
tmp = (int)(cv->CurrentVcol / cv->column);
diff = cv->CurrentVcol - (tmp * cv->column);
if(diff == 0)
tmp--;
row = cv->SavedRow + tmp;
if(row >= (unsigned int)cv->line)
cv->SavedRow -= (row - cv->line);
}
}
spaceR(s)
wchar16_t* s;
{
wchar16_t* t;
wchar16_t tmp[40];
t = tmp;
while(*s != '\0') {
if(*s == ' ') {
*t = '\0';
printR(tmp);
t = tmp;
put_space(1);
} else
*(t++) = *s;
s++;
}
*t = '\0';
printR(tmp);
Flush();
}
clear_guide_line() {
unsigned short row, col;
StartGuide(&row, &col);
Clear_EOL();
EndGuide(row, col);
Flush();
}
print_guide_line() {
unsigned short row, col;
StartGuide(&row, &col);
spaceR(Guide);
Clear_EOL();
EndGuide(row, col);
Flush();
}
set_guide_line(mode) int mode;
{
switch(mode) {
case KEY_NORMAL:
wscpy(Nguide, WCSJrun);
Guide = Nguide;
break;
case KEY_CONV:
Guide = Cguide;
break;
default:
break;
}
}
disp_mode() {
Conversion* cv;
int c_code;
wchar16_t * Pmode, *Bmode;
cv = GetConversion();
switch(cv->Imode) {
case MODE_CODE:
c_code = GetCcode();
switch(c_code) {
case CODE_SJIS:
Pmode = WCGCshift;
break;
case CODE_EUC:
Pmode = WCGCeuc;
break;
case CODE_JIS:
Pmode = WCGCjis;
break;
case CODE_KUTEN:
Pmode = WCGCkuten;
break;
case CODE_EUC2:
Pmode = WCGCeuc2;
break;
case CODE_JIS2:
Pmode = WCGCjis2;
break;
case CODE_KUTEN2:
Pmode = WCGCkuten2;
break;
}
break;
case MODE_ZHIRA:
Pmode = WCMode_Zhira;
break;
case MODE_ZKATA:
Pmode = WCMode_Zkata;
break;
case MODE_HKATA:
Pmode = WCMode_Hkata;
break;
case MODE_ZALPHA:
Pmode = WCMode_Zalpha;
break;
case MODE_HALPHA:
Pmode = WCMode_Halpha;
break;
default:
break;
}
switch(cv->BuffMode) {
case BUFF:
Bmode = WCMode_buff;
break;
case UNBUFF:
Bmode = WCMode_unbuff;
break;
default:
break;
}
wscpy(Cguide, Bmode);
wscat(Cguide, Pmode);
wscpy(Mguide, Cguide);
if(Hlevel > 1)
wscat(Cguide, WCGmode);
print_guide_line();
}
TopGuide() {
unsigned short row, col;
StartGuide(&row, &col);
}
guide_print(s1, s2)
wchar16_t* s1,
*s2;
{
unsigned short row, col;
StartGuide(&row, &col);
if(s1)
printR(s1);
SJ_print(s2);
Clear_EOL();
EndGuide(row, col);
Flush();
}