Thank you for the effort on this.
Please adhere to the naming and indentation convention. I could always fix the indent, but would be great if you could follow the naming convention from ground up as it is tough to change later :)

Thanks,
Samisa...

nandika jayawardana wrote:

Hi all,

since apr is supposed to be kept out of the axis2 code , i wrote a wrapper to apr_hash
which has been used in the axis2 code
I have atttached the axis2_hash.h and axis2_hash.c files and a test.

Thanks

Nandika

------------------------------------------------------------------------

/*
* Copyright 2004,2005 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the Licaxiander the License.
*/


#include <apr_pools.h>
#include <apr_hash.h>
#include "axis2_hash.h"

static apr_pool_t *hashpool;

void axis2_hash_ops_set(axis2_hash_t *ht,void *key,size_t klen,const void *val)
{
        if( !ht || !key)
                return;
                (apr_hash_t*)(ht->hashtable);
        apr_hash_set((apr_hash_t*)(ht->hashtable),key,klen,val);
}

void *axis2_hash_ops_get(axis2_hash_t *ht,void *key,size_t klen)
{
        if(!ht || !key)
                return NULL;
        return apr_hash_get((apr_hash_t*)ht->hashtable,key,klen);
}


int axis2_hash_ops_first(axis2_hash_t *ht)
{
        ht->hashindex = apr_hash_first(hashpool,ht->hashtable);
        return (ht->hashindex) != NULL ? 1 : 0 ;
}

int axis2_hash_ops_has_next(axis2_hash_t *ht)
{
        if(!(ht->hashindex))
                return 0;
        ht->hashindex = apr_hash_next((apr_hash_index_t*)ht->hashindex);
        
        return (ht->hashindex)!= NULL ? 1 : 0;
}

void axis2_hash_ops_this(axis2_hash_t *ht,void **key,size_t klen,void **val)
{
        if(!ht)
                return;
        apr_hash_this((apr_hash_index_t *)(ht->hashindex),key,klen,val);     
}

axis2_hash_t *axis2_hash_create()
{
        axis2_hash_t *ht = (axis2_hash_t*)malloc(sizeof(axis2_hash_t));
        apr_status_t status;
        if(!ht)
                return NULL;

        if(!hashpool)
        {
                status = apr_pool_create (&hashpool, NULL);
       //if(!status)
        //  return NULL;
   }
ht->hashtable = apr_hash_make (hashpool);
        ht->hashindex = NULL;
        
        ht->ops = (axis2_hash_ops_t*)malloc(sizeof(axis2_hash_ops_t));
        ht->ops->set = axis2_hash_ops_set;
        ht->ops->get = axis2_hash_ops_get;
        ht->ops->first = axis2_hash_ops_first;
        ht->ops->has_next = axis2_hash_ops_has_next;
        ht->ops->this = axis2_hash_ops_this;
        return ht;      
}


------------------------------------------------------------------------

/*
* Copyright 2004,2005 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

#ifndef AXIS2_HASH_H
#define AXIS2_HASH_H

#include <stdlib.h>

struct axis2_hash;
struct axis2_hash_ops;
struct axis2_hash_index;

        
typedef struct axis2_hash axis2_hash_t;
typedef struct axis2_hash_ops axis2_hash_ops_t;
typedef struct axis2_hash_index axis2_hash_index_t;

struct axis2_hash_ops
{
    void (*set)(axis2_hash_t *ht,void *key,size_t klen,const void *val);
         void *(*get)(axis2_hash_t *ht,void *key,size_t klen);
         int (*first)(axis2_hash_t *ht);
         int  (*has_next)(axis2_hash_t *ht);
         void (*this)(axis2_hash_t *ht,void **key,size_t klen,void **val);
};

struct axis2_hash
{
        struct axis2_hash_ops *ops;
        void *hashindex;
        void *hashtable;
};

axis2_hash_t *axis2_hash_create();


#define axis2_hash_set(hashtable,key,klen,value) 
((hashtable)->ops->set((hashtable),(key),(klen),(value)))
#define axis2_hash_get(hashtable,key,klen)       
((hashtable)->ops->get((hashtable),(key),(klen)))
#define axis2_hash_first(hashtable)     ((hashtable)->ops->first((hashtable)))
#define axis2_hash_has_next(hashtable)  ((hashtable)->ops->has_next(hashtable))
/**
This macro contains out parameters hashtable - pointer to axis2_hash_t
  key       - ** pointer to key
  klen      -
  val       - ** pointer to value
*/

#define axis2_hash_this(hashtable,key,klen,value)  
((hashtable)->ops->this((hashtable),(key),(klen),(value)))
#define AXIS2_HASH_KEY_STRING (-1)

#endif // AXIS2_HASH_H

------------------------------------------------------------------------

#include <stdio.h>
#include <apr.h>
#include "axis2_hash.h"
#include <apr_pools.h>
#include <apr_hash.h>

typedef struct a
{
   char *value;
}a;



int main()
{
axis2_hash_t *ht;
a *a1,*a2 ,*a3,*a4;

int i=0;
void *v =NULL;

char *key1 = "key1";
char *key2 = "key2";
char *key3 = "key3";
char *key4 = "key4";

a1 = (a*)malloc(sizeof(a));
a2 = (a*)malloc(sizeof(a));
a3 = (a*)malloc(sizeof(a));
a4 = (a*)malloc(sizeof(a));


a1->value = strdup("key1");
a2->value = strdup("key2");
a3->value = strdup("key3");
a4->value = strdup("key4");

if(apr_initialize()!= APR_SUCCESS)
{
   return;
}
ht = axis2_hash_create();

axis2_hash_set(ht,key1,AXIS2_HASH_KEY_STRING,a1);
axis2_hash_set(ht,key2,AXIS2_HASH_KEY_STRING,a2);
axis2_hash_set(ht,key3,AXIS2_HASH_KEY_STRING,a3);
axis2_hash_set(ht,key4,AXIS2_HASH_KEY_STRING,a4);

for(i = axis2_hash_first(ht); i > 0 ; i = axis2_hash_has_next(ht))
{
axis2_hash_this(ht,NULL,NULL,&v); printf("\n %s \n",((a*)v)->value);
}

printf("\n demo get %s 
",((a*)axis2_hash_get(ht,key1,AXIS2_HASH_KEY_STRING))->value);

printf("\n demo get %s 
",((a*)axis2_hash_get(ht,key2,AXIS2_HASH_KEY_STRING))->value);

printf("\n demo get %s 
",((a*)axis2_hash_get(ht,key3,AXIS2_HASH_KEY_STRING))->value);

printf("\n demo get %s 
",((a*)axis2_hash_get(ht,key4,AXIS2_HASH_KEY_STRING))->value);
getchar();
}

Reply via email to