+ va_start(ap, format);
+#ifdef _WIN32
+ int len =
+#endif
+ vsnprintf(buf, sizeof(buf), format, ap);
+ va_end(ap);
+
+ obstack_1grow(obst, ' ');
+#ifdef _WIN32
+ obstack_1grow(obst, '"');
+ obstack_grow(obst, buf, len);
+ obstack_1grow(obst, '"');
+#else
+ /* escape stuff... */
+ for (char *c = buf; *c != '\0'; ++c) {
+ switch(*c) {
+ case ' ':
+ case '"':
+ case '$':
+ case '&':
+ case '(':
+ case ')':
+ case ';':
+ case '<':
+ case '>':
+ case '\'':
+ case '\\':
+ case '\n':
+ case '\r':
+ case '\t':
+ case '`':
+ case '|':
+ obstack_1grow(obst, '\\');
+ /* FALLTHROUGH */
+ default:
+ obstack_1grow(obst, *c);
+ break;
+ }
+ }
+#endif
+}
+
+static const char *type_to_string(type_t *type)
+{
+ 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);
+ 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);
+ }