2002-12-02 15:39:26 -08:00
|
|
|
#include "Eet.h"
|
2003-02-02 17:07:58 -08:00
|
|
|
#include "Eet_private.h"
|
2002-12-02 15:39:26 -08:00
|
|
|
|
|
|
|
/*
|
2006-12-15 12:16:29 -08:00
|
|
|
* routines for doing data -> struct and struct -> data conversion
|
2005-05-22 21:32:04 -07:00
|
|
|
*
|
2002-12-02 15:39:26 -08:00
|
|
|
* types:
|
2005-05-22 21:32:04 -07:00
|
|
|
*
|
2002-12-02 15:39:26 -08:00
|
|
|
* basic types:
|
|
|
|
* a sequence of...
|
2005-05-22 21:32:04 -07:00
|
|
|
*
|
2002-12-02 15:39:26 -08:00
|
|
|
* char
|
|
|
|
* short
|
|
|
|
* int
|
|
|
|
* long long
|
|
|
|
* float
|
|
|
|
* double
|
|
|
|
* unsigned char
|
|
|
|
* unsigned short
|
|
|
|
* unsigned int
|
|
|
|
* unsgined long long
|
|
|
|
* string
|
2005-05-22 21:32:04 -07:00
|
|
|
*
|
2002-12-02 15:39:26 -08:00
|
|
|
* groupings:
|
|
|
|
* multiple entries ordered as...
|
2005-05-22 21:32:04 -07:00
|
|
|
*
|
2002-12-02 15:39:26 -08:00
|
|
|
* fixed size array [ of basic types ]
|
|
|
|
* variable size array [ of basic types ]
|
|
|
|
* linked list [ of basic types ]
|
|
|
|
* hash table [ of basic types ]
|
2005-05-22 21:32:04 -07:00
|
|
|
*
|
2002-12-02 15:39:26 -08:00
|
|
|
* need to provide builder/accessor funcs for:
|
2005-05-22 21:32:04 -07:00
|
|
|
*
|
2002-12-02 15:39:26 -08:00
|
|
|
* list_next
|
|
|
|
* list_append
|
2005-05-22 21:32:04 -07:00
|
|
|
*
|
2002-12-02 15:39:26 -08:00
|
|
|
* hash_foreach
|
|
|
|
* hash_add
|
2005-05-22 21:32:04 -07:00
|
|
|
*
|
2002-12-02 15:39:26 -08:00
|
|
|
*/
|
|
|
|
|
|
|
|
/*---*/
|
|
|
|
|
|
|
|
typedef struct _Eet_Data_Element Eet_Data_Element;
|
|
|
|
typedef struct _Eet_Data_Basic_Type_Decoder Eet_Data_Basic_Type_Decoder;
|
|
|
|
typedef struct _Eet_Data_Chunk Eet_Data_Chunk;
|
|
|
|
typedef struct _Eet_Data_Stream Eet_Data_Stream;
|
2005-05-25 20:57:57 -07:00
|
|
|
typedef struct _Eet_Data_Descriptor_Hash Eet_Data_Descriptor_Hash;
|
2002-12-02 15:39:26 -08:00
|
|
|
|
|
|
|
/*---*/
|
|
|
|
|
|
|
|
struct _Eet_Data_Basic_Type_Decoder
|
|
|
|
{
|
|
|
|
int size;
|
|
|
|
int (*get) (void *src, void *src_end, void *dest);
|
|
|
|
void *(*put) (void *src, int *size_ret);
|
|
|
|
};
|
|
|
|
|
|
|
|
struct _Eet_Data_Chunk
|
|
|
|
{
|
|
|
|
char *name;
|
|
|
|
int size;
|
|
|
|
void *data;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct _Eet_Data_Stream
|
|
|
|
{
|
|
|
|
void *data;
|
|
|
|
int size;
|
|
|
|
int pos;
|
|
|
|
};
|
|
|
|
|
2005-05-25 20:57:57 -07:00
|
|
|
struct _Eet_Data_Descriptor_Hash
|
|
|
|
{
|
|
|
|
Eet_Data_Element *element;
|
|
|
|
Eet_Data_Descriptor_Hash *next;
|
|
|
|
};
|
|
|
|
|
2002-12-02 15:39:26 -08:00
|
|
|
struct _Eet_Data_Descriptor
|
|
|
|
{
|
2005-11-29 03:32:10 -08:00
|
|
|
const char *name;
|
2002-12-02 15:39:26 -08:00
|
|
|
int size;
|
|
|
|
struct {
|
2005-11-30 07:36:19 -08:00
|
|
|
void *(*mem_alloc) (size_t size);
|
|
|
|
void (*mem_free) (void *mem);
|
|
|
|
char *(*str_alloc) (const char *str);
|
|
|
|
void (*str_free) (const char *str);
|
2002-12-02 15:39:26 -08:00
|
|
|
void *(*list_next) (void *l);
|
|
|
|
void *(*list_append) (void *l, void *d);
|
|
|
|
void *(*list_data) (void *l);
|
2003-07-07 00:52:20 -07:00
|
|
|
void *(*list_free) (void *l);
|
2002-12-02 15:39:26 -08:00
|
|
|
void (*hash_foreach) (void *h, int (*func) (void *h, const char *k, void *dt, void *fdt), void *fdt);
|
|
|
|
void *(*hash_add) (void *h, const char *k, void *d);
|
2003-07-07 00:52:20 -07:00
|
|
|
void (*hash_free) (void *h);
|
2002-12-02 15:39:26 -08:00
|
|
|
} func;
|
|
|
|
struct {
|
|
|
|
int num;
|
|
|
|
Eet_Data_Element *set;
|
2005-05-25 20:57:57 -07:00
|
|
|
struct {
|
|
|
|
int size;
|
|
|
|
Eet_Data_Descriptor_Hash *buckets;
|
|
|
|
} hash;
|
2002-12-02 15:39:26 -08:00
|
|
|
} elements;
|
2005-11-27 08:06:55 -08:00
|
|
|
// char *strings;
|
|
|
|
// int strings_len;
|
2002-12-02 15:39:26 -08:00
|
|
|
};
|
|
|
|
|
|
|
|
struct _Eet_Data_Element
|
|
|
|
{
|
2005-11-29 03:32:10 -08:00
|
|
|
const char *name;
|
2002-12-02 15:39:26 -08:00
|
|
|
int type;
|
|
|
|
int group_type;
|
|
|
|
int offset;
|
|
|
|
int count;
|
2005-11-29 03:32:10 -08:00
|
|
|
const char *counter_name;
|
2002-12-02 15:39:26 -08:00
|
|
|
Eet_Data_Descriptor *subtype;
|
|
|
|
};
|
|
|
|
|
|
|
|
/*---*/
|
|
|
|
|
|
|
|
static int eet_data_get_char(void *src, void *src_end, void *dest);
|
|
|
|
static void *eet_data_put_char(void *src, int *size_ret);
|
|
|
|
static int eet_data_get_short(void *src, void *src_end, void *dest);
|
|
|
|
static void *eet_data_put_short(void *src, int *size_ret);
|
|
|
|
static int eet_data_get_int(void *src, void *src_end, void *dest);
|
|
|
|
static void *eet_data_put_int(void *src, int *size_ret);
|
|
|
|
static int eet_data_get_long_long(void *src, void *src_end, void *dest);
|
|
|
|
static void *eet_data_put_long_long(void *src, int *size_ret);
|
|
|
|
static int eet_data_get_float(void *src, void *src_end, void *dest);
|
|
|
|
static void *eet_data_put_float(void *src, int *size_ret);
|
|
|
|
static int eet_data_get_double(void *src, void *src_end, void *dest);
|
|
|
|
static void *eet_data_put_double(void *src, int *size_ret);
|
|
|
|
static int eet_data_get_string(void *src, void *src_end, void *dest);
|
|
|
|
static void *eet_data_put_string(void *src, int *size_ret);
|
|
|
|
|
|
|
|
static int eet_data_get_type(int type, void *src, void *src_end, void *dest);
|
|
|
|
static void *eet_data_put_type(int type, void *src, int *size_ret);
|
|
|
|
|
2006-03-03 18:46:24 -08:00
|
|
|
static void eet_data_chunk_get(Eet_Data_Chunk *chnk, const void *src, int size);
|
2005-11-29 03:32:10 -08:00
|
|
|
static Eet_Data_Chunk *eet_data_chunk_new(void *data, int size, const char *name);
|
2002-12-02 15:39:26 -08:00
|
|
|
static void eet_data_chunk_free(Eet_Data_Chunk *chnk);
|
|
|
|
|
|
|
|
static Eet_Data_Stream *eet_data_stream_new(void);
|
2006-11-05 04:14:08 -08:00
|
|
|
static void eet_data_stream_write(Eet_Data_Stream *ds, const void *data, int size);
|
2002-12-02 15:39:26 -08:00
|
|
|
static void eet_data_stream_free(Eet_Data_Stream *ds);
|
|
|
|
|
|
|
|
static void eet_data_chunk_put(Eet_Data_Chunk *chnk, Eet_Data_Stream *ds);
|
|
|
|
|
|
|
|
/*---*/
|
|
|
|
|
2005-05-22 21:32:04 -07:00
|
|
|
const Eet_Data_Basic_Type_Decoder eet_coder[] =
|
2002-12-02 15:39:26 -08:00
|
|
|
{
|
|
|
|
{sizeof(char), eet_data_get_char, eet_data_put_char },
|
|
|
|
{sizeof(short), eet_data_get_short, eet_data_put_short },
|
|
|
|
{sizeof(int), eet_data_get_int, eet_data_put_int },
|
|
|
|
{sizeof(long long), eet_data_get_long_long, eet_data_put_long_long},
|
|
|
|
{sizeof(float), eet_data_get_float, eet_data_put_float },
|
|
|
|
{sizeof(double), eet_data_get_double, eet_data_put_double },
|
|
|
|
{sizeof(char), eet_data_get_char, eet_data_put_char },
|
|
|
|
{sizeof(short), eet_data_get_short, eet_data_put_short },
|
|
|
|
{sizeof(int), eet_data_get_int, eet_data_put_int },
|
|
|
|
{sizeof(long long), eet_data_get_long_long, eet_data_put_long_long},
|
|
|
|
{sizeof(char *), eet_data_get_string, eet_data_put_string }
|
|
|
|
};
|
|
|
|
|
|
|
|
static int words_bigendian = -1;
|
|
|
|
|
|
|
|
/*---*/
|
|
|
|
|
2004-04-28 18:32:35 -07:00
|
|
|
#define SWAP64(x) (x) = \
|
2004-07-13 11:23:16 -07:00
|
|
|
((((unsigned long long)(x) & 0x00000000000000ffULL ) << 56) |\
|
|
|
|
(((unsigned long long)(x) & 0x000000000000ff00ULL ) << 40) |\
|
|
|
|
(((unsigned long long)(x) & 0x0000000000ff0000ULL ) << 24) |\
|
|
|
|
(((unsigned long long)(x) & 0x00000000ff000000ULL ) << 8) |\
|
|
|
|
(((unsigned long long)(x) & 0x000000ff00000000ULL ) >> 8) |\
|
|
|
|
(((unsigned long long)(x) & 0x0000ff0000000000ULL ) >> 24) |\
|
|
|
|
(((unsigned long long)(x) & 0x00ff000000000000ULL ) >> 40) |\
|
|
|
|
(((unsigned long long)(x) & 0xff00000000000000ULL ) >> 56))
|
2004-04-28 18:32:35 -07:00
|
|
|
#define SWAP32(x) (x) = \
|
2004-04-20 23:38:37 -07:00
|
|
|
((((int)(x) & 0x000000ff ) << 24) |\
|
|
|
|
(((int)(x) & 0x0000ff00 ) << 8) |\
|
|
|
|
(((int)(x) & 0x00ff0000 ) >> 8) |\
|
|
|
|
(((int)(x) & 0xff000000 ) >> 24))
|
2004-04-28 18:32:35 -07:00
|
|
|
#define SWAP16(x) (x) = \
|
2004-04-20 23:38:37 -07:00
|
|
|
((((short)(x) & 0x00ff ) << 8) |\
|
|
|
|
(((short)(x) & 0xff00 ) >> 8))
|
2002-12-02 15:39:26 -08:00
|
|
|
|
|
|
|
#define CONV8(x)
|
|
|
|
#define CONV16(x) {if (words_bigendian) SWAP16(x);}
|
|
|
|
#define CONV32(x) {if (words_bigendian) SWAP32(x);}
|
|
|
|
#define CONV64(x) {if (words_bigendian) SWAP64(x);}
|
|
|
|
|
|
|
|
/*---*/
|
|
|
|
|
|
|
|
/* CHAR TYPE */
|
|
|
|
static int
|
|
|
|
eet_data_get_char(void *src, void *src_end, void *dst)
|
|
|
|
{
|
|
|
|
char *s, *d;
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2004-04-28 18:32:35 -07:00
|
|
|
if (((char *)src + sizeof(char)) > (char *)src_end) return -1;
|
2002-12-02 15:39:26 -08:00
|
|
|
s = (char *)src;
|
|
|
|
d = (char *)dst;
|
2002-12-20 14:00:44 -08:00
|
|
|
*d = *s;
|
|
|
|
CONV8(*d);
|
2002-12-02 15:39:26 -08:00
|
|
|
return sizeof(char);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void *
|
|
|
|
eet_data_put_char(void *src, int *size_ret)
|
|
|
|
{
|
|
|
|
char *s, *d;
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2002-12-02 15:39:26 -08:00
|
|
|
d = (char *)malloc(sizeof(char));
|
|
|
|
if (!d) return NULL;
|
|
|
|
s = (char *)src;
|
|
|
|
*d = *s;
|
|
|
|
CONV8(*d);
|
|
|
|
*size_ret = sizeof(char);
|
|
|
|
return d;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* SHORT TYPE */
|
|
|
|
static int
|
|
|
|
eet_data_get_short(void *src, void *src_end, void *dst)
|
|
|
|
{
|
2003-07-10 16:18:42 -07:00
|
|
|
short *d;
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2004-04-28 18:32:35 -07:00
|
|
|
if (((char *)src + sizeof(short)) > (char *)src_end) return -1;
|
2003-07-10 16:18:42 -07:00
|
|
|
memcpy(dst, src, sizeof(short));
|
2002-12-02 15:39:26 -08:00
|
|
|
d = (short *)dst;
|
|
|
|
CONV16(*d);
|
|
|
|
return sizeof(short);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void *
|
|
|
|
eet_data_put_short(void *src, int *size_ret)
|
|
|
|
{
|
|
|
|
short *s, *d;
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2002-12-02 15:39:26 -08:00
|
|
|
d = (short *)malloc(sizeof(short));
|
|
|
|
if (!d) return NULL;
|
|
|
|
s = (short *)src;
|
|
|
|
*d = *s;
|
|
|
|
CONV16(*d);
|
|
|
|
*size_ret = sizeof(short);
|
|
|
|
return d;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* INT TYPE */
|
|
|
|
static int
|
|
|
|
eet_data_get_int(void *src, void *src_end, void *dst)
|
|
|
|
{
|
2003-07-10 16:18:42 -07:00
|
|
|
int *d;
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2004-04-28 18:32:35 -07:00
|
|
|
if (((char *)src + sizeof(int)) > (char *)src_end) return -1;
|
2003-07-10 16:18:42 -07:00
|
|
|
memcpy(dst, src, sizeof(int));
|
2002-12-02 15:39:26 -08:00
|
|
|
d = (int *)dst;
|
|
|
|
CONV32(*d);
|
|
|
|
return sizeof(int);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void *
|
|
|
|
eet_data_put_int(void *src, int *size_ret)
|
|
|
|
{
|
|
|
|
int *s, *d;
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2002-12-02 15:39:26 -08:00
|
|
|
d = (int *)malloc(sizeof(int));
|
|
|
|
if (!d) return NULL;
|
|
|
|
s = (int *)src;
|
|
|
|
*d = *s;
|
|
|
|
CONV32(*d);
|
|
|
|
*size_ret = sizeof(int);
|
|
|
|
return d;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* LONG LONG TYPE */
|
|
|
|
static int
|
|
|
|
eet_data_get_long_long(void *src, void *src_end, void *dst)
|
|
|
|
{
|
2004-04-20 23:38:37 -07:00
|
|
|
unsigned long long *d;
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2004-04-28 18:32:35 -07:00
|
|
|
if (((char *)src + sizeof(unsigned long long)) > (char *)src_end) return -1;
|
2004-04-20 23:38:37 -07:00
|
|
|
memcpy(dst, src, sizeof(unsigned long long));
|
|
|
|
d = (unsigned long long *)dst;
|
2002-12-02 15:39:26 -08:00
|
|
|
CONV64(*d);
|
2004-04-20 23:38:37 -07:00
|
|
|
return sizeof(unsigned long long);
|
2002-12-02 15:39:26 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void *
|
|
|
|
eet_data_put_long_long(void *src, int *size_ret)
|
|
|
|
{
|
2004-04-20 23:38:37 -07:00
|
|
|
unsigned long long *s, *d;
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2004-04-20 23:38:37 -07:00
|
|
|
d = (unsigned long long *)malloc(sizeof(unsigned long long));
|
2002-12-02 15:39:26 -08:00
|
|
|
if (!d) return NULL;
|
2004-04-20 23:38:37 -07:00
|
|
|
s = (unsigned long long *)src;
|
2002-12-02 15:39:26 -08:00
|
|
|
*d = *s;
|
|
|
|
CONV64(*d);
|
2004-04-20 23:38:37 -07:00
|
|
|
*size_ret = sizeof(unsigned long long);
|
2002-12-02 15:39:26 -08:00
|
|
|
return d;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* STRING TYPE */
|
|
|
|
static int
|
|
|
|
eet_data_get_string(void *src, void *src_end, void *dst)
|
|
|
|
{
|
|
|
|
char *s, **d, *p;
|
|
|
|
int len;
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2002-12-02 15:39:26 -08:00
|
|
|
s = (char *)src;
|
|
|
|
d = (char **)dst;
|
|
|
|
p = s;
|
|
|
|
len = 0;
|
|
|
|
while ((p < (char *)src_end) && (*p != 0)) {len++; p++;}
|
2005-11-23 04:55:43 -08:00
|
|
|
if (len == 0)
|
|
|
|
{
|
|
|
|
*d = NULL;
|
|
|
|
return 0;
|
|
|
|
}
|
2002-12-02 15:39:26 -08:00
|
|
|
*d = malloc(len + 1);
|
|
|
|
if (!(*d)) return -1;
|
|
|
|
memcpy(*d, s, len);
|
|
|
|
(*d)[len] = 0;
|
|
|
|
return len + 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void *
|
|
|
|
eet_data_put_string(void *src, int *size_ret)
|
|
|
|
{
|
|
|
|
char *s, *d;
|
|
|
|
int len;
|
2005-11-29 03:32:10 -08:00
|
|
|
/* const char *empty_s = ""; */
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2002-12-02 15:39:26 -08:00
|
|
|
s = (char *)(*((char **)src));
|
2005-11-23 04:55:43 -08:00
|
|
|
if (!s) return NULL;
|
|
|
|
// if (!s) s = (char *)empty_s;
|
2002-12-02 15:39:26 -08:00
|
|
|
len = strlen(s);
|
|
|
|
d = malloc(len + 1);
|
|
|
|
if (!d) return NULL;
|
|
|
|
strcpy(d, s);
|
|
|
|
*size_ret = len + 1;
|
|
|
|
return d;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* FLOAT TYPE */
|
|
|
|
static int
|
|
|
|
eet_data_get_float(void *src, void *src_end, void *dst)
|
|
|
|
{
|
|
|
|
float *d;
|
2005-07-30 02:09:31 -07:00
|
|
|
float tf;
|
2002-12-02 15:39:26 -08:00
|
|
|
char *s, *str, *p, *prev_locale;
|
|
|
|
int len;
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2002-12-02 15:39:26 -08:00
|
|
|
s = (char *)src;
|
|
|
|
d = (float *)dst;
|
|
|
|
p = s;
|
|
|
|
len = 0;
|
|
|
|
while ((p < (char *)src_end) && (*p != 0)) {len++; p++;}
|
2005-11-30 07:36:19 -08:00
|
|
|
str = alloca(len + 1);
|
2002-12-02 15:39:26 -08:00
|
|
|
memcpy(str, s, len);
|
|
|
|
str[len] = 0;
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2002-12-02 15:39:26 -08:00
|
|
|
prev_locale = setlocale(LC_NUMERIC, "C");
|
2005-07-30 02:09:31 -07:00
|
|
|
/* solaris atof is broken and doesnt understand %a format as a float */
|
|
|
|
/* *d = (float)atof(str); */
|
|
|
|
sscanf(str, "%a", &tf);
|
|
|
|
*d = (float)tf;
|
2002-12-02 15:39:26 -08:00
|
|
|
if (prev_locale) setlocale(LC_NUMERIC, prev_locale);
|
2005-11-30 07:36:19 -08:00
|
|
|
|
2002-12-02 15:39:26 -08:00
|
|
|
return len + 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void *
|
|
|
|
eet_data_put_float(void *src, int *size_ret)
|
|
|
|
{
|
|
|
|
float *s;
|
|
|
|
char *d, buf[64], *prev_locale;
|
|
|
|
int len;
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2002-12-02 15:39:26 -08:00
|
|
|
s = (float *)src;
|
|
|
|
prev_locale = setlocale(LC_NUMERIC, "C");
|
2005-05-18 17:13:25 -07:00
|
|
|
snprintf(buf, sizeof(buf), "%a", (double)(*s));
|
2002-12-02 15:39:26 -08:00
|
|
|
if (prev_locale) setlocale(LC_NUMERIC, prev_locale);
|
|
|
|
len = strlen(buf);
|
|
|
|
d = malloc(len + 1);
|
|
|
|
if (!d) return NULL;
|
|
|
|
strcpy(d, buf);
|
|
|
|
*size_ret = len + 1;
|
|
|
|
return d;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* DOUBLE TYPE */
|
|
|
|
static int
|
|
|
|
eet_data_get_double(void *src, void *src_end, void *dst)
|
|
|
|
{
|
2005-10-04 04:31:44 -07:00
|
|
|
double *d;
|
2005-07-30 02:09:31 -07:00
|
|
|
float tf;
|
2002-12-02 15:39:26 -08:00
|
|
|
char *s, *str, *p, *prev_locale;
|
|
|
|
int len;
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2002-12-02 15:39:26 -08:00
|
|
|
s = (char *)src;
|
|
|
|
d = (double *)dst;
|
|
|
|
p = s;
|
|
|
|
len = 0;
|
|
|
|
while ((p < (char *)src_end) && (*p != 0)) {len++; p++;}
|
2005-11-30 07:36:19 -08:00
|
|
|
str = alloca(len + 1);
|
2002-12-02 15:39:26 -08:00
|
|
|
memcpy(str, s, len);
|
|
|
|
str[len] = 0;
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2002-12-02 15:39:26 -08:00
|
|
|
prev_locale = setlocale(LC_NUMERIC, "C");
|
2005-07-30 02:09:31 -07:00
|
|
|
/* solaris atof is broken and doesnt understand %a format as a float */
|
|
|
|
/* *d = (double)atof(str); */
|
|
|
|
sscanf(str, "%a", &tf);
|
|
|
|
*d = (double)tf;
|
2002-12-02 15:39:26 -08:00
|
|
|
if (prev_locale) setlocale(LC_NUMERIC, prev_locale);
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2002-12-02 15:39:26 -08:00
|
|
|
return len + 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void *
|
|
|
|
eet_data_put_double(void *src, int *size_ret)
|
|
|
|
{
|
|
|
|
double *s;
|
|
|
|
char *d, buf[128], *prev_locale;
|
|
|
|
int len;
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2002-12-02 15:39:26 -08:00
|
|
|
s = (double *)src;
|
|
|
|
prev_locale = setlocale(LC_NUMERIC, "C");
|
2005-05-18 17:13:25 -07:00
|
|
|
snprintf(buf, sizeof(buf), "%a", (double)(*s));
|
2002-12-02 15:39:26 -08:00
|
|
|
if (prev_locale) setlocale(LC_NUMERIC, prev_locale);
|
|
|
|
len = strlen(buf);
|
|
|
|
d = malloc(len + 1);
|
|
|
|
if (!d) return NULL;
|
|
|
|
strcpy(d, buf);
|
|
|
|
*size_ret = len + 1;
|
|
|
|
return d;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
eet_data_get_type(int type, void *src, void *src_end, void *dest)
|
|
|
|
{
|
|
|
|
int ret;
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2002-12-02 15:39:26 -08:00
|
|
|
ret = eet_coder[type - 1].get(src, src_end, dest);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void *
|
|
|
|
eet_data_put_type(int type, void *src, int *size_ret)
|
|
|
|
{
|
|
|
|
void *ret;
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2002-12-02 15:39:26 -08:00
|
|
|
ret = eet_coder[type - 1].put(src, size_ret);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* chunk format...
|
2005-05-22 21:32:04 -07:00
|
|
|
*
|
2002-12-02 15:39:26 -08:00
|
|
|
* char[4] = "CHnK";
|
|
|
|
* int = chunk size (including magic string);
|
|
|
|
* char[] = chuck magic/name string (0 byte terminated);
|
|
|
|
* ... sub-chunks (a chunk can contain chuncks recusrively) ...
|
|
|
|
* or
|
|
|
|
* ... payload data ...
|
2005-05-22 21:32:04 -07:00
|
|
|
*
|
2002-12-02 15:39:26 -08:00
|
|
|
*/
|
|
|
|
|
2005-11-27 10:54:02 -08:00
|
|
|
static void
|
2006-03-03 18:46:24 -08:00
|
|
|
eet_data_chunk_get(Eet_Data_Chunk *chnk, const void *src, int size)
|
2002-12-02 15:39:26 -08:00
|
|
|
{
|
2006-03-03 18:46:24 -08:00
|
|
|
const char *s;
|
2002-12-02 15:39:26 -08:00
|
|
|
int ret1, ret2;
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2005-11-27 10:54:02 -08:00
|
|
|
if (!src) return;
|
|
|
|
if (size <= 8) return;
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2005-11-27 10:54:02 -08:00
|
|
|
if (!chnk) return;
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2002-12-02 15:39:26 -08:00
|
|
|
s = src;
|
|
|
|
if ((s[0] != 'C') || (s[1] != 'H') || (s[2] != 'n') || (s[3] != 'K'))
|
|
|
|
{
|
2005-11-27 10:54:02 -08:00
|
|
|
return;
|
2002-12-02 15:39:26 -08:00
|
|
|
}
|
|
|
|
ret1 = eet_data_get_type(EET_T_INT, (void *)(s + 4), (void *)(s + size), &(chnk->size));
|
|
|
|
if (ret1 <= 0)
|
|
|
|
{
|
2005-11-27 10:54:02 -08:00
|
|
|
return;
|
2002-12-02 15:39:26 -08:00
|
|
|
}
|
|
|
|
if ((chnk->size < 0) || ((chnk->size + 8) > size))
|
|
|
|
{
|
2005-11-27 10:54:02 -08:00
|
|
|
return;
|
2002-12-02 15:39:26 -08:00
|
|
|
}
|
|
|
|
ret2 = eet_data_get_type(EET_T_STRING, (void *)(s + 8), (void *)(s + size), &(chnk->name));
|
|
|
|
if (ret2 <= 0)
|
|
|
|
{
|
2005-11-27 10:54:02 -08:00
|
|
|
return;
|
2002-12-02 15:39:26 -08:00
|
|
|
}
|
2004-04-28 18:32:35 -07:00
|
|
|
chnk->data = (char *)src + 4 + ret1 + ret2;
|
2002-12-02 15:39:26 -08:00
|
|
|
chnk->size -= ret2;
|
2005-11-27 10:54:02 -08:00
|
|
|
return;
|
2002-12-02 15:39:26 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static Eet_Data_Chunk *
|
2005-11-29 03:32:10 -08:00
|
|
|
eet_data_chunk_new(void *data, int size, const char *name)
|
2002-12-02 15:39:26 -08:00
|
|
|
{
|
|
|
|
Eet_Data_Chunk *chnk;
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2002-12-02 15:39:26 -08:00
|
|
|
if (!name) return NULL;
|
2005-11-03 23:16:50 -08:00
|
|
|
chnk = calloc(1, sizeof(Eet_Data_Chunk));
|
2002-12-02 15:39:26 -08:00
|
|
|
if (!chnk) return NULL;
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2005-11-03 23:16:50 -08:00
|
|
|
chnk->name = strdup(name);
|
2002-12-02 15:39:26 -08:00
|
|
|
chnk->size = size;
|
|
|
|
chnk->data = data;
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2002-12-02 15:39:26 -08:00
|
|
|
return chnk;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
eet_data_chunk_free(Eet_Data_Chunk *chnk)
|
|
|
|
{
|
2005-11-03 23:16:50 -08:00
|
|
|
if (chnk->name) free(chnk->name);
|
2002-12-02 15:39:26 -08:00
|
|
|
free(chnk);
|
|
|
|
}
|
|
|
|
|
|
|
|
static Eet_Data_Stream *
|
|
|
|
eet_data_stream_new(void)
|
|
|
|
{
|
|
|
|
Eet_Data_Stream *ds;
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2002-12-02 15:39:26 -08:00
|
|
|
ds = calloc(1, sizeof(Eet_Data_Stream));
|
|
|
|
if (!ds) return NULL;
|
|
|
|
return ds;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
eet_data_stream_free(Eet_Data_Stream *ds)
|
|
|
|
{
|
|
|
|
if (ds->data) free(ds->data);
|
|
|
|
free(ds);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2006-11-05 04:14:08 -08:00
|
|
|
eet_data_stream_write(Eet_Data_Stream *ds, const void *data, int size)
|
2002-12-02 15:39:26 -08:00
|
|
|
{
|
|
|
|
char *p;
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2002-12-02 15:39:26 -08:00
|
|
|
if ((ds->pos + size) > ds->size)
|
|
|
|
{
|
|
|
|
ds->data = realloc(ds->data, ds->size + size + 256);
|
|
|
|
if (!ds->data)
|
|
|
|
{
|
|
|
|
ds->pos = 0;
|
|
|
|
ds->size = 0;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
ds->size = ds->size + size + 256;
|
|
|
|
}
|
|
|
|
p = ds->data;
|
|
|
|
memcpy(p + ds->pos, data, size);
|
|
|
|
ds->pos += size;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
eet_data_chunk_put(Eet_Data_Chunk *chnk, Eet_Data_Stream *ds)
|
|
|
|
{
|
|
|
|
int *size;
|
|
|
|
int s;
|
2006-06-13 03:20:22 -07:00
|
|
|
int size_ret = 0;
|
2002-12-02 15:39:26 -08:00
|
|
|
|
|
|
|
if (!chnk->data) return;
|
|
|
|
/* chunk head */
|
|
|
|
eet_data_stream_write(ds, "CHnK", 4);
|
|
|
|
/* size of chunk payload data + name */
|
|
|
|
s = strlen(chnk->name) + 1 + chnk->size;
|
|
|
|
size = eet_data_put_int(&s, &size_ret);
|
|
|
|
if (size)
|
|
|
|
{
|
|
|
|
eet_data_stream_write(ds, size, size_ret);
|
|
|
|
free(size);
|
|
|
|
}
|
|
|
|
/* write chunk name */
|
|
|
|
eet_data_stream_write(ds, chnk->name, strlen(chnk->name) + 1);
|
|
|
|
/* write payload */
|
|
|
|
eet_data_stream_write(ds, chnk->data, chnk->size);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*---*/
|
|
|
|
|
2005-05-25 20:57:57 -07:00
|
|
|
static void
|
|
|
|
_eet_descriptor_hash_new(Eet_Data_Descriptor *edd)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
edd->elements.hash.size = 1 << 6;
|
|
|
|
edd->elements.hash.buckets = calloc(1, sizeof(Eet_Data_Descriptor_Hash) * edd->elements.hash.size);
|
|
|
|
for (i = 0; i < edd->elements.num; i++)
|
|
|
|
{
|
|
|
|
Eet_Data_Element *ede;
|
|
|
|
int hash;
|
|
|
|
|
|
|
|
ede = &(edd->elements.set[i]);
|
2006-06-13 03:20:22 -07:00
|
|
|
hash = eet_hash_gen((char *) ede->name, 6);
|
2005-05-25 20:57:57 -07:00
|
|
|
if (!edd->elements.hash.buckets[hash].element)
|
|
|
|
edd->elements.hash.buckets[hash].element = ede;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Eet_Data_Descriptor_Hash *bucket;
|
|
|
|
|
|
|
|
bucket = calloc(1, sizeof(Eet_Data_Descriptor_Hash));
|
|
|
|
bucket->element = ede;
|
|
|
|
bucket->next = edd->elements.hash.buckets[hash].next;
|
|
|
|
edd->elements.hash.buckets[hash].next = bucket;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_eet_descriptor_hash_free(Eet_Data_Descriptor *edd)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; i < edd->elements.hash.size; i++)
|
|
|
|
{
|
|
|
|
Eet_Data_Descriptor_Hash *bucket, *pbucket;
|
|
|
|
|
|
|
|
bucket = edd->elements.hash.buckets[i].next;
|
|
|
|
while (bucket)
|
|
|
|
{
|
|
|
|
pbucket = bucket;
|
|
|
|
bucket = bucket->next;
|
|
|
|
free(pbucket);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (edd->elements.hash.buckets) free(edd->elements.hash.buckets);
|
|
|
|
}
|
|
|
|
|
|
|
|
static Eet_Data_Element *
|
|
|
|
_eet_descriptor_hash_find(Eet_Data_Descriptor *edd, char *name)
|
|
|
|
{
|
|
|
|
int hash;
|
|
|
|
Eet_Data_Descriptor_Hash *bucket;
|
|
|
|
|
2006-06-13 03:20:22 -07:00
|
|
|
hash = eet_hash_gen(name, 6);
|
2005-05-25 20:57:57 -07:00
|
|
|
if (!edd->elements.hash.buckets[hash].element) return NULL;
|
|
|
|
if (!strcmp(edd->elements.hash.buckets[hash].element->name, name))
|
|
|
|
return edd->elements.hash.buckets[hash].element;
|
|
|
|
bucket = edd->elements.hash.buckets[hash].next;
|
|
|
|
while (bucket)
|
|
|
|
{
|
|
|
|
if (!strcmp(bucket->element->name, name)) return bucket->element;
|
|
|
|
bucket = bucket->next;
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2005-11-30 07:36:19 -08:00
|
|
|
static void *
|
|
|
|
_eet_mem_alloc(size_t size)
|
|
|
|
{
|
|
|
|
return calloc(1, size);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_eet_mem_free(void *mem)
|
|
|
|
{
|
|
|
|
free(mem);
|
|
|
|
}
|
|
|
|
|
|
|
|
static char *
|
|
|
|
_eet_str_alloc(const char *str)
|
|
|
|
{
|
|
|
|
return strdup(str);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_eet_str_free(const char *str)
|
|
|
|
{
|
|
|
|
free((char *)str);
|
|
|
|
}
|
|
|
|
|
2005-05-25 20:57:57 -07:00
|
|
|
/*---*/
|
|
|
|
|
2005-12-27 09:17:31 -08:00
|
|
|
EAPI Eet_Data_Descriptor *
|
2005-11-27 08:06:55 -08:00
|
|
|
eet_data_descriptor_new(const char *name,
|
2002-12-02 15:39:26 -08:00
|
|
|
int size,
|
|
|
|
void *(*func_list_next) (void *l),
|
|
|
|
void *(*func_list_append) (void *l, void *d),
|
|
|
|
void *(*func_list_data) (void *l),
|
2003-07-07 00:52:20 -07:00
|
|
|
void *(*func_list_free) (void *l),
|
2002-12-02 15:39:26 -08:00
|
|
|
void (*func_hash_foreach) (void *h, int (*func) (void *h, const char *k, void *dt, void *fdt), void *fdt),
|
2003-07-07 00:52:20 -07:00
|
|
|
void *(*func_hash_add) (void *h, const char *k, void *d),
|
|
|
|
void (*func_hash_free) (void *h))
|
2002-12-02 15:39:26 -08:00
|
|
|
{
|
|
|
|
Eet_Data_Descriptor *edd;
|
2003-01-12 22:40:49 -08:00
|
|
|
|
|
|
|
if (!name) return NULL;
|
2005-11-27 08:06:55 -08:00
|
|
|
/*
|
2005-11-03 19:22:22 -08:00
|
|
|
edd = calloc(1, sizeof(Eet_Data_Descriptor) + strlen(name) + 1);
|
|
|
|
edd->name = ((char *)edd) + sizeof(Eet_Data_Descriptor);
|
|
|
|
strcpy(edd->name, name);
|
2005-11-27 08:06:55 -08:00
|
|
|
*/
|
|
|
|
edd = calloc(1, sizeof(Eet_Data_Descriptor));
|
|
|
|
edd->name = name;
|
2002-12-02 15:39:26 -08:00
|
|
|
edd->size = size;
|
2005-11-30 07:36:19 -08:00
|
|
|
edd->func.mem_alloc = _eet_mem_alloc;
|
|
|
|
edd->func.mem_free = _eet_mem_free;
|
|
|
|
edd->func.str_alloc = _eet_str_alloc;
|
|
|
|
edd->func.str_free = _eet_str_free;
|
2002-12-02 15:39:26 -08:00
|
|
|
edd->func.list_next = func_list_next;
|
|
|
|
edd->func.list_append = func_list_append;
|
|
|
|
edd->func.list_data = func_list_data;
|
2003-07-07 00:52:20 -07:00
|
|
|
edd->func.list_free = func_list_free;
|
2002-12-02 15:39:26 -08:00
|
|
|
edd->func.hash_foreach = func_hash_foreach;
|
|
|
|
edd->func.hash_add = func_hash_add;
|
2003-07-07 00:52:20 -07:00
|
|
|
edd->func.hash_free = func_hash_free;
|
2002-12-02 15:39:26 -08:00
|
|
|
return edd;
|
|
|
|
}
|
|
|
|
|
2005-11-30 07:36:19 -08:00
|
|
|
/* new replcement */
|
2005-12-27 09:17:31 -08:00
|
|
|
EAPI Eet_Data_Descriptor *
|
2005-11-30 07:36:19 -08:00
|
|
|
eet_data_descriptor2_new(Eet_Data_Descriptor_Class *eddc)
|
|
|
|
{
|
|
|
|
Eet_Data_Descriptor *edd;
|
|
|
|
|
|
|
|
if (!eddc) return NULL;
|
|
|
|
edd = calloc(1, sizeof(Eet_Data_Descriptor));
|
|
|
|
if (eddc->version < 1) return edd;
|
|
|
|
edd->name = eddc->name;
|
|
|
|
edd->size = eddc->size;
|
|
|
|
edd->func.mem_alloc = _eet_mem_alloc;
|
|
|
|
edd->func.mem_free = _eet_mem_free;
|
|
|
|
edd->func.str_alloc = _eet_str_alloc;
|
|
|
|
edd->func.str_free = _eet_str_free;
|
|
|
|
if (eddc->func.mem_alloc)
|
|
|
|
edd->func.mem_alloc = eddc->func.mem_alloc;
|
|
|
|
if (eddc->func.mem_free)
|
|
|
|
edd->func.mem_free = eddc->func.mem_free;
|
|
|
|
if (eddc->func.str_alloc)
|
|
|
|
edd->func.str_alloc = eddc->func.str_alloc;
|
|
|
|
if (eddc->func.str_free)
|
|
|
|
edd->func.str_free = eddc->func.str_free;
|
|
|
|
edd->func.list_next = eddc->func.list_next;
|
|
|
|
edd->func.list_append = eddc->func.list_append;
|
|
|
|
edd->func.list_data = eddc->func.list_data;
|
|
|
|
edd->func.list_free = eddc->func.list_free;
|
|
|
|
edd->func.hash_foreach = eddc->func.hash_foreach;
|
|
|
|
edd->func.hash_add = eddc->func.hash_add;
|
|
|
|
edd->func.hash_free = eddc->func.hash_free;
|
|
|
|
return edd;
|
|
|
|
}
|
|
|
|
|
2005-12-27 09:17:31 -08:00
|
|
|
EAPI void
|
2002-12-02 15:39:26 -08:00
|
|
|
eet_data_descriptor_free(Eet_Data_Descriptor *edd)
|
|
|
|
{
|
2005-05-25 20:57:57 -07:00
|
|
|
_eet_descriptor_hash_free(edd);
|
2005-11-27 08:06:55 -08:00
|
|
|
// if (edd->strings) free(edd->strings);
|
2002-12-02 15:39:26 -08:00
|
|
|
if (edd->elements.set) free(edd->elements.set);
|
|
|
|
free(edd);
|
|
|
|
}
|
|
|
|
|
2005-12-27 09:17:31 -08:00
|
|
|
EAPI void
|
2005-11-27 08:06:55 -08:00
|
|
|
eet_data_descriptor_element_add(Eet_Data_Descriptor *edd,
|
|
|
|
const char *name, int type,
|
2005-05-22 21:32:04 -07:00
|
|
|
int group_type,
|
|
|
|
int offset,
|
2005-11-27 08:06:55 -08:00
|
|
|
int count, const char *counter_name,
|
2002-12-02 15:39:26 -08:00
|
|
|
Eet_Data_Descriptor *subtype)
|
|
|
|
{
|
|
|
|
Eet_Data_Element *ede;
|
2005-11-29 03:32:10 -08:00
|
|
|
/* int l1, l2, p1, p2, i;
|
|
|
|
char *ps;*/
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2002-12-02 15:39:26 -08:00
|
|
|
edd->elements.num++;
|
|
|
|
edd->elements.set = realloc(edd->elements.set, edd->elements.num * sizeof(Eet_Data_Element));
|
|
|
|
if (!edd->elements.set) return;
|
|
|
|
ede = &(edd->elements.set[edd->elements.num - 1]);
|
2005-11-27 08:06:55 -08:00
|
|
|
/*
|
2005-11-27 06:32:44 -08:00
|
|
|
l1 = strlen(name);
|
|
|
|
p1 = edd->strings_len;
|
|
|
|
if (counter_name)
|
|
|
|
{
|
|
|
|
l2 = strlen(counter_name);
|
|
|
|
p2 = p1 + l1 + 1;
|
|
|
|
}
|
|
|
|
else l2 = -1;
|
|
|
|
ps = edd->strings;
|
|
|
|
edd->strings_len += l1 + 1 + l2 + 1;
|
|
|
|
edd->strings = realloc(edd->strings, edd->strings_len);
|
|
|
|
if (!edd->strings)
|
|
|
|
{
|
|
|
|
edd->strings = ps;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
for (i = 0; i < edd->elements.num; i++)
|
|
|
|
{
|
|
|
|
edd->elements.set[i].name =
|
|
|
|
edd->strings + (edd->elements.set[i].name - ps);
|
|
|
|
if (edd->elements.set[i].counter_name)
|
|
|
|
edd->elements.set[i].counter_name =
|
|
|
|
edd->strings + (edd->elements.set[i].counter_name - ps);
|
|
|
|
}
|
|
|
|
ede->name = edd->strings + p1;
|
|
|
|
strcpy(ede->name, name);
|
2005-11-27 08:06:55 -08:00
|
|
|
*/
|
|
|
|
ede->name = name;
|
|
|
|
|
2002-12-02 15:39:26 -08:00
|
|
|
ede->type = type;
|
|
|
|
ede->group_type = group_type;
|
|
|
|
ede->offset = offset;
|
|
|
|
ede->count = count;
|
2005-11-27 08:06:55 -08:00
|
|
|
/*
|
2002-12-02 15:39:26 -08:00
|
|
|
if (counter_name)
|
2005-11-27 06:32:44 -08:00
|
|
|
{
|
|
|
|
ede->counter_name = edd->strings + p2;
|
|
|
|
strcpy(ede->counter_name, counter_name);
|
|
|
|
}
|
2002-12-02 15:39:26 -08:00
|
|
|
else ede->counter_name = NULL;
|
2005-11-27 08:06:55 -08:00
|
|
|
*/
|
|
|
|
ede->counter_name = counter_name;
|
|
|
|
|
2002-12-02 15:39:26 -08:00
|
|
|
ede->subtype = subtype;
|
|
|
|
}
|
|
|
|
|
2005-12-27 09:17:31 -08:00
|
|
|
EAPI void *
|
2006-11-05 04:14:08 -08:00
|
|
|
eet_data_read(Eet_File *ef, Eet_Data_Descriptor *edd, const char *name)
|
2002-12-02 15:39:26 -08:00
|
|
|
{
|
|
|
|
void *data_dec;
|
|
|
|
void *data;
|
2006-06-13 03:20:22 -07:00
|
|
|
int size;
|
|
|
|
int required_free = 0;
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2006-06-13 03:20:22 -07:00
|
|
|
data = eet_read_direct (ef, name, &size);
|
|
|
|
if (!data)
|
|
|
|
{
|
|
|
|
required_free = 1;
|
|
|
|
data = eet_read(ef, name, &size);
|
|
|
|
if (!data) return NULL;
|
|
|
|
}
|
2002-12-02 15:39:26 -08:00
|
|
|
data_dec = eet_data_descriptor_decode(edd, data, size);
|
2006-06-13 03:20:22 -07:00
|
|
|
if (required_free)
|
|
|
|
free(data);
|
|
|
|
|
2002-12-02 15:39:26 -08:00
|
|
|
return data_dec;
|
|
|
|
}
|
|
|
|
|
2005-12-27 09:17:31 -08:00
|
|
|
EAPI int
|
2006-03-03 18:46:24 -08:00
|
|
|
eet_data_write(Eet_File *ef, Eet_Data_Descriptor *edd, const char *name, const void *data, int compress)
|
2002-12-02 15:39:26 -08:00
|
|
|
{
|
|
|
|
void *data_enc;
|
|
|
|
int size;
|
|
|
|
int val;
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2002-12-02 15:39:26 -08:00
|
|
|
data_enc = eet_data_descriptor_encode(edd, data, &size);
|
|
|
|
if (!data_enc) return 0;
|
|
|
|
val = eet_write(ef, name, data_enc, size, compress);
|
|
|
|
free(data_enc);
|
|
|
|
return val;
|
|
|
|
}
|
|
|
|
|
2003-07-07 15:36:37 -07:00
|
|
|
static int freelist_ref = 0;
|
2003-07-07 00:52:20 -07:00
|
|
|
static int freelist_len = 0;
|
|
|
|
static int freelist_num = 0;
|
|
|
|
static void **freelist = NULL;
|
|
|
|
|
|
|
|
static void
|
|
|
|
_eet_freelist_add(void *data)
|
|
|
|
{
|
|
|
|
freelist_num++;
|
|
|
|
if (freelist_num > freelist_len)
|
|
|
|
{
|
2005-11-03 23:16:50 -08:00
|
|
|
freelist_len += 16;
|
2003-07-07 00:52:20 -07:00
|
|
|
freelist = realloc(freelist, freelist_len * sizeof(void *));
|
|
|
|
}
|
|
|
|
freelist[freelist_num - 1] = data;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_eet_freelist_reset(void)
|
|
|
|
{
|
2003-07-07 15:36:37 -07:00
|
|
|
if (freelist_ref > 0) return;
|
2003-07-07 00:52:20 -07:00
|
|
|
freelist_len = 0;
|
|
|
|
freelist_num = 0;
|
|
|
|
if (freelist) free(freelist);
|
|
|
|
freelist = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2005-11-30 07:36:19 -08:00
|
|
|
_eet_freelist_free(Eet_Data_Descriptor *edd)
|
2003-07-07 00:52:20 -07:00
|
|
|
{
|
|
|
|
int i;
|
2003-07-07 15:36:37 -07:00
|
|
|
|
|
|
|
if (freelist_ref > 0) return;
|
2003-07-07 00:52:20 -07:00
|
|
|
for (i = 0; i < freelist_num; i++)
|
2005-11-30 07:36:19 -08:00
|
|
|
edd->func.mem_free(freelist[i]);
|
2003-07-07 00:52:20 -07:00
|
|
|
_eet_freelist_reset();
|
|
|
|
}
|
|
|
|
|
2003-07-07 15:36:37 -07:00
|
|
|
static void
|
|
|
|
_eet_freelist_ref(void)
|
|
|
|
{
|
|
|
|
freelist_ref++;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_eet_freelist_unref(void)
|
|
|
|
{
|
|
|
|
freelist_ref--;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int freelist_list_ref = 0;
|
2003-07-07 00:52:20 -07:00
|
|
|
static int freelist_list_len = 0;
|
|
|
|
static int freelist_list_num = 0;
|
|
|
|
static void ***freelist_list = NULL;
|
|
|
|
|
|
|
|
static void
|
|
|
|
_eet_freelist_list_add(void **data)
|
|
|
|
{
|
|
|
|
int i;
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2003-07-07 00:52:20 -07:00
|
|
|
for (i = 0; i < freelist_list_num; i++)
|
|
|
|
{
|
|
|
|
if (freelist_list[i] == data) return;
|
|
|
|
}
|
|
|
|
freelist_list_num++;
|
|
|
|
if (freelist_list_num > freelist_list_len)
|
|
|
|
{
|
|
|
|
freelist_list_len += 16;
|
|
|
|
freelist_list = realloc(freelist_list, freelist_list_len * sizeof(void *));
|
|
|
|
}
|
|
|
|
freelist_list[freelist_list_num - 1] = data;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_eet_freelist_list_reset(void)
|
|
|
|
{
|
2003-07-07 15:36:37 -07:00
|
|
|
if (freelist_list_ref > 0) return;
|
2003-07-07 00:52:20 -07:00
|
|
|
freelist_list_len = 0;
|
|
|
|
freelist_list_num = 0;
|
|
|
|
if (freelist_list) free(freelist_list);
|
|
|
|
freelist_list = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_eet_freelist_list_free(Eet_Data_Descriptor *edd)
|
|
|
|
{
|
|
|
|
int i;
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2003-07-07 15:36:37 -07:00
|
|
|
if (freelist_list_ref > 0) return;
|
2003-07-07 00:52:20 -07:00
|
|
|
for (i = 0; i < freelist_list_num; i++)
|
|
|
|
edd->func.list_free(*(freelist_list[i]));
|
|
|
|
_eet_freelist_list_reset();
|
|
|
|
}
|
|
|
|
|
2003-07-07 15:36:37 -07:00
|
|
|
static void
|
|
|
|
_eet_freelist_list_ref(void)
|
|
|
|
{
|
|
|
|
freelist_list_ref++;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_eet_freelist_list_unref(void)
|
|
|
|
{
|
|
|
|
freelist_list_ref--;
|
|
|
|
}
|
|
|
|
|
2005-11-30 07:36:19 -08:00
|
|
|
static int freelist_str_ref = 0;
|
|
|
|
static int freelist_str_len = 0;
|
|
|
|
static int freelist_str_num = 0;
|
|
|
|
static void **freelist_str = NULL;
|
|
|
|
|
|
|
|
static void
|
|
|
|
_eet_freelist_str_add(void *data)
|
|
|
|
{
|
|
|
|
freelist_str_num++;
|
|
|
|
if (freelist_str_num > freelist_str_len)
|
|
|
|
{
|
|
|
|
freelist_str_len += 16;
|
|
|
|
freelist_str = realloc(freelist_str, freelist_str_len * sizeof(void *));
|
|
|
|
}
|
|
|
|
freelist_str[freelist_str_num - 1] = data;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_eet_freelist_str_reset(void)
|
|
|
|
{
|
|
|
|
if (freelist_str_ref > 0) return;
|
|
|
|
freelist_str_len = 0;
|
|
|
|
freelist_str_num = 0;
|
|
|
|
if (freelist_str) free(freelist_str);
|
|
|
|
freelist_str = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_eet_freelist_str_free(Eet_Data_Descriptor *edd)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
if (freelist_str_ref > 0) return;
|
|
|
|
for (i = 0; i < freelist_str_num; i++)
|
|
|
|
edd->func.str_free(freelist_str[i]);
|
|
|
|
_eet_freelist_str_reset();
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_eet_freelist_str_ref(void)
|
|
|
|
{
|
|
|
|
freelist_str_ref++;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_eet_freelist_str_unref(void)
|
|
|
|
{
|
|
|
|
freelist_str_ref--;
|
|
|
|
}
|
|
|
|
|
2005-12-27 09:17:31 -08:00
|
|
|
EAPI void *
|
2002-12-02 15:39:26 -08:00
|
|
|
eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
|
2006-03-03 18:46:24 -08:00
|
|
|
const void *data_in,
|
2002-12-02 15:39:26 -08:00
|
|
|
int size_in)
|
|
|
|
{
|
|
|
|
void *data;
|
|
|
|
char *p;
|
|
|
|
int size;
|
2005-11-27 10:54:02 -08:00
|
|
|
Eet_Data_Chunk chnk;
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2002-12-02 15:39:26 -08:00
|
|
|
if (words_bigendian == -1)
|
|
|
|
{
|
|
|
|
unsigned long int v;
|
|
|
|
|
|
|
|
v = htonl(0x12345678);
|
|
|
|
if (v == 0x12345678) words_bigendian = 1;
|
|
|
|
else words_bigendian = 0;
|
|
|
|
}
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2005-11-30 07:36:19 -08:00
|
|
|
data = edd->func.mem_alloc(edd->size);
|
2002-12-02 15:39:26 -08:00
|
|
|
if (!data) return NULL;
|
2003-07-07 15:36:37 -07:00
|
|
|
_eet_freelist_ref();
|
2005-11-30 07:36:19 -08:00
|
|
|
_eet_freelist_str_ref();
|
2003-07-07 15:36:37 -07:00
|
|
|
_eet_freelist_list_ref();
|
2003-07-07 00:52:20 -07:00
|
|
|
_eet_freelist_add(data);
|
2005-11-27 10:54:02 -08:00
|
|
|
memset(&chnk, 0, sizeof(Eet_Data_Chunk));
|
|
|
|
eet_data_chunk_get(&chnk, data_in, size_in);
|
|
|
|
if (!chnk.name)
|
2002-12-02 15:39:26 -08:00
|
|
|
{
|
2003-07-07 15:36:37 -07:00
|
|
|
_eet_freelist_unref();
|
2005-11-30 07:36:19 -08:00
|
|
|
_eet_freelist_str_unref();
|
2003-07-07 15:36:37 -07:00
|
|
|
_eet_freelist_list_unref();
|
2005-11-30 07:36:19 -08:00
|
|
|
_eet_freelist_free(edd);
|
|
|
|
_eet_freelist_str_free(edd);
|
2003-07-07 00:52:20 -07:00
|
|
|
_eet_freelist_list_free(edd);
|
2002-12-02 15:39:26 -08:00
|
|
|
return NULL;
|
|
|
|
}
|
2005-11-27 10:54:02 -08:00
|
|
|
if (strcmp(chnk.name, edd->name))
|
2002-12-02 15:39:26 -08:00
|
|
|
{
|
2005-11-27 10:54:02 -08:00
|
|
|
free(chnk.name);
|
2003-07-07 15:36:37 -07:00
|
|
|
_eet_freelist_unref();
|
2005-11-30 07:36:19 -08:00
|
|
|
_eet_freelist_str_unref();
|
2003-07-07 15:36:37 -07:00
|
|
|
_eet_freelist_list_unref();
|
2005-11-30 07:36:19 -08:00
|
|
|
_eet_freelist_free(edd);
|
|
|
|
_eet_freelist_str_free(edd);
|
2003-07-07 00:52:20 -07:00
|
|
|
_eet_freelist_list_free(edd);
|
2002-12-02 15:39:26 -08:00
|
|
|
return NULL;
|
|
|
|
}
|
2005-11-27 10:54:02 -08:00
|
|
|
p = chnk.data;
|
|
|
|
size = size_in - (4 + 4 + strlen(chnk.name) + 1);
|
2005-05-25 20:57:57 -07:00
|
|
|
if (!edd->elements.hash.buckets) _eet_descriptor_hash_new(edd);
|
2002-12-02 15:39:26 -08:00
|
|
|
while (size > 0)
|
|
|
|
{
|
2005-11-27 10:54:02 -08:00
|
|
|
Eet_Data_Chunk echnk;
|
2005-05-25 20:57:57 -07:00
|
|
|
Eet_Data_Element *ede;
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2002-12-02 15:39:26 -08:00
|
|
|
/* get next data chunk */
|
2005-11-27 10:54:02 -08:00
|
|
|
memset(&echnk, 0, sizeof(Eet_Data_Chunk));
|
|
|
|
eet_data_chunk_get(&echnk, p, size);
|
|
|
|
if (!echnk.name)
|
2002-12-02 15:39:26 -08:00
|
|
|
{
|
2003-07-07 15:36:37 -07:00
|
|
|
_eet_freelist_unref();
|
2005-11-30 07:36:19 -08:00
|
|
|
_eet_freelist_str_unref();
|
2003-07-07 15:36:37 -07:00
|
|
|
_eet_freelist_list_unref();
|
2005-11-30 07:36:19 -08:00
|
|
|
_eet_freelist_free(edd);
|
|
|
|
_eet_freelist_str_free(edd);
|
2003-07-07 00:52:20 -07:00
|
|
|
_eet_freelist_list_free(edd);
|
2005-11-27 10:54:02 -08:00
|
|
|
free(chnk.name);
|
2002-12-02 15:39:26 -08:00
|
|
|
return NULL;
|
|
|
|
}
|
2005-11-27 10:54:02 -08:00
|
|
|
ede = _eet_descriptor_hash_find(edd, echnk.name);
|
2005-05-25 20:57:57 -07:00
|
|
|
if (ede)
|
2002-12-02 15:39:26 -08:00
|
|
|
{
|
2005-05-25 20:57:57 -07:00
|
|
|
if (ede->group_type == EET_G_UNKNOWN)
|
2002-12-02 15:39:26 -08:00
|
|
|
{
|
2005-05-25 20:57:57 -07:00
|
|
|
int ret;
|
|
|
|
void *data_ret;
|
|
|
|
|
|
|
|
if ((ede->type >= EET_T_CHAR) &&
|
|
|
|
(ede->type <= EET_T_STRING))
|
2002-12-02 15:39:26 -08:00
|
|
|
{
|
2005-05-25 20:57:57 -07:00
|
|
|
ret = eet_data_get_type(ede->type,
|
2005-11-27 10:54:02 -08:00
|
|
|
echnk.data,
|
|
|
|
((char *)echnk.data) + echnk.size,
|
2005-05-25 20:57:57 -07:00
|
|
|
((char *)data) + ede->offset);
|
2005-11-30 07:36:19 -08:00
|
|
|
if (ede->type == EET_T_STRING)
|
|
|
|
{
|
|
|
|
char **str, *str2;
|
|
|
|
|
2005-12-27 09:17:31 -08:00
|
|
|
str = (char **)(((char *)data) + ede->offset);
|
2005-11-30 07:36:19 -08:00
|
|
|
if (*str)
|
|
|
|
{
|
|
|
|
str2 = edd->func.str_alloc(*str);
|
|
|
|
free(*str);
|
|
|
|
*str = str2;
|
|
|
|
_eet_freelist_str_add(str2);
|
|
|
|
}
|
|
|
|
}
|
2005-05-25 20:57:57 -07:00
|
|
|
}
|
|
|
|
else if (ede->subtype)
|
|
|
|
{
|
|
|
|
void **ptr;
|
|
|
|
|
|
|
|
data_ret = eet_data_descriptor_decode(ede->subtype,
|
2005-11-27 10:54:02 -08:00
|
|
|
echnk.data,
|
|
|
|
echnk.size);
|
2005-05-25 20:57:57 -07:00
|
|
|
if (!data_ret)
|
2002-12-02 15:39:26 -08:00
|
|
|
{
|
2005-05-25 20:57:57 -07:00
|
|
|
_eet_freelist_unref();
|
2005-11-30 07:36:19 -08:00
|
|
|
_eet_freelist_str_unref();
|
2005-05-25 20:57:57 -07:00
|
|
|
_eet_freelist_list_unref();
|
2005-11-30 07:36:19 -08:00
|
|
|
_eet_freelist_free(edd);
|
|
|
|
_eet_freelist_str_free(edd);
|
2005-05-25 20:57:57 -07:00
|
|
|
_eet_freelist_list_free(edd);
|
2005-11-27 10:54:02 -08:00
|
|
|
free(chnk.name);
|
2005-05-25 20:57:57 -07:00
|
|
|
return NULL;
|
2002-12-02 15:39:26 -08:00
|
|
|
}
|
2005-05-25 20:57:57 -07:00
|
|
|
ptr = (void **)(((char *)data) + ede->offset);
|
|
|
|
*ptr = (void *)data_ret;
|
2002-12-02 15:39:26 -08:00
|
|
|
}
|
2005-05-25 20:57:57 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
switch (ede->group_type)
|
2002-12-02 15:39:26 -08:00
|
|
|
{
|
2005-05-25 20:57:57 -07:00
|
|
|
case EET_G_ARRAY:
|
|
|
|
case EET_G_VAR_ARRAY:
|
2002-12-02 15:39:26 -08:00
|
|
|
{
|
2005-05-25 20:57:57 -07:00
|
|
|
printf("ARRAY TYPE NOT IMPLIMENTED YET!!!\n");
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case EET_G_LIST:
|
|
|
|
{
|
|
|
|
int ret;
|
|
|
|
void *list = NULL;
|
|
|
|
void **ptr;
|
|
|
|
void *data_ret;
|
|
|
|
|
|
|
|
ptr = (void **)(((char *)data) + ede->offset);
|
|
|
|
list = *ptr;
|
|
|
|
data_ret = NULL;
|
|
|
|
if ((ede->type >= EET_T_CHAR) &&
|
|
|
|
(ede->type <= EET_T_STRING))
|
2002-12-02 15:39:26 -08:00
|
|
|
{
|
2005-05-25 20:57:57 -07:00
|
|
|
data_ret = calloc(1, eet_coder[ede->type].size);
|
|
|
|
if (data_ret)
|
2002-12-02 15:39:26 -08:00
|
|
|
{
|
2005-05-25 20:57:57 -07:00
|
|
|
_eet_freelist_add(data_ret);
|
|
|
|
ret = eet_data_get_type(ede->type,
|
2005-11-27 10:54:02 -08:00
|
|
|
echnk.data,
|
|
|
|
((char *)echnk.data) + echnk.size,
|
2005-05-25 20:57:57 -07:00
|
|
|
data_ret);
|
|
|
|
if (ret <= 0)
|
2003-07-07 00:52:20 -07:00
|
|
|
{
|
2003-07-07 15:36:37 -07:00
|
|
|
_eet_freelist_unref();
|
2005-11-30 07:36:19 -08:00
|
|
|
_eet_freelist_str_unref();
|
2003-07-07 15:36:37 -07:00
|
|
|
_eet_freelist_list_unref();
|
2005-11-30 07:36:19 -08:00
|
|
|
_eet_freelist_free(edd);
|
|
|
|
_eet_freelist_str_free(edd);
|
2003-07-07 00:52:20 -07:00
|
|
|
_eet_freelist_list_free(edd);
|
2005-11-27 10:54:02 -08:00
|
|
|
free(chnk.name);
|
2003-07-07 00:52:20 -07:00
|
|
|
return NULL;
|
|
|
|
}
|
2002-12-02 15:39:26 -08:00
|
|
|
}
|
2003-07-07 00:52:20 -07:00
|
|
|
else
|
|
|
|
{
|
2003-07-07 15:36:37 -07:00
|
|
|
_eet_freelist_unref();
|
2005-11-30 07:36:19 -08:00
|
|
|
_eet_freelist_str_unref();
|
2003-07-07 15:36:37 -07:00
|
|
|
_eet_freelist_list_unref();
|
2005-11-30 07:36:19 -08:00
|
|
|
_eet_freelist_free(edd);
|
|
|
|
_eet_freelist_str_free(edd);
|
2003-07-07 00:52:20 -07:00
|
|
|
_eet_freelist_list_free(edd);
|
2005-11-27 10:54:02 -08:00
|
|
|
free(chnk.name);
|
2003-07-07 00:52:20 -07:00
|
|
|
return NULL;
|
2002-12-02 15:39:26 -08:00
|
|
|
}
|
|
|
|
}
|
2005-05-25 20:57:57 -07:00
|
|
|
else if (ede->subtype)
|
|
|
|
{
|
|
|
|
data_ret = eet_data_descriptor_decode(ede->subtype,
|
2005-11-27 10:54:02 -08:00
|
|
|
echnk.data,
|
|
|
|
echnk.size);
|
2005-05-25 20:57:57 -07:00
|
|
|
}
|
|
|
|
if (data_ret)
|
|
|
|
{
|
|
|
|
list = edd->func.list_append(list, data_ret);
|
|
|
|
*ptr = list;
|
|
|
|
_eet_freelist_list_add(ptr);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
_eet_freelist_unref();
|
2005-11-30 07:36:19 -08:00
|
|
|
_eet_freelist_str_unref();
|
2005-05-25 20:57:57 -07:00
|
|
|
_eet_freelist_list_unref();
|
2005-11-30 07:36:19 -08:00
|
|
|
_eet_freelist_free(edd);
|
|
|
|
_eet_freelist_str_free(edd);
|
2005-05-25 20:57:57 -07:00
|
|
|
_eet_freelist_list_free(edd);
|
2005-11-27 10:54:02 -08:00
|
|
|
free(chnk.name);
|
2005-05-25 20:57:57 -07:00
|
|
|
return NULL;
|
|
|
|
}
|
2002-12-02 15:39:26 -08:00
|
|
|
}
|
2005-05-25 20:57:57 -07:00
|
|
|
break;
|
|
|
|
case EET_G_HASH:
|
|
|
|
printf("HASH TYPE NOT IMPLIMENTED YET!!!\n");
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
2002-12-02 15:39:26 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/* advance to next chunk */
|
2005-11-27 10:54:02 -08:00
|
|
|
p += (4 + 4 + strlen(echnk.name) + 1 + echnk.size);
|
|
|
|
size -= (4 + 4 + strlen(echnk.name) + 1 + echnk.size);
|
|
|
|
free(echnk.name);
|
2002-12-02 15:39:26 -08:00
|
|
|
}
|
2005-11-27 10:54:02 -08:00
|
|
|
free(chnk.name);
|
2003-07-07 15:36:37 -07:00
|
|
|
_eet_freelist_unref();
|
2005-11-30 07:36:19 -08:00
|
|
|
_eet_freelist_str_unref();
|
2003-07-07 15:36:37 -07:00
|
|
|
_eet_freelist_list_unref();
|
2003-07-07 00:52:20 -07:00
|
|
|
_eet_freelist_reset();
|
2005-11-30 07:36:19 -08:00
|
|
|
_eet_freelist_str_reset();
|
2003-07-07 00:52:20 -07:00
|
|
|
_eet_freelist_list_reset();
|
2002-12-02 15:39:26 -08:00
|
|
|
return data;
|
|
|
|
}
|
|
|
|
|
2005-12-27 09:17:31 -08:00
|
|
|
EAPI void *
|
2002-12-02 15:39:26 -08:00
|
|
|
eet_data_descriptor_encode(Eet_Data_Descriptor *edd,
|
2006-03-03 18:46:24 -08:00
|
|
|
const void *data_in,
|
2002-12-02 15:39:26 -08:00
|
|
|
int *size_ret)
|
|
|
|
{
|
|
|
|
Eet_Data_Chunk *chnk;
|
|
|
|
Eet_Data_Stream *ds;
|
|
|
|
int i;
|
|
|
|
void *cdata;
|
|
|
|
int csize;
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2002-12-02 15:39:26 -08:00
|
|
|
if (words_bigendian == -1)
|
|
|
|
{
|
|
|
|
unsigned long int v;
|
|
|
|
|
|
|
|
v = htonl(0x12345678);
|
|
|
|
if (v == 0x12345678) words_bigendian = 1;
|
|
|
|
else words_bigendian = 0;
|
|
|
|
}
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2002-12-02 15:39:26 -08:00
|
|
|
ds = eet_data_stream_new();
|
|
|
|
for (i = 0; i < edd->elements.num; i++)
|
|
|
|
{
|
|
|
|
Eet_Data_Element *ede;
|
|
|
|
Eet_Data_Chunk *echnk;
|
|
|
|
void *data;
|
|
|
|
int size;
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2002-12-02 15:39:26 -08:00
|
|
|
ede = &(edd->elements.set[i]);
|
|
|
|
data = NULL;
|
|
|
|
if (ede->group_type == EET_G_UNKNOWN)
|
|
|
|
{
|
2005-05-22 21:32:04 -07:00
|
|
|
if ((ede->type >= EET_T_CHAR) &&
|
2002-12-02 15:39:26 -08:00
|
|
|
(ede->type <= EET_T_STRING))
|
2005-05-22 21:32:04 -07:00
|
|
|
data = eet_data_put_type(ede->type,
|
|
|
|
((char *)data_in) + ede->offset,
|
2002-12-02 15:39:26 -08:00
|
|
|
&size);
|
|
|
|
else if (ede->subtype)
|
2003-06-16 06:22:48 -07:00
|
|
|
{
|
|
|
|
if (*((char **)(((char *)data_in) + ede->offset)))
|
2005-05-22 21:32:04 -07:00
|
|
|
data = eet_data_descriptor_encode(ede->subtype,
|
2003-06-16 06:22:48 -07:00
|
|
|
*((char **)(((char *)data_in) + ede->offset)),
|
|
|
|
&size);
|
|
|
|
}
|
2005-05-22 21:32:04 -07:00
|
|
|
if (data)
|
2002-12-02 15:39:26 -08:00
|
|
|
{
|
|
|
|
echnk = eet_data_chunk_new(data, size, ede->name);
|
|
|
|
eet_data_chunk_put(echnk, ds);
|
|
|
|
eet_data_chunk_free(echnk);
|
|
|
|
free(data);
|
|
|
|
data = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
switch (ede->group_type)
|
|
|
|
{
|
|
|
|
case EET_G_ARRAY:
|
|
|
|
case EET_G_VAR_ARRAY:
|
|
|
|
{
|
|
|
|
printf("ARRAY TYPE NOT IMPLIMENTED YET!!!\n");
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case EET_G_LIST:
|
|
|
|
{
|
|
|
|
void *l;
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2002-12-02 15:39:26 -08:00
|
|
|
l = *((void **)(((char *)data_in) + ede->offset));
|
|
|
|
for (; l; l = edd->func.list_next(l))
|
|
|
|
{
|
|
|
|
if ((ede->type >= EET_T_CHAR) &&
|
|
|
|
(ede->type <= EET_T_STRING))
|
|
|
|
data = eet_data_put_type(ede->type,
|
|
|
|
edd->func.list_data(l),
|
|
|
|
&size);
|
|
|
|
else if (ede->subtype)
|
|
|
|
data = eet_data_descriptor_encode(ede->subtype,
|
|
|
|
edd->func.list_data(l),
|
|
|
|
&size);
|
|
|
|
if (data)
|
|
|
|
{
|
2005-05-22 21:32:04 -07:00
|
|
|
echnk = eet_data_chunk_new(data, size, ede->name);
|
2002-12-02 15:39:26 -08:00
|
|
|
eet_data_chunk_put(echnk, ds);
|
|
|
|
eet_data_chunk_free(echnk);
|
|
|
|
free(data);
|
|
|
|
data = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case EET_G_HASH:
|
|
|
|
{
|
|
|
|
printf("HASH TYPE NOT IMPLIMENTED YET!!!\n");
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
chnk = eet_data_chunk_new(ds->data, ds->pos, edd->name);
|
|
|
|
ds->data = NULL;
|
|
|
|
ds->size = 0;
|
|
|
|
eet_data_stream_free(ds);
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2002-12-02 15:39:26 -08:00
|
|
|
ds = eet_data_stream_new();
|
|
|
|
eet_data_chunk_put(chnk, ds);
|
|
|
|
cdata = ds->data;
|
|
|
|
csize = ds->pos;
|
|
|
|
|
|
|
|
ds->data = NULL;
|
|
|
|
ds->size = 0;
|
|
|
|
eet_data_stream_free(ds);
|
|
|
|
*size_ret = csize;
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2004-01-19 18:02:33 -08:00
|
|
|
free(chnk->data);
|
2002-12-02 15:39:26 -08:00
|
|
|
eet_data_chunk_free(chnk);
|
2005-05-22 21:32:04 -07:00
|
|
|
|
2002-12-02 15:39:26 -08:00
|
|
|
return cdata;
|
|
|
|
}
|