]> www.ginac.de Git - cln.git/blob - src/base/string/input/cl_st_gettoken.cc
* */*: cl_istream -> std::istream, cl_ostream -> std::ostream.
[cln.git] / src / base / string / input / cl_st_gettoken.cc
1 // operator>>.
2
3 // General includes.
4 #include "cl_sysdep.h"
5
6 // Specification.
7 #include "cln/string.h"
8
9
10 // Implementation.
11
12 #include "cln/io.h"
13 #include "cl_spushstring.h"
14 #include <ctype.h>
15
16 namespace cln {
17
18 std::istream& operator>> (std::istream& stream, cl_string& str)
19 {
20         var cl_spushstring buffer;
21         var int n = stream.width();
22         // Handling of eofp is tricky: EOF is reached when (!stream.good()) || (stream.get()==EOF).
23         int c;
24         // Skip whitespace.
25         while (stream.good()) {
26                 c = stream.get();
27                 if (c==EOF)
28                         break;
29                 if (!isspace(c)) {
30                         if (--n == 0) {
31                                 // stream.width()==1, means no characters.
32                                 stream.unget();
33                                 break;
34                         }
35                         // If stream.width()==0, n gets negative and never 0.
36                         goto nonws;
37                 }
38         }
39         goto done;
40         // Read non-whitespace.
41         while (stream.good()) {
42                 c = stream.get();
43                 if (c==EOF)
44                         break;
45                 if (isspace(c)) {
46                         stream.unget();
47                         break;
48                 }
49             nonws:
50                 buffer.push(c);
51                 if (--n == 0)
52                         break;
53         }
54     done:
55         str = buffer.contents();
56         stream.width(0);
57         return stream;
58 }
59
60 }  // namespace cln