[net.sources.games] Ugly fix to make larn run on a non vt100

herder@myab.UUCP (Jan Herder) (07/09/86)

This is a set of files that makes it possible to run larn on non vt100s.
It's done by integrating a stripped down version of the vt100 emulator 
vtem into larn. 
The first file "patchfile" is a context diff. To apply it do 
"patch < patchfile".
It's only been tested on SYSV.2.2. To make it work on BSD you need to 
change "-lcurses" into "-ltermcap" in Makefile. 

There is also a bug fix for napms in the diff file. This bug made
napms loop forever when called with 0 as an argument.


#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create:
#	patchfile
#	out.c
#	term.c
#	vtem.h
# This archive created: Tue Jul  8 18:46:19 1986
export PATH; PATH=/bin:/usr/bin:$PATH
echo shar: "extracting 'patchfile'" '(4817 characters)'
if test -f 'patchfile'
then
	echo shar: "will not over-write existing file 'patchfile'"
else
sed 's/^	X//' << \SHAR_EOF > 'patchfile'
	X*** Makefile	Tue Jul  8 17:59:25 1986
	X--- ../Makefile	Tue Jul  8 17:35:24 1986
	X***************
	X*** 18,24
	X  #   BIGCURSOR - This may speed up execution on machines where memory is cheap
	X  #   SAVEINHOME - put save files in users HOME instead of LARNHOME
	X  
	X! OPTIONS = -DWIZZARD -DWIZID=320 -DEXTRA -DBSD
	X  
	X  # if running a Unisoft 68000 system V, use assembly language assist
	X  # SOBJS= savelevel.o strlen.o strcpy.o lprcatstr.o
	X
	X--- 18,24 -----
	X  #   BIGCURSOR - This may speed up execution on machines where memory is cheap
	X  #   SAVEINHOME - put save files in users HOME instead of LARNHOME
	X  
	X! OPTIONS = -DWIZZARD -DWIZID=27 -DEXTRA -DSYSV
	X  
	X  # if running a Unisoft 68000 system V, use assembly language assist
	X  # SOBJS= savelevel.o strlen.o strcpy.o lprcatstr.o
	X***************
	X*** 32,38
	X  OBJS= main.o object.o create.o tok.o display.o global.o data.o termio.o\
	X      fileio.o monster.o store.o diag.o help.o config.o nap.o bill.o scores.o\
	X      signal.o altar.o fountain.o movem.o throne.o chest.o cursor.o regen.o\
	X!     fortune.o strcpy.o
	X  
	X  DOTFILES= .larn.help .larnmaze .larnopts .lfortune\
	X  	.mail601 .mail602 .mail603 .mail604 .mail605
	X
	X--- 32,38 -----
	X  OBJS= main.o object.o create.o tok.o display.o global.o data.o termio.o\
	X      fileio.o monster.o store.o diag.o help.o config.o nap.o bill.o scores.o\
	X      signal.o altar.o fountain.o movem.o throne.o chest.o cursor.o regen.o\
	X!     fortune.o strcpy.o out.o term.o
	X  
	X  DOTFILES= .larn.help .larnmaze .larnopts .lfortune\
	X  	.mail601 .mail602 .mail603 .mail604 .mail605
	X***************
	X*** 41,47
	X  
	X  larn: larn11.0
	X  larn11.0: $(OBJS) $(SOBJS)
	X! 	cc -o larn11.0 $(FLAGS) $(OBJS) $(SOBJS)
	X  
	X  all: larn install
	X  
	X
	X--- 41,47 -----
	X  
	X  larn: larn11.0
	X  larn11.0: $(OBJS) $(SOBJS)
	X! 	cc -o larn11.0 $(FLAGS) $(OBJS) $(SOBJS) -lcurses
	X  
	X  all: larn install
	X  
	X***************
	X*** 49,54
	X  	cc -c $(FLAGS) $<
	X  
	X  $(OBJS): header.h
	X  
	X  install:
	X  	if test ! -d $(LARNHOME) ; then mkdir $(LARNHOME); fi
	X
	X--- 49,56 -----
	X  	cc -c $(FLAGS) $<
	X  
	X  $(OBJS): header.h
	X+ 
	X+ out.o term.o: vtem.h
	X  
	X  install:
	X  	if test ! -d $(LARNHOME) ; then mkdir $(LARNHOME); fi
	X*** fileio.c	Tue Jul  8 18:32:08 1986
	X--- ../fileio.c	Tue Jul  8 18:13:30 1986
	X***************
	X*** 140,146
	X  	register int num2;
	X  	if (len > 500)  /* dont copy data if can just write it */
	X  		{
	X! 		lflush();  write(lfd,buf,len);
	X  #ifdef EXTRA
	X  		c[BYTESOUT] += len;
	X  #endif
	X
	X--- 140,150 -----
	X  	register int num2;
	X  	if (len > 500)  /* dont copy data if can just write it */
	X  		{
	X! 		lflush();  
	X! 		if(lfd == 1)
	X! 				vtwrite(lfd,buf,len);
	X! 		else
	X! 				write(lfd,buf,len);
	X  #ifdef EXTRA
	X  		c[BYTESOUT] += len;
	X  #endif
	X***************
	X*** 361,368
	X  #ifdef EXTRA
	X  		c[BYTESOUT] += lpoint;
	X  #endif
	X!         if (write(lfd,lpbuf,lpoint) != lpoint)
	X! 			write(1,"error writing to output file\n",29);
	X          }
	X  	lpnt = lpbuf;
	X      }
	X
	X--- 365,375 -----
	X  #ifdef EXTRA
	X  		c[BYTESOUT] += lpoint;
	X  #endif
	X! 		if(lfd == 1)
	X! 				vtwrite(lfd,lpbuf,lpoint);
	X! 		else
	X! 				if (write(lfd,lpbuf,lpoint) != lpoint)
	X! 					write(1,"error writing to output file\n",29);
	X          }
	X  	lpnt = lpbuf;
	X      }
	X*** main.c	Tue Jul  8 18:32:21 1986
	X--- ../main.c	Tue Jul  8 12:12:29 1986
	X***************
	X*** 43,48
	X  	int j,hard;
	X  	char *ttype,*getenv(),*ptr,*getlogin();
	X  	struct cel *malloc();
	X  	userid = getuid();	/* obtain the user's login id number */
	X  	if ((ptr = getlogin()) == 0)
	X  		if ((ptr = getenv("USER")) == 0)
	X
	X--- 43,49 -----
	X  	int j,hard;
	X  	char *ttype,*getenv(),*ptr,*getlogin();
	X  	struct cel *malloc();
	X+ 
	X  	userid = getuid();	/* obtain the user's login id number */
	X  	if ((ptr = getlogin()) == 0)
	X  		if ((ptr = getenv("USER")) == 0)
	X***************
	X*** 93,106
	X  #endif TIMECHECK
	X  
	X  	lcreat(0);	newgame();		/*	set the initial clock  */ hard= -1;
	X! 	ttype = getenv("TERM");
	X! 	for (j=1, i=0; i<sizeof(termtypes)/sizeof(char *); i++)
	X! 		if (strcmp(ttype,termtypes[i]) == 0) { j=0;  break; }
	X! 	if (j)
	X! 		{
	X! 		lprcat("Sorry, Larn needs a VT100 family terminal for all it's features.\n"); lflush();
	X! 		exit();
	X! 		}
	X  	for (i=1; i<argc; i++)
	X  		{
	X  		if (argv[i][0] == '-')
	X
	X--- 94,100 -----
	X  #endif TIMECHECK
	X  
	X  	lcreat(0);	newgame();		/*	set the initial clock  */ hard= -1;
	X! 	vtinit();					/* init the vt100 filter */
	X  	for (i=1; i<argc; i++)
	X  		{
	X  		if (argv[i][0] == '-')
	X*** nap.c	Tue Jul  8 18:41:15 1986
	X--- ../nap.c	Tue Jul  8 16:09:15 1986
	X***************
	X*** 35,41
	X  		return;	/* error, or BSD style times() */
	X  	matchclock += (time / 17);		/*17 ms/tic is 1000 ms/sec / 60 tics/sec */
	X  
	X! 	while(matchclock < times(&stats))
	X  		;
	X  	}
	X  
	X
	X--- 35,41 -----
	X  		return;	/* error, or BSD style times() */
	X  	matchclock += (time / 17);		/*17 ms/tic is 1000 ms/sec / 60 tics/sec */
	X  
	X! 	while(matchclock > times(&stats))
	X  		;
	X  	}
	X  
SHAR_EOF
if test 4817 -ne "`wc -c < 'patchfile'`"
then
	echo shar: "error transmitting 'patchfile'" '(should have been 4817 characters)'
fi
fi
echo shar: "extracting 'out.c'" '(10262 characters)'
if test -f 'out.c'
then
	echo shar: "will not over-write existing file 'out.c'"
else
sed 's/^	X//' << \SHAR_EOF > 'out.c'
	X/*
	X * vtem - A termcap driven VT100 emulator for BSD Unix
	X *
	X * Version 1.1
	X *
	X * Public domain software.
	X * Written by Leif Samuelsson (leif@erisun) in December, 1985
	X */
	X
	X#include "vtem.h"
	X
	Xtypedef Bool int;
	Xtypedef enum { NORMAL, GRAPHICS } char_set;
	X
	Xstatic int	row, col, save_row, save_col, top_margin, bottom_margin;
	Xstatic char_set	g0_set, g1_set;
	Xstatic Bool	blink, bold, reverse, underline, save_blink, save_bold,
	X		save_reverse, save_underline, origin_mode, vt52_mode, wrap,
	X		shift_out;
	X
	Xstatic short tabs[80];
	Xstatic int arg[10], argno;
	Xstatic int glen;
	Xstatic char *gbuf;
	X
	X/* arow is absolute row, taking top_margin into account */
	X#define arow	(row + (origin_mode ? (top_margin - 1) : 0))
	X
	Xvtget()
	X{
	X	if(glen-- > 0)
	X		return *gbuf++;
	X	else 
	X		return EOF;
	X}
	X
	X/* nextch - read output and interpret control characters.
	X *	    Return first non-control character.
	X */
	Xint nextch()
	X{
	Xregister int ch;
	X
	X    while ((ch = vtget()) != EOF) {
	X	switch (ch) {
	X	    case '\0':			/* Ignore nulls and DELs */
	X	    case '\177':
	X		    break;
	X	    case '\007':		/* Bell */
	X		ring_bell(); break;
	X	    case '\b':			/* BackSpace */
	X		    if (col > 1) {
	X			col--;
	X			backspace();
	X		    } break;
	X	    case '\t':			/* Tab */
	X		while (col < 80 && !tabs[col++]);
	X		set_cursor(col-1, arow-1); break;
	X
	X	    case '\n':			/* Line Feed */
	X		    do_linefeed(); break;
	X	    case '\r':			/* Carriage Return */
	X		if (col > 1) {
	X		    col = 1;
	X		    cr();
	X		} break;
	X	    case '\016':
	X		shift_out = 1; break;
	X	    case '\017':
	X	        shift_out = 0; break;
	X	    default:
	X		return(ch);
	X	}
	X    }
	X    return(ch);
	X}
	X
	Xvtinit()
	X{
	Xregister int ch;
	X
	X    gettermtype();
	X    do_reset();
	X}
	X
	Xvtwrite(fd,buf,len)
	Xchar *buf;
	X{
	X	register int ch;
	X
	X    gbuf = buf;
	X    glen = len;
	X    while ((ch = nextch()) != EOF) {
	X	if (ch == '\033') {		/* Escape character */
	X	    if (vt52_mode)
	X		do_vt52_escape();
	X	    else
	X		do_ansi_escape();
	X	}
	X	else if (ch >= ' ') {		/* Printing character */
	X	    if ((shift_out ? g1_set : g0_set) == GRAPHICS) {
	X		if (ch >= '_')
	X		    ch = " *#HFCLo+NV+++++---__++++!<>P##. "[ch - '_'];
	X	    }
	X	    if (col == 81) {
	X		if (wrap) {
	X		    col = 1;
	X		    set_cursor(col-1, arow-1);
	X		    do_linefeed();
	X		}
	X		else {
	X		    col = 80;
	X		    set_cursor(col-1, arow-1);
	X		}
	X	    }
	X	    if (col == 80) {
	X		if (arow != 24)
	X		    putchar(ch);	/* Must ignore last pos */
	X		set_cursor(col-1, arow-1);
	X		if (wrap)
	X		    col++;
	X	    }
	X	    else {
	X		putchar(ch);
	X		col++;
	X	    }
	X	}
	X    }
	X    fflush(stdout);
	X}
	X
	X/* do_ansi_escape - reads and interprets an ANSI escape sequence
	X */
	X
	Xdo_ansi_escape()
	X{
	Xregister int ch;
	X
	X    if ((ch = nextch()) == EOF)
	X	return;
	X    switch (ch) {
	X	case '#':
	X	    do_hash();
	X	    break;
	X	case '(':
	X	case ')':
	X	    do_character_sets(ch); break;
	X	case '7':
	X	    save_row = row;
	X	    save_col = col;
	X	    save_blink = blink;
	X	    save_bold = bold;
	X	    save_reverse = reverse;
	X	    save_underline = underline;
	X	    break;
	X	case '8':
	X	    if (save_row > 0) {
	X		row = save_row;
	X		col = save_col;
	X		set_cursor(col-1, arow-1);
	X		if (blink = save_blink)
	X		    start_blink();
	X		if (bold = save_bold)
	X		    start_bold();
	X		if (reverse = save_reverse)
	X		    start_reverse();
	X		if (underline = save_underline)
	X		    start_underline();
	X	    } break;
	X
	X	case 'D':
	X	    do_linefeed(); break;
	X
	X	case 'E':
	X	    if (col > 1) {
	X		col = 1;
	X		cr();
	X	    }
	X	    do_linefeed(); break;
	X
	X	case 'H':
	X	    tabs[col-1] = 1; break;
	X
	X	case 'M':
	X	    do_reverse_lf(); break;
	X
	X	case '[':
	X	    do_csi(); break;
	X
	X	case 'c':
	X	    do_reset(); break;
	X    }
	X}
	X
	X/* do_csi - the real ANSI interpreter
	X */
	Xdo_csi()
	X{
	Xregister int i, ch;
	Xint private;
	X
	X    if ((ch = nextch()) == EOF)
	X	return;
	X
	X    /* Check if private VT100 esc sequence */
	X    private = 0;
	X    if (ch == '?') {
	X	private = 1;
	X	if ((ch = nextch()) == EOF)
	X	    return;
	X    }
	X
	X    /* Parse arguments */
	X    argno = 0;
	X    while ((ch >= '0' && ch <= '9') || ch == ';') {
	X	arg[argno] = 0;
	X	while (ch >= '0' && ch <= '9') {
	X	    arg[argno] = arg[argno] * 10 + (ch - '0');
	X	    if ((ch = nextch()) == EOF)
	X		return;
	X	}
	X	if (ch == ';')
	X	    if ((ch = nextch()) == EOF)
	X		return;
	X	argno++;
	X    }
	X
	X    if (private) {
	X	if (argno != 1)
	X	    return;
	X	switch (ch) {
	X	    case 'h':
	X		switch (arg[0]) {
	X		    case 6:
	X			origin_mode = 1; break;
	X		    case 7:
	X			wrap = 1; break;
	X		} break;
	X	    case 'l':
	X		switch (arg[0]) {
	X		    case 2:
	X			vt52_mode = 1; break;
	X		    case 6:
	X			origin_mode = 0; break;
	X		    case 7:
	X			wrap = 0; break;
	X		} break;
	X	}
	X    }
	X    else {
	X	switch (ch) {
	X	    case 'A':
	X		i = (argno == 1 && arg[0] > 0) ? arg[0] : 1;
	X		while (i-- && arow > 1 && arow != top_margin) {
	X		    cursor_up();
	X		    row--;
	X		} break;
	X
	X	    case 'B':
	X		i = (argno == 1 && arg[0] > 0) ? arg[0] : 1;
	X		while (i-- && arow < 24 && arow != bottom_margin) {
	X		    cursor_down();
	X		    row++;
	X		} break;
	X
	X	    case 'C':
	X		i = (argno == 1 && arg[0] > 0) ? arg[0] : 1;
	X		while (i-- && col < 80) {
	X		    cursor_right();
	X		    col++;
	X		} break;
	X
	X	    case 'D':
	X		i = (argno == 1 && arg[0] > 0) ? arg[0] : 1;
	X		while (i-- && col > 1) {
	X		    backspace();
	X		    col--;
	X		} break;
	X
	X	    case 'H':
	X	    case 'f':
	X		do_set_cursor(); break;
	X	    case 'J':
	X		do_erase_in_display(); break;
	X	    case 'K':
	X		do_erase_in_line(); break;
	X	    case 'L':
	X		do_insert_line(); break;
	X	    case 'M':
	X		do_delete_line(); break;
	X	    case 'g':
	X	        do_clear_tabs(); break;
	X	    case 'm':
	X		do_attributes(); break;
	X	    case 'r':
	X		do_set_scroll_region();
	X	}
	X    }
	X}
	X
	X/* do_vt52_escape - interprets VT52 escape sequences
	X */
	Xdo_vt52_escape()
	X{
	Xregister int ch;
	X
	X    if ((ch = nextch()) == EOF)
	X	return;
	X    switch (ch) {
	X	case '<':
	X		vt52_mode = 0; break;
	X	case 'A':
	X		if (row > 1) {
	X		    cursor_up();
	X		    row--;
	X		} break;
	X	case 'B':
	X		if (row < bottom_margin-top_margin+1) {
	X		    cursor_down();
	X		    row++;
	X		} break;
	X	case 'C':
	X		if (col < 80) {
	X		    cursor_right();
	X		    col++;
	X		} break;
	X	case 'D':
	X		if (col > 1) {
	X		    backspace();
	X		    col--;
	X		} break;
	X	case 'H':
	X		row = col = 1;
	X		set_cursor(col-1, arow-1); break;
	X	case 'I':
	X		do_reverse_lf(); break;
	X	case 'J':
	X		clear_eos(); break;
	X	case 'K':
	X		clear_eol(col-1, arow-1); break;
	X	case 'Y':
	X		do_vt52_set_cursor(); break;
	X    }
	X}
	X
	X
	Xdo_set_cursor()
	X{
	X    if (arg[0] == 0)
	X	arg[0]++;
	X    if (arg[1] == 0)
	X	arg[1]++;
	X    switch (argno) {
	X	case 0:
	X	    arg[0] = 1;
	X	    argno++;
	X	    /* Fall through */
	X
	X	case 1:
	X	    arg[1] = 1;		/* Correct? */
	X	    argno++;
	X	    /* Fall through... */
	X
	X	case 2:
	X	    row = arg[0];
	X	    col = arg[1];
	X	    set_cursor(col-1, arow-1);
	X	    break;
	X    }
	X}
	X
	Xdo_vt52_set_cursor()
	X{
	Xregister int ch1, ch2;
	X
	X    if ((ch1 = nextch()) == EOF)
	X	return;
	X    if ((ch2 = nextch()) == EOF)
	X	return;
	X    ch1 -= 0x1f;
	X    ch2 -= 0x1f;
	X    if (ch1 >= 1 && ch1 <= 24 && ch2 >= 1 && ch2 <= 80) {
	X	    row = ch1;
	X	    col = ch2;
	X	    set_cursor(col-1, arow-1);
	X    }
	X}
	X
	Xdo_erase_in_display()
	X{
	X    switch (argno) {
	X	case 0:
	X	    arg[0] = 0;
	X	    argno++;
	X	    /* Fall through */
	X	case 1:
	X	    switch (arg[0]) {
	X		case 0:
	X		    clear_eos();
	X		    break;
	X		case 1:
	X		    clear_bos(col-1, arow-1);
	X		    break;
	X		case 2:
	X		    clear_screen();
	X		    set_cursor(col-1, arow-1);
	X		    break;
	X	    }
	X	    break;
	X    }
	X}
	X
	Xdo_erase_in_line()
	X{
	X    switch(argno) {
	X	case 0:
	X	    arg[0] = 0;
	X	    argno++;
	X	    /* fall through */
	X	case 1:
	X	    switch (arg[0]) {
	X		case 0:
	X		    clear_eol(col-1, arow-1);
	X		    break;
	X		case 1:
	X		    clear_bol(col-1, arow-1);
	X		    break;
	X		case 2:
	X		    cr();
	X		    clear_eol(0, arow-1);
	X		    set_cursor(col-1, arow-1);
	X		    break;
	X	    } break;
	X    }
	X}
	X
	Xdo_clear_tabs()
	X{
	Xregister int i;
	X
	X    if (argno == 0)
	X	arg[argno++] = 0;
	X    switch (arg[0]) {
	X	case 0:
	X	    tabs[col-1] = 0; break;
	X	case 3:
	X	    for (i = 0; i<80; i++)
	X		tabs[i] = 0; break;
	X    } 
	X}
	X
	Xdo_attributes()
	X{
	Xregister int i;
	X
	X    if (argno == 0) {
	X	arg[0] = 0;
	X	argno++;
	X    }
	X    for (i=0; i<argno; i++) {
	X	switch (arg[i]) {
	X	    case 0:
	X		end_attributes();
	X		bold = underline = blink = reverse = 0;
	X		break;
	X	    case 1:
	X		start_bold();
	X		bold = 1; break;
	X
	X	    case 4:
	X		start_underline();
	X		underline = 1; break;
	X
	X	    case 5:
	X		start_blink();
	X		blink = 1; break;
	X
	X	    case 7:
	X		start_reverse();
	X		reverse = 1; break;
	X	}
	X    }
	X}
	X
	Xdo_set_scroll_region()
	X{
	X    if (arg[0] == 0)
	X	arg[0]++;
	X    if (arg[1] == 0)
	X	arg[1]++;
	X    switch (argno) {
	X	case 0:
	X	    arg[0] = 1;
	X	    arg[1] = 24;
	X	    argno = 2;
	X	    /* Fall through */
	X
	X	case 2:
	X	    top_margin = arg[0];
	X	    bottom_margin = arg[1];
	X	    col = row = 1;
	X	    set_cursor(col-1, arow-1);
	X	    break;
	X    }
	X}
	X
	Xdo_linefeed()
	X{
	X    if (arow == bottom_margin) {
	X	if (bottom_margin < LI) {
	X	    scroll_region(top_margin-1, bottom_margin-1, TRUE);
	X	    /*set_cursor(col-1, arow-1); */
	X		/* We are running with onlcr */
	X	    set_cursor(0, arow-1);
	X	}
	X	else
	X	    linefeed();
	X    }
	X    else if (arow < 24) {
	X	row++;
	X	linefeed();
	X    }
	X	col = 1;
	X}
	X
	Xdo_reverse_lf()
	X{
	X    if (arow == top_margin) {
	X	scroll_region(top_margin-1, bottom_margin-1, FALSE);
	X	set_cursor(col-1, arow-1);
	X    }
	X    else if (arow > 1) {
	X	row--;
	X	reverse_lf();
	X    }
	X}
	X
	Xdo_hash()
	X{
	Xregister int ch, i, j;
	X
	X    if ((ch = nextch()) == EOF)
	X	return;
	X    switch(ch) {
	X	case '8':
	X	    for (i=1; i<=24; i++) {
	X		set_cursor(0, i-1);
	X		for (j=1; j <= ((i==24)?79:80); j++)
	X		    putchar('E');
	X	    }
	X	    row = col = 1;
	X	    set_cursor(col-1, arow-1);		/* Correct? */
	X	    break;
	X    }		 
	X}
	X
	X/* do_characters_sets - Not implemented
	X */
	Xdo_character_sets(ch)
	Xregister int ch;
	X{
	Xregister int ch2;
	X
	X    if ((ch2 = nextch()) == EOF)
	X	return;
	X    switch (ch2) {
	X	case 'A':
	X	case 'B':
	X		if (ch == '(')
	X			g0_set = NORMAL;
	X		else
	X			g1_set = NORMAL;
	X		break;
	X	case '0':
	X		if (ch == '(')
	X			g0_set = GRAPHICS;
	X		else
	X			g1_set = GRAPHICS;
	X		break;
	X    }
	X}
	X
	X/* do_reset - Reset emulator and screen
	X */
	Xdo_reset()
	X{
	Xregister int i;
	X
	X    clear_screen();
	X    row = 1;
	X    col = 1;
	X    top_margin = 1;
	X    bottom_margin = 24;
	X    origin_mode = 0;
	X    vt52_mode = 0;
	X    wrap = 1;
	X    g0_set = NORMAL;
	X    g1_set = NORMAL;
	X    shift_out = 0;
	X    save_row = -1;			/* So we know we haven't saved */
	X    for (i=0; i<80; i++)
	X	tabs[i] = ((i/8)*8 == i);
	X}
	X
	X/* The following are routines for VT102 compatibility
	X */
	X
	Xdo_insert_line()
	X{
	X/* Not yet implemented */
	X}
	X
	Xdo_delete_line()
	X{
	X/* Not yet implemented */
	X}
SHAR_EOF
if test 10262 -ne "`wc -c < 'out.c'`"
then
	echo shar: "error transmitting 'out.c'" '(should have been 10262 characters)'
fi
fi
echo shar: "extracting 'term.c'" '(4663 characters)'
if test -f 'term.c'
then
	echo shar: "will not over-write existing file 'term.c'"
else
sed 's/^	X//' << \SHAR_EOF > 'term.c'
	X/*
	X * vt - A termcap driven VT100 emulator for BSD Unix
	X *
	X * Version 1.1
	X *
	X * Public domain software.
	X * Written by Leif Samuelsson (leif@erisun) in December, 1985
	X */
	X
	X
	X/* This module contains termcap and tty routines */
	X
	X#include "vtem.h"
	X
	Xextern char *tgetstr(), *tgoto();
	X
	X/* Variables for saving original terminal parameters */
	X  int oldlb, newlb, oldl, newl;
	X
	X/* Terminal attributes */
	Xchar tbuf[1024];
	XBool BS;
	Xint CO, LI;
	Xchar	*AL, *BC, *BL, *CD, *CL, *CE, *CM, *CR, *CS, *DL, *DO,
	X	*KE, *KS, *MB, *MD, *ME, *MR, *ND, *NL, *SE, *SO, *SR,
	X	*TI, *TE, *UE, *UP, *US, *MAL, *MDL;
	X 
	Xputchar_x(c)
	Xchar c;
	X{
	X    putchar(c);
	X}
	X
	X
	X/* gettermtype - Finds terminal type and reads termcap entry for it.
	X */
	Xgettermtype()
	X{
	Xchar tptr[1024];
	Xchar *termtyp;
	Xchar *tbufptr;
	X
	X    termtyp=getenv("TERM");
	X    switch(tgetent(tptr,termtyp)) {
	X	case -1:
	X	    printf("Can't read termcap\n");
	X	    exit(1);
	X	case 0:
	X	    printf("Can't find your terminal type (%s) in termcap\n", termtyp);
	X	    exit(1);
	X    }
	X    tbufptr=tbuf;
	X    AL = tgetstr("al", &tbufptr);
	X    BC = tgetstr("bc", &tbufptr);
	X    BL = tgetstr("bl", &tbufptr);
	X    if (!BL)
	X	BL = "\007";
	X    BS = tgetflag("bs",&tbufptr);
	X    if (!BC && BS)
	X	BC = "\b";
	X    CD = tgetstr("cd", &tbufptr);
	X    CL = tgetstr("cl", &tbufptr);
	X    CE = tgetstr("ce", &tbufptr);
	X    CM = tgetstr("cm", &tbufptr);
	X    CR = tgetstr("cr", &tbufptr);
	X    if (!CR)
	X	CR = "\r";
	X    CS = tgetstr("cs", &tbufptr);
	X    DL = tgetstr("dl", &tbufptr);
	X    DO = tgetstr("do", &tbufptr);
	X    if (!DO)
	X	DO = "\n";
	X    KE = tgetstr("ke", &tbufptr);
	X    KS = tgetstr("ks", &tbufptr);
	X    ND = tgetstr("nd", &tbufptr);
	X    NL = tgetstr("nl", &tbufptr);
	X    if (!NL)
	X	NL = "\n";
	X	if(tgetnum("sg") <= 0){
	X		MB = tgetstr("mb", &tbufptr);
	X		ME = tgetstr("me", &tbufptr);
	X		MR = tgetstr("mr", &tbufptr);
	X		SO = tgetstr("so", &tbufptr);
	X		SE = tgetstr("se", &tbufptr);
	X		UE = tgetstr("ue", &tbufptr);
	X		US = tgetstr("us", &tbufptr);
	X	}
	X    SR = tgetstr("sr", &tbufptr);
	X    TI = tgetstr("ti", &tbufptr);
	X    TE = tgetstr("te", &tbufptr);
	X    UP = tgetstr("up", &tbufptr);
	X    MAL = tgetstr("AL", &tbufptr);
	X    MDL = tgetstr("DL", &tbufptr);
	X    CO = tgetnum("co");
	X    LI = tgetnum("li");
	X    if(!TI) {
	X	    TI = tgetstr("vs", &tbufptr);
	X	    TE = tgetstr("ve", &tbufptr);
	X    }
	X
	X    if (CO < 80 || LI < 24) {
	X	printf("Sorry, but vtem requires 24 by 80 lines.\r\n");
	X	exit(1);
	X    }
	X    if (!CM) {
	X	printf("Sorry, but vtem requires cursor motion capability (cm).\r\n");
	X	exit(1);
	X    }
	X    if (!CL) {
	X	printf("Sorry, but vtem requires clear screen capability (cl).\r\n");
	X	exit(1);
	X    }
	X    if (!UP) {
	X	printf("Sorry, but vtem requires cursor up capability (up).\r\n");
	X	exit(1);
	X    }
	X}
	X
	X
	X/* clear_bos - clear from beginning of screen to cursor
	X */
	Xclear_bos(c,r)
	Xint c,r;
	X{
	Xregister int i;
	X
	X    for (i=0; i<r; i++) {
	X	tputs_x(tgoto(CM, 0, i));
	X	tputs_x(CE);
	X    }
	X    clear_bol(c,r);
	X}
	X
	X/* clear_eos - Clear from cursor to end of screen.
	X */
	Xclear_eos()
	X{
	X    tputs_x(CD);
	X}
	X
	X/* clear_bol - Clear from beginning of line to cursor.
	X */
	Xclear_bol(c,r)
	Xint c,r;
	X{
	Xregister int i;
	X
	X    tputs_x(tgoto(CM, 0, r));
	X    for (i=0; i<c; i++)
	X	putchar(' ');
	X}
	X
	X/* clear_eol - Clear from cursor to end of line.
	X */
	Xclear_eol(c, r)
	Xint c, r;
	X{
	Xregister int i;
	X
	X    if (CE)
	X	tputs_x(CE);
	X    else {
	X	for (i=c; i < ((r==23)?79:80); i++)
	X	    putchar(' ');
	X	set_cursor(c, r);
	X    }
	X}
	X
	X
	Xcursor_up()
	X{
	X    tputs_x(UP); 
	X}
	X
	X
	Xcursor_down()
	X{
	X    tputs_x(DO); 
	X}
	X
	X
	Xcursor_right()
	X{
	X    tputs_x(ND); 
	X}
	X
	X
	Xreverse_lf()
	X{
	X    cursor_up();		/* We hope */
	X}
	X
	X
	X/* start_reverse - Set terminal in reverse video mode.
	X */
	Xstart_reverse()
	X{
	X    if (MR)
	X	tputs_x(MR);
	X    else
	X	tputs_x(SO);
	X}
	X
	X
	Xstart_blink()
	X{
	X    tputs_x(MB);
	X}
	X
	X
	Xstart_underline()
	X{
	X    tputs_x(US);
	X}
	X
	X
	Xstart_bold()
	X{
	X    if (MD)
	X	tputs_x(MD);
	X    else
	X	tputs_x(SO);
	X}
	X
	X
	Xring_bell()
	X{
	X    tputs_x(BL);
	X}
	X
	X
	X/* end_attributes - Reset terminal attributes to normal.
	X */
	Xend_attributes()
	X{
	X    if (ME)
	X	tputs_x(ME);
	X    else {
	X	tputs_x(SE);
	X	tputs_x(UE);
	X    }
	X}
	X
	X
	Xscroll_region(lin1, lin2, upward)      /* Scroll region between lin1 and */
	Xint lin1, lin2;			       /* lin2 inclusive one line up or down */
	X{
	X    /* Use scroll region if available - otherwise use insert/delete line*/
	X    if (CS && SR) {
	X	tputs_x(tgoto(CS,lin2,lin1));
	X	if (upward) {
	X	    set_cursor(0,lin2);
	X	    tputs_x(NL);
	X	}
	X	else {
	X	    set_cursor(0,lin1);
	X	    tputs_x(SR);
	X	}
	X	tputs_x(tgoto(CS,23,0));
	X    }
	X    else if (DL && AL) {
	X	if (upward) {
	X	    set_cursor(0,lin1);
	X	    tputs_x(DL);
	X	    set_cursor(0,lin2);
	X	    tputs_x(AL);
	X	}
	X	else {
	X	    set_cursor(0,lin2);
	X	    tputs_x(DL);
	X	    set_cursor(0,lin1);
	X	    tputs_x(AL);
	X	}
	X    }
	X}
	X
	X
SHAR_EOF
if test 4663 -ne "`wc -c < 'term.c'`"
then
	echo shar: "error transmitting 'term.c'" '(should have been 4663 characters)'
fi
fi
echo shar: "extracting 'vtem.h'" '(720 characters)'
if test -f 'vtem.h'
then
	echo shar: "will not over-write existing file 'vtem.h'"
else
sed 's/^	X//' << \SHAR_EOF > 'vtem.h'
	X#include <stdio.h>
	X#include <sys/types.h>
	X
	X#define FALSE 0
	X#define TRUE 1
	X
	Xtypedef short Bool;
	X
	Xextern char *getenv();
	Xextern putchar_x();
	X
	Xextern struct tchars oldtchars, newtchars;
	Xextern struct ltchars oldltchars, newltchars;
	Xextern int oldlb, newlb, oldl, newl;
	X
	Xextern int master;
	X
	Xextern Bool BS;
	Xextern int CO, LI;
	Xextern char *AL, *BC, *BL, *CD, *CL, *CE, *CM, *CR, *CS, *DL, *DO, *KE, *KS, *MB, *MD, *ME, *MR, *ND, *NL, *SE, *SO, *SR, *TI, *TE, *UE, *UP, *US, *MAL, *MDL;
	X
	X#define tputs_x(s)		(tputs(s, 0, putchar_x))
	X
	X#define backspace()		(tputs_x(BC))
	X#define clear_screen()		(tputs_x(CL))
	X#define set_cursor(c, r)	(tputs_x(tgoto(CM, (c), (r))))
	X#define linefeed()		(tputs_x(NL))
	X#define cr()			(tputs_x(CR))
SHAR_EOF
if test 720 -ne "`wc -c < 'vtem.h'`"
then
	echo shar: "error transmitting 'vtem.h'" '(should have been 720 characters)'
fi
fi
exit 0
#	End of shell archive