usr/src/uts/common/os/strext.c
author stevel@tonic-gate
Tue, 14 Jun 2005 00:00:00 -0700
changeset 0 68f95e015346
child 10272 a0669934e974
permissions -rw-r--r--
OpenSolaris Launch
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     5
 * Common Development and Distribution License, Version 1.0 only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     6
 * (the "License").  You may not use this file except in compliance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 * with the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
 * Copyright 1998-2003 Sun Microsystems, Inc.  All rights reserved.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
#include <sys/cmn_err.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
#include <sys/systm.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
#include <sys/varargs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
 * SunOS-specific extensions to libc's standard set of string routines.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
 * NOTE: The standard libc string routines are in $SRC/common/util/string.c,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
 * to facilitate sharing with standalone.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
 * Historical entry point: remove in Solaris 2.8.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
vsprintf_len(size_t buflen, char *buf, const char *fmt, va_list args)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
	(void) vsnprintf(buf, buflen, fmt, args);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
	return (buf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
 * Historical entry point: remove in Solaris 2.8.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
/*PRINTFLIKE3*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
sprintf_len(size_t buflen, char *buf, const char *fmt, ...)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
	va_list args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
	va_start(args, fmt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
	(void) vsnprintf(buf, buflen, fmt, args);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
	va_end(args);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
	return (buf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
 * Simple-minded conversion of a long into a null-terminated character
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
 * string.  Caller must ensure there's enough space to hold the result.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
numtos(unsigned long num, char *s)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
	char prbuf[40];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
	char *cp = prbuf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
	do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
		*cp++ = "0123456789"[num % 10];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
		num /= 10;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
	} while (num);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
	do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
		*s++ = *--cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
	} while (cp > prbuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
	*s = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
 * Returns the integer value of the string of decimal numeric
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
 * chars beginning at **str.  Does no overflow checking.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
 * Note: updates *str to point at the last character examined.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
stoi(char **str)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
	char	*p = *str;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
	int	n;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
	int	c;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
	for (n = 0; (c = *p) >= '0' && c <= '9'; p++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
		n = n * 10 + c - '0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
	*str = p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
	return (n);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
 * Like strrchr(), except
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
 * (a) it takes a maximum length for the string to be searched, and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
 * (b) if the string ends with a null, it is not considered part of the string.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
strnrchr(const char *sp, int c, size_t n)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
	const char *r = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
	while (n-- > 0 && *sp) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
		if (*sp == c)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
			r = sp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
		sp++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
	return ((char *)r);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
 * NOTE: These routines aren't shared with standalone because the DDI mandates
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
 *	 that they return the buffer rather than its length.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
/*PRINTFLIKE2*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
sprintf(char *buf, const char *fmt, ...)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
	va_list args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
	va_start(args, fmt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
	(void) vsnprintf(buf, INT_MAX, fmt, args);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
	va_end(args);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
	return (buf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
vsprintf(char *buf, const char *fmt, va_list args)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
	(void) vsnprintf(buf, INT_MAX, fmt, args);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
	return (buf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
}