[comp.lang.c++] A stream library clone, Part 02

pcg@aber-cs.UUCP (Piercarlo Grandi) (12/05/89)

----------------------------------cut here----------------------------------
#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 2 (of 3)."
# Contents:  Makefile _iobuf/Makefile c++-echo.C istream.H
#   istream/Makefile istream/cons-stream.C istream/rsh-white.C
#   istream/scan.C ostream.H ostream/Makefile ostream/form.C stdio.H
#   stream.h stream/clear.C stream/close.C stream/cons-stream.C
#   stream/cons-string.C stream/destruct.C stream/error.C stream/get.C
#   stream/getline.C stream/open-fd.C stream/open-mode.C stream/put.C
#   stream/read.C stream/readline.C stream/remove.C stream/restart.C
#   stream/seek.C stream/setbuf-buf.C stream/setbuf-flags.C
#   stream/setname.C stream/streamName.C stream/write.C
# Wrapped by piercarl@aware on Mon Dec  4 14:14:26 1989
echo '
    Copyright 1989 Piercarlo Grandi. All rights reserved.

    This  shar  archive is free software; you can redistribute it and/or
    modify  it  under  the  terms  of  the GNU General Public License as
    published  by the Free Software Foundation; either version 1, or (at
    your option) any later version.

    This shar archive is distributed in the hope that it will be useful,
    but  WITHOUT  ANY  WARRANTY;  without  even  the implied warranty of
    MERCHANTABILITY  or  FITNESS  FOR  A PARTICULAR PURPOSE. See the GNU
    General Public License for more details.

    You may have received a copy of the GNU General Public License along
    with  this  program;  if not, write to the Free Software Foundation,
    Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
'
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'Makefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Makefile'\"
else
echo shar: Extracting \"'Makefile'\" \(865 characters\)
sed "s/^X//" >'Makefile' <<'END_OF_FILE'
X.SUFFIXES:	.C .a .s .o
X
CFLAGS		=-O
X
X# To compile with this library
C++FLAGS	=$(CFLAGS) -I.
LIBS		=libistream.a libostream.a libstream.a lib_iobuf.a
X# To compile with the libg++
X#C++FLAGS	=$(CFLAGS)
X#LIBS		=/usr/local/lib/libg++.a
X
CC		=time cc
CC++		=time g++ -dm
LD		=time g++
LDFLAGS		=-s
X
X.C.s:;		$(CC++) $(C++FLAGS) -S $*.C
X.C.o:;		$(CC++) $(C++FLAGS) -c $*.C
X.C:;		$(CC++) $(C++FLAGS) $(LDFLAGS) $*.C $(LIBS) -o $@
X
all:		c-echo c-cat c++-echo c++-cat
X	size c-echo c++-echo c-cat c++-cat
X	time ./c-echo */* >/dev/null
X	time ./c++-echo */* >/dev/null
X	time ./c-cat </etc/termcap >/dev/null
X	time ./c++-cat </etc/termcap >/dev/null
X
clean:
X	rm -f *.a *.o c-cat c-echo c++-cat c++-echo
X
X# stdio.H:	_iobuf.H
X# stream.H:	_iobuf.H
X# istream.H:	stream.H
X# ostream.H:	stream.H
X
c++-echo.o:	_iobuf.H stream.H ostream.H
c++-cat.o:	_iobuf.H stream.H istream.H ostream.H
END_OF_FILE
if test 865 -ne `wc -c <'Makefile'`; then
    echo shar: \"'Makefile'\" unpacked with wrong size!
fi
# end of 'Makefile'
fi
if test -f '_iobuf/Makefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'_iobuf/Makefile'\"
else
echo shar: Extracting \"'_iobuf/Makefile'\" \(423 characters\)
sed "s/^X//" >'_iobuf/Makefile' <<'END_OF_FILE'
X.SUFFIXES:	.C .a .s .o
X
I		=../
CFLAGS		=-O
C++FLAGS	=$(CFLAGS) -I$(I)
CC++		=g++
LD		=g++
LDFLAGS		=-s
X
X.C.s:;		$(CC++) $(C++FLAGS) -S $*.C
X.C.o:;		$(CC++) $(C++FLAGS) -c $*.C
X.C:;		$(CC++) $(C++FLAGS) -c $*.C -o $@
X
SRCS		=clearerr.C	fileno.C
OBJS		=clearerr.o	fileno.o
X
LIB		=../lib_iobuf.a
X
X$(LIB): $(OBJS)
X	rm -f $(LIB) && ar r $(LIB) $(OBJS)
X
clean:
X	rm -f $(LIB) *.o
X
clearerr.o:	$(I)_iobuf.H
fileno.o:	$(I)_iobuf.H
END_OF_FILE
if test 423 -ne `wc -c <'_iobuf/Makefile'`; then
    echo shar: \"'_iobuf/Makefile'\" unpacked with wrong size!
fi
# end of '_iobuf/Makefile'
fi
if test -f 'c++-echo.C' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'c++-echo.C'\"
else
echo shar: Extracting \"'c++-echo.C'\" \(299 characters\)
sed "s/^X//" >'c++-echo.C' <<'END_OF_FILE'
X#ifndef _stream_h
X#   include <stream.h>
X#endif
X
extern signed		main
X(
X    auto signed		    argc,
X    auto const char	    **argv
X)
X{
X    cout.form("%s: ",argv[0]);
X
X    for (--argc, argv++; argc && cout << *argv++; --argc)
X	if (argc > 1) cout.put(' ');
X    cout.put('\n');
X
X    return cout.bad();
X}
END_OF_FILE
if test 299 -ne `wc -c <'c++-echo.C'`; then
    echo shar: \"'c++-echo.C'\" unpacked with wrong size!
fi
# end of 'c++-echo.C'
fi
if test -f 'istream.H' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'istream.H'\"
else
echo shar: Extracting \"'istream.H'\" \(1353 characters\)
sed "s/^X//" >'istream.H' <<'END_OF_FILE'
X#ifndef istream_H
X#define istream_H
X#if __STDC__
X#   pragma once
X#endif
X
X#ifndef stream_H
X#   include "stream.H"
X#endif
X
class ostream;
class whitespace;
X
class istream: public stream
X{
protected:
X
X    ostream		*tiedTo;
X    void		flush();
X
public:
X
X    construct		istream();
X    construct		istream(const char *,streamType,streamMode);
X    construct	     	istream(const char *,const char *);
X    construct	     	istream(signed,streamType = streamRead);
X    construct	     	istream(const _iobuf *);
X    construct	     	istream(signed,char *);
X
X    destruct         	~istream();
X
X    convert		operator void *();
X
X    ostream		*tie(ostream *);
X
X    istream		&scan(const char *,...);
X
X    istream		&operator >>(char &);
X
X    istream		&operator >>(short unsigned &);
X    istream		&operator >>(unsigned &);
X    istream		&operator >>(long unsigned &);
X
X    istream		&operator >>(short signed &);
X    istream		&operator >>(signed &);
X    istream		&operator >>(long signed &);
X
X    istream		&operator >>(float &);
X    istream		&operator >>(double &);
X
X    istream		&operator >>(char *);
X
X    istream		&operator >>(const whitespace &);
X};
X
static inline convert	istream::operator void *()
X{
X    return (this->disabled) ? nil(void *) : (void *) this;
X}
X
extern istream  	cin;
X
class whitespace
X{
X};
X
extern whitespace	WS;
X
extern void		eatwhite(istream &);
X
X#endif
END_OF_FILE
if test 1353 -ne `wc -c <'istream.H'`; then
    echo shar: \"'istream.H'\" unpacked with wrong size!
fi
# end of 'istream.H'
fi
if test -f 'istream/Makefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'istream/Makefile'\"
else
echo shar: Extracting \"'istream/Makefile'\" \(1545 characters\)
sed "s/^X//" >'istream/Makefile' <<'END_OF_FILE'
X.SUFFIXES:	.C .a .s .o
X
I		=../
CFLAGS		=-O
C++FLAGS	=$(CFLAGS) -I$(I)
CC++		=g++
LD		=g++
LDFLAGS		=-s
X
X.C.s:;		$(CC++) $(C++FLAGS) -S $*.C
X.C.o:;		$(CC++) $(C++FLAGS) -c $*.C
X.C:;		$(CC++) $(C++FLAGS) -c $*.C -o $@
X
SRCS		=cons-empty.C	cons-fd.C	cons-mode.C		\
X		cons-stdio.C	cons-stream.C	cons-string.C		\
X		destruct.C	eatwhite.C	flush.C			\
X		rsh-char.C	rsh-double.C	rsh-float.C		\
X		rsh-i-s.C	rsh-i-u.C	rsh-l-s.C		\
X		rsh-l-u.C	rsh-s-s.C	rsh-s-u.C		\
X		rsh-string.C	rsh-white.C	scan.C			\
X		tie.C
X
OBJS		=cons-empty.o	cons-fd.o	cons-mode.o		\
X		cons-stdio.o	cons-stream.o	cons-string.o		\
X		destruct.o	eatwhite.o	flush.o			\
X		rsh-char.o	rsh-double.o	rsh-float.o		\
X		rsh-i-s.o	rsh-i-u.o	rsh-l-s.o		\
X		rsh-l-u.o	rsh-s-s.o	rsh-s-u.o		\
X		rsh-string.o	rsh-white.o	scan.o			\
X		tie.o
X
LIB		=../libistream.a
X
X$(LIB): $(OBJS)
X	rm -f $(LIB) && ar r $(LIB) $(OBJS)
X
clean:
X	rm -f $(LIB) *.o
X
cons-empty.C:	$(I)istream.H
cons-fd.C:	$(I)stream.H $(I)istream.H
cons-mode.C:	$(I)stream.H $(I)istream.H
cons-stdio.C:	$(I)stdio.H $(I)stream.H $(I)istream.H
cons-stream.C:	$(I)stream.H $(I)istream.H
cons-string.C:	$(I)stream.H $(I)istream.H
destruct.C:	$(I)istream.H
eatwhite.C:	$(I)istream.H
flush.C:	$(I)ostream.H $(I)istream.H
rsh-char.C:	$(I)istream.H
rsh-double.C:	$(I)istream.H
rsh-float.C:	$(I)istream.H
rsh-i-s.C:	$(I)istream.H
rsh-i-u.C:	$(I)istream.H
rsh-l-s.C:	$(I)istream.H
rsh-l-u.C:	$(I)istream.H
rsh-s-s.C:	$(I)istream.H
rsh-s-u.C:	$(I)istream.H
rsh-string.C:	$(I)istream.H
rsh-white.C:	$(I)istream.H
tie.C:		$(I)ostream.H $(I)istream.H
END_OF_FILE
if test 1545 -ne `wc -c <'istream/Makefile'`; then
    echo shar: \"'istream/Makefile'\" unpacked with wrong size!
fi
# end of 'istream/Makefile'
fi
if test -f 'istream/cons-stream.C' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'istream/cons-stream.C'\"
else
echo shar: Extracting \"'istream/cons-stream.C'\" \(243 characters\)
sed "s/^X//" >'istream/cons-stream.C' <<'END_OF_FILE'
X#include "stream.H"
X
X#include "istream.H"
X
extern construct	istream::istream
X(
X    auto const char	    *filename,
X    auto streamType	    type,
X    auto streamMode	    mode
X) 
X:   stream(filename,type,mode) 
X{ 
X    tiedTo = nil(ostream *); 
X}
END_OF_FILE
if test 243 -ne `wc -c <'istream/cons-stream.C'`; then
    echo shar: \"'istream/cons-stream.C'\" unpacked with wrong size!
fi
# end of 'istream/cons-stream.C'
fi
if test -f 'istream/rsh-white.C' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'istream/rsh-white.C'\"
else
echo shar: Extracting \"'istream/rsh-white.C'\" \(281 characters\)
sed "s/^X//" >'istream/rsh-white.C' <<'END_OF_FILE'
extern "C"
X{
X#include <ctype.h>
X}
X
X#include "istream.H"
X
extern istream		&istream::operator >>
X(
X    auto whitespace	    &
X)
X{
X    this->flush();
X
X    {
X	auto char	    ch;
X
X	while (this->get(ch) && isspace(ch));
X
X	if (this->good())
X	    this->unget(ch);
X    }
X
X    return *this;
X}
END_OF_FILE
if test 281 -ne `wc -c <'istream/rsh-white.C'`; then
    echo shar: \"'istream/rsh-white.C'\" unpacked with wrong size!
fi
# end of 'istream/rsh-white.C'
fi
if test -f 'istream/scan.C' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'istream/scan.C'\"
else
echo shar: Extracting \"'istream/scan.C'\" \(561 characters\)
sed "s/^X//" >'istream/scan.C' <<'END_OF_FILE'
X#ifndef _stdarg_h
X#   include <stdarg.h>
X#endif
X#ifndef _iobuf_H
X#   include "_iobuf.H"
X#endif
X#ifndef stream_H
X#   include "stream.H"
X#endif
X#ifndef istream_H
X#   include "istream.H"
X#endif
X
extern "C"
X{
extern signed		_doscan(struct _iobuf *,const char *,...);
X}
X
extern istream		&istream::scan
X(
X    auto const char	    *format,
X    ...
X)
X{
X    auto va_list	    parms;
X
X    this->flush();
X
X    va_start(parms,format);
X    this->disabled = !this->readable()
X	|| (this->count = ::_doscan(this->stdio,format,parms) < 0);
X    va_end(parms);
X
X    return *this;
X}
END_OF_FILE
if test 561 -ne `wc -c <'istream/scan.C'`; then
    echo shar: \"'istream/scan.C'\" unpacked with wrong size!
fi
# end of 'istream/scan.C'
fi
if test -f 'ostream.H' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'ostream.H'\"
else
echo shar: Extracting \"'ostream.H'\" \(1214 characters\)
sed "s/^X//" >'ostream.H' <<'END_OF_FILE'
X#ifndef ostream_H
X#define ostream_H
X#if __STDC__
X#   pragma once
X#endif
X
X#ifndef stream_H
X#   include "stream.H"
X#endif
X
class ostream: public stream
X{
public:
X
X    construct		ostream();
X    construct		ostream(const char *,streamType,streamMode);
X    construct		ostream(const char *,const char *);
X    construct		ostream(signed,streamType = streamWrite);
X    construct		ostream(const _iobuf *);
X    construct		ostream(signed,const char *);
X
X    convert		operator void *();
X
X    ostream		&form(const char *,...);
X
X    ostream		&operator <<(char);
X
X    ostream		&operator <<(short unsigned);
X    ostream		&operator <<(unsigned);
X    ostream		&operator <<(long unsigned);
X
X    ostream		&operator <<(short signed);
X    ostream		&operator <<(signed);
X    ostream		&operator <<(long signed);
X
X    ostream		&operator <<(float);
X    ostream		&operator <<(double);
X
X    ostream		&operator <<(const char *);
X
X    destruct		~ostream();
X};
X
static inline ostream	&ostream::operator <<
X(
X    auto const char	    ch
X)
X{ 
X    return (ostream &) this->put(ch);
X}
X
static inline convert	ostream::operator void *()
X{ 
X    return (this->disabled) ? nil(void *) : (void *) this;
X}
X
extern ostream		cout;
extern ostream		cerr;
X
X#endif
END_OF_FILE
if test 1214 -ne `wc -c <'ostream.H'`; then
    echo shar: \"'ostream.H'\" unpacked with wrong size!
fi
# end of 'ostream.H'
fi
if test -f 'ostream/Makefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'ostream/Makefile'\"
else
echo shar: Extracting \"'ostream/Makefile'\" \(1357 characters\)
sed "s/^X//" >'ostream/Makefile' <<'END_OF_FILE'
X.SUFFIXES:	.C .a .s .o
X
I		=../
CFLAGS		=-O
C++FLAGS	=$(CFLAGS) -I$(I)
CC++		=g++
LD		=g++
LDFLAGS		=-s
X
X.C.s:;		$(CC++) $(C++FLAGS) -S $*.C
X.C.o:;		$(CC++) $(C++FLAGS) -c $*.C
X.C:;		$(CC++) $(C++FLAGS) -c $*.C -o $@
X
SRCS		=cons-empty.C	cons-fd.C	cons-mode.C		\
X		cons-stdio.C	cons-stream.C	cons-string.C		\
X		destruct.C	form.C		lsh-double.C		\
X		lsh-float.C	lsh-i-s.C	lsh-i-u.C		\
X		lsh-l-s.C	lsh-l-u.C	lsh-s-s.C		\
X		lsh-s-u.C	lsh-string.C
X
OBJS		=cons-empty.o	cons-fd.o	cons-mode.o		\
X		cons-stdio.o	cons-stream.o	cons-string.o		\
X		destruct.o	form.o		lsh-double.o		\
X		lsh-float.o	lsh-i-s.o	lsh-i-u.o		\
X		lsh-l-s.o	lsh-l-u.o	lsh-s-s.o		\
X		lsh-s-u.o	lsh-string.o
X
LIB		=../libostream.a
X
X$(LIB): $(OBJS)
X	rm -f $(LIB) && ar r $(LIB) $(OBJS)
X
clean:
X	rm -f $(LIB) *.o
X
cons-empty.C:	$(I)ostream.H
cons-fd.C:	$(I)stream.H
cons-fd.C:	$(I)ostream.H
cons-mode.C:	$(I)stream.H
cons-mode.C:	$(I)ostream.H
cons-stdio.C:	$(I)stdio.H
cons-stdio.C:	$(I)stream.H
cons-stdio.C:	$(I)ostream.H
cons-stream.C:	$(I)stream.H
cons-stream.C:	$(I)ostream.H
cons-string.C:	$(I)stream.H
cons-string.C:	$(I)ostream.H
destruct.C:	$(I)ostream.H
lsh-double.C:	$(I)ostream.H
lsh-float.C:	$(I)ostream.H
lsh-i-s.C:	$(I)ostream.H
lsh-i-u.C:	$(I)ostream.H
lsh-l-s.C:	$(I)ostream.H
lsh-l-u.C:	$(I)ostream.H
lsh-s-s.C:	$(I)ostream.H
lsh-s-u.C:	$(I)ostream.H
lsh-string.C:	$(I)ostream.H
END_OF_FILE
if test 1357 -ne `wc -c <'ostream/Makefile'`; then
    echo shar: \"'ostream/Makefile'\" unpacked with wrong size!
fi
# end of 'ostream/Makefile'
fi
if test -f 'ostream/form.C' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'ostream/form.C'\"
else
echo shar: Extracting \"'ostream/form.C'\" \(694 characters\)
sed "s/^X//" >'ostream/form.C' <<'END_OF_FILE'
X#ifndef _stdarg_h
X#   include <stdarg.h>
X#endif
X#ifndef _iobuf_H
X#   include "_iobuf.H"
X#endif
X#ifndef stream_H
X#   include "stream.H"
X#endif
X#ifndef ostream_H
X#   include "ostream.H"
X#endif
X
extern "C"
X{
X#if (_iobufVPRINTF)
X    extern signed	vfprintf(struct _iobuf *,const char *,va_list);
X#else
X#   define vfprintf(s,f,p)	_doprnt(f,p,s)
X    extern signed	_doprnt(const char *,va_list,struct _iobuf *);
X#endif
X}
X
extern ostream		&ostream::form
X(
X    auto const char	    *const format,
X    ...
X)
X{
X    auto va_list	    parms;
X
X    va_start(parms,format);
X    this->disabled = !this->writable()
X	|| (this->count = vfprintf(this->stdio,format,parms)) < 0;
X    va_end(parms);
X
X    return *this;
X}
END_OF_FILE
if test 694 -ne `wc -c <'ostream/form.C'`; then
    echo shar: \"'ostream/form.C'\" unpacked with wrong size!
fi
# end of 'ostream/form.C'
fi
if test -f 'stdio.H' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'stdio.H'\"
else
echo shar: Extracting \"'stdio.H'\" \(1157 characters\)
sed "s/^X//" >'stdio.H' <<'END_OF_FILE'
X#ifndef stdio_H
X#define stdio_H
X#if __STDC__
X#   pragma once
X#endif
X
X#ifndef _iobuf_H
X#   include "_iobuf.H"
X#endif
X
extern "C"
X{
extern struct _iobuf	_iob[];
X
extern struct _iobuf	*fopen(const char *,const char *);
extern struct _iobuf	*fdopen(signed,const char *);
extern const char	*fputs(const char *,struct _iobuf *);
extern const char	*fgets(char *,signed,struct _iobuf *);
extern signed		fread(void *,signed,signed,struct _iobuf *);
extern signed		fwrite(const void *,signed,signed,struct _iobuf *);
extern signed		fseek(_iobuf *,long,signed);
extern signed		ungetc(char,_iobuf *);
extern signed		setbuf(struct _iobuf *,char *);
extern signed		setbuffer(struct _iobuf *,char *,signed);
extern signed		setvbuf(struct _iobuf *,char *,_iobufFlags,signed);
X}
X
typedef _iobuf		FILE;
X
X#ifndef NULL
static const signed	NULL = 0;
X#endif
static const signed	BUFSIZ = 1024;
X
static _iobuf		*const stdin = _iob+0;
static _iobuf		*const stdout = _iob+1;
static _iobuf		*const stderr = _iob+2;
X
static inline signed	getchar()
X{
X    return ::getc(::stdin);
X}
X
static inline signed	putchar
X(
X    auto const char	    ch
X)
X{
X    return ::putc(ch,::stdout);
X}
X
X#endif
END_OF_FILE
if test 1157 -ne `wc -c <'stdio.H'`; then
    echo shar: \"'stdio.H'\" unpacked with wrong size!
fi
# end of 'stdio.H'
fi
if test -f 'stream.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'stream.h'\"
else
echo shar: Extracting \"'stream.h'\" \(563 characters\)
sed "s/^X//" >'stream.h' <<'END_OF_FILE'
X#ifndef _stream_h
X#define _stream_h
X#if __STDC__
X#   pragma once
X#endif
X
X#ifndef _iobuf_H
X#   include "_iobuf.H"
X#endif
X#ifndef stream_H
X#   include "stream.H"
X#endif
X
X#define verbose_File_error_handler  stream::verboseHandler
X#define quiet_File_error_handler    stream::quietHandler
X#define fatal_File_error_handler    stream::fatalHandler
X#define File_error_handler	    stream:handler
X#define set_File_error_handler	    stream:setHandler
X
X#ifndef ostream_H
X#   include "ostream.H"
X#endif
X#ifndef istream_H
X#   include "istream.H"
X#endif
X
X#endif /* _stream_h */
END_OF_FILE
if test 563 -ne `wc -c <'stream.h'`; then
    echo shar: \"'stream.h'\" unpacked with wrong size!
fi
# end of 'stream.h'
fi
if test -f 'stream/clear.C' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'stream/clear.C'\"
else
echo shar: Extracting \"'stream/clear.C'\" \(410 characters\)
sed "s/^X//" >'stream/clear.C' <<'END_OF_FILE'
X#include "stream.H"
X#include "_iobuf.H"
X
extern void		stream::clear
X(
X    auto const streamState  flags = streamGood
X)
X{
X    register _iobuf	    *const stdio = this->stdio;
X
X    this->disabled = (flags & (streamFail|streamBad)) != 0;
X
X    stdio->flags &=~ (_iobufError|_iobufEof);
X
X    if (flags & streamEof)
X	stdio->flags |= _iobufEof;
X
X    if (flags & (streamBad|streamFail))
X	stdio->flags |= _iobufError;
X}
END_OF_FILE
if test 410 -ne `wc -c <'stream/clear.C'`; then
    echo shar: \"'stream/clear.C'\" unpacked with wrong size!
fi
# end of 'stream/clear.C'
fi
if test -f 'stream/close.C' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'stream/close.C'\"
else
echo shar: Extracting \"'stream/close.C'\" \(412 characters\)
sed "s/^X//" >'stream/close.C' <<'END_OF_FILE'
X#include "stream.H"
X#include "_iobuf.H"
X
extern "C"
X{
extern signed		fclose(struct _iobuf *);
X}
X
extern stream		&stream::close()
X{
X    if (this->stdio != nil(_iobuf *))
X    {
X	if (this->dispose)
X	    (void) ::fclose(this->stdio);
X	else
X	{
X	    *this->stdio->hand = '\0';
X	    delete this->stdio;
X	}
X
X        this->stdio = nil(_iobuf *);
X    }
X
X    this->disabled = 1;
X    this->dispose = 0;
X
X    return *this;
X}
END_OF_FILE
if test 412 -ne `wc -c <'stream/close.C'`; then
    echo shar: \"'stream/close.C'\" unpacked with wrong size!
fi
# end of 'stream/close.C'
fi
if test -f 'stream/cons-stream.C' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'stream/cons-stream.C'\"
else
echo shar: Extracting \"'stream/cons-stream.C'\" \(235 characters\)
sed "s/^X//" >'stream/cons-stream.C' <<'END_OF_FILE'
X#include "stream.H"
X
extern construct	stream::stream
X(
X    auto const char	    *const filename,
X    auto const streamType   type,
X    auto const streamMode   mode
X)   
X{ 
X    this->initialize(); 
X    this->open(filename,type,mode); 
X}
END_OF_FILE
if test 235 -ne `wc -c <'stream/cons-stream.C'`; then
    echo shar: \"'stream/cons-stream.C'\" unpacked with wrong size!
fi
# end of 'stream/cons-stream.C'
fi
if test -f 'stream/cons-string.C' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'stream/cons-string.C'\"
else
echo shar: Extracting \"'stream/cons-string.C'\" \(1182 characters\)
sed "s/^X//" >'stream/cons-string.C' <<'END_OF_FILE'
X#include "stream.H"
X#include "_iobuf.H"
X
X#ifdef _NFILE
extern "C"
X{
extern unsigned char	*_bufendtab[];
X}
X#endif
X
extern construct	stream::stream
X(
X    auto const signed	    bytes,
X    auto char		    *area,
X    auto const streamType   type
X)
X{
X    if (type != streamRead && type != streamWrite)
X	(*stream::handler)("invalid streamType for string IO");
X
X    this->initialize();
X
X    this->stdio = new _iobuf;
X    this->dispose = 1;
X
X    this->stdio->hand = this->stdio->buffer = (char unsigned *) area;
X
X#ifndef _NFILE
X    this->stdio->fd = 255;
X#else
X    this->stdio->fd = _NFILE-1;
X    _bufendtab[this->stdio->fd] = (unsigned char *) (bytes+area-1);
X#endif
X
X#if (!_iobufUSG)
X    this->stdio->capacity = bytes;
X#endif
X
X    if (type == streamRead)
X    {
X	register unsigned i;
X
X	for (i = 0; i < bytes && area[i] != '\0'; i++);
X
X	/*
X	    Are we sure we want to zap the last byte?
X	*/
X	if (i == bytes)
X	    area[bytes-1] = '\0';
X
X	this->stdio->rest = i;
X	this->stdio->flags = (_iobufReadable|_iobufString|_iobufUserBuffer);
X    }
X    else
X    {
X	this->stdio->rest = bytes-1;
X	this->stdio->flags = (_iobufWritable|_iobufString|_iobufUserBuffer);
X    }
X
X    this->restart(nil(char *));
X}
END_OF_FILE
if test 1182 -ne `wc -c <'stream/cons-string.C'`; then
    echo shar: \"'stream/cons-string.C'\" unpacked with wrong size!
fi
# end of 'stream/cons-string.C'
fi
if test -f 'stream/destruct.C' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'stream/destruct.C'\"
else
echo shar: Extracting \"'stream/destruct.C'\" \(284 characters\)
sed "s/^X//" >'stream/destruct.C' <<'END_OF_FILE'
X#include "stream.H"
X#include "stdio.H"
X
extern destruct		stream::~stream()
X{
X    if (this->fileName != nil(char *))
X	delete this->fileName;
X
X    if (this->stdio == stdin || this->stdio == stdout || this->stdio == stderr)
X	this->flush();
X    else if (this->isopen())
X	this->close();
X}
END_OF_FILE
if test 284 -ne `wc -c <'stream/destruct.C'`; then
    echo shar: \"'stream/destruct.C'\" unpacked with wrong size!
fi
# end of 'stream/destruct.C'
fi
if test -f 'stream/error.C' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'stream/error.C'\"
else
echo shar: Extracting \"'stream/error.C'\" \(502 characters\)
sed "s/^X//" >'stream/error.C' <<'END_OF_FILE'
X#ifndef stdio_H
X#   include "stdio.H"
X#endif
X#ifndef stream_H
X#   include "stream.H"
X#endif
X
extern const char	*streamName(const char *,_iobuf *,signed);
X
extern "C"
X{
extern signed		errno;
extern signed		sprintf(char *,const char *,...);
X}
X
extern void		stream::error()
X{
X    auto char		    msg[BUFSIZ];
X
X    this->disabled = 1;
X
X    if (::errno != 0)
X    {
X	(void) ::sprintf(msg,"\nerror in stream %s\n",
X	    streamName(this->fileName,this->stdio,this->dispose));
X
X	(*stream::handler)(msg);
X    }
X}
END_OF_FILE
if test 502 -ne `wc -c <'stream/error.C'`; then
    echo shar: \"'stream/error.C'\" unpacked with wrong size!
fi
# end of 'stream/error.C'
fi
if test -f 'stream/get.C' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'stream/get.C'\"
else
echo shar: Extracting \"'stream/get.C'\" \(497 characters\)
sed "s/^X//" >'stream/get.C' <<'END_OF_FILE'
X#include "stream.H"
X
extern stream		&stream::get
X(
X    register char	    *s,
X    auto const signed	    n,
X    auto const char	    eos
X)
X{
X    register unsigned	    chars;
X    auto char		    ch;
X
X    if (!this->readable())
X	this->disabled = 1;
X    else
X    {
X	for (chars = 0; chars < n && this->get(ch) && (*s++ = ch) != eos; chars++)
X
X	if (chars < n && this->good() && ch == eos)
X	    this->unget(ch), --s;
X
X	this->count = chars;
X	this->disabled = n != 0 && chars == n;
X    }
X
X    return *this;
X}
END_OF_FILE
if test 497 -ne `wc -c <'stream/get.C'`; then
    echo shar: \"'stream/get.C'\" unpacked with wrong size!
fi
# end of 'stream/get.C'
fi
if test -f 'stream/getline.C' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'stream/getline.C'\"
else
echo shar: Extracting \"'stream/getline.C'\" \(412 characters\)
sed "s/^X//" >'stream/getline.C' <<'END_OF_FILE'
X#include "stream.H"
X
extern stream		&stream::getline
X(
X    register char	    *s,
X    auto signed		    n,
X    auto char		    eos
X)
X{
X    register signed	    chars;
X    char		    ch;
X
X    if (!this->readable())
X	this->disabled = 1;
X    else
X    {
X	for (chars = 0; chars < n && this->get(ch) && (*s++ = ch) != eos; chars++);
X
X	this->count = chars;
X	this->disabled = n != 0 && chars == n;
X    }
X
X    return *this;
X}
END_OF_FILE
if test 412 -ne `wc -c <'stream/getline.C'`; then
    echo shar: \"'stream/getline.C'\" unpacked with wrong size!
fi
# end of 'stream/getline.C'
fi
if test -f 'stream/open-fd.C' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'stream/open-fd.C'\"
else
echo shar: Extracting \"'stream/open-fd.C'\" \(715 characters\)
sed "s/^X//" >'stream/open-fd.C' <<'END_OF_FILE'
X#include "stream.H"
X
extern "C"
X{
extern struct _iobuf	*fdopen(signed,const char *);
X}
X
static const char	*stream_iobufModes
X(
X    auto streamType	    type
X)
X{
X    switch (type)
X    {
X    case streamRead:	    return "r";
X    case streamWrite:	    return "w";
X    case streamUpdate:	    return "r+";
X    case streamAppend:	    return "a";
X    case streamExtend:	    return "a+";
X
X    default:		    return nil(char *);
X    }
X}
X
extern stream		&stream::open
X(
X    auto const signed	    fd,
X    auto const streamType   type
X)
X{
X    this->close();
X
X    if (fd >= 0)
X    {
X	this->stdio = ::fdopen(fd,stream_iobufModes(type));
X	if (this->stdio != nil(_iobuf *))
X	    this->restart(nil(char *));
X    }
X
X    return *this;
X}
END_OF_FILE
if test 715 -ne `wc -c <'stream/open-fd.C'`; then
    echo shar: \"'stream/open-fd.C'\" unpacked with wrong size!
fi
# end of 'stream/open-fd.C'
fi
if test -f 'stream/open-mode.C' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'stream/open-mode.C'\"
else
echo shar: Extracting \"'stream/open-mode.C'\" \(351 characters\)
sed "s/^X//" >'stream/open-mode.C' <<'END_OF_FILE'
X#include "stream.H"
X
extern "C"
X{
extern struct _iobuf	*fopen(const char *,const char *);
X}
X
extern stream		&stream::open
X(
X    auto const char	    *const filename,
X    auto const char	    *const mode
X)
X{                                   
X    this->close();
X    this->stdio = ::fopen(filename,mode);
X    this->restart(filename);
X
X    return *this;
X}
END_OF_FILE
if test 351 -ne `wc -c <'stream/open-mode.C'`; then
    echo shar: \"'stream/open-mode.C'\" unpacked with wrong size!
fi
# end of 'stream/open-mode.C'
fi
if test -f 'stream/put.C' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'stream/put.C'\"
else
echo shar: Extracting \"'stream/put.C'\" \(271 characters\)
sed "s/^X//" >'stream/put.C' <<'END_OF_FILE'
X#include "stream.H"
X
extern "C"
X{
extern const char	*fputs(const char *,struct _iobuf *);
X}
X
extern stream		&stream::put
X(
X    auto const char	    *const s
X)
X{ 
X    if (!this->disabled)
X        this->disabled = ::fputs(s,this->stdio) == nil(char *);
X
X    return *this;
X}
END_OF_FILE
if test 271 -ne `wc -c <'stream/put.C'`; then
    echo shar: \"'stream/put.C'\" unpacked with wrong size!
fi
# end of 'stream/put.C'
fi
if test -f 'stream/read.C' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'stream/read.C'\"
else
echo shar: Extracting \"'stream/read.C'\" \(359 characters\)
sed "s/^X//" >'stream/read.C' <<'END_OF_FILE'
X#include "stream.H"
X#include "_iobuf.H"
X
extern "C"
X{
extern signed		fread(void *,signed,signed,struct _iobuf *);
X}
X
extern stream		&stream::read
X(
X    auto void		    *area,
X    auto const signed	    bytes,
X    auto const signed	    n
X)
X{
X    if (!this->disabled)
X	this->disabled = (this->count = ::fread(area,bytes,n,this->stdio)) != n;
X    return *this;
X} 
END_OF_FILE
if test 359 -ne `wc -c <'stream/read.C'`; then
    echo shar: \"'stream/read.C'\" unpacked with wrong size!
fi
# end of 'stream/read.C'
fi
if test -f 'stream/readline.C' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'stream/readline.C'\"
else
echo shar: Extracting \"'stream/readline.C'\" \(816 characters\)
sed "s/^X//" >'stream/readline.C' <<'END_OF_FILE'
X#include "stream.H"
X
X#define streamCHUNKSZ		512
X
extern char		*stream::readline
X(
X    auto const signed	    chunkno,
X    auto const char	    eos
X) 
X{
X    char		    buf[streamCHUNKSZ];
X    register char	    *bufptr = buf;
X    register char	    *ptr;
X    char		    ch;
X    signed		    cont;
X
X    while ((cont = this->get(ch)) && ch != eos)
X    {
X	    *bufptr++ = ch;
X
X	    if ((bufptr - buf) >= streamCHUNKSZ)
X		{
X		    if (ptr = this->readline(chunkno + 1,eos))
X			for (; bufptr != buf; *--ptr = *--bufptr);
X
X		    return ptr;
X		}
X    }
X
X    if (!cont && bufptr == buf)
X	return nil(char *);
X
X    signed size = (chunkno*streamCHUNKSZ + bufptr - buf) + 1;
X
X    if ((ptr = new char[size]) == nil(char *))
X	return nil(char *);
X
X    for (*(ptr += (size - 1)) = '\0'; bufptr != buf; *--ptr = *--bufptr);
X
X    return ptr;
X}
END_OF_FILE
if test 816 -ne `wc -c <'stream/readline.C'`; then
    echo shar: \"'stream/readline.C'\" unpacked with wrong size!
fi
# end of 'stream/readline.C'
fi
if test -f 'stream/remove.C' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'stream/remove.C'\"
else
echo shar: Extracting \"'stream/remove.C'\" \(270 characters\)
sed "s/^X//" >'stream/remove.C' <<'END_OF_FILE'
X#include "stream.H"
X
extern "C"
X{
extern signed		unlink(const char *);
X}
X
extern stream		&stream::remove()
X{
X    this->close();
X
X    if (!this->disabled)
X        this->disabled = this->fileName == nil(char *)
X			    || ::unlink(this->fileName) < 0;
X
X    return *this;
X}
END_OF_FILE
if test 270 -ne `wc -c <'stream/remove.C'`; then
    echo shar: \"'stream/remove.C'\" unpacked with wrong size!
fi
# end of 'stream/remove.C'
fi
if test -f 'stream/restart.C' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'stream/restart.C'\"
else
echo shar: Extracting \"'stream/restart.C'\" \(405 characters\)
sed "s/^X//" >'stream/restart.C' <<'END_OF_FILE'
X#include "stream.H"
X#include "_iobuf.H"
X
extern const char	*streamName(const char *,const _iobuf *,signed);
X
extern void		stream::restart
X(
X    auto const char	    *const filename
X)
X{
X    if (this->disabled = (this->stdio == nil(_iobuf *)))
X	this->error();
X    else
X    {
X	::clearerr(this->stdio);
X
X	if (filename != nil(char *))
X	    this->setname(streamName(filename,this->stdio,this->dispose));
X    }
X}
END_OF_FILE
if test 405 -ne `wc -c <'stream/restart.C'`; then
    echo shar: \"'stream/restart.C'\" unpacked with wrong size!
fi
# end of 'stream/restart.C'
fi
if test -f 'stream/seek.C' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'stream/seek.C'\"
else
echo shar: Extracting \"'stream/seek.C'\" \(314 characters\)
sed "s/^X//" >'stream/seek.C' <<'END_OF_FILE'
X#include "stream.H"
X#include "_iobuf.H"
X
extern "C"
X{
extern signed		fseek(_iobuf *,long,signed);
X}
X
extern stream		&stream::seek
X(
X    auto const long signed  where,
X    auto const signed	    origin
X)
X{ 
X    if (!this->disabled)
X        this->disabled = ::fseek(this->stdio,where,origin) < 0;
X    return *this;
X}
END_OF_FILE
if test 314 -ne `wc -c <'stream/seek.C'`; then
    echo shar: \"'stream/seek.C'\" unpacked with wrong size!
fi
# end of 'stream/seek.C'
fi
if test -f 'stream/setbuf-buf.C' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'stream/setbuf-buf.C'\"
else
echo shar: Extracting \"'stream/setbuf-buf.C'\" \(519 characters\)
sed "s/^X//" >'stream/setbuf-buf.C' <<'END_OF_FILE'
X#include "stream.H"
X#include "_iobuf.H"
X
extern "C"
X{
extern signed		setbuf(struct _iobuf *,char *);
extern signed		setbuffer(struct _iobuf *,char *,signed);
extern signed		setvbuf(struct _iobuf *,char *,_iobufFlags,signed);
X}
X
extern stream		&stream::setbuf
X(
X    auto signed		    bytes,
X    auto char		    *area
X)
X{
X    if (!this->disabled && !this->dispose)
X    {
X#	if (_iobufSETVBUF)
X	    ::setvbuf(this->stdio,area,_iobufBuffered,bytes);
X#	else
X	    ::setbuf(this->stdio,area);
X#	endif
X    }
X
X    return *this;
X
X}
END_OF_FILE
if test 519 -ne `wc -c <'stream/setbuf-buf.C'`; then
    echo shar: \"'stream/setbuf-buf.C'\" unpacked with wrong size!
fi
# end of 'stream/setbuf-buf.C'
fi
if test -f 'stream/setbuf-flags.C' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'stream/setbuf-flags.C'\"
else
echo shar: Extracting \"'stream/setbuf-flags.C'\" \(832 characters\)
sed "s/^X//" >'stream/setbuf-flags.C' <<'END_OF_FILE'
X#include "stream.H"
X#include "_iobuf.H"
X
extern "C"
X{
extern signed		setbuf(struct _iobuf *,char *);
extern signed		setbuffer(struct _iobuf *,char *,signed);
extern signed		setvbuf(struct _iobuf *,char *,_iobufFlags,signed);
X}
X
extern stream		&stream::setbuf
X(
X    auto const _iobufFlags  buffering
X)
X{                  
X    if (!this->disabled && !this->dispose)
X	switch (buffering)
X	{
X	case _iobufUnbuffered:
X	    (void) ::setbuf(this->stdio,nil(char *));
X	    break;
X
X#	if (_iobufSETLINEBUF)
X	    case _iobufLineBuffer:
X		(void) ::setlinebuf(this->stdio);
X		break;
X#	endif
X
X#	if (_iobufSETVBUF)
X	    case _iobufLineBuffer:
X		(void) ::setvbuf(this->stdio,nil(char *),_iobufLineBuffer,0);
X		break;
X
X	    case _iobufBuffered:
X		(void) ::setvbuf(this->stdio,nil(char *),_iobufBuffered,0);
X		break;
X#	endif
X    }
X
X    return *this;
X}
END_OF_FILE
if test 832 -ne `wc -c <'stream/setbuf-flags.C'`; then
    echo shar: \"'stream/setbuf-flags.C'\" unpacked with wrong size!
fi
# end of 'stream/setbuf-flags.C'
fi
if test -f 'stream/setname.C' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'stream/setname.C'\"
else
echo shar: Extracting \"'stream/setname.C'\" \(424 characters\)
sed "s/^X//" >'stream/setname.C' <<'END_OF_FILE'
X#include "stream.H"
X
extern "C"
X{
extern char		*strcpy(char *,const char *);
extern signed		strlen(const char *);
X}
X
extern void		stream::setname
X(
X    const char		    *newname
X)
X{
X    if (this->fileName != nil(char *))
X	delete this->fileName;
X
X    if (newname == nil(char *))
X	this->fileName = nil(char *);
X    else
X    {
X	this->fileName = new char[::strlen(newname) + 1];
X	(void) ::strcpy(this->fileName,newname);
X    }
X}
END_OF_FILE
if test 424 -ne `wc -c <'stream/setname.C'`; then
    echo shar: \"'stream/setname.C'\" unpacked with wrong size!
fi
# end of 'stream/setname.C'
fi
if test -f 'stream/streamName.C' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'stream/streamName.C'\"
else
echo shar: Extracting \"'stream/streamName.C'\" \(439 characters\)
sed "s/^X//" >'stream/streamName.C' <<'END_OF_FILE'
X#include "stream.H"
X#include "_iobuf.H"
X#include "stdio.H"
X
extern const char	*streamName
X(
X    auto const char	    *const filename,
X    register const _iobuf   *const stdio,
X    auto const signed	    incore
X)
X{
X    return
X    	(filename != nil(char *))	? filename
X    	: incore			? "(string)"
X    	: (stdio == stdin)		? "(stdin)"
X    	: (stdio == stdout)	    	? "(stdout)"
X    	: (stdio == stderr)	    	? "(stderr)"
X    	: "(unnamed)";
X}
END_OF_FILE
if test 439 -ne `wc -c <'stream/streamName.C'`; then
    echo shar: \"'stream/streamName.C'\" unpacked with wrong size!
fi
# end of 'stream/streamName.C'
fi
if test -f 'stream/write.C' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'stream/write.C'\"
else
echo shar: Extracting \"'stream/write.C'\" \(366 characters\)
sed "s/^X//" >'stream/write.C' <<'END_OF_FILE'
X#include "stream.H"
X#include "_iobuf.H"
X
extern "C"
X{
extern signed		fwrite(const void *,signed,signed,struct _iobuf *);
X}
X
extern stream		&stream::write
X(
X    auto void		    *area,
X    auto const signed	    bytes,
X    auto const signed	    n
X)
X{ 
X    if (!this->disabled)
X	this->disabled = (this->count=::fwrite(area,bytes,n,this->stdio)) != n;
X    return *this;
X}
END_OF_FILE
if test 366 -ne `wc -c <'stream/write.C'`; then
    echo shar: \"'stream/write.C'\" unpacked with wrong size!
fi
# end of 'stream/write.C'
fi
echo shar: End of archive 2 \(of 3\).
cp /dev/null ark2isdone
MISSING=""
for I in 1 2 3 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 3 archives.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0

-- 
Piercarlo "Peter" Grandi           | ARPA: pcg%cs.aber.ac.uk@nsfnet-relay.ac.uk
Dept of CS, UCW Aberystwyth        | UUCP: ...!mcvax!ukc!aber-cs!pcg
Penglais, Aberystwyth SY23 3BZ, UK | INET: pcg@cs.aber.ac.uk