fork(1) download
  1. #include <iostream>
  2. #include <fstream>
  3. #include <sstream>
  4. #include <vector>
  5. #include <string>
  6.  
  7. class reader_t
  8. {
  9. std::istream& _is;
  10.  
  11. enum token_t
  12. {
  13. data_beg,
  14. data_end,
  15. data,
  16. done
  17. };
  18.  
  19. token_t _tok;
  20. char _c;
  21.  
  22. token_t get_token()
  23. {
  24. // first byte
  25.  
  26. //
  27. if ( !_is.get( _c ) )
  28. return _tok = done;
  29.  
  30. //
  31. if ( 0x1b != _c )
  32. return _tok = data; // data
  33.  
  34. //
  35. char t;
  36.  
  37. // second byte
  38.  
  39. //
  40. if ( !_is.get( t ) )
  41. return _tok = data;
  42. if ( 0x5b != t ) // not expected escape sequence
  43. {
  44. _is.unget();
  45. return _tok = data;
  46. }
  47.  
  48. // third byte
  49.  
  50. //
  51. if ( !_is.get( t ) )
  52. {
  53. _is.clear();
  54. _is.unget();
  55. _is.unget();
  56. return _tok = data;
  57. }
  58. switch ( t )
  59. {
  60. case 0x30:
  61. _tok = data_beg;
  62. break;
  63. case 0x31:
  64. _tok = data_end;
  65. break;
  66. default:
  67. {
  68. _is.unget();
  69. _is.unget();
  70. _is.unget();
  71. return _tok = data;
  72. }
  73. };
  74.  
  75. // fourth byte
  76.  
  77. //
  78. if ( !_is.get( t ) || 0x48 != t )
  79. {
  80. _is.clear();
  81. _is.unget();
  82. _is.unget();
  83. _is.unget();
  84. return _tok = data;
  85. }
  86.  
  87. return _tok;
  88. }
  89.  
  90. public:
  91.  
  92. reader_t( std::istream& a_is ) : _is { a_is }
  93. {
  94. // nop
  95. }
  96.  
  97. bool get_data( std::vector< char >& d ) // returns false on end of stream
  98. {
  99. d.clear();
  100.  
  101. get_token();
  102.  
  103. if ( _tok == done )
  104. return false; // end of stream
  105.  
  106. if ( _tok != data_beg )
  107. throw "data begin expected";
  108.  
  109. while ( get_token() == data )
  110. d.push_back( _c );
  111.  
  112. if ( _tok != data_end )
  113. throw "data end expected";
  114.  
  115. return true;
  116. }
  117.  
  118. };
  119.  
  120. int main()
  121. {
  122. //std::ifstream is { R"(d:\temp\test.bin)" };
  123. //if ( !is )
  124. // return 0;
  125.  
  126. std::istringstream is{"\x1b[0H123\x1b[1H\x1b[0HABC\x1b[1H"};
  127.  
  128. reader_t r { is };
  129. std::vector< char > v;
  130. try
  131. {
  132. while ( r.get_data( v ) )
  133. std::cout << std::string { v.begin(), v.end() } << std::endl;// process v;
  134. }
  135. catch ( const char* e )
  136. {
  137. std::cout << e;
  138. }
  139.  
  140. return 0;
  141. }
  142.  
  143.  
Success #stdin #stdout 0s 4324KB
stdin
Standard input is empty
stdout
123
ABC