NOTE:
These are a little sketchy...I'll fill in details 'soon'.
const String & String::operator>>(long & data) const
{
str_to_long(string, data, translate_position);
return *this;
}
const String & String::operator>>(long & data) const
{
long remember_position = translate_position;
str_to_long(string, data, translate_position);
clear((translate_position==remember_position)
?(failbit)
:((translate_position > length)
?(eosbit)
:(goodbit)));
return *this;
}
const String & String::operator>>(long & data) const
{
long remember_position = translate_position;
if (good())
{
str_to_long(string, data, translate_position);
clear((translate_position==remember_position)
?(failbit)
:((translate_position > length)
?(eosbit)
:(goodbit)));
}
return *this;
}
const String & String::operator>>(long & data) const
{
long remember_position;
skipws();
remember_position = translate_position;
if (good())
{
str_to_long(string, data, translate_position);
clear((translate_position==remember_position)
?(failbit)
:((translate_position > length)
?(eosbit)
:(goodbit)));
}
return *this;
}
const String & String::operator>>(short & data) const
{
long remember_position = translate_position, test_data;
*this >> test_data;
if (good())
{
if (test_data > SHRT_MAX || test_data < SHRT_MIN)
{
seekg(remember_position);
clear(failbit);
}
else
{
data = test_data;
clear((translate_position==remember_position)
?(failbit)
:((translate_position > length)
?(eosbit)
:(goodbit)));
}
}
return *this;
}
const String & String::operator>>(short & data) const
{
long remember_position = translate_position, test_data;
*this >> test_data;
if (good())
{
if (test_data > SHRT_MAX || test_data < SHRT_MIN)
{
seekg(remember_position);
clear(failbit);
}
else
{
data = test_data;
}
}
return *this;
}
const String & String::operator>>(short & data) const
{
long remember_position, test_data;
skipws();
remember_position = translate_position;
*this >> test_data;
if (good())
{
if (test_data > SHRT_MAX || test_data < SHRT_MIN)
{
seekg(remember_position);
clear(failbit);
}
else
{
data = test_data;
}
}
return *this;
}
const String & String::operator>>(String & data) const
{
long remember_position;
if (good())
{
skipws();
remember_position = translate_position;
while (!isspace(string[translate_position]) &&
(string[translate_position] != EOS))
{
translate_position++;
}
data.destroy();
data.alloc_val(translate_position-remember_position);
data.copy_val(string+remember_position);
clear((translate_position > length) ? (eosbit) : (goodbit));
}
return *this;
}
long String::getline(String & data,
const String & stop_at_any = String('\n')) const
{
long remember_position = translate_position;
if (good())
{ // note this use of our find operator
while (((string[translate_position] ^ stop_at_any) == -1) &&
(string[translate_position] != EOS))
{
translate_position++;
}
data.alloc_val(translate_position-remember_position);
data.copy_val(string+remember_position);
clear((translate_position > length) ? (eosbit) : (goodbit));
}
return data.length;
}
return (remember_position == translate_position) ? (0) : (data.length);