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