Go to main content

man pages section 3: Extended Library Functions, Volume 1

Exit Print View

Updated: Wednesday, July 27, 2022
 
 

Tcl_SplitList (3tcl)

Name

Tcl_SplitList - Tcl_SplitList, Tcl_Merge, Tcl_ScanElement, Tcl_ConvertElement, manipulate Tcl lists

Synopsis

#include <tcl.h>

int
Tcl_SplitList(interp, list, argcPtr, argvPtr)

char *
Tcl_Merge(argc, argv)

int
Tcl_ScanElement(src, flagsPtr)

int
Tcl_ScanCountedElement(src, length, flagsPtr)

int
Tcl_ConvertElement(src, dst, flags)

int
Tcl_ConvertCountedElement(src, length, dst, flags)

Description

Tcl_SplitList(3tcl)         Tcl Library Procedures         Tcl_SplitList(3tcl)



______________________________________________________________________________

NAME
       Tcl_SplitList,    Tcl_Merge,    Tcl_ScanElement,    Tcl_ConvertElement,
       Tcl_ScanCountedElement,  Tcl_ConvertCountedElement  -  manipulate   Tcl
       lists

SYNOPSIS
       #include <tcl.h>

       int
       Tcl_SplitList(interp, list, argcPtr, argvPtr)

       char *
       Tcl_Merge(argc, argv)

       int
       Tcl_ScanElement(src, flagsPtr)

       int
       Tcl_ScanCountedElement(src, length, flagsPtr)

       int
       Tcl_ConvertElement(src, dst, flags)

       int
       Tcl_ConvertCountedElement(src, length, dst, flags)

ARGUMENTS
       Tcl_Interp *interp (out)                   Interpreter to use for error
                                                  reporting.  If NULL, then no
                                                  error message is left.

       char *list (in)                            Pointer  to  a  string  with
                                                  proper list structure.

       int *argcPtr (out)                         Filled  in  with  number  of
                                                  elements in list.

       const char ***argvPtr (out)                *argvPtr  will  be filled in
                                                  with the address of an array
                                                  of  pointers  to the strings
                                                  that are the extracted  ele-
                                                  ments  of  list.  There will
                                                  be *argcPtr valid entries in
                                                  the  array,  followed  by  a
                                                  NULL entry.

       int argc (in)                              Number of elements in argv.

       const char *const *argv (in)               Array of  strings  to  merge
                                                  together into a single list.
                                                  Each string  will  become  a
                                                  separate   element   of  the
                                                  list.

       const char *src (in)                       String that is to become  an
                                                  element of a list.

       int *flagsPtr (in)                         Pointer  to  word to fill in
                                                  with information about  src.
                                                  The  value of *flagsPtr must
                                                  be passed to Tcl_ConvertEle-
                                                  ment.

       int length (in)                            Number  of  bytes  in string
                                                  src.

       char *dst (in)                             Place to copy converted list
                                                  element.     Must    contain
                                                  enough  characters  to  hold
                                                  converted string.

       int flags (in)                             Information  about src. Must
                                                  be value returned by  previ-
                                                  ous call to Tcl_ScanElement,
                                                  possibly     OR-ed      with
                                                  TCL_DONT_USE_BRACES.
______________________________________________________________________________

DESCRIPTION
       These  procedures  may be used to disassemble and reassemble Tcl lists.
       Tcl_SplitList breaks a list up into its constituent elements, returning
       an  array of pointers to the elements using argcPtr and argvPtr.  While
       extracting the arguments, Tcl_SplitList obeys the usual rules for back-
       slash  substitutions  and  braces.   The  area  of memory pointed to by
       *argvPtr is dynamically allocated;  in addition to the array of  point-
       ers, it also holds copies of all the list elements.  It is the caller's
       responsibility to free up all of this storage.   For  example,  suppose
       that you have called Tcl_SplitList with the following code:

              int argc, code;
              char *string;
              char **argv;
              ...
              code = Tcl_SplitList(interp, string, &argc, &argv);

       Then  you  should eventually free the storage with a call like the fol-
       lowing:

              Tcl_Free((char *) argv);

       Tcl_SplitList normally returns TCL_OK, which means the  list  was  suc-
       cessfully  parsed.  If there was a syntax error in list, then TCL_ERROR
       is returned and the interpreter's result will point to an error message
       describing  the  problem  (if  interp  was  not NULL).  If TCL_ERROR is
       returned then no memory is allocated and *argvPtr is not modified.

       Tcl_Merge is the inverse of Tcl_SplitList:  it takes  a  collection  of
       strings  given  by argc and argv and generates a result string that has
       proper list structure.  This means that commands like index may be used
       to  extract the original elements again.  In addition, if the result of
       Tcl_Merge is passed to Tcl_Eval, it will  be  parsed  into  argc  words
       whose  values will be the same as the argv strings passed to Tcl_Merge.
       Tcl_Merge will modify the list elements with braces and/or  backslashes
       in  order  to  produce proper Tcl list structure.  The result string is
       dynamically allocated using  Tcl_Alloc;   the  caller  must  eventually
       release the space using Tcl_Free.

       If  the  result  of  Tcl_Merge is passed to Tcl_SplitList, the elements
       returned by Tcl_SplitList  will  be  identical  to  those  passed  into
       Tcl_Merge.   However,  the  converse  is not true:  if Tcl_SplitList is
       passed a given string, and the resulting argc and argv  are  passed  to
       Tcl_Merge,  the  resulting  string  may not be the same as the original
       string passed to Tcl_SplitList.  This  is  because  Tcl_Merge  may  use
       backslashes and braces differently than the original string.

       Tcl_ScanElement  and  Tcl_ConvertElement are the procedures that do all
       of the real work of Tcl_Merge.  Tcl_ScanElement scans its src  argument
       and  determines how to use backslashes and braces when converting it to
       a list element.  It returns an overestimate of the number of characters
       required  to represent src as a list element, and it stores information
       in *flagsPtr that is needed by Tcl_ConvertElement.

       Tcl_ConvertElement is a companion  procedure  to  Tcl_ScanElement.   It
       does  the  actual  work  of converting a string to a list element.  Its
       flags argument must be the same as the value returned  by  Tcl_ScanEle-
       ment.  Tcl_ConvertElement writes a proper list element to memory start-
       ing at *dst and returns a count of the total number of characters writ-
       ten, which will be no more than the result returned by Tcl_ScanElement.
       Tcl_ConvertElement writes out only the actual list element without  any
       leading  or  trailing  spaces: it is up to the caller to include spaces
       between adjacent list elements.

       Tcl_ConvertElement uses one of two different approaches to  handle  the
       special characters in src.  Wherever possible, it handles special char-
       acters by surrounding the string with  braces.   This  produces  clean-
       looking output, but cannot be used in some situations, such as when src
       contains unmatched braces.   In  these  situations,  Tcl_ConvertElement
       handles  special characters by generating backslash sequences for them.
       The caller may insist on the second approach by OR-ing the  flag  value
       returned  by  Tcl_ScanElement  with TCL_DONT_USE_BRACES.  Although this
       will produce an uglier result, it is useful in some special situations,
       such  as when Tcl_ConvertElement is being used to generate a portion of
       an argument for a Tcl command.  In  this  case,  surrounding  src  with
       curly braces would cause the command not to be parsed correctly.

       By  default,  Tcl_ConvertElement  will  use quoting in its output to be
       sure the first character of an element is not the hash character ("#".)
       This  is to be sure the first element of any list passed to eval is not
       mis-parsed as the beginning of a comment.  When a list element  is  not
       the  first  element of a list, this quoting is not necessary.  When the
       caller can be sure that the element is not the first element of a list,
       it can disable quoting of the leading hash character by OR-ing the flag
       value returned by Tcl_ScanElement with TCL_DONT_QUOTE_HASH.

       Tcl_ScanCountedElement and Tcl_ConvertCountedElement are  the  same  as
       Tcl_ScanElement and Tcl_ConvertElement, except the length of string src
       is specified by the length argument, and the string may contain  embed-
       ded nulls.


ATTRIBUTES
       See attributes(7) for descriptions of the following attributes:


       +---------------+------------------+
       |ATTRIBUTE TYPE | ATTRIBUTE VALUE  |
       +---------------+------------------+
       |Availability   | runtime/tcl-8    |
       +---------------+------------------+
       |Stability      | Uncommitted      |
       +---------------+------------------+

SEE ALSO
       Tcl_ListObjGetElements(3)

KEYWORDS
       backslash, convert, element, list, merge, split, strings



NOTES
       Source  code  for open source software components in Oracle Solaris can
       be found at https://www.oracle.com/downloads/opensource/solaris-source-
       code-downloads.html.

       This     software     was    built    from    source    available    at
       https://github.com/oracle/solaris-userland.   The  original   community
       source was downloaded from  http://prdownloads.sourceforge.net/tcl/tcl-
       core8.6.7-src.tar.gz.

       Further information about this software can be found on the open source
       community website at https://www.tcl.tk/.



Tcl                                   8.0                  Tcl_SplitList(3tcl)