1#!/usr/bin/wish
2
3# This file provides many valuable quote and metachar escape processing procedures.
4
5
6proc escape_bash_quotes { buffer } {
7
8  # Do a bash-style escape of all single quotes in the buffer and return the result.
9
10  # In bash, if you wish to have a single quote (i.e. apostrophe) inside single quotes, you must escape it.
11
12  # For example, the following bash command:
13  # echo 'Mike'\''s dog'
14  # Will produce the following output.
15  # Mike's dog
16
17  # So, if you pass the following string to this procedure:
18  # Mike's dog
19  # This procedure will return the following:
20  # Mike'\''s dog
21
22  # Description of argument(s):
23  # buffer                          The string whose single quotes are to be escaped.
24
25  regsub -all {'} $buffer {'\''} new_buffer
26  return $new_buffer
27
28}
29
30
31proc quotes_to_curly_braces { buffer } {
32
33  # Convert a single-quoted string to a curly brace-quoted string and return the result.
34
35  # This procedure can help in converting bash expressions, which are quoted with single quotes, to
36  # equivalent TCL expressions which are quoted with curly braces.  This procedure will recognize and
37  # preserve a bash single quote escape sequence: '\''
38
39  # Description of argument(s):
40  # buffer                          The string whose quotes are to be converted to curly braces.
41
42  # For example, the following code...
43
44  # set buffer {'Mike'\''s dog'}
45  # print_var buffer
46  # set buffer [quotes_to_curly_braces $buffer]
47  # print_var buffer
48
49  # Would produce the following result:
50  # buffer:     'Mike'\''s dog'
51  # buffer:     {Mike's dog}
52
53  set quote {'}
54
55  set return_buffer {}
56
57  set inside_quotes 0
58
59  # In a bash string "'\''" is an escaped quote which we wish to convert to a single quote.
60  set place_holder {supercaliforniaplace_holder}
61  regsub -all {'\\''} $buffer ${place_holder} buffer
62
63  # Walk the string one character at a time.
64  for {set ix 0} {$ix < [string length $buffer]} {incr ix} {
65    set char [string index $buffer $ix]
66    if { $char == $quote } {
67      # Processing a quote.  inside_quotes will tell us whether we've come across a left quote or a right
68      # quote.
69      if { $inside_quotes == 0 } {
70        # Processing closing quote.  Add a left curly brace to return_buffer and discard the quote char.
71        set return_buffer "${return_buffer}\{"
72        # Set inside_quotes to indicate we are now waiting for a closing quote.
73        set inside_quotes 1
74      } else {
75        # Processing opening quote.  Add a right curly brace to return_buffer and discard the quote char.
76        set return_buffer "${return_buffer}\}"
77        # Clear inside_quotes to indicate we have found our closing quote.
78        set inside_quotes 0
79      }
80    } else {
81      # For non-quote character, simply add it to the return buffer/
82      set return_buffer "${return_buffer}${char}"
83    }
84  }
85
86  regsub -all ${place_holder} $return_buffer {'} return_buffer
87
88  return $return_buffer
89
90}
91
92
93proc curly_braces_to_quotes { buffer } {
94
95  # Convert a curly brace-quoted string to a single-quoted string and return the result.
96
97  # This procedure can help in converting TCL expressions, which are quoted with curly braces, to equivalent
98  # bash expressions which are quoted with single quotes.  This procedure will first convert single quotes to
99  # the bash escaped single quote sequence: '\''
100
101  # Description of argument(s):
102  # buffer                          The string whose curly braces are to be converted to single quotes.
103
104  # For example, the following buffer value:
105  # echo {Mike's dog}
106  # Will be changed to this:
107  # echo 'Mike'\''s dog'
108
109  regsub -all {[\{\}]} [escape_bash_quotes $buffer] {'} new_buffer
110  return $new_buffer
111
112}
113
114
115proc escape_regex_metachars { buffer } {
116
117  # Escape every regex metacharacter found in buffer and return the result.
118
119  # Example code:
120
121  # set var1 {john*sm(]ith}
122  # print_vars var1
123  # set var1 [escape_regex_metachars $var1]
124  # print_vars var1
125
126  # Example output:
127
128  # var1:                        john*sm(]ith
129  # var1:                        john\*sm\(\]ith
130
131  # Description of argument(s):
132  # buffer                          The string whose regex metacharacters are to be escaped.
133
134  set escape_chars_regex {[\\\^\$\/\(\)\|\?\+\*\[\]\{\}\,\.]}
135  regsub -all ${escape_chars_regex} ${buffer} {\\\0} buffer
136  return ${buffer}
137
138}
139