#
# Copyright (C) 1994, Enterprise Integration Technologies Corp. and Niels Mayer.
# WINTERP 1.15-1.99, Copyright (c) 1993, Niels P. Mayer.
# WINTERP 1.0-1.14, Copyright (c) 1989-1992 Hewlett-Packard Co. and Niels Mayer.
# XLISP-STAT 2.1 Copyright (c) 1990, by Luke Tierney
# XLISP version 2.1, Copyright (c) 1989, by David Betz.
#
# Permission to use, copy, modify, distribute, and sell this software and its
# documentation for any purpose is hereby granted without fee, provided that
# the above copyright notice appear in all copies and that both that
# copyright notice and this permission notice appear in supporting
# documentation, and that the name of Enterprise Integration Technologies,
# Hewlett-Packard Company, Niels Mayer, Luke Tierney and David Betz not be
# used in advertising or publicity pertaining to distribution of the software
# without specific, written prior permission.  Enterprise Integration
# Technologies, Hewlett-Packard Company, Niels Mayer, Luke Tierney and David
# Betz make no representations about the suitability of this software for any
# purpose. It is provided "as is" without express or implied warranty.
#
# ENTERPRISE INTEGRATION TECHNOLOGIES, HEWLETT-PACKARD COMPANY, NIELS MAYER,
# LUKE TIERNEY AND DAVID BETZ DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
# SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
# IN NO EVENT SHALL ENTERPRISE INTEGRATION TECHNOLOGIES, HEWLETT-PACKARD
# COMPANY, NIELS MAYER, LUKE TIERNEY NOR DAVID BETZ BE LIABLE FOR ANY SPECIAL,
# INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
#
# See ./winterp/COPYRIGHT for information on contacting the authors.
#
# Please e-mail comments, modifications, questions, improvements and
# bugfixes to the WINTERP mailing list winterp@netcom.com. Please send 
# mailing list subscribe/unsubscribe notices to winterp-request@netcom.com .
# 
# Post XLISP-specific questions/information to the USENET newsgroup
# comp.lang.lisp.x.
#

NPM:
NPM: the version of XLISP-PLUS used in WINTERP is xlisp 2.1c with some fixes
NPM: from xlisp 2.1d. The following announcements relate to the xlisp2.1c
NPM: release
NPM:

From: toma@sail.LABS.TEK.COM (Tom Almy)
Newsgroups: comp.lang.lisp.x
Subject: XLISP 2.1b available
Date: 5 Aug 91 15:42:00 GMT
Reply-To: toma@sail.LABS.TEK.COM (Tom Almy)
Organization: Tektronix, Inc., Beaverton,  OR.

I have just uploaded to glia.biostr.washington.edu (128.95.10.115) and 
bikini.cis.ufl.edu (128.227.224.1) the revised version of my modified xlisp. 
Changes made:

1. This is now called XLISP 2.1b to differentiate it from the standard
   version 2.1 from David Michael Betz.

2. Fixed bugs: LOAD file no longer left open if an error occurs during
   loading. Special variables now bound in parallel in let prog and do.
   The message printed when ^T is typed (MS-DOS version) is now correct.
   You can no longer read from closed file streams.
   The pretty printer (PP.LSP) will correctly print a list with car of NIL.
   Several bugs in the unix version have been corrected, I hope.

3. You can now close any stream.

4. Open file streams are effectively saved in .wks files (SAVE/RESTORE):
   the file name, position, and access method are saved in the .wks file.

5. Added functions: OPEN-STREAM-P INPUT-STREAM-P OUTPUT-STREAM-P and LIST*

6. A new .lsp file contains code that provides a nestable backquote
   facility (from Common Lisp the Language, Second Edition).

7. MS-DOS version now uses medium memory model for most compilers. Support
   added for TopSpeed C.

8. Documentation revised to keep pace.

Tom Almy
toma@sail.labs.tek.com
Standard Disclaimers Apply
-- 
Tom Almy
toma@sail.labs.tek.com
Standard Disclaimers Apply

==============================================================================
From: toma@sail.LABS.TEK.COM (Tom Almy)
Newsgroups: comp.lang.lisp.x
Subject: XLISP 2.1c
Date: 20 Aug 91 16:04:19 GMT
Reply-To: toma@sail.LABS.TEK.COM (Tom Almy)
Organization: Tektronix, Inc., Beaverton,  OR.

This differs from xlisp 2.1b in that the 80386 executable uses DJ Delorie's
GO32 DOS extender, which can be distributed without troublesome restrictions.
While not (yet) VCPI compliant, it is XMS compliant, offers virtual memory,
and provides a SYSTEM function that gives far more free memory than the
old version. *PLEASE* destroy any old copies of the 80386 xlisp and use this
one.

It is obtainable from glia.biostr.washington.edu in the incoming directory,
and will eventually be available on both glia and bikini.cis.ufl.edu.

Files: xlisp21c.zip	Complete distribution
	xlispupd.zip	New executables only
       xlisp21c.tar.Z   Sources only, for UNIX users.

-- 
Tom Almy
toma@sail.labs.tek.com
Standard Disclaimers Apply

==============================================================================

This disk contains the XLISP files you requested. The files are in a
self extracting arj archive, xlisp21c.exe.

To differentiate this version from the original David Betz version,
this one is called xlisp 2.1c. The alphabetic character will be increased 
in future versions.

Go to the directory you wish to install xlisp, and run:

xlisp21c


Directory SOURCES:
Contains all source files. Consult the READ.ME file in that directory
for additional information.

Directory DOCS:
Contains one or more of the following:
	CLDOC.WP	-- WordPerfect 5.1 source for documentation
	CLDOC.PS	-- PostScript version of documentation
	CLDOC.TXT	-- ASCII version of documentation, requires
			backspacing printer. For clear text, use an
			editor and delete all backspace-underscore pairs.

Directory LSP:
Contains the .LSP files, including init.lsp which XLISP automatically
reads at startup.

Directory BIN:
Contains zero or more of the following executables:
	XLISP.EXE	-- Requires 80386/80387 or 80486, and at least
			1 megabyte of extended memory. Uses DJ Delorie's
			port of the Gnu C compiler, and his DOS extender,
			go32. Not compatible with VCPI or DPMI. The compiler
			and DOS extender are available from 
			grape.ecs.clarkson.edu as djgcc.

	XLISPSML.EXE	-- Runs on any generic IBM/PC or Clone. Compiled using
			Borland C++ (as a C compiler), Ralf Brown's spawno
			version 3.0 for nice SYSTEM function, and Fabrice 
			Bellard's lzexe to compact the executable.
			
Directory NDMAKE:
Either empty or contains version 4.5 of Don Kneller's NDMAKE, a shareware
make program. This was used for all the MS-DOS make files.

Directory SPAWNO:
Either empty or contains version 3.0 of Ralf Brown's SPAWNO, a freeware
"virtual memory" spawn function used in creating xlispsml.exe.


**********************

OTHER VERSIONS: 

MS DOS: I am no longer building other versions (such as 80286, or
80x87 support for real mode, or 80386 without 80387).

MS Windows: There are references hinting of a Windows version. Yes,
that is coming someday. Meanwhile the work in this regard has
resulted in still more obscure bug fixes, some improved code, and
operation in medium memory model which is faster and more compact
than the old large model. Medium model is not available for all
compilers.

OS/2: Don't have this. There is an excellent chance that Microsoft C
will compile this as is if the GRAPHICS option is turned off.

OS/2 PM: Not likely.

UNIX: Seems to work on BSD style systems, at least. Those with
ancient compilers may require some code/include file touchups.

Macintosh: Someone, somewhere has the *STUFF.C file for this. With
that file (which will need some hacking) there is no reason for it
not to work.

Others computers: I've tried to make the code as portable as
possible. You'll need to write a *STUFF.C file for your system. Also
read XLISP.H closely. All the 80x86'isms are, thank God,
conditionally included, so these won't get in the way.

C++: It won't compile, but you should be able to hack on the code a while
and get it to go. The ANSI C conversion work I've done should help you,
although I've only converted function headers as necessary to keep the
C compilers happy.


Tom Almy
toma@sail.labs.tek.com

==============================================================================

From: toma@sail.LABS.TEK.COM (Tom Almy)
Newsgroups: comp.lang.lisp.x
Subject: YAXB (bug report)
Date: 29 Sep 91 18:38:16 GMT
Reply-To: toma@sail.LABS.TEK.COM (Tom Almy)
Organization: Tektronix, Inc., Beaverton,  OR.

This problem was reported by Niels Mayer.
 
Problem: (format nil ...) and any output to string streams fail if garbage
collection occurs. Failures can include print depth/length errors, *gc-flag*
message being included in output, garbage characters, and program crashes.
 
Solution: This error was partially corrected by Paul A. W. van Niekerk
back in 1988, as a problem with FORMAT, but is actually more pervasive. The
exact fix depends on if you have his fix installed, and/or are using one
of my enhanced xlisp versions. What follows is a "generic" solution:
 
In xlfio.c, function xformat():
 
Make certain the following statement is at the start of the function:
 
    xlsave1(val);
 
If the function includes an xlpop() call, then temporarily delete that line.
Delete the final, return statement. Add to the end of the function:
 
    /* get string if output to string */
    if (!null(val)) val = getstroutput(val);
 
    /* unprotect */
    xlpop();
 
    /* return the value */
    return val;
 
 
Now go to the file xlprin.c. If it has variable plevel and plength defined
(which means it comes from me), replace function xlputstr() with:
 
/* xlputstr - output a string */
VOID xlputstr(fptr,str)
  LVAL fptr; char *str;
{
/* solve reentrancy problems if gc prints messages and
   xlputstr output is directed to a string stream */
    if (ustreamp(fptr)) {
        int oplevel=plevel, oplength=plength;   /* save these variables */
        char nbuf[STRMAX+1];
        
        if (buf == str) {   /* copy to reentrant buffer if necessary */
            strcpy(nbuf, buf);
            str = nbuf;
        }
        
        while (*str)        /* print string */
            xlputc(fptr, *str++);
 
        plevel = oplevel;   /* restore level and length */
        plength = oplength;
    }
    else
        while (*str)
            xlputc(fptr,*str++);
}
 
 
If those variables do not exist, or if they are not defined, then replace
xlputstr() with this version (which I have not tested):
 
/* xlputstr - output a string */
VOID xlputstr(fptr,str)
  LVAL fptr; char *str;
{
    char nbuf[STRMAX+1];
 
/* solve reentrancy problems if gc prints messages and
   xlputstr output is directed to a string stream */
 
    if (ustreamp(fptr) && buf == str) { /* need to use local buffer */
        strcpy(nbuf, buf);
        str = nbuf;
    }
 
    while (*str)
        xlputc(fptr,*str++);
}
 
 
Tom Almy
toma@sail.labs.tek.com
Standard Disclaimers Apply
-- 
Tom Almy
toma@sail.labs.tek.com
Standard Disclaimers Apply

==============================================================================

From: toma@sail.LABS.TEK.COM (Tom Almy)
Newsgroups: comp.lang.lisp.x
Subject: YAB (Yet Another Bug) in XLISP 2.1c
Date: 19 Sep 91 18:07:21 GMT
Reply-To: toma@sail.LABS.TEK.COM (Tom Almy)
Organization: Tektronix, Inc., Beaverton,  OR.

This only applies to my modified XLISP 2.1c, and when FILETABLE is defined.

Problem: System crash when attempting to restore a file containing file
  streams for deleted files.

Diagnosis: attempt to position file using invalid file pointer.

Solution:
In files dlimage.c and xlimage.c, function xlirestore,

change line:

   if (fp != CLOSED) {/* position to same point,

to:

   if (f != CLOSED) {/* position to same point,

================================
Problem: In the GCC compiled version (xlisp386.exe) RESTORE does not 
work. In fact binary files are handled like ascii files. And written
ASCII files have \r\r\n as the line terminator.

Diagnosis: Binary files opened as ascii files. Ascii files undergo
character conversion twice.

Solution:
In file gccstuff.c, new functions osbopen and osaopen 
(when FILETABLE is defined):

FILEP osbopen(const char *name, const char *mode)
{
    int i=getslot();
    char bmode[10];
    FILE *fp;

    strcpy(bmode,mode);
    strcat(bmode,"b");

    if ((fp = fopen(name,bmode)) == NULL) return CLOSED;

    filetab[i].fp = fp;
    strcpy(filetab[i].name, name);

    return i;
}


FILEP osaopen(const char *name, const char *mode)
{
/* open as binary file, since these work, but set special flag bit */

    int i= osbopen(name, mode);

    if (i != CLOSED) filetab[i].fp->_flag |= KLUDGEFLG;

    return i;
}


Tom Almy
toma@sail.labs.tek.com
Standard Disclaimers Apply
-- 
Tom Almy
toma@sail.labs.tek.com
Standard Disclaimers Apply

==============================================================================
