summaryrefslogtreecommitdiff
path: root/sys/dev/wscons/wsemul_vt100_subr.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/wscons/wsemul_vt100_subr.c')
-rw-r--r--sys/dev/wscons/wsemul_vt100_subr.c270
1 files changed, 137 insertions, 133 deletions
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;