Report patch name instead of index in debug
[foam-extend-3.2.git] / src / foam / db / IOstreams / Pstreams / IPreadToken.C
bloba1994f277aa1a669611b9ba1bcc7124e7d5f4f96
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | foam-extend: Open Source CFD
4    \\    /   O peration     | Version:     3.2
5     \\  /    A nd           | Web:         http://www.foam-extend.org
6      \\/     M anipulation  | For copyright notice see file Copyright
7 -------------------------------------------------------------------------------
8 License
9     This file is part of foam-extend.
11     foam-extend is free software: you can redistribute it and/or modify it
12     under the terms of the GNU General Public License as published by the
13     Free Software Foundation, either version 3 of the License, or (at your
14     option) any later version.
16     foam-extend is distributed in the hope that it will be useful, but
17     WITHOUT ANY WARRANTY; without even the implied warranty of
18     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19     General Public License for more details.
21     You should have received a copy of the GNU General Public License
22     along with foam-extend.  If not, see <http://www.gnu.org/licenses/>.
24 \*---------------------------------------------------------------------------*/
26 #include "IPstream.H"
27 #include "token.H"
28 #include <cctype>
30 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
32 namespace Foam
35 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
37 Istream& IPstream::read(token& t)
39     // Return the put back token if it exists
40     if (Istream::getBack(t))
41     {
42         return *this;
43     }
45     char c;
47     // return on error
48     if (!read(c))
49     {
50         t.setBad();
51         return *this;
52     }
54     // Set the line number of this token to the current stream line number
55     t.lineNumber() = lineNumber();
57     // Analyse input starting with this character.
58     switch (c)
59     {
60         // Punctuation
61         case token::END_STATEMENT :
62         case token::BEGIN_LIST :
63         case token::END_LIST :
64         case token::BEGIN_SQR :
65         case token::END_SQR :
66         case token::BEGIN_BLOCK :
67         case token::END_BLOCK :
68         case token::COLON :
69         case token::COMMA :
70         case token::ASSIGN :
71         case token::ADD :
72         case token::SUBTRACT :
73         case token::MULTIPLY :
74         case token::DIVIDE :
75         {
76             t = token::punctuationToken(c);
77             return *this;
78         }
80         // Word
81         case token::WORD :
82         {
83             word* wPtr = new word;
84             if (read(*wPtr))
85             {
86                 if (token::compound::isCompound(*wPtr))
87                 {
88                     t = token::compound::New(*wPtr, *this).ptr();
89                     delete wPtr;
90                 }
91                 else
92                 {
93                     t = wPtr;
94                 }
95             }
96             else
97             {
98                 delete wPtr;
99                 t.setBad();
100             }
101             return *this;
102         }
104         // String
105         case token::STRING :
106         {
107             string* sPtr = new string;
108             if (read(*sPtr))
109             {
110                 t = sPtr;
111             }
112             else
113             {
114                 delete sPtr;
115                 t.setBad();
116             }
117             return *this;
118         }
120         // Label
121         case token::LABEL :
122         {
123             label l;
124             if (read(l))
125             {
126                 t = l;
127             }
128             else
129             {
130                 t.setBad();
131             }
132             return *this;
133         }
135         // floatScalar
136         case token::FLOAT_SCALAR :
137         {
138             floatScalar s;
139             if (read(s))
140             {
141                 t = s;
142             }
143             else
144             {
145                 t.setBad();
146             }
147             return *this;
148         }
150         // doubleScalar
151         case token::DOUBLE_SCALAR :
152         {
153             doubleScalar s;
154             if (read(s))
155             {
156                 t = s;
157             }
158             else
159             {
160                 t.setBad();
161             }
162             return *this;
163         }
165         // Character (returned as a single character word) or error
166         default:
167         {
168             if (isalpha(c))
169             {
170                 t = word(c);
171                 return *this;
172             }
174             setBad();
175             t.setBad();
177             return *this;
178         }
179     }
183 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
185 } // End namespace Foam
187 // ************************************************************************* //