2021-02-08 07:12:43 +00:00
|
|
|
function __fish_tokenizer_state --description "Print the state of the tokenizer at the end of the given string"
|
2017-03-09 15:52:38 +00:00
|
|
|
# Go through the token char-by-char in a state machine.
|
|
|
|
# The states are:
|
|
|
|
# - normal - no quoting is active (the starting state)
|
|
|
|
# - single - open single-quote
|
|
|
|
# - double - open double
|
|
|
|
# - escaped - open \\ - the next character is non-special
|
|
|
|
# - single-escaped - open \\ inside single-quotes
|
|
|
|
# - double-escaped - open \\ inside double-quotes
|
|
|
|
|
2021-03-06 07:40:07 +00:00
|
|
|
argparse --min-args 1 --max-args 1 i/initial-state= -- $argv
|
2021-02-08 07:12:43 +00:00
|
|
|
or return 1
|
|
|
|
|
2017-03-09 15:52:38 +00:00
|
|
|
set -l state normal
|
2021-02-08 07:12:43 +00:00
|
|
|
if set -q _flag_initial_state
|
2021-12-13 10:42:16 +00:00
|
|
|
set state $_flag_initial_state
|
2021-02-08 07:12:43 +00:00
|
|
|
end
|
|
|
|
|
2021-03-06 07:40:07 +00:00
|
|
|
for char in (string split -- "" $argv[1])
|
2017-03-09 15:52:38 +00:00
|
|
|
switch $char
|
|
|
|
case "'" # single-quote
|
|
|
|
switch $state
|
|
|
|
case normal single-escaped
|
|
|
|
set state single
|
|
|
|
case single
|
|
|
|
set state normal
|
|
|
|
end
|
|
|
|
case '"' # double-quote
|
|
|
|
switch $state
|
|
|
|
case normal double-escaped
|
|
|
|
set state double
|
|
|
|
case double
|
|
|
|
set state normal
|
|
|
|
end
|
|
|
|
case \\ # backslash escapes the next character
|
|
|
|
switch $state
|
|
|
|
case double
|
|
|
|
set state double-escaped
|
|
|
|
case double-escaped
|
|
|
|
set state double
|
|
|
|
case single
|
|
|
|
set state single-escaped
|
|
|
|
case single-escaped
|
|
|
|
set state single
|
|
|
|
case normal
|
|
|
|
set state escaped
|
|
|
|
case escaped
|
|
|
|
set state normal
|
|
|
|
end
|
|
|
|
case "*" # Any other character
|
|
|
|
switch $state
|
|
|
|
case escaped
|
|
|
|
set state normal
|
|
|
|
case single-escaped
|
|
|
|
set state single
|
|
|
|
case double-escaped
|
|
|
|
set state double
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2021-02-08 07:12:43 +00:00
|
|
|
|
|
|
|
echo $state
|
2017-03-09 15:52:38 +00:00
|
|
|
end
|