]> git.sur5r.net Git - openldap/blobdiff - libraries/libldap/getfilter.c
Fix #undef LDAP_UFN
[openldap] / libraries / libldap / getfilter.c
index a780851688e25ed02f6fa31b4df7c9c12470996c..e6570187ccb74dcd48b43f952e0e5a477f909cd3 100644 (file)
@@ -1,5 +1,6 @@
+/* $OpenLDAP$ */
 /*
- * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
+ * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
  */
 /*  Portions
@@ -12,9 +13,9 @@
 #include "portable.h"
 
 #include <stdio.h>
-#include <stdlib.h>
 
-#include <ac/ctype.h>
+#include <ac/stdlib.h>
+
 #include <ac/errno.h>
 #include <ac/regex.h>
 #include <ac/string.h>
 
 #include "ldap-int.h"
 
-static int break_into_words LDAP_P(( char *str, char *delims, char ***wordsp ));
+static int break_into_words LDAP_P((
+       /* LDAP_CONST */ char *str,
+       LDAP_CONST char *delims,
+       char ***wordsp ));
 
 #define FILT_MAX_LINE_LEN      1024
 
 LDAPFiltDesc *
-ldap_init_getfilter( char *fname )
+ldap_init_getfilter( LDAP_CONST char *fname )
 {
     FILE               *fp;
     char               *buf;
@@ -56,7 +60,7 @@ ldap_init_getfilter( char *fname )
        return( NULL );
     }
 
-    if (( buf = malloc( (size_t)len )) == NULL ) {
+    if (( buf = LDAP_MALLOC( (size_t)len )) == NULL ) {
        fclose( fp );
        return( NULL );
     }
@@ -66,20 +70,20 @@ ldap_init_getfilter( char *fname )
     fclose( fp );
 
     if ( rlen != len && !eof ) {       /* error:  didn't get the whole file */
-       free( buf );
+       LDAP_FREE( buf );
        return( NULL );
     }
 
 
     lfdp = ldap_init_getfilter_buf( buf, rlen );
-    free( buf );
+    LDAP_FREE( buf );
 
     return( lfdp );
 }
 
 
 LDAPFiltDesc *
-ldap_init_getfilter_buf( char *buf, long buflen )
+ldap_init_getfilter_buf( char *buf, ber_len_t buflen )
 {
     LDAPFiltDesc       *lfdp;
     LDAPFiltList       *flp, *nextflp;
@@ -89,7 +93,7 @@ ldap_init_getfilter_buf( char *buf, long buflen )
        int                             rc;
        regex_t                 re;
 
-    if (( lfdp = (LDAPFiltDesc *)calloc( 1, sizeof( LDAPFiltDesc))) == NULL ) {
+    if (( lfdp = (LDAPFiltDesc *)LDAP_CALLOC( 1, sizeof( LDAPFiltDesc))) == NULL ) {
        return( NULL );
     }
 
@@ -97,36 +101,35 @@ ldap_init_getfilter_buf( char *buf, long buflen )
     fip = NULL;
     tag = NULL;
 
-    while ( buflen > 0 && ( tokcnt = next_line_tokens( &buf, &buflen, &tok ))
+    while ( buflen > 0 && ( tokcnt = ldap_int_next_line_tokens( &buf, &buflen, &tok ))
            > 0 ) {
 
        switch( tokcnt ) {
        case 1:         /* tag line */
            if ( tag != NULL ) {
-               free( tag );
+               LDAP_FREE( tag );
            }
            tag = tok[ 0 ];
-           free( tok );
+           LDAP_FREE( tok );
            break;
        case 4:
        case 5:         /* start of filter info. list */
-           if (( nextflp = (LDAPFiltList *)calloc( 1, sizeof( LDAPFiltList )))
+           if (( nextflp = (LDAPFiltList *)LDAP_CALLOC( 1, sizeof( LDAPFiltList )))
                    == NULL ) {
                ldap_getfilter_free( lfdp );
                return( NULL );
            }
-           nextflp->lfl_tag = ldap_strdup( tag );
+           nextflp->lfl_tag = LDAP_STRDUP( tag );
            nextflp->lfl_pattern = tok[ 0 ];
            if ( (rc = regcomp( &re, nextflp->lfl_pattern, 0 )) != 0 ) {
-#ifdef LDAP_LIBUI
                char error[512];
                regerror(rc, &re, error, sizeof(error));
                ldap_getfilter_free( lfdp );
-               fprintf( stderr, "bad regular expresssion %s, %s\n",
-                       nextflp->lfl_pattern, error );
+               Debug( LDAP_DEBUG_ANY, "ldap_init_get_filter_buf: "
+                       "bad regular expression %s, %s\n",
+                       nextflp->lfl_pattern, error, 0 );
                errno = EINVAL;
-#endif /* LDAP_LIBUI */
-               free_strarray( tok );
+               LDAP_VFREE( tok );
                return( NULL );
            }
                regfree(&re);
@@ -149,10 +152,10 @@ ldap_init_getfilter_buf( char *buf, long buflen )
        case 2:
        case 3:         /* filter, desc, and optional search scope */
            if ( nextflp != NULL ) { /* add to info list */
-               if (( nextfip = (LDAPFiltInfo *)calloc( 1,
+               if (( nextfip = (LDAPFiltInfo *)LDAP_CALLOC( 1,
                        sizeof( LDAPFiltInfo ))) == NULL ) {
                    ldap_getfilter_free( lfdp );
-                   free_strarray( tok );
+                   LDAP_VFREE( tok );
                    return( NULL );
                }
                if ( fip == NULL ) {    /* first one */
@@ -172,24 +175,24 @@ ldap_init_getfilter_buf( char *buf, long buflen )
                    } else if ( strcasecmp( tok[ 2 ], "base" ) == 0 ) {
                        nextfip->lfi_scope = LDAP_SCOPE_BASE;
                    } else {
-                       free_strarray( tok );
+                       LDAP_VFREE( tok );
                        ldap_getfilter_free( lfdp );
                        errno = EINVAL;
                        return( NULL );
                    }
-                   free( tok[ 2 ] );
+                   LDAP_FREE( tok[ 2 ] );
                    tok[ 2 ] = NULL;
                } else {
                    nextfip->lfi_scope = LDAP_SCOPE_SUBTREE;    /* default */
                }
                nextfip->lfi_isexact = ( strchr( tok[ 0 ], '*' ) == NULL &&
                        strchr( tok[ 0 ], '~' ) == NULL );
-               free( tok );
+               LDAP_FREE( tok );
            }
            break;
 
        default:
-           free_strarray( tok );
+           LDAP_VFREE( tok );
            ldap_getfilter_free( lfdp );
            errno = EINVAL;
            return( NULL );
@@ -197,7 +200,7 @@ ldap_init_getfilter_buf( char *buf, long buflen )
     }
 
     if ( tag != NULL ) {
-       free( tag );
+       LDAP_FREE( tag );
     }
 
     return( lfdp );
@@ -205,30 +208,33 @@ ldap_init_getfilter_buf( char *buf, long buflen )
 
 
 void
-ldap_setfilteraffixes( LDAPFiltDesc *lfdp, char *prefix, char *suffix )
+ldap_setfilteraffixes( LDAPFiltDesc *lfdp, LDAP_CONST char *prefix, LDAP_CONST char *suffix )
 {
     if ( lfdp->lfd_filtprefix != NULL ) {
-       free( lfdp->lfd_filtprefix );
+       LDAP_FREE( lfdp->lfd_filtprefix );
     }
-    lfdp->lfd_filtprefix = ( prefix == NULL ) ? NULL : ldap_strdup( prefix );
+    lfdp->lfd_filtprefix = ( prefix == NULL ) ? NULL : LDAP_STRDUP( prefix );
 
     if ( lfdp->lfd_filtsuffix != NULL ) {
-       free( lfdp->lfd_filtsuffix );
+       LDAP_FREE( lfdp->lfd_filtsuffix );
     }
-    lfdp->lfd_filtsuffix = ( suffix == NULL ) ? NULL : ldap_strdup( suffix );
+    lfdp->lfd_filtsuffix = ( suffix == NULL ) ? NULL : LDAP_STRDUP( suffix );
 }
 
 
 LDAPFiltInfo *
-ldap_getfirstfilter( LDAPFiltDesc *lfdp, char *tagpat, char *value )
+ldap_getfirstfilter(
+       LDAPFiltDesc *lfdp,
+       /* LDAP_CONST */ char *tagpat,
+       /* LDAP_CONST */ char *value )
 {
     LDAPFiltList       *flp;
        int                             rc;
        regex_t                 re;
 
     if ( lfdp->lfd_curvalcopy != NULL ) {
-       free( lfdp->lfd_curvalcopy );
-       free( lfdp->lfd_curvalwords );
+       LDAP_FREE( lfdp->lfd_curvalcopy );
+       LDAP_FREE( lfdp->lfd_curvalwords );
     }
 
     lfdp->lfd_curval = value;
@@ -236,17 +242,17 @@ ldap_getfirstfilter( LDAPFiltDesc *lfdp, char *tagpat, char *value )
 
        for ( flp = lfdp->lfd_filtlist; flp != NULL; flp = flp->lfl_next ) {
                /* compile tagpat, continue if we fail */
-               if (regcomp(&re, tagpat, 0) != 0)
+               if (regcomp(&re, tagpat, REG_EXTENDED|REG_NOSUB) != 0)
                        continue;
 
-               /* match tagpatern and tag, continue if we fail */
+               /* match tagpattern and tag, continue if we fail */
                rc = regexec(&re, flp->lfl_tag, 0, NULL, 0);
                regfree(&re);
                if (rc != 0)
                        continue;
 
                /* compile flp->ifl_pattern, continue if we fail */
-               if (regcomp(&re, flp->lfl_pattern, 0) != 0)
+               if (regcomp(&re, flp->lfl_pattern, REG_EXTENDED|REG_NOSUB) != 0)
                        continue;
 
                /* match ifl_pattern and lfd_curval, continue if we fail */
@@ -264,13 +270,13 @@ ldap_getfirstfilter( LDAPFiltDesc *lfdp, char *tagpat, char *value )
        return( NULL );
     }
 
-    if (( lfdp->lfd_curvalcopy = ldap_strdup( value )) == NULL ) {
+    if (( lfdp->lfd_curvalcopy = LDAP_STRDUP( value )) == NULL ) {
        return( NULL );
     }
 
     if ( break_into_words( lfdp->lfd_curvalcopy, flp->lfl_delims,
                &lfdp->lfd_curvalwords ) < 0 ) {
-       free( lfdp->lfd_curvalcopy );
+       LDAP_FREE( lfdp->lfd_curvalcopy );
        lfdp->lfd_curvalcopy = NULL;
        return( NULL );
     }
@@ -305,10 +311,18 @@ ldap_getnextfilter( LDAPFiltDesc *lfdp )
 
 
 void
-ldap_build_filter( char *filtbuf, unsigned long buflen, char *pattern,
-       char *prefix, char *suffix, char *attr, char *value, char **valwords )
+ldap_build_filter(
+       char *filtbuf,
+       ber_len_t buflen,
+       LDAP_CONST char *pattern,
+       LDAP_CONST char *prefix,
+       LDAP_CONST char *suffix,
+       LDAP_CONST char *attr,
+       LDAP_CONST char *value,
+       char **valwords )
 {
-       char    *p, *f;
+       const char *p;
+       char *f;
        size_t  slen;
        int     i, wordcount, wordnum, endwordnum;
        
@@ -331,12 +345,12 @@ ldap_build_filter( char *filtbuf, unsigned long buflen, char *pattern,
            if ( *p == '%' ) {
                ++p;
                if ( *p == 'v' ) {
-                   if ( isdigit( *(p+1))) {
+                   if ( LDAP_DIGIT( (unsigned char) p[1] )) {
                        ++p;
                        wordnum = *p - '1';
                        if ( *(p+1) == '-' ) {
                            ++p;
-                           if ( isdigit( *(p+1))) {
+                           if ( LDAP_DIGIT( (unsigned char) p[1] )) {
                                ++p;
                                endwordnum = *p - '1';  /* e.g., "%v2-4" */
                                if ( endwordnum > wordcount - 1 ) {
@@ -355,7 +369,7 @@ ldap_build_filter( char *filtbuf, unsigned long buflen, char *pattern,
                                    *f++ = ' ';
                                }
                                slen = strlen( valwords[ i ] );
-                               SAFEMEMCPY( f, valwords[ i ], slen );
+                               AC_MEMCPY( f, valwords[ i ], slen );
                                f += slen;
                            }
                        }
@@ -364,17 +378,17 @@ ldap_build_filter( char *filtbuf, unsigned long buflen, char *pattern,
                        if ( wordcount > 0 ) {
                            wordnum = wordcount - 1;
                            slen = strlen( valwords[ wordnum ] );
-                           SAFEMEMCPY( f, valwords[ wordnum ], slen );
+                           AC_MEMCPY( f, valwords[ wordnum ], slen );
                            f += slen;
                        }
                    } else if ( value != NULL ) {
                        slen = strlen( value );
-                       SAFEMEMCPY( f, value, slen );
+                       AC_MEMCPY( f, value, slen );
                        f += slen;
                    }
                } else if ( *p == 'a' && attr != NULL ) {
                    slen = strlen( attr );
-                   SAFEMEMCPY( f, attr, slen );
+                   AC_MEMCPY( f, attr, slen );
                    f += slen;
                } else {
                    *f++ = *p;
@@ -383,15 +397,14 @@ ldap_build_filter( char *filtbuf, unsigned long buflen, char *pattern,
                *f++ = *p;
            }
                
-           if ( (unsigned long) (f - filtbuf) > buflen ) {
+           if ( (size_t) (f - filtbuf) > buflen ) {
                /* sanity check */
                --f;
                break;
            }
        }
 
-       if ( suffix != NULL && (
-               (unsigned long) ( f - filtbuf ) < buflen ) )
+       if ( suffix != NULL && ( (size_t) (f - filtbuf) < buflen ) )
        {
            strcpy( f, suffix );
        } else {
@@ -401,28 +414,28 @@ ldap_build_filter( char *filtbuf, unsigned long buflen, char *pattern,
 
 
 static int
-break_into_words( char *str, char *delims, char ***wordsp )
+break_into_words( /* LDAP_CONST */ char *str, LDAP_CONST char *delims, char ***wordsp )
 {
     char       *word, **words;
     int                count;
     char        *tok_r;        
 
-    if (( words = (char **)calloc( 1, sizeof( char * ))) == NULL ) {
+    if (( words = (char **)LDAP_CALLOC( 1, sizeof( char * ))) == NULL ) {
        return( -1 );
     }
     count = 0;
     words[ count ] = NULL;
 
-    word = ldap_int_strtok( str, delims, &tok_r );
+    word = ldap_pvt_strtok( str, delims, &tok_r );
     while ( word != NULL ) {
-       if (( words = (char **)realloc( words,
+       if (( words = (char **)LDAP_REALLOC( words,
                ( count + 2 ) * sizeof( char * ))) == NULL ) {
            return( -1 );
        }
 
        words[ count ] = word;
        words[ ++count ] = NULL;
-       word = ldap_int_strtok( NULL, delims, &tok_r );
+       word = ldap_pvt_strtok( NULL, delims, &tok_r );
     }
        
     *wordsp = words;