string.c revision 1.1.1.2
1/*	$NetBSD: string.c,v 1.1.1.2 2010/03/08 02:14:20 lukem Exp $	*/
2
3/* OpenLDAP: pkg/ldap/libraries/libldap/string.c,v 1.23.2.4 2009/01/22 00:00:56 kurt Exp */
4/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
5 *
6 * Copyright 1998-2009 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 "portable.h"
24
25#include <ac/stdlib.h>
26#include <ac/string.h>
27#include <ac/time.h>
28#include <ac/ctype.h>
29
30#include "ldap-int.h"
31
32
33#if defined ( HAVE_STRSPN )
34#define int_strspn strspn
35#else
36static int int_strspn( const char *str, const char *delim )
37{
38	int pos;
39	const char *p=delim;
40
41	for( pos=0; (*str) ; pos++,str++) {
42		if (*str!=*p) {
43			for( p=delim; (*p) ; p++ ) {
44				if (*str==*p) {
45					break;
46				}
47		  	}
48		}
49
50		if (*p=='\0') {
51			return pos;
52		}
53	}
54	return pos;
55}
56#endif
57
58#if defined( HAVE_STRPBRK )
59#define int_strpbrk strpbrk
60#else
61static char *(int_strpbrk)( const char *str, const char *accept )
62{
63	const char *p;
64
65	for( ; (*str) ; str++ ) {
66		for( p=accept; (*p) ; p++) {
67			if (*str==*p) {
68				return str;
69			}
70		}
71	}
72
73	return NULL;
74}
75#endif
76
77char *(ldap_pvt_strtok)( char *str, const char *delim, char **pos )
78{
79	char *p;
80
81	if (pos==NULL) {
82		return NULL;
83	}
84
85	if (str==NULL) {
86		if (*pos==NULL) {
87			return NULL;
88		}
89
90		str=*pos;
91	}
92
93	/* skip any initial delimiters */
94	str += int_strspn( str, delim );
95	if (*str == '\0') {
96		return NULL;
97	}
98
99	p = int_strpbrk( str, delim );
100	if (p==NULL) {
101		*pos = NULL;
102
103	} else {
104		*p ='\0';
105		*pos = p+1;
106	}
107
108	return str;
109}
110
111char *
112ldap_pvt_str2upper( char *str )
113{
114	char    *s;
115
116	/* to upper */
117	if ( str ) {
118		for ( s = str; *s; s++ ) {
119			*s = TOUPPER( (unsigned char) *s );
120		}
121	}
122
123	return( str );
124}
125
126struct berval *
127ldap_pvt_str2upperbv( char *str, struct berval *bv )
128{
129	char    *s = NULL;
130
131	assert( bv != NULL );
132
133	/* to upper */
134	if ( str ) {
135		for ( s = str; *s; s++ ) {
136			*s = TOUPPER( (unsigned char) *s );
137		}
138	}
139
140	bv->bv_val = str;
141	bv->bv_len = (ber_len_t)(s - str);
142
143	return( bv );
144}
145
146char *
147ldap_pvt_str2lower( char *str )
148{
149	char    *s;
150
151	/* to lower */
152	if ( str ) {
153		for ( s = str; *s; s++ ) {
154			*s = TOLOWER( (unsigned char) *s );
155		}
156	}
157
158	return( str );
159}
160
161struct berval *
162ldap_pvt_str2lowerbv( char *str, struct berval *bv )
163{
164	char    *s = NULL;
165
166	assert( bv != NULL );
167
168	/* to lower */
169	if ( str ) {
170		for ( s = str; *s; s++ ) {
171			*s = TOLOWER( (unsigned char) *s );
172		}
173	}
174
175	bv->bv_val = str;
176	bv->bv_len = (ber_len_t)(s - str);
177
178	return( bv );
179}
180