@@ -27,13 +27,13 @@ namespace nodepp { namespace generator { namespace file {
2727 if ( !fd->is_available () ) { coEnd; } r=fd->get_range ();
2828 if ( r[1 ] != 0 ){ auto pos=fd->pos (); d=min ( r[1 ]-r[0 ], (len_t )size );
2929 if ( pos < r[0 ] ){ fd->del_borrow (); fd->pos ( r[0 ] ); }
30- elif ( pos >=r[1 ] ){ fd-> close (); coEnd; }} else {
30+ elif ( pos >=r[1 ] ){ coEnd; }} else {
3131 d = (len_t ) min ( fd->get_buffer_size (), size );
3232 }
3333
3434 if ( fd->get_borrow ().empty () ){
3535 coWait ((state=fd->_read ( fd->get_buffer_data (), fd->get_buffer_size () ))==-2 );
36- if ( state <= 0 ) { fd-> close (); coEnd; } else {
36+ if ( state <= 0 ) { coEnd; } else {
3737 fd->set_borrow ( string_t ( fd->get_buffer_data (), state ) );
3838 }}
3939
@@ -54,95 +54,116 @@ namespace nodepp { namespace generator { namespace file {
5454 if (!fd->is_available () || msg.empty () ){ coEnd; }
5555
5656 do { coWait ((state=fd->_write ( msg.data ()+data, msg.size ()-data ))==-2 );
57- if ( state<=0 ){ fd-> close () ; coEnd; } else {
57+ if ( state<=0 ){ coEnd; } else {
5858 data = min ( data + state, msg.size () );
5959 } } while ( data < msg.size () );
6060
6161 coFinish }};
6262
6363 /* ─······································································─*/
6464
65- GENERATOR ( until ){
65+ GENERATOR ( split ){
6666 protected: ulong pos ; file::read _read;
67- public: ulong state; string_t data ;
67+ public: ulong state; string_t data;
6868
6969 template < class T > coEmit ( T* fd, string_t ch ){
7070 coBegin; state=0 ; pos=0 ; data.clear ();
7171
72- coWait ( _read (fd) ==1 );
73- if ( _read.state <=0 )
74- { state = data.size (); coEnd; }
75- fd->set_borrow ( _read.data );
72+ do { auto &bff = fd->get_borrow (); if ( !bff.empty () ){
7673
77- do { for ( auto x: _read. data ){ ++state;
74+ do { for ( auto &x:bff ){ ++state;
7875 if ( ch[pos] ==x ){ ++pos; } else { pos=0 ; }
7976 if ( ch.size ()==pos ){ break ; } }
8077 } while (0 );
8178
82- if ( memcmp ( _read.data .get (), ch.get (), ch.size () )==0 ){
83- auto &x = fd->get_borrow ();
84- data= x.slice ( 0 , ch.size () );
85- /* -*/ x.ptr ().slice ( ch.size (), (ulong) -1 );
79+ if ( memcmp ( bff.get (), ch.get (), ch.size () )==0 ){
80+ data= bff.slice ( 0 , ch.size () );
8681 } elif ( state > pos ) {
87- auto &x = fd->get_borrow ();
88- data= x.slice ( 0 , state - pos );
89- /* -*/ x.ptr ().slice ( state - pos, (ulong) -1 );
82+ data= bff.slice ( 0 , state - pos );
9083 } else {
91- auto &x = fd->get_borrow ();
92- data= x.slice ( 0 , state );
93- /* -*/ x.ptr ().slice ( state, (ulong) -1 );
94- }
84+ data= bff.slice ( 0 , state );
85+ }
9586
96- state = data.size ();
87+ fd->get_borrow ().ptr ().slice ( data.size (), (ulong) -1 );
88+ state = data.size ();
89+
90+ return -1 ; }} while (0 ); coNext;
9791
98- coFinish }
92+ coWait ( _read ( fd )==1 );
93+ if ( _read.state <=0 ){ state=0 ; coEnd; }
94+ fd->set_borrow ( _read.data ); coGoto (0 );
9995
100- template < class T > coEmit ( T* fd, char ch ){
101- coBegin; data.clear (); coYield (1 ); state=0 ;
96+ coFinish }};
10297
103- coWait ( _read (fd) ==1 );
104- if ( _read.state <=0 )
105- { state = data.size (); coEnd; }
106- fd->set_borrow ( _read.data );
98+ /* ─······································································─*/
10799
108- do { for ( auto x: _read. data ){ ++state;
109- if ( ch ==x ){ break ; } continue ; }
110- } while ( 0 );
100+ GENERATOR ( until ){
101+ protected: string_t borrow; file::read _read;
102+ public: string_t data ; ulong state;
111103
112- do { auto &x = fd->get_borrow ();
113- data += x.slice ( 0 , state );
114- /* ---*/ x.ptr ().slice ( state, (ulong) -1 );
115- state = data.size ();
116- } while (0 );
104+ template < class T > coEmit ( T* fd, string_t ch ){
105+ coBegin data.clear (); state = 0UL ;
106+
107+ do { /* ----------------*/ auto &bff = fd->get_borrow ();
108+ if ( !bff.empty () ){ do { auto pos = bff.find ( ch );
109+
110+ if ( pos.null () ){
111+ if ( bff.size () > NODEPP_UNBFF_SIZE ){
112+ data = type::move ( fd->get_borrow () );
113+ state= data.size ();
114+ return -1 ; } break ; }
115+
116+ data = bff.slice ( 0 , pos[0 ] );
117+ state= data.size ();
118+
119+ fd->get_borrow ().ptr ().slice ( pos[1 ], (ulong) -1 );
120+
121+ return state==0 ? 1 : -1 ; } while (0 ); }
122+
123+ borrow = type::move ( fd->get_borrow () );
124+
125+ } while (0 ); coNext;
117126
118- if ( data[ data.size ()-1 ] == ch ){ coEnd; }
127+ coWait ( _read ( fd )==1 ); if ( _read.state <=0 ){
128+ data = borrow; state = data.size (); coEnd;
129+ } fd->set_borrow ( borrow+_read.data ); coGoto (0 );
119130
120- coGoto ( 1 ) ; coFinish }};
131+ coFinish }};
121132
122133 /* ─······································································─*/
123134
124135 GENERATOR ( line ){
125- protected: file::read _read;
126- public: ulong state; string_t data ;
136+ protected: string_t borrow; file::read _read;
137+ public: string_t data ; ulong state ;
127138
128139 template < class T > coEmit ( T* fd ){
129- coBegin data.clear (); coYield ( 1 ); state= 0 ;
140+ coBegin data.clear (); state = 0UL ;
130141
131- coWait ( _read ( fd )==1 );
132- if ( _read.state <=0 ){ state = data.size (); coEnd; }
142+ do { /* ----------------*/ auto &bff = fd->get_borrow ();
143+ if ( !bff.empty () ){ do { auto pos = bff.find (' \n ' );
144+
145+ if ( pos.null () ){
146+ if ( bff.size () > NODEPP_UNBFF_SIZE ){
147+ data = type::move ( fd->get_borrow () );
148+ state= data.size ();
149+ return -1 ; } break ; }
133150
134- fd->set_borrow (_read.data );
151+ data = bff.slice ( 0 , pos[0 ] );
152+ state= data.size ();
135153
136- do { for ( auto x: _read.data ){ ++state;
137- if (' \n ' ==x ){ break ; } continue ; }
138- } while (0 );
154+ fd->get_borrow ().ptr ().slice ( pos[1 ], (ulong) -1 );
139155
140- data +=fd->get_borrow ().splice ( 0 , state );
141- state =data.size ();
142-
143- if ( data[data.size ()-1 ] == ' \n ' ){ coEnd; }
156+ return state==0 ? 1 : -1 ; } while (0 ); }
157+
158+ borrow = type::move ( fd->get_borrow () );
159+
160+ } while (0 ); coNext;
144161
145- coGoto (1 ) ; coFinish }};
162+ coWait ( _read ( fd )==1 ); if ( _read.state <=0 ){
163+ data = borrow; state = data.size (); coEnd;
164+ } fd->set_borrow ( borrow+_read.data ); coGoto (0 );
165+
166+ coFinish }};
146167
147168}}}
148169#undef NODEPP_GENERATOR
@@ -234,6 +255,50 @@ namespace nodepp { namespace generator { namespace stream {
234255
235256 /* ─······································································─*/
236257
258+ GENERATOR ( split ){
259+ protected:
260+
261+ file::write _write;
262+ file::split _read ;
263+
264+ public:
265+
266+ template < class T , class U >
267+ coEmit ( const T& inp, const U& val ){
268+ coBegin
269+
270+ inp.onPipe .emit (); inp.resume ();
271+
272+ while ( inp.is_available () ){
273+ coWait ( _read (&inp,val)==1 ); if ( _read.state <=0 ){ break ; }
274+ inp.onData .emit (_read.data );
275+ }
276+
277+ inp.close ();
278+
279+ coFinish }
280+
281+ template < class T , class V , class U >
282+ coEmit ( const T& inp, const V& out, const U& val ){
283+ coBegin
284+
285+ inp.onPipe .emit (); inp.resume ();
286+ out.onPipe .emit (); out.resume ();
287+
288+ while ( inp.is_available () && out.is_available () ){
289+ coWait ( _read (&inp,val)==1 ); /* --*/ if ( _read .state <=0 ){ break ; }
290+ coWait ( _write (&out,_read.data )==1 ); if ( _write.state <=0 ){ break ; }
291+ inp.onData .emit (_read.data );
292+ }
293+
294+ inp.close (); out.close ();
295+
296+ coFinish }
297+
298+ };
299+
300+ /* ─······································································─*/
301+
237302 GENERATOR ( until ){
238303 protected:
239304
0 commit comments