home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ldapsdk.zip / libraries / libldap / charray.c < prev    next >
C/C++ Source or Header  |  2000-07-29  |  4KB  |  265 lines

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