restructure
This commit is contained in:
@@ -124,12 +124,12 @@ heim_array_append_value(heim_array_t array, heim_object_t object)
|
|||||||
* Iterate over all objects in array
|
* Iterate over all objects in array
|
||||||
*
|
*
|
||||||
* @param array array to iterate over
|
* @param array array to iterate over
|
||||||
* @param fn function to call on each object
|
|
||||||
* @param ctx context passed to fn
|
* @param ctx context passed to fn
|
||||||
|
* @param fn function to call on each object
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void
|
void
|
||||||
heim_array_iterate_f(heim_array_t array, heim_array_iterator_f_t fn, void *ctx)
|
heim_array_iterate_f(heim_array_t array, void *ctx, heim_array_iterator_f_t fn)
|
||||||
{
|
{
|
||||||
size_t n;
|
size_t n;
|
||||||
for (n = 0; n < array->len; n++)
|
for (n = 0; n < array->len; n++)
|
||||||
@@ -178,11 +178,11 @@ heim_array_get_length(heim_array_t array)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
heim_object_t
|
heim_object_t
|
||||||
heim_array_copy_value(heim_array_t array, size_t idx)
|
heim_array_get_value(heim_array_t array, size_t idx)
|
||||||
{
|
{
|
||||||
if (idx >= array->len)
|
if (idx >= array->len)
|
||||||
heim_abort("index too large");
|
heim_abort("index too large");
|
||||||
return heim_retain(array->val[idx]);
|
return array->val[idx];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -138,6 +138,14 @@ heim_release(void *ptr)
|
|||||||
heim_abort("over release");
|
heim_abort("over release");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
_heim_make_permanent(heim_object_t ptr)
|
||||||
|
{
|
||||||
|
struct heim_base *p = PTR2BASE(ptr);
|
||||||
|
p->ref_cnt = heim_base_atomic_max;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static heim_type_t tagged_isa[9] = {
|
static heim_type_t tagged_isa[9] = {
|
||||||
&_heim_number_object,
|
&_heim_number_object,
|
||||||
&_heim_null_object,
|
&_heim_null_object,
|
||||||
|
@@ -122,13 +122,13 @@ heim_tid_t heim_array_get_type_id(void);
|
|||||||
typedef void (*heim_array_iterator_f_t)(heim_object_t, void *);
|
typedef void (*heim_array_iterator_f_t)(heim_object_t, void *);
|
||||||
|
|
||||||
int heim_array_append_value(heim_array_t, heim_object_t);
|
int heim_array_append_value(heim_array_t, heim_object_t);
|
||||||
void heim_array_iterate_f(heim_array_t, heim_array_iterator_f_t, void *);
|
void heim_array_iterate_f(heim_array_t, void *, heim_array_iterator_f_t);
|
||||||
#ifdef __BLOCKS__
|
#ifdef __BLOCKS__
|
||||||
void heim_array_iterate(heim_array_t, void (^)(heim_object_t));
|
void heim_array_iterate(heim_array_t, void (^)(heim_object_t));
|
||||||
#endif
|
#endif
|
||||||
size_t heim_array_get_length(heim_array_t);
|
size_t heim_array_get_length(heim_array_t);
|
||||||
heim_object_t
|
heim_object_t
|
||||||
heim_array_copy_value(heim_array_t, size_t);
|
heim_array_get_value(heim_array_t, size_t);
|
||||||
void heim_array_delete_value(heim_array_t, size_t);
|
void heim_array_delete_value(heim_array_t, size_t);
|
||||||
#ifdef __BLOCKS__
|
#ifdef __BLOCKS__
|
||||||
void heim_array_filter(heim_array_t, int (^)(heim_object_t));
|
void heim_array_filter(heim_array_t, int (^)(heim_object_t));
|
||||||
@@ -166,6 +166,9 @@ heim_string_t heim_string_create_with_bytes(const void *, size_t);
|
|||||||
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);
|
||||||
|
|
||||||
|
#define HSTR(_str) (__heim_string_constant("" _str ""))
|
||||||
|
heim_string_t __heim_string_constant(const char *);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Number
|
* Number
|
||||||
*/
|
*/
|
||||||
|
@@ -85,6 +85,9 @@ _heim_alloc_object(heim_type_t type, size_t size);
|
|||||||
heim_tid_t
|
heim_tid_t
|
||||||
_heim_type_get_tid(heim_type_t type);
|
_heim_type_get_tid(heim_type_t type);
|
||||||
|
|
||||||
|
void
|
||||||
|
_heim_make_permanent(heim_object_t ptr);
|
||||||
|
|
||||||
/* tagged tid */
|
/* tagged tid */
|
||||||
extern struct heim_type_data _heim_null_object;
|
extern struct heim_type_data _heim_null_object;
|
||||||
extern struct heim_type_data _heim_bool_object;
|
extern struct heim_type_data _heim_bool_object;
|
||||||
|
@@ -120,3 +120,40 @@ heim_string_get_utf8(heim_string_t string)
|
|||||||
{
|
{
|
||||||
return (const char *)string;
|
return (const char *)string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void
|
||||||
|
init_string(void *ptr)
|
||||||
|
{
|
||||||
|
heim_dict_t *dict = ptr;
|
||||||
|
*dict = heim_dict_create(101);
|
||||||
|
heim_assert(*dict != NULL, "__heim_string_constant");
|
||||||
|
}
|
||||||
|
|
||||||
|
heim_string_t
|
||||||
|
__heim_string_constant(const char *_str)
|
||||||
|
{
|
||||||
|
static HEIMDAL_MUTEX mutex = HEIMDAL_MUTEX_INITIALIZER;
|
||||||
|
static heim_base_once_t once;
|
||||||
|
static heim_dict_t dict = NULL;
|
||||||
|
heim_string_t s, s2;
|
||||||
|
|
||||||
|
heim_base_once_f(&once, &dict, init_string);
|
||||||
|
s = heim_string_create(_str);
|
||||||
|
|
||||||
|
HEIMDAL_MUTEX_lock(&mutex);
|
||||||
|
s2 = heim_dict_get_value(dict, s);
|
||||||
|
if (s2) {
|
||||||
|
heim_release(s);
|
||||||
|
s = s2;
|
||||||
|
} else {
|
||||||
|
_heim_make_permanent(s);
|
||||||
|
heim_dict_set_value(dict, s, s);
|
||||||
|
}
|
||||||
|
HEIMDAL_MUTEX_unlock(&mutex);
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
@@ -3,7 +3,7 @@ HEIMDAL_BASE_1.0 {
|
|||||||
heim_abort;
|
heim_abort;
|
||||||
heim_alloc;
|
heim_alloc;
|
||||||
heim_array_append_value;
|
heim_array_append_value;
|
||||||
heim_array_copy_value;
|
heim_array_get_value;
|
||||||
heim_array_create;
|
heim_array_create;
|
||||||
heim_array_delete_value;
|
heim_array_delete_value;
|
||||||
heim_array_get_length;
|
heim_array_get_length;
|
||||||
|
@@ -623,7 +623,7 @@ _krb5_plugin_run_f(krb5_context context,
|
|||||||
|
|
||||||
s.ret = KRB5_PLUGIN_NO_HANDLE;
|
s.ret = KRB5_PLUGIN_NO_HANDLE;
|
||||||
|
|
||||||
heim_array_iterate_f(s.result, eval_results, &s);
|
heim_array_iterate_f(s.result, &s, eval_results);
|
||||||
|
|
||||||
heim_release(s.result);
|
heim_release(s.result);
|
||||||
heim_release(s.n);
|
heim_release(s.n);
|
||||||
|
Reference in New Issue
Block a user