#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <string>
class reader_t
{
std::istream& _is;
enum token_t
{
data_beg,
data_end,
data,
done
};
token_t _tok;
char _c;
token_t get_token()
{
// first byte
//
if ( !_is.get( _c ) )
return _tok = done;
//
if ( 0x1b != _c )
return _tok = data; // data
//
char t;
// second byte
//
if ( !_is.get( t ) )
return _tok = data;
if ( 0x5b != t ) // not expected escape sequence
{
_is.unget();
return _tok = data;
}
// third byte
//
if ( !_is.get( t ) )
{
_is.clear();
_is.unget();
_is.unget();
return _tok = data;
}
switch ( t )
{
case 0x30:
_tok = data_beg;
break;
case 0x31:
_tok = data_end;
break;
default:
{
_is.unget();
_is.unget();
_is.unget();
return _tok = data;
}
};
// fourth byte
//
if ( !_is.get( t ) || 0x48 != t )
{
_is.clear();
_is.unget();
_is.unget();
_is.unget();
return _tok = data;
}
return _tok;
}
public:
reader_t( std::istream& a_is ) : _is { a_is }
{
// nop
}
bool get_data( std::vector< char >& d ) // returns false on end of stream
{
d.clear();
get_token();
if ( _tok == done )
return false; // end of stream
if ( _tok != data_beg )
throw "data begin expected";
while ( get_token() == data )
d.push_back( _c );
if ( _tok != data_end )
throw "data end expected";
return true;
}
};
int main()
{
//std::ifstream is { R"(d:\temp\test.bin)" };
//if ( !is )
// return 0;
std::istringstream is{"\x1b[0H123\x1b[1H\x1b[0HABC\x1b[1H"};
reader_t r { is };
std::vector< char > v;
try
{
while ( r.get_data( v ) )
std::cout << std::string { v.begin(), v.end() } << std::endl;// process v;
}
catch ( const char* e )
{
std::cout << e;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnN0cmVhbT4KI2luY2x1ZGUgPHNzdHJlYW0+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxzdHJpbmc+CgpjbGFzcyByZWFkZXJfdAp7CiAgc3RkOjppc3RyZWFtJiBfaXM7CgogIGVudW0gdG9rZW5fdAogIHsKICAgIGRhdGFfYmVnLAogICAgZGF0YV9lbmQsCiAgICBkYXRhLAogICAgZG9uZQogIH07CgogIHRva2VuX3QgX3RvazsKICBjaGFyIF9jOwoKICB0b2tlbl90IGdldF90b2tlbigpCiAgewogICAgLy8gZmlyc3QgYnl0ZQoKICAgIC8vCiAgICBpZiAoICFfaXMuZ2V0KCBfYyApICkKICAgICAgcmV0dXJuIF90b2sgPSBkb25lOwoKICAgIC8vCiAgICBpZiAoIDB4MWIgIT0gX2MgKQogICAgICByZXR1cm4gX3RvayA9IGRhdGE7IC8vIGRhdGEKCiAgICAvLwogICAgY2hhciB0OwoKICAgIC8vIHNlY29uZCBieXRlCgogICAgLy8KICAgIGlmICggIV9pcy5nZXQoIHQgKSApCiAgICAgIHJldHVybiBfdG9rID0gZGF0YTsKICAgIGlmICggMHg1YiAhPSB0ICkgLy8gbm90IGV4cGVjdGVkIGVzY2FwZSBzZXF1ZW5jZQogICAgewogICAgICBfaXMudW5nZXQoKTsKICAgICAgcmV0dXJuIF90b2sgPSBkYXRhOwogICAgfQoKICAgIC8vIHRoaXJkIGJ5dGUKCiAgICAvLwogICAgaWYgKCAhX2lzLmdldCggdCApICkKICAgIHsKICAgICAgX2lzLmNsZWFyKCk7CiAgICAgIF9pcy51bmdldCgpOwogICAgICBfaXMudW5nZXQoKTsKICAgICAgcmV0dXJuIF90b2sgPSBkYXRhOwogICAgfQogICAgc3dpdGNoICggdCApCiAgICB7CiAgICBjYXNlIDB4MzA6CiAgICAgIF90b2sgPSBkYXRhX2JlZzsKICAgICAgYnJlYWs7CiAgICBjYXNlIDB4MzE6CiAgICAgIF90b2sgPSBkYXRhX2VuZDsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgewogICAgICBfaXMudW5nZXQoKTsKICAgICAgX2lzLnVuZ2V0KCk7CiAgICAgIF9pcy51bmdldCgpOwogICAgICByZXR1cm4gX3RvayA9IGRhdGE7CiAgICB9CiAgICB9OwoKICAgIC8vIGZvdXJ0aCBieXRlCgogICAgLy8KICAgIGlmICggIV9pcy5nZXQoIHQgKSB8fCAweDQ4ICE9IHQgKQogICAgewogICAgICBfaXMuY2xlYXIoKTsKICAgICAgX2lzLnVuZ2V0KCk7CiAgICAgIF9pcy51bmdldCgpOwogICAgICBfaXMudW5nZXQoKTsKICAgICAgcmV0dXJuIF90b2sgPSBkYXRhOwogICAgfQoKICAgIHJldHVybiBfdG9rOwogIH0KCnB1YmxpYzoKCiAgcmVhZGVyX3QoIHN0ZDo6aXN0cmVhbSYgYV9pcyApIDogX2lzIHsgYV9pcyB9CiAgewogICAgLy8gbm9wCiAgfQoKICBib29sIGdldF9kYXRhKCBzdGQ6OnZlY3RvcjwgY2hhciA+JiBkICkgLy8gcmV0dXJucyBmYWxzZSBvbiBlbmQgb2Ygc3RyZWFtCiAgewogICAgZC5jbGVhcigpOwoKICAgIGdldF90b2tlbigpOwoKICAgIGlmICggX3RvayA9PSBkb25lICkKICAgICAgcmV0dXJuIGZhbHNlOyAvLyBlbmQgb2Ygc3RyZWFtCgogICAgaWYgKCBfdG9rICE9IGRhdGFfYmVnICkKICAgICAgdGhyb3cgImRhdGEgYmVnaW4gZXhwZWN0ZWQiOwoKICAgIHdoaWxlICggZ2V0X3Rva2VuKCkgPT0gZGF0YSApCiAgICAgIGQucHVzaF9iYWNrKCBfYyApOwoKICAgIGlmICggX3RvayAhPSBkYXRhX2VuZCApCiAgICAgIHRocm93ICJkYXRhIGVuZCBleHBlY3RlZCI7CgogICAgcmV0dXJuIHRydWU7CiAgfQoKfTsKCmludCBtYWluKCkKewogIC8vc3RkOjppZnN0cmVhbSBpcyB7IFIiKGQ6XHRlbXBcdGVzdC5iaW4pIiB9OwogIC8vaWYgKCAhaXMgKQogIC8vICByZXR1cm4gMDsKCiAgc3RkOjppc3RyaW5nc3RyZWFtIGlzeyJceDFiWzBIMTIzXHgxYlsxSFx4MWJbMEhBQkNceDFiWzFIIn07CgogIHJlYWRlcl90IHIgeyBpcyB9OwogIHN0ZDo6dmVjdG9yPCBjaGFyID4gdjsKICB0cnkKICB7CiAgICB3aGlsZSAoIHIuZ2V0X2RhdGEoIHYgKSApCiAgICAgIHN0ZDo6Y291dCA8PCBzdGQ6OnN0cmluZyB7IHYuYmVnaW4oKSwgdi5lbmQoKSB9IDw8IHN0ZDo6ZW5kbDsvLyBwcm9jZXNzIHY7CiAgfQogIGNhdGNoICggY29uc3QgY2hhciogZSApCiAgewogICAgc3RkOjpjb3V0IDw8IGU7CiAgfQoKICByZXR1cm4gMDsKfQoK