// xiosbase internal header (from <ios>)
#ifndef _XIOSBASE_
#define _XIOSBASE_
#include <use_ansi.h>
#include <xlocale>

#ifdef  _MSC_VER
/*
 * Currently, all MS C compilers for Win32 platforms default to 8 byte
 * alignment.
 */
#pragma pack(push,8)
#endif  /* _MSC_VER */

		// CLASS ios_base
class ios_base {
public:
			// CLASS failure
	class failure : public runtime_error {
	public:
		explicit failure(const string &_S)
			: runtime_error(_S) {}
		virtual ~failure()
			{}
	protected:
		virtual void _Doraise() const
			{_RAISE(*this); }
	};
	enum _Fmtflags {skipws = 0x0001, unitbuf = 0x0002,
		uppercase = 0x0004, showbase = 0x0008,
		showpoint = 0x0010, showpos = 0x0020,
		left = 0x0040, right = 0x0080, internal = 0x0100,
		dec = 0x0200, oct = 0x0400, hex = 0x0800,
		scientific = 0x1000, fixed = 0x2000, boolalpha = 0x4000,
		adjustfield = 0x01c0, basefield = 0x0e00,
		floatfield = 0x3000, _Fmtmask = 0x7fff, _Fmtzero = 0};
	enum _Iostate {goodbit = 0x0, eofbit = 0x1,
		failbit = 0x2, badbit = 0x4, _Statmask = 0x7};
	enum _Openmode {in = 0x01, out = 0x02, ate = 0x04,
		app = 0x08, trunc = 0x10, binary = 0x20};
	enum seekdir {beg = 0, cur = 1, end = 2};
	enum event {erase_event, imbue_event, copyfmt_event};
	typedef void (*event_callback)(event, ios_base&, int);
	_BITMASK(_Fmtflags, fmtflags);
	_BITMASK(_Iostate, iostate);
	_BITMASK(_Openmode, openmode);
	typedef short io_state, open_mode, seek_dir;
			// class Init
	class Init {
	public:
		Init();
		~Init();
	private:
		static int _Init_cnt;
		};
	ios_base& operator=(const ios_base& _R)
		{if (this != &_R)
			{_State = _R._State;
			copyfmt(_R); }
		return (*this); }
	operator bool() const
		{return (!fail()); }
	bool operator!() const
		{return (fail()); }
	void clear(int = goodbit, bool = false);
	void clear(io_state _St)
		{clear((iostate)_St); }
	iostate rdstate() const
		{return (_State); }
	void setstate(iostate _St, bool _Ex = false)
		{if (_St != goodbit)
			clear((iostate)((int)rdstate() | (int)_St), _Ex); }
	void setstate(io_state _St)
		{setstate((iostate)_St); }
	bool good() const
		{return (rdstate() == goodbit); }
	bool eof() const
		{return ((int)rdstate() & (int)eofbit); }
	bool fail() const
		{return ((int)rdstate() & ((int)badbit | (int)failbit)); }
	bool bad() const
		{return ((int)rdstate() & (int)badbit); }
	iostate exceptions() const
		{return (_Except); }
	void exceptions(iostate _Ne)
		{_Except = _Ne & _Statmask;
		clear(_State); }
	void exceptions(io_state _St)
		{exceptions((iostate)_St); }
	fmtflags flags() const
		{return (_Fmtfl); }
	fmtflags flags(fmtflags _Nf)
		{fmtflags _Of = _Fmtfl;
		_Fmtfl = _Nf & _Fmtmask;
		return (_Of); }
	fmtflags setf(fmtflags _Nf)
		{ios_base::fmtflags _Of = _Fmtfl;
		_Fmtfl |= _Nf & _Fmtmask;
		return (_Of); }
	fmtflags setf(fmtflags _Nf, fmtflags _M)
		{ios_base::fmtflags _Of = _Fmtfl;
		_Fmtfl = (_Fmtfl & ~_M) | (_Nf & _M & _Fmtmask);
		return (_Of); }
	void unsetf(fmtflags _M)
		{_Fmtfl &= ~_M; }
	streamsize precision() const
		{return (_Prec); }
	streamsize precision(int _Np)
		{streamsize _Op = _Prec;
		_Prec = _Np;
		return (_Op); }
	streamsize width() const
		{return (_Wide); }
	streamsize width(streamsize _Nw)
		{streamsize _Ow = _Wide;
		_Wide = _Nw;
		return (_Ow); }
	locale getloc() const
		{return (_Loc); }
	locale imbue(const locale&);
	static int xalloc()
		{return (_Index++); }
	long& iword(int _Idx)
		{return (_Findarr(_Idx)._Lo); }
	void *& pword(int _Idx)
		{return (_Findarr(_Idx)._Vp); }
	void register_callback(event_callback, int);
	ios_base& copyfmt(const ios_base&);
	virtual ~ios_base();
protected:
	ios_base()
		: _Loc(_Noinit), _Stdstr(0) {}
	void _Addstd();
	void _Init();
private:
			// STRUCT _Iosarray
	struct _Iosarray {
	public:
		_Iosarray(int _Idx, _Iosarray *_Link)
			: _Next(_Link), _Index(_Idx), _Lo(0), _Vp(0) {}
		_Iosarray *_Next;
		int _Index;
		long _Lo;
		void *_Vp;
		};
			// STRUCT _Fnarray
	struct _Fnarray {
		_Fnarray(int _Idx, event_callback _P, _Fnarray *_Link)
			: _Next(_Link), _Index(_Idx), _Pfn(_P) {}
		_Fnarray *_Next;
		int _Index;
		event_callback _Pfn;
		};
	void _Callfns(event);
	_Iosarray& _Findarr(int);
	void _Tidy();
	iostate _State, _Except;
	fmtflags _Fmtfl;
	int _Prec, _Wide;
	static int _Index;
	_Iosarray *_Arr;
	_Fnarray *_Calls;
	locale _Loc;
	size_t _Stdstr;
	};
_BITMASK_OPS(ios_base::_Fmtflags)
_BITMASK_OPS(ios_base::_Iostate)
_BITMASK_OPS(ios_base::_Openmode)

#ifdef  _MSC_VER
#pragma pack(pop)
#endif  /* _MSC_VER */

#endif /* _XIOSBASE_ */

/*
 * Copyright (c) 1995 by P.J. Plauger.  ALL RIGHTS RESERVED. 
 * Consult your license regarding permissions and restrictions.
 */
