#include "libioP.h"
#include "streambuf.h"
#include <stdio.h>
#include "libio.h"
#ifdef _STDIO_USES_IOSTREAM
#define CIN_SBUF _IO_stdin_
#define COUT_SBUF _IO_stdout_
#define CERR_SBUF _IO_stderr_
static int use_stdiobuf = 0;
#else
#define CIN_SBUF _IO_stdin_buf
#define COUT_SBUF _IO_stdout_buf
#define CERR_SBUF _IO_stderr_buf
static int use_stdiobuf = 1;
#endif
#define cin CIN
#define cout COUT
#define cerr CERR
#define clog CLOG
#include "iostream.h"
#undef cin
#undef cout
#undef cerr
#undef clog
#ifdef MACOSX
#include "keymgr.h"
extern "C" {
extern _IO_FILE_plus *_IO_init_stdin(), *_IO_init_stdout(), *_IO_init_stderr() ;
struct _IO_FILE_plus *_IO_stdin=_IO_init_stdin(), *_IO_stdout=_IO_init_stdout(), *_IO_stderr=_IO_init_stderr();
}
#endif
#ifdef __GNUG__
#define PAD 0
#else
#define PAD 1
#endif
struct _fake_istream {
struct myfields {
#ifdef __GNUC__
_ios_fields *vb;
_IO_ssize_t _gcount;
#else
_IO_ssize_t _gcount;
void *vptr;
_ios_fields *vb;
#endif
} mine;
_ios_fields base;
char filler[sizeof(struct istream)-sizeof(struct _ios_fields)+PAD];
};
struct _fake_ostream {
struct myfields {
#ifndef __GNUC__
void *vptr;
#endif
_ios_fields *vb;
} mine;
_ios_fields base;
char filler[sizeof(struct ostream)-sizeof(struct _ios_fields)+PAD];
};
#ifdef _IO_NEW_STREAMS
#define STD_STR(SBUF, TIE, EXTRA_FLAGS) \
(streambuf*)&SBUF, TIE, 0, ios::skipws|ios::dec|EXTRA_FLAGS, ' ',0,0,6
#else
#define STD_STR(SBUF, TIE, EXTRA_FLAGS) \
(streambuf*)&SBUF, TIE, 0, ios::dont_close|ios::dec|ios::skipws|EXTRA_FLAGS, ' ',0,0,6
#endif
#ifdef __GNUC__
#define OSTREAM_DEF(NAME, SBUF, TIE, EXTRA_FLAGS, ASM) \
_fake_ostream NAME ASM = { {&NAME.base}, {STD_STR(SBUF, TIE, EXTRA_FLAGS) }};
#define ISTREAM_DEF(NAME, SBUF, TIE, EXTRA_FLAGS) \
_fake_istream NAME = { {&NAME.base}, {STD_STR(SBUF, TIE, EXTRA_FLAGS) }};
#else
#define OSTREAM_DEF(NAME, SBUF, TIE, EXTRA_FLAGS) \
_fake_ostream NAME = { {0, &NAME.base}, {STD_STR(SBUF, TIE, EXTRA_FLAGS) }};
#define ISTREAM_DEF(NAME, SBUF, TIE, EXTRA_FLAGS) \
_fake_istream NAME = {{0, 0, &NAME.base}, {STD_STR(SBUF, TIE, EXTRA_FLAGS)}};
#endif
#ifdef MACOSX
_fake_ostream cout, cerr ;
_fake_istream cin ;
extern "C" {
void _dynamic_stdstream_init() {
cout.mine.vb = &cout.base ;
cerr.mine.vb = &cerr.base ;
cin.mine.vb = &cin.base ;
cout.base._strbuf = (streambuf *)&COUT_SBUF ;
cerr.base._strbuf = (streambuf *)&CERR_SBUF ;
cin.base._strbuf = (streambuf *)&CIN_SBUF ;
cin.base._flags = ios::dec|ios::skipws ;
cout.base._flags = ios::dec|ios::skipws ;
cerr.base._flags = ios::dec|ios::skipws|ios::unitbuf ;
cin.base._fill = ' ' ;
cout.base._fill = ' ' ;
cerr.base._fill = ' ' ;
cin.base._exceptions = 0 ;
cout.base._exceptions = 0 ;
cerr.base._exceptions = 0 ;
cin.base._state = 0 ;
cout.base._state = 0 ;
cerr.base._state = 0 ;
cin.base._precision = 6 ;
cout.base._precision = 6 ;
cerr.base._precision = 6 ;
cin.base._tie = (ostream*)&cout ;
cout.base._tie = NULL ;
cerr.base._tie = (ostream*)&cout ;
}
}
#else
OSTREAM_DEF(cout, COUT_SBUF, NULL, 0, )
OSTREAM_DEF(cerr, CERR_SBUF,(ostream*)&cout, ios::unitbuf, )
ISTREAM_DEF(cin, CIN_SBUF, (ostream*)&cout, 0)
#endif
#if _G_CLOG_CONFLICT
OSTREAM_DEF(clog, CERR_SBUF, (ostream*)&cout, 0, __asm__ ("__IO_clog"))
#else
OSTREAM_DEF(clog, CERR_SBUF, (ostream*)&cout, 0, )
#endif
int ios::sync_with_stdio(int new_state)
{
#ifdef MACOSX
int old_state = ((_io_mode_bits & _IO_OSX_SYNC_STDIO) == _IO_OSX_SYNC_STDIO);
_io_mode_bits =
(unsigned int) _keymgr_get_and_lock_processwide_ptr (KEYMGR_IO_MODE_BITS);
_io_mode_bits = new_state ? (_io_mode_bits | _IO_OSX_SYNC_STDIO)
: (_io_mode_bits & ~_IO_OSX_SYNC_STDIO);
_keymgr_set_and_unlock_processwide_ptr (KEYMGR_IO_MODE_BITS,
(void *) _io_mode_bits);
return old_state;
#else
#ifdef _STDIO_USES_IOSTREAM
return 0;
#else
if (new_state == use_stdiobuf) return use_stdiobuf;
if (new_state) {
cin.base._strbuf = (streambuf*)&_IO_stdin_buf;
cout.base._strbuf = (streambuf*)&_IO_stdout_buf;
cerr.base._strbuf = (streambuf*)&_IO_stderr_buf;
clog.base._strbuf = (streambuf*)&_IO_stderr_buf;
} else {
cin.base._strbuf = (streambuf*)_IO_stdin;
cout.base._strbuf = (streambuf*)_IO_stdout;
cerr.base._strbuf = (streambuf*)_IO_stderr;
clog.base._strbuf = (streambuf*)_IO_stderr;
}
int old_state = use_stdiobuf;
use_stdiobuf = new_state;
return old_state;
#endif
#endif
}