Exemplo n.º 1
0
ostream &ostream::operator << ( unsigned __int64 i ) {
    /****************************************************/
// Write an unsigned 64bit integer to the stream.
// A signed 64bit integer displayed in base 8 or base 16 also uses
// this routine.

    int         base;
    char        buffer[LONGEST_INT64 + 1];
    int         size;
    int         digit_offset;

    __lock_it( __i_lock );
    base = __FlagsToBase( flags() );

    // Sign:
    if( i > 0  &&  (flags() & ios::showpos)  &&  base == 10 ) {
        buffer[0] = '+';
        size      = 1;
    } else {
        size      = 0;
    }

    // Prefix:
    __AddPrefix( i == 0, buffer, size, base, flags() );

    // Digits:
    digit_offset = size;
    ulltoa( i, buffer + digit_offset, base );
    if( flags() & ios::uppercase ) {
        strupr( buffer );
    }
    size = ::strlen( buffer );

    // Write the number:
    if( opfx() ) {
        setstate( __WATCOM_ios::writeitem( *this, buffer, size, digit_offset ) );
        osfx();
    }
    return( *this );
}
Exemplo n.º 2
0
ostream &ostream::operator << ( signed __int64 i ) {
/**************************************************/
// Write a signed long integer to the stream.

    int         base;
    char        buffer[LONGEST_INT64 + 1];
    int         size;
    int         digit_offset;

    __lock_it( __i_lock );
    base = __FlagsToBase( flags() );
    if( base != 10 ) {
        return( *this << (unsigned __int64) i );
    }

    // Sign:
    if( i > 0  &&  (flags() & ios::showpos) ) {
        buffer[0] = '+';
        digit_offset = 1;
    } else {
        digit_offset = 0;
    }

    // Digits:
    lltoa( i, buffer + digit_offset, base );
    if( buffer[0] == '-' ) {
        digit_offset = 1;
    }
    size = ::strlen( buffer );

    // Write the number:
    if( opfx() ) {
        setstate( __WATCOM_ios::writeitem( *this, buffer, size, digit_offset ) );
        osfx();
    }
    return( *this );
}
Exemplo n.º 3
0
ostream& ostream::operator<<(long double f)
{
    char obuffer[28];
    char fmt[12];
    char leader[4];
    char * optr = obuffer;
    int x = 0;
    unsigned int curprecision = __min((unsigned)x_precision,LDBL_DIG);
    if (opfx()) 
	{
        if (x_flags & ios::showpos)
            leader[x++] = '+';
        if (x_flags & ios::showpoint)
            leader[x++] = '#';  // show decimal and trailing zeros
        leader[x] = '\0';
        x = sprintf(fmt,"%%%s.%.0uLg",leader,curprecision) - 1;
        if ((x_flags & ios::floatfield)==ios::fixed)
            fmt[x] = 'f';
        else
		{
            if ((x_flags & ios::floatfield)==ios::scientific)
                fmt[x] = 'e';
            if (x_flags & uppercase)
                fmt[x] = (char)toupper(fmt[x]);
		}

        sprintf(optr,fmt,f);
        x = 0;
        if (*optr=='+' || *optr=='-')
            leader[x++] = *(optr++);
        leader[x] = '\0';
        writepad(leader,optr);
        osfx();
	}
    return *this;
}
Exemplo n.º 4
0
ostream& ostream::operator<<(long n)
{
    char obuffer[12];
    char fmt[4] = "%ld";
    char leader[4] = "\0\0";
    if (opfx()) 
	{
        if (n)
		{
            if (x_flags & (hex|oct))
			{
                if (x_flags & hex)
				{
                    if (x_flags & uppercase)
                        fmt[2] = 'X';
                    else
                        fmt[2] = 'x';
                    leader[1] = fmt[2];   // 0x or 0X  (or \0X)
				}
                else
                    fmt[2] = 'o';
                if (x_flags & showbase)
                    leader[0] = '0';
			}
            else if ((n>0) && (x_flags & showpos))
			{
                leader[0] = '+';
			}
		}
        sprintf(obuffer,fmt,n);
        writepad(leader,obuffer);
        osfx();
    }
    return *this;

}
Exemplo n.º 5
0
  ostream &ostream::operator << ( unsigned long i ) {

    int         base;
    char        buffer[LONGEST_INTEGER + 1];
    int         size;
    int         digit_offset;

    __lock_it( __i_lock );
    base = __FlagsToBase( flags() );

    // Sign:
    if( i > 0  &&  (flags() & ios::showpos)  &&  base == 10 ) {
        buffer[0] = '+';
        size      = 1;
    } else {
        size      = 0;
    }

    // Prefix:
    __AddPrefix( i == 0, buffer, size, base, flags() );

    // Digits:
    digit_offset = size;
    ultoa( i, buffer + digit_offset, base );
    if( flags() & ios::uppercase ) {
        strupr( buffer );
    }
    size = strlen( buffer );

    // Write the number:
    if( opfx() ) {
        setstate( __WATCOM_ios::writeitem( *this, buffer, size, digit_offset ) );
        osfx();
    }
    return( *this );
  }
Exemplo n.º 6
0
ostream &ostream::__outfloat( long double const &f ) {
/****************************************************/
// Write a "long double" floating-point value.

    int   digit_offset;
    int   precision;
    char  buf[LONGEST_FLOAT+1];

    ::memset( buf, 0, sizeof( buf ) );
    __lock_it( __i_lock );
    precision = this->precision();
    if( precision > MAX_PREC ) precision = MAX_PREC;
    __LDFloatToString( buf, (double const *)&f, precision, this->flags() );
    if( buf[0] == '-' || buf[0] == '+' ) {
        digit_offset = 1;
    } else {
        digit_offset = 0;
    }
    if( opfx() ) {
        setstate( __WATCOM_ios::writeitem( *this, buf, ::strlen(buf), digit_offset ) );
        osfx();
    }
    return( *this );
}
Exemplo n.º 7
0
  ostream &ostream::__outfloat( long double const &f ) {

    int                 digit_offset;
    int                 precision;
    char                buf[ LONGEST_FLOAT * 2 ];
    long_double         ld;
    int                 i;
    int                 len;
    char                *x;
    CVT_INFO            cvt;
    auto char           stkbuf[ LONGEST_FLOAT + 1 ];
    std::ios::fmtflags  format_flags;
#ifdef _LONG_DOUBLE_
    double              double_value;

    /* convert this double into a long double */
    double_value = f;
    __EFG_cnvd2ld( &double_value, &ld );
#else
    ld.value = f;
#endif
    __lock_it( __i_lock );
    precision = this->precision();
    if( precision > MAX_PREC )
        precision = MAX_PREC;

    format_flags = this->flags();
    if(( format_flags & ( std::ios::scientific | ios::fixed )) == std::ios::scientific ) {
        cvt.flags = E_FMT;
        cvt.scale = 1;
    } else if(( format_flags & ( std::ios::scientific | ios::fixed )) == std::ios::fixed ) {
        cvt.flags = F_FMT;
        cvt.scale = 0;
    } else {
        cvt.flags = G_FMT;
        cvt.scale = 1;
        if( precision == 0 ) {
            precision = 1;
        }
    }
    if( format_flags & std::ios::showpoint ) {
        cvt.flags |= F_DOT;
    }
    cvt.ndigits = precision;
    cvt.expchar = ( format_flags & std::ios::uppercase ) ? 'E' : 'e';
    cvt.expwidth = 0;
    __EFG_cvtld( &ld, &cvt, stkbuf );
    // put all the pieces together
    len = cvt.n1 + cvt.nz1 + cvt.n2 + cvt.nz2 + 1;
    if( cvt.sign < 0 ) {
        ++len;
    } else if( format_flags & std::ios::showpos ) {
        ++len;
    }
    if( len > sizeof( buf ) ) {
        x = new char[ len + 1 ];
    } else {
        x = buf;
    }
    i = 0;
    digit_offset = 1;
    if( cvt.sign < 0 ) {
        x[i++] = '-';
    } else if( format_flags & std::ios::showpos ) {
        x[i++] = '+';
    } else {
        digit_offset = 0;
    }
    if( cvt.n1 != 0 ) {
        ::memcpy( &x[i], &stkbuf[0], cvt.n1 );
        i += cvt.n1;
    }
    if( cvt.nz1 != 0 ) {
        ::memset( &x[i], '0', cvt.nz1 );
        i += cvt.nz1;
    }
    if( cvt.n2 != 0 ) {
        ::memcpy( &x[i], &stkbuf[cvt.n1], cvt.n2 );
        i += cvt.n2;
    }
    if( cvt.nz2 != 0 ) {
        ::memset( &x[i], '0', cvt.nz2 );
        i += cvt.nz2;
    }
    x[i] = '\0';

    if( opfx() ) {
        setstate( __WATCOM_ios::writeitem( *this, x, ::strlen( x ), digit_offset ) );
        osfx();
    }
    if( len > sizeof( buf ) ) {
        delete x;
    }
    return( *this );
  }