268 lines
10 KiB
C++
268 lines
10 KiB
C++
// This is part of the iostream library, providing -*- C++ -*- input/output.
|
|
// Copyright (C) 1991 Per Bothner.
|
|
//
|
|
// This library is free software; you can redistribute it and/or
|
|
// modify it under the terms of the GNU Library General Public
|
|
// License as published by the Free Software Foundation; either
|
|
// version 2 of the License, or (at your option) any later version.
|
|
//
|
|
// This library 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
|
|
// Library General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Library General Public
|
|
// License along with this library; if not, write to the Free
|
|
// Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
#ifndef _IOSTREAM_H
|
|
#ifdef __GNUG__
|
|
#pragma interface
|
|
#endif
|
|
#define _IOSTREAM_H
|
|
#define Q_ENV
|
|
|
|
#include <streambuf.h>
|
|
|
|
class istream; class ostream;
|
|
typedef ios& (*__manip)(ios&);
|
|
typedef istream& (*__imanip)(istream&);
|
|
typedef ostream& (*__omanip)(ostream&);
|
|
|
|
extern istream& ws(istream& ins);
|
|
extern ostream& flush(ostream& outs);
|
|
extern ostream& endl(ostream& outs);
|
|
extern ostream& ends(ostream& outs);
|
|
|
|
class ostream : public ios
|
|
{
|
|
void do_osfx();
|
|
public:
|
|
ostream() { }
|
|
ostream(streambuf* sb, ostream* tied=NULL);
|
|
int opfx() { if (!good()) return 0; if (_tie) _tie->flush(); return 1; }
|
|
void osfx() { if (flags() & (ios::unitbuf|ios::stdio))
|
|
do_osfx(); }
|
|
streambuf* ostreambuf() const { return _strbuf; }
|
|
ostream& flush();
|
|
ostream& put(char c) { _strbuf->sputc(c); return *this; }
|
|
|
|
ostream& write(const char *s, int n);
|
|
ostream& write(const unsigned char *s, int n) { return write((const char*)s, n);}
|
|
#ifndef _G_BROKEN_SIGNED_CHAR
|
|
ostream& write(const signed char *s, int n) { return write((const char*)s, n);}
|
|
#endif
|
|
ostream& write(const void *s, int n) { return write((const char*)s, n);}
|
|
ostream& seekp(streampos);
|
|
ostream& seekp(streamoff, _seek_dir);
|
|
streampos tellp();
|
|
ostream& form(const char *format ...);
|
|
ostream& vform(const char *format, _G_va_list args);
|
|
};
|
|
|
|
extern ostream& operator<<(ostream&, char c);
|
|
inline ostream& operator<<(ostream& os, unsigned char c)
|
|
{ return os << (char)c; }
|
|
#ifndef _G_BROKEN_SIGNED_CHAR
|
|
extern ostream& operator<<(ostream &os, signed char c) { return os << (char)c;}
|
|
#endif
|
|
extern ostream& operator<<(ostream&, const char *s);
|
|
inline ostream& operator<<(ostream& os, const unsigned char *s)
|
|
{ return os << (const char*)s; }
|
|
#ifndef _G_BROKEN_SIGNED_CHAR
|
|
inline ostream& operator<<(ostream& os, const signed char *s)
|
|
{ return os << (const char*)s; }
|
|
#endif
|
|
extern ostream& operator<<(ostream&, void *p);
|
|
extern ostream& operator<<(ostream&, int n);
|
|
extern ostream& operator<<(ostream&, long n);
|
|
extern ostream& operator<<(ostream&, unsigned int n);
|
|
extern ostream& operator<<(ostream&, unsigned long n);
|
|
inline ostream& operator<<(ostream& os, short n) {return os << (int)n;}
|
|
inline ostream& operator<<(ostream& os, unsigned short n)
|
|
{return os << (unsigned int)n;}
|
|
extern ostream& operator<<(ostream&, float n);
|
|
extern ostream& operator<<(ostream&, double n);
|
|
inline ostream& operator<<(ostream& os, __omanip func) { return (*func)(os); }
|
|
inline ostream& operator<<(ostream& os, __manip func) {(*func)(os); return os;}
|
|
extern ostream& operator<<(ostream&, streambuf*);
|
|
|
|
class istream : public ios
|
|
{
|
|
_G_ssize_t _gcount;
|
|
|
|
int _skip_ws();
|
|
public:
|
|
istream() { _gcount = 0; }
|
|
istream(streambuf* sb, ostream*tied=NULL);
|
|
streambuf* istreambuf() const { return _strbuf; }
|
|
istream& get(char& c);
|
|
istream& get(unsigned char& c) { return get((char&)c); }
|
|
#ifndef _G_BROKEN_SIGNED_CHAR
|
|
istream& get(signed char& c) { return get((char&)c); }
|
|
#endif
|
|
istream& read(char *ptr, int n);
|
|
istream& read(unsigned char *ptr, int n) { return read((char*)ptr, n); }
|
|
#ifndef _G_BROKEN_SIGNED_CHAR
|
|
istream& read(signed char *ptr, int n) { return read((char*)ptr, n); }
|
|
#endif
|
|
istream& read(void *ptr, int n) { return read((char*)ptr, n); }
|
|
// Should get() and/or peek() set failbit and/or eofbit? FIXME!
|
|
istream& getline(char* ptr, int len, char delim = '\n');
|
|
istream& get(char* ptr, int len, char delim = '\n');
|
|
istream& get(streambuf& sb, char delim = '\n');
|
|
istream& gets(char **s, char delim = '\n');
|
|
int ipfx(int need) {
|
|
if (!good()) { set(ios::failbit); return 0; }
|
|
if (_tie && (need == 0 || rdbuf()->in_avail() < need)) _tie->flush();
|
|
if (!need && (flags() & ios::skipws)) return _skip_ws();
|
|
return 1;
|
|
}
|
|
int ipfx0() { // Optimized version of ipfx(0).
|
|
if (!good()) { set(ios::failbit); return 0; }
|
|
if (_tie) _tie->flush();
|
|
if (flags() & ios::skipws) return _skip_ws();
|
|
return 1;
|
|
}
|
|
int ipfx1() { // Optimized version of ipfx(1).
|
|
if (!good()) { set(ios::failbit); return 0; }
|
|
if (_tie && rdbuf()->in_avail() == 0) _tie->flush();
|
|
return 1;
|
|
}
|
|
int get() { if (!ipfx1()) return EOF;
|
|
int ch = _strbuf->sbumpc();
|
|
if (ch == EOF) set(ios::eofbit);
|
|
return ch; }
|
|
int peek() { if (!ipfx1()) return EOF;
|
|
int ch = _strbuf->sgetc();
|
|
if (ch == EOF) set(ios::eofbit);
|
|
return ch; }
|
|
_G_ssize_t gcount() { return _gcount; }
|
|
istream& ignore(int n=1, int delim = EOF);
|
|
istream& seekg(streampos);
|
|
istream& seekg(streamoff, _seek_dir);
|
|
streampos tellg();
|
|
istream& putback(char ch) {
|
|
if (good() && _strbuf->sputbackc(ch) == EOF) clear(ios::badbit);
|
|
return *this;}
|
|
istream& unget() {
|
|
if (good() && _strbuf->sungetc() == EOF) clear(ios::badbit);
|
|
return *this;}
|
|
istream& scan(const char *format ...);
|
|
istream& vscan(const char *format, _G_va_list args);
|
|
#ifdef _STREAM_COMPAT
|
|
istream& unget(char ch) { return putback(ch); }
|
|
int skip(int i);
|
|
#endif
|
|
};
|
|
|
|
extern istream& operator>>(istream&, char*);
|
|
inline istream& operator>>(istream& is, unsigned char* p)
|
|
{ return is >> (char*)p; }
|
|
#ifndef _G_BROKEN_SIGNED_CHAR
|
|
inline istream& operator>>(istream& is, signed char*p) {return is >> (char*)p;}
|
|
#endif
|
|
extern istream& operator>>(istream&, char& c);
|
|
extern istream& operator>>(istream& s, unsigned char& c) {return s>>(char&)c;}
|
|
#ifndef _G_BROKEN_SIGNED_CHAR
|
|
extern istream& operator>>(istream& s, signed char& c) {return s >> (char&)c;}
|
|
#endif
|
|
extern istream& operator>>(istream&, int&);
|
|
extern istream& operator>>(istream&, long&);
|
|
extern istream& operator>>(istream&, short&);
|
|
extern istream& operator>>(istream&, unsigned int&);
|
|
extern istream& operator>>(istream&, unsigned long&);
|
|
extern istream& operator>>(istream&, unsigned short&);
|
|
extern istream& operator>>(istream&, float&);
|
|
extern istream& operator>>(istream&, double&);
|
|
inline istream& operator>>(istream& is, __manip func) {(*func)(is); return is;}
|
|
inline istream& operator>>(istream& is, __imanip func) { return (*func)(is); }
|
|
extern istream& operator>>(istream&, streambuf*);
|
|
|
|
class iostream : public ios {
|
|
_G_ssize_t _gcount;
|
|
public:
|
|
iostream() { _gcount = 0; }
|
|
iostream(streambuf* sb, ostream*tied=NULL);
|
|
operator istream&() { return *(istream*)this; }
|
|
operator ostream&() { return *(ostream*)this; }
|
|
// NOTE: These duplicate istream methods.
|
|
istream& get(char& c) { return ((istream*)this)->get(c); }
|
|
istream& get(unsigned char& c) { return ((istream*)this)->get((char&)c); }
|
|
#ifndef _G_BROKEN_SIGNED_CHAR
|
|
istream& get(signed char& c) { return ((istream*)this)->get((char&)c); }
|
|
#endif
|
|
istream& read(char *ptr, int n) { return ((istream*)this)->read(ptr, n); }
|
|
istream& read(unsigned char *ptr, int n)
|
|
{ return ((istream*)this)->read((char*)ptr, n); }
|
|
#ifndef _G_BROKEN_SIGNED_CHAR
|
|
istream& read(signed char *ptr, int n)
|
|
{ return ((istream*)this)->read((char*)ptr, n); }
|
|
#endif
|
|
istream& read(void *ptr, int n)
|
|
{ return ((istream*)this)->read((char*)ptr, n); }
|
|
istream& getline(char* ptr, int len, char delim = '\n')
|
|
{ return ((istream*)this)->getline(ptr, len, delim); }
|
|
istream& get(char* ptr, int len, char delim = '\n')
|
|
{ return ((istream*)this)->get(ptr, len, delim); }
|
|
istream& gets(char **s, char delim = '\n')
|
|
{ return ((istream*)this)->gets(s, delim); }
|
|
istream& ignore(int n=1, int delim = EOF)
|
|
{ return ((istream*)this)->ignore(n, delim); }
|
|
int ipfx(int need) { return ((istream*)this)->ipfx(need); }
|
|
int ipfx0() { return ((istream*)this)->ipfx0(); }
|
|
int ipfx1() { return ((istream*)this)->ipfx1(); }
|
|
int get() { return _strbuf->sbumpc(); }
|
|
int peek() { return ipfx1() ? _strbuf->sgetc() : EOF; }
|
|
_G_ssize_t gcount() { return _gcount; }
|
|
istream& putback(char ch) { return ((istream*)this)->putback(ch); }
|
|
istream& unget() { return ((istream*)this)->unget(); }
|
|
istream& seekg(streampos pos) { return ((istream*)this)->seekg(pos); }
|
|
istream& seekg(streamoff off, _seek_dir dir)
|
|
{ return ((istream*)this)->seekg(off, dir); }
|
|
streampos tellg() { return ((istream*)this)->tellg(); }
|
|
istream& scan(const char *format ...);
|
|
istream& vscan(const char *format, _G_va_list args)
|
|
{ return ((istream*)this)->vscan(format, args); }
|
|
#ifdef _STREAM_COMPAT
|
|
istream& unget(char ch) { return putback(ch); }
|
|
#endif
|
|
|
|
// NOTE: These duplicate ostream methods.
|
|
int opfx() { return ((ostream*)this)->opfx(); }
|
|
void osfx() { ((ostream*)this)->osfx(); }
|
|
ostream& flush() { return ((ostream*)this)->flush(); }
|
|
ostream& put(char c) { return ((ostream*)this)->put(c); }
|
|
ostream& write(const char *s, int n)
|
|
{ return ((ostream*)this)->write(s, n); }
|
|
ostream& write(const unsigned char *s, int n)
|
|
{ return ((ostream*)this)->write((const char*)s, n); }
|
|
#ifndef _G_BROKEN_SIGNED_CHAR
|
|
ostream& write(const signed char *s, int n)
|
|
{ return ((ostream*)this)->write((const char*)s, n); }
|
|
#endif
|
|
ostream& write(const void *s, int n)
|
|
{ return ((ostream*)this)->write((const char*)s, n); }
|
|
ostream& form(const char *format ...);
|
|
ostream& vform(const char *format, _G_va_list args)
|
|
{ return ((ostream*)this)->vform(format, args); }
|
|
ostream& seekp(streampos pos) { return ((ostream*)this)->seekp(pos); }
|
|
ostream& seekp(streamoff off, _seek_dir dir)
|
|
{ return ((ostream*)this)->seekp(off, dir); }
|
|
streampos tellp() { return ((ostream*)this)->tellp(); }
|
|
};
|
|
|
|
extern istream cin;
|
|
extern ostream cout, cerr, clog; // clog->rdbuf() == cerr->rdbuf()
|
|
|
|
struct Iostream_init { } ; // Compatibility hack for AT&T libraray.
|
|
|
|
inline ios& dec(ios& i)
|
|
{ i.setf(ios::dec, ios::dec|ios::hex|ios::oct); return i; }
|
|
inline ios& hex(ios& i)
|
|
{ i.setf(ios::hex, ios::dec|ios::hex|ios::oct); return i; }
|
|
inline ios& oct(ios& i)
|
|
{ i.setf(ios::oct, ios::dec|ios::hex|ios::oct); return i; }
|
|
|
|
#endif /*!_IOSTREAM_H*/
|