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 ); }
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 ); }
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; }
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; }
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 ); }
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 ); }
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 ); }