static void get_output_name(char *buf, size_t buflen, const char *inputname,
const char *newext)
{
- size_t last_dot = 0xffffffff;
- size_t i = 0;
-
- if (inputname == NULL) {
- snprintf(buf, buflen, "a%s", newext);
- return;
- }
-
- for (const char *c = inputname; *c != 0; ++c) {
- if (*c == '.')
- last_dot = i;
- ++i;
- }
- if (last_dot == 0xffffffff)
- last_dot = i;
-
- if (last_dot >= buflen)
- panic("filename too long");
- memcpy(buf, inputname, last_dot);
-
- size_t extlen = strlen(newext) + 1;
- if (extlen + last_dot >= buflen)
+ if (inputname == NULL)
+ inputname = "a";
+
+ char const *const last_slash = strrchr(inputname, '/');
+ char const *const filename =
+ last_slash != NULL ? last_slash + 1 : inputname;
+ char const *const last_dot = strrchr(filename, '.');
+ char const *const name_end =
+ last_dot != NULL ? last_dot : strchr(filename, '\0');
+
+ int const len = snprintf(buf, buflen, "%.*s%s",
+ (int)(name_end - filename), filename, newext);
+#ifdef _WIN32
+ if (len < 0 || buflen <= (size_t)len)
+#else
+ if (buflen <= (size_t)len)
+#endif
panic("filename too long");
- memcpy(buf+last_dot, newext, extlen);
}
#include "builtins.h"
fprintf(stderr, "Usage %s input [-o output] [-c]\n", argv0);
}
-static void print_cparser_version(void) {
+static void print_cparser_version(void)
+{
printf("cparser (%s) using libFirm (%u.%u",
cparser_REVISION, ir_get_version_major(),
ir_get_version_minor());
opt += 3;
}
- if (streq(opt, "dollars-in-identifiers")) {
- allow_dollar_in_symbol = truth_value;
- } if (streq(opt, "builtins")) {
+ if (streq(opt, "builtins")) {
use_builtins = truth_value;
+ } else if (streq(opt, "dollars-in-identifiers")) {
+ allow_dollar_in_symbol = truth_value;
+ } else if (streq(opt, "omit-frame-pointer")) {
+ set_be_option(truth_value ? "omitfp" : "omitfp=no");
} else if (streq(opt, "short-wchar")) {
wchar_atomic_kind = truth_value ? ATOMIC_TYPE_USHORT
: ATOMIC_TYPE_INT;
- } else if (streq(opt, "syntax-only")) {
- mode = truth_value ? ParseOnly : CompileAssembleLink;
- } else if (streq(opt, "omit-frame-pointer")) {
- set_be_option(truth_value ? "omitfp" : "omitfp=no");
+ } else if (streq(opt, "signed-char")) {
+ char_is_signed = truth_value;
} else if (streq(opt, "strength-reduce")) {
firm_option(truth_value ? "strength-red" : "no-strength-red");
+ } else if (streq(opt, "syntax-only")) {
+ mode = truth_value ? ParseOnly : CompileAssembleLink;
+ } else if (streq(opt, "unsigned-char")) {
+ char_is_signed = !truth_value;
} else if (streq(opt, "fast-math") ||
streq(opt, "jump-tables") ||
streq(opt, "unroll-loops") ||
} else if (streq(option, "no-ms")) {
features_on &= ~_MS;
features_off |= _MS;
- } else if (streq(option, "signed-chars")) {
- char_is_signed = true;
- } else if (streq(option, "unsigned-chars")) {
- char_is_signed = false;
} else if (streq(option, "strict")) {
strict_mode = true;
} else if (streq(option, "lextest")) {
/* we do the lowering in ast2firm */
firm_opt.lower_bitfields = FALSE;
+ /* set the c_mode here, types depends on it */
+ c_mode |= features_on;
+ c_mode &= ~features_off;
+
gen_firm_init();
init_symbol_table();
init_types();
do_parsing:
c_mode |= features_on;
c_mode &= ~features_off;
+
init_tokens();
translation_unit_t *const unit = do_parsing(in, filename);