xref: /netbsd-src/external/bsd/openldap/dist/libraries/libldap/string.c (revision 549b59ed3ccf0d36d3097190a0db27b770f3a839)
1 /*	$NetBSD: string.c,v 1.3 2021/08/14 16:14:56 christos Exp $	*/
2 
3 /* $OpenLDAP$ */
4 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
5  *
6  * Copyright 1998-2021 The OpenLDAP Foundation.
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted only as authorized by the OpenLDAP
11  * Public License.
12  *
13  * A copy of this license is available in the file LICENSE in the
14  * top-level directory of the distribution or, alternatively, at
15  * <http://www.OpenLDAP.org/license.html>.
16  */
17 
18 /*
19  * Locale-specific 1-byte character versions
20  * See utf-8.c for UTF-8 versions
21  */
22 
23 #include <sys/cdefs.h>
24 __RCSID("$NetBSD: string.c,v 1.3 2021/08/14 16:14:56 christos Exp $");
25 
26 #include "portable.h"
27 
28 #include <ac/stdlib.h>
29 #include <ac/string.h>
30 #include <ac/time.h>
31 #include <ac/ctype.h>
32 
33 #include "ldap-int.h"
34 
35 
36 #if defined ( HAVE_STRSPN )
37 #define int_strspn strspn
38 #else
int_strspn(const char * str,const char * delim)39 static int int_strspn( const char *str, const char *delim )
40 {
41 	int pos;
42 	const char *p=delim;
43 
44 	for( pos=0; (*str) ; pos++,str++) {
45 		if (*str!=*p) {
46 			for( p=delim; (*p) ; p++ ) {
47 				if (*str==*p) {
48 					break;
49 				}
50 		  	}
51 		}
52 
53 		if (*p=='\0') {
54 			return pos;
55 		}
56 	}
57 	return pos;
58 }
59 #endif
60 
61 #if defined( HAVE_STRPBRK )
62 #define int_strpbrk strpbrk
63 #else
64 static char *(int_strpbrk)( const char *str, const char *accept )
65 {
66 	const char *p;
67 
68 	for( ; (*str) ; str++ ) {
69 		for( p=accept; (*p) ; p++) {
70 			if (*str==*p) {
71 				return str;
72 			}
73 		}
74 	}
75 
76 	return NULL;
77 }
78 #endif
79 
80 char *(ldap_pvt_strtok)( char *str, const char *delim, char **pos )
81 {
82 	char *p;
83 
84 	if (pos==NULL) {
85 		return NULL;
86 	}
87 
88 	if (str==NULL) {
89 		if (*pos==NULL) {
90 			return NULL;
91 		}
92 
93 		str=*pos;
94 	}
95 
96 	/* skip any initial delimiters */
97 	str += int_strspn( str, delim );
98 	if (*str == '\0') {
99 		return NULL;
100 	}
101 
102 	p = int_strpbrk( str, delim );
103 	if (p==NULL) {
104 		*pos = NULL;
105 
106 	} else {
107 		*p ='\0';
108 		*pos = p+1;
109 	}
110 
111 	return str;
112 }
113 
114 char *
ldap_pvt_str2upper(char * str)115 ldap_pvt_str2upper( char *str )
116 {
117 	char    *s;
118 
119 	/* to upper */
120 	if ( str ) {
121 		for ( s = str; *s; s++ ) {
122 			*s = TOUPPER( (unsigned char) *s );
123 		}
124 	}
125 
126 	return( str );
127 }
128 
129 struct berval *
ldap_pvt_str2upperbv(char * str,struct berval * bv)130 ldap_pvt_str2upperbv( char *str, struct berval *bv )
131 {
132 	char    *s = NULL;
133 
134 	assert( bv != NULL );
135 
136 	/* to upper */
137 	if ( str ) {
138 		for ( s = str; *s; s++ ) {
139 			*s = TOUPPER( (unsigned char) *s );
140 		}
141 	}
142 
143 	bv->bv_val = str;
144 	bv->bv_len = (ber_len_t)(s - str);
145 
146 	return( bv );
147 }
148 
149 char *
ldap_pvt_str2lower(char * str)150 ldap_pvt_str2lower( char *str )
151 {
152 	char    *s;
153 
154 	/* to lower */
155 	if ( str ) {
156 		for ( s = str; *s; s++ ) {
157 			*s = TOLOWER( (unsigned char) *s );
158 		}
159 	}
160 
161 	return( str );
162 }
163 
164 struct berval *
ldap_pvt_str2lowerbv(char * str,struct berval * bv)165 ldap_pvt_str2lowerbv( char *str, struct berval *bv )
166 {
167 	char    *s = NULL;
168 
169 	assert( bv != NULL );
170 
171 	/* to lower */
172 	if ( str ) {
173 		for ( s = str; *s; s++ ) {
174 			*s = TOLOWER( (unsigned char) *s );
175 		}
176 	}
177 
178 	bv->bv_val = str;
179 	bv->bv_len = (ber_len_t)(s - str);
180 
181 	return( bv );
182 }
183