Annotation of GNUtools/libg++/libio/stdstreams.cc, revision 1.1.1.1

1.1       root        1: /* This is part of libio/iostream, providing -*- C++ -*- input/output.
                      2: Copyright (C) 1993 Free Software Foundation
                      3: 
                      4: This file is part of the GNU IO Library.  This library is free
                      5: software; you can redistribute it and/or modify it under the
                      6: terms of the GNU General Public License as published by the
                      7: Free Software Foundation; either version 2, or (at your option)
                      8: any later version.
                      9: 
                     10: This library is distributed in the hope that it will be useful,
                     11: but WITHOUT ANY WARRANTY; without even the implied warranty of
                     12: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     13: GNU General Public License for more details.
                     14: 
                     15: You should have received a copy of the GNU General Public License
                     16: along with GNU CC; see the file COPYING.  If not, write to
                     17: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
                     18: 
                     19: As a special exception, if you link this library with files
                     20: compiled with a GNU compiler to produce an executable, this does not cause
                     21: the resulting executable to be covered by the GNU General Public License.
                     22: This exception does not however invalidate any other reasons why
                     23: the executable file might be covered by the GNU General Public License. */
                     24: 
                     25: /* Written by Per Bothner ([email protected]). */
                     26: 
                     27: #include "libioP.h"
                     28: #include "streambuf.h"
                     29: 
                     30: // The ANSI draft requires that operations on cin/cout/cerr can be
                     31: // mixed with operations on stdin/stdout/stderr on a character by
                     32: // character basis.  This normally requires that the streambuf's
                     33: // used by cin/cout/cerr be stdiostreams.  However, if the stdio
                     34: // implementation is the one that is built using this library,
                     35: // then we don't need to, since in that case stdin/stdout/stderr
                     36: // are identical to &__std_filebuf_0/&__std_filebuf_1/&__std_filebuf_2.
                     37: 
                     38: #if 1 //def _STDIO_USES_IOSTREAM
                     39: #define USE_FILEBUF
                     40: #endif
                     41: 
                     42: #if _G_NAMES_HAVE_UNDERSCORE
                     43: #define UNDERSCORE "_"
                     44: #else
                     45: #define UNDERSCORE ""
                     46: #endif
                     47: 
                     48: #ifdef USE_FILEBUF
                     49: #if 1
                     50: #include "libio.h"
                     51: #define CIN_SBUF _IO_stdin_
                     52: #define COUT_SBUF _IO_stdout_
                     53: #define CERR_SBUF _IO_stderr_
                     54: #else
                     55: #define CIN_SBUF __std_filebuf_0
                     56: #define COUT_SBUF __std_filebuf_1
                     57: #define CERR_SBUF __std_filebuf_2
                     58: #endif
                     59: static int use_stdiobuf = 0;
                     60: #else
                     61: #define CIN_SBUF __stdin_stdiobuf
                     62: #define COUT_SBUF __stdout_stdiobuf
                     63: #define CERR_SBUF __stderr_stdiobuf
                     64: static int use_stdiobuf = 1;
                     65: #endif
                     66: 
                     67: #if 1
                     68: struct _fake_filebuf;
                     69: extern _fake_filebuf __std_filebuf_0, __std_filebuf_1, __std_filebuf_2;
                     70: #endif
                     71: struct _fake_stdiobuf;
                     72: extern _fake_stdiobuf __stdin_stdiobuf, __stdout_stdiobuf, __stderr_stdiobuf;
                     73: 
                     74: #define cin CIN
                     75: #define cout COUT
                     76: #define cerr CERR
                     77: #define clog CLOG
                     78: #include "iostream.h"
                     79: #undef cin
                     80: #undef cout
                     81: #undef cerr
                     82: #undef clog
                     83: 
                     84: #ifdef __GNUG__
                     85: #define PAD 0 /* g++ allows 0-length arrays. */
                     86: #else
                     87: #define PAD 1
                     88: #endif
                     89: struct _fake_istream {
                     90:     struct myfields {
                     91: #ifdef __GNUC__
                     92:        _ios_fields *vb; /* pointer to virtual base class ios */
                     93:        _IO_ssize_t _gcount;
                     94: #else
                     95:        /* This is supposedly correct for cfront. */
                     96:        _IO_ssize_t _gcount;
                     97:        void *vptr;
                     98:        _ios_fields *vb; /* pointer to virtual base class ios */
                     99: #endif
                    100:     } mine;
                    101:     _ios_fields base;
                    102:     char filler[sizeof(struct istream)-sizeof(struct _ios_fields)+PAD];
                    103: };
                    104: struct _fake_ostream {
                    105:     struct myfields {
                    106: #ifndef __GNUC__
                    107:        void *vptr;
                    108: #endif
                    109:        _ios_fields *vb; /* pointer to virtual base class ios */
                    110:     } mine;
                    111:     _ios_fields base;
                    112:     char filler[sizeof(struct ostream)-sizeof(struct _ios_fields)+PAD];
                    113: };
                    114: 
                    115: #define STD_STR(SBUF, TIE, EXTRA_FLAGS) \
                    116:  (streambuf*)&SBUF, TIE, 0, ios::dont_close|ios::skipws|EXTRA_FLAGS, ' ',0,0,6
                    117: 
                    118: #ifdef __GNUC__
                    119: #define OSTREAM_DEF(NAME, SBUF, TIE, EXTRA_FLAGS) \
                    120:   _fake_ostream NAME = { {&NAME.base}, {STD_STR(SBUF, TIE, EXTRA_FLAGS) }};
                    121: #define ISTREAM_DEF(NAME, SBUF, TIE, EXTRA_FLAGS) \
                    122:   _fake_istream NAME = { {&NAME.base}, {STD_STR(SBUF, TIE, EXTRA_FLAGS) }};
                    123: #else
                    124: #define OSTREAM_DEF(NAME, SBUF, TIE, EXTRA_FLAGS) \
                    125:   _fake_ostream NAME = { {0, &NAME.base}, {STD_STR(SBUF, TIE, EXTRA_FLAGS) }};
                    126: #define ISTREAM_DEF(NAME, SBUF, TIE, EXTRA_FLAGS) \
                    127:   _fake_ostream NAME = {{0, 0, &NAME.base}, {STD_STR(SBUF, TIE, EXTRA_FLAGS)}};
                    128: #endif
                    129: 
                    130: OSTREAM_DEF(cout, COUT_SBUF, NULL, 0)
                    131: OSTREAM_DEF(cerr, CERR_SBUF,(ostream*)&cout, ios::unitbuf)
                    132: ISTREAM_DEF(cin, CIN_SBUF,  (ostream*)&cout, 0)
                    133: 
                    134: /* Only for (partial) compatibility with AT&T's library. */
                    135: OSTREAM_DEF(clog, CERR_SBUF, (ostream*)&cout, 0)
                    136: 
                    137: // Switches between using __std_filebuf_{0,1,2} and
                    138: // __std{in,out,err}_stdiobuf for standard streams.  This is
                    139: // normally not needed, but is provided for AT&T compatibility.
                    140: 
                    141: int ios::sync_with_stdio(int new_state)
                    142: {
                    143: #ifdef TODO
                    144: #ifdef _STDIO_USES_IOSTREAM
                    145:     // It is always synced.
                    146:     return 0;
                    147: #else
                    148:     if (new_state == use_stdiobuf) // The usual case now.
                    149:        return use_stdiobuf;
                    150:     if (new_state) {
                    151:        cout.base._strbuf = (streambuf*)&__stdout_stdiobuf;
                    152:        cin.base._strbuf = (streambuf*)&__stdin_stdiobuf;
                    153:        cerr.base._strbuf = (streambuf*)&__stderr_stdiobuf;
                    154:        clog.base._strbuf = (streambuf*)&__stderr_stdiobuf;
                    155:     } else {
                    156:        cout.base._strbuf = (streambuf*)&__std_filebuf_1;
                    157:        cin.base._strbuf = (streambuf*)&__std_filebuf_0;
                    158:        cerr.base._strbuf = (streambuf*)&__std_filebuf_2;
                    159:        clog.base._strbuf = (streambuf*)&__std_filebuf_2;
                    160:     }
                    161:     int old_state = use_stdiobuf;
                    162:     use_stdiobuf = new_state;
                    163:     return old_state;
                    164: #endif
                    165: #endif
                    166:     return 0;
                    167: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.