Kannel: Open Source WAP and SMS gateway  svn-r5335
meta_data.c File Reference
#include "gwlib/gwlib.h"
#include "meta_data.h"

Go to the source code of this file.

Data Structures

struct  meta_data
 

Functions

static struct meta_datameta_data_create (void)
 
static void meta_data_destroy (struct meta_data *meta)
 
static struct meta_datameta_data_unpack (const Octstr *data)
 
static int meta_data_pack (struct meta_data *mdata, Octstr *data)
 
Dictmeta_data_get_values (const Octstr *data, const char *group)
 
int meta_data_set_values (Octstr *data, const Dict *dict, const char *group, int replace)
 
int meta_data_set_value (Octstr *data, const char *group, const Octstr *key, const Octstr *value, int replace)
 
Octstrmeta_data_get_value (Octstr *data, const char *group, const Octstr *key)
 
int meta_data_remove_value (Octstr *data, const char *group, const Octstr *key)
 
Octstrmeta_data_merge (const Octstr *data, const Octstr *new_data, int replace)
 

Function Documentation

◆ meta_data_create()

static struct meta_data* meta_data_create ( void  )
static

Definition at line 76 of file meta_data.c.

References meta_data::group, meta_data::next, and meta_data::values.

Referenced by meta_data_merge(), meta_data_set_value(), and meta_data_set_values().

77 {
78  struct meta_data *ret;
79 
80  ret = gw_malloc(sizeof(*ret));
81  ret->group = NULL;
82  ret->values = NULL;
83  ret->next = NULL;
84 
85  return ret;
86 }
Octstr * group
Definition: meta_data.c:70
Dict * values
Definition: meta_data.c:71
struct meta_data * next
Definition: meta_data.c:72

◆ meta_data_destroy()

static void meta_data_destroy ( struct meta_data meta)
static

Definition at line 89 of file meta_data.c.

References dict_destroy(), meta_data::group, meta_data::next, octstr_destroy(), and meta_data::values.

Referenced by meta_data_get_value(), meta_data_get_values(), meta_data_merge(), meta_data_remove_value(), meta_data_set_value(), meta_data_set_values(), and meta_data_unpack().

90 {
91  struct meta_data *next;
92 
93  if (meta == NULL)
94  return;
95 
96  do {
97  next = meta->next;
98  octstr_destroy(meta->group);
99  dict_destroy(meta->values);
100  gw_free(meta);
101  meta = next;
102  } while(meta != NULL);
103 }
Octstr * group
Definition: meta_data.c:70
Dict * values
Definition: meta_data.c:71
struct meta_data * next
Definition: meta_data.c:72
void octstr_destroy(Octstr *ostr)
Definition: octstr.c:324
void dict_destroy(Dict *dict)
Definition: dict.c:215

◆ meta_data_get_value()

Octstr* meta_data_get_value ( Octstr data,
const char *  group,
const Octstr key 
)

Get value for a given group and key.

Definition at line 368 of file meta_data.c.

References dict_remove(), meta_data::group, meta_data_destroy(), meta_data_unpack(), meta_data::next, octstr_str_case_compare(), and meta_data::values.

Referenced by msg_to_pdu(), and urltrans_fill_escape_codes().

369 {
370  struct meta_data *mdata, *curr;
371  Octstr *ret = NULL;
372 
373  if (data == NULL || group == NULL || key == NULL)
374  return NULL;
375 
376  mdata = meta_data_unpack(data);
377  if (mdata == NULL)
378  return NULL;
379  for (curr = mdata; curr != NULL; curr = curr->next) {
380  if (octstr_str_case_compare(curr->group, group) == 0) {
381  ret = dict_remove(curr->values, (Octstr *) key);
382  break;
383  }
384  }
385 
386  meta_data_destroy(mdata);
387 
388  return ret;
389 }
Octstr * group
Definition: meta_data.c:70
int octstr_str_case_compare(const Octstr *ostr, const char *str)
Definition: octstr.c:986
Dict * values
Definition: meta_data.c:71
struct meta_data * next
Definition: meta_data.c:72
void * dict_remove(Dict *dict, Octstr *key)
Definition: dict.c:307
static void meta_data_destroy(struct meta_data *meta)
Definition: meta_data.c:89
Definition: octstr.c:118
static struct meta_data * meta_data_unpack(const Octstr *data)
Definition: meta_data.c:107

◆ meta_data_get_values()

Dict* meta_data_get_values ( const Octstr data,
const char *  group 
)

Get Dictionary with all values for this group.

Definition at line 248 of file meta_data.c.

References meta_data::group, meta_data_destroy(), meta_data_unpack(), meta_data::next, octstr_str_case_compare(), and meta_data::values.

Referenced by msg_to_pdu().

249 {
250  struct meta_data *mdata, *curr;
251  Dict *ret = NULL;
252 
253  if (data == NULL || group == NULL)
254  return NULL;
255 
256  mdata = meta_data_unpack(data);
257  if (mdata == NULL)
258  return NULL;
259  for (curr = mdata; curr != NULL; curr = curr->next) {
260  if (octstr_str_case_compare(curr->group, group) == 0) {
261  ret = curr->values;
262  curr->values = NULL;
263  break;
264  }
265  }
266 
267  meta_data_destroy(mdata);
268 
269  return ret;
270 }
Octstr * group
Definition: meta_data.c:70
int octstr_str_case_compare(const Octstr *ostr, const char *str)
Definition: octstr.c:986
Dict * values
Definition: meta_data.c:71
struct meta_data * next
Definition: meta_data.c:72
Definition: dict.c:116
static void meta_data_destroy(struct meta_data *meta)
Definition: meta_data.c:89
static struct meta_data * meta_data_unpack(const Octstr *data)
Definition: meta_data.c:107

◆ meta_data_merge()

Octstr* meta_data_merge ( const Octstr data,
const Octstr new_data,
int  replace 
)

Merge two meta data strings into one

Definition at line 422 of file meta_data.c.

References dict_create(), dict_get(), dict_keys(), dict_put(), dict_put_once(), error(), meta_data::group, gwlist_consume(), gwlist_destroy(), meta_data_create(), meta_data_destroy(), meta_data_pack(), meta_data_unpack(), meta_data::next, octstr_compare(), octstr_create, octstr_destroy(), octstr_destroy_item(), octstr_duplicate, octstr_get_cstr, octstr_len(), and meta_data::values.

423 {
424  Octstr *ret = NULL;
425  struct meta_data *mdata, *new_mdata, *new_curr, *curr;
426 
427  if (octstr_len(data) < 1)
428  return octstr_duplicate(new_data);
429  if (octstr_len(new_data) < 1)
430  return octstr_duplicate(data);
431 
432  mdata = meta_data_unpack(data);
433  if (mdata == NULL) {
434  error(0, "meta_data_merge: Unable to parse data `%s'", octstr_get_cstr(data));
435  return octstr_duplicate(new_data);
436  }
437  new_mdata = meta_data_unpack(new_data);
438  if (new_mdata == NULL) {
439  meta_data_destroy(mdata);
440  error(0, "meta_data_merge: Unable to parse data `%s'", octstr_get_cstr(new_data));
441  return octstr_duplicate(data);
442  }
443  for (new_curr = new_mdata; new_curr != NULL; new_curr = new_curr->next) {
444  for (curr = mdata; curr != NULL; curr = curr->next) {
445  /* check group name */
446  if (octstr_compare(curr->group, new_curr->group) == 0) {
447  /* match */
448  List *keys;
449  Octstr *key;
450 
451  keys = dict_keys(new_curr->values);
452  while((key = gwlist_consume(keys)) != NULL) {
453  if (replace == 0) {
454  dict_put_once(curr->values, key, octstr_duplicate(dict_get(new_curr->values, key)));
455  } else {
456  /* remove if any */
457  dict_put(curr->values, key, NULL);
458  dict_put(curr->values, key, octstr_duplicate(dict_get(new_curr->values, key)));
459  }
460  octstr_destroy(key);
461  }
463  break; /* we found mdata group */
464  } else if (curr->next == NULL) {
465  /* do not match and this is last value -> add group */
466  curr->next = meta_data_create();
467  curr->next->group = octstr_duplicate(new_curr->group);
469  }
470  }
471  }
472  ret = octstr_create("");
473  if (meta_data_pack(mdata, ret) == -1) {
474  octstr_destroy(ret);
475  ret = NULL;
476  }
477  meta_data_destroy(new_mdata);
478  meta_data_destroy(mdata);
479 
480  return ret;
481 }
Dict * dict_create(long size_hint, void(*destroy_value)(void *))
Definition: dict.c:192
void error(int err, const char *fmt,...)
Definition: log.c:648
Octstr * group
Definition: meta_data.c:70
void dict_put(Dict *dict, Octstr *key, void *value)
Definition: dict.c:240
Dict * values
Definition: meta_data.c:71
struct meta_data * next
Definition: meta_data.c:72
#define octstr_get_cstr(ostr)
Definition: octstr.h:233
void * dict_get(Dict *dict, Octstr *key)
Definition: dict.c:286
#define octstr_duplicate(ostr)
Definition: octstr.h:187
static void meta_data_destroy(struct meta_data *meta)
Definition: meta_data.c:89
static struct meta_data * meta_data_create(void)
Definition: meta_data.c:76
void octstr_destroy(Octstr *ostr)
Definition: octstr.c:324
#define octstr_create(cstr)
Definition: octstr.h:125
void octstr_destroy_item(void *os)
Definition: octstr.c:336
long octstr_len(const Octstr *ostr)
Definition: octstr.c:342
Definition: octstr.c:118
static int meta_data_pack(struct meta_data *mdata, Octstr *data)
Definition: meta_data.c:224
void * gwlist_consume(List *list)
Definition: list.c:427
List * dict_keys(Dict *dict)
Definition: dict.c:347
int dict_put_once(Dict *dict, Octstr *key, void *value)
Definition: dict.c:271
static struct meta_data * meta_data_unpack(const Octstr *data)
Definition: meta_data.c:107
Definition: list.c:102
int octstr_compare(const Octstr *ostr1, const Octstr *ostr2)
Definition: octstr.c:871
void gwlist_destroy(List *list, gwlist_item_destructor_t *destructor)
Definition: list.c:145

◆ meta_data_pack()

static int meta_data_pack ( struct meta_data mdata,
Octstr data 
)
static

Definition at line 224 of file meta_data.c.

References dict_get(), dict_keys(), meta_data::group, gwlist_destroy(), gwlist_extract_first(), meta_data::next, octstr_delete(), octstr_destroy(), octstr_destroy_item(), octstr_format_append(), octstr_len(), and meta_data::values.

Referenced by meta_data_merge(), meta_data_remove_value(), meta_data_set_value(), and meta_data_set_values().

225 {
226  List *l;
227  Octstr *tmp;
228 
229  if (mdata == NULL || data == NULL)
230  return -1;
231  /* clear data */
232  octstr_delete(data, 0, octstr_len(data));
233  do {
234  octstr_format_append(data, "?%E?", mdata->group);
235  l = dict_keys(mdata->values);
236  while(l != NULL && (tmp = gwlist_extract_first(l)) != NULL) {
237  octstr_format_append(data, "%E=%E&", tmp, dict_get(mdata->values, tmp));
238  octstr_destroy(tmp);
239  }
241  mdata = mdata->next;
242  } while(mdata != NULL);
243 
244  return 0;
245 }
Octstr * group
Definition: meta_data.c:70
Dict * values
Definition: meta_data.c:71
struct meta_data * next
Definition: meta_data.c:72
void * gwlist_extract_first(List *list)
Definition: list.c:305
void * dict_get(Dict *dict, Octstr *key)
Definition: dict.c:286
void octstr_delete(Octstr *ostr1, long pos, long len)
Definition: octstr.c:1527
void octstr_destroy(Octstr *ostr)
Definition: octstr.c:324
void octstr_destroy_item(void *os)
Definition: octstr.c:336
long octstr_len(const Octstr *ostr)
Definition: octstr.c:342
Definition: octstr.c:118
void octstr_format_append(Octstr *os, const char *fmt,...)
Definition: octstr.c:2507
List * dict_keys(Dict *dict)
Definition: dict.c:347
Definition: list.c:102
void gwlist_destroy(List *list, gwlist_item_destructor_t *destructor)
Definition: list.c:145

◆ meta_data_remove_value()

int meta_data_remove_value ( Octstr data,
const char *  group,
const Octstr key 
)

Remove value for a given group and key.

Definition at line 392 of file meta_data.c.

References dict_put(), meta_data::group, meta_data_destroy(), meta_data_pack(), meta_data_unpack(), meta_data::next, octstr_str_case_compare(), and meta_data::values.

393 {
394  struct meta_data *mdata, *curr;
395  int ret = 0;
396 
397  if (data == NULL || group == NULL || key == NULL)
398  return -1;
399 
400  mdata = meta_data_unpack(data);
401  for (curr = mdata; curr != NULL; curr = curr->next) {
402  if (octstr_str_case_compare(curr->group, group) == 0)
403  break;
404  }
405  if (curr == NULL) {
406  meta_data_destroy(mdata);
407  return -1;
408  }
409 
410  /* delete value if any */
411  dict_put(curr->values, (Octstr *) key, NULL);
412 
413  /* pack it */
414  ret = meta_data_pack(mdata, data);
415 
416  meta_data_destroy(mdata);
417 
418  return ret;
419 }
Octstr * group
Definition: meta_data.c:70
int octstr_str_case_compare(const Octstr *ostr, const char *str)
Definition: octstr.c:986
void dict_put(Dict *dict, Octstr *key, void *value)
Definition: dict.c:240
Dict * values
Definition: meta_data.c:71
struct meta_data * next
Definition: meta_data.c:72
static void meta_data_destroy(struct meta_data *meta)
Definition: meta_data.c:89
Definition: octstr.c:118
static int meta_data_pack(struct meta_data *mdata, Octstr *data)
Definition: meta_data.c:224
static struct meta_data * meta_data_unpack(const Octstr *data)
Definition: meta_data.c:107

◆ meta_data_set_value()

int meta_data_set_value ( Octstr data,
const char *  group,
const Octstr key,
const Octstr value,
int  replace 
)

Set or replace value for a given group and key.

Definition at line 324 of file meta_data.c.

References dict_create(), dict_get(), dict_put(), meta_data::group, meta_data_create(), meta_data_destroy(), meta_data_pack(), meta_data_unpack(), meta_data::next, octstr_create, octstr_destroy_item(), octstr_duplicate, octstr_str_case_compare(), and meta_data::values.

Referenced by create_dlr_from_msg(), dlr_find(), generic_receive_sms(), handle_dlr(), and kannel_receive_sms().

325 {
326  struct meta_data *mdata, *curr;
327  int ret = 0;
328 
329  if (data == NULL || group == NULL || value == NULL)
330  return -1;
331 
332  mdata = meta_data_unpack(data);
333  for (curr = mdata; curr != NULL; curr = curr->next) {
334  if (octstr_str_case_compare(curr->group, group) == 0)
335  break;
336  }
337  if (curr == NULL) {
338  /* group doesn't exists */
339  curr = meta_data_create();
340  curr->group = octstr_create(group);
342  if (mdata != NULL) {
343  curr->next = mdata->next;
344  mdata->next = curr;
345  } else {
346  mdata = curr;
347  }
348  }
349  if (replace) {
350  /* delete old value if any */
351  dict_put(curr->values, (Octstr *) key, NULL);
352  /* put new value */
353  dict_put(curr->values, (Octstr *) key, octstr_duplicate(value));
354  } else if (dict_get(curr->values, (Octstr *) key) == NULL) {
355  /* put new value */
356  dict_put(curr->values, (Octstr *) key, octstr_duplicate(value));
357  }
358 
359  /* pack it */
360  ret = meta_data_pack(mdata, data);
361 
362  meta_data_destroy(mdata);
363 
364  return ret;
365 }
Dict * dict_create(long size_hint, void(*destroy_value)(void *))
Definition: dict.c:192
Octstr * group
Definition: meta_data.c:70
int octstr_str_case_compare(const Octstr *ostr, const char *str)
Definition: octstr.c:986
void dict_put(Dict *dict, Octstr *key, void *value)
Definition: dict.c:240
Dict * values
Definition: meta_data.c:71
struct meta_data * next
Definition: meta_data.c:72
void * dict_get(Dict *dict, Octstr *key)
Definition: dict.c:286
#define octstr_duplicate(ostr)
Definition: octstr.h:187
static void meta_data_destroy(struct meta_data *meta)
Definition: meta_data.c:89
static struct meta_data * meta_data_create(void)
Definition: meta_data.c:76
#define octstr_create(cstr)
Definition: octstr.h:125
void octstr_destroy_item(void *os)
Definition: octstr.c:336
Definition: octstr.c:118
static int meta_data_pack(struct meta_data *mdata, Octstr *data)
Definition: meta_data.c:224
static struct meta_data * meta_data_unpack(const Octstr *data)
Definition: meta_data.c:107

◆ meta_data_set_values()

int meta_data_set_values ( Octstr data,
const Dict dict,
const char *  group,
int  replace 
)

Replace Dictionary for the given group.

Definition at line 273 of file meta_data.c.

References dict_destroy(), dict_get(), dict_keys(), dict_put_once(), meta_data::group, gwlist_destroy(), gwlist_extract_first(), meta_data_create(), meta_data_destroy(), meta_data_pack(), meta_data_unpack(), meta_data::next, octstr_create, octstr_destroy(), octstr_destroy_item(), octstr_duplicate, octstr_str_case_compare(), and meta_data::values.

Referenced by data_sm_to_msg(), handle_pdu(), and pdu_to_msg().

274 {
275  struct meta_data *mdata, *curr;
276  int i;
277  List *keys;
278  Octstr *key;
279 
280  if (data == NULL || group == NULL)
281  return -1;
282 
283  mdata = meta_data_unpack(data);
284  for (curr = mdata; curr != NULL; curr = curr->next) {
285  if (octstr_str_case_compare(curr->group, group) == 0) {
286  /*
287  * If we don't replace the values, copy the old Dict values to the new Dict
288  */
289  if (replace == 0) {
290  keys = dict_keys(curr->values);
291  while((key = gwlist_extract_first(keys)) != NULL) {
292  dict_put_once((Dict*)dict, key, octstr_duplicate(dict_get(curr->values, key)));
293  octstr_destroy(key);
294  }
296  }
297  dict_destroy(curr->values);
298  curr->values = (Dict*)dict;
299  break;
300  }
301  }
302 
303  if (curr == NULL) {
304  curr = meta_data_create();
305  curr->group = octstr_create(group);
306  curr->values = (Dict*)dict;
307  curr->next = NULL;
308  if (mdata == NULL) {
309  mdata = curr;
310  } else {
311  curr->next = mdata->next;
312  mdata->next = curr;
313  }
314  }
315  i = meta_data_pack(mdata, data);
316  curr->values = NULL;
317 
318  meta_data_destroy(mdata);
319 
320  return i;
321 }
Octstr * group
Definition: meta_data.c:70
int octstr_str_case_compare(const Octstr *ostr, const char *str)
Definition: octstr.c:986
Dict * values
Definition: meta_data.c:71
struct meta_data * next
Definition: meta_data.c:72
void * gwlist_extract_first(List *list)
Definition: list.c:305
void * dict_get(Dict *dict, Octstr *key)
Definition: dict.c:286
Definition: dict.c:116
#define octstr_duplicate(ostr)
Definition: octstr.h:187
static void meta_data_destroy(struct meta_data *meta)
Definition: meta_data.c:89
static struct meta_data * meta_data_create(void)
Definition: meta_data.c:76
void octstr_destroy(Octstr *ostr)
Definition: octstr.c:324
#define octstr_create(cstr)
Definition: octstr.h:125
void octstr_destroy_item(void *os)
Definition: octstr.c:336
void dict_destroy(Dict *dict)
Definition: dict.c:215
Definition: octstr.c:118
static int meta_data_pack(struct meta_data *mdata, Octstr *data)
Definition: meta_data.c:224
List * dict_keys(Dict *dict)
Definition: dict.c:347
int dict_put_once(Dict *dict, Octstr *key, void *value)
Definition: dict.c:271
static struct meta_data * meta_data_unpack(const Octstr *data)
Definition: meta_data.c:107
Definition: list.c:102
void gwlist_destroy(List *list, gwlist_item_destructor_t *destructor)
Definition: list.c:145

◆ meta_data_unpack()

static struct meta_data* meta_data_unpack ( const Octstr data)
static

Definition at line 107 of file meta_data.c.

References debug(), dict_create(), dict_put(), error(), meta_data_destroy(), octstr_create, octstr_create_from_data, octstr_destroy(), octstr_destroy_item(), octstr_get_cstr, octstr_len(), octstr_url_decode(), start, and type.

Referenced by meta_data_get_value(), meta_data_get_values(), meta_data_merge(), meta_data_remove_value(), meta_data_set_value(), and meta_data_set_values().

108 {
109  struct meta_data *ret = NULL, *curr = NULL;
110  const char *str;
111  long pos;
112  Octstr *key = NULL;
113  int type, next_type;
114  long start, end;
115 
116  start = end = -1;
117  type = next_type = -1;
118  for (pos = 0, str = octstr_get_cstr(data); pos <= octstr_len(data); str++, pos++) {
119  switch(*str) {
120  case '?':
121  if (start == -1) { /* start of str */
122  start = pos;
123  type = 0;
124  } else if (type == 0) { /* end of group */
125  end = pos;
126  next_type = 1;
127  } else if (type == 2 && key != NULL) { /* end of value */
128  end = pos;
129  next_type = 0;
130  } else if (key == NULL) { /* start of next group without key and value */
131  start = pos;
132  type = 0;
133  } else {
134  /* FAILED */
135  error(0, "MDATA: Found '?' but not expected it end=%ld start=%ld type=%d.", end, start, type);
136  meta_data_destroy(ret);
137  octstr_destroy(key);
138  return NULL;
139  }
140  break;
141  case '=':
142  if (type == 1 && curr != NULL && key == NULL) { /* end of key */
143  end = pos;
144  next_type = 2;
145  } else {
146  /* FAILED */
147  error(0, "MDATA: Found '=' but not expected it end=%ld start=%ld type=%d.", end, start, type);
148  meta_data_destroy(ret);
149  octstr_destroy(key);
150  return NULL;
151  }
152  break;
153  case '&':
154  if (type == 2 && curr != NULL && key != NULL) { /* end of value */
155  end = pos;
156  next_type = 1;
157  } else if (type == 1 && key == NULL) { /* just & skip it */
158  start = pos;
159  } else {
160  /* FAILED */
161  error(0, "MDATA: Found '&' but not expected it end=%ld start=%ld type=%d.", end, start, type);
162  meta_data_destroy(ret);
163  octstr_destroy(key);
164  return NULL;
165  }
166  break;
167  case '\0':
168  if (type == 2) /* end of value */
169  end = pos;
170  break;
171  }
172  if (start >= 0 && end >= 0) {
173  Octstr *tmp;
174 
175  if (end - start - 1 == 0)
176  tmp = octstr_create("");
177  else
178  tmp = octstr_create_from_data(str - end + start + 1, end - start - 1);
179 
180  octstr_url_decode(tmp);
181 
182  switch(type) {
183  case 0: /* group */
184  if (curr == NULL) {
185  curr = gw_malloc(sizeof(*curr));
186  } else {
187  curr->next = gw_malloc(sizeof(*curr));
188  curr = curr->next;
189  }
190  curr->group = tmp;
191  tmp = NULL;
192  curr->values = dict_create(1024, octstr_destroy_item);
193  curr->next = NULL;
194  if (ret == NULL)
195  ret = curr;
196  debug("meta_data", 0, "new group created `%s'", octstr_get_cstr(curr->group));
197  break;
198  case 1: /* key */
199  key = tmp;
200  tmp = NULL;
201  break;
202  case 2: /* value */
203  debug("meta_data", 0, "group=`%s' key=`%s' value=`%s'", octstr_get_cstr(curr->group),
204  octstr_get_cstr(key), octstr_get_cstr(tmp));
205  dict_put(curr->values, key, tmp);
206  tmp = NULL;
207  octstr_destroy(key);
208  key = NULL;
209  break;
210  }
211  octstr_destroy(tmp);
212  type = next_type;
213  next_type = -1;
214  start = end;
215  end = -1;
216  }
217  }
218  octstr_destroy(key);
219 
220  return ret;
221 }
Dict * dict_create(long size_hint, void(*destroy_value)(void *))
Definition: dict.c:192
void error(int err, const char *fmt,...)
Definition: log.c:648
void dict_put(Dict *dict, Octstr *key, void *value)
Definition: dict.c:240
int octstr_url_decode(Octstr *ostr)
Definition: octstr.c:1746
int type
Definition: smsc_cimd2.c:215
#define octstr_get_cstr(ostr)
Definition: octstr.h:233
static void meta_data_destroy(struct meta_data *meta)
Definition: meta_data.c:89
void octstr_destroy(Octstr *ostr)
Definition: octstr.c:324
#define octstr_create(cstr)
Definition: octstr.h:125
void octstr_destroy_item(void *os)
Definition: octstr.c:336
long octstr_len(const Octstr *ostr)
Definition: octstr.c:342
Definition: octstr.c:118
void debug(const char *place, int err, const char *fmt,...)
Definition: log.c:726
#define octstr_create_from_data(data, len)
Definition: octstr.h:134
static int start
See file LICENSE for details about the license agreement for using, modifying, copying or deriving work from this software.