add description

This commit is contained in:
Love Hörnquist Åstrand
2012-03-20 20:12:40 -07:00
parent 67d9094665
commit 497eb5a4a4
12 changed files with 89 additions and 10 deletions

View File

@@ -63,6 +63,7 @@ struct heim_type_data array_object = {
array_dealloc, array_dealloc,
NULL, NULL,
NULL, NULL,
NULL,
NULL NULL
}; };

View File

@@ -42,6 +42,7 @@ struct heim_type_data _heim_bool_object = {
NULL, NULL,
NULL, NULL,
NULL, NULL,
NULL,
NULL NULL
}; };

View File

@@ -80,7 +80,8 @@ struct heim_type_data _heim_data_object = {
data_dealloc, data_dealloc,
NULL, NULL,
data_cmp, data_cmp,
data_hash data_hash,
NULL
}; };
/** /**

View File

@@ -94,6 +94,7 @@ struct heim_type_data db_object = {
db_dealloc, db_dealloc,
NULL, NULL,
NULL, NULL,
NULL,
NULL NULL
}; };

View File

@@ -71,6 +71,7 @@ struct heim_type_data dict_object = {
dict_dealloc, dict_dealloc,
NULL, NULL,
NULL, NULL,
NULL,
NULL NULL
}; };

View File

@@ -72,7 +72,8 @@ struct heim_type_data _heim_error_object = {
error_dealloc, error_dealloc,
NULL, NULL,
error_cmp, error_cmp,
error_hash error_hash,
NULL
}; };
heim_error_t heim_error_t

View File

@@ -138,6 +138,20 @@ heim_release(void *ptr)
heim_abort("over release"); heim_abort("over release");
} }
/**
* If used require wrapped in autorelease pool
*/
heim_string_t
heim_description(heim_object_t ptr)
{
struct heim_base *p = PTR2BASE(ptr);
if (p->isa->desc == NULL)
return heim_auto_release(heim_string_ref_create(p->isa->name, NULL));
return heim_auto_release(p->isa->desc(ptr));
}
void void
_heim_make_permanent(heim_object_t ptr) _heim_make_permanent(heim_object_t ptr)
{ {
@@ -254,6 +268,7 @@ struct heim_type_data memory_object = {
memory_dealloc, memory_dealloc,
NULL, NULL,
NULL, NULL,
NULL,
NULL NULL
}; };
@@ -290,7 +305,8 @@ _heim_create_type(const char *name,
heim_type_dealloc dealloc, heim_type_dealloc dealloc,
heim_type_copy copy, heim_type_copy copy,
heim_type_cmp cmp, heim_type_cmp cmp,
heim_type_hash hash) heim_type_hash hash,
heim_type_description desc)
{ {
heim_type_t type; heim_type_t type;
@@ -305,6 +321,7 @@ _heim_create_type(const char *name,
type->copy = copy; type->copy = copy;
type->cmp = cmp; type->cmp = cmp;
type->hash = hash; type->hash = hash;
type->desc = desc;
return type; return type;
} }
@@ -509,7 +526,8 @@ static struct heim_type_data _heim_autorel_object = {
autorel_dealloc, autorel_dealloc,
NULL, NULL,
autorel_cmp, autorel_cmp,
autorel_hash autorel_hash,
NULL
}; };
/** /**
@@ -548,7 +566,7 @@ heim_auto_release_create(void)
* @param ptr object * @param ptr object
*/ */
void heim_object_t
heim_auto_release(heim_object_t ptr) heim_auto_release(heim_object_t ptr)
{ {
struct heim_base *p = PTR2BASE(ptr); struct heim_base *p = PTR2BASE(ptr);
@@ -556,7 +574,7 @@ heim_auto_release(heim_object_t ptr)
heim_auto_release_t ar; heim_auto_release_t ar;
if (ptr == NULL || heim_base_is_tagged(ptr)) if (ptr == NULL || heim_base_is_tagged(ptr))
return; return ptr;
/* drop from old pool */ /* drop from old pool */
if ((ar = p->autorelpool) != NULL) { if ((ar = p->autorelpool) != NULL) {
@@ -573,6 +591,8 @@ heim_auto_release(heim_object_t ptr)
HEIM_TAILQ_INSERT_HEAD(&ar->pool, p, autorel); HEIM_TAILQ_INSERT_HEAD(&ar->pool, p, autorel);
p->autorelpool = ar; p->autorelpool = ar;
HEIMDAL_MUTEX_unlock(&ar->pool_mutex); HEIMDAL_MUTEX_unlock(&ar->pool_mutex);
return ptr;
} }
/** /**

View File

@@ -177,6 +177,7 @@ heim_string_t heim_string_ref_create(const char *, heim_string_free_f_t);
heim_string_t heim_string_create_with_bytes(const void *, size_t); heim_string_t heim_string_create_with_bytes(const void *, size_t);
heim_string_t heim_string_ref_create_with_bytes(const void *, size_t, heim_string_t heim_string_ref_create_with_bytes(const void *, size_t,
heim_string_free_f_t); heim_string_free_f_t);
heim_string_t heim_string_create_with_format(const char *, ...);
heim_tid_t heim_string_get_type_id(void); heim_tid_t heim_string_get_type_id(void);
const char * heim_string_get_utf8(heim_string_t); const char * heim_string_get_utf8(heim_string_t);
@@ -336,7 +337,7 @@ typedef struct heim_auto_release * heim_auto_release_t;
heim_auto_release_t heim_auto_release_create(void); heim_auto_release_t heim_auto_release_create(void);
void heim_auto_release_drain(heim_auto_release_t); void heim_auto_release_drain(heim_auto_release_t);
void heim_auto_release(heim_object_t); heim_object_t heim_auto_release(heim_object_t);
/* /*
* JSON * JSON
@@ -362,6 +363,13 @@ heim_string_t heim_serialize(heim_object_t, heim_json_flags_t flags,
heim_error_t *); heim_error_t *);
/*
* Debug
*/
heim_string_t
heim_description(heim_object_t ptr);
/* /*
* Binary search. * Binary search.
* *

View File

@@ -37,6 +37,7 @@ typedef void (*heim_type_init)(void *);
typedef heim_object_t (*heim_type_copy)(void *); typedef heim_object_t (*heim_type_copy)(void *);
typedef int (*heim_type_cmp)(void *, void *); typedef int (*heim_type_cmp)(void *, void *);
typedef unsigned long (*heim_type_hash)(void *); typedef unsigned long (*heim_type_hash)(void *);
typedef heim_string_t (*heim_type_description)(void *);
typedef struct heim_type_data *heim_type_t; typedef struct heim_type_data *heim_type_t;
@@ -69,6 +70,7 @@ struct heim_type_data {
heim_type_copy copy; heim_type_copy copy;
heim_type_cmp cmp; heim_type_cmp cmp;
heim_type_hash hash; heim_type_hash hash;
heim_type_description desc;
}; };
heim_type_t _heim_get_isa(heim_object_t); heim_type_t _heim_get_isa(heim_object_t);
@@ -79,7 +81,8 @@ _heim_create_type(const char *name,
heim_type_dealloc dealloc, heim_type_dealloc dealloc,
heim_type_copy copy, heim_type_copy copy,
heim_type_cmp cmp, heim_type_cmp cmp,
heim_type_hash hash); heim_type_hash hash,
heim_type_description desc);
heim_object_t heim_object_t
_heim_alloc_object(heim_type_t type, size_t size); _heim_alloc_object(heim_type_t type, size_t size);

View File

@@ -42,6 +42,7 @@ struct heim_type_data _heim_null_object = {
NULL, NULL,
NULL, NULL,
NULL, NULL,
NULL,
NULL NULL
}; };

View File

@@ -73,7 +73,8 @@ struct heim_type_data _heim_number_object = {
number_dealloc, number_dealloc,
NULL, NULL,
number_cmp, number_cmp,
number_hash number_hash,
NULL
}; };
/** /**

View File

@@ -91,7 +91,8 @@ struct heim_type_data _heim_string_object = {
string_dealloc, string_dealloc,
NULL, NULL,
string_cmp, string_cmp,
string_hash string_hash,
NULL
}; };
/** /**
@@ -158,6 +159,45 @@ heim_string_create_with_bytes(const void *data, size_t len)
return s; return s;
} }
/*
*
*/
static void
string_free(void *ptr)
{
free(ptr);
}
/**
* Create a string object using a format string
*
* @param fmt format string
* @param ...
*
* @return string object
*/
heim_string_t
heim_string_create_with_format(const char *fmt, ...)
{
heim_string_t s;
char *str = NULL;
va_list ap;
int ret;
va_start(ap, fmt);
ret = vasprintf(&str, fmt, ap);
va_end(ap);
if (ret < 0 || str == NULL)
return NULL;
s = heim_string_ref_create(str, string_dealloc);
if (s == NULL)
free(str);
return s;
}
/** /**
* Return the type ID of string objects * Return the type ID of string objects
* *