// // This software may only be used by you under license from the // University of Notre Dame. A copy of the University of Notre Dame's // Source Code Agreement is available at the inilib Internet website // having the URL: If you // received this software without first entering into a license with the // University of Notre Dame, you have an infringing copy of this software // and cannot use it without violating the University of Notre Dame's // intellectual property rights. // // $Id: ini_getline.h,v 1.3 2001/04/18 22:02:09 jsquyres Exp $ // // FUNCTION: Replacement for std::getline(std::istream&, // std::string&), which is broken in some releases of the Sun Workshop // 5.0 compilers. This is only used when the getline in std::string // is broken. // #ifndef INI_GETLINE_H_ #define INI_GETLINE_H_ // Short-circuit if not needed... #if INILIB_HAVE_BROKEN_GETLINE #define INILIB_GETLINE INILIB_getline #include #include #include namespace INI { inline std::iostream& INILIB_getline(std::iostream &is, std::string &str, char delim) { // clear the string and all... str.resize(0); int ch; int count = 0; while(1) { ch = is.get(); if (ch == EOF) { if (count == 0) is.setstate(std::ios::failbit|std::ios::eofbit); else is.setstate(std::ios::eofbit); break; } ++count; if (ch == delim) break; str += ch; // do we have space for another char? if not, we need to fail... if (str.length() == str.npos - 1) { is.setstate(std::ios::failbit); break; } } return is; } } #else // #if INILIB_HAVE_BROKEN_GETLINE // Otherwise, the compiler-provided std::getline is ok #define INILIB_GETLINE getline #endif // #if INILIB_HAVE_BROKEN_GETLINE #endif // #ifndef INI_GETLINE_H_