5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * CDDL HEADER START
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The contents of this file are subject to the terms of the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Common Development and Distribution License (the "License").
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * You may not use this file except in compliance with the License.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * or http://www.opensolaris.org/os/licensing.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * See the License for the specific language governing permissions
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and limitations under the License.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * When distributing Covered Code, include this CDDL HEADER in each
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If applicable, add the following below this CDDL HEADER, with the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * fields enclosed by brackets "[]" replaced with your own identifying
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * information: Portions Copyright [yyyy] [name of copyright owner]
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * CDDL HEADER END
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Use is subject to license terms.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Synopsis: simplified markup language (SML) support
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Taxonomy: project private
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Debug flag: sml
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * This module implements methods that support the processing of a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * simplified markup language (SML). Objects that contain SML data
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * can be created and manipulated, and SML can be imported into
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * internal SML objects or exported from internal SML objects.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Public Methods:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * smlAddTag - Add new tag object into existing tag object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * smlConvertStringToTag - Convert string into tag object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * smlConvertTagToString - Convert a tag object into a string
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * representation of the XML
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * smlDbgPrintTag - Print a representation of an XML tag if debugging
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * smlDelParam - Delete a parameter from a tag object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * smlDelTag - Delete element from tag object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * smlDup - Duplicate a tag object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * smlFindAndDelTag - Delete a tag if found in tag object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * smlFreeTag - Free a tag object and all its contents when no
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * longer needed
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * smlFstatCompareEq - Compare file status information
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * smlGetElementName - Return a tag's element name
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * smlGetNumParams - Get number of parameters set in tag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * smlGetParam - Get a parameter from a tag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * smlGetParamF - Get a formatted parameter from a tag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * smlGetParamByTag - Get a parameter by tag and index
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * smlGetParamByTagParam Get parameter given tag name, index,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * parameter name, and value
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * smlGetParamName - Get the name of a tag parameter given its index
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * smlGetParam_r - Get a parameter from a tag into fixed buffer
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * smlGetTag - Get an element from a tag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * smlGetTagByName - Get an element given a name and an index
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * smlGetTagByTagParam - Get element given tag name, index, parameter name,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * smlGetVerbose - get current verbose mode setting
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * smlLoadTagFromFile - Load a file into a tag object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * smlNewTag - Create a new (empty) tag object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * smlParamEq - Determine if parameter is equal to a specified value
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * smlParamEqF - Determine if parameter is equal to a specified value
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * smlPrintTag - Print a simple XML representation of a tag to stderr
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * smlReadOneTag - read one complete tag from a datastream
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * smlReadTagFromDs - read tag object from datastream
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * smlSetFileStatInfo - encode file status information into tag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * smlSetVerbose - set/clear verbose mode for debugging output
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * smlSetParam - Set parameter value in tag object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * smlSetParamF - Set parameter value in tag object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * smlWriteTagToDs - Write an XML representation of a tag to a datastream
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * smlWriteTagToFd - Write an XML representation of a tag to an open file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * smlWriteTagToFile - Write an XML representation of a tag to a file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Unix includes
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * liblu Includes
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* Should be defined by cc -D */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Private Method Forward Declarations
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*PRINTFLIKE2*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void _smlLogMsg(LogMsgType a_type, const char *a_format, ...);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int _smlReadTag(SML_TAG **r_tag, char **a_str, char *parent);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int _smlWriteParamValue(char **a_str, char *value);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *_sml_fileStatInfoTag = "File-Stat-Info";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * This definition controls the maximum size of any individual sml
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * component, such as a tag name, tag *value*, etc. The code should
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * someday be revised to dynamically allocate whatever memory is needed
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to hold such components while parsing, but that exercise is left for
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * another day. Any component that exceeds this length is silently
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * truncated...
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Public Methods
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: smlAddTag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Add new tag object into existing tag object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: r_tag - [RO, *RW] - (SML_TAG **)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Pointer to handle to the tag object to update
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The handle may be updated if the tag object is
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * moved in memory
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_index - [RO] - (int)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Add the tag after the "n"th tag in the tag object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -1 == add the tag to the end of the tag object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 0 == add the tag to the beginning of the tag object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_subTag - [RO, *RW] - (SML_TAG *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The tag to add to 'tag'
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: SML_TAG *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The location within "r_tag" where "a_subTag"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * has been added - this is the handle into the r_tag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * object to the tag that was just added
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Errors: If the tag object cannot be updated, the process exits
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlAddTag(SML_TAG **r_tag, int a_index, SML_TAG *a_subTag)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if no tag to update specified, ignore request */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if index is out of range or -1, append to tag object */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((a_index > tag->tags_num) || (a_index == -1)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* bump number of tags in tag object */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* expand tag object to hold new subtag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if not appending, adjust tag object to hold new subtag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) memmove(&(tag->tags[a_index + 1]), &(tag->tags[a_index]),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sizeof (SML_TAG) * (tag->tags_num - a_index - 1));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* copy new subtag into correct location in tag object */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) memcpy(&(tag->tags[a_index]), a_subTag,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: smlDelTag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Delete element from tag object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: tag - [RO, *RW] - (SML_TAG *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The tag object to update
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * sub_tag - [RO, *RW] - (SML_TAG *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Element to be removed from the tag object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The sub_tag is removed from the tag object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: The sub-tag and all elements contained within it are deallocated
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the sub-tag is no longer valid when this method returns
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if no tag to update specified, ignore request */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if tag object is empty, ignore request */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* determine index into tag object of element to remove */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (index = 0; index < tag->tags_num; index++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if element not found in tag, ignore request */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free up the subtag to be deleted */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * if not removing last element, collapse tag object removing
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * target element
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) memmove(&(tag->tags[index]), &(tag->tags[index + 1]),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sizeof (SML_TAG) *(tag->tags_num - index - 1));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* one less tag object in tag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If only one tag left, then delete entire tag structure
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * otherwise reallocate removing unneeded entry
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* realloc removing last element in tag object */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: smlFreeTag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Free a tag object and all its contents when no longer needed
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: tag - [RO, *RW] - (SML_TAG *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The tag object to be deleted
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The tag object and all its contents are deallocated
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_FREE_TAG,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free the tag object contents */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free the tag object handle */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: smlGetNumParams
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Synopsis: Get number of parameters set in tag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Return the number of parameters set in a tag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_tag - [RO, *RO] - (SML_TAG *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The tag object to obtain the # params from
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Number of parameters set in tag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 0 = no parameters are set
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: smlGetParam_r
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Get a parameter from a tag into a buffer of fixed size
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: tag - [RO, *RO] - (SML_TAG *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The tag object to obtain the parameter from
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * name - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name of the parameter to retrieve
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * buf - [RO, *RW] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Location of buffer to contain results
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * bufLen - [RO, *RO] - (int)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Maximum bytes available in buffer to contain results
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlGetParam_r(SML_TAG *tag, char *name, char *buf, int bufLen)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* terminate the buffer */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if no tag specified, return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if no parameters in tag, return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_GET_PARAM,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* scan tag object looking for specified parameter */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(tag->params[k].name != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(tag->params[k].value != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strncpy(buf, tag->params[k].value, bufLen-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* parameter not found - return */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: smlGetParam
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Get a parameter from a tag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: tag - [RO, *RO] - (SML_TAG *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The tag object to obtain the parameter from
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * name - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name of the parameter to retrieve
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: char *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Value of the specified parameter
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == (char *)NULL if the parameter does not exist
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: Any parameter returned is placed in new storage for the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * calling method. The caller must use 'free' to dispose
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * of the storage once the parameter is no longer needed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, "get param param <%s>", name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if no tag specified, return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return ((char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if no parameters in tag, return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return ((char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_GET_PARAM,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* scan tag object looking for specified parameter */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(tag->params[k].name != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(tag->params[k].value != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* parameter not found - return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return ((char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: smlGetParamName
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Get the name of a tag parameter given its index
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: tag - [RO, *RO] - (SML_TAG *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The tag object to obtain the parameter name from
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * index - [RO] - (int)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Index of parameter name to return
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: char *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name of 'index'th parameter
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == (char *)NULL if no such parameter exists in tag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: Any parameter name returned is placed in new storage for the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * calling method. The caller must use 'free' to dispose
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * of the storage once the parameter name is no longer needed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if no tag specified, return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return ((char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_GET_PARAM_NAME,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if no parameters in tag, return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return ((char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if index not within range, return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return ((char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* index within range - return parameter name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(tag->params[index].name != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(tag->params[index].value != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_GOT_PARAM_NAME,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->name, index, tag->params[index].name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: smlGetParamByTag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Synopsis: Get a parameter value from a tag by name and index
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Call to look for a parameter value from a tag with
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a given name with a parameter of a given name
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: tag - [RO, *RO] - (SML_TAG *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The tag object to obtain the parameter
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * index - [RO] - (int)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Index of nth tag by name to look for
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * tagName - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name of tag to look for
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * paramName - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name of parameter to return value of
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: char *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == (char *)NULL - no parameter value set
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * != (char *)NULL - value of parameter set
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_GET_PARAM_BY_TAG,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* find the requested tag by name and index */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rtag = smlGetTagByName(tag, index, tagName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return ((char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: smlGetTagByTagParam
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Synopsis: Get element given tag name, index, parameter name, and value
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Call to look for a tag with a given nae, that has a parameter
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * of a given name with a specified value
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: tag - [RO, *RO] - (SML_TAG *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The tag object to obtain the element from
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * index - [RO] - (int)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Index of nth name to return
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * tagName - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Tag name to look up
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * paramName - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Parameter name to look up
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * paramValue - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Parameter value to match
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: SML_TAG *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The 'index'th occurance of element 'name' with
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a parameter 'name' with value specified
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == SML_TAG__NULL if no such element exists
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlGetTagByTagParam(SML_TAG *tag, int index,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *tagName, char *paramName, char *paramValue)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if tag has no elements, return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Search algorithm:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -> search tag structure; for each tag with element == "tagName":
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -> search tag parameters; if parameter name == "paramName"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -> if parameter value != "paramValue"; to next tag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -> if parameter value == "paramValue":
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -> if not the "index"th paramValue found; to next tag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -> return tag found
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if tag element does not match, go on to next tag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* element matches: search for specified parameter name/value */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (pi = 0; pi < tag->tags[ti].params_num; pi++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(tag->tags[ti].params[pi].name != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(tag->tags[ti].params[pi].value != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if parameter name doesnt match to next parameter */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(tag->tags[ti].params[pi].name, paramName)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if parameter value doesnt match to next tag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -> if this is not the 'index'th one, go to next tag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * found specified element/paramname/paramvalue:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -> return the tag found
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* no such element found - return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: smlGetParamByTagParam
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Synopsis: Get parameter given tag name, index, parameter name, and value
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Call to return the value of a parameter from a tag of a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * given name, with a parameter of a given name with a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * specified value
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: tag - [RO, *RO] - (SML_TAG *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The tag object to obtain the element from
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * index - [RO] - (int)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Index of nth name to return
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * tagName - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Tag name to look up
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * paramName - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Parameter name to look up
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * paramValue - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Parameter value to match
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * paramReturn - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Parameter name to return the value of
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: char *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The value of parameter 'paramReturn' from the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The 'index'th occurance of element 'name' with
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a parameter 'name' with value specified
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == (char *)NULL if no such parameter exists
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlGetParamByTagParam(SML_TAG *tag, int index,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *tagName, char *paramName, char *paramValue, char *paramReturn)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if tag has no elements, return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return ((char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Search algorithm:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -> search tag structure; for each tag with element == "tagName":
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -> search tag parameters; if parameter name == "paramName"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -> if parameter value != "paramValue"; to next tag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -> if parameter value == "paramValue":
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -> if not the "index"th paramValue found; to next tag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -> return value of "paramReturn"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if tag element does not match, go on to next tag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* element matches: search for specified parameter name/value */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (pi = 0; pi < tag->tags[ti].params_num; pi++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(tag->tags[ti].params[pi].name != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(tag->tags[ti].params[pi].value != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if parameter name doesnt match to next parameter */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(tag->tags[ti].params[pi].name, paramName)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if parameter value doesnt match to next tag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -> if this is not the 'index'th one, go to next tag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * found specified element/paramname/paramvalue:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -> return parameter requested
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (smlGetParam(&tag->tags[ti], paramReturn));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* no such element found - return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return ((char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: smlGetElementName
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Return the name of a given tag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_tag - [RO, *RO] - (SML_TAG *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The tag object to obtain the element name from
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: char *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Value of name of specified tag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: Any name string returned is placed in new storage for the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * calling method. The caller must use 'free' to dispose
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * of the storage once the name string is no longer needed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return the tag name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: smlGetTag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Get an element from a tag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: tag - [RO, *RO] - (SML_TAG *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The tag object to obtain the element from
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * index - [RO] - (int)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Index of element to return
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: SML_TAG *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The 'index'th element from the specified tag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == SML_TAG__NULL if no such tag or element
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if no tag specified, return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if tag has no elements, return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if index not within range, return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* index within range, return element specified */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(SML_TAG__ISVALID(&tag->tags[index]));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: smlGetTagByName
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Get an element given a name and an index
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: tag - [RO, *RO] - (SML_TAG *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The tag object to obtain the element from
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * index - [RO] - (int)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Index of nth name to return
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * name - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Tag name to look up
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: SML_TAG *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The 'index'th occurance of element 'name'
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == SML_TAG__NULL if no such element exists
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlGetTagByName(SML_TAG *tag, int index, char *name)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_GET_TAG_BY_NAME, name, index);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if no tag specified, return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if this tag is the one mentioned, return it */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (streq(tag->name, name) && (index == 0)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if tag has no elements, return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if index out of range, return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* index within range - search for specified element */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* no such element found - return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: smlConvertStringToTag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Convert string into tag object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: err - [RO, *RW] (LU_ERR)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Error object - used to contain any errors encountered
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and return those errors to this methods caller
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * r_tag - [RW, *RW] - (SML_TAG **)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Pointer to handle to place new tag object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * str - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * String object to convert to tag object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * RESULT_OK - string converted to tag object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * RESULT_ERR - problem converting string to tag object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: Any tag object returned is placed in new storage for the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * calling method. The caller must use 'smlFreeTag' to dispose
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * of the storage once the tag object name is no longer needed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlConvertStringToTag(SML_TAG **r_tag, char *str)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_READ_IN_TOP_TAG,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) memcpy(&(tag->tags[tag->tags_num - 1]), tmp_tag,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: smlReadOneTag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: read one complete tag from a datastream
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: err - [RO, *RW] (LU_ERR)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Error object - used to contain any errors encountered
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and return those errors to this methods caller
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * r_tag - [RW, *RW] - (SML_TAG **)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Pointer to handle to place new tag object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == SML_TAG__NULL if empty tag found (not an error)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * ds - [RO, *RO] - (LU_DS)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Handle to datastream to read tag from
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * RESULT_OK - tag successfully read
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * RESULT_ERR - problem reading tag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: Any tag object returned is placed in new storage for the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * calling method. The caller must use 'smlFreeTag' to dispose
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * of the storage once the tag object name is no longer needed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_READ_ONE_TAG, a_str);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* reset return tag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* read tag from datastream, no parent tag to attach it to */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_ERR, ERR_SML_CANNOT_READ_TAG);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_ONE_TAG_READ,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (unsigned long)*r_tag,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (*r_tag)->name ? (*r_tag)->name : "<no name>");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_READ_ONE_TAG_NOTAG);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* exit debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: smlNewTag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Create a new (empty) tag object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: name - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name of tag; NULL to give the tag no name
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: SML_TAG *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Tag object created
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: Any tag object returned is placed in new storage for the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * calling method. The caller must use 'smlFreeTag' to dispose
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * of the storage once the tag object name is no longer needed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Errors: If the tag object cannot be created, the process exits
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert((name == (char *)NULL) || (*name != '\0'));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_CREATE_NEW_TAG_OBJECT,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* allocate zeroed storage for the tag object */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag = (SML_TAG *)calloc(1, sizeof (SML_TAG));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if name is provided, duplicate and assign it */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* exit assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* exit debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_CREATED_NEW_TAG_OBJECT,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (unsigned long)tag, name ? name : "<no name>");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: smlConvertTagToString
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Convert a tag object into a string representation of the XML
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: tag - [RO, *RO] - (SML_TAG *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The tag object to convert to a string
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: char *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * String representation (in XML) of tag object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == (char *)NULL if conversion is not possible
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: Any string returned is placed in new storage for the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * calling method. The caller must use 'free' to dispose
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * of the storage once the string is no longer needed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* convert the tag object into the datastream */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return the results */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: smlDbgPrintTag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Synopsis: Print a representation of an XML tag if debugging
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_tag - [RO, *RO] - (SML_TAG *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Pointer to tag structure to dump
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_format - [RO, RO*] (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * printf-style format for debugging message to be output
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * VARG_LIST - [RO] (?)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * arguments as appropriate to 'format' specified
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If one of the debugging flags is set, the hexdump
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*PRINTFLIKE2*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlDbgPrintTag(SML_TAG *a_tag, char *a_format, ...)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * output the message header
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* determine size of the message in bytes */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* allocate storage to hold the message */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* generate the results of the printf conversion */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vres = vsnprintf(rstr, vres+1, a_format, ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* convert the tag into a string to be printed */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_PRINTTAG, a_tag->name,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: smlDelParam
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Delete a parameter from a tag object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: tag - [RO, *RW] - (SML_TAG *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The tag object to delete the parameter from
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * name - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The parameter to delete from the tag object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If the parameter exists, it is deleted from the tag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_DELETE_PARAM,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if tag has no parameters, nothing to delete */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* search the tag for the parameter */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if the parameter was not found, nothing to delete */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* parameter found - indicate deleted */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(tag->params[k].name != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(tag->params[k].value != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free up storage fro parameter */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if not at end, compact parameter storage */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) memmove(&(tag->params[k]), &(tag->params[k + 1]),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sizeof (SML_PARAM) *(tag->params_num - k - 1));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* one less parameter object in tag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If only one parameter left, then delete entire parameter storage,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * otherwise reallocate removing unneeded entry
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* realloc removing last element in tag object */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: smlSetParamF
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Set formatted parameter value in tag object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: tag - [RO, *RW] - (SML_TAG *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The tag object to set the parameter in
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * name - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The parameter to add to the tag object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * format - [RO, RO*] (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * printf-style format to create parameter value from
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * ... - [RO] (?)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * arguments as appropriate to 'format' specified
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The parameter value is set in the tag object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * according to the results of the format string
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and arguments
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*PRINTFLIKE3*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlSetParamF(SML_TAG *tag, char *name, char *format, ...)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* determine size of the parameter name in bytes */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* allocate storage to hold the message */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* generate the parameter name and store it in the allocated storage */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* add the parameter to the tag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free up temporary storage and return */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: smlGetParam
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Get a format-generated parameter from a tag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: tag - [RO, *RO] - (SML_TAG *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The tag object to obtain the parameter from
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * format - [RO, RO*] (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * printf-style format for parameter name to be
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * looked up to be formatted
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * ... - [RO] (?)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * arguments as appropriate to 'format' specified
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: char *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Value of the specified parameter
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == (char *)NULL if the parameter does not exist
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: Any parameter returned is placed in new storage for the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * calling method. The caller must use 'free' to dispose
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * of the storage once the parameter is no longer needed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*PRINTFLIKE2*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlGetParamF(SML_TAG *tag, char *format, ...)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* determine size of the parameter name in bytes */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* allocate storage to hold the message */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* generate the parameter name and store it in the allocated storage */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* add the parameter to the tag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free up temporary storage and return */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: smlSetParam
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Set parameter value in tag object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: tag - [RO, *RW] - (SML_TAG *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The tag object to set the parameter in
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * name - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The parameter to add to the tag object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * value - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The value of the parameter to set in the tag object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The parameter value is set in the tag object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlSetParam(SML_TAG *tag, char *name, char *value)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_SET_PARAM,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if parameters exist, see if modifying existing parameter */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(tag->params[k].name != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(tag->params[k].value != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if name does not match, skip */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* found parameter - if value is same, leave alone */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* exists and has different value - change */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* not modifying existing - add new parameter */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland parameter = (SML_PARAM *)calloc(1, sizeof (SML_PARAM));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->params = (SML_PARAM *)realloc(tag->params,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) memcpy(&(tag->params[tag->params_num - 1]), parameter,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: smlParamEqF
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Determine if parameter is equal to a specified formatted value
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: tag - [RO, *RO] - (SML_TAG *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The tag object to look for the parameter to compare
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * findTag - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Tag within tag object to look for the parameter in
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * findParam - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Parameter within tag to look for
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * format - [RO, RO*] (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * printf-style format for value to be compared against
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * parameter value
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * ... - [RO] (?)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * arguments as appropriate to 'format' specified to
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * generate the value to compare parameter with
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * B_TRUE - the parameter exists and matches given value
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * B_FALSE - parameter does not exist or does not match
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*PRINTFLIKE4*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlParamEqF(SML_TAG *tag, char *findTag, char *findParam, char *format, ...)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* determine size of the parameter value in bytes */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* allocate storage to hold the message */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* generate the parameter value and store it in the allocated storage */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* add the parameter to the tag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland b = smlParamEq(tag, findTag, findParam, bfr);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free up temporary storage and return */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: smlParamEq
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Determine if parameter is equal to a specified value
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: tag - [RO, *RO] - (SML_TAG *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The tag object to look for the parameter to compare
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * findTag - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Tag within tag object to look for the parameter in
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * findParam - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Parameter within tag to look for
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * str - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Value to compare parameter with
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * B_TRUE - the parameter exists and matches given value
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * B_FALSE - parameter does not exist or does not match
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlParamEq(SML_TAG *tag, char *findTag, char *findParam, char *str)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* look for the specified tag - if not found, return false */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* look for the specified parameter - if not found, return false */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* parameter found - compare against given value */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free up parameter storage */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return results of comparison */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: smlFindAndDelTag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Delete a tag if found in tag object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: tag - [RO, *RW] - (SML_TAG *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The tag object to delete the tag from
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * findTag - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Tag within tag object to delete
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * B_TRUE - tag found and deleted
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * B_FALSE - tag not found
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlFindAndDelTag(SML_TAG *tag, char *findTag)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* find the specified tag - if not found, return false */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* tag found - delete it and return true */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: smlDup
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Duplicate a tag object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: tag - [RO, *RO] - (SML_TAG *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The tag object to duplicate
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: SML_TAG *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * A handle to a complete duplicate of the tag provided
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: Any tag object returned is placed in new storage for the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * calling method. The caller must use 'smlFreeTag' to dispose
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * of the storage once the tag object name is no longer needed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Errors: If the tag object cannot be duplicated, the process exits
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* allocate zeroed storage for the tag object */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rtag = (SML_TAG *)calloc(1, sizeof (SML_TAG));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* duplicate all parameters of the tag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rtag->name = (tag->name ? strdup(tag->name) : (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland calloc(1, sizeof (SML_PARAM)*rtag->params_num);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland bzero(rtag->params, sizeof (SML_PARAM)*rtag->params_num);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rtag->params[i].name = tag->params[i].name ?
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rtag->params[i].value = tag->params[i].value ?
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* duplicate all elements of the tag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland calloc(1, sizeof (SML_TAG)*rtag->tags_num);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland bzero(rtag->tags, sizeof (SML_TAG)*rtag->tags_num);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* exit assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: smlSetFileStatInfo
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description; Given a file status structure and path name, encode the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * structure and place it and the name into the specified tag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * in a "_sml_fileStatInfoTag" (private) element
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: tag - [RO, *RO] - (SML_TAG *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The tag object to deposit the information into
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * statbuf - [RO, *RO] - (struct stat *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Pointer to file status structure to encode
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * path - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Pointer to path name of file to encode
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The information is placed into the specified tag object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlSetFileStatInfo(SML_TAG **tag, struct stat *statbuf, char *path)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if stat info exists, delete it */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) smlFindAndDelTag(*tag, _sml_fileStatInfoTag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* create the file stat info inside of the top level tag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(smlGetTagByName(*tag, 0, _sml_fileStatInfoTag)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* obtain handle on newly created file stat info tag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rtag = smlGetTagByName(*tag, 0, _sml_fileStatInfoTag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* add file info as parameters to the tag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: smlFstatCompareEQ
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Given a file status structure and path name, look for the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * information placed into a tag object via smlSetFileStatInfo
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and if present compare the encoded information with the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * arguments provided
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: statbuf - [RO, *RO] - (struct stat *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Pointer to file status structure to compare
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * tag - [RO, *RO] - (SML_TAG *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The tag object to compare against
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * path - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Pointer to path name of file to compare
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * B_TRUE - both status structures are identical
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * B_FALSE - the status structures are not equal
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlFstatCompareEq(struct stat *statbuf, SML_TAG *tag, char *path)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _sml_fileStatInfoTag, "st_path", path) != B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (smlParamEqF(tag, _sml_fileStatInfoTag, "st_ino",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "0x%llx", (unsigned long long)statbuf->st_ino) != B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (smlParamEqF(tag, _sml_fileStatInfoTag, "st_mode",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "0x%llx", (unsigned long long)statbuf->st_mode) != B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (smlParamEqF(tag, _sml_fileStatInfoTag, "st_mtime",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "0x%llx", (unsigned long long)statbuf->st_mtime) != B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (smlParamEqF(tag, _sml_fileStatInfoTag, "st_ctime",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "0x%llx", (unsigned long long)statbuf->st_ctime) != B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (smlParamEqF(tag, _sml_fileStatInfoTag, "st_size",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "0x%llx", (unsigned long long)statbuf->st_size) != B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: set_verbose
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Turns on verbose output
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Scope: public
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: verbose = B_TRUE indicates verbose mode
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: none
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: get_verbose
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Returns whether or not to output verbose messages
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Scope: public
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: none
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: B_TRUE - verbose messages should be output
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: sml_strPrintf
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Synopsis: Create string from printf style format and arguments
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Call to convert a printf style format and arguments into a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * string of characters placed in allocated storage
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: format - [RO, RO*] (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * printf-style format for string to be formatted
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * ... - [RO] (?)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * arguments as appropriate to 'format' specified
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: char *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * A string representing the printf conversion results
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: Any string returned is placed in new storage for the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * calling method. The caller must use 'free' to dispose
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * of the storage once the string is no longer needed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Errors: If the string cannot be created, the process exits
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*PRINTFLIKE1*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* determine size of the message in bytes */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* allocate storage to hold the message */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* generate the results of the printf conversion */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vres = vsnprintf(rstr, vres+1, a_format, ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return the results */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: sml_strPrintf_r
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Synopsis: Create string from printf style format and arguments
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Call to convert a printf style format and arguments into a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * string of characters placed in allocated storage
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_buf - [RO, *RW] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - Pointer to buffer used as storage space for the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * returned string created
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_bufLen - [RO, *RO] - (int)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - Size of 'a_buf' in bytes - a maximum of 'a_bufLen-1'
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * bytes will be placed in 'a_buf' - the returned
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * string is always null terminated
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_format - [RO, RO*] (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * printf-style format for string to be formatted
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * VARG_LIST - [RO] (?)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * arguments as appropriate to 'format' specified
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*PRINTFLIKE3*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandsml_strPrintf_r(char *a_buf, int a_bufLen, char *a_format, ...)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* generate the results of the printf conversion */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vres = vsnprintf(a_buf, a_bufLen-1, a_format, ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: sml_XmlEncodeString
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Given a plain text string, convert that string into one that
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * encoded using the XML character reference encoding format.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_plain_text_string - [RO, *RO] (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The plain text string to convert (encode)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: char *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The encoded form of the plain text string provided
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: Any string returned is placed in new storage for the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * calling method. The caller must use 'lu_memFree' to dispose
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * of the storage once the string is no longer needed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandsml_XmlEncodeString(char *a_plainTextString)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *stringHead; /* -> start of string containing encoded data */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland long stringTail; /* byte pos of first free byte in stringHead */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland long stringLength; /* total bytes allocd starting at stringHead */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *p; /* temp -> to retrieve bytes from src string */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland long textLength = 0; /* length of the string to convert */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Allocate initial string buffer to hold results */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland stringHead = (char *)calloc(1, (size_t)stringLength+2);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Add in the encoded message text */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (p = a_plainTextString; textLength > 0; p++, textLength--) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Must have at least 12 bytes: this must be at least the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * maximum number of bytes that can be added for a single
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * byte as the last byte of the stream. Assuming the byte
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * needs to be encoded, it could be:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * &#xxxxxxxx;\0
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If not that many bytes left, grow the buffer.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * See if this byte is a 'printable 7-bit ascii value'.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If so just add it to the new string; otherwise, must
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * output an XML character value encoding for the byte.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland switch (*p) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * It is a printable 7-bit ascii character:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * just add it to the end of the new string.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * It is not a printable 7-bit ascii character:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * add it as an xml character value encoding.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland stringTail += sprintf(&stringHead[stringTail], "&#%x;",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Terminate the new string */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* realloc the string so it is only as big as it needs to be */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland stringHead = realloc(stringHead, stringTail+1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: sml_XmlDecodeString
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Given a string encoded using the XML character reference format,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * convert that string into a plain text (unencoded) string.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_xml_encoded_string - [RO, *RO] (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The XML encoded string to convert to plain text
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: char *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The unencoded (plain text) form of the encoded string
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: Any string returned is placed in new storage for the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * calling method. The caller must use 'lu_memFree' to dispose
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * of the storage once the string is no longer needed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandsml_XmlDecodeString(char *a_xmlEncodedString)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *s = NULL; /* -> index into encoded bytes string */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *d = NULL; /* -> index into decoded bytes string */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *rs = NULL; /* -> string holding ref bytes allocated */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *ri = NULL; /* -> index into string holding reference */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland long textLength = 0; /* length of encoded string to decode */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland unsigned long rv = 0; /* temp to hold scanf results of byte conv */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *i = NULL; /* temp to hold strchr results */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *stringHead = NULL; /* -> plain test buffer */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * A finite state machine is used to convert the xml encoded string
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * into plain text. The states of the machine are defined below.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int fsmsState = -1; /* Finite state machine state */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define fsms_text 0 /* Decoding plain text */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define fsms_seenPound 2 /* Found # following & */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define fsms_collect 3 /* Collecting character reference bytes */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_xmlEncodedString != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Allocate string that can contain the decoded string.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Since decoding always results in a shorter string (bytes encoded
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * using the XML character reference are larger in the encoded form)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * we can allocate a string the same size as the encoded string.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland stringHead = (char *)calloc(1, textLength+1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Convert all bytes.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Decoding plain text */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (s = a_xmlEncodedString, d = stringHead; textLength > 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*s == '&') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Found & */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*s == '#') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Found # following & */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland fsmsState = fsms_text; /* Decoding plain text */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case fsms_seenPound: /* Found # following & */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Decoding plain text */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Collecting character reference bytes */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Collecting character reference bytes */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*s != ';') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland switch (*s) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Decoding plain text */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Decoding plain text */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Done converting bytes - deallocate reference byte storage */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* terminate the converted (plain text) string */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* exit assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Private Methods
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: _smlReadTag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: read complete tag from a datastream
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: err - [RO, *RW] (LU_ERR)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Error object - used to contain any errors encountered
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and return those errors to this methods caller
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * r_tag - [RW, *RW] - (SML_TAG **)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Pointer to handle to place new tag object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == SML_TAG__NULL if empty tag found (not an error)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * ds - [RO, *RO] - (LU_DS)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Handle to datastream to read tag from
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * parent - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name for parent of tag (NONE if top of tag)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * RESULT_OK - tag successfully read
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * RESULT_ERR - problem reading tag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: Any tag object returned is placed in new storage for the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * calling method. The caller must use 'smlFreeTag' to dispose
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * of the storage once the tag object name is no longer needed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Errors: If the tag object cannot be duplicated, the process exits
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_smlReadTag(SML_TAG **r_tag, char **a_str, char *parent)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_READ_TAG,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* reset return tag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* allocate zeroed storage for the tag object */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag = (SML_TAG *)calloc(1, sizeof (SML_TAG));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* reset name accumulator storage */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* ignore delimters before tag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* read tag character - handle failure/EOF */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((*p == '\0') || ((c = (*p++)) == '\0')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p ? p : "?");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* EOF in middle of processing tag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p ? p : "?");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if beginning of tag, break out */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '<') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* not tag beginning: ignore delimiters if not inside tag yet */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* ignore delimters */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* on blank lines, return no tag object */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '\n') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p ? p : "?");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* invalid character before tag start */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_ERR, ERR_SML_READTAG_BAD_START_CHAR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland c, (unsigned int)c);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * all delimiters have been ignored and opening tag character seen;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * process tag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*p != '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* handle EOF after tag opening character found */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* is this a tag closure? */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '/') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_START_CLOSE_TAG,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* get next character of tag name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*p != '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* EOF inside tag name? */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* tag close: break out of collection loop */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '>') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* see if illegal character in tag name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* CSTYLED */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strchr("/ \t\n\":<?$'\\`!@#%^&*()+=|[]{};,", c)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland c, (unsigned int)c, name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* valid character - add to name if room left */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* close of tag found */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* is the tag empty? If so that's an error */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if no parent, a close tag outside of any open tag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if not close to current parent, error */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* close of current tag found - success */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_READTAG_CLOSE_TAG,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* not starting a close tag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* at start of tag - input tag name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* EOF inside of tag name? */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if separator or end of line then tag name collected */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* see if illegal character in tag name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strchr("\":<>?$'\\`!@#%^&*()+=|[]{};,", c) != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland c, (unsigned int)c, name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* close current tag? */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '/') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* get next character of tag name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*p != '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* tag close not found? */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c != '>') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* is the tag empty? If so that's an error */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* tag closed */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* valid character - add to name if room left */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* get next character to parse */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*p != '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* have a valid tag name: <tagname */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_HAVE_TAG_NAME,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* place tag name inside of tag object */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* clear out name accumulator to get parameters */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* input parameters */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c != '>')
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* pass spaces before parameter name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* get next character of parameter name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*p != '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* EOF inside parameter name? */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if separator/end of line tag parameter collected */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* see if illegal character in parameter name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strchr("\":<?$'\\`!@#%^&*()+=|[]{};,.", c) !=
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* tag close found? */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '>') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* close tag found ? */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '/') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*p != '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '>') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* / not followed by > */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* valid character - add to name if room left */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '>') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* input parameter name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*p != '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* EOF inside of parameter name? */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strchr("\t \n\":<>?$'\\`!@%^*()+|[]{},./", c) != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* name - value separator found ? */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '=') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* valid character - add to name if room left */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* is the parameter name empty? If so that's an error */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* have a parameter name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_HAVE_PARM_NAME,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* duplicate (save) parameter name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* clear out name accumulator to get parameters */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*p != '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c != '"') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland c, (unsigned int)c);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* input parameter value */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*p != '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* EOF inside of parameter value? */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* close of parameter value? */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '"') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* valid character - add to value if room left */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* got the value */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_HAVE_PARM_VALUE,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland parameter = (SML_PARAM *)calloc(1, sizeof (SML_PARAM));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) memcpy(&(tag->params[tag->params_num - 1]), parameter,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '>') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* finished processing this tag element entry */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_TAG_HEAD_DONE,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (((r = _smlReadTag(&tmp_tag, &p, tag->name))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) memcpy(&(tag->tags[tag->tags_num - 1]), tmp_tag,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*p != '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: _smlWriteParamValue
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: XML Encode a plain text parameter value and write to datastream
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: ds - [RO, *RO] - (LU_DS)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Handle to datastream to write parameter value to
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * value - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Parameter value to be encoded and written
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * RESULT_OK - tag successfully read
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * RESULT_ERR - problem reading tag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_smlWriteParamValue(char **a_str, char *value)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* xml encode the plain text string */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* write the xml encoded parameter value to the datastream */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ns = sml_strPrintf("%s\"%s\"", *a_str ? *a_str : "", p);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free up xml encoded value storage */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return results */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_smlWriteSimpleTag(char **a_str, SML_TAG *tag)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ns = sml_strPrintf("%s<%s/>\n", *a_str, tag->name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ns = sml_strPrintf("%s<%s>\n", *a_str, tag->name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ns = sml_strPrintf("%s<%s %s=", *a_str ? *a_str : "", tag->name,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland r = _smlWriteParamValue(&np0, tag->params[0].value);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland np0 = sml_strPrintf(" %s=", tag->params[k].name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland r = _smlWriteParamValue(&np1, tag->params[k].value);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ns = sml_strPrintf("%s%s%s", *a_str, np0, np1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland r = _smlWriteSimpleTag(a_str, &(tag->tags[k]));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ns = sml_strPrintf("%s%s", *a_str ? *a_str : "", np0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_INT_FREE_TAG,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (unsigned long)tag,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_INT_FREE_PARAM_NAME,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_INT_FREE_PARAM_VALUE,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_INT_FREE_TAG_NAME,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland bzero(tag->params, sizeof (SML_PARAM)*tag->params_num);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_INT_FREE_PARAMS,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland bzero(tag->tags, sizeof (SML_TAG)*tag->tags_num);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_INT_FREE_TAGS,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: log_msg
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Outputs messages to logging facility.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Scope: public
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: type - the severity of the message
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * out - where to output the message.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * fmt - the printf format, plus its arguments
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: none
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*PRINTFLIKE2*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_smlLogMsg(LogMsgType a_type, const char *a_format, ...)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* no debug messages if not verbose mode */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* determine size of the message in bytes */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* allocate storage to hold the message */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* generate the results of the printf conversion */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vres = vsnprintf(rstr, vres+1, a_format, ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * nothing output, try stderr as a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * last resort