Changeset ff56dd2e
- Timestamp:
- Sep 5, 2023, 4:08:32 PM (16 months ago)
- Branches:
- master
- Children:
- 737988b
- Parents:
- 3c7e3c4
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/collections/string_res.cfa
r3c7e3c4 rff56dd2e 245 245 s = temp; 246 246 return in; 247 } 248 249 void ?|?( ifstream & in, string_res & this ) { 250 (ifstream &)(in | this); ends( in ); 251 } 252 253 ifstream & ?|?( ifstream & is, _Istream_Rstr f ) { 254 // .---------------, 255 // | | | | |...|0|0| null terminator and guard if missing 256 // `---------------' 257 enum { gwd = 128 + 1, wd = gwd - 1 }; // guard and unguard width 258 char cstr[gwd]; // read in chunks 259 bool cont = false; 260 261 _Istream_Cstr cf = { cstr, (_Istream_str_base)f }; 262 if ( ! cf.flags.rwd ) cf.wd = wd; 263 264 cstr[wd] = '\0'; // guard null terminate string 265 try { 266 is | cf; 267 } catch( cstring_length * ) { 268 cont = true; 269 } finally { 270 if ( ! cf.flags.ignore ) *(f.s) = cstr; // ok to initialize string 271 } // try 272 for ( ; cont; ) { // overflow read ? 273 cont = false; 274 try { 275 is | cf; 276 } catch( cstring_length * ) { 277 cont = true; // continue not allowed 278 } finally { 279 if ( ! cf.flags.ignore ) *(f.s) += cstr; // build string chunk at a time 280 } // try 281 } // for 282 return is; 283 } // ?|? 284 285 void ?|?( ifstream & in, _Istream_Rstr f ) { 286 (ifstream &)(in | f); ends( in ); 247 287 } 248 288 -
libcfa/src/collections/string_res.hfa
r3c7e3c4 rff56dd2e 102 102 void ?|?(ofstream &out, const string_res &s); 103 103 ifstream & ?|?(ifstream &in, string_res &s); 104 void ?|?( ifstream & in, string_res & this ); 105 106 struct _Istream_Rstr { 107 string_res * s; 108 inline _Istream_str_base; 109 }; // _Istream_Rstr 110 111 static inline { 112 // read width does not include null terminator 113 _Istream_Rstr wdi( unsigned int rwd, string_res & s ) { return (_Istream_Rstr)@{ &s, {{0p}, rwd, {.flags.rwd : true}} }; } 114 _Istream_Rstr getline( string_res & s, const char delimiter = '\n' ) { 115 return (_Istream_Rstr)@{ &s, {{.delimiter : { delimiter, '\0' } }, -1, {.flags.delimiter : true, .flags.inex : true}} }; 116 } 117 _Istream_Rstr & getline( _Istream_Rstr & fmt, const char delimiter = '\n' ) { 118 fmt.delimiter[0] = delimiter; fmt.delimiter[1] = '\0'; fmt.flags.delimiter = true; fmt.flags.inex = true; return fmt; 119 } 120 _Istream_Rstr incl( const char scanset[], string_res & s ) { return (_Istream_Rstr)@{ &s, {{scanset}, -1, {.flags.inex : false}} }; } 121 _Istream_Rstr & incl( const char scanset[], _Istream_Rstr & fmt ) { fmt.scanset = scanset; fmt.flags.inex = false; return fmt; } 122 _Istream_Rstr excl( const char scanset[], string_res & s ) { return (_Istream_Rstr)@{ &s, {{scanset}, -1, {.flags.inex : true}} }; } 123 _Istream_Rstr & excl( const char scanset[], _Istream_Rstr & fmt ) { fmt.scanset = scanset; fmt.flags.inex = true; return fmt; } 124 _Istream_Rstr ignore( string_res & s ) { return (_Istream_Rstr)@{ &s, {{0p}, -1, {.flags.ignore : true}} }; } 125 _Istream_Rstr & ignore( _Istream_Rstr & fmt ) { fmt.flags.ignore = true; return fmt; } 126 } // distribution 127 ifstream & ?|?( ifstream & is, _Istream_Rstr f ); 128 void ?|?( ifstream & is, _Istream_Rstr t ); 104 129 105 130 // Concatenation -
tests/collections/.expect/string-istream-manip.txt
r3c7e3c4 rff56dd2e 12 12 12 wwwwwwww 13 13 13 wwwwwwww 14 1 yyyyyyyyyyyyyyyyyyyy 15 2 abcxxx 16 3 abcxxx 17 4 aaaaaaaa 18 5 aaaaaaaa 19 6 aabbccbb 20 7 dddwww 21 8 dddwww 22 9 dddwww 23 10 aaaaaaaa 24 11 wwwwwwww 25 12 wwwwwwww 26 13 wwwwwwww -
tests/collections/.in/string-istream-manip.txt
r3c7e3c4 rff56dd2e 5 5 abcyyy 6 6 aaaaaaaaxxxxxxxxaabbccbbdddwwwbbbbbbbbwwwwwwwwaaaaaaaawwwwwwww 7 abc 8 abc 9 xx 10 abcxxx 11 abcyyy 12 aaaaaaaaxxxxxxxxaabbccbbdddwwwbbbbbbbbwwwwwwwwaaaaaaaawwwwwwww -
tests/collections/string-istream-manip.cfa
r3c7e3c4 rff56dd2e 2 2 #include <fstream.hfa> 3 3 #include <collections/string.hfa> 4 #include <collections/string_res.hfa> 4 5 5 6 int main() { … … 23 24 sin | ignore( excl( "abc", wdi( 8, s ) ) ); sout | "13" | s; 24 25 } 26 { 27 string_res s = "yyyyyyyyyyyyyyyyyyyy"; 28 char sk[] = "abc"; 29 sin | "abc " | skip( sk ) | skip( 5 ); sout | "1" | s; 30 sin | s; sout | "2" | s; 31 sin | ignore( s ); sout | "3" | s; 32 sin | wdi( 8, s ); sout | "4" | s; 33 sin | ignore( wdi( 8, s ) ); sout | "5" | s; 34 35 sin | incl( "abc", s ); sout | "6" | s; 36 sin | excl( "abc", s ); sout | "7" | s; 37 sin | ignore( incl( "abc", s ) ); sout | "8" | s; 38 sin | ignore( excl( "abc", s ) ); sout | "9" | s; 39 sin | incl( "abc", wdi( 8, s ) ); sout | "10" | s; 40 sin | excl( "abc", wdi( 8, s ) ); sout | "11" | s; 41 sin | ignore( incl( "abc", wdi( 8, s ) ) ); sout | "12" | s; 42 sin | ignore( excl( "abc", wdi( 8, s ) ) ); sout | "13" | s; 43 } 25 44 }
Note: See TracChangeset
for help on using the changeset viewer.