xref: /netbsd-src/external/cddl/osnet/sys/kern/string.c (revision df0e13d590f4730f26a185d76e527c13de91d495)
1*df0e13d5Spgoyette /*	$NetBSD: string.c,v 1.3 2016/06/23 05:19:42 pgoyette Exp $	*/
2fc8ec0b8Shaad 
3fc8ec0b8Shaad /*
4fc8ec0b8Shaad  * CDDL HEADER START
5fc8ec0b8Shaad  *
6fc8ec0b8Shaad  * The contents of this file are subject to the terms of the
7fc8ec0b8Shaad  * Common Development and Distribution License (the "License").
8fc8ec0b8Shaad  * You may not use this file except in compliance with the License.
9fc8ec0b8Shaad  *
10fc8ec0b8Shaad  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
11fc8ec0b8Shaad  * or http://www.opensolaris.org/os/licensing.
12fc8ec0b8Shaad  * See the License for the specific language governing permissions
13fc8ec0b8Shaad  * and limitations under the License.
14fc8ec0b8Shaad  *
15fc8ec0b8Shaad  * When distributing Covered Code, include this CDDL HEADER in each
16fc8ec0b8Shaad  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
17fc8ec0b8Shaad  * If applicable, add the following below this CDDL HEADER, with the
18fc8ec0b8Shaad  * fields enclosed by brackets "[]" replaced with your own identifying
19fc8ec0b8Shaad  * information: Portions Copyright [yyyy] [name of copyright owner]
20fc8ec0b8Shaad  *
21fc8ec0b8Shaad  * CDDL HEADER END
22fc8ec0b8Shaad  */
23fc8ec0b8Shaad /*
24fc8ec0b8Shaad  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
25fc8ec0b8Shaad  * Use is subject to license terms.
26fc8ec0b8Shaad  */
27fc8ec0b8Shaad 
28fc8ec0b8Shaad #include <sys/param.h>
29fc8ec0b8Shaad #include <sys/string.h>
30fc8ec0b8Shaad 
31fc8ec0b8Shaad #define	IS_DIGIT(c)	((c) >= '0' && (c) <= '9')
32fc8ec0b8Shaad 
33fc8ec0b8Shaad #define	IS_ALPHA(c)	\
34fc8ec0b8Shaad 	(((c) >= 'a' && (c) <= 'z') || ((c) >= 'A' && (c) <= 'Z'))
35fc8ec0b8Shaad 
36*df0e13d5Spgoyette #ifndef __NetBSD__
37fc8ec0b8Shaad char *
strpbrk(const char * s,const char * b)38fc8ec0b8Shaad strpbrk(const char *s, const char *b)
39fc8ec0b8Shaad {
40fc8ec0b8Shaad 	const char *p;
41fc8ec0b8Shaad 
42fc8ec0b8Shaad 	do {
43fc8ec0b8Shaad 		for (p = b; *p != '\0' && *p != *s; ++p)
44fc8ec0b8Shaad 			;
45fc8ec0b8Shaad 		if (*p != '\0')
46fc8ec0b8Shaad 			return ((char *)s);
47fc8ec0b8Shaad 	} while (*s++);
48fc8ec0b8Shaad 
49fc8ec0b8Shaad 	return (NULL);
50fc8ec0b8Shaad }
51*df0e13d5Spgoyette #endif
52fc8ec0b8Shaad 
53fc8ec0b8Shaad /*
54fc8ec0b8Shaad  * Convert a string into a valid C identifier by replacing invalid
55fc8ec0b8Shaad  * characters with '_'.  Also makes sure the string is nul-terminated
56fc8ec0b8Shaad  * and takes up at most n bytes.
57fc8ec0b8Shaad  */
58fc8ec0b8Shaad void
strident_canon(char * s,size_t n)59fc8ec0b8Shaad strident_canon(char *s, size_t n)
60fc8ec0b8Shaad {
61fc8ec0b8Shaad 	char c;
62fc8ec0b8Shaad 	char *end = s + n - 1;
63fc8ec0b8Shaad 
64fc8ec0b8Shaad 	if ((c = *s) == 0)
65fc8ec0b8Shaad 		return;
66fc8ec0b8Shaad 
67fc8ec0b8Shaad 	if (!IS_ALPHA(c) && c != '_')
68fc8ec0b8Shaad 		*s = '_';
69fc8ec0b8Shaad 
70fc8ec0b8Shaad 	while (s < end && ((c = *(++s)) != 0)) {
71fc8ec0b8Shaad 		if (!IS_ALPHA(c) && !IS_DIGIT(c) && c != '_')
72fc8ec0b8Shaad 			*s = '_';
73fc8ec0b8Shaad 	}
74fc8ec0b8Shaad 	*s = 0;
75fc8ec0b8Shaad }
7601d7ba74Shaad 
7701d7ba74Shaad /*
7801d7ba74Shaad  * Simple-minded conversion of a long into a null-terminated character
7901d7ba74Shaad  * string.  Caller must ensure there's enough space to hold the result.
8001d7ba74Shaad  */
8101d7ba74Shaad void
numtos(unsigned long num,char * s)8201d7ba74Shaad numtos(unsigned long num, char *s)
8301d7ba74Shaad {
8401d7ba74Shaad 	char prbuf[40];
8501d7ba74Shaad 
8601d7ba74Shaad 	char *cp = prbuf;
8701d7ba74Shaad 
8801d7ba74Shaad 	do {
8901d7ba74Shaad 		*cp++ = "0123456789"[num % 10];
9001d7ba74Shaad 		num /= 10;
9101d7ba74Shaad 	} while (num);
9201d7ba74Shaad 
9301d7ba74Shaad 	do {
9401d7ba74Shaad 		*s++ = *--cp;
9501d7ba74Shaad 	} while (cp > prbuf);
9601d7ba74Shaad 	*s = '\0';
9701d7ba74Shaad }
98