5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * CDDL HEADER START
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
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 *
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 *
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 *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * CDDL HEADER END
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Use is subject to license terms.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Module: sml.c
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Synopsis: simplified markup language (SML) support
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Taxonomy: project private
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Debug flag: sml
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
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 *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Public Methods:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
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 * and value
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 * descriptor
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * smlWriteTagToFile - Write an XML representation of a tag to a file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Unix includes
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <locale.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <signal.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdio.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdlib.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <libintl.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdarg.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <string.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <unistd.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/statvfs.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <errno.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <assert.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/types.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/stat.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <fcntl.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <limits.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <strings.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * liblu Includes
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "libinst.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "messages.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* Should be defined by cc -D */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#if !defined(TEXT_DOMAIN)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define TEXT_DOMAIN "SYS_TEST"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#endif
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Private Method Forward Declarations
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*PRINTFLIKE2*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void _smlLogMsg(LogMsgType a_type, const char *a_format, ...);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int _smlReadTag(SML_TAG **r_tag, char **a_str, char *parent);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int _smlWriteSimpleTag(char **a_str,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland SML_TAG *tag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int _smlWriteParamValue(char **a_str, char *value);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void _smlFreeTag(SML_TAG *tag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *_sml_fileStatInfoTag = "File-Stat-Info";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic boolean_t verbose = B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
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 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MAX_SML_COMPONENT_LENGTH 16384
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Public Methods
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandSML_TAG *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlAddTag(SML_TAG **r_tag, int a_index, SML_TAG *a_subTag)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland SML_TAG *tag;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(SML_TAG__ISVALID(a_subTag));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(SML_TAG__R_ISVALID(r_tag));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if no tag to update specified, ignore request */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag = *r_tag;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tag == SML_TAG__NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (tag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_ADD_TAG,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_subTag->name, tag->name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if index is out of range or -1, append to tag object */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((a_index > tag->tags_num) || (a_index == -1)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_index = tag->tags_num;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* bump number of tags in tag object */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->tags_num++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* expand tag object to hold new subtag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->tags = (SML_TAG *)realloc(tag->tags,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sizeof (SML_TAG) * tag->tags_num);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if not appending, adjust tag object to hold new subtag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_index < (tag->tags_num - 1)) {
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 }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* copy new subtag into correct location in tag object */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) memcpy(&(tag->tags[a_index]), a_subTag,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sizeof (SML_TAG));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (&(tag->tags[a_index]));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlDelTag(SML_TAG *tag, SML_TAG *sub_tag)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int index;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(SML_TAG__ISVALID(sub_tag));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if no tag to update specified, ignore request */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tag == SML_TAG__NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_DEL_TAG,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sub_tag->name, tag->name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if tag object is empty, ignore request */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tag->tags_num == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* determine index into tag object of element to remove */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (index = 0; index < tag->tags_num; index++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (sub_tag == &tag->tags[index]) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if element not found in tag, ignore request */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (index >= tag->tags_num) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free up the subtag to be deleted */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlFreeTag(sub_tag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * if not removing last element, collapse tag object removing
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * target element
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (index < (tag->tags_num - 1)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) memmove(&(tag->tags[index]), &(tag->tags[index + 1]),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sizeof (SML_TAG) *(tag->tags_num - index - 1));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* one less tag object in tag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->tags_num --;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If only one tag left, then delete entire tag structure
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * otherwise reallocate removing unneeded entry
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tag->tags_num > 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* realloc removing last element in tag object */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->tags = (SML_TAG *)realloc(tag->tags,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sizeof (SML_TAG) *tag->tags_num);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->tags = SML_TAG__NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlFreeTag(SML_TAG *tag)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(SML_TAG__ISVALID(tag));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tag->name != (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_FREE_TAG,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (unsigned long)tag, tag->name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free the tag object contents */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlFreeTag(tag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free the tag object handle */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland bzero(tag, sizeof (SML_TAG));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(tag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlGetNumParams(SML_TAG *a_tag)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (a_tag ? a_tag->params_num : 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlGetParam_r(SML_TAG *tag, char *name, char *buf, int bufLen)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int k;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(name != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*name != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(buf != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(bufLen > 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* terminate the buffer */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland buf[0] = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland buf[bufLen-1] = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland bzero(buf, bufLen);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if no tag specified, return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tag == SML_TAG__NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if no parameters in tag, return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tag->params == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_GET_PARAM,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland name, tag->name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* scan tag object looking for specified parameter */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (k = 0; k < tag->params_num; k++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(tag->params[k].name != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(tag->params[k].value != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (streq(tag->params[k].name, name)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland DBG_SML_GOT_PARAM,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->name, name, tag->params[k].value);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strncpy(buf, tag->params[k].value, bufLen-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* parameter not found - return */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlGetParam(SML_TAG *tag, char *name)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int k;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(name != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*name != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, "get param param <%s>", name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if no tag specified, return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tag == SML_TAG__NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return ((char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if no parameters in tag, return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tag->params == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return ((char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_GET_PARAM,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland name, tag->name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* scan tag object looking for specified parameter */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (k = 0; k < tag->params_num; k++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(tag->params[k].name != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(tag->params[k].value != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (streq(tag->params[k].name, name)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland DBG_SML_GOT_PARAM,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->name, name, tag->params[k].value);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (strdup(tag->params[k].value));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* parameter not found - return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return ((char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlGetParamName(SML_TAG *tag, int index)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if no tag specified, return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tag == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return ((char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_GET_PARAM_NAME,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->name, index);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if no parameters in tag, return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tag->params == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return ((char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if index not within range, return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (index >= tag->params_num) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return ((char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* index within range - return parameter name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(tag->params[index].name != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(tag->params[index].value != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_GOT_PARAM_NAME,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->name, index, tag->params[index].name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (strdup(tag->params[index].name));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlGetParamByTag(SML_TAG *tag, int index,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *tagName, char *paramName)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland SML_TAG *rtag;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(SML_TAG__ISVALID(tag));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(tagName != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*tagName != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(paramName != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*paramName != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_GET_PARAM_BY_TAG,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tagName, index, paramName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* find the requested tag by name and index */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rtag = smlGetTagByName(tag, index, tagName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (rtag == SML_TAG__NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return ((char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (smlGetParam(rtag, paramName));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandSML_TAG *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlGetTagByTagParam(SML_TAG *tag, int index,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *tagName, char *paramName, char *paramValue)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int ti; /* tag structure index */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(SML_TAG__ISVALID(tag));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(tagName != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*tagName != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(paramName != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*paramName != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(paramValue != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*paramValue != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if tag has no elements, return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tag->tags == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (SML_TAG__NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
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 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (ti = 0; ti < tag->tags_num; ti++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int pi; /* parameter structure index */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if tag element does not match, go on to next tag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(tag->tags[ti].name, tagName)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* element matches: search for specified parameter name/value */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
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
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if parameter name doesnt match to next parameter */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(tag->tags[ti].params[pi].name, paramName)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if parameter value doesnt match to next tag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(tag->tags[ti].params[pi].value,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland paramValue)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * found element/paramname/paramvalue:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -> if this is not the 'index'th one, go to next tag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (index-- != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * found specified element/paramname/paramvalue:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -> return the tag found
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (&tag->tags[ti]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* no such element found - return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (SML_TAG__NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlGetParamByTagParam(SML_TAG *tag, int index,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *tagName, char *paramName, char *paramValue, char *paramReturn)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int ti; /* tag structure index */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(SML_TAG__ISVALID(tag));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(tagName != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*tagName != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(paramName != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*paramName != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(paramValue != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*paramValue != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(paramReturn != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*paramReturn != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if tag has no elements, return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tag->tags == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return ((char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
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 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (ti = 0; ti < tag->tags_num; ti++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int pi; /* parameter structure index */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if tag element does not match, go on to next tag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(tag->tags[ti].name, tagName)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* element matches: search for specified parameter name/value */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
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
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if parameter name doesnt match to next parameter */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(tag->tags[ti].params[pi].name, paramName)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if parameter value doesnt match to next tag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(tag->tags[ti].params[pi].value,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland paramValue)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * found element/paramname/paramvalue:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -> if this is not the 'index'th one, go to next tag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (index-- != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * found specified element/paramname/paramvalue:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -> return parameter requested
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (smlGetParam(&tag->tags[ti], paramReturn));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* no such element found - return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return ((char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlGetElementName(SML_TAG *a_tag)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(SML_TAG__ISVALID(a_tag));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_tag->name != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*a_tag->name != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return the tag name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (strdup(a_tag->name));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandSML_TAG *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlGetTag(SML_TAG *tag, int index)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if no tag specified, return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tag == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (SML_TAG__NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if tag has no elements, return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tag->tags == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (SML_TAG__NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if index not within range, return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tag->tags_num <= index) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (SML_TAG__NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* index within range, return element specified */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(SML_TAG__ISVALID(&tag->tags[index]));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (&tag->tags[index]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandSML_TAG *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlGetTagByName(SML_TAG *tag, int index, char *name)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int k;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_GET_TAG_BY_NAME, name, index);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if no tag specified, return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tag == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (SML_TAG__NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if this tag is the one mentioned, return it */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (streq(tag->name, name) && (index == 0)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (tag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if tag has no elements, return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tag->tags == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (SML_TAG__NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if index out of range, return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tag->tags_num <= index) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (SML_TAG__NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* index within range - search for specified element */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (k = 0; k < tag->tags_num; k++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (streq(tag->tags[k].name, name)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (index == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(SML_TAG__ISVALID(&tag->tags[k]));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (&tag->tags[k]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland index--;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* no such element found - return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (SML_TAG__NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlConvertStringToTag(SML_TAG **r_tag, char *str)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int r;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland SML_TAG *tag = SML_TAG__NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland SML_TAG *tmp_tag;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(SML_TAG__R_ISVALID(r_tag));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(str != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*str != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag = smlNewTag("tagfile");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (;;) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland r = _smlReadTag(&tmp_tag, &str, NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (r != RESULT_OK) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland smlFreeTag(tag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (r);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tmp_tag == SML_TAG__NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*str != '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland DBG_SML_LOADED_TAGS_FROM_STR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (unsigned long)tag, tag->name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *r_tag = tag;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_OK);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_READ_IN_TOP_TAG,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tmp_tag->name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->tags_num++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->tags = (SML_TAG *)realloc(tag->tags,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sizeof (SML_TAG) *tag->tags_num);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) memcpy(&(tag->tags[tag->tags_num - 1]), tmp_tag,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sizeof (SML_TAG));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlReadOneTag(SML_TAG **r_tag, char *a_str)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int r;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(SML_TAG__R_ISVALID(r_tag));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_str != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_READ_ONE_TAG, a_str);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* reset return tag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *r_tag = SML_TAG__NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* read tag from datastream, no parent tag to attach it to */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland r = _smlReadTag(r_tag, &a_str, NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (r != RESULT_OK) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_ERR, ERR_SML_CANNOT_READ_TAG);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (r);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*r_tag != SML_TAG__NULL) {
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 } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_READ_ONE_TAG_NOTAG);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* exit debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_OK);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandSML_TAG *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlNewTag(char *name)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland SML_TAG *tag;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert((name == (char *)NULL) || (*name != '\0'));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_CREATE_NEW_TAG_OBJECT,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland name ? name : "<no name>");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* allocate zeroed storage for the tag object */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag = (SML_TAG *)calloc(1, sizeof (SML_TAG));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(tag != SML_TAG__NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if name is provided, duplicate and assign it */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (name != (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->name = strdup(name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* exit assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(SML_TAG__ISVALID(tag));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* exit debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_CREATED_NEW_TAG_OBJECT,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (unsigned long)tag, name ? name : "<no name>");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (tag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlConvertTagToString(SML_TAG *tag)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *str = (char *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(SML_TAG__ISVALID(tag));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* convert the tag object into the datastream */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) _smlWriteSimpleTag(&str, tag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(str != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*str != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return the results */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (str);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 * is output.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*PRINTFLIKE2*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlDbgPrintTag(SML_TAG *a_tag, char *a_format, ...)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_list ap;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland size_t vres = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char bfr[1];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *rstr = (char *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_format != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*a_format != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(SML_TAG__ISVALID(a_tag));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * output the message header
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* determine size of the message in bytes */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_start(ap, a_format);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vres = vsnprintf(bfr, 1, a_format, ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_end(ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(vres > 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* allocate storage to hold the message */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rstr = (char *)calloc(1, vres+2);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(rstr != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* generate the results of the printf conversion */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_start(ap, a_format);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vres = vsnprintf(rstr, vres+1, a_format, ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_end(ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(vres > 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*rstr != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, "%s", rstr);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(rstr);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* convert the tag into a string to be printed */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rstr = smlConvertTagToString(a_tag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (rstr != (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_PRINTTAG, a_tag->name,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland strlen(rstr), rstr);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(rstr);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlDelParam(SML_TAG *tag, char *name)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int k;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(SML_TAG__ISVALID(tag));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(tag->name != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(name != NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*name != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_DELETE_PARAM,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->name, name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if tag has no parameters, nothing to delete */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tag->params == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland DBG_SML_DELETE_PARAM_NO_PARAMS);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(tag->params_num > 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* search the tag for the parameter */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (k = 0; k < tag->params_num; k++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (streq(tag->params[k].name, name)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if the parameter was not found, nothing to delete */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (k >= tag->params_num) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland DBG_SML_DELETE_PARAM_NOT_FOUND,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* parameter found - indicate deleted */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(tag->params[k].name != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(tag->params[k].value != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland DBG_SML_DELETE_PARAM_FOUND,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland name, tag->params[k].value);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free up storage fro parameter */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(tag->params[k].name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(tag->params[k].value);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if not at end, compact parameter storage */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (k < (tag->params_num -1)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) memmove(&(tag->params[k]), &(tag->params[k + 1]),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sizeof (SML_PARAM) *(tag->params_num - k - 1));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* one less parameter object in tag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->params_num --;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If only one parameter left, then delete entire parameter storage,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * otherwise reallocate removing unneeded entry
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tag->params_num > 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* realloc removing last element in tag object */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->params = (SML_PARAM *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland realloc(tag->params,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sizeof (SML_PARAM) *tag->params_num);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->params = (SML_PARAM *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*PRINTFLIKE3*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlSetParamF(SML_TAG *tag, char *name, char *format, ...)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_list ap;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland size_t vres = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *bfr = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char fbfr[1];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(SML_TAG__ISVALID(tag));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(name != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*name != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(format != NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*format != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* determine size of the parameter name in bytes */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_start(ap, format);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vres = vsnprintf(fbfr, 1, format, ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_end(ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(vres > 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* allocate storage to hold the message */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland bfr = (char *)calloc(1, vres+2);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(bfr != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* generate the parameter name and store it in the allocated storage */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_start(ap, format);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vres = vsnprintf(bfr, vres+1, format, ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_end(ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(vres > 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*bfr != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* add the parameter to the tag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland smlSetParam(tag, name, bfr);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free up temporary storage and return */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(bfr);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*PRINTFLIKE2*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlGetParamF(SML_TAG *tag, char *format, ...)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_list ap;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland size_t vres = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *bfr = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char fbfr[1];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(SML_TAG__ISVALID(tag));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(format != NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*format != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* determine size of the parameter name in bytes */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_start(ap, format);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vres = vsnprintf(fbfr, 1, format, ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_end(ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(vres > 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* allocate storage to hold the message */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland bfr = (char *)calloc(1, vres+2);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(bfr != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* generate the parameter name and store it in the allocated storage */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_start(ap, format);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vres = vsnprintf(bfr, vres+1, format, ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_end(ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(vres > 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*bfr != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* add the parameter to the tag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p = smlGetParam(tag, bfr);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free up temporary storage and return */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(bfr);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (p);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlSetParam(SML_TAG *tag, char *name, char *value)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland SML_PARAM *parameter;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(SML_TAG__ISVALID(tag));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(name != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*name != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(value != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_SET_PARAM,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->name, name, value);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if parameters exist, see if modifying existing parameter */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tag->params != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int k;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (k = 0; k < tag->params_num; k++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(tag->params[k].name != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(tag->params[k].value != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if name does not match, skip */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!streq(tag->params[k].name, name)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* found parameter - if value is same, leave alone */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (streq(tag->params[k].value, value)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland DBG_SML_SET_PARAM_LEAVE_ALONE,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->params[k].value);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* exists and has different value - change */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland DBG_SML_SET_PARAM_MODIFY,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->params[k].value);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(tag->params[k].value);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->params[k].value = strdup(value);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* not modifying existing - add new parameter */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland DBG_SML_SET_PARAM_CREATE_NEW);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland parameter = (SML_PARAM *)calloc(1, sizeof (SML_PARAM));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland bzero(parameter, sizeof (SML_PARAM));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland parameter->name = strdup(name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland parameter->value = strdup(value);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->params_num++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->params = (SML_PARAM *)realloc(tag->params,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sizeof (SML_PARAM) *tag->params_num);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) memcpy(&(tag->params[tag->params_num - 1]), parameter,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sizeof (SML_PARAM));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(parameter);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*PRINTFLIKE4*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlParamEqF(SML_TAG *tag, char *findTag, char *findParam, char *format, ...)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_list ap;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland size_t vres = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *bfr = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char fbfr[1];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t b;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(SML_TAG__ISVALID(tag));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(format != NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*format != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* determine size of the parameter value in bytes */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_start(ap, format);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vres = vsnprintf(fbfr, 1, format, ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_end(ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(vres > 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* allocate storage to hold the message */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland bfr = (char *)calloc(1, vres+2);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(bfr != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* generate the parameter value and store it in the allocated storage */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_start(ap, format);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vres = vsnprintf(bfr, vres+1, format, ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_end(ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(vres > 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*bfr != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* add the parameter to the tag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland b = smlParamEq(tag, findTag, findParam, bfr);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free up temporary storage and return */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(bfr);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (b);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlParamEq(SML_TAG *tag, char *findTag, char *findParam, char *str)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland SML_TAG *rtag;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *rparm;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t answer;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(str != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(findParam != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(findTag != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(SML_TAG__ISVALID(tag));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* look for the specified tag - if not found, return false */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rtag = smlGetTagByName(tag, 0, findTag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (rtag == SML_TAG__NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* look for the specified parameter - if not found, return false */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rparm = smlGetParam(rtag, findParam);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (rparm == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* parameter found - compare against given value */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland answer = strcasecmp(str, rparm);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free up parameter storage */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(rparm);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return results of comparison */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (answer == 0 ? B_TRUE : B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlFindAndDelTag(SML_TAG *tag, char *findTag)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland SML_TAG *rtag = SML_TAG__NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(SML_TAG__ISVALID(tag));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(findTag != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*findTag != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* find the specified tag - if not found, return false */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rtag = smlGetTagByName(tag, 0, findTag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (rtag == SML_TAG__NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* tag found - delete it and return true */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland smlDelTag(tag, rtag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandSML_TAG *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlDup(SML_TAG *tag)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland SML_TAG *rtag = SML_TAG__NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(SML_TAG__ISVALID(tag));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* allocate zeroed storage for the tag object */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rtag = (SML_TAG *)calloc(1, sizeof (SML_TAG));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(rtag != SML_TAG__NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* duplicate all parameters of the tag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rtag->name = (tag->name ? strdup(tag->name) : (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rtag->params_num = tag->params_num;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tag->params != (SML_PARAM *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rtag->params = (SML_PARAM *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland calloc(1, sizeof (SML_PARAM)*rtag->params_num);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland bzero(rtag->params, sizeof (SML_PARAM)*rtag->params_num);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; i < rtag->params_num; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rtag->params[i].name = tag->params[i].name ?
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland strdup(tag->params[i].name) :
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (char *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rtag->params[i].value = tag->params[i].value ?
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland strdup(tag->params[i].value) :
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (char *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* duplicate all elements of the tag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rtag->tags_num = tag->tags_num;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tag->tags != SML_TAG__NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rtag->tags = (SML_TAG *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland calloc(1, sizeof (SML_TAG)*rtag->tags_num);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland bzero(rtag->tags, sizeof (SML_TAG)*rtag->tags_num);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; i < rtag->tags_num; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland SML_TAG *stag;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland stag = smlDup(&tag->tags[i]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) memcpy(&rtag->tags[i], stag,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sizeof (SML_TAG));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(stag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* exit assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(SML_TAG__ISVALID(rtag));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (rtag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlSetFileStatInfo(SML_TAG **tag, struct stat *statbuf, char *path)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland SML_TAG *rtag;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(SML_TAG__R_ISVALID(tag));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(SML_TAG__ISVALID(*tag));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(statbuf != (struct stat *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if stat info exists, delete it */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) smlFindAndDelTag(*tag, _sml_fileStatInfoTag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* create the file stat info inside of the top level tag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(smlGetTagByName(*tag, 0, _sml_fileStatInfoTag)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland == SML_TAG__NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rtag = smlNewTag(_sml_fileStatInfoTag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(SML_TAG__ISVALID(rtag));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) smlAddTag(tag, 0, rtag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(rtag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* obtain handle on newly created file stat info tag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rtag = smlGetTagByName(*tag, 0, _sml_fileStatInfoTag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(SML_TAG__ISVALID(rtag));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* add file info as parameters to the tag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (path != (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland smlSetParam(rtag, "st_path", path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland smlSetParamF(rtag, "st_ino", "0x%llx",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (unsigned long long)statbuf->st_ino);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland smlSetParamF(rtag, "st_mode", "0x%llx",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (unsigned long long)statbuf->st_mode);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland smlSetParamF(rtag, "st_mtime", "0x%llx",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (unsigned long long)statbuf->st_mtime);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland smlSetParamF(rtag, "st_ctime", "0x%llx",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (unsigned long long)statbuf->st_ctime);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland smlSetParamF(rtag, "st_size", "0x%llx",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (unsigned long long)statbuf->st_size);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlFstatCompareEq(struct stat *statbuf, SML_TAG *tag, char *path)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tag == SML_TAG__NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(SML_TAG__ISVALID(tag));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (statbuf == (struct stat *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (path != (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (smlParamEq(tag,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _sml_fileStatInfoTag, "st_path", path) != B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (smlParamEqF(tag, _sml_fileStatInfoTag, "st_ino",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "0x%llx", (unsigned long long)statbuf->st_ino) != B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (smlParamEqF(tag, _sml_fileStatInfoTag, "st_mode",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "0x%llx", (unsigned long long)statbuf->st_mode) != B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (smlParamEqF(tag, _sml_fileStatInfoTag, "st_mtime",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "0x%llx", (unsigned long long)statbuf->st_mtime) != B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (smlParamEqF(tag, _sml_fileStatInfoTag, "st_ctime",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "0x%llx", (unsigned long long)statbuf->st_ctime) != B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (smlParamEqF(tag, _sml_fileStatInfoTag, "st_size",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "0x%llx", (unsigned long long)statbuf->st_size) != B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlSetVerbose(boolean_t setting)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland verbose = setting;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandsmlGetVerbose()
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (verbose);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*PRINTFLIKE1*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandsml_strPrintf(char *a_format, ...)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_list ap;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland size_t vres = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char bfr[1];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *rstr = (char *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_format != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*a_format != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* determine size of the message in bytes */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_start(ap, a_format);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vres = vsnprintf(bfr, 1, a_format, ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_end(ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(vres > 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* allocate storage to hold the message */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rstr = (char *)calloc(1, vres+2);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(rstr != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* generate the results of the printf conversion */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_start(ap, a_format);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vres = vsnprintf(rstr, vres+1, a_format, ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_end(ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(vres > 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*rstr != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return the results */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (rstr);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*PRINTFLIKE3*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandsml_strPrintf_r(char *a_buf, int a_bufLen, char *a_format, ...)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_list ap;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland size_t vres = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_format != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*a_format != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_buf != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_bufLen > 1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* generate the results of the printf conversion */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_start(ap, a_format);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vres = vsnprintf(a_buf, a_bufLen-1, a_format, ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_end(ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(vres > 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(vres < a_bufLen);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_buf[a_bufLen-1] = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandsml_XmlEncodeString(char *a_plainTextString)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
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
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_plainTextString != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland textLength = strlen(a_plainTextString);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Allocate initial string buffer to hold results */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland stringLength = textLength*2;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland stringTail = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland stringHead = (char *)calloc(1, (size_t)stringLength+2);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(stringHead != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Add in the encoded message text */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (p = a_plainTextString; textLength > 0; p++, textLength--) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
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 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((stringLength-stringTail) < 12) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland stringLength += (textLength*2)+12;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland stringHead =
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland realloc(stringHead,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (size_t)stringLength+2);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(stringHead != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
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 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland switch (*p) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '!':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '#':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '%':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '\'':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '(':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case ')':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '*':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '+':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case ',':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '-':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '.':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '/':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '0':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '1':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '2':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '3':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '4':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '5':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '6':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '7':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '8':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '9':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case ':':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case ';':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '<':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '=':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '>':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '?':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '@':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'A':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'B':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'C':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'D':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'E':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'F':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'G':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'H':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'I':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'J':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'K':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'L':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'M':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'N':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'O':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'P':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'Q':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'R':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'S':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'T':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'U':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'V':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'W':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'X':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'Y':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'Z':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '[':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case ']':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '^':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '_':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'a':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'b':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'c':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'd':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'e':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'f':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'g':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'h':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'i':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'j':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'k':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'l':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'm':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'n':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'o':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'p':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'q':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'r':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 's':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 't':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'u':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'v':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'w':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'x':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'y':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'z':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '{':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '|':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '}':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '~':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case ' ':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * It is a printable 7-bit ascii character:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * just add it to the end of the new string.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland stringHead[stringTail++] = *p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland default:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * It is not a printable 7-bit ascii character:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * add it as an xml character value encoding.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland stringTail += sprintf(&stringHead[stringTail], "&#%x;",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (*p)&0xFF);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Terminate the new string */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland stringHead[stringTail] = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* realloc the string so it is only as big as it needs to be */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland stringHead = realloc(stringHead, stringTail+1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(stringHead != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (stringHead);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandsml_XmlDecodeString(char *a_xmlEncodedString)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
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 ptrdiff_t tmpdiff;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
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 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int fsmsState = -1; /* Finite state machine state */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define fsms_text 0 /* Decoding plain text */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define fsms_seenAmp 1 /* Found & */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define fsms_seenPound 2 /* Found # following & */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define fsms_collect 3 /* Collecting character reference bytes */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_xmlEncodedString != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland textLength = strlen(a_xmlEncodedString);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
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 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland stringHead = (char *)calloc(1, textLength+1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(stringHead != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Convert all bytes.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Decoding plain text */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland fsmsState = fsms_text;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (s = a_xmlEncodedString, d = stringHead; textLength > 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland s++, textLength--) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland switch (fsmsState) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case fsms_text: /* Decoding plain text */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (rs != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(rs);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rs = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ri = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*s == '&') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Found & */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland fsmsState = fsms_seenAmp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *d++ = *s;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case fsms_seenAmp: /* Found & */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*s == '#') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Found # following & */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland fsmsState = fsms_seenPound;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland fsmsState = fsms_text; /* Decoding plain text */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *d++ = '&';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *d++ = *s;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case fsms_seenPound: /* Found # following & */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland i = strchr(s, ';');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (i == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Decoding plain text */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland fsmsState = fsms_text;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *d++ = '&';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *d++ = '#';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *d++ = *s;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tmpdiff = (ptrdiff_t)i - (ptrdiff_t)s;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rs = (char *)calloc(1, tmpdiff + 1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(rs != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ri = rs;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Collecting character reference bytes */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland fsmsState = fsms_collect;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*FALLTHRU*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Collecting character reference bytes */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case fsms_collect:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*s != ';') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland switch (*s) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '0':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '1':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '2':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '3':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '4':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '5':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '6':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '7':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '8':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '9':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'a':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'b':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'c':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'd':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'e':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'f':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'A':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'B':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'C':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'D':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'E':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'F':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *ri++ = *s;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland default:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *ri = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *d++ = '&';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *d++ = '#';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tmpdiff = (ptrdiff_t)ri - (ptrdiff_t)rs;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strncpy(d, rs, tmpdiff-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *d++ = *s;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Decoding plain text */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland fsmsState = fsms_text;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *ri = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (sscanf(rs, "%lx", &rv) != 1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *d++ = '?';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *d++ = (rv & 0xFF);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Decoding plain text */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland fsmsState = fsms_text;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Done converting bytes - deallocate reference byte storage */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(rs);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* terminate the converted (plain text) string */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *d = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* exit assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(stringHead != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (stringHead);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Private Methods
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_smlReadTag(SML_TAG **r_tag, char **a_str, char *parent)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int r;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland SML_TAG *tag;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland SML_TAG *tmp_tag;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char name[MAX_SML_COMPONENT_LENGTH];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int pos = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int c;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *p = *a_str;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(SML_TAG__R_ISVALID(r_tag));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_str != (char **)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_READ_TAG,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland parent ? parent : "<<TOP TAG>>");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* reset return tag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *r_tag = SML_TAG__NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* allocate zeroed storage for the tag object */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag = (SML_TAG *)calloc(1, sizeof (SML_TAG));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(tag != SML_TAG__NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* reset name accumulator storage */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland bzero(name, sizeof (name));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* ignore delimters before tag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (;;) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* read tag character - handle failure/EOF */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((*p == '\0') || ((c = (*p++)) == '\0')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (parent == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland DBG_SML_READTAG_EXPECTED_EOF,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p ? p : "?");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland smlFreeTag(tag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_str = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_OK);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* EOF in middle of processing tag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_ERR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland DBG_SML_READTAG_UNEXPECTED_EOF,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p ? p : "?");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland smlFreeTag(tag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_str = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_ERR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if beginning of tag, break out */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '<') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* not tag beginning: ignore delimiters if not inside tag yet */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (parent == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* ignore delimters */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strchr(" \t", c) != (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* on blank lines, return no tag object */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '\n') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland DBG_SML_READTAG_BLANKLINE,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p ? p : "?");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland smlFreeTag(tag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_str = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_OK);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* invalid character before tag start */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_ERR, ERR_SML_READTAG_BAD_START_CHAR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland c, (unsigned int)c);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_str = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_ERR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * all delimiters have been ignored and opening tag character seen;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * process tag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(c == '<');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland c = *p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*p != '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* handle EOF after tag opening character found */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_ERR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ERR_SML_EOF_BEFORE_TAG_NAME,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland parent ? parent : "<<NONE>>");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland smlFreeTag(tag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_str = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_ERR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* is this a tag closure? */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '/') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_START_CLOSE_TAG,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland parent ? parent : "<<NONE>>");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (;;) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* get next character of tag name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland c = *p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*p != '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* EOF inside tag name? */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_ERR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ERR_SML_READTAG_CLOSE_TAG_EOF,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland parent ? parent : "<<NONE>>");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland smlFreeTag(tag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_str = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_ERR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* tag close: break out of collection loop */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '>') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* see if illegal character in tag name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* CSTYLED */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strchr("/ \t\n\":<?$'\\`!@#%^&*()+=|[]{};,", c)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_ERR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ERR_SML_READTAG_CLOSE_TAG_ILLCHAR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland c, (unsigned int)c, name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland smlFreeTag(tag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_str = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_ERR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* valid character - add to name if room left */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pos < sizeof (name)-1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland name[pos] = (c&0xFF);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pos++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(pos < sizeof (name));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* close of tag found */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(c == '>');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* is the tag empty? If so that's an error */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*name == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_ERR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ERR_SML_READTAG_CLOSE_EMPTY_TAG);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland smlFreeTag(tag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_str = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_ERR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if no parent, a close tag outside of any open tag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (parent == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_ERR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ERR_SML_READTAG_CLOSE_NO_PARENT,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland smlFreeTag(tag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_str = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_ERR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if not close to current parent, error */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!streq(parent, name)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_ERR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ERR_SML_READTAG_CLOSE_WRONG_TAG,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland name, parent);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland smlFreeTag(tag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_str = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_ERR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* close of current tag found - success */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_READTAG_CLOSE_TAG,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland smlFreeTag(tag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_str = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_OK);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* not starting a close tag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(c != '/');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(c != '<');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* at start of tag - input tag name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland bzero(name, sizeof (name));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pos = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (;;) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* EOF inside of tag name? */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_ERR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ERR_SML_READTAG_TAG_EOF,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland name, parent ? parent : "<<NONE>>");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland smlFreeTag(tag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_str = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_ERR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if separator or end of line then tag name collected */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strchr(" >\t\n", c) != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* see if illegal character in tag name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*CSTYLED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strchr("\":<>?$'\\`!@#%^&*()+=|[]{};,", c) != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_ERR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ERR_SML_READTAG_TAG_ILLCHAR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland c, (unsigned int)c, name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland smlFreeTag(tag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_str = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_ERR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* close current tag? */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '/') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* get next character of tag name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland c = *p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*p != '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* tag close not found? */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c != '>') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_ERR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ERR_SML_READTAG_BADTAG_CLOSE,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland name, parent ? parent : "<<NONE>>");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland smlFreeTag(tag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_str = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_ERR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* is the tag empty? If so that's an error */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*name == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_ERR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ERR_SML_READTAG_EMPTY_TAG,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland parent ? parent : "<<NONE>>");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland smlFreeTag(tag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_str = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_ERR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* tag closed */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland DBG_SML_READTAG_CLOSED_TAG,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland name, parent ? parent : "<<NONE>>");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->name = strdup(name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *r_tag = tag;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_str = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_OK);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* valid character - add to name if room left */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pos < sizeof (name)-1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland name[pos] = (c&0xFF);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pos++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(pos < sizeof (name));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* get next character to parse */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland c = *p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*p != '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* have a valid tag name: <tagname */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_HAVE_TAG_NAME,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland name, parent ? parent : "<<NONE>>");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*name != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* place tag name inside of tag object */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->name = strdup(name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* clear out name accumulator to get parameters */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland bzero(name, sizeof (name));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pos = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* input parameters */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c != '>')
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (;;) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *pname;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *pvalue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland SML_PARAM *parameter;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* pass spaces before parameter name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (;;) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* get next character of parameter name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland c = *p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*p != '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* EOF inside parameter name? */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_ERR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ERR_SML_READTAG_PARM_EOF,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->name,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland parent ? parent : "<<NONE>>");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland smlFreeTag(tag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_str = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_ERR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if separator/end of line tag parameter collected */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strchr(" \t\n", c) != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* see if illegal character in parameter name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*CSTYLED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strchr("\":<?$'\\`!@#%^&*()+=|[]{};,.", c) !=
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_ERR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ERR_SML_READTAG_PARMNAME_ILLCHAR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland c, (unsigned int)c, name, tag->name,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland parent ? parent : "<<NONE>>");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland smlFreeTag(tag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_str = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_ERR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* tag close found? */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '>') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* close tag found ? */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '/') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland c = *p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*p != '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '>') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland DBG_SML_TAG_ONLY,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *r_tag = tag;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_str = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_OK);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* / not followed by > */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_ERR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ERR_SML_READTAG_BADPARMNAME_CLOSE,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland name, tag->name,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland parent ? parent : "<<NONE>>");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland smlFreeTag(tag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_str = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_ERR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* valid character - add to name if room left */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pos < sizeof (name)-1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland name[pos] = (c&0xFF);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pos++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(pos < sizeof (name));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '>') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* input parameter name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (;;) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland c = *p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*p != '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* EOF inside of parameter name? */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_ERR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ERR_SML_READTAG_PARM_EOF,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->name,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland parent ? parent : "<<NONE>>");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland smlFreeTag(tag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_str = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_ERR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*CSTYLED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strchr("\t \n\":<>?$'\\`!@%^*()+|[]{},./", c) != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_ERR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ERR_SML_READTAG_PARMNAME_ILLCHAR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland c, (unsigned int)c, name, tag->name,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland parent ? parent : "<<NONE>>");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland smlFreeTag(tag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_str = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_ERR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* name - value separator found ? */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '=') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* valid character - add to name if room left */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pos < sizeof (name)-1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland name[pos] = (c&0xFF);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pos++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(pos < sizeof (name));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* is the parameter name empty? If so that's an error */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*name == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_ERR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ERR_SML_READTAG_EMPTY_PARMNAME,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->name, parent ? parent : "<<NONE>>");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland smlFreeTag(tag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_str = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_ERR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* have a parameter name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_HAVE_PARM_NAME,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland name, tag->name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* duplicate (save) parameter name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pname = strdup(name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* clear out name accumulator to get parameters */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland bzero(name, sizeof (name));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pos = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland c = *p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*p != '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c != '"') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_ERR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ERR_SML_PARM_SEP_BAD,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland c, (unsigned int)c);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(pname);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland smlFreeTag(tag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_str = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_ERR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* input parameter value */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (;;) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland c = *p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*p != '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* EOF inside of parameter value? */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_ERR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ERR_SML_READTAG_PARMVAL_EOF,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pname, tag->name,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland parent ? parent : "<<NONE>>");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland smlFreeTag(tag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(pname);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_str = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_ERR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* close of parameter value? */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '"') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strchr("\n", c) != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_ERR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ERR_SML_READTAG_PARMVAL_NL,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pname, tag->name,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland parent ? parent : "<<NONE>>");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(pname);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland smlFreeTag(tag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_str = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_ERR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* valid character - add to value if room left */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pos < sizeof (name)-1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland name[pos] = (c&0xFF);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pos++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(pos < sizeof (name));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* got the value */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_HAVE_PARM_VALUE,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pname, name, tag->name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pvalue = sml_XmlDecodeString(name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland bzero(name, sizeof (name));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pos = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland parameter = (SML_PARAM *)calloc(1, sizeof (SML_PARAM));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland bzero(parameter, sizeof (SML_PARAM));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland parameter->name = pname;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland parameter->value = pvalue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->params_num++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->params = (SML_PARAM *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland realloc(tag->params,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sizeof (SML_PARAM) *tag->params_num);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) memcpy(&(tag->params[tag->params_num - 1]), parameter,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sizeof (SML_PARAM));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(parameter);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '>') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* finished processing this tag element entry */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_TAG_HEAD_DONE,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->name, parent ? parent : "<<NULL>>");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->tags = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (((r = _smlReadTag(&tmp_tag, &p, tag->name))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland == RESULT_OK) && (tmp_tag != NULL)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->tags_num++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->tags = (SML_TAG *)realloc(tag->tags,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sizeof (SML_TAG) *tag->tags_num);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) memcpy(&(tag->tags[tag->tags_num - 1]), tmp_tag,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sizeof (SML_TAG));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(tmp_tag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland c = *p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*p != '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *r_tag = tag;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_str = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (r);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_smlWriteParamValue(char **a_str, char *value)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *ns;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_str != (char **)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(value != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* xml encode the plain text string */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p = sml_XmlEncodeString(value);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(p != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* write the xml encoded parameter value to the datastream */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ns = sml_strPrintf("%s\"%s\"", *a_str ? *a_str : "", p);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free up xml encoded value storage */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(p);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ns == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_ERR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*a_str != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(*a_str);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_str = ns;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return results */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_OK);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_smlWriteSimpleTag(char **a_str, SML_TAG *tag)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int r;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int k;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *ns;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *np0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *np1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tag == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_OK);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*a_str == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_str = strdup("");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tag->params_num == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tag->tags_num == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ns = sml_strPrintf("%s<%s/>\n", *a_str, tag->name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(*a_str);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_str = ns;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_OK);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ns = sml_strPrintf("%s<%s>\n", *a_str, tag->name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ns == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_ERR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(*a_str);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_str = ns;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ns = sml_strPrintf("%s<%s %s=", *a_str ? *a_str : "", tag->name,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->params[0].name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ns == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_ERR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(*a_str);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_str = ns;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland np0 = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland r = _smlWriteParamValue(&np0, tag->params[0].value);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((np0 == NULL) || (r != RESULT_OK)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_ERR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ns = sml_strPrintf("%s%s", *a_str, np0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ns == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_ERR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(np0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(*a_str);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_str = ns;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (k = 1; k < tag->params_num; k++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland np0 = sml_strPrintf(" %s=", tag->params[k].name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (np0 == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_ERR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland np1 = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland r = _smlWriteParamValue(&np1, tag->params[k].value);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((np1 == NULL) || (r != RESULT_OK)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_ERR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ns = sml_strPrintf("%s%s%s", *a_str, np0, np1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ns == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_ERR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(np0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(np1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(*a_str);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_str = ns;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tag->tags_num == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland np0 = sml_strPrintf("/>\n");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (np0 == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_ERR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ns = sml_strPrintf("%s%s", *a_str, np0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ns == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_ERR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(np0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(*a_str);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_str = ns;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland np0 = sml_strPrintf(">\n");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (np0 == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_ERR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ns = sml_strPrintf("%s%s", *a_str, np0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ns == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_ERR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(np0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(*a_str);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_str = ns;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (k = 0; k < tag->tags_num; k++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland r = _smlWriteSimpleTag(a_str, &(tag->tags[k]));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (r != RESULT_OK) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (r);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tag->tags_num > 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland np0 = sml_strPrintf("</%s>\n", tag->name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (np0 == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_ERR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ns = sml_strPrintf("%s%s", *a_str ? *a_str : "", np0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ns == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_ERR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(np0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(*a_str);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_str = ns;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (RESULT_OK);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_smlFreeTag(SML_TAG *tag)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int k;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(tag != SML_TAG__NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_INT_FREE_TAG,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (unsigned long)tag,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->name ? tag->name : "<<NONE>>",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->params_num, tag->tags_num);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (k = 0; k < tag->params_num; k++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_INT_FREE_PARAM_NAME,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (unsigned long)(&tag->params[k]),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (unsigned long)(tag->params[k].name),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->params[k].name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(tag->params[k].name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->params[k].name = (char *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_INT_FREE_PARAM_VALUE,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (unsigned long)(&tag->params[k]),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (unsigned long)(tag->params[k].value),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->params[k].value);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(tag->params[k].value);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->params[k].value = (char *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (k = 0; k < tag->tags_num; k++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlFreeTag(&tag->tags[k]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tag->name != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_INT_FREE_TAG_NAME,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (unsigned long)tag->name, tag->name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(tag->name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->name = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tag->params != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(tag->params_num > 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland bzero(tag->params, sizeof (SML_PARAM)*tag->params_num);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_INT_FREE_PARAMS,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (unsigned long)tag->params);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(tag->params);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->params = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->params_num = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tag->tags != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(tag->tags_num > 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland bzero(tag->tags, sizeof (SML_TAG)*tag->tags_num);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _smlLogMsg(LOG_MSG_DEBUG, DBG_SML_INT_FREE_TAGS,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (unsigned long)tag->tags);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(tag->tags);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->tags = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tag->tags_num = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*PRINTFLIKE2*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_smlLogMsg(LogMsgType a_type, const char *a_format, ...)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_list ap;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland size_t vres = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char bfr[1];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *rstr = (char *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland FILE *out;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *prefix;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland switch (a_type) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case LOG_MSG_ERR:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland default:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland out = stderr;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland prefix = MSG_LOG_ERROR;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case LOG_MSG_WRN:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland out = stderr;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland prefix = MSG_LOG_WARNING;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case LOG_MSG_INFO:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland out = stdout;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland prefix = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case LOG_MSG_DEBUG:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!smlGetVerbose()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* no debug messages if not verbose mode */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland out = stderr;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland prefix = MSG_LOG_DEBUG;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (prefix != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(out, "%s: ", prefix);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* determine size of the message in bytes */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_start(ap, a_format);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vres = vsnprintf(bfr, 1, a_format, ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_end(ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* allocate storage to hold the message */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rstr = (char *)malloc(vres+2);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* generate the results of the printf conversion */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_start(ap, a_format);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vres = vsnprintf(rstr, vres+1, a_format, ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_end(ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (fprintf(out, "%s\n", rstr) < 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * nothing output, try stderr as a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * last resort
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stderr, ERR_LOG_FAIL, a_format);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(rstr);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}