summaryrefslogtreecommitdiff
path: root/sys/dev/wscons/wsemul_vt100.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/wscons/wsemul_vt100.c')
-rw-r--r--sys/dev/wscons/wsemul_vt100.c217
1 files changed, 110 insertions, 107 deletions
diff --git a/sys/dev/wscons/wsemul_vt100.c b/sys/dev/wscons/wsemul_vt100.c
index bab482e2a96..67834bca41d 100644
--- a/sys/dev/wscons/wsemul_vt100.c
+++ b/sys/dev/wscons/wsemul_vt100.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: wsemul_vt100.c,v 1.16 2007/01/07 13:28:50 miod Exp $ */
+/* $OpenBSD: wsemul_vt100.c,v 1.17 2007/01/07 13:31:36 miod Exp $ */
/* $NetBSD: wsemul_vt100.c,v 1.13 2000/04/28 21:56:16 mycroft Exp $ */
/*
@@ -176,12 +176,12 @@ wsemul_vt100_cnattach(type, cookie, ccol, crow, defattr)
if (res)
edp->kernattr = defattr;
- edp->tabs = 0;
- edp->dblwid = 0;
+ edp->tabs = NULL;
+ edp->dblwid = NULL;
edp->dw = 0;
edp->dcsarg = 0;
- edp->isolatin1tab = edp->decgraphtab = edp->dectechtab = 0;
- edp->nrctab = 0;
+ edp->isolatin1tab = edp->decgraphtab = edp->dectechtab = NULL;
+ edp->nrctab = NULL;
wsemul_vt100_reset(edp);
return (edp);
}
@@ -215,7 +215,8 @@ wsemul_vt100_attach(console, type, cookie, ccol, crow, cbcookie, defattr)
edp->tabs = malloc(edp->ncols, M_DEVBUF, M_NOWAIT);
edp->dblwid = malloc(edp->nrows, M_DEVBUF, M_NOWAIT);
- memset(edp->dblwid, 0, edp->nrows);
+ if (edp->dblwid != NULL)
+ memset(edp->dblwid, 0, edp->nrows);
edp->dw = 0;
edp->dcsarg = malloc(DCS_MAXLEN, M_DEVBUF, M_NOWAIT);
edp->isolatin1tab = malloc(128 * sizeof(int), M_DEVBUF, M_NOWAIT);
@@ -236,7 +237,7 @@ wsemul_vt100_detach(cookie, crowp, ccolp)
*crowp = edp->crow;
*ccolp = edp->ccol;
-#define f(ptr) if (ptr) {free(ptr, M_DEVBUF); ptr = 0;}
+#define f(ptr) if (ptr) {free(ptr, M_DEVBUF); ptr = NULL;}
f(edp->tabs)
f(edp->dblwid)
f(edp->dcsarg)
@@ -295,7 +296,7 @@ wsemul_vt100_reset(edp)
}
edp->dcspos = 0;
edp->dcstype = 0;
- edp->chartab_G[0] = 0;
+ edp->chartab_G[0] = NULL;
edp->chartab_G[1] = edp->nrctab; /* ??? */
edp->chartab_G[2] = edp->isolatin1tab;
edp->chartab_G[3] = edp->isolatin1tab;
@@ -376,24 +377,24 @@ wsemul_vt100_output_c0c1(edp, c, kernel)
u_int n;
switch (c) {
- case ASCII_NUL:
- default:
+ case ASCII_NUL:
+ default:
/* ignore */
break;
- case ASCII_BEL:
+ case ASCII_BEL:
wsdisplay_emulbell(edp->cbcookie);
break;
- case ASCII_BS:
+ case ASCII_BS:
if (edp->ccol > 0) {
edp->ccol--;
edp->flags &= ~VTFL_LASTCHAR;
}
break;
- case ASCII_CR:
+ case ASCII_CR:
edp->ccol = 0;
edp->flags &= ~VTFL_LASTCHAR;
break;
- case ASCII_HT:
+ case ASCII_HT:
if (edp->tabs) {
if (!COLS_LEFT)
break;
@@ -405,13 +406,13 @@ wsemul_vt100_output_c0c1(edp, c, kernel)
}
edp->ccol = n;
break;
- case ASCII_SO: /* LS1 */
+ case ASCII_SO: /* LS1 */
edp->chartab0 = 1;
break;
- case ASCII_SI: /* LS0 */
+ case ASCII_SI: /* LS0 */
edp->chartab0 = 0;
break;
- case ASCII_ESC:
+ case ASCII_ESC:
if (kernel) {
printf("wsemul_vt100_output_c0c1: ESC in kernel "
"output ignored\n");
@@ -427,27 +428,27 @@ wsemul_vt100_output_c0c1(edp, c, kernel)
}
break;
#if 0
- case CSI: /* 8-bit */
+ case CSI: /* 8-bit */
/* XXX cancel current escape sequence */
edp->nargs = 0;
memset(edp->args, 0, sizeof (edp->args));
edp->modif1 = edp->modif2 = '\0';
edp->state = VT100_EMUL_STATE_CSI;
break;
- case DCS: /* 8-bit */
+ case DCS: /* 8-bit */
/* XXX cancel current escape sequence */
edp->nargs = 0;
memset(edp->args, 0, sizeof (edp->args));
edp->state = VT100_EMUL_STATE_DCS;
break;
- case ST: /* string end 8-bit */
+ case ST: /* string end 8-bit */
/* XXX only in VT100_EMUL_STATE_STRING */
wsemul_vt100_handle_dcs(edp);
return (VT100_EMUL_STATE_NORMAL);
#endif
- case ASCII_LF:
- case ASCII_VT:
- case ASCII_FF:
+ case ASCII_LF:
+ case ASCII_VT:
+ case ASCII_FF:
wsemul_vt100_nextline(edp);
break;
}
@@ -462,13 +463,13 @@ wsemul_vt100_output_esc(edp, c)
int i;
switch (c) {
- case '[': /* CSI */
+ case '[': /* CSI */
edp->nargs = 0;
memset(edp->args, 0, sizeof (edp->args));
edp->modif1 = edp->modif2 = '\0';
newstate = VT100_EMUL_STATE_CSI;
break;
- case '7': /* DECSC */
+ case '7': /* DECSC */
edp->flags |= VTFL_SAVEDCURS;
edp->savedcursor_row = edp->crow;
edp->savedcursor_col = edp->ccol;
@@ -482,7 +483,7 @@ wsemul_vt100_output_esc(edp, c)
edp->savedchartab0 = edp->chartab0;
edp->savedchartab1 = edp->chartab1;
break;
- case '8': /* DECRC */
+ case '8': /* DECRC */
if ((edp->flags & VTFL_SAVEDCURS) == 0)
break;
edp->crow = edp->savedcursor_row;
@@ -497,44 +498,44 @@ wsemul_vt100_output_esc(edp, c)
edp->chartab0 = edp->savedchartab0;
edp->chartab1 = edp->savedchartab1;
break;
- case '=': /* DECKPAM application mode */
+ case '=': /* DECKPAM application mode */
edp->flags |= VTFL_APPLKEYPAD;
break;
- case '>': /* DECKPNM numeric mode */
+ case '>': /* DECKPNM numeric mode */
edp->flags &= ~VTFL_APPLKEYPAD;
break;
- case 'E': /* NEL */
+ case 'E': /* NEL */
edp->ccol = 0;
/* FALLTHRU */
- case 'D': /* IND */
+ case 'D': /* IND */
wsemul_vt100_nextline(edp);
break;
- case 'H': /* HTS */
- KASSERT(edp->tabs != 0);
- edp->tabs[edp->ccol] = 1;
+ case 'H': /* HTS */
+ if (edp->tabs != NULL)
+ edp->tabs[edp->ccol] = 1;
break;
- case '~': /* LS1R */
+ case '~': /* LS1R */
edp->chartab1 = 1;
break;
- case 'n': /* LS2 */
+ case 'n': /* LS2 */
edp->chartab0 = 2;
break;
- case '}': /* LS2R */
+ case '}': /* LS2R */
edp->chartab1 = 2;
break;
- case 'o': /* LS3 */
+ case 'o': /* LS3 */
edp->chartab0 = 3;
break;
- case '|': /* LS3R */
+ case '|': /* LS3R */
edp->chartab1 = 3;
break;
- case 'N': /* SS2 */
+ case 'N': /* SS2 */
edp->sschartab = 2;
break;
- case 'O': /* SS3 */
+ case 'O': /* SS3 */
edp->sschartab = 3;
break;
- case 'M': /* RI */
+ case 'M': /* RI */
if (ROWS_ABOVE > 0) {
edp->crow--;
CHECK_DW;
@@ -542,37 +543,37 @@ wsemul_vt100_output_esc(edp, c)
}
wsemul_vt100_scrolldown(edp, 1);
break;
- case 'P': /* DCS */
+ case 'P': /* DCS */
edp->nargs = 0;
memset(edp->args, 0, sizeof (edp->args));
newstate = VT100_EMUL_STATE_DCS;
break;
- case 'c': /* RIS */
+ case 'c': /* RIS */
wsemul_vt100_reset(edp);
wsemul_vt100_ed(edp, 2);
edp->ccol = edp->crow = 0;
break;
- case '(': case ')': case '*': case '+': /* SCS */
+ case '(': case ')': case '*': case '+': /* SCS */
edp->designating = c - '(';
newstate = VT100_EMUL_STATE_SCS94;
break;
- case '-': case '.': case '/': /* SCS */
+ case '-': case '.': case '/': /* SCS */
edp->designating = c - '-' + 1;
newstate = VT100_EMUL_STATE_SCS96;
break;
- case '#':
+ case '#':
newstate = VT100_EMUL_STATE_ESC_HASH;
break;
- case ' ': /* 7/8 bit */
+ case ' ': /* 7/8 bit */
newstate = VT100_EMUL_STATE_ESC_SPC;
break;
- case ']': /* OSC operating system command */
- case '^': /* PM privacy message */
- case '_': /* APC application program command */
+ case ']': /* OSC operating system command */
+ case '^': /* PM privacy message */
+ case '_': /* APC application program command */
/* ignored */
newstate = VT100_EMUL_STATE_STRING;
break;
- case '<': /* exit VT52 mode - ignored */
+ case '<': /* exit VT52 mode - ignored */
break;
default:
#ifdef VT100_PRINTUNKNOWN
@@ -592,23 +593,23 @@ wsemul_vt100_output_scs94(edp, c)
u_int newstate = VT100_EMUL_STATE_NORMAL;
switch (c) {
- case '%': /* probably DEC supplemental graphic */
+ case '%': /* probably DEC supplemental graphic */
newstate = VT100_EMUL_STATE_SCS94_PERCENT;
break;
- case 'A': /* british / national */
+ case 'A': /* british / national */
edp->chartab_G[edp->designating] = edp->nrctab;
break;
- case 'B': /* ASCII */
+ case 'B': /* ASCII */
edp->chartab_G[edp->designating] = 0;
break;
- case '<': /* user preferred supplemental */
+ case '<': /* user preferred supplemental */
/* XXX not really "user" preferred */
edp->chartab_G[edp->designating] = edp->isolatin1tab;
break;
- case '0': /* DEC special graphic */
+ case '0': /* DEC special graphic */
edp->chartab_G[edp->designating] = edp->decgraphtab;
break;
- case '>': /* DEC tech */
+ case '>': /* DEC tech */
edp->chartab_G[edp->designating] = edp->dectechtab;
break;
default:
@@ -626,7 +627,7 @@ wsemul_vt100_output_scs94_percent(edp, c)
u_char c;
{
switch (c) {
- case '5': /* DEC supplemental graphic */
+ case '5': /* DEC supplemental graphic */
/* XXX there are differences */
edp->chartab_G[edp->designating] = edp->isolatin1tab;
break;
@@ -648,44 +649,45 @@ wsemul_vt100_output_scs96(edp, c)
int nrc;
switch (c) {
- case '%': /* probably portugese */
+ case '%': /* probably portugese */
newstate = VT100_EMUL_STATE_SCS96_PERCENT;
break;
- case 'A': /* ISO-latin-1 supplemental */
+ case 'A': /* ISO-latin-1 supplemental */
edp->chartab_G[edp->designating] = edp->isolatin1tab;
break;
- case '4': /* dutch */
+ case '4': /* dutch */
nrc = 1;
goto setnrc;
- case '5': case 'C': /* finnish */
+ case '5': case 'C': /* finnish */
nrc = 2;
goto setnrc;
- case 'R': /* french */
+ case 'R': /* french */
nrc = 3;
goto setnrc;
- case 'Q': /* french canadian */
+ case 'Q': /* french canadian */
nrc = 4;
goto setnrc;
- case 'K': /* german */
+ case 'K': /* german */
nrc = 5;
goto setnrc;
- case 'Y': /* italian */
+ case 'Y': /* italian */
nrc = 6;
goto setnrc;
- case 'E': case '6': /* norwegian / danish */
+ case 'E': case '6': /* norwegian / danish */
nrc = 7;
goto setnrc;
- case 'Z': /* spanish */
+ case 'Z': /* spanish */
nrc = 9;
goto setnrc;
- case '7': case 'H': /* swedish */
+ case '7': case 'H': /* swedish */
nrc = 10;
goto setnrc;
- case '=': /* swiss */
+ case '=': /* swiss */
nrc = 11;
setnrc:
- vt100_setnrc(edp, nrc); /* what table ??? */
- break;
+ if (vt100_setnrc(edp, nrc) == 0) /* what table ??? */
+ break;
+ /* else FALLTHROUGH */
default:
#ifdef VT100_PRINTUNKNOWN
printf("ESC%c%c unknown\n", edp->designating + '-' - 1, c);
@@ -701,12 +703,13 @@ wsemul_vt100_output_scs96_percent(edp, c)
u_char c;
{
switch (c) {
- case '6': /* portugese */
- vt100_setnrc(edp, 8);
- break;
+ case '6': /* portugese */
+ if (vt100_setnrc(edp, 8) == 0)
+ break;
+ /* else FALLTHROUGH */
default:
#ifdef VT100_PRINTUNKNOWN
- printf("ESC%c%%%c unknown\n", edp->designating + '-', c);
+ printf("ESC%c%%%c unknown\n", edp->designating + '-' - 1, c);
#endif
break;
}
@@ -719,8 +722,8 @@ wsemul_vt100_output_esc_spc(edp, c)
u_char c;
{
switch (c) {
- case 'F': /* 7-bit controls */
- case 'G': /* 8-bit controls */
+ case 'F': /* 7-bit controls */
+ case 'G': /* 8-bit controls */
#ifdef VT100_PRINTNOTIMPL
printf("ESC<SPC>%c ignored\n", c);
#endif
@@ -764,15 +767,15 @@ wsemul_vt100_output_dcs(edp, c)
u_int newstate = VT100_EMUL_STATE_DCS;
switch (c) {
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
/* argument digit */
if (edp->nargs > VT100_EMUL_NARGS - 1)
break;
edp->args[edp->nargs] = (edp->args[edp->nargs] * 10) +
(c - '0');
break;
- case ';': /* argument terminator */
+ case ';': /* argument terminator */
edp->nargs++;
break;
default:
@@ -785,13 +788,13 @@ wsemul_vt100_output_dcs(edp, c)
}
newstate = VT100_EMUL_STATE_STRING;
switch (c) {
- case '$':
+ case '$':
newstate = VT100_EMUL_STATE_DCS_DOLLAR;
break;
- case '{': /* DECDLD soft charset */
- case '!': /* DECRQUPSS user preferred supplemental set */
+ case '{': /* DECDLD soft charset */
+ case '!': /* DECRQUPSS user preferred supplemental set */
/* 'u' must follow - need another state */
- case '|': /* DECUDK program F6..F20 */
+ case '|': /* DECUDK program F6..F20 */
#ifdef VT100_PRINTNOTIMPL
printf("DCS%c ignored\n", c);
#endif
@@ -813,22 +816,22 @@ wsemul_vt100_output_dcs_dollar(edp, c)
u_char c;
{
switch (c) {
- case 'p': /* DECRSTS terminal state restore */
- case 'q': /* DECRQSS control function request */
+ case 'p': /* DECRSTS terminal state restore */
+ case 'q': /* DECRQSS control function request */
#ifdef VT100_PRINTNOTIMPL
printf("DCS$%c ignored\n", c);
#endif
break;
- case 't': /* DECRSPS restore presentation state */
+ case 't': /* DECRSPS restore presentation state */
switch (ARG(0)) {
- case 0: /* error */
+ case 0: /* error */
break;
- case 1: /* cursor information restore */
+ case 1: /* cursor information restore */
#ifdef VT100_PRINTNOTIMPL
printf("DCS1$t ignored\n");
#endif
break;
- case 2: /* tab stop restore */
+ case 2: /* tab stop restore */
edp->dcspos = 0;
edp->dcstype = DCSTYPE_TABRESTORE;
break;
@@ -856,8 +859,8 @@ wsemul_vt100_output_esc_hash(edp, c)
int i;
switch (c) {
- case '5': /* DECSWL single width, single height */
- if (edp->dw) {
+ case '5': /* DECSWL single width, single height */
+ if (edp->dblwid != NULL && edp->dw != 0) {
for (i = 0; i < edp->ncols / 2; i++)
(*edp->emulops->copycols)(edp->emulcookie,
edp->crow,
@@ -869,10 +872,10 @@ wsemul_vt100_output_esc_hash(edp, c)
edp->dw = 0;
}
break;
- case '6': /* DECDWL double width, single height */
- case '3': /* DECDHL double width, double height, top half */
- case '4': /* DECDHL double width, double height, bottom half */
- if (!edp->dw) {
+ case '6': /* DECDWL double width, single height */
+ case '3': /* DECDHL double width, double height, top half */
+ case '4': /* DECDHL double width, double height, bottom half */
+ if (edp->dblwid != NULL && edp->dw == 0) {
for (i = edp->ncols / 2 - 1; i >= 0; i--)
(*edp->emulops->copycols)(edp->emulcookie,
edp->crow,
@@ -888,7 +891,7 @@ wsemul_vt100_output_esc_hash(edp, c)
edp->ccol = (edp->ncols >> 1) - 1;
}
break;
- case '8': { /* DECALN */
+ case '8': { /* DECALN */
int i, j;
for (i = 0; i < edp->nrows; i++)
for (j = 0; j < edp->ncols; j++)
@@ -915,25 +918,25 @@ wsemul_vt100_output_csi(edp, c)
u_int newstate = VT100_EMUL_STATE_CSI;
switch (c) {
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
/* argument digit */
if (edp->nargs > VT100_EMUL_NARGS - 1)
break;
edp->args[edp->nargs] = (edp->args[edp->nargs] * 10) +
(c - '0');
break;
- case ';': /* argument terminator */
+ case ';': /* argument terminator */
edp->nargs++;
break;
- case '?': /* DEC specific */
- case '>': /* DA query */
+ case '?': /* DEC specific */
+ case '>': /* DA query */
edp->modif1 = c;
break;
- case '!':
- case '"':
- case '$':
- case '&':
+ case '!':
+ case '"':
+ case '$':
+ case '&':
edp->modif2 = c;
break;
default: /* end of escape sequence */