[net.sources] Jove Sys V patches

dan@prairie.UUCP (Daniel M. Frank) (01/12/87)

   As distributed, the Jove editor doesn't come up right away under
System V, Release 2.  This is due both to some missing #ifdefs
around pertinent sections of code, as well as some incompatibilities
between the terminfo termcap emulation and "real" termcap.  There
are some additional problems with the iAPX286 architecture and
compiler limitations.

   The following patches represent the differences between the
Jove distribution available from rochester.arpa and the code that
finally produced a running editor under Microport System V, Release 2 
on an AT clone.  The iAPX-specific stuff has been #ifdef'ed, as have
the System V differences, so most of these patches shouldn't be
harmful for general distribution.  However, the tune.h and Makefile
diffs are also included.  Non-iAPX users may want to leave the Makefile
changes out.  The tune.h stuff is necessary for any SVR2 site.

   To install, use patch with the `-p 1' option.  That'll make it
ignore the `old/' on the front of the filename line.

   There may be further bugs I haven't found yet.  Good luck!

------------------------------------------------------------------------

*** old/buf.c	Wed Sep 24 09:51:51 1986
--- buf.c	Sat Jan 10 11:29:39 1987
***************
*** 85,90
  	newb->b_major = TEXT;
  	newb->b_first = 0;
  	newb->b_keybinds = 0;
  	newb->b_process = 0;
  	initlist(newb);
  

--- 85,91 -----
  	newb->b_major = TEXT;
  	newb->b_first = 0;
  	newb->b_keybinds = 0;
+ #ifdef IPROCS
  	newb->b_process = 0;
  #endif
  	initlist(newb);
***************
*** 86,91
  	newb->b_first = 0;
  	newb->b_keybinds = 0;
  	newb->b_process = 0;
  	initlist(newb);
  
  	return newb;

--- 87,93 -----
  	newb->b_keybinds = 0;
  #ifdef IPROCS
  	newb->b_process = 0;
+ #endif
  	initlist(newb);
  
  	return newb;
*** old/disp.c	Wed Sep 24 09:52:57 1986
--- disp.c	Sat Jan 10 15:54:27 1987
***************
*** 108,113
  		if (VisBell && VB)
  			putstr(VB);
  		else
  			putpad("20\007", 1);
  	}
  	flusho();

--- 108,116 -----
  		if (VisBell && VB)
  			putstr(VB);
  		else
+ #ifdef SYSV	/* release 2, at least */
+ 			putpad("$<20>\007", 1) ;
+ #else
  			putpad("20\007", 1);
  #endif SYSV
  	}
***************
*** 109,114
  			putstr(VB);
  		else
  			putpad("20\007", 1);
  	}
  	flusho();
  }

--- 112,118 -----
  			putpad("$<20>\007", 1) ;
  #else
  			putpad("20\007", 1);
+ #endif SYSV
  	}
  	flusho();
  }
*** old/io.c	Wed Sep 24 10:00:18 1986
--- io.c	Sat Jan 10 12:11:18 1987
***************
*** 121,126
  	int	xeof = 0;
  	Line	*savel = curline;
  	int	savec = curchar;
  
  	strcpy(end, linebuf + curchar);
  	xeof = f_gets(fp, linebuf + curchar, LBSIZE - curchar);

--- 121,127 -----
  	int	xeof = 0;
  	Line	*savel = curline;
  	int	savec = curchar;
+ 	disk_line	f_getputl() ;
  
  	strcpy(end, linebuf + curchar);
  	xeof = f_gets(fp, linebuf + curchar, LBSIZE - curchar);
*** old/jove.c	Wed Sep 24 10:01:06 1986
--- jove.c	Sat Jan 10 12:35:35 1987
***************
*** 18,24
  #include <errno.h>
  #ifndef SYSV
  #include <sgtty.h>
- #include <fcntl.h>
  #else
  #include <termio.h>
  #endif SYSV

--- 18,23 -----
  #include <errno.h>
  #ifndef SYSV
  #include <sgtty.h>
  #else
  #include <termio.h>
  #endif SYSV
***************
*** 22,27
  #else
  #include <termio.h>
  #endif SYSV
  
  #ifdef TIOCSLTC
  struct ltchars	ls1,

--- 21,27 -----
  #else
  #include <termio.h>
  #endif SYSV
+ #include <fcntl.h>
  
  #ifdef TIOCSLTC
  struct ltchars	ls1,
***************
*** 378,383
  
  	case 0:
  		UnsetTerm(NullStr);
  		sigrelse(SIGCHLD);
  		(void) signal(SIGTERM, SIG_DFL);
  		(void) signal(SIGINT, SIG_DFL);

--- 378,384 -----
  
  	case 0:
  		UnsetTerm(NullStr);
+ #ifdef IPROCS
  		sigrelse(SIGCHLD);
  #endif
  		(void) signal(SIGTERM, SIG_DFL);
***************
*** 379,384
  	case 0:
  		UnsetTerm(NullStr);
  		sigrelse(SIGCHLD);
  		(void) signal(SIGTERM, SIG_DFL);
  		(void) signal(SIGINT, SIG_DFL);
  		(void) signal(SIGQUIT, SIG_DFL);

--- 380,386 -----
  		UnsetTerm(NullStr);
  #ifdef IPROCS
  		sigrelse(SIGCHLD);
+ #endif
  		(void) signal(SIGTERM, SIG_DFL);
  		(void) signal(SIGINT, SIG_DFL);
  		(void) signal(SIGQUIT, SIG_DFL);
***************
*** 382,388
  		(void) signal(SIGTERM, SIG_DFL);
  		(void) signal(SIGINT, SIG_DFL);
  		(void) signal(SIGQUIT, SIG_DFL);
! 		execl(Shell, basename(Shell), 0);
  		message("[Execl failed]");
  		_exit(1);
  	}

--- 384,390 -----
  		(void) signal(SIGTERM, SIG_DFL);
  		(void) signal(SIGINT, SIG_DFL);
  		(void) signal(SIGQUIT, SIG_DFL);
! 		execl(Shell, basename(Shell), (char *)0);
  		message("[Execl failed]");
  		_exit(1);
  	}
***************
*** 660,666
  
  dorecover()
  {
! 	execl(Recover, "jove_recover", "-d", TmpFilePath, 0);
  	printf("%s: execl failed!\n", Recover);
  	flusho();
  	_exit(-1);

--- 662,668 -----
  
  dorecover()
  {
! 	execl(Recover, "jove_recover", "-d", TmpFilePath, (char *)0);
  	printf("%s: execl failed!\n", Recover);
  	flusho();
  	_exit(-1);
***************
*** 1036,1042
  		HomeDir = "/";
  	HomeLen = strlen(HomeDir);
  #ifdef SYSV
! 	sprintf(MailBox, "/usr/mail/%s", getenv("LOGNAME"));
  #else
  	sprintf(Mailbox, "/usr/spool/mail/%s", getenv("USER"));
  #endif SYSV

--- 1038,1044 -----
  		HomeDir = "/";
  	HomeLen = strlen(HomeDir);
  #ifdef SYSV
! 	sprintf(Mailbox, "/usr/mail/%s", getenv("LOGNAME"));
  #else
  	sprintf(Mailbox, "/usr/spool/mail/%s", getenv("USER"));
  #endif SYSV
*** old/macros.c	Wed Sep 24 10:01:34 1986
--- macros.c	Sat Jan 10 12:30:34 1987
***************
*** 214,219
  		nmacs = 0;
  	char	*file,
  		filebuf[FILESIZE];
  
  	file = ask_file((char *) 0, (char *) 0, filebuf);
  	if ((mac_fd = creat(file, 0666)) == -1)

--- 214,220 -----
  		nmacs = 0;
  	char	*file,
  		filebuf[FILESIZE];
+ 	long htonl() ;
  
  	file = ask_file((char *) 0, (char *) 0, filebuf);
  	if ((mac_fd = creat(file, 0666)) == -1)
*** old/proc.c	Wed Sep 24 10:02:19 1986
--- proc.c	Sat Jan 10 12:40:45 1987
***************
*** 519,524
  		complain("[Fork failed]");
  	}
  	if (pid == 0) {
  		sigrelse(SIGCHLD);   /* don't know if this matters */
  		(void) signal(SIGINT, SIG_DFL);
  #ifdef JOB_CONTROL

--- 519,525 -----
  		complain("[Fork failed]");
  	}
  	if (pid == 0) {
+ #ifdef IPROCS
  		sigrelse(SIGCHLD);   /* don't know if this matters */
  #endif IPROCS
  		(void) signal(SIGINT, SIG_DFL);
***************
*** 520,525
  	}
  	if (pid == 0) {
  		sigrelse(SIGCHLD);   /* don't know if this matters */
  		(void) signal(SIGINT, SIG_DFL);
  #ifdef JOB_CONTROL
  		sigrelse(SIGINT);

--- 521,527 -----
  	if (pid == 0) {
  #ifdef IPROCS
  		sigrelse(SIGCHLD);   /* don't know if this matters */
+ #endif IPROCS
  		(void) signal(SIGINT, SIG_DFL);
  #ifdef JOB_CONTROL
  		sigrelse(SIGINT);
*** old/recover.c	Wed Sep 24 10:03:00 1986
--- recover.c	Sat Jan 10 12:36:20 1987
***************
*** 649,655
  			exit(-1);
  
  		case 0:
! 			execl("/bin/cp", "cp", fp->file_data, fp->file_rec, REC_DIR, 0);
  			fprintf(stderr, "recover: cannot execl /bin/cp.\n");
  			exit(-1);
  

--- 649,656 -----
  			exit(-1);
  
  		case 0:
! 			execl("/bin/cp", "cp", fp->file_data, fp->file_rec, 
! 				  REC_DIR, (char *)0);
  			fprintf(stderr, "recover: cannot execl /bin/cp.\n");
  			exit(-1);
  
*** old/term.c	Wed Sep 24 10:03:38 1986
--- term.c	Sat Jan 10 14:59:15 1987
***************
*** 70,75
  	HOlen,
  	LLlen;
  
  extern char	PC;
  
  static char	tspace[256];

--- 70,78 -----
  	HOlen,
  	LLlen;
  
+ #ifdef SYSV /* release 2, at least */
+ char PC ;
+ #else
  extern char	PC;
  #endif SYSV
  
***************
*** 71,76
  	LLlen;
  
  extern char	PC;
  
  static char	tspace[256];
  

--- 74,80 -----
  char PC ;
  #else
  extern char	PC;
+ #endif SYSV
  
  static char	tspace[256];
  
***************
*** 114,120
  
  getTERM()
  {
! 	char	*getenv();
  	char	termbuf[13],
  		*termname = 0,
  		*termp = tspace,

--- 118,124 -----
  
  getTERM()
  {
! 	char	*getenv(), *tgetstr() ;
  	char	termbuf[13],
  		*termname = 0,
  		*termp = tspace,
*** old/util.c	Wed Sep 24 10:04:11 1986
--- util.c	Sat Jan 10 14:27:48 1987
***************
*** 10,15
  #include <signal.h>
  #include <varargs.h>
  
  struct cmd *
  FindCmd(proc)
  register int 	(*proc)();

--- 10,19 -----
  #include <signal.h>
  #include <varargs.h>
  
+ #ifdef SYSV /* release 2, at least */
+ short ospeed ;
+ #endif
+ 
  struct cmd *
  FindCmd(proc)
  register int 	(*proc)();
*** old/jove.h	Wed Sep 24 10:01:19 1986
--- jove.h	Sat Jan 10 11:21:09 1987
***************
*** 271,276
  	int	b_major,		/* major mode */
  		b_minor;		/* and minor mode */
  	keymap	*b_keybinds;		/* local bindings (if any) */
  	Process	*b_process;		/* process we're attached to */
  };
  

--- 271,277 -----
  	int	b_major,		/* major mode */
  		b_minor;		/* and minor mode */
  	keymap	*b_keybinds;		/* local bindings (if any) */
+ #ifdef IPROCS
  	Process	*b_process;		/* process we're attached to */
  #endif
  };
***************
*** 272,277
  		b_minor;		/* and minor mode */
  	keymap	*b_keybinds;		/* local bindings (if any) */
  	Process	*b_process;		/* process we're attached to */
  };
  
  struct macro {

--- 273,279 -----
  	keymap	*b_keybinds;		/* local bindings (if any) */
  #ifdef IPROCS
  	Process	*b_process;		/* process we're attached to */
+ #endif
  };
  
  struct macro {
*** old/tune.h	Wed Sep 24 10:03:48 1986
--- tune.h	Sat Jan 10 15:27:05 1987
***************
*** 9,15
  
  /*#define LSRHS		/* if this is Lincoln-Sudbury Regional High School */
  /*#define MSDOS		/* if this is MSDOS */
! #define BSD4_2		/* Berkeley 4.2 BSD */
  /*#define BSD4_3	/* Berkeley 4.3 BSD */
  /*#define SYSV		/* for (System III/System V) UNIX systems */
  #ifdef BSD4_3

--- 9,15 -----
  
  /*#define LSRHS		/* if this is Lincoln-Sudbury Regional High School */
  /*#define MSDOS		/* if this is MSDOS */
! /*#define BSD4_2		/* Berkeley 4.2 BSD */
  /*#define BSD4_3	/* Berkeley 4.3 BSD */
  #define SYSV		/* for (System III/System V) UNIX systems */
  #ifdef BSD4_3
***************
*** 11,17
  /*#define MSDOS		/* if this is MSDOS */
  #define BSD4_2		/* Berkeley 4.2 BSD */
  /*#define BSD4_3	/* Berkeley 4.3 BSD */
! /*#define SYSV		/* for (System III/System V) UNIX systems */
  #ifdef BSD4_3
  #   ifndef BSD4_2
  #	define BSD4_2	/* 4.3 is 4.2 only different. */

--- 11,17 -----
  /*#define MSDOS		/* if this is MSDOS */
  /*#define BSD4_2		/* Berkeley 4.2 BSD */
  /*#define BSD4_3	/* Berkeley 4.3 BSD */
! #define SYSV		/* for (System III/System V) UNIX systems */
  #ifdef BSD4_3
  #   ifndef BSD4_2
  #	define BSD4_2	/* 4.3 is 4.2 only different. */
***************
*** 22,28
  #ifdef MSDOS
  #   define SMALL
  #else			/* assume we're UNIX or something */
! #   if vax || sel || sun || pyr || mc68000 || tahoe
  #	define VMUNIX		/* Virtual Memory UNIX */
  #	define BUFSIZ	1024
  #	define NBUF	64	/* number of disk buffers */

--- 22,28 -----
  #ifdef MSDOS
  #   define SMALL
  #else			/* assume we're UNIX or something */
! #   if vax || sel || sun || pyr || mc68000 || tahoe || iAPX286
  #	define VMUNIX		/* Virtual Memory UNIX */
  #	define BUFSIZ	1024
  #	if iAPX286
***************
*** 25,31
  #   if vax || sel || sun || pyr || mc68000 || tahoe
  #	define VMUNIX		/* Virtual Memory UNIX */
  #	define BUFSIZ	1024
! #	define NBUF	64	/* number of disk buffers */
  #   else
  #	define SMALL
  #	define BUFSIZ	512	/* or 1024 */

--- 25,32 -----
  #   if vax || sel || sun || pyr || mc68000 || tahoe || iAPX286
  #	define VMUNIX		/* Virtual Memory UNIX */
  #	define BUFSIZ	1024
! #	if iAPX286
! #      define NBUF	48
  #   else
  #	   define NBUF	64	/* number of disk buffers */
  #   endif iAPX286
***************
*** 27,32
  #	define BUFSIZ	1024
  #	define NBUF	64	/* number of disk buffers */
  #   else
  #	define SMALL
  #	define BUFSIZ	512	/* or 1024 */
  #	define NBUF	3

--- 28,36 -----
  #	if iAPX286
  #      define NBUF	48
  #   else
+ #	   define NBUF	64	/* number of disk buffers */
+ #   endif iAPX286
+ #   else
  #	define SMALL
  #	define BUFSIZ	512	/* or 1024 */
  #	define NBUF	3
***************
*** 32,38
  #	define NBUF	3
  #   endif
  #
! #   define LOAD_AV	/* Use the load average for various commands.
  #			   Do not define this if you lack a load average
  #			   system call and kmem is read protected. */
  #

--- 36,42 -----
  #	define NBUF	3
  #   endif
  #
! /* #   define LOAD_AV	/* Use the load average for various commands.
  #			   Do not define this if you lack a load average
  #			   system call and kmem is read protected. */
  #
***************
*** 36,42
  #			   Do not define this if you lack a load average
  #			   system call and kmem is read protected. */
  #
! #   define JOB_CONTROL	/* if you have job stopping */
  #
  #   ifdef JOB_CONTROL
  #       define MENLO_JCL

--- 40,46 -----
  #			   Do not define this if you lack a load average
  #			   system call and kmem is read protected. */
  #
! /* #   define JOB_CONTROL	/* if you have job stopping */
  #
  #   ifdef JOB_CONTROL
  #       define MENLO_JCL
***************
*** 49,54
  #ifdef SMALL
      typedef	short	disk_line;
  #else
      typedef	int	disk_line;
  #endif
  

--- 53,61 -----
  #ifdef SMALL
      typedef	short	disk_line;
  #else
+ #if iAPX286
+     typedef long disk_line ;
+ #else
      typedef	int	disk_line;
  #endif iAPX286
  #endif SMALL
***************
*** 50,56
      typedef	short	disk_line;
  #else
      typedef	int	disk_line;
! #endif
  
  #ifndef SMALL
  #   define ABBREV		/* word abbreviation mode */

--- 57,64 -----
      typedef long disk_line ;
  #else
      typedef	int	disk_line;
! #endif iAPX286
! #endif SMALL
  
  #ifndef SMALL
  #   define ABBREV		/* word abbreviation mode */
***************
*** 59,65
  #       define BIFF		/* if you have biff (or the equivalent) */
  #       define F_COMPLETION	/* filename completion */
  #       define CHDIR		/* cd command and absolute pathnames */
!         /*#define	KILL0	/* kill(pid, 0) returns 0 if proc exists */
  #       define SPELL		/* spell words and buffer commands */
  #       define ID_CHAR		/* include code to IDchar */
  #       define WIRED_TERMS	/* include code for wired terminals */

--- 67,73 -----
  #       define BIFF		/* if you have biff (or the equivalent) */
  #       define F_COMPLETION	/* filename completion */
  #       define CHDIR		/* cd command and absolute pathnames */
! #       define	KILL0	/* kill(pid, 0) returns 0 if proc exists */
  #       define SPELL		/* spell words and buffer commands */
  #       define ID_CHAR		/* include code to IDchar */
  #       define WIRED_TERMS	/* include code for wired terminals */
***************
*** 69,75
  #   define CMT_FMT		/* include the comment formatting routines */
  #endif SMALL
  
! #if !sun
  #   define MY_MALLOC	/* use more memory efficient malloc (not on suns) */
  #endif
  

--- 77,83 -----
  #   define CMT_FMT		/* include the comment formatting routines */
  #endif SMALL
  
! #if !sun && !iAPX286
  #   define MY_MALLOC	/* use more memory efficient malloc (not on suns) */
  #endif
  
***************
*** 93,98
  #endif
  
  #ifdef SYSV
  #   define index	strchr
  #   define rindex	strrchr
  #endif

--- 101,108 -----
  #endif
  
  #ifdef SYSV
+ #   define byte_copy(s2, s1, n)	memcpy(s1, s2, n)
+ #   define bzero(s, n)	memset(s, 0, n)
  #   define index	strchr
  #   define rindex	strrchr
  #endif
*** old/Makefile	Fri Oct 10 09:52:53 1986
--- Makefile	Sat Jan 10 16:11:21 1987
***************
*** 18,29
  # e.g., jove.1 or jove.l or jove.m.
  
  DESTDIR =
! TMPDIR = /tmp
! LIBDIR = /u/jpayne/jovelib
! BINDIR = /u/jpayne/bin
! MANDIR = /u/jpayne/manl
! MANEXT = l
! SHELL = /bin/csh
  
  # These should all just be right if the above ones are.
  JOVE = $(DESTDIR)$(BINDIR)/jove

--- 18,29 -----
  # e.g., jove.1 or jove.l or jove.m.
  
  DESTDIR =
! TMPDIR = /usr/tmp
! LIBDIR = /usr/local/lib/jove
! BINDIR = /usr/local
! MANDIR = /usr/man/local/man1
! MANEXT = 1
! SHELL = /bin/sh
  
  # These should all just be right if the above ones are.
  JOVE = $(DESTDIR)$(BINDIR)/jove
***************
*** 44,50
  #	4.2BSD:	LIBS =	-ltermcap
  #	4.3BSD:	LIBS =	-ltermcap
  
! LIBS = -ltermcap
  
  # If you are not VMUNIX (vax running Berkeley Version 4), you must specify
  # the -i flags (split I/D space) and maybe the -x option (for adb to work).

--- 44,50 -----
  #	4.2BSD:	LIBS =	-ltermcap
  #	4.3BSD:	LIBS =	-ltermcap
  
! LIBS = -lcurses
  
  # If you are not VMUNIX (vax running Berkeley Version 4), you must specify
  # the -i flags (split I/D space) and maybe the -x option (for adb to work).
***************
*** 54,60
  #	4.2BSD:	LDFLAGS =
  #	4.3BSD:	LDFLAGS =
  
! LDFLAGS =
  
  CFLAGS = -O
  COFLAGS = -rworking -q

--- 54,60 -----
  #	4.2BSD:	LDFLAGS =
  #	4.3BSD:	LDFLAGS =
  
! LDFLAGS = -Ml
  
  CFLAGS = -Ml -g
  COFLAGS = -rworking -q
***************
*** 56,62
  
  LDFLAGS =
  
! CFLAGS = -O
  COFLAGS = -rworking -q
  
  OBJECTS = keymaps.o funcdefs.o abbrev.o ask.o buf.o c.o case.o ctype.o \

--- 56,62 -----
  
  LDFLAGS = -Ml
  
! CFLAGS = -Ml -g
  COFLAGS = -rworking -q
  
  OBJECTS = keymaps.o funcdefs.o abbrev.o ask.o buf.o c.o case.o ctype.o \
***************
*** 91,97
  	@-date
  
  portsrv:	portsrv.o
! 	cc -o portsrv -n portsrv.o $(LIBS)
  
  recover:	recover.o tune.o rec.h temp.h
  	cc -o recover -n recover.o tune.o $(LIBS)

--- 91,97 -----
  	@-date
  
  portsrv:	portsrv.o
! 	cc $(LDFLAGS) -o portsrv -n portsrv.o $(LIBS)
  
  recover:	recover.o tune.o rec.h temp.h
  	cc $(LDFLAGS) -o recover -n recover.o tune.o $(LIBS)
***************
*** 94,100
  	cc -o portsrv -n portsrv.o $(LIBS)
  
  recover:	recover.o tune.o rec.h temp.h
! 	cc -o recover -n recover.o tune.o $(LIBS)
  
  teachjove:	teachjove.o
  	cc -o teachjove -n teachjove.o $(LIBS)

--- 94,100 -----
  	cc $(LDFLAGS) -o portsrv -n portsrv.o $(LIBS)
  
  recover:	recover.o tune.o rec.h temp.h
! 	cc $(LDFLAGS) -o recover -n recover.o tune.o $(LIBS)
  
  teachjove:	teachjove.o
  	cc $(LDFLAGS) -o teachjove -n teachjove.o $(LIBS)
***************
*** 97,103
  	cc -o recover -n recover.o tune.o $(LIBS)
  
  teachjove:	teachjove.o
! 	cc -o teachjove -n teachjove.o $(LIBS)
  
  setmaps:	setmaps.o funcdefs.c
  	cc -o setmaps setmaps.o

--- 97,103 -----
  	cc $(LDFLAGS) -o recover -n recover.o tune.o $(LIBS)
  
  teachjove:	teachjove.o
! 	cc $(LDFLAGS) -o teachjove -n teachjove.o $(LIBS)
  
  setmaps:	setmaps.o funcdefs.c
  	cc $(LDFLAGS) -o setmaps setmaps.o
***************
*** 100,106
  	cc -o teachjove -n teachjove.o $(LIBS)
  
  setmaps:	setmaps.o funcdefs.c
! 	cc -o setmaps setmaps.o
  
  teachjove.o:	teachjove.c /usr/include/sys/types.h /usr/include/sys/file.h
  	cc -c $(CFLAGS) -DTEACHJOVE=\"$(TEACH-JOVE)\" teachjove.c

--- 100,106 -----
  	cc $(LDFLAGS) -o teachjove -n teachjove.o $(LIBS)
  
  setmaps:	setmaps.o funcdefs.c
! 	cc $(LDFLAGS) -o setmaps setmaps.o
  
  teachjove.o:	teachjove.c /usr/include/sys/types.h /usr/include/sys/file.h
  	cc -c $(CFLAGS) -DTEACHJOVE=\"$(TEACH-JOVE)\" teachjove.c
-- 
    Dan Frank
    uucp: ... uwvax!prairie!dan
    arpa: dan%caseus@spool.wisc.edu