source: XMLIO_V2/external/src/POCO/Foundation/LineEndingConverter.cpp @ 80

Last change on this file since 80 was 80, checked in by ymipsl, 14 years ago

ajout lib externe

  • Property svn:eol-style set to native
File size: 4.6 KB
Line 
1//
2// LineEndingConverter.cpp
3//
4// $Id: //poco/1.3/Foundation/src/LineEndingConverter.cpp#2 $
5//
6// Library: Foundation
7// Package: Streams
8// Module:  LineEndingConverter
9//
10// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
11// and Contributors.
12//
13// Permission is hereby granted, free of charge, to any person or organization
14// obtaining a copy of the software and accompanying documentation covered by
15// this license (the "Software") to use, reproduce, display, distribute,
16// execute, and transmit the Software, and to prepare derivative works of the
17// Software, and to permit third-parties to whom the Software is furnished to
18// do so, all subject to the following:
19//
20// The copyright notices in the Software and this entire statement, including
21// the above license grant, this restriction and the following disclaimer,
22// must be included in all copies of the Software, in whole or in part, and
23// all derivative works of the Software, unless such copies or derivative
24// works are solely in the form of machine-executable object code generated by
25// a source language processor.
26//
27// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
28// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
29// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
30// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
31// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
32// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
33// DEALINGS IN THE SOFTWARE.
34//
35
36
37#include <Poco/LineEndingConverter.h>
38
39
40namespace Poco {
41
42
43#if defined(_WIN32)
44#define POCO_DEFAULT_NEWLINE_CHARS "\r\n"
45#else
46#define POCO_DEFAULT_NEWLINE_CHARS "\n"
47#endif
48
49
50const std::string LineEnding::NEWLINE_DEFAULT(POCO_DEFAULT_NEWLINE_CHARS);
51const std::string LineEnding::NEWLINE_CR("\r");
52const std::string LineEnding::NEWLINE_CRLF("\r\n");
53const std::string LineEnding::NEWLINE_LF("\n");
54
55
56LineEndingConverterStreamBuf::LineEndingConverterStreamBuf(std::istream& istr): 
57        _pIstr(&istr), 
58        _pOstr(0), 
59        _newLine(LineEnding::NEWLINE_DEFAULT),
60        _lastChar(0)
61{
62        _it = _newLine.end();
63}
64
65
66LineEndingConverterStreamBuf::LineEndingConverterStreamBuf(std::ostream& ostr): 
67        _pIstr(0), 
68        _pOstr(&ostr), 
69        _newLine(LineEnding::NEWLINE_DEFAULT),
70        _lastChar(0)
71{
72        _it = _newLine.end();
73}
74
75
76LineEndingConverterStreamBuf::~LineEndingConverterStreamBuf()
77{
78}
79
80
81void LineEndingConverterStreamBuf::setNewLine(const std::string& newLineCharacters)
82{
83        _newLine = newLineCharacters;
84        _it      = _newLine.end();
85}
86
87
88const std::string& LineEndingConverterStreamBuf::getNewLine() const
89{
90        return _newLine;
91}
92
93
94int LineEndingConverterStreamBuf::readFromDevice()
95{
96        poco_assert_dbg (_pIstr);
97
98        while (_it == _newLine.end())
99        {
100                int c = _pIstr->get();
101                if (c == '\r')
102                {
103                        if (_pIstr->peek() == '\n') _pIstr->get();
104                        _it = _newLine.begin();
105                }
106                else if (c == '\n')
107                {
108                        _it = _newLine.begin();
109                }
110                else return c;
111        }
112        return *_it++;
113}
114
115
116int LineEndingConverterStreamBuf::writeToDevice(char c)
117{
118        poco_assert_dbg (_pOstr);
119
120        if (c == '\r' || (c == '\n' && _lastChar != '\r'))
121                _pOstr->write(_newLine.data(), (std::streamsize) _newLine.length());
122        if (c != '\n' && c != '\r')
123                _pOstr->put(c);
124        _lastChar = c;
125        return charToInt(c);
126}
127
128
129LineEndingConverterIOS::LineEndingConverterIOS(std::istream& istr): _buf(istr)
130{
131        poco_ios_init(&_buf);
132}
133
134
135LineEndingConverterIOS::LineEndingConverterIOS(std::ostream& ostr): _buf(ostr)
136{
137        poco_ios_init(&_buf);
138}
139
140
141LineEndingConverterIOS::~LineEndingConverterIOS()
142{
143}
144
145
146void LineEndingConverterIOS::setNewLine(const std::string& newLineCharacters)
147{
148        _buf.setNewLine(newLineCharacters);
149}
150
151
152const std::string& LineEndingConverterIOS::getNewLine() const
153{
154        return _buf.getNewLine();
155}
156
157
158LineEndingConverterStreamBuf* LineEndingConverterIOS::rdbuf()
159{
160        return &_buf;
161}
162
163
164InputLineEndingConverter::InputLineEndingConverter(std::istream& istr): 
165        LineEndingConverterIOS(istr), 
166        std::istream(&_buf)
167{
168}
169
170
171InputLineEndingConverter::InputLineEndingConverter(std::istream& istr, const std::string& newLineCharacters): 
172        LineEndingConverterIOS(istr), 
173        std::istream(&_buf)
174{
175        setNewLine(newLineCharacters);
176}
177
178
179InputLineEndingConverter::~InputLineEndingConverter()
180{
181}
182
183
184OutputLineEndingConverter::OutputLineEndingConverter(std::ostream& ostr): 
185        LineEndingConverterIOS(ostr), 
186        std::ostream(&_buf)
187{
188}
189
190
191OutputLineEndingConverter::OutputLineEndingConverter(std::ostream& ostr, const std::string& newLineCharacters): 
192        LineEndingConverterIOS(ostr), 
193        std::ostream(&_buf)
194{
195        setNewLine(newLineCharacters);
196}
197
198
199OutputLineEndingConverter::~OutputLineEndingConverter()
200{
201}
202
203
204} // namespace Poco
Note: See TracBrowser for help on using the repository browser.