#!/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} }