glsl: Implement `error' preprocessor directive.
[mesa.git] / src / glsl / pp / sl_pp_error.c
1 /**************************************************************************
2 *
3 * Copyright 2009 VMware, Inc.
4 * All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
13 *
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
16 * of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21 * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 *
26 **************************************************************************/
27
28 #include <stdlib.h>
29 #include "sl_pp_process.h"
30
31
32 void
33 sl_pp_process_error(struct sl_pp_context *context,
34 const struct sl_pp_token_info *input,
35 unsigned int first,
36 unsigned int last)
37 {
38 unsigned int out_len = 0;
39 unsigned int i;
40
41 for (i = first; i < last; i++) {
42 const char *s = NULL;
43 char buf[2];
44
45 switch (input[i].token) {
46 case SL_PP_WHITESPACE:
47 s = " ";
48 break;
49
50 case SL_PP_NEWLINE:
51 s = "\n";
52 break;
53
54 case SL_PP_HASH:
55 s = "#";
56 break;
57
58 case SL_PP_COMMA:
59 s = ",";
60 break;
61
62 case SL_PP_SEMICOLON:
63 s = ";";
64 break;
65
66 case SL_PP_LBRACE:
67 s = "{";
68 break;
69
70 case SL_PP_RBRACE:
71 s = "}";
72 break;
73
74 case SL_PP_LPAREN:
75 s = "(";
76 break;
77
78 case SL_PP_RPAREN:
79 s = ")";
80 break;
81
82 case SL_PP_LBRACKET:
83 s = "[";
84 break;
85
86 case SL_PP_RBRACKET:
87 s = "]";
88 break;
89
90 case SL_PP_DOT:
91 s = ".";
92 break;
93
94 case SL_PP_INCREMENT:
95 s = "++";
96 break;
97
98 case SL_PP_ADDASSIGN:
99 s = "+=";
100 break;
101
102 case SL_PP_PLUS:
103 s = "+";
104 break;
105
106 case SL_PP_DECREMENT:
107 s = "--";
108 break;
109
110 case SL_PP_SUBASSIGN:
111 s = "-=";
112 break;
113
114 case SL_PP_MINUS:
115 s = "-";
116 break;
117
118 case SL_PP_BITNOT:
119 s = "~";
120 break;
121
122 case SL_PP_NOTEQUAL:
123 s = "!=";
124 break;
125
126 case SL_PP_NOT:
127 s = "!";
128 break;
129
130 case SL_PP_MULASSIGN:
131 s = "*=";
132 break;
133
134 case SL_PP_STAR:
135 s = "*";
136 break;
137
138 case SL_PP_DIVASSIGN:
139 s = "/=";
140 break;
141
142 case SL_PP_SLASH:
143 s = "/";
144 break;
145
146 case SL_PP_MODASSIGN:
147 s = "%=";
148 break;
149
150 case SL_PP_MODULO:
151 s = "%";
152 break;
153
154 case SL_PP_LSHIFTASSIGN:
155 s = "<<=";
156 break;
157
158 case SL_PP_LSHIFT:
159 s = "<<";
160 break;
161
162 case SL_PP_LESSEQUAL:
163 s = "<=";
164 break;
165
166 case SL_PP_LESS:
167 s = "<";
168 break;
169
170 case SL_PP_RSHIFTASSIGN:
171 s = ">>=";
172 break;
173
174 case SL_PP_RSHIFT:
175 s = ">>";
176 break;
177
178 case SL_PP_GREATEREQUAL:
179 s = ">=";
180 break;
181
182 case SL_PP_GREATER:
183 s = ">";
184 break;
185
186 case SL_PP_EQUAL:
187 s = "==";
188 break;
189
190 case SL_PP_ASSIGN:
191 s = "=";
192 break;
193
194 case SL_PP_AND:
195 s = "&&";
196 break;
197
198 case SL_PP_BITANDASSIGN:
199 s = "&=";
200 break;
201
202 case SL_PP_BITAND:
203 s = "&";
204 break;
205
206 case SL_PP_XOR:
207 s = "^^";
208 break;
209
210 case SL_PP_BITXORASSIGN:
211 s = "^=";
212 break;
213
214 case SL_PP_BITXOR:
215 s = "^";
216 break;
217
218 case SL_PP_OR:
219 s = "||";
220 break;
221
222 case SL_PP_BITORASSIGN:
223 s = "|=";
224 break;
225
226 case SL_PP_BITOR:
227 s = "|";
228 break;
229
230 case SL_PP_QUESTION:
231 s = "?";
232 break;
233
234 case SL_PP_COLON:
235 s = ":";
236 break;
237
238 case SL_PP_IDENTIFIER:
239 s = sl_pp_context_cstr(context, input[i].data.identifier);
240 break;
241
242 case SL_PP_NUMBER:
243 s = sl_pp_context_cstr(context, input[i].data.number);
244 break;
245
246 case SL_PP_OTHER:
247 buf[0] = input[i].data.other;
248 buf[1] = '\0';
249 s = buf;
250 break;
251
252 default:
253 strcpy(context->error_msg, "internal error");
254 return;
255 }
256
257 while (*s != '\0' && out_len < sizeof(context->error_msg) - 1) {
258 context->error_msg[out_len++] = *s++;
259 }
260 }
261
262 context->error_msg[out_len] = '\0';
263 }