00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef FAKESTRINGSTREAM_H
00020 #define FAKESTRINGSTREAM_H
00021
00022 #include <strstream.h>
00023 #include <string.h>
00024 #include <string>
00025
00026 #ifdef HAVE_NAMESPACE
00027 using namespace std;
00028 #endif
00029
00030 class fake_istream_buffer {
00031 public:
00032 fake_istream_buffer() {
00033 _len = 0;
00034 _str = "";
00035 }
00036 fake_istream_buffer(const string &source) {
00037 _len = source.length();
00038 if (_len == 0) {
00039 _str = "";
00040 } else {
00041 _str = new char[_len];
00042 memcpy(_str, source.data(), _len);
00043 }
00044 }
00045 ~fake_istream_buffer() {
00046 if (_len != 0) {
00047 delete[] _str;
00048 }
00049 }
00050
00051 int _len;
00052 char *_str;
00053 };
00054
00055 class istringstream : public fake_istream_buffer, public istrstream {
00056 public:
00057 istringstream(const string &input) :
00058 fake_istream_buffer(input),
00059 istrstream(_str, _len) { }
00060 };
00061
00062 class ostringstream : public ostrstream {
00063 public:
00064 string str() {
00065
00066 int length = pcount();
00067 char *s = ostrstream::str();
00068 string result(s, length);
00069 delete[] s;
00070 return result;
00071 }
00072 };
00073
00074 class stringstream : public fake_istream_buffer, public strstream {
00075 public:
00076 stringstream() : strstream() {
00077 _owns_str = true;
00078 }
00079 stringstream(const string &input) :
00080 fake_istream_buffer(input),
00081 strstream(_str, _len, ios::in)
00082 {
00083 _owns_str = false;
00084 }
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103 private:
00104 bool _owns_str;
00105 };
00106
00107 #endif