[25] | 1 | '\" |
---|
| 2 | '\" Copyright (c) 1989-1993 The Regents of the University of California. |
---|
| 3 | '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. |
---|
| 4 | '\" |
---|
| 5 | '\" See the file "license.terms" for information on usage and redistribution |
---|
| 6 | '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. |
---|
| 7 | '\" |
---|
| 8 | '\" RCS: @(#) $Id: SplitList.3,v 1.13 2007/12/13 15:22:32 dgp Exp $ |
---|
| 9 | '\" |
---|
| 10 | .so man.macros |
---|
| 11 | .TH Tcl_SplitList 3 8.0 Tcl "Tcl Library Procedures" |
---|
| 12 | .BS |
---|
| 13 | .SH NAME |
---|
| 14 | Tcl_SplitList, Tcl_Merge, Tcl_ScanElement, Tcl_ConvertElement, Tcl_ScanCountedElement, Tcl_ConvertCountedElement \- manipulate Tcl lists |
---|
| 15 | .SH SYNOPSIS |
---|
| 16 | .nf |
---|
| 17 | \fB#include <tcl.h>\fR |
---|
| 18 | .sp |
---|
| 19 | int |
---|
| 20 | \fBTcl_SplitList\fR(\fIinterp, list, argcPtr, argvPtr\fR) |
---|
| 21 | .sp |
---|
| 22 | char * |
---|
| 23 | \fBTcl_Merge\fR(\fIargc, argv\fR) |
---|
| 24 | .sp |
---|
| 25 | int |
---|
| 26 | \fBTcl_ScanElement\fR(\fIsrc, flagsPtr\fR) |
---|
| 27 | .sp |
---|
| 28 | int |
---|
| 29 | \fBTcl_ScanCountedElement\fR(\fIsrc, length, flagsPtr\fR) |
---|
| 30 | .sp |
---|
| 31 | int |
---|
| 32 | \fBTcl_ConvertElement\fR(\fIsrc, dst, flags\fR) |
---|
| 33 | .sp |
---|
| 34 | int |
---|
| 35 | \fBTcl_ConvertCountedElement\fR(\fIsrc, length, dst, flags\fR) |
---|
| 36 | .SH ARGUMENTS |
---|
| 37 | .AS "const char *const" ***argvPtr out |
---|
| 38 | .AP Tcl_Interp *interp out |
---|
| 39 | Interpreter to use for error reporting. If NULL, then no error message |
---|
| 40 | is left. |
---|
| 41 | .AP char *list in |
---|
| 42 | Pointer to a string with proper list structure. |
---|
| 43 | .AP int *argcPtr out |
---|
| 44 | Filled in with number of elements in \fIlist\fR. |
---|
| 45 | .AP "const char" ***argvPtr out |
---|
| 46 | \fI*argvPtr\fR will be filled in with the address of an array of |
---|
| 47 | pointers to the strings that are the extracted elements of \fIlist\fR. |
---|
| 48 | There will be \fI*argcPtr\fR valid entries in the array, followed by |
---|
| 49 | a NULL entry. |
---|
| 50 | .AP int argc in |
---|
| 51 | Number of elements in \fIargv\fR. |
---|
| 52 | .AP "const char *const" *argv in |
---|
| 53 | Array of strings to merge together into a single list. |
---|
| 54 | Each string will become a separate element of the list. |
---|
| 55 | .AP "const char" *src in |
---|
| 56 | String that is to become an element of a list. |
---|
| 57 | .AP int *flagsPtr in |
---|
| 58 | Pointer to word to fill in with information about \fIsrc\fR. |
---|
| 59 | The value of *\fIflagsPtr\fR must be passed to \fBTcl_ConvertElement\fR. |
---|
| 60 | .AP int length in |
---|
| 61 | Number of bytes in string \fIsrc\fR. |
---|
| 62 | .AP char *dst in |
---|
| 63 | Place to copy converted list element. Must contain enough characters |
---|
| 64 | to hold converted string. |
---|
| 65 | .AP int flags in |
---|
| 66 | Information about \fIsrc\fR. Must be value returned by previous |
---|
| 67 | call to \fBTcl_ScanElement\fR, possibly OR-ed |
---|
| 68 | with \fBTCL_DONT_USE_BRACES\fR. |
---|
| 69 | .BE |
---|
| 70 | |
---|
| 71 | .SH DESCRIPTION |
---|
| 72 | .PP |
---|
| 73 | These procedures may be used to disassemble and reassemble Tcl lists. |
---|
| 74 | \fBTcl_SplitList\fR breaks a list up into its constituent elements, |
---|
| 75 | returning an array of pointers to the elements using |
---|
| 76 | \fIargcPtr\fR and \fIargvPtr\fR. |
---|
| 77 | While extracting the arguments, \fBTcl_SplitList\fR obeys the usual |
---|
| 78 | rules for backslash substitutions and braces. The area of |
---|
| 79 | memory pointed to by \fI*argvPtr\fR is dynamically allocated; in |
---|
| 80 | addition to the array of pointers, it |
---|
| 81 | also holds copies of all the list elements. It is the caller's |
---|
| 82 | responsibility to free up all of this storage. |
---|
| 83 | For example, suppose that you have called \fBTcl_SplitList\fR with |
---|
| 84 | the following code: |
---|
| 85 | .CS |
---|
| 86 | int argc, code; |
---|
| 87 | char *string; |
---|
| 88 | char **argv; |
---|
| 89 | \&... |
---|
| 90 | code = Tcl_SplitList(interp, string, &argc, &argv); |
---|
| 91 | .CE |
---|
| 92 | Then you should eventually free the storage with a call like the |
---|
| 93 | following: |
---|
| 94 | .CS |
---|
| 95 | Tcl_Free((char *) argv); |
---|
| 96 | .CE |
---|
| 97 | .PP |
---|
| 98 | \fBTcl_SplitList\fR normally returns \fBTCL_OK\fR, which means the list was |
---|
| 99 | successfully parsed. |
---|
| 100 | If there was a syntax error in \fIlist\fR, then \fBTCL_ERROR\fR is returned |
---|
| 101 | and the interpreter's result will point to an error message describing the |
---|
| 102 | problem (if \fIinterp\fR was not NULL). |
---|
| 103 | If \fBTCL_ERROR\fR is returned then no memory is allocated and \fI*argvPtr\fR |
---|
| 104 | is not modified. |
---|
| 105 | .PP |
---|
| 106 | \fBTcl_Merge\fR is the inverse of \fBTcl_SplitList\fR: it |
---|
| 107 | takes a collection of strings given by \fIargc\fR |
---|
| 108 | and \fIargv\fR and generates a result string |
---|
| 109 | that has proper list structure. |
---|
| 110 | This means that commands like \fBindex\fR may be used to |
---|
| 111 | extract the original elements again. |
---|
| 112 | In addition, if the result of \fBTcl_Merge\fR is passed to \fBTcl_Eval\fR, |
---|
| 113 | it will be parsed into \fIargc\fR words whose values will |
---|
| 114 | be the same as the \fIargv\fR strings passed to \fBTcl_Merge\fR. |
---|
| 115 | \fBTcl_Merge\fR will modify the list elements with braces and/or |
---|
| 116 | backslashes in order to produce proper Tcl list structure. |
---|
| 117 | The result string is dynamically allocated |
---|
| 118 | using \fBTcl_Alloc\fR; the caller must eventually release the space |
---|
| 119 | using \fBTcl_Free\fR. |
---|
| 120 | .PP |
---|
| 121 | If the result of \fBTcl_Merge\fR is passed to \fBTcl_SplitList\fR, |
---|
| 122 | the elements returned by \fBTcl_SplitList\fR will be identical to |
---|
| 123 | those passed into \fBTcl_Merge\fR. |
---|
| 124 | However, the converse is not true: if \fBTcl_SplitList\fR |
---|
| 125 | is passed a given string, and the resulting \fIargc\fR and |
---|
| 126 | \fIargv\fR are passed to \fBTcl_Merge\fR, the resulting string |
---|
| 127 | may not be the same as the original string passed to \fBTcl_SplitList\fR. |
---|
| 128 | This is because \fBTcl_Merge\fR may use backslashes and braces |
---|
| 129 | differently than the original string. |
---|
| 130 | .PP |
---|
| 131 | \fBTcl_ScanElement\fR and \fBTcl_ConvertElement\fR are the |
---|
| 132 | procedures that do all of the real work of \fBTcl_Merge\fR. |
---|
| 133 | \fBTcl_ScanElement\fR scans its \fIsrc\fR argument |
---|
| 134 | and determines how to use backslashes and braces |
---|
| 135 | when converting it to a list element. |
---|
| 136 | It returns an overestimate of the number of characters |
---|
| 137 | required to represent \fIsrc\fR as a list element, and |
---|
| 138 | it stores information in \fI*flagsPtr\fR that is needed |
---|
| 139 | by \fBTcl_ConvertElement\fR. |
---|
| 140 | .PP |
---|
| 141 | \fBTcl_ConvertElement\fR is a companion procedure to \fBTcl_ScanElement\fR. |
---|
| 142 | It does the actual work of converting a string to a list element. |
---|
| 143 | Its \fIflags\fR argument must be the same as the value returned |
---|
| 144 | by \fBTcl_ScanElement\fR. |
---|
| 145 | \fBTcl_ConvertElement\fR writes a proper list element to memory |
---|
| 146 | starting at *\fIdst\fR and returns a count of the total number |
---|
| 147 | of characters written, which will be no more than the result |
---|
| 148 | returned by \fBTcl_ScanElement\fR. |
---|
| 149 | \fBTcl_ConvertElement\fR writes out only the actual list element |
---|
| 150 | without any leading or trailing spaces: it is up to the caller to |
---|
| 151 | include spaces between adjacent list elements. |
---|
| 152 | .PP |
---|
| 153 | \fBTcl_ConvertElement\fR uses one of two different approaches to |
---|
| 154 | handle the special characters in \fIsrc\fR. Wherever possible, it |
---|
| 155 | handles special characters by surrounding the string with braces. |
---|
| 156 | This produces clean-looking output, but cannot be used in some situations, |
---|
| 157 | such as when \fIsrc\fR contains unmatched braces. |
---|
| 158 | In these situations, \fBTcl_ConvertElement\fR handles special |
---|
| 159 | characters by generating backslash sequences for them. |
---|
| 160 | The caller may insist on the second approach by OR-ing the |
---|
| 161 | flag value returned by \fBTcl_ScanElement\fR with |
---|
| 162 | \fBTCL_DONT_USE_BRACES\fR. |
---|
| 163 | Although this will produce an uglier result, it is useful in some |
---|
| 164 | special situations, such as when \fBTcl_ConvertElement\fR is being |
---|
| 165 | used to generate a portion of an argument for a Tcl command. |
---|
| 166 | In this case, surrounding \fIsrc\fR with curly braces would cause |
---|
| 167 | the command not to be parsed correctly. |
---|
| 168 | .PP |
---|
| 169 | .VS 8.5 |
---|
| 170 | By default, \fBTcl_ConvertElement\fR will use quoting in its output |
---|
| 171 | to be sure the first character of an element is not the hash |
---|
| 172 | character |
---|
| 173 | .PQ # . |
---|
| 174 | This is to be sure the first element of any list |
---|
| 175 | passed to \fBeval\fR is not mis-parsed as the beginning of a comment. |
---|
| 176 | When a list element is not the first element of a list, this quoting |
---|
| 177 | is not necessary. When the caller can be sure that the element is |
---|
| 178 | not the first element of a list, it can disable quoting of the leading |
---|
| 179 | hash character by OR-ing the flag value returned by \fBTcl_ScanElement\fR |
---|
| 180 | with \fBTCL_DONT_QUOTE_HASH\fR. |
---|
| 181 | .VE 8.5 |
---|
| 182 | .PP |
---|
| 183 | \fBTcl_ScanCountedElement\fR and \fBTcl_ConvertCountedElement\fR are |
---|
| 184 | the same as \fBTcl_ScanElement\fR and \fBTcl_ConvertElement\fR, except |
---|
| 185 | the length of string \fIsrc\fR is specified by the \fIlength\fR |
---|
| 186 | argument, and the string may contain embedded nulls. |
---|
| 187 | |
---|
| 188 | .SH KEYWORDS |
---|
| 189 | backslash, convert, element, list, merge, split, strings |
---|