netatalk: dalloc.c File Reference

netatalk 4.5.0
Free and Open Source Apple Filing Protocol (AFP) Server
Loading...
Searching...
No Matches
dalloc.c File Reference

Typesafe, dynamic object store based on talloc. More...

`#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,...)
| Get pointer to value from a DALLOC object.
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)

## Detailed Description

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;
DALLOC_CTX
Definition dalloc.h:25

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);
NULL
#define NULL
Definition utf8util.c:47

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);
dalloc_add_copy
#define dalloc_add_copy(d, obj, type)
Definition dalloc.h:33

Store a string

char *str = dalloc_strdup(d, "hello world");
dalloc_add(d, str, char *);
dalloc_add
#define dalloc_add(d, obj, type)
Definition dalloc.h:34
dalloc_strdup
char * dalloc_strdup(const void *ctx, const char *string)
Definition dalloc.c:295

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);
dalloc_get
void * dalloc_get(const DALLOC_CTX *d,...)
Get pointer to value from a DALLOC object.
Definition dalloc.c:199
p
size_t p
Definition dircache.c:256

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");
dalloc_value_for_key
void * dalloc_value_for_key(const DALLOC_CTX *d,...)
Definition dalloc.c:245

p now point to 4

## Function Documentation

## ◆ dalloc_add_talloc_chunk()

int dalloc_add_talloc_chunk | ( | DALLOC_CTX * | dd,
|  | void * | talloc_chunk,
|  | void * | obj,
|  | size_t | size )

Use dalloc_add_copy() macro, not this function

## ◆ dalloc_get()

void * dalloc_get | ( | const DALLOC_CTX * | d,
|  |  | ... )

Get pointer to value from a DALLOC object.

Returns pointer to object from a DALLOC object. Nested object interation is supported by using the type string "DALLOC_CTX". Any other type string designates the requested objects type.

## ◆ dalloc_strdup()

char * dalloc_strdup | ( | const void * | ctx,
|  | const char * | string )

## ◆ dalloc_strndup()

char * dalloc_strndup | ( | const void * | ctx,
|  | const char * | string,
|  | size_t | n )

## ◆ dalloc_value_for_key()

void * dalloc_value_for_key | ( | const DALLOC_CTX * | d,
|  |  | ... )