Provided by: libvistaio-dev_1.2.19-1_amd64 bug

NAME

       VistaIOattribute - representation of a list of name/value pairs

SYNOPSIS

       VistaIOAttrList list;

       VistaIOAttrListPosn posn;

DESCRIPTION

   Introduction
       An  attribute  associates  a value with a name. Generally, various properties of an object
       such as an image are described by attributes, each naming one property and specifying that
       property's  associated  value.  Attributes  are  collected  into  lists, and Vista library
       routines are available for accessing and manipulating these lists. A list is  referred  to
       by a pointer of type VistaIOAttrList.

       The  attribute list representation is closely related to the Vista data file format. Among
       other things, attribute lists can represent in memory the contents of Vista data files.

       An attribute's name is an alphanumeric string — specifically,  a  sequence  of  characters
       matching  the  regular  expression [a-zA-Z0-9_.+-]+. (Regular expressions are described in
       grep(1).) Attribute names are represented in memory as null-terminated character  strings.
       They may be 50 character in length.

       An attribute's value may be a character string, a (nested) attribute list, or a pointer to
       data of a specified type.

         • If it's a character string, the string may optionally  be  interpreted  as  an  number
           whenever  it  is  accessed.  Library  routines  exist,  for example, that can return a
           string's value as a VistaIOShort, or set it with a VistaIOFloat value.  The  following
           representations   can  be  used  when  accessing  character-string  attribute  values:
           VistaIOBit,  VistaIOUByte,  VistaIOSByte,  VistaIOShort,  VistaIOLong,   VistaIOFloat,
           VistaIODouble,  VistaIOBoolean,  or  VistaIOString.  An  error will be signalled if an
           attempt is made to obtain an attribute's value in a representation to which it  cannot
           be converted.

           A  character-string  attribute  value  can  also  be interpreted as a keyword.  Again,
           conversion between keywords and any desired representation occurs when  the  attribute
           value  is  accessed.  The  routines  you  use  to access attribute values allow you to
           specify an optional dictionary that describes a mapping between keywords  and  values.
           The  form  of  this  dictionary  is described by the VistaIOdictionary(3) manual page.
           Using  a  dictionary,  for  example,  you  can  fetch  an  attribute's  value   as   a
           VistaIOBoolean while converting the keywords false and true to the values 0 and 1.

         • An  attribute's  value may be another attribute list. However, circular references, as
           when an attribute list is the value of one of its attributes, are not allowed.

         • An attribute's value may be an object with any of the standard object types (e.g.,  an
           image  or  edge set); or it may be an object of a type that has been registered by the
           programmer  using  the  mechanism  described  in  VistaIOtype(3).  Because  they   are
           registered,  such  types  are  automatically  read from data files and written to data
           files by library routines such as VistaIOReadFile(3) and VistaIOWriteFile(3).

         • An attribute's value may be of type VistaIOBundle, described  in  VistaIOBundle(3).  A
           VistaIOBundle  can  represent  an  object  whose type has not been registered with the
           VistaIOtype(3) mechanism, in a way that allows the object to be copied unchanged  from
           an  input  data file to an output data file. It's used to represent objects of unknown
           type encountered in input data files.

         • An attribute's value may be a pointer to an opaque data structure. Such a  pointer  is
           of  type  VistaIOPointer.  Library  routines  only  allow  for  getting  and setting a
           VistaIOPointer attribute value; they  cannot  read  VistaIOPointer  values  from  data
           files, or write them to data files.

       The  elements  of  an attribute list may be accessed by attribute name, in which case each
       element should have a unique name and the order of  attributes  within  the  list  is  not
       significant. In this form of access the attribute list is treated as a set. Alternatively,
       the elements of an attribute list may be accessed by their position within  the  list,  in
       which  case  attribute  names  needn't  be  unique  and  the  ordering of list elements is
       significant. In this form of access the attribute list  is  treated  as  a  sequence.  The
       library provides support for both forms of access.

       A   position   within   an   attribute   list   is  identified  by  a  structure  of  type
       VistaIOAttrListPosn. Its value can denote a particular attribute  within  a  list,  or  no
       attribute (analogous to NULL

   Creating, Copying, and Destroying Attribute Lists
       The following routines will create, copy, and destroy attribute lists.

       VistaIOAttrList VistaIOCreateAttrList (void)

              VistaIOCreateAttrList creates and returns an empty attribute list.

       VistaIOAttrList VistaIOCopyAttrList (VistaIOAttrList list)

              VistaIOCopyAttrList generates a complete copy of list using newly-allocated storage
              for each list element. The new list contains its own copy of each attribute value —
              except  that for a VistaIOPointer value, the pointer is copied but not the (opaque)
              data structure to which it points.

       void VistaIODestroyAttrList (VistaIOAttrList list)

              VistaIODestroyAttrList releases the storage occupied  by  list.  Also  released  is
              storage  occupied by attribute values — except that for a VistaIOPointer value, the
              pointer is released but not the (opaque) data structure to which it points.

   Traversing an Attribute List
       The following macros are used to sequence through an attribute list in  either  direction.
       They  are appropriate when accessing an attribute list representing a sequence (as opposed
       to a set) of attributes.

       void VistaIOFirstAttr (VistaIOAttrList list, VistaIOAttrListPosn *posn)

              VistaIOFirstAttr sets posn to point to the first attribute in list. If the list  is
              empty,  posn  is  set to point to nothing (a condition that can be tested using the
              VistaIOAttrExists macro).

       void VistaIOLastAttr (VistaIOAttrList list, VistaIOAttrListPosn *posn)

              VistaIOLastAttr sets posn to point to the last attribute in list. If  the  list  is
              empty,  posn  is  set to point to nothing (a condition that can be tested using the
              VistaIOAttrExists macro).

       void VistaIONextAttr (VistaIOAttrListPosn *posn)

              VistaIONextAttr sets posn to point to the next attribute  in  its  list.   If  posn
              already  points  to  the  list's last attribute, posn is set to point to nothing (a
              condition that can be detected by the VistaIOAttrExists macro).

       void VistaIOPrevAttr (VistaIOAttrList list, VistaIOAttrListPosn *posn)

              VistaIOPrevAttr sets posn to point to the previous attribute in its list.  If  posn
              already  points  to  the list's first attribute, posn is set to point to nothing (a
              condition that can be detected by the VistaIOAttrExists macro).

       VistaIOBoolean VistaIOAttrExists (VistaIOAttrListPosn *posn)

              VistaIOAttrExists returns TRUE if posn points to an  attribute,  and  FALSE  if  it
              points  to  nothing.  This  macro  is  used, for example, to test for the end of an
              attribute list while sequencing through it.

       VistaIOBoolean VistaIOAttrListEmpty (VistaIOAttrList *list)

              VistaIOAttrListEmpty returns TRUE if list is empty.

   Accessing Attributes by Position
       The following macros and routines access the attribute at a specified position  within  an
       attribute list.

       VistaIOStringConst VistaIOGetAttrName (VistaIOAttrListPosn *posn)

              The VistaIOGetAttrName macro returns the name of the attribute at posn.

       VistaIORepnKind VistaIOGetAttrRepn (VistaIOAttrListPosn *posn)

              The  VistaIOGetAttrRepn  macro  returns the type of representation of the attribute
              value at posn.

       VistaIOBoolean VistaIOGetAttrValue (VistaIOAttrListPosn *posn, VistaIODictEntry *dict,
                 VistaIORepnKind repn, VistaIOPointer value)

            This routine gets the value of the attribute at posn. (See VistaIOGetAttrValue(3) for
            details.)

       void VistaIOSetAttrValue (VistaIOAttrListPosn *posn, VistaIODictEntry *dict,
                 VistaIORepnKind repn, type value)

            This routine sets the value of the attribute at posn. (See VistaIOSetAttrValue(3) for
            details.)

   Accessing Attributes by Name
       The following routines access attributes by name. They are appropriate when  accessing  an
       attribute  list  representing a set of attributes, in which each attribute name is present
       at most once.

       VistaIOBoolean VistaIOLookupAttr (VistaIOAttrList list, VistaIOStringConst name,
                 VistaIOAttrListPosn *posn)

            VistaIOLookupAttr  locates  the  first  attribute named name in the list list. If the
            attribute is found, TRUE is returned along with the  attribute's  position  in  posn.
            Otherwise FALSE is returned.

       VistaIOGetAttrResult VistaIOGetAttr (VistaIOAttrList *list, VistaIOStringConst name,
                 VistaIODictEntry *dict, VistaIORepnKind repn, VistaIOPointer value)

            VistaIOGetAttr gets the value of the  named  attribute.  (See  VistaIOGetAttr(3)  for
            details.)

       void VistaIOSetAttr (VistaIOAttrList *list, VistaIOStringConst name,
                 VistaIODictEntry *dict, VistaIORepnKind repn, type value)

            VistaIOSetAttr sets the value of the named attribute, creating an  attribute  if  the
            list doesn't already contain one with that name. (See VistaIOSetAttr(3) for details.)

   Inserting and Deleting Attributes
       The following routines add attributes to lists and remove them.

       void VistaIOInsertAttr (VistaIOAttrListPosn *posn, VistaIOBoolean after,
                 VistaIOStringConst name, VistaIODictEntry *dict, VistaIORepnKind repn,
                 type value)

            VistaIOInsertAttr inserts an attribute before or after a specified position within an
            attribute list. (See VistaIOInsertAttr(3) for details.)

       void VistaIODeleteAttr (VistaIOAttrListPosn *posn)

              VistaIODeleteAttr deletes the attribute at posn. It leaves  posn  pointing  to  the
              following  attribute  if  their is one, or nothing if the attribute deleted was the
              last on its list.

       void VistaIOAppendAttr (VistaIOAttrList *list, VistaIOStringConst name,
                 VistaIODictEntry *dict, VistaIORepnKind repn, type value)

            VistaIOAppendAttr appends an attribute to the back of list. (See VistaIOAppendAttr(3)
            for details.)

       void VistaIOPrependAttr (VistaIOAttrList *list, VistaIOStringConst name,
                 VistaIODictEntry *dict, VistaIORepnKind repn, type value)

            VistaIOPrependAttr   prepends   an   attribute   to   the   front   of   list.   (See
            VistaIOPrependAttr(3) for details.)

       VistaIOBoolean VistaIOExtractAttr (VistaIOAttrList *list, VistaIOStringConst name,
                 VistaIODictEntry *dict, VistaIORepnKind repn, VistaIOPointer value,
                 VistaIOBoolean required)

            VistaIOExtractAttr locates an attribute named name in list, removing it if found  and
            returning its value. (See VistaIOExtractAttr(3) for details.)

   Encoding and Decoding Attribute VistaIOalues
       The  following  routines  translate  character-string  attribute  values to and from other
       representations.

       VistaIOStringConst VistaIOEncodeAttrValue (VistaIODictEntry *dict, VistaIORepnKind repn,
                 type value)

            VistaIOEncodeAttrValue  takes  a  value  and  an optional dictionary, and encodes the
            value as a character string suitable for storage in an attribute list or output to  a
            data file.  (See VistaIOEncodeAttrValue(3) for details.)

       VistaIOBoolean VistaIODecodeAttrValue (VistaIOStringConst str, VistaIODictEntry *dict,
                 VistaIORepnKind repn, VistaIOPointer value)

            VistaIODecodeAttrValue performs the inverse operation, taking a string and  returning
            a value in the requested representation. (See VistaIODecodeAttrValue(3) for details.)

   Inputting and Outputting Attribute Lists
       The following routines read and write attribute lists.

       VistaIOAttrList VistaIOReadFile (FILE *file, VistaIOBoolean (*filter) ())

              VistaIOReadFile  reads an entire data file, returning it as an attribute list. (See
              VistaIOReadFile(3) for details.)

       VistaIOBoolean VistaIOWriteFile (FILE *file, VistaIOAttrList list)

              VistaIOWriteFile writes an entire data file with the contents of an attribute list.
              (See VistaIOWriteFile(3) for details.)

   Storage Management
       To  program  with  attribute  lists it is necessary to know something about how storage is
       managed for attribute values. The general rule is  that  when  individual  attributes  are
       accessed,  values  aren't  created,  copied,  or  destroyed  — only references to them are
       manipulated. On the other hand when  an  entire  attribute  list  is  create,  copied,  or
       destroyed,  then  all  the  values  will  be  created, copied, or destroyed along with it.
       Unfortunately, the exact behavior must depend on both the type of value an attribute  has,
       and  the  type  of  operation  being  performed  with  the  attribute. The following table
       summarizes the various cases.

         For an attribute whose value is a character string:

           • The value is stored in an attribute list as a string.

           • VistaIOCopyAttrList creates a new copy of the string for the list it creates.

           • VistaIODestroyAttrList releases storage occupied by the string when it destroys  the
             list containing the attribute.

           • VistaIOGetAttr  and  VistaIOGetAttrValue  return  a  pointer to a shared copy of the
             string.  This pointer is valid until the attribute is modified.

           • When VistaIOSetAttr, VistaIOSetAttrValue, VistaIODeleteAttr,  or  VistaIOExtractAttr
             modifies  or  deletes  an  attribute  with  a  string value, it releases the storage
             occupied by that value.

           • When VistaIOSetAttr or VistaIOSetAttrValue sets an attribute to a new string  value,
             it stores its own copy of the string in the attribute list.

         For an attribute whose value is an attribute list, object, or VistaIOBundle:

           • The value is stored in an attribute list as a pointer.

           • VistaIOCopyAttrList  creates  a  new copy of the value for the list it creates.  (If
             the value is an attribute list, for example, it calls itself  recursively  to  clone
             the value.)

           • VistaIODestroyAttrList  releases  storage occupied by the value when it destroys the
             list containing the attribute.

           • VistaIOGetAttr and VistaIOGetAttrValue return a pointer to  a  shared  copy  of  the
             value (they don't make a new copy to return).  This pointer is valid until the value
             is explicitly destroyed, or indirectly destroyed by destroying the  list  containing
             the attribute.

           • When  VistaIOSetAttr,  VistaIOSetAttrValue, VistaIODeleteAttr, or VistaIOExtractAttr
             modifies or deletes an attribute with one of these values, it discards  the  pointer
             to the value but not the value itself.

           • When VistaIOSetAttr or VistaIOSetAttrValue sets an attribute to one of these values,
             it stores a copy of a pointer to the value, but it doesn't copy the value itself.

         For an attribute whose value is a VistaIOPointer:

           • The value is stored in an attribute list as a pointer.

           • VistaIOCopyAttrList creates a new copy of the pointer for the list it  creates,  but
             it doesn't copy the (opaque) data structure pointed to.

           • VistaIODestroyAttrList  doesn't  release the (opaque) data structure pointed to when
             it destroys the list containing the attribute.

           • VistaIOGetAttr and VistaIOGetAttrValue simply return the pointer.

           • When VistaIOSetAttr, VistaIOSetAttrValue, VistaIODeleteAttr,  or  VistaIOExtractAttr
             modifies  or  deletes  an  attribute  with  one of these values, it discards the old
             pointer value but doesn't release the (opaque) data structure it points to.

           • When VistaIOSetAttr or VistaIOSetAttrValue sets an attribute to one of these values,
             it records the new pointer value, but it doesn't copy the (opaque) data structure it
             points to.

   Data Structures
       typedef struct _VAttrRec {
              VistaIOAttrRec *next;/* next in list */
              VistaIOAttrRec *prev;/* previous in list */
              VistaIORepnKind repn;/* rep'n of attribute value */
              VistaIOPointer value;/* pointer to attribute value */
              char name[1];       /* beginning of name string */
       } VistaIOAttrRec, *VistaIOAttrList;

       typedef struct {
              VistaIOAttrList list;/* the list */
              VistaIOAttrRec *ptr;/* position within the list */
       } VistaIOAttrListPosn;

       Programmers using attribute lists will usually  not  need  to  access  components  of  the
       attribute  list  data  structure directly from their code since there are library routines
       and macros available for most purposes.  However, when  debugging,  one  may  occasionally
       need to examine an attribute list directly.

       In a list of attributes, each attribute is represented by a VistaIOAttrRec record. Records
       are allocated with a variable size sufficient to contain the attribute name  and,  if  the
       attribute value is stored as a character string, the attribute value also.

       The  record's  name  field is a variable-length character array containing the attribute's
       name terminated by a NULL character. The repn  field  specifies  whether  the  attribute's
       value   is   stored   as   a  character  string  (VistaIOStringRepn),  an  attribute  list
       (VistaIOAttrListRepn), a pointer to an opaque data structure (VistaIOPointerRepn), or some
       other  object  type  (VistaIOBundle,  VistaIOImage,  VistaIOEdges, etc.). Accordingly, the
       value field will point to a null-terminated character string, an attribute list, an opaque
       data  structure,  a VistaIOBundleRec structure, etc. If the value is a string, that string
       immediately follows the name string in the variable  length  record.  The  next  and  prev
       fields form a doubly-linked list, with NULL pointers marking the list's ends.

       An  attribute  list  contains,  in  addition  to  a  VistaIOAttrRec record for each of its
       attributes, one VistaIOAttrRec record serving as a  list  header.   The  only  significant
       fields  of  this  header record are the next and prev fields, which point to the first and
       last attributes of the list.  An attribute list is of type  VistaIOAttrList,  which  is  a
       pointer to the list's header record.

       The library includes routines and macros that allow one to step through an attribute list,
       and to access an attribute by its position in a list. These employ the VistaIOAttrListPosn
       type,   which   acts   as  a  pointer  to  a  particular  attribute  within  a  list.  The
       VistaIOAttrListPosn's list field identifies an entire list, and its ptr field refers to  a
       specific attribute within that list.

EXAMPLES

       The examples in this section assume the following variables:

              VistaIOAttrList list;
              VistaIOAttrListPosn posn;
              VistaIOImage image, result;

       This  code fragment creates an attribute list, sets some attributes in it, writes the list
       to the standard output stream, and finally destroys the list.

              list = VistaIOCreateAttrList ();
              VistaIOSetAttr (list, "name", NULL, VistaIOStringRepn, "Socrates");
              VistaIOSetAttr (list, "comment", NULL, VistaIOStringRepn, "Greek philosopher");
              VistaIOSetAttr (list, "age", NULL, VistaIOShortRepn, (VistaIOShort) 37);
              VistaIOWriteFile (stdout, list);
              VistaIODestroyAttrList (list);

       This reads an attribute list from the standard input stream and prints the name of each of
       its attributes in sequence:

              list = VistaIOReadFile (stdin, NULL);
              for (VistaIOFirstAttr (list, & posn); VistaIOAttrExists (& posn); VistaIONextAttr (& posn))
                  printf ("%s\n", VistaIOGetAttrName (& posn));

       To add a series of images to an attribute list:

              while (...) {
                  image = VistaIOCreateImage (...);
                  VistaIOAppendAttr (list, ..., VistaIOImageRepn, image);
                  /* Note: don't discard image. */
              }

       To modify each image in an attribute list without replacing it:

              for (VistaIOFirstAttr (list, & posn); VistaIOAttrExists (& posn); VistaIONextAttr (& posn)) {
                  if (VistaIOGetAttrRepn (& posn) != VistaIOImageRepn)
                      continue;
                  VistaIOGetAttrValue (& posn, NULL, VistaIOImageRepn, & image);
                  ProcessImage (image, image, ...);
                  /* Note: modifications to image are inherited by the attribute. */
              }

       To replace each image in an attribute list:

              for (VistaIOFirstAttr (list, & posn); VistaIOAttrExists (& posn); VistaIONextAttr (& posn)) {
                  if (VistaIOGetAttrRepn (& posn) != VistaIOImageRepn)
                      continue;
                  VistaIOGetAttrValue (& posn, NULL, VistaIOImageRepn, & image);
                  result = ProcessImage (image, NULL, ...);
                  VistaIOSetAttrValue (& posn, NULL, VistaIOImageRepn, result);
                  /* Note: the attribute now refers to result, not image. */
                  VistaIODestroyImage (image);
              }

       To delete a named image from an attribute list:

              if (VistaIOLookupAttr (list, "...", & posn)) {
                  VistaIOGetAttrValue (& posn, NULL, VistaIOImageRepn, & image);
                  VistaIODeleteAttr (& posn);
                  VistaIODestroyImage (image);
              }

SEE ALSO

       VistaIOBundle(3), VistaIOdictionary(3), VistaIOtype(3), ,
       VistaIOGetAttrValue(3), VistaIOSetAttrValue(3), VistaIOGetAttr(3), VistaIOSetAttr(3),
       VistaIOInsertAttr(3), VistaIOAppendAttr(3), VistaIOPrependAttr(3), VistaIOExtractAttr(3),
       VistaIOEncodeAttrValue(3), VistaIODecodeAttrValue(3),
       VistaIOReadFile(3), VistaIOWriteFile(3)

AUTHOR

       Art Pope <pope@cs.ubc.ca>

       Adaption to vistaio: Gert Wollny <gw.fossdev@gmail.com>