Program Listing for File StreamIO.h#
↰ Return to documentation for file (src/util/support/StreamIO.h)
#ifndef STREAM_IO_H
#define STREAM_IO_H
#include <iostream>
#include <assert.h>
inline bool is_space( char c)
{
return c == ' ' || c == '\t' || c == '\n';
}
inline bool is_num( char c)
{
return c >= '0' && c <= '9';
}
inline bool is_id( char c)
{
return c == '_' || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
}
inline char getch( istream& in)
{
char c = in.get();
return c;
}
inline char read_ch( istream& in )
{
char c = 0;
do { c = getch(in); } while (in.good() && is_space(c));
if (!in.good())
return 0;
return c;
}
inline void read_ch( istream& in, char c)
{
char c1 = read_ch(in);
if (c1 != c) {
cerr << "read char error: expecting '" << c << "' instead of '" << c1 << "'\n";
ROSE_ABORT();
}
}
inline string read_id( istream& in )
{
char c = read_ch(in);
string buf = "";
while (in.good() && (is_id(c) || is_num(c)) ) {
buf.push_back(c);
c = getch(in);
}
if (in.good())
in.unget();
return buf;
}
inline void read_id( istream& in, const string& id )
{
string id1 = read_id(in);
if (id1 != id) {
cerr << "read id error: expecting '" << id << "' instead of '" << id1 << "'\n";
ROSE_ABORT();
}
}
inline string read_num( istream& in )
{
char c = read_ch(in);
if (!in.good())
return "";
assert( is_num(c));
string buf = "";
buf.push_back(c);
for (;;) {
c = getch(in);
if ( !is_num(c) && c != '.') {
in.unget();
break;
}
buf.push_back(c);
}
return buf;
}
template <class ItemGen>
void read_list( istream& in, ItemGen& op )
{
op.read(in);
while (in.good()) {
char c = read_ch(in);
if (c != ',')
break;
op.read(in);
}
if (in.good())
in.unget();
}
template <class ItemGen, class Container>
class ReadContainerWrap
{
ItemGen &op;
Container& c;
public:
ReadContainerWrap( ItemGen& _op, Container& _c) : op(_op), c(_c) {}
void read( istream& in)
{ c.push_back( op.read(in) ); }
};
#endif