X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=type.c;h=c904c7c3b38522e06653ef728095625131426afc;hb=a175b2b77da865fd556a68cb6fa0227ca5015b60;hp=7a5272a709e7b5235f1b9cf65768faacd2a30187;hpb=2be7ab630576a2dbf16a6930bef792e0ca9c7d6e;p=cparser diff --git a/type.c b/type.c index 7a5272a..c904c7c 100644 --- a/type.c +++ b/type.c @@ -33,6 +33,7 @@ #include "warning.h" #include "diagnostic.h" #include "printer.h" +#include "separator_t.h" /** The default calling convention. */ cc_kind_t default_calling_convention = CC_CDECL; @@ -239,15 +240,15 @@ void print_type_qualifiers(type_qualifiers_t const qualifiers, QualifierSeparato { size_t sep = q & QUAL_SEP_START ? 0 : 1; if (qualifiers & TYPE_QUALIFIER_CONST) { - print_string(" const" + sep); + print_string(&" const"[sep]); sep = 0; } if (qualifiers & TYPE_QUALIFIER_VOLATILE) { - print_string(" volatile" + sep); + print_string(&" volatile"[sep]); sep = 0; } if (qualifiers & TYPE_QUALIFIER_RESTRICT) { - print_string(" restrict" + sep); + print_string(&" restrict"[sep]); sep = 0; } if (sep == 0 && q & QUAL_SEP_END) @@ -257,7 +258,6 @@ void print_type_qualifiers(type_qualifiers_t const qualifiers, QualifierSeparato const char *get_atomic_kind_name(atomic_type_kind_t kind) { switch(kind) { - case ATOMIC_TYPE_INVALID: break; case ATOMIC_TYPE_VOID: return "void"; case ATOMIC_TYPE_WCHAR_T: return "wchar_t"; case ATOMIC_TYPE_BOOL: return c_mode & _CXX ? "bool" : "_Bool"; @@ -374,15 +374,11 @@ static void print_function_type_post(const function_type_t *type, const scope_t *parameters) { print_char('('); - bool first = true; + separator_t sep = { "", ", " }; if (parameters == NULL) { function_parameter_t *parameter = type->parameters; for( ; parameter != NULL; parameter = parameter->next) { - if (first) { - first = false; - } else { - print_string(", "); - } + print_string(sep_next(&sep)); print_type(parameter->type); } } else { @@ -391,11 +387,7 @@ static void print_function_type_post(const function_type_t *type, if (parameter->kind != ENTITY_PARAMETER) continue; - if (first) { - first = false; - } else { - print_string(", "); - } + print_string(sep_next(&sep)); const type_t *const param_type = parameter->declaration.type; if (param_type == NULL) { print_string(parameter->base.symbol->string); @@ -405,14 +397,10 @@ static void print_function_type_post(const function_type_t *type, } } if (type->variadic) { - if (first) { - first = false; - } else { - print_string(", "); - } + print_string(sep_next(&sep)); print_string("..."); } - if (first && !type->unspecified_parameters) { + if (sep_at_first(&sep) && !type->unspecified_parameters) { print_string("void"); } print_char(')'); @@ -706,8 +694,7 @@ type_t *duplicate_type(const type_t *type) { size_t size = get_type_struct_size(type->kind); - type_t *const copy = obstack_alloc(&type_obst, size); - memcpy(copy, type, size); + type_t *const copy = obstack_copy(&type_obst, type, size); copy->base.firm_type = NULL; return copy; @@ -874,10 +861,10 @@ bool is_type_incomplete(const type_t *type) case TYPE_TYPEDEF: case TYPE_TYPEOF: - panic("is_type_incomplete called without typerefs skipped"); + panic("typedef not skipped"); } - panic("invalid type found"); + panic("invalid type"); } bool is_type_object(const type_t *type) @@ -1003,7 +990,7 @@ bool types_compatible(const type_t *type1, const type_t *type2) return true; case TYPE_TYPEDEF: case TYPE_TYPEOF: - panic("typerefs not skipped in compatible types?!?"); + panic("typeref not skipped"); } } @@ -1094,7 +1081,7 @@ unsigned get_type_size(type_t *type) case TYPE_TYPEOF: return get_type_size(type->typeoft.typeof_type); } - panic("invalid type in get_type_size"); + panic("invalid type"); } unsigned get_type_alignment(type_t *type) @@ -1132,7 +1119,7 @@ unsigned get_type_alignment(type_t *type) case TYPE_TYPEOF: return get_type_alignment(type->typeoft.typeof_type); } - panic("invalid type in get_type_alignment"); + panic("invalid type"); } /** @@ -1174,7 +1161,7 @@ decl_modifiers_t get_type_modifiers(const type_t *type) case TYPE_TYPEOF: return get_type_modifiers(type->typeoft.typeof_type); } - panic("invalid type found in get_type_modifiers"); + panic("invalid type"); } type_qualifiers_t get_type_qualifier(const type_t *type, bool skip_array_type) @@ -1237,7 +1224,7 @@ atomic_type_kind_t find_signed_int_atomic_type_kind_for_size(unsigned size) assert(size < 32); atomic_type_kind_t kind = kinds[size]; - if (kind == ATOMIC_TYPE_INVALID) { + if (kind == (atomic_type_kind_t)0) { static const atomic_type_kind_t possible_kinds[] = { ATOMIC_TYPE_SCHAR, ATOMIC_TYPE_SHORT, @@ -1265,7 +1252,7 @@ atomic_type_kind_t find_unsigned_int_atomic_type_kind_for_size(unsigned size) assert(size < 32); atomic_type_kind_t kind = kinds[size]; - if (kind == ATOMIC_TYPE_INVALID) { + if (kind == (atomic_type_kind_t)0) { static const atomic_type_kind_t possible_kinds[] = { ATOMIC_TYPE_UCHAR, ATOMIC_TYPE_USHORT,