27 char const SPACE(
' ' );
28 char const TAB(
'\t' );
29 char const NULLC(
'\000' );
39 str_( len_ > 0 ? new char[ len_ ] : 0 ),
50 str_( len_ > 0 ? new char[ len_ ] : 0 ),
60 len_( std::strlen( s ) ),
61 str_( len_ > 0 ? new char[ len_ ] : 0 ),
71 len_( static_cast<
size_type >( std::
max( static_cast<
int >( len_a ), 0 ) ) ),
72 str_( len_ > 0 ? new char[ len_ ] : 0 ),
82 len_( static_cast<
size_type >( std::
max( len_a, 0 ) ) ),
83 str_( len_ > 0 ? new char[ len_ ] : 0 ),
93 len_( static_cast<
size_type >( std::
max( len_a, 0l ) ) ),
94 str_( len_ > 0 ? new char[ len_ ] : 0 ),
104 len_( static_cast<
size_type >( len_a ) ),
105 str_( len_ > 0 ? new char[ len_ ] : 0 ),
115 len_( static_cast<
size_type >( len_a ) ),
116 str_( len_ > 0 ? new char[ len_ ] : 0 ),
126 len_( static_cast<
size_type >( len_a ) ),
127 str_( len_ > 0 ? new char[ len_ ] : 0 ),
135 len_( static_cast<
size_type >( len_a ) ),
136 str_( len_ > 0 ? new char[ len_ ] : 0 ),
146 str_( len_ > 0 ? new char[ len_ ] : 0 ),
153 }
else if (
len_ > 0 ) {
162 str_( len_ > 0 ? new char[ len_ ] : 0 ),
167 if (
len_ > s_len ) {
168 if ( s_len > 0 ) s.copy(
str_, s_len );
170 }
else if (
len_ > 0 ) {
179 str_( len_ > 0 ? new char[ len_ ] : 0 ),
183 size_type const s_len( std::strlen( s ) );
184 if (
len_ > s_len ) {
185 if ( s_len > 0 ) std::memcpy(
str_, s, s_len );
187 }
else if (
len_ > 0 ) {
197 str_( len_ > 0 ? new char[ len_ ] : 0 ),
208 str_( len_ > 0 ? new char[ len_ ] : 0 ),
219 len_( i <= std::
min( j, s.len_ ) ? std::
min( j, s.len_ ) - i + 1u : static_cast<
size_type >( 0 ) ),
220 str_( i <= s.len_ ? s.str_ + i - 1u : s.str_ ),
230 len_( i <= s.len_ ? s.len_ - i + 1u : static_cast<
size_type >( 0 ) ),
231 str_( i <= s.len_ ? s.str_ + i - 1u : s.str_ ),
247 }
else if (
len_ > 0 ) {
249 }
else if ( ( !
str_ ) && ( !
sub_ ) ) {
264 if (
len_ > s_len ) {
265 if ( s_len > 0 ) s.
copy(
str_, s_len );
267 }
else if (
len_ > 0 ) {
269 }
else if ( ( !
str_ ) && ( !
sub_ ) ) {
282 size_type const s_len( std::strlen( s ) );
283 if (
len_ > s_len ) {
284 if ( s_len > 0 ) std::memmove(
str_, s, s_len );
286 }
else if (
len_ > 0 ) {
288 }
else if ( ( !
str_ ) && ( !
sub_ ) ) {
304 }
else if ( ( !
str_ ) && ( !
sub_ ) ) {
306 str_ =
new char[ 1 ];
318 if ( (*
this)( i ) == s )
return true;
329 if ( (*
this)( i ) == s )
return true;
340 if ( (*
this)( i ) == s )
return true;
351 if (
str_[ i ] == c )
return true;
363 if (
str_[ i ] == s.
str_[ j ] )
return true;
374 std::string::size_type
const s_len( s.length() );
376 for (
size_type j = 0; j < s_len; ++j ) {
377 if (
str_[ i ] == s[ j ] )
return true;
388 size_type const s_len( std::strlen( s ) );
390 for (
size_type j = 0; j < s_len; ++j ) {
391 if (
str_[ i ] == s[ j ] )
return true;
403 if (
str_[ i ] == c )
return true;
417 }
else if ( exact_case ) {
418 return ( (*
this)( 1, s.
len_ ) == s );
429 size_type const s_len( std::strlen( s ) );
432 }
else if (
len_ < s_len ) {
434 }
else if ( exact_case ) {
435 return ( (*
this)( 1, s_len ) == s );
458 char const c(
str_[ i - 1 ] );
459 if ( ( c !=
SPACE ) && ( c !=
TAB ) && ( c !=
NULLC ) )
return i;
470 char const c(
str_[ i - 1 ] );
471 if ( ( c ==
SPACE ) || ( c ==
TAB ) || ( c ==
NULLC ) )
return i;
482 char const c(
str_[ i - 1 ] );
483 if ( ( c !=
SPACE ) && ( c !=
TAB ) && ( c !=
NULLC ) )
return i;
494 char const c(
str_[ i - 1 ] );
495 if ( ( c ==
SPACE ) || ( c ==
TAB ) || ( c ==
NULLC ) )
return i;
506 char const c(
str_[ i - 1 ] );
507 if ( ( c !=
SPACE ) && ( c !=
TAB ) && ( c !=
NULLC ) )
return i;
528 if ( ( s_len > 0 ) && ( s_len <=
len_ ) ) {
530 if ( (*
this)( i, i + s_len - 1 ) == s )
return i;
541 std::string::size_type
const s_len( s.length() );
542 if ( ( s_len > 0 ) && ( s_len <=
len_ ) ) {
544 if ( (*
this)( i, i + s_len - 1 ) == s )
return i;
555 size_type const s_len( std::strlen( s ) );
556 if ( ( s_len > 0 ) && ( s_len <=
len_ ) ) {
558 if ( (*
this)( i, i + s_len - 1 ) == s )
return i;
570 if (
str_[ i - 1 ] == c )
return i;
581 if ( ( s_len > 0 ) && ( s_len <=
len_ ) ) {
583 if ( (*
this)( i, i + s_len - 1 ) == s )
return i;
594 std::string::size_type
const s_len( s.length() );
595 if ( ( s_len > 0 ) && ( s_len <=
len_ ) ) {
597 if ( (*
this)( i, i + s_len - 1 ) == s )
return i;
608 size_type const s_len( std::strlen( s ) );
609 if ( ( s_len > 0 ) && ( s_len <=
len_ ) ) {
611 if ( (*
this)( i, i + s_len - 1 ) == s )
return i;
623 if (
str_[ i - 1 ] == c )
return i;
635 if (
str_[ i - 1 ] == s.
str_[ j ] )
return i;
646 std::string::size_type
const s_len( s.length() );
648 for (
size_type j = 0; j < s_len; ++j ) {
649 if (
str_[ i - 1 ] == s[ j ] )
return i;
660 size_type const s_len( std::strlen( s ) );
662 for (
size_type j = 0; j < s_len; ++j ) {
663 if (
str_[ i - 1 ] == s[ j ] )
return i;
675 if (
str_[ i - 1 ] == c )
return i;
688 if (
str_[ i - 1 ] == s.
str_[ j ] ) {
693 if ( ! found )
return i;
703 std::string::size_type
const s_len( s.length() );
706 for (
size_type j = 0; j < s_len; ++j ) {
707 if (
str_[ i - 1 ] == s[ j ] ) {
712 if ( ! found )
return i;
722 size_type const s_len( std::strlen( s ) );
725 for (
size_type j = 0; j < s_len; ++j ) {
726 if (
str_[ i - 1 ] == s[ j ] ) {
731 if ( ! found )
return i;
742 if (
str_[ i - 1 ] != c )
return i;
754 if (
str_[ i - 1 ] == s.
str_[ j ] )
return i;
765 std::string::size_type
const s_len( s.length() );
767 for (
size_type j = 0; j < s_len; ++j ) {
768 if (
str_[ i - 1 ] == s[ j ] )
return i;
779 size_type const s_len( std::strlen( s ) );
781 for (
size_type j = 0; j < s_len; ++j ) {
782 if (
str_[ i - 1 ] == s[ j ] )
return i;
794 if (
str_[ i - 1 ] == c )
return i;
807 if (
str_[ i - 1 ] == s.
str_[ j ] ) {
812 if ( ! found )
return i;
822 std::string::size_type
const s_len( s.length() );
825 for (
size_type j = 0; j < s_len; ++j ) {
826 if (
str_[ i - 1 ] == s[ j ] ) {
831 if ( ! found )
return i;
841 size_type const s_len( std::strlen( s ) );
844 for (
size_type j = 0; j < s_len; ++j ) {
845 if (
str_[ i - 1 ] == s[ j ] ) {
850 if ( ! found )
return i;
861 if (
str_[ i - 1 ] != c )
return i;
872 str_[ i ] = std::tolower(
str_[ i ] );
883 str_[ i ] = std::toupper(
str_[ i ] );
896 std::memmove(
str_,
str_ + i, len_ - i );
897 std::memset(
str_ + len_ - i,
SPACE, i );
931 std::memmove(
str_ + pad,
str_, len_t );
944 char const c(
str_[ i ] );
947 if ( j < len_ ) std::memset(
str_ + j,
SPACE, len_ - j );
978 if ( len_sub <
len_ ) {
979 if ( ib > 1 ) std::memmove(
str_,
str_ + ib - 1, len_sub );
998 if ( len_sub <
len_ ) {
999 if ( ib > 1 ) std::memmove(
str_,
str_ + ib - 1, len_sub );
1016 }
else if ( ie <
len_ ) {
1036 if ( len_sub <
len_ ) {
1037 if ( ib > 1 ) std::memmove(
str_,
str_ + ib - 1, len_sub );
1056 if ( len_sub <
len_ ) {
1057 if ( ib > 1 ) std::memmove(
str_,
str_ + ib - 1, len_sub );
1074 }
else if ( ie <
len_ ) {
1094 if ( len_sub <
len_ ) {
1095 if ( ib > 1 ) std::memmove(
str_,
str_ + ib - 1, len_sub );
1114 if ( len_sub <
len_ ) {
1115 if ( ib > 1 ) std::memmove(
str_,
str_ + ib - 1, len_sub );
1132 }
else if ( ie <
len_ ) {
1153 (*this)(
pos, std::min<size_type>( ( pos + s.length() ) - 1,
len_ ) ) = s;
1162 (*this)(
pos, std::min<size_type>( ( pos + std::strlen( s ) ) - 1,
len_ ) ) = s;
1184 delete[]
c_str_;
c_str_ =
new char[ len_trim_whitespace_ + 1 ];
1185 if ( len_trim_whitespace_ > 0 ) std::memmove(
c_str_,
str_, len_trim_whitespace_ );
1186 c_str_[ len_trim_whitespace_ ] =
'\0';
1195 assert( off <=
len_ );
1197 if ( len_copied > 0 ) std::memmove( str,
str_ + off, len_copied );
1208 if ( s.
str_[ i ] != t.
str_[ i ] )
return false;
1212 if ( t.
str_[ i ] !=
SPACE )
return false;
1216 if ( s.
str_[ i ] !=
SPACE )
return false;
1230 if ( s.
str_[ i ] != t[ i ] )
return false;
1232 if ( s.
len_ < t_len ) {
1234 if ( t[ i ] !=
SPACE )
return false;
1236 }
else if ( s.
len_ > t_len ) {
1238 if ( s.
str_[ i ] !=
SPACE )
return false;
1252 if ( s.
str_[ i ] != t[ i ] )
return false;
1254 if ( s.
len_ < t_len ) {
1256 if ( t[ i ] !=
SPACE )
return false;
1258 }
else if ( s.
len_ > t_len ) {
1260 if ( s.
str_[ i ] !=
SPACE )
return false;
1273 }
else if ( s.
str_[ 0 ] == c ) {
1274 return (
s( 2 ).is_blank() );
1287 unsigned char const s_i( s.
str_[ i ] );
1288 unsigned char const t_i( t.
str_[ i ] );
1291 }
else if ( s_i > t_i ) {
1297 unsigned char const t_i( t.
str_[ i ] );
1298 if (
SPACE < t_i ) {
1300 }
else if (
SPACE > t_i ) {
1306 unsigned char const s_i( s.
str_[ i ] );
1307 if ( s_i <
SPACE ) {
1309 }
else if ( s_i >
SPACE ) {
1324 unsigned char const s_i( s.
str_[ i ] );
1325 unsigned char const t_i( t.
str_[ i ] );
1328 }
else if ( s_i > t_i ) {
1334 unsigned char const t_i( t.
str_[ i ] );
1335 if (
SPACE < t_i ) {
1337 }
else if (
SPACE > t_i ) {
1343 unsigned char const s_i( s.
str_[ i ] );
1344 if ( s_i <
SPACE ) {
1346 }
else if ( s_i >
SPACE ) {
1362 unsigned char const s_i( s.
str_[ i ] );
1363 unsigned char const t_i( t[ i ] );
1366 }
else if ( s_i > t_i ) {
1370 if ( s.
len_ < t_len ) {
1372 unsigned char const t_i( t[ i ] );
1373 if (
SPACE < t_i ) {
1375 }
else if (
SPACE > t_i ) {
1379 }
else if ( s.
len_ > t_len ) {
1381 unsigned char const s_i( s.
str_[ i ] );
1382 if ( s_i <
SPACE ) {
1384 }
else if ( s_i >
SPACE ) {
1400 unsigned char const s_i( s.
str_[ i ] );
1401 unsigned char const t_i( t[ i ] );
1404 }
else if ( s_i > t_i ) {
1408 if ( s.
len_ < t_len ) {
1410 unsigned char const t_i( t[ i ] );
1411 if (
SPACE < t_i ) {
1413 }
else if (
SPACE > t_i ) {
1417 }
else if ( s.
len_ > t_len ) {
1419 unsigned char const s_i( s.
str_[ i ] );
1420 if ( s_i <
SPACE ) {
1422 }
else if ( s_i >
SPACE ) {
1438 unsigned char const s_i( s.
str_[ i ] );
1439 unsigned char const t_i( t[ i ] );
1442 }
else if ( s_i > t_i ) {
1446 if ( s.
len_ < t_len ) {
1448 unsigned char const t_i( t[ i ] );
1449 if (
SPACE < t_i ) {
1451 }
else if (
SPACE > t_i ) {
1455 }
else if ( s.
len_ > t_len ) {
1457 unsigned char const s_i( s.
str_[ i ] );
1458 if ( s_i <
SPACE ) {
1460 }
else if ( s_i >
SPACE ) {
1476 unsigned char const s_i( s.
str_[ i ] );
1477 unsigned char const t_i( t[ i ] );
1480 }
else if ( s_i > t_i ) {
1484 if ( s.
len_ < t_len ) {
1486 unsigned char const t_i( t[ i ] );
1487 if (
SPACE < t_i ) {
1489 }
else if (
SPACE > t_i ) {
1493 }
else if ( s.
len_ > t_len ) {
1495 unsigned char const s_i( s.
str_[ i ] );
1496 if ( s_i <
SPACE ) {
1498 }
else if ( s_i >
SPACE ) {
1586 stream >> std::setw( s.
len_ ) >> ss;
1597 char *
const buff(
new char[
s.len_ + 1 ] );
1598 stream.get( buff,
s.len_ + 1 );
1599 std::size_t
const lb( std::strlen( buff ) );
1600 std::memcpy(
s.str_, buff, lb );
1601 std::memset(
s.str_ + lb,
SPACE,
s.len_ - lb );
1613 stream.width( s.
len_ );
1658 if (
len_ > s.len_ ) {
1659 if ( s.len_ > 0 ) std::memmove(
str_, s.str_, s.len_ );
1661 }
else if (
len_ > 0 ) {
1662 std::memmove(
str_, s.str_,
len_ );
1677 }
else if (
len_ > 0 ) {
1690 if (
len_ > s_len ) {
1691 if ( s_len > 0 ) s.
copy(
str_, s_len );
1693 }
else if (
len_ > 0 ) {
1704 size_type const s_len( std::strlen( s ) );
1705 if (
len_ > s_len ) {
1706 if ( s_len > 0 ) std::memmove(
str_, s, s_len );
1708 }
else if (
len_ > 0 ) {
std::istream & operator>>(std::istream &stream, byte &b)
Stream Input.
Fstring & right_justify()
Right Justify.
Fstring & center()
Center.
size_type find_last_whitespace() const
Find Last Occurrence of a Whitespace Character.
Fstring lowercased() const
Lowercased Copy.
size_type copy(cstring str, size_type const len_a, size_type const off=0) const
Copy to a Pre-Allocated String.
DimensionExpressionMin min(Dimension const &dim1, Dimension const &dim2)
min( Dimension, Dimension )
std::istream & read(std::istream &stream, Fstring &s)
Read from Stream.
Fstring & rstrip()
Strip Space from an Fstring's Right Tail.
std::istream & getline(std::istream &stream, Fstring &s)
Get Line from Stream.
Fstring & rstrip_whitespace()
Strip Whitespace from an Fstring's Right Tail.
size_type find_whitespace() const
Find First Occurrence of a Whitespace Character.
bool operator<=(byte const &i, byte const &j)
byte <= byte
Fstring & overlay(Fstring const &s, size_type const pos=1)
Overlay an Fstring.
c_cstring c_str() const
Null-Terminated cstring Copy of the Fstring that is Owned by the Fstring.
size_type find_last(Fstring const &s) const
Find Last Occurrence of an Fstring.
Fstring & strip_whitespace()
Strip Whitespace from an Fstring's Tails.
size_type find_last_not_of(Fstring const &s) const
Find Last Occurrence of Any Character not of an Fstring.
Fsubstring & operator=(Fsubstring const &s)
Copy Assignment.
bool has_any_of(Fstring const &s) const
Has Any Character of an Fstring?
size_type len_trim() const
Length Space-Trimmed.
Fstring & compress()
Compress Out Whitespace.
Fsubstring: Fixed-Length Fortran-Compatible Substring.
size_type find_first_of(Fstring const &s) const
Find First Occurrence of Any Character of an Fstring.
c_cstring t_str() const
Whitespace-Trimmed Null-Terminated cstring Copy of the Fstring that is Owned by the Fstring...
size_type find(Fstring const &s) const
Find First Occurrence of an Fstring.
size_type find_first_not_of(Fstring const &s) const
Find First Occurrence of Any Character not of an Fstring.
std::istream & readsome(std::istream &stream, Fstring &s)
Read Available Characters from Stream.
std::string & pad(std::string &s, std::string::size_type const len)
Pad a string to a Specified Length.
bool const sub_
Substring flag.
bool has_prefix(Fstring const &s, bool const exact_case=true) const
Has a Prefix Case-Optionally?
Fstring & lstrip()
Strip Space from an Fstring's Left Tail.
size_type find_last_non_whitespace() const
Find Last Occurrence of a Non-Whitespace Character.
Fstring & operator=(Fstring const &s)
Copy Assignment.
Fsubstring tail()
Space Tail Substring.
bool has(Fstring const &s) const
Has an Fstring?
size_type find_non_whitespace() const
Find First Occurrence of a Non-Whitespace Character.
bool empty() const
Empty?
Fstring & trim_whitespace()
Trim Trailing Whitespace Replacing it with Space.
Fstring & lstrip_whitespace()
Strip Whitespace from an Fstring's Left Tail.
size_type find_last_of(Fstring const &s) const
Find Last Occurrence of Any Character of an Fstring.
size_type length() const
Length.
char const NULLC( '\000')
DimensionExpressionMax max(Dimension const &dim1, Dimension const &dim2)
max( Dimension, Dimension )
Fstring & left_justify()
Left Justify.
Fsubstring const operator()(size_type const i, size_type const j) const
Constant Substring: s( i, j )
Fstring: Fixed-Length Fortran-Compatible String.
bool operator<(byte const &i, byte const &j)
byte < byte
void init()
set global 'init_was_called' to true
Fstring()
Default Constructor.
std::ostream & operator<<(std::ostream &stream, CArray< T > const &a)
stream << CArray
Fstring & uppercase()
Uppercase.
bool operator==(byte const &i, byte const &j)
byte == byte
Fstring & lowercase()
Lowercase.
Fsubstring const head() const
Space-Free Head Constant Substring.
Fstring & strip()
Strip Space from an Fstring's Tails.
size_type trimmed_whitespace_range(size_type &b, size_type &e) const
Get Range of Whitespace-Trimmed Portion and Return its Length.
std::string const WHITESPACE(" \t\0", 3)
size_type len_trim_whitespace() const
Length Whitespace-Trimmed.