summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/dev/wscons/wsemul_vt100.c217
-rw-r--r--sys/dev/wscons/wsemul_vt100_chars.c38
-rw-r--r--sys/dev/wscons/wsemul_vt100_subr.c270
-rw-r--r--sys/dev/wscons/wsemul_vt100var.h4
4 files changed, 274 insertions, 255 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 */
diff --git a/sys/dev/wscons/wsemul_vt100_chars.c b/sys/dev/wscons/wsemul_vt100_chars.c
index f76185b83df..f62e24b49de 100644
--- a/sys/dev/wscons/wsemul_vt100_chars.c
+++ b/sys/dev/wscons/wsemul_vt100_chars.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: wsemul_vt100_chars.c,v 1.4 2004/04/02 04:39:51 deraadt Exp $ */
+/* $OpenBSD: wsemul_vt100_chars.c,v 1.5 2007/01/07 13:31:36 miod Exp $ */
/* $NetBSD: wsemul_vt100_chars.c,v 1.4 1999/02/20 18:20:02 drochner Exp $ */
/*
@@ -80,15 +80,21 @@ vt100_initchartables(edp)
{
int i;
- for (i = 0; i < 128; i++)
- (*edp->emulops->mapchar)(edp->emulcookie, 128 + i,
- &edp->isolatin1tab[i]);
- for (i = 0; i < 128; i++)
- (*edp->emulops->mapchar)(edp->emulcookie, decspcgr2uni[i],
- &edp->decgraphtab[i]);
- for (i = 0; i < 128; i++)
- (*edp->emulops->mapchar)(edp->emulcookie, dectech2uni[i],
- &edp->dectechtab[i]);
+ if (edp->isolatin1tab != NULL)
+ for (i = 0; i < 128; i++)
+ (*edp->emulops->mapchar)(edp->emulcookie, 128 + i,
+ &edp->isolatin1tab[i]);
+
+ if (edp->decgraphtab != NULL)
+ for (i = 0; i < 128; i++)
+ (*edp->emulops->mapchar)(edp->emulcookie,
+ decspcgr2uni[i], &edp->decgraphtab[i]);
+
+ if (edp->dectechtab != NULL)
+ for (i = 0; i < 128; i++)
+ (*edp->emulops->mapchar)(edp->emulcookie,
+ dectech2uni[i], &edp->dectechtab[i]);
+
vt100_setnrc(edp, 0);
}
@@ -137,18 +143,24 @@ static const struct {
0x00e8, 0x00f4, 0x00e4, 0x00f6, 0x00fc, 0x00fb}},
};
-void
+int
vt100_setnrc(edp, nrc)
struct wsemul_vt100_emuldata *edp;
int nrc;
{
int i;
- KASSERT(nrc < sizeof(nrctable) / sizeof(nrctable[0]));
+ if (edp->nrctab == NULL)
+ return (0);
+
+ if (nrc < 0 || nrc >= sizeof(nrctable) / sizeof(nrctable[0]))
+ return (ERANGE);
for (i = 0; i < 128; i++)
(*edp->emulops->mapchar)(edp->emulcookie, i, &edp->nrctab[i]);
for (i = 0; i < 12; i++)
(*edp->emulops->mapchar)(edp->emulcookie, nrctable[nrc].c[i],
- &edp->nrctab[nrcovlpos[i]]);
+ &edp->nrctab[nrcovlpos[i]]);
+
+ return (0);
}
diff --git a/sys/dev/wscons/wsemul_vt100_subr.c b/sys/dev/wscons/wsemul_vt100_subr.c
index 76a0b2041aa..c67c0389592 100644
--- a/sys/dev/wscons/wsemul_vt100_subr.c
+++ b/sys/dev/wscons/wsemul_vt100_subr.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: wsemul_vt100_subr.c,v 1.13 2005/04/21 00:26:29 deraadt Exp $ */
+/* $OpenBSD: wsemul_vt100_subr.c,v 1.14 2007/01/07 13:31:36 miod Exp $ */
/* $NetBSD: wsemul_vt100_subr.c,v 1.7 2000/04/28 21:56:16 mycroft Exp $ */
/*
@@ -197,53 +197,53 @@ wsemul_vt100_handle_csi(edp, c)
#define A3(a, b, c) (((a) << 16) | ((b) << 8) | (c))
switch (A3(edp->modif1, edp->modif2, c)) {
- case A3('>', '\0', 'c'): /* DA secondary */
+ case A3('>', '\0', 'c'): /* DA secondary */
wsdisplay_emulinput(edp->cbcookie, WSEMUL_VT_ID2,
sizeof(WSEMUL_VT_ID2));
break;
- case A3('\0', '\0', 'J'): /* ED selective erase in display */
- case A3('?', '\0', 'J'): /* DECSED selective erase in display */
+ case A3('\0', '\0', 'J'): /* ED selective erase in display */
+ case A3('?', '\0', 'J'): /* DECSED selective erase in display */
wsemul_vt100_ed(edp, ARG(0));
break;
- case A3('\0', '\0', 'K'): /* EL selective erase in line */
- case A3('?', '\0', 'K'): /* DECSEL selective erase in line */
+ case A3('\0', '\0', 'K'): /* EL selective erase in line */
+ case A3('?', '\0', 'K'): /* DECSEL selective erase in line */
wsemul_vt100_el(edp, ARG(0));
break;
- case A3('\0', '\0', 'h'): /* SM */
+ case A3('\0', '\0', 'h'): /* SM */
for (n = 0; n < edp->nargs; n++)
vt100_ansimode(edp, ARG(n), VTMODE_SET);
break;
- case A3('?', '\0', 'h'): /* DECSM */
+ case A3('?', '\0', 'h'): /* DECSM */
for (n = 0; n < edp->nargs; n++)
vt100_decmode(edp, ARG(n), VTMODE_SET);
break;
- case A3('\0', '\0', 'l'): /* RM */
+ case A3('\0', '\0', 'l'): /* RM */
for (n = 0; n < edp->nargs; n++)
vt100_ansimode(edp, ARG(n), VTMODE_RESET);
break;
- case A3('?', '\0', 'l'): /* DECRM */
+ case A3('?', '\0', 'l'): /* DECRM */
for (n = 0; n < edp->nargs; n++)
vt100_decmode(edp, ARG(n), VTMODE_RESET);
break;
- case A3('\0', '$', 'p'): /* DECRQM request mode ANSI */
+ case A3('\0', '$', 'p'): /* DECRQM request mode ANSI */
vt100_ansimode(edp, ARG(0), VTMODE_REPORT);
break;
- case A3('?', '$', 'p'): /* DECRQM request mode DEC */
+ case A3('?', '$', 'p'): /* DECRQM request mode DEC */
vt100_decmode(edp, ARG(0), VTMODE_REPORT);
break;
- case A3('\0', '\0', 'i'): /* MC printer controller mode */
- case A3('?', '\0', 'i'): /* MC printer controller mode */
+ case A3('\0', '\0', 'i'): /* MC printer controller mode */
+ case A3('?', '\0', 'i'): /* MC printer controller mode */
switch (ARG(0)) {
- case 0: /* print screen */
- case 1: /* print cursor line */
- case 4: /* off */
- case 5: /* on */
+ case 0: /* print screen */
+ case 1: /* print cursor line */
+ case 4: /* off */
+ case 5: /* on */
#ifdef VT100_PRINTNOTIMPL
printf("CSI%di ignored\n", ARG(0));
#endif
break;
- default:
+ default:
#ifdef VT100_PRINTUNKNOWN
printf("CSI%di unknown\n", ARG(0));
#endif
@@ -252,50 +252,50 @@ wsemul_vt100_handle_csi(edp, c)
break;
#define A2(a, b) (((a) << 8) | (b))
- case A2('!', 'p'): /* DECSTR soft reset VT300 only */
+ case A2('!', 'p'): /* DECSTR soft reset VT300 only */
wsemul_vt100_reset(edp);
break;
- case A2('"', 'p'): /* DECSCL */
+ case A2('"', 'p'): /* DECSCL */
switch (ARG(0)) {
- case 61: /* VT100 mode (no further arguments!) */
+ case 61: /* VT100 mode (no further arguments!) */
break;
- case 62:
- case 63: /* VT300 mode */
+ case 62:
+ case 63: /* VT300 mode */
break;
- default:
+ default:
#ifdef VT100_PRINTUNKNOWN
printf("CSI%d\"p unknown\n", ARG(0));
#endif
break;
}
switch (ARG(1)) {
- case 0:
- case 2: /* 8-bit controls */
+ case 0:
+ case 2: /* 8-bit controls */
#ifdef VT100_PRINTNOTIMPL
printf("CSI%d;%d\"p ignored\n", ARG(0), ARG(1));
#endif
break;
- case 1: /* 7-bit controls */
+ case 1: /* 7-bit controls */
break;
- default:
+ default:
#ifdef VT100_PRINTUNKNOWN
printf("CSI%d;%d\"p unknown\n", ARG(0), ARG(1));
#endif
break;
}
break;
- case A2('"', 'q'): /* DECSCA select character attribute VT300 */
+ case A2('"', 'q'): /* DECSCA select character attribute VT300 */
switch (ARG(0)) {
- case 0:
- case 1: /* erasable */
+ case 0:
+ case 1: /* erasable */
break;
- case 2: /* not erasable */
+ case 2: /* not erasable */
#ifdef VT100_PRINTNOTIMPL
printf("CSI2\"q ignored\n");
#endif
break;
- default:
+ default:
#ifdef VT100_PRINTUNKNOWN
printf("CSI%d\"q unknown\n", ARG(0));
#endif
@@ -303,39 +303,40 @@ wsemul_vt100_handle_csi(edp, c)
}
break;
- case A2('$', 'u'): /* DECRQTSR request terminal status report */
+ case A2('$', 'u'): /* DECRQTSR request terminal status report */
switch (ARG(0)) {
- case 0: /* ignored */
+ case 0: /* ignored */
break;
- case 1: /* terminal state report */
+ case 1: /* terminal state report */
#ifdef VT100_PRINTNOTIMPL
printf("CSI1$u ignored\n");
#endif
break;
- default:
+ default:
#ifdef VT100_PRINTUNKNOWN
printf("CSI%d$u unknown\n", ARG(0));
#endif
break;
}
break;
- case A2('$', 'w'): /* DECRQPSR request presentation status report
+ case A2('$', 'w'): /* DECRQPSR request presentation status report
(VT300 only) */
switch (ARG(0)) {
- case 0: /* error */
+ case 0: /* error */
break;
- case 1: /* cursor information report */
+ case 1: /* cursor information report */
#ifdef VT100_PRINTNOTIMPL
printf("CSI1$w ignored\n");
#endif
break;
- case 2: /* tab stop report */
- {
+ case 2: /* tab stop report */
+ {
int i, n, ps = 0;
char buf[20];
- KASSERT(edp->tabs != 0);
+
wsdisplay_emulinput(edp->cbcookie, "\033P2$u", 5);
- for (i = 0; i < edp->ncols; i++)
+ if (edp->tabs != NULL)
+ for (i = 0; i < edp->ncols; i++)
if (edp->tabs[i]) {
n = snprintf(buf, sizeof buf, "%s%d",
(ps ? "/" : ""), i + 1);
@@ -347,41 +348,41 @@ wsemul_vt100_handle_csi(edp, c)
buf, n);
ps = 1;
}
- }
+ }
wsdisplay_emulinput(edp->cbcookie, "\033\\", 2);
break;
- default:
+ default:
#ifdef VT100_PRINTUNKNOWN
printf("CSI%d$w unknown\n", ARG(0));
#endif
break;
}
break;
- case A2('$', '}'): /* DECSASD select active status display */
+ case A2('$', '}'): /* DECSASD select active status display */
switch (ARG(0)) {
- case 0: /* main display */
- case 1: /* status line */
+ case 0: /* main display */
+ case 1: /* status line */
#ifdef VT100_PRINTNOTIMPL
printf("CSI%d$} ignored\n", ARG(0));
#endif
break;
- default:
+ default:
#ifdef VT100_PRINTUNKNOWN
printf("CSI%d$} unknown\n", ARG(0));
#endif
break;
}
break;
- case A2('$', '~'): /* DECSSDD select status line type */
+ case A2('$', '~'): /* DECSSDD select status line type */
switch (ARG(0)) {
- case 0: /* none */
- case 1: /* indicator */
- case 2: /* host-writable */
+ case 0: /* none */
+ case 1: /* indicator */
+ case 2: /* host-writable */
#ifdef VT100_PRINTNOTIMPL
printf("CSI%d$~ ignored\n", ARG(0));
#endif
break;
- default:
+ default:
#ifdef VT100_PRINTUNKNOWN
printf("CSI%d$~ unknown\n", ARG(0));
#endif
@@ -389,35 +390,35 @@ wsemul_vt100_handle_csi(edp, c)
}
break;
- case A2('&', 'u'): /* DECRQUPSS request user preferred
+ case A2('&', 'u'): /* DECRQUPSS request user preferred
supplemental set */
wsdisplay_emulinput(edp->cbcookie, "\033P0!u%5\033\\", 9);
break;
- case '@': /* ICH insert character VT300 only */
+ case '@': /* ICH insert character VT300 only */
n = min(DEF1_ARG(0), COLS_LEFT + 1);
help = NCOLS - (edp->ccol + n);
if (help > 0)
COPYCOLS(edp->ccol, edp->ccol + n, help);
ERASECOLS(edp->ccol, n, edp->bkgdattr);
break;
- case 'A': /* CUU */
+ case 'A': /* CUU */
edp->crow -= min(DEF1_ARG(0), ROWS_ABOVE);
CHECK_DW;
break;
- case 'B': /* CUD */
+ case 'B': /* CUD */
edp->crow += min(DEF1_ARG(0), ROWS_BELOW);
CHECK_DW;
break;
- case 'C': /* CUF */
+ case 'C': /* CUF */
edp->ccol += min(DEF1_ARG(0), COLS_LEFT);
break;
- case 'D': /* CUB */
+ case 'D': /* CUB */
edp->ccol -= min(DEF1_ARG(0), edp->ccol);
edp->flags &= ~VTFL_LASTCHAR;
break;
- case 'H': /* CUP */
- case 'f': /* HVP */
+ case 'H': /* CUP */
+ case 'f': /* HVP */
if (edp->flags & VTFL_DECOM)
edp->crow = edp->scrreg_startrow +
min(DEF1_ARG(0), edp->scrreg_nrows) - 1;
@@ -427,8 +428,8 @@ wsemul_vt100_handle_csi(edp, c)
edp->ccol = min(DEF1_ARG(1), NCOLS) - 1;
edp->flags &= ~VTFL_LASTCHAR;
break;
- case 'L': /* IL insert line */
- case 'M': /* DL delete line */
+ case 'L': /* IL insert line */
+ case 'M': /* DL delete line */
n = min(DEF1_ARG(0), ROWS_BELOW + 1);
{
int savscrstartrow, savscrnrows;
@@ -444,45 +445,45 @@ wsemul_vt100_handle_csi(edp, c)
edp->scrreg_nrows = savscrnrows;
}
break;
- case 'P': /* DCH delete character */
+ case 'P': /* DCH delete character */
n = min(DEF1_ARG(0), COLS_LEFT + 1);
help = NCOLS - (edp->ccol + n);
if (help > 0)
COPYCOLS(edp->ccol + n, edp->ccol, help);
ERASECOLS(NCOLS - n, n, edp->bkgdattr);
break;
- case 'X': /* ECH erase character */
+ case 'X': /* ECH erase character */
n = min(DEF1_ARG(0), COLS_LEFT + 1);
ERASECOLS(edp->ccol, n, edp->bkgdattr);
break;
- case 'c': /* DA primary */
+ case 'c': /* DA primary */
if (ARG(0) == 0)
wsdisplay_emulinput(edp->cbcookie, WSEMUL_VT_ID1,
sizeof(WSEMUL_VT_ID1));
break;
- case 'g': /* TBC */
- KASSERT(edp->tabs != 0);
- switch (ARG(0)) {
- case 0:
- edp->tabs[edp->ccol] = 0;
- break;
- case 3:
- memset(edp->tabs, 0, edp->ncols);
- break;
- default:
+ case 'g': /* TBC */
+ if (edp->tabs != NULL)
+ switch (ARG(0)) {
+ case 0:
+ edp->tabs[edp->ccol] = 0;
+ break;
+ case 3:
+ memset(edp->tabs, 0, edp->ncols);
+ break;
+ default:
#ifdef VT100_PRINTUNKNOWN
- printf("CSI%dg unknown\n", ARG(0));
+ printf("CSI%dg unknown\n", ARG(0));
#endif
- break;
- }
+ break;
+ }
break;
- case 'm': /* SGR select graphic rendition */
+ case 'm': /* SGR select graphic rendition */
flags = edp->attrflags;
fgcol = edp->fgcol;
bgcol = edp->bgcol;
for (n = 0; n < edp->nargs; n++) {
switch (ARG(n)) {
- case 0: /* reset */
+ case 0: /* reset */
if (n == edp->nargs - 1) {
edp->bkgdattr = edp->curattr = edp->defattr;
edp->attrflags = 0;
@@ -494,43 +495,43 @@ wsemul_vt100_handle_csi(edp, c)
fgcol = WSCOL_WHITE;
bgcol = WSCOL_BLACK;
break;
- case 1: /* bold */
+ case 1: /* bold */
flags |= WSATTR_HILIT;
break;
- case 4: /* underline */
+ case 4: /* underline */
flags |= WSATTR_UNDERLINE;
break;
- case 5: /* blink */
+ case 5: /* blink */
flags |= WSATTR_BLINK;
break;
- case 7: /* reverse */
+ case 7: /* reverse */
flags |= WSATTR_REVERSE;
break;
- case 22: /* ~bold VT300 only */
+ case 22: /* ~bold VT300 only */
flags &= ~WSATTR_HILIT;
break;
- case 24: /* ~underline VT300 only */
+ case 24: /* ~underline VT300 only */
flags &= ~WSATTR_UNDERLINE;
break;
- case 25: /* ~blink VT300 only */
+ case 25: /* ~blink VT300 only */
flags &= ~WSATTR_BLINK;
break;
- case 27: /* ~reverse VT300 only */
+ case 27: /* ~reverse VT300 only */
flags &= ~WSATTR_REVERSE;
break;
- case 30: case 31: case 32: case 33:
- case 34: case 35: case 36: case 37:
+ case 30: case 31: case 32: case 33:
+ case 34: case 35: case 36: case 37:
/* fg color */
flags |= WSATTR_WSCOLORS;
fgcol = ARG(n) - 30;
break;
- case 40: case 41: case 42: case 43:
- case 44: case 45: case 46: case 47:
+ case 40: case 41: case 42: case 43:
+ case 44: case 45: case 46: case 47:
/* bg color */
flags |= WSATTR_WSCOLORS;
bgcol = ARG(n) - 40;
break;
- default:
+ default:
#ifdef VT100_PRINTUNKNOWN
printf("CSI%dm unknown\n", ARG(n));
#endif
@@ -551,13 +552,14 @@ wsemul_vt100_handle_csi(edp, c)
edp->bgcol = bgcol;
}
break;
- case 'n': /* reports */
+ case 'n': /* reports */
switch (ARG(0)) {
- case 5: /* DSR operating status */
+ case 5: /* DSR operating status */
/* 0 = OK, 3 = malfunction */
wsdisplay_emulinput(edp->cbcookie, "\033[0n", 4);
break;
- case 6: { /* DSR cursor position report */
+ case 6: /* DSR cursor position report */
+ {
char buf[20];
int row;
if (edp->flags & VTFL_DECOM)
@@ -571,28 +573,28 @@ wsemul_vt100_handle_csi(edp, c)
else if (n >= sizeof buf)
n = sizeof buf - 1;
wsdisplay_emulinput(edp->cbcookie, buf, n);
- }
+ }
break;
- case 15: /* DSR printer status */
+ case 15: /* DSR printer status */
/* 13 = no printer, 10 = ready, 11 = not ready */
wsdisplay_emulinput(edp->cbcookie, "\033[?13n", 6);
break;
- case 25: /* UDK status - VT300 only */
+ case 25: /* UDK status - VT300 only */
/* 20 = locked, 21 = unlocked */
wsdisplay_emulinput(edp->cbcookie, "\033[?21n", 6);
break;
- case 26: /* keyboard dialect */
+ case 26: /* keyboard dialect */
/* 1 = north american , 7 = german */
wsdisplay_emulinput(edp->cbcookie, "\033[?27;1n", 8);
break;
- default:
+ default:
#ifdef VT100_PRINTUNKNOWN
printf("CSI%dn unknown\n", ARG(0));
#endif
break;
}
break;
- case 'r': /* DECSTBM set top/bottom margins */
+ case 'r': /* DECSTBM set top/bottom margins */
help = min(DEF1_ARG(0), edp->nrows) - 1;
n = min(DEFx_ARG(1, edp->nrows), edp->nrows) - help;
if (n < 2) {
@@ -606,19 +608,19 @@ wsemul_vt100_handle_csi(edp, c)
edp->scrreg_startrow : 0);
edp->ccol = 0;
break;
- case 'y':
+ case 'y':
switch (ARG(0)) {
- case 4: /* DECTST invoke confidence test */
+ case 4: /* DECTST invoke confidence test */
/* ignore */
break;
- default:
+ default:
#ifdef VT100_PRINTUNKNOWN
printf("CSI%dy unknown\n", ARG(0));
#endif
break;
}
break;
- default:
+ default:
#ifdef VT100_PRINTUNKNOWN
printf("CSI%c (%d, %d) unknown\n", c, ARG(0), ARG(1));
#endif
@@ -717,35 +719,37 @@ wsemul_vt100_handle_dcs(edp)
int i, pos;
switch (edp->dcstype) {
- case 0: /* not handled */
+ case 0: /* not handled */
return;
- case DCSTYPE_TABRESTORE:
- KASSERT(edp->tabs != 0);
- memset(edp->tabs, 0, edp->ncols);
- pos = 0;
- for (i = 0; i < edp->dcspos; i++) {
- char c = edp->dcsarg[i];
- switch (c) {
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
- pos = pos * 10 + (edp->dcsarg[i] - '0');
- break;
- case '/':
- if (pos > 0)
- edp->tabs[pos - 1] = 1;
- pos = 0;
- break;
- default:
+ case DCSTYPE_TABRESTORE:
+ if (edp->tabs != NULL) {
+ memset(edp->tabs, 0, edp->ncols);
+ pos = 0;
+ for (i = 0; i < edp->dcspos; i++) {
+ char c = edp->dcsarg[i];
+ switch (c) {
+ case '0': case '1': case '2': case '3':
+ case '4': case '5': case '6': case '7':
+ case '8': case '9':
+ pos = pos * 10 + (edp->dcsarg[i] - '0');
+ break;
+ case '/':
+ if (pos > 0)
+ edp->tabs[pos - 1] = 1;
+ pos = 0;
+ break;
+ default:
#ifdef VT100_PRINTUNKNOWN
- printf("unknown char %c in DCS\n", c);
+ printf("unknown char %c in DCS\n", c);
#endif
- break;
+ break;
+ }
}
+ if (pos > 0)
+ edp->tabs[pos - 1] = 1;
}
- if (pos > 0)
- edp->tabs[pos - 1] = 1;
break;
- default:
+ default:
panic("wsemul_vt100_handle_dcs: bad type %d", edp->dcstype);
}
edp->dcstype = 0;
diff --git a/sys/dev/wscons/wsemul_vt100var.h b/sys/dev/wscons/wsemul_vt100var.h
index 1c9eb66c81b..69b921b4132 100644
--- a/sys/dev/wscons/wsemul_vt100var.h
+++ b/sys/dev/wscons/wsemul_vt100var.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: wsemul_vt100var.h,v 1.5 2004/12/23 21:47:47 miod Exp $ */
+/* $OpenBSD: wsemul_vt100var.h,v 1.6 2007/01/07 13:31:36 miod Exp $ */
/* $NetBSD: wsemul_vt100var.h,v 1.5 2000/04/28 21:56:17 mycroft Exp $ */
/*
@@ -138,4 +138,4 @@ void wsemul_vt100_handle_dcs(struct wsemul_vt100_emuldata *);
int wsemul_vt100_translate(void *cookie, keysym_t, char **);
void vt100_initchartables(struct wsemul_vt100_emuldata *);
-void vt100_setnrc(struct wsemul_vt100_emuldata *, int);
+int vt100_setnrc(struct wsemul_vt100_emuldata *, int);