Merge remote-tracking branch 'origin/master' into windows
[scilab.git] / scilab / modules / graphics / src / c / getHandleProperty / setGetHashTable.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2006 - INRIA - Jean-Baptiste Silvy
4  * Copyright (C) 2007 - INRIA - Vincent Couvert
5  *
6  * Copyright (C) 2012 - 2016 - Scilab Enterprises
7  *
8  * This file is hereby licensed under the terms of the GNU GPL v2.0,
9  * pursuant to article 5.3.4 of the CeCILL v.2.1.
10  * This file was originally licensed under the terms of the CeCILL v2.1,
11  * and continues to be available under such terms.
12  * For more information, see the COPYING file which you should have received
13  * along with this program.
14  *
15  */
16
17 /*------------------------------------------------------------------------*/
18 /* file: setGetHashTable.h                                                */
19 /* desc : define two hash table to be used in sci_set and sci_get         */
20 /*        These hash table are based on the Scilab hashTable              */
21 /*------------------------------------------------------------------------*/
22 #include <string.h>
23 #include <ctype.h>
24
25 #include "setGetHashTable.h"
26 #include "sci_malloc.h"
27 #include "os_string.h"
28 /*--------------------------------------------------------------------------*/
29 /* see http://www.cse.yorku.ca/~oz/hash.html */
30 /* like in hashtable_localization by Allan Cornet */
31 /* I choose djb2 algo. for strings */
32 static unsigned int setGetHashTableHash(void * key)
33 {
34     unsigned long hash = 5381;
35     int c = 0;
36     char * str = key;
37
38     while ((c = tolower(*str++)))
39     {
40         hash = ((hash << 5) + hash) + c ; /* hash * 33 + c */
41     }
42
43     return hash;
44
45 }
46 /*--------------------------------------------------------------------------*/
47 static int setGetHashTableEqualKeys(void * k1, void * k2)
48 {
49     if (os_stricmp((char *)k1, (char *)k2) == 0)
50     {
51         return 1;
52     }
53     return 0;
54 }
55 /*--------------------------------------------------------------------------*/
56 GetPropertyHashTable * createGetHashTable(void)
57 {
58     return create_hashtable(16, setGetHashTableHash, setGetHashTableEqualKeys);
59 }
60 /*--------------------------------------------------------------------------*/
61 void destroyGetHashTable(GetPropertyHashTable * hashTable)
62 {
63     /* we just store pointers */
64     hashtable_destroy(hashTable, 0);
65 }
66 /*--------------------------------------------------------------------------*/
67 getPropertyFunc searchGetHashtable(GetPropertyHashTable * hashTable, char * key)
68 {
69     return (getPropertyFunc) hashtable_search(hashTable, key);
70 }
71 /*--------------------------------------------------------------------------*/
72 int insertGetHashtable(GetPropertyHashTable * hashTable, char * key, getPropertyFunc value)
73 {
74     /* allocate a new key because the hashtable claims ownership */
75     /* and will free it when destroyed */
76     char * copyKey  =  os_strdup(key);
77     if (copyKey == NULL)
78     {
79         return 0 ;
80     }
81     return hashtable_insert(hashTable, copyKey, value);
82 }
83 /*--------------------------------------------------------------------------*/
84 SetPropertyHashTable * createSetHashTable(void)
85 {
86     return create_hashtable(16, setGetHashTableHash, setGetHashTableEqualKeys);
87 }
88 /*--------------------------------------------------------------------------*/
89 void destroySetHashTable(SetPropertyHashTable * hashTable)
90 {
91     /* we just store pointers */
92     hashtable_destroy(hashTable, 0);
93 }
94 /*--------------------------------------------------------------------------*/
95 setPropertyFunc searchSetHashtable(SetPropertyHashTable * hashTable, char * key)
96 {
97     return (setPropertyFunc) hashtable_search(hashTable, key);
98 }
99 /*--------------------------------------------------------------------------*/
100 int insertSetHashtable(SetPropertyHashTable * hashTable, char * key, setPropertyFunc value)
101 {
102     /* allocate a new key because the hashtable claims ownership */
103     /* and will free it when destroyed */
104     char * copyKey   = os_strdup(key);
105     if (copyKey == NULL)
106     {
107         return 0 ;
108     }
109     return hashtable_insert(hashTable, copyKey, value);
110 }
111 /*--------------------------------------------------------------------------*/