blob: d5f36e4caf8293ef65dbf750eb648d25f9a81bf8 [file] [log] [blame]
#!/usr/bin/wish
# This file provides many valuable quote and metachar escape processing procedures.
proc escape_bash_quotes { buffer } {
# Do a bash-style escape of all single quotes in the buffer and return the result.
# In bash, if you wish to have a single quote (i.e. apostrophe) inside single quotes, you must escape it.
# For example, the following bash command:
# echo 'Mike'\''s dog'
# Will produce the following output.
# Mike's dog
# So, if you pass the following string to this procedure:
# Mike's dog
# This procedure will return the following:
# Mike'\''s dog
# Description of argument(s):
# buffer The string whose single quotes are to be escaped.
regsub -all {'} $buffer {'\''} new_buffer
return $new_buffer
}
proc quotes_to_curly_braces { buffer } {
# Convert a single-quoted string to a curly brace-quoted string and return the result.
# This procedure can help in converting bash expressions, which are quoted with single quotes, to
# equivalent TCL expressions which are quoted with curly braces. This procedure will recognize and
# preserve a bash single quote escape sequence: '\''
# Description of argument(s):
# buffer The string whose quotes are to be converted to curly braces.
# For example, the following code...
# set buffer {'Mike'\''s dog'}
# print_var buffer
# set buffer [quotes_to_curly_braces $buffer]
# print_var buffer
# Would produce the following result:
# buffer: 'Mike'\''s dog'
# buffer: {Mike's dog}
set quote {'}
set return_buffer {}
set inside_quotes 0
# In a bash string "'\''" is an escaped quote which we wish to convert to a single quote.
set place_holder {supercaliforniaplace_holder}
regsub -all {'\\''} $buffer ${place_holder} buffer
# Walk the string one character at a time.
for {set ix 0} {$ix < [string length $buffer]} {incr ix} {
set char [string index $buffer $ix]
if { $char == $quote } {
# Processing a quote. inside_quotes will tell us whether we've come across a left quote or a right
# quote.
if { $inside_quotes == 0 } {
# Processing closing quote. Add a left curly brace to return_buffer and discard the quote char.
set return_buffer "${return_buffer}\{"
# Set inside_quotes to indicate we are now waiting for a closing quote.
set inside_quotes 1
} else {
# Processing opening quote. Add a right curly brace to return_buffer and discard the quote char.
set return_buffer "${return_buffer}\}"
# Clear inside_quotes to indicate we have found our closing quote.
set inside_quotes 0
}
} else {
# For non-quote character, simply add it to the return buffer/
set return_buffer "${return_buffer}${char}"
}
}
regsub -all ${place_holder} $return_buffer {'} return_buffer
return $return_buffer
}
proc curly_braces_to_quotes { buffer } {
# Convert a curly brace-quoted string to a single-quoted string and return the result.
# This procedure can help in converting TCL expressions, which are quoted with curly braces, to equivalent
# bash expressions which are quoted with single quotes. This procedure will first convert single quotes to
# the bash escaped single quote sequence: '\''
# Description of argument(s):
# buffer The string whose curly braces are to be converted to single quotes.
# For example, the following buffer value:
# echo {Mike's dog}
# Will be changed to this:
# echo 'Mike'\''s dog'
regsub -all {[\{\}]} [escape_bash_quotes $buffer] {'} new_buffer
return $new_buffer
}
proc escape_regex_metachars { buffer } {
# Escape every regex metacharacter found in buffer and return the result.
# Example code:
# set var1 {john*sm(]ith}
# print_vars var1
# set var1 [escape_regex_metachars $var1]
# print_vars var1
# Example output:
# var1: john*sm(]ith
# var1: john\*sm\(\]ith
# Description of argument(s):
# buffer The string whose regex metacharacters are to be escaped.
set escape_chars_regex {[\\\^\$\/\(\)\|\?\+\*\[\]\{\}\,\.]}
regsub -all ${escape_chars_regex} ${buffer} {\\\0} buffer
return ${buffer}
}