+ int first = 1;
+ if (qualifiers & TYPE_QUALIFIER_CONST) {
+ fputs(" const" + first, out);
+ first = 0;
+ }
+ if (qualifiers & TYPE_QUALIFIER_VOLATILE) {
+ fputs(" volatile" + first, out);
+ first = 0;
+ }
+ if (qualifiers & TYPE_QUALIFIER_RESTRICT) {
+ fputs(" restrict" + first, out);
+ first = 0;
+ }
+}
+
+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";
+ case ATOMIC_TYPE_CHAR: return "char";
+ case ATOMIC_TYPE_SCHAR: return "signed char";
+ case ATOMIC_TYPE_UCHAR: return "unsigned char";
+ case ATOMIC_TYPE_INT: return "int";
+ case ATOMIC_TYPE_UINT: return "unsigned int";
+ case ATOMIC_TYPE_SHORT: return "short";
+ case ATOMIC_TYPE_USHORT: return "unsigned short";
+ case ATOMIC_TYPE_LONG: return "long";
+ case ATOMIC_TYPE_ULONG: return "unsigned long";
+ case ATOMIC_TYPE_LONGLONG: return "long long";
+ case ATOMIC_TYPE_ULONGLONG: return "unsigned long long";
+ case ATOMIC_TYPE_LONG_DOUBLE: return "long double";
+ case ATOMIC_TYPE_FLOAT: return "float";
+ case ATOMIC_TYPE_DOUBLE: return "double";
+ }
+ return "INVALIDATOMIC";
+}
+
+/**
+ * Prints the name of an atomic type kinds.
+ *
+ * @param kind The type kind.
+ */
+static void print_atomic_kinds(atomic_type_kind_t kind)
+{
+ const char *s = get_atomic_kind_name(kind);
+ fputs(s, out);
+}
+
+/**
+ * Prints the name of an atomic type.
+ *
+ * @param type The type.
+ */
+static void print_atomic_type(const atomic_type_t *type)
+{
+ print_type_qualifiers(type->base.qualifiers);
+ if (type->base.qualifiers != 0)
+ fputc(' ', out);
+ print_atomic_kinds(type->akind);