summaryrefslogtreecommitdiffstats
path: root/private/crt32/iostream/ostream.cxx
diff options
context:
space:
mode:
authorAdam <you@example.com>2020-05-17 05:51:50 +0200
committerAdam <you@example.com>2020-05-17 05:51:50 +0200
commite611b132f9b8abe35b362e5870b74bce94a1e58e (patch)
treea5781d2ec0e085eeca33cf350cf878f2efea6fe5 /private/crt32/iostream/ostream.cxx
downloadNT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.gz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.bz2
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.lz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.xz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.zst
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.zip
Diffstat (limited to 'private/crt32/iostream/ostream.cxx')
-rw-r--r--private/crt32/iostream/ostream.cxx229
1 files changed, 229 insertions, 0 deletions
diff --git a/private/crt32/iostream/ostream.cxx b/private/crt32/iostream/ostream.cxx
new file mode 100644
index 000000000..69eaefabe
--- /dev/null
+++ b/private/crt32/iostream/ostream.cxx
@@ -0,0 +1,229 @@
+/***
+* ostream.cxx - definitions for ostream and ostream_withassign classes
+*
+* Copyright (c) 1991-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* Contains the core member function definitions for ostream and
+* ostream_withassign classes.
+*
+*Revision History:
+* 07-01-91 KRS Created.
+* 08-19-91 KRS Corrected my interpretation of the spec. for negative
+* hex or octal integers.
+* 08-20-91 KRS Replace 'clear(x)' with 'state |= x'.
+* Skip text translation for write().
+* 08-26-91 KRS Modify to work with DLL's/MTHREAD.
+* 09-05-91 KRS Fix opfx() to flush tied ostream, not current one.
+* 09-09-91 KRS Remove sync_with_stdio() call from Iostream_init().
+* Reinstate text-translation (by default) for write().
+* 09-19-91 KRS Add opfx()/osfx() calls to put() and write().
+* Schedule destruction of predefined streams.
+* 09-23-91 KRS Split up for granularity.
+* 10-04-91 KRS Use bp->sputc, not put(), in writepad().
+* 10-24-91 KRS Added initialization of x_floatused.
+* 11-04-91 KRS Make constructors work with virtual base.
+* 11-20-91 KRS Add/fix copy constructor and assignment operators.
+*
+*******************************************************************************/
+
+#include <cruntime.h>
+#include <internal.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <iostream.h>
+#pragma hdrstop
+
+int ostream::opfx()
+{
+ lock();
+ if (state)
+ {
+ state |= ios::failbit; // CONSIDER???
+ unlock();
+ return 0;
+ }
+ if (x_tie)
+ {
+ x_tie->flush();
+ }
+ lockbuf();
+ return(1); // return non-zero
+}
+
+void ostream::osfx()
+{
+ x_width = 0;
+ if (x_flags & unitbuf)
+ {
+ if (bp->sync()==EOF)
+ state = failbit | badbit;
+ }
+#ifndef _WINDLL
+ if (x_flags & ios::stdio)
+ {
+ if (fflush(stdout)==EOF)
+ state |= failbit;
+ if (fflush(stderr)==EOF)
+ state |= failbit;
+ }
+#endif
+ unlockbuf();
+ unlock();
+}
+
+// note: called inline by char and signed char versions:
+#if 0
+ostream& ostream::operator<<(unsigned char c)
+{
+ if (opfx())
+ {
+ if (x_width)
+ {
+ _WINSTATIC char outc[2];
+ outc[0] = c;
+ outc[1] = '\0';
+ writepad("",outc);
+ }
+ else if (bp->sputc(c)==EOF)
+ {
+ if (bp->overflow(c)==EOF)
+ state |= (badbit|failbit); // fatal error?
+ }
+ osfx();
+ }
+ return *this;
+}
+#endif
+
+// note: called inline by unsigned char * and signed char * versions:
+ostream& ostream::operator<<(const char * s)
+{
+ if (opfx()) {
+ writepad("",s);
+ osfx();
+ }
+ return *this;
+}
+
+ostream& ostream::flush()
+{
+ lock();
+ lockbuf();
+ if (bp->sync()==EOF)
+ state |= ios::failbit;
+ unlockbuf();
+ unlock();
+ return(*this);
+}
+
+ ostream::ostream()
+// : ios()
+{
+ x_floatused = 0;
+ // CONSIDER: do anything else?
+}
+
+ ostream::ostream(streambuf* _inistbf)
+// : ios()
+{
+ init(_inistbf);
+
+ x_floatused = 0;
+ // CONSIDER: do anything else?
+}
+
+ ostream::ostream(const ostream& _ostrm)
+// : ios()
+{
+ init(_ostrm.rdbuf());
+
+ x_floatused = 0;
+ // CONSIDER: do anything else?
+}
+
+ ostream::~ostream()
+// : ~ios()
+{
+ // CONSIDER: do anything else?
+}
+
+// used in ios::sync_with_stdio()
+ostream& ostream::operator=(streambuf * _sbuf)
+{
+// consider: may be some redundency here, depending on spec.
+
+ if (delbuf() && rdbuf())
+ delete rdbuf();
+ bp = 0;
+
+ this->ios::operator=(ios()); // initialize ios members
+ delbuf(0); // important!
+ init(_sbuf);
+
+// x_floatused = 0; // not necessary
+
+ return *this;
+}
+
+
+ ostream_withassign::ostream_withassign()
+: ostream()
+{
+ // CONSIDER: do anything else?
+}
+
+ ostream_withassign::ostream_withassign(streambuf* _os)
+: ostream(_os)
+{
+ // CONSIDER: do anything else?
+}
+
+ ostream_withassign::~ostream_withassign()
+// : ~ostream()
+{
+; // CONSIDER: do anything else?
+}
+
+ostream& ostream::writepad(const char * leader, const char * value)
+
+ {
+unsigned int len, leadlen;
+long padlen;
+ leadlen = strlen(leader);
+ len = strlen(value);
+ padlen = (((unsigned)x_width) > (len+leadlen)) ? ((unsigned)x_width) - (len + leadlen) : 0;
+ if (!(x_flags & (left|internal))) // default is right-adjustment
+ {
+ while (padlen-- >0)
+ {
+ if (bp->sputc((unsigned char)x_fill)==EOF)
+ state |= (ios::failbit|ios::badbit);
+ }
+ }
+ if (leadlen)
+ {
+ if ((unsigned)bp->sputn(leader,leadlen)!=leadlen)
+ state |= (failbit|badbit); // CONSIDER: right error?
+ }
+ if (x_flags & internal)
+ {
+ while (padlen-- >0)
+ {
+ if (bp->sputc((unsigned char)x_fill)==EOF)
+ state |= (ios::failbit|ios::badbit);
+ }
+ }
+ if ((unsigned)bp->sputn(value,len)!=len)
+ state |= (failbit|badbit); // CONSIDER: right error?
+ if (x_flags & left)
+ {
+ while ((padlen--)>0) // left-adjust if necessary
+ {
+ if (bp->sputc((unsigned char)x_fill)==EOF)
+ state |= (ios::failbit|ios::badbit);
+ }
+ }
+ return (*this);
+ }