home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_disks
/
300-399
/
ff369.lzh
/
VaxTerm
/
src
/
inter.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-08-15
|
28KB
|
702 lines
#include <exec/types.h>
#include <exec/io.h>
#include <devices/keymap.h>
#include <hardware/blit.h>
#include <graphics/rastport.h>
#include <graphics/text.h>
#include <libraries/dos.h>
#include <proto/graphics.h>
#include "main.h"
char posreq[] = "\x9B%d;%dR";
char primda[] = "\x9B?62;9c";
char secda[] = "\x9B>1;10;0c";
char tstat[] = "\x9B""0n";
char pstat[] = "\x9B?13n";
char ustat[] = "\x9B?21n";
char klang[] = "\x9B?27;6n";
interpret(register struct console *con,register LONG len)
{
register SHORT cnt,lim;
register char *scp;
char c,com[16];
scp = con->buf;
while (len--) {
c = *scp++;
if (con->stat) {
cnt = con->stat;
con->stat = 0;
switch (cnt) {
case SEQ_ESC:
switch (c) {
case '[':
con->stat = SEQ_CSI;
con->argi = 0;
con->carg = 0;
break;
case '#':
con->stat = SEQ_LWIDTH;
break;
case 'P':
con->stat = SEQ_DCS;
break;
case ' ':
con->stat = SEQ_SPC;
break;
case '(':
con->stat = SEQ_G0;
break;
case ')':
con->stat = SEQ_G1;
break;
case '*':
con->stat = SEQ_G2;
break;
case '+':
con->stat = SEQ_G3;
break;
case '~':
setrset(con,1);
break;
case 'n':
setlset(con,2);
break;
case '}':
setrset(con,2);
break;
case 'o':
setlset(con,3);
break;
case '|':
setrset(con,3);
break;
case 'N':
con->slset = con->lset;
con->tstat |= GXGL;
setlset(con,2);
break;
case 'O':
con->slset = con->lset;
con->tstat |= GXGL;
setlset(con,3);
break;
case '<':
case '=':
keypadmode(TRUE);
activate(&appl);
break;
case '>':
keypadmode(FALSE);
activate(&num);
break;
case 'D':
cursordown(con,1);
break;
case 'M':
cursorup(con,1);
break;
case 'E':
cursornextline(con);
break;
case '7':
con->s_row = con->row;
con->s_col = con->col;
con->s_attr = con->attr;
for (cnt = 0; cnt < SETS; cnt++) {
con->s_gset[cnt] = con->gset[cnt];
con->s_mset[cnt] = con->mset[cnt];
}
con->s_lset = con->lset;
con->s_rset = con->rset;
con->s_tstat = con->tstat;
break;
case '8':
if (con->ordc) textout(con);
con->row = con->s_row;
con->col = con->s_col;
con->attr = con->s_attr;
for (cnt = 0; cnt < SETS; cnt++) {
con->gset[cnt] = con->s_gset[cnt];
con->mset[cnt] = con->s_mset[cnt];
}
setlset(con,con->s_lset);
setrset(con,con->s_rset);
con->tstat = con->s_tstat &
(WRAP | INSERT | NEWLINE | CONVERT | CURSOR);
if (con->tstat & WRAP) activate(&wrap);
else activate(&trunc);
if (con->tstat & INSERT) activate(&ins);
else activate(&over);
if (con->tstat & NEWLINE) {
entermode(TRUE);
activate(&newl);
}
else {
entermode(FALSE);
activate(&cret);
}
if (con->tstat & CONVERT) activate(&bit_7);
else activate(&bit_8);
modifyattr(con);
break;
case 'H':
con->tabs[con->col] = 1;
break;
case 'c':
reset(con);
break;
case 'Z':
sendstring(con,primda);
break;
default: ;
}
break;
case SEQ_CSI:
if (isdigit(c)) {
con->carg = con->carg * 10;
con->carg += (USHORT)(c - '0');
con->stat = SEQ_CSI;
}
else {
switch (c) {
case ';':
con->args[con->argi] = con->carg;
con->carg = 0;
con->argi++;
if (con->argi > ARGUMENTS)
con->argi = ARGUMENTS;
con->stat = SEQ_CSI;
break;
case '?':
con->stat = SEQ_MOD;
break;
case '>':
con->stat = SEQ_SEC;
break;
case '!':
con->stat = SEQ_RES;
break;
case '"':
con->stat = SEQ_SET;
break;
case '\x27':
case '^':
con->stat = SEQ_ONE;
break;
case 'h':
switch (con->carg) {
case 2:
con->gstat |= LOCKED;
break;
case 4:
if (con->ordc) textout(con);
con->tstat |= INSERT;
activate(&ins);
break;
case 20:
entermode(TRUE);
con->tstat |= NEWLINE;
activate(&newl);
break;
default: ;
}
break;
case 'l':
switch (con->carg) {
case 2:
con->gstat &= (MASK - LOCKED);
break;
case 4:
if (con->ordc) textout(con);
con->tstat &= (MASK - INSERT);
activate(&over);
break;
case 20:
entermode(FALSE);
con->tstat &= (MASK - NEWLINE);
activate(&cret);
break;
default: ;
}
break;
case 'A':
cnt = con->carg;
if (cnt == 0) cnt = 1;
cursorup(con,cnt);
break;
case 'B':
cnt = con->carg;
if (cnt == 0) cnt = 1;
cursordown(con,cnt);
break;
case 'C':
cnt = con->carg;
if (cnt == 0) cnt = 1;
cursorright(con,cnt);
break;
case 'D':
cnt = con->carg;
if (cnt == 0) cnt = 1;
cursorleft(con,cnt);
break;
case 'f':
case 'H':
if (con->ordc) textout(con);
if (con->argi) con->row = con->args[0];
else con->row = con->carg;
if (con->row == 0) con->row = 1;
if (con->row > rows) con->row = rows;
if ((con->argi)&&(con->carg)) {
con->col = con->carg;
if (con->col > COLUMNS) con->col = COLUMNS;
}
else con->col = 1;
break;
case 'g':
if (con->carg == 0) con->tabs[con->col] = 0;
if (con->carg == 3) setmem(con->tabs,COLUMNS,0);
break;
case 'm':
if (con->ordc) textout(con);
con->args[con->argi] = con->carg;
con->argi++;
for (cnt = 0; cnt < con->argi; cnt++) {
switch(con->args[cnt]) {
case 0: con->attr= 0;
break;
case 1: con->attr|=FSF_BOLD;
break;
case 3: con->attr|=FSF_ITALIC;
break;
case 4: con->attr|=FSF_UNDERLINED;
break;
case 7: con->attr|=NEGATIVE;
break;
case 22: con->attr&=(MASK-FSF_BOLD);
break;
case 23: con->attr&=(MASK-FSF_ITALIC);
break;
case 24: con->attr&=(MASK-FSF_UNDERLINED);
break;
case 27: con->attr&=(MASK-NEGATIVE);
break;
default: ;
}
}
modifyattr(con);
break;
case 'L':
cnt = con->carg;
if (cnt == 0) cnt = 1;
insertlines(con,cnt);
break;
case 'M':
cnt = con->carg;
if (cnt == 0) cnt = 1;
deletelines(con,cnt);
break;
case '@':
cnt = con->carg;
if (cnt == 0) cnt = 1;
insertchars(con,cnt);
break;
case 'P':
cnt = con->carg;
if (cnt == 0) cnt = 1;
deletechars(con,cnt);
break;
case 'X':
cnt = con->carg;
if (cnt == 0) cnt = 1;
erasechars(con,cnt);
break;
case 'K':
switch (con->carg) {
case 0:
erasechars(con,
(USHORT)((COLUMNS + 1) - con->col));
break;
case 1:
eraselinebeg(con);
break;
case 2:
eraselinebeg(con);
erasechars(con,
(USHORT)((COLUMNS + 1) - con->col));
break;
default: ;
}
break;
case 'J':
switch (con->carg) {
case 0:
if (con->row < rows) {
if (con->ordc) textout(con);
con->row++;
eraselines(con,
(USHORT)(rows - con->row));
con->row--;
}
erasechars(con,
(USHORT)((COLUMNS + 1) - con->col));
break;
case 1:
erasescrbeg(con);
eraselinebeg(con);
break;
case 2:
SetRast(con->rp,BACKGROUND_PEN);
for (cnt = 0; cnt < rows; cnt++)
*(con->rows + cnt + 1) = 0;
break;
default: ;
}
break;
case 'r':
if (con->ordc) textout(con);
if ((con->argi)&&(con->carg))
con->bot = con->carg;
else con->bot = rows;
if (con->argi) con->top = con->args[0];
else con->top = con->carg;
if (con->top == 0) con->top = 1;
con->row = 1;
con->col = 1;
break;
case 'c':
if (con->carg == 0) sendstring(con,primda);
break;
case 'n':
switch (con->carg) {
case 5: sendstring(con,tstat);
break;
case 6: sprintf(com,posreq,con->row,con->col);
sendstring(con,com);
break;
default: ;
}
break;
default: ;
}
}
break;
case SEQ_MOD:
if (isdigit(c)) {
con->carg = con->carg * 10;
con->carg += (USHORT)(c - '0');
con->stat = SEQ_MOD;
}
else {
switch (c) {
case ';':
con->args[con->argi] = con->carg;
con->carg = 0;
con->argi++;
if (con->argi > ARGUMENTS)
con->argi = ARGUMENTS;
con->stat = SEQ_MOD;
break;
case 'h':
switch (con->carg) {
case 1:
cursormode(FALSE);
break;
case 7:
con->tstat |= WRAP;
activate(&wrap);
break;
case 25:
showcursor(con);
activate(&curson);
break;
case 42:
con->nstat |= NATIONAL;
setlset(con,con->lset);
setrset(con,con->rset);
activate(&nat);
modifyattr(con);
break;
default: ;
}
break;
case 'l':
switch (con->carg) {
case 1:
cursormode(TRUE);
break;
case 7:
con->tstat &= (MASK - WRAP);
activate(&trunc);
break;
case 25:
hidecursor(con);
activate(&cursoff);
break;
case 42:
con->nstat &= (MASK - NATIONAL);
setlset(con,con->lset);
setrset(con,con->rset);
activate(&mult);
modifyattr(con);
break;
default: ;
}
break;
case 'n':
switch (con->carg) {
case 15: sendstring(con,pstat);
break;
case 25: sendstring(con,ustat);
break;
case 26: sendstring(con,klang);
break;
default: ;
}
break;
}
}
break;
case SEQ_LWIDTH:
if (*(con->rows + con->row)) break;
switch (c) {
case '3': *(con->rows + con->row) = UPPER_SIDE;
break;
case '4': *(con->rows + con->row) = LOWER_SIDE;
break;
case '6': *(con->rows + con->row) = HORIZ_ONLY;
break;
default: ;
}
if (*(con->rows + con->row)) {
if (con->ordc) textout(con);
stretch(con->rp,0,(con->row - 1) * YSIZE,
WIDTH / 2,YSIZE,*(con->rows + con->row));
}
break;
case SEQ_SET:
if (c == 'p') {
if (con->args[0] == 62) {
if (con->argi == 0) {
con->tstat &= (MASK - CONVERT);
activate(&bit_8);
}
else {
if (con->args[1] == 1) {
con->tstat |= CONVERT;
activate(&bit_7);
}
else {
con->tstat &= (MASK - CONVERT);
activate(&bit_8);
}
}
}
else if (con->args[0] == 61) {
con->tstat |= CONVERT;
activate(&bit_7);
}
}
break;
case SEQ_DCS:
if (c != ST) con->stat = SEQ_DCS;
else if (c == ESC) con->stat = SEQ_ENDDCS;
break;
case SEQ_SPC:
if (c == 'F') {
con->tstat |= CONVERT;
activate(&bit_7);
}
else if (c == 'G') {
con->tstat &= (MASK - CONVERT);
activate(&bit_8);
}
break;
case SEQ_SEC:
if (isdigit(c)) con->stat = SEQ_SEC;
else if (c == 'c') sendstring(con,secda);
break;
case SEQ_RES:
if (c == 'p') reset(con);
break;
case SEQ_G0:
setset(con,cset(c),0);
break;
case SEQ_G1:
setset(con,cset(c),1);
break;
case SEQ_G2:
setset(con,cset(c),2);
break;
case SEQ_G3:
setset(con,cset(c),3);
break;
case SEQ_ENDDCS:
if (c != '/') con->stat = SEQ_DCS;
break;
default: ;
}
}
else {
cnt = 0;
if (c & '\x80') {
cnt = 4;
if (con->tstat & DCONTHI) {
if (con->ordc) textout(con);
cnt |= 2;
}
if ((c >= '\xA0')&&(c < '\xFF')) {
cnt |= 1;
if (con->nstat & NATIONAL) c &= '\x7F';
}
}
else {
if (con->tstat & DCONTLO) {
if (con->ordc) textout(con);
cnt = 2;
}
if ((c >= ' ')&&(c < '\x7F')) cnt |= 1;
}
if (cnt & 3) {
if (*(con->rows + con->row)) lim = COLUMNS / 2;
else lim = COLUMNS;
if (con->col > lim) {
if (con->ordc) textout(con);
if (con->tstat & WRAP) cursornextline(con);
else con->col = lim;
}
if (con->ordc == 0) con->ordcol = con->col;
con->ordtext[con->ordc] = c;
con->ordc++;
if (!(cnt & 2)) con->col++;
if (con->tstat & GXGL) {
setlset(con,con->slset);
con->tstat &= (MASK - GXGL);
}
}
if (!(cnt & 1)) {
if (con->ordc) textout(con);
if (cnt & 4) {
switch (c) {
case CSI:
con->stat = SEQ_CSI;
con->argi = 0;
con->carg = 0;
break;
case IND:
cursordown(con,1);
break;
case NEL:
cursornextline(con);
break;
case HTS:
con->tabs[con->col] = 1;
break;
case RI:
cursorup(con,1);
break;
case SS2:
con->slset = con->lset;
con->tstat |= GXGL;
setlset(con,2);
break;
case SS3:
con->slset = con->lset;
con->tstat |= GXGL;
setlset(con,3);
break;
case DCS:
con->stat = SEQ_DCS;
break;
default: ;
}
}
else {
switch (c) {
case ESC:
con->stat = SEQ_ESC;
break;
case BEL:
beep(con);
DisplayBeep(NULL);
break;
case BS:
if (con->col > 1) con->col--;
break;
case HT:
while (con->col < COLUMNS) {
con->col++;
if (con->tabs[con->col]) break;
}
break;
case VT:
case FF:
case LF:
if (con->tstat & NEWLINE) newline(con);
else cursordown(con,1);
break;
case CR:
con->col = 1;
break;
case SI:
setlset(con,0);
break;
case SO:
setlset(con,1);
break;
default: ;
}
}
}
}
}
return(0);
}
setset(struct console *con,USHORT set,USHORT seq)
{
con->mset[seq] = set;
switch(set) {
case BRITISH:
activate(&br_set);
break;
case DUTCH:
activate(&du_set);
break;
case FINNISH:
activate(&fi_set);
break;
case FRENCH:
activate(&fr_set);
break;
case FRENCH_CANADIAN:
activate(&fc_set);
break;
case GERMAN:
activate(&ger_set);
break;
case ITALIAN:
activate(&ita_set);
break;
case NORWEGIAN:
activate(&nor_set);
break;
case SPANISH:
activate(&spa_set);
break;
case SWEDISH:
activate(&swe_set);
break;
case SWISS:
activate(&swi_set);
break;
default:
con->gset[seq] = set;
}
if (con->lset == seq) setlset(con,seq);
if (con->rset == seq) setrset(con,seq);
return(0);
}