⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iostream.cpp

📁 vxworks源码源码解读是学习vxworks的最佳途径
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/* This has been copied from the gnu source tree *//* Make all changes there, not here! */#ifdef __cplusplusextern "C" {#endif#ifndef _N_char __iostream_o = 0;#elsechar _N_ = 0;#endif#ifdef __cplusplus}#endif#include "vxWorks.h"/* This is part of libio/iostream, providing -*- C++ -*- input/output.   Copyright (C) 1993, 1997 Free Software Foundation, Inc.   This file is part of the GNU IO Library.  This library is free   software; you can redistribute it and/or modify it under the   terms of the GNU General Public License as published by the   Free Software Foundation; either version 2, or (at your option)   any later version.   This library is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU General Public License for more details.   You should have received a copy of the GNU General Public License   along with this library; see the file COPYING.  If not, write to the Free   Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307,   USA.   As a special exception, if you link this library with files   compiled with a GNU compiler to produce an executable, this does not cause   the resulting executable to be covered by the GNU General Public License.   This exception does not however invalidate any other reasons why   the executable file might be covered by the GNU General Public License. *//* Written by Per Bothner (bothner@cygnus.com). */#ifdef __GNUC__#pragma implementation#endif#define _STREAM_COMPAT#include <iostream.h>#include "libioP.h"#include <stdio.h>  /* Needed for sprintf */#include <ctype.h>#include <string.h>#include <limits.h>#if _G_HAVE_PRINTF_FP#include <printf.h>extern "C" int __printf_fp (_IO_FILE *, const struct printf_info *,			    const void *const *);#else#include "floatio.h"# ifndef _IO_USE_DTOAint __cvt_double(double number, register int prec, int flags, int *signp,                 int fmtch, char *startp, char *endp);# endif#endif#define	BUF		(MAXEXP+MAXFRACT+1)	/* + decimal point *///#define isspace(ch) ((ch)==' ' || (ch)=='\t' || (ch)=='\n')istream::istream(streambuf *sb, ostream* tied){  init (sb, tied);  _gcount = 0;}int skip_ws(streambuf* sb){    int ch;    for (;;) {	ch = sb->sbumpc();	if (ch == EOF || !isspace(ch))	    return ch;    }}istream& istream::get(char& c){    if (ipfx1()) {	int ch = _strbuf->sbumpc();	if (ch == EOF) {	  set(ios::eofbit|ios::failbit);	  _gcount = 0;	}	else {	  c = (char)ch;	  _gcount = 1;	}    }    else      _gcount = 0;    return *this;}int istream::peek(){  if (!good())    return EOF;  if (_tie && rdbuf()->in_avail() == 0)    _tie->flush();  int ch = _strbuf->sgetc();  if (ch == EOF)    set(ios::eofbit);  return ch;}istream& istream::ignore(int n /* = 1 */, int delim /* = EOF */){    _gcount = 0;    if (ipfx1()) {	register streambuf* sb = _strbuf;	if (delim == EOF) {	    _gcount = sb->ignore(n);	    return *this;	}	for (;;) {#if 0	    if (n != MAXINT) // FIXME#endif	    if (--n < 0)		break;	    int ch = sb->sbumpc();	    if (ch == EOF) {		set(ios::eofbit|ios::failbit);		break;	    }	    _gcount++;	    if (ch == delim)		break;	}    }    return *this;}istream& istream::read(char *s, streamsize n){    if (ipfx1()) {	_gcount = _strbuf->sgetn(s, n);	if (_gcount != n)	    set(ios::failbit|ios::eofbit);    }    else      _gcount = 0;    return *this;}intistream::sync (){  streambuf *sb = rdbuf ();  if (sb == NULL)    return EOF;  if (sb->sync ()) // Later: pubsync    {      setstate (ios::badbit);      return EOF;    }  else    return 0;}istream& istream::seekg(streampos pos){    pos = _strbuf->pubseekpos(pos, ios::in);    if (pos == streampos(EOF))	set(ios::badbit);    return *this;}istream& istream::seekg(streamoff off, _seek_dir dir){  streampos pos = _IO_seekoff (_strbuf, off, (int) dir, _IOS_INPUT);  if (pos == streampos(EOF))    set(ios::badbit);  return *this;}streampos istream::tellg(){#if 0    streampos pos = _strbuf->pubseekoff(0, ios::cur, ios::in);#else    streampos pos = _IO_seekoff (_strbuf, 0, _IO_seek_cur, _IOS_INPUT);#endif    if (pos == streampos(EOF))	set(ios::badbit);    return pos;}istream& istream::operator>>(char& c){    if (ipfx0()) {	int ch = _strbuf->sbumpc();	if (ch == EOF)	    set(ios::eofbit|ios::failbit);	else	    c = (char)ch;    }    return *this;}istream&istream::operator>> (char* ptr){  register char *p = ptr;  int w = width(0);  if (ipfx0())    {      register streambuf* sb = _strbuf;      for (;;)	{	  int ch = sb->sbumpc();	  if (ch == EOF)	    {	      set(ios::eofbit);	      break;	    }	  else if (isspace(ch) || w == 1)	    {	      sb->sputbackc(ch);	      break;	    }	  else *p++ = ch;	  w--;	}      if (p == ptr)	set(ios::failbit);    }  *p = '\0';  return *this;}#if defined(__GNUC__) && !defined(__STRICT_ANSI__)#define LONGEST long long#else#define LONGEST long#endifstatic int read_int(istream& stream, unsigned LONGEST& val, int& neg){    if (!stream.ipfx0())      return 0;    register streambuf* sb = stream.rdbuf();    int base = 10;    int ndigits = 0;    register int ch = skip_ws(sb);    if (ch == EOF)	goto eof_fail;    neg = 0;    if (ch == '+') {	ch = skip_ws(sb);    }    else if (ch == '-') {	neg = 1;	ch = skip_ws(sb);    }    if (ch == EOF) goto eof_fail;    if (!(stream.flags() & ios::basefield)) {	if (ch == '0') {	    ch = sb->sbumpc();	    if (ch == EOF) {		val = 0;		return 1;	    }	    if (ch == 'x' || ch == 'X') {		base = 16;		ch = sb->sbumpc();		if (ch == EOF) goto eof_fail;	    }	    else {		sb->sputbackc(ch);		base = 8;		ch = '0';	    }	}    }    else if ((stream.flags() & ios::basefield) == ios::hex)	base = 16;    else if ((stream.flags() & ios::basefield) == ios::oct)	base = 8;    val = 0;    for (;;) {	if (ch == EOF)	    break;	int digit;	if (ch >= '0' && ch <= '9')	    digit = ch - '0';	else if (ch >= 'A' && ch <= 'F')	    digit = ch - 'A' + 10;	else if (ch >= 'a' && ch <= 'f')	    digit = ch - 'a' + 10;	else	    digit = 999;	if (digit >= base) {	    sb->sputbackc(ch);	    if (ndigits == 0)		goto fail;	    else		return 1;	}	ndigits++;	val = base * val + digit;	ch = sb->sbumpc();    }    return 1;  fail:    stream.set(ios::failbit);    return 0;  eof_fail:    stream.set(ios::failbit|ios::eofbit);    return 0;}#define READ_INT(TYPE) \istream& istream::operator>>(TYPE& i)\{\    unsigned LONGEST val; int neg;\    if (read_int(*this, val, neg)) {\	if (neg) val = -val;\	i = (TYPE)val;\    }\    return *this;\}READ_INT(short)READ_INT(unsigned short)READ_INT(int)READ_INT(unsigned int)READ_INT(long)READ_INT(unsigned long)#if defined(__GNUC__) && !defined(__STRICT_ANSI__)READ_INT(long long)READ_INT(unsigned long long)#endif#if _G_HAVE_BOOLREAD_INT(bool)#endif/* Begin VxWorks specific */#ifndef _NO_LONG_DOUBLE_istream& istream::operator>>(long double& x){    if (ipfx0())#if _G_HAVE_LONG_DOUBLE_IO	scan("%Lg", &x);#else	scan("%lg", &x);#endif    return *this;}#endif/* End VxWorks specific */istream& istream::operator>>(double& x){    if (ipfx0())	scan("%lg", &x);    return *this;}istream& istream::operator>>(float& x){    if (ipfx0())	scan("%g", &x);    return *this;}istream& istream::operator>>(register streambuf* sbuf){    if (ipfx0()) {	register streambuf* inbuf = rdbuf();	// FIXME: Should optimize!	for (;;) {	    register int ch = inbuf->sbumpc();	    if (ch == EOF) {		set(ios::eofbit);		break;	    }	    if (sbuf->sputc(ch) == EOF) {		set(ios::failbit);		break;	    }	}    }    return *this;}ostream& ostream::operator<<(char c){    if (opfx()) {	_IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,				  _strbuf);#if 1	// This is what the cfront implementation does.	if (_strbuf->sputc(c) == EOF) {	    set(ios::badbit);	    goto failed;	}#else	// This is what cfront documentation and current ANSI drafts say.	int w = width(0);	char fill_char = fill();	register int padding = w > 0 ? w - 1 : 0;	register streambuf *sb = _strbuf;	if (!(flags() & ios::left) && padding) // Default adjustment.	    if (_IO_padn(sb, fill_char, padding) < padding) {	      set(ios::badbit);	      goto failed;	    }	if (sb->sputc(c) == EOF) {	  set(ios::badbit);	  goto failed;        }	if (flags() & ios::left && padding) // Left adjustment.	    if (_IO_padn(sb, fill_char, padding) < padding)	      set(ios::badbit);#endif       failed:	osfx();	_IO_cleanup_region_end (0);    }    return *this;}/* Write VAL on STREAM.   If SIGN<0, val is the absolute value of a negative number.   If SIGN>0, val is a signed non-negative number.   If SIGN==0, val is unsigned. */static void write_int(ostream& stream, unsigned LONGEST val, int sign){#define WRITE_BUF_SIZE (10 + sizeof(unsigned LONGEST) * 3)    char buf[WRITE_BUF_SIZE];    register char *buf_ptr = buf+WRITE_BUF_SIZE; // End of buf.    const char *show_base = "";    int show_base_len = 0;    int show_pos = 0; // If 1, print a '+'.    // Now do the actual conversion, placing the result at the *end* of buf.    // Note that we use separate code for decimal, octal, and hex,    // so we can divide by optimizable constants.    if ((stream.flags() & ios::basefield) == ios::oct) { // Octal	do {	    *--buf_ptr = (val & 7) + '0';	    val = val >> 3;	} while (val != 0);	if ((stream.flags() & ios::showbase) && (*buf_ptr != '0'))	    *--buf_ptr = '0';    }    else if ((stream.flags() & ios::basefield) == ios::hex) { // Hex	const char *xdigs = (stream.flags() & ios::uppercase) ? "0123456789ABCDEF0X"	    : "0123456789abcdef0x";	do {	    *--buf_ptr = xdigs[val & 15];	    val = val >> 4;	} while (val != 0);	if ((stream.flags() & ios::showbase)) {	    show_base = xdigs + 16; // Either "0X" or "0x".	    show_base_len = 2;	}    }    else { // Decimal#if defined(__GNUC__) && !defined(__STRICT_ANSI__)	// Optimization:  Only use long long when we need to.	while (val > UINT_MAX) {	    *--buf_ptr = (val % 10) + '0';	    val /= 10;	}	// Use more efficient (int) arithmetic for the rest.	register unsigned int ival = (unsigned int)val;#else	register unsigned LONGEST ival = val;#endif	do {	    *--buf_ptr = (ival % 10) + '0';	    ival /= 10;	} while (ival != 0);	if (sign > 0 && (stream.flags() & ios::showpos))	    show_pos=1;    }    int buf_len = buf+WRITE_BUF_SIZE - buf_ptr;    int w = stream.width(0);    // Calculate padding.    int len = buf_len+show_pos;    if (sign < 0) len++;    len += show_base_len;    int padding = len > w ? 0 : w - len;    // Do actual output.    register streambuf* sbuf = stream.rdbuf();    ios::fmtflags pad_kind =	stream.flags() & (ios::left|ios::right|ios::internal);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -