vttest.c: vt100 compatibility test (part 2 of 2)
Johan Wide'n
johanw at ttds.UUCP
Tue May 1 10:48:41 AEST 1984
This program tests vt100 lookalikes for compatibility.
An smaller version of this program was posted to net.sources
a few month's ago. The program was developed under TOPS-10
which explains it's non-UNIX flavour. It has been run under
BSD4.2 (VAX), version 7 (PDP-11) and System III (MC68000).
{decvax,philabs}!mcvax!enea!ttds!johanw Johan Widen
The Royal Institute of
Technology
Stockholm
Cut at this line
----------------------------------------------------------
: This is a shar archive. Extract with sh, not csh.
echo x - Makefile
cat > Makefile << '!Funky!Stuff!'
# Do not define SIII or XENIX if you have v7 or BSD
CFLAGS= # -DSIII -DXENIX
LDFLAGS=
DEST=/usr/local
OBJECTS=vttest.o
vttest: $(OBJECTS)
$(CC) $(LDFLAGS) -o vttest $(OBJECTS)
install: vttest
install -s vttest $(DEST)
clean:
rm -f $(OBJECTS) vttest
vttest.c:
cat vttest.c1 vttest.c2 >vttest.c
!Funky!Stuff!
echo x - vttest.c2
cat > vttest.c2 << '!Funky!Stuff!'
tst_reports() {
/* Test of:
<ENQ> (AnswerBack Message)
SM RM (Set/Reset Mode) - LineFeed / Newline
DSR (Device Status Report)
DA (Device Attributes)
DECREQTPARM (Request Terminal Parameters)
*/
int parity, nbits, xspeed, rspeed, clkmul, flags;
int i, reportpos;
char *report, *report2;
static char *attributes[][2] = {
{ "\033[?1;0c", "No options (vanilla VT100)" },
{ "\033[?1;1c", "STP" },
{ "\033[?1;2c", "AVO (could be a VT102)" },
{ "\033[?1;3c", "STP and AVO" },
{ "\033[?1;4c", "GPO" },
{ "\033[?1;5c", "STP and GPO" },
{ "\033[?1;6c", "AVO and GPO" },
{ "\033[?1;7c", "STP, AVO and GPO" },
{ "\033[?12;5c", "VT125" },
{ "\033[?12;7c", "VT125 with AVO" },
{ "\033[?7c", "VT131" },
{ "\033[?5;0c", "VK100 (GIGI)" },
{ "\033[?5c", "VK100 (GIGI)" },
{ "", "" }
};
#ifdef UNIX
sgttyNew.sg_flags &= ~ECHO;
stty(0, &sgttyNew);
#endif
ed(2);
cup(5,1);
println("This is a test of the ANSWERBACK MESSAGE. (To load the A.B.M.");
println("see the TEST KEYBOARD part of this program). Below here, the");
println("current answerback message in your terminal should be");
println("displayed. Finish this test with RETURN.");
cup(10,1);
inflush();
printf("%c", 5); /* ENQ */
report = instr();
cup(10,1);
chrprint(report);
cup(12,1);
pause1();
ed(2);
cup(1,1);
println("Test of LineFeed/NewLine mode.");
cup(3,1);
sm("20");
#ifdef UNIX
sgttyNew.sg_flags &= ~CRMOD;
stty(0, &sgttyNew);
#endif
printf("NewLine mode set. Push the RETURN key: ");
report = instr();
cup(4,1);
el(0);
chrprint(report);
if (!strcmp(report, "\015\012")) printf(" -- OK");
else printf(" -- Not expected");
cup(6,1);
rm("20");
printf("NewLine mode reset. Push the RETURN key: ");
report = instr();
cup(7,1);
el(0);
chrprint(report);
if (!strcmp(report, "\015")) printf(" -- OK");
else printf(" -- Not expected");
cup(9,1);
#ifdef UNIX
sgttyNew.sg_flags |= CRMOD;
stty(0, &sgttyNew);
#endif
pause1();
ed(2);
cup(1,1);
printf("Test of Device Status Report 5 (report terminal status).");
cup(2,1);
dsr(5);
report = instr();
cup(2,1);
el(0);
printf("Report is: ");
chrprint(report);
if (!strcmp(report,"\033[0n")) printf(" -- means \"TERMINAL OK\"");
else if (!strcmp(report,"\033[3n")) printf(" -- means \"TERMINAL OK\"");
else printf(" -- Unknown response!");
cup(4,1);
println("Test of Device Status Report 6 (report cursor position).");
cup(5,1);
dsr(6);
report = instr();
cup(5,1);
el(0);
printf("Report is: ");
chrprint(report);
if (!strcmp(report,"\033[5;1R")) printf(" -- OK");
else printf(" -- Unknown response!");
cup(7,1);
println("Test of Device Attributes report (what are you)");
cup(8,1);
da(0);
report = instr();
cup(8,1);
el(0);
printf("Report is: ");
chrprint(report);
for (i = 0; *attributes[i][0] != '\0'; i++) {
if (!strcmp(report,attributes[i][0])) break;
}
if (*attributes[i][0] == '\0')
printf(" -- Unknown response, refer to the manual");
else {
printf(" -- means %s", attributes[i][1]);
if (i) {
cup(9,1);
println("Legend: STP = Processor Option");
println(" AVO = Advanced Video Option");
println(" GPO = Graphics Processor Option");
}
}
cup(13,1);
println("Test of the \"Request Terminal Parameters\" feature, argument 0.");
cup(14,1);
decreqtparm(0);
report = instr();
cup(14,1);
el(0);
printf("Report is: ");
chrprint(report);
if (strlen(report) < 16
|| report[0] != '\033'
|| report[1] != '['
|| report[2] != '2'
|| report[3] != ';')
println(" -- Bad format");
else {
reportpos = 4;
parity = scanto(report, &reportpos, ';');
nbits = scanto(report, &reportpos, ';');
xspeed = scanto(report, &reportpos, ';');
rspeed = scanto(report, &reportpos, ';');
clkmul = scanto(report, &reportpos, ';');
flags = scanto(report, &reportpos, 'x');
if (parity == 0 || nbits == 0 || clkmul == 0) println(" -- Bad format");
else println(" -- OK");
printf(
"This means: Parity %s, %s bits, xmitspeed %s, recvspeed %s.\n",
lookup(paritytable, parity),
lookup(nbitstable, nbits),
lookup(speedtable, xspeed),
lookup(speedtable, rspeed));
printf("(CLoCk MULtiplier = %d, STP option flags = %d)\n", clkmul, flags);
}
cup(18,1);
println("Test of the \"Request Terminal Parameters\" feature, argument 1.");
cup(19,1);
decreqtparm(1); /* Does the same as decreqtparm(0), reports "3" */
report2 = instr();
cup(19,1);
el(0);
printf("Report is: ");
chrprint(report2);
if (strlen(report2) < 3
|| report2[2] != '3')
println(" -- Bad format");
else {
report2[2] = '2';
if (!strcmp(report,report2)) println(" -- OK");
else println(" -- Bad format");
}
cup(24,1);
pause1();
#ifdef UNIX
sgttyNew.sg_flags |= ECHO;
stty(0, &sgttyNew);
#endif
}
tst_vt52() {
static struct rtabl {
char *rcode;
char *rmsg;
} resp1onstable[] = {
{ "\033/K", " -- OK (means Standard VT52)" },
{ "\033/Z", " -- OK (means VT100 emulating VT52)" },
{ "", " -- Unknown response"}
};
int i,j;
char *response;
rm("?2"); /* Reset ANSI (VT100) mode, Set VT52 mode */
esc("H"); /* Cursor home */
esc("J"); /* Erase to end of screen */
esc("H"); /* Cursor home */
for (i = 0; i <= 23; i++) {
for (j = 0; j <= 9; j++)
printf("%s", "FooBar ");
println("Bletch");
}
esc("H"); /* Cursor home */
esc("J"); /* Erase to end of screen */
vt52cup(7,47);
printf("nothing more.");
for (i = 1; i <= 10; i++) printf("THIS SHOULD GO AWAY! ");
for (i = 1; i <= 5; i++) {
vt52cup(1,1);
printf("%s", "Back scroll (this should go away)");
esc("I"); /* Reverse LineFeed (with backscroll!) */
}
vt52cup(12,60);
esc("J"); /* Erase to end of screen */
for (i = 2; i <= 6; i++) {
vt52cup(i,1);
esc("K"); /* Erase to end of line */
}
for (i = 2; i <= 23; i++) {
vt52cup(i,70); printf("%s", "**Foobar");
}
vt52cup(23,10);
for (i = 23; i >= 2; i--) {
printf("%s", "*");
printf("%c", 8); /* BS */
esc("I"); /* Reverse LineFeed (LineStarve) */
}
vt52cup(1,70);
for (i = 70; i >= 10; i--) {
printf("%s", "*");
esc("D"); esc("D"); /* Cursor Left */
}
vt52cup(24,10);
for (i = 10; i <= 70; i++) {
printf("%s", "*");
printf("%c", 8); /* BS */
esc("C"); /* Cursor Right */
}
vt52cup(2,11);
for (i = 2; i <= 23; i++) {
printf("%s", "!");
printf("%c", 8); /* BS */
esc("B"); /* Cursor Down */
}
vt52cup(23,69);
for (i = 23; i >= 2; i--) {
printf("%s", "!");
printf("%c", 8); /* BS */
esc("A"); /* Cursor Up */
}
for (i = 2; i <= 23; i++) {
vt52cup(i,71);
esc("K"); /* Erase to end of line */
}
vt52cup(10,16);
printf("%s", "The screen should be cleared, and have a centered");
vt52cup(11,16);
printf("%s", "rectangle of \"*\"s with \"!\"s on the inside to the");
vt52cup(12,16);
printf("%s", "left and right. Only this, and");
vt52cup(13,16);
pause1();
esc("H"); /* Cursor home */
esc("J"); /* Erase to end of screen */
printf("%s", "This is the normal character set:");
for (j = 0; j <= 1; j++) {
vt52cup(3 + j, 16);
for (i = 0; i <= 47; i++)
printf("%c", 32 + i + 48 * j);
}
vt52cup(6,1);
printf("%s", "This is the special graphics character set:");
esc("F"); /* Select Special Graphics character set */
for (j = 0; j <= 1; j++) {
vt52cup(8 + j, 16);
for (i = 0; i <= 47; i++)
printf("%c", 32 + i + 48 * j);
}
esc("G"); /* Select ASCII character set */
vt52cup(12,1);
pause1();
esc("H"); /* Cursor home */
esc("J"); /* Erase to end of screen */
println("Test of terminal response to IDENTIFY command");
esc("Z"); /* Identify */
response = instr();
println("");
printf("Response was");
esc("<"); /* Enter ANSI mode (VT100 mode) */
chrprint(response);
for(i = 0; resp1onstable[i].rcode[0] != '\0'; i++)
if (!strcmp(response, resp1onstable[i].rcode))
break;
printf("%s", resp1onstable[i].rmsg);
println("");
println("");
pause1();
}
tst_bugs() {
/*
* Test of
* VT100 "Wrap around / cursor position 80" bug.
* VT100 "Toggle origin mode, forget rest" bug.
* VT100 "Scroll while toggling softscroll" bug.
*
* - RIS (Reset to Initial State)
* - DECTST (invoke terminal test)
*/
int i, row, col;
ed (2);
cup (1, 1);
for (col = 1; col <= 79; col++)
printf ("+");
for (row = 1; row <= 24; row++) {
hvp (row, 80);
printf ("*");
}
cup (10, 10);
printf ("This illustrates the \"wrap around bug\" which exists on a");
cup (11, 10);
printf ("standard VT100. On the top of the screen there should be");
cup (12, 10);
printf ("a row of +'s, and the rightmost column should be filled");
cup (13, 10);
printf ("with *'s. But if the bug is present, some of the *'s may");
cup (14, 10);
printf ("be placed in other places, e.g. in the leftmost column,");
cup (15, 10);
printf ("and the top line of +'s may be scrolled away.");
cup (17, 10);
printf ("Of course, a good VT100-compatible terminal should have");
cup (18, 10);
printf ("means of shutting this bug off (if it has it at all!)");
cup (20, 10);
pause1();
/*
* VT100 "toggle origin mode, forget rest" bug. If you try to set
* (or clear) parameters and one of them is the "origin mode"
* ("?6") parameter, parameters that appear after the "?6"
* remain unaffected. This is also true on CIT-101 terminals.
*/
ed (2);
sm ("?5"); /* Set reverse mode */
sm ("?3"); /* Set 132 column mode */
println("Test VT100 'Toggle origin mode, forget rest' bug, part 1.");
println("The screen should be in reverse, 132 column mode.");
pause1();
ed (2);
rm ("?6;5;3"); /* Reset (origin, reverse, 132 col) */
println("Test VT100 'Toggle origin mode, forget rest' bug, part 2.\n");
println("The screen should be in non-reverse, 80 column mode.");
printf("%s", "(Otherwise, RESET the terminal). ");
pause1();
/*
* Test VT100 "Scroll while toggling softscroll" bug:
* The cursor may disappear entirely after you type in a few carriage
* returns. It may reappear, moving UP the screen. You may see
* multiple copies of some lines. You must RESET the terminal to
* cure the problem.
*/
ed (2);
cup (10, 1);
printf ("Next is a test of the VT100 'Scroll while toggle softscroll'\n");
printf ("bug. The cursor may disappear, or move UP the screen, or\n");
printf ("multiple copies of some lines may appear. After this test,\n");
printf ("may want to RESET the terminal.\n\n\n");
/*
* Invoke the bug
*/
esc ("[24H"); /* Simplified cursor movement */
sm ("?4"); /* Set soft scroll */
nel (); /* "NextLine", move down */
rm ("?4"); /* Reset soft scroll */
nel (); /* "NextLine", move down */
for (i = 1; i <= 10; i++) { /* Show the bug */
printf ("Softscroll bug test, line %d. ", i);
pause1();
}
/*
* Get rid of the bug.
*/
printf ("End of softscroll test. The terminal will now be RESET. ");
pause1();
ris();
#ifdef SARGASSO
sleep(5000); /* Wait 5.0 seconds */
#endif
#ifdef UNIX
sleep(5);
#endif
println("The terminal is now RESET. Next, the built-in confidence test");
printf("%s", "will be invoked. ");
pause1();
ed(2);
dectst(1);
#ifdef SARGASSO
sleep(5000); /* Wait 5.0 seconds */
#endif
#ifdef UNIX
sleep(5);
#endif
cup(5,1);
println("If the built-in confidence test found any errors, a code");
printf("%s", "is visible above. ");
pause1();
}
initterminal() {
#ifdef UNIX
setbuf(stdout,NULL);
gtty(0,&sgttyOrg);
gtty(0,&sgttyNew);
sgttyNew.sg_flags |= CBREAK;
stty(0,&sgttyNew);
#ifdef SIII
close(2);
open("/dev/tty",O_RDWR|O_NDELAY);
#endif
#endif
#ifdef SARGASSO
/* Set up neccesary TOPS-10 terminal parameters */
trmop(02002, 0); /* tty no tape */
trmop(02003, 1); /* tty lc */
trmop(02005, 1); /* tty tab */
trmop(02010, 1); /* tty no crlf */
trmop(02020, 0); /* tty no tape */
trmop(02021, 1); /* tty page */
trmop(02025, 0); /* tty blanks */
trmop(02026, 1); /* tty no alt */
trmop(02040, 1); /* tty defer */
trmop(02041, `VT100`); /* tty type vt100 */
#endif
/* Set up my personal prejudices */
esc("<"); /* Enter ANSI mode (if in VT52 mode) */
rm("?3"); /* 80 col mode */
sm("?7"); /* Wrap around on */
rm("?8"); /* Auto repeat off */
decstbm(0,0); /* No scroll region */
}
bye () {
/* Force my personal prejudices upon the poor luser */
rm("?3"); /* 80 col mode */
rm("?6"); /* Absolute origin mode */
sm("?7"); /* Wrap around on */
sm("?8"); /* Auto repeat on */
decstbm(0,0); /* No scroll region */
/* Say goodbye */
ed(2);
cup(12,30);
printf("That's all, folks!\n");
printf("\n\n\n");
inflush();
#ifdef UNIX
stty(0,&sgttyOrg);
#endif
exit();
}
pause1 () {
printf("Push <RETURN>");
readnl();
}
readnl() {
#ifdef UNIX
char ch;
do { read(0,&ch,1); } while(ch != '\n');
#endif
#ifdef SARGASSO
while (getchar() != '\n')
;
#endif
}
scanto(str, pos, toc) char *str; int *pos; char toc; {
char c;
int result = 0;
while (toc != (c = str[(*pos)++])) {
if (isdigit(c)) result = result * 10 + c - '0';
else break;
}
if (c == toc) return(result);
else return(0);
}
char *lookup(t, k) struct table t[]; int k; {
int i;
for (i = 0; t[i].key != -1; i++) {
if (t[i].key == k) return(t[i].msg);
}
return("BAD VALUE");
}
menu(tableptr, header) char *tableptr[]; char *header; {
int i, tablesize, choice;
char choicec;
ed(2);
cup(1, 10);
printf("%s", header);
tablesize = 0;
for (i = 0; *tableptr[i] != '\0'; i++) {
cup(4 + 2 * tablesize, 10);
printf("%d. %s", i, tableptr[i]);
tablesize++;
}
tablesize--;
cup(7 + 2 * tablesize, 10);
printf("Enter choice number (0 - %d): ", tablesize);
for(;;) {
scanf("%1s", &choicec);
readnl();
choice = choicec - '0';
if (choice >= 0 && choice <= tablesize)
return (choice);
printf("%9sBad choice, try again: ", "");
}
}
chrprint (s) char *s; {
int i;
printf(" ");
sgr("7");
printf(" ");
for (i = 0; s[i] != '\0'; i++) {
if (s[i] <= ' ' || s[i] == '\177')
printf("<%d> ", s[i]);
else printf("%c ", s[i]);
}
sgr("");
}
#ifdef SARGASSO
sleep(t) int t; {
calli(072,t); /* (HIBER) t milliseconds */
}
#endif
inflush () {
/*
* Flush input buffer, make sure no pending input character
*/
int val;
#ifdef UNIX
#ifdef XENIX
while(rdchk(0)) read(0,&val,1);
#else
#ifdef SIII
while(read(2,&val,1));
#else
long l1;
ioctl (0, FIONREAD, &l1);
while(l1-- > 0L) read(0,&val,1);
#endif
#endif
#endif
#ifdef SARGASSO
while(uuo(051,2,&val)) /* TTCALL 2, (INCHRS) */
;
#endif
}
char inchar() {
/*
* Wait until a character is typed on the terminal
* then read it, without waiting for CR.
*/
int val, waittime;
#ifdef UNIX
char ch;
read(0,&ch,1); val = ch;
#endif
#ifdef SARGASSO
waittime = 0;
while(!uuo(051,2,&val)) { /* TTCALL 2, (INCHRS) */
sleep(100); /* Wait 0.1 seconds */
if ((waittime += ttymode) > 600) /* Time-out, in case */
return('\177'); /* of hung in ttybin(1) */
}
#endif
return(val);
}
char *instr() {
/*
* Get an unfinished string from the terminal:
* wait until a character is typed on the terminal,
* then read it, and all other available characters.
* Return a pointer to that string.
*/
int i, val, crflag; long l1; char ch;
static char result[80];
i = 0;
result[i++] = inchar();
#ifdef SARGASSO
sleep(100); /* Wait 0.1 seconds */
#endif
#ifdef UNIX
sleep(1); /* can't sleep 0.1 seconds in vanilla UNIX */
#ifdef XENIX
while(rdchk(0)) {
read(0,result+i,1);
if (i++ == 78) break;
}
#else
#ifdef SIII
while(read(2,result+i,1) == 1)
if (i++ == 78) break;
#else
while(ioctl(0,FIONREAD,&l1), l1 > 0L) {
while(l1-- > 0L) {
read(0,result+i,1);
if (i++ == 78) goto out1;
}
}
out1:
#endif
#endif
#endif
#ifdef SARGASSO
while(uuo(051,2,&val)) { /* TTCALL 2, (INCHRS) */
if (!(val == '\012' && crflag)) /* TOPS-10 adds LF to CR */
result[i++] = val;
crflag = val == '\015';
if (i == 79) break;
sleep(50); /* Wait 0.05 seconds */
}
#endif
result[i] = '\0';
return(result);
}
ttybin(bin) int bin; {
#ifdef SARGASSO
#define OPEN 050
#define IO_MOD 0000017
#define _IOPIM 2
#define _IOASC 0
#define _TOPAG 01021
#define _TOSET 01000
int v;
static int arglst[] = {
_IOPIM,
`TTY`,
0
};
arglst[0] = bin ? _IOPIM : _IOASC;
v = uuo(OPEN, 1, &arglst[0]);
if (!v) { printf("OPEN failed"); exit(); }
trmop(_TOPAG + _TOSET, bin ? 0 : 1);
ttymode = bin;
#endif
}
trmop(fc,arg) int fc, arg; {
#ifdef SARGASSO
int retvalp;
int arglst[3];
arglst[0] = fc; /* function code */
arglst[1] = -1; /* UDX, -1 denotes TTY: */
arglst[2] = arg; /* Optional argument */
/* TRMOP. */
if (calli(0116, 3 // &arglst[0], &retvalp))
return (retvalp);
else {
printf("?Error return in TRMOP.");
exit();
}
#endif
}
println(s) char *s; {
printf("%s\n", s);
}
esc(s) char *s; {
printf("%c%s", 27, s);
}
esc2(s1, s2) char s1, s2; {
printf("%c%s%s", 27, s1, s2);
}
brcstr(ps, c) char *ps, c; {
printf("%c[%s%c", 27, ps, c);
}
brc(pn,c) int pn; char c; {
char *str, *ptr;
ptr = str = "[ ";
ptr++;
if (pn > 99) { *ptr++ = (pn / 100) + 48; pn %= 100; }
if (pn > 9) { *ptr++ = (pn / 10) + 48; pn %= 10; }
*ptr++ = pn + 48;
*ptr++ = c;
*ptr = '\0';
printf("%c%s", 27, str);
}
brc2(pn1, pn2 ,c) int pn1, pn2; char c; {
char *str, *ptr;
ptr = str = "[ ";
ptr++;
if (pn1 > 99) { *ptr++ = (pn1 / 100) + 48; pn1 %= 100; }
if (pn1 > 9) { *ptr++ = (pn1 / 10) + 48; pn1 %= 10; }
*ptr++ = pn1 + 48;
*ptr++ = ';';
if (pn2 > 99) { *ptr++ = (pn2 / 100) + 48; pn2 %= 100; }
if (pn2 > 9) { *ptr++ = (pn2 / 10) + 48; pn2 %= 10; }
*ptr++ = pn2 + 48;
*ptr++ = c;
*ptr = '\0';
printf("%c%s", 27, str);
}
cub(pn) int pn; { /* Cursor Backward */
brc(pn,'D');
}
cud(pn) int pn; { /* Cursor Down */
brc(pn,'B');
}
cuf(pn) int pn; { /* Cursor Forward */
brc(pn,'C');
}
cup(pn1, pn2) int pn1, pn2; { /* Cursor Position */
brc2(pn1, pn2, 'H');
}
cuu(pn) int pn; { /* Cursor Up */
brc(pn,'A');
}
da() { /* Device Attributes */
brc(0,'c');
}
decaln() { /* Screen Alignment Display */
esc("#8");
}
decdhl(lower) int lower; { /* Double Height Line (also double width) */
if (lower) esc("#4");
else esc("#3");
}
decdwl() { /* Double Wide Line */
esc("#6");
}
deckpam() { /* Keypad Application Mode */
esc("=");
}
deckpnm() { /* Keypad Numeric Mode */
esc(">");
}
decll(ps) char *ps; { /* Load LEDs */
brcstr(ps, 'q');
}
decrc() { /* Restore Cursor */
esc("8");
}
decreqtparm(pn) int pn; { /* Request Terminal Parameters */
brc(pn,'x');
}
decsc() { /* Save Cursor */
esc("7");;
}
decstbm(pn1, pn2) int pn1, pn2; { /* Set Top and Bottom Margins */
brc2(pn1, pn2, 'r');
}
decswl() { /* Single With Line */
esc("#5");
}
dectst(pn) int pn; { /* Invoke Confidence Test */
brc2(2, pn, 'y');
}
dsr(pn) int pn; { /* Device Status Report */
brc(pn, 'n');
}
ed(pn) int pn; { /* Erase in Display */
brc(pn, 'J');
}
el(pn) int pn; { /* Erase in Line */
brc(pn,'K');
}
hts() { /* Horizontal Tabulation Set */
esc("H");
}
hvp(pn1, pn2) int pn1, pn2; { /* Horizontal and Vertical Position */
brc2(pn1, pn2, 'f');
}
ind() { /* Index */
esc("D");
}
nel() { /* Next Line */
esc("E");
}
ri() { /* Reverse Index */
esc("M");
}
ris() { /* Reset to Initial State */
esc("c");
}
rm(ps) char *ps; { /* Reset Mode */
brcstr(ps, 'l');
}
scs(g,c) int g; char c; { /* Select character Set */
printf("%c%c%c%c%c%c%c", 27, g ? ')' : '(', c,
27, g ? '(' : ')', 'B',
g ? 14 : 15);
}
sgr(ps) char *ps; { /* Select Graphic Rendition */
brcstr(ps, 'm');
}
sm(ps) char *ps; { /* Set Mode */
brcstr(ps, 'h');
}
tbc(pn) int pn; { /* Tabulation Clear */
brc(pn, 'g');
}
vt52cup(l,c) int l,c; {
printf("%cY%c%c", 27, l + 31, c + 31);
}
!Funky!Stuff!
More information about the Comp.sources.unix
mailing list