glslang: Fix over 100 warnings from MSVC warning level 4.
[platform/upstream/glslang.git] / glslang / MachineIndependent / preprocessor / PpTokens.cpp
1 //
2 //Copyright (C) 2002-2005  3Dlabs Inc. Ltd.
3 //Copyright (C) 2013 LunarG, Inc.
4 //All rights reserved.
5 //
6 //Redistribution and use in source and binary forms, with or without
7 //modification, are permitted provided that the following conditions
8 //are met:
9 //
10 //    Redistributions of source code must retain the above copyright
11 //    notice, this list of conditions and the following disclaimer.
12 //
13 //    Redistributions in binary form must reproduce the above
14 //    copyright notice, this list of conditions and the following
15 //    disclaimer in the documentation and/or other materials provided
16 //    with the distribution.
17 //
18 //    Neither the name of 3Dlabs Inc. Ltd. nor the names of its
19 //    contributors may be used to endorse or promote products derived
20 //    from this software without specific prior written permission.
21 //
22 //THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23 //"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24 //LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25 //FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
26 //COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
27 //INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
28 //BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29 //LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
30 //CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 //LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
32 //ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33 //POSSIBILITY OF SUCH DAMAGE.
34 //
35 /****************************************************************************\
36 Copyright (c) 2002, NVIDIA Corporation.
37
38 NVIDIA Corporation("NVIDIA") supplies this software to you in
39 consideration of your agreement to the following terms, and your use,
40 installation, modification or redistribution of this NVIDIA software
41 constitutes acceptance of these terms.  If you do not agree with these
42 terms, please do not use, install, modify or redistribute this NVIDIA
43 software.
44
45 In consideration of your agreement to abide by the following terms, and
46 subject to these terms, NVIDIA grants you a personal, non-exclusive
47 license, under NVIDIA's copyrights in this original NVIDIA software (the
48 "NVIDIA Software"), to use, reproduce, modify and redistribute the
49 NVIDIA Software, with or without modifications, in source and/or binary
50 forms; provided that if you redistribute the NVIDIA Software, you must
51 retain the copyright notice of NVIDIA, this notice and the following
52 text and disclaimers in all such redistributions of the NVIDIA Software.
53 Neither the name, trademarks, service marks nor logos of NVIDIA
54 Corporation may be used to endorse or promote products derived from the
55 NVIDIA Software without specific prior written permission from NVIDIA.
56 Except as expressly stated in this notice, no other rights or licenses
57 express or implied, are granted by NVIDIA herein, including but not
58 limited to any patent rights that may be infringed by your derivative
59 works or by other works in which the NVIDIA Software may be
60 incorporated. No hardware is licensed hereunder. 
61
62 THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT
63 WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED,
64 INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE,
65 NON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
66 ITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER
67 PRODUCTS.
68
69 IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT,
70 INCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
71 TO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
72 USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY
73 OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE
74 NVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT,
75 TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF
76 NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
77 \****************************************************************************/
78
79 //
80 // For recording and playing back the stream of tokens in a macro definition.
81 //
82
83 #ifdef _WIN32
84 #define _CRT_SECURE_NO_WARNINGS
85 #define snprintf sprintf_s
86 #endif
87
88 #include <assert.h>
89 #include <stdlib.h>
90 #include <stdio.h>
91 #include <string.h>
92 #include <ctype.h>
93
94 #include "PpContext.h"
95 #include "PpTokens.h"
96
97 namespace glslang {
98
99 void TPpContext::lAddByte(TokenStream *fTok, unsigned char fVal)
100 {
101     fTok->data.push_back(fVal);
102 }
103
104 /*
105 * Get the next byte from a stream.
106 */
107 int TPpContext::lReadByte(TokenStream *pTok)
108 {
109     if (pTok->current < pTok->data.size())
110         return pTok->data[pTok->current++];
111     else
112         return tInput::endOfInput;
113 }
114
115 void TPpContext::lUnreadByte(TokenStream *pTok)
116 {
117     if (pTok->current > 0)
118         --pTok->current;
119 }
120
121 /*
122 * Add a token to the end of a list for later playback.
123 */
124 void TPpContext::RecordToken(TokenStream *pTok, int token, TPpToken* ppToken)
125 {
126     const char* s;
127     char* str = NULL;
128
129     if (token > 256)
130         lAddByte(pTok, (unsigned char)((token & 0x7f) + 0x80));
131     else
132         lAddByte(pTok, (unsigned char)(token & 0x7f));
133
134     switch (token) {
135     case CPP_IDENTIFIER:
136     case CPP_STRCONSTANT:
137         s = GetAtomString(ppToken->atom);
138         while (*s)
139             lAddByte(pTok, (unsigned char) *s++);
140         lAddByte(pTok, 0);
141         break;
142     case CPP_INTCONSTANT:
143     case CPP_UINTCONSTANT:
144     case CPP_FLOATCONSTANT:
145     case CPP_DOUBLECONSTANT:
146         str = ppToken->name;
147         while (*str){
148             lAddByte(pTok, (unsigned char) *str);
149             str++;
150         }
151         lAddByte(pTok, 0);
152         break;
153     default:
154         break;
155     }
156 }
157
158 /*
159 * Reset a token stream in preperation for reading.
160 */
161 void TPpContext::RewindTokenStream(TokenStream *pTok)
162 {
163     pTok->current = 0;
164 }
165
166 /*
167 * Read the next token from a token stream (not the source stream, but stream used to hold a tokenized macro).
168 */
169 int TPpContext::ReadToken(TokenStream *pTok, TPpToken *ppToken)
170 {
171     char tokenText[TPpToken::maxTokenLength + 1];
172     int ltoken, len;
173     int ch;
174
175     ltoken = lReadByte(pTok);
176     ppToken->loc = parseContext.getCurrentLoc();
177     if (ltoken > 127)
178         ltoken += 128;
179     switch (ltoken) {
180     case '#':        
181         if (lReadByte(pTok) == '#') {
182             parseContext.requireProfile(ppToken->loc, ~EEsProfile, "token pasting (##)");
183             parseContext.profileRequires(ppToken->loc, ~EEsProfile, 130, 0, "token pasting (##)");
184             parseContext.error(ppToken->loc, "token pasting not implemented (internal error)", "##", "");
185             //return CPP_TOKEN_PASTE;
186             return ReadToken(pTok, ppToken);
187         } else
188             lUnreadByte(pTok);
189         break;
190     case CPP_STRCONSTANT:
191     case CPP_IDENTIFIER:
192     case CPP_FLOATCONSTANT:
193     case CPP_DOUBLECONSTANT:
194     case CPP_INTCONSTANT:
195     case CPP_UINTCONSTANT:
196         len = 0;
197         ch = lReadByte(pTok);
198         while (ch != 0) {
199             if (len < TPpToken::maxTokenLength) {
200                 tokenText[len] = (char)ch;
201                 len++;
202                 ch = lReadByte(pTok);
203             } else {
204                 parseContext.error(ppToken->loc, "token too long", "", "");
205                 break;
206             }
207         }
208         tokenText[len] = 0;
209
210         switch (ltoken) {
211         case CPP_IDENTIFIER:
212         case CPP_STRCONSTANT:
213             ppToken->atom = LookUpAddString(tokenText);
214             break;
215         case CPP_FLOATCONSTANT:
216         case CPP_DOUBLECONSTANT:
217             strcpy(ppToken->name, tokenText);
218             ppToken->dval = atof(ppToken->name);
219             break;
220         case CPP_INTCONSTANT:
221         case CPP_UINTCONSTANT:
222             strcpy(ppToken->name, tokenText);
223             if (len > 0 && tokenText[0] == '0') {
224                 if (len > 1 && (tokenText[1] == 'x' || tokenText[1] == 'X'))
225                     ppToken->ival = strtol(ppToken->name, 0, 16);
226                 else
227                     ppToken->ival = strtol(ppToken->name, 0, 8);
228             } else
229                 ppToken->ival = atoi(ppToken->name);
230             break;
231         }
232     }
233
234     return ltoken;
235 }
236
237 int TPpContext::tTokenInput::scan(TPpToken* ppToken)
238 {
239     return pp->ReadToken(tokens, ppToken);
240 }
241
242 void TPpContext::pushTokenStreamInput(TokenStream* ts)
243 {
244     pushInput(new tTokenInput(this, ts));
245     RewindTokenStream(ts);
246 }
247
248 int TPpContext::tUngotTokenInput::scan(TPpToken* ppToken)
249 {
250     if (done)
251         return endOfInput;
252
253     int ret = token;
254     *ppToken = lval;
255     done = true;
256
257     return ret;
258 }
259
260 void TPpContext::UngetToken(int token, TPpToken* ppToken)
261 {
262     pushInput(new tUngotTokenInput(this, token, ppToken));
263 }
264
265 } // end namespace glslang