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