Use the new LHASH macros to declare type-safe wrapper functions that can
authorGeoff Thorpe <geoff@openssl.org>
Sat, 2 Dec 2000 23:16:54 +0000 (23:16 +0000)
committerGeoff Thorpe <geoff@openssl.org>
Sat, 2 Dec 2000 23:16:54 +0000 (23:16 +0000)
be used as the hash/compare callbacks without function pointer casting.

For now, this is just happening in the apps/ directory whilst a few people
check the approach. The rest of the library will be moved across to the
same idea if there's no problems with this.

apps/ca.c
apps/openssl.c

index 2e00555..2e85934 100644 (file)
--- a/apps/ca.c
+++ b/apps/ca.c
@@ -180,11 +180,11 @@ extern int EF_ALIGNMENT;
 #endif
 
 static void lookup_fail(char *name,char *tag);
-static unsigned long index_serial_hash(char **a);
-static int index_serial_cmp(char **a, char **b);
-static unsigned long index_name_hash(char **a);
+static unsigned long index_serial_hash(const char **a);
+static int index_serial_cmp(const char **a, const char **b);
+static unsigned long index_name_hash(const char **a);
 static int index_name_qual(char **a);
-static int index_name_cmp(char **a,char **b);
+static int index_name_cmp(const char **a,const char **b);
 static BIGNUM *load_serial(char *serialfile);
 static int save_serial(char *serialfile, BIGNUM *serial);
 static int certify(X509 **xret, char *infile,EVP_PKEY *pkey,X509 *x509,
@@ -215,6 +215,12 @@ static char *section=NULL;
 static int preserve=0;
 static int msie_hack=0;
 
+static IMPLEMENT_LHASH_HASH_FN(index_serial_hash,const char **);
+static IMPLEMENT_LHASH_COMP_FN(index_serial_cmp,const char **);
+static IMPLEMENT_LHASH_HASH_FN(index_name_hash,const char **);
+static IMPLEMENT_LHASH_COMP_FN(index_name_cmp,const char **);
+
+
 int MAIN(int, char **);
 
 int MAIN(int argc, char **argv)
@@ -754,16 +760,16 @@ bad:
                }
        
        if (!TXT_DB_create_index(db, DB_serial, NULL,
-                       (LHASH_HASH_FN_TYPE)index_serial_hash,
-                       (LHASH_COMP_FN_TYPE)index_serial_cmp))
+                       LHASH_HASH_FN(index_serial_hash),
+                       LHASH_COMP_FN(index_serial_cmp)))
                {
                BIO_printf(bio_err,"error creating serial number index:(%ld,%ld,%ld)\n",db->error,db->arg1,db->arg2);
                goto err;
                }
 
        if (!TXT_DB_create_index(db, DB_name, index_name_qual,
-                       (LHASH_HASH_FN_TYPE)index_name_hash,
-                       (LHASH_COMP_FN_TYPE)index_name_cmp))
+                       LHASH_HASH_FN(index_name_hash),
+                       LHASH_COMP_FN(index_name_cmp)))
                {
                BIO_printf(bio_err,"error creating name index:(%ld,%ld,%ld)\n",
                        db->error,db->arg1,db->arg2);
@@ -1328,31 +1334,31 @@ static void lookup_fail(char *name, char *tag)
        BIO_printf(bio_err,"variable lookup failed for %s::%s\n",name,tag);
        }
 
-static unsigned long index_serial_hash(char **a)
+static unsigned long index_serial_hash(const char **a)
        {
-       char *n;
+       const char *n;
 
        n=a[DB_serial];
        while (*n == '0') n++;
        return(lh_strhash(n));
        }
 
-static int index_serial_cmp(char **a, char **b)
+static int index_serial_cmp(const char **a, const char **b)
        {
-       char *aa,*bb;
+       const char *aa,*bb;
 
        for (aa=a[DB_serial]; *aa == '0'; aa++);
        for (bb=b[DB_serial]; *bb == '0'; bb++);
        return(strcmp(aa,bb));
        }
 
-static unsigned long index_name_hash(char **a)
+static unsigned long index_name_hash(const char **a)
        { return(lh_strhash(a[DB_name])); }
 
 static int index_name_qual(char **a)
        { return(a[0][0] == 'V'); }
 
-static int index_name_cmp(char **a, char **b)
+static int index_name_cmp(const char **a, const char **b)
        { return(strcmp(a[DB_name],
             b[DB_name])); }
 
@@ -2253,7 +2259,7 @@ static int do_revoke(X509 *x509, TXT_DB *db)
                goto err;
 
                }
-       else if (index_name_cmp(row,rrow))
+       else if (index_name_cmp((const char **)row,(const char **)rrow))
                {
                BIO_printf(bio_err,"ERROR:name does not match %s\n",
                           row[DB_name]);
index 40bcb76..49d0b2b 100644 (file)
@@ -85,6 +85,9 @@ char *default_config_file=NULL;
 BIO *bio_err=NULL;
 #endif
 
+static IMPLEMENT_LHASH_HASH_FN(hash,FUNCTION *);
+static IMPLEMENT_LHASH_COMP_FN(cmp,FUNCTION *);
+
 int main(int Argc, char *Argv[])
        {
        ARGS arg;
@@ -351,8 +354,8 @@ static LHASH *prog_init(void)
            ;
        qsort(functions,i,sizeof *functions,SortFnByName);
 
-       if ((ret=lh_new((LHASH_HASH_FN_TYPE)hash,
-                       (LHASH_COMP_FN_TYPE)cmp)) == NULL)
+       if ((ret=lh_new(LHASH_HASH_FN(hash),
+                       LHASH_COMP_FN(cmp))) == NULL)
                return(NULL);
 
        for (f=functions; f->name != NULL; f++)