diff --git a/include/gfx/main.hpp b/include/gfx/main.hpp index 52001389..bcaf69a5 100644 --- a/include/gfx/main.hpp +++ b/include/gfx/main.hpp @@ -41,7 +41,6 @@ struct Options { uint16_t height; uint32_t right() const { return left + width * 8; } uint32_t bottom() const { return top + height * 8; } - bool specified() const { return left || top || width || height; } } inputSlice{0, 0, 0, 0}; // -L (margins in clockwise order, like CSS) uint8_t basePalID = 0; // -l std::array maxNbTiles{UINT16_MAX, 0}; // -N diff --git a/src/gfx/main.cpp b/src/gfx/main.cpp index 24959c0d..d550c39d 100644 --- a/src/gfx/main.cpp +++ b/src/gfx/main.cpp @@ -632,7 +632,8 @@ static void verboseOutputConfig() { fputs("\t]\n", stderr); } // -L/--slice - if (options.inputSlice.specified()) { + if (options.inputSlice.width || options.inputSlice.height || options.inputSlice.left + || options.inputSlice.top) { fprintf( stderr, "\tInput image slice: %" PRIu16 "x%" PRIu16 " pixels starting at (%" PRIu16 ", %" PRIu16 diff --git a/src/util.cpp b/src/util.cpp index c530d135..24bf6f5a 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -84,6 +84,8 @@ std::optional parseNumber(char const *&str, NumberBase base) { // Identify the base if not specified // Does *not* support '+' or '-' sign prefix (unlike `strtoul` and `std::from_chars`) if (base == BASE_AUTO) { + base = BASE_10; + // Skips leading blank space (like `strtoul`) str += strspn(str, " \t"); @@ -118,17 +120,10 @@ std::optional parseNumber(char const *&str, NumberBase base) { base = BASE_16; str += 2; break; - default: - base = BASE_10; - break; } break; - default: - base = BASE_10; - break; } } - assume(base != BASE_AUTO); // Get the digit-condition function corresponding to the base bool (*canParseDigit)(int c) = base == BASE_2 ? isBinDigit diff --git a/test/asm/backtrace-collapsed.asm b/test/asm/backtrace-collapsed.asm new file mode 100644 index 00000000..a9a39643 --- /dev/null +++ b/test/asm/backtrace-collapsed.asm @@ -0,0 +1,15 @@ +macro careful + if _NARG == 20 + warn "You're in too deep!" + else + careful \#, deeper + endc +endm +careful surface + +macro recurse + recurse +endm +rept 3 + recurse +endr diff --git a/test/asm/backtrace-collapsed.err b/test/asm/backtrace-collapsed.err new file mode 100644 index 00000000..5cf05544 --- /dev/null +++ b/test/asm/backtrace-collapsed.err @@ -0,0 +1,4 @@ +warning: You're in too deep! [-Wuser] + at backtrace-collapsed.asm::careful(3) <- backtrace-collapsed.asm::careful(5) <- backtrace-collapsed.asm::careful(5) <- ...16 more... <- backtrace-collapsed.asm::careful(5) <- backtrace-collapsed.asm(8) +FATAL: Recursion limit (64) exceeded + at backtrace-collapsed.asm::recurse(11) <- backtrace-collapsed.asm::recurse(11) <- backtrace-collapsed.asm::recurse(11) <- ...60 more... <- backtrace-collapsed.asm::REPT~1(14) <- backtrace-collapsed.asm(13) diff --git a/test/asm/backtrace-collapsed.flags b/test/asm/backtrace-collapsed.flags new file mode 100644 index 00000000..4becafe6 --- /dev/null +++ b/test/asm/backtrace-collapsed.flags @@ -0,0 +1 @@ +-B 5 -B collapse diff --git a/test/asm/cli/empty-s-feature.err b/test/asm/cli/empty-s-feature.err new file mode 100644 index 00000000..bd1d26b3 --- /dev/null +++ b/test/asm/cli/empty-s-feature.err @@ -0,0 +1 @@ +FATAL: Empty feature for option '-s' diff --git a/test/asm/cli/empty-s-feature.flags b/test/asm/cli/empty-s-feature.flags new file mode 100644 index 00000000..a05de48f --- /dev/null +++ b/test/asm/cli/empty-s-feature.flags @@ -0,0 +1 @@ +-s :- diff --git a/test/asm/cli/invalid-color.flags b/test/asm/cli/invalid-color.flags index 155f9e88..e9becb2a 100644 --- a/test/asm/cli/invalid-color.flags +++ b/test/asm/cli/invalid-color.flags @@ -1 +1 @@ ---color yes +--color=always --color=never --color=auto --color=yes diff --git a/test/asm/cli/invalid-s-feature.err b/test/asm/cli/invalid-s-feature.err new file mode 100644 index 00000000..16f6ba9a --- /dev/null +++ b/test/asm/cli/invalid-s-feature.err @@ -0,0 +1 @@ +FATAL: Invalid feature for option '-s': "invalid" diff --git a/test/asm/cli/invalid-s-feature.flags b/test/asm/cli/invalid-s-feature.flags new file mode 100644 index 00000000..e1fa0082 --- /dev/null +++ b/test/asm/cli/invalid-s-feature.flags @@ -0,0 +1 @@ +-s invalid:- diff --git a/test/asm/disable-warnings.asm b/test/asm/disable-warnings.asm new file mode 100644 index 00000000..4e050ffc --- /dev/null +++ b/test/asm/disable-warnings.asm @@ -0,0 +1,10 @@ +MACRO test + assert warn, 0, "-Wassert is on by default" + warn "-Wuser is on by default" +ENDM + +test ; no warnings because of -w +OPT -Weverything +test ; still no warnings because of -w +OPT Werror=everything +test ; now errors can occur diff --git a/test/asm/disable-warnings.flags b/test/asm/disable-warnings.flags new file mode 100644 index 00000000..e1350473 --- /dev/null +++ b/test/asm/disable-warnings.flags @@ -0,0 +1 @@ +-w diff --git a/test/asm/loud-backtrace.flags b/test/asm/loud-backtrace.flags index fbe5fd01..9e9e9ddc 100644 --- a/test/asm/loud-backtrace.flags +++ b/test/asm/loud-backtrace.flags @@ -1 +1 @@ --B all +-B no-all -B all diff --git a/test/asm/make-deps.asm b/test/asm/make-deps.asm new file mode 100644 index 00000000..e69de29b diff --git a/test/asm/make-deps.flags b/test/asm/make-deps.flags new file mode 100644 index 00000000..79d5c00e --- /dev/null +++ b/test/asm/make-deps.flags @@ -0,0 +1 @@ +-M - -MT preserve$dollars$$ -MQ escape$dollars$$ diff --git a/test/asm/make-deps.out b/test/asm/make-deps.out new file mode 100644 index 00000000..201f4867 --- /dev/null +++ b/test/asm/make-deps.out @@ -0,0 +1 @@ +preserve$dollars$$ escape$$dollars$$$$: make-deps.asm diff --git a/test/asm/opt-r.flags b/test/asm/opt-r.flags new file mode 100644 index 00000000..843dac5e --- /dev/null +++ b/test/asm/opt-r.flags @@ -0,0 +1 @@ +-r9 -r$f -r%1 -r&7 -r0xFF -r0b11 -r0o77 -r64 diff --git a/test/asm/state-features.asm b/test/asm/state-features.asm new file mode 100644 index 00000000..c3c2b268 --- /dev/null +++ b/test/asm/state-features.asm @@ -0,0 +1,7 @@ +MACRO one +!@#$%^&* /* anything */ :'<,>./? ; goes! +ENDM +CHARMAP "char", 2, 3 +DEF string EQUS "four" +DEF variable = 5 +DEF constant EQU 6 diff --git a/test/asm/state-features.err b/test/asm/state-features.err new file mode 100644 index 00000000..b6193cc9 --- /dev/null +++ b/test/asm/state-features.err @@ -0,0 +1,2 @@ +warning: Ignoring duplicate feature for option '-s': "equ" +warning: Redundant feature before "all" for option '-s' diff --git a/test/asm/state-features.flags b/test/asm/state-features.flags new file mode 100644 index 00000000..c1c49bd3 --- /dev/null +++ b/test/asm/state-features.flags @@ -0,0 +1 @@ +-s equ,var,equ,all:- diff --git a/test/asm/state-features.out b/test/asm/state-features.out new file mode 100644 index 00000000..4e9ae314 --- /dev/null +++ b/test/asm/state-features.out @@ -0,0 +1,19 @@ +; File generated by rgbasm + +; Numeric constants +def constant equ $6 + +; Variables +def variable = $5 + +; String constants +def string equs "four" + +; Character maps +newcharmap main +charmap "char", $2, $3 + +; Macros +macro one +!@#$%^&* /* anything */ :'<,>./? ; goes! +endm diff --git a/test/asm/test.sh b/test/asm/test.sh index 6d51a36a..5c879603 100755 --- a/test/asm/test.sh +++ b/test/asm/test.sh @@ -84,10 +84,11 @@ for i in *.asm notexist.asm; do desired_output=$desired_outname desired_errput=$desired_errname else - # `include-recursion.asm` refers to its own name inside the test code. - # "notexist" doesn't exist, so there's no point in trying to `cat` it. - # Skip testing with stdin input for those file. - if [[ "$i" = include-recursion.asm || "$i" = notexist.asm ]]; then + # "include-recursion.asm" refers to its own name inside the test code. + # "make-deps.asm" refers to its output filename in its desired output. + # "notexist.asm" doesn't exist, so there's no point in trying to `cat` it. + # Skip testing with stdin input for those files. + if [[ "$i" = include-recursion.asm || "$i" = make-deps.asm || "$i" = notexist.asm ]]; then continue fi @@ -193,18 +194,20 @@ i="state-file" if which cygpath &>/dev/null; then # MinGW translates path names before passing them as command-line arguments, # but does not do so when they are prefixed, so we have to do it ourselves. - RGBASMFLAGS="-Weverything -Bcollapse -s all:$(cygpath -w "$o")" + state_outname="$(cygpath -w "$o")" else - RGBASMFLAGS="-Weverything -Bcollapse -s all:$o" + state_outname="$o" fi +state_features=" all " # Test trimming whitespace +RGBASMFLAGS="-Weverything -Bcollapse" for variant in '' '.pipe'; do (( tests++ )) echo "${bold}${green}${i%.asm}${variant}...${rescolors}${resbold}" if [ -z "$variant" ]; then - "$RGBASM" $RGBASMFLAGS "$i"/a.asm >"$output" 2>"$errput" + "$RGBASM" $RGBASMFLAGS -s "$state_features:$state_outname" "$i"/a.asm >"$output" 2>"$errput" else # shellcheck disable=SC2002 - cat "$i"/a.asm | "$RGBASM" $RGBASMFLAGS - >"$output" 2>"$errput" + cat "$i"/a.asm | "$RGBASM" $RGBASMFLAGS -s "$state_features:$state_outname" - >"$output" 2>"$errput" fi tryDiff /dev/null "$output" out diff --git a/test/asm/unknown-warning.asm b/test/asm/unknown-warning.asm new file mode 100644 index 00000000..e69de29b diff --git a/test/asm/unknown-warning.err b/test/asm/unknown-warning.err new file mode 100644 index 00000000..3d88681e --- /dev/null +++ b/test/asm/unknown-warning.err @@ -0,0 +1,2 @@ +warning: Unknown warning flag "noexist" +warning: Unknown warning flag parameter "noexistparam=2" diff --git a/test/asm/unknown-warning.flags b/test/asm/unknown-warning.flags new file mode 100644 index 00000000..55c3eaac --- /dev/null +++ b/test/asm/unknown-warning.flags @@ -0,0 +1 @@ +-Wnoexist -Wnoexistparam=2 diff --git a/test/asm/warning-as-error.asm b/test/asm/warning-as-error.asm new file mode 100644 index 00000000..7d2c1231 --- /dev/null +++ b/test/asm/warning-as-error.asm @@ -0,0 +1,14 @@ +DEF n = -99 >> 1 ; -Wshift +DEF n = 999_999_999_999 ; -Wlarge-constant + +MACRO test + WARN "warning or error?" +ENDM + +test + +OPT Werror +test + +OPT Wno-error +test diff --git a/test/asm/warning-as-error.err b/test/asm/warning-as-error.err new file mode 100644 index 00000000..2c0f5433 --- /dev/null +++ b/test/asm/warning-as-error.err @@ -0,0 +1,10 @@ +warning: Shifting right negative value -99 [-Wshift] + at warning-as-error.asm(1) +error: Integer constant is too large [-Werror=large-constant] + at warning-as-error.asm(2) +warning: warning or error? [-Wuser] + at warning-as-error.asm::test(5) <- warning-as-error.asm(8) +error: warning or error? [-Werror=user] + at warning-as-error.asm::test(5) <- warning-as-error.asm(11) +warning: warning or error? [-Wuser] + at warning-as-error.asm::test(5) <- warning-as-error.asm(14) diff --git a/test/asm/warning-as-error.flags b/test/asm/warning-as-error.flags new file mode 100644 index 00000000..9c1bb799 --- /dev/null +++ b/test/asm/warning-as-error.flags @@ -0,0 +1 @@ +-Werror=shift -Wno-error=shift -Werror=large-constant