+ assert(type->kind == TYPE_ATOMIC);
+ return get_atomic_kind_name(type->atomic.akind);
+}
+
+static FILE *preprocess(const char *fname, filetype_t filetype)
+{
+ static const char *common_flags = NULL;
+
+ if (common_flags == NULL) {
+ obstack_1grow(&cppflags_obst, '\0');
+ const char *flags = obstack_finish(&cppflags_obst);
+
+ /* setup default defines */
+ add_flag(&cppflags_obst, "-U__WCHAR_TYPE__");
+ add_flag(&cppflags_obst, "-D__WCHAR_TYPE__=%s", type_to_string(type_wchar_t));
+ add_flag(&cppflags_obst, "-U__SIZE_TYPE__");
+ add_flag(&cppflags_obst, "-D__SIZE_TYPE__=%s", type_to_string(type_size_t));
+
+ add_flag(&cppflags_obst, "-U__VERSION__");
+ add_flag(&cppflags_obst, "-D__VERSION__=\"%s\"", cparser_REVISION);
+
+ /* TODO hack... */
+ add_flag(&cppflags_obst, "-D__builtin_abort=abort");
+ add_flag(&cppflags_obst, "-D__builtin_abs=abs");
+ add_flag(&cppflags_obst, "-D__builtin_exit=exit");
+ add_flag(&cppflags_obst, "-D__builtin_malloc=malloc");
+ add_flag(&cppflags_obst, "-D__builtin_memcmp=memcmp");
+ add_flag(&cppflags_obst, "-D__builtin_memcpy=memcpy");
+ add_flag(&cppflags_obst, "-D__builtin_memset=memset");
+ add_flag(&cppflags_obst, "-D__builtin_strlen=strlen");
+ add_flag(&cppflags_obst, "-D__builtin_strcmp=strcmp");
+ add_flag(&cppflags_obst, "-D__builtin_strcpy=strcpy");
+
+ if (flags[0] != '\0') {
+ size_t len = strlen(flags);
+ obstack_1grow(&cppflags_obst, ' ');
+ obstack_grow(&cppflags_obst, flags, len);
+ }
+ obstack_1grow(&cppflags_obst, '\0');
+ common_flags = obstack_finish(&cppflags_obst);
+ }
+
+ assert(obstack_object_size(&cppflags_obst) == 0);
+
+ const char *preprocessor = getenv("CPARSER_PP");
+ if (preprocessor == NULL)
+ preprocessor = PREPROCESSOR;
+
+ obstack_printf(&cppflags_obst, "%s ", preprocessor);
+ switch (filetype) {
+ case FILETYPE_C:
+ add_flag(&cppflags_obst, "-std=c99");
+ break;
+ case FILETYPE_CXX:
+ add_flag(&cppflags_obst, "-std=c++98");
+ break;
+ case FILETYPE_ASSEMBLER:
+ add_flag(&cppflags_obst, "-x");
+ add_flag(&cppflags_obst, "assembler-with-cpp");
+ break;
+ default:
+ break;
+ }
+ obstack_printf(&cppflags_obst, "%s", common_flags);
+
+ /* handle dependency generation */
+ if (dep_target[0] != '\0') {
+ add_flag(&cppflags_obst, "-MF");
+ add_flag(&cppflags_obst, dep_target);
+ if (outname != NULL) {
+ add_flag(&cppflags_obst, "-MQ");
+ add_flag(&cppflags_obst, outname);
+ }
+ }
+ add_flag(&cppflags_obst, fname);