Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Data Structures | File List | Namespace Members | Data Fields | Related Pages

XmlStyleStream.cpp

00001 #include "XmlStyleStream.h"
00002 
00003 namespace Sct{
00004 
00005 XmlStyleOStream::XmlStyleOStream(std::ostream& out) : m_out(out) {}
00006 
00007 XmlStyleOStream::~XmlStyleOStream(){}
00008 
00009 
00010 static std::string escape[] = { "&", "'", """, "&gt", "<" };
00011 static std::string entity[] = { "&" , "'", "\"", ">", "<" };
00012 
00013 static std::string invalidate( const char * val, int length )
00014 {
00015     std::string text( val, length );
00016     for ( int i = 0; i < 5; i++ )
00017     {
00018         std::string::size_type pos = 0;
00019         while( ( pos = text.find( escape[i] ) ) != std::string::npos )
00020         {
00021             text.replace( pos, escape[i].length(), entity[i] );
00022         }
00023     }
00024     return text;
00025 }
00026 
00027 static std::string validate( const char * val, int length )
00028 {
00029     std::string text( val, length );
00030     for ( int i = 0; i < 5; i++ )
00031     {
00032         std::string::size_type pos = 0;
00033         while( ( pos = text.find( entity[i], pos ) ) != std::string::npos )
00034         {
00035             text.replace( pos++, entity[i].length(), escape[i] );
00036         }
00037     }
00038     return text;
00039 }
00040 
00041 XmlStyleOStream& XmlStyleOStream::operator<< ( bool v )
00042 {
00043     m_out << "<a t=\"bool\">" << v << "</a>" << std::endl;
00044     return *this;
00045 }
00046 
00047 XmlStyleOStream& XmlStyleOStream::operator<< ( char v )
00048 {
00049     m_out << "<a t=\"s8\">" << static_cast<short>( v ) << "</a>" << std::endl;
00050     return *this;
00051 }
00052 
00053 XmlStyleOStream& XmlStyleOStream::operator<< ( unsigned char v )
00054 {
00055     m_out << "<a t=\"u8\">" << static_cast<short>( static_cast<char>( v ) ) << "</a>" << std::endl;
00056     return *this;
00057 }
00058 
00059 XmlStyleOStream& XmlStyleOStream::operator<< ( short v )
00060 {
00061     m_out << "<a t=\"s16\">" << v << "</a>" << std::endl;
00062     return *this;
00063 }
00064 
00065 XmlStyleOStream& XmlStyleOStream::operator<< ( unsigned short v )
00066 {
00067     m_out << "<a t=\"u16\">" << static_cast<short>( v ) << "</a>" << std::endl;
00068     return *this;
00069 }
00070 
00071 XmlStyleOStream& XmlStyleOStream::operator<< ( int v )
00072 {
00073     m_out << "<a t=\"s32\">" << v << "</a>" << std::endl;
00074     return *this;
00075 }
00076 
00077 XmlStyleOStream& XmlStyleOStream::operator<< ( unsigned int v )
00078 {
00079     m_out << "<a t=\"u32\">" << static_cast<int>( v ) << "</a>" << std::endl;
00080     return *this;
00081 }
00082 
00083 XmlStyleOStream& XmlStyleOStream::operator<< ( long v )
00084 {
00085     m_out << "<a t=\"s32\">" << v << "</a>" << std::endl;
00086     return *this;
00087 }
00088 
00089 XmlStyleOStream& XmlStyleOStream::operator<< ( unsigned long v )
00090 {
00091     m_out << "<a t=\"u32\">" << static_cast<long>( v ) << "</a>" << std::endl;
00092     return *this;
00093 }
00094 
00095 XmlStyleOStream& XmlStyleOStream::operator<< ( float v )
00096 {
00097     m_out << "<a t=\"float\">" << v << "</a>" << std::endl;
00098     return *this;
00099 }
00100 
00101 XmlStyleOStream& XmlStyleOStream::operator<< ( double v )
00102 {
00103     m_out << "<a t=\"double\">" << v << "</a>" << std::endl;
00104     return *this;
00105 }
00106 
00107 XmlStyleOStream& XmlStyleOStream::operator<< ( const char * v )
00108 {
00109     const char * val = ( v == 0 ? "" : v );
00110     m_out << "<a t=\"string\">" << validate( val, strlen( val ) ) << "</a>" << std::endl;
00111     return *this;
00112 }
00113 
00114 XmlStyleOStream& XmlStyleOStream::operator<< ( const unsigned char * v )
00115 {
00116     return ( (*this) << reinterpret_cast<const char *>(v) );
00117 }
00118 
00119 XmlStyleOStream& XmlStyleOStream::operator<< ( const std::string & v )
00120 {
00121     return ( (*this) << v.c_str() );
00122 }
00123 
00124 
00125 //--------------------------------------------------------
00126 // Class XmlStyleOStream public methods
00127 //--------------------------------------------------------
00128 
00129 XmlStyleOStream& XmlStyleOStream::put( const bool * p, size_t size )
00130 {
00131     m_out << "<a t=\"bool\" s=\"" << size << "\">";
00132     for ( size_t i = 0; i < size; i++ )
00133     {
00134         m_out << p[i] << " ";
00135     }
00136     m_out << "</a>" << std::endl;
00137     return *this;
00138 }
00139 
00140 XmlStyleOStream& XmlStyleOStream::put( const char * p, size_t size )
00141 {
00142     m_out << "<a t=\"s8\" s=\"" << size << "\">";
00143     for ( size_t i = 0; i < size; i++ )
00144     {
00145         m_out << static_cast<const short>( p[i] ) << " ";
00146     }
00147     m_out << "</a>" << std::endl;
00148     return *this;
00149 }
00150 
00151 XmlStyleOStream& XmlStyleOStream::put( const unsigned char * p, size_t size )
00152 {
00153     m_out << "<a t=\"u8\" s=\"" << size << "\">";
00154     for ( size_t i = 0; i < size; i++ )
00155     {
00156         m_out << static_cast<const short>( static_cast<const char>( p[i] ) ) << " ";
00157     }
00158     m_out << "</a>" << std::endl;
00159     return *this;
00160 }
00161 
00162 XmlStyleOStream& XmlStyleOStream::put( const short * p, size_t size )
00163 {
00164     m_out << "<a t=\"s16\" s=\"" << size << "\">";
00165     for ( size_t i = 0; i < size; i++ )
00166     {
00167         m_out << p[i] << " ";
00168     }
00169     m_out << "</a>" << std::endl;
00170     return *this;
00171 }
00172 
00173 XmlStyleOStream& XmlStyleOStream::put( const unsigned short * p, size_t size )
00174 {
00175     m_out << "<a t=\"u16\" s=\"" << size << "\">";
00176     for ( size_t i = 0; i < size; i++ )
00177     {
00178         m_out << static_cast<const short>( p[i] ) << " ";
00179     }
00180     m_out << "</a>" << std::endl;
00181     return *this;
00182 }
00183 
00184 XmlStyleOStream& XmlStyleOStream::put( const int * p, size_t size )
00185 {
00186     m_out << "<a t=\"s32\" s=\"" << size << "\">";
00187     for ( size_t i = 0; i < size; i++ )
00188     {
00189         m_out << p[i] << " ";
00190     }
00191     m_out << "</a>" << std::endl;
00192     return *this;
00193 }
00194 
00195 XmlStyleOStream& XmlStyleOStream::put( const unsigned int * p, size_t size )
00196 {
00197     m_out << "<a t=\"u32\" s=\"" << size << "\">";
00198     for ( size_t i = 0; i < size; i++ )
00199     {
00200         m_out << static_cast<const int>( p[i] ) << " ";
00201     }
00202     m_out << "</a>" << std::endl;
00203     return *this;
00204 }
00205 
00206 XmlStyleOStream& XmlStyleOStream::put( const long * p, size_t size )
00207 {
00208     m_out << "<a t=\"s32\" s=\"" << size << "\">";
00209     for ( size_t i = 0; i < size; i++ )
00210     {
00211         m_out << p[i] << " ";
00212     }
00213     m_out << "</a>" << std::endl;
00214     return *this;
00215 }
00216 
00217 XmlStyleOStream& XmlStyleOStream::put( const unsigned long * p, size_t size )
00218 {
00219     m_out << "<a t=\"u32\" s=\"" << size << "\">";
00220     for ( size_t i = 0; i < size; i++ )
00221     {
00222         m_out << static_cast<const long>( p[i] ) << " ";
00223     }
00224     m_out << "</a>" << std::endl;
00225     return *this;
00226 }
00227 
00228 XmlStyleOStream& XmlStyleOStream::put( const float * p, size_t size )
00229 {
00230     m_out << "<a t=\"float\" s=\"" << size << "\">";
00231     for ( size_t i = 0; i < size; i++ )
00232     {
00233         m_out << p[i] << " ";
00234     }
00235     m_out << "</a>" << std::endl;
00236     return *this;
00237 }
00238 
00239 XmlStyleOStream& XmlStyleOStream::put( const double * p, size_t size )
00240 {
00241     m_out << "<a t=\"double\" s=\"" << size << "\">";
00242     for ( size_t i = 0; i < size; i++ )
00243     {
00244         m_out << p[i] << " ";
00245     }
00246     m_out << "</a>" << std::endl;
00247     return *this;
00248 }
00249 
00250 XmlStyleOStream& XmlStyleOStream::put( const std::string * p, size_t size )
00251 {
00252     m_out << "<a t=\"string\" s=\"" << size << "\">";
00253     for ( size_t i = 0; i < size; i++ )
00254     {
00255         m_out << "\"" << validate( p[i].c_str(), p[i].length() ) << "\" ";
00256     }
00257     m_out  << "</a>" << std::endl;
00258     return *this;
00259 }
00260 
00261 //--------------------------------------------------------
00262 // Class XmlStyleIStream public constructors and operators
00263 //--------------------------------------------------------
00264 
00265 XmlStyleIStream::~XmlStyleIStream(){}
00266 
00267 
00268 XmlStyleIStream::XmlStyleIStream(std::istream& is)
00269   :  count_( 0 ),
00270      entries_ ( 0 )
00271 {
00272   std::ostringstream os;
00273   std::string tmp;
00274   while (is.good()){
00275     is >> tmp;
00276     os << tmp+" ";
00277   }
00278 
00279   data_=os.str();
00280 
00281     std::string::size_type  pos = 0;
00282     while ( ( pos = data_.find("<a t=", pos) ) != std::string::npos )
00283     {
00284         pos++;
00285         entries_++;
00286     }
00287     entries_--;
00288 }
00289 
00290 XmlStyleIStream& XmlStyleIStream::operator>>( char * v )
00291 {
00292     std::string::size_type  start;
00293     
00294     start  = data_.find("<a t=", count_);
00295     start  = data_.find(">", start);
00296     start++;
00297     count_ = data_.find("</a>", start);
00298     
00299     std::string str = invalidate( data_.data() + start, count_ - start );
00300     strcpy( v, str.c_str() );
00301 
00302     return *this;
00303 }
00304 
00305 XmlStyleIStream& XmlStyleIStream::operator>>( unsigned char * v )
00306 {
00307     return ( *this >> reinterpret_cast<char*>( v ));
00308 }
00309 
00310 XmlStyleIStream& XmlStyleIStream::operator>>( char ** v )
00311 {
00312     std::string::size_type  start;
00313     
00314     start  = data_.find("<a t=", count_);
00315     start  = data_.find(">", start);
00316     start++;
00317     count_ = data_.find("</a>", start);
00318     
00319     std::string str = invalidate( data_.data() + start, count_ - start );
00320     (*v) = new char[str.length() + 1];
00321     strcpy( (*v), str.c_str() );
00322     
00323     return *this;
00324 }
00325 
00326 XmlStyleIStream& XmlStyleIStream::operator>>( unsigned char ** v )
00327 {
00328     return ( *this >> reinterpret_cast<char**>( v ) );
00329 }
00330 
00331 XmlStyleIStream& XmlStyleIStream::operator>>(bool& v)
00332 {
00333     std::string::size_type  start;
00334     
00335     start  = data_.find("<a t=", count_);
00336     start  = data_.find(">", start);
00337     start++;
00338     count_ = data_.find("</a>", start);
00339     
00340     std::istringstream sin( data_.substr( start, count_ - start ) );
00341     sin >> v;
00342 
00343     return *this;
00344 }
00345 
00346 XmlStyleIStream& XmlStyleIStream::operator>>(char& v)
00347 {
00348     std::string::size_type  start;
00349     
00350     start  = data_.find("<a t=", count_);
00351     start  = data_.find(">", start);
00352     start++;
00353     count_ = data_.find("</a>", start);
00354     
00355     std::istringstream sin( data_.substr( start, count_ - start ) );
00356     short s;
00357     sin >> s;
00358     v = s;
00359 
00360     return *this;
00361 }
00362 
00363 XmlStyleIStream& XmlStyleIStream::operator>>(unsigned char& v)
00364 {
00365     std::string::size_type  start;
00366     
00367     start  = data_.find("<a t=", count_);
00368     start  = data_.find(">", start);
00369     start++;
00370     count_ = data_.find("</a>", start);
00371     
00372     std::istringstream sin( data_.substr( start, count_ - start ) );
00373     unsigned short s;
00374     sin >> s;
00375     v = s;
00376         
00377     return *this;
00378 }
00379 
00380 XmlStyleIStream& XmlStyleIStream::operator>>(int& v)
00381 {
00382     std::string::size_type  start;
00383     
00384     start  = data_.find("<a t=", count_);
00385     start  = data_.find(">", start);
00386     start++;
00387     count_ = data_.find("</a>", start);
00388     
00389     std::istringstream sin( data_.substr( start, count_ - start ) );
00390     sin >> v;
00391     return *this;
00392 }
00393 
00394 XmlStyleIStream& XmlStyleIStream::operator>>(long& v)
00395 {
00396     std::string::size_type  start;
00397     
00398     start  = data_.find("<a t=", count_);
00399     start  = data_.find(">", start);
00400     start++;
00401     count_ = data_.find("</a>", start);
00402     
00403     std::istringstream sin( data_.substr( start, count_ - start ) );
00404     sin >> v;
00405 
00406     return *this;
00407 }
00408 
00409 XmlStyleIStream& XmlStyleIStream::operator>>(short& v)
00410 {
00411     std::string::size_type  start;
00412     
00413     start  = data_.find("<a t=", count_);
00414     start  = data_.find(">", start);
00415     start++;
00416     count_ = data_.find("</a>", start);
00417     
00418     std::istringstream sin( data_.substr( start, count_ - start ) );
00419     sin >> v;
00420 
00421     return *this;
00422 }
00423 
00424 XmlStyleIStream& XmlStyleIStream::operator>>(unsigned int& v)
00425 {
00426     std::string::size_type  start;
00427     
00428     start  = data_.find("<a t=", count_);
00429     start  = data_.find(">", start);
00430     start++;
00431     count_ = data_.find("</a>", start);
00432     
00433     std::istringstream sin( data_.substr( start, count_ - start ) );
00434     sin >> v;
00435 
00436     return *this;
00437 }
00438 
00439 XmlStyleIStream& XmlStyleIStream::operator>>(unsigned long& v)
00440 {
00441     std::string::size_type  start;
00442     
00443     start  = data_.find("<a t=", count_);
00444     start  = data_.find(">", start);
00445     start++;
00446     count_ = data_.find("</a>", start);
00447     
00448     std::istringstream sin( data_.substr( start, count_ - start ) );
00449     sin >> v;
00450 
00451     return *this;
00452 }
00453 
00454 XmlStyleIStream& XmlStyleIStream::operator>>(unsigned short& v)
00455 {
00456     std::string::size_type  start;
00457     
00458     start  = data_.find("<a t=", count_);
00459     start  = data_.find(">", start);
00460     start++;
00461     count_ = data_.find("</a>", start);
00462     
00463     std::istringstream sin( data_.substr( start, count_ - start ) );
00464     sin >> v;
00465 
00466     return *this;
00467 }
00468 
00469 XmlStyleIStream& XmlStyleIStream::operator>>(float& v)
00470 {
00471     std::string::size_type  start;
00472     
00473     start  = data_.find("<a t=", count_);
00474     start  = data_.find(">", start);
00475     start++;
00476     count_ = data_.find("</a>", start);
00477     
00478     std::istringstream sin( data_.substr( start, count_ - start ) );
00479     sin >> v;
00480 
00481     return *this;
00482 }
00483 
00484 XmlStyleIStream& XmlStyleIStream::operator>>(double& v)
00485 {
00486     std::string::size_type  start;
00487     
00488     start  = data_.find("<a t=", count_);
00489     start  = data_.find(">", start);
00490     start++;
00491     count_ = data_.find("</a>", start);
00492     
00493     std::istringstream sin( data_.substr( start, count_ - start ) );
00494     sin >> v;
00495 
00496     return *this;
00497 }
00498 
00499 XmlStyleIStream& XmlStyleIStream::operator>>(std::string & v)
00500 {
00501     char * str;
00502     (*this) >> &str;
00503     v = str;
00504     delete[] str;
00505     return *this;
00506 }
00507 
00508 //---------------------------------------------------------
00509 // XmlStyleIStream private method
00510 //---------------------------------------------------------
00511 
00512 void XmlStyleIStream::reset( )
00513 {
00514     count_ = 0;
00515 }
00516 
00517 size_t XmlStyleIStream::entries( ) const
00518 {
00519     return entries_;
00520 }
00521 
00522 size_t XmlStyleIStream::readSize( ) const
00523 {
00524     std::string::size_type  start, end;
00525     
00526     start  = data_.find("<a t=", count_);
00527     end    = data_.find(">", start);
00528     start  = data_.find(" s=\"", start);
00529     if ( start == std::string::npos || start > end )
00530     {
00531         return 1;
00532     }
00533     start += 4;
00534     end = data_.find("\"", start);
00535     
00536     std::istringstream sin( data_.substr( start, end - start ) );
00537     
00538     size_t size;
00539     sin >> size;
00540     return size;
00541 }
00542 
00543 bool XmlStyleIStream::isArray( ) const
00544 {
00545     std::string::size_type  start, end;
00546     
00547     start  = data_.find("<a t=", count_);
00548     end    = data_.find(">", start);
00549     start  = data_.find(" s=\"", start);
00550     if ( start == std::string::npos || start > end )
00551     {
00552         return false;
00553     }
00554     else
00555     {
00556         return true;
00557     }
00558 }
00559 
00560 //---------------------------------------------------------
00561 // XmlStyleIStream public methods 
00562 //---------------------------------------------------------
00563 
00564 
00565 XmlStyleIStream& XmlStyleIStream::get( bool ** v, size_t & size )
00566 {
00567     size = readSize();
00568     
00569     std::string::size_type  start;
00570     
00571     start  = data_.find("\">", count_) + 2;
00572     count_ = data_.find("</a>", start);
00573     
00574     std::istringstream sin( data_.substr( start, count_ - start ) );
00575     *v = new bool[size];
00576     for ( size_t i = 0; i < size; i++ )
00577     {
00578         sin >> (*v)[i];
00579     }
00580 
00581     return *this;
00582 }
00583 
00584 XmlStyleIStream& XmlStyleIStream::get( char ** v, size_t & size )
00585 {
00586     size = readSize();
00587     
00588     std::string::size_type  start;
00589     
00590     start  = data_.find("\">", count_) + 2;
00591     count_ = data_.find("</a>", start);
00592     
00593     std::istringstream sin( data_.substr( start, count_ - start ) );
00594     *v = new char[size];
00595     for ( size_t i = 0; i < size; i++ )
00596     {
00597         short s;
00598         sin >> s;
00599         (*v)[i] = static_cast<char>( s );
00600     }
00601 
00602     return *this;
00603 }
00604 
00605 XmlStyleIStream& XmlStyleIStream::get( unsigned char ** v, size_t & size )
00606 {
00607     size = readSize();
00608     
00609     std::string::size_type  start;
00610     
00611     start  = data_.find("\">", count_) + 2;
00612     count_ = data_.find("</a>", start);
00613     
00614     std::istringstream sin( data_.substr( start, count_ - start ) );
00615     *v = new unsigned char[size];
00616     for ( size_t i = 0; i < size; i++ )
00617     {
00618         short s;
00619         sin >> s;
00620         (*v)[i] = static_cast<unsigned char>( s );
00621     }
00622     return *this;
00623 }
00624 
00625 XmlStyleIStream& XmlStyleIStream::get( short ** v, size_t & size )
00626 {
00627     size = readSize();
00628     
00629     std::string::size_type  start;
00630     
00631     start  = data_.find("\">", count_) + 2;
00632     count_ = data_.find("</a>", start);
00633     
00634     std::istringstream sin( data_.substr( start, count_ - start ) );
00635     *v = new short[size];
00636     for ( size_t i = 0; i < size; i++ )
00637     {
00638         sin >> (*v)[i];
00639     }
00640     return *this;
00641 }
00642 XmlStyleIStream& XmlStyleIStream::get( unsigned short ** v, size_t & size )
00643 {
00644     size = readSize();
00645     
00646     std::string::size_type  start;
00647     
00648     start  = data_.find("\">", count_) + 2;
00649     count_ = data_.find("</a>", start);
00650     
00651     std::istringstream sin( data_.substr( start, count_ - start ) );
00652     *v = new unsigned short[size];
00653     for ( size_t i = 0; i < size; i++ )
00654     {
00655         sin >> (*v)[i];
00656     }
00657     return *this;
00658 }
00659 XmlStyleIStream& XmlStyleIStream::get( int ** v, size_t & size )
00660 {
00661     size = readSize();
00662     
00663     std::string::size_type  start;
00664     
00665     start  = data_.find("\">", count_) + 2;
00666     count_ = data_.find("</a>", start);
00667     
00668     std::istringstream sin( data_.substr( start, count_ - start ) );
00669     *v = new int[size];
00670     for ( size_t i = 0; i < size; i++ )
00671     {
00672         sin >> (*v)[i];
00673     }
00674     return *this;
00675 }
00676 XmlStyleIStream& XmlStyleIStream::get( unsigned int ** v, size_t & size )
00677 {
00678     size = readSize();
00679     
00680     std::string::size_type  start;
00681     
00682     start  = data_.find("\">", count_) + 2;
00683     count_ = data_.find("</a>", start);
00684     
00685     std::istringstream sin( data_.substr( start, count_ - start ) );
00686     *v = new unsigned int[size];
00687     for ( size_t i = 0; i < size; i++ )
00688     {
00689         sin >> (*v)[i];
00690     }
00691     return *this;
00692 }
00693 XmlStyleIStream& XmlStyleIStream::get( long ** v, size_t & size )
00694 {
00695     size = readSize();
00696     
00697     std::string::size_type  start;
00698     
00699     start  = data_.find("\">", count_) + 2;
00700     count_ = data_.find("</a>", start);
00701     
00702     std::istringstream sin( data_.substr( start, count_ - start ) );
00703     *v = new long[size];
00704     for ( size_t i = 0; i < size; i++ )
00705     {
00706         sin >> (*v)[i];
00707     }
00708     return *this;
00709 }
00710 XmlStyleIStream& XmlStyleIStream::get( unsigned long ** v, size_t & size )
00711 {
00712     size = readSize();
00713     
00714     std::string::size_type  start;
00715     
00716     start  = data_.find("\">", count_) + 2;
00717     count_ = data_.find("</a>", start);
00718     
00719     std::istringstream sin( data_.substr( start, count_ - start ) );
00720     *v = new unsigned long[size];
00721     for ( size_t i = 0; i < size; i++ )
00722     {
00723         sin >> (*v)[i];
00724     }
00725     return *this;
00726 }
00727 XmlStyleIStream& XmlStyleIStream::get( float ** v, size_t & size )
00728 {
00729     size = readSize();
00730     
00731     std::string::size_type  start;
00732     
00733     start  = data_.find("\">", count_) + 2;
00734     count_ = data_.find("</a>", start);
00735     
00736     std::istringstream sin( data_.substr( start, count_ - start ) );
00737     *v = new float[size];
00738     for ( size_t i = 0; i < size; i++ )
00739     {
00740         sin >> (*v)[i];
00741     }
00742     return *this;
00743 }
00744 XmlStyleIStream& XmlStyleIStream::get( double ** v, size_t & size )
00745 {
00746     size = readSize();
00747     
00748     std::string::size_type  start;
00749     
00750     start  = data_.find("\">", count_) + 2;
00751     count_ = data_.find("</a>", start);
00752     
00753     std::istringstream sin( data_.substr( start, count_ - start ) );
00754     *v = new double[size];
00755     for ( size_t i = 0; i < size; i++ )
00756     {
00757         sin >> (*v)[i];
00758     }
00759     return *this;
00760 }
00761 
00762 XmlStyleIStream& XmlStyleIStream::get( std::string ** v, size_t & size )
00763 {
00764     size = readSize();
00765     
00766     std::string::size_type  start, end;
00767     
00768     start  = data_.find("\">", count_) + 2;
00769     count_ = data_.find("</a>", start);
00770     
00771     *v = new std::string[size];
00772     for ( size_t i = 0; i < size; i++ )
00773     {
00774         start  = data_.find("\"", start) + 1;
00775         end  = data_.find("\"", start);
00776         (*v)[i] = invalidate( data_.c_str() + start, end - start );
00777         start = end + 2;
00778     }
00779     return *this;
00780 }
00781 
00782 //-----------------------------------------------------------
00783 // Read to the static arrays - does not allocate memory
00784 //-----------------------------------------------------------
00785 
00786 
00787 XmlStyleIStream& XmlStyleIStream::get( bool * const v, const size_t size )
00788 {
00789     size_t  n;
00790     bool *  buff;
00791     
00792     get( &buff, n );
00793     size_t  min = ( n < size ? n : size );
00794     memcpy( v, buff, min * sizeof(bool) );
00795     delete[] buff;
00796 
00797     return *this;
00798 }
00799 
00800 XmlStyleIStream& XmlStyleIStream::get( char * const v, const size_t size )
00801 {
00802     size_t  n;
00803     char *  buff;
00804     
00805     get( &buff, n );
00806     size_t  min = ( n < size ? n : size );
00807     memcpy( v, buff, min * sizeof(char) );
00808     delete[] buff;
00809 
00810     return *this;
00811 }
00812 
00813 XmlStyleIStream& XmlStyleIStream::get(unsigned char * const v, const size_t size )
00814 {
00815     size_t  n;
00816     unsigned char * buff;
00817     
00818     get( &buff, n );
00819     size_t  min = ( n < size ? n : size );
00820     memcpy( v, buff, min * sizeof(unsigned char) );
00821     delete[] buff;
00822 
00823     return *this;
00824 }
00825 
00826 XmlStyleIStream& XmlStyleIStream::get( short * const v, const size_t size )
00827 {
00828     size_t  n;
00829     short * buff;
00830     
00831     get( &buff, n );
00832     size_t  min = ( n < size ? n : size );
00833     memcpy( v, buff, min * sizeof(short) );
00834     delete[] buff;
00835 
00836     return *this;
00837 }
00838 XmlStyleIStream& XmlStyleIStream::get( unsigned short * const v, const size_t size )
00839 {
00840     size_t          n;
00841     unsigned short *    buff;
00842     
00843     get( &buff, n );
00844     size_t  min = ( n < size ? n : size );
00845     memcpy( v, buff, min * sizeof(unsigned short) );
00846     delete[] buff;
00847 
00848     return *this;
00849 }
00850 
00851 XmlStyleIStream& XmlStyleIStream::get( int * const v, const size_t size )
00852 {
00853     size_t  n;
00854     int *   buff;
00855     
00856     get( &buff, n );
00857     size_t  min = ( n < size ? n : size );
00858     memcpy( v, buff, min * sizeof(int) );
00859     delete[] buff;
00860 
00861     return *this;
00862 }
00863 
00864 XmlStyleIStream& XmlStyleIStream::get( unsigned int * const v, const size_t size )
00865 {
00866     size_t  n;
00867     unsigned int *  buff;
00868     
00869     get( &buff, n );
00870     size_t  min = ( n < size ? n : size );
00871     memcpy( v, buff, min * sizeof(unsigned int) );
00872     delete[] buff;
00873 
00874     return *this;
00875 }
00876 
00877 XmlStyleIStream& XmlStyleIStream::get( long * const v, const size_t size )
00878 {
00879     size_t  n;
00880     long *  buff;
00881     
00882     get( &buff, n );
00883     size_t  min = ( n < size ? n : size );
00884     memcpy( v, buff, min * sizeof(long) );
00885     delete[] buff;
00886 
00887     return *this;
00888 }
00889 
00890 XmlStyleIStream& XmlStyleIStream::get( unsigned long * const v, const size_t size )
00891 {
00892     size_t  n;
00893     unsigned long * buff;
00894     
00895     get( &buff, n );
00896     size_t  min = ( n < size ? n : size );
00897     memcpy( v, buff, min * sizeof(unsigned long) );
00898     delete[] buff;
00899 
00900     return *this;
00901 }
00902 
00903 XmlStyleIStream& XmlStyleIStream::get( float * const v, const size_t size )
00904 {
00905     size_t  n;
00906     float * buff;
00907     
00908     get( &buff, n );
00909     size_t  min = ( n < size ? n : size );
00910     memcpy( v, buff, min * sizeof(float) );
00911     delete[] buff;
00912 
00913     return *this;
00914 }
00915 
00916 XmlStyleIStream& XmlStyleIStream::get( double * const v, const size_t size )
00917 {
00918     size_t  n;
00919     double *    buff;
00920     
00921     get( &buff, n );
00922     size_t  min = ( n < size ? n : size );
00923     memcpy( v, buff, min * sizeof(double) );
00924     delete[] buff;
00925 
00926     return *this;
00927 }
00928 
00929 XmlStyleIStream& XmlStyleIStream::get( std::string * const v, const size_t size )
00930 {
00931     size_t  n;
00932     std::string * buff;
00933     get( &buff, n );
00934     
00935     size_t  min = ( n < size ? n : size );
00936     
00937     for( size_t i = 0; i < min; i++ )
00938     {
00939         v[i] = buff[i];
00940     }
00941     
00942     delete[] buff;
00943     return *this;
00944 }
00945 
00946 }

Generated on Thu Jul 15 09:51:02 2004 for SCT DAQ/DCS Software - C++ by doxygen 1.3.5