1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
|
//////////////////////////////////////////////////////////////////////////////
//
// (C) Copyright Ion Gaztanaga 2006. Distributed under the Boost
// Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
// See http://www.boost.org/libs/interprocess for documentation.
//
//////////////////////////////////////////////////////////////////////////////
#include <boost/interprocess/detail/config_begin.hpp>
#include <boost/interprocess/streams/bufferstream.hpp>
#include <sstream>
#include <cstring>
using namespace boost::interprocess;
//Force instantiations to catch compile-time errors
template class basic_bufferbuf<char>;
template class basic_bufferstream<char>;
template class basic_ibufferstream<char>;
template class basic_obufferstream<char>;
static int bufferstream_test()
{
//Static big enough buffer
{
const int BufSize = 10001;
//This will be zero-initialized
static char buffer [BufSize];
bufferstream bufstream;;
std::stringstream std_stringstream;
std::string str1, str2, str3("testline:");
int number1, number2;
//Make sure we have null in the last byte
bufstream.buffer(buffer, BufSize-1);
for(int i = 0; i < 100; ++i){
bufstream << "testline: " << i << std::endl;
std_stringstream << "testline: " << i << std::endl;
}
if(std::strcmp(buffer, std_stringstream.str().c_str()) != 0){
return 1;
}
//We shouldn't have reached the end of the buffer writing
if(bufstream.bad()){
assert(0);
return 1;
}
bufstream.buffer(buffer, BufSize-1);
for(int i = 0; i < 100; ++i){
bufstream >> str1 >> number1;
std_stringstream >> str2 >> number2;
if((str1 != str2) || (str1 != str3)){
assert(0); return 1;
}
if((number1 != number2) || (number1 != i)){
assert(0); return 1;
}
}
//We shouldn't have reached the end of the buffer reading
if(bufstream.eof()){
assert(0);
return 1;
}
}
//Static small buffer. Check if buffer
//overflow protection works.
{
const int BufSize = 101;
//This will be zero-initialized
static char buffer [BufSize];
bufferstream bufstream;
std::stringstream std_stringstream;
std::string str1;
int number1;
//Make sure we have null in the last byte
bufstream.buffer(buffer, BufSize-1);
for(int i = 0; i < 100; ++i){
bufstream << "testline: " << i << std::endl;
std_stringstream << "testline: " << i << std::endl;
}
//Contents should be different
if(std::strcmp(buffer, std_stringstream.str().c_str()) == 0){
return 1;
}
//The stream shouldn't be in good health
if(bufstream.good()){
assert(0);
return 1;
}
//The bad flag should be active. This indicates overflow attempt
if(!bufstream.bad()){
assert(0);
return 1;
}
//Now let's test read overflow
bufstream.clear();
bufstream.buffer(buffer, BufSize-1);
for(int i = 0; i < 100; ++i){
bufstream >> str1 >> number1;
}
//The stream shouldn't be in good health
if(bufstream.good()){
assert(0);
return 1;
}
//The eof flag indicates we have reached the end of the
//buffer while reading
if(!bufstream.eof()){
assert(0);
return 1;
}
}
return 0;
}
int main ()
{
if(bufferstream_test()==-1){
return 1;
}
return 0;
}
#include <boost/interprocess/detail/config_end.hpp>
|