1 /* valaintegerliteral.c generated by valac, the Vala compiler
2  * generated from valaintegerliteral.vala, do not modify */
3 
4 /* valaintegerliteral.vala
5  *
6  * Copyright (C) 2006-2010  Jürg Billeter
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12 
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Lesser General Public License for more details.
17 
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with this library; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
21  *
22  * Author:
23  * 	Jürg Billeter <j@bitron.ch>
24  */
25 
26 #include "vala.h"
27 #include <stdlib.h>
28 #include <string.h>
29 #include <glib.h>
30 
31 #define _g_free0(var) (var = (g_free (var), NULL))
32 #define _vala_code_node_unref0(var) ((var == NULL) ? NULL : (var = (vala_code_node_unref (var), NULL)))
33 
34 struct _ValaIntegerLiteralPrivate {
35 	gchar* _value;
36 	gchar* _type_suffix;
37 };
38 
39 static gint ValaIntegerLiteral_private_offset;
40 static gpointer vala_integer_literal_parent_class = NULL;
41 
42 static void vala_integer_literal_real_accept (ValaCodeNode* base,
43                                        ValaCodeVisitor* visitor);
44 static gchar* vala_integer_literal_real_to_string (ValaCodeNode* base);
45 static gboolean vala_integer_literal_real_is_pure (ValaExpression* base);
46 static gboolean vala_integer_literal_real_check (ValaCodeNode* base,
47                                           ValaCodeContext* context);
48 static void vala_integer_literal_real_emit (ValaCodeNode* base,
49                                      ValaCodeGenerator* codegen);
50 static void vala_integer_literal_finalize (ValaCodeNode * obj);
51 static GType vala_integer_literal_get_type_once (void);
52 
53 static inline gpointer
vala_integer_literal_get_instance_private(ValaIntegerLiteral * self)54 vala_integer_literal_get_instance_private (ValaIntegerLiteral* self)
55 {
56 	return G_STRUCT_MEMBER_P (self, ValaIntegerLiteral_private_offset);
57 }
58 
59 const gchar*
vala_integer_literal_get_value(ValaIntegerLiteral * self)60 vala_integer_literal_get_value (ValaIntegerLiteral* self)
61 {
62 	const gchar* result;
63 	const gchar* _tmp0_;
64 	g_return_val_if_fail (self != NULL, NULL);
65 	_tmp0_ = self->priv->_value;
66 	result = _tmp0_;
67 	return result;
68 }
69 
70 void
vala_integer_literal_set_value(ValaIntegerLiteral * self,const gchar * value)71 vala_integer_literal_set_value (ValaIntegerLiteral* self,
72                                 const gchar* value)
73 {
74 	gchar* _tmp0_;
75 	g_return_if_fail (self != NULL);
76 	_tmp0_ = g_strdup (value);
77 	_g_free0 (self->priv->_value);
78 	self->priv->_value = _tmp0_;
79 }
80 
81 const gchar*
vala_integer_literal_get_type_suffix(ValaIntegerLiteral * self)82 vala_integer_literal_get_type_suffix (ValaIntegerLiteral* self)
83 {
84 	const gchar* result;
85 	const gchar* _tmp0_;
86 	g_return_val_if_fail (self != NULL, NULL);
87 	_tmp0_ = self->priv->_type_suffix;
88 	result = _tmp0_;
89 	return result;
90 }
91 
92 void
vala_integer_literal_set_type_suffix(ValaIntegerLiteral * self,const gchar * value)93 vala_integer_literal_set_type_suffix (ValaIntegerLiteral* self,
94                                       const gchar* value)
95 {
96 	gchar* _tmp0_;
97 	g_return_if_fail (self != NULL);
98 	_tmp0_ = g_strdup (value);
99 	_g_free0 (self->priv->_type_suffix);
100 	self->priv->_type_suffix = _tmp0_;
101 }
102 
103 /**
104  * Creates a new integer literal.
105  *
106  * @param i      literal value
107  * @param source reference to source code
108  * @return       newly created integer literal
109  */
110 ValaIntegerLiteral*
vala_integer_literal_construct(GType object_type,const gchar * i,ValaSourceReference * source)111 vala_integer_literal_construct (GType object_type,
112                                 const gchar* i,
113                                 ValaSourceReference* source)
114 {
115 	ValaIntegerLiteral* self = NULL;
116 	g_return_val_if_fail (i != NULL, NULL);
117 	self = (ValaIntegerLiteral*) vala_literal_construct (object_type);
118 	vala_integer_literal_set_value (self, i);
119 	vala_code_node_set_source_reference ((ValaCodeNode*) self, source);
120 	return self;
121 }
122 
123 ValaIntegerLiteral*
vala_integer_literal_new(const gchar * i,ValaSourceReference * source)124 vala_integer_literal_new (const gchar* i,
125                           ValaSourceReference* source)
126 {
127 	return vala_integer_literal_construct (VALA_TYPE_INTEGER_LITERAL, i, source);
128 }
129 
130 static void
vala_integer_literal_real_accept(ValaCodeNode * base,ValaCodeVisitor * visitor)131 vala_integer_literal_real_accept (ValaCodeNode* base,
132                                   ValaCodeVisitor* visitor)
133 {
134 	ValaIntegerLiteral * self;
135 	self = (ValaIntegerLiteral*) base;
136 	g_return_if_fail (visitor != NULL);
137 	vala_code_visitor_visit_integer_literal (visitor, self);
138 	vala_code_visitor_visit_expression (visitor, (ValaExpression*) self);
139 }
140 
141 static gchar*
vala_integer_literal_real_to_string(ValaCodeNode * base)142 vala_integer_literal_real_to_string (ValaCodeNode* base)
143 {
144 	ValaIntegerLiteral * self;
145 	const gchar* _tmp0_;
146 	gchar* _tmp1_;
147 	gchar* result = NULL;
148 	self = (ValaIntegerLiteral*) base;
149 	_tmp0_ = self->priv->_value;
150 	_tmp1_ = g_strdup (_tmp0_);
151 	result = _tmp1_;
152 	return result;
153 }
154 
155 static gboolean
vala_integer_literal_real_is_pure(ValaExpression * base)156 vala_integer_literal_real_is_pure (ValaExpression* base)
157 {
158 	ValaIntegerLiteral * self;
159 	gboolean result = FALSE;
160 	self = (ValaIntegerLiteral*) base;
161 	result = TRUE;
162 	return result;
163 }
164 
165 static glong
string_strnlen(gchar * str,glong maxlen)166 string_strnlen (gchar* str,
167                 glong maxlen)
168 {
169 	gchar* end = NULL;
170 	gchar* _tmp0_;
171 	gchar* _tmp1_;
172 	glong result = 0L;
173 	_tmp0_ = memchr (str, 0, (gsize) maxlen);
174 	end = _tmp0_;
175 	_tmp1_ = end;
176 	if (_tmp1_ == NULL) {
177 		result = maxlen;
178 		return result;
179 	} else {
180 		gchar* _tmp2_;
181 		_tmp2_ = end;
182 		result = (glong) (_tmp2_ - str);
183 		return result;
184 	}
185 }
186 
187 static gchar*
string_substring(const gchar * self,glong offset,glong len)188 string_substring (const gchar* self,
189                   glong offset,
190                   glong len)
191 {
192 	glong string_length = 0L;
193 	gboolean _tmp0_ = FALSE;
194 	gchar* _tmp3_;
195 	gchar* result = NULL;
196 	g_return_val_if_fail (self != NULL, NULL);
197 	if (offset >= ((glong) 0)) {
198 		_tmp0_ = len >= ((glong) 0);
199 	} else {
200 		_tmp0_ = FALSE;
201 	}
202 	if (_tmp0_) {
203 		string_length = string_strnlen ((gchar*) self, offset + len);
204 	} else {
205 		gint _tmp1_;
206 		gint _tmp2_;
207 		_tmp1_ = strlen (self);
208 		_tmp2_ = _tmp1_;
209 		string_length = (glong) _tmp2_;
210 	}
211 	if (offset < ((glong) 0)) {
212 		offset = string_length + offset;
213 		g_return_val_if_fail (offset >= ((glong) 0), NULL);
214 	} else {
215 		g_return_val_if_fail (offset <= string_length, NULL);
216 	}
217 	if (len < ((glong) 0)) {
218 		len = string_length - offset;
219 	}
220 	g_return_val_if_fail ((offset + len) <= string_length, NULL);
221 	_tmp3_ = g_strndup (((gchar*) self) + offset, (gsize) len);
222 	result = _tmp3_;
223 	return result;
224 }
225 
226 static gint64
int64_parse(const gchar * str,guint _base)227 int64_parse (const gchar* str,
228              guint _base)
229 {
230 	gint64 result = 0LL;
231 	g_return_val_if_fail (str != NULL, 0LL);
232 	result = g_ascii_strtoll (str, NULL, _base);
233 	return result;
234 }
235 
236 static gboolean
vala_integer_literal_real_check(ValaCodeNode * base,ValaCodeContext * context)237 vala_integer_literal_real_check (ValaCodeNode* base,
238                                  ValaCodeContext* context)
239 {
240 	ValaIntegerLiteral * self;
241 	gboolean _tmp0_;
242 	gboolean _tmp1_;
243 	gint l = 0;
244 	gboolean u = FALSE;
245 	gboolean _tmp14_ = FALSE;
246 	const gchar* _tmp15_;
247 	gint64 n = 0LL;
248 	const gchar* _tmp23_;
249 	gboolean _tmp24_ = FALSE;
250 	gchar* type_name = NULL;
251 	ValaStruct* st = NULL;
252 	ValaNamespace* _tmp33_;
253 	ValaNamespace* _tmp34_;
254 	ValaScope* _tmp35_;
255 	ValaScope* _tmp36_;
256 	const gchar* _tmp37_;
257 	ValaSymbol* _tmp38_;
258 	ValaStruct* _tmp39_;
259 	ValaStruct* _tmp40_;
260 	const gchar* _tmp41_;
261 	const gchar* _tmp42_;
262 	ValaIntegerType* _tmp43_;
263 	ValaIntegerType* _tmp44_;
264 	gboolean _tmp45_;
265 	gboolean _tmp46_;
266 	gboolean result = FALSE;
267 	self = (ValaIntegerLiteral*) base;
268 	g_return_val_if_fail (context != NULL, FALSE);
269 	_tmp0_ = vala_code_node_get_checked ((ValaCodeNode*) self);
270 	_tmp1_ = _tmp0_;
271 	if (_tmp1_) {
272 		gboolean _tmp2_;
273 		gboolean _tmp3_;
274 		_tmp2_ = vala_code_node_get_error ((ValaCodeNode*) self);
275 		_tmp3_ = _tmp2_;
276 		result = !_tmp3_;
277 		return result;
278 	}
279 	vala_code_node_set_checked ((ValaCodeNode*) self, TRUE);
280 	l = 0;
281 	while (TRUE) {
282 		gboolean _tmp4_ = FALSE;
283 		const gchar* _tmp5_;
284 		gint _tmp7_;
285 		const gchar* _tmp8_;
286 		const gchar* _tmp9_;
287 		gint _tmp10_;
288 		gint _tmp11_;
289 		gchar* _tmp12_;
290 		gchar* _tmp13_;
291 		_tmp5_ = self->priv->_value;
292 		if (g_str_has_suffix (_tmp5_, "l")) {
293 			_tmp4_ = TRUE;
294 		} else {
295 			const gchar* _tmp6_;
296 			_tmp6_ = self->priv->_value;
297 			_tmp4_ = g_str_has_suffix (_tmp6_, "L");
298 		}
299 		if (!_tmp4_) {
300 			break;
301 		}
302 		_tmp7_ = l;
303 		l = _tmp7_ + 1;
304 		_tmp8_ = self->priv->_value;
305 		_tmp9_ = self->priv->_value;
306 		_tmp10_ = strlen (_tmp9_);
307 		_tmp11_ = _tmp10_;
308 		_tmp12_ = string_substring (_tmp8_, (glong) 0, (glong) (_tmp11_ - 1));
309 		_tmp13_ = _tmp12_;
310 		vala_integer_literal_set_value (self, _tmp13_);
311 		_g_free0 (_tmp13_);
312 	}
313 	u = FALSE;
314 	_tmp15_ = self->priv->_value;
315 	if (g_str_has_suffix (_tmp15_, "u")) {
316 		_tmp14_ = TRUE;
317 	} else {
318 		const gchar* _tmp16_;
319 		_tmp16_ = self->priv->_value;
320 		_tmp14_ = g_str_has_suffix (_tmp16_, "U");
321 	}
322 	if (_tmp14_) {
323 		const gchar* _tmp17_;
324 		const gchar* _tmp18_;
325 		gint _tmp19_;
326 		gint _tmp20_;
327 		gchar* _tmp21_;
328 		gchar* _tmp22_;
329 		u = TRUE;
330 		_tmp17_ = self->priv->_value;
331 		_tmp18_ = self->priv->_value;
332 		_tmp19_ = strlen (_tmp18_);
333 		_tmp20_ = _tmp19_;
334 		_tmp21_ = string_substring (_tmp17_, (glong) 0, (glong) (_tmp20_ - 1));
335 		_tmp22_ = _tmp21_;
336 		vala_integer_literal_set_value (self, _tmp22_);
337 		_g_free0 (_tmp22_);
338 	}
339 	_tmp23_ = self->priv->_value;
340 	n = int64_parse (_tmp23_, (guint) 0);
341 	if (!u) {
342 		gboolean _tmp25_ = FALSE;
343 		if (n > ((gint64) G_MAXINT)) {
344 			_tmp25_ = TRUE;
345 		} else {
346 			_tmp25_ = n < ((gint64) G_MININT);
347 		}
348 		_tmp24_ = _tmp25_;
349 	} else {
350 		_tmp24_ = FALSE;
351 	}
352 	if (_tmp24_) {
353 		l = 2;
354 	} else {
355 		gboolean _tmp26_ = FALSE;
356 		if (u) {
357 			_tmp26_ = n > ((gint64) G_MAXUINT);
358 		} else {
359 			_tmp26_ = FALSE;
360 		}
361 		if (_tmp26_) {
362 			l = 2;
363 		}
364 	}
365 	if (l == 0) {
366 		if (u) {
367 			gchar* _tmp27_;
368 			vala_integer_literal_set_type_suffix (self, "U");
369 			_tmp27_ = g_strdup ("uint");
370 			_g_free0 (type_name);
371 			type_name = _tmp27_;
372 		} else {
373 			gchar* _tmp28_;
374 			vala_integer_literal_set_type_suffix (self, "");
375 			_tmp28_ = g_strdup ("int");
376 			_g_free0 (type_name);
377 			type_name = _tmp28_;
378 		}
379 	} else {
380 		if (l == 1) {
381 			if (u) {
382 				gchar* _tmp29_;
383 				vala_integer_literal_set_type_suffix (self, "UL");
384 				_tmp29_ = g_strdup ("ulong");
385 				_g_free0 (type_name);
386 				type_name = _tmp29_;
387 			} else {
388 				gchar* _tmp30_;
389 				vala_integer_literal_set_type_suffix (self, "L");
390 				_tmp30_ = g_strdup ("long");
391 				_g_free0 (type_name);
392 				type_name = _tmp30_;
393 			}
394 		} else {
395 			if (u) {
396 				gchar* _tmp31_;
397 				vala_integer_literal_set_type_suffix (self, "ULL");
398 				_tmp31_ = g_strdup ("uint64");
399 				_g_free0 (type_name);
400 				type_name = _tmp31_;
401 			} else {
402 				gchar* _tmp32_;
403 				vala_integer_literal_set_type_suffix (self, "LL");
404 				_tmp32_ = g_strdup ("int64");
405 				_g_free0 (type_name);
406 				type_name = _tmp32_;
407 			}
408 		}
409 	}
410 	_tmp33_ = vala_code_context_get_root (context);
411 	_tmp34_ = _tmp33_;
412 	_tmp35_ = vala_symbol_get_scope ((ValaSymbol*) _tmp34_);
413 	_tmp36_ = _tmp35_;
414 	_tmp37_ = type_name;
415 	_tmp38_ = vala_scope_lookup (_tmp36_, _tmp37_);
416 	st = G_TYPE_CHECK_INSTANCE_CAST (_tmp38_, VALA_TYPE_STRUCT, ValaStruct);
417 	_tmp39_ = st;
418 	vala_code_node_check ((ValaCodeNode*) _tmp39_, context);
419 	_tmp40_ = st;
420 	_tmp41_ = self->priv->_value;
421 	_tmp42_ = type_name;
422 	_tmp43_ = vala_integer_type_new (_tmp40_, _tmp41_, _tmp42_);
423 	_tmp44_ = _tmp43_;
424 	vala_expression_set_value_type ((ValaExpression*) self, (ValaDataType*) _tmp44_);
425 	_vala_code_node_unref0 (_tmp44_);
426 	_tmp45_ = vala_code_node_get_error ((ValaCodeNode*) self);
427 	_tmp46_ = _tmp45_;
428 	result = !_tmp46_;
429 	_vala_code_node_unref0 (st);
430 	_g_free0 (type_name);
431 	return result;
432 }
433 
434 static void
vala_integer_literal_real_emit(ValaCodeNode * base,ValaCodeGenerator * codegen)435 vala_integer_literal_real_emit (ValaCodeNode* base,
436                                 ValaCodeGenerator* codegen)
437 {
438 	ValaIntegerLiteral * self;
439 	self = (ValaIntegerLiteral*) base;
440 	g_return_if_fail (codegen != NULL);
441 	vala_code_visitor_visit_integer_literal ((ValaCodeVisitor*) codegen, self);
442 	vala_code_visitor_visit_expression ((ValaCodeVisitor*) codegen, (ValaExpression*) self);
443 }
444 
445 static void
vala_integer_literal_class_init(ValaIntegerLiteralClass * klass,gpointer klass_data)446 vala_integer_literal_class_init (ValaIntegerLiteralClass * klass,
447                                  gpointer klass_data)
448 {
449 	vala_integer_literal_parent_class = g_type_class_peek_parent (klass);
450 	((ValaCodeNodeClass *) klass)->finalize = vala_integer_literal_finalize;
451 	g_type_class_adjust_private_offset (klass, &ValaIntegerLiteral_private_offset);
452 	((ValaCodeNodeClass *) klass)->accept = (void (*) (ValaCodeNode*, ValaCodeVisitor*)) vala_integer_literal_real_accept;
453 	((ValaCodeNodeClass *) klass)->to_string = (gchar* (*) (ValaCodeNode*)) vala_integer_literal_real_to_string;
454 	((ValaExpressionClass *) klass)->is_pure = (gboolean (*) (ValaExpression*)) vala_integer_literal_real_is_pure;
455 	((ValaCodeNodeClass *) klass)->check = (gboolean (*) (ValaCodeNode*, ValaCodeContext*)) vala_integer_literal_real_check;
456 	((ValaCodeNodeClass *) klass)->emit = (void (*) (ValaCodeNode*, ValaCodeGenerator*)) vala_integer_literal_real_emit;
457 }
458 
459 static void
vala_integer_literal_instance_init(ValaIntegerLiteral * self,gpointer klass)460 vala_integer_literal_instance_init (ValaIntegerLiteral * self,
461                                     gpointer klass)
462 {
463 	self->priv = vala_integer_literal_get_instance_private (self);
464 }
465 
466 static void
vala_integer_literal_finalize(ValaCodeNode * obj)467 vala_integer_literal_finalize (ValaCodeNode * obj)
468 {
469 	ValaIntegerLiteral * self;
470 	self = G_TYPE_CHECK_INSTANCE_CAST (obj, VALA_TYPE_INTEGER_LITERAL, ValaIntegerLiteral);
471 	_g_free0 (self->priv->_value);
472 	_g_free0 (self->priv->_type_suffix);
473 	VALA_CODE_NODE_CLASS (vala_integer_literal_parent_class)->finalize (obj);
474 }
475 
476 /**
477  * Represents an integer literal in the source code.
478  */
479 static GType
vala_integer_literal_get_type_once(void)480 vala_integer_literal_get_type_once (void)
481 {
482 	static const GTypeInfo g_define_type_info = { sizeof (ValaIntegerLiteralClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) vala_integer_literal_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (ValaIntegerLiteral), 0, (GInstanceInitFunc) vala_integer_literal_instance_init, NULL };
483 	GType vala_integer_literal_type_id;
484 	vala_integer_literal_type_id = g_type_register_static (VALA_TYPE_LITERAL, "ValaIntegerLiteral", &g_define_type_info, 0);
485 	ValaIntegerLiteral_private_offset = g_type_add_instance_private (vala_integer_literal_type_id, sizeof (ValaIntegerLiteralPrivate));
486 	return vala_integer_literal_type_id;
487 }
488 
489 GType
vala_integer_literal_get_type(void)490 vala_integer_literal_get_type (void)
491 {
492 	static volatile gsize vala_integer_literal_type_id__volatile = 0;
493 	if (g_once_init_enter (&vala_integer_literal_type_id__volatile)) {
494 		GType vala_integer_literal_type_id;
495 		vala_integer_literal_type_id = vala_integer_literal_get_type_once ();
496 		g_once_init_leave (&vala_integer_literal_type_id__volatile, vala_integer_literal_type_id);
497 	}
498 	return vala_integer_literal_type_id__volatile;
499 }
500 
501