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