a93a1f58a8763fa69172980b98e3d24720c1136egm/*
a93a1f58a8763fa69172980b98e3d24720c1136egm * CDDL HEADER START
a93a1f58a8763fa69172980b98e3d24720c1136egm *
a93a1f58a8763fa69172980b98e3d24720c1136egm * The contents of this file are subject to the terms of the
a93a1f58a8763fa69172980b98e3d24720c1136egm * Common Development and Distribution License (the "License").
a93a1f58a8763fa69172980b98e3d24720c1136egm * You may not use this file except in compliance with the License.
a93a1f58a8763fa69172980b98e3d24720c1136egm *
a93a1f58a8763fa69172980b98e3d24720c1136egm * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
a93a1f58a8763fa69172980b98e3d24720c1136egm * or http://www.opensolaris.org/os/licensing.
a93a1f58a8763fa69172980b98e3d24720c1136egm * See the License for the specific language governing permissions
a93a1f58a8763fa69172980b98e3d24720c1136egm * and limitations under the License.
a93a1f58a8763fa69172980b98e3d24720c1136egm *
a93a1f58a8763fa69172980b98e3d24720c1136egm * When distributing Covered Code, include this CDDL HEADER in each
a93a1f58a8763fa69172980b98e3d24720c1136egm * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
a93a1f58a8763fa69172980b98e3d24720c1136egm * If applicable, add the following below this CDDL HEADER, with the
a93a1f58a8763fa69172980b98e3d24720c1136egm * fields enclosed by brackets "[]" replaced with your own identifying
a93a1f58a8763fa69172980b98e3d24720c1136egm * information: Portions Copyright [yyyy] [name of copyright owner]
a93a1f58a8763fa69172980b98e3d24720c1136egm *
a93a1f58a8763fa69172980b98e3d24720c1136egm * CDDL HEADER END
a93a1f58a8763fa69172980b98e3d24720c1136egm */
a93a1f58a8763fa69172980b98e3d24720c1136egm
a93a1f58a8763fa69172980b98e3d24720c1136egm/*
a93a1f58a8763fa69172980b98e3d24720c1136egm * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
a93a1f58a8763fa69172980b98e3d24720c1136egm * Use is subject to license terms.
a93a1f58a8763fa69172980b98e3d24720c1136egm */
a93a1f58a8763fa69172980b98e3d24720c1136egm
a93a1f58a8763fa69172980b98e3d24720c1136egm#pragma ident "%Z%%M% %I% %E% SMI"
a93a1f58a8763fa69172980b98e3d24720c1136egm
a93a1f58a8763fa69172980b98e3d24720c1136egm/*
a93a1f58a8763fa69172980b98e3d24720c1136egm * Helper functions to skip white spaces, find tokens, find separators and free
a93a1f58a8763fa69172980b98e3d24720c1136egm * memory.
a93a1f58a8763fa69172980b98e3d24720c1136egm */
a93a1f58a8763fa69172980b98e3d24720c1136egm
a93a1f58a8763fa69172980b98e3d24720c1136egm#include <errno.h>
a93a1f58a8763fa69172980b98e3d24720c1136egm#include <stdlib.h>
a93a1f58a8763fa69172980b98e3d24720c1136egm#include <string.h>
a93a1f58a8763fa69172980b98e3d24720c1136egm#include <ctype.h>
a93a1f58a8763fa69172980b98e3d24720c1136egm
a93a1f58a8763fa69172980b98e3d24720c1136egm#include "commp_util.h"
a93a1f58a8763fa69172980b98e3d24720c1136egm
a93a1f58a8763fa69172980b98e3d24720c1136egm
a93a1f58a8763fa69172980b98e3d24720c1136egm/*
a93a1f58a8763fa69172980b98e3d24720c1136egm * Skip to the next non-whitespace
a93a1f58a8763fa69172980b98e3d24720c1136egm */
a93a1f58a8763fa69172980b98e3d24720c1136egmint
a93a1f58a8763fa69172980b98e3d24720c1136egmcommp_skip_white_space(const char **begin, const char *end)
a93a1f58a8763fa69172980b98e3d24720c1136egm{
a93a1f58a8763fa69172980b98e3d24720c1136egm while (*begin < end) {
a93a1f58a8763fa69172980b98e3d24720c1136egm if (!isspace(**begin))
a93a1f58a8763fa69172980b98e3d24720c1136egm return (0);
a93a1f58a8763fa69172980b98e3d24720c1136egm (*begin)++;
a93a1f58a8763fa69172980b98e3d24720c1136egm }
a93a1f58a8763fa69172980b98e3d24720c1136egm return (1);
a93a1f58a8763fa69172980b98e3d24720c1136egm}
a93a1f58a8763fa69172980b98e3d24720c1136egm
a93a1f58a8763fa69172980b98e3d24720c1136egm/*
a93a1f58a8763fa69172980b98e3d24720c1136egm * Finds the token in the char buffer. *current will be pointing to the
a93a1f58a8763fa69172980b98e3d24720c1136egm * token when function returns. If the char buffer has leading token,
a93a1f58a8763fa69172980b98e3d24720c1136egm * it returns 1.
a93a1f58a8763fa69172980b98e3d24720c1136egm */
a93a1f58a8763fa69172980b98e3d24720c1136egmint
a93a1f58a8763fa69172980b98e3d24720c1136egmcommp_find_token(const char **begin, const char **current, const char *end,
a93a1f58a8763fa69172980b98e3d24720c1136egm char token, boolean_t last)
a93a1f58a8763fa69172980b98e3d24720c1136egm{
a93a1f58a8763fa69172980b98e3d24720c1136egm *current = *begin;
a93a1f58a8763fa69172980b98e3d24720c1136egm while (*current < end) {
a93a1f58a8763fa69172980b98e3d24720c1136egm if (!last && (**current == token))
a93a1f58a8763fa69172980b98e3d24720c1136egm break;
a93a1f58a8763fa69172980b98e3d24720c1136egm else if (isspace(**current))
a93a1f58a8763fa69172980b98e3d24720c1136egm return (1);
a93a1f58a8763fa69172980b98e3d24720c1136egm (*current)++;
a93a1f58a8763fa69172980b98e3d24720c1136egm }
a93a1f58a8763fa69172980b98e3d24720c1136egm /* Checks for leading white space */
a93a1f58a8763fa69172980b98e3d24720c1136egm if (*current == *begin)
a93a1f58a8763fa69172980b98e3d24720c1136egm return (1);
a93a1f58a8763fa69172980b98e3d24720c1136egm else
a93a1f58a8763fa69172980b98e3d24720c1136egm return (0);
a93a1f58a8763fa69172980b98e3d24720c1136egm}
a93a1f58a8763fa69172980b98e3d24720c1136egm
a93a1f58a8763fa69172980b98e3d24720c1136egm/*
a93a1f58a8763fa69172980b98e3d24720c1136egm * atoi function
a93a1f58a8763fa69172980b98e3d24720c1136egm */
a93a1f58a8763fa69172980b98e3d24720c1136egmint
a93a1f58a8763fa69172980b98e3d24720c1136egmcommp_atoi(const char *begin, const char *end, int *num)
a93a1f58a8763fa69172980b98e3d24720c1136egm{
a93a1f58a8763fa69172980b98e3d24720c1136egm boolean_t num_found = B_FALSE;
a93a1f58a8763fa69172980b98e3d24720c1136egm
a93a1f58a8763fa69172980b98e3d24720c1136egm *num = 0;
a93a1f58a8763fa69172980b98e3d24720c1136egm while (begin < end) {
a93a1f58a8763fa69172980b98e3d24720c1136egm if (isdigit(*begin)) {
a93a1f58a8763fa69172980b98e3d24720c1136egm *num = (*num * 10) + (*begin - '0');
a93a1f58a8763fa69172980b98e3d24720c1136egm num_found = B_TRUE;
a93a1f58a8763fa69172980b98e3d24720c1136egm begin++;
a93a1f58a8763fa69172980b98e3d24720c1136egm } else {
a93a1f58a8763fa69172980b98e3d24720c1136egm break;
a93a1f58a8763fa69172980b98e3d24720c1136egm }
a93a1f58a8763fa69172980b98e3d24720c1136egm }
a93a1f58a8763fa69172980b98e3d24720c1136egm if (!num_found || (begin != end))
a93a1f58a8763fa69172980b98e3d24720c1136egm return (EINVAL);
a93a1f58a8763fa69172980b98e3d24720c1136egm return (0);
a93a1f58a8763fa69172980b98e3d24720c1136egm}
a93a1f58a8763fa69172980b98e3d24720c1136egm
a93a1f58a8763fa69172980b98e3d24720c1136egm/*
a93a1f58a8763fa69172980b98e3d24720c1136egm * Given a string converts it to unsigned long long int.
a93a1f58a8763fa69172980b98e3d24720c1136egm */
a93a1f58a8763fa69172980b98e3d24720c1136egmint
a93a1f58a8763fa69172980b98e3d24720c1136egmcommp_strtoull(const char *begin, const char *end, uint64_t *num)
a93a1f58a8763fa69172980b98e3d24720c1136egm{
a93a1f58a8763fa69172980b98e3d24720c1136egm boolean_t num_found = B_FALSE;
a93a1f58a8763fa69172980b98e3d24720c1136egm
a93a1f58a8763fa69172980b98e3d24720c1136egm *num = 0;
a93a1f58a8763fa69172980b98e3d24720c1136egm while (begin < end) {
a93a1f58a8763fa69172980b98e3d24720c1136egm if (isdigit(*begin)) {
a93a1f58a8763fa69172980b98e3d24720c1136egm *num = (*num * 10) + (*begin - '0');
a93a1f58a8763fa69172980b98e3d24720c1136egm num_found = B_TRUE;
a93a1f58a8763fa69172980b98e3d24720c1136egm begin++;
a93a1f58a8763fa69172980b98e3d24720c1136egm } else {
a93a1f58a8763fa69172980b98e3d24720c1136egm break;
a93a1f58a8763fa69172980b98e3d24720c1136egm }
a93a1f58a8763fa69172980b98e3d24720c1136egm }
a93a1f58a8763fa69172980b98e3d24720c1136egm if (!num_found || (begin != end))
a93a1f58a8763fa69172980b98e3d24720c1136egm return (EINVAL);
a93a1f58a8763fa69172980b98e3d24720c1136egm return (0);
a93a1f58a8763fa69172980b98e3d24720c1136egm}
a93a1f58a8763fa69172980b98e3d24720c1136egm
a93a1f58a8763fa69172980b98e3d24720c1136egm/*
a93a1f58a8763fa69172980b98e3d24720c1136egm * Given a string converts it to unsigned byte
a93a1f58a8763fa69172980b98e3d24720c1136egm */
a93a1f58a8763fa69172980b98e3d24720c1136egmint
a93a1f58a8763fa69172980b98e3d24720c1136egmcommp_strtoub(const char *begin, const char *end, uint8_t *num)
a93a1f58a8763fa69172980b98e3d24720c1136egm{
a93a1f58a8763fa69172980b98e3d24720c1136egm boolean_t num_found = B_FALSE;
a93a1f58a8763fa69172980b98e3d24720c1136egm
a93a1f58a8763fa69172980b98e3d24720c1136egm *num = 0;
a93a1f58a8763fa69172980b98e3d24720c1136egm while (begin < end) {
a93a1f58a8763fa69172980b98e3d24720c1136egm if (isdigit(*begin)) {
a93a1f58a8763fa69172980b98e3d24720c1136egm *num = (*num * 10) + (*begin - '0');
a93a1f58a8763fa69172980b98e3d24720c1136egm num_found = B_TRUE;
a93a1f58a8763fa69172980b98e3d24720c1136egm begin++;
a93a1f58a8763fa69172980b98e3d24720c1136egm } else {
a93a1f58a8763fa69172980b98e3d24720c1136egm break;
a93a1f58a8763fa69172980b98e3d24720c1136egm }
a93a1f58a8763fa69172980b98e3d24720c1136egm }
a93a1f58a8763fa69172980b98e3d24720c1136egm if (!num_found || (begin != end))
a93a1f58a8763fa69172980b98e3d24720c1136egm return (EINVAL);
a93a1f58a8763fa69172980b98e3d24720c1136egm return (0);
a93a1f58a8763fa69172980b98e3d24720c1136egm}
a93a1f58a8763fa69172980b98e3d24720c1136egm
a93a1f58a8763fa69172980b98e3d24720c1136egm/*
a93a1f58a8763fa69172980b98e3d24720c1136egm * Given a string converts it to unsigned int
a93a1f58a8763fa69172980b98e3d24720c1136egm */
a93a1f58a8763fa69172980b98e3d24720c1136egmint
a93a1f58a8763fa69172980b98e3d24720c1136egmcommp_atoui(const char *begin, const char *end, uint_t *num)
a93a1f58a8763fa69172980b98e3d24720c1136egm{
a93a1f58a8763fa69172980b98e3d24720c1136egm boolean_t num_found = B_FALSE;
a93a1f58a8763fa69172980b98e3d24720c1136egm
a93a1f58a8763fa69172980b98e3d24720c1136egm *num = 0;
a93a1f58a8763fa69172980b98e3d24720c1136egm while (begin < end) {
a93a1f58a8763fa69172980b98e3d24720c1136egm if (isdigit(*begin)) {
a93a1f58a8763fa69172980b98e3d24720c1136egm *num = (*num * 10) + (*begin - '0');
a93a1f58a8763fa69172980b98e3d24720c1136egm num_found = B_TRUE;
a93a1f58a8763fa69172980b98e3d24720c1136egm begin++;
a93a1f58a8763fa69172980b98e3d24720c1136egm } else {
a93a1f58a8763fa69172980b98e3d24720c1136egm break;
a93a1f58a8763fa69172980b98e3d24720c1136egm }
a93a1f58a8763fa69172980b98e3d24720c1136egm }
a93a1f58a8763fa69172980b98e3d24720c1136egm if (!num_found || (begin != end))
a93a1f58a8763fa69172980b98e3d24720c1136egm return (EINVAL);
a93a1f58a8763fa69172980b98e3d24720c1136egm return (0);
a93a1f58a8763fa69172980b98e3d24720c1136egm}
a93a1f58a8763fa69172980b98e3d24720c1136egm
a93a1f58a8763fa69172980b98e3d24720c1136egm/*
a93a1f58a8763fa69172980b98e3d24720c1136egm * allocates memory and copies string to new memory
a93a1f58a8763fa69172980b98e3d24720c1136egm */
a93a1f58a8763fa69172980b98e3d24720c1136egmint
a93a1f58a8763fa69172980b98e3d24720c1136egmcommp_add_str(char **dest, const char *src, int len)
a93a1f58a8763fa69172980b98e3d24720c1136egm{
a93a1f58a8763fa69172980b98e3d24720c1136egm if (len == 0)
a93a1f58a8763fa69172980b98e3d24720c1136egm return (EINVAL);
a93a1f58a8763fa69172980b98e3d24720c1136egm (*dest) = calloc(1, len + 1);
a93a1f58a8763fa69172980b98e3d24720c1136egm if (*dest == NULL)
a93a1f58a8763fa69172980b98e3d24720c1136egm return (ENOMEM);
a93a1f58a8763fa69172980b98e3d24720c1136egm (void) strncpy(*dest, src, len);
a93a1f58a8763fa69172980b98e3d24720c1136egm return (0);
a93a1f58a8763fa69172980b98e3d24720c1136egm}
a93a1f58a8763fa69172980b98e3d24720c1136egm
a93a1f58a8763fa69172980b98e3d24720c1136egm/*
a93a1f58a8763fa69172980b98e3d24720c1136egm * This function converts strings like "5d" to equivalent time in secs.
a93a1f58a8763fa69172980b98e3d24720c1136egm * For eg. 1h = 3600, 10d = 86400
a93a1f58a8763fa69172980b98e3d24720c1136egm */
a93a1f58a8763fa69172980b98e3d24720c1136egmint
a93a1f58a8763fa69172980b98e3d24720c1136egmcommp_time_to_secs(const char *begin, const char *end, uint64_t *num)
a93a1f58a8763fa69172980b98e3d24720c1136egm{
a93a1f58a8763fa69172980b98e3d24720c1136egm uint_t factor = 0;
a93a1f58a8763fa69172980b98e3d24720c1136egm
a93a1f58a8763fa69172980b98e3d24720c1136egm if (!isdigit(*(end - 1))) {
a93a1f58a8763fa69172980b98e3d24720c1136egm switch (*(end - 1)) {
a93a1f58a8763fa69172980b98e3d24720c1136egm case 'd':
a93a1f58a8763fa69172980b98e3d24720c1136egm factor = COMMP_SECS_IN_DAY;
a93a1f58a8763fa69172980b98e3d24720c1136egm break;
a93a1f58a8763fa69172980b98e3d24720c1136egm case 'h':
a93a1f58a8763fa69172980b98e3d24720c1136egm factor = COMMP_SECS_IN_HOUR;
a93a1f58a8763fa69172980b98e3d24720c1136egm break;
a93a1f58a8763fa69172980b98e3d24720c1136egm case 'm':
a93a1f58a8763fa69172980b98e3d24720c1136egm factor = COMMP_SECS_IN_MIN;
a93a1f58a8763fa69172980b98e3d24720c1136egm break;
a93a1f58a8763fa69172980b98e3d24720c1136egm case 's':
a93a1f58a8763fa69172980b98e3d24720c1136egm factor = 1;
a93a1f58a8763fa69172980b98e3d24720c1136egm break;
a93a1f58a8763fa69172980b98e3d24720c1136egm default:
a93a1f58a8763fa69172980b98e3d24720c1136egm return (EINVAL);
a93a1f58a8763fa69172980b98e3d24720c1136egm }
a93a1f58a8763fa69172980b98e3d24720c1136egm --end;
a93a1f58a8763fa69172980b98e3d24720c1136egm }
a93a1f58a8763fa69172980b98e3d24720c1136egm if (commp_strtoull(begin, end, num) != 0)
a93a1f58a8763fa69172980b98e3d24720c1136egm return (EINVAL);
a93a1f58a8763fa69172980b98e3d24720c1136egm if (factor != 0)
a93a1f58a8763fa69172980b98e3d24720c1136egm (*num) = (*num) * factor;
a93a1f58a8763fa69172980b98e3d24720c1136egm return (0);
a93a1f58a8763fa69172980b98e3d24720c1136egm}