2c3632d14f
Lots of code refactoring, simplification and cleanup. Lots of new unit-tests providing much higher code coverage. All courtesy of rillig at netbsd. Other significant changes: o new read-only variable .SHELL which provides the path of the shell used to run scripts (as defined by the .SHELL target). o variable parsing detects more errors. o new debug option -dl: LINT mode, does the equivalent of := for all variable assignments so that file and line number are reported for variable parse errors.
177 lines
4.6 KiB
Makefile
177 lines
4.6 KiB
Makefile
# $Id: moderrs.mk,v 1.1.1.8 2020/08/26 16:40:43 sjg Exp $
|
|
#
|
|
# various modifier error tests
|
|
|
|
VAR=TheVariable
|
|
# incase we have to change it ;-)
|
|
MOD_UNKN=Z
|
|
MOD_TERM=S,V,v
|
|
MOD_S:= ${MOD_TERM},
|
|
|
|
FIB= 1 1 2 3 5 8 13 21 34
|
|
|
|
all: modunkn modunknV varterm vartermV modtermV modloop
|
|
all: modloop-close
|
|
all: modwords
|
|
all: modexclam
|
|
all: mod-subst-delimiter
|
|
all: mod-regex-delimiter
|
|
all: mod-regex-undefined-subexpression
|
|
all: mod-ts-parse
|
|
all: mod-t-parse
|
|
all: mod-ifelse-parse
|
|
all: mod-remember-parse
|
|
all: mod-sysv-parse
|
|
|
|
modunkn:
|
|
@echo "Expect: Unknown modifier 'Z'"
|
|
@echo "VAR:Z=${VAR:Z}"
|
|
|
|
modunknV:
|
|
@echo "Expect: Unknown modifier 'Z'"
|
|
@echo "VAR:${MOD_UNKN}=${VAR:${MOD_UNKN}}"
|
|
|
|
varterm:
|
|
@echo "Expect: Unclosed variable specification for VAR"
|
|
@echo VAR:S,V,v,=${VAR:S,V,v,
|
|
|
|
vartermV:
|
|
@echo "Expect: Unclosed variable specification for VAR"
|
|
@echo VAR:${MOD_TERM},=${VAR:${MOD_S}
|
|
|
|
modtermV:
|
|
@echo "Expect: Unfinished modifier for VAR (',' missing)"
|
|
-@echo "VAR:${MOD_TERM}=${VAR:${MOD_TERM}}"
|
|
|
|
modloop:
|
|
@echo "Expect: 2 errors about missing @ delimiter"
|
|
@echo ${UNDEF:U1 2 3:@var}
|
|
@echo ${UNDEF:U1 2 3:@var@...}
|
|
@echo ${UNDEF:U1 2 3:@var@${var}@}
|
|
|
|
# The closing brace after the ${var} is part of the replacement string.
|
|
# In ParseModifierPart, braces and parentheses don't have to be balanced.
|
|
# This is contrary to the :M, :N modifiers, where both parentheses and
|
|
# braces must be balanced.
|
|
# This is also contrary to the SysV modifier, where only the actually
|
|
# used delimiter (either braces or parentheses) must be balanced.
|
|
modloop-close:
|
|
@echo $@:
|
|
@echo ${UNDEF:U1 2 3:@var@${var}}...@
|
|
@echo ${UNDEF:U1 2 3:@var@${var}}...@}
|
|
|
|
modwords:
|
|
@echo "Expect: 2 errors about missing ] delimiter"
|
|
@echo ${UNDEF:U1 2 3:[}
|
|
@echo ${UNDEF:U1 2 3:[#}
|
|
|
|
# out of bounds => empty
|
|
@echo 13=${UNDEF:U1 2 3:[13]}
|
|
|
|
# Word index out of bounds.
|
|
#
|
|
# On LP64I32, strtol returns LONG_MAX,
|
|
# which is then truncated to int (undefined behavior),
|
|
# typically resulting in -1.
|
|
# This -1 is interpreted as "the last word".
|
|
#
|
|
# On ILP32, strtol returns LONG_MAX,
|
|
# which is a large number.
|
|
# This results in a range from LONG_MAX - 1 to 3,
|
|
# which is empty.
|
|
@echo 12345=${UNDEF:U1 2 3:[123451234512345123451234512345]:S,^$,ok,:S,^3$,ok,}
|
|
|
|
modexclam:
|
|
@echo "Expect: 2 errors about missing ! delimiter"
|
|
@echo ${VARNAME:!echo}
|
|
# When the final exclamation mark is missing, there is no
|
|
# fallback to the SysV substitution modifier.
|
|
# If there were a fallback, the output would be "exclam",
|
|
# and the above would have produced an "Unknown modifier '!'".
|
|
@echo ${!:L:!=exclam}
|
|
|
|
mod-subst-delimiter:
|
|
@echo $@:
|
|
@echo ${VAR:S
|
|
@echo ${VAR:S,
|
|
@echo ${VAR:S,from
|
|
@echo ${VAR:S,from,
|
|
@echo ${VAR:S,from,to
|
|
@echo ${VAR:S,from,to,
|
|
@echo ${VAR:S,from,to,}
|
|
@echo 1: ${VAR:S
|
|
@echo 2: ${VAR:S,
|
|
@echo 3: ${VAR:S,from
|
|
@echo ${VAR:S,from,
|
|
@echo ${VAR:S,from,to
|
|
@echo ${VAR:S,from,to,
|
|
@echo ${VAR:S,from,to,}
|
|
|
|
mod-regex-delimiter:
|
|
@echo $@:
|
|
@echo ${VAR:C
|
|
@echo ${VAR:C,
|
|
@echo ${VAR:C,from
|
|
@echo ${VAR:C,from,
|
|
@echo ${VAR:C,from,to
|
|
@echo ${VAR:C,from,to,
|
|
@echo ${VAR:C,from,to,}
|
|
@echo 1: ${VAR:C
|
|
@echo 2: ${VAR:C,
|
|
@echo 3: ${VAR:C,from
|
|
@echo ${VAR:C,from,
|
|
@echo ${VAR:C,from,to
|
|
@echo ${VAR:C,from,to,
|
|
@echo ${VAR:C,from,to,}
|
|
|
|
# In regular expressions with alternatives, not all capturing groups are
|
|
# always set; some may be missing. Warn about these.
|
|
#
|
|
# Since there is no way to turn off this warning, the combination of
|
|
# alternative matches and capturing groups is not widely used.
|
|
#
|
|
# A newly added modifier 'U' such as in :C,(a.)|(b.),\1\2,U might be added
|
|
# for treating undefined capturing groups as empty, but that would create a
|
|
# syntactical ambiguity since the :S and :C modifiers are open-ended (see
|
|
# mod-subst-chain). Luckily the modifier :U does not make sense after :C,
|
|
# therefore this case does not happen in practice.
|
|
# The sub-modifier for the :C modifier would have to be chosen wisely.
|
|
mod-regex-undefined-subexpression:
|
|
@echo $@:
|
|
@echo ${FIB:C,1(.*),one\1,} # all ok
|
|
@echo ${FIB:C,1(.*)|2(.*),(\1)+(\2),:Q} # no match for subexpression
|
|
|
|
mod-ts-parse:
|
|
@echo $@:
|
|
@echo ${FIB:ts}
|
|
@echo ${FIB:ts\65} # octal 065 == U+0035 == '5'
|
|
@echo ${FIB:ts\65oct} # bad modifier
|
|
@echo ${FIB:tsxy} # modifier too long
|
|
|
|
mod-t-parse:
|
|
@echo $@:
|
|
@echo ${FIB:t
|
|
@echo ${FIB:txy}
|
|
@echo ${FIB:t}
|
|
@echo ${FIB:t:M*}
|
|
|
|
mod-ifelse-parse:
|
|
@echo $@:
|
|
@echo ${FIB:?
|
|
@echo ${FIB:?then
|
|
@echo ${FIB:?then:
|
|
@echo ${FIB:?then:else
|
|
@echo ${FIB:?then:else}
|
|
|
|
mod-remember-parse:
|
|
@echo $@:
|
|
@echo ${FIB:_} # ok
|
|
@echo ${FIB:__} # modifier name too long
|
|
|
|
mod-sysv-parse:
|
|
@echo $@:
|
|
@echo ${FIB:3
|
|
@echo ${FIB:3=
|
|
@echo ${FIB:3=x3
|
|
@echo ${FIB:3=x3} # ok
|