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