#include <errno.h>
#include <inttypes.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <talloc.h>
#include <atalk/errchk.h>
#include <atalk/util.h>
#include <atalk/logger.h>
#include <atalk/dalloc.h>
Functions | |
int | dalloc_add_talloc_chunk (DALLOC_CTX *dd, void *talloc_chunk, void *obj, size_t size) |
void * | dalloc_get (const DALLOC_CTX *d,...) |
void * | dalloc_value_for_key (const DALLOC_CTX *d,...) |
char * | dalloc_strdup (const void *ctx, const char *string) |
char * | dalloc_strndup (const void *ctx, const char *string, size_t n) |
Typesafe, dynamic object store based on talloc
Usage:
Define some terminal types:
A key/value store aka dictionary that supports retrieving elements by key typedef dict_t DALLOC_CTX;
An ordered set that can store different objects which can be retrieved by number typedef set_t DALLOC_CTX;
Create an dalloc object and add elementes of different type
Allocate a new talloc context TALLOC_CTX *mem_ctx = talloc_new(NULL); Create a new dalloc object DALLOC_CTX *d = talloc_zero(mem_ctx, DALLOC_CTX);
Store an int value in the object uint64_t i = 1; dalloc_add_copy(d, &i, uint64_t);
Store a string char *str = dalloc_strdup(d, "hello world"); dalloc_add(d, str, char *);
Add a nested object, you later can't fetch this directly DALLOC_CTX *nested = talloc_zero(d, DALLOC_CTX); dalloc_add(d, nested, DALLOC_CTX);
Add an int value to the nested object, this can be fetched i = 2; dalloc_add_copy(nested, &i, uint64_t);
Add a nested set set_t *set = talloc_zero(nested, set_t); dalloc_add(nested, set, set_t);
Add an int value to the set i = 3; dalloc_add_copy(set, &i, uint64_t);
Add a dictionary (key/value store) dict_t *dict = talloc_zero(nested, dict_t); dalloc_add(nested, dict, dict_t);
Store a string as key in the dict str = dalloc_strdup(d, "key"); dalloc_add(dict, str, char *);
Add a value for the key i = 4; dalloc_add_copy(dict, &i, uint64_t);
Fetching value references
You can fetch anything that is not a DALLOC_CTXs, because passing "DALLOC_CTXs" as type to the functions dalloc_get() and dalloc_value_for_key() tells the function to step into that object and expect more arguments that specify which element to fetch.
Get reference to an objects element by position uint64_t *p = dalloc_get(d, "uint64_t", 0); p now points to the first int with a value of 1
Get reference to the "hello world" string str = dalloc_get(d, "char *", 1);
You can't fetch a pure DALLOC_CTX nested = dalloc_get(d, "DALLOC_CTX", 2); But you can do this p = dalloc_get(d, "DALLOC_CTX", 2, "uint64_t", 0); p now points to the value 2
You can fetch types that are typedefd DALLOC_CTXs set = dalloc_get(d, "DALLOC_CTX", 2, "set_t", 1);
Fetch int from set, note that you must use DALLOC_CTX as type for the set p = dalloc_get(d, "DALLOC_CTX", 2, "DALLOC_CTX", 1, "uint64_t", 0); p points to 3
Fetch value by key from dictionary p = dalloc_value_for_key(d, "DALLOC_CTX", 2, "DALLOC_CTX", 2, "key"); p now point to 4
int dalloc_add_talloc_chunk | ( | DALLOC_CTX * | dd, |
void * | talloc_chunk, | ||
void * | obj, | ||
size_t | size ) |
void * dalloc_get | ( | const DALLOC_CTX * | d, |
... ) |
char * dalloc_strdup | ( | const void * | ctx, |
const char * | string ) |
char * dalloc_strndup | ( | const void * | ctx, |
const char * | string, | ||
size_t | n ) |
void * dalloc_value_for_key | ( | const DALLOC_CTX * | d, |
... ) |