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