2 * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
10 #define __UNUSED__ __attribute__((unused))
21 #ifdef HAVE_NETINET_IN_H
22 # include <netinet/in.h>
25 #if defined(_WIN32) && ! defined(__CEGCC__)
26 # include <winsock2.h>
32 #include "Eet_private.h"
35 * routines for doing data -> struct and struct -> data conversion
55 * multiple entries ordered as...
57 * fixed size array [ of basic types ]
58 * variable size array [ of basic types ]
59 * linked list [ of basic types ]
60 * hash table [ of basic types ]
62 * need to provide builder/accessor funcs for:
74 typedef struct _Eet_Data_Element Eet_Data_Element;
75 typedef struct _Eet_Data_Basic_Type_Codec Eet_Data_Basic_Type_Codec;
76 typedef struct _Eet_Data_Group_Type_Codec Eet_Data_Group_Type_Codec;
77 typedef struct _Eet_Data_Chunk Eet_Data_Chunk;
78 typedef struct _Eet_Data_Stream Eet_Data_Stream;
79 typedef struct _Eet_Data_Descriptor_Hash Eet_Data_Descriptor_Hash;
80 typedef struct _Eet_Data_Encode_Hash_Info Eet_Data_Encode_Hash_Info;
85 * Eet_Data_Basic_Type_Codec (Coder, Decoder)
86 * Eet_Data_Group_Type_Codec (Coder, Decoder)
88 struct _Eet_Data_Basic_Type_Codec
92 int (*get) (const Eet_Dictionary *ed, const void *src, const void *src_end, void *dest);
93 void *(*put) (Eet_Dictionary *ed, const void *src, int *size_ret);
96 struct _Eet_Data_Group_Type_Codec
98 int (*get) (const Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Chunk *echnk, int type, int group_type, void *data_in, int level, void (*dumpfunc) (void *data, const char *str), void *dumpdata, char **p, int *size);
99 void (*put) (Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Stream *ds, void *data_in);
102 struct _Eet_Data_Chunk
110 unsigned char group_type;
113 struct _Eet_Data_Stream
120 struct _Eet_Data_Descriptor_Hash
122 Eet_Data_Element *element;
123 Eet_Data_Descriptor_Hash *next;
126 struct _Eet_Data_Descriptor
129 const Eet_Dictionary *ed;
132 void *(*mem_alloc) (size_t size);
133 void (*mem_free) (void *mem);
134 char *(*str_alloc) (const char *str);
135 char *(*str_direct_alloc) (const char *str);
136 void (*str_free) (const char *str);
137 void (*str_direct_free) (const char *str);
138 void *(*list_next) (void *l);
139 void *(*list_append) (void *l, void *d);
140 void *(*list_data) (void *l);
141 void *(*list_free) (void *l);
142 void (*hash_foreach) (void *h, int (*func) (void *h, const char *k, void *dt, void *fdt), void *fdt);
143 void *(*hash_add) (void *h, const char *k, void *d);
144 void (*hash_free) (void *h);
148 Eet_Data_Element *set;
151 Eet_Data_Descriptor_Hash *buckets;
158 struct _Eet_Data_Element
161 const char *counter_name;
162 const char *directory_name_ptr;
163 Eet_Data_Descriptor *subtype;
164 int offset; /* offset in bytes from the base element */
165 int count; /* number of elements for a fixed array */
166 int counter_offset; /* for a variable array we need the offset of the count variable */
167 unsigned char type; /* EET_T_XXX */
168 unsigned char group_type; /* EET_G_XXX */
171 struct _Eet_Data_Encode_Hash_Info
174 Eet_Data_Element *ede;
180 static int eet_data_get_char(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dest);
181 static void *eet_data_put_char(Eet_Dictionary *ed, const void *src, int *size_ret);
182 static int eet_data_get_short(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dest);
183 static void *eet_data_put_short(Eet_Dictionary *ed, const void *src, int *size_ret);
184 static inline int eet_data_get_int(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dest);
185 static void *eet_data_put_int(Eet_Dictionary *ed, const void *src, int *size_ret);
186 static int eet_data_get_long_long(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dest);
187 static void *eet_data_put_long_long(Eet_Dictionary *ed, const void *src, int *size_ret);
188 static int eet_data_get_float(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dest);
189 static void *eet_data_put_float(Eet_Dictionary *ed, const void *src, int *size_ret);
190 static int eet_data_get_double(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dest);
191 static void *eet_data_put_double(Eet_Dictionary *ed, const void *src, int *size_ret);
192 static inline int eet_data_get_string(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dest);
193 static void *eet_data_put_string(Eet_Dictionary *ed, const void *src, int *size_ret);
194 static int eet_data_get_istring(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dest);
195 static void *eet_data_put_istring(Eet_Dictionary *ed, const void *src, int *size_ret);
196 static int eet_data_get_null(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dest);
197 static void *eet_data_put_null(Eet_Dictionary *ed, const void *src, int *size_ret);
199 static int eet_data_get_type(const Eet_Dictionary *ed, int type, const void *src, const void *src_end, void *dest);
200 static void *eet_data_put_type(Eet_Dictionary *ed, int type, const void *src, int *size_ret);
202 static int eet_data_get_unknown(const Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Chunk *echnk, int type, int group_type, void *data_in, int level, void (*dumpfunc) (void *data, const char *str), void *dumpdata, char **p, int *size);
203 static void eet_data_put_unknown(Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Stream *ds, void *data_in);
204 static void eet_data_put_array(Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Stream *ds, void *data_in);
205 static int eet_data_get_array(const Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Chunk *echnk, int type, int group_type, void *data, int level, void (*dumpfunc) (void *data, const char *str), void *dumpdata, char **p, int *size);
206 static int eet_data_get_list(const Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Chunk *echnk, int type, int group_type, void *data_in, int level, void (*dumpfunc) (void *data, const char *str), void *dumpdata, char **p, int *size);
207 static void eet_data_put_list(Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Stream *ds, void *data_in);
208 static void eet_data_put_hash(Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Stream *ds, void *data_in);
209 static int eet_data_get_hash(const Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Chunk *echnk, int type, int group_type, void *data, int level, void (*dumpfunc) (void *data, const char *str), void *dumpdata, char **p, int *size);
211 static void eet_data_chunk_get(const Eet_Dictionary *ed, Eet_Data_Chunk *chnk, const void *src, int size);
212 static Eet_Data_Chunk *eet_data_chunk_new(void *data, int size, const char *name, int type, int group_type);
213 static void eet_data_chunk_free(Eet_Data_Chunk *chnk);
215 static Eet_Data_Stream *eet_data_stream_new(void);
216 static void eet_data_stream_write(Eet_Data_Stream *ds, const void *data, int size);
217 static void eet_data_stream_free(Eet_Data_Stream *ds);
219 static void eet_data_chunk_put(Eet_Dictionary *ed, Eet_Data_Chunk *chnk, Eet_Data_Stream *ds);
221 static int eet_data_descriptor_encode_hash_cb(void *hash, const char *key, void *hdata, void *fdata);
222 static void *_eet_data_descriptor_encode(Eet_Dictionary *ed, Eet_Data_Descriptor *edd, const void *data_in, int *size_ret);
223 static void *_eet_data_descriptor_decode(const Eet_Dictionary *ed,
224 Eet_Data_Descriptor *edd,
228 void (*dumpfunc) (void *data, const char *str),
233 static const Eet_Data_Basic_Type_Codec eet_basic_codec[] =
235 {sizeof(char), "char", eet_data_get_char, eet_data_put_char },
236 {sizeof(short), "short", eet_data_get_short, eet_data_put_short },
237 {sizeof(int), "int", eet_data_get_int, eet_data_put_int },
238 {sizeof(long long), "long_long", eet_data_get_long_long, eet_data_put_long_long},
239 {sizeof(float), "float", eet_data_get_float, eet_data_put_float },
240 {sizeof(double), "double", eet_data_get_double, eet_data_put_double },
241 {sizeof(char), "uchar", eet_data_get_char, eet_data_put_char },
242 {sizeof(short), "ushort", eet_data_get_short, eet_data_put_short },
243 {sizeof(int), "uint", eet_data_get_int, eet_data_put_int },
244 {sizeof(long long), "ulong_long", eet_data_get_long_long, eet_data_put_long_long},
245 {sizeof(char *), "string", eet_data_get_string, eet_data_put_string },
246 {sizeof(char *), "inlined", eet_data_get_istring, eet_data_put_istring },
247 {sizeof(void *), "NULL", eet_data_get_null, eet_data_put_null }
250 static const Eet_Data_Group_Type_Codec eet_group_codec[] =
252 { eet_data_get_unknown, eet_data_put_unknown },
253 { eet_data_get_array, eet_data_put_array },
254 { eet_data_get_array, eet_data_put_array },
255 { eet_data_get_list, eet_data_put_list },
256 { eet_data_get_hash, eet_data_put_hash }
259 static int words_bigendian = -1;
263 #define SWAP64(x) (x) = \
264 ((((unsigned long long)(x) & 0x00000000000000ffULL ) << 56) |\
265 (((unsigned long long)(x) & 0x000000000000ff00ULL ) << 40) |\
266 (((unsigned long long)(x) & 0x0000000000ff0000ULL ) << 24) |\
267 (((unsigned long long)(x) & 0x00000000ff000000ULL ) << 8) |\
268 (((unsigned long long)(x) & 0x000000ff00000000ULL ) >> 8) |\
269 (((unsigned long long)(x) & 0x0000ff0000000000ULL ) >> 24) |\
270 (((unsigned long long)(x) & 0x00ff000000000000ULL ) >> 40) |\
271 (((unsigned long long)(x) & 0xff00000000000000ULL ) >> 56))
272 #define SWAP32(x) (x) = \
273 ((((int)(x) & 0x000000ff ) << 24) |\
274 (((int)(x) & 0x0000ff00 ) << 8) |\
275 (((int)(x) & 0x00ff0000 ) >> 8) |\
276 (((int)(x) & 0xff000000 ) >> 24))
277 #define SWAP16(x) (x) = \
278 ((((short)(x) & 0x00ff ) << 8) |\
279 (((short)(x) & 0xff00 ) >> 8))
282 #define CONV16(x) {if (words_bigendian) SWAP16(x);}
283 #define CONV32(x) {if (words_bigendian) SWAP32(x);}
284 #define CONV64(x) {if (words_bigendian) SWAP64(x);}
286 #define IS_SIMPLE_TYPE(Type) (Type > EET_T_UNKNOW && Type < EET_T_LAST)
292 eet_data_get_char(const Eet_Dictionary *ed __UNUSED__, const void *src, const void *src_end, void *dst)
296 if (((char *)src + sizeof(char)) > (char *)src_end) return -1;
305 eet_data_put_char(Eet_Dictionary *ed __UNUSED__, const void *src, int *size_ret)
309 d = (char *)malloc(sizeof(char));
314 *size_ret = sizeof(char);
320 eet_data_get_short(const Eet_Dictionary *ed __UNUSED__, const void *src, const void *src_end, void *dst)
324 if (((char *)src + sizeof(short)) > (char *)src_end) return -1;
325 memcpy(dst, src, sizeof(short));
328 return sizeof(short);
332 eet_data_put_short(Eet_Dictionary *ed __UNUSED__, const void *src, int *size_ret)
336 d = (short *)malloc(sizeof(short));
341 *size_ret = sizeof(short);
347 eet_data_get_int(const Eet_Dictionary *ed __UNUSED__, const void *src, const void *src_end, void *dst)
351 if (((char *)src + sizeof(int)) > (char *)src_end) return -1;
352 memcpy(dst, src, sizeof(int));
359 eet_data_put_int(Eet_Dictionary *ed __UNUSED__, const void *src, int *size_ret)
363 d = (int *)malloc(sizeof(int));
368 *size_ret = sizeof(int);
374 eet_data_get_long_long(const Eet_Dictionary *ed __UNUSED__, const void *src, const void *src_end, void *dst)
376 unsigned long long *d;
378 if (((char *)src + sizeof(unsigned long long)) > (char *)src_end) return -1;
379 memcpy(dst, src, sizeof(unsigned long long));
380 d = (unsigned long long *)dst;
382 return sizeof(unsigned long long);
386 eet_data_put_long_long(Eet_Dictionary *ed __UNUSED__, const void *src, int *size_ret)
388 unsigned long long *s, *d;
390 d = (unsigned long long *)malloc(sizeof(unsigned long long));
392 s = (unsigned long long *)src;
395 *size_ret = sizeof(unsigned long long);
401 eet_data_get_string_hash(const Eet_Dictionary *ed, const void *src, const void *src_end)
407 if (eet_data_get_int(ed, src, src_end, &index) < 0) return -1;
409 return eet_dictionary_string_get_hash(ed, index);
416 eet_data_get_string(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dst)
427 if (eet_data_get_int(ed, src, src_end, &index) < 0) return -1;
429 str = eet_dictionary_string_get_char(ed, index);
434 return eet_dictionary_string_get_size(ed, index);
445 return strlen(s) + 1;
449 eet_data_put_string(Eet_Dictionary *ed, const void *src, int *size_ret)
459 str = *((const char **) src);
460 if (!str) return NULL;
462 index = eet_dictionary_string_add(ed, str);
463 if (index == -1) return NULL;
465 return eet_data_put_int(ed, &index, size_ret);
468 s = (char *)(*((char **)src));
473 memcpy(d, s, len + 1);
478 /* ALWAYS INLINED STRING TYPE */
480 eet_data_get_istring(const Eet_Dictionary *ed __UNUSED__, const void *src, const void *src_end, void *dst)
482 return eet_data_get_string(NULL, src, src_end, dst);
486 eet_data_put_istring(Eet_Dictionary *ed __UNUSED__, const void *src, int *size_ret)
488 return eet_data_put_string(NULL, src, size_ret);
491 /* ALWAYS NULL TYPE */
493 eet_data_get_null(const Eet_Dictionary *ed __UNUSED__, const void *src __UNUSED__, const void *src_end __UNUSED__, void *dst)
504 eet_data_put_null(Eet_Dictionary *ed __UNUSED__, const void *src __UNUSED__, int *size_ret)
511 * Fast lookups of simple doubles/floats.
513 * These aren't properly a cache because they don't store pre-calculated
514 * values, but have a so simple math that is almost as fast.
517 _eet_data_float_cache_get(const char *s, int len, float *d)
519 /* fast handle of simple case 0xMp+E*/
520 if ((len == 6) && (s[0] == '0') && (s[1] == 'x') && (s[3] == 'p'))
522 int mantisse = (s[2] >= 'a') ? (s[2] - 'a' + 10) : (s[2] - '0');
523 int exponent = (s[5] - '0');
525 if (s[4] == '+') *d = (float)(mantisse << exponent);
526 else *d = (float)mantisse / (float)(1 << exponent);
534 _eet_data_double_cache_get(const char *s, int len, double *d)
536 /* fast handle of simple case 0xMp+E*/
537 if ((len == 6) && (s[0] == '0') && (s[1] == 'x') && (s[3] == 'p'))
539 int mantisse = (s[2] >= 'a') ? (s[2] - 'a' + 10) : (s[2] - '0');
540 int exponent = (s[5] - '0');
542 if (s[4] == '+') *d = (double)(mantisse << exponent);
543 else *d = (double)mantisse / (double)(1 << exponent);
552 eet_data_get_float(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dst)
565 s = (const char *)src;
568 while ((p < (const char *)src_end) && (*p != 0)) {len++; p++;}
570 if (_eet_data_float_cache_get(s, len, d) != 0) return len + 1;
572 if (eina_convert_atod(s, len, &mantisse, &exponent) == EINA_FALSE) return -1;
573 *d = (float)ldexp((double)mantisse, exponent);
578 if (eet_data_get_int(ed, src, src_end, &index) < 0) return -1;
580 if (!eet_dictionary_string_get_float(ed, index, d))
586 eet_data_put_float(Eet_Dictionary *ed, const void *src, int *size_ret)
591 eina_convert_dtoa((double)(*(float *)src), buf);
601 memcpy(d, buf, len + 1);
606 index = eet_dictionary_string_add(ed, buf);
607 if (index == -1) return NULL;
609 return eet_data_put_int(ed, &index, size_ret);
614 eet_data_get_double(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dst)
624 long long mantisse = 0;
628 s = (const char *) src;
631 while ((p < (const char *)src_end) && (*p != 0)) {len++; p++;}
633 if (_eet_data_double_cache_get(s, len, d) != 0) return len + 1;
635 if (eina_convert_atod(s, len, &mantisse, &exponent) == EINA_FALSE) return -1;
636 *d = ldexp((double) mantisse, exponent);
641 if (eet_data_get_int(ed, src, src_end, &index) < 0) return -1;
643 if (!eet_dictionary_string_get_double(ed, index, d))
649 eet_data_put_double(Eet_Dictionary *ed, const void *src, int *size_ret)
654 eina_convert_dtoa((double)(*(double *)src), buf);
664 memcpy(d, buf, len + 1);
670 index = eet_dictionary_string_add(ed, buf);
671 if (index == -1) return NULL;
673 return eet_data_put_int(ed, &index, size_ret);
677 eet_data_get_type(const Eet_Dictionary *ed, int type, const void *src, const void *src_end, void *dest)
681 ret = eet_basic_codec[type - 1].get(ed, src, src_end, dest);
686 eet_data_put_type(Eet_Dictionary *ed, int type, const void *src, int *size_ret)
690 ret = eet_basic_codec[type - 1].put(ed, src, size_ret);
696 * char[4] = "CHnK"; // untyped data ... or
697 * char[4] = "CHKx"; // typed data - x == type
699 * int = chunk size (including magic string);
700 * char[] = chunk magic/name string (0 byte terminated);
701 * ... sub-chunks (a chunk can contain chuncks recusrively) ...
703 * ... payload data ...
708 eet_data_chunk_get(const Eet_Dictionary *ed, Eet_Data_Chunk *chnk,
709 const void *src, int size)
716 fprintf(stderr, "stiouf -3\n");
721 fprintf(stderr, "stiouf -2 %i\n", size);
727 fprintf(stderr, "stiouf -1\n");
734 if ((s[0] != 'C') || (s[1] != 'H') || (s[2] != 'K'))
736 fprintf(stderr, "stiouf 0\n");
739 chnk->type = (unsigned char)(s[3]);
740 if (chnk->type > EET_T_LAST)
742 chnk->group_type = chnk->type;
743 chnk->type = EET_T_UNKNOW;
746 chnk->group_type = EET_G_UNKNOWN;
747 if ((chnk->type >= EET_T_LAST) ||
748 (chnk->group_type >= EET_G_LAST))
751 chnk->group_type = 0;
756 if ((s[0] != 'C') || (s[1] != 'H') || (s[2] != 'n') || (s[3] != 'K'))
758 fprintf(stderr, "stiouf 1\n");
762 ret1 = eet_data_get_type(ed, EET_T_INT, (s + 4), (s + size), &(chnk->size));
765 fprintf(stderr, "stiouf 2\n");
768 if ((chnk->size < 0) || ((chnk->size + 8) > size))
770 fprintf(stderr, "stiouf 3\n");
773 ret2 = eet_data_get_type(ed, EET_T_STRING, (s + 8), (s + size), &(chnk->name));
776 fprintf(stderr, "stiouf 4\n");
783 chnk->hash = eet_data_get_string_hash(ed, (s + 8), (s + size));
787 chnk->data = (char *)src + 4 + ret1 + sizeof(int);
788 chnk->size -= sizeof(int);
792 chnk->data = (char *)src + 4 + ret1 + chnk->len;
793 chnk->size -= chnk->len;
799 static inline Eet_Data_Chunk *
800 eet_data_chunk_new(void *data, int size, const char *name, int type, int group_type)
802 Eet_Data_Chunk *chnk;
804 if (!name) return NULL;
805 chnk = calloc(1, sizeof(Eet_Data_Chunk));
806 if (!chnk) return NULL;
808 chnk->name = strdup(name);
809 chnk->len = strlen(name) + 1;
813 chnk->group_type = group_type;
818 eet_data_chunk_free(Eet_Data_Chunk *chnk)
820 if (chnk->name) free(chnk->name);
824 static inline Eet_Data_Stream *
825 eet_data_stream_new(void)
829 ds = calloc(1, sizeof(Eet_Data_Stream));
830 if (!ds) return NULL;
835 eet_data_stream_free(Eet_Data_Stream *ds)
837 if (ds->data) free(ds->data);
842 eet_data_stream_write(Eet_Data_Stream *ds, const void *data, int size)
846 if ((ds->pos + size) > ds->size)
848 ds->data = realloc(ds->data, ds->size + size + 512);
855 ds->size = ds->size + size + 512;
858 memcpy(p + ds->pos, data, size);
863 eet_data_chunk_put(Eet_Dictionary *ed, Eet_Data_Chunk *chnk, Eet_Data_Stream *ds)
870 unsigned char buf[4] = "CHK";
872 if (!chnk->data && chnk->type != EET_T_NULL) return;
875 /* eet_data_stream_write(ds, "CHnK", 4);*/
876 if (chnk->type != EET_T_UNKNOW) buf[3] = chnk->type;
877 else buf[3] = chnk->group_type;
879 string = eet_data_put_string(ed, &chnk->name, &string_ret);
883 /* size of chunk payload data + name */
884 s = chnk->size + string_ret;
885 size = eet_data_put_int(ed, &s, &size_ret);
887 /* FIXME: If something goes wrong the resulting file will be corrupted. */
891 eet_data_stream_write(ds, buf, 4);
893 /* write chunk length */
894 eet_data_stream_write(ds, size, size_ret);
896 /* write chunk name */
897 eet_data_stream_write(ds, string, string_ret);
900 eet_data_stream_write(ds, chnk->data, chnk->size);
910 _eet_descriptor_hash_new(Eet_Data_Descriptor *edd)
914 edd->elements.hash.size = 1 << 6;
915 edd->elements.hash.buckets = calloc(1, sizeof(Eet_Data_Descriptor_Hash) * edd->elements.hash.size);
916 for (i = 0; i < edd->elements.num; i++)
918 Eet_Data_Element *ede;
921 ede = &(edd->elements.set[i]);
922 hash = _eet_hash_gen((char *) ede->name, 6);
923 if (!edd->elements.hash.buckets[hash].element)
924 edd->elements.hash.buckets[hash].element = ede;
927 Eet_Data_Descriptor_Hash *bucket;
929 bucket = calloc(1, sizeof(Eet_Data_Descriptor_Hash));
930 bucket->element = ede;
931 bucket->next = edd->elements.hash.buckets[hash].next;
932 edd->elements.hash.buckets[hash].next = bucket;
938 _eet_descriptor_hash_free(Eet_Data_Descriptor *edd)
942 for (i = 0; i < edd->elements.hash.size; i++)
944 Eet_Data_Descriptor_Hash *bucket, *pbucket;
946 bucket = edd->elements.hash.buckets[i].next;
950 bucket = bucket->next;
954 if (edd->elements.hash.buckets) free(edd->elements.hash.buckets);
957 static Eet_Data_Element *
958 _eet_descriptor_hash_find(Eet_Data_Descriptor *edd, char *name, int hash)
960 Eet_Data_Descriptor_Hash *bucket;
962 if (hash < 0) hash = _eet_hash_gen(name, 6);
964 if (!edd->elements.hash.buckets[hash].element) return NULL;
966 When we use the dictionnary as a source for chunk name, we will always
967 have the same pointer in name. It's a good idea to just compare pointer
968 instead of running strcmp on both string.
970 if (edd->elements.hash.buckets[hash].element->directory_name_ptr == name)
971 return edd->elements.hash.buckets[hash].element;
972 if (!strcmp(edd->elements.hash.buckets[hash].element->name, name))
974 edd->elements.hash.buckets[hash].element->directory_name_ptr = name;
975 return edd->elements.hash.buckets[hash].element;
977 bucket = edd->elements.hash.buckets[hash].next;
980 if (bucket->element->directory_name_ptr == name) return bucket->element;
981 if (!strcmp(bucket->element->name, name))
983 bucket->element->directory_name_ptr = name;
984 return bucket->element;
986 bucket = bucket->next;
992 _eet_mem_alloc(size_t size)
994 return calloc(1, size);
998 _eet_mem_free(void *mem)
1004 _eet_str_alloc(const char *str)
1010 _eet_str_free(const char *str)
1017 EAPI Eet_Data_Descriptor *
1018 eet_data_descriptor_new(const char *name,
1020 void *(*func_list_next) (void *l),
1021 void *(*func_list_append) (void *l, void *d),
1022 void *(*func_list_data) (void *l),
1023 void *(*func_list_free) (void *l),
1024 void (*func_hash_foreach) (void *h, int (*func) (void *h, const char *k, void *dt, void *fdt), void *fdt),
1025 void *(*func_hash_add) (void *h, const char *k, void *d),
1026 void (*func_hash_free) (void *h))
1028 Eet_Data_Descriptor *edd;
1030 if (!name) return NULL;
1031 edd = calloc(1, sizeof(Eet_Data_Descriptor));
1032 if (!edd) return NULL;
1037 edd->func.mem_alloc = _eet_mem_alloc;
1038 edd->func.mem_free = _eet_mem_free;
1039 edd->func.str_alloc = _eet_str_alloc;
1040 edd->func.str_direct_alloc = NULL;
1041 edd->func.str_direct_free = NULL;
1042 edd->func.str_free = _eet_str_free;
1043 edd->func.list_next = func_list_next;
1044 edd->func.list_append = func_list_append;
1045 edd->func.list_data = func_list_data;
1046 edd->func.list_free = func_list_free;
1047 edd->func.hash_foreach = func_hash_foreach;
1048 edd->func.hash_add = func_hash_add;
1049 edd->func.hash_free = func_hash_free;
1053 /* new replcement */
1054 EAPI Eet_Data_Descriptor *
1055 eet_data_descriptor2_new(Eet_Data_Descriptor_Class *eddc)
1057 Eet_Data_Descriptor *edd;
1059 if (!eddc) return NULL;
1060 if (eddc->version < 1) return NULL;
1061 edd = calloc(1, sizeof(Eet_Data_Descriptor));
1062 if (!edd) return NULL;
1064 edd->name = eddc->name;
1066 edd->size = eddc->size;
1067 edd->func.mem_alloc = _eet_mem_alloc;
1068 edd->func.mem_free = _eet_mem_free;
1069 edd->func.str_alloc = _eet_str_alloc;
1070 edd->func.str_free = _eet_str_free;
1071 if (eddc->func.mem_alloc)
1072 edd->func.mem_alloc = eddc->func.mem_alloc;
1073 if (eddc->func.mem_free)
1074 edd->func.mem_free = eddc->func.mem_free;
1075 if (eddc->func.str_alloc)
1076 edd->func.str_alloc = eddc->func.str_alloc;
1077 if (eddc->func.str_free)
1078 edd->func.str_free = eddc->func.str_free;
1079 edd->func.list_next = eddc->func.list_next;
1080 edd->func.list_append = eddc->func.list_append;
1081 edd->func.list_data = eddc->func.list_data;
1082 edd->func.list_free = eddc->func.list_free;
1083 edd->func.hash_foreach = eddc->func.hash_foreach;
1084 edd->func.hash_add = eddc->func.hash_add;
1085 edd->func.hash_free = eddc->func.hash_free;
1090 EAPI Eet_Data_Descriptor *
1091 eet_data_descriptor3_new(Eet_Data_Descriptor_Class *eddc)
1093 Eet_Data_Descriptor *edd;
1095 if (!eddc) return NULL;
1096 if (eddc->version < 2) return NULL;
1097 edd = calloc(1, sizeof(Eet_Data_Descriptor));
1098 if (!edd) return NULL;
1100 edd->name = eddc->name;
1102 edd->size = eddc->size;
1103 edd->func.mem_alloc = _eet_mem_alloc;
1104 edd->func.mem_free = _eet_mem_free;
1105 edd->func.str_alloc = _eet_str_alloc;
1106 edd->func.str_free = _eet_str_free;
1107 if (eddc->func.mem_alloc)
1108 edd->func.mem_alloc = eddc->func.mem_alloc;
1109 if (eddc->func.mem_free)
1110 edd->func.mem_free = eddc->func.mem_free;
1111 if (eddc->func.str_alloc)
1112 edd->func.str_alloc = eddc->func.str_alloc;
1113 if (eddc->func.str_free)
1114 edd->func.str_free = eddc->func.str_free;
1115 edd->func.list_next = eddc->func.list_next;
1116 edd->func.list_append = eddc->func.list_append;
1117 edd->func.list_data = eddc->func.list_data;
1118 edd->func.list_free = eddc->func.list_free;
1119 edd->func.hash_foreach = eddc->func.hash_foreach;
1120 edd->func.hash_add = eddc->func.hash_add;
1121 edd->func.hash_free = eddc->func.hash_free;
1122 edd->func.str_direct_alloc = eddc->func.str_direct_alloc;
1123 edd->func.str_direct_free = eddc->func.str_direct_free;
1129 eet_data_descriptor_free(Eet_Data_Descriptor *edd)
1131 _eet_descriptor_hash_free(edd);
1132 if (edd->elements.set) free(edd->elements.set);
1137 eet_data_descriptor_element_add(Eet_Data_Descriptor *edd,
1143 /* int counter_offset, */
1144 const char *counter_name /* Useless should go on a major release */,
1145 Eet_Data_Descriptor *subtype)
1147 Eet_Data_Element *ede;
1148 /* int l1, l2, p1, p2, i;
1151 /* FIXME: Fail safely when realloc fail. */
1152 edd->elements.num++;
1153 edd->elements.set = realloc(edd->elements.set, edd->elements.num * sizeof(Eet_Data_Element));
1154 if (!edd->elements.set) return;
1155 ede = &(edd->elements.set[edd->elements.num - 1]);
1157 ede->directory_name_ptr = NULL;
1160 * We do a special case when we do list,hash or whatever group of simple type.
1161 * Instead of handling it in encode/decode/dump/undump, we create an
1162 * implicit structure with only the simple type.
1164 if (group_type > EET_G_UNKNOWN
1165 && group_type < EET_G_LAST
1166 && type > EET_T_UNKNOW && type < EET_T_STRING
1169 subtype = calloc(1, sizeof (Eet_Data_Descriptor));
1170 if (!subtype) return ;
1171 subtype->name = "implicit";
1172 subtype->size = eet_basic_codec[type - 1].size;
1173 memcpy(&subtype->func, &edd->func, sizeof(subtype->func));
1175 eet_data_descriptor_element_add(subtype, eet_basic_codec[type - 1].name, type,
1176 EET_G_UNKNOWN, 0, 0, /* 0, */NULL, NULL);
1177 type = EET_T_UNKNOW;
1181 ede->group_type = group_type;
1182 ede->offset = offset;
1184 /* FIXME: For the time being, EET_G_VAR_ARRAY will put the counter_offset in count. */
1185 ede->counter_offset = count;
1186 /* ede->counter_offset = counter_offset; */
1187 ede->counter_name = counter_name;
1189 ede->subtype = subtype;
1193 eet_data_read_cipher(Eet_File *ef, Eet_Data_Descriptor *edd, const char *name, const char *key)
1195 const Eet_Dictionary *ed = NULL;
1196 const void *data = NULL;
1198 int required_free = 0;
1201 ed = eet_dictionary_get(ef);
1204 data = eet_read_direct(ef, name, &size);
1208 data = eet_read_cipher(ef, name, &size, key);
1209 if (!data) return NULL;
1212 data_dec = _eet_data_descriptor_decode(ed, edd, data, size, 0, NULL, NULL);
1220 eet_data_read(Eet_File *ef, Eet_Data_Descriptor *edd, const char *name)
1222 return eet_data_read_cipher(ef, edd, name, NULL);
1226 eet_data_write_cipher(Eet_File *ef, Eet_Data_Descriptor *edd, const char *name, const char *key, const void *data, int compress)
1233 ed = eet_dictionary_get(ef);
1235 data_enc = _eet_data_descriptor_encode(ed, edd, data, &size);
1236 if (!data_enc) return 0;
1237 val = eet_write_cipher(ef, name, data_enc, size, compress, key);
1243 eet_data_write(Eet_File *ef, Eet_Data_Descriptor *edd, const char *name, const void *data, int compress)
1245 return eet_data_write_cipher(ef, edd, name, NULL, data, compress);
1248 typedef struct _Eet_Free Eet_Free;
1258 _eet_free_hash(void *data)
1260 unsigned long ptr = (unsigned long)(data);
1279 _eet_free_add(Eet_Free *ef, void *data)
1284 hash = _eet_free_hash(data);
1286 for (i = 0; i < ef->num[hash]; ++i)
1287 if (ef->list[hash][i] == data) return;
1290 if (ef->num[hash] > ef->len[hash])
1294 tmp = realloc(ef->list[hash], (ef->len[hash] + 16) * sizeof(void*));
1297 ef->len[hash] += 16;
1298 ef->list[hash] = tmp;
1300 ef->list[hash][ef->num[hash] - 1] = data;
1303 _eet_free_reset(Eet_Free *ef)
1307 if (ef->ref > 0) return ;
1308 for (i = 0; i < 256; ++i)
1312 if (ef->list[i]) free(ef->list[i]);
1317 _eet_free_ref(Eet_Free *ef)
1322 _eet_free_unref(Eet_Free *ef)
1327 static Eet_Free freelist = { 0, { 0 }, { 0 }, { NULL } };
1329 #define _eet_freelist_add(Data) _eet_free_add(&freelist, Data);
1330 #define _eet_freelist_reset() _eet_free_reset(&freelist);
1331 #define _eet_freelist_ref() _eet_free_ref(&freelist);
1332 #define _eet_freelist_unref() _eet_free_unref(&freelist);
1335 _eet_freelist_free(Eet_Data_Descriptor *edd)
1340 if (freelist.ref > 0) return;
1341 for (j = 0; j < 256; ++j)
1342 for (i = 0; i < freelist.num[j]; ++i)
1345 edd->func.mem_free(freelist.list[j][i]);
1347 free(freelist.list[j][i]);
1349 _eet_free_reset(&freelist);
1352 static Eet_Free freeleak = { 0, { 0 }, { 0 }, { NULL } };
1354 #define _eet_freeleak_add(Data) _eet_free_add(&freeleak, Data);
1355 #define _eet_freeleak_reset() _eet_free_reset(&freeleak);
1356 #define _eet_freeleak_ref() _eet_free_ref(&freeleak);
1357 #define _eet_freeleak_unref() _eet_free_unref(&freeleak);
1360 _eet_freeleak_free(Eet_Data_Descriptor *edd)
1365 if (freeleak.ref > 0) return;
1366 for (j = 0; j < 256; ++j)
1367 for (i = 0; i < freeleak.num[j]; ++i)
1370 edd->func.mem_free(freeleak.list[j][i]);
1372 free(freeleak.list[j][i]);
1374 _eet_free_reset(&freeleak);
1377 static Eet_Free freelist_list = { 0, { 0 }, { 0 }, { NULL } };
1379 #define _eet_freelist_list_add(Data) _eet_free_add(&freelist_list, Data);
1380 #define _eet_freelist_list_reset() _eet_free_reset(&freelist_list);
1381 #define _eet_freelist_list_ref() _eet_free_ref(&freelist_list);
1382 #define _eet_freelist_list_unref() _eet_free_unref(&freelist_list);
1385 _eet_freelist_list_free(Eet_Data_Descriptor *edd)
1390 if (freelist_list.ref > 0) return;
1391 for (j = 0; j < 256; ++j)
1392 for (i = 0; i < freelist_list.num[j]; ++i)
1395 edd->func.list_free(*((void**)(freelist_list.list[j][i])));
1397 _eet_free_reset(&freelist_list);
1400 static Eet_Free freelist_str = { 0, { 0 }, { 0 }, { NULL } };
1402 #define _eet_freelist_str_add(Data) _eet_free_add(&freelist_str, Data);
1403 #define _eet_freelist_str_reset() _eet_free_reset(&freelist_str);
1404 #define _eet_freelist_str_ref() _eet_free_ref(&freelist_str);
1405 #define _eet_freelist_str_unref() _eet_free_unref(&freelist_str);
1408 _eet_freelist_str_free(Eet_Data_Descriptor *edd)
1413 if (freelist_str.ref > 0) return;
1414 for (j = 0; j < 256; ++j)
1415 for (i = 0; i < freelist_str.num[j]; ++i)
1418 edd->func.str_free(freelist_str.list[j][i]);
1420 free(freelist_str.list[j][i]);
1422 _eet_free_reset(&freelist_str);
1425 static Eet_Free freelist_direct_str = { 0, { 0 }, { 0 }, { NULL } };
1427 #define _eet_freelist_direct_str_add(Data) _eet_free_add(&freelist_direct_str, Data);
1428 #define _eet_freelist_direct_str_reset() _eet_free_reset(&freelist_direct_str);
1429 #define _eet_freelist_direct_str_ref() _eet_free_ref(&freelist_direct_str);
1430 #define _eet_freelist_direct_str_unref() _eet_free_unref(&freelist_direct_str);
1433 _eet_freelist_direct_str_free(Eet_Data_Descriptor *edd)
1438 if (freelist_str.ref > 0) return;
1439 for (j = 0; j < 256; ++j)
1440 for (i = 0; i < freelist_str.num[j]; ++i)
1443 edd->func.str_direct_free(freelist_str.list[j][i]);
1445 free(freelist_str.list[j][i]);
1447 _eet_free_reset(&freelist_str);
1451 eet_data_descriptor_encode_hash_cb(void *hash __UNUSED__, const char *key, void *hdata, void *fdata)
1454 Eet_Data_Encode_Hash_Info *edehi;
1455 Eet_Data_Stream *ds;
1456 Eet_Data_Element *ede;
1457 Eet_Data_Chunk *echnk;
1467 data = eet_data_put_type(ed,
1473 echnk = eet_data_chunk_new(data, size, ede->name, ede->type, ede->group_type);
1474 eet_data_chunk_put(ed, echnk, ds);
1475 eet_data_chunk_free(echnk);
1480 EET_ASSERT(!((ede->type > EET_T_UNKNOW) && (ede->type < EET_T_STRING)), return );
1483 if (ede->type >= EET_T_STRING)
1484 eet_data_put_unknown(ed, NULL, ede, ds, &hdata);
1488 data = _eet_data_descriptor_encode(ed,
1494 echnk = eet_data_chunk_new(data, size, ede->name, ede->type, ede->group_type);
1495 eet_data_chunk_put(ed, echnk, ds);
1496 eet_data_chunk_free(echnk);
1506 _eet_data_string_escape(const char *str)
1512 for (strp = str; *strp; strp++)
1514 if (*strp == '\"') sz += 2;
1515 else if (*strp == '\\') sz += 2;
1519 if (!s) return NULL;
1520 for (strp = str, sp = s; *strp; strp++, sp++)
1527 else if (*strp == '\\')
1539 _eet_data_dump_string_escape(void *dumpdata, void dumpfunc(void *data, const char *str), const char *str)
1543 s = _eet_data_string_escape(str);
1546 dumpfunc(dumpdata, s);
1552 _eet_data_dump_token_get(const char *src, int *len)
1558 int tlen = 0, tsize = 0;
1560 #define TOK_ADD(x) \
1563 if (tlen >= tsize) \
1566 tok = realloc(tok, tsize); \
1568 tok[tlen - 1] = x; \
1571 for (p = src; *len > 0; p++, (*len)--)
1577 if ((p[0] == '\"') && (p > src) && (p[-1] != '\\'))
1581 else if ((p[0] == '\\') && (*len > 1) && (p[1] == '\"'))
1585 else if ((p[0] == '\\') && (p > src) && (p[-1] == '\\'))
1594 if (p[0] == '\"') in_quote = 1;
1597 if ((isspace(p[0])) || (p[0] == ';')) /* token ends here */
1610 if (!((isspace(p[0])) || (p[0] == ';')))
1627 typedef struct _Node Node;
1649 unsigned long long ul;
1655 _eet_data_dump_free(Node *node)
1663 case EET_G_VAR_ARRAY:
1666 if (node->key) free(node->key);
1667 for (n = node->values; n;)
1671 _eet_data_dump_free(n2);
1677 case EET_T_LONG_LONG:
1683 case EET_T_ULONG_LONG:
1686 case EET_T_INLINED_STRING:
1688 if (node->data.str) free(node->data.str);
1697 _eet_data_dump_encode(Eet_Dictionary *ed,
1701 Eet_Data_Chunk *chnk = NULL, *echnk = NULL;
1702 Eet_Data_Stream *ds;
1707 if (words_bigendian == -1)
1709 unsigned long int v;
1711 v = htonl(0x12345678);
1712 if (v == 0x12345678) words_bigendian = 1;
1713 else words_bigendian = 0;
1716 ds = eet_data_stream_new();
1717 if (!ds) return NULL;
1722 for (n = node->values; n; n = n->next)
1724 data = _eet_data_dump_encode(ed, n, &size);
1727 eet_data_stream_write(ds, data, size);
1733 case EET_G_VAR_ARRAY:
1734 data = eet_data_put_type(ed,
1740 echnk = eet_data_chunk_new(data, size, node->name, node->type, node->type);
1741 eet_data_chunk_put(ed, echnk, ds);
1742 eet_data_chunk_free(echnk);
1745 for (n = node->values; n; n = n->next)
1747 data = _eet_data_dump_encode(ed, n, &size);
1750 echnk = eet_data_chunk_new(data, size, node->name, node->type, node->type);
1751 eet_data_chunk_put(ed, echnk, ds);
1752 eet_data_chunk_free(echnk);
1757 /* Array is somekind of special case, so we should embed it inside another chunk. */
1758 *size_ret = ds->pos;
1763 eet_data_stream_free(ds);
1767 for (n = node->values; n; n = n->next)
1769 data = _eet_data_dump_encode(ed, n, &size);
1772 eet_data_stream_write(ds, data, size);
1780 data = eet_data_put_type(ed,
1786 echnk = eet_data_chunk_new(data, size, node->name, node->type, node->type);
1787 eet_data_chunk_put(ed, echnk, ds);
1788 eet_data_chunk_free(echnk);
1792 for (n = node->values; n; n = n->next)
1794 data = _eet_data_dump_encode(ed, n, &size);
1797 echnk = eet_data_chunk_new(data, size, node->name, node->type, node->type);
1798 eet_data_chunk_put(ed, echnk, ds);
1799 eet_data_chunk_free(echnk);
1804 /* Hash is somekind of special case, so we should embed it inside another chunk. */
1805 *size_ret = ds->pos;
1810 eet_data_stream_free(ds);
1816 data = eet_data_put_type(ed, node->type, &(node->data.c), &size);
1819 eet_data_stream_write(ds, data, size);
1824 data = eet_data_put_type(ed, node->type, &(node->data.s), &size);
1827 eet_data_stream_write(ds, data, size);
1832 data = eet_data_put_type(ed, node->type, &(node->data.i), &size);
1835 eet_data_stream_write(ds, data, size);
1839 case EET_T_LONG_LONG:
1840 data = eet_data_put_type(ed, node->type, &(node->data.l), &size);
1843 eet_data_stream_write(ds, data, size);
1848 data = eet_data_put_type(ed, node->type, &(node->data.f), &size);
1851 eet_data_stream_write(ds, data, size);
1856 data = eet_data_put_type(ed, node->type, &(node->data.d), &size);
1859 eet_data_stream_write(ds, data, size);
1864 data = eet_data_put_type(ed, node->type, &(node->data.uc), &size);
1867 eet_data_stream_write(ds, data, size);
1872 data = eet_data_put_type(ed, node->type, &(node->data.us), &size);
1875 eet_data_stream_write(ds, data, size);
1880 data = eet_data_put_type(ed, node->type, &(node->data.ui), &size);
1883 eet_data_stream_write(ds, data, size);
1887 case EET_T_ULONG_LONG:
1888 data = eet_data_put_type(ed, node->type, &(node->data.ul), &size);
1891 eet_data_stream_write(ds, data, size);
1895 case EET_T_INLINED_STRING:
1896 data = eet_data_put_type(ed, node->type, &(node->data.str), &size);
1899 eet_data_stream_write(ds, data, size);
1904 data = eet_data_put_type(ed, node->type, &(node->data.str), &size);
1907 eet_data_stream_write(ds, data, size);
1915 if ((node->type >= EET_G_UNKNOWN) && (node->type < EET_G_LAST))
1916 chnk = eet_data_chunk_new(ds->data, ds->pos, node->name, EET_T_UNKNOW, node->type);
1918 chnk = eet_data_chunk_new(ds->data, ds->pos, node->name, node->type, EET_G_UNKNOWN);
1921 eet_data_stream_free(ds);
1923 ds = eet_data_stream_new();
1924 eet_data_chunk_put(ed, chnk, ds);
1930 eet_data_stream_free(ds);
1934 eet_data_chunk_free(chnk);
1940 _eet_data_dump_parse(Eet_Dictionary *ed,
1951 Node *node_base = NULL;
1955 /* FIXME; handle parse errors */
1956 #define TOK_GET(t) \
1957 jump = left; t = _eet_data_dump_token_get(p, &left); p += jump - left;
1959 for (p = src; p < (src + size);)
1961 char *tok1, *tok2, *tok3, *tok4;
1966 if (!strcmp(tok1, "group"))
1977 if (!strcmp(tok4, "{"))
1979 /* we have 'group NAM TYP {' */
1980 n = calloc(1, sizeof(Node));
1999 for (nn = node->values; nn; nn = nn->next)
2010 n->name = strdup(tok2);
2011 if (!strcmp(tok3, "struct")) n->type = EET_G_UNKNOWN;
2012 else if (!strcmp(tok3, "array")) n->type = EET_G_ARRAY;
2013 else if (!strcmp(tok3, "var_array")) n->type = EET_G_VAR_ARRAY;
2014 else if (!strcmp(tok3, "list")) n->type = EET_G_LIST;
2015 else if (!strcmp(tok3, "hash")) n->type = EET_G_HASH;
2018 printf("ERROR: group type '%s' invalid.\n", tok3);
2030 else if (!strcmp(tok1, "value"))
2041 /* we have 'value NAME TYP XXX' */
2044 n = calloc(1, sizeof(Node));
2053 for (nn = node->values; nn; nn = nn->next)
2063 n->name = strdup(tok2);
2064 if (!strcmp(tok3, "char:"))
2066 n->type = EET_T_CHAR;
2067 sscanf(tok4, "%hhi", &(n->data.c));
2069 else if (!strcmp(tok3, "short:"))
2071 n->type = EET_T_SHORT;
2072 sscanf(tok4, "%hi", &(n->data.s));
2074 else if (!strcmp(tok3, "int:"))
2076 n->type = EET_T_INT;
2077 sscanf(tok4, "%i", &(n->data.i));
2079 else if (!strcmp(tok3, "long_long:"))
2081 n->type = EET_T_LONG_LONG;
2082 sscanf(tok4, "%lli", &(n->data.l));
2084 else if (!strcmp(tok3, "float:"))
2086 n->type = EET_T_FLOAT;
2087 sscanf(tok4, "%f", &(n->data.f));
2089 else if (!strcmp(tok3, "double:"))
2091 n->type = EET_T_DOUBLE;
2092 sscanf(tok4, "%lf", &(n->data.d));
2094 else if (!strcmp(tok3, "uchar:"))
2096 n->type = EET_T_UCHAR;
2097 sscanf(tok4, "%hhu", &(n->data.uc));
2099 else if (!strcmp(tok3, "ushort:"))
2101 n->type = EET_T_USHORT;
2102 sscanf(tok4, "%hu", &(n->data.us));
2104 else if (!strcmp(tok3, "uint:"))
2106 n->type = EET_T_UINT;
2107 sscanf(tok4, "%u", &(n->data.ui));
2109 else if (!strcmp(tok3, "ulong_long:"))
2111 n->type = EET_T_ULONG_LONG;
2112 sscanf(tok4, "%llu", &(n->data.ul));
2114 else if (!strcmp(tok3, "string:"))
2116 n->type = EET_T_STRING;
2117 n->data.str = strdup(tok4);
2119 else if (!strcmp(tok3, "inlined:"))
2121 n->type = EET_T_INLINED_STRING;
2122 n->data.str = strdup(tok4);
2124 else if (!strcmp(tok3, "null"))
2126 n->type = EET_T_NULL;
2131 printf("ERROR: value type '%s' invalid.\n", tok4);
2142 else if (!strcmp(tok1, "key"))
2147 /* we have 'key NAME' */
2150 node->key = strdup(tok2);
2155 else if (!strcmp(tok1, "count"))
2160 /* we have a 'count COUNT' */
2163 sscanf(tok2, "%i", &(node->count));
2168 else if (!strcmp(tok1, "}"))
2170 /* we have an end of the group */
2171 if (node) node = node->parent;
2179 cdata = _eet_data_dump_encode(ed, node_base, size_ret);
2180 _eet_data_dump_free(node_base);
2185 #define NEXT_CHUNK(P, Size, Echnk, Ed) \
2188 tmp = Ed ? (int) (sizeof(int) * 2) : Echnk.len + 4;\
2189 P += (4 + Echnk.size + tmp); \
2190 Size -= (4 + Echnk.size + tmp); \
2194 _eet_data_descriptor_decode(const Eet_Dictionary *ed,
2195 Eet_Data_Descriptor *edd,
2196 const void *data_in,
2199 void (*dumpfunc) (void *data, const char *str),
2203 char *p, *buf, tbuf[256];
2205 Eet_Data_Chunk chnk;
2207 if (words_bigendian == -1)
2209 unsigned long int v;
2211 v = htonl(0x12345678);
2212 if (v == 0x12345678) words_bigendian = 1;
2213 else words_bigendian = 0;
2218 data = edd->func.mem_alloc(edd->size);
2219 if (!data) return NULL;
2222 for (i = 0; i < edd->elements.num; i++)
2223 edd->elements.set[i].directory_name_ptr = NULL;
2227 _eet_freelist_ref();
2228 _eet_freeleak_ref();
2229 _eet_freelist_str_ref();
2230 _eet_freelist_list_ref();
2231 if (data) _eet_freelist_add(data);
2233 memset(&chnk, 0, sizeof(Eet_Data_Chunk));
2234 eet_data_chunk_get(ed, &chnk, data_in, size_in);
2235 if (!chnk.name) goto error;
2238 if (strcmp(chnk.name, edd->name)) goto error;
2242 size = size_in - (4 + sizeof(int) * 2);
2244 size = size_in - (4 + 4 + chnk.len);
2247 if (!edd->elements.hash.buckets) _eet_descriptor_hash_new(edd);
2252 if (chnk.type == EET_T_UNKNOW)
2256 for (i = 0; i < level; i++) dumpfunc(dumpdata, " ");
2257 dumpfunc(dumpdata, "group \"");
2258 _eet_data_dump_string_escape(dumpdata, dumpfunc, chnk.name);
2259 dumpfunc(dumpdata, "\" ");
2260 switch (chnk.group_type)
2263 dumpfunc(dumpdata, "struct");
2266 dumpfunc(dumpdata, "array");
2268 case EET_G_VAR_ARRAY:
2269 dumpfunc(dumpdata, "var_array");
2272 dumpfunc(dumpdata, "list");
2275 dumpfunc(dumpdata, "hash");
2278 dumpfunc(dumpdata, "???");
2281 dumpfunc(dumpdata, " {\n");
2286 Eet_Data_Chunk echnk;
2287 Eet_Data_Element *ede;
2289 /* get next data chunk */
2290 memset(&echnk, 0, sizeof(Eet_Data_Chunk));
2291 eet_data_chunk_get(ed, &echnk, p, size);
2292 if (!echnk.name) goto error;
2293 /* FIXME: don't REPLY on edd - work without */
2294 if ((edd) && (!dumpfunc))
2296 ede = _eet_descriptor_hash_find(edd, echnk.name, echnk.hash);
2299 int group_type = EET_G_UNKNOWN, type = EET_T_UNKNOW;
2302 group_type = ede->group_type;
2304 if ((echnk.type == 0) && (echnk.group_type == 0))
2307 group_type = ede->group_type;
2311 if (IS_SIMPLE_TYPE(echnk.type) &&
2312 (echnk.type == ede->type))
2314 else if ((echnk.group_type > EET_G_UNKNOWN) &&
2315 (echnk.group_type < EET_G_LAST) &&
2316 (echnk.group_type == ede->group_type))
2317 group_type = echnk.group_type;
2319 /* hashes doesnt fit well with the table */
2320 ret = eet_group_codec[group_type - 100].get(ed, edd, ede, &echnk, type, group_type, ((char *)data) + ede->offset, level, dumpfunc, dumpdata, &p, &size);
2321 if (ret <= 0) goto error;
2324 /*...... dump func */
2327 unsigned char dd[128];
2328 int group_type = EET_G_UNKNOWN, type = EET_T_UNKNOW;
2330 if ((echnk.type > EET_T_UNKNOW) &&
2331 (echnk.type < EET_T_LAST))
2333 else if ((echnk.group_type > EET_G_UNKNOWN) &&
2334 (echnk.group_type < EET_G_LAST))
2335 group_type = echnk.group_type;
2336 if (group_type == EET_G_UNKNOWN)
2341 if (IS_SIMPLE_TYPE(type))
2343 ret = eet_data_get_type(ed,
2346 ((char *)echnk.data) + echnk.size,
2348 for (i = 0; i < level; i++) dumpfunc(dumpdata, " ");
2349 dumpfunc(dumpdata, " value \"");
2350 _eet_data_dump_string_escape(dumpdata, dumpfunc, echnk.name);
2351 dumpfunc(dumpdata, "\" ");
2355 dumpfunc(dumpdata, "char: ");
2356 snprintf(tbuf, sizeof(tbuf), "%hhi", *((char *)dd));
2357 dumpfunc(dumpdata, tbuf); break;
2359 dumpfunc(dumpdata, "short: ");
2360 snprintf(tbuf, sizeof(tbuf), "%hi", *((short *)dd));
2361 dumpfunc(dumpdata, tbuf); break;
2363 dumpfunc(dumpdata, "int: ");
2364 snprintf(tbuf, sizeof(tbuf), "%i", *((int *)dd));
2365 dumpfunc(dumpdata, tbuf); break;
2366 case EET_T_LONG_LONG:
2367 dumpfunc(dumpdata, "long_long: ");
2368 snprintf(tbuf, sizeof(tbuf), "%lli", *((long long *)dd));
2369 dumpfunc(dumpdata, tbuf); break;
2371 dumpfunc(dumpdata, "float: ");
2372 snprintf(tbuf, sizeof(tbuf), "%1.25f", *((float *)dd));
2373 dumpfunc(dumpdata, tbuf); break;
2375 dumpfunc(dumpdata, "double: ");
2376 snprintf(tbuf, sizeof(tbuf), "%1.25f", *((double *)dd));
2377 dumpfunc(dumpdata, tbuf); break;
2379 dumpfunc(dumpdata, "uchar: ");
2380 snprintf(tbuf, sizeof(tbuf), "%hhu", *((unsigned char *)dd));
2381 dumpfunc(dumpdata, tbuf); break;
2383 dumpfunc(dumpdata, "ushort: ");
2384 snprintf(tbuf, sizeof(tbuf), "%i", *((unsigned short *)dd));
2385 dumpfunc(dumpdata, tbuf); break;
2387 dumpfunc(dumpdata, "uint: ");
2388 snprintf(tbuf, sizeof(tbuf), "%u", *((unsigned int *)dd));
2389 dumpfunc(dumpdata, tbuf); break;
2390 case EET_T_ULONG_LONG:
2391 dumpfunc(dumpdata, "ulong_long: ");
2392 snprintf(tbuf, sizeof(tbuf), "%llu", *((unsigned long long *)dd));
2393 dumpfunc(dumpdata, tbuf); break;
2394 case EET_T_INLINED_STRING:
2401 dumpfunc(dumpdata, "inlined: \"");
2402 _eet_data_dump_string_escape(dumpdata, dumpfunc, s);
2403 dumpfunc(dumpdata, "\"");
2414 dumpfunc(dumpdata, "string: \"");
2415 _eet_data_dump_string_escape(dumpdata, dumpfunc, s);
2416 dumpfunc(dumpdata, "\"");
2421 dumpfunc(dumpdata, "null");
2424 dumpfunc(dumpdata, "???: ???"); break;
2427 dumpfunc(dumpdata, ";\n");
2431 data_ret = _eet_data_descriptor_decode(ed,
2438 if (!data_ret) goto error;
2443 for (i = 0; i < level; i++) dumpfunc(dumpdata, " ");
2444 dumpfunc(dumpdata, " group \"");
2445 _eet_data_dump_string_escape(dumpdata, dumpfunc, echnk.name);
2446 dumpfunc(dumpdata, "\" ");
2447 switch (echnk.group_type)
2450 dumpfunc(dumpdata, "struct");break;
2452 dumpfunc(dumpdata, "array");break;
2453 case EET_G_VAR_ARRAY:
2454 dumpfunc(dumpdata, "var_array");break;
2456 dumpfunc(dumpdata, "list");break;
2458 dumpfunc(dumpdata, "hash");break;
2460 dumpfunc(dumpdata, "???");break;
2463 dumpfunc(dumpdata, " {\n");
2467 case EET_G_VAR_ARRAY:
2473 EET_ASSERT(!IS_SIMPLE_TYPE(type), goto error);
2475 ret = eet_data_get_type(ed,
2478 ((char *)echnk.data) + echnk.size,
2480 if (ret <= 0) goto error;
2482 for (i = 0; i < level; i++) dumpfunc(dumpdata, " ");
2483 dumpfunc(dumpdata, " count ");
2484 snprintf(tbuf, sizeof(tbuf), "%i", count);
2485 dumpfunc(dumpdata, tbuf);
2486 dumpfunc(dumpdata, ";\n");
2488 /* get all array elements */
2489 for (i = 0; i < count; i++)
2491 void *data_ret = NULL;
2493 /* Advance to next chunk */
2494 NEXT_CHUNK(p, size, echnk, ed);
2495 memset(&echnk, 0, sizeof(Eet_Data_Chunk));
2497 eet_data_chunk_get(ed, &echnk, p, size);
2498 if (!echnk.name) goto error;
2500 data_ret = _eet_data_descriptor_decode(ed,
2507 if (!data_ret) goto error;
2513 void *data_ret = NULL;
2515 EET_ASSERT(!IS_SIMPLE_TYPE(type), goto error);
2517 data_ret = _eet_data_descriptor_decode(ed,
2524 if (!data_ret) goto error;
2531 void *data_ret = NULL;
2534 ret = eet_data_get_type(ed,
2537 ((char *)echnk.data) + echnk.size,
2539 if (ret <= 0) goto error;
2541 /* Advance to next chunk */
2542 NEXT_CHUNK(p, size, echnk, ed);
2543 memset(&echnk, 0, sizeof(Eet_Data_Chunk));
2546 eet_data_chunk_get(ed, &echnk, p, size);
2547 if (!echnk.name) goto error;
2549 EET_ASSERT(!IS_SIMPLE_TYPE(type), goto error);
2557 for (i = 0; i < level; i++) dumpfunc(dumpdata, " ");
2558 dumpfunc(dumpdata, " key \"");
2559 _eet_data_dump_string_escape(dumpdata, dumpfunc, s);
2560 dumpfunc(dumpdata, "\";\n");
2562 data_ret = _eet_data_descriptor_decode(ed,
2581 for (i = 0; i < level; i++) dumpfunc(dumpdata, " ");
2582 dumpfunc(dumpdata, " }\n");
2586 /* advance to next chunk */
2587 NEXT_CHUNK(p, size, echnk, ed);
2590 _eet_freelist_unref();
2591 _eet_freeleak_unref();
2592 _eet_freelist_str_unref();
2593 _eet_freelist_list_unref();
2596 _eet_freelist_str_free(edd);
2597 _eet_freelist_direct_str_free(edd);
2598 _eet_freelist_list_free(edd);
2599 _eet_freelist_free(edd);
2600 _eet_freeleak_reset();
2604 _eet_freelist_reset();
2605 _eet_freeleak_free(edd);
2606 _eet_freelist_str_reset();
2607 _eet_freelist_list_reset();
2608 _eet_freelist_direct_str_reset();
2614 if (chnk.type == EET_T_UNKNOW)
2616 for (i = 0; i < level; i++) dumpfunc(dumpdata, " ");
2617 dumpfunc(dumpdata, "}\n");
2625 _eet_freelist_unref();
2626 _eet_freeleak_unref();
2627 _eet_freelist_str_unref();
2628 _eet_freelist_list_unref();
2629 _eet_freelist_str_free(edd);
2630 _eet_freelist_direct_str_free(edd);
2631 _eet_freelist_list_free(edd);
2632 _eet_freelist_free(edd);
2633 _eet_freeleak_reset();
2638 if (chnk.type == EET_T_UNKNOW)
2640 for (i = 0; i < level; i++) dumpfunc(dumpdata, " ");
2641 dumpfunc(dumpdata, "}\n");
2649 eet_data_get_list(const Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Chunk *echnk,
2650 int type __UNUSED__, int group_type __UNUSED__, void *data,
2651 int level, void (*dumpfunc) (void *data, const char *str), void *dumpdata,
2652 char **p __UNUSED__, int *size __UNUSED__)
2658 EET_ASSERT(!((type > EET_T_UNKNOW) && (type < EET_T_STRING)), return 0);
2660 ptr = (void **)data;
2664 if (ede->type >= EET_T_STRING)
2668 ret = eet_data_get_unknown(ed, edd, ede, echnk, ede->type, EET_G_UNKNOWN,
2669 &data_ret, level, dumpfunc, dumpdata, p, size);
2674 data_ret = _eet_data_descriptor_decode(ed, ede->subtype, echnk->data, echnk->size, level + 2, dumpfunc, dumpdata);
2675 if (!data_ret) return 0;
2678 list = edd->func.list_append(list, data_ret);
2680 _eet_freelist_list_add(ptr);
2686 eet_data_get_hash(const Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Chunk *echnk,
2687 int type, int group_type __UNUSED__, void *data,
2688 int level, void (*dumpfunc) (void *data, const char *str), void *dumpdata,
2689 char **p, int *size)
2694 void *data_ret = NULL;
2697 EET_ASSERT(!((type > EET_T_UNKNOW) && (type < EET_T_STRING)), return 0);
2699 ptr = (void **)data;
2703 ret = eet_data_get_type(ed,
2706 ((char *)echnk->data) + echnk->size,
2708 if (ret <= 0) goto on_error;
2710 /* Advance to next chunk */
2711 NEXT_CHUNK((*p), (*size), (*echnk), ed);
2712 memset(echnk, 0, sizeof(Eet_Data_Chunk));
2715 eet_data_chunk_get(ed, echnk, *p, *size);
2716 if (!echnk->name) goto on_error;
2718 if (type >= EET_T_STRING)
2722 ret = eet_data_get_unknown(ed, edd, ede, echnk, ede->type, EET_G_UNKNOWN,
2723 &data_ret, level, dumpfunc, dumpdata, p, size);
2728 data_ret = _eet_data_descriptor_decode(ed,
2735 if (!data_ret) goto on_error;
2738 hash = edd->func.hash_add(hash, key, data_ret);
2740 _eet_freelist_list_add(ptr);
2747 /* var arrays and fixed arrays have to
2748 * get all chunks at once. for fixed arrays
2749 * we can get each chunk and increment a
2750 * counter stored on the element itself but
2751 * it wont be thread safe. for var arrays
2752 * we still need a way to get the number of
2753 * elements from the data, so storing the
2754 * number of elements and the element data on
2755 * each chunk is pointless.
2758 eet_data_get_array(const Eet_Dictionary *ed, Eet_Data_Descriptor *edd __UNUSED__,
2759 Eet_Data_Element *ede, Eet_Data_Chunk *echnk,
2760 int type, int group_type, void *data,
2761 int level, void (*dumpfunc) (void *data, const char *str), void *dumpdata,
2762 char **p, int *size)
2771 EET_ASSERT(!((type > EET_T_UNKNOW) && (type < EET_T_STRING)), return 0);
2774 /* read the number of elements */
2775 ret = eet_data_get_type(ed,
2778 ((char *)echnk->data) + echnk->size,
2780 if (ret <= 0) return ret;
2782 if (type >= EET_T_STRING)
2783 subsize = eet_basic_codec[ede->type].size;
2785 subsize = ede->subtype->size;
2789 if (group_type == EET_G_VAR_ARRAY)
2791 /* store the number of elements
2792 * on the counter offset */
2793 *(int *)(((char *)data) + ede->count - ede->offset) = count;
2794 /* allocate space for the array of elements */
2795 *(void **)ptr = calloc(count, subsize);
2797 if (!*(void **)ptr) return 0;
2799 _eet_freelist_add(*(void **)ptr);
2802 /* get all array elements */
2803 for (i = 0; i < count; i++)
2806 void *data_ret = NULL;
2808 /* Advance to next chunk */
2809 NEXT_CHUNK((*p), (*size), (*echnk), ed);
2810 memset(echnk, 0, sizeof(Eet_Data_Chunk));
2812 eet_data_chunk_get(ed, echnk, *p, *size);
2813 if (!echnk->name || strcmp(echnk->name, name) != 0) return 0;
2816 /* get the destination pointer */
2817 if (group_type == EET_G_ARRAY)
2818 dst = (char *)ptr + (subsize * i);
2820 dst = *(char **)ptr + (subsize * i);
2822 if (type >= EET_T_STRING)
2826 ret = eet_data_get_unknown(ed,
2839 memcpy(dst, &data_ret, subsize);
2843 data_ret = _eet_data_descriptor_decode(ed,
2850 if (!data_ret) return 0;
2851 memcpy(dst, data_ret, subsize);
2852 _eet_freeleak_add(data_ret);
2859 eet_data_get_unknown(const Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Chunk *echnk,
2860 int type, int group_type __UNUSED__, void *data,
2861 int level, void (*dumpfunc) (void *data, const char *str), void *dumpdata,
2862 char **p __UNUSED__, int *size __UNUSED__)
2867 if (IS_SIMPLE_TYPE(type))
2869 ret = eet_data_get_type(ed, type, echnk->data, ((char *)echnk->data) + echnk->size, ((char *)data));
2870 if (ret <= 0) return ret;
2872 if (type == EET_T_STRING)
2876 str = (char **)(((char *)data));
2879 if ((ed == NULL) || (edd->func.str_direct_alloc == NULL))
2881 *str = edd->func.str_alloc(*str);
2882 _eet_freelist_str_add(*str);
2886 *str = edd->func.str_direct_alloc(*str);
2887 _eet_freelist_direct_str_add(*str);
2891 else if (type == EET_T_INLINED_STRING)
2895 str = (char **)(((char *)data));
2898 *str = edd->func.str_alloc(*str);
2899 _eet_freelist_str_add(*str);
2903 else if (ede->subtype)
2907 data_ret = _eet_data_descriptor_decode(ed, ede->subtype, echnk->data, echnk->size, level + 1, dumpfunc, dumpdata);
2908 if (!data_ret) return 0;
2910 ptr = (void **)(((char *)data));
2911 *ptr = (void *)data_ret;
2918 eet_data_encode(Eet_Dictionary *ed, Eet_Data_Stream *ds, void *data, const char *name, int size, int type, int group_type)
2920 Eet_Data_Chunk *echnk;
2922 echnk = eet_data_chunk_new(data, size, name, type, group_type);
2923 eet_data_chunk_put(ed, echnk, ds);
2924 eet_data_chunk_free(echnk);
2925 if (data) free(data);
2929 eet_data_put_array(Eet_Dictionary *ed, Eet_Data_Descriptor *edd __UNUSED__, Eet_Data_Element *ede, Eet_Data_Stream *ds, void *data_in)
2938 EET_ASSERT(!((ede->type > EET_T_UNKNOW) && (ede->type < EET_T_STRING)), return );
2940 if (ede->group_type == EET_G_ARRAY)
2941 count = ede->counter_offset;
2943 count = *(int *)(((char *)data_in) + ede->count - ede->offset);
2945 if (count <= 0) return;
2946 /* Store number of elements */
2947 data = eet_data_put_type(ed, EET_T_INT, &count, &size);
2948 if (data) eet_data_encode(ed, ds, data, ede->name, size, ede->type, ede->group_type);
2950 if (ede->type >= EET_T_STRING)
2951 subsize = eet_basic_codec[ede->type].size;
2953 subsize = ede->subtype->size;
2955 for (j = 0; j < count; j++)
2960 if (ede->group_type == EET_G_ARRAY)
2961 d = (void *)(((char *)data_in) + offset);
2963 d = *(((char **)data_in)) + offset;
2965 if (ede->type >= EET_T_STRING)
2966 eet_data_put_unknown(ed, NULL, ede, ds, d);
2969 data = _eet_data_descriptor_encode(ed, ede->subtype, d, &size);
2970 if (data) eet_data_encode(ed, ds, data, ede->name, size, ede->type, ede->group_type);
2975 /* Add a NULL element just to have the correct array layout. */
2976 eet_data_encode(ed, ds, NULL, ede->name, 0, EET_T_NULL, ede->group_type);
2984 eet_data_put_unknown(Eet_Dictionary *ed, Eet_Data_Descriptor *edd __UNUSED__, Eet_Data_Element *ede, Eet_Data_Stream *ds, void *data_in)
2989 if (IS_SIMPLE_TYPE(ede->type))
2990 data = eet_data_put_type(ed, ede->type, data_in, &size);
2991 else if (ede->subtype)
2993 if (*((char **)data_in))
2994 data = _eet_data_descriptor_encode(ed,
2996 *((char **)((char *)(data_in))),
2999 if (data) eet_data_encode(ed, ds, data, ede->name, size, ede->type, ede->group_type);
3003 eet_data_put_list(Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Stream *ds, void *data_in)
3009 EET_ASSERT(!((ede->type > EET_T_UNKNOW) && (ede->type < EET_T_STRING)), return );
3011 l = *((void **)(((char *)data_in)));
3012 for (; l; l = edd->func.list_next(l))
3014 if (ede->type >= EET_T_STRING)
3016 const char *str = edd->func.list_data(l);
3017 eet_data_put_unknown(ed, NULL, ede, ds, &str);
3021 data = _eet_data_descriptor_encode(ed,
3023 edd->func.list_data(l),
3025 if (data) eet_data_encode(ed, ds, data, ede->name, size, ede->type, ede->group_type);
3031 eet_data_put_hash(Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Stream *ds, void *data_in)
3033 Eet_Data_Encode_Hash_Info fdata;
3036 l = *((void **)(((char *)data_in)));
3040 edd->func.hash_foreach(l, eet_data_descriptor_encode_hash_cb, &fdata);
3044 eet_data_dump_cipher(Eet_File *ef,
3045 const char *name, const char *key,
3046 void (*dumpfunc) (void *data, const char *str),
3049 const Eet_Dictionary *ed = NULL;
3050 const void *data = NULL;
3052 int required_free = 0;
3055 ed = eet_dictionary_get(ef);
3058 data = eet_read_direct(ef, name, &size);
3062 data = eet_read_cipher(ef, name, &size, key);
3063 if (!data) return 0;
3066 if (_eet_data_descriptor_decode(ed, NULL, data, size, 0,
3067 dumpfunc, dumpdata))
3077 eet_data_dump(Eet_File *ef,
3079 void (*dumpfunc) (void *data, const char *str),
3082 return eet_data_dump_cipher(ef, name, NULL, dumpfunc, dumpdata);
3087 eet_data_text_dump_cipher(const void *data_in,
3088 const char *key, int size_in,
3089 void (*dumpfunc) (void *data, const char *str),
3093 unsigned int ret_len = 0;
3097 if (eet_decipher(data_in, size_in, key, strlen(key), &ret, &ret_len))
3102 if (_eet_data_descriptor_decode(NULL, NULL, ret, ret_len, 0,
3103 dumpfunc, dumpdata))
3111 if (_eet_data_descriptor_decode(NULL, NULL, data_in, size_in, 0,
3112 dumpfunc, dumpdata))
3118 eet_data_text_dump(const void *data_in,
3120 void (*dumpfunc) (void *data, const char *str),
3123 return eet_data_text_dump_cipher(data_in, NULL, size_in, dumpfunc, dumpdata);
3127 eet_data_text_undump_cipher(const char *text,
3134 ret = _eet_data_dump_parse(NULL, size_ret, text, textlen);
3137 void *ciphered = NULL;
3138 unsigned int ciphered_len;
3140 if (eet_cipher(ret, *size_ret, key, strlen(key), &ciphered, &ciphered_len))
3142 if (ciphered) free(ciphered);
3148 *size_ret = ciphered_len;
3155 eet_data_text_undump(const char *text,
3159 return eet_data_text_undump_cipher(text, NULL, textlen, size_ret);
3163 eet_data_undump_cipher(Eet_File *ef,
3175 ed = eet_dictionary_get(ef);
3177 data_enc = _eet_data_dump_parse(ed, &size, text, textlen);
3178 if (!data_enc) return 0;
3179 val = eet_write_cipher(ef, name, data_enc, size, compress, key);
3185 eet_data_undump(Eet_File *ef,
3191 return eet_data_undump_cipher(ef, name, NULL, text, textlen, compress);
3195 eet_data_descriptor_decode_cipher(Eet_Data_Descriptor *edd,
3196 const void *data_in,
3200 void *deciphered = NULL;
3201 unsigned int deciphered_len = 0;
3206 if (eet_decipher(data_in, size_in, key, strlen(key), &deciphered, &deciphered_len))
3208 if (deciphered) free(deciphered);
3211 ret = _eet_data_descriptor_decode(NULL, edd, deciphered, deciphered_len, 0,
3216 return _eet_data_descriptor_decode(NULL, edd, data_in, size_in, 0,
3221 eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
3222 const void *data_in,
3225 return eet_data_descriptor_decode_cipher(edd, data_in, NULL, size_in);
3229 _eet_data_descriptor_encode(Eet_Dictionary *ed,
3230 Eet_Data_Descriptor *edd,
3231 const void *data_in,
3234 Eet_Data_Stream *ds;
3235 Eet_Data_Chunk *chnk;
3240 if (words_bigendian == -1)
3242 unsigned long int v;
3244 v = htonl(0x12345678);
3245 if (v == 0x12345678) words_bigendian = 1;
3246 else words_bigendian = 0;
3249 ds = eet_data_stream_new();
3250 for (i = 0; i < edd->elements.num; i++)
3252 Eet_Data_Element *ede;
3254 ede = &(edd->elements.set[i]);
3255 eet_group_codec[ede->group_type - 100].put(ed, edd, ede, ds, ((char *)data_in) + ede->offset);
3257 chnk = eet_data_chunk_new(ds->data, ds->pos, edd->name, EET_T_UNKNOW, EET_G_UNKNOWN);
3260 eet_data_stream_free(ds);
3262 ds = eet_data_stream_new();
3263 eet_data_chunk_put(ed, chnk, ds);
3269 eet_data_stream_free(ds);
3273 eet_data_chunk_free(chnk);
3279 eet_data_descriptor_encode_cipher(Eet_Data_Descriptor *edd,
3280 const void *data_in,
3285 void *ciphered = NULL;
3286 unsigned int ciphered_len = 0;
3288 ret = _eet_data_descriptor_encode(NULL, edd, data_in, size_ret);
3291 if (eet_cipher(ret, *size_ret, key, strlen(key), &ciphered, &ciphered_len))
3293 if (ciphered) free(ciphered);
3299 *size_ret = ciphered_len;
3306 eet_data_descriptor_encode(Eet_Data_Descriptor *edd,
3307 const void *data_in,
3310 return eet_data_descriptor_encode_cipher(edd, data_in, NULL, size_ret);