Home | History | Annotate | Line # | Download | only in libldap
charray.c revision 1.1.1.2
      1  1.1.1.2  lukem /*	$NetBSD: charray.c,v 1.1.1.2 2010/03/08 02:14:20 lukem Exp $	*/
      2  1.1.1.2  lukem 
      3      1.1  lukem /* charray.c - routines for dealing with char * arrays */
      4  1.1.1.2  lukem /* OpenLDAP: pkg/ldap/libraries/libldap/charray.c,v 1.16.2.6 2009/01/22 00:00:54 kurt Exp */
      5      1.1  lukem /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
      6      1.1  lukem  *
      7  1.1.1.2  lukem  * Copyright 1998-2009 The OpenLDAP Foundation.
      8      1.1  lukem  * All rights reserved.
      9      1.1  lukem  *
     10      1.1  lukem  * Redistribution and use in source and binary forms, with or without
     11      1.1  lukem  * modification, are permitted only as authorized by the OpenLDAP
     12      1.1  lukem  * Public License.
     13      1.1  lukem  *
     14      1.1  lukem  * A copy of this license is available in the file LICENSE in the
     15      1.1  lukem  * top-level directory of the distribution or, alternatively, at
     16      1.1  lukem  * <http://www.OpenLDAP.org/license.html>.
     17      1.1  lukem  */
     18      1.1  lukem 
     19      1.1  lukem #include "portable.h"
     20      1.1  lukem 
     21      1.1  lukem #include <stdio.h>
     22      1.1  lukem 
     23      1.1  lukem #include <ac/string.h>
     24      1.1  lukem #include <ac/socket.h>
     25      1.1  lukem 
     26      1.1  lukem #include "ldap-int.h"
     27      1.1  lukem 
     28      1.1  lukem int
     29      1.1  lukem ldap_charray_add(
     30      1.1  lukem     char	***a,
     31      1.1  lukem     const char *s
     32      1.1  lukem )
     33      1.1  lukem {
     34      1.1  lukem 	int	n;
     35      1.1  lukem 
     36      1.1  lukem 	if ( *a == NULL ) {
     37      1.1  lukem 		*a = (char **) LDAP_MALLOC( 2 * sizeof(char *) );
     38      1.1  lukem 		n = 0;
     39      1.1  lukem 
     40      1.1  lukem 		if( *a == NULL ) {
     41      1.1  lukem 			return -1;
     42      1.1  lukem 		}
     43      1.1  lukem 
     44      1.1  lukem 	} else {
     45      1.1  lukem 		char **new;
     46      1.1  lukem 
     47      1.1  lukem 		for ( n = 0; *a != NULL && (*a)[n] != NULL; n++ ) {
     48      1.1  lukem 			;	/* NULL */
     49      1.1  lukem 		}
     50      1.1  lukem 
     51      1.1  lukem 		new = (char **) LDAP_REALLOC( (char *) *a,
     52      1.1  lukem 		    (n + 2) * sizeof(char *) );
     53      1.1  lukem 
     54      1.1  lukem 		if( new == NULL ) {
     55      1.1  lukem 			/* caller is required to call ldap_charray_free(*a) */
     56      1.1  lukem 			return -1;
     57      1.1  lukem 		}
     58      1.1  lukem 
     59      1.1  lukem 		*a = new;
     60      1.1  lukem 	}
     61      1.1  lukem 
     62      1.1  lukem 	(*a)[n] = LDAP_STRDUP(s);
     63      1.1  lukem 
     64      1.1  lukem 	if( (*a)[n] == NULL ) {
     65      1.1  lukem 		return 1;
     66      1.1  lukem 	}
     67      1.1  lukem 
     68      1.1  lukem 	(*a)[++n] = NULL;
     69      1.1  lukem 
     70      1.1  lukem 	return 0;
     71      1.1  lukem }
     72      1.1  lukem 
     73      1.1  lukem int
     74      1.1  lukem ldap_charray_merge(
     75      1.1  lukem     char	***a,
     76      1.1  lukem     char	**s
     77      1.1  lukem )
     78      1.1  lukem {
     79      1.1  lukem 	int	i, n, nn;
     80      1.1  lukem 	char **aa;
     81      1.1  lukem 
     82      1.1  lukem 	for ( n = 0; *a != NULL && (*a)[n] != NULL; n++ ) {
     83      1.1  lukem 		;	/* NULL */
     84      1.1  lukem 	}
     85      1.1  lukem 	for ( nn = 0; s[nn] != NULL; nn++ ) {
     86      1.1  lukem 		;	/* NULL */
     87      1.1  lukem 	}
     88      1.1  lukem 
     89      1.1  lukem 	aa = (char **) LDAP_REALLOC( (char *) *a, (n + nn + 1) * sizeof(char *) );
     90      1.1  lukem 
     91      1.1  lukem 	if( aa == NULL ) {
     92      1.1  lukem 		return -1;
     93      1.1  lukem 	}
     94      1.1  lukem 
     95      1.1  lukem 	*a = aa;
     96      1.1  lukem 
     97      1.1  lukem 	for ( i = 0; i < nn; i++ ) {
     98      1.1  lukem 		(*a)[n + i] = LDAP_STRDUP(s[i]);
     99      1.1  lukem 
    100      1.1  lukem 		if( (*a)[n + i] == NULL ) {
    101      1.1  lukem 			for( --i ; i >= 0 ; i-- ) {
    102      1.1  lukem 				LDAP_FREE( (*a)[n + i] );
    103      1.1  lukem 				(*a)[n + i] = NULL;
    104      1.1  lukem 			}
    105      1.1  lukem 			return -1;
    106      1.1  lukem 		}
    107      1.1  lukem 	}
    108      1.1  lukem 
    109      1.1  lukem 	(*a)[n + nn] = NULL;
    110      1.1  lukem 	return 0;
    111      1.1  lukem }
    112      1.1  lukem 
    113      1.1  lukem void
    114      1.1  lukem ldap_charray_free( char **a )
    115      1.1  lukem {
    116      1.1  lukem 	char	**p;
    117      1.1  lukem 
    118      1.1  lukem 	if ( a == NULL ) {
    119      1.1  lukem 		return;
    120      1.1  lukem 	}
    121      1.1  lukem 
    122      1.1  lukem 	for ( p = a; *p != NULL; p++ ) {
    123      1.1  lukem 		if ( *p != NULL ) {
    124      1.1  lukem 			LDAP_FREE( *p );
    125      1.1  lukem 		}
    126      1.1  lukem 	}
    127      1.1  lukem 
    128      1.1  lukem 	LDAP_FREE( (char *) a );
    129      1.1  lukem }
    130      1.1  lukem 
    131      1.1  lukem int
    132      1.1  lukem ldap_charray_inlist(
    133      1.1  lukem     char	**a,
    134      1.1  lukem     const char *s
    135      1.1  lukem )
    136      1.1  lukem {
    137      1.1  lukem 	int	i;
    138      1.1  lukem 
    139      1.1  lukem 	if( a == NULL ) return 0;
    140      1.1  lukem 
    141      1.1  lukem 	for ( i=0; a[i] != NULL; i++ ) {
    142      1.1  lukem 		if ( strcasecmp( s, a[i] ) == 0 ) {
    143      1.1  lukem 			return 1;
    144      1.1  lukem 		}
    145      1.1  lukem 	}
    146      1.1  lukem 
    147      1.1  lukem 	return 0;
    148      1.1  lukem }
    149      1.1  lukem 
    150      1.1  lukem char **
    151      1.1  lukem ldap_charray_dup( char **a )
    152      1.1  lukem {
    153      1.1  lukem 	int	i;
    154      1.1  lukem 	char	**new;
    155      1.1  lukem 
    156      1.1  lukem 	for ( i = 0; a[i] != NULL; i++ )
    157      1.1  lukem 		;	/* NULL */
    158      1.1  lukem 
    159      1.1  lukem 	new = (char **) LDAP_MALLOC( (i + 1) * sizeof(char *) );
    160      1.1  lukem 
    161      1.1  lukem 	if( new == NULL ) {
    162      1.1  lukem 		return NULL;
    163      1.1  lukem 	}
    164      1.1  lukem 
    165      1.1  lukem 	for ( i = 0; a[i] != NULL; i++ ) {
    166      1.1  lukem 		new[i] = LDAP_STRDUP( a[i] );
    167      1.1  lukem 
    168      1.1  lukem 		if( new[i] == NULL ) {
    169      1.1  lukem 			for( --i ; i >= 0 ; i-- ) {
    170      1.1  lukem 				LDAP_FREE( new[i] );
    171      1.1  lukem 			}
    172      1.1  lukem 			LDAP_FREE( new );
    173      1.1  lukem 			return NULL;
    174      1.1  lukem 		}
    175      1.1  lukem 	}
    176      1.1  lukem 	new[i] = NULL;
    177      1.1  lukem 
    178      1.1  lukem 	return( new );
    179      1.1  lukem }
    180      1.1  lukem 
    181      1.1  lukem char **
    182      1.1  lukem ldap_str2charray( const char *str_in, const char *brkstr )
    183      1.1  lukem {
    184      1.1  lukem 	char	**res;
    185      1.1  lukem 	char	*str, *s;
    186      1.1  lukem 	char	*lasts;
    187      1.1  lukem 	int	i;
    188      1.1  lukem 
    189      1.1  lukem 	/* protect the input string from strtok */
    190      1.1  lukem 	str = LDAP_STRDUP( str_in );
    191      1.1  lukem 	if( str == NULL ) {
    192      1.1  lukem 		return NULL;
    193      1.1  lukem 	}
    194      1.1  lukem 
    195      1.1  lukem 	i = 1;
    196  1.1.1.2  lukem 	for ( s = str; ; LDAP_UTF8_INCR(s) ) {
    197  1.1.1.2  lukem 		s = ldap_utf8_strpbrk( s, brkstr );
    198  1.1.1.2  lukem 		if ( !s ) break;
    199  1.1.1.2  lukem 		i++;
    200      1.1  lukem 	}
    201      1.1  lukem 
    202      1.1  lukem 	res = (char **) LDAP_MALLOC( (i + 1) * sizeof(char *) );
    203      1.1  lukem 
    204      1.1  lukem 	if( res == NULL ) {
    205      1.1  lukem 		LDAP_FREE( str );
    206      1.1  lukem 		return NULL;
    207      1.1  lukem 	}
    208      1.1  lukem 
    209      1.1  lukem 	i = 0;
    210      1.1  lukem 
    211      1.1  lukem 	for ( s = ldap_utf8_strtok( str, brkstr, &lasts );
    212      1.1  lukem 		s != NULL;
    213      1.1  lukem 		s = ldap_utf8_strtok( NULL, brkstr, &lasts ) )
    214      1.1  lukem 	{
    215      1.1  lukem 		res[i] = LDAP_STRDUP( s );
    216      1.1  lukem 
    217      1.1  lukem 		if(res[i] == NULL) {
    218      1.1  lukem 			for( --i ; i >= 0 ; i-- ) {
    219      1.1  lukem 				LDAP_FREE( res[i] );
    220      1.1  lukem 			}
    221      1.1  lukem 			LDAP_FREE( res );
    222      1.1  lukem 			LDAP_FREE( str );
    223      1.1  lukem 			return NULL;
    224      1.1  lukem 		}
    225      1.1  lukem 
    226      1.1  lukem 		i++;
    227      1.1  lukem 	}
    228      1.1  lukem 
    229      1.1  lukem 	res[i] = NULL;
    230      1.1  lukem 
    231      1.1  lukem 	LDAP_FREE( str );
    232      1.1  lukem 	return( res );
    233      1.1  lukem }
    234      1.1  lukem 
    235      1.1  lukem char * ldap_charray2str( char **a, const char *sep )
    236      1.1  lukem {
    237      1.1  lukem 	char *s, **v, *p;
    238      1.1  lukem 	int len;
    239      1.1  lukem 	int slen;
    240      1.1  lukem 
    241      1.1  lukem 	if( sep == NULL ) sep = " ";
    242      1.1  lukem 
    243      1.1  lukem 	slen = strlen( sep );
    244      1.1  lukem 	len = 0;
    245      1.1  lukem 
    246      1.1  lukem 	for ( v = a; *v != NULL; v++ ) {
    247      1.1  lukem 		len += strlen( *v ) + slen;
    248      1.1  lukem 	}
    249      1.1  lukem 
    250      1.1  lukem 	if ( len == 0 ) {
    251      1.1  lukem 		return NULL;
    252      1.1  lukem 	}
    253      1.1  lukem 
    254      1.1  lukem 	/* trim extra sep len */
    255      1.1  lukem 	len -= slen;
    256      1.1  lukem 
    257      1.1  lukem 	s = LDAP_MALLOC ( len + 1 );
    258      1.1  lukem 
    259      1.1  lukem 	if ( s == NULL ) {
    260      1.1  lukem 		return NULL;
    261      1.1  lukem 	}
    262      1.1  lukem 
    263      1.1  lukem 	p = s;
    264      1.1  lukem 	for ( v = a; *v != NULL; v++ ) {
    265      1.1  lukem 		if ( v != a ) {
    266      1.1  lukem 			strncpy( p, sep, slen );
    267      1.1  lukem 			p += slen;
    268      1.1  lukem 		}
    269      1.1  lukem 
    270      1.1  lukem 		len = strlen( *v );
    271      1.1  lukem 		strncpy( p, *v, len );
    272      1.1  lukem 		p += len;
    273      1.1  lukem 	}
    274      1.1  lukem 
    275      1.1  lukem 	*p = '\0';
    276      1.1  lukem 	return s;
    277      1.1  lukem }
    278