windows-nt/Source/XPSP1/NT/base/crts/crtw32/iostream/ostream.cpp
2020-09-26 16:20:57 +08:00

201 lines
4.9 KiB
C++

/***
* ostream.cpp - definitions for ostream and ostream_withassign classes
*
* Copyright (c) 1991-2001, 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.
* 03-28-95 CFW Fix debug delete scheme.
* 03-21-95 CFW Remove _delete_crt.
* 06-14-95 CFW Comment cleanup.
* 01-05-99 GJF Changes for 64-bit size_t.
*
*******************************************************************************/
#include <cruntime.h>
#include <internal.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <iostream.h>
#include <dbgint.h>
#pragma hdrstop
int ostream::opfx()
{
lock();
if (state)
{
state |= ios::failbit;
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 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;
}
ostream::ostream(streambuf* _inistbf)
// : ios()
{
init(_inistbf);
x_floatused = 0;
}
ostream::ostream(const ostream& _ostrm)
// : ios()
{
init(_ostrm.rdbuf());
x_floatused = 0;
}
ostream::~ostream()
// : ~ios()
{
}
// used in ios::sync_with_stdio()
ostream& ostream::operator=(streambuf * _sbuf)
{
if (delbuf() && rdbuf())
delete rdbuf();
bp = 0;
this->ios::operator=(ios()); // initialize ios members
delbuf(0); // important!
init(_sbuf);
return *this;
}
ostream_withassign::ostream_withassign()
: ostream()
{
}
ostream_withassign::ostream_withassign(streambuf* _os)
: ostream(_os)
{
}
ostream_withassign::~ostream_withassign()
// : ~ostream()
{
}
ostream& ostream::writepad(const char * leader, const char * value)
{
unsigned int len, leadlen;
long padlen;
leadlen = (unsigned int)strlen(leader);
len = (unsigned int)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);
}
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);
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);
}