📄 iostream.cpp
字号:
/* 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 + -