Added iostr::EachLine: Simple lineparser. Traverse each line in a file.
[platform/upstream/libzypp.git] / zypp / base / IOStream.cc
1 /*---------------------------------------------------------------------\
2 |                          ____ _   __ __ ___                          |
3 |                         |__  / \ / / . \ . \                         |
4 |                           / / \ V /|  _/  _/                         |
5 |                          / /__ | | | | | |                           |
6 |                         /_____||_| |_| |_|                           |
7 |                                                                      |
8 \---------------------------------------------------------------------*/
9 /** \file       zypp/base/IOStream.cc
10  *
11 */
12 #include <iostream>
13 //#include "zypp/base/Logger.h"
14
15 #include "zypp/base/IOStream.h"
16
17 using std::endl;
18
19 ///////////////////////////////////////////////////////////////////
20 namespace zypp
21 { /////////////////////////////////////////////////////////////////
22   ///////////////////////////////////////////////////////////////////
23   namespace iostr
24   { /////////////////////////////////////////////////////////////////
25
26     /******************************************************************
27      **
28      ** FUNCTION NAME : getline
29      ** FUNCTION TYPE : std::string
30      */
31     std::string getline( std::istream & str )
32     {
33       static const unsigned tmpBuffLen = 1024;
34       static char           tmpBuff[tmpBuffLen];
35       std::string ret;
36       do {
37         str.clear();
38         str.getline( tmpBuff, tmpBuffLen ); // always writes '\0' terminated
39         ret += tmpBuff;
40       } while( str.rdstate() == std::ios::failbit );
41
42       return ret;
43     }
44
45     ///////////////////////////////////////////////////////////////////
46     //
47     //  CLASS NAME : EachLine
48     //
49     ///////////////////////////////////////////////////////////////////
50
51     ///////////////////////////////////////////////////////////////////
52     //
53     //  METHOD NAME : EachLine::EachLine
54     //  METHOD TYPE : Ctor
55     //
56     EachLine::EachLine( std::istream & str_r )
57       : _str( str_r )
58       , _lineNo( 0 )
59       , _valid( true )
60     {
61       next();
62     }
63
64     ///////////////////////////////////////////////////////////////////
65     //
66     //  METHOD NAME : EachLine::next
67     //  METHOD TYPE : bool
68     //
69     bool EachLine::next()
70     {
71       if ( ! _valid )
72       {
73         return false;
74       }
75
76       if ( ! _str ) // usg: saw EOF in previous read
77       {
78         _line.clear();
79         return(_valid = false);
80       }
81
82       _line = iostr::getline( _str );
83       if ( _str.fail() || _str.bad() )
84       {
85         _line.clear();
86         return(_valid = false);
87       }
88       ++_lineNo;
89       return(_valid = true);
90     }
91
92     /////////////////////////////////////////////////////////////////
93   } // namespace iostr
94   ///////////////////////////////////////////////////////////////////
95   /////////////////////////////////////////////////////////////////
96 } // namespace zypp
97 ///////////////////////////////////////////////////////////////////