Article View: net.sources.games
Article #22Curse-d version of Chris Torek's "adv"
From: Chris Miller
Date: Fri, 20 Sep 1985 12:18
Date: Fri, 20 Sep 1985 12:18
926 lines
21905 bytes
21905 bytes
These are the patches for converting the Maryland Windows version of
Chris Torek's "adv", posted some time ago to this group, to use
curses. The main difference is that with the curse-d version the upper
window, displaying the current room, is of constant size (half the
screen) instead of shrinking to stay as small as possible.
The fixes really require a version of "curses" that will exploit the
add-/delete-line capability of many terminals, and a terminal with
these capabilities; patches to "curses" to achieve this were posted
recently by Tom Truscott as part of the distribution of the "wm" window
manager. However, the program should run even without such fixes; just
slowly!
To install these patches, type "| patch -d ADVDIR" at your news-reading
program if (a) it understands how to pipe articles to commands,
(b) you have "patch", (c) ADVDIR is the name of the directory containing
the unpacked distribution of "adv" and (d) you have write permission
therein.
Failing (a), save the article and run patch by hand afterwards;
failing (b) you will have quite a lot of work to do installing about
200 lines of new code by hand - after one such attempt you will probably
want to get hold of "patch"! Failing (c), I can't help you much; I am
certainly NOT going to repost the whole of "adv", so you will have to go
begging from your neighbours.
-------------------------------
diff -rc orig/Makefile cursed/Makefile
*** orig/Makefile Fri Aug 23 13:06:32 1985
--- cursed/Makefile Sun Sep 1 14:49:04 1985
***************
*** 1,5
DESTDIR=
! CFLAGS= -O
OBJS= main.o alc.o str.o readin.o nxtwrd.o rdr.o init.o\
play.o misc.o prt.o file.o disply.o
SRCS= main.c alc.c str.c readin.c nxtwrd.c rdr.c init.c\
--- 1,6 -----
DESTDIR=
! CFLAGS= -O -DCURSED
! # Use -DCURSED to get the "curses" version
OBJS= main.o alc.o str.o readin.o nxtwrd.o rdr.o init.o\
play.o misc.o prt.o file.o disply.o
SRCS= main.c alc.c str.c readin.c nxtwrd.c rdr.c init.c\
***************
*** 4,9
play.o misc.o prt.o file.o disply.o
SRCS= main.c alc.c str.c readin.c nxtwrd.c rdr.c init.c\
play.c misc.c prt.c file.c disply.c
adv: $(OBJS)
$(CC) $(CFLAGS) -o adv $(OBJS) -lwinlib -ltermlib
--- 5,12 -----
play.o misc.o prt.o file.o disply.o
SRCS= main.c alc.c str.c readin.c nxtwrd.c rdr.c init.c\
play.c misc.c prt.c file.c disply.c
+ LIB= curses
+ # LIB=curses for the "curses" version, LIB=winlib" for the original
adv: $(OBJS)
$(CC) $(CFLAGS) -o adv $(OBJS) -l$(LIB) -ltermlib
***************
*** 6,12
play.c misc.c prt.c file.c disply.c
adv: $(OBJS)
! $(CC) $(CFLAGS) -o adv $(OBJS) -lwinlib -ltermlib
$(OBJS): adv.h
--- 9,15 -----
# LIB=curses for the "curses" version, LIB=winlib" for the original
adv: $(OBJS)
! $(CC) $(CFLAGS) -o adv $(OBJS) -l$(LIB) -ltermlib
$(OBJS): adv.h
diff -rc orig/adv.h cursed/adv.h
*** orig/adv.h Fri Aug 23 13:06:32 1985
--- cursed/adv.h Sat Aug 31 15:44:46 1985
***************
*** 1,4
#include <stdio.h>
#include <local/window.h>
#define refresh() (WRCurRow = BaseWin->w_cursor.row, \
--- 1,5 -----
#include <stdio.h>
+ #ifndef CURSED
#include <local/window.h>
#else CURSED
#include <curses.h>
***************
*** 1,5
#include <stdio.h>
#include <local/window.h>
#define refresh() (WRCurRow = BaseWin->w_cursor.row, \
WRCurCol = BaseWin->w_cursor.col, \
--- 1,9 -----
#include <stdio.h>
#ifndef CURSED
#include <local/window.h>
+ #else CURSED
+ #include <curses.h>
+ #endif CURSED
#ifndef CURSED
#define refresh() (WRCurRow = BaseWin->w_cursor.row, \
***************
*** 1,6
#include <stdio.h>
#include <local/window.h>
#define refresh() (WRCurRow = BaseWin->w_cursor.row, \
WRCurCol = BaseWin->w_cursor.col, \
Wrefresh(0))
--- 5,11 -----
#include <curses.h>
#endif CURSED
+ #ifndef CURSED
#define refresh() (WRCurRow = BaseWin->w_cursor.row, \
WRCurCol = BaseWin->w_cursor.col, \
Wrefresh(0))
***************
*** 4,9
#define refresh() (WRCurRow = BaseWin->w_cursor.row, \
WRCurCol = BaseWin->w_cursor.col, \
Wrefresh(0))
#define BOOL char
#ifndef TRUE
--- 9,27 -----
#define refresh() (WRCurRow = BaseWin->w_cursor.row, \
WRCurCol = BaseWin->w_cursor.col, \
Wrefresh(0))
+ #else CURSED
+ #undef refresh
+ typedef WINDOW Win;
+ #define refresh() (wrefresh(TopWin), wrefresh(BaseWin))
+ #define Wrefresh(n) (n ? wrefresh(n) : (wrefresh(TopWin), wrefresh(BaseWin)))
+ #define Wclear(w, n) wclear(w)
+ #define WAcursor(w, x, y) wmove(w, (x), (y))
+ #define Wputs(s, w) waddstr(w, s)
+ #define Wputc(c, w) waddch(w, c)
+ #define Wcleanup() endwin()
+ #define Wexit(n) (endwin(), exit(n))
+ #define ROWS LINES
+ #endif CURSED
#define BOOL char
#ifndef TRUE
***************
*** 26,31
FILE *file; /* Adventure file for reader */
Win *TopWin; /* Top window - room description */
Win *BaseWin; /* Base window - commands, etc */
int ROWS, COLS; /* Screen size */
int ReadingTerminal; /* True => in a getchar() */
int rm; /* Current room */
--- 44,52 -----
FILE *file; /* Adventure file for reader */
Win *TopWin; /* Top window - room description */
Win *BaseWin; /* Base window - commands, etc */
+ #ifdef CURSED
+ Win *CurWin; /* Current window */
+ #endif CURSED
int ROWS, COLS; /* Screen size */
int ReadingTerminal; /* True => in a getchar() */
int rm; /* Current room */
diff -rc orig/disply.c cursed/disply.c
*** orig/disply.c Fri Aug 23 13:06:32 1985
--- cursed/disply.c Fri Aug 23 14:20:50 1985
***************
*** 1,5
#include "adv.h"
extern int (*nl_proc)(); /* called by prt before writing newline */
static int dlleft; /* display lines left */
--- 1,6 -----
#include "adv.h"
+ #ifndef CURSED
extern int (*nl_proc)(); /* called by prt before writing newline */
static int dlleft; /* display lines left */
***************
*** 20,25
Wsize(TopWin, COLS, ROWS);
fullsize = TRUE;
}
/*
* Display the current room in the top window.
--- 21,27 -----
Wsize(TopWin, COLS, ROWS);
fullsize = TRUE;
}
+ #endif CURSED
/*
* Display the current room in the top window.
***************
*** 30,35
register struct room *rp;
register struct item *ip;
register char *s;
static int f1, f2, f3, f4, f5, f6, f7, f8;
int (*oldnlproc)();
--- 32,38 -----
register struct room *rp;
register struct item *ip;
register char *s;
+ #ifndef CURSED
static int f1, f2, f3, f4, f5, f6, f7, f8;
int (*oldnlproc)();
***************
*** 40,45
*/
if (f1 == 0)
Wgetframe(&f1, &f2, &f3, &f4, &f5, &f6, &f7, &f8);
/*
* Flush pending line (if any). Switch output to top window,
--- 43,49 -----
*/
if (f1 == 0)
Wgetframe(&f1, &f2, &f3, &f4, &f5, &f6, &f7, &f8);
+ #endif CURSED
/*
* Flush pending line (if any). Switch output to top window,
***************
*** 50,55
Wclear(TopWin, 2);
WAcursor(TopWin, 0, 0);
/*
* We now have TopWin->IYE lines available to us for printing
* description text. Set the newline procedure so that we can
--- 54,60 -----
Wclear(TopWin, 2);
WAcursor(TopWin, 0, 0);
+ #ifndef CURSED
/*
* We now have TopWin->IYE lines available to us for printing
* description text. Set the newline procedure so that we can
***************
*** 58,63
dlleft = TopWin->IYE;
oldnlproc = nl_proc;
nl_proc = dl_newline;
/*
* If it's dark, just say so. Otherwise find all the items
--- 63,69 -----
dlleft = TopWin->IYE;
oldnlproc = nl_proc;
nl_proc = dl_newline;
+ #endif CURSED
/*
* If it's dark, just say so. Otherwise find all the items
***************
*** 85,90
else
prt(". ");
prt(0); /* fix w_cursor */
if (TopWin->w_cursor.col + strlen(ip->desc) > COLS-3)
prt("\n");
prt(ip->desc);
--- 91,97 -----
else
prt(". ");
prt(0); /* fix w_cursor */
+ #ifndef CURSED
if (TopWin->w_cursor.col + strlen(ip->desc) > COLS-3)
prt("\n");
#else CURSED
***************
*** 87,92
prt(0); /* fix w_cursor */
if (TopWin->w_cursor.col + strlen(ip->desc) > COLS-3)
prt("\n");
prt(ip->desc);
}
}
--- 94,107 -----
#ifndef CURSED
if (TopWin->w_cursor.col + strlen(ip->desc) > COLS-3)
prt("\n");
+ #else CURSED
+ {
+ int y, x;
+ getyx(TopWin, y, x);
+ if (x + strlen(ip->desc) > COLS-3)
+ prt("\n");
+ }
+ #endif CURSED
prt(ip->desc);
}
}
***************
*** 111,116
prt("\n");
cleanup:
/*
* Put up a nice bottom border, adjusting the window size to
* the number of lines used. Set the margins so that the
--- 126,132 -----
prt("\n");
cleanup:
+ #ifndef CURSED
/*
* Put up a nice bottom border, adjusting the window size to
* the number of lines used. Set the margins so that the
***************
*** 125,130
Wsetmargins(TopWin, 0, 0, COLS, TopWin->OYE - 1);
fullsize = FALSE;
}
/*
* Switch output back to the base window.
--- 141,147 -----
Wsetmargins(TopWin, 0, 0, COLS, TopWin->OYE - 1);
fullsize = FALSE;
}
+ #endif CURSED
/*
* Switch output back to the base window.
***************
*** 130,134
* Switch output back to the base window.
*/
CurWin = BaseWin;
nl_proc = oldnlproc; /* restore */
}
--- 147,153 -----
* Switch output back to the base window.
*/
CurWin = BaseWin;
+ #ifndef CURSED
nl_proc = oldnlproc; /* restore */
#endif CURSED
}
***************
*** 131,134
*/
CurWin = BaseWin;
nl_proc = oldnlproc; /* restore */
}
--- 149,153 -----
CurWin = BaseWin;
#ifndef CURSED
nl_proc = oldnlproc; /* restore */
+ #endif CURSED
}
diff -rc orig/main.c cursed/main.c
*** orig/main.c Fri Aug 23 13:06:33 1985
--- cursed/main.c Sat Aug 31 13:57:57 1985
***************
*** 6,11
* advent [-name] [adventure file]
*
* Lots of hacks sometime in '85
*/
#include "adv.h"
--- 6,14 -----
* advent [-name] [adventure file]
*
* Lots of hacks sometime in '85
+ *
+ * Amendments to use "curses" library (#ifdef CURSED) by Chris Miller,
+ * August '85.
*/
#include "adv.h"
***************
*** 9,14
*/
#include "adv.h"
#undef TRUE
#undef FALSE
#undef LL
--- 12,18 -----
*/
#include "adv.h"
+ #ifndef CURSED
#undef TRUE
#undef FALSE
#endif CURSED
***************
*** 11,16
#include "adv.h"
#undef TRUE
#undef FALSE
#undef LL
#include <pwd.h>
#include <ctype.h>
--- 15,21 -----
#ifndef CURSED
#undef TRUE
#undef FALSE
+ #endif CURSED
#undef LL
#include <pwd.h>
#include <ctype.h>
***************
*** 68,73
/*
* Fire up windows.
*/
if (Winit(0, 0)) {
printf ("Sorry, this program won't run on your terminal.\n");
exit(1);
--- 73,79 -----
/*
* Fire up windows.
*/
+ #ifndef CURSED
if (Winit(0, 0)) {
printf ("Sorry, this program won't run on your terminal.\n");
exit(1);
***************
*** 72,77
printf ("Sorry, this program won't run on your terminal.\n");
exit(1);
}
printf("Hi %s, just a second while I create the world...\r\n", name);
fflush(stdout);
--- 78,84 -----
printf ("Sorry, this program won't run on your terminal.\n");
exit(1);
}
+ #endif CURSED
printf("Hi %s, just a second while I create the world...\r\n", name);
fflush(stdout);
***************
*** 75,80
printf("Hi %s, just a second while I create the world...\r\n", name);
fflush(stdout);
/*
* Get some windows and set them up our way (no cursor, nice
* newline mode); we'll use the real screen cursor for input.
--- 82,88 -----
printf("Hi %s, just a second while I create the world...\r\n", name);
fflush(stdout);
+ #ifndef CURSED
/*
* Get some windows and set them up our way (no cursor, nice
* newline mode); we'll use the real screen cursor for input.
***************
*** 89,94
Wnewline(BaseWin, 1);
Wnewline(TopWin, 1);
WSetRealCursor++;
/*
* Read in the adventure file.
--- 97,109 -----
Wnewline(BaseWin, 1);
Wnewline(TopWin, 1);
WSetRealCursor++;
+ #else CURSED
+ initscr();
+ crmode();
+ noecho();
+ {
+ int i;
+ int boundary;
boundary = ROWS/2;
TopWin = newwin(boundary, COLS, 0, 0);
***************
*** 90,95
Wnewline(TopWin, 1);
WSetRealCursor++;
/*
* Read in the adventure file.
*/
--- 105,128 -----
int i;
int boundary;
+ boundary = ROWS/2;
+ TopWin = newwin(boundary, COLS, 0, 0);
+ CurWin = BaseWin = newwin(ROWS-boundary-1, COLS,
+ boundary+1, 0);
+ if (TopWin == NULL || BaseWin == NULL) {
+ Wcleanup();
+ fprintf(stderr, "adv: cannot set up windows\n");
+ exit(100);
+ }
+ move(boundary, 0);
+ for (i = 0; i < COLS; i++) {
+ addch('-');
+ }
+ wrefresh(stdscr);
+ }
+ scrollok(BaseWin, TRUE);
+ #endif CURSED
+
/*
* Read in the adventure file.
*/
***************
*** 138,143
Wputs(msg, TopWin);
}
else {
if (BaseWin->w_cursor.col)
Wputc('\n', BaseWin);
Wputs(msg, BaseWin);
--- 171,177 -----
Wputs(msg, TopWin);
}
else {
+ #ifndef CURSED
if (BaseWin->w_cursor.col)
#endif CURSED
Wputc('\n', BaseWin);
***************
*** 139,144
}
else {
if (BaseWin->w_cursor.col)
Wputc('\n', BaseWin);
Wputs(msg, BaseWin);
Wputc('\n', BaseWin);
--- 173,179 -----
else {
#ifndef CURSED
if (BaseWin->w_cursor.col)
+ #endif CURSED
Wputc('\n', BaseWin);
Wputs(msg, BaseWin);
Wputc('\n', BaseWin);
diff -rc orig/misc.c cursed/misc.c
*** orig/misc.c Fri Aug 23 13:06:34 1985
--- cursed/misc.c Fri Aug 23 13:59:53 1985
***************
*** 162,167
/*
* What is this doing here?
*/
if (COLS - CurWin->w_cursor.col > bs) {
if (COLS - CurWin->w_cursor.col < 4)
Wputc('\n', CurWin);
--- 162,168 -----
/*
* What is this doing here?
*/
+ #ifndef CURSED
if (COLS - CurWin->w_cursor.col > bs) {
if (COLS - CurWin->w_cursor.col < 4)
Wputc('\n', CurWin);
***************
*** 167,172
Wputc('\n', CurWin);
if (COLS - CurWin->w_cursor.col > bs)
bs = COLS - CurWin->w_cursor.col;
}
/*
--- 168,187 -----
Wputc('\n', CurWin);
if (COLS - CurWin->w_cursor.col > bs)
bs = COLS - CurWin->w_cursor.col;
+ #else CURSED
+ {
+ int y, x;
+ getyx(CurWin, y, x);
+
+ if (COLS - x > bs) {
+ if (COLS - x < 4) {
+ waddch(CurWin, '\n');
+ x = 0;
+ }
+ if (COLS - x > bs)
+ bs = COLS - x;
+ }
+ #endif CURSED
}
/*
***************
*** 196,201
nch++;
}
else if (c == Ctl('l')) /* redraw screen */
ScreenGarbaged++;
else if (c >= ' ' && c < 0177) {
bp[nch++] =c;
--- 211,217 -----
nch++;
}
else if (c == Ctl('l')) /* redraw screen */
+ #ifndef CURSED
ScreenGarbaged++;
#else CURSED
wrefresh(curscr);
***************
*** 197,202
}
else if (c == Ctl('l')) /* redraw screen */
ScreenGarbaged++;
else if (c >= ' ' && c < 0177) {
bp[nch++] =c;
if (nch > bs)
--- 213,221 -----
else if (c == Ctl('l')) /* redraw screen */
#ifndef CURSED
ScreenGarbaged++;
+ #else CURSED
+ wrefresh(curscr);
+ #endif CURSED
else if (c >= ' ' && c < 0177) {
bp[nch++] =c;
if (nch > bs)
diff -rc orig/play.c cursed/play.c
*** orig/play.c Fri Aug 23 13:06:34 1985
--- cursed/play.c Sat Aug 31 20:00:59 1985
***************
*** 290,295
prt(":\n");
test = FALSE;
}
if (CurWin->w_cursor.col + strlen(ip->desc) > COLS-3)
prt("\n");
prt(ip->desc);
--- 290,296 -----
prt(":\n");
test = FALSE;
}
+ #ifndef CURSED
if (CurWin->w_cursor.col + strlen(ip->desc) > COLS-3)
prt("\n");
#else CURSED
***************
*** 292,297
}
if (CurWin->w_cursor.col + strlen(ip->desc) > COLS-3)
prt("\n");
prt(ip->desc);
prt(". ");
}
--- 293,307 -----
#ifndef CURSED
if (CurWin->w_cursor.col + strlen(ip->desc) > COLS-3)
prt("\n");
+ #else CURSED
+ {
+ int y, x;
+ getyx(CurWin, y, x);
+
+ if (x + strlen(ip->desc) > COLS-3)
+ prt("\n");
+ }
+ #endif CURSED
prt(ip->desc);
prt(". ");
}
***************
*** 306,311
items[lititm].rm = -1;
isdark = FALSE;
when 8: /* Score */
temp = 0;
for (ip = &items[1]; ip < iteme; ip++)
if (ip->rm == trsrm && *ip->desc == '*')
--- 316,325 -----
items[lititm].rm = -1;
isdark = FALSE;
when 8: /* Score */
+ if (tottrs == 0) { /* Fix: Chris Miller */
+ prt("There aren't any treasures in this game.\n");
+ break;
+ } /* End of fix. */
temp = 0;
for (ip = &items[1]; ip < iteme; ip++)
if (ip->rm == trsrm && *ip->desc == '*')
diff -rc orig/prt.c cursed/prt.c
*** orig/prt.c Fri Aug 23 13:06:35 1985
--- cursed/prt.c Fri Aug 23 14:00:03 1985
***************
*** 5,10
#include "adv.h"
int (*nl_proc)(); /* if not null, called before printing \n */
static char pbuf[256];
--- 5,11 -----
#include "adv.h"
+ #ifndef CURSED
int (*nl_proc)(); /* if not null, called before printing \n */
#endif CURSED
***************
*** 7,12
int (*nl_proc)(); /* if not null, called before printing \n */
static char pbuf[256];
static int pp;
--- 8,14 -----
#ifndef CURSED
int (*nl_proc)(); /* if not null, called before printing \n */
+ #endif CURSED
static char pbuf[256];
static int pp;
***************
*** 20,25
while (*s)
if (*s == '\n') {
pflush();
if (nl_proc)
(*nl_proc)();
Wputc(*s++, CurWin);
--- 22,28 -----
while (*s)
if (*s == '\n') {
pflush();
+ #ifndef CURSED
if (nl_proc)
(*nl_proc)();
#endif CURSED
***************
*** 22,27
pflush();
if (nl_proc)
(*nl_proc)();
Wputc(*s++, CurWin);
}
else
--- 25,31 -----
#ifndef CURSED
if (nl_proc)
(*nl_proc)();
+ #endif CURSED
Wputc(*s++, CurWin);
}
else
***************
*** 36,41
register int c;
{
register char *p;
pbuf[pp++] = c;
if (CurWin->w_cursor.col + pp >= COLS) {
--- 40,48 -----
register int c;
{
register char *p;
+ #ifdef CURSED
+ int y, x;
+ #endif CURSED
pbuf[pp++] = c;
#ifndef CURSED
***************
*** 38,43
register char *p;
pbuf[pp++] = c;
if (CurWin->w_cursor.col + pp >= COLS) {
p = &pbuf[pp];
*p = 0;
--- 45,51 -----
#endif CURSED
pbuf[pp++] = c;
+ #ifndef CURSED
if (CurWin->w_cursor.col + pp >= COLS) {
#else CURSED
getyx(CurWin, y, x);
***************
*** 39,44
pbuf[pp++] = c;
if (CurWin->w_cursor.col + pp >= COLS) {
p = &pbuf[pp];
*p = 0;
while (--p >= pbuf)
--- 47,56 -----
pbuf[pp++] = c;
#ifndef CURSED
if (CurWin->w_cursor.col + pp >= COLS) {
+ #else CURSED
+ getyx(CurWin, y, x);
+ if (x + pp >= COLS) {
+ #endif CURSED
p = &pbuf[pp];
*p = 0;
while (--p >= pbuf)
***************
*** 50,55
*p = 0;
Wputs(pbuf, CurWin);
*p = c;
if (CurWin->w_cursor.col) {
if (nl_proc)
(*nl_proc)();
--- 62,68 -----
*p = 0;
Wputs(pbuf, CurWin);
*p = c;
+ #ifndef CURSED
if (CurWin->w_cursor.col) {
if (nl_proc)
(*nl_proc)();
***************
*** 53,58
if (CurWin->w_cursor.col) {
if (nl_proc)
(*nl_proc)();
Wputc('\n', CurWin);
}
while (*p == ' ')
--- 66,75 -----
if (CurWin->w_cursor.col) {
if (nl_proc)
(*nl_proc)();
+ #else CURSED
+ getyx(CurWin, y, x);
+ if (x) {
+ #endif CURSED
Wputc('\n', CurWin);
}
while (*p == ' ')
diff -rc orig/readin.c cursed/readin.c
*** orig/readin.c Fri Aug 23 13:06:35 1985
--- cursed/readin.c Sat Aug 31 13:59:18 1985
***************
*** 22,27
wrdsiz = 3;
s = rdr();
/*
* Init specials
*/
--- 22,32 -----
wrdsiz = 3;
s = rdr();
+ /* Allow #! construct as first line - Chris Miller, August 1985 */
+ if (*s == '#' && s[1] == '!') {
+ s = rdr();
+ } /* End of #! modification */
+
/*
* Init specials
*/
--
Chris Miller, Heriot-Watt University, Edinburgh
...!ukc!hwcs!chris chris@hwcs.uucp chris@cs.hw.ac.uk
Technical Details
Message-ID:
<618@hwcs.UUCP>Path:
arc1-ca.pugleaf.net!utzoo!watmath!clyde!burl!ulysses!allegra!mit-eddie!think!harvard!seismo!mcvax!ukc!cstvax!hwcs!chrisShow Full Headers
Complete Article Headers
Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.1 6/24/83 (MC830713); site hwcs.UUCP Path: arc1-ca.pugleaf.net!utzoo!watmath!clyde!burl!ulysses!allegra!mit-eddie!think!harvard!seismo!mcvax!ukc!cstvax!hwcs!chris From: chris@hwcs.UUCP (Chris Miller) Newsgroups: net.sources.games Subject: Curse-d version of Chris Torek's "adv" Message-ID: <618@hwcs.UUCP> Date: Fri, 20-Sep-85 08:18:45 EDT Article-I.D.: hwcs.618 Posted: Fri Sep 20 08:18:45 1985 Date-Received: Sun, 22-Sep-85 06:15:46 EDT Reply-To: chris@cs.hw.AC.UK (Chris Miller) Organization: Computer Sci., Heriot-Watt U., Scotland Lines: 926