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);