| /* |
| * CDDL HEADER START |
| * |
| * The contents of this file are subject to the terms of the |
| * Common Development and Distribution License (the "License"). |
| * You may not use this file except in compliance with the License. |
| * |
| * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE |
| * or http://www.opensolaris.org/os/licensing. |
| * See the License for the specific language governing permissions |
| * and limitations under the License. |
| * |
| * When distributing Covered Code, include this CDDL HEADER in each |
| * file and include the License file at usr/src/OPENSOLARIS.LICENSE. |
| * If applicable, add the following below this CDDL HEADER, with the |
| * fields enclosed by brackets "[]" replaced with your own identifying |
| * information: Portions Copyright [yyyy] [name of copyright owner] |
| * |
| * CDDL HEADER END |
| * |
| * $FreeBSD$ |
| */ |
| /* |
| * Copyright 2007 Sun Microsystems, Inc. All rights reserved. |
| * Use is subject to license terms. |
| */ |
| |
| #include <sys/types.h> |
| #include <sys/param.h> |
| #include <sys/string.h> |
| #include <sys/kmem.h> |
| #include <machine/stdarg.h> |
| |
| #define IS_DIGIT(c) ((c) >= '0' && (c) <= '9') |
| |
| #define IS_ALPHA(c) \ |
| (((c) >= 'a' && (c) <= 'z') || ((c) >= 'A' && (c) <= 'Z')) |
| |
| char * |
| strpbrk(const char *s, const char *b) |
| { |
| const char *p; |
| |
| do { |
| for (p = b; *p != '\0' && *p != *s; ++p) |
| ; |
| if (*p != '\0') |
| return ((char *)s); |
| } while (*s++); |
| |
| return (NULL); |
| } |
| |
| /* |
| * Convert a string into a valid C identifier by replacing invalid |
| * characters with '_'. Also makes sure the string is nul-terminated |
| * and takes up at most n bytes. |
| */ |
| void |
| strident_canon(char *s, size_t n) |
| { |
| char c; |
| char *end = s + n - 1; |
| |
| if ((c = *s) == 0) |
| return; |
| |
| if (!IS_ALPHA(c) && c != '_') |
| *s = '_'; |
| |
| while (s < end && ((c = *(++s)) != 0)) { |
| if (!IS_ALPHA(c) && !IS_DIGIT(c) && c != '_') |
| *s = '_'; |
| } |
| *s = 0; |
| } |
| |
| /* |
| * Do not change the length of the returned string; it must be freed |
| * with strfree(). |
| */ |
| char * |
| kmem_asprintf(const char *fmt, ...) |
| { |
| int size; |
| va_list adx; |
| char *buf; |
| |
| va_start(adx, fmt); |
| size = vsnprintf(NULL, 0, fmt, adx) + 1; |
| va_end(adx); |
| |
| buf = kmem_alloc(size, KM_SLEEP); |
| |
| va_start(adx, fmt); |
| (void) vsnprintf(buf, size, fmt, adx); |
| va_end(adx); |
| |
| return (buf); |
| } |
| |
| void |
| kmem_strfree(char *str) |
| { |
| ASSERT3P(str, !=, NULL); |
| kmem_free(str, strlen(str) + 1); |
| } |