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 2009 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: pkgstr.c
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Synopsis: general string services
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Taxonomy: project private
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Debug Flag: str
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * This module implements general string utility services
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Public Methods:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkgstrAddToken - Add a token to a string
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkgstrContainsToken - Determine if a string contains a specified token
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkgstrConvertPathToBasename - Return copy of base name in path string
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkgstrConvertPathToDirname - Return copy of directory name in path string
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkgstrConvertUllToTimeString_r - convert unsigned long long to time string
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkgstrExpandTokens - Expand tokens from string appending tokens to another
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkgstrGetToken - Get a token from a string
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkgstrGetToken_r - Get a token from a string into a fixed buffer
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkgstrLocatePathBasename - Locate position of base name in path string
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkgstrNumTokens - Determine number of tokens in string
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkgstrPrintf - Create a string from a printf style format and arguments
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkgstrPrintf_r - Create a string from a printf style format and arguments
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * into a fixed buffer
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkgstrRemoveToken - Remove a token from a string
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkgstrRemoveLeadingWhitespace - remove leading whitespace from string
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkgstrScaleNumericString - Convert unsigned long long to human
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * readable form
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Unix Includes
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define __EXTENSIONS__
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdio.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdlib.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <string.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <libintl.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <limits.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/types.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <assert.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <errno.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <libintl.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <ctype.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <unistd.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <strings.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdarg.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkglib Includes
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "pkglib.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "pkgstrct.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "libintl.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "pkglocale.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * External definitions
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Public methods
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: pkgstrRemoveLeadingWhitespace
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Synopsis: Remove leading whitespace from string
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Remove all leading whitespace characters from a string
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_str - [RO, *RW] - (char **)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Pointer to handle to string (in allocated storage) to
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * remove all leading whitespace from
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The input string is modified as follows:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == (char *)NULL:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - input string was (char *)NULL
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - input string is all whitespace
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * != (char *)NULL:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - copy of input string with leading
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * whitespace removed
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * CAUTION: The input string must be allocated space (via mem* or
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkgstr* methods) - it must not be a static or inline
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * character string
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: The input string a_str will be freed with 'free'
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * if it is all whitespace, or if it contains any leading
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * whitespace characters
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 Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandpkgstrRemoveLeadingWhitespace(char **a_str)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *o_str;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_str != (char **)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if string is null, just return */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*a_str == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland o_str = *a_str;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if string is empty, deallocate and return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*o_str == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free string - handle is reset to NULL by free */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(*a_str);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_str = (char *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if first character is not a space, just return */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!isspace(*o_str)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* advance past all space characters */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while ((*o_str != '\0') && (isspace(*o_str))) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland o_str++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if string was all space characters, deallocate and return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*o_str == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free string - *a_str is reset to NULL by free */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(*a_str);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_str = (char *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* have non-space/null byte, return dup, deallocate original */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland o_str = strdup(o_str);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(o_str != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (o_str != (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(*a_str);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_str = o_str;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandunsigned long
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandpkgstrNumTokens(char *a_string, char *a_separators)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int index;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_string == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*a_string == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (index = 0 ; ; index ++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p = pkgstrGetToken((char *)NULL, a_string, index, a_separators);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (p == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (index);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(p);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: pkgstrPrintf_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 WaterlandpkgstrPrintf_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: pkgstrPrintf
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 * VARG_LIST - [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 WaterlandpkgstrPrintf(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 assert(vres < LINE_MAX);
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 if (rstr == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return ((char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
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(vres < LINE_MAX);
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: pkgstrExpandTokens
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Synopsis: Expand tokens from string appending tokens to another
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Given a string and a list of one or more separators,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * expand each token from the string and append those tokens
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to a string that is in allocated space - create new string
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * if no string to append to exists.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_old - [RO, *RW] - (char **)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - Pointer to handle to string to append token to
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == (char *)NULL - new string is created
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_separator - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - separator to end tokens returned
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_separators - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - String containing one or more characters that
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * can separate one "token" from a_string from another
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: Any token 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 token string is no longer needed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandpkgstrExpandTokens(char **a_old, char *a_string, char a_separator,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *a_separators)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char sep[2] = {'\0', '\0'};
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* convert single separator character into character string */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sep[0] = a_separator;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * iterate extracting tokens from the source string and adding
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * those tokens to the target string when the tokens are not
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * already present in the target string
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; ; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* extract the next matching token from the source string */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p = pkgstrGetToken((char *)NULL, a_string, i, a_separators);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return if no token is available */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (p == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * obtained token from source string: if the token is not
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * in the target string, add the token to the target string
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgstrContainsToken(*a_old, p, sep) == B_FALSE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgstrAddToken(a_old, p, *sep);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free up temporary storage used by token from source string */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(p);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: pkgstrGetToken
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Synopsis: Get a separator delimited token from a string
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Given a string and a list of one or more separators,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * return the position specified token (sequence of one or
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * more characters that do not include any of the separators)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: r_sep - [*RW] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - separator that ended the token returned
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - NOTE: this is a pointer to a "char", e.g.:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - char a;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - pkgstrGetToken(&a, ...)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_string - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - pointer to string to extract token from
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_index - [RO, *RO] - (int)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - Index of token to return; '0' is first matching
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * token, '1' is second matching token, etc.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_separators - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - String containing one or more characters that
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * can separate one "token" from another
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: char *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == (char *)NULL - no token matching criteria found
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * != (char *)NULL - token matching criteria
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: Any token 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 token string is no longer needed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandpkgstrGetToken(char *r_sep, char *a_string, int a_index, char *a_separators)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *q;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *lasts;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_string != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_index >= 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_separators != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*a_separators != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if returned separator requested, reset to null until token found */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (r_sep != (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *r_sep = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* duplicate original string before breaking down into tokens */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p = strdup(a_string);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(p != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (p == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return ((char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland lasts = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* scan for separators and return 'index'th token found */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (q = strtok_r((char *)NULL, a_separators, &lasts)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* retrieve separator if requested */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (r_sep != (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *x;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland x = strpbrk(a_string, a_separators);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (x) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *r_sep = *x;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if this is the 'index'th token requested return it */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_index-- == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *tmp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* duplicate token into its own storage */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tmp = strdup(q);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(tmp != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tmp == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return ((char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free up copy of original input string */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(p);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return token found */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (tmp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * token not found
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free up copy of original input string */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(p);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return NULL pointer (token not found) */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return ((char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: pkgstrGetToken
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Synopsis: Get separator delimited token from a string into a fixed buffer
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Given a string and a list of one or more separators,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * return the position specified token (sequence of one or
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * more characters that do not include any of the separators)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * into a specified buffer of a fixed maximum size
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: r_sep - [*RW] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - separator that ended the token returned
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - NOTE: this is a pointer to a "char", e.g.:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - char a;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - pkgstrGetToken(&a, ...)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_string - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - pointer to string to extract token from
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_index - [RO, *RO] - (int)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - Index of token to return; '0' is first matching
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * token, '1' is second matching token, etc.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_separators - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - String containing one or more characters that
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * can separate one "token" from another
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_buf - [RO, *RW] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - Pointer to buffer used as storage space for the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * returned token - the returned token is always
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * null terminated
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_buf[0] == '\0' - no token meeting criteria found
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_buf[0] != '\0' - token meeting criteria returned
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 * token is always null terminated
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandpkgstrGetToken_r(char *r_sep, char *a_string, int a_index,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *a_separators, char *a_buf, int a_bufLen)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *q;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *lasts;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_string != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_index >= 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_separators != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*a_separators != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_buf != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_bufLen > 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* reset returned separator */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (r_sep != (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *r_sep = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* zero out contents of return buffer */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland bzero(a_buf, a_bufLen);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* duplicate original string before breaking down into tokens */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p = strdup(a_string);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(p != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (p == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland lasts = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* scan for separators and return 'index'th token found */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (q = strtok_r((char *)NULL, a_separators, &lasts)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* retrieve separator if requested */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (r_sep != (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *x;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland x = strpbrk(a_string, a_separators);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (x) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *r_sep = *x;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if this is the 'index'th token requested return it */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_index-- == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* copy as many characters as possible to return buf */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strncpy(a_buf, q, a_bufLen-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free up copy of original input string */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(p);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: pkgstrAddToken
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Synopsis: Add a token to a string
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Append a token (sequence of one or more characters) to a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * string that is in allocated space - create new string if
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * no string to append to exists
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_old - [RO, *RW] - (char **)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - Pointer to handle to string to append token to
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == (char *)NULL - new string is created
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_new - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - Pointer to string representing token to append
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to the end of the "a_old" string
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == (char *)NULL - no action is performed
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_new[0] == '\0' - no action is performed
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_separator - [RO, *RO] - (char)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - One character placed between the old (existing)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * string and the new token to be added IF the old
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * string exists and is not empty (zero length)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * CAUTION: The old (existing) string must be allocated space (via lu_mem*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * or pkgstr* methods) - it must not be a static or inline
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * character string
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: The old (existing) string may be freed with 'free'
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * if a token is appended to it
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: Any string returned in 'a_old' 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 token string is no longer needed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandpkgstrAddToken(char **a_old, char *a_new, char a_separator)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_old != (char **)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_separator != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if token to add is null, just return */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_new == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if token to add is empty (zero length), just return */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*a_new == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* make sure that new token does not contain the separator */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(strchr(a_new, (int)a_separator) == (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if old string is empty (zero length), deallocate */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((*a_old != (char *)NULL) && ((*a_old)[0] == '\0')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* *a_old is set to NULL by free */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(*a_old);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_old = (char *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if old string is exists, append separator and token */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*a_old != (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p = pkgstrPrintf("%s%c%s", *a_old, a_separator, a_new);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(*a_old);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_old = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* old string does not exist - return duplicate of token */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*a_old == (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *a_old = strdup(a_new);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*a_old != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: pkgstrContainsToken
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Synopsis: Does a given string contain a specified substring
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Determine if a given substring exists in a larger string
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_string - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Pointer to string to look for substring in
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_token - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Pointer to substring to look for in larger string
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Results: boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * B_TRUE - substring exists in larger string
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * B_FALSE - substring does NOT exist in larger string
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: The substring must match on a "token" basis; that is, the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * substring must exist in the larger string delineated with
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * either spaces or tabs to match.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandpkgstrContainsToken(char *a_string, char *a_token, char *a_separators)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *lasts;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *current;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_separators != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*a_separators != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if token is not supplied, return false */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_token == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if no string provided, return false */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_string == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if string empty (zero length), return false */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*a_string == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* duplicate larger string because strtok_r changes it */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p = strdup(a_string);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(p != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (p == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland lasts = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* scan each token looking for a match */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while ((current = strtok_r((char *)NULL, a_separators, &lasts)) !=
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (streq(current, a_token)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(p);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free up temporary storage */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(p);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* not found */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: pkgstrRemoveToken
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Synopsis: Remove a token from a string
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Remove a token (sequence of one or more characters) from a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * string that is in allocated space
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: r_string - [RO, *RW] - (char **)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - Pointer to handle to string to remove token from
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_token - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Pointer to token (substring) to look for and remove
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * from r_string provided
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_separators - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - String containing one or more characters that
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * separate one "token" from another in r_string
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_index - [RO, *RO] - (int)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - Index of token to remove; '0' is first matching
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * token, '1' is second matching token, etc.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * CAUTION: The input string must be allocated space (via lu_mem* or
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkgstr* methods) - it must not be a static or inline
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * character string
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: The input string r_string will be freed with 'free'
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * if the token to be removed is found
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: Any token 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 token string is no longer needed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Errors: If the new token string cannot be created, the process exits
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandpkgstrRemoveToken(char **r_string, char *a_token, char *a_separators,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int a_index)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *a_string;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *copyString;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char sep = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int copyLength;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(r_string != (char **)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_token != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*a_token != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_separators != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*a_separators != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* simple case: input string is null; return empty string */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_string = *r_string;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*a_string == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* simple case: token == input string; return empty string */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (streq(a_string, a_token)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* deallocate input string; free sets *r_string to NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(*r_string);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *r_string = (char *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* simple case: token not in input string: return */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!pkgstrContainsToken(a_string, a_token, a_separators)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Pick apart the old string building the new one as we go along
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * removing the first occurance of the token provided
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland copyLength = (strlen(a_string)-strlen(a_token))+2;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland copyString = calloc(1, copyLength);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(copyString != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (copyString == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; ; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p = pkgstrGetToken(&sep, a_string, i, a_separators);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (p == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (streq(p, a_token) && (a_index-- == 0)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*copyString) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(sep != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strncat(copyString, &sep, 1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strcat(copyString, p);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(*r_string);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*copyString);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *r_string = copyString;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: pkgstrScaleNumericString
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Synopsis: Convert unsigned long long to human readable form
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Convert a string containing an unsigned long long representation
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and convert it into a human readable numeric string. The number
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * is scaled down until it is small enough to be in a good human
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * readable format i.e. in the range 0 thru scale-1.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_buf - [RO, *RW] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Pointer to buffer containing string representation
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * of unsigned long long to convert
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * scale - [RO, *RO] - (unsigned long long)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Value to scale the number into
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: a_buf - contains human readable scaled representation of
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * original value contained in the buffer
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Note: The value "(unsigned long long)-1" is a special case and
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * is always converted to "-1".
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Errors: If the string cannot be created, the process exits
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandpkgstrScaleNumericString(char *a_buf, unsigned long long scale)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *M = " KMGTPE"; /* Measurement: */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* kilo, mega, giga, tera, peta, exa */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland unsigned long long number = 0; /* convert this number */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland unsigned long long save = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *uom = M; /* unit of measurement, initially ' ' (=M[0]) */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(scale > (unsigned long long)0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(scale <= (unsigned long long)1048576);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Get the number - if no number of empty number, just return
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_buf == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*a_buf == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strcpy(a_buf, "0");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* convert out the number from the input buffer */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland number = strtoull(a_buf, (char **)NULL, 10);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if conversion error, return "-1" */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((long long)number == (long long)-1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strcpy(a_buf, "-1");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Now have number as a count of scale units.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Stop scaling when we reached exa-bytes, then something is
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * probably wrong with our number (it is improbably large)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while ((number >= scale) && (*uom != 'E')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland uom++; /* next unit of measurement */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland save = number;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland number = (number + (scale / 2)) / scale;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* check if we should output a decimal place after the point */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (save && ((save / scale) < 10)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* sprintf() will round for us */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland float fnum = (float)save / scale;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sprintf(a_buf, "%4.1f%c", fnum, *uom);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sprintf(a_buf, "%4llu%c", number, *uom);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: pkgstrLocatePathBasename
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Synopsis: Locate position of base name in path string
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Locate the base name (last path item) in a path and
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * return a pointer to the first byte of the base name
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * within the given path
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_path - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - Pointer to string representing path to scan
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: char *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - Pointer into string of first byte of path base name
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - == (char *)NULL - input path is (char *)NULL
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandpkgstrLocatePathBasename(char *a_path)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if path is NULL, return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!a_path) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (a_path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* locate last occurance of '/' in path */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p = strrchr(a_path, '/');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (p != (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* base name located - return -> first byte */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (p+1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* no occurance of '/' - entry path must be basename */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (a_path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: pkgstrConvertPathToBasename
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Synopsis: Return copy of base name in path string
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Locate the base name (last path item) in a path and
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * return a copy of the base name in allocated storage
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_path - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - Pointer to string representing path to scan
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: char *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - String containing path base name
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - == (char *)NULL - input path is (char *)NULL
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 Waterlandchar *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandpkgstrConvertPathToBasename(char *a_path)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if path is NULL, return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_path == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return ((char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if path is empty (zero length), return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*a_path == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return ((char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* locate last occurance of '/' in path */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p = strrchr(a_path, '/');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (p == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* no occurance of '/' - entry path must be basename */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (strdup(a_path));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* base name located - return string from -> first byte */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (strdup(p+1));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: pkgstrConvertPathToDirname
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Synopsis: Return copy of directory in path string
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Locate the directory name (everything but last path item) in a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * path and return a copy of the dir name in allocated storage
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_path - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - Pointer to string representing path to scan
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: char *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - String containing path directory name
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - == (char *)NULL - input path is (char *)NULL,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * or a_path is empty (*a_path == '\0'), or the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_path has no directory name in it.
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 Waterlandchar *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandpkgstrConvertPathToDirname(char *a_path)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *retPath;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if path is NULL, return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_path == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return ((char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if path is empty (zero length), return NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*a_path == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return ((char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* locate last occurance of '/' in path */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p = strrchr(a_path, '/');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (p == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* no occurance of '/' - entire path must be basename */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return ((char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* duplicate original path */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland retPath = strdup(a_path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(retPath != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (retPath == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return ((char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* remove all trailing '/'s from copy of path */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (p = strrchr(retPath, '/'); (p > retPath) && (*p == '/'); p--) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *p = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if entire path was '/'s, return null string - no directory present */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*retPath == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(retPath);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return ((char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* path has at least one non-'/' in it - return -> directory portion */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (retPath);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: pkgstrConvertUllToTimeString_r
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Synopsis: Convert an unsigned long long into a "time string"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Given an unsigned long long, return a "time string" which is a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * conversion of the unsigned long long interpreted as a number of
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * nanoseconds into a "hour:minute:second.ns" ascii string
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_time - [RO, *RO] - (unsigned long long)n
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - value to convert
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_buf - [RO, *RW] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - Pointer to buffer used as storage space for the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * returned string
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'
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: char *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - String containing converted value
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 Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandpkgstrConvertUllToTimeString_r(unsigned long long a_time,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *a_buf, int a_bufLen)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland unsigned long long seconds;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland unsigned long long minutes;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland unsigned long long hours;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland unsigned long long ns;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_buf != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_bufLen > 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if time is 0, return immediate result */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_time == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgstrPrintf_r(a_buf, a_bufLen, "%s", "0:00:00.000000000");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* break out individual time components */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ns = a_time % 1000000000ll; /* nanoseconds left over from seconds */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland seconds = a_time / 1000000000ll; /* total seconds */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland minutes = seconds / 60ll; /* total minutes */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland seconds = seconds % 60ll; /* seconds left over from minutes */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland hours = minutes / 60ll; /* total hours */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland minutes = minutes % 60ll; /* minutes left over from hours */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return a converted string */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgstrPrintf_r(a_buf, a_bufLen, "%llu:%02llu:%02llu.%09llu",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland hours, minutes, seconds, ns);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}