root/OpenSceneGraph/trunk/src/osgDB/FieldReader.cpp @ 13041

Revision 13041, 8.2 kB (checked in by robert, 3 years ago)

Ran script to remove trailing spaces and tabs

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
2 *
3 * This library is open source and may be redistributed and/or modified under
4 * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
5 * (at your option) any later version.  The full license is in LICENSE file
6 * included with this distribution, and on the openscenegraph.org website.
7 *
8 * This library is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 * OpenSceneGraph Public License for more details.
12*/
13#include <osgDB/Input>
14#include <istream>
15
16#include <stdio.h>
17
18using namespace osgDB;
19
20FieldReader::FieldReader()
21{
22    _init();
23}
24
25
26FieldReader::FieldReader(const FieldReader& ic)
27{
28    _copy(ic);
29}
30
31
32FieldReader::~FieldReader()
33{
34    _free();
35}
36
37
38FieldReader& FieldReader::operator = (const FieldReader& ic)
39{
40    if (this==&ic) return *this;
41    _free();
42    _copy(ic);
43    return *this;
44}
45
46
47void FieldReader::_free()
48{
49    // free all data
50
51    _init();
52
53}
54
55
56void FieldReader::_init()
57{
58    _fin = NULL;
59    _eof = true;
60
61    _noNestedBrackets = 0;
62
63    int i;
64    for(i=0;i<256;++i) _delimiterEatLookUp[i]=false;
65    _delimiterEatLookUp[int(' ')] = true;
66    _delimiterEatLookUp[int('\t')] = true;
67    _delimiterEatLookUp[int('\n')] = true;
68    _delimiterEatLookUp[int('\r')] = true;
69
70    for(i=0;i<256;++i) _delimiterKeepLookUp[i]=false;
71    _delimiterKeepLookUp[int('{')] = true;
72    _delimiterKeepLookUp[int('}')] = true;
73    _delimiterKeepLookUp[int('"')] = true;
74    _delimiterKeepLookUp[int('\'')] = true;
75
76}
77
78
79void FieldReader::_copy(const FieldReader& ic)
80{
81
82    _fin = ic._fin;
83    _eof = ic._eof;
84
85    _noNestedBrackets = ic._noNestedBrackets;
86
87    int i;
88    for(i=0;i<256;++i) _delimiterEatLookUp[i]=ic._delimiterEatLookUp[i];
89    for(i=0;i<256;++i) _delimiterKeepLookUp[i]=ic._delimiterKeepLookUp[i];
90}
91
92
93void FieldReader::attach(std::istream* input)
94{
95    _fin = input;
96
97    if (_fin)
98    {
99        _eof = _fin->eof()!=0;
100    }
101    else
102    {
103        _eof = true;
104    }
105}
106
107
108void FieldReader::detach()
109{
110    _fin = NULL;
111    _eof = true;
112}
113
114
115bool FieldReader::eof() const
116{
117    return _eof;
118}
119
120
121bool FieldReader::findStartOfNextField()
122{
123    int ch = 0;
124    while (true)
125    {
126        ch = _fin->peek();
127        if (ch==EOF)
128        {
129            _eof = true;
130            return false;
131        }
132        else if (_delimiterEatLookUp[ch])
133        {
134            _fin->ignore(1);
135        }
136        else
137        {
138            return true;
139        }
140    }
141}
142
143
144bool FieldReader::readField(Field& fieldPtr)
145{
146    return _readField(&fieldPtr);
147}
148
149
150void FieldReader::ignoreField()
151{
152    _readField(NULL);
153}
154
155
156bool FieldReader::_readField(Field* fieldPtr)
157{
158    if (fieldPtr) fieldPtr->reset();
159
160    if (!eof() && findStartOfNextField())
161    {
162
163        int ch = _fin->peek();
164        if (ch==EOF)
165        {
166            _eof = true;
167            if (fieldPtr) fieldPtr->setNoNestedBrackets(getNoNestedBrackets());
168            return fieldPtr && fieldPtr->getNoCharacters()!=0;
169        }
170        else if (ch=='"')
171        {
172            if (fieldPtr)
173            {
174                fieldPtr->setWithinQuotes(true);
175                fieldPtr->setNoNestedBrackets(getNoNestedBrackets());
176            }
177            _fin->ignore(1);
178            char c;
179            bool escape = false; // use the escape character sequence \" to allow " to included in strings.
180            while (true)
181            {
182                ch = _fin->peek();
183                if (ch==EOF)
184                {
185                    _eof = true;
186                    return fieldPtr && fieldPtr->getNoCharacters()!=0;
187                }
188                c = ch;
189                if (ch=='\\')
190                {
191                    if (escape)
192                    {
193                        escape = false;
194                        _fin->get(c);
195                        if (fieldPtr) fieldPtr->addChar(c);
196                    }
197                    else
198                    {
199                        escape = true;
200                        _fin->ignore(1);
201                    }
202                }
203                else if (ch=='"')
204                {
205                    if (escape)
206                    {
207                        escape = false;
208                        _fin->get(c);
209                        if (fieldPtr) fieldPtr->addChar(c);
210                    }
211                    else
212                    {
213                        _fin->ignore(1);
214                        //return fieldPtr && fieldPtr->getNoCharacters()!=0;
215                        return fieldPtr!=NULL;
216                    }
217                }
218                else
219                {
220                    if (escape)
221                    {
222                        escape = false;
223                        if (fieldPtr) fieldPtr->addChar('\\');
224                    }
225                    _fin->get(c);
226                    if (fieldPtr) fieldPtr->addChar(c);
227                }
228            }
229        }
230        else if (ch=='\'')
231        {
232            if (fieldPtr)
233            {
234                fieldPtr->setWithinQuotes(true);
235                fieldPtr->setNoNestedBrackets(getNoNestedBrackets());
236            }
237            _fin->ignore(1);
238            char c;
239            bool escape = false; // use the escape character sequence \' to allow ' to included in strings.
240            while (true)
241            {
242                ch = _fin->peek();
243                if (ch==EOF)
244                {
245                    _eof = true;
246                    return fieldPtr && fieldPtr->getNoCharacters()!=0;
247                }
248                c = ch;
249                if (ch=='\\' && !escape)
250                {
251                    if (escape)
252                    {
253                        escape = false;
254                        _fin->get(c);
255                        if (fieldPtr) fieldPtr->addChar(c);
256                    }
257                    else
258                    {
259                        escape = true;
260                        _fin->ignore(1);
261                    }
262                }
263                else if (ch=='\'')
264                {
265                    if (escape)
266                    {
267                        escape = false;
268                        _fin->get(c);
269                        if (fieldPtr) fieldPtr->addChar(c);
270                    }
271                    else
272                    {
273                        _fin->ignore(1);
274                        //return fieldPtr && fieldPtr->getNoCharacters()!=0;
275                        return fieldPtr!=NULL;
276                    }
277                }
278                else
279                {
280                    if (escape)
281                    {
282                        escape = false;
283                        if (fieldPtr) fieldPtr->addChar('\\');
284                    }
285                    _fin->get(c);
286                    if (fieldPtr) fieldPtr->addChar(c);
287                }
288            }
289        }
290        else if (_delimiterKeepLookUp[ch])
291        {
292            char c;
293            _fin->get(c);
294            if (fieldPtr) fieldPtr->addChar(c);
295            if (c=='{') ++_noNestedBrackets;
296            else if (c=='}') --_noNestedBrackets;
297            if (fieldPtr) fieldPtr->setNoNestedBrackets(getNoNestedBrackets());
298            return fieldPtr && fieldPtr->getNoCharacters()!=0;
299        }
300        else
301        {
302            if (fieldPtr) fieldPtr->setNoNestedBrackets(getNoNestedBrackets());
303            char c;
304            while (true)
305            {
306                ch = _fin->peek();
307                if (ch==EOF)
308                {
309                    _eof = true;
310                    return fieldPtr && fieldPtr->getNoCharacters()!=0;
311                }
312                c = ch;
313                if (_delimiterEatLookUp[int(c)])
314                {
315                    _fin->ignore(1);
316                    return fieldPtr && fieldPtr->getNoCharacters()!=0;
317                }
318                if (_delimiterKeepLookUp[int(c)])
319                {
320                    return fieldPtr && fieldPtr->getNoCharacters()!=0;
321                }
322                else
323                {
324                    _fin->get(c);
325                    if (fieldPtr) fieldPtr->addChar(c);
326                }
327            }
328        }
329
330    }
331    else
332    {
333        return false;
334    }
335}
336
337
338int FieldReader::getNoNestedBrackets() const
339{
340    return _noNestedBrackets;
341}
Note: See TracBrowser for help on using the browser.