+bool is_type_floating(const type_t *type)
+{
+ if(type->type != TYPE_ATOMIC)
+ return 0;
+
+ atomic_type_t *atomic_type = (atomic_type_t*) type;
+ switch(atomic_type->atype) {
+ case ATOMIC_TYPE_FLOAT:
+ case ATOMIC_TYPE_DOUBLE:
+ case ATOMIC_TYPE_LONG_DOUBLE:
+#ifdef PROVIDE_COMPLEX
+ case ATOMIC_TYPE_FLOAT_COMPLEX:
+ case ATOMIC_TYPE_DOUBLE_COMPLEX:
+ case ATOMIC_TYPE_LONG_DOUBLE_COMPLEX:
+#endif
+#ifdef PROVIDE_IMAGINARY
+ case ATOMIC_TYPE_FLOAT_IMAGINARY:
+ case ATOMIC_TYPE_DOUBLE_IMAGINARY:
+ case ATOMIC_TYPE_LONG_DOUBLE_IMAGINARY:
+#endif
+ return 1;
+ default:
+ return 0;
+ }
+}
+
+bool is_type_arithmetic(const type_t *type)
+{
+ if(is_type_integer(type) || is_type_floating(type))
+ return 1;
+
+ return 0;
+}
+
+bool is_type_scalar(const type_t *type)
+{
+ if(type->type == TYPE_POINTER)
+ return 1;
+
+ return is_type_arithmetic(type);
+}
+
+static type_t *identify_new_type(type_t *type)
+{
+ type_t *result = typehash_insert(type);
+ if(result != type) {
+ obstack_free(type_obst, type);
+ }
+ return result;
+}
+
+type_t *make_atomic_type(atomic_type_type_t type, type_qualifier_t qualifiers)
+{
+ atomic_type_t *atomic_type
+ = obstack_alloc(type_obst, sizeof(atomic_type[0]));
+ memset(atomic_type, 0, sizeof(atomic_type[0]));
+ atomic_type->type.type = TYPE_ATOMIC;
+ atomic_type->type.qualifiers = qualifiers;
+ atomic_type->atype = type;
+
+ return identify_new_type((type_t*) atomic_type);
+}
+
+type_t *make_pointer_type(type_t *points_to, type_qualifier_t qualifiers)
+{
+ pointer_type_t *pointer_type
+ = obstack_alloc(type_obst, sizeof(pointer_type[0]));
+ memset(pointer_type, 0, sizeof(pointer_type[0]));
+ pointer_type->type.type = TYPE_POINTER;
+ pointer_type->type.qualifiers = qualifiers;
+ pointer_type->points_to = points_to;
+
+ return identify_new_type((type_t*) pointer_type);
+}
+