stevec@fornax.UUCP (Steve Cumming) (02/17/89)
So I'm sorry if you've seen this allready. Some obscure places like Toronto and Akron seem invisible to all my mailers. So, here goes again: ------------------Clip Here ---------------------- The following are context diffs for a port of the Sun Users Group 1987 Distribution of Franz Lisp to a Sun 3-280 running SunOS4.0. They have so far been used successfully by me and some other person in the Maritimes. Good luck!. The changes can be divided into about 4 categories: 1) lint removal and minor OS changes modules franz/lamg.c, franz/lam[2567].c. and franz/fpipe.c fall into this category, as do most of the changes in franz/fasl.c typical changes are inserting appropriate type casts and accounting for changes in the signal() system call. I was not obsessive about removing lint - just stuff I was paranoid about... 2) actual "bug"-fixes - if a poor coding habit is a bug. franz/error.c and franz/alloc.c these changes fix incorrect returns from functions. SunOS4 cc no longer arranges for returns of the last lvalue. If no return is specified, the value of the function is 0. consequently they took a little trouble to find. And there may be more... If anything goes wrong, look for such an error. 3) some additional debug code, turned on by modifying the franz/68k/Makefile CFLAG def to include -DDEBUG Not much of this, though. It's predominantly in the fasl, for when I or someome else tries to port the interpreter to a Sun4 :-), or to make use of dynamic linked object modules. 4) non perspicuous changes in Makefiles. I deleted any Makefile diffs that related to source or destination directories. You should be able to apply patch(1) to these diffs. Otherwise, they are not too painful to do by hand. Don't forget that you will still have to fix up the makefiles to conform to local ideas about where binaries and libraries go. This code has <not> been extensively tested. It manages to build itself and make its compiler, which appears to work correctly on at least some of the lisp lib modules. This is a fairly demanding test, but not exhaustive, I suppose. I <may> attempt to play with dynamic linking. I <shall> attempt to port the interpreter to a Sun 4 - [I have been informed that this is even way harder than I imagined ] I fear that porting the compiler to a Sun4 is beyond my ability If I manage, I'll post such other fixes as may be necessary. If anyone comes up with anything interesting, please post, or mail me at stevec@lccr.cs.sfu.ca stevec@lccr.sfu.cdn (sigh) uunet!ubc-cs!fornax!stevec Steve Cumming School of Computing Science Simon Fraser University Vancouver, BC (604) 291 4399 ***************************************************************************** *** ./franz/alloc.c Thu Dec 8 13:54:15 1988 --- /usr/ursa/SunUG/1987/languages/franz.lisp/franz/alloc.c Thu Jul 23 15:42:10 1987 *************** *** 66,76 **** extern char purepage[]; extern int fakettsize; extern int gcstrings; - #ifdef DEBUG - int debugin = TRUE - #else int debugin = FALSE; /* temp debug flag */ - #endif DEBUG extern lispval datalim; /* end of data space */ int bitmapi[BITLONGS]; /* the bit map--one bit per long */ --- 66,72 ---- *************** *** 412,423 **** char *inewstr(s) char *s; { ! return(Iinewstr(s,0)); } char *pinewstr(s) char *s; { ! return(Iinewstr(s,1)); } lispval --- 408,419 ---- char *inewstr(s) char *s; { ! Iinewstr(s,0); } char *pinewstr(s) char *s; { ! Iinewstr(s,1); } lispval diff -r -w -c ./franz/error.c /usr/ursa/SunUG/1987/languages/franz.lisp/franz/error.c *** ./franz/error.c Wed Dec 7 15:36:28 1988 --- /usr/ursa/SunUG/1987/languages/franz.lisp/franz/error.c Thu Jul 23 15:42:19 1987 *************** *** 280,296 **** int uniqid,contuab; char *message; { - #ifdef SunOS4 - lispval handy; - #endif SunOS4 IElimit = 0; ! #ifdef SunOS4 ! handy = Ierrorh(type,message,valret,contuab,uniqid); ! return(handy); ! #else ! (void) Ierrorh(type,message,valret,contuab,uniqid); /* NOTREACHED */ - #endif SunOS4 } lispval --- 280,288 ---- int uniqid,contuab; char *message; { IElimit = 0; ! Ierrorh(type,message,valret,contuab,uniqid); /* NOTREACHED */ } lispval *************** *** 299,316 **** int uniqid,contuab; char *message; { - #ifdef SunOS4 - lispval handy; - #endif SunOS4 IElimit = 1; IEargs[0] = arg1; ! #ifdef SunOS4 ! handy = Ierrorh(type, message, valret, contuab, uniqid); ! return(handy); ! #else ! (void) Ierrorh(type, message, valret, contuab, uniqid); /* NOTREACHED */ - #endif SunOS4 } lispval --- 291,300 ---- int uniqid,contuab; char *message; { IElimit = 1; IEargs[0] = arg1; ! Ierrorh(type,message,valret,contuab,uniqid); /* NOTREACHED */ } lispval *************** *** 319,337 **** int uniqid,contuab; char *message; { - #ifdef SunOS4 - lispval handy; - #endif SunOS4 IElimit = 2; IEargs[0] = arg1; IEargs[1] = arg2; - #ifdef SunOS4 - handy = Ierrorh(type,message,valret,contuab,uniqid); - return(handy); - #else Ierrorh(type,message,valret,contuab,uniqid); /* NOTREACHED */ - #endif SunOS4 } lispval --- 303,313 ---- *************** *** 443,452 **** wnaerr(fcn,wantargs) lispval fcn; { ! if (Vinterrfcn == nil) { Vinterrfcn = matom("int:wrong-number-of-args-error"); } ! if (Vinterrfcn->a.fnbnd != nil) { protect(fcn); protect(inewint(wantargs / 1000)); /* min */ protect(inewint((wantargs % 1000) - 1)); /* max */ --- 419,430 ---- wnaerr(fcn,wantargs) lispval fcn; { ! if (Vinterrfcn == nil) ! { Vinterrfcn = matom("int:wrong-number-of-args-error"); } ! if (Vinterrfcn->a.fnbnd != nil) ! { protect(fcn); protect(inewint(wantargs / 1000)); /* min */ protect(inewint((wantargs % 1000) - 1)); /* max */ *************** *** 453,464 **** Ifuncal(Vinterrfcn); error("wrong number of args function should never return ", FALSE); } ! #ifdef SunOS4 ! (void) errorh1(Vermisc, "wrong number of arguments to ", nil, FALSE, 0, fcn); ! /* NOT REACHED */ ! #else errorh1(Vermisc, "wrong number of arguments to ", nil, FALSE, 0, fcn); - #endif SunOS4 } --- 431,438 ---- Ifuncal(Vinterrfcn); error("wrong number of args function should never return ", FALSE); } ! errorh1(Vermisc,"wrong number of arguments to ",nil,FALSE,0,fcn); } diff -r -w -c ./franz/fasl.c /usr/ursa/SunUG/1987/languages/franz.lisp/franz/fasl.c *** ./franz/fasl.c Thu Dec 8 12:16:15 1988 --- /usr/ursa/SunUG/1987/languages/franz.lisp/franz/fasl.c Tue Sep 9 09:08:40 1986 *************** *** 203,209 **** /* symbols which hold the locations of the segments in core and * in the file */ ! unsigned char *code_core_org, /* beginning of code segment */ *lc_org, /* beginning of linker segment */ *lc_end, /* last word in linker segment */ *literal_core_org, /* beginning of literal table */ --- 203,209 ---- /* symbols which hold the locations of the segments in core and * in the file */ ! char *code_core_org, /* beginning of code segment */ *lc_org, /* beginning of linker segment */ *lc_end, /* last word in linker segment */ *literal_core_org, /* beginning of literal table */ *************** *** 311,317 **** lbot = np; /* set up base for later calls */ /* allocate space for string table on the stack */ ! string_core_org = (unsigned char *) alloca(string_size - 4); if( read(fileno(filp), string_core_org , string_size - 4) != string_size -4) error("fasl: string table read error ",FALSE); --- 311,317 ---- lbot = np; /* set up base for later calls */ /* allocate space for string table on the stack */ ! string_core_org = alloca(string_size - 4); if( read(fileno(filp), string_core_org , string_size - 4) != string_size -4) error("fasl: string table read error ",FALSE); *************** *** 328,334 **** for(i=0; i < times ; i++) { syml=(struct nlist*)(symbols+i*sizeof(struct nlist)); ! symbol_name = syml->n_un.n_strx - 4 + (char *)string_core_org; if(debug) printf("symbol %s\n read\n",symbol_name); if (syml->n_type == N_EXT) { --- 328,334 ---- for(i=0; i < times ; i++) { syml=(struct nlist*)(symbols+i*sizeof(struct nlist)); ! symbol_name = syml->n_un.n_strx - 4 + string_core_org; if(debug) printf("symbol %s\n read\n",symbol_name); if (syml->n_type == N_EXT) { *************** *** 391,397 **** */ lseek(fileno(filp),(long)sizeof(struct exec),0); ! code_core_org = (unsigned char *) csegment(OTHER,segsiz,TRUE); if(read(fileno(filp),code_core_org,bind_org) != bind_org) error("Read error in text ",FALSE); --- 391,397 ---- */ lseek(fileno(filp),(long)sizeof(struct exec),0); ! code_core_org = (char *) csegment(OTHER,segsiz,TRUE); if(read(fileno(filp),code_core_org,bind_org) != bind_org) error("Read error in text ",FALSE); *************** *** 431,437 **** /* read the binder table and literals onto the stack */ ! binder_core_org = (unsigned char *)alloca(lit_end - bind_org); read(fileno(filp),binder_core_org,lit_end-bind_org); literal_core_org = binder_core_org + lit_org - bind_org; --- 431,437 ---- /* read the binder table and literals onto the stack */ ! binder_core_org = alloca(lit_end - bind_org); read(fileno(filp),binder_core_org,lit_end-bind_org); literal_core_org = binder_core_org + lit_org - bind_org; *************** *** 442,460 **** if(trans_size > 0) { - #ifdef DEBUG - printf("fasl: alloc trans table entry for %s\n",filnm); - fflush(stdout); - #endif DEBUG tranloc = gettran(trans_size); Symbtb[0].floc = (int) tranloc; } - #ifdef DEBUG - else { - printf("fasl: no tranfer table for %s\n",filnm); - fflush(stdout); - } - #endif DEBUG /* now relocate the necessary symbols in the text segment */ --- 442,450 ---- *************** *** 589,600 **** handy = Lread(); /* get function name */ uctolc = ouctolc; getc(p); - #ifdef DEBUG - printf("trans table entry for function "); - printr(handy,stdout); - printf("set \n"); - fflush(stdout); - #endif DEBUG tranloc->name = handy; tranloc->fcn = qlinker; /* initially go to qlinker */ tranloc++; --- 579,584 ---- diff -r -w -c ./franz/fpipe.c /usr/ursa/SunUG/1987/languages/franz.lisp/franz/fpipe.c *** ./franz/fpipe.c Wed Oct 26 12:19:38 1988 --- /usr/ursa/SunUG/1987/languages/franz.lisp/franz/fpipe.c Thu Jul 23 16:58:39 1987 *************** *** 111,117 **** FILE * fstopen(base,count,flag) ! unsigned char *base; char *flag; { register FILE *p = fdopen(0,flag); --- 111,117 ---- FILE * fstopen(base,count,flag) ! char *base; char *flag; { register FILE *p = fdopen(0,flag); diff -r -w -c ./franz/lam2.c /usr/ursa/SunUG/1987/languages/franz.lisp/franz/lam2.c *** ./franz/lam2.c Mon Sep 12 14:48:02 1988 --- /usr/ursa/SunUG/1987/languages/franz.lisp/franz/lam2.c Thu Jul 23 15:42:24 1987 *************** *** 299,309 **** while(n + cp >= endstrb) cp = atomtoolong(cp); _myiob._flag = _IOWRT+_IOSTRG; ! _myiob._ptr = (unsigned char *)cp; _myiob._cnt = endstrb - cp - 1; pbignum(cur,&_myiob); ! cp = (char *)_myiob._ptr; *cp = 0; break; } --- 299,309 ---- while(n + cp >= endstrb) cp = atomtoolong(cp); _myiob._flag = _IOWRT+_IOSTRG; ! _myiob._ptr = cp; _myiob._cnt = endstrb - cp - 1; pbignum(cur,&_myiob); ! cp = _myiob._ptr; *cp = 0; break; } diff -r -w -c ./franz/lam5.c /usr/ursa/SunUG/1987/languages/franz.lisp/franz/lam5.c *** ./franz/lam5.c Mon Sep 12 14:48:02 1988 --- /usr/ursa/SunUG/1987/languages/franz.lisp/franz/lam5.c Thu Jul 23 15:42:28 1987 *************** *** 142,148 **** strb = alloca(count); _strbuf._flag = _IOWRT+_IOSTRG; ! _strbuf._ptr = (unsigned char *)strb; _strbuf._cnt = count; pbignum(lbot->val,&_strbuf); putc(0,&_strbuf); --- 142,148 ---- strb = alloca(count); _strbuf._flag = _IOWRT+_IOSTRG; ! _strbuf._ptr = strb; _strbuf._cnt = count; pbignum(lbot->val,&_strbuf); putc(0,&_strbuf); diff -r -w -c ./franz/lam6.c /usr/ursa/SunUG/1987/languages/franz.lisp/franz/lam6.c *** ./franz/lam6.c Wed Oct 26 12:23:47 1988 --- /usr/ursa/SunUG/1987/languages/franz.lisp/franz/lam6.c Thu Jul 23 15:42:29 1987 *************** *** 24,30 **** { register lispval work, handy; register FILE *p; ! register unsigned char *string; char *alloca(); FILE *fstopen(); lispval Lread(); int count; --- 24,30 ---- { register lispval work, handy; register FILE *p; ! register char *string; char *alloca(); FILE *fstopen(); lispval Lread(); int count; *************** *** 44,50 **** /* compute length of list */ for(work = lbot->val; TYPE(work)==DTPR; work=work->d.cdr) count++; ! string = (unsigned char *)alloca(count); p = fstopen(string, count - 1, "r"); for(work = lbot->val; TYPE(work)==DTPR; work=work->d.cdr) { handy = work->d.car; --- 44,50 ---- /* compute length of list */ for(work = lbot->val; TYPE(work)==DTPR; work=work->d.cdr) count++; ! string = alloca(count); p = fstopen(string, count - 1, "r"); for(work = lbot->val; TYPE(work)==DTPR; work=work->d.cdr) { handy = work->d.car; diff -r -w -c ./franz/lam7.c /usr/ursa/SunUG/1987/languages/franz.lisp/franz/lam7.c *** ./franz/lam7.c Mon Sep 12 14:48:02 1988 --- /usr/ursa/SunUG/1987/languages/franz.lisp/franz/lam7.c Thu Jul 23 15:42:32 1987 *************** *** 155,165 **** char *command, *p; int writep, readp; int itemp; - #ifdef SunOS4 - void (*handler)(); - #else int (*handler)(), (*signal())(); - #endif SunOS4 FILE *bufs[2],*obufs[2], *fpipe(); Savestack(0); --- 155,161 ---- *************** *** 195,205 **** childso = fileno(obufs[1]); } - #ifdef SunOS4 - handler = (void (*)())signal(SIGINT,SIG_IGN); - #else handler = signal(SIGINT,SIG_IGN); - #endif SunOS4 if((child = vfork()) == 0 ) { /* if we will wait for the child to finish * and if the process had ignored interrupts before --- 191,197 ---- *************** *** 207,213 **** * set it back the the default (death) */ if(wflag && handler != SIG_IGN) ! signal(SIGINT,SIG_DFL); if(writep) { close(0); --- 199,205 ---- * set it back the the default (death) */ if(wflag && handler != SIG_IGN) ! signal(2,SIG_DFL); if(writep) { close(0); diff -r -w -c ./franz/lamgc.c /usr/ursa/SunUG/1987/languages/franz.lisp/franz/lamgc.c *** ./franz/lamgc.c Mon Sep 12 14:55:21 1988 --- /usr/ursa/SunUG/1987/languages/franz.lisp/franz/lamgc.c Thu Jul 23 15:43:00 1987 *************** *** 92,98 **** only if gcstat is non zero */ gcdump() { ! #ifdef FOO extern struct vtimes premark,presweep,alldone; int nbytes, recsize; /* 16 bytes/page in the bitmap */ --- 92,98 ---- only if gcstat is non zero */ gcdump() { ! #ifdef extern struct vtimes premark,presweep,alldone; int nbytes, recsize; /* 16 bytes/page in the bitmap */ diff -r -w -c ./franz/sysat.c /usr/ursa/SunUG/1987/languages/franz.lisp/franz/sysat.c *** ./franz/sysat.c Thu Dec 8 12:37:30 1988 --- /usr/ursa/SunUG/1987/languages/franz.lisp/franz/sysat.c Thu Jul 23 15:42:21 1987 *************** *** 190,200 **** clos_marker = inewatom("int:closure-marker"); Vpbv = inewatom("value-structure-argument"); rsetatom = inewatom("*rset"); - #ifdef DEBUG - rsetatom->a.clb = tatom; - #else rsetatom->a.clb = nil; - #endif DEBUG Vsubrou = inewatom("subroutine"); Vpiport = inewatom("piport"); Vpiport->a.clb = P(piport = stdin); /* standard input */ --- 190,196 ---- *************** *** 218,228 **** Vldprt = inewatom("$ldprint"); /* when nil, inhibits printing of fasl/autoload */ /* cfasl messages to term */ - #ifdef DEBUG Vldprt->a.clb = tatom; - #else - Vldprt->a.clb = nil; - #endif DEBUG Vprinlevel = inewatom("prinlevel"); /* printer recursion count */ Vprinlevel->a.clb = nil; /* infinite recursion */ --- 214,220 ---- *************** *** 373,385 **** Iaddstat(inewatom("chainatom"),ST_RINTB,ST_INTB,inewint(0)); Iaddstat(inewatom("dumpmode"),ST_DMPR,ST_DMPW,nil); Iaddstat(inewatom("appendmap"),ST_READ,ST_SET,nil); /* used by fasl */ - #ifndef DEBUG Iaddstat(inewatom("debugging"),ST_READ,ST_SET,nil); - #else - /* Iaddstat(inewatom("debugging"),ST_READ,ST_SET,mstr("debug")); */ - Iaddstat(inewatom("debugging"),ST_READ,ST_SET,nil); - #endif DEBUG - Iaddstat(inewatom("evalhook"),ST_RINTB,ST_INTB,inewint(3)); Isstatus(inewatom("evalhook"),nil); /*evalhook switch off */ Iaddstat(inewatom("bcdtrace"),ST_READ,ST_BCDTR,nil); --- 365,371 ---- diff ./franz/68kMakefile /usr/ursa/SunUG/1987/languages/frans.lisp/franz/68k/Makefile *** ./franz/68k/Makefile --- /usr/ursa/SunUG/1987/languages/franz.lisp/franz/68k/Makefile Fri Sep 30 16:52:31 1988 *************** *** 81,91 **** AllSrc = $(M68kSrc) Makefile first8.c fixregs.sed ! #CFLAGS = -O -I../h -f68881 # BZS - for 68881 only (SUN3) see CC(1) ! #CFLAGS = -g -I../h -Dstrcpyn=strncpy -Dstrcmpn=strncmp -DSunOS4 -Bstatic -DSFUDEBUG ! CFLAGS = -O -I../h -Dstrcpyn=strncpy -Dstrcmpn=strncmp -DSunOS4 -Bstatic ! #LDFLAGS = -z -x -e start -Bstatic ! LDFLAGS = -e start -Bstatic #ifdef unisoft #CFLAGS = -I../h --- 81,87 ---- AllSrc = $(M68kSrc) Makefile first8.c fixregs.sed ! CFLAGS = -O -I../h -f68881 # BZS - for 68881 only (SUN3) see CC(1) #ifdef unisoft #CFLAGS = -I../h *************** *** 169,175 **** rawlisp: ${BottomObj} ${NoHoleObj} ${MipObj4} ${M68kObj} ${OsObjs} rm -f rawlisp ! ld -o rawlisp ${LDFLAGS} ${BottomObj} ${NoHoleObj} \ ${M68kObj} ${MipObj4} ${OsObjs} \ ${Libs} -ltermcap /lib/Mcrt1.o -lm -lc # Note: Mcrt1.o is for -f68881 only for SUN3, just remove and fix CFLAGS above --- 165,171 ---- rawlisp: ${BottomObj} ${NoHoleObj} ${MipObj4} ${M68kObj} ${OsObjs} rm -f rawlisp ! ld -z -x -o rawlisp -e start ${BottomObj} ${NoHoleObj} \ ${M68kObj} ${MipObj4} ${OsObjs} \ ${Libs} -ltermcap /lib/Mcrt1.o -lm -lc # Note: Mcrt1.o is for -f68881 only for SUN3, just remove and fix CFLAGS above *************** *** 190,196 **** rm -f *.o rawlisp rawhlisp nlisp snlisp lint: ! lint -I../h ../h/*.h *.c install: nlisp -rm -f ${ObjDir}/lisp --- 186,192 ---- rm -f *.o rawlisp rawhlisp nlisp snlisp lint: ! lint ../h/*.h *.c install: nlisp -rm -f ${ObjDir}/lisp diff -r -w -c ./franz/h/config.h /usr/ursa/SunUG/1987/languages/franz.lisp/franz/h/config.h *** ./franz/h/config.h Thu Nov 3 16:54:46 1988 --- /usr/ursa/SunUG/1987/languages/franz.lisp/franz/h/config.h Tue Sep 9 09:13:51 1986 *************** *** 208,221 **** #define TTSIZE 10216 #define FREESIZE 512 * 10000 #endif - /* - #ifdef SunOS4 - #undef TTSIZE - #define TTSIZE 32768 - #endif - */ - #ifdef SFUDEBUG - #undef TTSIZE - #define TTSIZE 7216 - #endif - --- 208,210 ---- diff -r -w -c ./liszt/io.l /usr/ursa/SunUG/1987/languages/franz.lisp/liszt/io.l *** ./liszt/io.l Tue Sep 13 12:16:41 1988 --- /usr/ursa/SunUG/1987/languages/franz.lisp/liszt/io.l Tue Sep 9 09:15:10 1986 *************** *** 167,174 **** ;register char **arge; ;{ ; *--argv = "-f"; ! ; *--argv = "/usr/local/bin/lisp"; ! ; execve("/usr/local/bin/lisp",argv,arge); ; exit(0); ;} ; --- 167,174 ---- ;register char **arge; ;{ ; *--argv = "-f"; ! ; *--argv = "/usr/ucb/lisp"; ! ; execve("/usr/ucb/lisp",argv,arge); ; exit(0); ;} ; diff -r -w -c ./liszt/68k/Makefile /usr/ursa/SunUG/1987/languages/franz.lisp/liszt/68k/Makefile *** ./liszt/68k/Makefile Wed Dec 7 16:32:37 1988 --- /usr/ursa/SunUG/1987/languages/franz.lisp/liszt/68k/Makefile Fri Sep 30 16:52:32 1988 *************** *** 27,35 **** # #--- Default Paths and programs # ! DEFAULT:nliszt ! SUFFIXES: ! SUFFIXES: .l.o # DESTDIR is the relative offset of where the compiler goes # (when making new distributions, the `root' is often at /nbsd). --- 27,35 ---- # #--- Default Paths and programs # ! .DEFAULT:nliszt ! .SUFFIXES: ! .SUFFIXES: .l.o # DESTDIR is the relative offset of where the compiler goes # (when making new distributions, the `root' is often at /nbsd). *************** *** 108,114 **** # cp liszt ${Liszt} #else mv nliszt ${Liszt} - # mv snliszt ${Liszt} #endif clean: cleanobj --- 108,113 ---- diff -r -w -c ./liszt/68k/liszt.c /usr/ursa/SunUG/1987/languages/franz.lisp/liszt/68k/liszt.c *** ./liszt/68k/liszt.c Tue Sep 13 12:41:31 1988 --- /usr/ursa/SunUG/1987/languages/franz.lisp/liszt/68k/liszt.c Thu Jul 23 15:43:55 1987 *************** *** 22,32 **** #include "../../franz/h/config.h" #ifndef LISZT ! #define LISZT "/usr/local/lib/nliszt" #endif #ifndef AS ! #define AS "/usr/local/lib/lisp/as" #endif #ifndef OFFSET --- 22,32 ---- #include "../../franz/h/config.h" #ifndef LISZT ! #define LISZT "/usr/ucb/xliszt" #endif #ifndef AS ! #define AS "/usr/lib/lisp/as" #endif #ifndef OFFSET --------------------------------------------------------------- Steve Cumming stevec@lccr.cs.sfu.ca {uunet|...}!ubc-cs!fornax!stevec School of CS SFU (604) 291-4399 ... I'll be far off and gone Vancouver, CDN like summer wages. -- Steve Cumming stevec@lccr.cs.sfu.ca {uunet|...}!ubc-cs!fornax!stevec School of CS SFU (604) 291-4399 ... I'll be far off and gone Vancouver, CDN like summer wages.