ReactOS  0.4.14-dev-50-g13bb5e2
dictionary.c File Reference
#include <assert.h>
#include <stdarg.h>
#include "windef.h"
#include "winbase.h"
#include "dictionary.h"
#include "wine/debug.h"
Include dependency graph for dictionary.c:

Go to the source code of this file.

Classes

struct  dictionary_entry
 
struct  dictionary
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (storage)
 
struct dictionarydictionary_create (comparefunc c, destroyfunc d, void *extra)
 
void dictionary_destroy (struct dictionary *d)
 
UINT dictionary_num_entries (struct dictionary *d)
 
static struct dictionary_entry ** dictionary_find_internal (struct dictionary *d, const void *k)
 
void dictionary_insert (struct dictionary *d, const void *k, const void *v)
 
BOOL dictionary_find (struct dictionary *d, const void *k, void **value)
 
void dictionary_remove (struct dictionary *d, const void *k)
 
void dictionary_enumerate (struct dictionary *d, enumeratefunc e, void *closure)
 

Function Documentation

◆ dictionary_create()

struct dictionary* dictionary_create ( comparefunc  c,
destroyfunc  d,
void extra 
)

Definition at line 45 of file dictionary.c.

46 {
47  struct dictionary *ret;
48 
49  TRACE("(%p, %p, %p)\n", c, d, extra);
50  if (!c)
51  return NULL;
52  ret = HeapAlloc(GetProcessHeap(), 0, sizeof(struct dictionary));
53  if (ret)
54  {
55  ret->comp = c;
56  ret->destroy = d;
57  ret->extra = extra;
58  ret->head = NULL;
59  ret->num_entries = 0;
60  }
61  TRACE("returning %p\n", ret);
62  return ret;
63 }
smooth NULL
Definition: ftsmooth.c:416
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:395
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
Definition: id3.c:18
#define d
Definition: ke_i.h:81
const GLubyte * c
Definition: glext.h:8905
int ret
#define c
Definition: ke_i.h:80

Referenced by PropertyStorage_CreateDictionaries().

◆ dictionary_destroy()

void dictionary_destroy ( struct dictionary d)

Definition at line 65 of file dictionary.c.

66 {
67  TRACE("(%p)\n", d);
68  if (d)
69  {
70  struct dictionary_entry *p;
71 
72  for (p = d->head; p; )
73  {
74  struct dictionary_entry *next = p->next;
75 
76  if (d->destroy)
77  d->destroy(p->key, p->value, d->extra);
78  HeapFree(GetProcessHeap(), 0, p);
79  p = next;
80  }
81  HeapFree(GetProcessHeap(), 0, d);
82  }
83 }
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:395
#define d
Definition: ke_i.h:81
Definition: dictionary.c:29
static unsigned __int64 next
Definition: rand_nt.c:6
GLfloat GLfloat p
Definition: glext.h:8902
#define HeapFree(x, y, z)
Definition: compat.h:394

Referenced by PropertyStorage_DestroyDictionaries(), and PropertyStorage_ReadFromStream().

◆ dictionary_enumerate()

void dictionary_enumerate ( struct dictionary d,
enumeratefunc  e,
void closure 
)

Definition at line 179 of file dictionary.c.

180 {
181  struct dictionary_entry *p;
182 
183  TRACE("(%p, %p, %p)\n", d, e, closure);
184  if (!d)
185  return;
186  if (!e)
187  return;
188  for (p = d->head; p; p = p->next)
189  if (!e(p->key, p->value, d->extra, closure))
190  break;
191 }
#define e
Definition: ke_i.h:82
#define TRACE(s)
Definition: solgame.cpp:4
#define d
Definition: ke_i.h:81
Definition: dictionary.c:29
struct define * next
Definition: wpp.c:35
GLfloat GLfloat p
Definition: glext.h:8902

Referenced by create_EnumSTATPROPSTG(), PropertyStorage_WriteDictionaryToStream(), and PropertyStorage_WritePropertiesToStream().

◆ dictionary_find()

BOOL dictionary_find ( struct dictionary d,
const void k,
void **  value 
)

Definition at line 142 of file dictionary.c.

143 {
144  struct dictionary_entry **prior;
145  BOOL ret = FALSE;
146 
147  TRACE("(%p, %p, %p)\n", d, k, value);
148  if (!d)
149  return FALSE;
150  if (!value)
151  return FALSE;
152  if ((prior = dictionary_find_internal(d, k)))
153  {
154  *value = (*prior)->value;
155  ret = TRUE;
156  }
157  TRACE("returning %d (%p)\n", ret, *value);
158  return ret;
159 }
#define TRUE
Definition: types.h:120
unsigned int BOOL
Definition: ntddk_ex.h:94
static struct dictionary_entry ** dictionary_find_internal(struct dictionary *d, const void *k)
Definition: dictionary.c:95
#define TRACE(s)
Definition: solgame.cpp:4
#define d
Definition: ke_i.h:81
Definition: dictionary.c:29
int ret
int k
Definition: mpi.c:3369

Referenced by IPropertyStorage_fnDeleteMultiple(), IPropertyStorage_fnDeletePropertyNames(), prop_enum_copy_cb(), PropertyStorage_FindProperty(), PropertyStorage_FindPropertyByName(), and PropertyStorage_FindPropertyNameById().

◆ dictionary_find_internal()

static struct dictionary_entry** dictionary_find_internal ( struct dictionary d,
const void k 
)
static

Definition at line 95 of file dictionary.c.

97 {
98  struct dictionary_entry **ret = NULL;
99  struct dictionary_entry *p;
100 
101  assert(d);
102  /* special case for head containing the desired element */
103  if (d->head && d->comp(k, d->head->key, d->extra) == 0)
104  ret = &d->head;
105  for (p = d->head; !ret && p && p->next; p = p->next)
106  {
107  if (d->comp(k, p->next->key, d->extra) == 0)
108  ret = &p->next;
109  }
110  return ret;
111 }
#define assert(x)
Definition: debug.h:53
smooth NULL
Definition: ftsmooth.c:416
#define d
Definition: ke_i.h:81
Definition: dictionary.c:29
#define for
Definition: utility.h:88
int ret
GLfloat GLfloat p
Definition: glext.h:8902
int k
Definition: mpi.c:3369

Referenced by dictionary_find(), dictionary_insert(), and dictionary_remove().

◆ dictionary_insert()

void dictionary_insert ( struct dictionary d,
const void k,
const void v 
)

Definition at line 113 of file dictionary.c.

114 {
115  struct dictionary_entry **prior;
116 
117  TRACE("(%p, %p, %p)\n", d, k, v);
118  if (!d)
119  return;
120  if ((prior = dictionary_find_internal(d, k)))
121  {
122  if (d->destroy)
123  d->destroy((*prior)->key, (*prior)->value, d->extra);
124  (*prior)->key = (void *)k;
125  (*prior)->value = (void *)v;
126  }
127  else
128  {
130  sizeof(struct dictionary_entry));
131 
132  if (!elem)
133  return;
134  elem->key = (void *)k;
135  elem->value = (void *)v;
136  elem->next = d->head;
137  d->head = elem;
138  d->num_entries++;
139  }
140 }
static size_t elem
Definition: string.c:68
static struct dictionary_entry ** dictionary_find_internal(struct dictionary *d, const void *k)
Definition: dictionary.c:95
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:395
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
#define d
Definition: ke_i.h:81
Definition: dictionary.c:29
const GLdouble * v
Definition: gl.h:2040
int k
Definition: mpi.c:3369

Referenced by PropertyStorage_StoreNameWithId(), and PropertyStorage_StorePropWithId().

◆ dictionary_num_entries()

UINT dictionary_num_entries ( struct dictionary d)

Definition at line 85 of file dictionary.c.

86 {
87  return d ? d->num_entries : 0;
88 }
#define d
Definition: ke_i.h:81

Referenced by IPropertyStorage_fnWriteMultiple(), PropertyStorage_WriteDictionaryToStream(), and PropertyStorage_WriteToStream().

◆ dictionary_remove()

void dictionary_remove ( struct dictionary d,
const void k 
)

Definition at line 161 of file dictionary.c.

162 {
163  struct dictionary_entry **prior, *temp;
164 
165  TRACE("(%p, %p)\n", d, k);
166  if (!d)
167  return;
168  if ((prior = dictionary_find_internal(d, k)))
169  {
170  temp = *prior;
171  if (d->destroy)
172  d->destroy((*prior)->key, (*prior)->value, d->extra);
173  *prior = (*prior)->next;
175  d->num_entries--;
176  }
177 }
struct dictionary_entry * next
Definition: dictionary.c:33
static struct dictionary_entry ** dictionary_find_internal(struct dictionary *d, const void *k)
Definition: dictionary.c:95
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:395
#define d
Definition: ke_i.h:81
Definition: dictionary.c:29
static calc_node_t temp
Definition: rpn_ieee.c:38
int k
Definition: mpi.c:3369
#define HeapFree(x, y, z)
Definition: compat.h:394

Referenced by IPropertyStorage_fnDeleteMultiple(), and IPropertyStorage_fnDeletePropertyNames().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( storage  )