18cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/* This is part of libio/iostream, providing -*- C++ -*- input/output. 28cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike DoddCopyright (C) 2000 Free Software Foundation 38cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 48cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike DoddThis file is part of the GNU IO Library. This library is free 58cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddsoftware; you can redistribute it and/or modify it under the 68cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddterms of the GNU General Public License as published by the 78cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike DoddFree Software Foundation; either version 2, or (at your option) 88cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddany later version. 98cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike DoddThis library is distributed in the hope that it will be useful, 118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddbut WITHOUT ANY WARRANTY; without even the implied warranty of 128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike DoddMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike DoddGNU General Public License for more details. 148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike DoddYou should have received a copy of the GNU General Public License 168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddalong with this library; see the file COPYING. If not, write to the Free 178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike DoddSoftware Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike DoddAs a special exception, if you link this library with files 208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddcompiled with a GNU compiler to produce an executable, this does not cause 218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddthe resulting executable to be covered by the GNU General Public License. 228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike DoddThis exception does not however invalidate any other reasons why 238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddthe executable file might be covered by the GNU General Public License. */ 248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/* Written by Magnus Fromreide (magfr@lysator.liu.se). */ 268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/* seekoff and ideas for overflow is largely borrowed from libstdc++-v3 */ 278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#ifndef __SSTREAM__ 298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define __SSTREAM__ 308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <iostream.h> 328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <streambuf.h> 338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <string> 348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddnamespace std 368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{ 378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd class stringbuf : public streambuf 388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd { 398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd public: 408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd typedef char char_type; 418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd typedef int int_type; 428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd typedef streampos pos_type; 438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd typedef streamoff off_type; 448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd explicit 468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd stringbuf(int which=ios::in|ios::out) 478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd : streambuf(), mode(static_cast<ios::open_mode>(which)), 488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd stream(NULL), stream_len(0) 498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd { 508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd stringbuf_init(); 518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd explicit 548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd stringbuf(const string &str, int which=ios::in|ios::out) 558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd : streambuf(), mode(static_cast<ios::open_mode>(which)), 568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd stream(NULL), stream_len(0) 578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd { 588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (mode & (ios::in|ios::out)) 598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd { 608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd stream_len = str.size(); 618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd stream = new char_type[stream_len]; 628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd str.copy(stream, stream_len); 638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd stringbuf_init(); 658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd virtual 688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd ~stringbuf() 698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd { 708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd delete[] stream; 718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd string 748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd str() const 758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd { 768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (pbase() != 0) 778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return string(stream, pptr()-pbase()); 788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd else 798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return string(); 808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd void 838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd str(const string& str) 848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd { 858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd delete[] stream; 868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd stream_len = str.size(); 878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd stream = new char_type[stream_len]; 888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd str.copy(stream, stream_len); 898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd stringbuf_init(); 908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd protected: 938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd // The buffer is already in gptr, so if it ends then it is out of data. 948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd virtual int 958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd underflow() 968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd { 978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return EOF; 988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd virtual int 1018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd overflow(int c = EOF) 1028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd { 1038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd int res; 1048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (mode & ios::out) 1058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd { 1068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (c != EOF) 1078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd { 1088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd streamsize old_stream_len = stream_len; 1098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd stream_len += 1; 1108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd char_type* new_stream = new char_type[stream_len]; 1118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd memcpy(new_stream, stream, old_stream_len); 1128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd delete[] stream; 1138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd stream = new_stream; 1148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd stringbuf_sync(gptr()-eback(), pptr()-pbase()); 1158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd sputc(c); 1168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd res = c; 1178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 1188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd else 1198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd res = EOF; 1208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 1218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd else 1228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd res = 0; 1238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return res; 1248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 1258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd virtual streambuf* 1278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd setbuf(char_type* s, streamsize n) 1288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd { 1298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (n != 0) 1308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd { 1318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd delete[] stream; 1328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd stream = new char_type[n]; 1338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd memcpy(stream, s, n); 1348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd stream_len = n; 1358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd stringbuf_sync(0, 0); 1368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 1378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return this; 1388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 1398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd virtual pos_type 1418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd seekoff(off_type off, ios::seek_dir way, int which = ios::in | ios::out) 1428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd { 1438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd pos_type ret = pos_type(off_type(-1)); 1448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd bool testin = which & ios::in && mode & ios::in; 1458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd bool testout = which & ios::out && mode & ios::out; 1468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd bool testboth = testin && testout && way != ios::cur; 1478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (stream_len && ((testin != testout) || testboth)) 1498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd { 1508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd char_type* beg = stream; 1518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd char_type* curi = NULL; 1528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd char_type* curo = NULL; 1538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd char_type* endi = NULL; 1548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd char_type* endo = NULL; 1558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (testin) 1578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd { 1588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd curi = gptr(); 1598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd endi = egptr(); 1608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 1618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (testout) 1628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd { 1638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd curo = pptr(); 1648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd endo = epptr(); 1658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 1668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd off_type newoffi = 0; 1688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd off_type newoffo = 0; 1698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (way == ios::beg) 1708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd { 1718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd newoffi = beg - curi; 1728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd newoffo = beg - curo; 1738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 1748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd else if (way == ios::end) 1758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd { 1768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd newoffi = endi - curi; 1778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd newoffo = endo - curo; 1788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 1798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (testin && newoffi + off + curi - beg >= 0 && 1818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd endi - beg >= newoffi + off + curi - beg) 1828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd { 1838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd gbump(newoffi + off); 1848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd ret = pos_type(newoffi + off + curi); 1858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 1868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (testout && newoffo + off + curo - beg >= 0 && 1878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd endo - beg >= newoffo + off + curo - beg) 1888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd { 1898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd pbump(newoffo + off); 1908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd ret = pos_type(newoffo + off + curo); 1918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 1928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 1938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return ret; 1948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 1958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 1968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd virtual pos_type 1978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd seekpos(pos_type sp, int which = ios::in | ios::out) 1988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd { 1998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd pos_type ret = seekoff(sp, ios::beg, which); 2008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return ret; 2018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 2028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd private: 2048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd void 2058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd stringbuf_sync(streamsize i, streamsize o) 2068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd { 2078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (mode & ios::in) 2088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd setg(stream, stream + i, stream + stream_len); 2098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (mode & ios::out) 2108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd { 2118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd setp(stream, stream + stream_len); 2128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd pbump(o); 2138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 2148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 2158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd void 2168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd stringbuf_init() 2178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd { 2188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd if (mode & ios::ate) 2198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd stringbuf_sync(0, stream_len); 2208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd else 2218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd stringbuf_sync(0, 0); 2228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 2238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd private: 2258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd ios::open_mode mode; 2268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd char_type* stream; 2278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd streamsize stream_len; 2288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd }; 2298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd class istringstream : public istream { 2318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd public: 2328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd typedef char char_type; 2338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd typedef int int_type; 2348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd typedef streampos pos_type; 2358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd typedef streamoff off_type; 2368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd explicit 2388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd istringstream(int which=ios::in) 2398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd : istream(&sb), sb(which | ios::in) 2408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd { } 2418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd explicit 2438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd istringstream(const string& str, int which=ios::in) 2448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd : istream(&sb), sb(str, which | ios::in) 2458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd { } 2468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd stringbuf* 2488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd rdbuf() const 2498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd { 2508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return const_cast<stringbuf*>(&sb); 2518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 2528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd string 2548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd str() const 2558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd { 2568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return rdbuf()->str(); 2578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 2588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd void 2598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd str(const string& s) 2608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd { 2618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd rdbuf()->str(s); 2628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 2638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd private: 2648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd stringbuf sb; 2658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd }; 2668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd class ostringstream : public ostream { 2688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd public: 2698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd typedef char char_type; 2708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd typedef int int_type; 2718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd typedef streampos pos_type; 2728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd typedef streamoff off_type; 2738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd explicit 2758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd ostringstream(int which=ios::out) 2768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd : ostream(&sb), sb(which | ios::out) 2778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd { } 2788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd explicit 2808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd ostringstream(const string& str, int which=ios::out) 2818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd : ostream(&sb), sb(str, which | ios::out) 2828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd { } 2838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd stringbuf* 2858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd rdbuf() const 2868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd { 2878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return const_cast<stringbuf*>(&sb); 2888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 2898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd string 2918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd str() const 2928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd { 2938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return rdbuf()->str(); 2948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 2958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 2968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd void str(const string& s) 2978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd { 2988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd rdbuf()->str(s); 2998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 3008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd private: 3018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd stringbuf sb; 3028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd }; 3038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 3048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd class stringstream : public iostream { 3058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd public: 3068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd typedef char char_type; 3078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd typedef int int_type; 3088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd typedef streampos pos_type; 3098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd typedef streamoff off_type; 3108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 3118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd explicit 3128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd stringstream(int which=ios::out|ios::in) 3138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd : iostream(&sb), sb(which) 3148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd { } 3158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 3168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd explicit 3178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd stringstream(const string& str, int which=ios::out|ios::in) 3188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd : iostream(&sb), sb(str, which) 3198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd { } 3208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 3218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd stringbuf* 3228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd rdbuf() const 3238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd { 3248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return const_cast<stringbuf*>(&sb); 3258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 3268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 3278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd string 3288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd str() const 3298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd { 3308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd return rdbuf()->str(); 3318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 3328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 3338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd void 3348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd str(const string& s) 3358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd { 3368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd rdbuf()->str(s); 3378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd } 3388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd private: 3398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd stringbuf sb; 3408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd }; 3418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}; 3428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd 3438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#endif /* not __STRSTREAM__ */ 344