--- /dev/null
+// cl_fgetline().
+
+// General includes.
+#include "cl_sysdep.h"
+
+// Specification.
+#include "cl_string.h"
+
+
+// Implementation.
+
+#ifdef CL_IO_IOSTREAM
+
+#include "cl_io.h"
+#include "cl_spushstring.h"
+
+#if ((defined(__sparc__) || defined(__rs6000__) || defined(__mips__)) && !defined(__GNUC__))
+// Sun C++ doesn't have istream::unget() and istream::set().
+ #define unget() putback(c)
+ #define set(x) setf(x)
+#endif
+
+const cl_string cl_fgetline (cl_istream stream, int n, char delim)
+{
+ var cl_spushstring buffer;
+ // Handling of eofp is tricky: EOF is reached when (!stream.good()) || (stream.get()==EOF).
+ while (stream.good()) {
+ var int c = stream.get();
+ if (c==EOF)
+ break; // ios::eofbit already set
+ if (c==delim)
+ break;
+ if (--n <= 0) {
+ stream.unget();
+ #if defined(__GNUG__) && (__GNUC_MINOR__ < 8)
+ stream.set(ios::failbit);
+ #else // new ANSI C++
+ stream.setstate(ios::failbit);
+ #endif
+ break;
+ }
+ buffer.push(c);
+ }
+ return buffer.contents();
+}
+
+#endif