fish-shell/share/functions/__fish_tokenizer_state.fish

70 lines
2.7 KiB
Fish
Raw Normal View History

function __fish_tokenizer_state --description "Print the state of the tokenizer at the end of the given string"
# 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
# Don't expect one arg only, as (commandline -ct) may evaluate to multiple arguments since
# output is forcibly split on new lines (issue #7782).
argparse --min-args 1 i/initial-state= -- $argv
or return 1
set -l state normal
if set -q _flag_initial_state
set str $_flag_initial_state
end
# HACK: We care about quotes and don't care about new lines, joining multi-line arguments
# produced by (commandline -ct) on anything other than \n will corrupt the contents but will
# allow the following logic to work (including escape of subsequent character). This entire
# function should probably be implemented as part of the `commandline` builtin.
for char in (string split -- "" (string join -- \x1e $argv))
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
echo $state
end