*BSD News Article 9903


Return to BSD News archive

Received: by minnie.vk1xwt.ampr.org with NNTP
	id AA6777 ; Fri, 15 Jan 93 10:31:37 EST
Xref: sserve comp.unix.bsd:9960 alt.sources:4984
Path: sserve!manuel.anu.edu.au!munnari.oz.au!spool.mu.edu!umn.edu!lynx.unm.edu!fmsrl7!destroyer!gumby!yale!yale.edu!ira.uka.de!Germany.EU.net!hcshh!hm
From: hm@hcshh.hcs.de (Hellmuth Michaelis)
Newsgroups: comp.unix.bsd,alt.sources
Subject: [386BSD] pcvt 2.00 - VT220 console driver (part 03/11)
Summary: 386BSD 0.1 VT220 console device driver source code
Keywords: 386BSD console driver VT220
Message-ID: <1619@hcshh.hcs.de>
Date: 15 Jan 93 13:02:10 GMT
Followup-To: comp.unix.bsd
Organization: HCS GmbH, Hamburg, Europe
Lines: 558

Submitted-by: hm@hcshh.hcs.de (Hellmuth Michaelis)
Archive-name: pcvt-2.00/part03

---- Cut Here and unpack ----
#!/bin/sh
# This is part 03 of pcvt-2.00
if touch 2>&1 | fgrep '[-amc]' > /dev/null
 then TOUCH=touch
 else TOUCH=true
fi
# ============= Support/vttest/README ==============
if test X"$1" != X"-c" -a -f 'Support/vttest/README'; then
	echo "File already exists: skipping 'Support/vttest/README'"
else
echo "x - extracting Support/vttest/README (Text)"
sed 's/^X//' << 'SHAR_EOF' > Support/vttest/README &&
XNOTES FROM THE MOD.SOURCES MODERATOR:
XI split the source up into the three separate pieces it now is.
XIn doing this, I put lines like "int reading;" in a header file
Xthat both C modules include.  If your Unix requires one of these
Xto be "extern int reading;" then you will have some editing to do.
XAlso note that this program uses FIONREAD, which must be implemented
Xdifferently in SystemV, etc., and check out the setjmp() call...
X	/Rich $alz
XOh, yeah:  I also wrote the Makefile and manpage, such as they are.
X-------------------------------------------------------------------
X
XThis is a program to test the compatibility (or to demonstrate the
Xnon-compatibility) of so-called "VT100-compatible" terminals. In
Xconformance of the good old hacker traditions, the only documentation
Xof this program is the source code itself. To understand it, you also
Xneed a copy of the original VT100 manual from DEC.
X
XComments and bug reports: Since this is a release (via USENET) to the
Xwhole world, a lot of people are going to have opinions and fresh
Xideas about it. (What -- bugs in MY program? Aww...)  I can't deal
Xwith everyone sending me a hacked version, but if you have found a
Xserious bug, or ported it to VMS, do tell me. I can't promise any new
Xversion release, though. From this version on (1.7b) VTTEST will have
Xto live its own life without its father holding its hand.
X
XMy adress is:
X
XNetwork-mail adress:     (mcvax,seismo)!enea!suadb!lindberg
X
XReal-world-mail address: Per Lindberg
X                         QZ, Stockholm University Computing Center
X			 Box 27322
X			 S - 102 54  Stockholm
X			 SWEDEN
X
XThe original version of this program is written for the Sargasso C
Xcompiler for the DECsystem-10. Many thanks to all sales persons with
Xquote VT100-compatible unquote terminals, who prompted me to write
Xthis program, and also to:
X
X-- Bo Kleve, LIDAC, Linkoping University, Sweden
X   for the portation to DECSYSTEM-20 with the Sargasso C compiler
X
X-- Johan Widen, TTDS, Royal Institute of Technology, Stockholm, Sweden
X   for the portation to various UNIX systems (incl. System III and Xenix)
X
X-- Russ Herman, AES Data Inc., Missisauga, Ont. Canada
X   for fixes and code for the VT102 test
X
XThanx also to JMR "Gremlin" at KTH, and Goran Wallberg at QZ
Xfor suggestions, bug fixes, etc.
X
XThis program does not have support for all the different variations
Xof VT100, like VT125, VT131 nor the new VT200 series. Feel free to
Xadd that yourself. Happy Hacking!
X
X                 /TMP
SHAR_EOF
$TOUCH -am 0112125693 Support/vttest/README &&
chmod 0640 Support/vttest/README ||
echo "restore of Support/vttest/README failed"
set `wc -c Support/vttest/README`;Wc_c=$1
if test "$Wc_c" != "2484"; then
	echo original size 2484, current size $Wc_c
fi
fi
# ============= Support/vttest/esc.c ==============
if test X"$1" != X"-c" -a -f 'Support/vttest/esc.c'; then
	echo "File already exists: skipping 'Support/vttest/esc.c'"
else
echo "x - extracting Support/vttest/esc.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > Support/vttest/esc.c &&
X#include "header.h"
X
Xprintln(s) char *s; {
X  printf("%s\n", s);
X}
X
Xesc(s) char *s; {
X  printf("%c%s", 27, s);
X}
X
Xesc2(s1, s2) char s1, s2; {
X  printf("%c%s%s", 27, s1, s2);
X}
X
Xbrcstr(ps, c) char *ps, c; {
X  printf("%c[%s%c", 27, ps, c);
X}
X
Xbrc(pn,c) int pn; char c; {
X  printf("%c[%d%c", 27, pn, c);
X}
X
Xbrc2(pn1, pn2 ,c) int pn1, pn2; char c; {
X  printf("%c[%d;%d%c", 27, pn1, pn2, c);
X}
X
Xcub(pn) int pn; {  /* Cursor Backward */
X  brc(pn,'D');
X}
Xcud(pn) int pn; {  /* Cursor Down */
X  brc(pn,'B');
X}
Xcuf(pn) int pn; {  /* Cursor Forward */
X  brc(pn,'C');
X}
Xcup(pn1, pn2) int pn1, pn2; {  /* Cursor Position */
X  brc2(pn1, pn2, 'H');
X}
Xcuu(pn) int pn; {  /* Cursor Up */
X  brc(pn,'A');
X}
Xda() {  /* Device Attributes */
X  brc(0,'c');
X}
Xdecaln() {  /* Screen Alignment Display */
X  esc("#8");
X}
Xdecdhl(lower) int lower; {  /* Double Height Line (also double width) */
X  if (lower) esc("#4");
X  else       esc("#3");
X}
Xdecdwl() {  /* Double Wide Line */
X  esc("#6");
X}
Xdeckpam() {  /* Keypad Application Mode */
X  esc("=");
X}
Xdeckpnm() {  /* Keypad Numeric Mode */
X  esc(">");
X}
Xdecll(ps) char *ps; {  /* Load LEDs */
X  brcstr(ps, 'q');
X}
Xdecrc() {  /* Restore Cursor */
X  esc("8");
X}
Xdecreqtparm(pn) int pn; {  /* Request Terminal Parameters */
X  brc(pn,'x');
X}
Xdecsc() {  /* Save Cursor */
X  esc("7");
X}
Xdecstbm(pn1, pn2) int pn1, pn2; {  /* Set Top and Bottom Margins */
X  if (pn1 || pn2) brc2(pn1, pn2, 'r');
X  else            esc("[r");
X  /* Good for >24-line terminals */
X}
Xdecswl() {  /* Single With Line */
X  esc("#5");
X}
Xdectst(pn) int pn; {  /* Invoke Confidence Test */
X  brc2(2, pn, 'y');
X}
Xdsr(pn) int pn; {  /* Device Status Report */
X  brc(pn, 'n');
X}
Xed(pn) int pn; {  /* Erase in Display */
X  brc(pn, 'J');
X}
Xel(pn) int pn; {  /* Erase in Line */
X  brc(pn,'K');
X}
Xhts() {  /* Horizontal Tabulation Set */
X  esc("H");
X}
Xhvp(pn1, pn2) int pn1, pn2; {  /* Horizontal and Vertical Position */
X  brc2(pn1, pn2, 'f');
X}
Xind() {  /* Index */
X  esc("D");
X}
Xnel() {  /* Next Line */
X  esc("E");
X}
Xri() {  /* Reverse Index */
X  esc("M");
X}
Xris() { /*  Reset to Initial State */
X  esc("c");
X}
Xrm(ps) char *ps; {  /* Reset Mode */
X  brcstr(ps, 'l');
X}
Xscs(g,c) int g; char c; {  /* Select character Set */
X  printf("%c%c%c%c%c%c%c", 27, g ? ')' : '(', c,
X                           27, g ? '(' : ')', 'B',
X			   g ? 14 : 15);
X}
Xsgr(ps) char *ps; {  /* Select Graphic Rendition */
X  brcstr(ps, 'm');
X}
Xsm(ps) char *ps; {  /* Set Mode */
X  brcstr(ps, 'h');
X}
Xtbc(pn) int pn; {  /* Tabulation Clear */
X  brc(pn, 'g');
X}
X
Xvt52cup(l,c) int l,c; {
X  printf("%cY%c%c", 27, l + 31, c + 31);
X}
X
Xchar inchar() {
X
X  /*
X   *   Wait until a character is typed on the terminal
X   *   then read it, without waiting for CR.
X   */
X
X#ifdef UNIX
X  int lval, waittime, getpid(); static int val; char ch;
X
X  fflush(stdout);
X  lval = val;
X  brkrd = 0;
X  reading = 1;
X  read(0,&ch,1);
X  reading = 0;
X  if (brkrd)
X    val = 0177;
X  else
X    val = ch;
X  if ((val==0177) && (val==lval))
X    kill(getpid(), (int) SIGTERM);
X#endif
X#ifdef SARG10
X  int val, waittime;
X
X  waittime = 0;
X  while(!uuo(051,2,&val)) {		/* TTCALL 2, (INCHRS)	*/
X    zleep(100);				/* Wait 0.1 seconds	*/
X    if ((waittime += ttymode) > 600)	/* Time-out, in case	*/
X      return('\177');			/* of hung in ttybin(1)	*/
X  }
X#endif
X#ifdef SARG20	/* try to fix a time-out function */
X  int val, waittime;
X
X  waittime = 0;
X  while(jsys(SIBE,2,_PRIIN) == 0) {	/* Is input empty? */
X    zleep(100);
X    if ((waittime += ttymode) > 600)
X      return('\177');
X  }
X  ejsys(BIN,_PRIIN);
X  val = jsac[2];
X#endif
X  return(val);
X}
X
Xchar *instr() {
X
X  /*
X   *   Get an unfinished string from the terminal:
X   *   wait until a character is typed on the terminal,
X   *   then read it, and all other available characters.
X   *   Return a pointer to that string.
X   */
X
X
X  int i, val, crflag; long l1; char ch;
X  static char result[80];
X
X  i = 0;
X  result[i++] = inchar();
X/* Wait 0.1 seconds (1 second in vanilla UNIX) */
X#ifdef SARG10
X  if (trmop(01031,0) < 5) zleep(500); /* wait longer if low speed */
X  else                    zleep(100);
X#else
X  zleep(100);
X#endif
X#ifdef UNIX
X  fflush(stdout);
X#ifdef XENIX
X  while(rdchk(0)) {
X    read(0,result+i,1);
X    if (i++ == 78) break;
X  }
X#else
X#ifdef SIII
X  while(read(2,result+i,1) == 1)
X    if (i++ == 78) break;
X#else
X  while(ioctl(0,FIONREAD,&l1), l1 > 0L) {
X    while(l1-- > 0L) {
X      read(0,result+i,1);
X      if (i++ == 78) goto out1;
X    }
X  }
Xout1:
X#endif
X#endif
X#endif
X#ifdef SARG10
X  while(uuo(051,2,&val)) {	/* TTCALL 2, (INCHRS)  */
X    if (!(val == '\012' && crflag))	/* TOPS-10 adds LF to CR */
X      result[i++] = val;
X    crflag = val == '\015';
X    if (i == 79) break;
X    zleep(50);          /* Wait 0.05 seconds */
X  }
X#endif
X#ifdef SARG20
X  while(jsys(SIBE,2,_PRIIN) != 0) {	/* read input until buffer is empty */
X    ejsys(BIN,_PRIIN);
X    result[i++] = jsac[2];
X    if (i == 79) break;
X    zleep(50);		/* Wait 0.05 seconds */
X  }
X#endif
X  result[i] = '\0';
X  return(result);
X}
X
Xttybin(bin) int bin; {
X#ifdef SARG10
X  #define OPEN 050
X  #define IO_MOD 0000017
X  #define _IOPIM 2
X  #define _IOASC 0
X  #define _TOPAG 01021
X  #define _TOSET 01000
X
X  int v;
X  static int arglst[] = {
X    _IOPIM,
X    `TTY`,
X    0    
X  };
X  arglst[0] = bin ? _IOPIM : _IOASC;
X  v = uuo(OPEN, 1, &arglst[0]);
X  if (!v) { printf("OPEN failed"); exit(); }
X  trmop(_TOPAG + _TOSET, bin ? 0 : 1);
X  ttymode = bin;
X#endif
X#ifdef SARG20
X  /*	TTYBIN will set the line in BINARY/ASCII mode
X   *	BINARY mode is needed to send control characters
X   *	Bit 28 must be 0 (we don't flip it).
X   *	Bit 29 is used for the mode change.
X   */
X
X  #define _TTASC 0000100
X  #define _MOXOF 0000043
X
X  int v;
X
X  ejsys(RFMOD,_CTTRM);
X  v = ejsys(SFMOD,_CTTRM, bin ? (~_TTASC & jsac[2]) : (_TTASC | jsac[2]));
X  if (v) { printf("SFMOD failed"); exit(); }
X  v = ejsys(MTOPR,_CTTRM,_MOXOF,0);
X  if (v) { printf("MTOPR failed"); exit(); }
X#endif
X}
X
X#ifdef SARG20
X/*
X *	SUPERBIN turns off/on all input character interrupts
X *	This affects ^C, ^O, ^T
X *	Beware where and how you use it !!!!!!!
X */
X
Xsuperbin(bin) int bin; {
X  int v;
X
X  v = ejsys(STIW,(0//-5), bin ? 0 : -1);
X  if (v) { printf("STIW superbinary setting failed"); exit(); }
X  ttymode = bin;
X}
X
X/*
X *	PAGE affects the ^S/^Q handshake.
X *	Set bit 34 to turn it on. Clear it for off.
X */
X
Xpage(bin) int bin; {
X  int v;
X
X  #define TT_PGM 0000002
X
X  ejsys(RFMOD,_CTTRM);	/* Get the current terminal status */
X  v = ejsys(STPAR,_CTTRM, bin ? (TT_PGM | jsac[2]) : (~TT_PGM & jsac[2]));
X  if (v) { printf("STPAR failed"); exit(); }
X}
X#endif
X
Xtrmop(fc,arg) int fc, arg; {
X#ifdef SARG10
X  int retvalp;
X  int arglst[3];
X
X  /* TRMOP is a TOPS-10 monitor call that does things to the terminal. */
X
X  /* Find out TTY nbr (PA1050 barfs if TRMOP get -1 instead of udx)    */
X  /* A TRMNO monitor call returns the udx (Universal Device Index)     */
X
X  arglst[0] = fc;		/* function code	*/
X  arglst[1] = calli(0115, -1);	/* udx, TRMNO. UUO	*/
X  arglst[2] = arg;		/* Optional argument	*/
X
X  if (calli(0116, 3 // &arglst[0], &retvalp))           /* TRMOP. UUO */
X  return (retvalp);
X  else {
X    printf("?Error return in TRMOP.");
X    exit();
X  }
X#endif
X}
X
Xinputline(s) char *s; {
X  scanf("%s",s);
X#ifdef SARG10
X  readnl();
X#endif
X#ifdef SARG20
X  readnl();
X#endif
X}
X
Xinflush() {
X
X  /*
X   *   Flush input buffer, make sure no pending input character
X   */
X
X  int val;
X
X#ifdef UNIX
X#ifdef XENIX
X  while(rdchk(0)) read(0,&val,1);
X#else
X#ifdef SIII
X  while(read(2,&val,1));
X#else
X  long l1;
X  ioctl (0, FIONREAD, &l1);
X  while(l1-- > 0L) read(0,&val,1);
X#endif
X#endif
X#endif
X#ifdef SARG10
X  while(uuo(051,2,&val))	/* TTCALL 2, (INCHRS)  */
X    ;
X#endif
X#ifdef SARG20
X  ejsys(CFIBF,_PRIIN);		/* Clear input buffer */
X#endif
X}
X
Xzleep(t) int t; {
X
X/*
X *    Sleep and do nothing (don't waste CPU) for t milliseconds
X */
X
X#ifdef SARG10
X  calli(072,t);		/* (HIBER) t milliseconds */
X#endif
X#ifdef SARG20
X  ejsys(DISMS,t);	/* DISMISS for t milliseconds */
X#endif
X#ifdef UNIX
X  t = t / 1000;
X  if (t == 0) t = 1;
X  sleep(t);		/* UNIX can only sleep whole seconds */
X#endif
X}
SHAR_EOF
$TOUCH -am 0112125693 Support/vttest/esc.c &&
chmod 0640 Support/vttest/esc.c ||
echo "restore of Support/vttest/esc.c failed"
set `wc -c Support/vttest/esc.c`;Wc_c=$1
if test "$Wc_c" != "8060"; then
	echo original size 8060, current size $Wc_c
fi
fi
# ============= Support/vttest/header.h ==============
if test X"$1" != X"-c" -a -f 'Support/vttest/header.h'; then
	echo "File already exists: skipping 'Support/vttest/header.h'"
else
echo "x - extracting Support/vttest/header.h (Text)"
sed 's/^X//' << 'SHAR_EOF' > Support/vttest/header.h &&
X#define VERSION "1.7b 1985-04-19"
X
X/* Choose one of these */
X
X/* #define XENIX        /* XENIX implies UNIX                           */
X/* #define SIII         /* SIII  implies UNIX, (NDELAY a la System III) */
X#define UNIX            /* UNIX                                         */
X/* #define VMS          /* VMS not done yet -- send me your version!!!! */
X/* #define SARG20       /* Sargasso C for TOPS-20                       */
X/* #define SARG10       /* Sargasso C for TOPS-10                       */
X
X/* These #ifdef:s are implementation dependent stuff for the Sargasso C */
X/* Unix C barfs on directives like "#strings", so we keep them	        */
X/* indented. Then unix c can't find them, but Sargasso C *can*.		*/
X/* Admittedly kludgey, but it works...)					*/
X#ifdef SARG10
X  #define _UNIXCON  /* Make UNIX-flavored I/O on TOPS */
X  #strings low      /* put strings in lowseg mem so we can modify them. */
X#endif
X#ifdef SARG20
X  #define _UNIXCON  /* Make UNIX-flavored I/O on TOPS */
X  #strings low      /* put strings in lowseg mem so we can modify them. */
X  #include <TOPS20.HDR>
X#endif
X
X#include <stdio.h>
X
X
X#ifdef UNIX
X#include <ctype.h>
X#include <sgtty.h>
X#include <signal.h>
X#include <setjmp.h>
Xjmp_buf intrenv;
Xstruct sgttyb sgttyOrg, sgttyNew;
Xchar stdioBuf[BUFSIZ];
Xint brkrd, reading;
Xextern onterm(), onbrk();
X#ifdef SIII
X#include <fcntl.h>
X#endif
X#endif
Xint ttymode;
SHAR_EOF
$TOUCH -am 0112125693 Support/vttest/header.h &&
chmod 0640 Support/vttest/header.h ||
echo "restore of Support/vttest/header.h failed"
set `wc -c Support/vttest/header.h`;Wc_c=$1
if test "$Wc_c" != "1397"; then
	echo original size 1397, current size $Wc_c
fi
fi
echo "End of part 3, continue with part 4"
exit 0
-- 
hellmuth michaelis    HCS Hanseatischer Computerservice GmbH   hamburg, europe
hm@hcshh.hcs.de              tel: +49/40/55903-170         fax: +49/40/5591486