home *** CD-ROM | disk | FTP | other *** search
/ Computer Club Elmshorn Atari PD / CCE_PD.iso / pc / 0400 / CCE_0423.ZIP / CCE_0423.PD / GPINCL13.ZOO / iostream.h < prev    next >
C/C++ Source or Header  |  1992-10-01  |  11KB  |  268 lines

  1. //    This is part of the iostream library, providing -*- C++ -*- input/output.
  2. //    Copyright (C) 1991 Per Bothner.
  3. //
  4. //    This library is free software; you can redistribute it and/or
  5. //    modify it under the terms of the GNU Library General Public
  6. //    License as published by the Free Software Foundation; either
  7. //    version 2 of the License, or (at your option) any later version.
  8. //
  9. //    This library is distributed in the hope that it will be useful,
  10. //    but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. //    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12. //    Library General Public License for more details.
  13. //
  14. //    You should have received a copy of the GNU Library General Public
  15. //    License along with this library; if not, write to the Free
  16. //    Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17.  
  18. #ifndef _IOSTREAM_H
  19. #ifdef __GNUG__
  20. #pragma interface
  21. #endif
  22. #define _IOSTREAM_H
  23. #define Q_ENV
  24.  
  25. #include <streambu.h>
  26.  
  27. class istream; class ostream;
  28. typedef ios& (*__manip)(ios&);
  29. typedef istream& (*__imanip)(istream&);
  30. typedef ostream& (*__omanip)(ostream&);
  31.  
  32. extern istream& ws(istream& ins);
  33. extern ostream& flush(ostream& outs);
  34. extern ostream& endl(ostream& outs);
  35. extern ostream& ends(ostream& outs);
  36.  
  37. class ostream : public ios
  38. {
  39.     void do_osfx();
  40.   public:
  41.     ostream() { }
  42.     ostream(streambuf* sb, ostream* tied=NULL);
  43.     int opfx() { if (!good()) return 0; if (_tie) _tie->flush(); return 1; }
  44.     void osfx() { if (flags() & (ios::unitbuf|ios::stdio))
  45.               do_osfx(); }
  46.     streambuf* ostreambuf() const { return _strbuf; }
  47.     ostream& flush();
  48.     ostream& put(char c) { _strbuf->sputc(c); return *this; }
  49.  
  50.     ostream& write(const char *s, size_t n);
  51.     ostream& write(const unsigned char *s, size_t n) { return write((const char*)s, n);}
  52. #ifndef _G_BROKEN_SIGNED_CHAR
  53.     ostream& write(const signed char *s, size_t n) { return write((const char*)s, n);}
  54. #endif
  55.     ostream& write(const void *s, size_t n) { return write((const char*)s, n);}
  56.     ostream& seekp(streampos);
  57.     ostream& seekp(streamoff, _seek_dir);
  58.     streampos tellp();
  59.     ostream& form(const char *format ...);
  60.     ostream& vform(const char *format, _G_va_list args);
  61. };
  62.  
  63. extern ostream& operator<<(ostream&, char c);
  64. inline ostream& operator<<(ostream& os, unsigned char c)
  65. { return os << (char)c; }
  66. #ifndef _G_BROKEN_SIGNED_CHAR
  67. extern ostream& operator<<(ostream &os, signed char c) { return os << (char)c;}
  68. #endif
  69. extern ostream& operator<<(ostream&, const char *s);
  70. inline ostream& operator<<(ostream& os, const unsigned char *s)
  71. { return os << (const char*)s; }
  72. #ifndef _G_BROKEN_SIGNED_CHAR
  73. inline ostream& operator<<(ostream& os, const signed char *s)
  74. { return os << (const char*)s; }
  75. #endif
  76. extern ostream& operator<<(ostream&, void *p);
  77. extern ostream& operator<<(ostream&, int n);
  78. extern ostream& operator<<(ostream&, long n);
  79. extern ostream& operator<<(ostream&, unsigned int n);
  80. extern ostream& operator<<(ostream&, unsigned long n);
  81. inline ostream& operator<<(ostream& os, short n) {return os << (int)n;}
  82. inline ostream& operator<<(ostream& os, unsigned short n)
  83. {return os << (unsigned int)n;}
  84. extern ostream& operator<<(ostream&, float n);
  85. extern ostream& operator<<(ostream&, double n);
  86. inline ostream& operator<<(ostream& os, __omanip func) { return (*func)(os); }
  87. inline ostream& operator<<(ostream& os, __manip func) {(*func)(os); return os;}
  88. extern ostream& operator<<(ostream&, streambuf*);
  89.  
  90. class istream : public ios
  91. {
  92.     _G_ssize_t _gcount;
  93.  
  94.     int _skip_ws();
  95.   public:
  96.     istream() { _gcount = 0; }
  97.     istream(streambuf* sb, ostream*tied=NULL);
  98.     streambuf* istreambuf() const { return _strbuf; }
  99.     istream& get(char& c);
  100.     istream& get(unsigned char& c) { return get((char&)c); }
  101. #ifndef _G_BROKEN_SIGNED_CHAR
  102.     istream& get(signed char& c)  { return get((char&)c); }
  103. #endif
  104.     istream& read(char *ptr, size_t n);
  105.     istream& read(unsigned char *ptr, size_t n) { return read((char*)ptr, n); }
  106. #ifndef _G_BROKEN_SIGNED_CHAR
  107.     istream& read(signed char *ptr, size_t n) { return read((char*)ptr, n); }
  108. #endif
  109.     istream& read(void *ptr, size_t n) { return read((char*)ptr, n); }
  110.     // Should get() and/or peek() set failbit and/or eofbit? FIXME!
  111.     istream& getline(char* ptr, int len, char delim = '\n');
  112.     istream& get(char* ptr, int len, char delim = '\n');
  113.     istream& get(streambuf& sb, char delim = '\n');
  114.     istream& gets(char **s, char delim = '\n');
  115.     int ipfx(int need) {
  116.     if (!good()) { set(ios::failbit); return 0; }
  117.     if (_tie && (need == 0 || rdbuf()->in_avail() < need)) _tie->flush();
  118.     if (!need && (flags() & ios::skipws)) return _skip_ws();
  119.     return 1;
  120.     }
  121.     int ipfx0() { // Optimized version of ipfx(0).
  122.     if (!good()) { set(ios::failbit); return 0; }
  123.     if (_tie) _tie->flush();
  124.     if (flags() & ios::skipws) return _skip_ws();
  125.     return 1;
  126.     }
  127.     int ipfx1() { // Optimized version of ipfx(1).
  128.     if (!good()) { set(ios::failbit); return 0; }
  129.     if (_tie && rdbuf()->in_avail() == 0) _tie->flush();
  130.     return 1;
  131.     }
  132.     int get() { if (!ipfx1()) return EOF;
  133.         int ch = _strbuf->sbumpc();
  134.         if (ch == EOF) set(ios::eofbit);
  135.         return ch; }
  136.     int peek() { if (!ipfx1()) return EOF;
  137.         int ch = _strbuf->sgetc();
  138.         if (ch == EOF) set(ios::eofbit);
  139.         return ch; }
  140.     _G_ssize_t gcount() { return _gcount; }
  141.     istream& ignore(int n=1, int delim = EOF);
  142.     istream& seekg(streampos);
  143.     istream& seekg(streamoff, _seek_dir);
  144.     streampos tellg();
  145.     istream& putback(char ch) {
  146.     if (good() && _strbuf->sputbackc(ch) == EOF) clear(ios::badbit);
  147.     return *this;}
  148.     istream& unget() {
  149.     if (good() && _strbuf->sungetc() == EOF) clear(ios::badbit);
  150.     return *this;}
  151.     istream& scan(const char *format ...);
  152.     istream& vscan(const char *format, _G_va_list args);
  153. #ifdef _STREAM_COMPAT
  154.     istream& unget(char ch) { return putback(ch); }
  155.     int skip(int i);
  156. #endif
  157. };
  158.  
  159. extern istream& operator>>(istream&, char*);
  160. inline istream& operator>>(istream& is, unsigned char* p)
  161. { return is >> (char*)p; }
  162. #ifndef _G_BROKEN_SIGNED_CHAR
  163. inline istream& operator>>(istream& is, signed char*p) {return is >> (char*)p;}
  164. #endif
  165. extern istream& operator>>(istream&, char& c);
  166. extern istream& operator>>(istream& s, unsigned char& c) {return s>>(char&)c;}
  167. #ifndef _G_BROKEN_SIGNED_CHAR
  168. extern istream& operator>>(istream& s, signed char& c) {return s >> (char&)c;}
  169. #endif
  170. extern istream& operator>>(istream&, int&);
  171. extern istream& operator>>(istream&, long&);
  172. extern istream& operator>>(istream&, short&);
  173. extern istream& operator>>(istream&, unsigned int&);
  174. extern istream& operator>>(istream&, unsigned long&);
  175. extern istream& operator>>(istream&, unsigned short&);
  176. extern istream& operator>>(istream&, float&);
  177. extern istream& operator>>(istream&, double&);
  178. inline istream& operator>>(istream& is, __manip func) {(*func)(is); return is;}
  179. inline istream& operator>>(istream& is, __imanip func) { return (*func)(is); }
  180. extern istream& operator>>(istream&, streambuf*);
  181.  
  182. class iostream : public ios {
  183.     _G_ssize_t _gcount;
  184.   public:
  185.     iostream() { _gcount = 0; }
  186.     iostream(streambuf* sb, ostream*tied=NULL);
  187.     operator istream&() { return *(istream*)this; }
  188.     operator ostream&() { return *(ostream*)this; }
  189.     // NOTE: These duplicate istream methods.
  190.     istream& get(char& c) { return ((istream*)this)->get(c); }
  191.     istream& get(unsigned char& c) { return ((istream*)this)->get((char&)c); }
  192. #ifndef _G_BROKEN_SIGNED_CHAR
  193.     istream& get(signed char& c) { return ((istream*)this)->get((char&)c); }
  194. #endif
  195.     istream& read(char *ptr, size_t n) { return ((istream*)this)->read(ptr, n); }
  196.     istream& read(unsigned char *ptr, size_t n)
  197.     { return ((istream*)this)->read((char*)ptr, n); }
  198. #ifndef _G_BROKEN_SIGNED_CHAR
  199.     istream& read(signed char *ptr, size_t n)
  200.     { return ((istream*)this)->read((char*)ptr, n); }
  201. #endif
  202.     istream& read(void *ptr, size_t n)
  203.     { return ((istream*)this)->read((char*)ptr, n); }
  204.     istream& getline(char* ptr, int len, char delim = '\n')
  205.     { return ((istream*)this)->getline(ptr, len, delim); }
  206.     istream& get(char* ptr, int len, char delim = '\n')
  207.     { return ((istream*)this)->get(ptr, len, delim); }
  208.     istream& gets(char **s, char delim = '\n')
  209.     { return ((istream*)this)->gets(s, delim); }
  210.     istream& ignore(int n=1, int delim = EOF)
  211.     { return ((istream*)this)->ignore(n, delim); }
  212.     int ipfx(int need) { return ((istream*)this)->ipfx(need); }
  213.     int ipfx0()  { return ((istream*)this)->ipfx0(); }
  214.     int ipfx1()  { return ((istream*)this)->ipfx1(); }
  215.     int get() { return _strbuf->sbumpc(); }
  216.     int peek() { return ipfx1() ? _strbuf->sgetc() : EOF; }
  217.     _G_ssize_t gcount() { return _gcount; }
  218.     istream& putback(char ch) { return ((istream*)this)->putback(ch); }
  219.     istream& unget() { return ((istream*)this)->unget(); }
  220.     istream& seekg(streampos pos) { return ((istream*)this)->seekg(pos); }
  221.     istream& seekg(streamoff off, _seek_dir dir)
  222.     { return ((istream*)this)->seekg(off, dir); }
  223.     streampos tellg() { return ((istream*)this)->tellg(); }
  224.     istream& scan(const char *format ...);
  225.     istream& vscan(const char *format, _G_va_list args)
  226.     { return ((istream*)this)->vscan(format, args); }
  227. #ifdef _STREAM_COMPAT
  228.     istream& unget(char ch) { return putback(ch); }
  229. #endif
  230.  
  231.     // NOTE: These duplicate ostream methods.
  232.     int opfx() { return ((ostream*)this)->opfx(); }
  233.     void osfx() { ((ostream*)this)->osfx(); }
  234.     ostream& flush() { return ((ostream*)this)->flush(); }
  235.     ostream& put(char c) { return ((ostream*)this)->put(c); }
  236.     ostream& write(const char *s, size_t n)
  237.       { return ((ostream*)this)->write(s, n); }
  238.     ostream& write(const unsigned char *s, size_t n)
  239.     { return ((ostream*)this)->write((const char*)s, n); }
  240. #ifndef _G_BROKEN_SIGNED_CHAR
  241.     ostream& write(const signed char *s, size_t n)
  242.     { return ((ostream*)this)->write((const char*)s, n); }
  243. #endif
  244.     ostream& write(const void *s, size_t n)
  245.     { return ((ostream*)this)->write((const char*)s, n); }
  246.     ostream& form(const char *format ...);
  247.     ostream& vform(const char *format, _G_va_list args)
  248.     { return ((ostream*)this)->vform(format, args); }
  249.     ostream& seekp(streampos pos) { return ((ostream*)this)->seekp(pos); }
  250.     ostream& seekp(streamoff off, _seek_dir dir)
  251.     { return ((ostream*)this)->seekp(off, dir); }
  252.     streampos tellp() { return ((ostream*)this)->tellp(); }
  253. };
  254.  
  255. extern istream cin;
  256. extern ostream cout, cerr, clog; // clog->rdbuf() == cerr->rdbuf()
  257.  
  258. struct Iostream_init { } ;  // Compatibility hack for AT&T libraray.
  259.  
  260. inline ios& dec(ios& i)
  261. { i.setf(ios::dec, ios::dec|ios::hex|ios::oct); return i; }
  262. inline ios& hex(ios& i)
  263. { i.setf(ios::hex, ios::dec|ios::hex|ios::oct); return i; }
  264. inline ios& oct(ios& i)
  265. { i.setf(ios::oct, ios::dec|ios::hex|ios::oct); return i; }
  266.  
  267. #endif /*!_IOSTREAM_H*/
  268.