Changes in / [aae9c17:efe39bb]
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/collections/string.cfa
raae9c17 refe39bb 129 129 130 130 void ?|?( ifstream & in, string & this ) { 131 (ifstream &)(in | this); ends( in);131 in | (*this.inner); 132 132 } 133 133 134 134 ifstream & ?|?( ifstream & is, _Istream_Sstr f ) { 135 // .---------------, 136 // | | | | |...|0|0| null terminator and guard if missing 137 // `---------------' 138 enum { gwd = 128 + 1, wd = gwd - 1 }; // guard and unguard width 139 char cstr[gwd]; // read in chunks 140 bool cont = false; 141 142 _Istream_Cstr cf = { cstr, (_Istream_str_base)f }; 143 if ( ! cf.flags.rwd ) cf.wd = wd; 144 145 cstr[wd] = '\0'; // guard null terminate string 146 try { 147 is | cf; 148 } catch( cstring_length * ) { 149 cont = true; 150 } finally { 151 if ( ! cf.flags.ignore ) f.s = cstr; // ok to initialize string 152 } // try 153 for ( ; cont; ) { // overflow read ? 154 cont = false; 155 try { 156 is | cf; 157 } catch( cstring_length * ) { 158 cont = true; // continue not allowed 159 } finally { 160 if ( ! cf.flags.ignore ) f.s += cstr; // build string chunk at a time 161 } // try 162 } // for 163 return is; 135 _Istream_Rstr f2 = {f.s.inner, (_Istream_str_base)f}; 136 return is | f2; 164 137 } // ?|? 165 138 -
libcfa/src/collections/string_res.cfa
raae9c17 refe39bb 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
raae9c17 refe39bb 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
raae9c17 refe39bb 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
raae9c17 refe39bb 5 5 abcyyy 6 6 aaaaaaaaxxxxxxxxaabbccbbdddwwwbbbbbbbbwwwwwwwwaaaaaaaawwwwwwww 7 abc 8 abc 9 xx 10 abcxxx 11 abcyyy 12 aaaaaaaaxxxxxxxxaabbccbbdddwwwbbbbbbbbwwwwwwwwaaaaaaaawwwwwwww -
tests/collections/string-istream-manip.cfa
raae9c17 refe39bb 2 2 #include <fstream.hfa> 3 3 #include <collections/string.hfa> 4 #include <collections/string_res.hfa> 4 5 5 6 int main() { … … 11 12 sin | s; sout | "2" | s; 12 13 sin | ignore( s ); sout | "3" | s; 13 sin | wdi( 8, s ); sout | "4" | s; 14 sin | wdi( 8, s ); sout | "4" | s; 15 sin | ignore( wdi( 8, s ) ); sout | "5" | s; 16 17 sin | incl( "abc", s ); sout | "6" | s; 18 sin | excl( "abc", s ); sout | "7" | s; 19 sin | ignore( incl( "abc", s ) ); sout | "8" | s; 20 sin | ignore( excl( "abc", s ) ); sout | "9" | s; 21 sin | incl( "abc", wdi( 8, s ) ); sout | "10" | s; 22 sin | excl( "abc", wdi( 8, s ) ); sout | "11" | s; 23 sin | ignore( incl( "abc", wdi( 8, s ) ) ); sout | "12" | s; 24 sin | ignore( excl( "abc", wdi( 8, s ) ) ); sout | "13" | s; 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; 14 33 sin | ignore( wdi( 8, s ) ); sout | "5" | s; 15 34
Note: See TracChangeset
for help on using the changeset viewer.