From 926db95c5476a7e58ae30873227140b627fc292d Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Wed, 28 Jul 2010 01:45:57 +0000 Subject: [PATCH] testing uncrustify on eet. this shall be standard efl formatting from now on. you may run indent on code and convert to your own formatting if you want.. but all code MUST be "uncrustified" before being cxommitted to svn or before generating patches. time to get the formatting monster under control. SVN revision: 50563 --- legacy/eet/src/bin/eet_main.c | 219 +- .../src/examples/eet-data-file_descriptor.c | 361 +- legacy/eet/src/examples/eet-data-nested.c | 128 +- legacy/eet/src/examples/eet-data-simple.c | 93 +- legacy/eet/src/lib/Eet.h | 5799 +++++++++-------- legacy/eet/src/lib/Eet_private.h | 133 +- legacy/eet/src/lib/eet_cipher.c | 1129 ++-- legacy/eet/src/lib/eet_connection.c | 169 +- legacy/eet/src/lib/eet_data.c | 4479 ++++++++----- legacy/eet/src/lib/eet_dictionary.c | 261 +- legacy/eet/src/lib/eet_image.c | 1788 +++-- legacy/eet/src/lib/eet_lib.c | 2074 +++--- legacy/eet/src/lib/eet_node.c | 526 +- legacy/eet/src/lib/eet_utils.c | 17 +- legacy/eet/src/tests/eet_data_suite.c | 39 +- legacy/eet/src/tests/eet_suite.c | 1214 ++-- 16 files changed, 10555 insertions(+), 7874 deletions(-) diff --git a/legacy/eet/src/bin/eet_main.c b/legacy/eet/src/bin/eet_main.c index 5964d8a8ef..587146f7b8 100644 --- a/legacy/eet/src/bin/eet_main.c +++ b/legacy/eet/src/bin/eet_main.c @@ -58,20 +58,25 @@ do_eet_list(const char *file) if (!ef) { ERR("cannot open for reading: %s\n", file); - exit(-1); + exit(-1); } + list = eet_list(ef, "*", &num); if (list) { - for (i = 0; i < num; i++) - printf("%s\n",list[i]); - free(list); + for (i = 0; i < num; i++) + printf("%s\n",list[i]); + free(list); } + eet_close(ef); } static void -do_eet_extract(const char *file, const char *key, const char *out, const char *crypto_key) +do_eet_extract(const char *file, + const char *key, + const char *out, + const char *crypto_key) { Eet_File *ef; void *data; @@ -81,26 +86,30 @@ do_eet_extract(const char *file, const char *key, const char *out, const char *c ef = eet_open(file, EET_FILE_MODE_READ); if (!ef) { - ERR("cannot open for reading: %s\n", file); - exit(-1); + ERR("cannot open for reading: %s\n", file); + exit(-1); } + data = eet_read_cipher(ef, key, &size, crypto_key); if (!data) { - ERR("cannot read key %s\n", key); - exit(-1); + ERR("cannot read key %s\n", key); + exit(-1); } + f = fopen(out, "wb"); if (!f) { - ERR("cannot open %s\n", out); - exit(-1); + ERR("cannot open %s\n", out); + exit(-1); } + if (fwrite(data, size, 1, f) != 1) { - ERR("cannot write to %s\n", out); - exit(-1); + ERR("cannot write to %s\n", out); + exit(-1); } + fclose(f); free(data); eet_close(ef); @@ -113,7 +122,10 @@ do_eet_decode_dump(void *data, const char *str) } static void -do_eet_decode(const char *file, const char *key, const char *out, const char *crypto_key) +do_eet_decode(const char *file, + const char *key, + const char *out, + const char *crypto_key) { Eet_File *ef; FILE *f; @@ -121,26 +133,33 @@ do_eet_decode(const char *file, const char *key, const char *out, const char *cr ef = eet_open(file, EET_FILE_MODE_READ); if (!ef) { - ERR("cannot open for reading: %s\n", file); - exit(-1); + ERR("cannot open for reading: %s\n", file); + exit(-1); } + f = fopen(out, "wb"); if (!f) { - ERR("cannot open %s\n", out); - exit(-1); + ERR("cannot open %s\n", out); + exit(-1); } + if (!eet_data_dump_cipher(ef, key, crypto_key, do_eet_decode_dump, f)) { - ERR("cannot write to %s\n", out); - exit(-1); + ERR("cannot write to %s\n", out); + exit(-1); } + fclose(f); eet_close(ef); } static void -do_eet_insert(const char *file, const char *key, const char *out, int compress, const char *crypto_key) +do_eet_insert(const char *file, + const char *key, + const char *out, + int compress, + const char *crypto_key) { Eet_File *ef; void *data; @@ -149,32 +168,37 @@ do_eet_insert(const char *file, const char *key, const char *out, int compress, ef = eet_open(file, EET_FILE_MODE_READ_WRITE); if (!ef) - ef = eet_open(file, EET_FILE_MODE_WRITE); + ef = eet_open(file, EET_FILE_MODE_WRITE); + if (!ef) { - ERR("cannot open for read+write: %s\n", file); - exit(-1); + ERR("cannot open for read+write: %s\n", file); + exit(-1); } + f = fopen(out, "rb"); if (!f) { - ERR("cannot open %s\n", out); - exit(-1); + ERR("cannot open %s\n", out); + exit(-1); } + fseek(f, 0, SEEK_END); size = ftell(f); rewind(f); data = malloc(size); if (!data) { - ERR("cannot allocate %i bytes\n", size); - exit(-1); + ERR("cannot allocate %i bytes\n", size); + exit(-1); } + if (fread(data, size, 1, f) != 1) { - ERR("cannot read file %s\n", out); - exit(-1); + ERR("cannot read file %s\n", out); + exit(-1); } + fclose(f); eet_write_cipher(ef, key, data, size, compress, crypto_key); free(data); @@ -182,7 +206,11 @@ do_eet_insert(const char *file, const char *key, const char *out, int compress, } static void -do_eet_encode(const char *file, const char *key, const char *out, int compress, const char *crypto_key) +do_eet_encode(const char *file, + const char *key, + const char *out, + int compress, + const char *crypto_key) { Eet_File *ef; char *text; @@ -192,38 +220,44 @@ do_eet_encode(const char *file, const char *key, const char *out, int compress, ef = eet_open(file, EET_FILE_MODE_READ_WRITE); if (!ef) - ef = eet_open(file, EET_FILE_MODE_WRITE); + ef = eet_open(file, EET_FILE_MODE_WRITE); + if (!ef) { - ERR("cannot open for read+write: %s\n", file); - exit(-1); + ERR("cannot open for read+write: %s\n", file); + exit(-1); } + f = fopen(out, "rb"); if (!f) { - ERR("cannot open %s\n", out); - exit(-1); + ERR("cannot open %s\n", out); + exit(-1); } + fseek(f, 0, SEEK_END); textlen = ftell(f); rewind(f); text = malloc(textlen); if (!text) { - ERR("cannot allocate %i bytes\n", size); - exit(-1); + ERR("cannot allocate %i bytes\n", size); + exit(-1); } + if (fread(text, textlen, 1, f) != 1) { - ERR("cannot read file %s\n", out); - exit(-1); + ERR("cannot read file %s\n", out); + exit(-1); } + fclose(f); if (!eet_data_undump_cipher(ef, key, crypto_key, text, textlen, compress)) { ERR("cannot parse %s\n", out); - exit(-1); + exit(-1); } + free(text); eet_close(ef); } @@ -236,9 +270,10 @@ do_eet_remove(const char *file, const char *key) ef = eet_open(file, EET_FILE_MODE_READ_WRITE); if (!ef) { - ERR("cannot open for read+write: %s\n", file); - exit(-1); + ERR("cannot open for read+write: %s\n", file); + exit(-1); } + eet_delete(ef, key); eet_close(ef); } @@ -254,8 +289,8 @@ do_eet_check(const char *file) ef = eet_open(file, EET_FILE_MODE_READ); if (!ef) { - ERR("checking signature of `%s` failed\n", file); - exit(-1); + ERR("checking signature of `%s` failed\n", file); + exit(-1); } der = eet_identity_x509(ef, &der_length); @@ -278,15 +313,15 @@ do_eet_sign(const char *file, const char *private_key, const char *public_key) ef = eet_open(file, EET_FILE_MODE_READ_WRITE); if (!ef) { - ERR("cannot open for read+write: %s.\n", file); - exit(-1); + ERR("cannot open for read+write: %s.\n", file); + exit(-1); } key = eet_identity_open(public_key, private_key, NULL); if (!key) { - ERR("cannot open key '%s:%s'.\n", public_key, private_key); - exit(-1); + ERR("cannot open key '%s:%s'.\n", public_key, private_key); + exit(-1); } fprintf(stdout, "Using the following key to sign `%s`.\n", file); @@ -301,83 +336,75 @@ int main(int argc, char **argv) { if (!eet_init()) - return -1; + return -1; _eet_main_log_dom = eina_log_domain_register("Eet_Main",EINA_COLOR_CYAN); if(_eet_main_log_dom < -1) { - EINA_LOG_ERR("Impossible to create a log domain for eet_main.\n"); - eet_shutdown(); - return(-1); + EINA_LOG_ERR("Impossible to create a log domain for eet_main.\n"); + eet_shutdown(); + return(-1); } + if (argc < 2) { - help: - printf("Usage:\n" - " eet -l FILE.EET list all keys in FILE.EET\n" - " eet -x FILE.EET KEY OUT-FILE [CRYPTO_KEY] extract data stored in KEY in FILE.EET and write to OUT-FILE\n" - " eet -d FILE.EET KEY OUT-FILE [CRYPTO_KEY] extract and decode data stored in KEY in FILE.EET and write to OUT-FILE\n" - " eet -i FILE.EET KEY IN-FILE COMPRESS [CRYPTO_KEY] insert data to KEY in FILE.EET from IN-FILE and if COMPRESS is 1, compress it\n" - " eet -e FILE.EET KEY IN-FILE COMPRESS [CRYPTO_KEY] insert and encode to KEY in FILE.EET from IN-FILE and if COMPRESS is 1, compress it\n" - " eet -r FILE.EET KEY remove KEY in FILE.EET\n" - " eet -c FILE.EET report and check the signature information of an eet file\n" - " eet -s FILE.EET PRIVATE_KEY PUBLIC_KEY sign FILE.EET with PRIVATE_KEY and attach PUBLIC_KEY as it's certificate\n" - ); - eet_shutdown(); - return -1; +help: + printf( + "Usage:\n" + " eet -l FILE.EET list all keys in FILE.EET\n" + " eet -x FILE.EET KEY OUT-FILE [CRYPTO_KEY] extract data stored in KEY in FILE.EET and write to OUT-FILE\n" + " eet -d FILE.EET KEY OUT-FILE [CRYPTO_KEY] extract and decode data stored in KEY in FILE.EET and write to OUT-FILE\n" + " eet -i FILE.EET KEY IN-FILE COMPRESS [CRYPTO_KEY] insert data to KEY in FILE.EET from IN-FILE and if COMPRESS is 1, compress it\n" + " eet -e FILE.EET KEY IN-FILE COMPRESS [CRYPTO_KEY] insert and encode to KEY in FILE.EET from IN-FILE and if COMPRESS is 1, compress it\n" + " eet -r FILE.EET KEY remove KEY in FILE.EET\n" + " eet -c FILE.EET report and check the signature information of an eet file\n" + " eet -s FILE.EET PRIVATE_KEY PUBLIC_KEY sign FILE.EET with PRIVATE_KEY and attach PUBLIC_KEY as it's certificate\n" + ); + eet_shutdown(); + return -1; } + if ((!strncmp(argv[1], "-h", 2))) - { - goto help; - } + goto help; else if ((!strcmp(argv[1], "-l")) && (argc > 2)) - { - do_eet_list(argv[2]); - } + do_eet_list(argv[2]); else if ((!strcmp(argv[1], "-x")) && (argc > 4)) { if (argc > 5) - do_eet_extract(argv[2], argv[3], argv[4], argv[5]); - else - do_eet_extract(argv[2], argv[3], argv[4], NULL); + do_eet_extract(argv[2], argv[3], argv[4], argv[5]); + else + do_eet_extract(argv[2], argv[3], argv[4], NULL); } else if ((!strcmp(argv[1], "-d")) && (argc > 4)) { if (argc > 5) - do_eet_decode(argv[2], argv[3], argv[4], argv[5]); - else - do_eet_decode(argv[2], argv[3], argv[4], NULL); + do_eet_decode(argv[2], argv[3], argv[4], argv[5]); + else + do_eet_decode(argv[2], argv[3], argv[4], NULL); } else if ((!strcmp(argv[1], "-i")) && (argc > 5)) { if (argc > 6) - do_eet_insert(argv[2], argv[3], argv[4], atoi(argv[5]), argv[6]); - else - do_eet_insert(argv[2], argv[3], argv[4], atoi(argv[5]), NULL); + do_eet_insert(argv[2], argv[3], argv[4], atoi(argv[5]), argv[6]); + else + do_eet_insert(argv[2], argv[3], argv[4], atoi(argv[5]), NULL); } else if ((!strcmp(argv[1], "-e")) && (argc > 5)) { if (argc > 6) - do_eet_encode(argv[2], argv[3], argv[4], atoi(argv[5]), argv[6]); - else - do_eet_encode(argv[2], argv[3], argv[4], atoi(argv[5]), NULL); + do_eet_encode(argv[2], argv[3], argv[4], atoi(argv[5]), argv[6]); + else + do_eet_encode(argv[2], argv[3], argv[4], atoi(argv[5]), NULL); } else if ((!strcmp(argv[1], "-r")) && (argc > 3)) - { - do_eet_remove(argv[2], argv[3]); - } + do_eet_remove(argv[2], argv[3]); else if ((!strcmp(argv[1], "-c")) && (argc > 2)) - { - do_eet_check(argv[2]); - } + do_eet_check(argv[2]); else if ((!strcmp(argv[1], "-s")) && (argc > 4)) - { - do_eet_sign(argv[2], argv[3], argv[4]); - } + do_eet_sign(argv[2], argv[3], argv[4]); else - { - goto help; - } + goto help; + eina_log_domain_unregister(_eet_main_log_dom); eet_shutdown(); return 0; diff --git a/legacy/eet/src/examples/eet-data-file_descriptor.c b/legacy/eet/src/examples/eet-data-file_descriptor.c index c97b3984e5..a917e1d58b 100644 --- a/legacy/eet/src/examples/eet-data-file_descriptor.c +++ b/legacy/eet/src/examples/eet-data-file_descriptor.c @@ -7,7 +7,8 @@ #include // complex real-world structures based on elmdentica database -typedef struct { +typedef struct +{ const char *screen_name; const char *name; const char *message; @@ -17,19 +18,22 @@ typedef struct { unsigned int timeline; } My_Message; -typedef struct { +typedef struct +{ const char *dm_to; const char *message; } My_Post; -typedef struct { +typedef struct +{ unsigned int id; const char *name; Eina_List *messages; Eina_List *posts; } My_Account; -typedef struct { +typedef struct +{ unsigned int version; // it is recommended to use versioned configuration! Eina_List *accounts; } My_Cache; @@ -74,47 +78,47 @@ _my_cache_descriptor_init(void) // Describe the members to be saved: // Use a temporary macro so we don't type a lot, also avoid errors: -#define ADD_BASIC(member, eet_type) \ - EET_DATA_DESCRIPTOR_ADD_BASIC \ - (_my_message_descriptor, My_Message, #member, member, eet_type) +#define ADD_BASIC(member, eet_type) \ + EET_DATA_DESCRIPTOR_ADD_BASIC \ + (_my_message_descriptor, My_Message, # member, member, eet_type) ADD_BASIC(screen_name, EET_T_STRING); - ADD_BASIC(name, EET_T_STRING); - ADD_BASIC(message, EET_T_STRING); - ADD_BASIC(id, EET_T_UINT); - ADD_BASIC(status_id, EET_T_UINT); - ADD_BASIC(date, EET_T_UINT); - ADD_BASIC(timeline, EET_T_UINT); + ADD_BASIC(name, EET_T_STRING); + ADD_BASIC(message, EET_T_STRING); + ADD_BASIC(id, EET_T_UINT); + ADD_BASIC(status_id, EET_T_UINT); + ADD_BASIC(date, EET_T_UINT); + ADD_BASIC(timeline, EET_T_UINT); #undef ADD_BASIC -#define ADD_BASIC(member, eet_type) \ - EET_DATA_DESCRIPTOR_ADD_BASIC \ - (_my_post_descriptor, My_Post, #member, member, eet_type) - ADD_BASIC(dm_to, EET_T_STRING); +#define ADD_BASIC(member, eet_type) \ + EET_DATA_DESCRIPTOR_ADD_BASIC \ + (_my_post_descriptor, My_Post, # member, member, eet_type) + ADD_BASIC(dm_to, EET_T_STRING); ADD_BASIC(message, EET_T_STRING); #undef ADD_BASIC -#define ADD_BASIC(member, eet_type) \ - EET_DATA_DESCRIPTOR_ADD_BASIC \ - (_my_account_descriptor, My_Account, #member, member, eet_type) +#define ADD_BASIC(member, eet_type) \ + EET_DATA_DESCRIPTOR_ADD_BASIC \ + (_my_account_descriptor, My_Account, # member, member, eet_type) ADD_BASIC(name, EET_T_STRING); - ADD_BASIC(id, EET_T_UINT); + ADD_BASIC(id, EET_T_UINT); #undef ADD_BASIC EET_DATA_DESCRIPTOR_ADD_LIST - (_my_account_descriptor, My_Account, "messages", messages, + (_my_account_descriptor, My_Account, "messages", messages, _my_message_descriptor); EET_DATA_DESCRIPTOR_ADD_LIST - (_my_account_descriptor, My_Account, "posts", posts, + (_my_account_descriptor, My_Account, "posts", posts, _my_post_descriptor); -#define ADD_BASIC(member, eet_type) \ - EET_DATA_DESCRIPTOR_ADD_BASIC \ - (_my_cache_descriptor, My_Cache, #member, member, eet_type) +#define ADD_BASIC(member, eet_type) \ + EET_DATA_DESCRIPTOR_ADD_BASIC \ + (_my_cache_descriptor, My_Cache, # member, member, eet_type) ADD_BASIC(version, EET_T_UINT); #undef ADD_BASIC EET_DATA_DESCRIPTOR_ADD_LIST - (_my_cache_descriptor, My_Cache, "accounts", accounts, + (_my_cache_descriptor, My_Cache, "accounts", accounts, _my_account_descriptor); } @@ -133,9 +137,11 @@ static void _eet_string_free(const char *str) { if (!str) - return; + return; + if ((_my_cache_dict) && (eet_dictionary_string_check(_my_cache_dict, str))) - return; + return; + eina_stringshare_del(str); } @@ -145,9 +151,10 @@ _my_message_new(const char *message) My_Message *msg = calloc(1, sizeof(My_Message)); if (!msg) { - fprintf(stderr, "ERROR: could not calloc My_Message\n"); - return NULL; + fprintf(stderr, "ERROR: could not calloc My_Message\n"); + return NULL; } + msg->message = eina_stringshare_add(message); return msg; } @@ -167,9 +174,10 @@ _my_post_new(const char *message) My_Post *post = calloc(1, sizeof(My_Post)); if (!post) { - fprintf(stderr, "ERROR: could not calloc My_Post\n"); - return NULL; + fprintf(stderr, "ERROR: could not calloc My_Post\n"); + return NULL; } + post->message = eina_stringshare_add(message); return post; } @@ -188,9 +196,10 @@ _my_account_new(const char *name) My_Account *acc = calloc(1, sizeof(My_Account)); if (!acc) { - fprintf(stderr, "ERROR: could not calloc My_Account\n"); - return NULL; + fprintf(stderr, "ERROR: could not calloc My_Account\n"); + return NULL; } + acc->name = eina_stringshare_add(name); return acc; } @@ -204,10 +213,10 @@ _my_account_free(My_Account *acc) _eet_string_free(acc->name); EINA_LIST_FREE(acc->messages, m) - _my_message_free(m); + _my_message_free(m); EINA_LIST_FREE(acc->posts, p) - _my_post_free(p); + _my_post_free(p); free(acc); } @@ -218,8 +227,8 @@ _my_cache_new(void) My_Cache *my_cache = calloc(1, sizeof(My_Cache)); if (!my_cache) { - fprintf(stderr, "ERROR: could not calloc My_Cache\n"); - return NULL; + fprintf(stderr, "ERROR: could not calloc My_Cache\n"); + return NULL; } my_cache->version = 1; @@ -231,7 +240,7 @@ _my_cache_free(My_Cache *my_cache) { My_Account *acc; EINA_LIST_FREE(my_cache->accounts, acc) - _my_account_free(acc); + _my_account_free(acc); free(my_cache); } @@ -241,8 +250,9 @@ _my_cache_account_find(My_Cache *my_cache, const char *name) My_Account *acc; Eina_List *l; EINA_LIST_FOREACH(my_cache->accounts, l, acc) - if (strcmp(acc->name, name) == 0) - return acc; + if (strcmp(acc->name, name) == 0) + return acc; + return NULL; } @@ -253,28 +263,29 @@ _my_cache_load(const char *filename) Eet_File *ef = eet_open(filename, EET_FILE_MODE_READ); if (!ef) { - fprintf(stderr, "ERROR: could not open '%s' for read\n", filename); - return NULL; + fprintf(stderr, "ERROR: could not open '%s' for read\n", filename); + return NULL; } my_cache = eet_data_read(ef, _my_cache_descriptor, MY_CACHE_FILE_ENTRY); if (!my_cache) { - eet_close(ef); - return NULL; + eet_close(ef); + return NULL; } if (my_cache->version < 1) { - fprintf(stderr, - "WARNING: version %#x was too old, upgrading it to %#x\n", - my_cache->version, 1); + fprintf(stderr, + "WARNING: version %#x was too old, upgrading it to %#x\n", + my_cache->version, 1); - my_cache->version = 1; + my_cache->version = 1; } if (_my_cache_file) - eet_close(_my_cache_file); + eet_close(_my_cache_file); + _my_cache_file = ef; _my_cache_dict = eet_dictionary_get(ef); @@ -293,27 +304,27 @@ _my_cache_save(const My_Cache *my_cache, const char *filename) len = eina_strlcpy(tmp, filename, sizeof(tmp)); if (len + 12 >= (int)sizeof(tmp)) { - fprintf(stderr, "ERROR: file name is too big: %s\n", filename); - return EINA_FALSE; + fprintf(stderr, "ERROR: file name is too big: %s\n", filename); + return EINA_FALSE; } i = 0; do { - snprintf(tmp + len, 12, ".%u", i); - i++; + snprintf(tmp + len, 12, ".%u", i); + i++; } while (stat(tmp, &st) == 0); ef = eet_open(tmp, EET_FILE_MODE_WRITE); if (!ef) { - fprintf(stderr, "ERROR: could not open '%s' for write\n", tmp); - return EINA_FALSE; + fprintf(stderr, "ERROR: could not open '%s' for write\n", tmp); + return EINA_FALSE; } ret = eet_data_write - (ef, _my_cache_descriptor, MY_CACHE_FILE_ENTRY, my_cache, EINA_TRUE); + (ef, _my_cache_descriptor, MY_CACHE_FILE_ENTRY, my_cache, EINA_TRUE); // VERY IMPORTANT NOTE: // after eet_close(), all strings mmaped from file will be GONE, invalid! @@ -327,8 +338,8 @@ _my_cache_save(const My_Cache *my_cache, const char *filename) if (ret) { - unlink(filename); - rename(tmp, filename); + unlink(filename); + rename(tmp, filename); } return ret; @@ -343,15 +354,15 @@ int main(int argc, char *argv[]) if (argc < 3) { - fprintf(stderr, - "Usage:\n\t%s [action] [action-params]\n\n" - "Where actions and their parameters:\n" - "\tacc \n" - "\tpost \n" - "\tmessage \n" - "\n", - argv[0]); - return -1; + fprintf(stderr, + "Usage:\n\t%s [action] [action-params]\n\n" + "Where actions and their parameters:\n" + "\tacc \n" + "\tpost \n" + "\tmessage \n" + "\n", + argv[0]); + return -1; } eina_init(); @@ -361,127 +372,131 @@ int main(int argc, char *argv[]) my_cache = _my_cache_load(argv[1]); if (!my_cache) { - printf("creating new cache.\n"); - my_cache = _my_cache_new(); - if (!my_cache) - { - ret = -2; - goto end; - } + printf("creating new cache.\n"); + my_cache = _my_cache_new(); + if (!my_cache) + { + ret = -2; + goto end; + } } if (argc > 3) { - if (strcmp(argv[3], "acc") == 0) - { - if (argc == 5) - { - My_Account *acc = _my_cache_account_find(my_cache, argv[4]); - if (!acc) - { - acc = _my_account_new(argv[4]); - my_cache->accounts = eina_list_append - (my_cache->accounts, acc); - } - else - fprintf(stderr, "ERROR: account '%s' already exists.\n", - argv[4]); - } - else - fprintf(stderr, "ERROR: wrong number of parameters (%d).\n", - argc); - } - else if (strcmp(argv[3], "post") == 0) - { - if (argc == 6) - { - My_Account *acc = _my_cache_account_find(my_cache, argv[4]); - if (acc) - { - My_Post *post = _my_post_new(argv[5]); - acc->posts = eina_list_append(acc->posts, post); - } - else - fprintf(stderr, "ERROR: unknown account: '%s'\n", argv[4]); - } - else - fprintf(stderr, "ERROR: wrong number of parameters (%d).\n", - argc); - } - else if (strcmp(argv[3], "message") == 0) - { - if (argc == 6) - { - My_Account *acc = _my_cache_account_find(my_cache, argv[4]); - if (acc) - { - My_Message *msg = _my_message_new(argv[5]); - acc->messages = eina_list_append(acc->messages, msg); - } - else - fprintf(stderr, "ERROR: unknown account: '%s'\n", argv[4]); - } - else - fprintf(stderr, "ERROR: wrong number of parameters (%d).\n", - argc); - } - else - fprintf(stderr, "ERROR: unknown action '%s'\n", argv[2]); + if (strcmp(argv[3], "acc") == 0) + { + if (argc == 5) + { + My_Account *acc = _my_cache_account_find(my_cache, argv[4]); + if (!acc) + { + acc = _my_account_new(argv[4]); + my_cache->accounts = eina_list_append + (my_cache->accounts, acc); + } + else + fprintf(stderr, "ERROR: account '%s' already exists.\n", + argv[4]); + } + else + fprintf(stderr, + "ERROR: wrong number of parameters (%d).\n", + argc); + } + else if (strcmp(argv[3], "post") == 0) + { + if (argc == 6) + { + My_Account *acc = _my_cache_account_find(my_cache, argv[4]); + if (acc) + { + My_Post *post = _my_post_new(argv[5]); + acc->posts = eina_list_append(acc->posts, post); + } + else + fprintf(stderr, "ERROR: unknown account: '%s'\n", argv[4]); + } + else + fprintf(stderr, + "ERROR: wrong number of parameters (%d).\n", + argc); + } + else if (strcmp(argv[3], "message") == 0) + { + if (argc == 6) + { + My_Account *acc = _my_cache_account_find(my_cache, argv[4]); + if (acc) + { + My_Message *msg = _my_message_new(argv[5]); + acc->messages = eina_list_append(acc->messages, msg); + } + else + fprintf(stderr, "ERROR: unknown account: '%s'\n", argv[4]); + } + else + fprintf(stderr, + "ERROR: wrong number of parameters (%d).\n", + argc); + } + else + fprintf(stderr, "ERROR: unknown action '%s'\n", argv[2]); } - printf("My_Cache:\n" - "\tversion.: %#x\n" - "\taccounts: %u\n", - my_cache->version, - eina_list_count(my_cache->accounts)); + printf("My_Cache:\n" + "\tversion.: %#x\n" + "\taccounts: %u\n", + my_cache->version, + eina_list_count(my_cache->accounts)); EINA_LIST_FOREACH(my_cache->accounts, l_acc, acc) - { - const My_Post *post; + { + const My_Post *post; - printf("\t > %-#8x '%.20s' stats: m=%u, p=%u\n", - acc->id, acc->name ? acc->name : "", - eina_list_count(acc->messages), - eina_list_count(acc->posts)); + printf("\t > %-#8x '%.20s' stats: m=%u, p=%u\n", + acc->id, acc->name ? acc->name : "", + eina_list_count(acc->messages), + eina_list_count(acc->posts)); - if (eina_list_count(acc->messages)) - { - const Eina_List *l; - const My_Message *msg; - printf("\t |messages:\n"); + if (eina_list_count(acc->messages)) + { + const Eina_List *l; + const My_Message *msg; + printf("\t |messages:\n"); - EINA_LIST_FOREACH(acc->messages, l, msg) - { - printf("\t | %-8x '%s' [%s]: '%.20s'\n", - msg->id, - msg->name ? msg->name : "", - msg->screen_name ? msg->screen_name : "", - msg->message ? msg->message : ""); - } - } + EINA_LIST_FOREACH(acc->messages, l, msg) + { + printf("\t | %-8x '%s' [%s]: '%.20s'\n", + msg->id, + msg->name ? msg->name : "", + msg->screen_name ? msg->screen_name : "", + msg->message ? msg->message : ""); + } + } - if (eina_list_count(acc->posts)) - { - const Eina_List *l; - const My_Post *post; - printf("\t |posts:\n"); + if (eina_list_count(acc->posts)) + { + const Eina_List *l; + const My_Post *post; + printf("\t |posts:\n"); - EINA_LIST_FOREACH(acc->posts, l, post) - { - if (post->dm_to) - printf("\t | @%s: '%.20s'\n", post->dm_to, post->message); - else - printf("\t | '%.20s'\n", post->message); - } - } - printf("\n"); - } + EINA_LIST_FOREACH(acc->posts, l, post) + { + if (post->dm_to) + printf("\t | @%s: '%.20s'\n", post->dm_to, post->message); + else + printf("\t | '%.20s'\n", post->message); + } + } + + printf("\n"); + } if (!_my_cache_save(my_cache, argv[2])) - ret = -3; + ret = -3; _my_cache_free(my_cache); - end: +end: _my_cache_descriptor_shutdown(); eet_shutdown(); eina_shutdown(); diff --git a/legacy/eet/src/examples/eet-data-nested.c b/legacy/eet/src/examples/eet-data-nested.c index 52a095d3c1..3675718a03 100644 --- a/legacy/eet/src/examples/eet-data-nested.c +++ b/legacy/eet/src/examples/eet-data-nested.c @@ -11,7 +11,8 @@ // will be automatically handled. The other members will have their // space reserved and zeroed (as it uses calloc()), but not // saved or loaded from eet files. -typedef struct { +typedef struct +{ unsigned int version; // it is recommended to use versioned configuration! const char *name; int id; @@ -20,7 +21,8 @@ typedef struct { Eina_List *subs; } My_Conf_Type; -typedef struct { +typedef struct +{ const char *server; int port; } My_Conf_Subtype; @@ -62,24 +64,24 @@ _my_conf_descriptor_init(void) // Describe the members to be saved: // Use a temporary macro so we don't type a lot, also avoid errors: -#define MY_CONF_ADD_BASIC(member, eet_type) \ - EET_DATA_DESCRIPTOR_ADD_BASIC \ - (_my_conf_descriptor, My_Conf_Type, #member, member, eet_type) -#define MY_CONF_SUB_ADD_BASIC(member, eet_type) \ - EET_DATA_DESCRIPTOR_ADD_BASIC \ - (_my_conf_sub_descriptor, My_Conf_Subtype, #member, member, eet_type) +#define MY_CONF_ADD_BASIC(member, eet_type) \ + EET_DATA_DESCRIPTOR_ADD_BASIC \ + (_my_conf_descriptor, My_Conf_Type, # member, member, eet_type) +#define MY_CONF_SUB_ADD_BASIC(member, eet_type) \ + EET_DATA_DESCRIPTOR_ADD_BASIC \ + (_my_conf_sub_descriptor, My_Conf_Subtype, # member, member, eet_type) MY_CONF_SUB_ADD_BASIC(server, EET_T_STRING); - MY_CONF_SUB_ADD_BASIC(port, EET_T_INT); + MY_CONF_SUB_ADD_BASIC(port, EET_T_INT); MY_CONF_ADD_BASIC(version, EET_T_UINT); - MY_CONF_ADD_BASIC(name, EET_T_STRING); - MY_CONF_ADD_BASIC(id, EET_T_INT); + MY_CONF_ADD_BASIC(name, EET_T_STRING); + MY_CONF_ADD_BASIC(id, EET_T_INT); MY_CONF_ADD_BASIC(enabled, EET_T_UCHAR); // And add the sub descriptor as a linked list at 'subs' in the main struct EET_DATA_DESCRIPTOR_ADD_LIST - (_my_conf_descriptor, My_Conf_Type, "subs", subs, _my_conf_sub_descriptor); + (_my_conf_descriptor, My_Conf_Type, "subs", subs, _my_conf_sub_descriptor); #undef MY_CONF_ADD_BASIC #undef MY_CONF_SUB_ADD_BASIC @@ -99,8 +101,8 @@ _my_conf_new(void) My_Conf_Subtype *sub; if (!my_conf) { - fprintf(stderr, "ERROR: could not calloc My_Conf_Type\n"); - return NULL; + fprintf(stderr, "ERROR: could not calloc My_Conf_Type\n"); + return NULL; } my_conf->version = 0x112233; @@ -109,9 +111,9 @@ _my_conf_new(void) sub = calloc(1, sizeof(My_Conf_Subtype)); if (sub) { - sub->server = eina_stringshare_add("my-server.com"); - sub->port = 1234; - my_conf->subs = eina_list_append(my_conf->subs, sub); + sub->server = eina_stringshare_add("my-server.com"); + sub->port = 1234; + my_conf->subs = eina_list_append(my_conf->subs, sub); } return my_conf; @@ -122,10 +124,10 @@ _my_conf_free(My_Conf_Type *my_conf) { My_Conf_Subtype *sub; EINA_LIST_FREE(my_conf->subs, sub) - { - eina_stringshare_del(sub->server); - free(sub); - } + { + eina_stringshare_del(sub->server); + free(sub); + } eina_stringshare_del(my_conf->name); free(my_conf); @@ -138,25 +140,25 @@ _my_conf_load(const char *filename) Eet_File *ef = eet_open(filename, EET_FILE_MODE_READ); if (!ef) { - fprintf(stderr, "ERROR: could not open '%s' for read\n", filename); - return NULL; + fprintf(stderr, "ERROR: could not open '%s' for read\n", filename); + return NULL; } my_conf = eet_data_read(ef, _my_conf_descriptor, MY_CONF_FILE_ENTRY); if (!my_conf) - goto end; + goto end; if (my_conf->version < 0x112233) { - fprintf(stderr, - "WARNING: version %#x was too old, upgrading it to %#x\n", - my_conf->version, 0x112233); + fprintf(stderr, + "WARNING: version %#x was too old, upgrading it to %#x\n", + my_conf->version, 0x112233); - my_conf->version = 0x112233; - my_conf->enabled = EINA_TRUE; + my_conf->version = 0x112233; + my_conf->enabled = EINA_TRUE; } - end: +end: eet_close(ef); return my_conf; } @@ -173,33 +175,33 @@ _my_conf_save(const My_Conf_Type *my_conf, const char *filename) len = eina_strlcpy(tmp, filename, sizeof(tmp)); if (len + 12 >= (int)sizeof(tmp)) { - fprintf(stderr, "ERROR: file name is too big: %s\n", filename); - return EINA_FALSE; + fprintf(stderr, "ERROR: file name is too big: %s\n", filename); + return EINA_FALSE; } i = 0; do { - snprintf(tmp + len, 12, ".%u", i); - i++; + snprintf(tmp + len, 12, ".%u", i); + i++; } while (stat(tmp, &st) == 0); ef = eet_open(tmp, EET_FILE_MODE_WRITE); if (!ef) { - fprintf(stderr, "ERROR: could not open '%s' for write\n", tmp); - return EINA_FALSE; + fprintf(stderr, "ERROR: could not open '%s' for write\n", tmp); + return EINA_FALSE; } ret = eet_data_write - (ef, _my_conf_descriptor, MY_CONF_FILE_ENTRY, my_conf, EINA_TRUE); + (ef, _my_conf_descriptor, MY_CONF_FILE_ENTRY, my_conf, EINA_TRUE); eet_close(ef); if (ret) { - unlink(filename); - rename(tmp, filename); + unlink(filename); + rename(tmp, filename); } return ret; @@ -214,8 +216,8 @@ int main(int argc, char *argv[]) if (argc != 3) { - fprintf(stderr, "Usage:\n\t%s \n\n", argv[0]); - return -1; + fprintf(stderr, "Usage:\n\t%s \n\n", argv[0]); + return -1; } eina_init(); @@ -225,37 +227,37 @@ int main(int argc, char *argv[]) my_conf = _my_conf_load(argv[1]); if (!my_conf) { - printf("creating new configuration.\n"); - my_conf = _my_conf_new(); - if (!my_conf) - { - ret = -2; - goto end; - } + printf("creating new configuration.\n"); + my_conf = _my_conf_new(); + if (!my_conf) + { + ret = -2; + goto end; + } } - printf("My_Conf_Type:\n" - "\tversion: %#x\n" - "\tname...: '%s'\n" - "\tid.....: %d\n" - "\tenabled: %hhu\n" - "\tsubs...:\n", - my_conf->version, - my_conf->name ? my_conf->name : "", - my_conf->id, - my_conf->enabled); + printf("My_Conf_Type:\n" + "\tversion: %#x\n" + "\tname...: '%s'\n" + "\tid.....: %d\n" + "\tenabled: %hhu\n" + "\tsubs...:\n", + my_conf->version, + my_conf->name ? my_conf->name : "", + my_conf->id, + my_conf->enabled); EINA_LIST_FOREACH(my_conf->subs, l, sub) - printf("\t\tserver: '%s', port: %d\n", - sub->server ? sub->server : "", - sub->port); + printf("\t\tserver: '%s', port: %d\n", + sub->server ? sub->server : "", + sub->port); if (!_my_conf_save(my_conf, argv[2])) - ret = -3; + ret = -3; _my_conf_free(my_conf); - end: +end: _my_conf_descriptor_shutdown(); eet_shutdown(); eina_shutdown(); diff --git a/legacy/eet/src/examples/eet-data-simple.c b/legacy/eet/src/examples/eet-data-simple.c index 72d00c96d9..a4efd4ad7a 100644 --- a/legacy/eet/src/examples/eet-data-simple.c +++ b/legacy/eet/src/examples/eet-data-simple.c @@ -11,7 +11,8 @@ // will be automatically handled. The other members will have their // space reserved and zeroed (as it uses calloc()), but not // saved or loaded from eet files. -typedef struct { +typedef struct +{ unsigned int version; // it is recommended to use versioned configuration! const char *name; int id; @@ -52,13 +53,13 @@ _my_conf_descriptor_init(void) // Describe the members to be saved: // Use a temporary macro so we don't type a lot, also avoid errors: -#define MY_CONF_ADD_BASIC(member, eet_type) \ - EET_DATA_DESCRIPTOR_ADD_BASIC \ - (_my_conf_descriptor, My_Conf_Type, #member, member, eet_type) +#define MY_CONF_ADD_BASIC(member, eet_type) \ + EET_DATA_DESCRIPTOR_ADD_BASIC \ + (_my_conf_descriptor, My_Conf_Type, # member, member, eet_type) MY_CONF_ADD_BASIC(version, EET_T_UINT); - MY_CONF_ADD_BASIC(name, EET_T_STRING); - MY_CONF_ADD_BASIC(id, EET_T_INT); + MY_CONF_ADD_BASIC(name, EET_T_STRING); + MY_CONF_ADD_BASIC(id, EET_T_INT); MY_CONF_ADD_BASIC(enabled, EET_T_UCHAR); #undef MY_CONF_ADD_BASIC @@ -76,8 +77,8 @@ _my_conf_new(void) My_Conf_Type *my_conf = calloc(1, sizeof(My_Conf_Type)); if (!my_conf) { - fprintf(stderr, "ERROR: could not calloc My_Conf_Type\n"); - return NULL; + fprintf(stderr, "ERROR: could not calloc My_Conf_Type\n"); + return NULL; } my_conf->version = 0x112233; @@ -99,25 +100,25 @@ _my_conf_load(const char *filename) Eet_File *ef = eet_open(filename, EET_FILE_MODE_READ); if (!ef) { - fprintf(stderr, "ERROR: could not open '%s' for read\n", filename); - return NULL; + fprintf(stderr, "ERROR: could not open '%s' for read\n", filename); + return NULL; } my_conf = eet_data_read(ef, _my_conf_descriptor, MY_CONF_FILE_ENTRY); if (!my_conf) - goto end; + goto end; if (my_conf->version < 0x112233) { - fprintf(stderr, - "WARNING: version %#x was too old, upgrading it to %#x\n", - my_conf->version, 0x112233); + fprintf(stderr, + "WARNING: version %#x was too old, upgrading it to %#x\n", + my_conf->version, 0x112233); - my_conf->version = 0x112233; - my_conf->enabled = EINA_TRUE; + my_conf->version = 0x112233; + my_conf->enabled = EINA_TRUE; } - end: +end: eet_close(ef); return my_conf; } @@ -134,33 +135,33 @@ _my_conf_save(const My_Conf_Type *my_conf, const char *filename) len = eina_strlcpy(tmp, filename, sizeof(tmp)); if (len + 12 >= (int)sizeof(tmp)) { - fprintf(stderr, "ERROR: file name is too big: %s\n", filename); - return EINA_FALSE; + fprintf(stderr, "ERROR: file name is too big: %s\n", filename); + return EINA_FALSE; } i = 0; do { - snprintf(tmp + len, 12, ".%u", i); - i++; + snprintf(tmp + len, 12, ".%u", i); + i++; } while (stat(tmp, &st) == 0); ef = eet_open(tmp, EET_FILE_MODE_WRITE); if (!ef) { - fprintf(stderr, "ERROR: could not open '%s' for write\n", tmp); - return EINA_FALSE; + fprintf(stderr, "ERROR: could not open '%s' for write\n", tmp); + return EINA_FALSE; } ret = eet_data_write - (ef, _my_conf_descriptor, MY_CONF_FILE_ENTRY, my_conf, EINA_TRUE); + (ef, _my_conf_descriptor, MY_CONF_FILE_ENTRY, my_conf, EINA_TRUE); eet_close(ef); if (ret) { - unlink(filename); - rename(tmp, filename); + unlink(filename); + rename(tmp, filename); } return ret; @@ -173,8 +174,8 @@ int main(int argc, char *argv[]) if (argc != 3) { - fprintf(stderr, "Usage:\n\t%s \n\n", argv[0]); - return -1; + fprintf(stderr, "Usage:\n\t%s \n\n", argv[0]); + return -1; } eina_init(); @@ -184,31 +185,31 @@ int main(int argc, char *argv[]) my_conf = _my_conf_load(argv[1]); if (!my_conf) { - printf("creating new configuration.\n"); - my_conf = _my_conf_new(); - if (!my_conf) - { - ret = -2; - goto end; - } + printf("creating new configuration.\n"); + my_conf = _my_conf_new(); + if (!my_conf) + { + ret = -2; + goto end; + } } - printf("My_Conf_Type:\n" - "\tversion: %#x\n" - "\tname...: '%s'\n" - "\tid.....: %d\n" - "\tenabled: %hhu\n", - my_conf->version, - my_conf->name ? my_conf->name : "", - my_conf->id, - my_conf->enabled); + printf("My_Conf_Type:\n" + "\tversion: %#x\n" + "\tname...: '%s'\n" + "\tid.....: %d\n" + "\tenabled: %hhu\n", + my_conf->version, + my_conf->name ? my_conf->name : "", + my_conf->id, + my_conf->enabled); if (!_my_conf_save(my_conf, argv[2])) - ret = -3; + ret = -3; _my_conf_free(my_conf); - end: +end: _my_conf_descriptor_shutdown(); eet_shutdown(); eina_shutdown(); diff --git a/legacy/eet/src/lib/Eet.h b/legacy/eet/src/lib/Eet.h index 78532185a0..2104d8068d 100644 --- a/legacy/eet/src/lib/Eet.h +++ b/legacy/eet/src/lib/Eet.h @@ -34,1491 +34,1653 @@ #ifdef __cplusplus extern "C" { #endif - - /** - * @file Eet.h - * @brief The file that provides the eet functions. - * - * This header provides the Eet management functions. - * - */ + +/** + * @file Eet.h + * @brief The file that provides the eet functions. + * + * This header provides the Eet management functions. + * + */ #define EET_VERSION_MAJOR 1 #define EET_VERSION_MINOR 3 - /** - * @typedef Eet_Version - * - * This is the Eet version information structure that can be used at - * runtiime to detect which version of eet is being used and adapt - * appropriately as follows for example: - * - * @code - * #if defined(EET_VERSION_MAJOR) && (EET_VERSION_MAJOR >= 1) && defined(EET_VERSION_MINOR) && (EET_VERSION_MINOR > 2) - * printf("Eet version: %i.%i.%i\n", - * eet_version->major, - * eet_version->minor, - * eet_version->micro); - * if (eet_version->revision > 0) - * { - * printf(" Built from SVN revision # %i\n", eet_version->revision); - * } - * #endif - * @endcode - * - * Note the #if check can be dropped if your program refuses to compile or - * work with an Eet version less than 1.3.0. - */ - typedef struct _Eet_Version - { - int major; /** < major (binary or source incompatible changes) */ - int minor; /** < minor (new features, bugfixes, major improvements version) */ - int micro; /** < micro (bugfix, internal improvements, no new features version) */ - int revision; /** < svn revision (0 if a proper rlease or the svn revsion number Eet is built from) */ - } Eet_Version; - - EAPI extern Eet_Version *eet_version; - - /** - * @defgroup Eet_Group Top level functions - * Functions that affect Eet as a whole. - * - * @{ - */ - - /** - * @enum _Eet_Error - * All the error identifiers known by Eet. - */ - typedef enum _Eet_Error - { - EET_ERROR_NONE, /**< No error, it's all fine! */ - EET_ERROR_BAD_OBJECT, /**< Given object or handle is NULL or invalid */ - EET_ERROR_EMPTY, /**< There was nothing to do */ - EET_ERROR_NOT_WRITABLE, /**< Could not write to file or fine is #EET_FILE_MODE_READ */ - EET_ERROR_OUT_OF_MEMORY, /**< Could not allocate memory */ - EET_ERROR_WRITE_ERROR, /**< Failed to write data to destination */ - EET_ERROR_WRITE_ERROR_FILE_TOO_BIG, /**< Failed to write file since it is too big */ - EET_ERROR_WRITE_ERROR_IO_ERROR, /**< Failed to write since generic Input/Output error */ - EET_ERROR_WRITE_ERROR_OUT_OF_SPACE, /**< Failed to write due out of space */ - EET_ERROR_WRITE_ERROR_FILE_CLOSED, /**< Failed to write because file was closed */ - EET_ERROR_MMAP_FAILED, /**< Could not mmap file */ - EET_ERROR_X509_ENCODING_FAILED, /**< Could not encode using X509 */ - EET_ERROR_SIGNATURE_FAILED, /**< Could not validate signature */ - EET_ERROR_INVALID_SIGNATURE, /**< Signature is invalid */ - EET_ERROR_NOT_SIGNED, /**< File or contents are not signed */ - EET_ERROR_NOT_IMPLEMENTED, /**< Function is not implemented */ - EET_ERROR_PRNG_NOT_SEEDED, /**< Could not introduce random seed */ - EET_ERROR_ENCRYPT_FAILED, /**< Could not encrypt contents */ - EET_ERROR_DECRYPT_FAILED /**< Could not decrypt contents */ - } Eet_Error; /**< Eet error identifiers */ - - /** - * @} - */ - - /** - * Initialize the EET library. - * - * @return The new init count. - * - * @since 1.0.0 - * @ingroup Eet_Group - */ - EAPI int eet_init(void); - - /** - * Shut down the EET library. - * - * @return The new init count. - * - * @since 1.0.0 - * @ingroup Eet_Group - */ - EAPI int eet_shutdown(void); - - /** - * Clear eet cache - * - * Eet didn't free items by default. If you are under memory - * presure, just call this function to recall all memory that are - * not yet referenced anymore. The cache take care of modification - * on disk. - * - * @since 1.0.0 - * @ingroup Eet_Group - */ - EAPI void eet_clearcache(void); - - - /** - * @defgroup Eet_File_Group Eet File Main Functions - * - * Functions to create, destroy and do basic manipulation of - * #Eet_File handles. - * - * @{ - */ - - /** - * @enum _Eet_File_Mode - * Modes that a file can be opened. - */ - typedef enum _Eet_File_Mode - { - EET_FILE_MODE_INVALID = -1, - EET_FILE_MODE_READ, /**< File is read-only. */ - EET_FILE_MODE_WRITE, /**< File is write-only. */ - EET_FILE_MODE_READ_WRITE /**< File is for both read and write */ - } Eet_File_Mode; /**< Modes that a file can be opened. */ - - /** - * @typedef Eet_File - * Opaque handle that defines an Eet file (or memory). - * - * @see eet_open() - * @see eet_memopen_read() - * @see eet_close() - */ - typedef struct _Eet_File Eet_File; - - /** - * @typedef Eet_Dictionary - * Opaque handle that defines a file-backed (mmaped) dictionary of strings. - */ - typedef struct _Eet_Dictionary Eet_Dictionary; - - - /** - * @} - */ - - /** - * Open an eet file on disk, and returns a handle to it. - * @param file The file path to the eet file. eg: @c "/tmp/file.eet". - * @param mode The mode for opening. Either #EET_FILE_MODE_READ, - * #EET_FILE_MODE_WRITE or #EET_FILE_MODE_READ_WRITE. - * @return An opened eet file handle. - * @ingroup Eet_File_Group - * - * This function will open an exiting eet file for reading, and build - * the directory table in memory and return a handle to the file, if it - * exists and can be read, and no memory errors occur on the way, otherwise - * NULL will be returned. - * - * It will also open an eet file for writing. This will, if successful, - * delete the original file and replace it with a new empty file, till - * the eet file handle is closed or flushed. If it cannot be opened for - * writing or a memory error occurs, NULL is returned. - * - * You can also open the file for read/write. If you then write a key that - * does not exist it will be created, if the key exists it will be replaced - * by the new data. - * - * Example: - * @code - * #include - * #include - * #include - * - * int - * main(int argc, char **argv) - * { - * Eet_File *ef; - * char buf[1024], *ret, **list; - * int size, num, i; - * - * eet_init(); - * - * strcpy(buf, "Here is a string of data to save!"); - * - * ef = eet_open("/tmp/my_file.eet", EET_FILE_MODE_WRITE); - * if (!ef) return -1; - * if (!eet_write(ef, "/key/to_store/at", buf, 1024, 1)) - * fprintf(stderr, "Error writing data!\n"); - * eet_close(ef); - * - * ef = eet_open("/tmp/my_file.eet", EET_FILE_MODE_READ); - * if (!ef) return -1; - * list = eet_list(ef, "*", &num); - * if (list) - * { - * for (i = 0; i < num; i++) - * printf("Key stored: %s\n", list[i]); - * free(list); - * } - * ret = eet_read(ef, "/key/to_store/at", &size); - * if (ret) - * { - * printf("Data read (%i bytes):\n%s\n", size, ret); - * free(ret); - * } - * eet_close(ef); - * - * eet_shutdown(); - * - * return 0; - * } - * @endcode - * - * @since 1.0.0 - */ - EAPI Eet_File *eet_open(const char *file, Eet_File_Mode mode); - - /** - * Open an eet file directly from a memory location. The data are not copied, - * so you must keep them around as long as the eet file is open. Their is - * currently no cache for this kind of Eet_File, so it's reopen every time - * you do use eet_memopen_read. - * - * @since 1.1.0 - * @ingroup Eet_File_Group - */ - EAPI Eet_File *eet_memopen_read(const void *data, size_t size); - - /** - * Get the mode an Eet_File was opened with. - * @param ef A valid eet file handle. - * @return The mode ef was opened with. - * - * @since 1.0.0 - * @ingroup Eet_File_Group - */ - EAPI Eet_File_Mode eet_mode_get(Eet_File *ef); - - /** - * Close an eet file handle and flush and writes pending. - * @param ef A valid eet file handle. - * - * This function will flush any pending writes to disk if the eet file - * was opened for write, and free all data associated with the file handle - * and file, and close the file. - * - * If the eet file handle is not valid nothing will be done. - * - * @since 1.0.0 - * @ingroup Eet_File_Group - */ - EAPI Eet_Error eet_close(Eet_File *ef); - - /** - * Sync content of an eet file handle, flushing pending writes. - * @param ef A valid eet file handle. - * - * This function will flush any pending writes to disk. The eet file must - * be opened for write. - * - * If the eet file handle is not valid nothing will be done. - * - * @since 1.2.4 - * @ingroup Eet_File_Group - */ - EAPI Eet_Error eet_sync(Eet_File *ef); - - /** - * Return a handle to the shared string dictionary of the Eet file - * @param ef A valid eet file handle. - * @return A handle to the dictionary of the file - * - * This function returns a handle to the dictionary of an Eet file whose - * handle is @p ef, if a dictionary exists. NULL is returned otherwise or - * if the file handle is known to be invalid. - * - * @see eet_dictionary_string_check() to know if given string came - * from the dictionary or it was dynamically allocated using - * the #Eet_Data_Descriptor_Class instructrions. - * - * @since 1.0.0 - * @ingroup Eet_File_Group - */ - EAPI Eet_Dictionary *eet_dictionary_get(Eet_File *ef); - - /** - * Check if a given string comes from a given dictionary - * @param ed A valid dictionary handle - * @param string A valid 0 byte terminated C string - * @return 1 if it is in the dictionary, 0 otherwise - * - * This checks the given dictionary to see if the given string is actually - * inside that dictionary (i.e. comes from it) and returns 1 if it does. - * If the dictionary handle is invlide, the string is NULL or the string is - * not in the dictionary, 0 is returned. - * - * @since 1.0.0 - * @ingroup Eet_File_Group - */ - EAPI int eet_dictionary_string_check(Eet_Dictionary *ed, const char *string); - - /** - * Read a specified entry from an eet file and return data - * @param ef A valid eet file handle opened for reading. - * @param name Name of the entry. eg: "/base/file_i_want". - * @param size_ret Number of bytes read from entry and returned. - * @return The data stored in that entry in the eet file. - * - * This function finds an entry in the eet file that is stored under the - * name specified, and returns that data, decompressed, if successful. - * NULL is returned if the lookup fails or if memory errors are - * encountered. It is the job of the calling program to call free() on - * the returned data. The number of bytes in the returned data chunk are - * placed in size_ret. - * - * If the eet file handle is not valid NULL is returned and size_ret is - * filled with 0. - * - * @see eet_read_cipher() - * - * @since 1.0.0 - * @ingroup Eet_File_Group - */ - EAPI void *eet_read(Eet_File *ef, const char *name, int *size_ret); - - /** - * Read a specified entry from an eet file and return data - * @param ef A valid eet file handle opened for reading. - * @param name Name of the entry. eg: "/base/file_i_want". - * @param size_ret Number of bytes read from entry and returned. - * @return The data stored in that entry in the eet file. - * - * This function finds an entry in the eet file that is stored under the - * name specified, and returns that data if not compressed and successful. - * NULL is returned if the lookup fails or if memory errors are - * encountered or if the data is comrpessed. The calling program must never - * call free() on the returned data. The number of bytes in the returned - * data chunk are placed in size_ret. - * - * If the eet file handle is not valid NULL is returned and size_ret is - * filled with 0. - * - * @since 1.0.0 - * @ingroup Eet_File_Group - */ - EAPI const void *eet_read_direct(Eet_File *ef, const char *name, int *size_ret); - - /** - * Write a specified entry to an eet file handle - * @param ef A valid eet file handle opened for writing. - * @param name Name of the entry. eg: "/base/file_i_want". - * @param data Pointer to the data to be stored. - * @param size Length in bytes in the data to be stored. - * @param compress Compression flags (1 == compress, 0 = don't compress). - * @return bytes written on successful write, 0 on failure. - * - * This function will write the specified chunk of data to the eet file - * and return greater than 0 on success. 0 will be returned on failure. - * - * The eet file handle must be a valid file handle for an eet file opened - * for writing. If it is not, 0 will be returned and no action will be - * performed. - * - * Name, and data must not be NULL, and size must be > 0. If these - * conditions are not met, 0 will be returned. - * - * The data will be copied (and optionally compressed) in ram, pending - * a flush to disk (it will stay in ram till the eet file handle is - * closed though). - * - * @see eet_write_cipher() - * - * @since 1.0.0 - * @ingroup Eet_File_Group - */ - EAPI int eet_write(Eet_File *ef, const char *name, const void *data, int size, int compress); - - /** - * Delete a specified entry from an Eet file being written or re-written - * @param ef A valid eet file handle opened for writing. - * @param name Name of the entry. eg: "/base/file_i_want". - * @return Success or failure of the delete. - * - * This function will delete the specified chunk of data from the eet file - * and return greater than 0 on success. 0 will be returned on failure. - * - * The eet file handle must be a valid file handle for an eet file opened - * for writing. If it is not, 0 will be returned and no action will be - * performed. - * - * Name, must not be NULL, otherwise 0 will be returned. - * - * @since 1.0.0 - * @ingroup Eet_File_Group - */ - EAPI int eet_delete(Eet_File *ef, const char *name); - - /** - * Alias a specific section to another one. Destination may exist or not, - * no check are done. - * @param ef A valid eet file handle opened for writing. - * @param name Name of the entry. eg: "/base/file_i_want". - * @param destination Destionation of the alias. eg: "/base/the_real_stuff_i_want". - * @param compress Compression flags (1 == compress, 0 = don't compress). - * @return EINA_TRUE on success, EINA_FALSE on failure. - * - * Name and Destination must not be NULL, otherwhise EINA_FALSE will be returned. - * - * @since 1.3.3 - * @ingroup Eet_File_Group - */ - EAPI Eina_Bool eet_alias(Eet_File *ef, const char *name, const char *destination, int compress); - - - /** - * List all entries in eet file matching shell glob. - * @param ef A valid eet file handle. - * @param glob A shell glob to match against. - * @param count_ret Number of entries found to match. - * @return Pointer to an array of strings. - * - * This function will list all entries in the eet file matching the - * supplied shell glob and return an allocated list of their names, if - * there are any, and if no memory errors occur. - * - * The eet file handle must be valid and glob must not be NULL, or NULL - * will be returned and count_ret will be filled with 0. - * - * The calling program must call free() on the array returned, but NOT - * on the string pointers in the array. They are taken as read-only - * internals from the eet file handle. They are only valid as long as - * the file handle is not closed. When it is closed those pointers in the - * array are now not valid and should not be used. - * - * On success the array returned will have a list of string pointers - * that are the names of the entries that matched, and count_ret will have - * the number of entries in this array placed in it. - * - * Hint: an easy way to list all entries in an eet file is to use a glob - * value of "*". - * - * @since 1.0.0 - * @ingroup Eet_File_Group - */ - EAPI char **eet_list(Eet_File *ef, const char *glob, int *count_ret); - - /** - * Return the number of entries in the specified eet file. - * @param ef A valid eet file handle. - * @return Number of entries in ef or -1 if the number of entries - * cannot be read due to open mode restrictions. - * - * @since 1.0.0 - * @ingroup Eet_File_Group - */ - EAPI int eet_num_entries(Eet_File *ef); - - /** - * @defgroup Eet_File_Cipher_Group Eet File Ciphered Main Functions - * - * Most of the @ref Eet_File_Group have alternative versions that - * accounts for ciphers to protect their content. - * - * @see @ref Eet_Cipher_Group - * - * @ingroup Eet_File_Group - */ - - /** - * Read a specified entry from an eet file and return data using a cipher. - * @param ef A valid eet file handle opened for reading. - * @param name Name of the entry. eg: "/base/file_i_want". - * @param size_ret Number of bytes read from entry and returned. - * @param cipher_key The key to use as cipher. - * @return The data stored in that entry in the eet file. - * - * This function finds an entry in the eet file that is stored under the - * name specified, and returns that data, decompressed, if successful. - * NULL is returned if the lookup fails or if memory errors are - * encountered. It is the job of the calling program to call free() on - * the returned data. The number of bytes in the returned data chunk are - * placed in size_ret. - * - * If the eet file handle is not valid NULL is returned and size_ret is - * filled with 0. - * - * @see eet_read() - * - * @since 1.0.0 - * @ingroup Eet_File_Cipher_Group - */ - EAPI void *eet_read_cipher(Eet_File *ef, const char *name, int *size_ret, const char *cipher_key); - - /** - * Write a specified entry to an eet file handle using a cipher. - * @param ef A valid eet file handle opened for writing. - * @param name Name of the entry. eg: "/base/file_i_want". - * @param data Pointer to the data to be stored. - * @param size Length in bytes in the data to be stored. - * @param compress Compression flags (1 == compress, 0 = don't compress). - * @param cipher_key The key to use as cipher. - * @return bytes written on successful write, 0 on failure. - * - * This function will write the specified chunk of data to the eet file - * and return greater than 0 on success. 0 will be returned on failure. - * - * The eet file handle must be a valid file handle for an eet file opened - * for writing. If it is not, 0 will be returned and no action will be - * performed. - * - * Name, and data must not be NULL, and size must be > 0. If these - * conditions are not met, 0 will be returned. - * - * The data will be copied (and optionally compressed) in ram, pending - * a flush to disk (it will stay in ram till the eet file handle is - * closed though). - * - * @see eet_write() - * - * @since 1.0.0 - * @ingroup Eet_File_Cipher_Group - */ - EAPI int eet_write_cipher(Eet_File *ef, const char *name, const void *data, int size, int compress, const char *cipher_key); - - - /** - * @defgroup Eet_File_Image_Group Image Store and Load - * - * Eet efficiently stores and loads images, including alpha - * channels and lossy compressions. - */ - - /** - * Read just the header data for an image and dont decode the pixels. - * @param ef A valid eet file handle opened for reading. - * @param name Name of the entry. eg: "/base/file_i_want". - * @param w A pointer to the unsigned int to hold the width in pixels. - * @param h A pointer to the unsigned int to hold the height in pixels. - * @param alpha A pointer to the int to hold the alpha flag. - * @param compress A pointer to the int to hold the compression amount. - * @param quality A pointer to the int to hold the quality amount. - * @param lossy A pointer to the int to hold the lossiness flag. - * @return 1 on successfull decode, 0 otherwise - * - * This function reads an image from an eet file stored under the named - * key in the eet file and return a pointer to the decompressed pixel data. - * - * The other parameters of the image (width, height etc.) are placed into - * the values pointed to (they must be supplied). The pixel data is a linear - * array of pixels starting from the top-left of the image scanning row by - * row from left to right. Each pile is a 32bit value, with the high byte - * being the alpha channel, the next being red, then green, and the low byte - * being blue. The width and height are measured in pixels and will be - * greater than 0 when returned. The alpha flag is either 0 or 1. 0 denotes - * that the alpha channel is not used. 1 denotes that it is significant. - * Compress is filled with the compression value/amount the image was - * stored with. The quality value is filled with the quality encoding of - * the image file (0 - 100). The lossy flags is either 0 or 1 as to if - * the image was encoded lossily or not. - * - * On success the function returns 1 indicating the header was read and - * decoded properly, or 0 on failure. - * - * @see eet_data_image_header_read_cipher() - * - * @since 1.0.0 - * @ingroup Eet_File_Image_Group - */ - EAPI int eet_data_image_header_read(Eet_File *ef, const char *name, unsigned int *w, unsigned int *h, int *alpha, int *compress, int *quality, int *lossy); - - /** - * Read image data from the named key in the eet file. - * @param ef A valid eet file handle opened for reading. - * @param name Name of the entry. eg: "/base/file_i_want". - * @param w A pointer to the unsigned int to hold the width in pixels. - * @param h A pointer to the unsigned int to hold the height in pixels. - * @param alpha A pointer to the int to hold the alpha flag. - * @param compress A pointer to the int to hold the compression amount. - * @param quality A pointer to the int to hold the quality amount. - * @param lossy A pointer to the int to hold the lossiness flag. - * @return The image pixel data decoded - * - * This function reads an image from an eet file stored under the named - * key in the eet file and return a pointer to the decompressed pixel data. - * - * The other parameters of the image (width, height etc.) are placed into - * the values pointed to (they must be supplied). The pixel data is a linear - * array of pixels starting from the top-left of the image scanning row by - * row from left to right. Each pile is a 32bit value, with the high byte - * being the alpha channel, the next being red, then green, and the low byte - * being blue. The width and height are measured in pixels and will be - * greater than 0 when returned. The alpha flag is either 0 or 1. 0 denotes - * that the alpha channel is not used. 1 denotes that it is significant. - * Compress is filled with the compression value/amount the image was - * stored with. The quality value is filled with the quality encoding of - * the image file (0 - 100). The lossy flags is either 0 or 1 as to if - * the image was encoded lossily or not. - * - * On success the function returns a pointer to the image data decoded. The - * calling application is responsible for calling free() on the image data - * when it is done with it. On failure NULL is returned and the parameter - * values may not contain any sensible data. - * - * @see eet_data_image_read_cipher() - * - * @since 1.0.0 - * @ingroup Eet_File_Image_Group - */ - EAPI void *eet_data_image_read(Eet_File *ef, const char *name, unsigned int *w, unsigned int *h, int *alpha, int *compress, int *quality, int *lossy); - - /** - * Read image data from the named key in the eet file. - * @param ef A valid eet file handle opened for reading. - * @param name Name of the entry. eg: "/base/file_i_want". - * @param src_x The starting x coordinate from where to dump the stream. - * @param src_y The starting y coordinate from where to dump the stream. - * @param d A pointer to the pixel surface. - * @param w The expected width in pixels of the pixel surface to decode. - * @param h The expected height in pixels of the pixel surface to decode. - * @param row_stride The length of a pixels line in the destination surface. - * @param alpha A pointer to the int to hold the alpha flag. - * @param compress A pointer to the int to hold the compression amount. - * @param quality A pointer to the int to hold the quality amount. - * @param lossy A pointer to the int to hold the lossiness flag. - * @return 1 on success, 0 otherwise. - * - * This function reads an image from an eet file stored under the named - * key in the eet file and return a pointer to the decompressed pixel data. - * - * The other parameters of the image (width, height etc.) are placed into - * the values pointed to (they must be supplied). The pixel data is a linear - * array of pixels starting from the top-left of the image scanning row by - * row from left to right. Each pile is a 32bit value, with the high byte - * being the alpha channel, the next being red, then green, and the low byte - * being blue. The width and height are measured in pixels and will be - * greater than 0 when returned. The alpha flag is either 0 or 1. 0 denotes - * that the alpha channel is not used. 1 denotes that it is significant. - * Compress is filled with the compression value/amount the image was - * stored with. The quality value is filled with the quality encoding of - * the image file (0 - 100). The lossy flags is either 0 or 1 as to if - * the image was encoded lossily or not. - * - * On success the function returns 1, and 0 on failure. On failure the - * parameter values may not contain any sensible data. - * - * @see eet_data_image_read_to_surface_cipher() - * - * @since 1.0.2 - * @ingroup Eet_File_Image_Group - */ - EAPI int eet_data_image_read_to_surface(Eet_File *ef, const char *name, unsigned int src_x, unsigned int src_y, unsigned int *d, unsigned int w, unsigned int h, unsigned int row_stride, int *alpha, int *compress, int *quality, int *lossy); - - /** - * Write image data to the named key in an eet file. - * @param ef A valid eet file handle opened for writing. - * @param name Name of the entry. eg: "/base/file_i_want". - * @param data A pointer to the image pixel data. - * @param w The width of the image in pixels. - * @param h The height of the image in pixels. - * @param alpha The alpha channel flag. - * @param compress The compression amount. - * @param quality The quality encoding amount. - * @param lossy The lossiness flag. - * @return Success if the data was encoded and written or not. - * - * This function takes image pixel data and encodes it in an eet file - * stored under the supplied name key, and returns how many bytes were - * actually written to encode the image data. - * - * The data expected is the same format as returned by eet_data_image_read. - * If this is not the case weird things may happen. Width and height must - * be between 1 and 8000 pixels. The alpha flags can be 0 or 1 (0 meaning - * the alpha values are not useful and 1 meaning they are). Compress can - * be from 0 to 9 (0 meaning no compression, 9 meaning full compression). - * This is only used if the image is not lossily encoded. Quality is used on - * lossy compression and should be a value from 0 to 100. The lossy flag - * can be 0 or 1. 0 means encode losslessly and 1 means to encode with - * image quality loss (but then have a much smaller encoding). - * - * On success this function returns the number of bytes that were required - * to encode the image data, or on failure it returns 0. - * - * @see eet_data_image_write_cipher() - * - * @since 1.0.0 - * @ingroup Eet_File_Image_Group - */ - EAPI int eet_data_image_write(Eet_File *ef, const char *name, const void *data, unsigned int w, unsigned int h, int alpha, int compress, int quality, int lossy); - - /** - * Decode Image data header only to get information. - * @param data The encoded pixel data. - * @param size The size, in bytes, of the encoded pixel data. - * @param w A pointer to the unsigned int to hold the width in pixels. - * @param h A pointer to the unsigned int to hold the height in pixels. - * @param alpha A pointer to the int to hold the alpha flag. - * @param compress A pointer to the int to hold the compression amount. - * @param quality A pointer to the int to hold the quality amount. - * @param lossy A pointer to the int to hold the lossiness flag. - * @return 1 on success, 0 on failure. - * - * This function takes encoded pixel data and decodes it into raw RGBA - * pixels on success. - * - * The other parameters of the image (width, height etc.) are placed into - * the values pointed to (they must be supplied). The pixel data is a linear - * array of pixels starting from the top-left of the image scanning row by - * row from left to right. Each pixel is a 32bit value, with the high byte - * being the alpha channel, the next being red, then green, and the low byte - * being blue. The width and height are measured in pixels and will be - * greater than 0 when returned. The alpha flag is either 0 or 1. 0 denotes - * that the alpha channel is not used. 1 denotes that it is significant. - * Compress is filled with the compression value/amount the image was - * stored with. The quality value is filled with the quality encoding of - * the image file (0 - 100). The lossy flags is either 0 or 1 as to if - * the image was encoded lossily or not. - * - * On success the function returns 1 indicating the header was read and - * decoded properly, or 0 on failure. - * - * @see eet_data_image_header_decode_cipher() - * - * @since 1.0.0 - * @ingroup Eet_File_Image_Group - */ - EAPI int eet_data_image_header_decode(const void *data, int size, unsigned int *w, unsigned int *h, int *alpha, int *compress, int *quality, int *lossy); - - /** - * Decode Image data into pixel data. - * @param data The encoded pixel data. - * @param size The size, in bytes, of the encoded pixel data. - * @param w A pointer to the unsigned int to hold the width in pixels. - * @param h A pointer to the unsigned int to hold the height in pixels. - * @param alpha A pointer to the int to hold the alpha flag. - * @param compress A pointer to the int to hold the compression amount. - * @param quality A pointer to the int to hold the quality amount. - * @param lossy A pointer to the int to hold the lossiness flag. - * @return The image pixel data decoded - * - * This function takes encoded pixel data and decodes it into raw RGBA - * pixels on success. - * - * The other parameters of the image (width, height etc.) are placed into - * the values pointed to (they must be supplied). The pixel data is a linear - * array of pixels starting from the top-left of the image scanning row by - * row from left to right. Each pixel is a 32bit value, with the high byte - * being the alpha channel, the next being red, then green, and the low byte - * being blue. The width and height are measured in pixels and will be - * greater than 0 when returned. The alpha flag is either 0 or 1. 0 denotes - * that the alpha channel is not used. 1 denotes that it is significant. - * Compress is filled with the compression value/amount the image was - * stored with. The quality value is filled with the quality encoding of - * the image file (0 - 100). The lossy flags is either 0 or 1 as to if - * the image was encoded lossily or not. - * - * On success the function returns a pointer to the image data decoded. The - * calling application is responsible for calling free() on the image data - * when it is done with it. On failure NULL is returned and the parameter - * values may not contain any sensible data. - * - * @see eet_data_image_decode_cipher() - * - * @since 1.0.0 - * @ingroup Eet_File_Image_Group - */ - EAPI void *eet_data_image_decode(const void *data, int size, unsigned int *w, unsigned int *h, int *alpha, int *compress, int *quality, int *lossy); - - /** - * Decode Image data into pixel data. - * @param data The encoded pixel data. - * @param size The size, in bytes, of the encoded pixel data. - * @param src_x The starting x coordinate from where to dump the stream. - * @param src_y The starting y coordinate from where to dump the stream. - * @param d A pointer to the pixel surface. - * @param w The expected width in pixels of the pixel surface to decode. - * @param h The expected height in pixels of the pixel surface to decode. - * @param row_stride The length of a pixels line in the destination surface. - * @param alpha A pointer to the int to hold the alpha flag. - * @param compress A pointer to the int to hold the compression amount. - * @param quality A pointer to the int to hold the quality amount. - * @param lossy A pointer to the int to hold the lossiness flag. - * @return 1 on success, 0 otherwise. - * - * This function takes encoded pixel data and decodes it into raw RGBA - * pixels on success. - * - * The other parameters of the image (alpha, compress etc.) are placed into - * the values pointed to (they must be supplied). The pixel data is a linear - * array of pixels starting from the top-left of the image scanning row by - * row from left to right. Each pixel is a 32bit value, with the high byte - * being the alpha channel, the next being red, then green, and the low byte - * being blue. The width and height are measured in pixels and will be - * greater than 0 when returned. The alpha flag is either 0 or 1. 0 denotes - * that the alpha channel is not used. 1 denotes that it is significant. - * Compress is filled with the compression value/amount the image was - * stored with. The quality value is filled with the quality encoding of - * the image file (0 - 100). The lossy flags is either 0 or 1 as to if - * the image was encoded lossily or not. - * - * On success the function returns 1, and 0 on failure. On failure the - * parameter values may not contain any sensible data. - * - * @see eet_data_image_decode_to_surface_cipher() - * - * @since 1.0.2 - * @ingroup Eet_File_Image_Group - */ - EAPI int eet_data_image_decode_to_surface(const void *data, int size, unsigned int src_x, unsigned int src_y, unsigned int *d, unsigned int w, unsigned int h, unsigned int row_stride, int *alpha, int *compress, int *quality, int *lossy); - - /** - * Encode image data for storage or transmission. - * @param data A pointer to the image pixel data. - * @param size_ret A pointer to an int to hold the size of the returned data. - * @param w The width of the image in pixels. - * @param h The height of the image in pixels. - * @param alpha The alpha channel flag. - * @param compress The compression amount. - * @param quality The quality encoding amount. - * @param lossy The lossiness flag. - * @return The encoded image data. - * - * This function stakes image pixel data and encodes it with compression and - * possible loss of quality (as a trade off for size) for storage or - * transmission to another system. - * - * The data expected is the same format as returned by eet_data_image_read. - * If this is not the case weird things may happen. Width and height must - * be between 1 and 8000 pixels. The alpha flags can be 0 or 1 (0 meaning - * the alpha values are not useful and 1 meaning they are). Compress can - * be from 0 to 9 (0 meaning no compression, 9 meaning full compression). - * This is only used if the image is not lossily encoded. Quality is used on - * lossy compression and should be a value from 0 to 100. The lossy flag - * can be 0 or 1. 0 means encode losslessly and 1 means to encode with - * image quality loss (but then have a much smaller encoding). - * - * On success this function returns a pointer to the encoded data that you - * can free with free() when no longer needed. - * - * @see eet_data_image_encode_cipher() - * - * @since 1.0.0 - * @ingroup Eet_File_Image_Group - */ - EAPI void *eet_data_image_encode(const void *data, int *size_ret, unsigned int w, unsigned int h, int alpha, int compress, int quality, int lossy); - - /** - * @defgroup Eet_File_Image_Cipher_Group Image Store and Load using a Cipher - * - * Most of the @ref Eet_File_Image_Group have alternative versions - * that accounts for ciphers to protect their content. - * - * @see @ref Eet_Cipher_Group - * - * @ingroup Eet_File_Image_Group - */ - - /** - * Read just the header data for an image and dont decode the pixels using a cipher. - * @param ef A valid eet file handle opened for reading. - * @param name Name of the entry. eg: "/base/file_i_want". - * @param cipher_key The key to use as cipher. - * @param w A pointer to the unsigned int to hold the width in pixels. - * @param h A pointer to the unsigned int to hold the height in pixels. - * @param alpha A pointer to the int to hold the alpha flag. - * @param compress A pointer to the int to hold the compression amount. - * @param quality A pointer to the int to hold the quality amount. - * @param lossy A pointer to the int to hold the lossiness flag. - * @return 1 on successfull decode, 0 otherwise - * - * This function reads an image from an eet file stored under the named - * key in the eet file and return a pointer to the decompressed pixel data. - * - * The other parameters of the image (width, height etc.) are placed into - * the values pointed to (they must be supplied). The pixel data is a linear - * array of pixels starting from the top-left of the image scanning row by - * row from left to right. Each pile is a 32bit value, with the high byte - * being the alpha channel, the next being red, then green, and the low byte - * being blue. The width and height are measured in pixels and will be - * greater than 0 when returned. The alpha flag is either 0 or 1. 0 denotes - * that the alpha channel is not used. 1 denotes that it is significant. - * Compress is filled with the compression value/amount the image was - * stored with. The quality value is filled with the quality encoding of - * the image file (0 - 100). The lossy flags is either 0 or 1 as to if - * the image was encoded lossily or not. - * - * On success the function returns 1 indicating the header was read and - * decoded properly, or 0 on failure. - * - * @see eet_data_image_header_read() - * - * @since 1.0.0 - * @ingroup Eet_File_Image_Cipher_Group - */ - EAPI int eet_data_image_header_read_cipher(Eet_File *ef, const char *name, const char *cipher_key, unsigned int *w, unsigned int *h, int *alpha, int *compress, int *quality, int *lossy); - - /** - * Read image data from the named key in the eet file using a cipher. - * @param ef A valid eet file handle opened for reading. - * @param name Name of the entry. eg: "/base/file_i_want". - * @param cipher_key The key to use as cipher. - * @param w A pointer to the unsigned int to hold the width in pixels. - * @param h A pointer to the unsigned int to hold the height in pixels. - * @param alpha A pointer to the int to hold the alpha flag. - * @param compress A pointer to the int to hold the compression amount. - * @param quality A pointer to the int to hold the quality amount. - * @param lossy A pointer to the int to hold the lossiness flag. - * @return The image pixel data decoded - * - * This function reads an image from an eet file stored under the named - * key in the eet file and return a pointer to the decompressed pixel data. - * - * The other parameters of the image (width, height etc.) are placed into - * the values pointed to (they must be supplied). The pixel data is a linear - * array of pixels starting from the top-left of the image scanning row by - * row from left to right. Each pile is a 32bit value, with the high byte - * being the alpha channel, the next being red, then green, and the low byte - * being blue. The width and height are measured in pixels and will be - * greater than 0 when returned. The alpha flag is either 0 or 1. 0 denotes - * that the alpha channel is not used. 1 denotes that it is significant. - * Compress is filled with the compression value/amount the image was - * stored with. The quality value is filled with the quality encoding of - * the image file (0 - 100). The lossy flags is either 0 or 1 as to if - * the image was encoded lossily or not. - * - * On success the function returns a pointer to the image data decoded. The - * calling application is responsible for calling free() on the image data - * when it is done with it. On failure NULL is returned and the parameter - * values may not contain any sensible data. - * - * @see eet_data_image_read() - * - * @since 1.0.0 - * @ingroup Eet_File_Image_Cipher_Group - */ - EAPI void *eet_data_image_read_cipher(Eet_File *ef, const char *name, const char *cipher_key, unsigned int *w, unsigned int *h, int *alpha, int *compress, int *quality, int *lossy); - - /** - * Read image data from the named key in the eet file using a cipher. - * @param ef A valid eet file handle opened for reading. - * @param name Name of the entry. eg: "/base/file_i_want". - * @param cipher_key The key to use as cipher. - * @param src_x The starting x coordinate from where to dump the stream. - * @param src_y The starting y coordinate from where to dump the stream. - * @param d A pointer to the pixel surface. - * @param w The expected width in pixels of the pixel surface to decode. - * @param h The expected height in pixels of the pixel surface to decode. - * @param row_stride The length of a pixels line in the destination surface. - * @param alpha A pointer to the int to hold the alpha flag. - * @param compress A pointer to the int to hold the compression amount. - * @param quality A pointer to the int to hold the quality amount. - * @param lossy A pointer to the int to hold the lossiness flag. - * @return 1 on success, 0 otherwise. - * - * This function reads an image from an eet file stored under the named - * key in the eet file and return a pointer to the decompressed pixel data. - * - * The other parameters of the image (width, height etc.) are placed into - * the values pointed to (they must be supplied). The pixel data is a linear - * array of pixels starting from the top-left of the image scanning row by - * row from left to right. Each pile is a 32bit value, with the high byte - * being the alpha channel, the next being red, then green, and the low byte - * being blue. The width and height are measured in pixels and will be - * greater than 0 when returned. The alpha flag is either 0 or 1. 0 denotes - * that the alpha channel is not used. 1 denotes that it is significant. - * Compress is filled with the compression value/amount the image was - * stored with. The quality value is filled with the quality encoding of - * the image file (0 - 100). The lossy flags is either 0 or 1 as to if - * the image was encoded lossily or not. - * - * On success the function returns 1, and 0 on failure. On failure the - * parameter values may not contain any sensible data. - * - * @see eet_data_image_read_to_surface() - * - * @since 1.0.2 - * @ingroup Eet_File_Image_Cipher_Group - */ - EAPI int eet_data_image_read_to_surface_cipher(Eet_File *ef, const char *name, const char *cipher_key, unsigned int src_x, unsigned int src_y, unsigned int *d, unsigned int w, unsigned int h, unsigned int row_stride, int *alpha, int *compress, int *quality, int *lossy); - - /** - * Write image data to the named key in an eet file using a cipher. - * @param ef A valid eet file handle opened for writing. - * @param name Name of the entry. eg: "/base/file_i_want". - * @param cipher_key The key to use as cipher. - * @param data A pointer to the image pixel data. - * @param w The width of the image in pixels. - * @param h The height of the image in pixels. - * @param alpha The alpha channel flag. - * @param compress The compression amount. - * @param quality The quality encoding amount. - * @param lossy The lossiness flag. - * @return Success if the data was encoded and written or not. - * - * This function takes image pixel data and encodes it in an eet file - * stored under the supplied name key, and returns how many bytes were - * actually written to encode the image data. - * - * The data expected is the same format as returned by eet_data_image_read. - * If this is not the case weird things may happen. Width and height must - * be between 1 and 8000 pixels. The alpha flags can be 0 or 1 (0 meaning - * the alpha values are not useful and 1 meaning they are). Compress can - * be from 0 to 9 (0 meaning no compression, 9 meaning full compression). - * This is only used if the image is not lossily encoded. Quality is used on - * lossy compression and should be a value from 0 to 100. The lossy flag - * can be 0 or 1. 0 means encode losslessly and 1 means to encode with - * image quality loss (but then have a much smaller encoding). - * - * On success this function returns the number of bytes that were required - * to encode the image data, or on failure it returns 0. - * - * @see eet_data_image_write() - * - * @since 1.0.0 - * @ingroup Eet_File_Image_Cipher_Group - */ - EAPI int eet_data_image_write_cipher(Eet_File *ef, const char *name, const char *cipher_key, const void *data, unsigned int w, unsigned int h, int alpha, int compress, int quality, int lossy); - - - /** - * Decode Image data header only to get information using a cipher. - * @param data The encoded pixel data. - * @param cipher_key The key to use as cipher. - * @param size The size, in bytes, of the encoded pixel data. - * @param w A pointer to the unsigned int to hold the width in pixels. - * @param h A pointer to the unsigned int to hold the height in pixels. - * @param alpha A pointer to the int to hold the alpha flag. - * @param compress A pointer to the int to hold the compression amount. - * @param quality A pointer to the int to hold the quality amount. - * @param lossy A pointer to the int to hold the lossiness flag. - * @return 1 on success, 0 on failure. - * - * This function takes encoded pixel data and decodes it into raw RGBA - * pixels on success. - * - * The other parameters of the image (width, height etc.) are placed into - * the values pointed to (they must be supplied). The pixel data is a linear - * array of pixels starting from the top-left of the image scanning row by - * row from left to right. Each pixel is a 32bit value, with the high byte - * being the alpha channel, the next being red, then green, and the low byte - * being blue. The width and height are measured in pixels and will be - * greater than 0 when returned. The alpha flag is either 0 or 1. 0 denotes - * that the alpha channel is not used. 1 denotes that it is significant. - * Compress is filled with the compression value/amount the image was - * stored with. The quality value is filled with the quality encoding of - * the image file (0 - 100). The lossy flags is either 0 or 1 as to if - * the image was encoded lossily or not. - * - * On success the function returns 1 indicating the header was read and - * decoded properly, or 0 on failure. - * - * @see eet_data_image_header_decode() - * - * @since 1.0.0 - * @ingroup Eet_File_Image_Cipher_Group - */ - EAPI int eet_data_image_header_decode_cipher(const void *data, const char *cipher_key, int size, unsigned int *w, unsigned int *h, int *alpha, int *compress, int *quality, int *lossy); - - /** - * Decode Image data into pixel data using a cipher. - * @param data The encoded pixel data. - * @param cipher_key The key to use as cipher. - * @param size The size, in bytes, of the encoded pixel data. - * @param w A pointer to the unsigned int to hold the width in pixels. - * @param h A pointer to the unsigned int to hold the height in pixels. - * @param alpha A pointer to the int to hold the alpha flag. - * @param compress A pointer to the int to hold the compression amount. - * @param quality A pointer to the int to hold the quality amount. - * @param lossy A pointer to the int to hold the lossiness flag. - * @return The image pixel data decoded - * - * This function takes encoded pixel data and decodes it into raw RGBA - * pixels on success. - * - * The other parameters of the image (width, height etc.) are placed into - * the values pointed to (they must be supplied). The pixel data is a linear - * array of pixels starting from the top-left of the image scanning row by - * row from left to right. Each pixel is a 32bit value, with the high byte - * being the alpha channel, the next being red, then green, and the low byte - * being blue. The width and height are measured in pixels and will be - * greater than 0 when returned. The alpha flag is either 0 or 1. 0 denotes - * that the alpha channel is not used. 1 denotes that it is significant. - * Compress is filled with the compression value/amount the image was - * stored with. The quality value is filled with the quality encoding of - * the image file (0 - 100). The lossy flags is either 0 or 1 as to if - * the image was encoded lossily or not. - * - * On success the function returns a pointer to the image data decoded. The - * calling application is responsible for calling free() on the image data - * when it is done with it. On failure NULL is returned and the parameter - * values may not contain any sensible data. - * - * @see eet_data_image_decode() - * - * @since 1.0.0 - * @ingroup Eet_File_Image_Cipher_Group - */ - EAPI void *eet_data_image_decode_cipher(const void *data, const char *cipher_key, int size, unsigned int *w, unsigned int *h, int *alpha, int *compress, int *quality, int *lossy); - - /** - * Decode Image data into pixel data using a cipher. - * @param data The encoded pixel data. - * @param cipher_key The key to use as cipher. - * @param size The size, in bytes, of the encoded pixel data. - * @param src_x The starting x coordinate from where to dump the stream. - * @param src_y The starting y coordinate from where to dump the stream. - * @param d A pointer to the pixel surface. - * @param w The expected width in pixels of the pixel surface to decode. - * @param h The expected height in pixels of the pixel surface to decode. - * @param row_stride The length of a pixels line in the destination surface. - * @param alpha A pointer to the int to hold the alpha flag. - * @param compress A pointer to the int to hold the compression amount. - * @param quality A pointer to the int to hold the quality amount. - * @param lossy A pointer to the int to hold the lossiness flag. - * @return 1 on success, 0 otherwise. - * - * This function takes encoded pixel data and decodes it into raw RGBA - * pixels on success. - * - * The other parameters of the image (alpha, compress etc.) are placed into - * the values pointed to (they must be supplied). The pixel data is a linear - * array of pixels starting from the top-left of the image scanning row by - * row from left to right. Each pixel is a 32bit value, with the high byte - * being the alpha channel, the next being red, then green, and the low byte - * being blue. The width and height are measured in pixels and will be - * greater than 0 when returned. The alpha flag is either 0 or 1. 0 denotes - * that the alpha channel is not used. 1 denotes that it is significant. - * Compress is filled with the compression value/amount the image was - * stored with. The quality value is filled with the quality encoding of - * the image file (0 - 100). The lossy flags is either 0 or 1 as to if - * the image was encoded lossily or not. - * - * On success the function returns 1, and 0 on failure. On failure the - * parameter values may not contain any sensible data. - * - * @see eet_data_image_decode_to_surface() - * - * @since 1.0.2 - * @ingroup Eet_File_Image_Cipher_Group - */ - EAPI int eet_data_image_decode_to_surface_cipher(const void *data, const char *cipher_key, int size, unsigned int src_x, unsigned int src_y, unsigned int *d, unsigned int w, unsigned int h, unsigned int row_stride, int *alpha, int *compress, int *quality, int *lossy); - - /** - * Encode image data for storage or transmission using a cipher. - * @param data A pointer to the image pixel data. - * @param cipher_key The key to use as cipher. - * @param size_ret A pointer to an int to hold the size of the returned data. - * @param w The width of the image in pixels. - * @param h The height of the image in pixels. - * @param alpha The alpha channel flag. - * @param compress The compression amount. - * @param quality The quality encoding amount. - * @param lossy The lossiness flag. - * @return The encoded image data. - * - * This function stakes image pixel data and encodes it with compression and - * possible loss of quality (as a trade off for size) for storage or - * transmission to another system. - * - * The data expected is the same format as returned by eet_data_image_read. - * If this is not the case weird things may happen. Width and height must - * be between 1 and 8000 pixels. The alpha flags can be 0 or 1 (0 meaning - * the alpha values are not useful and 1 meaning they are). Compress can - * be from 0 to 9 (0 meaning no compression, 9 meaning full compression). - * This is only used if the image is not lossily encoded. Quality is used on - * lossy compression and should be a value from 0 to 100. The lossy flag - * can be 0 or 1. 0 means encode losslessly and 1 means to encode with - * image quality loss (but then have a much smaller encoding). - * - * On success this function returns a pointer to the encoded data that you - * can free with free() when no longer needed. - * - * @see eet_data_image_encode() - * - * @since 1.0.0 - * @ingroup Eet_File_Image_Cipher_Group - */ - EAPI void *eet_data_image_encode_cipher(const void *data, const char *cipher_key, unsigned int w, unsigned int h, int alpha, int compress, int quality, int lossy, int *size_ret); - - - /** - * @defgroup Eet_Cipher_Group Cipher, Identity and Protection Mechanisms - * - * Eet allows one to protect entries of an #Eet_File - * individually. This may be used to ensure data was not tampered or - * that third party does not read your data. - * - * @see @ref Eet_File_Cipher_Group - * @see @ref Eet_File_Image_Cipher_Group - * - * @{ - */ - - /** - * @typedef Eet_Key - * Opaque handle that defines an identity (also known as key) - * in Eet's cipher system. - */ - typedef struct _Eet_Key Eet_Key; - - /** - * @} - */ - - - /** - * Callback used to request if needed the password of a private key. - * - * @param buffer the buffer where to store the password. - * @param size the maximum password size (size of buffer, including '@\0'). - * @param rwflag if the buffer is also readable or just writable. - * @param data currently unused, may contain some context in future. - * @return 1 on success and password was set to @p buffer, 0 on failure. - * - * @since 1.2.0 - * @ingroup Eet_Cipher_Group - */ - typedef int (*Eet_Key_Password_Callback)(char *buffer, int size, int rwflag, void *data); - - /** - * Create an Eet_Key needed for signing an eet file. - * - * The certificate should provide the public that match the private key. - * No verification is done to ensure that. - * - * @param certificate_file The file where to find the certificate. - * @param private_key_file The file that contains the private key. - * @param cb Function to callback if password is required to unlock - * private key. - * @return A key handle to use, or @c NULL on failure. - * - * @see eet_identity_close() - * - * @since 1.2.0 - * @ingroup Eet_Cipher_Group - */ - EAPI Eet_Key* eet_identity_open(const char *certificate_file, const char *private_key_file, Eet_Key_Password_Callback cb); - - /** - * Close and release all ressource used by an Eet_Key. An - * reference counter prevent it from being freed until all file - * using it are also closed. - * - * @param key the key handle to close and free resources. - * - * @since 1.2.0 - * @ingroup Eet_Cipher_Group - */ - EAPI void eet_identity_close(Eet_Key *key); - - /** - * Set a key to sign a file - * - * @param ef the file to set the identity. - * @param key the key handle to set as identity. - * @return #EET_ERROR_BAD_OBJECT if @p ef is invalid or - * #EET_ERROR_NONE on success. - * - * @since 1.2.0 - * @ingroup Eet_Cipher_Group - */ - EAPI Eet_Error eet_identity_set(Eet_File *ef, Eet_Key *key); - - /** - * Display both private and public key of an Eet_Key. - * - * @param key the handle to print. - * @param out where to print. - * - * @since 1.2.0 - * @ingroup Eet_Cipher_Group - */ - EAPI void eet_identity_print(Eet_Key *key, FILE *out); - - /** - * Get the x509 der certificate associated with an Eet_File. Will return NULL - * if the file is not signed. - * - * @param ef The file handle to query. - * @param der_length The length of returned data, may be @c NULL. - * @return the x509 certificate or @c NULL on error. - * - * @since 1.2.0 - * @ingroup Eet_Cipher_Group - */ - EAPI const void *eet_identity_x509(Eet_File *ef, int *der_length); - - /** - * Get the raw signature associated with an Eet_File. Will return NULL - * if the file is not signed. - * - * @param ef The file handle to query. - * @param signature_length The length of returned data, may be @c NULL. - * @return the raw signature or @c NULL on error. - * - * @ingroup Eet_Cipher_Group - */ - EAPI const void *eet_identity_signature(Eet_File *ef, int *signature_length); - - /** - * Get the SHA1 associated with a file. Could be the one used to - * sign the data or if the data where not signed, it will be the - * SHA1 of the file. - * - * @param ef The file handle to query. - * @param sha1_length The length of returned data, may be @c NULL. - * @return the associated SHA1 or @c NULL on error. - * - * @since 1.2.0 - * @ingroup Eet_Cipher_Group - */ - EAPI const void *eet_identity_sha1(Eet_File *ef, int *sha1_length); - - /** - * Display the x509 der certificate to out. - * - * @param certificate the x509 certificate to print - * @param der_length The length the certificate. - * @param out where to print. - * - * @since 1.2.0 - * @ingroup Eet_Cipher_Group - */ - EAPI void eet_identity_certificate_print(const unsigned char *certificate, int der_length, FILE *out); - - - /** - * @defgroup Eet_Data_Group Eet Data Serialization - * - * Convenience functions to serialize and parse complex data - * structures to binary blobs. - * - * While Eet core just handles binary blobs, it is often required - * to save some structured data of different types, such as - * strings, integers, lists, hashes and so on. - * - * Eet can serialize and then parse data types given some - * construction instructions. These are defined in two levels: - * - * - #Eet_Data_Descriptor_Class to tell generic memory handling, - * such as the size of the type, how to allocate memory, strings, - * lists, hashes and so on. - * - * - #Eet_Data_Descriptor to tell inside such type, the members and - * their offsets inside the memory blob, their types and - * names. These members can be simple types or other - * #Eet_Data_Descriptor, allowing hierarchical types to be - * defined. - * - * Given that C provides no introspection, this process can be - * quite cumbersome, so we provide lots of macros and convenience - * functions to aid creating the types. - * - * Example: - * - * @code - * #include - * #include - * - * typedef struct _blah2 - * { - * char *string; - * } Blah2; - * - * typedef struct _blah3 - * { - * char *string; - * } Blah3; - * - * typedef struct _blah - * { - * char character; - * short sixteen; - * int integer; - * long long lots; - * float floating; - * double floating_lots; - * char *string; - * Blah2 *blah2; - * Eina_List *blah3; - * } Blah; - * - * int - * main(int argc, char **argv) - * { - * Blah blah; - * Blah2 blah2; - * Blah3 blah3; - * Eet_Data_Descriptor *edd, *edd2, *edd3; - * Eet_Data_Descriptor_Class eddc, eddc2, eddc3; - * void *data; - * int size; - * FILE *f; - * Blah *blah_in; - * - * eet_init(); - * - * EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc3, Blah3); - * edd3 = eet_data_descriptor_stream_new(&eddc3); - * EET_DATA_DESCRIPTOR_ADD_BASIC(edd3, Blah3, "string3", string, EET_T_STRING); - * - * EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc2, Blah2); - * edd2 = eet_data_descriptor_stream_new(&eddc2); - * EET_DATA_DESCRIPTOR_ADD_BASIC(edd2, Blah2, "string2", string, EET_T_STRING); - * - * EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Blah); - * edd = eet_data_descriptor_stream_new(&eddc); - * EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Blah, "character", character, EET_T_CHAR); - * EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Blah, "sixteen", sixteen, EET_T_SHORT); - * EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Blah, "integer", integer, EET_T_INT); - * EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Blah, "lots", lots, EET_T_LONG_LONG); - * EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Blah, "floating", floating, EET_T_FLOAT); - * EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Blah, "floating_lots", floating_lots, EET_T_DOUBLE); - * EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Blah, "string", string, EET_T_STRING); - * EET_DATA_DESCRIPTOR_ADD_SUB(edd, Blah, "blah2", blah2, edd2); - * EET_DATA_DESCRIPTOR_ADD_LIST(edd, Blah, "blah3", blah3, edd3); - * - * blah3.string = "PANTS"; - * - * blah2.string = "subtype string here!"; - * - * blah.character = '7'; - * blah.sixteen = 0x7777; - * blah.integer = 0xc0def00d; - * blah.lots = 0xdeadbeef31337777; - * blah.floating = 3.141592654; - * blah.floating_lots = 0.777777777777777; - * blah.string = "bite me like a turnip"; - * blah.blah2 = &blah2; - * blah.blah3 = eina_list_append(NULL, &blah3); - * blah.blah3 = eina_list_append(blah.blah3, &blah3); - * blah.blah3 = eina_list_append(blah.blah3, &blah3); - * blah.blah3 = eina_list_append(blah.blah3, &blah3); - * blah.blah3 = eina_list_append(blah.blah3, &blah3); - * blah.blah3 = eina_list_append(blah.blah3, &blah3); - * blah.blah3 = eina_list_append(blah.blah3, &blah3); - * - * data = eet_data_descriptor_encode(edd, &blah, &size); - * printf("-----DECODING\n"); - * blah_in = eet_data_descriptor_decode(edd, data, size); - * - * printf("-----DECODED!\n"); - * printf("%c\n", blah_in->character); - * printf("%x\n", (int)blah_in->sixteen); - * printf("%x\n", blah_in->integer); - * printf("%lx\n", blah_in->lots); - * printf("%f\n", (double)blah_in->floating); - * printf("%f\n", (double)blah_in->floating_lots); - * printf("%s\n", blah_in->string); - * printf("%p\n", blah_in->blah2); - * printf(" %s\n", blah_in->blah2->string); - * { - * Eina_List *l; - * Blah3 *blah3_in; - * - * EINA_LIST_FOREACH(blah_in->blah3, l, blah3_in) - * { - * printf("%p\n", blah3_in); - * printf(" %s\n", blah3_in->string); - * } - * } - * eet_data_descriptor_free(edd); - * eet_data_descriptor_free(edd2); - * eet_data_descriptor_free(edd3); - * - * eet_shutdown(); - * - * return 0; - * } - * @endcode - * - * @{ - */ +/** + * @typedef Eet_Version + * + * This is the Eet version information structure that can be used at + * runtiime to detect which version of eet is being used and adapt + * appropriately as follows for example: + * + * @code + * #if defined(EET_VERSION_MAJOR) && (EET_VERSION_MAJOR >= 1) && defined(EET_VERSION_MINOR) && (EET_VERSION_MINOR > 2) + * printf("Eet version: %i.%i.%i\n", + * eet_version->major, + * eet_version->minor, + * eet_version->micro); + * if (eet_version->revision > 0) + * { + * printf(" Built from SVN revision # %i\n", eet_version->revision); + * } + * #endif + * @endcode + * + * Note the #if check can be dropped if your program refuses to compile or + * work with an Eet version less than 1.3.0. + */ +typedef struct _Eet_Version +{ + int major; /** < major (binary or source incompatible changes) */ + int minor; /** < minor (new features, bugfixes, major improvements version) */ + int micro; /** < micro (bugfix, internal improvements, no new features version) */ + int revision; /** < svn revision (0 if a proper rlease or the svn revsion number Eet is built from) */ +} Eet_Version; + +EAPI extern Eet_Version *eet_version; + +/** + * @defgroup Eet_Group Top level functions + * Functions that affect Eet as a whole. + * + * @{ + */ + +/** + * @enum _Eet_Error + * All the error identifiers known by Eet. + */ +typedef enum _Eet_Error +{ + EET_ERROR_NONE, /**< No error, it's all fine! */ + EET_ERROR_BAD_OBJECT, /**< Given object or handle is NULL or invalid */ + EET_ERROR_EMPTY, /**< There was nothing to do */ + EET_ERROR_NOT_WRITABLE, /**< Could not write to file or fine is #EET_FILE_MODE_READ */ + EET_ERROR_OUT_OF_MEMORY, /**< Could not allocate memory */ + EET_ERROR_WRITE_ERROR, /**< Failed to write data to destination */ + EET_ERROR_WRITE_ERROR_FILE_TOO_BIG, /**< Failed to write file since it is too big */ + EET_ERROR_WRITE_ERROR_IO_ERROR, /**< Failed to write since generic Input/Output error */ + EET_ERROR_WRITE_ERROR_OUT_OF_SPACE, /**< Failed to write due out of space */ + EET_ERROR_WRITE_ERROR_FILE_CLOSED, /**< Failed to write because file was closed */ + EET_ERROR_MMAP_FAILED, /**< Could not mmap file */ + EET_ERROR_X509_ENCODING_FAILED, /**< Could not encode using X509 */ + EET_ERROR_SIGNATURE_FAILED, /**< Could not validate signature */ + EET_ERROR_INVALID_SIGNATURE, /**< Signature is invalid */ + EET_ERROR_NOT_SIGNED, /**< File or contents are not signed */ + EET_ERROR_NOT_IMPLEMENTED, /**< Function is not implemented */ + EET_ERROR_PRNG_NOT_SEEDED, /**< Could not introduce random seed */ + EET_ERROR_ENCRYPT_FAILED, /**< Could not encrypt contents */ + EET_ERROR_DECRYPT_FAILED /**< Could not decrypt contents */ +} Eet_Error; /**< Eet error identifiers */ + +/** + * @} + */ + +/** + * Initialize the EET library. + * + * @return The new init count. + * + * @since 1.0.0 + * @ingroup Eet_Group + */ +EAPI int eet_init(void); + +/** + * Shut down the EET library. + * + * @return The new init count. + * + * @since 1.0.0 + * @ingroup Eet_Group + */ +EAPI int eet_shutdown(void); + +/** + * Clear eet cache + * + * Eet didn't free items by default. If you are under memory + * presure, just call this function to recall all memory that are + * not yet referenced anymore. The cache take care of modification + * on disk. + * + * @since 1.0.0 + * @ingroup Eet_Group + */ +EAPI void eet_clearcache(void); + + +/** + * @defgroup Eet_File_Group Eet File Main Functions + * + * Functions to create, destroy and do basic manipulation of + * #Eet_File handles. + * + * @{ + */ + +/** + * @enum _Eet_File_Mode + * Modes that a file can be opened. + */ +typedef enum _Eet_File_Mode +{ + EET_FILE_MODE_INVALID = -1, + EET_FILE_MODE_READ, /**< File is read-only. */ + EET_FILE_MODE_WRITE, /**< File is write-only. */ + EET_FILE_MODE_READ_WRITE /**< File is for both read and write */ +} Eet_File_Mode; /**< Modes that a file can be opened. */ + +/** + * @typedef Eet_File + * Opaque handle that defines an Eet file (or memory). + * + * @see eet_open() + * @see eet_memopen_read() + * @see eet_close() + */ +typedef struct _Eet_File Eet_File; + +/** + * @typedef Eet_Dictionary + * Opaque handle that defines a file-backed (mmaped) dictionary of strings. + */ +typedef struct _Eet_Dictionary Eet_Dictionary; + + +/** + * @} + */ + +/** + * Open an eet file on disk, and returns a handle to it. + * @param file The file path to the eet file. eg: @c "/tmp/file.eet". + * @param mode The mode for opening. Either #EET_FILE_MODE_READ, + * #EET_FILE_MODE_WRITE or #EET_FILE_MODE_READ_WRITE. + * @return An opened eet file handle. + * @ingroup Eet_File_Group + * + * This function will open an exiting eet file for reading, and build + * the directory table in memory and return a handle to the file, if it + * exists and can be read, and no memory errors occur on the way, otherwise + * NULL will be returned. + * + * It will also open an eet file for writing. This will, if successful, + * delete the original file and replace it with a new empty file, till + * the eet file handle is closed or flushed. If it cannot be opened for + * writing or a memory error occurs, NULL is returned. + * + * You can also open the file for read/write. If you then write a key that + * does not exist it will be created, if the key exists it will be replaced + * by the new data. + * + * Example: + * @code + * #include + * #include + * #include + * + * int + * main(int argc, char **argv) + * { + * Eet_File *ef; + * char buf[1024], *ret, **list; + * int size, num, i; + * + * eet_init(); + * + * strcpy(buf, "Here is a string of data to save!"); + * + * ef = eet_open("/tmp/my_file.eet", EET_FILE_MODE_WRITE); + * if (!ef) return -1; + * if (!eet_write(ef, "/key/to_store/at", buf, 1024, 1)) + * fprintf(stderr, "Error writing data!\n"); + * eet_close(ef); + * + * ef = eet_open("/tmp/my_file.eet", EET_FILE_MODE_READ); + * if (!ef) return -1; + * list = eet_list(ef, "*", &num); + * if (list) + * { + * for (i = 0; i < num; i++) + * printf("Key stored: %s\n", list[i]); + * free(list); + * } + * ret = eet_read(ef, "/key/to_store/at", &size); + * if (ret) + * { + * printf("Data read (%i bytes):\n%s\n", size, ret); + * free(ret); + * } + * eet_close(ef); + * + * eet_shutdown(); + * + * return 0; + * } + * @endcode + * + * @since 1.0.0 + */ +EAPI Eet_File * eet_open(const char *file, Eet_File_Mode mode); + +/** + * Open an eet file directly from a memory location. The data are not copied, + * so you must keep them around as long as the eet file is open. Their is + * currently no cache for this kind of Eet_File, so it's reopen every time + * you do use eet_memopen_read. + * + * @since 1.1.0 + * @ingroup Eet_File_Group + */ +EAPI Eet_File * eet_memopen_read(const void *data, size_t size); + +/** + * Get the mode an Eet_File was opened with. + * @param ef A valid eet file handle. + * @return The mode ef was opened with. + * + * @since 1.0.0 + * @ingroup Eet_File_Group + */ +EAPI Eet_File_Mode eet_mode_get(Eet_File *ef); + +/** + * Close an eet file handle and flush and writes pending. + * @param ef A valid eet file handle. + * + * This function will flush any pending writes to disk if the eet file + * was opened for write, and free all data associated with the file handle + * and file, and close the file. + * + * If the eet file handle is not valid nothing will be done. + * + * @since 1.0.0 + * @ingroup Eet_File_Group + */ +EAPI Eet_Error eet_close(Eet_File *ef); + +/** + * Sync content of an eet file handle, flushing pending writes. + * @param ef A valid eet file handle. + * + * This function will flush any pending writes to disk. The eet file must + * be opened for write. + * + * If the eet file handle is not valid nothing will be done. + * + * @since 1.2.4 + * @ingroup Eet_File_Group + */ +EAPI Eet_Error eet_sync(Eet_File *ef); + +/** + * Return a handle to the shared string dictionary of the Eet file + * @param ef A valid eet file handle. + * @return A handle to the dictionary of the file + * + * This function returns a handle to the dictionary of an Eet file whose + * handle is @p ef, if a dictionary exists. NULL is returned otherwise or + * if the file handle is known to be invalid. + * + * @see eet_dictionary_string_check() to know if given string came + * from the dictionary or it was dynamically allocated using + * the #Eet_Data_Descriptor_Class instructrions. + * + * @since 1.0.0 + * @ingroup Eet_File_Group + */ +EAPI Eet_Dictionary *eet_dictionary_get(Eet_File *ef); + +/** + * Check if a given string comes from a given dictionary + * @param ed A valid dictionary handle + * @param string A valid 0 byte terminated C string + * @return 1 if it is in the dictionary, 0 otherwise + * + * This checks the given dictionary to see if the given string is actually + * inside that dictionary (i.e. comes from it) and returns 1 if it does. + * If the dictionary handle is invlide, the string is NULL or the string is + * not in the dictionary, 0 is returned. + * + * @since 1.0.0 + * @ingroup Eet_File_Group + */ +EAPI int eet_dictionary_string_check(Eet_Dictionary *ed, + const char *string); + +/** + * Read a specified entry from an eet file and return data + * @param ef A valid eet file handle opened for reading. + * @param name Name of the entry. eg: "/base/file_i_want". + * @param size_ret Number of bytes read from entry and returned. + * @return The data stored in that entry in the eet file. + * + * This function finds an entry in the eet file that is stored under the + * name specified, and returns that data, decompressed, if successful. + * NULL is returned if the lookup fails or if memory errors are + * encountered. It is the job of the calling program to call free() on + * the returned data. The number of bytes in the returned data chunk are + * placed in size_ret. + * + * If the eet file handle is not valid NULL is returned and size_ret is + * filled with 0. + * + * @see eet_read_cipher() + * + * @since 1.0.0 + * @ingroup Eet_File_Group + */ +EAPI void * eet_read(Eet_File *ef, const char *name, int *size_ret); + +/** + * Read a specified entry from an eet file and return data + * @param ef A valid eet file handle opened for reading. + * @param name Name of the entry. eg: "/base/file_i_want". + * @param size_ret Number of bytes read from entry and returned. + * @return The data stored in that entry in the eet file. + * + * This function finds an entry in the eet file that is stored under the + * name specified, and returns that data if not compressed and successful. + * NULL is returned if the lookup fails or if memory errors are + * encountered or if the data is comrpessed. The calling program must never + * call free() on the returned data. The number of bytes in the returned + * data chunk are placed in size_ret. + * + * If the eet file handle is not valid NULL is returned and size_ret is + * filled with 0. + * + * @since 1.0.0 + * @ingroup Eet_File_Group + */ +EAPI const void * eet_read_direct(Eet_File *ef, + const char *name, + int *size_ret); + +/** + * Write a specified entry to an eet file handle + * @param ef A valid eet file handle opened for writing. + * @param name Name of the entry. eg: "/base/file_i_want". + * @param data Pointer to the data to be stored. + * @param size Length in bytes in the data to be stored. + * @param compress Compression flags (1 == compress, 0 = don't compress). + * @return bytes written on successful write, 0 on failure. + * + * This function will write the specified chunk of data to the eet file + * and return greater than 0 on success. 0 will be returned on failure. + * + * The eet file handle must be a valid file handle for an eet file opened + * for writing. If it is not, 0 will be returned and no action will be + * performed. + * + * Name, and data must not be NULL, and size must be > 0. If these + * conditions are not met, 0 will be returned. + * + * The data will be copied (and optionally compressed) in ram, pending + * a flush to disk (it will stay in ram till the eet file handle is + * closed though). + * + * @see eet_write_cipher() + * + * @since 1.0.0 + * @ingroup Eet_File_Group + */ +EAPI int eet_write(Eet_File *ef, + const char *name, + const void *data, + int size, + int compress); + +/** + * Delete a specified entry from an Eet file being written or re-written + * @param ef A valid eet file handle opened for writing. + * @param name Name of the entry. eg: "/base/file_i_want". + * @return Success or failure of the delete. + * + * This function will delete the specified chunk of data from the eet file + * and return greater than 0 on success. 0 will be returned on failure. + * + * The eet file handle must be a valid file handle for an eet file opened + * for writing. If it is not, 0 will be returned and no action will be + * performed. + * + * Name, must not be NULL, otherwise 0 will be returned. + * + * @since 1.0.0 + * @ingroup Eet_File_Group + */ +EAPI int eet_delete(Eet_File *ef, const char *name); + +/** + * Alias a specific section to another one. Destination may exist or not, + * no check are done. + * @param ef A valid eet file handle opened for writing. + * @param name Name of the entry. eg: "/base/file_i_want". + * @param destination Destionation of the alias. eg: "/base/the_real_stuff_i_want". + * @param compress Compression flags (1 == compress, 0 = don't compress). + * @return EINA_TRUE on success, EINA_FALSE on failure. + * + * Name and Destination must not be NULL, otherwhise EINA_FALSE will be returned. + * + * @since 1.3.3 + * @ingroup Eet_File_Group + */ +EAPI Eina_Bool eet_alias(Eet_File *ef, + const char *name, + const char *destination, + int compress); + + +/** + * List all entries in eet file matching shell glob. + * @param ef A valid eet file handle. + * @param glob A shell glob to match against. + * @param count_ret Number of entries found to match. + * @return Pointer to an array of strings. + * + * This function will list all entries in the eet file matching the + * supplied shell glob and return an allocated list of their names, if + * there are any, and if no memory errors occur. + * + * The eet file handle must be valid and glob must not be NULL, or NULL + * will be returned and count_ret will be filled with 0. + * + * The calling program must call free() on the array returned, but NOT + * on the string pointers in the array. They are taken as read-only + * internals from the eet file handle. They are only valid as long as + * the file handle is not closed. When it is closed those pointers in the + * array are now not valid and should not be used. + * + * On success the array returned will have a list of string pointers + * that are the names of the entries that matched, and count_ret will have + * the number of entries in this array placed in it. + * + * Hint: an easy way to list all entries in an eet file is to use a glob + * value of "*". + * + * @since 1.0.0 + * @ingroup Eet_File_Group + */ +EAPI char **eet_list(Eet_File *ef, const char *glob, int *count_ret); + +/** + * Return the number of entries in the specified eet file. + * @param ef A valid eet file handle. + * @return Number of entries in ef or -1 if the number of entries + * cannot be read due to open mode restrictions. + * + * @since 1.0.0 + * @ingroup Eet_File_Group + */ +EAPI int eet_num_entries(Eet_File *ef); + +/** + * @defgroup Eet_File_Cipher_Group Eet File Ciphered Main Functions + * + * Most of the @ref Eet_File_Group have alternative versions that + * accounts for ciphers to protect their content. + * + * @see @ref Eet_Cipher_Group + * + * @ingroup Eet_File_Group + */ + +/** + * Read a specified entry from an eet file and return data using a cipher. + * @param ef A valid eet file handle opened for reading. + * @param name Name of the entry. eg: "/base/file_i_want". + * @param size_ret Number of bytes read from entry and returned. + * @param cipher_key The key to use as cipher. + * @return The data stored in that entry in the eet file. + * + * This function finds an entry in the eet file that is stored under the + * name specified, and returns that data, decompressed, if successful. + * NULL is returned if the lookup fails or if memory errors are + * encountered. It is the job of the calling program to call free() on + * the returned data. The number of bytes in the returned data chunk are + * placed in size_ret. + * + * If the eet file handle is not valid NULL is returned and size_ret is + * filled with 0. + * + * @see eet_read() + * + * @since 1.0.0 + * @ingroup Eet_File_Cipher_Group + */ +EAPI void * eet_read_cipher(Eet_File *ef, + const char *name, + int *size_ret, + const char *cipher_key); + +/** + * Write a specified entry to an eet file handle using a cipher. + * @param ef A valid eet file handle opened for writing. + * @param name Name of the entry. eg: "/base/file_i_want". + * @param data Pointer to the data to be stored. + * @param size Length in bytes in the data to be stored. + * @param compress Compression flags (1 == compress, 0 = don't compress). + * @param cipher_key The key to use as cipher. + * @return bytes written on successful write, 0 on failure. + * + * This function will write the specified chunk of data to the eet file + * and return greater than 0 on success. 0 will be returned on failure. + * + * The eet file handle must be a valid file handle for an eet file opened + * for writing. If it is not, 0 will be returned and no action will be + * performed. + * + * Name, and data must not be NULL, and size must be > 0. If these + * conditions are not met, 0 will be returned. + * + * The data will be copied (and optionally compressed) in ram, pending + * a flush to disk (it will stay in ram till the eet file handle is + * closed though). + * + * @see eet_write() + * + * @since 1.0.0 + * @ingroup Eet_File_Cipher_Group + */ +EAPI int eet_write_cipher(Eet_File *ef, + const char *name, + const void *data, + int size, + int compress, + const char *cipher_key); + + +/** + * @defgroup Eet_File_Image_Group Image Store and Load + * + * Eet efficiently stores and loads images, including alpha + * channels and lossy compressions. + */ + +/** + * Read just the header data for an image and dont decode the pixels. + * @param ef A valid eet file handle opened for reading. + * @param name Name of the entry. eg: "/base/file_i_want". + * @param w A pointer to the unsigned int to hold the width in pixels. + * @param h A pointer to the unsigned int to hold the height in pixels. + * @param alpha A pointer to the int to hold the alpha flag. + * @param compress A pointer to the int to hold the compression amount. + * @param quality A pointer to the int to hold the quality amount. + * @param lossy A pointer to the int to hold the lossiness flag. + * @return 1 on successfull decode, 0 otherwise + * + * This function reads an image from an eet file stored under the named + * key in the eet file and return a pointer to the decompressed pixel data. + * + * The other parameters of the image (width, height etc.) are placed into + * the values pointed to (they must be supplied). The pixel data is a linear + * array of pixels starting from the top-left of the image scanning row by + * row from left to right. Each pile is a 32bit value, with the high byte + * being the alpha channel, the next being red, then green, and the low byte + * being blue. The width and height are measured in pixels and will be + * greater than 0 when returned. The alpha flag is either 0 or 1. 0 denotes + * that the alpha channel is not used. 1 denotes that it is significant. + * Compress is filled with the compression value/amount the image was + * stored with. The quality value is filled with the quality encoding of + * the image file (0 - 100). The lossy flags is either 0 or 1 as to if + * the image was encoded lossily or not. + * + * On success the function returns 1 indicating the header was read and + * decoded properly, or 0 on failure. + * + * @see eet_data_image_header_read_cipher() + * + * @since 1.0.0 + * @ingroup Eet_File_Image_Group + */ +EAPI int eet_data_image_header_read(Eet_File *ef, + const char *name, + unsigned int *w, + unsigned int *h, + int *alpha, + int *compress, + int *quality, + int *lossy); + +/** + * Read image data from the named key in the eet file. + * @param ef A valid eet file handle opened for reading. + * @param name Name of the entry. eg: "/base/file_i_want". + * @param w A pointer to the unsigned int to hold the width in pixels. + * @param h A pointer to the unsigned int to hold the height in pixels. + * @param alpha A pointer to the int to hold the alpha flag. + * @param compress A pointer to the int to hold the compression amount. + * @param quality A pointer to the int to hold the quality amount. + * @param lossy A pointer to the int to hold the lossiness flag. + * @return The image pixel data decoded + * + * This function reads an image from an eet file stored under the named + * key in the eet file and return a pointer to the decompressed pixel data. + * + * The other parameters of the image (width, height etc.) are placed into + * the values pointed to (they must be supplied). The pixel data is a linear + * array of pixels starting from the top-left of the image scanning row by + * row from left to right. Each pile is a 32bit value, with the high byte + * being the alpha channel, the next being red, then green, and the low byte + * being blue. The width and height are measured in pixels and will be + * greater than 0 when returned. The alpha flag is either 0 or 1. 0 denotes + * that the alpha channel is not used. 1 denotes that it is significant. + * Compress is filled with the compression value/amount the image was + * stored with. The quality value is filled with the quality encoding of + * the image file (0 - 100). The lossy flags is either 0 or 1 as to if + * the image was encoded lossily or not. + * + * On success the function returns a pointer to the image data decoded. The + * calling application is responsible for calling free() on the image data + * when it is done with it. On failure NULL is returned and the parameter + * values may not contain any sensible data. + * + * @see eet_data_image_read_cipher() + * + * @since 1.0.0 + * @ingroup Eet_File_Image_Group + */ +EAPI void *eet_data_image_read(Eet_File *ef, + const char *name, + unsigned int *w, + unsigned int *h, + int *alpha, + int *compress, + int *quality, + int *lossy); + +/** + * Read image data from the named key in the eet file. + * @param ef A valid eet file handle opened for reading. + * @param name Name of the entry. eg: "/base/file_i_want". + * @param src_x The starting x coordinate from where to dump the stream. + * @param src_y The starting y coordinate from where to dump the stream. + * @param d A pointer to the pixel surface. + * @param w The expected width in pixels of the pixel surface to decode. + * @param h The expected height in pixels of the pixel surface to decode. + * @param row_stride The length of a pixels line in the destination surface. + * @param alpha A pointer to the int to hold the alpha flag. + * @param compress A pointer to the int to hold the compression amount. + * @param quality A pointer to the int to hold the quality amount. + * @param lossy A pointer to the int to hold the lossiness flag. + * @return 1 on success, 0 otherwise. + * + * This function reads an image from an eet file stored under the named + * key in the eet file and return a pointer to the decompressed pixel data. + * + * The other parameters of the image (width, height etc.) are placed into + * the values pointed to (they must be supplied). The pixel data is a linear + * array of pixels starting from the top-left of the image scanning row by + * row from left to right. Each pile is a 32bit value, with the high byte + * being the alpha channel, the next being red, then green, and the low byte + * being blue. The width and height are measured in pixels and will be + * greater than 0 when returned. The alpha flag is either 0 or 1. 0 denotes + * that the alpha channel is not used. 1 denotes that it is significant. + * Compress is filled with the compression value/amount the image was + * stored with. The quality value is filled with the quality encoding of + * the image file (0 - 100). The lossy flags is either 0 or 1 as to if + * the image was encoded lossily or not. + * + * On success the function returns 1, and 0 on failure. On failure the + * parameter values may not contain any sensible data. + * + * @see eet_data_image_read_to_surface_cipher() + * + * @since 1.0.2 + * @ingroup Eet_File_Image_Group + */ +EAPI int eet_data_image_read_to_surface(Eet_File *ef, + const char *name, + unsigned int src_x, + unsigned int src_y, + unsigned int *d, + unsigned int w, + unsigned int h, + unsigned int row_stride, + int *alpha, + int *compress, + int *quality, + int *lossy); + +/** + * Write image data to the named key in an eet file. + * @param ef A valid eet file handle opened for writing. + * @param name Name of the entry. eg: "/base/file_i_want". + * @param data A pointer to the image pixel data. + * @param w The width of the image in pixels. + * @param h The height of the image in pixels. + * @param alpha The alpha channel flag. + * @param compress The compression amount. + * @param quality The quality encoding amount. + * @param lossy The lossiness flag. + * @return Success if the data was encoded and written or not. + * + * This function takes image pixel data and encodes it in an eet file + * stored under the supplied name key, and returns how many bytes were + * actually written to encode the image data. + * + * The data expected is the same format as returned by eet_data_image_read. + * If this is not the case weird things may happen. Width and height must + * be between 1 and 8000 pixels. The alpha flags can be 0 or 1 (0 meaning + * the alpha values are not useful and 1 meaning they are). Compress can + * be from 0 to 9 (0 meaning no compression, 9 meaning full compression). + * This is only used if the image is not lossily encoded. Quality is used on + * lossy compression and should be a value from 0 to 100. The lossy flag + * can be 0 or 1. 0 means encode losslessly and 1 means to encode with + * image quality loss (but then have a much smaller encoding). + * + * On success this function returns the number of bytes that were required + * to encode the image data, or on failure it returns 0. + * + * @see eet_data_image_write_cipher() + * + * @since 1.0.0 + * @ingroup Eet_File_Image_Group + */ +EAPI int eet_data_image_write(Eet_File *ef, + const char *name, + const void *data, + unsigned int w, + unsigned int h, + int alpha, + int compress, + int quality, + int lossy); + +/** + * Decode Image data header only to get information. + * @param data The encoded pixel data. + * @param size The size, in bytes, of the encoded pixel data. + * @param w A pointer to the unsigned int to hold the width in pixels. + * @param h A pointer to the unsigned int to hold the height in pixels. + * @param alpha A pointer to the int to hold the alpha flag. + * @param compress A pointer to the int to hold the compression amount. + * @param quality A pointer to the int to hold the quality amount. + * @param lossy A pointer to the int to hold the lossiness flag. + * @return 1 on success, 0 on failure. + * + * This function takes encoded pixel data and decodes it into raw RGBA + * pixels on success. + * + * The other parameters of the image (width, height etc.) are placed into + * the values pointed to (they must be supplied). The pixel data is a linear + * array of pixels starting from the top-left of the image scanning row by + * row from left to right. Each pixel is a 32bit value, with the high byte + * being the alpha channel, the next being red, then green, and the low byte + * being blue. The width and height are measured in pixels and will be + * greater than 0 when returned. The alpha flag is either 0 or 1. 0 denotes + * that the alpha channel is not used. 1 denotes that it is significant. + * Compress is filled with the compression value/amount the image was + * stored with. The quality value is filled with the quality encoding of + * the image file (0 - 100). The lossy flags is either 0 or 1 as to if + * the image was encoded lossily or not. + * + * On success the function returns 1 indicating the header was read and + * decoded properly, or 0 on failure. + * + * @see eet_data_image_header_decode_cipher() + * + * @since 1.0.0 + * @ingroup Eet_File_Image_Group + */ +EAPI int eet_data_image_header_decode(const void *data, + int size, + unsigned int *w, + unsigned int *h, + int *alpha, + int *compress, + int *quality, + int *lossy); + +/** + * Decode Image data into pixel data. + * @param data The encoded pixel data. + * @param size The size, in bytes, of the encoded pixel data. + * @param w A pointer to the unsigned int to hold the width in pixels. + * @param h A pointer to the unsigned int to hold the height in pixels. + * @param alpha A pointer to the int to hold the alpha flag. + * @param compress A pointer to the int to hold the compression amount. + * @param quality A pointer to the int to hold the quality amount. + * @param lossy A pointer to the int to hold the lossiness flag. + * @return The image pixel data decoded + * + * This function takes encoded pixel data and decodes it into raw RGBA + * pixels on success. + * + * The other parameters of the image (width, height etc.) are placed into + * the values pointed to (they must be supplied). The pixel data is a linear + * array of pixels starting from the top-left of the image scanning row by + * row from left to right. Each pixel is a 32bit value, with the high byte + * being the alpha channel, the next being red, then green, and the low byte + * being blue. The width and height are measured in pixels and will be + * greater than 0 when returned. The alpha flag is either 0 or 1. 0 denotes + * that the alpha channel is not used. 1 denotes that it is significant. + * Compress is filled with the compression value/amount the image was + * stored with. The quality value is filled with the quality encoding of + * the image file (0 - 100). The lossy flags is either 0 or 1 as to if + * the image was encoded lossily or not. + * + * On success the function returns a pointer to the image data decoded. The + * calling application is responsible for calling free() on the image data + * when it is done with it. On failure NULL is returned and the parameter + * values may not contain any sensible data. + * + * @see eet_data_image_decode_cipher() + * + * @since 1.0.0 + * @ingroup Eet_File_Image_Group + */ +EAPI void *eet_data_image_decode(const void *data, + int size, + unsigned int *w, + unsigned int *h, + int *alpha, + int *compress, + int *quality, + int *lossy); + +/** + * Decode Image data into pixel data. + * @param data The encoded pixel data. + * @param size The size, in bytes, of the encoded pixel data. + * @param src_x The starting x coordinate from where to dump the stream. + * @param src_y The starting y coordinate from where to dump the stream. + * @param d A pointer to the pixel surface. + * @param w The expected width in pixels of the pixel surface to decode. + * @param h The expected height in pixels of the pixel surface to decode. + * @param row_stride The length of a pixels line in the destination surface. + * @param alpha A pointer to the int to hold the alpha flag. + * @param compress A pointer to the int to hold the compression amount. + * @param quality A pointer to the int to hold the quality amount. + * @param lossy A pointer to the int to hold the lossiness flag. + * @return 1 on success, 0 otherwise. + * + * This function takes encoded pixel data and decodes it into raw RGBA + * pixels on success. + * + * The other parameters of the image (alpha, compress etc.) are placed into + * the values pointed to (they must be supplied). The pixel data is a linear + * array of pixels starting from the top-left of the image scanning row by + * row from left to right. Each pixel is a 32bit value, with the high byte + * being the alpha channel, the next being red, then green, and the low byte + * being blue. The width and height are measured in pixels and will be + * greater than 0 when returned. The alpha flag is either 0 or 1. 0 denotes + * that the alpha channel is not used. 1 denotes that it is significant. + * Compress is filled with the compression value/amount the image was + * stored with. The quality value is filled with the quality encoding of + * the image file (0 - 100). The lossy flags is either 0 or 1 as to if + * the image was encoded lossily or not. + * + * On success the function returns 1, and 0 on failure. On failure the + * parameter values may not contain any sensible data. + * + * @see eet_data_image_decode_to_surface_cipher() + * + * @since 1.0.2 + * @ingroup Eet_File_Image_Group + */ +EAPI int eet_data_image_decode_to_surface(const void *data, + int size, + unsigned int src_x, + unsigned int src_y, + unsigned int *d, + unsigned int w, + unsigned int h, + unsigned int row_stride, + int *alpha, + int *compress, + int *quality, + int *lossy); + +/** + * Encode image data for storage or transmission. + * @param data A pointer to the image pixel data. + * @param size_ret A pointer to an int to hold the size of the returned data. + * @param w The width of the image in pixels. + * @param h The height of the image in pixels. + * @param alpha The alpha channel flag. + * @param compress The compression amount. + * @param quality The quality encoding amount. + * @param lossy The lossiness flag. + * @return The encoded image data. + * + * This function stakes image pixel data and encodes it with compression and + * possible loss of quality (as a trade off for size) for storage or + * transmission to another system. + * + * The data expected is the same format as returned by eet_data_image_read. + * If this is not the case weird things may happen. Width and height must + * be between 1 and 8000 pixels. The alpha flags can be 0 or 1 (0 meaning + * the alpha values are not useful and 1 meaning they are). Compress can + * be from 0 to 9 (0 meaning no compression, 9 meaning full compression). + * This is only used if the image is not lossily encoded. Quality is used on + * lossy compression and should be a value from 0 to 100. The lossy flag + * can be 0 or 1. 0 means encode losslessly and 1 means to encode with + * image quality loss (but then have a much smaller encoding). + * + * On success this function returns a pointer to the encoded data that you + * can free with free() when no longer needed. + * + * @see eet_data_image_encode_cipher() + * + * @since 1.0.0 + * @ingroup Eet_File_Image_Group + */ +EAPI void *eet_data_image_encode(const void *data, + int *size_ret, + unsigned int w, + unsigned int h, + int alpha, + int compress, + int quality, + int lossy); + +/** + * @defgroup Eet_File_Image_Cipher_Group Image Store and Load using a Cipher + * + * Most of the @ref Eet_File_Image_Group have alternative versions + * that accounts for ciphers to protect their content. + * + * @see @ref Eet_Cipher_Group + * + * @ingroup Eet_File_Image_Group + */ + +/** + * Read just the header data for an image and dont decode the pixels using a cipher. + * @param ef A valid eet file handle opened for reading. + * @param name Name of the entry. eg: "/base/file_i_want". + * @param cipher_key The key to use as cipher. + * @param w A pointer to the unsigned int to hold the width in pixels. + * @param h A pointer to the unsigned int to hold the height in pixels. + * @param alpha A pointer to the int to hold the alpha flag. + * @param compress A pointer to the int to hold the compression amount. + * @param quality A pointer to the int to hold the quality amount. + * @param lossy A pointer to the int to hold the lossiness flag. + * @return 1 on successfull decode, 0 otherwise + * + * This function reads an image from an eet file stored under the named + * key in the eet file and return a pointer to the decompressed pixel data. + * + * The other parameters of the image (width, height etc.) are placed into + * the values pointed to (they must be supplied). The pixel data is a linear + * array of pixels starting from the top-left of the image scanning row by + * row from left to right. Each pile is a 32bit value, with the high byte + * being the alpha channel, the next being red, then green, and the low byte + * being blue. The width and height are measured in pixels and will be + * greater than 0 when returned. The alpha flag is either 0 or 1. 0 denotes + * that the alpha channel is not used. 1 denotes that it is significant. + * Compress is filled with the compression value/amount the image was + * stored with. The quality value is filled with the quality encoding of + * the image file (0 - 100). The lossy flags is either 0 or 1 as to if + * the image was encoded lossily or not. + * + * On success the function returns 1 indicating the header was read and + * decoded properly, or 0 on failure. + * + * @see eet_data_image_header_read() + * + * @since 1.0.0 + * @ingroup Eet_File_Image_Cipher_Group + */ +EAPI int eet_data_image_header_read_cipher(Eet_File *ef, + const char *name, + const char *cipher_key, + unsigned int *w, + unsigned int *h, + int *alpha, + int *compress, + int *quality, + int *lossy); + +/** + * Read image data from the named key in the eet file using a cipher. + * @param ef A valid eet file handle opened for reading. + * @param name Name of the entry. eg: "/base/file_i_want". + * @param cipher_key The key to use as cipher. + * @param w A pointer to the unsigned int to hold the width in pixels. + * @param h A pointer to the unsigned int to hold the height in pixels. + * @param alpha A pointer to the int to hold the alpha flag. + * @param compress A pointer to the int to hold the compression amount. + * @param quality A pointer to the int to hold the quality amount. + * @param lossy A pointer to the int to hold the lossiness flag. + * @return The image pixel data decoded + * + * This function reads an image from an eet file stored under the named + * key in the eet file and return a pointer to the decompressed pixel data. + * + * The other parameters of the image (width, height etc.) are placed into + * the values pointed to (they must be supplied). The pixel data is a linear + * array of pixels starting from the top-left of the image scanning row by + * row from left to right. Each pile is a 32bit value, with the high byte + * being the alpha channel, the next being red, then green, and the low byte + * being blue. The width and height are measured in pixels and will be + * greater than 0 when returned. The alpha flag is either 0 or 1. 0 denotes + * that the alpha channel is not used. 1 denotes that it is significant. + * Compress is filled with the compression value/amount the image was + * stored with. The quality value is filled with the quality encoding of + * the image file (0 - 100). The lossy flags is either 0 or 1 as to if + * the image was encoded lossily or not. + * + * On success the function returns a pointer to the image data decoded. The + * calling application is responsible for calling free() on the image data + * when it is done with it. On failure NULL is returned and the parameter + * values may not contain any sensible data. + * + * @see eet_data_image_read() + * + * @since 1.0.0 + * @ingroup Eet_File_Image_Cipher_Group + */ +EAPI void *eet_data_image_read_cipher(Eet_File *ef, + const char *name, + const char *cipher_key, + unsigned int *w, + unsigned int *h, + int *alpha, + int *compress, + int *quality, + int *lossy); + +/** + * Read image data from the named key in the eet file using a cipher. + * @param ef A valid eet file handle opened for reading. + * @param name Name of the entry. eg: "/base/file_i_want". + * @param cipher_key The key to use as cipher. + * @param src_x The starting x coordinate from where to dump the stream. + * @param src_y The starting y coordinate from where to dump the stream. + * @param d A pointer to the pixel surface. + * @param w The expected width in pixels of the pixel surface to decode. + * @param h The expected height in pixels of the pixel surface to decode. + * @param row_stride The length of a pixels line in the destination surface. + * @param alpha A pointer to the int to hold the alpha flag. + * @param compress A pointer to the int to hold the compression amount. + * @param quality A pointer to the int to hold the quality amount. + * @param lossy A pointer to the int to hold the lossiness flag. + * @return 1 on success, 0 otherwise. + * + * This function reads an image from an eet file stored under the named + * key in the eet file and return a pointer to the decompressed pixel data. + * + * The other parameters of the image (width, height etc.) are placed into + * the values pointed to (they must be supplied). The pixel data is a linear + * array of pixels starting from the top-left of the image scanning row by + * row from left to right. Each pile is a 32bit value, with the high byte + * being the alpha channel, the next being red, then green, and the low byte + * being blue. The width and height are measured in pixels and will be + * greater than 0 when returned. The alpha flag is either 0 or 1. 0 denotes + * that the alpha channel is not used. 1 denotes that it is significant. + * Compress is filled with the compression value/amount the image was + * stored with. The quality value is filled with the quality encoding of + * the image file (0 - 100). The lossy flags is either 0 or 1 as to if + * the image was encoded lossily or not. + * + * On success the function returns 1, and 0 on failure. On failure the + * parameter values may not contain any sensible data. + * + * @see eet_data_image_read_to_surface() + * + * @since 1.0.2 + * @ingroup Eet_File_Image_Cipher_Group + */ +EAPI int eet_data_image_read_to_surface_cipher(Eet_File *ef, + const char *name, + const char *cipher_key, + unsigned int src_x, + unsigned int src_y, + unsigned int *d, + unsigned int w, + unsigned int h, + unsigned int row_stride, + int *alpha, + int *compress, + int *quality, + int *lossy); + +/** + * Write image data to the named key in an eet file using a cipher. + * @param ef A valid eet file handle opened for writing. + * @param name Name of the entry. eg: "/base/file_i_want". + * @param cipher_key The key to use as cipher. + * @param data A pointer to the image pixel data. + * @param w The width of the image in pixels. + * @param h The height of the image in pixels. + * @param alpha The alpha channel flag. + * @param compress The compression amount. + * @param quality The quality encoding amount. + * @param lossy The lossiness flag. + * @return Success if the data was encoded and written or not. + * + * This function takes image pixel data and encodes it in an eet file + * stored under the supplied name key, and returns how many bytes were + * actually written to encode the image data. + * + * The data expected is the same format as returned by eet_data_image_read. + * If this is not the case weird things may happen. Width and height must + * be between 1 and 8000 pixels. The alpha flags can be 0 or 1 (0 meaning + * the alpha values are not useful and 1 meaning they are). Compress can + * be from 0 to 9 (0 meaning no compression, 9 meaning full compression). + * This is only used if the image is not lossily encoded. Quality is used on + * lossy compression and should be a value from 0 to 100. The lossy flag + * can be 0 or 1. 0 means encode losslessly and 1 means to encode with + * image quality loss (but then have a much smaller encoding). + * + * On success this function returns the number of bytes that were required + * to encode the image data, or on failure it returns 0. + * + * @see eet_data_image_write() + * + * @since 1.0.0 + * @ingroup Eet_File_Image_Cipher_Group + */ +EAPI int eet_data_image_write_cipher(Eet_File *ef, + const char *name, + const char *cipher_key, + const void *data, + unsigned int w, + unsigned int h, + int alpha, + int compress, + int quality, + int lossy); + + +/** + * Decode Image data header only to get information using a cipher. + * @param data The encoded pixel data. + * @param cipher_key The key to use as cipher. + * @param size The size, in bytes, of the encoded pixel data. + * @param w A pointer to the unsigned int to hold the width in pixels. + * @param h A pointer to the unsigned int to hold the height in pixels. + * @param alpha A pointer to the int to hold the alpha flag. + * @param compress A pointer to the int to hold the compression amount. + * @param quality A pointer to the int to hold the quality amount. + * @param lossy A pointer to the int to hold the lossiness flag. + * @return 1 on success, 0 on failure. + * + * This function takes encoded pixel data and decodes it into raw RGBA + * pixels on success. + * + * The other parameters of the image (width, height etc.) are placed into + * the values pointed to (they must be supplied). The pixel data is a linear + * array of pixels starting from the top-left of the image scanning row by + * row from left to right. Each pixel is a 32bit value, with the high byte + * being the alpha channel, the next being red, then green, and the low byte + * being blue. The width and height are measured in pixels and will be + * greater than 0 when returned. The alpha flag is either 0 or 1. 0 denotes + * that the alpha channel is not used. 1 denotes that it is significant. + * Compress is filled with the compression value/amount the image was + * stored with. The quality value is filled with the quality encoding of + * the image file (0 - 100). The lossy flags is either 0 or 1 as to if + * the image was encoded lossily or not. + * + * On success the function returns 1 indicating the header was read and + * decoded properly, or 0 on failure. + * + * @see eet_data_image_header_decode() + * + * @since 1.0.0 + * @ingroup Eet_File_Image_Cipher_Group + */ +EAPI int eet_data_image_header_decode_cipher(const void *data, + const char *cipher_key, + int size, + unsigned int *w, + unsigned int *h, + int *alpha, + int *compress, + int *quality, + int *lossy); + +/** + * Decode Image data into pixel data using a cipher. + * @param data The encoded pixel data. + * @param cipher_key The key to use as cipher. + * @param size The size, in bytes, of the encoded pixel data. + * @param w A pointer to the unsigned int to hold the width in pixels. + * @param h A pointer to the unsigned int to hold the height in pixels. + * @param alpha A pointer to the int to hold the alpha flag. + * @param compress A pointer to the int to hold the compression amount. + * @param quality A pointer to the int to hold the quality amount. + * @param lossy A pointer to the int to hold the lossiness flag. + * @return The image pixel data decoded + * + * This function takes encoded pixel data and decodes it into raw RGBA + * pixels on success. + * + * The other parameters of the image (width, height etc.) are placed into + * the values pointed to (they must be supplied). The pixel data is a linear + * array of pixels starting from the top-left of the image scanning row by + * row from left to right. Each pixel is a 32bit value, with the high byte + * being the alpha channel, the next being red, then green, and the low byte + * being blue. The width and height are measured in pixels and will be + * greater than 0 when returned. The alpha flag is either 0 or 1. 0 denotes + * that the alpha channel is not used. 1 denotes that it is significant. + * Compress is filled with the compression value/amount the image was + * stored with. The quality value is filled with the quality encoding of + * the image file (0 - 100). The lossy flags is either 0 or 1 as to if + * the image was encoded lossily or not. + * + * On success the function returns a pointer to the image data decoded. The + * calling application is responsible for calling free() on the image data + * when it is done with it. On failure NULL is returned and the parameter + * values may not contain any sensible data. + * + * @see eet_data_image_decode() + * + * @since 1.0.0 + * @ingroup Eet_File_Image_Cipher_Group + */ +EAPI void *eet_data_image_decode_cipher(const void *data, + const char *cipher_key, + int size, + unsigned int *w, + unsigned int *h, + int *alpha, + int *compress, + int *quality, + int *lossy); + +/** + * Decode Image data into pixel data using a cipher. + * @param data The encoded pixel data. + * @param cipher_key The key to use as cipher. + * @param size The size, in bytes, of the encoded pixel data. + * @param src_x The starting x coordinate from where to dump the stream. + * @param src_y The starting y coordinate from where to dump the stream. + * @param d A pointer to the pixel surface. + * @param w The expected width in pixels of the pixel surface to decode. + * @param h The expected height in pixels of the pixel surface to decode. + * @param row_stride The length of a pixels line in the destination surface. + * @param alpha A pointer to the int to hold the alpha flag. + * @param compress A pointer to the int to hold the compression amount. + * @param quality A pointer to the int to hold the quality amount. + * @param lossy A pointer to the int to hold the lossiness flag. + * @return 1 on success, 0 otherwise. + * + * This function takes encoded pixel data and decodes it into raw RGBA + * pixels on success. + * + * The other parameters of the image (alpha, compress etc.) are placed into + * the values pointed to (they must be supplied). The pixel data is a linear + * array of pixels starting from the top-left of the image scanning row by + * row from left to right. Each pixel is a 32bit value, with the high byte + * being the alpha channel, the next being red, then green, and the low byte + * being blue. The width and height are measured in pixels and will be + * greater than 0 when returned. The alpha flag is either 0 or 1. 0 denotes + * that the alpha channel is not used. 1 denotes that it is significant. + * Compress is filled with the compression value/amount the image was + * stored with. The quality value is filled with the quality encoding of + * the image file (0 - 100). The lossy flags is either 0 or 1 as to if + * the image was encoded lossily or not. + * + * On success the function returns 1, and 0 on failure. On failure the + * parameter values may not contain any sensible data. + * + * @see eet_data_image_decode_to_surface() + * + * @since 1.0.2 + * @ingroup Eet_File_Image_Cipher_Group + */ +EAPI int eet_data_image_decode_to_surface_cipher(const void *data, + const char *cipher_key, + int size, + unsigned int src_x, + unsigned int src_y, + unsigned int *d, + unsigned int w, + unsigned int h, + unsigned int row_stride, + int *alpha, + int *compress, + int *quality, + int *lossy); + +/** + * Encode image data for storage or transmission using a cipher. + * @param data A pointer to the image pixel data. + * @param cipher_key The key to use as cipher. + * @param size_ret A pointer to an int to hold the size of the returned data. + * @param w The width of the image in pixels. + * @param h The height of the image in pixels. + * @param alpha The alpha channel flag. + * @param compress The compression amount. + * @param quality The quality encoding amount. + * @param lossy The lossiness flag. + * @return The encoded image data. + * + * This function stakes image pixel data and encodes it with compression and + * possible loss of quality (as a trade off for size) for storage or + * transmission to another system. + * + * The data expected is the same format as returned by eet_data_image_read. + * If this is not the case weird things may happen. Width and height must + * be between 1 and 8000 pixels. The alpha flags can be 0 or 1 (0 meaning + * the alpha values are not useful and 1 meaning they are). Compress can + * be from 0 to 9 (0 meaning no compression, 9 meaning full compression). + * This is only used if the image is not lossily encoded. Quality is used on + * lossy compression and should be a value from 0 to 100. The lossy flag + * can be 0 or 1. 0 means encode losslessly and 1 means to encode with + * image quality loss (but then have a much smaller encoding). + * + * On success this function returns a pointer to the encoded data that you + * can free with free() when no longer needed. + * + * @see eet_data_image_encode() + * + * @since 1.0.0 + * @ingroup Eet_File_Image_Cipher_Group + */ +EAPI void *eet_data_image_encode_cipher(const void *data, + const char *cipher_key, + unsigned int w, + unsigned int h, + int alpha, + int compress, + int quality, + int lossy, + int *size_ret); + + +/** + * @defgroup Eet_Cipher_Group Cipher, Identity and Protection Mechanisms + * + * Eet allows one to protect entries of an #Eet_File + * individually. This may be used to ensure data was not tampered or + * that third party does not read your data. + * + * @see @ref Eet_File_Cipher_Group + * @see @ref Eet_File_Image_Cipher_Group + * + * @{ + */ + +/** + * @typedef Eet_Key + * Opaque handle that defines an identity (also known as key) + * in Eet's cipher system. + */ +typedef struct _Eet_Key Eet_Key; + +/** + * @} + */ + + +/** + * Callback used to request if needed the password of a private key. + * + * @param buffer the buffer where to store the password. + * @param size the maximum password size (size of buffer, including '@\0'). + * @param rwflag if the buffer is also readable or just writable. + * @param data currently unused, may contain some context in future. + * @return 1 on success and password was set to @p buffer, 0 on failure. + * + * @since 1.2.0 + * @ingroup Eet_Cipher_Group + */ +typedef int (*Eet_Key_Password_Callback)(char *buffer, int size, int rwflag, + void *data); + +/** + * Create an Eet_Key needed for signing an eet file. + * + * The certificate should provide the public that match the private key. + * No verification is done to ensure that. + * + * @param certificate_file The file where to find the certificate. + * @param private_key_file The file that contains the private key. + * @param cb Function to callback if password is required to unlock + * private key. + * @return A key handle to use, or @c NULL on failure. + * + * @see eet_identity_close() + * + * @since 1.2.0 + * @ingroup Eet_Cipher_Group + */ +EAPI Eet_Key * eet_identity_open(const char *certificate_file, + const char *private_key_file, + Eet_Key_Password_Callback cb); + +/** + * Close and release all ressource used by an Eet_Key. An + * reference counter prevent it from being freed until all file + * using it are also closed. + * + * @param key the key handle to close and free resources. + * + * @since 1.2.0 + * @ingroup Eet_Cipher_Group + */ +EAPI void eet_identity_close(Eet_Key *key); + +/** + * Set a key to sign a file + * + * @param ef the file to set the identity. + * @param key the key handle to set as identity. + * @return #EET_ERROR_BAD_OBJECT if @p ef is invalid or + * #EET_ERROR_NONE on success. + * + * @since 1.2.0 + * @ingroup Eet_Cipher_Group + */ +EAPI Eet_Error eet_identity_set(Eet_File *ef, Eet_Key *key); + +/** + * Display both private and public key of an Eet_Key. + * + * @param key the handle to print. + * @param out where to print. + * + * @since 1.2.0 + * @ingroup Eet_Cipher_Group + */ +EAPI void eet_identity_print(Eet_Key *key, FILE *out); + +/** + * Get the x509 der certificate associated with an Eet_File. Will return NULL + * if the file is not signed. + * + * @param ef The file handle to query. + * @param der_length The length of returned data, may be @c NULL. + * @return the x509 certificate or @c NULL on error. + * + * @since 1.2.0 + * @ingroup Eet_Cipher_Group + */ +EAPI const void *eet_identity_x509(Eet_File *ef, int *der_length); + +/** + * Get the raw signature associated with an Eet_File. Will return NULL + * if the file is not signed. + * + * @param ef The file handle to query. + * @param signature_length The length of returned data, may be @c NULL. + * @return the raw signature or @c NULL on error. + * + * @ingroup Eet_Cipher_Group + */ +EAPI const void *eet_identity_signature(Eet_File *ef, int *signature_length); + +/** + * Get the SHA1 associated with a file. Could be the one used to + * sign the data or if the data where not signed, it will be the + * SHA1 of the file. + * + * @param ef The file handle to query. + * @param sha1_length The length of returned data, may be @c NULL. + * @return the associated SHA1 or @c NULL on error. + * + * @since 1.2.0 + * @ingroup Eet_Cipher_Group + */ +EAPI const void *eet_identity_sha1(Eet_File *ef, int *sha1_length); + +/** + * Display the x509 der certificate to out. + * + * @param certificate the x509 certificate to print + * @param der_length The length the certificate. + * @param out where to print. + * + * @since 1.2.0 + * @ingroup Eet_Cipher_Group + */ +EAPI void eet_identity_certificate_print( + const unsigned char *certificate, + int der_length, + FILE *out); + + +/** + * @defgroup Eet_Data_Group Eet Data Serialization + * + * Convenience functions to serialize and parse complex data + * structures to binary blobs. + * + * While Eet core just handles binary blobs, it is often required + * to save some structured data of different types, such as + * strings, integers, lists, hashes and so on. + * + * Eet can serialize and then parse data types given some + * construction instructions. These are defined in two levels: + * + * - #Eet_Data_Descriptor_Class to tell generic memory handling, + * such as the size of the type, how to allocate memory, strings, + * lists, hashes and so on. + * + * - #Eet_Data_Descriptor to tell inside such type, the members and + * their offsets inside the memory blob, their types and + * names. These members can be simple types or other + * #Eet_Data_Descriptor, allowing hierarchical types to be + * defined. + * + * Given that C provides no introspection, this process can be + * quite cumbersome, so we provide lots of macros and convenience + * functions to aid creating the types. + * + * Example: + * + * @code + * #include + * #include + * + * typedef struct _blah2 + * { + * char *string; + * } Blah2; + * + * typedef struct _blah3 + * { + * char *string; + * } Blah3; + * + * typedef struct _blah + * { + * char character; + * short sixteen; + * int integer; + * long long lots; + * float floating; + * double floating_lots; + * char *string; + * Blah2 *blah2; + * Eina_List *blah3; + * } Blah; + * + * int + * main(int argc, char **argv) + * { + * Blah blah; + * Blah2 blah2; + * Blah3 blah3; + * Eet_Data_Descriptor *edd, *edd2, *edd3; + * Eet_Data_Descriptor_Class eddc, eddc2, eddc3; + * void *data; + * int size; + * FILE *f; + * Blah *blah_in; + * + * eet_init(); + * + * EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc3, Blah3); + * edd3 = eet_data_descriptor_stream_new(&eddc3); + * EET_DATA_DESCRIPTOR_ADD_BASIC(edd3, Blah3, "string3", string, EET_T_STRING); + * + * EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc2, Blah2); + * edd2 = eet_data_descriptor_stream_new(&eddc2); + * EET_DATA_DESCRIPTOR_ADD_BASIC(edd2, Blah2, "string2", string, EET_T_STRING); + * + * EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Blah); + * edd = eet_data_descriptor_stream_new(&eddc); + * EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Blah, "character", character, EET_T_CHAR); + * EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Blah, "sixteen", sixteen, EET_T_SHORT); + * EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Blah, "integer", integer, EET_T_INT); + * EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Blah, "lots", lots, EET_T_LONG_LONG); + * EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Blah, "floating", floating, EET_T_FLOAT); + * EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Blah, "floating_lots", floating_lots, EET_T_DOUBLE); + * EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Blah, "string", string, EET_T_STRING); + * EET_DATA_DESCRIPTOR_ADD_SUB(edd, Blah, "blah2", blah2, edd2); + * EET_DATA_DESCRIPTOR_ADD_LIST(edd, Blah, "blah3", blah3, edd3); + * + * blah3.string = "PANTS"; + * + * blah2.string = "subtype string here!"; + * + * blah.character = '7'; + * blah.sixteen = 0x7777; + * blah.integer = 0xc0def00d; + * blah.lots = 0xdeadbeef31337777; + * blah.floating = 3.141592654; + * blah.floating_lots = 0.777777777777777; + * blah.string = "bite me like a turnip"; + * blah.blah2 = &blah2; + * blah.blah3 = eina_list_append(NULL, &blah3); + * blah.blah3 = eina_list_append(blah.blah3, &blah3); + * blah.blah3 = eina_list_append(blah.blah3, &blah3); + * blah.blah3 = eina_list_append(blah.blah3, &blah3); + * blah.blah3 = eina_list_append(blah.blah3, &blah3); + * blah.blah3 = eina_list_append(blah.blah3, &blah3); + * blah.blah3 = eina_list_append(blah.blah3, &blah3); + * + * data = eet_data_descriptor_encode(edd, &blah, &size); + * printf("-----DECODING\n"); + * blah_in = eet_data_descriptor_decode(edd, data, size); + * + * printf("-----DECODED!\n"); + * printf("%c\n", blah_in->character); + * printf("%x\n", (int)blah_in->sixteen); + * printf("%x\n", blah_in->integer); + * printf("%lx\n", blah_in->lots); + * printf("%f\n", (double)blah_in->floating); + * printf("%f\n", (double)blah_in->floating_lots); + * printf("%s\n", blah_in->string); + * printf("%p\n", blah_in->blah2); + * printf(" %s\n", blah_in->blah2->string); + * { + * Eina_List *l; + * Blah3 *blah3_in; + * + * EINA_LIST_FOREACH(blah_in->blah3, l, blah3_in) + * { + * printf("%p\n", blah3_in); + * printf(" %s\n", blah3_in->string); + * } + * } + * eet_data_descriptor_free(edd); + * eet_data_descriptor_free(edd2); + * eet_data_descriptor_free(edd3); + * + * eet_shutdown(); + * + * return 0; + * } + * @endcode + * + * @{ + */ #define EET_T_UNKNOW 0 /**< Unknown data encoding type */ #define EET_T_CHAR 1 /**< Data type: char */ #define EET_T_SHORT 2 /**< Data type: short */ @@ -1533,9 +1695,9 @@ extern "C" { #define EET_T_STRING 11 /**< Data type: char * */ #define EET_T_INLINED_STRING 12 /**< Data type: char * (but compressed inside the resulting eet) */ #define EET_T_NULL 13 /**< Data type: (void *) (only use it if you know why) */ -#define EET_T_F32P32 14 /**< Data type: fixed point 32.32 */ -#define EET_T_F16P16 15 /**< Data type: fixed point 16.16 */ -#define EET_T_F8P24 16 /**< Data type: fixed point 8.24 */ +#define EET_T_F32P32 14 /**< Data type: fixed point 32.32 */ +#define EET_T_F16P16 15 /**< Data type: fixed point 16.16 */ +#define EET_T_F8P24 16 /**< Data type: fixed point 8.24 */ #define EET_T_LAST 18 /**< Last data type */ #define EET_G_UNKNOWN 100 /**< Unknown group data encoding type */ @@ -1549,1354 +1711,1517 @@ extern "C" { #define EET_I_LIMIT 128 /**< Other type exist but are reserved for internal purpose. */ - /** - * @typedef Eet_Data_Descriptor - * - * Opaque handle that have information on a type members. - * - * The members are added by means of - * EET_DATA_DESCRIPTOR_ADD_BASIC(), EET_DATA_DESCRIPTOR_ADD_SUB(), - * EET_DATA_DESCRIPTOR_ADD_LIST(), EET_DATA_DESCRIPTOR_ADD_HASH() - * or eet_data_descriptor_element_add(). - * - * @see eet_data_descriptor_stream_new() - * @see eet_data_descriptor_file_new() - * @see eet_data_descriptor_free() - */ - typedef struct _Eet_Data_Descriptor Eet_Data_Descriptor; +/** + * @typedef Eet_Data_Descriptor + * + * Opaque handle that have information on a type members. + * + * The members are added by means of + * EET_DATA_DESCRIPTOR_ADD_BASIC(), EET_DATA_DESCRIPTOR_ADD_SUB(), + * EET_DATA_DESCRIPTOR_ADD_LIST(), EET_DATA_DESCRIPTOR_ADD_HASH() + * or eet_data_descriptor_element_add(). + * + * @see eet_data_descriptor_stream_new() + * @see eet_data_descriptor_file_new() + * @see eet_data_descriptor_free() + */ +typedef struct _Eet_Data_Descriptor Eet_Data_Descriptor; - /** - * @def EET_DATA_DESCRIPTOR_CLASS_VERSION - * The version of #Eet_Data_Descriptor_Class at the time of the - * distribution of the sources. One should define this to its - * version member so it is compatible with abi changes, or at least - * will not crash with them. - */ +/** + * @def EET_DATA_DESCRIPTOR_CLASS_VERSION + * The version of #Eet_Data_Descriptor_Class at the time of the + * distribution of the sources. One should define this to its + * version member so it is compatible with abi changes, or at least + * will not crash with them. + */ #define EET_DATA_DESCRIPTOR_CLASS_VERSION 3 - /** - * @typedef Eet_Data_Descriptor_Class - * - * Instructs Eet about memory management for different needs under - * serialization and parse process. - */ - typedef struct _Eet_Data_Descriptor_Class Eet_Data_Descriptor_Class; +/** + * @typedef Eet_Data_Descriptor_Class + * + * Instructs Eet about memory management for different needs under + * serialization and parse process. + */ +typedef struct _Eet_Data_Descriptor_Class Eet_Data_Descriptor_Class; - /** - * @struct _Eet_Data_Descriptor_Class - * - * Instructs Eet about memory management for different needs under - * serialization and parse process. - * - * If using Eina data types, it is advised to use the helpers - * EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET() and - * EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(). - */ - struct _Eet_Data_Descriptor_Class - { - int version; /**< ABI version as #EET_DATA_DESCRIPTOR_CLASS_VERSION */ - const char *name; /**< Name of data type to be serialized */ - int size; /**< Size in bytes of data type to be serialized */ - struct { - void *(*mem_alloc) (size_t size); /**< how to allocate memory (usually malloc()) */ - void (*mem_free) (void *mem); /**< how to free memory (usually free()) */ - char *(*str_alloc) (const char *str); /**< how to allocate a string */ - void (*str_free) (const char *str); /**< how to free a string */ - void *(*list_next) (void *l); /**< how to iterate to the next element of a list. Receives and should return the list node. */ - void *(*list_append) (void *l, void *d); /**< how to append data @p d to list which head node is @p l */ - void *(*list_data) (void *l); /**< retrieves the data from node @p l */ - void *(*list_free) (void *l); /**< free all the nodes from the list which head node is @p l */ - void (*hash_foreach) (void *h, int (*func) (void *h, const char *k, void *dt, void *fdt), void *fdt); /**< iterates over all elements in the hash @p h in no specific order */ - void *(*hash_add) (void *h, const char *k, void *d); /**< add a new data @p d as key @p k in hash @p h */ - void (*hash_free) (void *h); /**< free all entries from the hash @p h */ - char *(*str_direct_alloc) (const char *str); /**< how to allocate a string directly from file backed/mmaped region pointed by @p str */ - void (*str_direct_free) (const char *str); /**< how to free a string returned by str_direct_alloc */ +/** + * @struct _Eet_Data_Descriptor_Class + * + * Instructs Eet about memory management for different needs under + * serialization and parse process. + * + * If using Eina data types, it is advised to use the helpers + * EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET() and + * EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(). + */ +struct _Eet_Data_Descriptor_Class +{ + int version; /**< ABI version as #EET_DATA_DESCRIPTOR_CLASS_VERSION */ + const char *name; /**< Name of data type to be serialized */ + int size; /**< Size in bytes of data type to be serialized */ + struct + { + void *(*mem_alloc)(size_t size); /**< how to allocate memory (usually malloc()) */ + void (*mem_free)(void *mem); /**< how to free memory (usually free()) */ + char *(*str_alloc)(const char *str); /**< how to allocate a string */ + void (*str_free)(const char *str); /**< how to free a string */ + void *(*list_next)(void *l); /**< how to iterate to the next element of a list. Receives and should return the list node. */ + void *(*list_append)(void *l, void *d); /**< how to append data @p d to list which head node is @p l */ + void *(*list_data)(void *l); /**< retrieves the data from node @p l */ + void *(*list_free)(void *l); /**< free all the nodes from the list which head node is @p l */ + void (*hash_foreach)(void *h, + int (*func)(void *h, const char *k, void *dt, + void *fdt), void *fdt); /**< iterates over all elements in the hash @p h in no specific order */ + void *(*hash_add)(void *h, const char *k, void *d); /**< add a new data @p d as key @p k in hash @p h */ + void (*hash_free)(void *h); /**< free all entries from the hash @p h */ + char *(*str_direct_alloc)(const char *str); /**< how to allocate a string directly from file backed/mmaped region pointed by @p str */ + void (*str_direct_free)(const char *str); /**< how to free a string returned by str_direct_alloc */ - const char *(*type_get) (const void *data, Eina_Bool *unknow); /**< convert any kind of data type to a name that define an Eet_Data_Element. */ - Eina_Bool (*type_set) (const char *type, void *data, Eina_Bool unknow); /**< set the type at a particular adress */ - } func; - }; + const char *(*type_get)(const void *data, Eina_Bool *unknow); /**< convert any kind of data type to a name that define an Eet_Data_Element. */ + Eina_Bool (*type_set)(const char *type, void *data, Eina_Bool unknow); /**< set the type at a particular adress */ + } func; +}; - /** - * @} - */ +/** + * @} + */ - /** - * Create a new empty data structure descriptor. - * @param name The string name of this data structure (most be a - * global constant and never change). - * @param size The size of the struct (in bytes). - * @param func_list_next The function to get the next list node. - * @param func_list_append The function to append a member to a list. - * @param func_list_data The function to get the data from a list node. - * @param func_list_free The function to free an entire linked list. - * @param func_hash_foreach The function to iterate through all - * hash table entries. - * @param func_hash_add The function to add a member to a hash table. - * @param func_hash_free The function to free an entire hash table. - * @return A new empty data descriptor. - * - * This function creates a new data descriptore and returns a handle to the - * new data descriptor. On creation it will be empty, containing no contents - * describing anything other than the shell of the data structure. - * - * You add structure members to the data descriptor using the macros - * EET_DATA_DESCRIPTOR_ADD_BASIC(), EET_DATA_DESCRIPTOR_ADD_SUB() and - * EET_DATA_DESCRIPTOR_ADD_LIST(), depending on what type of member you are - * adding to the description. - * - * Once you have described all the members of a struct you want loaded, or - * saved eet can load and save those members for you, encode them into - * endian-independant serialised data chunks for transmission across a - * a network or more. - * - * The function pointers to the list and hash table functions are only - * needed if you use those data types, else you can pass NULL instead. - * - * @since 1.0.0 - * @ingroup Eet_Data_Group - * - * @deprecated use eet_data_descriptor_stream_new() or - * eet_data_descriptor_file_new() - */ - EINA_DEPRECATED EAPI Eet_Data_Descriptor *eet_data_descriptor_new(const char *name, int size, void *(*func_list_next) (void *l), void *(*func_list_append) (void *l, void *d), void *(*func_list_data) (void *l), void *(*func_list_free) (void *l), void (*func_hash_foreach) (void *h, int (*func) (void *h, const char *k, void *dt, void *fdt), void *fdt), void *(*func_hash_add) (void *h, const char *k, void *d), void (*func_hash_free) (void *h)); - /* - * FIXME: - * - * moving to this api from the old above. this will break things when the - * move happens - but be warned - */ - EINA_DEPRECATED EAPI Eet_Data_Descriptor *eet_data_descriptor2_new(const Eet_Data_Descriptor_Class *eddc); - EINA_DEPRECATED EAPI Eet_Data_Descriptor *eet_data_descriptor3_new(const Eet_Data_Descriptor_Class *eddc); +/** + * Create a new empty data structure descriptor. + * @param name The string name of this data structure (most be a + * global constant and never change). + * @param size The size of the struct (in bytes). + * @param func_list_next The function to get the next list node. + * @param func_list_append The function to append a member to a list. + * @param func_list_data The function to get the data from a list node. + * @param func_list_free The function to free an entire linked list. + * @param func_hash_foreach The function to iterate through all + * hash table entries. + * @param func_hash_add The function to add a member to a hash table. + * @param func_hash_free The function to free an entire hash table. + * @return A new empty data descriptor. + * + * This function creates a new data descriptore and returns a handle to the + * new data descriptor. On creation it will be empty, containing no contents + * describing anything other than the shell of the data structure. + * + * You add structure members to the data descriptor using the macros + * EET_DATA_DESCRIPTOR_ADD_BASIC(), EET_DATA_DESCRIPTOR_ADD_SUB() and + * EET_DATA_DESCRIPTOR_ADD_LIST(), depending on what type of member you are + * adding to the description. + * + * Once you have described all the members of a struct you want loaded, or + * saved eet can load and save those members for you, encode them into + * endian-independant serialised data chunks for transmission across a + * a network or more. + * + * The function pointers to the list and hash table functions are only + * needed if you use those data types, else you can pass NULL instead. + * + * @since 1.0.0 + * @ingroup Eet_Data_Group + * + * @deprecated use eet_data_descriptor_stream_new() or + * eet_data_descriptor_file_new() + */ +EINA_DEPRECATED EAPI Eet_Data_Descriptor *eet_data_descriptor_new( + const char *name, + int size, + void *(*func_list_next)(void *l), + void *(*func_list_append)(void *l, void *d), + void *(*func_list_data)(void *l), + void *(*func_list_free)(void *l), + void (*func_hash_foreach)(void *h, int (*func)(void *h, + const char *k, + void *dt, + void *fdt), void *fdt), + void *(*func_hash_add)(void *h, const char *k, void *d), + void (*func_hash_free)(void *h)); +/* + * FIXME: + * + * moving to this api from the old above. this will break things when the + * move happens - but be warned + */ +EINA_DEPRECATED EAPI Eet_Data_Descriptor *eet_data_descriptor2_new( + const Eet_Data_Descriptor_Class *eddc); +EINA_DEPRECATED EAPI Eet_Data_Descriptor *eet_data_descriptor3_new( + const Eet_Data_Descriptor_Class *eddc); - /** - * This function creates a new data descriptore and returns a handle to the - * new data descriptor. On creation it will be empty, containing no contents - * describing anything other than the shell of the data structure. - * @param eddc The data descriptor to free. - * - * You add structure members to the data descriptor using the macros - * EET_DATA_DESCRIPTOR_ADD_BASIC(), EET_DATA_DESCRIPTOR_ADD_SUB() and - * EET_DATA_DESCRIPTOR_ADD_LIST(), depending on what type of member you are - * adding to the description. - * - * Once you have described all the members of a struct you want loaded, or - * saved eet can load and save those members for you, encode them into - * endian-independant serialised data chunks for transmission across a - * a network or more. - * - * This function specially ignore str_direct_alloc and str_direct_free. It - * is usefull when the eet_data you are reading don't have a dictionnary - * like network stream or ipc. It also mean that all string will be allocated - * and duplicated in memory. - * - * @since 1.2.3 - * @ingroup Eet_Data_Group - */ - EAPI Eet_Data_Descriptor *eet_data_descriptor_stream_new(const Eet_Data_Descriptor_Class *eddc); +/** + * This function creates a new data descriptore and returns a handle to the + * new data descriptor. On creation it will be empty, containing no contents + * describing anything other than the shell of the data structure. + * @param eddc The data descriptor to free. + * + * You add structure members to the data descriptor using the macros + * EET_DATA_DESCRIPTOR_ADD_BASIC(), EET_DATA_DESCRIPTOR_ADD_SUB() and + * EET_DATA_DESCRIPTOR_ADD_LIST(), depending on what type of member you are + * adding to the description. + * + * Once you have described all the members of a struct you want loaded, or + * saved eet can load and save those members for you, encode them into + * endian-independant serialised data chunks for transmission across a + * a network or more. + * + * This function specially ignore str_direct_alloc and str_direct_free. It + * is usefull when the eet_data you are reading don't have a dictionnary + * like network stream or ipc. It also mean that all string will be allocated + * and duplicated in memory. + * + * @since 1.2.3 + * @ingroup Eet_Data_Group + */ +EAPI Eet_Data_Descriptor * eet_data_descriptor_stream_new( + const Eet_Data_Descriptor_Class *eddc); - /** - * This function creates a new data descriptore and returns a handle to the - * new data descriptor. On creation it will be empty, containing no contents - * describing anything other than the shell of the data structure. - * @param eddc The data descriptor to free. - * - * You add structure members to the data descriptor using the macros - * EET_DATA_DESCRIPTOR_ADD_BASIC(), EET_DATA_DESCRIPTOR_ADD_SUB() and - * EET_DATA_DESCRIPTOR_ADD_LIST(), depending on what type of member you are - * adding to the description. - * - * Once you have described all the members of a struct you want loaded, or - * saved eet can load and save those members for you, encode them into - * endian-independant serialised data chunks for transmission across a - * a network or more. - * - * This function use str_direct_alloc and str_direct_free. It is - * usefull when the eet_data you are reading come from a file and - * have a dictionnary. This will reduce memory use, improve the - * possibility for the OS to page this string out. But be carrefull - * all EET_T_STRING are pointer to a mmapped area and it will point - * to nowhere if you close the file. So as long as you use this - * strings, you need to have the Eet_File open. - * - * @since 1.2.3 - * @ingroup Eet_Data_Group - */ - EAPI Eet_Data_Descriptor *eet_data_descriptor_file_new(const Eet_Data_Descriptor_Class *eddc); +/** + * This function creates a new data descriptore and returns a handle to the + * new data descriptor. On creation it will be empty, containing no contents + * describing anything other than the shell of the data structure. + * @param eddc The data descriptor to free. + * + * You add structure members to the data descriptor using the macros + * EET_DATA_DESCRIPTOR_ADD_BASIC(), EET_DATA_DESCRIPTOR_ADD_SUB() and + * EET_DATA_DESCRIPTOR_ADD_LIST(), depending on what type of member you are + * adding to the description. + * + * Once you have described all the members of a struct you want loaded, or + * saved eet can load and save those members for you, encode them into + * endian-independant serialised data chunks for transmission across a + * a network or more. + * + * This function use str_direct_alloc and str_direct_free. It is + * usefull when the eet_data you are reading come from a file and + * have a dictionnary. This will reduce memory use, improve the + * possibility for the OS to page this string out. But be carrefull + * all EET_T_STRING are pointer to a mmapped area and it will point + * to nowhere if you close the file. So as long as you use this + * strings, you need to have the Eet_File open. + * + * @since 1.2.3 + * @ingroup Eet_Data_Group + */ +EAPI Eet_Data_Descriptor * eet_data_descriptor_file_new( + const Eet_Data_Descriptor_Class *eddc); - /** - * This function is an helper that set all the parameter of an - * Eet_Data_Descriptor_Class correctly when you use Eina data type - * with a stream. - * @param eddc The Eet_Data_Descriptor_Class you want to set. - * @param name The name of the structure described by this class. - * @param size The size of the structure described by this class. - * @return EINA_TRUE if the structure was correctly set (The only - * reason that could make it fail is if you did give wrong - * parameter). - * - * @since 1.2.3 - * @ingroup Eet_Data_Group - */ - EAPI Eina_Bool eet_eina_stream_data_descriptor_class_set(Eet_Data_Descriptor_Class *eddc, const char *name, int size); +/** + * This function is an helper that set all the parameter of an + * Eet_Data_Descriptor_Class correctly when you use Eina data type + * with a stream. + * @param eddc The Eet_Data_Descriptor_Class you want to set. + * @param name The name of the structure described by this class. + * @param size The size of the structure described by this class. + * @return EINA_TRUE if the structure was correctly set (The only + * reason that could make it fail is if you did give wrong + * parameter). + * + * @since 1.2.3 + * @ingroup Eet_Data_Group + */ +EAPI Eina_Bool + eet_eina_stream_data_descriptor_class_set( + Eet_Data_Descriptor_Class *eddc, + const char *name, + int size); - /** - * This macro is an helper that set all the parameter of an - * Eet_Data_Descriptor_Class correctly when you use Eina data type - * with stream. - * @param Clas The Eet_Data_Descriptor_Class you want to set. - * @param Type The type of the structure described by this class. - * @return EINA_TRUE if the structure was correctly set (The only - * reason that could make it fail is if you did give wrong - * parameter). - * - * @since 1.2.3 - * @ingroup Eet_Data_Group - */ -#define EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(Clas, Type) (eet_eina_stream_data_descriptor_class_set(Clas, #Type , sizeof (Type))) +/** + * This macro is an helper that set all the parameter of an + * Eet_Data_Descriptor_Class correctly when you use Eina data type + * with stream. + * @param Clas The Eet_Data_Descriptor_Class you want to set. + * @param Type The type of the structure described by this class. + * @return EINA_TRUE if the structure was correctly set (The only + * reason that could make it fail is if you did give wrong + * parameter). + * + * @since 1.2.3 + * @ingroup Eet_Data_Group + */ +#define EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(Clas, \ + Type) ( \ + eet_eina_stream_data_descriptor_class_set(Clas, # Type, sizeof (Type))) - /** - * This function is an helper that set all the parameter of an - * Eet_Data_Descriptor_Class correctly when you use Eina data type - * with a file. - * @param eddc The Eet_Data_Descriptor_Class you want to set. - * @param name The name of the structure described by this class. - * @param size The size of the structure described by this class. - * @return EINA_TRUE if the structure was correctly set (The only - * reason that could make it fail is if you did give wrong - * parameter). - * - * @since 1.2.3 - * @ingroup Eet_Data_Group - */ - EAPI Eina_Bool eet_eina_file_data_descriptor_class_set(Eet_Data_Descriptor_Class *eddc, const char *name, int size); +/** + * This function is an helper that set all the parameter of an + * Eet_Data_Descriptor_Class correctly when you use Eina data type + * with a file. + * @param eddc The Eet_Data_Descriptor_Class you want to set. + * @param name The name of the structure described by this class. + * @param size The size of the structure described by this class. + * @return EINA_TRUE if the structure was correctly set (The only + * reason that could make it fail is if you did give wrong + * parameter). + * + * @since 1.2.3 + * @ingroup Eet_Data_Group + */ +EAPI Eina_Bool eet_eina_file_data_descriptor_class_set( + Eet_Data_Descriptor_Class *eddc, + const char *name, + int size); - /** - * This macro is an helper that set all the parameter of an - * Eet_Data_Descriptor_Class correctly when you use Eina data type - * with file. - * @param Clas The Eet_Data_Descriptor_Class you want to set. - * @param Type The type of the structure described by this class. - * @return EINA_TRUE if the structure was correctly set (The only - * reason that could make it fail is if you did give wrong - * parameter). - * - * @since 1.2.3 - * @ingroup Eet_Data_Group - */ -#define EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(Clas, Type) (eet_eina_file_data_descriptor_class_set(Clas, #Type , sizeof (Type))) +/** + * This macro is an helper that set all the parameter of an + * Eet_Data_Descriptor_Class correctly when you use Eina data type + * with file. + * @param Clas The Eet_Data_Descriptor_Class you want to set. + * @param Type The type of the structure described by this class. + * @return EINA_TRUE if the structure was correctly set (The only + * reason that could make it fail is if you did give wrong + * parameter). + * + * @since 1.2.3 + * @ingroup Eet_Data_Group + */ +#define EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(Clas, \ + Type) ( \ + eet_eina_file_data_descriptor_class_set(Clas, # Type, sizeof (Type))) - /** - * This function frees a data descriptor when it is not needed anymore. - * @param edd The data descriptor to free. - * - * This function takes a data descriptor handle as a parameter and frees all - * data allocated for the data descriptor and the handle itself. After this - * call the descriptor is no longer valid. - * - * @since 1.0.0 - * @ingroup Eet_Data_Group - */ - EAPI void eet_data_descriptor_free(Eet_Data_Descriptor *edd); +/** + * This function frees a data descriptor when it is not needed anymore. + * @param edd The data descriptor to free. + * + * This function takes a data descriptor handle as a parameter and frees all + * data allocated for the data descriptor and the handle itself. After this + * call the descriptor is no longer valid. + * + * @since 1.0.0 + * @ingroup Eet_Data_Group + */ +EAPI void eet_data_descriptor_free(Eet_Data_Descriptor *edd); - /** - * This function is an internal used by macros. - * - * This function is used by macros EET_DATA_DESCRIPTOR_ADD_BASIC(), - * EET_DATA_DESCRIPTOR_ADD_SUB() and EET_DATA_DESCRIPTOR_ADD_LIST(). It is - * complex to use by hand and should be left to be used by the macros, and - * thus is not documented. - * - * @param edd The data descriptor handle to add element (member). - * @param name The name of element to be serialized. - * @param type The type of element to be serialized, like - * #EET_T_INT. If #EET_T_UNKNOW, then it is considered to be a - * group, list or hash. - * @param group_type If element type is #EET_T_UNKNOW, then the @p - * group_type will speficy if it is a list (#EET_G_LIST), - * array (#EET_G_ARRAY) and so on. If #EET_G_UNKNOWN, then - * the member is a subtype (pointer to another type defined by - * another #Eet_Data_Descriptor). - * @param offset byte offset inside the source memory to be serialized. - * @param count number of elements (if #EET_G_ARRAY or #EET_G_VAR_ARRAY). - * @param counter_name variable that defines the name of number of elements. - * @param subtype If contains a subtype, then its data descriptor. - * - * @since 1.0.0 - * @ingroup Eet_Data_Group - */ - EAPI void eet_data_descriptor_element_add(Eet_Data_Descriptor *edd, const char *name, int type, int group_type, int offset, /* int count_offset, */int count, const char *counter_name, Eet_Data_Descriptor *subtype); +/** + * This function is an internal used by macros. + * + * This function is used by macros EET_DATA_DESCRIPTOR_ADD_BASIC(), + * EET_DATA_DESCRIPTOR_ADD_SUB() and EET_DATA_DESCRIPTOR_ADD_LIST(). It is + * complex to use by hand and should be left to be used by the macros, and + * thus is not documented. + * + * @param edd The data descriptor handle to add element (member). + * @param name The name of element to be serialized. + * @param type The type of element to be serialized, like + * #EET_T_INT. If #EET_T_UNKNOW, then it is considered to be a + * group, list or hash. + * @param group_type If element type is #EET_T_UNKNOW, then the @p + * group_type will speficy if it is a list (#EET_G_LIST), + * array (#EET_G_ARRAY) and so on. If #EET_G_UNKNOWN, then + * the member is a subtype (pointer to another type defined by + * another #Eet_Data_Descriptor). + * @param offset byte offset inside the source memory to be serialized. + * @param count number of elements (if #EET_G_ARRAY or #EET_G_VAR_ARRAY). + * @param counter_name variable that defines the name of number of elements. + * @param subtype If contains a subtype, then its data descriptor. + * + * @since 1.0.0 + * @ingroup Eet_Data_Group + */ +EAPI void eet_data_descriptor_element_add(Eet_Data_Descriptor *edd, + const char *name, + int type, + int group_type, + int offset, + /* int count_offset, */ int count, + const char *counter_name, + Eet_Data_Descriptor *subtype); - /** - * Read a data structure from an eet file and decodes it. - * @param ef The eet file handle to read from. - * @param edd The data descriptor handle to use when decoding. - * @param name The key the data is stored under in the eet file. - * @return A pointer to the decoded data structure. - * - * This function decodes a data structure stored in an eet file, returning - * a pointer to it if it decoded successfully, or NULL on failure. This - * can save a programmer dozens of hours of work in writing configuration - * file parsing and writing code, as eet does all that work for the program - * and presents a program-friendly data structure, just as the programmer - * likes. Eet can handle members being added or deleted from the data in - * storage and safely zero-fills unfilled members if they were not found - * in the data. It checks sizes and headers whenever it reads data, allowing - * the programmer to not worry about corrupt data. - * - * Once a data structure has been described by the programmer with the - * fields they wish to save or load, storing or retrieving a data structure - * from an eet file, or from a chunk of memory is as simple as a single - * function call. - * - * @see eet_data_read_cipher() - * - * @since 1.0.0 - * @ingroup Eet_Data_Group - */ - EAPI void *eet_data_read(Eet_File *ef, Eet_Data_Descriptor *edd, const char *name); +/** + * Read a data structure from an eet file and decodes it. + * @param ef The eet file handle to read from. + * @param edd The data descriptor handle to use when decoding. + * @param name The key the data is stored under in the eet file. + * @return A pointer to the decoded data structure. + * + * This function decodes a data structure stored in an eet file, returning + * a pointer to it if it decoded successfully, or NULL on failure. This + * can save a programmer dozens of hours of work in writing configuration + * file parsing and writing code, as eet does all that work for the program + * and presents a program-friendly data structure, just as the programmer + * likes. Eet can handle members being added or deleted from the data in + * storage and safely zero-fills unfilled members if they were not found + * in the data. It checks sizes and headers whenever it reads data, allowing + * the programmer to not worry about corrupt data. + * + * Once a data structure has been described by the programmer with the + * fields they wish to save or load, storing or retrieving a data structure + * from an eet file, or from a chunk of memory is as simple as a single + * function call. + * + * @see eet_data_read_cipher() + * + * @since 1.0.0 + * @ingroup Eet_Data_Group + */ +EAPI void *eet_data_read(Eet_File *ef, + Eet_Data_Descriptor *edd, + const char *name); - /** - * Write a data structure from memory and store in an eet file. - * @param ef The eet file handle to write to. - * @param edd The data descriptor to use when encoding. - * @param name The key to store the data under in the eet file. - * @param data A pointer to the data structure to ssave and encode. - * @param compress Compression flags for storage. - * @return bytes written on successful write, 0 on failure. - * - * This function is the reverse of eet_data_read(), saving a data structure - * to an eet file. - * - * @see eet_data_write_cipher() - * - * @since 1.0.0 - * @ingroup Eet_Data_Group - */ - EAPI int eet_data_write(Eet_File *ef, Eet_Data_Descriptor *edd, const char *name, const void *data, int compress); +/** + * Write a data structure from memory and store in an eet file. + * @param ef The eet file handle to write to. + * @param edd The data descriptor to use when encoding. + * @param name The key to store the data under in the eet file. + * @param data A pointer to the data structure to ssave and encode. + * @param compress Compression flags for storage. + * @return bytes written on successful write, 0 on failure. + * + * This function is the reverse of eet_data_read(), saving a data structure + * to an eet file. + * + * @see eet_data_write_cipher() + * + * @since 1.0.0 + * @ingroup Eet_Data_Group + */ +EAPI int eet_data_write(Eet_File *ef, + Eet_Data_Descriptor *edd, + const char *name, + const void *data, + int compress); - /** - * Dump an eet encoded data structure into ascii text - * @param data_in The pointer to the data to decode into a struct. - * @param size_in The size of the data pointed to in bytes. - * @param dumpfunc The function to call passed a string when new - * data is converted to text - * @param dumpdata The data to pass to the @p dumpfunc callback. - * @return 1 on success, 0 on failure - * - * This function will take a chunk of data encoded by - * eet_data_descriptor_encode() and convert it into human readable - * ascii text. It does this by calling the @p dumpfunc callback - * for all new text that is generated. This callback should append - * to any existing text buffer and will be passed the pointer @p - * dumpdata as a parameter as well as a string with new text to be - * appended. - * - * Example: - * - * @code - * void output(void *data, const char *string) - * { - * printf("%s", string); - * } - * - * void dump(const char *file) - * { - * FILE *f; - * int len; - * void *data; - * - * f = fopen(file, "r"); - * fseek(f, 0, SEEK_END); - * len = ftell(f); - * rewind(f); - * data = malloc(len); - * fread(data, len, 1, f); - * fclose(f); - * eet_data_text_dump(data, len, output, NULL); - * } - * @endcode - * - * @see eet_data_text_dump_cipher() - * - * @since 1.0.0 - * @ingroup Eet_Data_Group - */ - EAPI int eet_data_text_dump(const void *data_in, int size_in, void (*dumpfunc) (void *data, const char *str), void *dumpdata); +/** + * Dump an eet encoded data structure into ascii text + * @param data_in The pointer to the data to decode into a struct. + * @param size_in The size of the data pointed to in bytes. + * @param dumpfunc The function to call passed a string when new + * data is converted to text + * @param dumpdata The data to pass to the @p dumpfunc callback. + * @return 1 on success, 0 on failure + * + * This function will take a chunk of data encoded by + * eet_data_descriptor_encode() and convert it into human readable + * ascii text. It does this by calling the @p dumpfunc callback + * for all new text that is generated. This callback should append + * to any existing text buffer and will be passed the pointer @p + * dumpdata as a parameter as well as a string with new text to be + * appended. + * + * Example: + * + * @code + * void output(void *data, const char *string) + * { + * printf("%s", string); + * } + * + * void dump(const char *file) + * { + * FILE *f; + * int len; + * void *data; + * + * f = fopen(file, "r"); + * fseek(f, 0, SEEK_END); + * len = ftell(f); + * rewind(f); + * data = malloc(len); + * fread(data, len, 1, f); + * fclose(f); + * eet_data_text_dump(data, len, output, NULL); + * } + * @endcode + * + * @see eet_data_text_dump_cipher() + * + * @since 1.0.0 + * @ingroup Eet_Data_Group + */ +EAPI int eet_data_text_dump(const void *data_in, int size_in, void (*dumpfunc)( + void *data, + const char *str), void *dumpdata); - /** - * Take an ascii encoding from eet_data_text_dump() and re-encode in binary. - * @param text The pointer to the string data to parse and encode. - * @param textlen The size of the string in bytes (not including 0 - * byte terminator). - * @param size_ret This gets filled in with the encoded data blob - * size in bytes. - * @return The encoded data on success, NULL on failure. - * - * This function will parse the string pointed to by @p text and return - * an encoded data lump the same way eet_data_descriptor_encode() takes an - * in-memory data struct and encodes into a binary blob. @p text is a normal - * C string. - * - * @see eet_data_text_undump_cipher() - * - * @since 1.0.0 - * @ingroup Eet_Data_Group - */ - EAPI void *eet_data_text_undump(const char *text, int textlen, int *size_ret); +/** + * Take an ascii encoding from eet_data_text_dump() and re-encode in binary. + * @param text The pointer to the string data to parse and encode. + * @param textlen The size of the string in bytes (not including 0 + * byte terminator). + * @param size_ret This gets filled in with the encoded data blob + * size in bytes. + * @return The encoded data on success, NULL on failure. + * + * This function will parse the string pointed to by @p text and return + * an encoded data lump the same way eet_data_descriptor_encode() takes an + * in-memory data struct and encodes into a binary blob. @p text is a normal + * C string. + * + * @see eet_data_text_undump_cipher() + * + * @since 1.0.0 + * @ingroup Eet_Data_Group + */ +EAPI void *eet_data_text_undump(const char *text, int textlen, int *size_ret); - /** - * Dump an eet encoded data structure from an eet file into ascii text - * @param ef A valid eet file handle. - * @param name Name of the entry. eg: "/base/file_i_want". - * @param dumpfunc The function to call passed a string when new - * data is converted to text - * @param dumpdata The data to pass to the @p dumpfunc callback. - * @return 1 on success, 0 on failure - * - * This function will take an open and valid eet file from - * eet_open() request the data encoded by - * eet_data_descriptor_encode() corresponding to the key @p name - * and convert it into human readable ascii text. It does this by - * calling the @p dumpfunc callback for all new text that is - * generated. This callback should append to any existing text - * buffer and will be passed the pointer @p dumpdata as a parameter - * as well as a string with new text to be appended. - * - * @see eet_data_dump_cipher() - * - * @since 1.0.0 - * @ingroup Eet_Data_Group - */ - EAPI int eet_data_dump(Eet_File *ef, const char *name, void (*dumpfunc) (void *data, const char *str), void *dumpdata); +/** + * Dump an eet encoded data structure from an eet file into ascii text + * @param ef A valid eet file handle. + * @param name Name of the entry. eg: "/base/file_i_want". + * @param dumpfunc The function to call passed a string when new + * data is converted to text + * @param dumpdata The data to pass to the @p dumpfunc callback. + * @return 1 on success, 0 on failure + * + * This function will take an open and valid eet file from + * eet_open() request the data encoded by + * eet_data_descriptor_encode() corresponding to the key @p name + * and convert it into human readable ascii text. It does this by + * calling the @p dumpfunc callback for all new text that is + * generated. This callback should append to any existing text + * buffer and will be passed the pointer @p dumpdata as a parameter + * as well as a string with new text to be appended. + * + * @see eet_data_dump_cipher() + * + * @since 1.0.0 + * @ingroup Eet_Data_Group + */ +EAPI int eet_data_dump(Eet_File *ef, const char *name, void (*dumpfunc)( + void *data, + const char *str), void *dumpdata); - /** - * Take an ascii encoding from eet_data_dump() and re-encode in binary. - * @param ef A valid eet file handle. - * @param name Name of the entry. eg: "/base/file_i_want". - * @param text The pointer to the string data to parse and encode. - * @param textlen The size of the string in bytes (not including 0 - * byte terminator). - * @param compress Compression flags (1 == compress, 0 = don't compress). - * @return 1 on success, 0 on failure - * - * This function will parse the string pointed to by @p text, - * encode it the same way eet_data_descriptor_encode() takes an - * in-memory data struct and encodes into a binary blob. - * - * The data (optionally compressed) will be in ram, pending a flush to - * disk (it will stay in ram till the eet file handle is closed though). - * - * @see eet_data_undump_cipher() - * - * @since 1.0.0 - * @ingroup Eet_Data_Group - */ - EAPI int eet_data_undump(Eet_File *ef, const char *name, const char *text, int textlen, int compress); +/** + * Take an ascii encoding from eet_data_dump() and re-encode in binary. + * @param ef A valid eet file handle. + * @param name Name of the entry. eg: "/base/file_i_want". + * @param text The pointer to the string data to parse and encode. + * @param textlen The size of the string in bytes (not including 0 + * byte terminator). + * @param compress Compression flags (1 == compress, 0 = don't compress). + * @return 1 on success, 0 on failure + * + * This function will parse the string pointed to by @p text, + * encode it the same way eet_data_descriptor_encode() takes an + * in-memory data struct and encodes into a binary blob. + * + * The data (optionally compressed) will be in ram, pending a flush to + * disk (it will stay in ram till the eet file handle is closed though). + * + * @see eet_data_undump_cipher() + * + * @since 1.0.0 + * @ingroup Eet_Data_Group + */ +EAPI int eet_data_undump(Eet_File *ef, + const char *name, + const char *text, + int textlen, + int compress); - /** - * Decode a data structure from an arbitary location in memory. - * @param edd The data descriptor to use when decoding. - * @param data_in The pointer to the data to decode into a struct. - * @param size_in The size of the data pointed to in bytes. - * @return NULL on failure, or a valid decoded struct pointer on success. - * - * This function will decode a data structure that has been encoded using - * eet_data_descriptor_encode(), and return a data structure with all its - * elements filled out, if successful, or NULL on failure. - * - * The data to be decoded is stored at the memory pointed to by @p data_in, - * and is described by the descriptor pointed to by @p edd. The data size is - * passed in as the value to @p size_in, ande must be greater than 0 to - * succeed. - * - * This function is useful for decoding data structures delivered to the - * application by means other than an eet file, such as an IPC or socket - * connection, raw files, shared memory etc. - * - * Please see eet_data_read() for more information. - * - * @see eet_data_descriptor_decode_cipher() - * - * @since 1.0.0 - * @ingroup Eet_Data_Group - */ - EAPI void *eet_data_descriptor_decode(Eet_Data_Descriptor *edd, const void *data_in, int size_in); +/** + * Decode a data structure from an arbitary location in memory. + * @param edd The data descriptor to use when decoding. + * @param data_in The pointer to the data to decode into a struct. + * @param size_in The size of the data pointed to in bytes. + * @return NULL on failure, or a valid decoded struct pointer on success. + * + * This function will decode a data structure that has been encoded using + * eet_data_descriptor_encode(), and return a data structure with all its + * elements filled out, if successful, or NULL on failure. + * + * The data to be decoded is stored at the memory pointed to by @p data_in, + * and is described by the descriptor pointed to by @p edd. The data size is + * passed in as the value to @p size_in, ande must be greater than 0 to + * succeed. + * + * This function is useful for decoding data structures delivered to the + * application by means other than an eet file, such as an IPC or socket + * connection, raw files, shared memory etc. + * + * Please see eet_data_read() for more information. + * + * @see eet_data_descriptor_decode_cipher() + * + * @since 1.0.0 + * @ingroup Eet_Data_Group + */ +EAPI void *eet_data_descriptor_decode(Eet_Data_Descriptor *edd, + const void *data_in, + int size_in); - /** - * Encode a dsata struct to memory and return that encoded data. - * @param edd The data descriptor to use when encoding. - * @param data_in The pointer to the struct to encode into data. - * @param size_ret pointer to the an int to be filled with the decoded size. - * @return NULL on failure, or a valid encoded data chunk on success. - * - * This function takes a data structutre in memory and encodes it into a - * serialised chunk of data that can be decoded again by - * eet_data_descriptor_decode(). This is useful for being able to transmit - * data structures across sockets, pipes, IPC or shared file mechanisms, - * without having to worry about memory space, machine type, endianess etc. - * - * The parameter @p edd must point to a valid data descriptor, and - * @p data_in must point to the right data structure to encode. If not, the - * encoding may fail. - * - * On success a non NULL valid pointer is returned and what @p size_ret - * points to is set to the size of this decoded data, in bytes. When the - * encoded data is no longer needed, call free() on it. On failure NULL is - * returned and what @p size_ret points to is set to 0. - * - * Please see eet_data_write() for more information. - * - * @see eet_data_descriptor_encode_cipher() - * - * @since 1.0.0 - * @ingroup Eet_Data_Group - */ - EAPI void *eet_data_descriptor_encode(Eet_Data_Descriptor *edd, const void *data_in, int *size_ret); +/** + * Encode a dsata struct to memory and return that encoded data. + * @param edd The data descriptor to use when encoding. + * @param data_in The pointer to the struct to encode into data. + * @param size_ret pointer to the an int to be filled with the decoded size. + * @return NULL on failure, or a valid encoded data chunk on success. + * + * This function takes a data structutre in memory and encodes it into a + * serialised chunk of data that can be decoded again by + * eet_data_descriptor_decode(). This is useful for being able to transmit + * data structures across sockets, pipes, IPC or shared file mechanisms, + * without having to worry about memory space, machine type, endianess etc. + * + * The parameter @p edd must point to a valid data descriptor, and + * @p data_in must point to the right data structure to encode. If not, the + * encoding may fail. + * + * On success a non NULL valid pointer is returned and what @p size_ret + * points to is set to the size of this decoded data, in bytes. When the + * encoded data is no longer needed, call free() on it. On failure NULL is + * returned and what @p size_ret points to is set to 0. + * + * Please see eet_data_write() for more information. + * + * @see eet_data_descriptor_encode_cipher() + * + * @since 1.0.0 + * @ingroup Eet_Data_Group + */ +EAPI void *eet_data_descriptor_encode(Eet_Data_Descriptor *edd, + const void *data_in, + int *size_ret); - /** - * Add a basic data element to a data descriptor. - * @param edd The data descriptor to add the type to. - * @param struct_type The type of the struct. - * @param name The string name to use to encode/decode this member - * (must be a constant global and never change). - * @param member The struct member itself to be encoded. - * @param type The type of the member to encode. - * - * This macro is a convenience macro provided to add a member to - * the data descriptor @p edd. The type of the structure is - * provided as the @p struct_type parameter (for example: struct - * my_struct). The @p name parameter defines a string that will be - * used to uniquely name that member of the struct (it is suggested - * to use the struct member itself). The @p member parameter is - * the actual struct member itself (for eet_dictionary_string_check - * example: values), and @p type is the basic data type of the - * member which must be one of: EET_T_CHAR, EET_T_SHORT, EET_T_INT, - * EET_T_LONG_LONG, EET_T_FLOAT, EET_T_DOUBLE, EET_T_UCHAR, - * EET_T_USHORT, EET_T_UINT, EET_T_ULONG_LONG or EET_T_STRING. - * - * @since 1.0.0 - * @ingroup Eet_Data_Group - */ +/** + * Add a basic data element to a data descriptor. + * @param edd The data descriptor to add the type to. + * @param struct_type The type of the struct. + * @param name The string name to use to encode/decode this member + * (must be a constant global and never change). + * @param member The struct member itself to be encoded. + * @param type The type of the member to encode. + * + * This macro is a convenience macro provided to add a member to + * the data descriptor @p edd. The type of the structure is + * provided as the @p struct_type parameter (for example: struct + * my_struct). The @p name parameter defines a string that will be + * used to uniquely name that member of the struct (it is suggested + * to use the struct member itself). The @p member parameter is + * the actual struct member itself (for eet_dictionary_string_check + * example: values), and @p type is the basic data type of the + * member which must be one of: EET_T_CHAR, EET_T_SHORT, EET_T_INT, + * EET_T_LONG_LONG, EET_T_FLOAT, EET_T_DOUBLE, EET_T_UCHAR, + * EET_T_USHORT, EET_T_UINT, EET_T_ULONG_LONG or EET_T_STRING. + * + * @since 1.0.0 + * @ingroup Eet_Data_Group + */ #define EET_DATA_DESCRIPTOR_ADD_BASIC(edd, struct_type, name, member, type) \ - { \ - struct_type ___ett; \ - \ - eet_data_descriptor_element_add(edd, name, type, EET_G_UNKNOWN, \ - (char *)(&(___ett.member)) - (char *)(&(___ett)), \ - 0, /* 0, */NULL, NULL); \ - } + { \ + struct_type ___ett; \ + \ + eet_data_descriptor_element_add(edd, name, type, EET_G_UNKNOWN, \ + (char *)(& (___ett.member)) - \ + (char *)(& (___ett)), \ + 0, /* 0, */ NULL, NULL); \ + } - /** - * Add a sub-element type to a data descriptor - * @param edd The data descriptor to add the type to. - * @param struct_type The type of the struct. - * @param name The string name to use to encode/decode this member - * (must be a constant global and never change). - * @param member The struct member itself to be encoded. - * @param subtype The type of sub-type struct to add. - * - * This macro lets you easily add a sub-type (a struct that's pointed to - * by this one). All the parameters are the same as for - * EET_DATA_DESCRIPTOR_ADD_BASIC(), with the @p subtype being the exception. - * This must be the data descriptor of the struct that is pointed to by - * this element. - * - * @since 1.0.0 - * @ingroup Eet_Data_Group - */ +/** + * Add a sub-element type to a data descriptor + * @param edd The data descriptor to add the type to. + * @param struct_type The type of the struct. + * @param name The string name to use to encode/decode this member + * (must be a constant global and never change). + * @param member The struct member itself to be encoded. + * @param subtype The type of sub-type struct to add. + * + * This macro lets you easily add a sub-type (a struct that's pointed to + * by this one). All the parameters are the same as for + * EET_DATA_DESCRIPTOR_ADD_BASIC(), with the @p subtype being the exception. + * This must be the data descriptor of the struct that is pointed to by + * this element. + * + * @since 1.0.0 + * @ingroup Eet_Data_Group + */ #define EET_DATA_DESCRIPTOR_ADD_SUB(edd, struct_type, name, member, subtype) \ - { \ - struct_type ___ett; \ - \ - eet_data_descriptor_element_add(edd, name, EET_T_UNKNOW, EET_G_UNKNOWN, \ - (char *)(&(___ett.member)) - (char *)(&(___ett)), \ - 0, /* 0, */NULL, subtype); \ - } + { \ + struct_type ___ett; \ + \ + eet_data_descriptor_element_add(edd, name, EET_T_UNKNOW, EET_G_UNKNOWN, \ + (char *)(& (___ett.member)) - \ + (char *)(& (___ett)), \ + 0, /* 0, */ NULL, subtype); \ + } - /** - * Add a linked list type to a data descriptor - * @param edd The data descriptor to add the type to. - * @param struct_type The type of the struct. - * @param name The string name to use to encode/decode this member - * (must be a constant global and never change). - * @param member The struct member itself to be encoded. - * @param subtype The type of linked list member to add. - * - * This macro lets you easily add a linked list of other data types. All the - * parameters are the same as for EET_DATA_DESCRIPTOR_ADD_BASIC(), with the - * @p subtype being the exception. This must be the data descriptor of the - * element that is in each member of the linked list to be stored. - * - * @since 1.0.0 - * @ingroup Eet_Data_Group - */ +/** + * Add a linked list type to a data descriptor + * @param edd The data descriptor to add the type to. + * @param struct_type The type of the struct. + * @param name The string name to use to encode/decode this member + * (must be a constant global and never change). + * @param member The struct member itself to be encoded. + * @param subtype The type of linked list member to add. + * + * This macro lets you easily add a linked list of other data types. All the + * parameters are the same as for EET_DATA_DESCRIPTOR_ADD_BASIC(), with the + * @p subtype being the exception. This must be the data descriptor of the + * element that is in each member of the linked list to be stored. + * + * @since 1.0.0 + * @ingroup Eet_Data_Group + */ #define EET_DATA_DESCRIPTOR_ADD_LIST(edd, struct_type, name, member, subtype) \ - { \ - struct_type ___ett; \ - \ - eet_data_descriptor_element_add(edd, name, EET_T_UNKNOW, EET_G_LIST, \ - (char *)(&(___ett.member)) - (char *)(&(___ett)), \ - 0, /* 0, */NULL, subtype); \ - } + { \ + struct_type ___ett; \ + \ + eet_data_descriptor_element_add(edd, name, EET_T_UNKNOW, EET_G_LIST, \ + (char *)(& (___ett.member)) - \ + (char *)(& (___ett)), \ + 0, /* 0, */ NULL, subtype); \ + } - /** - * Add a hash type to a data descriptor - * @param edd The data descriptor to add the type to. - * @param struct_type The type of the struct. - * @param name The string name to use to encode/decode this member - * (must be a constant global and never change). - * @param member The struct member itself to be encoded. - * @param subtype The type of hash member to add. - * - * This macro lets you easily add a hash of other data types. All the - * parameters are the same as for EET_DATA_DESCRIPTOR_ADD_BASIC(), with the - * @p subtype being the exception. This must be the data descriptor of the - * element that is in each member of the hash to be stored. - * - * @since 1.0.0 - * @ingroup Eet_Data_Group - */ +/** + * Add a hash type to a data descriptor + * @param edd The data descriptor to add the type to. + * @param struct_type The type of the struct. + * @param name The string name to use to encode/decode this member + * (must be a constant global and never change). + * @param member The struct member itself to be encoded. + * @param subtype The type of hash member to add. + * + * This macro lets you easily add a hash of other data types. All the + * parameters are the same as for EET_DATA_DESCRIPTOR_ADD_BASIC(), with the + * @p subtype being the exception. This must be the data descriptor of the + * element that is in each member of the hash to be stored. + * + * @since 1.0.0 + * @ingroup Eet_Data_Group + */ #define EET_DATA_DESCRIPTOR_ADD_HASH(edd, struct_type, name, member, subtype) \ - { \ - struct_type ___ett; \ - \ - eet_data_descriptor_element_add(edd, name, EET_T_UNKNOW, EET_G_HASH, \ - (char *)(&(___ett.member)) - (char *)(&(___ett)), \ - 0, /* 0, */NULL, subtype); \ - } + { \ + struct_type ___ett; \ + \ + eet_data_descriptor_element_add(edd, name, EET_T_UNKNOW, EET_G_HASH, \ + (char *)(& (___ett.member)) - \ + (char *)(& (___ett)), \ + 0, /* 0, */ NULL, subtype); \ + } - /** - * Add a fixed size array type to a data descriptor - * @param edd The data descriptor to add the type to. - * @param struct_type The type of the struct. - * @param name The string name to use to encode/decode this member - * (must be a constant global and never change). - * @param member The struct member itself to be encoded. - * @param subtype The type of hash member to add. - * - * This macro lets you easily add a fixed size array of other data - * types. All the parameters are the same as for - * EET_DATA_DESCRIPTOR_ADD_BASIC(), with the @p subtype being the - * exception. This must be the data descriptor of the element that - * is in each member of the hash to be stored. - * - * @since 1.0.2 - * @ingroup Eet_Data_Group - */ +/** + * Add a fixed size array type to a data descriptor + * @param edd The data descriptor to add the type to. + * @param struct_type The type of the struct. + * @param name The string name to use to encode/decode this member + * (must be a constant global and never change). + * @param member The struct member itself to be encoded. + * @param subtype The type of hash member to add. + * + * This macro lets you easily add a fixed size array of other data + * types. All the parameters are the same as for + * EET_DATA_DESCRIPTOR_ADD_BASIC(), with the @p subtype being the + * exception. This must be the data descriptor of the element that + * is in each member of the hash to be stored. + * + * @since 1.0.2 + * @ingroup Eet_Data_Group + */ #define EET_DATA_DESCRIPTOR_ADD_ARRAY(edd, struct_type, name, member, subtype) \ - { \ - struct_type ___ett; \ - \ - eet_data_descriptor_element_add(edd, name, EET_T_UNKNOW, EET_G_ARRAY, \ - (char *)(&(___ett.member)) - (char *)(&(___ett)), \ - /* 0, */sizeof(___ett.member)/sizeof(___ett.member[0]), NULL, subtype); \ - } + { \ + struct_type ___ett; \ + \ + eet_data_descriptor_element_add(edd, name, EET_T_UNKNOW, EET_G_ARRAY, \ + (char *)(& (___ett.member)) - \ + (char *)(& (___ett)), \ + /* 0, */ sizeof(___ett.member) / \ + sizeof(___ett.member[0]), NULL, subtype); \ + } - /** - * Add a variable size array type to a data descriptor - * @param edd The data descriptor to add the type to. - * @param struct_type The type of the struct. - * @param name The string name to use to encode/decode this member - * (must be a constant global and never change). - * @param member The struct member itself to be encoded. - * @param subtype The type of hash member to add. - * - * This macro lets you easily add a fixed size array of other data - * types. All the parameters are the same as for - * EET_DATA_DESCRIPTOR_ADD_BASIC(), with the @p subtype being the - * exception. This must be the data descriptor of the element that - * is in each member of the hash to be stored. - * - * @since 1.0.2 - * @ingroup Eet_Data_Group - */ -#define EET_DATA_DESCRIPTOR_ADD_VAR_ARRAY(edd, struct_type, name, member, subtype) \ - { \ - struct_type ___ett; \ - \ - eet_data_descriptor_element_add(edd, name, EET_T_UNKNOW, EET_G_VAR_ARRAY, \ - (char *)(&(___ett.member)) - (char *)(&(___ett)), \ - (char *)(&(___ett.member ## _count)) - (char *)(&(___ett)), /* 0, */NULL, subtype); \ - } +/** + * Add a variable size array type to a data descriptor + * @param edd The data descriptor to add the type to. + * @param struct_type The type of the struct. + * @param name The string name to use to encode/decode this member + * (must be a constant global and never change). + * @param member The struct member itself to be encoded. + * @param subtype The type of hash member to add. + * + * This macro lets you easily add a fixed size array of other data + * types. All the parameters are the same as for + * EET_DATA_DESCRIPTOR_ADD_BASIC(), with the @p subtype being the + * exception. This must be the data descriptor of the element that + * is in each member of the hash to be stored. + * + * @since 1.0.2 + * @ingroup Eet_Data_Group + */ +#define EET_DATA_DESCRIPTOR_ADD_VAR_ARRAY(edd, \ + struct_type, \ + name, \ + member, \ + subtype) \ + { \ + struct_type ___ett; \ + \ + eet_data_descriptor_element_add(edd, \ + name, \ + EET_T_UNKNOW, \ + EET_G_VAR_ARRAY, \ + (char *)(& (___ett.member)) - \ + (char *)(& (___ett)), \ + (char *)(& (___ett.member ## _count)) - \ + (char *)(& (___ett)), \ + /* 0, */ NULL, \ + subtype); \ + } - /** - * Add an union type to a data descriptor - * @param edd The data descriptor to add the type to. - * @param struct_type The type of the struct. - * @param name The string name to use to encode/decode this member - * (must be a constant global and never change). - * @param member The struct member itself to be encoded. - * @param type_member The member that give hints on what is in the union. - * @param unified_type Describe all possible type the union could handle. - * - * This macro lets you easily add an union with a member that specify what is inside. - * The @p unified_type is an Eet_Data_Descriptor, but only the entry that match the name - * returned by type_get will be used for each serialized data. The type_get and type_set - * callback of unified_type should be defined. - * - * @since 1.2.4 - * @ingroup Eet_Data_Group - * @see Eet_Data_Descriptor_Class - */ -#define EET_DATA_DESCRIPTOR_ADD_UNION(edd, struct_type, name, member, type_member, unified_type) \ - { \ - struct_type ___ett; \ - \ - eet_data_descriptor_element_add(edd, name, EET_T_UNKNOW, EET_G_UNION, \ - (char *) (&(___ett.member)) - (char *)(&(___ett)), \ - (char *) (&(___ett.type_member)) - (char *)(&(___ett)), \ - NULL, unified_type); \ - } +/** + * Add an union type to a data descriptor + * @param edd The data descriptor to add the type to. + * @param struct_type The type of the struct. + * @param name The string name to use to encode/decode this member + * (must be a constant global and never change). + * @param member The struct member itself to be encoded. + * @param type_member The member that give hints on what is in the union. + * @param unified_type Describe all possible type the union could handle. + * + * This macro lets you easily add an union with a member that specify what is inside. + * The @p unified_type is an Eet_Data_Descriptor, but only the entry that match the name + * returned by type_get will be used for each serialized data. The type_get and type_set + * callback of unified_type should be defined. + * + * @since 1.2.4 + * @ingroup Eet_Data_Group + * @see Eet_Data_Descriptor_Class + */ +#define EET_DATA_DESCRIPTOR_ADD_UNION(edd, \ + struct_type, \ + name, \ + member, \ + type_member, \ + unified_type) \ + { \ + struct_type ___ett; \ + \ + eet_data_descriptor_element_add(edd, name, EET_T_UNKNOW, EET_G_UNION, \ + (char *)(& (___ett.member)) - \ + (char *)(& (___ett)), \ + (char *)(& (___ett.type_member)) - \ + (char *)(& (___ett)), \ + NULL, unified_type); \ + } - /** - * Add a automatically selectable type to a data descriptor - * @param edd The data descriptor to add the type to. - * @param struct_type The type of the struct. - * @param name The string name to use to encode/decode this member - * (must be a constant global and never change). - * @param member The struct member itself to be encoded. - * @param type_member The member that give hints on what is in the union. - * @param unified_type Describe all possible type the union could handle. - * - * This macro lets you easily define what the content of @p member points to depending of - * the content of @p type_member. The type_get and type_set callback of unified_type should - * be defined. If the the type is not know at the time of restoring it, eet will still call - * type_set of @p unified_type but the pointer will be set to a serialized binary representation - * of what eet know. This make it possible, to save this pointer again by just returning the string - * given previously and telling it by setting unknow to EINA_TRUE. - * - * @since 1.2.4 - * @ingroup Eet_Data_Group - * @see Eet_Data_Descriptor_Class - */ -#define EET_DATA_DESCRIPTOR_ADD_VARIANT(edd, struct_type, name, member, type_member, unified_type) \ - { \ - struct_type ___ett; \ - \ - eet_data_descriptor_element_add(edd, name, EET_T_UNKNOW, EET_G_VARIANT, \ - (char *) (&(___ett.member)) - (char *)(&(___ett)), \ - (char *) (&(___ett.type_member)) - (char *)(&(___ett)), \ - NULL, unified_type); \ - } +/** + * Add a automatically selectable type to a data descriptor + * @param edd The data descriptor to add the type to. + * @param struct_type The type of the struct. + * @param name The string name to use to encode/decode this member + * (must be a constant global and never change). + * @param member The struct member itself to be encoded. + * @param type_member The member that give hints on what is in the union. + * @param unified_type Describe all possible type the union could handle. + * + * This macro lets you easily define what the content of @p member points to depending of + * the content of @p type_member. The type_get and type_set callback of unified_type should + * be defined. If the the type is not know at the time of restoring it, eet will still call + * type_set of @p unified_type but the pointer will be set to a serialized binary representation + * of what eet know. This make it possible, to save this pointer again by just returning the string + * given previously and telling it by setting unknow to EINA_TRUE. + * + * @since 1.2.4 + * @ingroup Eet_Data_Group + * @see Eet_Data_Descriptor_Class + */ +#define EET_DATA_DESCRIPTOR_ADD_VARIANT(edd, \ + struct_type, \ + name, \ + member, \ + type_member, \ + unified_type) \ + { \ + struct_type ___ett; \ + \ + eet_data_descriptor_element_add(edd, name, EET_T_UNKNOW, EET_G_VARIANT, \ + (char *)(& (___ett.member)) - \ + (char *)(& (___ett)), \ + (char *)(& (___ett.type_member)) - \ + (char *)(& (___ett)), \ + NULL, unified_type); \ + } - /** - * Add a mapping to a data descriptor that will be used by union, variant or inherited type - * @param unified_type The data descriptor to add the mapping to. - * @param name The string name to get/set type. - * @param subtype The matching data descriptor. - * - * @since 1.2.4 - * @ingroup Eet_Data_Group - * @see Eet_Data_Descriptor_Class - */ +/** + * Add a mapping to a data descriptor that will be used by union, variant or inherited type + * @param unified_type The data descriptor to add the mapping to. + * @param name The string name to get/set type. + * @param subtype The matching data descriptor. + * + * @since 1.2.4 + * @ingroup Eet_Data_Group + * @see Eet_Data_Descriptor_Class + */ #define EET_DATA_DESCRIPTOR_ADD_MAPPING(unified_type, name, subtype) \ - eet_data_descriptor_element_add(unified_type, name, EET_T_UNKNOW, EET_G_UNKNOWN, 0, 0, NULL, subtype); + eet_data_descriptor_element_add(unified_type, \ + name, \ + EET_T_UNKNOW, \ + EET_G_UNKNOWN, \ + 0, \ + 0, \ + NULL, \ + subtype); - /** - * @defgroup Eet_Data_Cipher_Group Eet Data Serialization using A Ciphers - * - * Most of the @ref Eet_Data_Group have alternative versions that - * accounts for ciphers to protect their content. - * - * @see @ref Eet_Cipher_Group - * - * @ingroup Eet_Data_Group - */ +/** + * @defgroup Eet_Data_Cipher_Group Eet Data Serialization using A Ciphers + * + * Most of the @ref Eet_Data_Group have alternative versions that + * accounts for ciphers to protect their content. + * + * @see @ref Eet_Cipher_Group + * + * @ingroup Eet_Data_Group + */ - /** - * Read a data structure from an eet file and decodes it using a cipher. - * @param ef The eet file handle to read from. - * @param edd The data descriptor handle to use when decoding. - * @param name The key the data is stored under in the eet file. - * @param cipher_key The key to use as cipher. - * @return A pointer to the decoded data structure. - * - * This function decodes a data structure stored in an eet file, returning - * a pointer to it if it decoded successfully, or NULL on failure. This - * can save a programmer dozens of hours of work in writing configuration - * file parsing and writing code, as eet does all that work for the program - * and presents a program-friendly data structure, just as the programmer - * likes. Eet can handle members being added or deleted from the data in - * storage and safely zero-fills unfilled members if they were not found - * in the data. It checks sizes and headers whenever it reads data, allowing - * the programmer to not worry about corrupt data. - * - * Once a data structure has been described by the programmer with the - * fields they wish to save or load, storing or retrieving a data structure - * from an eet file, or from a chunk of memory is as simple as a single - * function call. - * - * @see eet_data_read() - * - * @since 1.0.0 - * @ingroup Eet_Data_Cipher_Group - */ - EAPI void *eet_data_read_cipher(Eet_File *ef, Eet_Data_Descriptor *edd, const char *name, const char *cipher_key); +/** + * Read a data structure from an eet file and decodes it using a cipher. + * @param ef The eet file handle to read from. + * @param edd The data descriptor handle to use when decoding. + * @param name The key the data is stored under in the eet file. + * @param cipher_key The key to use as cipher. + * @return A pointer to the decoded data structure. + * + * This function decodes a data structure stored in an eet file, returning + * a pointer to it if it decoded successfully, or NULL on failure. This + * can save a programmer dozens of hours of work in writing configuration + * file parsing and writing code, as eet does all that work for the program + * and presents a program-friendly data structure, just as the programmer + * likes. Eet can handle members being added or deleted from the data in + * storage and safely zero-fills unfilled members if they were not found + * in the data. It checks sizes and headers whenever it reads data, allowing + * the programmer to not worry about corrupt data. + * + * Once a data structure has been described by the programmer with the + * fields they wish to save or load, storing or retrieving a data structure + * from an eet file, or from a chunk of memory is as simple as a single + * function call. + * + * @see eet_data_read() + * + * @since 1.0.0 + * @ingroup Eet_Data_Cipher_Group + */ +EAPI void *eet_data_read_cipher(Eet_File *ef, + Eet_Data_Descriptor *edd, + const char *name, + const char *cipher_key); - /** - * Write a data structure from memory and store in an eet file - * using a cipher. - * @param ef The eet file handle to write to. - * @param edd The data descriptor to use when encoding. - * @param name The key to store the data under in the eet file. - * @param cipher_key The key to use as cipher. - * @param data A pointer to the data structure to ssave and encode. - * @param compress Compression flags for storage. - * @return bytes written on successful write, 0 on failure. - * - * This function is the reverse of eet_data_read(), saving a data structure - * to an eet file. - * - * @see eet_data_write_cipher() - * - * @since 1.0.0 - * @ingroup Eet_Data_Cipher_Group - */ - EAPI int eet_data_write_cipher(Eet_File *ef, Eet_Data_Descriptor *edd, const char *name, const char *cipher_key, const void *data, int compress); +/** + * Write a data structure from memory and store in an eet file + * using a cipher. + * @param ef The eet file handle to write to. + * @param edd The data descriptor to use when encoding. + * @param name The key to store the data under in the eet file. + * @param cipher_key The key to use as cipher. + * @param data A pointer to the data structure to ssave and encode. + * @param compress Compression flags for storage. + * @return bytes written on successful write, 0 on failure. + * + * This function is the reverse of eet_data_read(), saving a data structure + * to an eet file. + * + * @see eet_data_write_cipher() + * + * @since 1.0.0 + * @ingroup Eet_Data_Cipher_Group + */ +EAPI int eet_data_write_cipher(Eet_File *ef, + Eet_Data_Descriptor *edd, + const char *name, + const char *cipher_key, + const void *data, + int compress); - /** - * Dump an eet encoded data structure into ascii text using a cipher. - * @param data_in The pointer to the data to decode into a struct. - * @param cipher_key The key to use as cipher. - * @param size_in The size of the data pointed to in bytes. - * @param dumpfunc The function to call passed a string when new - * data is converted to text - * @param dumpdata The data to pass to the @p dumpfunc callback. - * @return 1 on success, 0 on failure - * - * This function will take a chunk of data encoded by - * eet_data_descriptor_encode() and convert it into human readable - * ascii text. It does this by calling the @p dumpfunc callback - * for all new text that is generated. This callback should append - * to any existing text buffer and will be passed the pointer @p - * dumpdata as a parameter as well as a string with new text to be - * appended. - * - * Example: - * - * @code - * void output(void *data, const char *string) - * { - * printf("%s", string); - * } - * - * void dump(const char *file) - * { - * FILE *f; - * int len; - * void *data; - * - * f = fopen(file, "r"); - * fseek(f, 0, SEEK_END); - * len = ftell(f); - * rewind(f); - * data = malloc(len); - * fread(data, len, 1, f); - * fclose(f); - * eet_data_text_dump_cipher(data, cipher_key, len, output, NULL); - * } - * @endcode - * - * @see eet_data_text_dump() - * - * @since 1.0.0 - * @ingroup Eet_Data_Cipher_Group - */ - EAPI int eet_data_text_dump_cipher(const void *data_in, const char *cipher_key, int size_in, void (*dumpfunc) (void *data, const char *str), void *dumpdata); +/** + * Dump an eet encoded data structure into ascii text using a cipher. + * @param data_in The pointer to the data to decode into a struct. + * @param cipher_key The key to use as cipher. + * @param size_in The size of the data pointed to in bytes. + * @param dumpfunc The function to call passed a string when new + * data is converted to text + * @param dumpdata The data to pass to the @p dumpfunc callback. + * @return 1 on success, 0 on failure + * + * This function will take a chunk of data encoded by + * eet_data_descriptor_encode() and convert it into human readable + * ascii text. It does this by calling the @p dumpfunc callback + * for all new text that is generated. This callback should append + * to any existing text buffer and will be passed the pointer @p + * dumpdata as a parameter as well as a string with new text to be + * appended. + * + * Example: + * + * @code + * void output(void *data, const char *string) + * { + * printf("%s", string); + * } + * + * void dump(const char *file) + * { + * FILE *f; + * int len; + * void *data; + * + * f = fopen(file, "r"); + * fseek(f, 0, SEEK_END); + * len = ftell(f); + * rewind(f); + * data = malloc(len); + * fread(data, len, 1, f); + * fclose(f); + * eet_data_text_dump_cipher(data, cipher_key, len, output, NULL); + * } + * @endcode + * + * @see eet_data_text_dump() + * + * @since 1.0.0 + * @ingroup Eet_Data_Cipher_Group + */ +EAPI int eet_data_text_dump_cipher(const void *data_in, + const char *cipher_key, + int size_in, + void (*dumpfunc)(void *data, const char *str), + void *dumpdata); - /** - * Take an ascii encoding from eet_data_text_dump() and re-encode - * in binary using a cipher. - * @param text The pointer to the string data to parse and encode. - * @param cipher_key The key to use as cipher. - * @param textlen The size of the string in bytes (not including 0 - * byte terminator). - * @param size_ret This gets filled in with the encoded data blob - * size in bytes. - * @return The encoded data on success, NULL on failure. - * - * This function will parse the string pointed to by @p text and return - * an encoded data lump the same way eet_data_descriptor_encode() takes an - * in-memory data struct and encodes into a binary blob. @p text is a normal - * C string. - * - * @see eet_data_text_undump() - * - * @since 1.0.0 - * @ingroup Eet_Data_Cipher_Group - */ - EAPI void *eet_data_text_undump_cipher(const char *text, const char *cipher_key, int textlen, int *size_ret); +/** + * Take an ascii encoding from eet_data_text_dump() and re-encode + * in binary using a cipher. + * @param text The pointer to the string data to parse and encode. + * @param cipher_key The key to use as cipher. + * @param textlen The size of the string in bytes (not including 0 + * byte terminator). + * @param size_ret This gets filled in with the encoded data blob + * size in bytes. + * @return The encoded data on success, NULL on failure. + * + * This function will parse the string pointed to by @p text and return + * an encoded data lump the same way eet_data_descriptor_encode() takes an + * in-memory data struct and encodes into a binary blob. @p text is a normal + * C string. + * + * @see eet_data_text_undump() + * + * @since 1.0.0 + * @ingroup Eet_Data_Cipher_Group + */ +EAPI void *eet_data_text_undump_cipher(const char *text, + const char *cipher_key, + int textlen, + int *size_ret); - /** - * Dump an eet encoded data structure from an eet file into ascii - * text using a cipher. - * @param ef A valid eet file handle. - * @param name Name of the entry. eg: "/base/file_i_want". - * @param cipher_key The key to use as cipher. - * @param dumpfunc The function to call passed a string when new - * data is converted to text - * @param dumpdata The data to pass to the @p dumpfunc callback. - * @return 1 on success, 0 on failure - * - * This function will take an open and valid eet file from - * eet_open() request the data encoded by - * eet_data_descriptor_encode() corresponding to the key @p name - * and convert it into human readable ascii text. It does this by - * calling the @p dumpfunc callback for all new text that is - * generated. This callback should append to any existing text - * buffer and will be passed the pointer @p dumpdata as a parameter - * as well as a string with new text to be appended. - * - * @see eet_data_dump() - * - * @since 1.0.0 - * @ingroup Eet_Data_Cipher_Group - */ - EAPI int eet_data_dump_cipher(Eet_File *ef, const char *name, const char *cipher_key, void (*dumpfunc) (void *data, const char *str), void *dumpdata); +/** + * Dump an eet encoded data structure from an eet file into ascii + * text using a cipher. + * @param ef A valid eet file handle. + * @param name Name of the entry. eg: "/base/file_i_want". + * @param cipher_key The key to use as cipher. + * @param dumpfunc The function to call passed a string when new + * data is converted to text + * @param dumpdata The data to pass to the @p dumpfunc callback. + * @return 1 on success, 0 on failure + * + * This function will take an open and valid eet file from + * eet_open() request the data encoded by + * eet_data_descriptor_encode() corresponding to the key @p name + * and convert it into human readable ascii text. It does this by + * calling the @p dumpfunc callback for all new text that is + * generated. This callback should append to any existing text + * buffer and will be passed the pointer @p dumpdata as a parameter + * as well as a string with new text to be appended. + * + * @see eet_data_dump() + * + * @since 1.0.0 + * @ingroup Eet_Data_Cipher_Group + */ +EAPI int eet_data_dump_cipher(Eet_File *ef, + const char *name, + const char *cipher_key, + void (*dumpfunc)(void *data, const char *str), + void *dumpdata); - /** - * Take an ascii encoding from eet_data_dump() and re-encode in - * binary using a cipher. - * @param ef A valid eet file handle. - * @param name Name of the entry. eg: "/base/file_i_want". - * @param cipher_key The key to use as cipher. - * @param text The pointer to the string data to parse and encode. - * @param textlen The size of the string in bytes (not including 0 - * byte terminator). - * @param compress Compression flags (1 == compress, 0 = don't compress). - * @return 1 on success, 0 on failure - * - * This function will parse the string pointed to by @p text, - * encode it the same way eet_data_descriptor_encode() takes an - * in-memory data struct and encodes into a binary blob. - * - * The data (optionally compressed) will be in ram, pending a flush to - * disk (it will stay in ram till the eet file handle is closed though). - * - * @see eet_data_undump() - * - * @since 1.0.0 - * @ingroup Eet_Data_Cipher_Group - */ - EAPI int eet_data_undump_cipher(Eet_File *ef, const char *name, const char *cipher_key, const char *text, int textlen, int compress); +/** + * Take an ascii encoding from eet_data_dump() and re-encode in + * binary using a cipher. + * @param ef A valid eet file handle. + * @param name Name of the entry. eg: "/base/file_i_want". + * @param cipher_key The key to use as cipher. + * @param text The pointer to the string data to parse and encode. + * @param textlen The size of the string in bytes (not including 0 + * byte terminator). + * @param compress Compression flags (1 == compress, 0 = don't compress). + * @return 1 on success, 0 on failure + * + * This function will parse the string pointed to by @p text, + * encode it the same way eet_data_descriptor_encode() takes an + * in-memory data struct and encodes into a binary blob. + * + * The data (optionally compressed) will be in ram, pending a flush to + * disk (it will stay in ram till the eet file handle is closed though). + * + * @see eet_data_undump() + * + * @since 1.0.0 + * @ingroup Eet_Data_Cipher_Group + */ +EAPI int eet_data_undump_cipher(Eet_File *ef, + const char *name, + const char *cipher_key, + const char *text, + int textlen, + int compress); - /** - * Decode a data structure from an arbitary location in memory - * using a cipher. - * @param edd The data descriptor to use when decoding. - * @param data_in The pointer to the data to decode into a struct. - * @param cipher_key The key to use as cipher. - * @param size_in The size of the data pointed to in bytes. - * @return NULL on failure, or a valid decoded struct pointer on success. - * - * This function will decode a data structure that has been encoded using - * eet_data_descriptor_encode(), and return a data structure with all its - * elements filled out, if successful, or NULL on failure. - * - * The data to be decoded is stored at the memory pointed to by @p data_in, - * and is described by the descriptor pointed to by @p edd. The data size is - * passed in as the value to @p size_in, ande must be greater than 0 to - * succeed. - * - * This function is useful for decoding data structures delivered to the - * application by means other than an eet file, such as an IPC or socket - * connection, raw files, shared memory etc. - * - * Please see eet_data_read() for more information. - * - * @see eet_data_descriptor_decode() - * - * @since 1.0.0 - * @ingroup Eet_Data_Cipher_Group - */ - EAPI void *eet_data_descriptor_decode_cipher(Eet_Data_Descriptor *edd, const void *data_in, const char *cipher_key, int size_in); +/** + * Decode a data structure from an arbitary location in memory + * using a cipher. + * @param edd The data descriptor to use when decoding. + * @param data_in The pointer to the data to decode into a struct. + * @param cipher_key The key to use as cipher. + * @param size_in The size of the data pointed to in bytes. + * @return NULL on failure, or a valid decoded struct pointer on success. + * + * This function will decode a data structure that has been encoded using + * eet_data_descriptor_encode(), and return a data structure with all its + * elements filled out, if successful, or NULL on failure. + * + * The data to be decoded is stored at the memory pointed to by @p data_in, + * and is described by the descriptor pointed to by @p edd. The data size is + * passed in as the value to @p size_in, ande must be greater than 0 to + * succeed. + * + * This function is useful for decoding data structures delivered to the + * application by means other than an eet file, such as an IPC or socket + * connection, raw files, shared memory etc. + * + * Please see eet_data_read() for more information. + * + * @see eet_data_descriptor_decode() + * + * @since 1.0.0 + * @ingroup Eet_Data_Cipher_Group + */ +EAPI void *eet_data_descriptor_decode_cipher(Eet_Data_Descriptor *edd, + const void *data_in, + const char *cipher_key, + int size_in); - /** - * Encode a data struct to memory and return that encoded data - * using a cipher. - * @param edd The data descriptor to use when encoding. - * @param data_in The pointer to the struct to encode into data. - * @param cipher_key The key to use as cipher. - * @param size_ret pointer to the an int to be filled with the decoded size. - * @return NULL on failure, or a valid encoded data chunk on success. - * - * This function takes a data structutre in memory and encodes it into a - * serialised chunk of data that can be decoded again by - * eet_data_descriptor_decode(). This is useful for being able to transmit - * data structures across sockets, pipes, IPC or shared file mechanisms, - * without having to worry about memory space, machine type, endianess etc. - * - * The parameter @p edd must point to a valid data descriptor, and - * @p data_in must point to the right data structure to encode. If not, the - * encoding may fail. - * - * On success a non NULL valid pointer is returned and what @p size_ret - * points to is set to the size of this decoded data, in bytes. When the - * encoded data is no longer needed, call free() on it. On failure NULL is - * returned and what @p size_ret points to is set to 0. - * - * Please see eet_data_write() for more information. - * - * @see eet_data_descriptor_encode() - * - * @since 1.0.0 - * @ingroup Eet_Data_Cipher_Group - */ - EAPI void *eet_data_descriptor_encode_cipher(Eet_Data_Descriptor *edd, const void *data_in, const char *cipher_key, int *size_ret); +/** + * Encode a data struct to memory and return that encoded data + * using a cipher. + * @param edd The data descriptor to use when encoding. + * @param data_in The pointer to the struct to encode into data. + * @param cipher_key The key to use as cipher. + * @param size_ret pointer to the an int to be filled with the decoded size. + * @return NULL on failure, or a valid encoded data chunk on success. + * + * This function takes a data structutre in memory and encodes it into a + * serialised chunk of data that can be decoded again by + * eet_data_descriptor_decode(). This is useful for being able to transmit + * data structures across sockets, pipes, IPC or shared file mechanisms, + * without having to worry about memory space, machine type, endianess etc. + * + * The parameter @p edd must point to a valid data descriptor, and + * @p data_in must point to the right data structure to encode. If not, the + * encoding may fail. + * + * On success a non NULL valid pointer is returned and what @p size_ret + * points to is set to the size of this decoded data, in bytes. When the + * encoded data is no longer needed, call free() on it. On failure NULL is + * returned and what @p size_ret points to is set to 0. + * + * Please see eet_data_write() for more information. + * + * @see eet_data_descriptor_encode() + * + * @since 1.0.0 + * @ingroup Eet_Data_Cipher_Group + */ +EAPI void *eet_data_descriptor_encode_cipher(Eet_Data_Descriptor *edd, + const void *data_in, + const char *cipher_key, + int *size_ret); - /** - * @defgroup Eet_Node_Group Low-level Serialization Structures. - * - * Functions that create, destroy and manipulate serialization nodes - * used by @ref Eet_Data_Group. - * - * @{ - */ +/** + * @defgroup Eet_Node_Group Low-level Serialization Structures. + * + * Functions that create, destroy and manipulate serialization nodes + * used by @ref Eet_Data_Group. + * + * @{ + */ - /** - * @typedef Eet_Node - * Opaque handle to manage serialization node. - */ - typedef struct _Eet_Node Eet_Node; +/** + * @typedef Eet_Node + * Opaque handle to manage serialization node. + */ +typedef struct _Eet_Node Eet_Node; - /** - * @typedef Eet_Node_Data - * Contains an union that can fit any kind of node. - */ - typedef struct _Eet_Node_Data Eet_Node_Data; +/** + * @typedef Eet_Node_Data + * Contains an union that can fit any kind of node. + */ +typedef struct _Eet_Node_Data Eet_Node_Data; - /** - * @struct _Eet_Node_Data - * Contains an union that can fit any kind of node. - */ - struct _Eet_Node_Data - { - union { - char c; - short s; - int i; - long long l; - float f; - double d; - unsigned char uc; - unsigned short us; - unsigned int ui; - unsigned long long ul; - const char *str; - } value; - }; +/** + * @struct _Eet_Node_Data + * Contains an union that can fit any kind of node. + */ +struct _Eet_Node_Data +{ + union { + char c; + short s; + int i; + long long l; + float f; + double d; + unsigned char uc; + unsigned short us; + unsigned int ui; + unsigned long long ul; + const char *str; + } value; +}; - /** - * @} - */ +/** + * @} + */ - /** - * TODO FIX ME - * @ingroup Eet_Node_Group - */ - EAPI Eet_Node *eet_node_char_new(const char *name, char c); +/** + * TODO FIX ME + * @ingroup Eet_Node_Group + */ +EAPI Eet_Node *eet_node_char_new(const char *name, char c); - /** - * TODO FIX ME - * @ingroup Eet_Node_Group - */ - EAPI Eet_Node *eet_node_short_new(const char *name, short s); +/** + * TODO FIX ME + * @ingroup Eet_Node_Group + */ +EAPI Eet_Node *eet_node_short_new(const char *name, short s); - /** - * TODO FIX ME - * @ingroup Eet_Node_Group - */ - EAPI Eet_Node *eet_node_int_new(const char *name, int i); +/** + * TODO FIX ME + * @ingroup Eet_Node_Group + */ +EAPI Eet_Node *eet_node_int_new(const char *name, int i); - /** - * TODO FIX ME - * @ingroup Eet_Node_Group - */ - EAPI Eet_Node *eet_node_long_long_new(const char *name, long long l); +/** + * TODO FIX ME + * @ingroup Eet_Node_Group + */ +EAPI Eet_Node *eet_node_long_long_new(const char *name, long long l); - /** - * TODO FIX ME - * @ingroup Eet_Node_Group - */ - EAPI Eet_Node *eet_node_float_new(const char *name, float f); +/** + * TODO FIX ME + * @ingroup Eet_Node_Group + */ +EAPI Eet_Node *eet_node_float_new(const char *name, float f); - /** - * TODO FIX ME - * @ingroup Eet_Node_Group - */ - EAPI Eet_Node *eet_node_double_new(const char *name, double d); +/** + * TODO FIX ME + * @ingroup Eet_Node_Group + */ +EAPI Eet_Node *eet_node_double_new(const char *name, double d); - /** - * TODO FIX ME - * @ingroup Eet_Node_Group - */ - EAPI Eet_Node *eet_node_unsigned_char_new(const char *name, unsigned char uc); +/** + * TODO FIX ME + * @ingroup Eet_Node_Group + */ +EAPI Eet_Node *eet_node_unsigned_char_new(const char *name, unsigned char uc); - /** - * TODO FIX ME - * @ingroup Eet_Node_Group - */ - EAPI Eet_Node *eet_node_unsigned_short_new(const char *name, unsigned short us); +/** + * TODO FIX ME + * @ingroup Eet_Node_Group + */ +EAPI Eet_Node *eet_node_unsigned_short_new(const char *name, unsigned short us); - /** - * TODO FIX ME - * @ingroup Eet_Node_Group - */ - EAPI Eet_Node *eet_node_unsigned_int_new(const char *name, unsigned int ui); +/** + * TODO FIX ME + * @ingroup Eet_Node_Group + */ +EAPI Eet_Node *eet_node_unsigned_int_new(const char *name, unsigned int ui); - /** - * TODO FIX ME - * @ingroup Eet_Node_Group - */ - EAPI Eet_Node *eet_node_unsigned_long_long_new(const char *name, unsigned long long l); +/** + * TODO FIX ME + * @ingroup Eet_Node_Group + */ +EAPI Eet_Node *eet_node_unsigned_long_long_new(const char *name, + unsigned long long l); - /** - * TODO FIX ME - * @ingroup Eet_Node_Group - */ - EAPI Eet_Node *eet_node_string_new(const char *name, const char *str); +/** + * TODO FIX ME + * @ingroup Eet_Node_Group + */ +EAPI Eet_Node *eet_node_string_new(const char *name, const char *str); - /** - * TODO FIX ME - * @ingroup Eet_Node_Group - */ - EAPI Eet_Node *eet_node_inlined_string_new(const char *name, const char *str); +/** + * TODO FIX ME + * @ingroup Eet_Node_Group + */ +EAPI Eet_Node *eet_node_inlined_string_new(const char *name, const char *str); - /** - * TODO FIX ME - * @ingroup Eet_Node_Group - */ - EAPI Eet_Node *eet_node_null_new(const char *name); +/** + * TODO FIX ME + * @ingroup Eet_Node_Group + */ +EAPI Eet_Node *eet_node_null_new(const char *name); - /** - * TODO FIX ME - * @ingroup Eet_Node_Group - */ - EAPI Eet_Node *eet_node_list_new(const char *name, Eina_List *nodes); +/** + * TODO FIX ME + * @ingroup Eet_Node_Group + */ +EAPI Eet_Node *eet_node_list_new(const char *name, Eina_List *nodes); - /** - * TODO FIX ME - * @ingroup Eet_Node_Group - */ - EAPI Eet_Node *eet_node_array_new(const char *name, int count, Eina_List *nodes); +/** + * TODO FIX ME + * @ingroup Eet_Node_Group + */ +EAPI Eet_Node *eet_node_array_new(const char *name, int count, Eina_List *nodes); - /** - * TODO FIX ME - * @ingroup Eet_Node_Group - */ - EAPI Eet_Node *eet_node_var_array_new(const char *name, Eina_List *nodes); +/** + * TODO FIX ME + * @ingroup Eet_Node_Group + */ +EAPI Eet_Node *eet_node_var_array_new(const char *name, Eina_List *nodes); - /** - * TODO FIX ME - * @ingroup Eet_Node_Group - */ - EAPI Eet_Node *eet_node_hash_new(const char *name, const char *key, Eet_Node *node); +/** + * TODO FIX ME + * @ingroup Eet_Node_Group + */ +EAPI Eet_Node *eet_node_hash_new(const char *name, + const char *key, + Eet_Node *node); - /** - * TODO FIX ME - * @ingroup Eet_Node_Group - */ - EAPI Eet_Node *eet_node_struct_new(const char *name, Eina_List *nodes); +/** + * TODO FIX ME + * @ingroup Eet_Node_Group + */ +EAPI Eet_Node *eet_node_struct_new(const char *name, Eina_List *nodes); - /** - * TODO FIX ME - * @ingroup Eet_Node_Group - */ - EAPI Eet_Node *eet_node_struct_child_new(const char *parent, Eet_Node *child); +/** + * TODO FIX ME + * @ingroup Eet_Node_Group + */ +EAPI Eet_Node *eet_node_struct_child_new(const char *parent, Eet_Node *child); - /** - * TODO FIX ME - * @ingroup Eet_Node_Group - */ - EAPI void eet_node_list_append(Eet_Node *parent, const char *name, Eet_Node *child); +/** + * TODO FIX ME + * @ingroup Eet_Node_Group + */ +EAPI void eet_node_list_append(Eet_Node *parent, + const char *name, + Eet_Node *child); - /** - * TODO FIX ME - * @ingroup Eet_Node_Group - */ - EAPI void eet_node_struct_append(Eet_Node *parent, const char *name, Eet_Node *child); +/** + * TODO FIX ME + * @ingroup Eet_Node_Group + */ +EAPI void eet_node_struct_append(Eet_Node *parent, + const char *name, + Eet_Node *child); - /** - * TODO FIX ME - * @ingroup Eet_Node_Group - */ - EAPI void eet_node_hash_add(Eet_Node *parent, const char *name, const char *key, Eet_Node *child); +/** + * TODO FIX ME + * @ingroup Eet_Node_Group + */ +EAPI void eet_node_hash_add(Eet_Node *parent, + const char *name, + const char *key, + Eet_Node *child); - /** - * TODO FIX ME - * @ingroup Eet_Node_Group - */ - EAPI void eet_node_dump(Eet_Node *n, int dumplevel, void (*dumpfunc) (void *data, const char *str), void *dumpdata); +/** + * TODO FIX ME + * @ingroup Eet_Node_Group + */ +EAPI void eet_node_dump(Eet_Node *n, int dumplevel, void (*dumpfunc)( + void *data, + const char *str), void *dumpdata); - /** - * TODO FIX ME - * @ingroup Eet_Node_Group - */ - EAPI void eet_node_del(Eet_Node *n); +/** + * TODO FIX ME + * @ingroup Eet_Node_Group + */ +EAPI void eet_node_del(Eet_Node *n); - /** - * TODO FIX ME - * @ingroup Eet_Node_Group - */ - EAPI void *eet_data_node_encode_cipher(Eet_Node *node, const char *cipher_key, int *size_ret); +/** + * TODO FIX ME + * @ingroup Eet_Node_Group + */ +EAPI void * eet_data_node_encode_cipher(Eet_Node *node, + const char *cipher_key, + int *size_ret); - /** - * TODO FIX ME - * @ingroup Eet_Node_Group - */ - EAPI Eet_Node *eet_data_node_decode_cipher(const void *data_in, const char *cipher_key, int size_in); +/** + * TODO FIX ME + * @ingroup Eet_Node_Group + */ +EAPI Eet_Node *eet_data_node_decode_cipher(const void *data_in, + const char *cipher_key, + int size_in); - /** - * TODO FIX ME - * @ingroup Eet_Node_Group - */ - EAPI Eet_Node *eet_data_node_read_cipher(Eet_File *ef, const char *name, const char *cipher_key); +/** + * TODO FIX ME + * @ingroup Eet_Node_Group + */ +EAPI Eet_Node *eet_data_node_read_cipher(Eet_File *ef, + const char *name, + const char *cipher_key); - /** - * TODO FIX ME - * @ingroup Eet_Node_Group - */ - EAPI int eet_data_node_write_cipher(Eet_File *ef, const char *name, const char *cipher_key, Eet_Node *node, int compress); +/** + * TODO FIX ME + * @ingroup Eet_Node_Group + */ +EAPI int eet_data_node_write_cipher(Eet_File *ef, + const char *name, + const char *cipher_key, + Eet_Node *node, + int compress); - /* EXPERIMENTAL: THIS API MAY CHANGE IN THE FUTURE, USE IT ONLY IF YOU KNOW WHAT YOU ARE DOING. */ +/* EXPERIMENTAL: THIS API MAY CHANGE IN THE FUTURE, USE IT ONLY IF YOU KNOW WHAT YOU ARE DOING. */ - /** - * @typedef Eet_Node_Walk - * Describes how to walk trees of #Eet_Node. - */ - typedef struct _Eet_Node_Walk Eet_Node_Walk; +/** + * @typedef Eet_Node_Walk + * Describes how to walk trees of #Eet_Node. + */ +typedef struct _Eet_Node_Walk Eet_Node_Walk; - /** - * @struct _Eet_Node_Walk - * Describes how to walk trees of #Eet_Node. - */ - struct _Eet_Node_Walk - { - void *(*struct_alloc)(const char *type, void *user_data); - void (*struct_add)(void *parent, const char *name, void *child, void *user_data); - void *(*array)(Eina_Bool variable, const char *name, int count, void *user_data); - void (*insert)(void *array, int index, void *child, void *user_data); - void *(*list)(const char *name, void *user_data); - void (*append)(void *list, void *child, void *user_data); - void *(*hash)(void *parent, const char *name, const char *key, void *value, void *user_data); - void *(*simple)(int type, Eet_Node_Data *data, void *user_data); - }; +/** + * @struct _Eet_Node_Walk + * Describes how to walk trees of #Eet_Node. + */ +struct _Eet_Node_Walk +{ + void *(*struct_alloc)(const char *type, void *user_data); + void (*struct_add)(void *parent, const char *name, void *child, + void *user_data); + void *(*array)(Eina_Bool variable, const char *name, int count, + void *user_data); + void (*insert)(void *array, int index, void *child, void *user_data); + void *(*list)(const char *name, void *user_data); + void (*append)(void *list, void *child, void *user_data); + void *(*hash)(void *parent, const char *name, const char *key, void *value, + void *user_data); + void *(*simple)(int type, Eet_Node_Data *data, void *user_data); +}; - EAPI void *eet_node_walk(void *parent, const char *name, Eet_Node *root, Eet_Node_Walk *cb, void *user_data); +EAPI void *eet_node_walk(void *parent, + const char *name, + Eet_Node *root, + Eet_Node_Walk *cb, + void *user_data); - /*******/ +/*******/ - /** - * @defgroup Eet_Connection_Group Helper function to use eet over a network link - * - * Function that reconstruct and prepare packet of @ref Eet_Data_Group to be send. - * - */ +/** + * @defgroup Eet_Connection_Group Helper function to use eet over a network link + * + * Function that reconstruct and prepare packet of @ref Eet_Data_Group to be send. + * + */ - /** - * @typedef Eet_Connection - * Opaque handle to track paquet for a specific connection. - * - * @ingroup Eet_Connection_Group - */ - typedef struct _Eet_Connection Eet_Connection; +/** + * @typedef Eet_Connection + * Opaque handle to track paquet for a specific connection. + * + * @ingroup Eet_Connection_Group + */ +typedef struct _Eet_Connection Eet_Connection; - /** - * @typedef Eet_Read_Cb - * Called back when an @ref Eet_Data_Group has been received completly and could be used. - * - * @ingroup Eet_Connection_Group - */ - typedef Eina_Bool Eet_Read_Cb(const void *eet_data, size_t size, void *user_data); +/** + * @typedef Eet_Read_Cb + * Called back when an @ref Eet_Data_Group has been received completly and could be used. + * + * @ingroup Eet_Connection_Group + */ +typedef Eina_Bool Eet_Read_Cb (const void *eet_data, size_t size, + void *user_data); - /** - * @typedef Eet_Write_Cb - * Called back when a packet containing @ref Eet_Data_Group data is ready to be send. - * - * @ingroup Eet_Connection_Group - */ - typedef Eina_Bool Eet_Write_Cb(const void *data, size_t size, void *user_data); +/** + * @typedef Eet_Write_Cb + * Called back when a packet containing @ref Eet_Data_Group data is ready to be send. + * + * @ingroup Eet_Connection_Group + */ +typedef Eina_Bool Eet_Write_Cb (const void *data, size_t size, void *user_data); - /** - * Instanciate a new connection to track. - * @oaram eet_read_cb Function to call when one Eet_Data packet has been fully assemble. - * @param eet_write_cb Function to call when one Eet_Data packet is ready to be send over the wire. - * @param user_data Pointer provided to both functions to be used as a context handler. - * @return NULL on failure, or a valid Eet_Connection handler. - * - * For every connection to track you will need a separate Eet_Connection provider. - * - * @since 1.2.4 - * @ingroup Eet_Connection_Group - */ - EAPI Eet_Connection *eet_connection_new(Eet_Read_Cb *eet_read_cb, Eet_Write_Cb *eet_write_cb, const void *user_data); +/** + * Instanciate a new connection to track. + * @oaram eet_read_cb Function to call when one Eet_Data packet has been fully assemble. + * @param eet_write_cb Function to call when one Eet_Data packet is ready to be send over the wire. + * @param user_data Pointer provided to both functions to be used as a context handler. + * @return NULL on failure, or a valid Eet_Connection handler. + * + * For every connection to track you will need a separate Eet_Connection provider. + * + * @since 1.2.4 + * @ingroup Eet_Connection_Group + */ +EAPI Eet_Connection *eet_connection_new(Eet_Read_Cb *eet_read_cb, + Eet_Write_Cb *eet_write_cb, + const void *user_data); - /** - * Process a raw packet received over the link - * @oaram conn Connection handler to track. - * @param data Raw data packet. - * @param size The size of that packet. - * @return 0 on complete success, any other value indicate where in the stream it got wrong (It could be before that packet). - * - * Every time you receive a packet related to your connection, you should pass - * it to that function so that it could process and assemble packet has you - * receive it. It will automatically call Eet_Read_Cb when one is fully received. - * - * @since 1.2.4 - * @ingroup Eet_Connection_Group - */ - EAPI int eet_connection_received(Eet_Connection *conn, const void *data, size_t size); +/** + * Process a raw packet received over the link + * @oaram conn Connection handler to track. + * @param data Raw data packet. + * @param size The size of that packet. + * @return 0 on complete success, any other value indicate where in the stream it got wrong (It could be before that packet). + * + * Every time you receive a packet related to your connection, you should pass + * it to that function so that it could process and assemble packet has you + * receive it. It will automatically call Eet_Read_Cb when one is fully received. + * + * @since 1.2.4 + * @ingroup Eet_Connection_Group + */ +EAPI int eet_connection_received(Eet_Connection *conn, + const void *data, + size_t size); - /** - * Convert a complex structure and prepare it to be send. - * @oaram conn Connection handler to track. - * @param edd The data descriptor to use when encoding. - * @param data_in The pointer to the struct to encode into data. - * @param cipher_key The key to use as cipher. - * @return EINA_TRUE if the data where correctly send, EINA_FALSE if they don't. - * - * This function serialize data_in with edd, assemble the packet and call - * Eet_Write_Cb when ready. The data passed Eet_Write_Cb are temporary allocated - * and will vanish just after the return of the callback. - * - * @see eet_data_descriptor_encode_cipher - * - * @since 1.2.4 - * @ingroup Eet_Connection_Group - */ - EAPI Eina_Bool eet_connection_send(Eet_Connection *conn, Eet_Data_Descriptor *edd, const void *data_in, const char *cipher_key); +/** + * Convert a complex structure and prepare it to be send. + * @oaram conn Connection handler to track. + * @param edd The data descriptor to use when encoding. + * @param data_in The pointer to the struct to encode into data. + * @param cipher_key The key to use as cipher. + * @return EINA_TRUE if the data where correctly send, EINA_FALSE if they don't. + * + * This function serialize data_in with edd, assemble the packet and call + * Eet_Write_Cb when ready. The data passed Eet_Write_Cb are temporary allocated + * and will vanish just after the return of the callback. + * + * @see eet_data_descriptor_encode_cipher + * + * @since 1.2.4 + * @ingroup Eet_Connection_Group + */ +EAPI Eina_Bool eet_connection_send(Eet_Connection *conn, + Eet_Data_Descriptor *edd, + const void *data_in, + const char *cipher_key); - /** - * Convert a Eet_Node tree and prepare it to be send. - * @oaram conn Connection handler to track. - * @param node The data tree to use when encoding. - * @param cipher_key The key to use as cipher. - * @return EINA_TRUE if the data where correctly send, EINA_FALSE if they don't. - * - * This function serialize node, assemble the packet and call - * Eet_Write_Cb when ready. The data passed Eet_Write_Cb are temporary allocated - * and will vanish just after the return of the callback. - * - * @see eet_data_node_encode_cipher - * - * @since 1.2.4 - * @ingroup Eet_Connection_Group - */ - EAPI Eina_Bool eet_connection_node_send(Eet_Connection *conn, Eet_Node *node, const char *cipher_key); +/** + * Convert a Eet_Node tree and prepare it to be send. + * @oaram conn Connection handler to track. + * @param node The data tree to use when encoding. + * @param cipher_key The key to use as cipher. + * @return EINA_TRUE if the data where correctly send, EINA_FALSE if they don't. + * + * This function serialize node, assemble the packet and call + * Eet_Write_Cb when ready. The data passed Eet_Write_Cb are temporary allocated + * and will vanish just after the return of the callback. + * + * @see eet_data_node_encode_cipher + * + * @since 1.2.4 + * @ingroup Eet_Connection_Group + */ +EAPI Eina_Bool eet_connection_node_send(Eet_Connection *conn, + Eet_Node *node, + const char *cipher_key); - /** - * Close a connection and lost its track. - * @oaram conn Connection handler to close. - * @param on_going Signal if a partial packet wasn't completed. - * @return the user_data passed to both callback. - * - * @since 1.2.4 - * @ingroup Eet_Connection_Group - */ - EAPI void *eet_connection_close(Eet_Connection *conn, Eina_Bool *on_going); +/** + * Close a connection and lost its track. + * @oaram conn Connection handler to close. + * @param on_going Signal if a partial packet wasn't completed. + * @return the user_data passed to both callback. + * + * @since 1.2.4 + * @ingroup Eet_Connection_Group + */ +EAPI void * eet_connection_close(Eet_Connection *conn, + Eina_Bool *on_going); /***************************************************************************/ diff --git a/legacy/eet/src/lib/Eet_private.h b/legacy/eet/src/lib/Eet_private.h index be7c0ebcad..b3b935bb76 100644 --- a/legacy/eet/src/lib/Eet_private.h +++ b/legacy/eet/src/lib/Eet_private.h @@ -11,56 +11,56 @@ typedef enum _Eet_Convert_Type Eet_Convert_Type; enum _Eet_Convert_Type { - EET_D_NOT_CONVERTED = 0, - EET_D_FLOAT = 1 << 1, - EET_D_DOUBLE = 1 << 2, - EET_D_FIXED_POINT = 1 << 4 + EET_D_NOT_CONVERTED = 0, + EET_D_FLOAT = 1 << 1, + EET_D_DOUBLE = 1 << 2, + EET_D_FIXED_POINT = 1 << 4 }; -typedef struct _Eet_String Eet_String; +typedef struct _Eet_String Eet_String; struct _Eet_String { - const char *mmap; - char *str; + const char *mmap; + char *str; - int hash; - int len; + int hash; + int len; - int next; - int prev; + int next; + int prev; - float f; - double d; - Eina_F32p32 fp; + float f; + double d; + Eina_F32p32 fp; - Eet_Convert_Type type; + Eet_Convert_Type type; }; struct _Eet_Dictionary { - Eet_String *all; + Eet_String *all; - int size; - int offset; + int size; + int offset; - int hash[256]; + int hash[256]; - int count; - int total; + int count; + int total; - const char *start; - const char *end; + const char *start; + const char *end; }; struct _Eet_Node { - int type; - int count; + int type; + int count; const char *name; const char *key; - Eet_Node *values; - Eet_Node *next; - Eet_Node *parent; + Eet_Node *values; + Eet_Node *next; + Eet_Node *parent; Eet_Node_Data data; }; @@ -99,44 +99,69 @@ extern int _eet_log_dom_global; #endif #define CRIT(...) EINA_LOG_DOM_CRIT(_eet_log_dom_global, __VA_ARGS__) -Eet_Dictionary *eet_dictionary_add(void); -void eet_dictionary_free(Eet_Dictionary *ed); -int eet_dictionary_string_add(Eet_Dictionary *ed, const char *string); -int eet_dictionary_string_get_size(const Eet_Dictionary *ed, int index); -const char *eet_dictionary_string_get_char(const Eet_Dictionary *ed, int index); -Eina_Bool eet_dictionary_string_get_float(const Eet_Dictionary *ed, int index, float *result); -Eina_Bool eet_dictionary_string_get_double(const Eet_Dictionary *ed, int index, double *result); -Eina_Bool eet_dictionary_string_get_fp(const Eet_Dictionary *ed, int index, Eina_F32p32 *result); -int eet_dictionary_string_get_hash(const Eet_Dictionary *ed, int index); +Eet_Dictionary *eet_dictionary_add(void); +void eet_dictionary_free(Eet_Dictionary *ed); +int eet_dictionary_string_add(Eet_Dictionary *ed, + const char *string); +int eet_dictionary_string_get_size(const Eet_Dictionary *ed, + int index); +const char * eet_dictionary_string_get_char(const Eet_Dictionary *ed, + int index); +Eina_Bool eet_dictionary_string_get_float(const Eet_Dictionary *ed, + int index, + float *result); +Eina_Bool eet_dictionary_string_get_double(const Eet_Dictionary *ed, + int index, + double *result); +Eina_Bool eet_dictionary_string_get_fp(const Eet_Dictionary *ed, + int index, + Eina_F32p32 *result); +int eet_dictionary_string_get_hash(const Eet_Dictionary *ed, + int index); -int _eet_hash_gen(const char *key, int hash_size); +int _eet_hash_gen(const char *key, int hash_size); -const void* eet_identity_check(const void *data_base, unsigned int data_length, - void **sha1, int *sha1_length, - const void *signature_base, unsigned int signature_length, - const void **raw_signature_base, unsigned int *raw_signature_length, - int *x509_length); -void *eet_identity_compute_sha1(const void *data_base, unsigned int data_length, - int *sha1_length); -Eet_Error eet_cipher(const void *data, unsigned int size, const char *key, unsigned int length, void **result, unsigned int *result_length); -Eet_Error eet_decipher(const void *data, unsigned int size, const char *key, unsigned int length, void **result, unsigned int *result_length); +const void * eet_identity_check(const void *data_base, + unsigned int data_length, + void **sha1, + int *sha1_length, + const void *signature_base, + unsigned int signature_length, + const void **raw_signature_base, + unsigned int *raw_signature_length, + int *x509_length); +void * eet_identity_compute_sha1(const void *data_base, + unsigned int data_length, + int *sha1_length); +Eet_Error eet_cipher(const void *data, + unsigned int size, + const char *key, + unsigned int length, + void **result, + unsigned int *result_length); +Eet_Error eet_decipher(const void *data, + unsigned int size, + const char *key, + unsigned int length, + void **result, + unsigned int *result_length); Eet_Error eet_identity_sign(FILE *fp, Eet_Key *key); -void eet_identity_unref(Eet_Key *key); -void eet_identity_ref(Eet_Key *key); +void eet_identity_unref(Eet_Key *key); +void eet_identity_ref(Eet_Key *key); -void eet_node_shutdown(void); -int eet_node_init(void); +void eet_node_shutdown(void); +int eet_node_init(void); Eet_Node *eet_node_new(void); -void eet_node_free(Eet_Node *node); +void eet_node_free(Eet_Node *node); #ifndef PATH_MAX # define PATH_MAX 4096 #endif #ifdef DNDEBUG -# define EET_ASSERT(Test, Do) if (Test == 0) Do; +# define EET_ASSERT(Test, Do) if (Test == 0) {Do; } #else -# define EET_ASSERT(Test, Do) if (Test == 0) abort(); +# define EET_ASSERT(Test, Do) if (Test == 0) {abort(); } #endif #endif diff --git a/legacy/eet/src/lib/eet_cipher.c b/legacy/eet/src/lib/eet_cipher.c index 9266e7f820..028c28f697 100644 --- a/legacy/eet/src/lib/eet_cipher.c +++ b/legacy/eet/src/lib/eet_cipher.c @@ -80,160 +80,224 @@ void *alloca (size_t); #ifdef HAVE_CIPHER # ifdef HAVE_GNUTLS -static Eet_Error eet_hmac_sha1(const void *key, size_t key_len, const void *data, size_t data_len, unsigned char *res); +static Eet_Error eet_hmac_sha1(const void *key, + size_t key_len, + const void *data, + size_t data_len, + unsigned char *res); # endif -static Eet_Error eet_pbkdf2_sha1(const char *key, int key_len, const unsigned char *salt, unsigned int salt_len, int iter, unsigned char *res, int res_len); +static Eet_Error eet_pbkdf2_sha1(const char *key, + int key_len, + const unsigned char *salt, + unsigned int salt_len, + int iter, + unsigned char *res, + int res_len); #endif struct _Eet_Key { - int references; + int references; #ifdef HAVE_SIGNATURE # ifdef HAVE_GNUTLS - gnutls_x509_crt_t certificate; - gnutls_x509_privkey_t private_key; + gnutls_x509_crt_t certificate; + gnutls_x509_privkey_t private_key; # else - X509 *certificate; - EVP_PKEY *private_key; + X509 *certificate; + EVP_PKEY *private_key; # endif #endif }; -EAPI Eet_Key* -eet_identity_open(const char *certificate_file, const char *private_key_file, Eet_Key_Password_Callback cb) +EAPI Eet_Key * +eet_identity_open(const char *certificate_file, + const char *private_key_file, + Eet_Key_Password_Callback cb) { #ifdef HAVE_SIGNATURE - /* Signature declarations */ - Eet_Key *key = NULL; - FILE *fp = NULL; + /* Signature declarations */ + Eet_Key *key = NULL; + FILE *fp = NULL; # ifdef HAVE_GNUTLS - /* Gnutls private declarations */ - int fd = -1; - struct stat st; - void *data = NULL; - gnutls_datum_t load_file = { NULL, 0 }; - char pass[1024]; + /* Gnutls private declarations */ + int fd = -1; + struct stat st; + void *data = NULL; + gnutls_datum_t load_file = { NULL, 0 }; + char pass[1024]; - /* Init */ - if (!(key = malloc(sizeof(Eet_Key)))) goto on_error; - key->references = 1; + /* Init */ + if (!(key = malloc(sizeof(Eet_Key)))) + goto on_error; - if (gnutls_x509_crt_init(&(key->certificate))) goto on_error; - if (gnutls_x509_privkey_init(&(key->private_key))) goto on_error; + key->references = 1; - /* Mmap certificate_file */ - if (!(fp = fopen(certificate_file, "r"))) goto on_error; - if ((fd = fileno(fp)) == -1) goto on_error; - if (fstat(fd, &st)) goto on_error; - if ((data = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0)) == MAP_FAILED) goto on_error; + if (gnutls_x509_crt_init(&(key->certificate))) + goto on_error; - /* Import the certificate in Eet_Key structure */ - load_file.data = data; - load_file.size = st.st_size; - if (gnutls_x509_crt_import(key->certificate, &load_file, GNUTLS_X509_FMT_PEM) < 0) - goto on_error; - if (munmap(data, st.st_size)) goto on_error; + if (gnutls_x509_privkey_init(&(key->private_key))) + goto on_error; - /* Reset values */ - fclose(fp); - fp = NULL; - data = NULL; - load_file.data = NULL; - load_file.size = 0; + /* Mmap certificate_file */ + if (!(fp = fopen(certificate_file, "r"))) + goto on_error; - /* Mmap private_key_file */ - if (!(fp = fopen(private_key_file, "r"))) goto on_error; - if ((fd = fileno(fp)) == -1) goto on_error; - if (fstat(fd, &st)) goto on_error; - if ((data = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0)) == MAP_FAILED) goto on_error; + if ((fd = fileno(fp)) == -1) + goto on_error; - /* Import the private key in Eet_Key structure */ - load_file.data = data; - load_file.size = st.st_size; - /* Try to directly import the PEM encoded private key */ - if (gnutls_x509_privkey_import(key->private_key, &load_file, GNUTLS_X509_FMT_PEM) < 0) - { - /* Else ask for the private key pass */ - if (cb && cb(pass, 1024, 0, NULL)) - { - /* If pass then try to decode the pkcs 8 private key */ - if (gnutls_x509_privkey_import_pkcs8(key->private_key, &load_file, GNUTLS_X509_FMT_PEM, pass, 0)) - goto on_error; - } - else - { - /* Else try to import the pkcs 8 private key without pass */ - if (gnutls_x509_privkey_import_pkcs8(key->private_key, &load_file, GNUTLS_X509_FMT_PEM, NULL, 1)) - goto on_error; - } - } - if (munmap(data, st.st_size)) goto on_error; - fclose(fp); + if (fstat(fd, &st)) + goto on_error; - return key; + if ((data = + mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0)) == MAP_FAILED) + goto on_error; + + /* Import the certificate in Eet_Key structure */ + load_file.data = data; + load_file.size = st.st_size; + if (gnutls_x509_crt_import(key->certificate, &load_file, + GNUTLS_X509_FMT_PEM) < 0) + goto on_error; + + if (munmap(data, st.st_size)) + goto on_error; + + /* Reset values */ + fclose(fp); + fp = NULL; + data = NULL; + load_file.data = NULL; + load_file.size = 0; + + /* Mmap private_key_file */ + if (!(fp = fopen(private_key_file, "r"))) + goto on_error; + + if ((fd = fileno(fp)) == -1) + goto on_error; + + if (fstat(fd, &st)) + goto on_error; + + if ((data = + mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0)) == MAP_FAILED) + goto on_error; + + /* Import the private key in Eet_Key structure */ + load_file.data = data; + load_file.size = st.st_size; + /* Try to directly import the PEM encoded private key */ + if (gnutls_x509_privkey_import(key->private_key, &load_file, + GNUTLS_X509_FMT_PEM) < 0) + { + /* Else ask for the private key pass */ + if (cb && cb(pass, 1024, 0, NULL)) + { + /* If pass then try to decode the pkcs 8 private key */ + if (gnutls_x509_privkey_import_pkcs8(key->private_key, &load_file, + GNUTLS_X509_FMT_PEM, pass, 0)) + goto on_error; + } + else + /* Else try to import the pkcs 8 private key without pass */ + if (gnutls_x509_privkey_import_pkcs8(key->private_key, &load_file, + GNUTLS_X509_FMT_PEM, NULL, 1)) + goto on_error; + } + + if (munmap(data, st.st_size)) + goto on_error; + + fclose(fp); + + return key; + +on_error: + if (fp) + fclose(fp); + + if (key) + { + if (key->certificate) + gnutls_x509_crt_deinit(key->certificate); + + if (key->private_key) + gnutls_x509_privkey_deinit(key->private_key); + + free(key); + } + + if (data) + munmap(data, st.st_size); - on_error: - if (fp) fclose(fp); - if (key) - { - if (key->certificate) gnutls_x509_crt_deinit(key->certificate); - if (key->private_key) gnutls_x509_privkey_deinit(key->private_key); - free(key); - } - if (data) munmap(data, st.st_size); # else - /* Openssl private declarations */ - EVP_PKEY *pkey = NULL; - X509 *cert = NULL; + /* Openssl private declarations */ + EVP_PKEY *pkey = NULL; + X509 *cert = NULL; - /* Load the X509 certificate in memory. */ - fp = fopen(certificate_file, "r"); - if (!fp) return NULL; - cert = PEM_read_X509(fp, NULL, NULL, NULL); - fclose(fp); - if (!cert) goto on_error; + /* Load the X509 certificate in memory. */ + fp = fopen(certificate_file, "r"); + if (!fp) + return NULL; - /* Check the presence of the public key. Just in case. */ - pkey = X509_get_pubkey(cert); - if (!pkey) goto on_error; + cert = PEM_read_X509(fp, NULL, NULL, NULL); + fclose(fp); + if (!cert) + goto on_error; - /* Load the private key in memory. */ - fp = fopen(private_key_file, "r"); - if (!fp) goto on_error; - pkey = PEM_read_PrivateKey(fp, NULL, cb, NULL); - fclose(fp); - if (!pkey) goto on_error; + /* Check the presence of the public key. Just in case. */ + pkey = X509_get_pubkey(cert); + if (!pkey) + goto on_error; - /* Load the certificate and the private key in Eet_Key structure */ - key = malloc(sizeof(Eet_Key)); - if (!key) goto on_error; - key->references = 1; - key->certificate = cert; - key->private_key = pkey; + /* Load the private key in memory. */ + fp = fopen(private_key_file, "r"); + if (!fp) + goto on_error; - return key; + pkey = PEM_read_PrivateKey(fp, NULL, cb, NULL); + fclose(fp); + if (!pkey) + goto on_error; + + /* Load the certificate and the private key in Eet_Key structure */ + key = malloc(sizeof(Eet_Key)); + if (!key) + goto on_error; + + key->references = 1; + key->certificate = cert; + key->private_key = pkey; + + return key; + +on_error: + if (cert) + X509_free(cert); + + if (pkey) + EVP_PKEY_free(pkey); - on_error: - if (cert) X509_free(cert); - if (pkey) EVP_PKEY_free(pkey); # endif #endif - return NULL; + return NULL; } EAPI void eet_identity_close(Eet_Key *key) { #ifdef HAVE_SIGNATURE - if (!key || (key->references > 0)) return ; + if (!key || (key->references > 0)) + return; + # ifdef HAVE_GNUTLS - gnutls_x509_crt_deinit(key->certificate); - gnutls_x509_privkey_deinit(key->private_key); + gnutls_x509_crt_deinit(key->certificate); + gnutls_x509_privkey_deinit(key->private_key); # else - X509_free(key->certificate); - EVP_PKEY_free(key->private_key); + X509_free(key->certificate); + EVP_PKEY_free(key->private_key); # endif - free(key); + free(key); #endif } @@ -242,143 +306,168 @@ eet_identity_print(Eet_Key *key, FILE *out) { #ifdef HAVE_SIGNATURE # ifdef HAVE_GNUTLS - const char *names[6] = { - "Modulus", - "Public exponent", - "Private exponent", - "First prime", - "Second prime", - "Coefficient" - }; - int err = 0; - gnutls_datum_t data = { NULL, 0 }; - gnutls_datum_t rsa_raw[6]; - size_t size = 128; - char *res = NULL; - char buf[33]; - unsigned int i, j; + const char *names[6] = { + "Modulus", + "Public exponent", + "Private exponent", + "First prime", + "Second prime", + "Coefficient" + }; + int err = 0; + gnutls_datum_t data = { NULL, 0 }; + gnutls_datum_t rsa_raw[6]; + size_t size = 128; + char *res = NULL; + char buf[33]; + unsigned int i, j; - if (!key) return ; + if (!key) + return; - if (key->private_key) - { - if (gnutls_x509_privkey_export_rsa_raw(key->private_key, - rsa_raw + 0, /* Modulus */ - rsa_raw + 1, /* Public exponent */ - rsa_raw + 2, /* Private exponent */ - rsa_raw + 3, /* First prime */ - rsa_raw + 4, /* Second prime */ - rsa_raw + 5)) /* Coefficient */ - goto on_error; - if (!(res = malloc(size))) goto on_error; + if (key->private_key) + { + if (gnutls_x509_privkey_export_rsa_raw(key->private_key, + rsa_raw + 0, /* Modulus */ + rsa_raw + 1, /* Public exponent */ + rsa_raw + 2, /* Private exponent */ + rsa_raw + 3, /* First prime */ + rsa_raw + 4, /* Second prime */ + rsa_raw + 5)) /* Coefficient */ + goto on_error; - fprintf(out, "Private Key:\n"); - buf[32] = '\0'; + if (!(res = malloc(size))) + goto on_error; - for (i = 0; i < 6; i++) - { - while ((err = gnutls_hex_encode(rsa_raw + i, res, &size)) == GNUTLS_E_SHORT_MEMORY_BUFFER) - { - size += 128; - if (!(res = realloc(res, size))) goto on_error; - } - if (err) goto on_error; + fprintf(out, "Private Key:\n"); + buf[32] = '\0'; - fprintf(out, "\t%s:\n", names[i]); - for (j = 0; strlen(res) > j; j += 32) - { - snprintf(buf, 32, "%s", res + j); - fprintf(out, "\t\t%s\n", buf); - } - } + for (i = 0; i < 6; i++) + { + while ((err = + gnutls_hex_encode(rsa_raw + i, res, + &size)) == + GNUTLS_E_SHORT_MEMORY_BUFFER) + { + size += 128; + if (!(res = realloc(res, size))) + goto on_error; + } + if (err) + goto on_error; + + fprintf(out, "\t%s:\n", names[i]); + for (j = 0; strlen(res) > j; j += 32) + { + snprintf(buf, 32, "%s", res + j); + fprintf(out, "\t\t%s\n", buf); + } + } + free(res); + res = NULL; + } + + if (key->certificate) + { + fprintf(out, "Public certificate:\n"); + if (gnutls_x509_crt_print(key->certificate, GNUTLS_X509_CRT_FULL, &data)) + goto on_error; + + fprintf(out, "%s\n", data.data); + gnutls_free(data.data); + data.data = NULL; + } + +on_error: + if (res) free(res); - res = NULL; - } - if (key->certificate) - { - fprintf(out, "Public certificate:\n"); - if (gnutls_x509_crt_print(key->certificate, GNUTLS_X509_CRT_FULL, &data)) goto on_error; - fprintf(out, "%s\n", data.data); + if (data.data) gnutls_free(data.data); - data.data = NULL; - } - on_error: - if (res) free(res); - if (data.data) gnutls_free(data.data); - return ; + return; # else - RSA *rsa; - DSA *dsa; - DH *dh; + RSA *rsa; + DSA *dsa; + DH *dh; - if (!key) return ; + if (!key) + return; - rsa = EVP_PKEY_get1_RSA(key->private_key); - if (rsa) - { - fprintf(out, "Private key (RSA):\n"); - RSA_print_fp(out, rsa, 0); - } + rsa = EVP_PKEY_get1_RSA(key->private_key); + if (rsa) + { + fprintf(out, "Private key (RSA):\n"); + RSA_print_fp(out, rsa, 0); + } - dsa = EVP_PKEY_get1_DSA(key->private_key); - if (dsa) - { - fprintf(out, "Private key (DSA):\n"); - DSA_print_fp(out, dsa, 0); - } + dsa = EVP_PKEY_get1_DSA(key->private_key); + if (dsa) + { + fprintf(out, "Private key (DSA):\n"); + DSA_print_fp(out, dsa, 0); + } - dh = EVP_PKEY_get1_DH(key->private_key); - if (dh) - { - fprintf(out, "Private key (DH):\n"); - DHparams_print_fp(out, dh); - } + dh = EVP_PKEY_get1_DH(key->private_key); + if (dh) + { + fprintf(out, "Private key (DH):\n"); + DHparams_print_fp(out, dh); + } - fprintf(out, "Public certificate:\n"); - X509_print_fp(out, key->certificate); + fprintf(out, "Public certificate:\n"); + X509_print_fp(out, key->certificate); # endif #else - ERR("You need to compile signature support in EET."); + ERR("You need to compile signature support in EET."); #endif } void eet_identity_ref(Eet_Key *key) { - if (key == NULL) return ; + if (key == NULL) + return; + key->references++; } void eet_identity_unref(Eet_Key *key) { - if (key == NULL) return ; + if (key == NULL) + return; + key->references--; eet_identity_close(key); } void * eet_identity_compute_sha1(const void *data_base, unsigned int data_length, - int *sha1_length) + int *sha1_length) { void *result; #ifdef HAVE_SIGNATURE # ifdef HAVE_GNUTLS result = malloc(gcry_md_get_algo_dlen(GCRY_MD_SHA1)); - if (!result) return NULL; + if (!result) + return NULL; gcry_md_hash_buffer(GCRY_MD_SHA1, result, data_base, data_length); - if (sha1_length) *sha1_length = gcry_md_get_algo_dlen(GCRY_MD_SHA1); + if (sha1_length) + *sha1_length = gcry_md_get_algo_dlen(GCRY_MD_SHA1); + # else # ifdef HAVE_OPENSSL result = malloc(SHA_DIGEST_LENGTH); - if (!result) return NULL; + if (!result) + return NULL; SHA1(data_base, data_length, result); - if (sha1_length) *sha1_length = SHA_DIGEST_LENGTH; + if (sha1_length) + *sha1_length = SHA_DIGEST_LENGTH; + # else result = NULL; # endif @@ -413,111 +502,141 @@ eet_identity_sign(FILE *fp, Eet_Key *key) /* A few check and flush pending write. */ if (!fp || !key || !key->certificate || !key->private_key) - return EET_ERROR_BAD_OBJECT; + return EET_ERROR_BAD_OBJECT; /* Get the file size. */ fd = fileno(fp); - if (fd < 0) return EET_ERROR_BAD_OBJECT; - if (fstat(fd, &st_buf) < 0) return EET_ERROR_MMAP_FAILED; + if (fd < 0) + return EET_ERROR_BAD_OBJECT; + + if (fstat(fd, &st_buf) < 0) + return EET_ERROR_MMAP_FAILED; /* Map the file in memory. */ data = mmap(NULL, st_buf.st_size, PROT_READ, MAP_PRIVATE, fd, 0); - if (data == MAP_FAILED) return EET_ERROR_MMAP_FAILED; + if (data == MAP_FAILED) + return EET_ERROR_MMAP_FAILED; # ifdef HAVE_GNUTLS datum.data = data; datum.size = st_buf.st_size; /* Get the signature length */ - if (gnutls_x509_privkey_sign_data(key->private_key, GNUTLS_DIG_SHA1, 0, &datum, sign, &sign_len) && + if (gnutls_x509_privkey_sign_data(key->private_key, GNUTLS_DIG_SHA1, 0, + &datum, sign, &sign_len) && !sign_len) { - err = EET_ERROR_SIGNATURE_FAILED; - goto on_error; + err = EET_ERROR_SIGNATURE_FAILED; + goto on_error; } /* Get the signature */ sign = malloc(sign_len); - if (!sign || gnutls_x509_privkey_sign_data(key->private_key, GNUTLS_DIG_SHA1, 0, &datum, sign, &sign_len)) + if (!sign || + gnutls_x509_privkey_sign_data(key->private_key, GNUTLS_DIG_SHA1, 0, + &datum, + sign, &sign_len)) { - if (!sign) err = EET_ERROR_OUT_OF_MEMORY; - else err = EET_ERROR_SIGNATURE_FAILED; - goto on_error; + if (!sign) + err = EET_ERROR_OUT_OF_MEMORY; + else + err = EET_ERROR_SIGNATURE_FAILED; + + goto on_error; } /* Get the certificate length */ - if (gnutls_x509_crt_export(key->certificate, GNUTLS_X509_FMT_DER, cert, &cert_len) && + if (gnutls_x509_crt_export(key->certificate, GNUTLS_X509_FMT_DER, cert, + &cert_len) && !cert_len) { - err = EET_ERROR_SIGNATURE_FAILED; - goto on_error; + err = EET_ERROR_SIGNATURE_FAILED; + goto on_error; } /* Get the certificate */ cert = malloc(cert_len); - if (!cert || gnutls_x509_crt_export(key->certificate, GNUTLS_X509_FMT_DER, cert, &cert_len)) + if (!cert || + gnutls_x509_crt_export(key->certificate, GNUTLS_X509_FMT_DER, cert, + &cert_len)) { - if (!cert) err = EET_ERROR_OUT_OF_MEMORY; - else err = EET_ERROR_SIGNATURE_FAILED; - goto on_error; + if (!cert) + err = EET_ERROR_OUT_OF_MEMORY; + else + err = EET_ERROR_SIGNATURE_FAILED; + + goto on_error; } + # else sign_len = EVP_PKEY_size(key->private_key); sign = malloc(sign_len); if (sign == NULL) { - err = EET_ERROR_OUT_OF_MEMORY; - goto on_error; + err = EET_ERROR_OUT_OF_MEMORY; + goto on_error; } /* Do the signature. */ EVP_SignInit(&md_ctx, EVP_sha1()); EVP_SignUpdate(&md_ctx, data, st_buf.st_size); - err = EVP_SignFinal(&md_ctx, sign, (unsigned int *)&sign_len, key->private_key); + err = EVP_SignFinal(&md_ctx, + sign, + (unsigned int *)&sign_len, + key->private_key); if (err != 1) { - ERR_print_errors_fp(stdout); - err = EET_ERROR_SIGNATURE_FAILED; - goto on_error; + ERR_print_errors_fp(stdout); + err = EET_ERROR_SIGNATURE_FAILED; + goto on_error; } /* Give me the der (binary form for X509). */ cert_len = i2d_X509(key->certificate, &cert); if (cert_len < 0) { - ERR_print_errors_fp(stdout); - err = EET_ERROR_X509_ENCODING_FAILED; - goto on_error; + ERR_print_errors_fp(stdout); + err = EET_ERROR_X509_ENCODING_FAILED; + goto on_error; } + # endif /* Append the signature at the end of the file. */ - head[0] = (int) htonl ((unsigned int) EET_MAGIC_SIGN); - head[1] = (int) htonl ((unsigned int) sign_len); - head[2] = (int) htonl ((unsigned int) cert_len); + head[0] = (int)htonl ((unsigned int)EET_MAGIC_SIGN); + head[1] = (int)htonl ((unsigned int)sign_len); + head[2] = (int)htonl ((unsigned int)cert_len); if (fwrite(head, sizeof(head), 1, fp) != 1) { - err = EET_ERROR_WRITE_ERROR; - goto on_error; - } - if (fwrite(sign, sign_len, 1, fp) != 1) - { - err = EET_ERROR_WRITE_ERROR; - goto on_error; - } - if (fwrite(cert, cert_len, 1, fp) != 1) - { - err = EET_ERROR_WRITE_ERROR; - goto on_error; + err = EET_ERROR_WRITE_ERROR; + goto on_error; } - on_error: + if (fwrite(sign, sign_len, 1, fp) != 1) + { + err = EET_ERROR_WRITE_ERROR; + goto on_error; + } + + if (fwrite(cert, cert_len, 1, fp) != 1) + { + err = EET_ERROR_WRITE_ERROR; + goto on_error; + } + +on_error: # ifdef HAVE_GNUTLS - if (cert) free(cert); + if (cert) + free(cert); + # else - if (cert) OPENSSL_free(cert); + if (cert) + OPENSSL_free(cert); + # endif - if (sign) free(sign); + if (sign) + free(sign); + munmap(data, st_buf.st_size); return err; #else @@ -525,12 +644,16 @@ eet_identity_sign(FILE *fp, Eet_Key *key) #endif } -const void* -eet_identity_check(const void *data_base, unsigned int data_length, - void **sha1, int *sha1_length, - const void *signature_base, unsigned int signature_length, - const void **raw_signature_base, unsigned int *raw_signature_length, - int *x509_length) +const void * +eet_identity_check(const void *data_base, + unsigned int data_length, + void **sha1, + int *sha1_length, + const void *signature_base, + unsigned int signature_length, + const void **raw_signature_base, + unsigned int *raw_signature_length, + int *x509_length) { #ifdef HAVE_SIGNATURE const int *header = signature_base; @@ -541,7 +664,8 @@ eet_identity_check(const void *data_base, unsigned int data_length, int magic; /* At least the header size */ - if (signature_length < sizeof(int) * 3) return NULL; + if (signature_length < sizeof(int) * 3) + return NULL; /* Get the header */ magic = ntohl(header[0]); @@ -549,8 +673,11 @@ eet_identity_check(const void *data_base, unsigned int data_length, cert_len = ntohl(header[2]); /* Verify the header */ - if (magic != EET_MAGIC_SIGN) return NULL; - if (sign_len + cert_len + sizeof(int) * 3 > signature_length) return NULL; + if (magic != EET_MAGIC_SIGN) + return NULL; + + if (sign_len + cert_len + sizeof(int) * 3 > signature_length) + return NULL; /* Update the signature and certificate pointer */ sign = (unsigned char *)signature_base + sizeof(int) * 3; @@ -578,19 +705,20 @@ eet_identity_check(const void *data_base, unsigned int data_length, /* Verify the signature */ # if EET_USE_NEW_GNUTLS_API /* - I am waiting for my patch being accepted in GnuTLS release. - But we now have a way to prevent double computation of SHA1. + I am waiting for my patch being accepted in GnuTLS release. + But we now have a way to prevent double computation of SHA1. */ err = gcry_md_open (&md, GCRY_MD_SHA1, 0); - if (err < 0) return NULL; + if (err < 0) + return NULL; gcry_md_write(md, data_base, data_length); hash = gcry_md_read(md, GCRY_MD_SHA1); if (hash == NULL) { - gcry_md_close(md); - return NULL; + gcry_md_close(md); + return NULL; } datum.size = gcry_md_get_algo_dlen(GCRY_MD_SHA1); @@ -598,21 +726,21 @@ eet_identity_check(const void *data_base, unsigned int data_length, if (!gnutls_x509_crt_verify_hash(cert, 0, &datum, &signature)) { - gcry_md_close(md); - return NULL; + gcry_md_close(md); + return NULL; } if (sha1) { - *sha1 = malloc(datum.size); - if (!*sha1) - { - gcry_md_close(md); - return NULL; - } + *sha1 = malloc(datum.size); + if (!*sha1) + { + gcry_md_close(md); + return NULL; + } - memcpy(*sha1, hash, datum.size); - *sha1_length = datum.size; + memcpy(*sha1, hash, datum.size); + *sha1_length = datum.size; } gcry_md_close(md); @@ -621,15 +749,16 @@ eet_identity_check(const void *data_base, unsigned int data_length, datum.size = data_length; if (!gnutls_x509_crt_verify_data(cert, 0, &datum, &signature)) - return NULL; + return NULL; if (sha1) { - *sha1 = NULL; - *sha1_length = -1; + *sha1 = NULL; + *sha1_length = -1; } + # endif - gnutls_x509_crt_deinit(cert); + gnutls_x509_crt_deinit(cert); # else const unsigned char *tmp; @@ -640,16 +769,17 @@ eet_identity_check(const void *data_base, unsigned int data_length, /* Strange but d2i_X509 seems to put 0 all over the place. */ tmp = alloca(cert_len); - memcpy((char*) tmp, cert_der, cert_len); + memcpy((char *)tmp, cert_der, cert_len); x509 = d2i_X509(NULL, &tmp, cert_len); - if (x509 == NULL) return NULL; + if (x509 == NULL) + return NULL; /* Get public key - eay */ - pkey=X509_get_pubkey(x509); + pkey = X509_get_pubkey(x509); if (pkey == NULL) { - X509_free(x509); - return NULL; + X509_free(x509); + return NULL; } /* Verify the signature */ @@ -662,16 +792,23 @@ eet_identity_check(const void *data_base, unsigned int data_length, if (sha1) { - *sha1 = NULL; - *sha1_length = -1; + *sha1 = NULL; + *sha1_length = -1; } if (err != 1) - return NULL; + return NULL; + # endif - if (x509_length) *x509_length = cert_len; - if (raw_signature_base) *raw_signature_base = sign; - if (raw_signature_length) *raw_signature_length = sign_len; + if (x509_length) + *x509_length = cert_len; + + if (raw_signature_base) + *raw_signature_base = sign; + + if (raw_signature_length) + *raw_signature_length = sign_len; + return cert_der; #else return NULL; @@ -679,50 +816,60 @@ eet_identity_check(const void *data_base, unsigned int data_length, } EAPI void -eet_identity_certificate_print(const unsigned char *certificate, int der_length, FILE *out) +eet_identity_certificate_print(const unsigned char *certificate, + int der_length, + FILE *out) { #ifdef HAVE_SIGNATURE - if (!certificate || !out || der_length <= 0) + if (!certificate || !out || der_length <= 0) { - ERR("No certificate provided."); - return ; + ERR("No certificate provided."); + return; } + # ifdef HAVE_GNUTLS - gnutls_datum_t datum; - gnutls_x509_crt_t cert; + gnutls_datum_t datum; + gnutls_x509_crt_t cert; - /* Create an understanding certificate structure for gnutls */ - datum.data = (void *)certificate; - datum.size = der_length; - if (gnutls_x509_crt_init(&cert)) goto on_error; - if (gnutls_x509_crt_import(cert, &datum, GNUTLS_X509_FMT_DER)) goto on_error; + /* Create an understanding certificate structure for gnutls */ + datum.data = (void *)certificate; + datum.size = der_length; + if (gnutls_x509_crt_init(&cert)) + goto on_error; - /* Pretty print the certificate */ - datum.data = NULL; - datum.size = 0; - if (gnutls_x509_crt_print(cert, GNUTLS_X509_CRT_FULL, &datum)) goto on_error; - INF("Public certificate :"); - INF("%s", datum.data); + if (gnutls_x509_crt_import(cert, &datum, GNUTLS_X509_FMT_DER)) + goto on_error; - on_error: - if (datum.data) gnutls_free(datum.data); - gnutls_x509_crt_deinit(cert); + /* Pretty print the certificate */ + datum.data = NULL; + datum.size = 0; + if (gnutls_x509_crt_print(cert, GNUTLS_X509_CRT_FULL, &datum)) + goto on_error; + + INF("Public certificate :"); + INF("%s", datum.data); + +on_error: + if (datum.data) + gnutls_free(datum.data); + + gnutls_x509_crt_deinit(cert); # else const unsigned char *tmp; X509 *x509; /* Strange but d2i_X509 seems to put 0 all over the place. */ tmp = alloca(der_length); - memcpy((char*) tmp, certificate, der_length); + memcpy((char *)tmp, certificate, der_length); x509 = d2i_X509(NULL, &tmp, der_length); if (x509 == NULL) { - INF("Not a valid certificate."); - return ; + INF("Not a valid certificate."); + return; } - INF("Public certificate :"); - X509_print_fp(out, x509); + INF("Public certificate :"); + X509_print_fp(out, x509); X509_free(x509); # endif @@ -732,10 +879,15 @@ eet_identity_certificate_print(const unsigned char *certificate, int der_length, } Eet_Error -eet_cipher(const void *data, unsigned int size, const char *key, unsigned int length, void **result, unsigned int *result_length) +eet_cipher(const void *data, + unsigned int size, + const char *key, + unsigned int length, + void **result, + unsigned int *result_length) { #ifdef HAVE_CIPHER - /* Cipher declarations */ + /* Cipher declarations */ unsigned int *ret = NULL; unsigned char iv[MAX_IV_LEN]; unsigned char ik[MAX_KEY_LEN]; @@ -760,28 +912,36 @@ eet_cipher(const void *data, unsigned int size, const char *key, unsigned int le gcry_create_nonce((unsigned char *)&salt, sizeof(salt)); # else /* Openssl salt generation */ - if (!RAND_bytes((unsigned char*)&salt, sizeof (unsigned int))) - return EET_ERROR_PRNG_NOT_SEEDED; + if (!RAND_bytes((unsigned char *)&salt, sizeof (unsigned int))) + return EET_ERROR_PRNG_NOT_SEEDED; + #endif - eet_pbkdf2_sha1(key, length, (unsigned char *)&salt, sizeof(unsigned int), 2048, key_material, MAX_KEY_LEN + MAX_IV_LEN); + eet_pbkdf2_sha1(key, + length, + (unsigned char *)&salt, + sizeof(unsigned int), + 2048, + key_material, + MAX_KEY_LEN + MAX_IV_LEN); - memcpy(iv, key_material, MAX_IV_LEN); - memcpy(ik, key_material + MAX_IV_LEN, MAX_KEY_LEN); + memcpy(iv, key_material, MAX_IV_LEN); + memcpy(ik, key_material + MAX_IV_LEN, MAX_KEY_LEN); - memset(key_material, 0, sizeof (key_material)); + memset(key_material, 0, sizeof (key_material)); crypted_length = ((((size + sizeof (unsigned int)) >> 5) + 1) << 5); ret = malloc(crypted_length + sizeof(unsigned int)); - if (!ret) { - memset(iv, 0, sizeof (iv)); - memset(ik, 0, sizeof (ik)); - memset(&salt, 0, sizeof (salt)); - return EET_ERROR_OUT_OF_MEMORY; - } + if (!ret) + { + memset(iv, 0, sizeof (iv)); + memset(ik, 0, sizeof (ik)); + memset(&salt, 0, sizeof (salt)); + return EET_ERROR_OUT_OF_MEMORY; + } *ret = salt; - memset(&salt, 0, sizeof (salt)); + memset(&salt, 0, sizeof (salt)); tmp = htonl(size); #ifdef HAVE_GNUTLS @@ -791,19 +951,29 @@ eet_cipher(const void *data, unsigned int size, const char *key, unsigned int le /* Gcrypt create the corresponding cipher AES with a 256 bit key, Cipher Block Chaining mode */ err = gcry_cipher_open(&cipher, GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_CBC, 0); - if (err) goto on_error; + if (err) + goto on_error; + opened = 1; err = gcry_cipher_setiv(cipher, iv, MAX_IV_LEN); - if (err) goto on_error; + if (err) + goto on_error; + err = gcry_cipher_setkey(cipher, ik, MAX_KEY_LEN); - if (err) goto on_error; + if (err) + goto on_error; memset(iv, 0, sizeof (iv)); memset(ik, 0, sizeof (ik)); /* Gcrypt encrypt */ - err = gcry_cipher_encrypt(cipher, (unsigned char *)(ret + 1), crypted_length, NULL, 0); - if (err) goto on_error; + err = gcry_cipher_encrypt(cipher, + (unsigned char *)(ret + 1), + crypted_length, + NULL, + 0); + if (err) + goto on_error; /* Gcrypt close the cipher */ gcry_cipher_close(cipher); @@ -816,60 +986,81 @@ eet_cipher(const void *data, unsigned int size, const char *key, unsigned int le /* Openssl create the corresponding cipher AES with a 256 bit key, Cipher Block Chaining mode */ EVP_CIPHER_CTX_init(&ctx); - if (!EVP_EncryptInit_ex(&ctx, EVP_aes_256_cbc(), NULL, ik, iv)) goto on_error; + if (!EVP_EncryptInit_ex(&ctx, EVP_aes_256_cbc(), NULL, ik, iv)) + goto on_error; + opened = 1; memset(iv, 0, sizeof (iv)); memset(ik, 0, sizeof (ik)); /* Openssl encrypt */ - if (!EVP_EncryptUpdate(&ctx, (unsigned char*)(ret + 1), &tmp_len, (unsigned char*) buffer, size + sizeof (unsigned int))) - goto on_error; + if (!EVP_EncryptUpdate(&ctx, (unsigned char *)(ret + 1), &tmp_len, + (unsigned char *)buffer, size + sizeof (unsigned int))) + goto on_error; /* Openssl close the cipher */ - if (!EVP_EncryptFinal_ex(&ctx, ((unsigned char*)(ret + 1)) + tmp_len, &tmp_len)) - goto on_error; + if (!EVP_EncryptFinal_ex(&ctx, ((unsigned char *)(ret + 1)) + tmp_len, + &tmp_len)) + goto on_error; + EVP_CIPHER_CTX_cleanup(&ctx); # endif /* Set return values */ - if (result_length) *result_length = crypted_length + sizeof(unsigned int); - if (result) *result = ret; - else free(ret); + if (result_length) + *result_length = crypted_length + sizeof(unsigned int); + + if (result) + *result = ret; + else + free(ret); return EET_ERROR_NONE; - on_error: +on_error: memset(iv, 0, sizeof (iv)); memset(ik, 0, sizeof (ik)); # ifdef HAVE_GNUTLS /* Gcrypt error */ - if (opened) gcry_cipher_close(cipher); + if (opened) + gcry_cipher_close(cipher); + # else /* Openssl error */ - if (opened) EVP_CIPHER_CTX_cleanup(&ctx); + if (opened) + EVP_CIPHER_CTX_cleanup(&ctx); + # endif /* General error */ free(ret); - if (result) *result = NULL; - if (result_length) *result_length = 0; + if (result) + *result = NULL; + + if (result_length) + *result_length = 0; return EET_ERROR_ENCRYPT_FAILED; #else /* Cipher not supported */ - (void) data; - (void) size; - (void) key; - (void) length; - (void) result; - (void) result_length; + (void)data; + (void)size; + (void)key; + (void)length; + (void)result; + (void)result_length; return EET_ERROR_NOT_IMPLEMENTED; #endif } Eet_Error -eet_decipher(const void *data, unsigned int size, const char *key, unsigned int length, void **result, unsigned int *result_length) +eet_decipher(const void *data, + unsigned int size, + const char *key, + unsigned int length, + void **result, + unsigned int *result_length) { #ifdef HAVE_CIPHER const unsigned int *over = data; @@ -882,26 +1073,35 @@ eet_decipher(const void *data, unsigned int size, const char *key, unsigned int int tmp = 0; /* At least the salt and an AES block */ - if (size < sizeof(unsigned int) + 16) return EET_ERROR_BAD_OBJECT; + if (size < sizeof(unsigned int) + 16) + return EET_ERROR_BAD_OBJECT; /* Get the salt */ salt = *over; /* Generate the iv and the key with the salt */ - eet_pbkdf2_sha1(key, length, (unsigned char *)&salt, sizeof(unsigned int), 2048, key_material, MAX_KEY_LEN + MAX_IV_LEN); + eet_pbkdf2_sha1(key, + length, + (unsigned char *)&salt, + sizeof(unsigned int), + 2048, + key_material, + MAX_KEY_LEN + MAX_IV_LEN); - memcpy(iv, key_material, MAX_IV_LEN); + memcpy(iv, key_material, MAX_IV_LEN); memcpy(ik, key_material + MAX_IV_LEN, MAX_KEY_LEN); memset(key_material, 0, sizeof (key_material)); - memset(&salt, 0, sizeof (salt)); + memset(&salt, 0, sizeof (salt)); /* Align to AES block size if size is not align */ tmp_len = size - sizeof (unsigned int); - if ((tmp_len & 0x1F) != 0) goto on_error; + if ((tmp_len & 0x1F) != 0) + goto on_error; ret = malloc(tmp_len); - if (!ret) goto on_error; + if (!ret) + goto on_error; # ifdef HAVE_GNUTLS gcry_error_t err = 0; @@ -909,18 +1109,28 @@ eet_decipher(const void *data, unsigned int size, const char *key, unsigned int /* Gcrypt create the corresponding cipher */ err = gcry_cipher_open(&cipher, GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_CBC, 0); - if (err) return EET_ERROR_DECRYPT_FAILED; + if (err) + return EET_ERROR_DECRYPT_FAILED; + err = gcry_cipher_setiv(cipher, iv, MAX_IV_LEN); - if (err) goto on_error; + if (err) + goto on_error; + err = gcry_cipher_setkey(cipher, ik, MAX_KEY_LEN); - if (err) goto on_error; + if (err) + goto on_error; memset(iv, 0, sizeof (iv)); memset(ik, 0, sizeof (ik)); /* Gcrypt decrypt */ - err = gcry_cipher_decrypt(cipher, ret, tmp_len, ((unsigned int *)data) + 1, tmp_len); - if (err) goto on_error; + err = gcry_cipher_decrypt(cipher, + ret, + tmp_len, + ((unsigned int *)data) + 1, + tmp_len); + if (err) + goto on_error; /* Gcrypt close the cipher */ gcry_cipher_close(cipher); @@ -934,15 +1144,15 @@ eet_decipher(const void *data, unsigned int size, const char *key, unsigned int opened = 1; if (!EVP_DecryptInit_ex(&ctx, EVP_aes_256_cbc(), NULL, ik, iv)) - goto on_error; + goto on_error; memset(iv, 0, sizeof (iv)); memset(ik, 0, sizeof (ik)); /* Openssl decrypt */ - if (!EVP_DecryptUpdate(&ctx, (unsigned char *) ret, &tmp, - (unsigned char *) (over + 1), tmp_len)) - goto on_error; + if (!EVP_DecryptUpdate(&ctx, (unsigned char *)ret, &tmp, + (unsigned char *)(over + 1), tmp_len)) + goto on_error; /* Openssl close the cipher*/ EVP_CIPHER_CTX_cleanup(&ctx); @@ -950,42 +1160,54 @@ eet_decipher(const void *data, unsigned int size, const char *key, unsigned int /* Get the decrypted data size */ tmp = *ret; tmp = ntohl(tmp); - if (tmp > tmp_len) goto on_error; + if (tmp > tmp_len) + goto on_error; /* Update the return values */ - if (result_length) *result_length = tmp; + if (result_length) + *result_length = tmp; + if (result) { - *result = NULL; - *result = malloc(tmp); - if (!*result) - goto on_error; - memcpy(*result, ret + 1, tmp); + *result = NULL; + *result = malloc(tmp); + if (!*result) + goto on_error; + + memcpy(*result, ret + 1, tmp); } + free(ret); return EET_ERROR_NONE; - on_error: +on_error: memset(iv, 0, sizeof (iv)); memset(ik, 0, sizeof (ik)); # ifdef HAVE_GNUTLS # else - if (opened) EVP_CIPHER_CTX_cleanup(&ctx); + if (opened) + EVP_CIPHER_CTX_cleanup(&ctx); + # endif - if (result) *result = NULL; - if (result_length) *result_length = 0; - if (ret) free(ret); + if (result) + *result = NULL; + + if (result_length) + *result_length = 0; + + if (ret) + free(ret); return EET_ERROR_DECRYPT_FAILED; #else - (void) data; - (void) size; - (void) key; - (void) length; - (void) result; - (void) result_length; + (void)data; + (void)size; + (void)key; + (void)length; + (void)result; + (void)result_length; return EET_ERROR_NOT_IMPLEMENTED; #endif } @@ -996,103 +1218,106 @@ static Eet_Error eet_hmac_sha1(const void *key, size_t key_len, const void *data, size_t data_len, unsigned char *res) { - size_t hlen = gcry_md_get_algo_dlen (GCRY_MD_SHA1); - gcry_md_hd_t mdh; - unsigned char *hash; - gpg_error_t err; + size_t hlen = gcry_md_get_algo_dlen (GCRY_MD_SHA1); + gcry_md_hd_t mdh; + unsigned char *hash; + gpg_error_t err; - err = gcry_md_open(&mdh, GCRY_MD_SHA1, GCRY_MD_FLAG_HMAC); - if (err != GPG_ERR_NO_ERROR) - return 1; - - err = gcry_md_setkey(mdh, key, key_len); - if (err != GPG_ERR_NO_ERROR) - { - gcry_md_close(mdh); + err = gcry_md_open(&mdh, GCRY_MD_SHA1, GCRY_MD_FLAG_HMAC); + if (err != GPG_ERR_NO_ERROR) return 1; - } - gcry_md_write(mdh, data, data_len); + err = gcry_md_setkey(mdh, key, key_len); + if (err != GPG_ERR_NO_ERROR) + { + gcry_md_close(mdh); + return 1; + } - hash = gcry_md_read(mdh, GCRY_MD_SHA1); - if (hash == NULL) - { - gcry_md_close(mdh); - return 1; - } + gcry_md_write(mdh, data, data_len); - memcpy(res, hash, hlen); + hash = gcry_md_read(mdh, GCRY_MD_SHA1); + if (hash == NULL) + { + gcry_md_close(mdh); + return 1; + } - gcry_md_close(mdh); + memcpy(res, hash, hlen); - return 0; + gcry_md_close(mdh); + + return 0; } # endif static Eet_Error -eet_pbkdf2_sha1(const char *key, - int key_len, - const unsigned char *salt, - unsigned int salt_len, - int iter, - unsigned char *res, - int res_len) +eet_pbkdf2_sha1(const char *key, + int key_len, + const unsigned char *salt, + unsigned int salt_len, + int iter, + unsigned char *res, + int res_len) { - unsigned char digest[20]; - unsigned char tab[4]; - unsigned char *p = res; - unsigned char *buf; - unsigned long i; - int digest_len = 20; - int len = res_len; - int tmp_len; - int j, k; + unsigned char digest[20]; + unsigned char tab[4]; + unsigned char *p = res; + unsigned char *buf; + unsigned long i; + int digest_len = 20; + int len = res_len; + int tmp_len; + int j, k; # ifdef HAVE_GNUTLS # else - HMAC_CTX hctx; + HMAC_CTX hctx; # endif - buf = alloca(salt_len + 4); - if (!buf) return 1; + buf = alloca(salt_len + 4); + if (!buf) + return 1; - for (i = 1; len; len -= tmp_len, p += tmp_len, i++) - { - if (len > digest_len) tmp_len = digest_len; - else tmp_len = len; + for (i = 1; len; len -= tmp_len, p += tmp_len, i++) + { + if (len > digest_len) + tmp_len = digest_len; + else + tmp_len = len; - tab[0] = (unsigned char)(i & 0xff000000) >> 24; - tab[1] = (unsigned char)(i & 0x00ff0000) >> 16; - tab[2] = (unsigned char)(i & 0x0000ff00) >> 8; - tab[3] = (unsigned char)(i & 0x000000ff) >> 0; + tab[0] = (unsigned char)(i & 0xff000000) >> 24; + tab[1] = (unsigned char)(i & 0x00ff0000) >> 16; + tab[2] = (unsigned char)(i & 0x0000ff00) >> 8; + tab[3] = (unsigned char)(i & 0x000000ff) >> 0; # ifdef HAVE_GNUTLS - memcpy(buf, salt, salt_len); - memcpy(buf + salt_len, tab, 4); - eet_hmac_sha1(key, key_len, buf, salt_len + 4, digest); + memcpy(buf, salt, salt_len); + memcpy(buf + salt_len, tab, 4); + eet_hmac_sha1(key, key_len, buf, salt_len + 4, digest); # else - HMAC_Init(&hctx, key, key_len, EVP_sha1()); - HMAC_Update(&hctx, salt, salt_len); - HMAC_Update(&hctx, tab, 4); - HMAC_Final(&hctx, digest, NULL); + HMAC_Init(&hctx, key, key_len, EVP_sha1()); + HMAC_Update(&hctx, salt, salt_len); + HMAC_Update(&hctx, tab, 4); + HMAC_Final(&hctx, digest, NULL); # endif - memcpy(p, digest, tmp_len); + memcpy(p, digest, tmp_len); - for (j = 1; j < iter; j++) - { + for (j = 1; j < iter; j++) + { # ifdef HAVE_GNUTLS - eet_hmac_sha1(key, key_len, digest, 20, digest); + eet_hmac_sha1(key, key_len, digest, 20, digest); # else - HMAC(EVP_sha1(), key, key_len, digest, 20, digest, NULL); + HMAC(EVP_sha1(), key, key_len, digest, 20, digest, NULL); # endif - for (k = 0; k < tmp_len; k++) - p[k] ^= digest[k]; - } - } + for (k = 0; k < tmp_len; k++) + p[k] ^= digest[k]; + } + } # ifdef HAVE_GNUTLS # else - HMAC_cleanup(&hctx); + HMAC_cleanup(&hctx); # endif - return 0; + return 0; } #endif diff --git a/legacy/eet/src/lib/eet_connection.c b/legacy/eet/src/lib/eet_connection.c index 01e8f51135..fb41ff0d91 100644 --- a/legacy/eet/src/lib/eet_connection.c +++ b/legacy/eet/src/lib/eet_connection.c @@ -42,7 +42,8 @@ void *alloca (size_t); #define MAGIC_EET_DATA_PACKET 0x4270ACE1 typedef struct _Eet_Message Eet_Message; -struct _Eet_Message { +struct _Eet_Message +{ int magic; int size; }; @@ -62,21 +63,21 @@ struct _Eet_Connection EAPI Eet_Connection * eet_connection_new(Eet_Read_Cb *eet_read_cb, - Eet_Write_Cb *eet_write_cb, - const void *user_data) + Eet_Write_Cb *eet_write_cb, + const void *user_data) { Eet_Connection *conn; if (!eet_read_cb || !eet_write_cb) - return NULL; + return NULL; conn = calloc(1, sizeof (Eet_Connection)); if (!conn) - return NULL; + return NULL; conn->eet_read_cb = eet_read_cb; conn->eet_write_cb = eet_write_cb; - conn->user_data = (void*) user_data; + conn->user_data = (void *)user_data; return conn; } @@ -85,83 +86,85 @@ EAPI int eet_connection_received(Eet_Connection *conn, const void *data, size_t size) { if (!conn || !data || !size) - return size; + return size; do { - size_t copy_size; + size_t copy_size; - if (conn->size == 0) - { - const Eet_Message *msg; - size_t packet_size; + if (conn->size == 0) + { + const Eet_Message *msg; + size_t packet_size; - if (size < sizeof (Eet_Message)) - break; + if (size < sizeof (Eet_Message)) + break; - msg = data; - /* Check the magic */ - if (ntohl(msg->magic) != MAGIC_EET_DATA_PACKET) - break; + msg = data; + /* Check the magic */ + if (ntohl(msg->magic) != MAGIC_EET_DATA_PACKET) + break; - packet_size = ntohl(msg->size); - /* Message should always be under 64K */ - if (packet_size > 64 * 1024) - break; + packet_size = ntohl(msg->size); + /* Message should always be under 64K */ + if (packet_size > 64 * 1024) + break; - data = (void*) (msg + 1); - size -= sizeof (msg); - if ((size_t) packet_size <= size) - { - /* Not a partial receive, go the quick way. */ - if (!conn->eet_read_cb(data, packet_size, conn->user_data)) - break; + data = (void *)(msg + 1); + size -= sizeof (msg); + if ((size_t)packet_size <= size) + { + /* Not a partial receive, go the quick way. */ + if (!conn->eet_read_cb(data, packet_size, conn->user_data)) + break; - data = (void*) ((char *) data + packet_size); - size -= packet_size; + data = (void *)((char *)data + packet_size); + size -= packet_size; - conn->received = 0; - continue; - } + conn->received = 0; + continue; + } - conn->size = packet_size; - if (conn->allocated < conn->size) - { - void *tmp; + conn->size = packet_size; + if (conn->allocated < conn->size) + { + void *tmp; - tmp = realloc(conn->buffer, conn->size); - if (!tmp) - break; + tmp = realloc(conn->buffer, conn->size); + if (!tmp) + break; - conn->buffer = tmp; - conn->allocated = conn->size; - } - } + conn->buffer = tmp; + conn->allocated = conn->size; + } + } - /* Partial receive */ - copy_size = (conn->size - conn->received >= size) ? size : conn->size - conn->received; - memcpy((char*) conn->buffer + conn->received, data, copy_size); + /* Partial receive */ + copy_size = + (conn->size - conn->received >= + size) ? size : conn->size - conn->received; + memcpy((char *)conn->buffer + conn->received, data, copy_size); - conn->received += copy_size; - data = (void*)((char *) data + copy_size); - size -= copy_size; + conn->received += copy_size; + data = (void *)((char *)data + copy_size); + size -= copy_size; - if (conn->received == conn->size) - { - size_t data_size; + if (conn->received == conn->size) + { + size_t data_size; - data_size = conn->size; - conn->size = 0; - conn->received = 0; + data_size = conn->size; + conn->size = 0; + conn->received = 0; - /* Completed a packet. */ - if (!conn->eet_read_cb(conn->buffer, data_size, conn->user_data)) - { - /* Something goes wrong. Stop now. */ - size += data_size; - break; - } - } - } while (size > 0); + /* Completed a packet. */ + if (!conn->eet_read_cb(conn->buffer, data_size, conn->user_data)) + { + /* Something goes wrong. Stop now. */ + size += data_size; + break; + } + } + } while (size > 0); return size; } @@ -173,38 +176,48 @@ _eet_connection_raw_send(Eet_Connection *conn, void *data, int data_size) /* Message should never be above 64K */ if (data_size > 64 * 1024) - return EINA_FALSE; + return EINA_FALSE; message = alloca(data_size + sizeof (Eet_Message)); message->magic = htonl(MAGIC_EET_DATA_PACKET); message->size = htonl(data_size); - memcpy(message + 1, data, data_size); + memcpy(message + 1, data, data_size); - conn->eet_write_cb(message, data_size + sizeof (Eet_Message), conn->user_data); + conn->eet_write_cb(message, + data_size + sizeof (Eet_Message), + conn->user_data); return EINA_TRUE; } EAPI Eina_Bool -eet_connection_send(Eet_Connection *conn, Eet_Data_Descriptor *edd, const void *data_in, const char *cipher_key) +eet_connection_send(Eet_Connection *conn, + Eet_Data_Descriptor *edd, + const void *data_in, + const char *cipher_key) { void *flat_data; int data_size; Eina_Bool ret = EINA_FALSE; - flat_data = eet_data_descriptor_encode_cipher(edd, data_in, cipher_key, &data_size); + flat_data = eet_data_descriptor_encode_cipher(edd, + data_in, + cipher_key, + &data_size); if (!flat_data) - return EINA_FALSE; + return EINA_FALSE; if (_eet_connection_raw_send(conn, flat_data, data_size)) - ret = EINA_TRUE; + ret = EINA_TRUE; free(flat_data); return ret; } EAPI Eina_Bool -eet_connection_node_send(Eet_Connection *conn, Eet_Node *node, const char *cipher_key) +eet_connection_node_send(Eet_Connection *conn, + Eet_Node *node, + const char *cipher_key) { void *data; int data_size; @@ -212,10 +225,10 @@ eet_connection_node_send(Eet_Connection *conn, Eet_Node *node, const char *ciphe data = eet_data_node_encode_cipher(node, cipher_key, &data_size); if (!data) - return EINA_FALSE; + return EINA_FALSE; if (_eet_connection_raw_send(conn, data, data_size)) - ret = EINA_TRUE; + ret = EINA_TRUE; free(data); return ret; @@ -227,10 +240,10 @@ eet_connection_close(Eet_Connection *conn, Eina_Bool *on_going) void *user_data; if (!conn) - return NULL; + return NULL; if (on_going) - *on_going = conn->received == 0 ? EINA_FALSE : EINA_TRUE; + *on_going = conn->received == 0 ? EINA_FALSE : EINA_TRUE; user_data = conn->user_data; diff --git a/legacy/eet/src/lib/eet_data.c b/legacy/eet/src/lib/eet_data.c index a2d7dcec13..92bede154d 100644 --- a/legacy/eet/src/lib/eet_data.c +++ b/legacy/eet/src/lib/eet_data.c @@ -65,16 +65,16 @@ /*---*/ -typedef struct _Eet_Data_Element Eet_Data_Element; -typedef struct _Eet_Data_Basic_Type_Codec Eet_Data_Basic_Type_Codec; -typedef struct _Eet_Data_Group_Type_Codec Eet_Data_Group_Type_Codec; -typedef struct _Eet_Data_Chunk Eet_Data_Chunk; -typedef struct _Eet_Data_Stream Eet_Data_Stream; -typedef struct _Eet_Data_Descriptor_Hash Eet_Data_Descriptor_Hash; -typedef struct _Eet_Data_Encode_Hash_Info Eet_Data_Encode_Hash_Info; -typedef struct _Eet_Free Eet_Free; -typedef struct _Eet_Free_Context Eet_Free_Context; -typedef struct _Eet_Variant_Unknow Eet_Variant_Unknow; +typedef struct _Eet_Data_Element Eet_Data_Element; +typedef struct _Eet_Data_Basic_Type_Codec Eet_Data_Basic_Type_Codec; +typedef struct _Eet_Data_Group_Type_Codec Eet_Data_Group_Type_Codec; +typedef struct _Eet_Data_Chunk Eet_Data_Chunk; +typedef struct _Eet_Data_Stream Eet_Data_Stream; +typedef struct _Eet_Data_Descriptor_Hash Eet_Data_Descriptor_Hash; +typedef struct _Eet_Data_Encode_Hash_Info Eet_Data_Encode_Hash_Info; +typedef struct _Eet_Free Eet_Free; +typedef struct _Eet_Free_Context Eet_Free_Context; +typedef struct _Eet_Variant_Unknow Eet_Variant_Unknow; /*---*/ @@ -84,70 +84,80 @@ typedef struct _Eet_Variant_Unknow Eet_Variant_Unknow; */ struct _Eet_Data_Basic_Type_Codec { - int size; + int size; const char *name; - int (*get) (const Eet_Dictionary *ed, const void *src, const void *src_end, void *dest); - void *(*put) (Eet_Dictionary *ed, const void *src, int *size_ret); + int (*get)(const Eet_Dictionary *ed, const void *src, const void *src_end, + void *dest); + void *(*put)(Eet_Dictionary *ed, const void *src, int *size_ret); }; struct _Eet_Data_Group_Type_Codec { - int (*get) (Eet_Free_Context *context, const Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Chunk *echnk, int type, int group_type, void *data_in, char **p, int *size); - void (*put) (Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Stream *ds, void *data_in); + int (*get)(Eet_Free_Context *context, const Eet_Dictionary *ed, + Eet_Data_Descriptor *edd, Eet_Data_Element *ede, + Eet_Data_Chunk *echnk, + int type, int group_type, void *data_in, char **p, int *size); + void (*put)(Eet_Dictionary *ed, Eet_Data_Descriptor *edd, + Eet_Data_Element *ede, Eet_Data_Stream *ds, void *data_in); }; struct _Eet_Data_Chunk { - char *name; - int len; - int size; - int hash; - void *data; - unsigned char type; - unsigned char group_type; + char *name; + int len; + int size; + int hash; + void *data; + unsigned char type; + unsigned char group_type; }; struct _Eet_Data_Stream { void *data; - int size; - int pos; + int size; + int pos; }; struct _Eet_Data_Descriptor_Hash { - Eet_Data_Element *element; + Eet_Data_Element *element; Eet_Data_Descriptor_Hash *next; }; struct _Eet_Data_Descriptor { - const char *name; + const char *name; const Eet_Dictionary *ed; - int size; - struct { - void *(*mem_alloc) (size_t size); - void (*mem_free) (void *mem); - char *(*str_alloc) (const char *str); - char *(*str_direct_alloc) (const char *str); - void (*str_free) (const char *str); - void (*str_direct_free) (const char *str); - void *(*list_next) (void *l); - void *(*list_append) (void *l, void *d); - void *(*list_data) (void *l); - void *(*list_free) (void *l); - 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); - void (*hash_free) (void *h); - const char *(*type_get) (const void *data, Eina_Bool *unknow); - Eina_Bool (*type_set) (const char *type, void *data, Eina_Bool unknow); + int size; + struct + { + void *(*mem_alloc)(size_t size); + void (*mem_free)(void *mem); + char *(*str_alloc)(const char *str); + char *(*str_direct_alloc)(const char *str); + void (*str_free)(const char *str); + void (*str_direct_free)(const char *str); + void *(*list_next)(void *l); + void *(*list_append)(void *l, void *d); + void *(*list_data)(void *l); + void *(*list_free)(void *l); + 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); + void (*hash_free)(void *h); + const char *(*type_get)(const void *data, Eina_Bool *unknow); + Eina_Bool (*type_set)(const char *type, void *data, Eina_Bool unknow); } func; - struct { - int num; - Eet_Data_Element *set; - struct { - int size; - Eet_Data_Descriptor_Hash *buckets; + struct + { + int num; + Eet_Data_Element *set; + struct + { + int size; + Eet_Data_Descriptor_Hash *buckets; } hash; } elements; @@ -158,30 +168,30 @@ struct _Eet_Data_Descriptor struct _Eet_Data_Element { - const char *name; - const char *counter_name; - const char *directory_name_ptr; + const char *name; + const char *counter_name; + const char *directory_name_ptr; Eet_Data_Descriptor *subtype; - int offset; /* offset in bytes from the base element */ - int count; /* number of elements for a fixed array */ - int counter_offset; /* for a variable array we need the offset of the count variable */ - unsigned char type; /* EET_T_XXX */ - unsigned char group_type; /* EET_G_XXX */ + int offset; /* offset in bytes from the base element */ + int count; /* number of elements for a fixed array */ + int counter_offset; /* for a variable array we need the offset of the count variable */ + unsigned char type; /* EET_T_XXX */ + unsigned char group_type; /* EET_G_XXX */ }; struct _Eet_Data_Encode_Hash_Info { - Eet_Data_Stream *ds; - Eet_Data_Element *ede; - Eet_Dictionary *ed; + Eet_Data_Stream *ds; + Eet_Data_Element *ede; + Eet_Dictionary *ed; }; struct _Eet_Free { - int ref; - int len[256]; - int num[256]; - void **list[256]; + int ref; + int len[256]; + int num[256]; + void **list[256]; }; struct _Eet_Free_Context @@ -203,98 +213,269 @@ struct _Eet_Variant_Unknow /*---*/ -static int eet_data_get_char(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dest); -static void *eet_data_put_char(Eet_Dictionary *ed, const void *src, int *size_ret); -static int eet_data_get_short(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dest); -static void *eet_data_put_short(Eet_Dictionary *ed, const void *src, int *size_ret); -static inline int eet_data_get_int(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dest); -static void *eet_data_put_int(Eet_Dictionary *ed, const void *src, int *size_ret); -static int eet_data_get_long_long(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dest); -static void *eet_data_put_long_long(Eet_Dictionary *ed, const void *src, int *size_ret); -static int eet_data_get_float(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dest); -static void *eet_data_put_float(Eet_Dictionary *ed, const void *src, int *size_ret); -static int eet_data_get_double(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dest); -static void *eet_data_put_double(Eet_Dictionary *ed, const void *src, int *size_ret); -static int eet_data_get_f32p32(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dest); -static void *eet_data_put_f32p32(Eet_Dictionary *ed, const void *src, int *size_ret); -static int eet_data_get_f16p16(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dest); -static void *eet_data_put_f16p16(Eet_Dictionary *ed, const void *src, int *size_ret); -static int eet_data_get_f8p24(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dest); -static void *eet_data_put_f8p24(Eet_Dictionary *ed, const void *src, int *size_ret); -static inline int eet_data_get_string(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dest); -static void *eet_data_put_string(Eet_Dictionary *ed, const void *src, int *size_ret); -static int eet_data_get_istring(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dest); -static void *eet_data_put_istring(Eet_Dictionary *ed, const void *src, int *size_ret); -static int eet_data_get_null(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dest); -static void *eet_data_put_null(Eet_Dictionary *ed, const void *src, int *size_ret); +static int eet_data_get_char(const Eet_Dictionary *ed, + const void *src, + const void *src_end, + void *dest); +static void * eet_data_put_char(Eet_Dictionary *ed, + const void *src, + int *size_ret); +static int eet_data_get_short(const Eet_Dictionary *ed, + const void *src, + const void *src_end, + void *dest); +static void * eet_data_put_short(Eet_Dictionary *ed, + const void *src, + int *size_ret); +static inline int eet_data_get_int(const Eet_Dictionary *ed, + const void *src, + const void *src_end, + void *dest); +static void * eet_data_put_int(Eet_Dictionary *ed, + const void *src, + int *size_ret); +static int eet_data_get_long_long(const Eet_Dictionary *ed, + const void *src, + const void *src_end, + void *dest); +static void * eet_data_put_long_long(Eet_Dictionary *ed, + const void *src, + int *size_ret); +static int eet_data_get_float(const Eet_Dictionary *ed, + const void *src, + const void *src_end, + void *dest); +static void * eet_data_put_float(Eet_Dictionary *ed, + const void *src, + int *size_ret); +static int eet_data_get_double(const Eet_Dictionary *ed, + const void *src, + const void *src_end, + void *dest); +static void * eet_data_put_double(Eet_Dictionary *ed, + const void *src, + int *size_ret); +static int eet_data_get_f32p32(const Eet_Dictionary *ed, + const void *src, + const void *src_end, + void *dest); +static void * eet_data_put_f32p32(Eet_Dictionary *ed, + const void *src, + int *size_ret); +static int eet_data_get_f16p16(const Eet_Dictionary *ed, + const void *src, + const void *src_end, + void *dest); +static void * eet_data_put_f16p16(Eet_Dictionary *ed, + const void *src, + int *size_ret); +static int eet_data_get_f8p24(const Eet_Dictionary *ed, + const void *src, + const void *src_end, + void *dest); +static void * eet_data_put_f8p24(Eet_Dictionary *ed, + const void *src, + int *size_ret); +static inline int eet_data_get_string(const Eet_Dictionary *ed, + const void *src, + const void *src_end, + void *dest); +static void * eet_data_put_string(Eet_Dictionary *ed, + const void *src, + int *size_ret); +static int eet_data_get_istring(const Eet_Dictionary *ed, + const void *src, + const void *src_end, + void *dest); +static void * eet_data_put_istring(Eet_Dictionary *ed, + const void *src, + int *size_ret); +static int eet_data_get_null(const Eet_Dictionary *ed, + const void *src, + const void *src_end, + void *dest); +static void * eet_data_put_null(Eet_Dictionary *ed, + const void *src, + int *size_ret); -static int eet_data_get_type(const Eet_Dictionary *ed, int type, const void *src, const void *src_end, void *dest); -static void *eet_data_put_type(Eet_Dictionary *ed, int type, const void *src, int *size_ret); +static int eet_data_get_type(const Eet_Dictionary *ed, + int type, + const void *src, + const void *src_end, + void *dest); +static void * eet_data_put_type(Eet_Dictionary *ed, + int type, + const void *src, + int *size_ret); -static Eet_Node *eet_data_node_simple_type(int type, const char *name, void *dd); +static Eet_Node * eet_data_node_simple_type(int type, + const char *name, + void *dd); -static int eet_data_get_unknown(Eet_Free_Context *context, const Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Chunk *echnk, int type, int group_type, void *data_in, char **p, int *size); -static void eet_data_put_unknown(Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Stream *ds, void *data_in); -static void eet_data_put_array(Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Stream *ds, void *data_in); -static int eet_data_get_array(Eet_Free_Context *context, const Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Chunk *echnk, int type, int group_type, void *data, char **p, int *size); -static int eet_data_get_list(Eet_Free_Context *context, const Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Chunk *echnk, int type, int group_type, void *data_in, char **p, int *size); -static void eet_data_put_list(Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Stream *ds, void *data_in); -static void eet_data_put_hash(Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Stream *ds, void *data_in); -static int eet_data_get_hash(Eet_Free_Context *context, const Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Chunk *echnk, int type, int group_type, void *data, char **p, int *size); -static void eet_data_put_union(Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Stream *ds, void *data_in); -static int eet_data_get_union(Eet_Free_Context *context, const Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Chunk *echnk, int type, int group_type, void *data, char **p, int *size); -static void eet_data_put_variant(Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Stream *ds, void *data_in); -static int eet_data_get_variant(Eet_Free_Context *context, const Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Chunk *echnk, int type, int group_type, void *data, char **p, int *size); +static int eet_data_get_unknown(Eet_Free_Context *context, + const Eet_Dictionary *ed, + Eet_Data_Descriptor *edd, + Eet_Data_Element *ede, + Eet_Data_Chunk *echnk, + int type, + int group_type, + void *data_in, + char **p, + int *size); +static void eet_data_put_unknown(Eet_Dictionary *ed, + Eet_Data_Descriptor *edd, + Eet_Data_Element *ede, + Eet_Data_Stream *ds, + void *data_in); +static void eet_data_put_array(Eet_Dictionary *ed, + Eet_Data_Descriptor *edd, + Eet_Data_Element *ede, + Eet_Data_Stream *ds, + void *data_in); +static int eet_data_get_array(Eet_Free_Context *context, + const Eet_Dictionary *ed, + Eet_Data_Descriptor *edd, + Eet_Data_Element *ede, + Eet_Data_Chunk *echnk, + int type, + int group_type, + void *data, + char **p, + int *size); +static int eet_data_get_list(Eet_Free_Context *context, + const Eet_Dictionary *ed, + Eet_Data_Descriptor *edd, + Eet_Data_Element *ede, + Eet_Data_Chunk *echnk, + int type, + int group_type, + void *data_in, + char **p, + int *size); +static void eet_data_put_list(Eet_Dictionary *ed, + Eet_Data_Descriptor *edd, + Eet_Data_Element *ede, + Eet_Data_Stream *ds, + void *data_in); +static void eet_data_put_hash(Eet_Dictionary *ed, + Eet_Data_Descriptor *edd, + Eet_Data_Element *ede, + Eet_Data_Stream *ds, + void *data_in); +static int eet_data_get_hash(Eet_Free_Context *context, + const Eet_Dictionary *ed, + Eet_Data_Descriptor *edd, + Eet_Data_Element *ede, + Eet_Data_Chunk *echnk, + int type, + int group_type, + void *data, + char **p, + int *size); +static void eet_data_put_union(Eet_Dictionary *ed, + Eet_Data_Descriptor *edd, + Eet_Data_Element *ede, + Eet_Data_Stream *ds, + void *data_in); +static int eet_data_get_union(Eet_Free_Context *context, + const Eet_Dictionary *ed, + Eet_Data_Descriptor *edd, + Eet_Data_Element *ede, + Eet_Data_Chunk *echnk, + int type, + int group_type, + void *data, + char **p, + int *size); +static void eet_data_put_variant(Eet_Dictionary *ed, + Eet_Data_Descriptor *edd, + Eet_Data_Element *ede, + Eet_Data_Stream *ds, + void *data_in); +static int eet_data_get_variant(Eet_Free_Context *context, + const Eet_Dictionary *ed, + Eet_Data_Descriptor *edd, + Eet_Data_Element *ede, + Eet_Data_Chunk *echnk, + int type, + int group_type, + void *data, + char **p, + int *size); -static void eet_data_chunk_get(const Eet_Dictionary *ed, Eet_Data_Chunk *chnk, const void *src, int size); -static Eet_Data_Chunk *eet_data_chunk_new(void *data, int size, const char *name, int type, int group_type); -static void eet_data_chunk_free(Eet_Data_Chunk *chnk); +static void eet_data_chunk_get(const Eet_Dictionary *ed, + Eet_Data_Chunk *chnk, + const void *src, + int size); +static Eet_Data_Chunk * eet_data_chunk_new(void *data, + int size, + const char *name, + int type, + int group_type); +static void eet_data_chunk_free(Eet_Data_Chunk *chnk); static Eet_Data_Stream *eet_data_stream_new(void); -static void eet_data_stream_write(Eet_Data_Stream *ds, const void *data, int size); +static void eet_data_stream_write(Eet_Data_Stream *ds, + const void *data, + int size); static void eet_data_stream_free(Eet_Data_Stream *ds); -static void eet_data_chunk_put(Eet_Dictionary *ed, Eet_Data_Chunk *chnk, Eet_Data_Stream *ds); +static void eet_data_chunk_put(Eet_Dictionary *ed, + Eet_Data_Chunk *chnk, + Eet_Data_Stream *ds); -static int eet_data_descriptor_encode_hash_cb(void *hash, const char *key, void *hdata, void *fdata); -static void *_eet_data_descriptor_encode(Eet_Dictionary *ed, Eet_Data_Descriptor *edd, const void *data_in, int *size_ret); -static void *_eet_data_descriptor_decode(Eet_Free_Context *context, - const Eet_Dictionary *ed, - Eet_Data_Descriptor *edd, - const void *data_in, - int size_in); +static int eet_data_descriptor_encode_hash_cb(void *hash, + const char *key, + void *hdata, + void *fdata); +static void * _eet_data_descriptor_encode(Eet_Dictionary *ed, + Eet_Data_Descriptor *edd, + const void *data_in, + int *size_ret); +static void * _eet_data_descriptor_decode(Eet_Free_Context *context, + const Eet_Dictionary *ed, + Eet_Data_Descriptor *edd, + const void *data_in, + int size_in); /*---*/ static const Eet_Data_Basic_Type_Codec eet_basic_codec[] = { - {sizeof(char), "char", eet_data_get_char, eet_data_put_char }, - {sizeof(short), "short", eet_data_get_short, eet_data_put_short }, - {sizeof(int), "int", eet_data_get_int, eet_data_put_int }, - {sizeof(long long), "long_long", eet_data_get_long_long, eet_data_put_long_long}, - {sizeof(float), "float", eet_data_get_float, eet_data_put_float }, - {sizeof(double), "double", eet_data_get_double, eet_data_put_double }, - {sizeof(char), "uchar", eet_data_get_char, eet_data_put_char }, - {sizeof(short), "ushort", eet_data_get_short, eet_data_put_short }, - {sizeof(int), "uint", eet_data_get_int, eet_data_put_int }, - {sizeof(long long), "ulong_long", eet_data_get_long_long, eet_data_put_long_long}, - {sizeof(char *), "string", eet_data_get_string, eet_data_put_string }, - {sizeof(char *), "inlined", eet_data_get_istring, eet_data_put_istring }, - {sizeof(void *), "NULL", eet_data_get_null, eet_data_put_null }, - {sizeof(Eina_F32p32),"f32p32", eet_data_get_f32p32, eet_data_put_f32p32 }, - {sizeof(Eina_F16p16),"f16p16", eet_data_get_f16p16, eet_data_put_f16p16 }, - {sizeof(Eina_F8p24),"f8p24", eet_data_get_f8p24, eet_data_put_f8p24 } + {sizeof(char), "char", eet_data_get_char, eet_data_put_char }, + {sizeof(short), "short", eet_data_get_short, eet_data_put_short }, + {sizeof(int), "int", eet_data_get_int, eet_data_put_int }, + {sizeof(long long), "long_long", eet_data_get_long_long, + eet_data_put_long_long}, + {sizeof(float), "float", eet_data_get_float, eet_data_put_float }, + {sizeof(double), "double", eet_data_get_double, + eet_data_put_double }, + {sizeof(char), "uchar", eet_data_get_char, eet_data_put_char }, + {sizeof(short), "ushort", eet_data_get_short, eet_data_put_short }, + {sizeof(int), "uint", eet_data_get_int, eet_data_put_int }, + {sizeof(long long), "ulong_long", eet_data_get_long_long, + eet_data_put_long_long}, + {sizeof(char *), "string", eet_data_get_string, + eet_data_put_string }, + {sizeof(char *), "inlined", eet_data_get_istring, + eet_data_put_istring }, + {sizeof(void *), "NULL", eet_data_get_null, eet_data_put_null }, + {sizeof(Eina_F32p32),"f32p32", eet_data_get_f32p32, + eet_data_put_f32p32 }, + {sizeof(Eina_F16p16),"f16p16", eet_data_get_f16p16, + eet_data_put_f16p16 }, + {sizeof(Eina_F8p24),"f8p24", eet_data_get_f8p24, eet_data_put_f8p24 } }; static const Eet_Data_Group_Type_Codec eet_group_codec[] = { - { eet_data_get_unknown, eet_data_put_unknown }, - { eet_data_get_array, eet_data_put_array }, - { eet_data_get_array, eet_data_put_array }, - { eet_data_get_list, eet_data_put_list }, - { eet_data_get_hash, eet_data_put_hash }, - { eet_data_get_union, eet_data_put_union }, - { eet_data_get_variant, eet_data_put_variant } + { eet_data_get_unknown, eet_data_put_unknown }, + { eet_data_get_array, eet_data_put_array }, + { eet_data_get_array, eet_data_put_array }, + { eet_data_get_list, eet_data_put_list }, + { eet_data_get_hash, eet_data_put_hash }, + { eet_data_get_union, eet_data_put_union }, + { eet_data_get_variant, eet_data_put_variant } }; static int _eet_data_words_bigendian = -1; @@ -302,22 +483,22 @@ static int _eet_data_words_bigendian = -1; /*---*/ #define SWAP64(x) (x) = \ - ((((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)) + ((((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)) #define SWAP32(x) (x) = \ - ((((int)(x) & 0x000000ff ) << 24) |\ - (((int)(x) & 0x0000ff00 ) << 8) |\ - (((int)(x) & 0x00ff0000 ) >> 8) |\ - (((int)(x) & 0xff000000 ) >> 24)) + ((((int)(x) & 0x000000ff) << 24) | \ + (((int)(x) & 0x0000ff00) << 8) | \ + (((int)(x) & 0x00ff0000) >> 8) | \ + (((int)(x) & 0xff000000) >> 24)) #define SWAP16(x) (x) = \ - ((((short)(x) & 0x00ff ) << 8) |\ - (((short)(x) & 0xff00 ) >> 8)) + ((((short)(x) & 0x00ff) << 8) | \ + (((short)(x) & 0xff00) >> 8)) #ifdef CONV8 # undef CONV8 @@ -333,47 +514,63 @@ static int _eet_data_words_bigendian = -1; #endif #define CONV8(x) -#define CONV16(x) {if (_eet_data_words_bigendian) SWAP16(x);} -#define CONV32(x) {if (_eet_data_words_bigendian) SWAP32(x);} -#define CONV64(x) {if (_eet_data_words_bigendian) SWAP64(x);} +#define CONV16(x) {if (_eet_data_words_bigendian) {SWAP16(x); }} +#define CONV32(x) {if (_eet_data_words_bigendian) {SWAP32(x); }} +#define CONV64(x) {if (_eet_data_words_bigendian) {SWAP64(x); }} #define IS_SIMPLE_TYPE(Type) (Type > EET_T_UNKNOW && Type < EET_T_LAST) #define IS_POINTER_TYPE(Type) (Type >= EET_T_STRING && Type <= EET_T_NULL) -#define POINTER_TYPE_DECODE(Context, Ed, Edd, Ede, Echnk, Type, Data, P, Size, Label) \ - { \ - int ___r; \ - ___r = eet_data_get_unknown(Context, \ - Ed, \ - Edd, Ede, \ - Echnk, \ - Type, EET_G_UNKNOWN, \ - Data, P, Size); \ - if (!___r) goto Label; \ - } +#define POINTER_TYPE_DECODE(Context, \ + Ed, \ + Edd, \ + Ede, \ + Echnk, \ + Type, \ + Data, \ + P, \ + Size, \ + Label) \ + do { \ + int ___r; \ + ___r = eet_data_get_unknown(Context, \ + Ed, \ + Edd, Ede, \ + Echnk, \ + Type, EET_G_UNKNOWN, \ + Data, P, Size); \ + if (!___r) { goto Label; } \ + } while (0) #define STRUCT_TYPE_DECODE(Data_Ret, Context, Ed, Ede, Data, Size, Label) \ - Data_Ret = _eet_data_descriptor_decode(Context, \ - Ed, \ - Ede, \ - Data, \ - Size); \ - if (!Data_Ret) goto Label; + do { \ + Data_Ret = _eet_data_descriptor_decode(Context, \ + Ed, \ + Ede, \ + Data, \ + Size); \ + if (!Data_Ret) { goto Label; } \ + } while (0) -#define EET_I_STRING 1 << 4 -#define EET_I_INLINED_STRING 2 << 4 -#define EET_I_NULL 3 << 4 +#define EET_I_STRING 1 << 4 +#define EET_I_INLINED_STRING 2 << 4 +#define EET_I_NULL 3 << 4 #define EET_MAGIC_VARIANT 0xF1234BC /*---*/ /* CHAR TYPE */ static int -eet_data_get_char(const Eet_Dictionary *ed __UNUSED__, const void *src, const void *src_end, void *dst) +eet_data_get_char(const Eet_Dictionary *ed __UNUSED__, + const void *src, + const void *src_end, + void *dst) { char *s, *d; - if (((char *)src + sizeof(char)) > (char *)src_end) return -1; + if (((char *)src + sizeof(char)) > (char *)src_end) + return -1; + s = (char *)src; d = (char *)dst; *d = *s; @@ -387,7 +584,9 @@ eet_data_put_char(Eet_Dictionary *ed __UNUSED__, const void *src, int *size_ret) char *s, *d; d = (char *)malloc(sizeof(char)); - if (!d) return NULL; + if (!d) + return NULL; + s = (char *)src; *d = *s; CONV8(*d); @@ -397,11 +596,16 @@ eet_data_put_char(Eet_Dictionary *ed __UNUSED__, const void *src, int *size_ret) /* SHORT TYPE */ static int -eet_data_get_short(const Eet_Dictionary *ed __UNUSED__, const void *src, const void *src_end, void *dst) +eet_data_get_short(const Eet_Dictionary *ed __UNUSED__, + const void *src, + const void *src_end, + void *dst) { short *d; - if (((char *)src + sizeof(short)) > (char *)src_end) return -1; + if (((char *)src + sizeof(short)) > (char *)src_end) + return -1; + memcpy(dst, src, sizeof(short)); d = (short *)dst; CONV16(*d); @@ -409,12 +613,16 @@ eet_data_get_short(const Eet_Dictionary *ed __UNUSED__, const void *src, const v } static void * -eet_data_put_short(Eet_Dictionary *ed __UNUSED__, const void *src, int *size_ret) +eet_data_put_short(Eet_Dictionary *ed __UNUSED__, + const void *src, + int *size_ret) { short *s, *d; d = (short *)malloc(sizeof(short)); - if (!d) return NULL; + if (!d) + return NULL; + s = (short *)src; *d = *s; CONV16(*d); @@ -424,11 +632,16 @@ eet_data_put_short(Eet_Dictionary *ed __UNUSED__, const void *src, int *size_ret /* INT TYPE */ static inline int -eet_data_get_int(const Eet_Dictionary *ed __UNUSED__, const void *src, const void *src_end, void *dst) +eet_data_get_int(const Eet_Dictionary *ed __UNUSED__, + const void *src, + const void *src_end, + void *dst) { int *d; - if (((char *)src + sizeof(int)) > (char *)src_end) return -1; + if (((char *)src + sizeof(int)) > (char *)src_end) + return -1; + memcpy(dst, src, sizeof(int)); d = (int *)dst; CONV32(*d); @@ -441,7 +654,9 @@ eet_data_put_int(Eet_Dictionary *ed __UNUSED__, const void *src, int *size_ret) int *s, *d; d = (int *)malloc(sizeof(int)); - if (!d) return NULL; + if (!d) + return NULL; + s = (int *)src; *d = *s; CONV32(*d); @@ -451,11 +666,16 @@ eet_data_put_int(Eet_Dictionary *ed __UNUSED__, const void *src, int *size_ret) /* LONG LONG TYPE */ static int -eet_data_get_long_long(const Eet_Dictionary *ed __UNUSED__, const void *src, const void *src_end, void *dst) +eet_data_get_long_long(const Eet_Dictionary *ed __UNUSED__, + const void *src, + const void *src_end, + void *dst) { unsigned long long *d; - if (((char *)src + sizeof(unsigned long long)) > (char *)src_end) return -1; + if (((char *)src + sizeof(unsigned long long)) > (char *)src_end) + return -1; + memcpy(dst, src, sizeof(unsigned long long)); d = (unsigned long long *)dst; CONV64(*d); @@ -463,12 +683,16 @@ eet_data_get_long_long(const Eet_Dictionary *ed __UNUSED__, const void *src, con } static void * -eet_data_put_long_long(Eet_Dictionary *ed __UNUSED__, const void *src, int *size_ret) +eet_data_put_long_long(Eet_Dictionary *ed __UNUSED__, + const void *src, + int *size_ret) { unsigned long long *s, *d; d = (unsigned long long *)malloc(sizeof(unsigned long long)); - if (!d) return NULL; + if (!d) + return NULL; + s = (unsigned long long *)src; *d = *s; CONV64(*d); @@ -478,13 +702,16 @@ eet_data_put_long_long(Eet_Dictionary *ed __UNUSED__, const void *src, int *size /* STRING TYPE */ static inline int -eet_data_get_string_hash(const Eet_Dictionary *ed, const void *src, const void *src_end) +eet_data_get_string_hash(const Eet_Dictionary *ed, + const void *src, + const void *src_end) { if (ed) { - int idx; + int idx; - if (eet_data_get_int(ed, src, src_end, &idx) < 0) return -1; + if (eet_data_get_int(ed, src, src_end, &idx) < 0) + return -1; return eet_dictionary_string_get_hash(ed, idx); } @@ -493,7 +720,10 @@ eet_data_get_string_hash(const Eet_Dictionary *ed, const void *src, const void * } static inline int -eet_data_get_string(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dst) +eet_data_get_string(const Eet_Dictionary *ed, + const void *src, + const void *src_end, + void *dst) { char *s, **d; @@ -501,16 +731,17 @@ eet_data_get_string(const Eet_Dictionary *ed, const void *src, const void *src_e if (ed) { - const char *str; - int idx; + const char *str; + int idx; - if (eet_data_get_int(ed, src, src_end, &idx) < 0) return -1; + if (eet_data_get_int(ed, src, src_end, &idx) < 0) + return -1; str = eet_dictionary_string_get_char(ed, idx); if (str == NULL) - return -1; + return -1; - *d = (char *) str; + *d = (char *)str; return eet_dictionary_string_get_size(ed, idx); } @@ -533,23 +764,29 @@ eet_data_put_string(Eet_Dictionary *ed, const void *src, int *size_ret) if (ed) { - const char *str; - int idx; + const char *str; + int idx; - str = *((const char **) src); - if (!str) return NULL; + str = *((const char **)src); + if (!str) + return NULL; idx = eet_dictionary_string_add(ed, str); - if (idx == -1) return NULL; + if (idx == -1) + return NULL; return eet_data_put_int(ed, &idx, size_ret); } s = (char *)(*((char **)src)); - if (!s) return NULL; + if (!s) + return NULL; + len = strlen(s); d = malloc(len + 1); - if (!d) return NULL; + if (!d) + return NULL; + memcpy(d, s, len + 1); *size_ret = len + 1; return d; @@ -557,31 +794,41 @@ eet_data_put_string(Eet_Dictionary *ed, const void *src, int *size_ret) /* ALWAYS INLINED STRING TYPE */ static int -eet_data_get_istring(const Eet_Dictionary *ed __UNUSED__, const void *src, const void *src_end, void *dst) +eet_data_get_istring(const Eet_Dictionary *ed __UNUSED__, + const void *src, + const void *src_end, + void *dst) { return eet_data_get_string(NULL, src, src_end, dst); } static void * -eet_data_put_istring(Eet_Dictionary *ed __UNUSED__, const void *src, int *size_ret) +eet_data_put_istring(Eet_Dictionary *ed __UNUSED__, + const void *src, + int *size_ret) { return eet_data_put_string(NULL, src, size_ret); } /* ALWAYS NULL TYPE */ static int -eet_data_get_null(const Eet_Dictionary *ed __UNUSED__, const void *src __UNUSED__, const void *src_end __UNUSED__, void *dst) +eet_data_get_null(const Eet_Dictionary *ed __UNUSED__, + const void *src __UNUSED__, + const void *src_end __UNUSED__, + void *dst) { char **d; - d = (char**) dst; + d = (char **)dst; *d = NULL; return 1; } static void * -eet_data_put_null(Eet_Dictionary *ed __UNUSED__, const void *src __UNUSED__, int *size_ret) +eet_data_put_null(Eet_Dictionary *ed __UNUSED__, + const void *src __UNUSED__, + int *size_ret) { *size_ret = 0; return NULL; @@ -599,14 +846,17 @@ _eet_data_float_cache_get(const char *s, int len, float *d) /* fast handle of simple case 0xMp+E*/ if ((len == 6) && (s[0] == '0') && (s[1] == 'x') && (s[3] == 'p')) { - int mantisse = (s[2] >= 'a') ? (s[2] - 'a' + 10) : (s[2] - '0'); - int exponent = (s[5] - '0'); + int mantisse = (s[2] >= 'a') ? (s[2] - 'a' + 10) : (s[2] - '0'); + int exponent = (s[5] - '0'); - if (s[4] == '+') *d = (float)(mantisse << exponent); - else *d = (float)mantisse / (float)(1 << exponent); + if (s[4] == '+') + *d = (float)(mantisse << exponent); + else + *d = (float)mantisse / (float)(1 << exponent); - return 1; + return 1; } + return 0; } @@ -616,210 +866,248 @@ _eet_data_double_cache_get(const char *s, int len, double *d) /* fast handle of simple case 0xMp+E*/ if ((len == 6) && (s[0] == '0') && (s[1] == 'x') && (s[3] == 'p')) { - int mantisse = (s[2] >= 'a') ? (s[2] - 'a' + 10) : (s[2] - '0'); - int exponent = (s[5] - '0'); + int mantisse = (s[2] >= 'a') ? (s[2] - 'a' + 10) : (s[2] - '0'); + int exponent = (s[5] - '0'); - if (s[4] == '+') *d = (double)(mantisse << exponent); - else *d = (double)mantisse / (double)(1 << exponent); + if (s[4] == '+') + *d = (double)(mantisse << exponent); + else + *d = (double)mantisse / (double)(1 << exponent); - return 1; + return 1; } + return 0; } /* FLOAT TYPE */ static int -eet_data_get_float(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dst) +eet_data_get_float(const Eet_Dictionary *ed, + const void *src, + const void *src_end, + void *dst) { - float *d; - int idx; + float *d; + int idx; - d = (float *) dst; + d = (float *)dst; if (!ed) { - const char *s, *p; - long long mantisse; - long exponent; - int len; + const char *s, *p; + long long mantisse; + long exponent; + int len; s = (const char *)src; p = s; len = 0; - while ((p < (const char *)src_end) && (*p != 0)) {len++; p++;} + while ((p < (const char *)src_end) && (*p != 0)) {len++; p++; } - if (_eet_data_float_cache_get(s, len, d) != 0) return len + 1; + if (_eet_data_float_cache_get(s, len, d) != 0) + return len + 1; + + if (eina_convert_atod(s, len, &mantisse, &exponent) == EINA_FALSE) + return -1; - if (eina_convert_atod(s, len, &mantisse, &exponent) == EINA_FALSE) return -1; *d = (float)ldexp((double)mantisse, exponent); return len + 1; } - if (eet_data_get_int(ed, src, src_end, &idx) < 0) return -1; + if (eet_data_get_int(ed, src, src_end, &idx) < 0) + return -1; if (!eet_dictionary_string_get_float(ed, idx, d)) - return -1; + return -1; + return 1; } static void * eet_data_put_float(Eet_Dictionary *ed, const void *src, int *size_ret) { - char buf[128]; - int idx; + char buf[128]; + int idx; eina_convert_dtoa((double)(*(float *)src), buf); if (!ed) { - char *d; - int len; + char *d; + int len; len = strlen(buf); d = malloc(len + 1); - if (!d) return NULL; - memcpy(d, buf, len + 1); + if (!d) + return NULL; + + memcpy(d, buf, len + 1); *size_ret = len + 1; return d; } idx = eet_dictionary_string_add(ed, buf); - if (idx == -1) return NULL; + if (idx == -1) + return NULL; return eet_data_put_int(ed, &idx, size_ret); } /* DOUBLE TYPE */ static int -eet_data_get_double(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dst) +eet_data_get_double(const Eet_Dictionary *ed, + const void *src, + const void *src_end, + void *dst) { - double *d; - int idx; + double *d; + int idx; - d = (double *) dst; + d = (double *)dst; if (!ed) { - const char *s, *p; - long long mantisse = 0; - long exponent = 0; - int len; + const char *s, *p; + long long mantisse = 0; + long exponent = 0; + int len; - s = (const char *) src; + s = (const char *)src; p = s; len = 0; - while ((p < (const char *)src_end) && (*p != 0)) {len++; p++;} + while ((p < (const char *)src_end) && (*p != 0)) {len++; p++; } - if (_eet_data_double_cache_get(s, len, d) != 0) return len + 1; + if (_eet_data_double_cache_get(s, len, d) != 0) + return len + 1; - if (eina_convert_atod(s, len, &mantisse, &exponent) == EINA_FALSE) return -1; - *d = ldexp((double) mantisse, exponent); + if (eina_convert_atod(s, len, &mantisse, &exponent) == EINA_FALSE) + return -1; + + *d = ldexp((double)mantisse, exponent); return len + 1; } - if (eet_data_get_int(ed, src, src_end, &idx) < 0) return -1; + if (eet_data_get_int(ed, src, src_end, &idx) < 0) + return -1; if (!eet_dictionary_string_get_double(ed, idx, d)) - return -1; + return -1; + return 1; } static void * eet_data_put_double(Eet_Dictionary *ed, const void *src, int *size_ret) { - char buf[128]; - int idx; + char buf[128]; + int idx; eina_convert_dtoa((double)(*(double *)src), buf); if (!ed) { - char *d; - int len; + char *d; + int len; len = strlen(buf); d = malloc(len + 1); - if (!d) return NULL; - memcpy(d, buf, len + 1); + if (!d) + return NULL; + + memcpy(d, buf, len + 1); *size_ret = len + 1; return d; } idx = eet_dictionary_string_add(ed, buf); - if (idx == -1) return NULL; + if (idx == -1) + return NULL; return eet_data_put_int(ed, &idx, size_ret); } static int -eet_data_get_f32p32(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dst) +eet_data_get_f32p32(const Eet_Dictionary *ed, + const void *src, + const void *src_end, + void *dst) { Eina_F32p32 *fp; int idx; - fp = (Eina_F32p32*) dst; + fp = (Eina_F32p32 *)dst; if (!ed) { - const char *s, *p; - int len; + const char *s, *p; + int len; - s = (const char *) src; - p = s; - len = 0; - while ((p < (const char *)src_end) && (*p != 0)) { len++; p++; } + s = (const char *)src; + p = s; + len = 0; + while ((p < (const char *)src_end) && (*p != 0)) { len++; p++; } - if (!(eina_convert_atofp(s, len, fp))) - return -1; - return 1; + if (!(eina_convert_atofp(s, len, fp))) + return -1; + + return 1; } - if (eet_data_get_int(ed, src, src_end, &idx) < 0) return -1; + if (eet_data_get_int(ed, src, src_end, &idx) < 0) + return -1; if (!eet_dictionary_string_get_fp(ed, idx, fp)) - return -1; + return -1; + return 1; } static void * eet_data_put_f32p32(Eet_Dictionary *ed, const void *src, int *size_ret) { - char buf[128]; - int idx; + char buf[128]; + int idx; eina_convert_fptoa((Eina_F32p32)(*(Eina_F32p32 *)src), buf); if (!ed) { - char *d; - int len; + char *d; + int len; - len = strlen(buf); - d = malloc(len + 1); - if (!d) return NULL; - memcpy(d, buf, len + 1); - *size_ret = len + 1; + len = strlen(buf); + d = malloc(len + 1); + if (!d) + return NULL; - return d; + memcpy(d, buf, len + 1); + *size_ret = len + 1; + + return d; } idx = eet_dictionary_string_add(ed, buf); - if (idx == -1) return NULL; + if (idx == -1) + return NULL; return eet_data_put_int(ed, &idx, size_ret); } static int -eet_data_get_f16p16(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dst) +eet_data_get_f16p16(const Eet_Dictionary *ed, + const void *src, + const void *src_end, + void *dst) { Eina_F32p32 tmp; Eina_F16p16 *fp; - fp = (Eina_F16p16*) dst; + fp = (Eina_F16p16 *)dst; - if (eet_data_get_f32p32(ed, src, src_end, &tmp) < 0) return -1; + if (eet_data_get_f32p32(ed, src, src_end, &tmp) < 0) + return -1; *fp = eina_f32p32_to_f16p16(tmp); return 1; @@ -835,14 +1123,18 @@ eet_data_put_f16p16(Eet_Dictionary *ed, const void *src, int *size_ret) } static int -eet_data_get_f8p24(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dst) +eet_data_get_f8p24(const Eet_Dictionary *ed, + const void *src, + const void *src_end, + void *dst) { Eina_F32p32 tmp; Eina_F8p24 *fp; - fp = (Eina_F8p24*) dst; + fp = (Eina_F8p24 *)dst; - if (eet_data_get_f32p32(ed, src, src_end, &tmp) < 0) return -1; + if (eet_data_get_f32p32(ed, src, src_end, &tmp) < 0) + return -1; *fp = eina_f32p32_to_f8p24(tmp); return 1; @@ -858,7 +1150,11 @@ eet_data_put_f8p24(Eet_Dictionary *ed, const void *src, int *size_ret) } static inline int -eet_data_get_type(const Eet_Dictionary *ed, int type, const void *src, const void *src_end, void *dest) +eet_data_get_type(const Eet_Dictionary *ed, + int type, + const void *src, + const void *src_end, + void *dest) { int ret; @@ -878,7 +1174,8 @@ eet_data_put_type(Eet_Dictionary *ed, int type, const void *src, int *size_ret) static inline Eina_Bool eet_data_type_match(int type1, int type2) { - if (type1 == type2) return EINA_TRUE; + if (type1 == type2) + return EINA_TRUE; /* Note: All floating point type are equivalent and could be read without problem by any other floating point getter. */ @@ -889,20 +1186,22 @@ eet_data_type_match(int type1, int type2) case EET_T_F32P32: case EET_T_F16P16: case EET_T_F8P24: - switch (type2) - { - case EET_T_FLOAT: - case EET_T_DOUBLE: - case EET_T_F32P32: - case EET_T_F16P16: - case EET_T_F8P24: - return EINA_TRUE; - default: - break; - } - break; + switch (type2) + { + case EET_T_FLOAT: + case EET_T_DOUBLE: + case EET_T_F32P32: + case EET_T_F16P16: + case EET_T_F8P24: + return EINA_TRUE; + + default: + break; + } + break; + default: - break; + break; } return EINA_FALSE; @@ -923,63 +1222,73 @@ eet_data_type_match(int type1, int type2) static inline void eet_data_chunk_get(const Eet_Dictionary *ed, Eet_Data_Chunk *chnk, - const void *src, int size) + const void *src, int size) { const char *s; int ret1, ret2; - if (!src) return; - if (size <= 8) return; - if (!chnk) return; + if (!src) + return; + + if (size <= 8) + return; + + if (!chnk) + return; s = src; if (s[2] == 'K') { - if ((s[0] != 'C') || (s[1] != 'H') || (s[2] != 'K')) - return; + if ((s[0] != 'C') || (s[1] != 'H') || (s[2] != 'K')) + return; - chnk->type = (unsigned char)(s[3]); - if (chnk->type >= EET_I_LIMIT) - { - chnk->group_type = ((chnk->type - EET_I_LIMIT) & 0xF) + EET_G_UNKNOWN; - switch ((chnk->type - EET_I_LIMIT) & 0xF0) - { + chnk->type = (unsigned char)(s[3]); + if (chnk->type >= EET_I_LIMIT) + { + chnk->group_type = + ((chnk->type - EET_I_LIMIT) & 0xF) + EET_G_UNKNOWN; + switch ((chnk->type - EET_I_LIMIT) & 0xF0) + { #define EET_UNMATCH_TYPE(Type) \ - case EET_I_##Type: chnk->type = EET_T_##Type; break; + case EET_I_ ## Type: chnk->type = EET_T_ ## Type; break; - EET_UNMATCH_TYPE(STRING); - EET_UNMATCH_TYPE(INLINED_STRING); - EET_UNMATCH_TYPE(NULL); - default: - return; - } - } - else if (chnk->type > EET_T_LAST) - { - chnk->group_type = chnk->type; - chnk->type = EET_T_UNKNOW; - } - else - chnk->group_type = EET_G_UNKNOWN; - if ((chnk->type >= EET_T_LAST) || - (chnk->group_type >= EET_G_LAST)) - { - chnk->type = 0; - chnk->group_type = 0; - } - } - else - { - if ((s[0] != 'C') || (s[1] != 'H') || (s[2] != 'n') || (s[3] != 'K')) - return; + EET_UNMATCH_TYPE(STRING); + EET_UNMATCH_TYPE(INLINED_STRING); + EET_UNMATCH_TYPE(NULL); + + default: + return; + } + } + else if (chnk->type > EET_T_LAST) + { + chnk->group_type = chnk->type; + chnk->type = EET_T_UNKNOW; + } + else + chnk->group_type = EET_G_UNKNOWN; + if ((chnk->type >= EET_T_LAST) || + (chnk->group_type >= EET_G_LAST)) + { + chnk->type = 0; + chnk->group_type = 0; + } } + else if ((s[0] != 'C') || (s[1] != 'H') || (s[2] != 'n') || (s[3] != 'K')) + return; + ret1 = eet_data_get_type(ed, EET_T_INT, (s + 4), (s + size), &(chnk->size)); - if (ret1 <= 0) return; - if ((chnk->size < 0) || ((chnk->size + 8) > size)) return; + if (ret1 <= 0) + return; + + if ((chnk->size < 0) || ((chnk->size + 8) > size)) + return; + ret2 = eet_data_get_type(ed, EET_T_STRING, (s + 8), (s + size), &(chnk->name)); - if (ret2 <= 0) return; + if (ret2 <= 0) + return; chnk->len = ret2; @@ -1001,20 +1310,27 @@ eet_data_chunk_get(const Eet_Dictionary *ed, Eet_Data_Chunk *chnk, } static inline Eet_Data_Chunk * -eet_data_chunk_new(void *data, int size, const char *name, int type, int group_type) +eet_data_chunk_new(void *data, + int size, + const char *name, + int type, + int group_type) { Eet_Data_Chunk *chnk; - if (!name) return NULL; + if (!name) + return NULL; + chnk = calloc(1, sizeof(Eet_Data_Chunk)); - if (!chnk) return NULL; + if (!chnk) + return NULL; /* Note: Another security, so older eet library could read file - saved with fixed point value. */ + saved with fixed point value. */ if (type == EET_T_F32P32 || type == EET_T_F16P16 || type == EET_T_F8P24) - type = EET_T_DOUBLE; + type = EET_T_DOUBLE; chnk->name = strdup(name); chnk->len = strlen(name) + 1; @@ -1028,8 +1344,10 @@ eet_data_chunk_new(void *data, int size, const char *name, int type, int group_t static inline void eet_data_chunk_free(Eet_Data_Chunk *chnk) { - if (chnk->name) free(chnk->name); - free(chnk); + if (chnk->name) + free(chnk->name); + + free(chnk); } static inline Eet_Data_Stream * @@ -1038,21 +1356,25 @@ eet_data_stream_new(void) Eet_Data_Stream *ds; ds = calloc(1, sizeof(Eet_Data_Stream)); - if (!ds) return NULL; + if (!ds) + return NULL; + return ds; } static inline void eet_data_stream_free(Eet_Data_Stream *ds) { - if (ds->data) free(ds->data); - free(ds); + if (ds->data) + free(ds->data); + + free(ds); } static inline void eet_data_stream_flush(Eet_Data_Stream *ds) { - free(ds); + free(ds); } static inline void @@ -1062,28 +1384,32 @@ eet_data_stream_write(Eet_Data_Stream *ds, const void *data, int size) if ((ds->pos + size) > ds->size) { - ds->data = realloc(ds->data, ds->size + size + 512); - if (!ds->data) - { - ds->pos = 0; - ds->size = 0; - return; - } - ds->size = ds->size + size + 512; + ds->data = realloc(ds->data, ds->size + size + 512); + if (!ds->data) + { + ds->pos = 0; + ds->size = 0; + return; + } + + ds->size = ds->size + size + 512; } + p = ds->data; memcpy(p + ds->pos, data, size); ds->pos += size; } static void -eet_data_chunk_put(Eet_Dictionary *ed, Eet_Data_Chunk *chnk, Eet_Data_Stream *ds) +eet_data_chunk_put(Eet_Dictionary *ed, + Eet_Data_Chunk *chnk, + Eet_Data_Stream *ds) { - int *size; + int *size; void *string; - int s; - int size_ret = 0; - int string_ret = 0; + int s; + int size_ret = 0; + int string_ret = 0; unsigned char buf[4] = "CHK"; /* disable this check - it will allow empty chunks to be written. this is @@ -1095,33 +1421,35 @@ eet_data_chunk_put(Eet_Dictionary *ed, Eet_Data_Chunk *chnk, Eet_Data_Stream *ds /* eet_data_stream_write(ds, "CHnK", 4);*/ if (chnk->type != EET_T_UNKNOW) { - if (chnk->group_type != EET_G_UNKNOWN) - { - int type = EET_I_LIMIT + chnk->group_type - EET_G_UNKNOWN; + if (chnk->group_type != EET_G_UNKNOWN) + { + int type = EET_I_LIMIT + chnk->group_type - EET_G_UNKNOWN; - switch (chnk->type) - { - /* Only make sense with pointer type. */ + switch (chnk->type) + { + /* Only make sense with pointer type. */ #define EET_MATCH_TYPE(Type) \ - case EET_T_##Type: type += EET_I_##Type; break; + case EET_T_ ## Type: type += EET_I_ ## Type; break; - EET_MATCH_TYPE(STRING); - EET_MATCH_TYPE(INLINED_STRING); - EET_MATCH_TYPE(NULL); - default: - return ; - } + EET_MATCH_TYPE(STRING); + EET_MATCH_TYPE(INLINED_STRING); + EET_MATCH_TYPE(NULL); - buf[3] = type; - } - else - buf[3] = chnk->type; + default: + return; + } + + buf[3] = type; + } + else + buf[3] = chnk->type; } - else buf[3] = chnk->group_type; + else + buf[3] = chnk->group_type; string = eet_data_put_string(ed, &chnk->name, &string_ret); if (!string) - return ; + return; /* size of chunk payload data + name */ s = chnk->size + string_ret; @@ -1129,23 +1457,23 @@ eet_data_chunk_put(Eet_Dictionary *ed, Eet_Data_Chunk *chnk, Eet_Data_Stream *ds /* FIXME: If something goes wrong the resulting file will be corrupted. */ if (!size) - goto on_error; + goto on_error; - eet_data_stream_write(ds, buf, 4); + eet_data_stream_write(ds, buf, 4); /* write chunk length */ - eet_data_stream_write(ds, size, size_ret); + eet_data_stream_write(ds, size, size_ret); /* write chunk name */ - eet_data_stream_write(ds, string, string_ret); + eet_data_stream_write(ds, string, string_ret); /* write payload */ if (chnk->data) - eet_data_stream_write(ds, chnk->data, chnk->size); + eet_data_stream_write(ds, chnk->data, chnk->size); - free(string); - on_error: - free(size); + free(string); +on_error: + free(size); } /*---*/ @@ -1156,25 +1484,28 @@ _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); + 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; + Eet_Data_Element *ede; + int hash; - ede = &(edd->elements.set[i]); - hash = _eet_hash_gen((char *) ede->name, 6); - if (!edd->elements.hash.buckets[hash].element) - edd->elements.hash.buckets[hash].element = ede; - else - { - Eet_Data_Descriptor_Hash *bucket; + ede = &(edd->elements.set[i]); + hash = _eet_hash_gen((char *)ede->name, 6); + 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; - } + 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; + } } } @@ -1185,17 +1516,18 @@ _eet_descriptor_hash_free(Eet_Data_Descriptor *edd) for (i = 0; i < edd->elements.hash.size; i++) { - Eet_Data_Descriptor_Hash *bucket, *pbucket; + Eet_Data_Descriptor_Hash *bucket, *pbucket; - bucket = edd->elements.hash.buckets[i].next; - while (bucket) - { - pbucket = bucket; - bucket = bucket->next; - free(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); + if (edd->elements.hash.buckets) + free(edd->elements.hash.buckets); } static Eet_Data_Element * @@ -1203,31 +1535,40 @@ _eet_descriptor_hash_find(Eet_Data_Descriptor *edd, char *name, int hash) { Eet_Data_Descriptor_Hash *bucket; - if (hash < 0) hash = _eet_hash_gen(name, 6); - else hash &= 0x3f; - if (!edd->elements.hash.buckets[hash].element) return NULL; - /* - When we use the dictionnary as a source for chunk name, we will always - have the same pointer in name. It's a good idea to just compare pointer - instead of running strcmp on both string. - */ + if (hash < 0) + hash = _eet_hash_gen(name, 6); + else + hash &= 0x3f; + + if (!edd->elements.hash.buckets[hash].element) + return NULL; /* + When we use the dictionnary as a source for chunk name, we will always + have the same pointer in name. It's a good idea to just compare pointer + instead of running strcmp on both string. + */ + if (edd->elements.hash.buckets[hash].element->directory_name_ptr == name) - return edd->elements.hash.buckets[hash].element; + return edd->elements.hash.buckets[hash].element; + if (!strcmp(edd->elements.hash.buckets[hash].element->name, name)) { - edd->elements.hash.buckets[hash].element->directory_name_ptr = name; - return edd->elements.hash.buckets[hash].element; + edd->elements.hash.buckets[hash].element->directory_name_ptr = name; + return edd->elements.hash.buckets[hash].element; } + bucket = edd->elements.hash.buckets[hash].next; while (bucket) { - if (bucket->element->directory_name_ptr == name) return bucket->element; - if (!strcmp(bucket->element->name, name)) - { - bucket->element->directory_name_ptr = name; - return bucket->element; - } - bucket = bucket->next; + if (bucket->element->directory_name_ptr == name) + return bucket->element; + + if (!strcmp(bucket->element->name, name)) + { + bucket->element->directory_name_ptr = name; + return bucket->element; + } + + bucket = bucket->next; } return NULL; } @@ -1241,7 +1582,7 @@ _eet_mem_alloc(size_t size) static void _eet_mem_free(void *mem) { - free(mem); + free(mem); } static char * @@ -1253,14 +1594,17 @@ _eet_str_alloc(const char *str) static void _eet_str_free(const char *str) { - free((char *)str); + free((char *)str); } static Eina_Hash * _eet_eina_hash_add_alloc(Eina_Hash *hash, const char *key, void *data) { - if (!hash) hash = eina_hash_string_small_new(NULL); - if (!hash) return NULL; + if (!hash) + hash = eina_hash_string_small_new(NULL); + + if (!hash) + return NULL; eina_hash_add(hash, key, data); return hash; @@ -1269,8 +1613,11 @@ _eet_eina_hash_add_alloc(Eina_Hash *hash, const char *key, void *data) static Eina_Hash * _eet_eina_hash_direct_add_alloc(Eina_Hash *hash, const char *key, void *data) { - if (!hash) hash = eina_hash_string_small_new(NULL); - if (!hash) return NULL; + if (!hash) + hash = eina_hash_string_small_new(NULL); + + if (!hash) + return NULL; eina_hash_direct_add(hash, key, data); return hash; @@ -1290,20 +1637,25 @@ _eet_str_direct_free(const char *str __UNUSED__) static void _eet_eina_hash_foreach(void *hash, Eina_Hash_Foreach cb, void *fdata) { - if (hash) eina_hash_foreach(hash, cb, fdata); + if (hash) + eina_hash_foreach(hash, cb, fdata); } static void _eet_eina_hash_free(void *hash) { - if (hash) eina_hash_free(hash); + if (hash) + eina_hash_free(hash); } /*---*/ EAPI Eina_Bool -eet_eina_stream_data_descriptor_class_set(Eet_Data_Descriptor_Class *eddc, const char *name, int size) +eet_eina_stream_data_descriptor_class_set(Eet_Data_Descriptor_Class *eddc, + const char *name, + int size) { - if (!eddc || !name) return EINA_FALSE; + if (!eddc || !name) + return EINA_FALSE; eddc->name = name; eddc->size = size; @@ -1317,22 +1669,29 @@ eet_eina_stream_data_descriptor_class_set(Eet_Data_Descriptor_Class *eddc, const eddc->func.list_append = (void *(*)(void *, void *))eina_list_append; eddc->func.list_data = (void *(*)(void *))eina_list_data_get; eddc->func.list_free = (void *(*)(void *))eina_list_free; - eddc->func.hash_foreach = (void (*)(void *, int (*)(void *, const char *, void *, void *), void *))_eet_eina_hash_foreach; - eddc->func.hash_add = (void* (*)(void *, const char *, void *)) _eet_eina_hash_add_alloc; + eddc->func.hash_foreach = + (void (*)(void *, + int (*)(void *, const char *, void *, + void *), void *))_eet_eina_hash_foreach; + eddc->func.hash_add = + (void * (*)(void *, const char *, void *))_eet_eina_hash_add_alloc; eddc->func.hash_free = (void (*)(void *))_eet_eina_hash_free; return EINA_TRUE; } EAPI Eina_Bool -eet_eina_file_data_descriptor_class_set(Eet_Data_Descriptor_Class *eddc, const char *name, int size) +eet_eina_file_data_descriptor_class_set(Eet_Data_Descriptor_Class *eddc, + const char *name, + int size) { if (!eet_eina_stream_data_descriptor_class_set(eddc, name, size)) - return EINA_FALSE; + return EINA_FALSE; eddc->version = 2; - eddc->func.hash_add = (void* (*)(void *, const char *, void *)) _eet_eina_hash_direct_add_alloc; + eddc->func.hash_add = + (void * (*)(void *, const char *, void *))_eet_eina_hash_direct_add_alloc; eddc->func.str_direct_alloc = _eet_str_direct_alloc; eddc->func.str_direct_free = _eet_str_direct_free; @@ -1344,10 +1703,12 @@ _eet_data_descriptor_new(const Eet_Data_Descriptor_Class *eddc, int version) { Eet_Data_Descriptor *edd; - if (!eddc) return NULL; + if (!eddc) + return NULL; edd = calloc(1, sizeof (Eet_Data_Descriptor)); - if (!edd) return NULL; + if (!edd) + return NULL; edd->name = eddc->name; edd->ed = NULL; @@ -1357,13 +1718,17 @@ _eet_data_descriptor_new(const Eet_Data_Descriptor_Class *eddc, int version) 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; + edd->func.mem_alloc = eddc->func.mem_alloc; + if (eddc->func.mem_free) - edd->func.mem_free = 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; + edd->func.str_alloc = eddc->func.str_alloc; + if (eddc->func.str_free) - edd->func.str_free = 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; @@ -1374,13 +1739,14 @@ _eet_data_descriptor_new(const Eet_Data_Descriptor_Class *eddc, int version) if (eddc->version > 1 && version > 1) { - edd->func.str_direct_alloc = eddc->func.str_direct_alloc; - edd->func.str_direct_free = eddc->func.str_direct_free; + edd->func.str_direct_alloc = eddc->func.str_direct_alloc; + edd->func.str_direct_free = eddc->func.str_direct_free; } + if (eddc->version > 2) { - edd->func.type_get = eddc->func.type_get; - edd->func.type_set = eddc->func.type_set; + edd->func.type_get = eddc->func.type_get; + edd->func.type_set = eddc->func.type_set; } return edd; @@ -1388,18 +1754,25 @@ _eet_data_descriptor_new(const Eet_Data_Descriptor_Class *eddc, int version) EAPI Eet_Data_Descriptor * eet_data_descriptor_new(const char *name, - int size, - void *(*func_list_next) (void *l), - void *(*func_list_append) (void *l, void *d), - void *(*func_list_data) (void *l), - void *(*func_list_free) (void *l), - void (*func_hash_foreach) (void *h, int (*func) (void *h, const char *k, void *dt, void *fdt), void *fdt), - void *(*func_hash_add) (void *h, const char *k, void *d), - void (*func_hash_free) (void *h)) + int size, + void *(*func_list_next)(void *l), + void *(*func_list_append)(void *l, void *d), + void *(*func_list_data)(void *l), + void *(*func_list_free)(void *l), + void (*func_hash_foreach)(void *h, int (*func)( + void *h, + const + char *k, + void *dt, + void * + fdt), void *fdt), + void *(*func_hash_add)(void *h, const char *k, void *d), + void (*func_hash_free)(void *h)) { Eet_Data_Descriptor_Class eddc; - if (!name) return NULL; + if (!name) + return NULL; memset(&eddc, 0, sizeof (Eet_Data_Descriptor_Class)); @@ -1445,59 +1818,66 @@ eet_data_descriptor_file_new(const Eet_Data_Descriptor_Class *eddc) EAPI void eet_data_descriptor_free(Eet_Data_Descriptor *edd) { - if (!edd) return ; + if (!edd) + return; + _eet_descriptor_hash_free(edd); - if (edd->elements.set) free(edd->elements.set); - free(edd); + if (edd->elements.set) + free(edd->elements.set); + + free(edd); } EAPI void eet_data_descriptor_element_add(Eet_Data_Descriptor *edd, - const char *name, - int type, - int group_type, - int offset, - int count, -/* int counter_offset, */ - const char *counter_name /* FIXME: Useless should go on a major release */, - Eet_Data_Descriptor *subtype) + const char *name, + int type, + int group_type, + int offset, + int count, +/* int counter_offset, */ + const char *counter_name /* FIXME: Useless should go on a major release */, + Eet_Data_Descriptor *subtype) { Eet_Data_Element *ede; Eet_Data_Element *tmp; /* UNION, VARIANT type would not work with simple type, we need a way to map the type. */ if ((group_type == EET_G_UNION - || group_type == EET_G_VARIANT) + || group_type == EET_G_VARIANT) && (type != EET_T_UNKNOW - || subtype == NULL - || subtype->func.type_get == NULL - || subtype->func.type_set == NULL)) - return ; + || subtype == NULL + || subtype->func.type_get == NULL + || subtype->func.type_set == NULL)) + return; /* VARIANT type will only work if the map only contains EET_G_*, but not UNION, VARIANT and ARRAY. */ if (group_type == EET_G_VARIANT) { - int i; + int i; - for (i = 0; i < subtype->elements.num; ++i) - if (subtype->elements.set[i].type != EET_T_UNKNOW - && subtype->elements.set[i].group_type > EET_G_VAR_ARRAY - && subtype->elements.set[i].group_type < EET_G_UNION) - return ; + for (i = 0; i < subtype->elements.num; ++i) + if (subtype->elements.set[i].type != EET_T_UNKNOW + && subtype->elements.set[i].group_type > EET_G_VAR_ARRAY + && subtype->elements.set[i].group_type < EET_G_UNION) + return; - subtype->unified_type = EINA_TRUE; + subtype->unified_type = EINA_TRUE; } + if (subtype && subtype->unified_type && (type != EET_T_UNKNOW - || group_type < EET_G_UNION)) - return ; + || group_type < EET_G_UNION)) + return; /* Sanity check done, let allocate ! */ edd->elements.num++; tmp = realloc(edd->elements.set, edd->elements.num * sizeof(Eet_Data_Element)); - if (!tmp) return ; + if (!tmp) + return; + edd->elements.set = tmp; ede = &(edd->elements.set[edd->elements.num - 1]); ede->name = name; @@ -1511,18 +1891,26 @@ eet_data_descriptor_element_add(Eet_Data_Descriptor *edd, if (group_type > EET_G_UNKNOWN && group_type < EET_G_LAST && ((type > EET_T_UNKNOW && type < EET_T_STRING) - || (type > EET_T_NULL && type < EET_T_LAST)) + || (type > EET_T_NULL && type < EET_T_LAST)) && subtype == NULL) { - subtype = calloc(1, sizeof (Eet_Data_Descriptor)); - if (!subtype) return ; - subtype->name = "implicit"; - subtype->size = eet_basic_codec[type - 1].size; - memcpy(&subtype->func, &edd->func, sizeof(subtype->func)); + subtype = calloc(1, sizeof (Eet_Data_Descriptor)); + if (!subtype) + return; - eet_data_descriptor_element_add(subtype, eet_basic_codec[type - 1].name, type, - EET_G_UNKNOWN, 0, 0, /* 0, */NULL, NULL); - type = EET_T_UNKNOW; + subtype->name = "implicit"; + subtype->size = eet_basic_codec[type - 1].size; + memcpy(&subtype->func, &edd->func, sizeof(subtype->func)); + + eet_data_descriptor_element_add(subtype, + eet_basic_codec[type - 1].name, + type, + EET_G_UNKNOWN, + 0, + 0, + /* 0, */ NULL, + NULL); + type = EET_T_UNKNOW; } ede->type = type; @@ -1538,36 +1926,43 @@ eet_data_descriptor_element_add(Eet_Data_Descriptor *edd, } EAPI void * -eet_data_read_cipher(Eet_File *ef, Eet_Data_Descriptor *edd, const char *name, const char *cipher_key) +eet_data_read_cipher(Eet_File *ef, + Eet_Data_Descriptor *edd, + const char *name, + const char *cipher_key) { const Eet_Dictionary *ed = NULL; - const void *data = NULL; - void *data_dec; - Eet_Free_Context context; - int required_free = 0; - int size; + const void *data = NULL; + void *data_dec; + Eet_Free_Context context; + int required_free = 0; + int size; ed = eet_dictionary_get(ef); if (!cipher_key) - data = eet_read_direct(ef, name, &size); + data = eet_read_direct(ef, name, &size); + if (!data) { - required_free = 1; - data = eet_read_cipher(ef, name, &size, cipher_key); - if (!data) return NULL; + required_free = 1; + data = eet_read_cipher(ef, name, &size, cipher_key); + if (!data) + return NULL; } memset(&context, 0, sizeof (context)); data_dec = _eet_data_descriptor_decode(&context, ed, edd, data, size); if (required_free) - free((void*)data); + free((void *)data); return data_dec; } EAPI Eet_Node * -eet_data_node_read_cipher(Eet_File *ef, const char *name, const char *cipher_key) +eet_data_node_read_cipher(Eet_File *ef, + const char *name, + const char *cipher_key) { const Eet_Dictionary *ed = NULL; const void *data = NULL; @@ -1579,18 +1974,20 @@ eet_data_node_read_cipher(Eet_File *ef, const char *name, const char *cipher_key ed = eet_dictionary_get(ef); if (!cipher_key) - data = eet_read_direct(ef, name, &size); + data = eet_read_direct(ef, name, &size); + if (!data) { - required_free = 1; - data = eet_read_cipher(ef, name, &size, cipher_key); - if (!data) return NULL; + required_free = 1; + data = eet_read_cipher(ef, name, &size, cipher_key); + if (!data) + return NULL; } memset(&context, 0, sizeof (context)); result = _eet_data_descriptor_decode(&context, ed, NULL, data, size); if (required_free) - free((void*)data); + free((void *)data); return result; } @@ -1602,24 +1999,35 @@ eet_data_read(Eet_File *ef, Eet_Data_Descriptor *edd, const char *name) } EAPI int -eet_data_write_cipher(Eet_File *ef, Eet_Data_Descriptor *edd, const char *name, const char *cipher_key, const void *data, int compress) +eet_data_write_cipher(Eet_File *ef, + Eet_Data_Descriptor *edd, + const char *name, + const char *cipher_key, + const void *data, + int compress) { - Eet_Dictionary *ed; - void *data_enc; - int size; - int val; + Eet_Dictionary *ed; + void *data_enc; + int size; + int val; ed = eet_dictionary_get(ef); data_enc = _eet_data_descriptor_encode(ed, edd, data, &size); - if (!data_enc) return 0; + if (!data_enc) + return 0; + val = eet_write_cipher(ef, name, data_enc, size, compress, cipher_key); - free(data_enc); + free(data_enc); return val; } EAPI int -eet_data_write(Eet_File *ef, Eet_Data_Descriptor *edd, const char *name, const void *data, int compress) +eet_data_write(Eet_File *ef, + Eet_Data_Descriptor *edd, + const char *name, + const void *data, + int compress) { return eet_data_write_cipher(ef, edd, name, NULL, data, compress); } @@ -1639,7 +2047,7 @@ _eet_free_hash(void *data) hash ^= ptr >> 16; hash ^= ptr >> 24; -#if defined (_WIN64) || ( (! defined (_WIN32)) && (LONG_BIT != 32) ) +#if defined (_WIN64) || ((!defined (_WIN32)) && (LONG_BIT != 32)) hash ^= ptr >> 32; hash ^= ptr >> 40; hash ^= ptr >> 48; @@ -1658,19 +2066,22 @@ _eet_free_add(Eet_Free *ef, void *data) hash = _eet_free_hash(data); for (i = 0; i < ef->num[hash]; ++i) - if (ef->list[hash][i] == data) return; + if (ef->list[hash][i] == data) + return; ef->num[hash]++; if (ef->num[hash] > ef->len[hash]) { - void **tmp; + void **tmp; - tmp = realloc(ef->list[hash], (ef->len[hash] + 16) * sizeof(void*)); - if (!tmp) return ; + tmp = realloc(ef->list[hash], (ef->len[hash] + 16) * sizeof(void *)); + if (!tmp) + return; ef->len[hash] += 16; ef->list[hash] = tmp; } + ef->list[hash][ef->num[hash] - 1] = data; } static void @@ -1678,13 +2089,17 @@ _eet_free_reset(Eet_Free *ef) { int i; - if (ef->ref > 0) return ; + if (ef->ref > 0) + return; + for (i = 0; i < 256; ++i) { - ef->len[i] = 0; - ef->num[i] = 0; - if (ef->list[i]) free(ef->list[i]); - ef->list[i] = NULL; + ef->len[i] = 0; + ef->num[i] = 0; + if (ef->list[i]) + free(ef->list[i]); + + ef->list[i] = NULL; } } static void @@ -1698,10 +2113,10 @@ _eet_free_unref(Eet_Free *ef) ef->ref--; } -#define _eet_freelist_add(Ctx, Data) _eet_free_add(&Ctx->freelist, Data); -#define _eet_freelist_reset(Ctx) _eet_free_reset(&Ctx->freelist); -#define _eet_freelist_ref(Ctx) _eet_free_ref(&Ctx->freelist); -#define _eet_freelist_unref(Ctx) _eet_free_unref(&Ctx->freelist); +#define _eet_freelist_add(Ctx, Data) _eet_free_add(&Ctx->freelist, Data); +#define _eet_freelist_reset(Ctx) _eet_free_reset(&Ctx->freelist); +#define _eet_freelist_ref(Ctx) _eet_free_ref(&Ctx->freelist); +#define _eet_freelist_unref(Ctx) _eet_free_unref(&Ctx->freelist); static void _eet_freelist_free(Eet_Free_Context *context, Eet_Data_Descriptor *edd) @@ -1709,19 +2124,22 @@ _eet_freelist_free(Eet_Free_Context *context, Eet_Data_Descriptor *edd) int j; int i; - if (context->freelist.ref > 0) return; + if (context->freelist.ref > 0) + return; + for (j = 0; j < 256; ++j) - for (i = 0; i < context->freelist.num[j]; ++i) - { - if (edd) - edd->func.mem_free(context->freelist.list[j][i]); - else - free(context->freelist.list[j][i]); - } - _eet_free_reset(&context->freelist); + for (i = 0; i < context->freelist.num[j]; ++i) + { + if (edd) + edd->func.mem_free(context->freelist.list[j][i]); + else + free(context->freelist.list[j][i]); + } + _eet_free_reset(&context->freelist); } -#define _eet_freelist_list_add(Ctx, Data) _eet_free_add(&Ctx->freelist_list, Data); +#define _eet_freelist_list_add(Ctx, Data) _eet_free_add(&Ctx->freelist_list, \ + Data); #define _eet_freelist_list_reset(Ctx) _eet_free_reset(&Ctx->freelist_list); #define _eet_freelist_list_ref(Ctx) _eet_free_ref(&Ctx->freelist_list); #define _eet_freelist_list_unref(Ctx) _eet_free_unref(&Ctx->freelist_list); @@ -1732,17 +2150,20 @@ _eet_freelist_list_free(Eet_Free_Context *context, Eet_Data_Descriptor *edd) int j; int i; - if (context->freelist_list.ref > 0) return; + if (context->freelist_list.ref > 0) + return; + for (j = 0; j < 256; ++j) - for (i = 0; i < context->freelist_list.num[j]; ++i) - { - if (edd) - edd->func.list_free(*((void**)(context->freelist_list.list[j][i]))); - } - _eet_free_reset(&context->freelist_list); + for (i = 0; i < context->freelist_list.num[j]; ++i) + { + if (edd) + edd->func.list_free(*((void **)(context->freelist_list.list[j][i]))); + } + _eet_free_reset(&context->freelist_list); } -#define _eet_freelist_str_add(Ctx, Data) _eet_free_add(&Ctx->freelist_str, Data); +#define _eet_freelist_str_add(Ctx, Data) _eet_free_add(&Ctx->freelist_str, \ + Data); #define _eet_freelist_str_reset(Ctx) _eet_free_reset(&Ctx->freelist_str); #define _eet_freelist_str_ref(Ctx) _eet_free_ref(&Ctx->freelist_str); #define _eet_freelist_str_unref(Ctx) _eet_free_unref(&Ctx->freelist_str); @@ -1753,45 +2174,56 @@ _eet_freelist_str_free(Eet_Free_Context *context, Eet_Data_Descriptor *edd) int j; int i; - if (context->freelist_str.ref > 0) return; + if (context->freelist_str.ref > 0) + return; + for (j = 0; j < 256; ++j) - for (i = 0; i < context->freelist_str.num[j]; ++i) - { - if (edd) - edd->func.str_free(context->freelist_str.list[j][i]); - else - free(context->freelist_str.list[j][i]); - } + for (i = 0; i < context->freelist_str.num[j]; ++i) + { + if (edd) + edd->func.str_free(context->freelist_str.list[j][i]); + else + free(context->freelist_str.list[j][i]); + } _eet_free_reset(&context->freelist_str); } -#define _eet_freelist_direct_str_add(Ctx, Data) _eet_free_add(&Ctx->freelist_direct_str, Data); -#define _eet_freelist_direct_str_reset(Ctx) _eet_free_reset(&Ctx->freelist_direct_str); -#define _eet_freelist_direct_str_ref(Ctx) _eet_free_ref(&Ctx->freelist_direct_str); -#define _eet_freelist_direct_str_unref(Ctx) _eet_free_unref(&Ctx->freelist_direct_str); +#define _eet_freelist_direct_str_add(Ctx, Data) _eet_free_add( \ + &Ctx->freelist_direct_str, \ + Data); +#define _eet_freelist_direct_str_reset(Ctx) _eet_free_reset( \ + &Ctx->freelist_direct_str); +#define _eet_freelist_direct_str_ref(Ctx) _eet_free_ref( \ + &Ctx->freelist_direct_str); +#define _eet_freelist_direct_str_unref(Ctx) _eet_free_unref( \ + &Ctx->freelist_direct_str); static void -_eet_freelist_direct_str_free(Eet_Free_Context *context, Eet_Data_Descriptor *edd) +_eet_freelist_direct_str_free(Eet_Free_Context *context, + Eet_Data_Descriptor *edd) { int j; int i; - if (context->freelist_direct_str.ref > 0) return; + if (context->freelist_direct_str.ref > 0) + return; + for (j = 0; j < 256; ++j) - for (i = 0; i < context->freelist_direct_str.num[j]; ++i) - { - if (edd) - edd->func.str_direct_free(context->freelist_direct_str.list[j][i]); - else - free(context->freelist_direct_str.list[j][i]); - } + for (i = 0; i < context->freelist_direct_str.num[j]; ++i) + { + if (edd) + edd->func.str_direct_free(context->freelist_direct_str.list[j][i]); + else + free(context->freelist_direct_str.list[j][i]); + } _eet_free_reset(&context->freelist_direct_str); } -#define _eet_freelist_hash_add(Ctx, Data) _eet_free_add(&Ctx->freelist_hash, Data); +#define _eet_freelist_hash_add(Ctx, Data) _eet_free_add(&Ctx->freelist_hash, \ + Data); #define _eet_freelist_hash_reset(Ctx) _eet_free_reset(&Ctx->freelist_hash); -#define _eet_freelist_hash_ref(Ctx) _eet_free_ref(&Ctx->freelist_hash); -#define _eet_freelist_hash_unref(Ctx) _eet_free_unref(&Ctx->freelist_hash); +#define _eet_freelist_hash_ref(Ctx) _eet_free_ref(&Ctx->freelist_hash); +#define _eet_freelist_hash_unref(Ctx) _eet_free_unref(&Ctx->freelist_hash); static void _eet_freelist_hash_free(Eet_Free_Context *context, Eet_Data_Descriptor *edd) @@ -1799,15 +2231,17 @@ _eet_freelist_hash_free(Eet_Free_Context *context, Eet_Data_Descriptor *edd) int j; int i; - if (context->freelist_hash.ref > 0) return; + if (context->freelist_hash.ref > 0) + return; + for (j = 0; j < 256; ++j) - for (i = 0; i < context->freelist_hash.num[j]; ++i) - { - if (edd) - edd->func.hash_free(context->freelist_hash.list[j][i]); - else - free(context->freelist_hash.list[j][i]); - } + for (i = 0; i < context->freelist_hash.num[j]; ++i) + { + if (edd) + edd->func.hash_free(context->freelist_hash.list[j][i]); + else + free(context->freelist_hash.list[j][i]); + } _eet_free_reset(&context->freelist_hash); } @@ -1832,15 +2266,18 @@ _eet_freelist_all_unref(Eet_Free_Context *freelist_context) } static int -eet_data_descriptor_encode_hash_cb(void *hash __UNUSED__, const char *cipher_key, void *hdata, void *fdata) +eet_data_descriptor_encode_hash_cb(void *hash __UNUSED__, + const char *cipher_key, + void *hdata, + void *fdata) { - Eet_Dictionary *ed; - Eet_Data_Encode_Hash_Info *edehi; - Eet_Data_Stream *ds; - Eet_Data_Element *ede; - Eet_Data_Chunk *echnk; - void *data = NULL; - int size; + Eet_Dictionary *ed; + Eet_Data_Encode_Hash_Info *edehi; + Eet_Data_Stream *ds; + Eet_Data_Element *ede; + Eet_Data_Chunk *echnk; + void *data = NULL; + int size; edehi = fdata; ede = edehi->ede; @@ -1850,37 +2287,47 @@ eet_data_descriptor_encode_hash_cb(void *hash __UNUSED__, const char *cipher_key /* Store key */ data = eet_data_put_type(ed, EET_T_STRING, - &cipher_key, - &size); + &cipher_key, + &size); if (data) { - echnk = eet_data_chunk_new(data, size, ede->name, ede->type, ede->group_type); - eet_data_chunk_put(ed, echnk, ds); - eet_data_chunk_free(echnk); - free(data); - data = NULL; + echnk = eet_data_chunk_new(data, + size, + ede->name, + ede->type, + ede->group_type); + eet_data_chunk_put(ed, echnk, ds); + eet_data_chunk_free(echnk); + free(data); + data = NULL; } - EET_ASSERT(!((ede->type > EET_T_UNKNOW) && (ede->type < EET_T_STRING)), return ); + EET_ASSERT(!((ede->type > EET_T_UNKNOW) && (ede->type < EET_T_STRING)), + return ); /* Store data */ if (ede->type >= EET_T_STRING) - eet_data_put_unknown(ed, NULL, ede, ds, &hdata); + eet_data_put_unknown(ed, NULL, ede, ds, &hdata); else { - if (ede->subtype) - data = _eet_data_descriptor_encode(ed, - ede->subtype, - hdata, - &size); - if (data) - { - echnk = eet_data_chunk_new(data, size, ede->name, ede->type, ede->group_type); - eet_data_chunk_put(ed, echnk, ds); - eet_data_chunk_free(echnk); - free(data); - data = NULL; - } + if (ede->subtype) + data = _eet_data_descriptor_encode(ed, + ede->subtype, + hdata, + &size); + + if (data) + { + echnk = eet_data_chunk_new(data, + size, + ede->name, + ede->type, + ede->group_type); + eet_data_chunk_put(ed, echnk, ds); + eet_data_chunk_free(echnk); + free(data); + data = NULL; + } } return 1; @@ -1896,90 +2343,94 @@ _eet_data_dump_token_get(const char *src, int *len) int tlen = 0, tsize = 0; #define TOK_ADD(x) \ - { \ - tlen++; \ - if (tlen >= tsize) \ - { \ - tsize += 32; \ - tok = realloc(tok, tsize); \ - } \ - tok[tlen - 1] = x; \ - } + do { \ + tlen++; \ + if (tlen >= tsize) \ + { \ + tsize += 32; \ + tok = realloc(tok, tsize); \ + } \ + tok[tlen - 1] = x; \ + } while (0) for (p = src; *len > 0; p++, (*len)--) { - if (in_token) - { - if (in_quote) - { - if ((p[0] == '\"') && (p > src) && (p[-1] != '\\')) - { - in_quote = 0; - } - else if ((p[0] == '\\') && (*len > 1) && (p[1] == '\"')) - { - /* skip */ - } - else if ((p[0] == '\\') && (p > src) && (p[-1] == '\\')) - { - /* skip */ - } - else if ((p[0] == '\\') && (*len > 1) && (p[1] == 'n')) - { - /* skip */ - } - else if ((p[0] == 'n') && (p > src) && (p[-1] == '\\')) - { - TOK_ADD('\n'); - } - else - TOK_ADD(p[0]); - } - else - { - if (p[0] == '\"') in_quote = 1; - else - { - if ((isspace(p[0])) || (p[0] == ';')) /* token ends here */ - { - TOK_ADD(0); - (*len)--; - return tok; - } - else - TOK_ADD(p[0]); - } - } - } - else - { - if (!((isspace(p[0])) || (p[0] == ';'))) - { - in_token = 1; - (*len)++; - p--; - } - } + if (in_token) + { + if (in_quote) + { + if ((p[0] == '\"') && (p > src) && (p[-1] != '\\')) + in_quote = 0; + else if ((p[0] == '\\') && (*len > 1) && (p[1] == '\"')) + { +/* skip */ + } + else if ((p[0] == '\\') && (p > src) && (p[-1] == '\\')) + { +/* skip */ + } + else if ((p[0] == '\\') && (*len > 1) && (p[1] == 'n')) + { +/* skip */ + } + else if ((p[0] == 'n') && (p > src) && (p[-1] == '\\')) + TOK_ADD('\n'); + else + TOK_ADD(p[0]); + } + else + { + if (p[0] == '\"') + in_quote = 1; + else + { + if ((isspace(p[0])) || (p[0] == ';')) /* token ends here */ + { + TOK_ADD(0); + (*len)--; + return tok; + } + else + TOK_ADD(p[0]); + } + } + } + else if (!((isspace(p[0])) || (p[0] == ';'))) + { + in_token = 1; + (*len)++; + p--; + } } if (in_token) { - TOK_ADD(0); - return tok; + TOK_ADD(0); + return tok; } - if (tok) free(tok); + + if (tok) + free(tok); + return NULL; } static void -eet_data_encode(Eet_Dictionary *ed, Eet_Data_Stream *ds, void *data, const char *name, int size, int type, int group_type) +eet_data_encode(Eet_Dictionary *ed, + Eet_Data_Stream *ds, + void *data, + const char *name, + int size, + int type, + int group_type) { Eet_Data_Chunk *echnk; - if (!data) type = EET_T_NULL; + if (!data) + type = EET_T_NULL; if (group_type != EET_G_UNKNOWN) - if (type >= EET_T_LAST) - type = EET_T_UNKNOW; + if (type >= EET_T_LAST) + type = EET_T_UNKNOW; echnk = eet_data_chunk_new(data, size, name, type, group_type); eet_data_chunk_put(ed, echnk, ds); @@ -1989,9 +2440,9 @@ eet_data_encode(Eet_Dictionary *ed, Eet_Data_Stream *ds, void *data, const char static void * _eet_data_dump_encode(int parent_type, - Eet_Dictionary *ed, + Eet_Dictionary *ed, Eet_Node *node, - int *size_ret) + int *size_ret) { Eet_Data_Chunk *chnk = NULL; Eet_Data_Stream *ds; @@ -2003,187 +2454,287 @@ _eet_data_dump_encode(int parent_type, if (_eet_data_words_bigendian == -1) { - unsigned long int v; + unsigned long int v; - v = htonl(0x12345678); - if (v == 0x12345678) _eet_data_words_bigendian = 1; - else _eet_data_words_bigendian = 0; + v = htonl(0x12345678); + if (v == 0x12345678) + _eet_data_words_bigendian = 1; + else + _eet_data_words_bigendian = 0; } - if (node == NULL) return NULL; + if (node == NULL) + return NULL; ds = eet_data_stream_new(); - if (!ds) return NULL; + if (!ds) + return NULL; switch (node->type) { case EET_G_UNKNOWN: - for (n = node->values; n; n = n->next) - { - data = _eet_data_dump_encode(node->type, ed, n, &size); - if (data) - { - eet_data_stream_write(ds, data, size); - free(data); - } - } - break; + for (n = node->values; n; n = n->next) + { + data = _eet_data_dump_encode(node->type, ed, n, &size); + if (data) + { + eet_data_stream_write(ds, data, size); + free(data); + } + } + break; + case EET_G_ARRAY: case EET_G_VAR_ARRAY: - for (child_type = EET_T_NULL, n = node->values; n; n = n->next) - { - if (n->type != EET_T_NULL) - { - child_type = n->type; - break; - } - } + for (child_type = EET_T_NULL, n = node->values; n; n = n->next) + { + if (n->type != EET_T_NULL) + { + child_type = n->type; + break; + } + } - data = eet_data_put_type(ed, - EET_T_INT, - &node->count, - &size); - eet_data_encode(ed, ds, data, node->name, size, child_type, node->type); + data = eet_data_put_type(ed, + EET_T_INT, + &node->count, + &size); + eet_data_encode(ed, + ds, + data, + node->name, + size, + child_type, + node->type); - count = node->count; + count = node->count; - for (n = node->values; n; n = n->next) - { - int pos = ds->pos; + for (n = node->values; n; n = n->next) + { + int pos = ds->pos; - switch (n->type) - { - case EET_T_STRING: - case EET_T_INLINED_STRING: - data = eet_data_put_type(ed, n->type, &(n->data.value.str), &size); - if (data) eet_data_encode(ed, ds, data, node->name, size, n->type, node->type); - break; - case EET_T_NULL: - continue; - default: - data = _eet_data_dump_encode(n->type, ed, n, &size); - eet_data_encode(ed, ds, data, node->name, size, n->type, node->type); - break; - } - if (ds->pos != pos) count--; - } + switch (n->type) + { + case EET_T_STRING: + case EET_T_INLINED_STRING: + data = eet_data_put_type(ed, + n->type, + &(n->data.value.str), + &size); + if (data) + eet_data_encode(ed, + ds, + data, + node->name, + size, + n->type, + node->type); - for (; count; count--) - { - eet_data_encode(ed, ds, NULL, node->name, 0, EET_T_NULL, node->type); - } + break; - /* Array is somekind of special case, so we should embed it inside another chunk. */ - *size_ret = ds->pos; - cdata = ds->data; + case EET_T_NULL: + continue; - ds->data = NULL; - ds->size = 0; - eet_data_stream_free(ds); + default: + data = _eet_data_dump_encode(n->type, ed, n, &size); + eet_data_encode(ed, + ds, + data, + node->name, + size, + n->type, + node->type); + break; + } + if (ds->pos != pos) + count--; + } + + for (; count; count--) + { + eet_data_encode(ed, + ds, + NULL, + node->name, + 0, + EET_T_NULL, + node->type); + } + + /* Array is somekind of special case, so we should embed it inside another chunk. */ + *size_ret = ds->pos; + cdata = ds->data; + + ds->data = NULL; + ds->size = 0; + eet_data_stream_free(ds); + + return cdata; + break; - return cdata; - break; case EET_G_LIST: - for (n = node->values; n; n = n->next) - { - switch (n->type) - { - case EET_T_STRING: - case EET_T_INLINED_STRING: - data = eet_data_put_type(ed, n->type, &(n->data.value.str), &size); - if (data) eet_data_encode(ed, ds, data, node->name, size, n->type, node->type); - break; - case EET_T_NULL: - continue; - default: - data = _eet_data_dump_encode(node->type, ed, n, &size); - eet_data_encode(ed, ds, data, node->name, size, n->type, node->type); - } - } + for (n = node->values; n; n = n->next) + { + switch (n->type) + { + case EET_T_STRING: + case EET_T_INLINED_STRING: + data = eet_data_put_type(ed, + n->type, + &(n->data.value.str), + &size); + if (data) + eet_data_encode(ed, + ds, + data, + node->name, + size, + n->type, + node->type); - /* List is another somekind of special case, every chunk is embed inside a list chunk. */ - *size_ret = ds->pos; - cdata = ds->data; + break; - ds->data = NULL; - ds->size = 0; - eet_data_stream_free(ds); + case EET_T_NULL: + continue; + + default: + data = _eet_data_dump_encode(node->type, ed, n, &size); + eet_data_encode(ed, + ds, + data, + node->name, + size, + n->type, + node->type); + } + } + + /* List is another somekind of special case, every chunk is embed inside a list chunk. */ + *size_ret = ds->pos; + cdata = ds->data; + + ds->data = NULL; + ds->size = 0; + eet_data_stream_free(ds); + + return cdata; + break; - return cdata; - break; case EET_G_HASH: - if (node->key) - { - data = eet_data_put_type(ed, - EET_T_STRING, - &node->key, - &size); - eet_data_encode(ed, ds, data, node->name, size, node->type, node->type); - } - else - /* A Hash without key will not decode correctly. */ - return NULL; + if (node->key) + { + data = eet_data_put_type(ed, + EET_T_STRING, + &node->key, + &size); + eet_data_encode(ed, + ds, + data, + node->name, + size, + node->type, + node->type); + } + else + /* A Hash without key will not decode correctly. */ + return NULL; - for (n = node->values; n; n = n->next) - { - switch (n->type) - { - case EET_T_STRING: - case EET_T_INLINED_STRING: - data = eet_data_put_type(ed, n->type, &(n->data.value.str), &size); - if (data) eet_data_encode(ed, ds, data, node->name, size, n->type, node->type); - break; - case EET_T_NULL: - continue; - default: - data = _eet_data_dump_encode(node->type, ed, n, &size); - eet_data_encode(ed, ds, data, node->name, size, n->type, node->type); - } - } + for (n = node->values; n; n = n->next) + { + switch (n->type) + { + case EET_T_STRING: + case EET_T_INLINED_STRING: + data = eet_data_put_type(ed, + n->type, + &(n->data.value.str), + &size); + if (data) + eet_data_encode(ed, + ds, + data, + node->name, + size, + n->type, + node->type); - /* Hash is somekind of special case, so we should embed it inside another chunk. */ - *size_ret = ds->pos; - cdata = ds->data; + break; - eet_data_stream_flush(ds); + case EET_T_NULL: + continue; + + default: + data = _eet_data_dump_encode(node->type, ed, n, &size); + eet_data_encode(ed, + ds, + data, + node->name, + size, + n->type, + node->type); + } + } + + /* Hash is somekind of special case, so we should embed it inside another chunk. */ + *size_ret = ds->pos; + cdata = ds->data; + + eet_data_stream_flush(ds); + + return cdata; - return cdata; case EET_T_NULL: - break; + break; -#define EET_DATA_NODE_ENCODE(Eet_Type, Type) \ - case Eet_Type: \ - data = eet_data_put_type(ed, node->type, &(node->data.value.Type), &size); \ - if (data) \ - { \ - eet_data_encode(ed, ds, data, node->name, size, node->type, parent_type); \ - cdata = ds->data; \ - *size_ret = ds->pos; \ - eet_data_stream_flush(ds); \ - return cdata; \ - } \ - break; +#define EET_DATA_NODE_ENCODE(Eet_Type, Type) \ + case Eet_Type: \ + data = eet_data_put_type(ed, node->type, &(node->data.value.Type), &size); \ + if (data) \ + { \ + eet_data_encode(ed, \ + ds, \ + data, \ + node->name, \ + size, \ + node->type, \ + parent_type); \ + cdata = ds->data; \ + *size_ret = ds->pos; \ + eet_data_stream_flush(ds); \ + return cdata; \ + } \ + break; + + EET_DATA_NODE_ENCODE(EET_T_CHAR, c); + EET_DATA_NODE_ENCODE(EET_T_SHORT, s); + EET_DATA_NODE_ENCODE(EET_T_INT, i); + EET_DATA_NODE_ENCODE(EET_T_LONG_LONG, l); + EET_DATA_NODE_ENCODE(EET_T_FLOAT, f); + EET_DATA_NODE_ENCODE(EET_T_DOUBLE, d); + EET_DATA_NODE_ENCODE(EET_T_UCHAR, uc); + EET_DATA_NODE_ENCODE(EET_T_USHORT, us); + EET_DATA_NODE_ENCODE(EET_T_UINT, ui); + EET_DATA_NODE_ENCODE(EET_T_ULONG_LONG, ul); + EET_DATA_NODE_ENCODE(EET_T_INLINED_STRING, str); + EET_DATA_NODE_ENCODE(EET_T_STRING, str); - EET_DATA_NODE_ENCODE(EET_T_CHAR, c); - EET_DATA_NODE_ENCODE(EET_T_SHORT, s); - EET_DATA_NODE_ENCODE(EET_T_INT, i); - EET_DATA_NODE_ENCODE(EET_T_LONG_LONG, l); - EET_DATA_NODE_ENCODE(EET_T_FLOAT, f); - EET_DATA_NODE_ENCODE(EET_T_DOUBLE, d); - EET_DATA_NODE_ENCODE(EET_T_UCHAR, uc); - EET_DATA_NODE_ENCODE(EET_T_USHORT, us); - EET_DATA_NODE_ENCODE(EET_T_UINT, ui); - EET_DATA_NODE_ENCODE(EET_T_ULONG_LONG, ul); - EET_DATA_NODE_ENCODE(EET_T_INLINED_STRING, str); - EET_DATA_NODE_ENCODE(EET_T_STRING, str); default: - break; + break; } if ((node->type >= EET_G_UNKNOWN) && (node->type < EET_G_LAST)) - chnk = eet_data_chunk_new(ds->data, ds->pos, node->name, EET_T_UNKNOW, node->type); + chnk = eet_data_chunk_new(ds->data, + ds->pos, + node->name, + EET_T_UNKNOW, + node->type); else - chnk = eet_data_chunk_new(ds->data, ds->pos, node->name, node->type, EET_G_UNKNOWN); + chnk = eet_data_chunk_new(ds->data, + ds->pos, + node->name, + node->type, + EET_G_UNKNOWN); + eet_data_stream_flush(ds); ds = eet_data_stream_new(); @@ -2203,8 +2754,8 @@ _eet_data_dump_encode(int parent_type, static void * _eet_data_dump_parse(Eet_Dictionary *ed, int *size_ret, - const char *src, - int size) + const char *src, + int size) { void *cdata = NULL; const char *p = NULL; @@ -2220,240 +2771,262 @@ _eet_data_dump_parse(Eet_Dictionary *ed, #define TOK_GET(t) \ jump = left; t = _eet_data_dump_token_get(p, &left); p += jump - left; left = size; - for (p = src; p < (src + size);) + for (p = src; p < (src + size); ) { - char *tok1, *tok2, *tok3, *tok4; + char *tok1, *tok2, *tok3, *tok4; - TOK_GET(tok1); - if (tok1) - { - if (!strcmp(tok1, "group")) - { - TOK_GET(tok2); - if (tok2) - { - TOK_GET(tok3); - if (tok3) - { - TOK_GET(tok4); - if (tok4) - { - if (!strcmp(tok4, "{")) - { - /* we have 'group NAM TYP {' */ - n = eet_node_new(); - if (n) - { - n->parent = node; - if (!node_base) - { - node_base = n; - } - if (node) - { - /* append node */ - if (!node->values) - node->values = n; - else - { - for (nn = node->values; nn; nn = nn->next) - { - if (!nn->next) - { - nn->next = n; - break; - } - } - } - } - n->name = eina_stringshare_add(tok2); - if (!strcmp(tok3, "struct")) n->type = EET_G_UNKNOWN; - else if (!strcmp(tok3, "array")) n->type = EET_G_ARRAY; - else if (!strcmp(tok3, "var_array")) n->type = EET_G_VAR_ARRAY; - else if (!strcmp(tok3, "list")) n->type = EET_G_LIST; - else if (!strcmp(tok3, "hash")) n->type = EET_G_HASH; - else - { - ERR("ERROR: group type '%s' invalid.", tok3); - } - node = n; - } - } - free(tok4); - } - free(tok3); - } - free(tok2); - } - } - else if (!strcmp(tok1, "value")) - { - TOK_GET(tok2); - if (tok2) - { - TOK_GET(tok3); - if (tok3) - { - TOK_GET(tok4); - if (tok4) - { - /* we have 'value NAME TYP XXX' */ - if (node_base) - { - n = eet_node_new(); - if (n) - { - n->parent = node; - /* append node */ - if (!node->values) - node->values = n; - else - { - for (nn = node->values; nn; nn = nn->next) - { - if (!nn->next) - { - nn->next = n; - break; - } - } - } - n->name = eina_stringshare_add(tok2); - if (!strcmp(tok3, "char:")) - { - n->type = EET_T_CHAR; - sscanf(tok4, "%hhi", &(n->data.value.c)); - } - else if (!strcmp(tok3, "short:")) - { - n->type = EET_T_SHORT; - sscanf(tok4, "%hi", &(n->data.value.s)); - } - else if (!strcmp(tok3, "int:")) - { - n->type = EET_T_INT; - sscanf(tok4, "%i", &(n->data.value.i)); - } - else if (!strcmp(tok3, "long_long:")) - { - n->type = EET_T_LONG_LONG; - sscanf(tok4, "%lli", &(n->data.value.l)); - } - else if (!strcmp(tok3, "float:")) - { - n->type = EET_T_FLOAT; - sscanf(tok4, "%f", &(n->data.value.f)); - } - else if (!strcmp(tok3, "double:")) - { - n->type = EET_T_DOUBLE; - sscanf(tok4, "%lf", &(n->data.value.d)); - } - else if (!strcmp(tok3, "uchar:")) - { - n->type = EET_T_UCHAR; - sscanf(tok4, "%hhu", &(n->data.value.uc)); - } - else if (!strcmp(tok3, "ushort:")) - { - n->type = EET_T_USHORT; - sscanf(tok4, "%hu", &(n->data.value.us)); - } - else if (!strcmp(tok3, "uint:")) - { - n->type = EET_T_UINT; - sscanf(tok4, "%u", &(n->data.value.ui)); - } - else if (!strcmp(tok3, "ulong_long:")) - { - n->type = EET_T_ULONG_LONG; - sscanf(tok4, "%llu", &(n->data.value.ul)); - } - else if (!strcmp(tok3, "string:")) - { - n->type = EET_T_STRING; - n->data.value.str = eina_stringshare_add(tok4); - } - else if (!strcmp(tok3, "inlined:")) - { - n->type = EET_T_INLINED_STRING; - n->data.value.str = eina_stringshare_add(tok4); - } - else if (!strcmp(tok3, "null")) - { - n->type = EET_T_NULL; - n->data.value.str = NULL; - } - else - { - ERR("ERROR: value type '%s' invalid.", tok4); - } - } - } - free(tok4); - } - free(tok3); - } - free(tok2); - } - } - else if (!strcmp(tok1, "key")) - { - TOK_GET(tok2); - if (tok2) - { - /* we have 'key NAME' */ - if (node) - { - node->key = eina_stringshare_add(tok2); - } - free(tok2); - } - } - else if (!strcmp(tok1, "count")) - { - TOK_GET(tok2); - if (tok2) - { - /* we have a 'count COUNT' */ - if (node) - { - sscanf(tok2, "%i", &(node->count)); - } - free(tok2); - } - } - else if (!strcmp(tok1, "}")) - { - /* we have an end of the group */ - if (node) node = node->parent; - } - free(tok1); - } + TOK_GET(tok1); + if (tok1) + { + if (!strcmp(tok1, "group")) + { + TOK_GET(tok2); + if (tok2) + { + TOK_GET(tok3); + if (tok3) + { + TOK_GET(tok4); + if (tok4) + { + if (!strcmp(tok4, "{")) + { +/* we have 'group NAM TYP {' */ + n = eet_node_new(); + if (n) + { + n->parent = node; + if (!node_base) + node_base = n; + + if (node) + { +/* append node */ + if (!node->values) + node->values = n; + else + for (nn = node->values; nn; + nn = nn->next) + { + if (!nn->next) + { + nn->next = n; + break; + } + } + } + + n->name = eina_stringshare_add(tok2); + if (!strcmp(tok3, "struct")) + n->type = EET_G_UNKNOWN; + else if (!strcmp(tok3, "array")) + n->type = EET_G_ARRAY; + else if (!strcmp(tok3, "var_array")) + n->type = EET_G_VAR_ARRAY; + else if (!strcmp(tok3, "list")) + n->type = EET_G_LIST; + else if (!strcmp(tok3, "hash")) + n->type = EET_G_HASH; + else + ERR( + "ERROR: group type '%s' invalid.", + tok3); + + node = n; + } + } + + free(tok4); + } + + free(tok3); + } + + free(tok2); + } + } + else if (!strcmp(tok1, "value")) + { + TOK_GET(tok2); + if (tok2) + { + TOK_GET(tok3); + if (tok3) + { + TOK_GET(tok4); + if (tok4) + { +/* we have 'value NAME TYP XXX' */ + if (node_base) + { + n = eet_node_new(); + if (n) + { + n->parent = node; +/* append node */ + if (!node->values) + node->values = n; + else + for (nn = node->values; nn; + nn = nn->next) + { + if (!nn->next) + { + nn->next = n; + break; + } + } + + n->name = eina_stringshare_add(tok2); + if (!strcmp(tok3, "char:")) + { + n->type = EET_T_CHAR; + sscanf(tok4, "%hhi", + &(n->data.value.c)); + } + else if (!strcmp(tok3, "short:")) + { + n->type = EET_T_SHORT; + sscanf(tok4, "%hi", + &(n->data.value.s)); + } + else if (!strcmp(tok3, "int:")) + { + n->type = EET_T_INT; + sscanf(tok4, "%i", + &(n->data.value.i)); + } + else if (!strcmp(tok3, "long_long:")) + { + n->type = EET_T_LONG_LONG; + sscanf(tok4, "%lli", + &(n->data.value.l)); + } + else if (!strcmp(tok3, "float:")) + { + n->type = EET_T_FLOAT; + sscanf(tok4, "%f", + &(n->data.value.f)); + } + else if (!strcmp(tok3, "double:")) + { + n->type = EET_T_DOUBLE; + sscanf(tok4, "%lf", + &(n->data.value.d)); + } + else if (!strcmp(tok3, "uchar:")) + { + n->type = EET_T_UCHAR; + sscanf(tok4, "%hhu", + &(n->data.value.uc)); + } + else if (!strcmp(tok3, "ushort:")) + { + n->type = EET_T_USHORT; + sscanf(tok4, "%hu", + &(n->data.value.us)); + } + else if (!strcmp(tok3, "uint:")) + { + n->type = EET_T_UINT; + sscanf(tok4, "%u", + &(n->data.value.ui)); + } + else if (!strcmp(tok3, "ulong_long:")) + { + n->type = EET_T_ULONG_LONG; + sscanf(tok4, "%llu", + &(n->data.value.ul)); + } + else if (!strcmp(tok3, "string:")) + { + n->type = EET_T_STRING; + n->data.value.str = + eina_stringshare_add(tok4); + } + else if (!strcmp(tok3, "inlined:")) + { + n->type = EET_T_INLINED_STRING; + n->data.value.str = + eina_stringshare_add(tok4); + } + else if (!strcmp(tok3, "null")) + { + n->type = EET_T_NULL; + n->data.value.str = NULL; + } + else + ERR( + "ERROR: value type '%s' invalid.", + tok4); + } + } + + free(tok4); + } + + free(tok3); + } + + free(tok2); + } + } + else if (!strcmp(tok1, "key")) + { + TOK_GET(tok2); + if (tok2) + { +/* we have 'key NAME' */ + if (node) + node->key = eina_stringshare_add(tok2); + + free(tok2); + } + } + else if (!strcmp(tok1, "count")) + { + TOK_GET(tok2); + if (tok2) + { +/* we have a 'count COUNT' */ + if (node) + sscanf(tok2, "%i", &(node->count)); + + free(tok2); + } + } + else if (!strcmp(tok1, "}")) + /* we have an end of the group */ + if (node) + node = node->parent; + + free(tok1); + } } if (node_base) { - cdata = _eet_data_dump_encode(EET_G_UNKNOWN, ed, node_base, size_ret); - eet_node_del(node_base); + cdata = _eet_data_dump_encode(EET_G_UNKNOWN, ed, node_base, size_ret); + eet_node_del(node_base); } + return cdata; } #define NEXT_CHUNK(P, Size, Echnk, Ed) \ - { \ - int tmp; \ - tmp = Ed ? (int) (sizeof(int) * 2) : Echnk.len + 4;\ - P += (4 + Echnk.size + tmp); \ - Size -= (4 + Echnk.size + tmp); \ - } + { \ + int tmp; \ + tmp = Ed ? (int)(sizeof(int) * 2) : Echnk.len + 4; \ + P += (4 + Echnk.size + tmp); \ + Size -= (4 + Echnk.size + tmp); \ + } static void * _eet_data_descriptor_decode(Eet_Free_Context *context, - const Eet_Dictionary *ed, + const Eet_Dictionary *ed, Eet_Data_Descriptor *edd, - const void *data_in, - int size_in) + const void *data_in, + int size_in) { Eet_Node *result = NULL; void *data = NULL; @@ -2463,164 +3036,196 @@ _eet_data_descriptor_decode(Eet_Free_Context *context, if (_eet_data_words_bigendian == -1) { - unsigned long int v; + unsigned long int v; - v = htonl(0x12345678); - if (v == 0x12345678) _eet_data_words_bigendian = 1; - else _eet_data_words_bigendian = 0; + v = htonl(0x12345678); + if (v == 0x12345678) + _eet_data_words_bigendian = 1; + else + _eet_data_words_bigendian = 0; } if (edd) { - data = edd->func.mem_alloc(edd->size); - if (!data) return NULL; - if (edd->ed != ed) - { - for (i = 0; i < edd->elements.num; i++) - edd->elements.set[i].directory_name_ptr = NULL; - edd->ed = ed; - } + data = edd->func.mem_alloc(edd->size); + if (!data) + return NULL; + + if (edd->ed != ed) + { + for (i = 0; i < edd->elements.num; i++) + edd->elements.set[i].directory_name_ptr = NULL; + edd->ed = ed; + } } + _eet_freelist_all_ref(context); - if (data) _eet_freelist_add(context, data); + if (data) + _eet_freelist_add(context, data); + memset(&chnk, 0, sizeof(Eet_Data_Chunk)); eet_data_chunk_get(ed, &chnk, data_in, size_in); - if (!chnk.name) goto error; + if (!chnk.name) + goto error; + if (edd) - { - if (strcmp(chnk.name, edd->name)) goto error; - } + if (strcmp(chnk.name, edd->name)) + goto error; + p = chnk.data; if (ed) - size = size_in - (4 + sizeof(int) * 2); + size = size_in - (4 + sizeof(int) * 2); else - size = size_in - (4 + 4 + chnk.len); + size = size_in - (4 + 4 + chnk.len); + if (edd) { - if (!edd->elements.hash.buckets) _eet_descriptor_hash_new(edd); + if (!edd->elements.hash.buckets) + _eet_descriptor_hash_new(edd); } else { - switch (chnk.group_type) - { - case EET_G_UNKNOWN: - switch (chnk.type) - { - case EET_T_STRING: - return eet_node_string_new(chnk.name, chnk.data); - case EET_T_INLINED_STRING: - return eet_node_inlined_string_new(chnk.name, chnk.data); - case EET_T_NULL: - return eet_node_null_new(chnk.name); - default: - result = eet_node_struct_new(chnk.name, NULL); - } - break; - case EET_G_VAR_ARRAY: - return eet_node_var_array_new(chnk.name, NULL); - case EET_G_LIST: - case EET_G_HASH: - case EET_G_ARRAY: - case EET_G_UNION: - case EET_G_VARIANT: - default: - goto error; - } + switch (chnk.group_type) + { + case EET_G_UNKNOWN: + switch (chnk.type) + { + case EET_T_STRING: + return eet_node_string_new(chnk.name, chnk.data); + + case EET_T_INLINED_STRING: + return eet_node_inlined_string_new(chnk.name, chnk.data); + + case EET_T_NULL: + return eet_node_null_new(chnk.name); + + default: + result = eet_node_struct_new(chnk.name, NULL); + } + break; + + case EET_G_VAR_ARRAY: + return eet_node_var_array_new(chnk.name, NULL); + + case EET_G_LIST: + case EET_G_HASH: + case EET_G_ARRAY: + case EET_G_UNION: + case EET_G_VARIANT: + default: + goto error; + } } + while (size > 0) { - Eet_Data_Chunk echnk; - Eet_Data_Element *ede = NULL; - Eet_Node *child = NULL; - int group_type = EET_G_UNKNOWN, type = EET_T_UNKNOW; - int ret = 0; + Eet_Data_Chunk echnk; + Eet_Data_Element *ede = NULL; + Eet_Node *child = NULL; + int group_type = EET_G_UNKNOWN, type = EET_T_UNKNOW; + int ret = 0; - /* get next data chunk */ - memset(&echnk, 0, sizeof(Eet_Data_Chunk)); - eet_data_chunk_get(ed, &echnk, p, size); - if (!echnk.name) goto error; - /* FIXME: don't REPLY on edd - work without */ - if (edd) - { - ede = _eet_descriptor_hash_find(edd, echnk.name, echnk.hash); - if (ede) - { - group_type = ede->group_type; - type = ede->type; - if ((echnk.type == 0) && (echnk.group_type == 0)) - { - type = ede->type; - group_type = ede->group_type; - } - else - { - if (IS_SIMPLE_TYPE(echnk.type) && - eet_data_type_match(echnk.type, ede->type)) - /* Needed when converting on the fly from FP to Float */ - type = ede->type; - else if ((echnk.group_type > EET_G_UNKNOWN) && - (echnk.group_type < EET_G_LAST) && - (echnk.group_type == ede->group_type)) - group_type = echnk.group_type; - } - } - } - /*...... dump to node */ - else - { - type = echnk.type; - group_type = echnk.group_type; - } + /* get next data chunk */ + memset(&echnk, 0, sizeof(Eet_Data_Chunk)); + eet_data_chunk_get(ed, &echnk, p, size); + if (!echnk.name) + goto error; /* FIXME: don't REPLY on edd - work without */ - if (!edd && group_type == EET_G_UNKNOWN && IS_SIMPLE_TYPE(type)) - { - unsigned char dd[128]; + if (edd) + { + ede = _eet_descriptor_hash_find(edd, echnk.name, echnk.hash); + if (ede) + { + group_type = ede->group_type; + type = ede->type; + if ((echnk.type == 0) && (echnk.group_type == 0)) + { + type = ede->type; + group_type = ede->group_type; + } + else + { + if (IS_SIMPLE_TYPE(echnk.type) && + eet_data_type_match(echnk.type, ede->type)) +/* Needed when converting on the fly from FP to Float */ + type = ede->type; + else if ((echnk.group_type > EET_G_UNKNOWN) && + (echnk.group_type < EET_G_LAST) && + (echnk.group_type == ede->group_type)) + group_type = echnk.group_type; + } + } + } + /*...... dump to node */ + else + { + type = echnk.type; + group_type = echnk.group_type; + } - ret = eet_data_get_type(ed, - type, - echnk.data, - ((char *)echnk.data) + echnk.size, - dd); - if (ret <= 0) goto error; + if (!edd && group_type == EET_G_UNKNOWN && IS_SIMPLE_TYPE(type)) + { + unsigned char dd[128]; - child = eet_data_node_simple_type(type, echnk.name, dd); + ret = eet_data_get_type(ed, + type, + echnk.data, + ((char *)echnk.data) + echnk.size, + dd); + if (ret <= 0) + goto error; - eet_node_struct_append(result, echnk.name, child); - } - else - { - ret = eet_group_codec[group_type - 100].get(context, - ed, edd, ede, &echnk, - type, group_type, ede ? (void*) (((char *)data) + ede->offset) : (void**) &result, - &p, &size); + child = eet_data_node_simple_type(type, echnk.name, dd); - if (ret <= 0) goto error; - } + eet_node_struct_append(result, echnk.name, child); + } + else + { + ret = eet_group_codec[group_type - 100].get( + context, + ed, + edd, + ede, + &echnk, + type, + group_type, + ede ? (void *)(((char + *) + data) + + ede-> + offset) + : (void **)&result, + &p, + &size); - /* advance to next chunk */ + if (ret <= 0) + goto error; + } + + /* advance to next chunk */ NEXT_CHUNK(p, size, echnk, ed); } _eet_freelist_all_unref(context); if (!edd) { - _eet_freelist_str_free(context, edd); - _eet_freelist_direct_str_free(context, edd); - _eet_freelist_list_free(context, edd); - _eet_freelist_hash_free(context, edd); - _eet_freelist_free(context, edd); + _eet_freelist_str_free(context, edd); + _eet_freelist_direct_str_free(context, edd); + _eet_freelist_list_free(context, edd); + _eet_freelist_hash_free(context, edd); + _eet_freelist_free(context, edd); } else { - _eet_freelist_reset(context); - _eet_freelist_str_reset(context); - _eet_freelist_list_reset(context); - _eet_freelist_hash_reset(context); - _eet_freelist_direct_str_reset(context); + _eet_freelist_reset(context); + _eet_freelist_str_reset(context); + _eet_freelist_list_reset(context); + _eet_freelist_hash_reset(context); + _eet_freelist_direct_str_reset(context); } if (!edd) - return result; + return result; return data; @@ -2639,9 +3244,16 @@ error: } static int -eet_data_get_list(Eet_Free_Context *context, const Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Chunk *echnk, - int type, int group_type __UNUSED__, void *data, - char **p, int *size) +eet_data_get_list(Eet_Free_Context *context, + const Eet_Dictionary *ed, + Eet_Data_Descriptor *edd, + Eet_Data_Element *ede, + Eet_Data_Chunk *echnk, + int type, + int group_type __UNUSED__, + void *data, + char **p, + int *size) { Eet_Data_Descriptor *subtype = NULL; void *list = NULL; @@ -2652,10 +3264,10 @@ eet_data_get_list(Eet_Free_Context *context, const Eet_Dictionary *ed, Eet_Data_ if (edd) { - subtype = ede->subtype; + subtype = ede->subtype; - if (type != ede->type) - return 0; + if (type != ede->type) + return 0; } ptr = (void **)data; @@ -2663,35 +3275,51 @@ eet_data_get_list(Eet_Free_Context *context, const Eet_Dictionary *ed, Eet_Data_ data_ret = NULL; if (IS_POINTER_TYPE(type)) - { - POINTER_TYPE_DECODE(context, ed, edd, ede, echnk, type, &data_ret, p, size, on_error); - } + POINTER_TYPE_DECODE(context, + ed, + edd, + ede, + echnk, + type, + &data_ret, + p, + size, + on_error); else - { - STRUCT_TYPE_DECODE(data_ret, context, ed, subtype, echnk->data, echnk->size, on_error); - } + STRUCT_TYPE_DECODE(data_ret, + context, + ed, + subtype, + echnk->data, + echnk->size, + on_error); if (edd) { - list = edd->func.list_append(list, data_ret); - *ptr = list; - _eet_freelist_list_add(context, ptr); + list = edd->func.list_append(list, data_ret); + *ptr = list; + _eet_freelist_list_add(context, ptr); } else - { - eet_node_list_append(*((Eet_Node**) data), echnk->name, data_ret); - } + eet_node_list_append(*((Eet_Node **)data), echnk->name, data_ret); return 1; - on_error: +on_error: return 0; } static int -eet_data_get_hash(Eet_Free_Context *context, const Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Chunk *echnk, - int type, int group_type __UNUSED__, void *data, - char **p, int *size) +eet_data_get_hash(Eet_Free_Context *context, + const Eet_Dictionary *ed, + Eet_Data_Descriptor *edd, + Eet_Data_Element *ede, + Eet_Data_Chunk *echnk, + int type, + int group_type __UNUSED__, + void *data, + char **p, + int *size) { void **ptr; void *hash = NULL; @@ -2706,11 +3334,12 @@ eet_data_get_hash(Eet_Free_Context *context, const Eet_Dictionary *ed, Eet_Data_ /* Read key */ ret = eet_data_get_type(ed, - EET_T_STRING, - echnk->data, - ((char *)echnk->data) + echnk->size, - &key); - if (ret <= 0) goto on_error; + EET_T_STRING, + echnk->data, + ((char *)echnk->data) + echnk->size, + &key); + if (ret <= 0) + goto on_error; /* Advance to next chunk */ NEXT_CHUNK((*p), (*size), (*echnk), ed); @@ -2718,31 +3347,41 @@ eet_data_get_hash(Eet_Free_Context *context, const Eet_Dictionary *ed, Eet_Data_ /* Read value */ eet_data_chunk_get(ed, echnk, *p, *size); - if (!echnk->name) goto on_error; + if (!echnk->name) + goto on_error; if (IS_POINTER_TYPE(echnk->type)) - { - POINTER_TYPE_DECODE(context, ed, edd, ede, echnk, echnk->type, &data_ret, p, size, on_error); - } + POINTER_TYPE_DECODE(context, + ed, + edd, + ede, + echnk, + echnk->type, + &data_ret, + p, + size, + on_error); else - { - STRUCT_TYPE_DECODE(data_ret, context, ed, ede ? ede->subtype : NULL, echnk->data, echnk->size, on_error); - } + STRUCT_TYPE_DECODE(data_ret, + context, + ed, + ede ? ede->subtype : NULL, + echnk->data, + echnk->size, + on_error); if (edd) { - hash = edd->func.hash_add(hash, key, data_ret); - *ptr = hash; - _eet_freelist_hash_add(context, hash); + hash = edd->func.hash_add(hash, key, data_ret); + *ptr = hash; + _eet_freelist_hash_add(context, hash); } else - { - eet_node_hash_add(*((Eet_Node **) data), echnk->name, key, data_ret); - } + eet_node_hash_add(*((Eet_Node **)data), echnk->name, key, data_ret); return 1; - on_error: +on_error: return ret; } @@ -2757,10 +3396,16 @@ eet_data_get_hash(Eet_Free_Context *context, const Eet_Dictionary *ed, Eet_Data_ * each chunk is pointless. */ static int -eet_data_get_array(Eet_Free_Context *context, const Eet_Dictionary *ed, Eet_Data_Descriptor *edd, - Eet_Data_Element *ede, Eet_Data_Chunk *echnk, - int type, int group_type, void *data, - char **p, int *size) +eet_data_get_array(Eet_Free_Context *context, + const Eet_Dictionary *ed, + Eet_Data_Descriptor *edd, + Eet_Data_Element *ede, + Eet_Data_Chunk *echnk, + int type, + int group_type, + void *data, + char **p, + int *size) { Eina_List *childs = NULL; const char *name; @@ -2776,154 +3421,195 @@ eet_data_get_array(Eet_Free_Context *context, const Eet_Dictionary *ed, Eet_Data ptr = data; /* read the number of elements */ ret = eet_data_get_type(ed, - EET_T_INT, - echnk->data, - ((char *)echnk->data) + echnk->size, - &count); - if (ret <= 0) return ret; + EET_T_INT, + echnk->data, + ((char *)echnk->data) + echnk->size, + &count); + if (ret <= 0) + return ret; name = echnk->name; if (ede) { - if (IS_POINTER_TYPE(type)) - subsize = eet_basic_codec[ede->type].size; - else - subsize = ede->subtype->size; + if (IS_POINTER_TYPE(type)) + subsize = eet_basic_codec[ede->type].size; + else + subsize = ede->subtype->size; - if (group_type == EET_G_VAR_ARRAY) - { - /* store the number of elements - * on the counter offset */ - *(int *)(((char *)data) + ede->count - ede->offset) = count; - /* allocate space for the array of elements */ - *(void **)ptr = edd->func.mem_alloc(count * subsize); + if (group_type == EET_G_VAR_ARRAY) + { + /* store the number of elements + * on the counter offset */ + *(int *)(((char *)data) + ede->count - ede->offset) = count; + /* allocate space for the array of elements */ + *(void **)ptr = edd->func.mem_alloc(count * subsize); - if (!*(void **)ptr) return 0; + if (!*(void **)ptr) + return 0; - memset(*(void **)ptr, 0, count * subsize); + memset(*(void **)ptr, 0, count * subsize); - _eet_freelist_add(context, *(void **)ptr); - } + _eet_freelist_add(context, *(void **)ptr); + } } /* get all array elements */ for (i = 0; i < count; i++) { - void *dst = NULL; - void *data_ret = NULL; + void *dst = NULL; + void *data_ret = NULL; - /* Advance to next chunk */ - NEXT_CHUNK((*p), (*size), (*echnk), ed); - memset(echnk, 0, sizeof(Eet_Data_Chunk)); + /* Advance to next chunk */ + NEXT_CHUNK((*p), (*size), (*echnk), ed); + memset(echnk, 0, sizeof(Eet_Data_Chunk)); - eet_data_chunk_get(ed, echnk, *p, *size); - if (!echnk->name || strcmp(echnk->name, name) != 0) goto on_error; - /* get the data */ + eet_data_chunk_get(ed, echnk, *p, *size); + if (!echnk->name || strcmp(echnk->name, name) != 0) + goto on_error; /* get the data */ - if (echnk->group_type != group_type - || (echnk->type != type && echnk->type != EET_T_NULL)) - goto on_error; + if (echnk->group_type != group_type + || (echnk->type != type && echnk->type != EET_T_NULL)) + goto on_error; - if (ede) - if (ede->group_type != echnk->group_type - || (echnk->type != ede->type && echnk->type != EET_T_NULL)) - goto on_error; + if (ede) + if (ede->group_type != echnk->group_type + || (echnk->type != ede->type && echnk->type != EET_T_NULL)) + goto on_error; - /* get the destination pointer */ - if (ede) - { - if (group_type == EET_G_ARRAY) - dst = (char *)ptr + (subsize * i); - else - dst = *(char **)ptr + (subsize * i); - } + /* get the destination pointer */ + if (ede) + { + if (group_type == EET_G_ARRAY) + dst = (char *)ptr + (subsize * i); + else + dst = *(char **)ptr + (subsize * i); + } - if (IS_POINTER_TYPE(echnk->type)) - { - POINTER_TYPE_DECODE(context, ed, edd, ede, echnk, echnk->type, &data_ret, p, size, on_error); - if (dst) memcpy(dst, &data_ret, subsize); - if (!edd) childs = eina_list_append(childs, data_ret); - } - else - { - STRUCT_TYPE_DECODE(data_ret, context, ed, ede ? ede->subtype : NULL, echnk->data, echnk->size, on_error); - if (dst) - { - memcpy(dst, data_ret, subsize); - _eet_freelist_add(context, data_ret); - } - if (!edd) childs = eina_list_append(childs, data_ret); - } + if (IS_POINTER_TYPE(echnk->type)) + { + POINTER_TYPE_DECODE(context, + ed, + edd, + ede, + echnk, + echnk->type, + &data_ret, + p, + size, + on_error); + if (dst) + memcpy(dst, &data_ret, subsize); + + if (!edd) + childs = eina_list_append(childs, data_ret); + } + else + { + STRUCT_TYPE_DECODE(data_ret, + context, + ed, + ede ? ede->subtype : NULL, + echnk->data, + echnk->size, + on_error); + if (dst) + { + memcpy(dst, data_ret, subsize); + _eet_freelist_add(context, data_ret); + } + + if (!edd) + childs = eina_list_append(childs, data_ret); + } } if (!edd) { - Eet_Node *parent = *((Eet_Node **) data); - Eet_Node *array; + Eet_Node *parent = *((Eet_Node **)data); + Eet_Node *array; - if (group_type == EET_G_ARRAY) - array = eet_node_array_new(name, count, childs); - else - array = eet_node_var_array_new(name, childs); + if (group_type == EET_G_ARRAY) + array = eet_node_array_new(name, count, childs); + else + array = eet_node_var_array_new(name, childs); - if (!array) goto on_error; + if (!array) + goto on_error; - eet_node_struct_append(parent, name, array); + eet_node_struct_append(parent, name, array); } return 1; - on_error: +on_error: EINA_LIST_FREE(childs, tmp) - eet_node_del(tmp); + eet_node_del(tmp); return 0; } static void eet_data_put_union(Eet_Dictionary *ed, - Eet_Data_Descriptor *edd __UNUSED__, - Eet_Data_Element *ede, Eet_Data_Stream *ds, void *data_in) + Eet_Data_Descriptor *edd __UNUSED__, + Eet_Data_Element *ede, Eet_Data_Stream *ds, void *data_in) { const char *union_type; int i; EET_ASSERT(!((ede->type != EET_T_UNKNOW) || (!ede->subtype)), return ); - union_type = ede->subtype->func.type_get(((char*) data_in) + ede->count - ede->offset, - NULL); + union_type = ede->subtype->func.type_get( + ((char *)data_in) + ede->count - ede->offset, + NULL); - if (!union_type) return ; + if (!union_type) + return; /* Search the structure of the union to encode. */ for (i = 0; i < ede->subtype->elements.num; ++i) - if (strcmp(ede->subtype->elements.set[i].name, union_type) == 0) - { - Eet_Data_Element *sede; - void *data; - int size; + if (strcmp(ede->subtype->elements.set[i].name, union_type) == 0) + { + Eet_Data_Element *sede; + void *data; + int size; - /* Yeah we found it ! */ - data = eet_data_put_type(ed, EET_T_STRING, &union_type, &size); - if (data) eet_data_encode(ed, ds, data, ede->name, size, ede->type, ede->group_type); + /* Yeah we found it ! */ + data = eet_data_put_type(ed, EET_T_STRING, &union_type, &size); + if (data) + eet_data_encode(ed, + ds, + data, + ede->name, + size, + ede->type, + ede->group_type); + + sede = &(ede->subtype->elements.set[i]); + data = _eet_data_descriptor_encode(ed, + sede->subtype, + data_in, + &size); + if (data) + eet_data_encode(ed, + ds, + data, + ede->name, + size, + ede->type, + ede->group_type); + + break; + } - sede = &(ede->subtype->elements.set[i]); - data = _eet_data_descriptor_encode(ed, - sede->subtype, - data_in, - &size); - if (data) eet_data_encode(ed, ds, data, ede->name, size, ede->type, ede->group_type); - break; - } } static int eet_data_get_union(Eet_Free_Context *context, const Eet_Dictionary *ed, - Eet_Data_Descriptor *edd __UNUSED__, - Eet_Data_Element *ede, Eet_Data_Chunk *echnk, - int type, int group_type, void *data, - char **p, int *size) + Eet_Data_Descriptor *edd __UNUSED__, + Eet_Data_Element *ede, Eet_Data_Chunk *echnk, + int type, int group_type, void *data, + char **p, int *size) { const char *union_type; void *data_ret = NULL; @@ -2932,11 +3618,12 @@ eet_data_get_union(Eet_Free_Context *context, const Eet_Dictionary *ed, /* Read type */ ret = eet_data_get_type(ed, - EET_T_STRING, - echnk->data, - ((char *)echnk->data) + echnk->size, - &union_type); - if (ret <= 0) goto on_error; + EET_T_STRING, + echnk->data, + ((char *)echnk->data) + echnk->size, + &union_type); + if (ret <= 0) + goto on_error; /* Advance to next chunk */ NEXT_CHUNK((*p), (*size), (*echnk), ed); @@ -2944,74 +3631,80 @@ eet_data_get_union(Eet_Free_Context *context, const Eet_Dictionary *ed, /* Read value */ eet_data_chunk_get(ed, echnk, *p, *size); - if (!echnk->name) goto on_error; + if (!echnk->name) + goto on_error; if (ede) { - EET_ASSERT(!(ede->group_type != group_type || ede->type != type), goto on_error); + EET_ASSERT(!(ede->group_type != group_type || ede->type != type), + goto on_error); - /* Search the structure of the union to decode */ - for (i = 0; i < ede->subtype->elements.num; ++i) - if (strcmp(ede->subtype->elements.set[i].name, union_type) == 0) - { - Eet_Data_Element *sede; - char *ut; + /* Search the structure of the union to decode */ + for (i = 0; i < ede->subtype->elements.num; ++i) + if (strcmp(ede->subtype->elements.set[i].name, union_type) == 0) + { + Eet_Data_Element *sede; + char *ut; - /* Yeah we found it ! */ - sede = &(ede->subtype->elements.set[i]); - EET_ASSERT(sede->subtype, goto on_error); + /* Yeah we found it ! */ + sede = &(ede->subtype->elements.set[i]); + EET_ASSERT(sede->subtype, goto on_error); - data_ret = _eet_data_descriptor_decode(context, - ed, - sede->subtype, - echnk->data, - echnk->size); - if (!data_ret) goto on_error; + data_ret = _eet_data_descriptor_decode(context, + ed, + sede->subtype, + echnk->data, + echnk->size); + if (!data_ret) + goto on_error; - /* Memcopy the structure content to remove pointer indirection. */ - memcpy(data, data_ret, sede->subtype->size); + /* Memcopy the structure content to remove pointer indirection. */ + memcpy(data, data_ret, sede->subtype->size); - /* data_ret is now useless. */ - sede->subtype->func.mem_free(data_ret); + /* data_ret is now useless. */ + sede->subtype->func.mem_free(data_ret); - /* Set union type. */ - if ((!ed) || (!ede->subtype->func.str_direct_alloc)) - { - ut = ede->subtype->func.str_alloc(union_type); - _eet_freelist_str_add(context, ut); - } - else - { - ut = ede->subtype->func.str_direct_alloc(union_type); - _eet_freelist_direct_str_add(context, ut); - } + /* Set union type. */ + if ((!ed) || (!ede->subtype->func.str_direct_alloc)) + { + ut = ede->subtype->func.str_alloc(union_type); + _eet_freelist_str_add(context, ut); + } + else + { + ut = ede->subtype->func.str_direct_alloc(union_type); + _eet_freelist_direct_str_add(context, ut); + } - ede->subtype->func.type_set(ut, - ((char*) data) + ede->count - ede->offset, - EINA_FALSE); + ede->subtype->func.type_set( + ut, + ((char *)data) + ede->count - + ede->offset, + EINA_FALSE); + + break; + } - break; - } } else { - /* FIXME: generate node structure. */ - data_ret = _eet_data_descriptor_decode(context, - ed, NULL, - echnk->data, echnk->size); - goto on_error; + /* FIXME: generate node structure. */ + data_ret = _eet_data_descriptor_decode(context, + ed, NULL, + echnk->data, echnk->size); + goto on_error; } return 1; - on_error: +on_error: return 0; } static void eet_data_put_variant(Eet_Dictionary *ed, - Eet_Data_Descriptor *edd __UNUSED__, - Eet_Data_Element *ede, Eet_Data_Stream *ds, void *data_in) + Eet_Data_Descriptor *edd __UNUSED__, + Eet_Data_Element *ede, Eet_Data_Stream *ds, void *data_in) { const char *union_type; void *data; @@ -3021,83 +3714,109 @@ eet_data_put_variant(Eet_Dictionary *ed, EET_ASSERT(!((ede->type != EET_T_UNKNOW) || (!ede->subtype)), return ); - union_type = ede->subtype->func.type_get(((char*) data_in) + ede->count - ede->offset, - &unknow); + union_type = ede->subtype->func.type_get( + ((char *)data_in) + ede->count - ede->offset, + &unknow); - if (!union_type && unknow == EINA_FALSE) return ; + if (!union_type && unknow == EINA_FALSE) + return; if (unknow) { - /* Handle opaque internal representation */ - Eet_Variant_Unknow *evu; + /* Handle opaque internal representation */ + Eet_Variant_Unknow *evu; - data = eet_data_put_type(ed, EET_T_STRING, &union_type, &size); - if (data) eet_data_encode(ed, ds, data, ede->name, size, ede->type, ede->group_type); + data = eet_data_put_type(ed, EET_T_STRING, &union_type, &size); + if (data) + eet_data_encode(ed, + ds, + data, + ede->name, + size, + ede->type, + ede->group_type); - evu = (Eet_Variant_Unknow*) data_in; - if (evu && EINA_MAGIC_CHECK(evu, EET_MAGIC_VARIANT)) - eet_data_encode(ed, ds, evu->data, ede->name, evu->size, ede->type, ede->group_type); + evu = (Eet_Variant_Unknow *)data_in; + if (evu && EINA_MAGIC_CHECK(evu, EET_MAGIC_VARIANT)) + eet_data_encode(ed, + ds, + evu->data, + ede->name, + evu->size, + ede->type, + ede->group_type); } else - { - /* Search the structure of the union to encode. */ - for (i = 0; i < ede->subtype->elements.num; ++i) - if (strcmp(ede->subtype->elements.set[i].name, union_type) == 0) - { - Eet_Data_Element *sede; + /* Search the structure of the union to encode. */ + for (i = 0; i < ede->subtype->elements.num; ++i) + if (strcmp(ede->subtype->elements.set[i].name, union_type) == 0) + { + Eet_Data_Element *sede; - /* Yeah we found it ! */ - data = eet_data_put_type(ed, EET_T_STRING, &union_type, &size); - if (data) eet_data_encode(ed, ds, data, ede->name, size, ede->type, ede->group_type); + /* Yeah we found it ! */ + data = eet_data_put_type(ed, EET_T_STRING, &union_type, &size); + if (data) + eet_data_encode(ed, + ds, + data, + ede->name, + size, + ede->type, + ede->group_type); - sede = &(ede->subtype->elements.set[i]); + sede = &(ede->subtype->elements.set[i]); - if (sede->group_type != EET_G_UNKNOWN) - { - Eet_Data_Stream *lds; + if (sede->group_type != EET_G_UNKNOWN) + { + Eet_Data_Stream *lds; - lds = eet_data_stream_new(); - eet_group_codec[sede->group_type - 100].put(ed, - sede->subtype, - sede, - lds, - data_in); - if (lds->size != 0) - { - eet_data_encode(ed, ds, lds->data, ede->name, lds->pos, - ede->type, ede->group_type); + lds = eet_data_stream_new(); + eet_group_codec[sede->group_type - 100].put(ed, + sede->subtype, + sede, + lds, + data_in); + if (lds->size != 0) + { + eet_data_encode(ed, ds, lds->data, ede->name, lds->pos, + ede->type, ede->group_type); - lds->data = NULL; - lds->size = 0; - } - else - { - eet_data_encode(ed, ds, NULL, ede->name, 0, - EET_T_NULL, ede->group_type); - } + lds->data = NULL; + lds->size = 0; + } + else + eet_data_encode(ed, ds, NULL, ede->name, 0, + EET_T_NULL, ede->group_type); - eet_data_stream_free(lds); - } - else - { - data = _eet_data_descriptor_encode(ed, - sede->subtype, - *(void**)data_in, - &size); - if (data) eet_data_encode(ed, ds, data, ede->name, size, ede->type, ede->group_type); - } + eet_data_stream_free(lds); + } + else + { + data = _eet_data_descriptor_encode(ed, + sede->subtype, + *(void **)data_in, + &size); + if (data) + eet_data_encode(ed, + ds, + data, + ede->name, + size, + ede->type, + ede->group_type); + } + + break; + } - break; - } - } } static int eet_data_get_variant(Eet_Free_Context *context, const Eet_Dictionary *ed, - Eet_Data_Descriptor *edd __UNUSED__, - Eet_Data_Element *ede, Eet_Data_Chunk *echnk, - int type __UNUSED__, int group_type __UNUSED__, void *data, - char **p, int *size) + Eet_Data_Descriptor *edd __UNUSED__, + Eet_Data_Element *ede, Eet_Data_Chunk *echnk, + int type __UNUSED__, int group_type __UNUSED__, void *data, + char **p, int *size) { const char *union_type; void *data_ret = NULL; @@ -3106,11 +3825,12 @@ eet_data_get_variant(Eet_Free_Context *context, const Eet_Dictionary *ed, /* Read type */ ret = eet_data_get_type(ed, - EET_T_STRING, - echnk->data, - ((char *)echnk->data) + echnk->size, - &union_type); - if (ret <= 0) goto on_error; + EET_T_STRING, + echnk->data, + ((char *)echnk->data) + echnk->size, + &union_type); + if (ret <= 0) + goto on_error; /* Advance to next chunk */ NEXT_CHUNK((*p), (*size), (*echnk), ed); @@ -3118,124 +3838,142 @@ eet_data_get_variant(Eet_Free_Context *context, const Eet_Dictionary *ed, /* Read value */ eet_data_chunk_get(ed, echnk, *p, *size); - if (!echnk->name) goto on_error; + if (!echnk->name) + goto on_error; if (ede) { - char *ut; + char *ut; - EET_ASSERT(ede->subtype, goto on_error); + EET_ASSERT(ede->subtype, goto on_error); - if ((!ed) || (!ede->subtype->func.str_direct_alloc)) - { - ut = ede->subtype->func.str_alloc(union_type); - _eet_freelist_str_add(context, ut); - } - else - { - ut = ede->subtype->func.str_direct_alloc(union_type); - _eet_freelist_direct_str_add(context, ut); - } + if ((!ed) || (!ede->subtype->func.str_direct_alloc)) + { + ut = ede->subtype->func.str_alloc(union_type); + _eet_freelist_str_add(context, ut); + } + else + { + ut = ede->subtype->func.str_direct_alloc(union_type); + _eet_freelist_direct_str_add(context, ut); + } - /* Search the structure of the union to decode */ - for (i = 0; i < ede->subtype->elements.num; ++i) - if (strcmp(ede->subtype->elements.set[i].name, union_type) == 0) - { - Eet_Data_Element *sede; + /* Search the structure of the union to decode */ + for (i = 0; i < ede->subtype->elements.num; ++i) + if (strcmp(ede->subtype->elements.set[i].name, union_type) == 0) + { + Eet_Data_Element *sede; - /* Yeah we found it ! */ - sede = &(ede->subtype->elements.set[i]); + /* Yeah we found it ! */ + sede = &(ede->subtype->elements.set[i]); - if (sede->group_type != EET_G_UNKNOWN) - { - Eet_Data_Chunk chnk; - char *p2; - int size2; - int ret; + if (sede->group_type != EET_G_UNKNOWN) + { + Eet_Data_Chunk chnk; + char *p2; + int size2; + int ret; - p2 = echnk->data; - size2 = echnk->size; + p2 = echnk->data; + size2 = echnk->size; - /* Didn't find a proper way to provide this - without duplicating code */ - while (size2 > 0) - { - memset(&chnk, 0, sizeof(Eet_Data_Chunk)); - eet_data_chunk_get(ed, &chnk, p2, size2); + /* Didn't find a proper way to provide this + without duplicating code */ + while (size2 > 0) + { + memset(&chnk, 0, sizeof(Eet_Data_Chunk)); + eet_data_chunk_get(ed, &chnk, p2, size2); - if (!chnk.name) goto on_error; + if (!chnk.name) + goto on_error; - ret = eet_group_codec[sede->group_type - 100].get(context, - ed, sede->subtype, - sede, &chnk, - sede->type, sede->group_type, - data, &p2, &size2); + ret = eet_group_codec[sede->group_type - 100].get( + context, + ed, + sede->subtype, + sede, + &chnk, + sede + ->type, + sede->group_type, + data, + &p2, + &size2); - if (ret <= 0) goto on_error; + if (ret <= 0) + goto on_error; - /* advance to next chunk */ - NEXT_CHUNK(p2, size2, chnk, ed); - } +/* advance to next chunk */ + NEXT_CHUNK(p2, size2, chnk, ed); + } - /* Put garbage so that we will not put eet_variant_unknow in it */ - data_ret = (void*) data; + /* Put garbage so that we will not put eet_variant_unknow in it */ + data_ret = (void *)data; - /* Set variant type. */ - ede->subtype->func.type_set(ut, - ((char*) data) + ede->count - ede->offset, - EINA_FALSE); - break; - } + /* Set variant type. */ + ede->subtype->func.type_set( + ut, + ((char *)data) + ede->count - + ede->offset, + EINA_FALSE); + break; + } - data_ret = _eet_data_descriptor_decode(context, - ed, - sede->subtype, - echnk->data, - echnk->size); - if (!data_ret) break; + data_ret = _eet_data_descriptor_decode(context, + ed, + sede->subtype, + echnk->data, + echnk->size); + if (!data_ret) + break; - /* And point to the variant data. */ - *(void**) data = data_ret; + /* And point to the variant data. */ + *(void **)data = data_ret; - /* Set variant type. */ - ede->subtype->func.type_set(ut, - ((char*) data) + ede->count - ede->offset, - EINA_FALSE); - break; - } + /* Set variant type. */ + ede->subtype->func.type_set( + ut, + ((char *)data) + ede->count - + ede->offset, + EINA_FALSE); + break; + } - if (!data_ret) - { - Eet_Variant_Unknow *evu; + if (!data_ret) + { + Eet_Variant_Unknow *evu; - evu = calloc(1, sizeof (Eet_Variant_Unknow) + echnk->size - 1); - if (!evu) goto on_error; + evu = calloc(1, sizeof (Eet_Variant_Unknow) + echnk->size - 1); + if (!evu) + goto on_error; - evu->size = echnk->size; - memcpy(evu->data, echnk->data, evu->size); - EINA_MAGIC_SET(evu, EET_MAGIC_VARIANT); + evu->size = echnk->size; + memcpy(evu->data, echnk->data, evu->size); + EINA_MAGIC_SET(evu, EET_MAGIC_VARIANT); - /* And point to the opaque internal data scructure */ - *(void**) data = evu; + /* And point to the opaque internal data scructure */ + *(void **)data = evu; - /* Set variant type. */ - ede->subtype->func.type_set(ut, - ((char*) data) + ede->count - ede->offset, - EINA_TRUE); - } + /* Set variant type. */ + ede->subtype->func.type_set( + ut, + ((char *)data) + ede->count - + ede->offset, + EINA_TRUE); + } } else { - /* FIXME: dump node structure. */ - data_ret = _eet_data_descriptor_decode(context, - ed, NULL, - echnk->data, echnk->size); - goto on_error; + /* FIXME: dump node structure. */ + data_ret = _eet_data_descriptor_decode(context, + ed, NULL, + echnk->data, echnk->size); + goto on_error; } return 1; - on_error: +on_error: return 0; } @@ -3246,129 +3984,155 @@ eet_data_node_simple_type(int type, const char *name, void *dd) # undef EET_T_TYPE #endif -#define EET_T_TYPE(Eet_Type, Eet_Node_Type, Type) \ - case Eet_Type: \ - return eet_node_##Eet_Node_Type##_new(name, *((Type *) dd)); \ +#define EET_T_TYPE(Eet_Type, Eet_Node_Type, Type) \ + case Eet_Type: \ + return eet_node_ ## Eet_Node_Type ## _new(name, *((Type *)dd)); \ switch (type) { - EET_T_TYPE(EET_T_CHAR, char, char); - EET_T_TYPE(EET_T_SHORT, short, short); - EET_T_TYPE(EET_T_INT, int, int); - EET_T_TYPE(EET_T_LONG_LONG, long_long, long long); - EET_T_TYPE(EET_T_FLOAT, float, float); - EET_T_TYPE(EET_T_DOUBLE, double, double); - EET_T_TYPE(EET_T_UCHAR, unsigned_char, unsigned char); - EET_T_TYPE(EET_T_USHORT, unsigned_short, unsigned short); - EET_T_TYPE(EET_T_UINT, unsigned_int, unsigned int); - EET_T_TYPE(EET_T_ULONG_LONG, unsigned_long_long, unsigned long long); - EET_T_TYPE(EET_T_STRING, string, char*); - EET_T_TYPE(EET_T_INLINED_STRING, inlined_string, char*); + EET_T_TYPE(EET_T_CHAR, char, char); + EET_T_TYPE(EET_T_SHORT, short, short); + EET_T_TYPE(EET_T_INT, int, int); + EET_T_TYPE(EET_T_LONG_LONG, long_long, long long); + EET_T_TYPE(EET_T_FLOAT, float, float); + EET_T_TYPE(EET_T_DOUBLE, double, double); + EET_T_TYPE(EET_T_UCHAR, unsigned_char, unsigned char); + EET_T_TYPE(EET_T_USHORT, unsigned_short, unsigned short); + EET_T_TYPE(EET_T_UINT, unsigned_int, unsigned int); + EET_T_TYPE(EET_T_ULONG_LONG, unsigned_long_long, unsigned long long); + EET_T_TYPE(EET_T_STRING, string, char *); + EET_T_TYPE(EET_T_INLINED_STRING, inlined_string, char *); + case EET_T_NULL: - return eet_node_null_new(name); + return eet_node_null_new(name); + default: - ERR("Unknow type passed to eet_data_node_simple_type"); - return NULL; + ERR("Unknow type passed to eet_data_node_simple_type"); + return NULL; } } static int -eet_data_get_unknown(Eet_Free_Context *context, const Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Chunk *echnk, - int type, int group_type __UNUSED__, void *data, - char **p __UNUSED__, int *size __UNUSED__) +eet_data_get_unknown(Eet_Free_Context *context, + const Eet_Dictionary *ed, + Eet_Data_Descriptor *edd, + Eet_Data_Element *ede, + Eet_Data_Chunk *echnk, + int type, + int group_type __UNUSED__, + void *data, + char **p __UNUSED__, + int *size __UNUSED__) { int ret; void *data_ret; if (IS_SIMPLE_TYPE(type)) { - unsigned char dd[128]; + unsigned char dd[128]; - ret = eet_data_get_type(ed, type, echnk->data, ((char *)echnk->data) + echnk->size, edd ? (char*) data : (char*) dd); - if (ret <= 0) return ret; + ret = eet_data_get_type(ed, + type, + echnk->data, + ((char *)echnk->data) + echnk->size, + edd ? (char *)data : (char *)dd); + if (ret <= 0) + return ret; - if (!edd) - { - Eet_Node **parent = data; - Eet_Node *node; + if (!edd) + { + Eet_Node **parent = data; + Eet_Node *node; - node = eet_data_node_simple_type(type, echnk->name, dd); + node = eet_data_node_simple_type(type, echnk->name, dd); - if (*parent) eet_node_struct_append(*parent, echnk->name, node); - else *parent = node; - } - else - { - if (type == EET_T_STRING) - { - char **str; + if (*parent) + eet_node_struct_append(*parent, echnk->name, node); + else + *parent = node; + } + else + { + if (type == EET_T_STRING) + { + char **str; - str = (char **)(((char *)data)); - if (*str) - { - if ((ed == NULL) || (edd->func.str_direct_alloc == NULL)) - { - *str = edd->func.str_alloc(*str); - _eet_freelist_str_add(context, *str); - } - else - { - *str = edd->func.str_direct_alloc(*str); - _eet_freelist_direct_str_add(context, *str); - } - } - } - else if (edd && type == EET_T_INLINED_STRING) - { - char **str; + str = (char **)(((char *)data)); + if (*str) + { + if ((ed == NULL) || (edd->func.str_direct_alloc == NULL)) + { + *str = edd->func.str_alloc(*str); + _eet_freelist_str_add(context, *str); + } + else + { + *str = edd->func.str_direct_alloc(*str); + _eet_freelist_direct_str_add(context, *str); + } + } + } + else if (edd && type == EET_T_INLINED_STRING) + { + char **str; - str = (char **)(((char *)data)); - if (*str) - { - *str = edd->func.str_alloc(*str); - _eet_freelist_str_add(context, *str); - } - } - } + str = (char **)(((char *)data)); + if (*str) + { + *str = edd->func.str_alloc(*str); + _eet_freelist_str_add(context, *str); + } + } + } } else { - Eet_Data_Descriptor *subtype; + Eet_Data_Descriptor *subtype; - subtype = ede ? ede->subtype : NULL; + subtype = ede ? ede->subtype : NULL; - if (subtype || !edd) - { - Eet_Node **parent = data; - void **ptr; + if (subtype || !edd) + { + Eet_Node **parent = data; + void **ptr; - data_ret = _eet_data_descriptor_decode(context, ed, subtype, echnk->data, echnk->size); - if (!data_ret) return 0; + data_ret = _eet_data_descriptor_decode(context, + ed, + subtype, + echnk->data, + echnk->size); + if (!data_ret) + return 0; - if (edd) - { - ptr = (void **)(((char *)data)); - *ptr = (void *)data_ret; - } - else - { - Eet_Node *node = data_ret; + if (edd) + { + ptr = (void **)(((char *)data)); + *ptr = (void *)data_ret; + } + else + { + Eet_Node *node = data_ret; - if (*parent) - { - node = eet_node_struct_child_new(echnk->name, node); - eet_node_struct_append(*parent, echnk->name, node); - } - else *parent = node; - } - } + if (*parent) + { + node = eet_node_struct_child_new(echnk->name, node); + eet_node_struct_append(*parent, echnk->name, node); + } + else + *parent = node; + } + } } return 1; } static void -eet_data_put_array(Eet_Dictionary *ed, Eet_Data_Descriptor *edd __UNUSED__, Eet_Data_Element *ede, Eet_Data_Stream *ds, void *data_in) +eet_data_put_array(Eet_Dictionary *ed, + Eet_Data_Descriptor *edd __UNUSED__, + Eet_Data_Element *ede, + Eet_Data_Stream *ds, + void *data_in) { void *data; int offset = 0; @@ -3377,105 +4141,144 @@ eet_data_put_array(Eet_Dictionary *ed, Eet_Data_Descriptor *edd __UNUSED__, Eet_ int size; int j; - EET_ASSERT(!((ede->type > EET_T_UNKNOW) && (ede->type < EET_T_STRING)), return ); + EET_ASSERT(!((ede->type > EET_T_UNKNOW) && (ede->type < EET_T_STRING)), + return ); if (ede->group_type == EET_G_ARRAY) - count = ede->counter_offset; + count = ede->counter_offset; else - count = *(int *)(((char *)data_in) + ede->count - ede->offset); + count = *(int *)(((char *)data_in) + ede->count - ede->offset); + + if (count <= 0) + return; /* Store number of elements */ - if (count <= 0) return; - /* Store number of elements */ data = eet_data_put_type(ed, EET_T_INT, &count, &size); - if (data) eet_data_encode(ed, ds, data, ede->name, size, ede->type, ede->group_type); + if (data) + eet_data_encode(ed, ds, data, ede->name, size, ede->type, ede->group_type); if (IS_POINTER_TYPE(ede->type)) - subsize = eet_basic_codec[ede->type].size; + subsize = eet_basic_codec[ede->type].size; else - subsize = ede->subtype->size; + subsize = ede->subtype->size; for (j = 0; j < count; j++) { - void *d; - int pos = ds->pos; + void *d; + int pos = ds->pos; - if (ede->group_type == EET_G_ARRAY) - d = (void *)(((char *)data_in) + offset); - else - d = *(((char **)data_in)) + offset; + if (ede->group_type == EET_G_ARRAY) + d = (void *)(((char *)data_in) + offset); + else + d = *(((char **)data_in)) + offset; - if (IS_POINTER_TYPE(ede->type)) - { - if (*(char**) d) - eet_data_put_unknown(ed, NULL, ede, ds, d); - } - else - { - data = _eet_data_descriptor_encode(ed, ede->subtype, d, &size); - if (data) eet_data_encode(ed, ds, data, ede->name, size, ede->type, ede->group_type); - } + if (IS_POINTER_TYPE(ede->type)) + { + if (*(char **)d) + eet_data_put_unknown(ed, NULL, ede, ds, d); + } + else + { + data = _eet_data_descriptor_encode(ed, ede->subtype, d, &size); + if (data) + eet_data_encode(ed, + ds, + data, + ede->name, + size, + ede->type, + ede->group_type); + } - if (pos == ds->pos) - { - /* Add a NULL element just to have the correct array layout. */ - eet_data_encode(ed, ds, NULL, ede->name, 0, EET_T_NULL, ede->group_type); - } + if (pos == ds->pos) + /* Add a NULL element just to have the correct array layout. */ + eet_data_encode(ed, + ds, + NULL, + ede->name, + 0, + EET_T_NULL, + ede->group_type); - offset += subsize; + offset += subsize; } } static void -eet_data_put_unknown(Eet_Dictionary *ed, Eet_Data_Descriptor *edd __UNUSED__, Eet_Data_Element *ede, Eet_Data_Stream *ds, void *data_in) +eet_data_put_unknown(Eet_Dictionary *ed, + Eet_Data_Descriptor *edd __UNUSED__, + Eet_Data_Element *ede, + Eet_Data_Stream *ds, + void *data_in) { void *data = NULL; int size; if (IS_SIMPLE_TYPE(ede->type)) - data = eet_data_put_type(ed, ede->type, data_in, &size); + data = eet_data_put_type(ed, ede->type, data_in, &size); else if (ede->subtype) - { - if (*((char **)data_in)) - data = _eet_data_descriptor_encode(ed, - ede->subtype, - *((char **)((char *)(data_in))), - &size); - } - if (data) eet_data_encode(ed, ds, data, ede->name, size, ede->type, ede->group_type); + if (*((char **)data_in)) + data = _eet_data_descriptor_encode(ed, + ede->subtype, + *((char **)((char *)(data_in))), + &size); + + if (data) + eet_data_encode(ed, + ds, + data, + ede->name, + size, + ede->type, + ede->group_type); } static void -eet_data_put_list(Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Stream *ds, void *data_in) +eet_data_put_list(Eet_Dictionary *ed, + Eet_Data_Descriptor *edd, + Eet_Data_Element *ede, + Eet_Data_Stream *ds, + void *data_in) { void *data; void *l; int size; EET_ASSERT(!(((ede->type > EET_T_UNKNOW) && (ede->type < EET_T_STRING)) - || ((ede->type > EET_T_NULL) && (ede->type < EET_T_LAST))), - return ); + || ((ede->type > EET_T_NULL) && (ede->type < EET_T_LAST))), + return ); l = *((void **)(((char *)data_in))); for (; l; l = edd->func.list_next(l)) { - if (IS_POINTER_TYPE(ede->type)) - { - const void *str = edd->func.list_data(l); - eet_data_put_unknown(ed, NULL, ede, ds, &str); - } - else - { - data = _eet_data_descriptor_encode(ed, - ede->subtype, - edd->func.list_data(l), - &size); - if (data) eet_data_encode(ed, ds, data, ede->name, size, ede->type, ede->group_type); - } + if (IS_POINTER_TYPE(ede->type)) + { + const void *str = edd->func.list_data(l); + eet_data_put_unknown(ed, NULL, ede, ds, &str); + } + else + { + data = _eet_data_descriptor_encode(ed, + ede->subtype, + edd->func.list_data(l), + &size); + if (data) + eet_data_encode(ed, + ds, + data, + ede->name, + size, + ede->type, + ede->group_type); + } } } static void -eet_data_put_hash(Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element *ede, Eet_Data_Stream *ds, void *data_in) +eet_data_put_hash(Eet_Dictionary *ed, + Eet_Data_Descriptor *edd, + Eet_Data_Element *ede, + Eet_Data_Stream *ds, + void *data_in) { Eet_Data_Encode_Hash_Info fdata; void *l; @@ -3489,26 +4292,28 @@ eet_data_put_hash(Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element EAPI int eet_data_dump_cipher(Eet_File *ef, - const char *name, const char *cipher_key, - void (*dumpfunc) (void *data, const char *str), - void *dumpdata) + const char *name, const char *cipher_key, + void (*dumpfunc)(void *data, const char *str), + void *dumpdata) { const Eet_Dictionary *ed = NULL; - const void *data = NULL; - Eet_Node *result; - Eet_Free_Context context; - int required_free = 0; - int size; + const void *data = NULL; + Eet_Node *result; + Eet_Free_Context context; + int required_free = 0; + int size; ed = eet_dictionary_get(ef); if (!cipher_key) - data = eet_read_direct(ef, name, &size); + data = eet_read_direct(ef, name, &size); + if (!data) { - required_free = 1; - data = eet_read_cipher(ef, name, &size, cipher_key); - if (!data) return 0; + required_free = 1; + data = eet_read_cipher(ef, name, &size, cipher_key); + if (!data) + return 0; } memset(&context, 0, sizeof (context)); @@ -3519,16 +4324,16 @@ eet_data_dump_cipher(Eet_File *ef, eet_node_del(result); if (required_free) - free((void*)data); + free((void *)data); return result ? 1 : 0; } EAPI int eet_data_dump(Eet_File *ef, - const char *name, - void (*dumpfunc) (void *data, const char *str), - void *dumpdata) + const char *name, + void (*dumpfunc)(void *data, const char *str), + void *dumpdata) { return eet_data_dump_cipher(ef, name, NULL, dumpfunc, dumpdata); } @@ -3536,30 +4341,33 @@ eet_data_dump(Eet_File *ef, EAPI int eet_data_text_dump_cipher(const void *data_in, - const char *cipher_key, int size_in, - void (*dumpfunc) (void *data, const char *str), - void *dumpdata) + const char *cipher_key, int size_in, + void (*dumpfunc)(void *data, const char *str), + void *dumpdata) { void *ret = NULL; Eet_Node *result; Eet_Free_Context context; unsigned int ret_len = 0; - if (!data_in) return 0; + if (!data_in) + return 0; if (cipher_key) { - if (eet_decipher(data_in, size_in, cipher_key, - strlen(cipher_key), &ret, &ret_len)) - { - if (ret) free(ret); - return 0; - } + if (eet_decipher(data_in, size_in, cipher_key, + strlen(cipher_key), &ret, &ret_len)) + { + if (ret) + free(ret); + + return 0; + } } else { - ret = (void*) data_in; - ret_len = size_in; + ret = (void *)data_in; + ret_len = size_in; } memset(&context, 0, sizeof (context)); @@ -3568,148 +4376,167 @@ eet_data_text_dump_cipher(const void *data_in, eet_node_dump(result, 0, dumpfunc, dumpdata); eet_node_del(result); - if (cipher_key) free(ret); + if (cipher_key) + free(ret); return result ? 1 : 0; } EAPI int eet_data_text_dump(const void *data_in, - int size_in, - void (*dumpfunc) (void *data, const char *str), - void *dumpdata) + int size_in, + void (*dumpfunc)(void *data, const char *str), + void *dumpdata) { return eet_data_text_dump_cipher(data_in, NULL, size_in, dumpfunc, dumpdata); } EAPI void * eet_data_text_undump_cipher(const char *text, - const char *cipher_key, - int textlen, - int *size_ret) + const char *cipher_key, + int textlen, + int *size_ret) { void *ret = NULL; ret = _eet_data_dump_parse(NULL, size_ret, text, textlen); if (ret && cipher_key) { - void *ciphered = NULL; - unsigned int ciphered_len; + void *ciphered = NULL; + unsigned int ciphered_len; - if (eet_cipher(ret, *size_ret, cipher_key, - strlen(cipher_key), &ciphered, &ciphered_len)) - { - if (ciphered) free(ciphered); - size_ret = 0; - free(ret); - return NULL; - } - free(ret); - *size_ret = ciphered_len; - ret = ciphered; + if (eet_cipher(ret, *size_ret, cipher_key, + strlen(cipher_key), &ciphered, &ciphered_len)) + { + if (ciphered) + free(ciphered); + + size_ret = 0; + free(ret); + return NULL; + } + + free(ret); + *size_ret = ciphered_len; + ret = ciphered; } + return ret; } EAPI void * eet_data_text_undump(const char *text, - int textlen, - int *size_ret) + int textlen, + int *size_ret) { return eet_data_text_undump_cipher(text, NULL, textlen, size_ret); } EAPI int eet_data_undump_cipher(Eet_File *ef, - const char *name, - const char *cipher_key, - const char *text, - int textlen, - int compress) + const char *name, + const char *cipher_key, + const char *text, + int textlen, + int compress) { - Eet_Dictionary *ed; - void *data_enc; - int size; - int val; + Eet_Dictionary *ed; + void *data_enc; + int size; + int val; ed = eet_dictionary_get(ef); data_enc = _eet_data_dump_parse(ed, &size, text, textlen); - if (!data_enc) return 0; + if (!data_enc) + return 0; + val = eet_write_cipher(ef, name, data_enc, size, compress, cipher_key); - free(data_enc); + free(data_enc); return val; } EAPI int eet_data_undump(Eet_File *ef, - const char *name, - const char *text, - int textlen, - int compress) + const char *name, + const char *text, + int textlen, + int compress) { return eet_data_undump_cipher(ef, name, NULL, text, textlen, compress); } EAPI void * eet_data_descriptor_decode_cipher(Eet_Data_Descriptor *edd, - const void *data_in, - const char *cipher_key, - int size_in) + const void *data_in, + const char *cipher_key, + int size_in) { - void *deciphered = (void*) data_in; + void *deciphered = (void *)data_in; void *ret; Eet_Free_Context context; unsigned int deciphered_len = size_in; if (cipher_key && data_in) - { - if (eet_decipher(data_in, size_in, cipher_key, - strlen(cipher_key), &deciphered, &deciphered_len)) - { - if (deciphered) free(deciphered); - return NULL; - } - } + if (eet_decipher(data_in, size_in, cipher_key, + strlen(cipher_key), &deciphered, &deciphered_len)) + { + if (deciphered) + free(deciphered); + + return NULL; + } memset(&context, 0, sizeof (context)); - ret = _eet_data_descriptor_decode(&context, NULL, edd, deciphered, deciphered_len); + ret = _eet_data_descriptor_decode(&context, + NULL, + edd, + deciphered, + deciphered_len); - if (data_in != deciphered) free(deciphered); + if (data_in != deciphered) + free(deciphered); return ret; } EAPI void * eet_data_descriptor_decode(Eet_Data_Descriptor *edd, - const void *data_in, - int size_in) + const void *data_in, + int size_in) { return eet_data_descriptor_decode_cipher(edd, data_in, NULL, size_in); } EAPI Eet_Node * -eet_data_node_decode_cipher(const void *data_in, const char *cipher_key, int size_in) +eet_data_node_decode_cipher(const void *data_in, + const char *cipher_key, + int size_in) { - void *deciphered = (void*) data_in; + void *deciphered = (void *)data_in; Eet_Node *ret; Eet_Free_Context context; unsigned int deciphered_len = size_in; if (cipher_key && data_in) - { - if (eet_decipher(data_in, size_in, cipher_key, - strlen(cipher_key), &deciphered, &deciphered_len)) - { - if (deciphered) free(deciphered); - return NULL; - } - } + if (eet_decipher(data_in, size_in, cipher_key, + strlen(cipher_key), &deciphered, &deciphered_len)) + { + if (deciphered) + free(deciphered); + + return NULL; + } memset(&context, 0, sizeof (context)); - ret = _eet_data_descriptor_decode(&context, NULL, NULL, deciphered, deciphered_len); + ret = _eet_data_descriptor_decode(&context, + NULL, + NULL, + deciphered, + deciphered_len); - if (data_in != deciphered) free(deciphered); + if (data_in != deciphered) + free(deciphered); return ret; } @@ -3720,30 +4547,42 @@ _eet_data_descriptor_encode(Eet_Dictionary *ed, const void *data_in, int *size_ret) { - Eet_Data_Stream *ds; - Eet_Data_Chunk *chnk; - void *cdata; - int csize; - int i; + Eet_Data_Stream *ds; + Eet_Data_Chunk *chnk; + void *cdata; + int csize; + int i; if (_eet_data_words_bigendian == -1) { - unsigned long int v; + unsigned long int v; - v = htonl(0x12345678); - if (v == 0x12345678) _eet_data_words_bigendian = 1; - else _eet_data_words_bigendian = 0; + v = htonl(0x12345678); + if (v == 0x12345678) + _eet_data_words_bigendian = 1; + else + _eet_data_words_bigendian = 0; } ds = eet_data_stream_new(); for (i = 0; i < edd->elements.num; i++) { - Eet_Data_Element *ede; + Eet_Data_Element *ede; - ede = &(edd->elements.set[i]); - eet_group_codec[ede->group_type - 100].put(ed, edd, ede, ds, ((char *)data_in) + ede->offset); + ede = &(edd->elements.set[i]); + eet_group_codec[ede->group_type - 100].put( + ed, + edd, + ede, + ds, + ((char *)data_in) + + ede->offset); } - chnk = eet_data_chunk_new(ds->data, ds->pos, edd->name, EET_T_UNKNOW, EET_G_UNKNOWN); + chnk = eet_data_chunk_new(ds->data, + ds->pos, + edd->name, + EET_T_UNKNOW, + EET_G_UNKNOWN); ds->data = NULL; ds->size = 0; eet_data_stream_free(ds); @@ -3765,17 +4604,23 @@ _eet_data_descriptor_encode(Eet_Dictionary *ed, } EAPI int -eet_data_node_write_cipher(Eet_File *ef, const char *name, const char *cipher_key, Eet_Node *node, int compress) +eet_data_node_write_cipher(Eet_File *ef, + const char *name, + const char *cipher_key, + Eet_Node *node, + int compress) { - Eet_Dictionary *ed; - void *data_enc; - int size; - int val; + Eet_Dictionary *ed; + void *data_enc; + int size; + int val; ed = eet_dictionary_get(ef); data_enc = _eet_data_dump_encode(EET_G_UNKNOWN, ed, node, &size); - if (!data_enc) return 0; + if (!data_enc) + return 0; + val = eet_write_cipher(ef, name, data_enc, size, compress, cipher_key); free(data_enc); return val; @@ -3783,8 +4628,8 @@ eet_data_node_write_cipher(Eet_File *ef, const char *name, const char *cipher_ke EAPI void * eet_data_node_encode_cipher(Eet_Node *node, - const char *cipher_key, - int *size_ret) + const char *cipher_key, + int *size_ret) { void *ret = NULL; void *ciphered = NULL; @@ -3794,28 +4639,35 @@ eet_data_node_encode_cipher(Eet_Node *node, ret = _eet_data_dump_encode(EET_G_UNKNOWN, NULL, node, &size); if (cipher_key && ret) { - if (eet_cipher(ret, size, cipher_key, - strlen(cipher_key), &ciphered, &ciphered_len)) - { - if (ciphered) free(ciphered); - if (size_ret) *size_ret = 0; - free(ret); - return NULL; - } - free(ret); - size = (int) ciphered_len; - ret = ciphered; + if (eet_cipher(ret, size, cipher_key, + strlen(cipher_key), &ciphered, &ciphered_len)) + { + if (ciphered) + free(ciphered); + + if (size_ret) + *size_ret = 0; + + free(ret); + return NULL; + } + + free(ret); + size = (int)ciphered_len; + ret = ciphered; } - if (size_ret) *size_ret = size; + if (size_ret) + *size_ret = size; + return ret; } EAPI void * eet_data_descriptor_encode_cipher(Eet_Data_Descriptor *edd, - const void *data_in, - const char *cipher_key, - int *size_ret) + const void *data_in, + const char *cipher_key, + int *size_ret) { void *ret = NULL; void *ciphered = NULL; @@ -3825,27 +4677,34 @@ eet_data_descriptor_encode_cipher(Eet_Data_Descriptor *edd, ret = _eet_data_descriptor_encode(NULL, edd, data_in, &size); if (cipher_key && ret) { - if (eet_cipher(ret, size, cipher_key, - strlen(cipher_key), &ciphered, &ciphered_len)) - { - if (ciphered) free(ciphered); - if (size_ret) *size_ret = 0; - free(ret); - return NULL; - } - free(ret); - size = ciphered_len; - ret = ciphered; + if (eet_cipher(ret, size, cipher_key, + strlen(cipher_key), &ciphered, &ciphered_len)) + { + if (ciphered) + free(ciphered); + + if (size_ret) + *size_ret = 0; + + free(ret); + return NULL; + } + + free(ret); + size = ciphered_len; + ret = ciphered; } - if (size_ret) *size_ret = size; + if (size_ret) + *size_ret = size; + return ret; } EAPI void * eet_data_descriptor_encode(Eet_Data_Descriptor *edd, - const void *data_in, - int *size_ret) + const void *data_in, + int *size_ret) { return eet_data_descriptor_encode_cipher(edd, data_in, NULL, size_ret); } diff --git a/legacy/eet/src/lib/eet_dictionary.c b/legacy/eet/src/lib/eet_dictionary.c index 7ccd18452f..7b1a1afd1d 100644 --- a/legacy/eet/src/lib/eet_dictionary.c +++ b/legacy/eet/src/lib/eet_dictionary.c @@ -18,11 +18,11 @@ Eet_Dictionary * eet_dictionary_add(void) { - Eet_Dictionary *new; + Eet_Dictionary *new; new = calloc(1, sizeof (Eet_Dictionary)); if (!new) - return NULL; + return NULL; memset(new->hash, -1, sizeof (int) * 256); @@ -34,43 +34,43 @@ eet_dictionary_free(Eet_Dictionary *ed) { if (ed) { - int i; + int i; for (i = 0; i < ed->count; ++i) - if (ed->all[i].str) - free(ed->all[i].str); - if (ed->all) free(ed->all); - free(ed); + if (ed->all[i].str) + free(ed->all[i].str); + + if (ed->all) + free(ed->all); + + free(ed); } } static int _eet_dictionary_lookup(Eet_Dictionary *ed, const char *string, int hash) { - int prev = -1; - int current; + int prev = -1; + int current; current = ed->hash[hash]; while (current != -1) { if (ed->all[current].str) - { - if (strcmp(ed->all[current].str, string) >= 0) - break ; - } + if (strcmp(ed->all[current].str, string) >= 0) + break; + if (ed->all[current].mmap) - { - if (strcmp(ed->all[current].mmap, string) >= 0) - break ; - } + if (strcmp(ed->all[current].mmap, string) >= 0) + break; prev = current; current = ed->all[current].next; } if (current == -1) - return prev; + return prev; return current; } @@ -78,14 +78,14 @@ _eet_dictionary_lookup(Eet_Dictionary *ed, const char *string, int hash) int eet_dictionary_string_add(Eet_Dictionary *ed, const char *string) { - Eet_String *current; - char *str; - int hash; - int idx; - int len; + Eet_String *current; + char *str; + int hash; + int idx; + int len; if (!ed) - return -1; + return -1; hash = _eet_hash_gen(string, 8); @@ -94,27 +94,25 @@ eet_dictionary_string_add(Eet_Dictionary *ed, const char *string) if (idx != -1) { if (ed->all[idx].str) - { - if (strcmp(ed->all[idx].str, string) == 0) - return idx; - } + if (strcmp(ed->all[idx].str, string) == 0) + return idx; + if (ed->all[idx].mmap) - { - if (strcmp(ed->all[idx].mmap, string) == 0) - return idx; - } + if (strcmp(ed->all[idx].mmap, string) == 0) + return idx; + } if (ed->total == ed->count) { - Eet_String *new; - int total; + Eet_String *new; + int total; total = ed->total + 8; new = realloc(ed->all, sizeof (Eet_String) * total); if (new == NULL) - return -1; + return -1; ed->all = new; ed->total = total; @@ -123,7 +121,7 @@ eet_dictionary_string_add(Eet_Dictionary *ed, const char *string) len = strlen(string) + 1; str = strdup(string); if (str == NULL) - return -1; + return -1; current = ed->all + ed->count; @@ -147,11 +145,12 @@ eet_dictionary_string_add(Eet_Dictionary *ed, const char *string) current->prev = ed->all[idx].prev; if (current->next != -1) - ed->all[current->next].prev = ed->count; + ed->all[current->next].prev = ed->count; + if (current->prev != -1) - ed->all[current->prev].next = ed->count; + ed->all[current->prev].next = ed->count; else - ed->hash[hash] = ed->count; + ed->hash[hash] = ed->count; } return ed->count++; @@ -160,48 +159,68 @@ eet_dictionary_string_add(Eet_Dictionary *ed, const char *string) int eet_dictionary_string_get_size(const Eet_Dictionary *ed, int idx) { - if (!ed) return 0; - if (idx < 0) return 0; + if (!ed) + return 0; + + if (idx < 0) + return 0; + if (idx < ed->count) - return ed->all[idx].len; + return ed->all[idx].len; + return 0; } int eet_dictionary_string_get_hash(const Eet_Dictionary *ed, int idx) { - if (!ed) return -1; - if (idx < 0) return -1; + if (!ed) + return -1; + + if (idx < 0) + return -1; + if (idx < ed->count) - return ed->all[idx].hash; + return ed->all[idx].hash; + return -1; } const char * eet_dictionary_string_get_char(const Eet_Dictionary *ed, int idx) { - if (!ed) return NULL; - if (idx < 0) return NULL; + if (!ed) + return NULL; + + if (idx < 0) + return NULL; + if (idx < ed->count) { #ifdef _WIN32 - /* Windows file system could change the mmaped file when replacing a file. So we need to copy all string in memory to avoid bugs. */ - if (ed->all[idx].str == NULL) - { - ed->all[idx].str = strdup(ed->all[idx].mmap); - ed->all[idx].mmap = NULL; - } + /* Windows file system could change the mmaped file when replacing a file. So we need to copy all string in memory to avoid bugs. */ + if (ed->all[idx].str == NULL) + { + ed->all[idx].str = strdup(ed->all[idx].mmap); + ed->all[idx].mmap = NULL; + } + #else if (ed->all[idx].mmap) - return ed->all[idx].mmap; + return ed->all[idx].mmap; + #endif return ed->all[idx].str; } + return NULL; } static inline Eina_Bool -_eet_dictionary_string_get_me_cache(const char *s, int len, int *mantisse, int *exponent) +_eet_dictionary_string_get_me_cache(const char *s, + int len, + int *mantisse, + int *exponent) { if ((len == 6) && (s[0] == '0') && (s[1] == 'x') && (s[3] == 'p')) { @@ -210,74 +229,94 @@ _eet_dictionary_string_get_me_cache(const char *s, int len, int *mantisse, int * return EINA_TRUE; } + return EINA_FALSE; } static inline Eina_Bool _eet_dictionary_string_get_float_cache(const char *s, int len, float *result) { - int mantisse; - int exponent; + int mantisse; + int exponent; if (_eet_dictionary_string_get_me_cache(s, len, &mantisse, &exponent)) { - if (s[4] == '+') *result = (float) (mantisse << exponent); - else *result = (float) mantisse / (float) (1 << exponent); + if (s[4] == '+') + *result = (float)(mantisse << exponent); + else + *result = (float)mantisse / (float)(1 << exponent); return EINA_TRUE; } + return EINA_FALSE; } static inline Eina_Bool _eet_dictionary_string_get_double_cache(const char *s, int len, double *result) { - int mantisse; - int exponent; + int mantisse; + int exponent; if (_eet_dictionary_string_get_me_cache(s, len, &mantisse, &exponent)) { - if (s[4] == '+') *result = (double) (mantisse << exponent); - else *result = (double) mantisse / (float) (1 << exponent); + if (s[4] == '+') + *result = (double)(mantisse << exponent); + else + *result = (double)mantisse / (float)(1 << exponent); return EINA_TRUE; } + return EINA_FALSE; } static inline Eina_Bool _eet_dictionary_test(const Eet_Dictionary *ed, int idx, void *result) { - if (!result) return EINA_FALSE; - if (!ed) return EINA_FALSE; - if (idx < 0) return EINA_FALSE; - if (!(idx < ed->count)) return EINA_FALSE; + if (!result) + return EINA_FALSE; + + if (!ed) + return EINA_FALSE; + + if (idx < 0) + return EINA_FALSE; + + if (!(idx < ed->count)) + return EINA_FALSE; + return EINA_TRUE; } Eina_Bool -eet_dictionary_string_get_float(const Eet_Dictionary *ed, int idx, float *result) +eet_dictionary_string_get_float(const Eet_Dictionary *ed, + int idx, + float *result) { - if (!_eet_dictionary_test(ed, idx, result)) return EINA_FALSE; + if (!_eet_dictionary_test(ed, idx, result)) + return EINA_FALSE; if (!(ed->all[idx].type & EET_D_FLOAT)) { - const char *str; + const char *str; - str = ed->all[idx].str ? ed->all[idx].str : ed->all[idx].mmap; + str = ed->all[idx].str ? ed->all[idx].str : ed->all[idx].mmap; - if (!_eet_dictionary_string_get_float_cache(str, ed->all[idx].len, &ed->all[idx].f)) - { - long long mantisse = 0; - long exponent = 0; + if (!_eet_dictionary_string_get_float_cache(str, ed->all[idx].len, + &ed->all[idx].f)) + { + long long mantisse = 0; + long exponent = 0; - if (eina_convert_atod(str, ed->all[idx].len, &mantisse, &exponent) == EINA_FALSE) - return EINA_FALSE; + if (eina_convert_atod(str, ed->all[idx].len, &mantisse, + &exponent) == EINA_FALSE) + return EINA_FALSE; - ed->all[idx].f = ldexpf((float) mantisse, exponent); - } + ed->all[idx].f = ldexpf((float)mantisse, exponent); + } - ed->all[idx].type |= EET_D_FLOAT; + ed->all[idx].type |= EET_D_FLOAT; } *result = ed->all[idx].f; @@ -285,28 +324,33 @@ eet_dictionary_string_get_float(const Eet_Dictionary *ed, int idx, float *result } Eina_Bool -eet_dictionary_string_get_double(const Eet_Dictionary *ed, int idx, double *result) +eet_dictionary_string_get_double(const Eet_Dictionary *ed, + int idx, + double *result) { - if (!_eet_dictionary_test(ed, idx, result)) return EINA_FALSE; + if (!_eet_dictionary_test(ed, idx, result)) + return EINA_FALSE; if (!(ed->all[idx].type & EET_D_DOUBLE)) { - const char *str; + const char *str; - str = ed->all[idx].str ? ed->all[idx].str : ed->all[idx].mmap; + str = ed->all[idx].str ? ed->all[idx].str : ed->all[idx].mmap; - if (!_eet_dictionary_string_get_double_cache(str, ed->all[idx].len, &ed->all[idx].d)) - { - long long mantisse = 0; - long exponent = 0; + if (!_eet_dictionary_string_get_double_cache(str, ed->all[idx].len, + &ed->all[idx].d)) + { + long long mantisse = 0; + long exponent = 0; - if (eina_convert_atod(str, ed->all[idx].len, &mantisse, &exponent) == EINA_FALSE) - return EINA_FALSE; + if (eina_convert_atod(str, ed->all[idx].len, &mantisse, + &exponent) == EINA_FALSE) + return EINA_FALSE; - ed->all[idx].d = ldexp((double) mantisse, exponent); - } + ed->all[idx].d = ldexp((double)mantisse, exponent); + } - ed->all[idx].type |= EET_D_DOUBLE; + ed->all[idx].type |= EET_D_DOUBLE; } *result = ed->all[idx].d; @@ -314,22 +358,25 @@ eet_dictionary_string_get_double(const Eet_Dictionary *ed, int idx, double *resu } Eina_Bool -eet_dictionary_string_get_fp(const Eet_Dictionary *ed, int idx, Eina_F32p32 *result) +eet_dictionary_string_get_fp(const Eet_Dictionary *ed, + int idx, + Eina_F32p32 *result) { - if (!_eet_dictionary_test(ed, idx, result)) return EINA_FALSE; + if (!_eet_dictionary_test(ed, idx, result)) + return EINA_FALSE; if (!(ed->all[idx].type & EET_D_FIXED_POINT)) { - const char *str; - Eina_F32p32 fp; + const char *str; + Eina_F32p32 fp; - str = ed->all[idx].str ? ed->all[idx].str : ed->all[idx].mmap; + str = ed->all[idx].str ? ed->all[idx].str : ed->all[idx].mmap; - if (!eina_convert_atofp(str, ed->all[idx].len, &fp)) - return EINA_FALSE; + if (!eina_convert_atofp(str, ed->all[idx].len, &fp)) + return EINA_FALSE; - ed->all[idx].fp = fp; - ed->all[idx].type |= EET_D_FIXED_POINT; + ed->all[idx].fp = fp; + ed->all[idx].type |= EET_D_FIXED_POINT; } *result = ed->all[idx].fp; @@ -339,19 +386,19 @@ eet_dictionary_string_get_fp(const Eet_Dictionary *ed, int idx, Eina_F32p32 *res EAPI int eet_dictionary_string_check(Eet_Dictionary *ed, const char *string) { - int i; + int i; if (ed == NULL || string == NULL) - return 0; + return 0; if (ed->start <= string && string < ed->end) - return 1; + return 1; for (i = 0; i < ed->count; ++i) - if (ed->all[i].str == string) - return 1; + if (ed->all[i].str == string) + return 1; return 0; } diff --git a/legacy/eet/src/lib/eet_image.c b/legacy/eet/src/lib/eet_image.c index c3be1f12a8..fb2310285a 100644 --- a/legacy/eet/src/lib/eet_image.c +++ b/legacy/eet/src/lib/eet_image.c @@ -45,7 +45,7 @@ void *alloca (size_t); /*---*/ -typedef struct _JPEG_error_mgr *emptr; +typedef struct _JPEG_error_mgr *emptr; /*---*/ @@ -55,7 +55,8 @@ struct _JPEG_error_mgr jmp_buf setjmp_buffer; }; -struct jpeg_membuf_src { +struct jpeg_membuf_src +{ struct jpeg_source_mgr pub; const unsigned char *buf; @@ -66,7 +67,7 @@ static void _eet_jpeg_membuf_src_init(j_decompress_ptr cinfo) { /* FIXME: Use attribute unused */ - (void) cinfo; + (void)cinfo; } static boolean @@ -93,7 +94,7 @@ _eet_jpeg_membuf_src_skip(j_decompress_ptr cinfo, long num_bytes) static void _eet_jpeg_membuf_src_term(j_decompress_ptr cinfo) { - free(cinfo->src); + free(cinfo->src); cinfo->src = NULL; } @@ -103,7 +104,8 @@ eet_jpeg_membuf_src(j_decompress_ptr cinfo, const void *buf, size_t len) struct jpeg_membuf_src *src; src = malloc(sizeof(*src)); - if (!src) return -1; + if (!src) + return -1; cinfo->src = &src->pub; src->buf = buf; @@ -119,7 +121,8 @@ eet_jpeg_membuf_src(j_decompress_ptr cinfo, const void *buf, size_t len) return 0; } -struct jpeg_membuf_dst { +struct jpeg_membuf_dst +{ struct jpeg_destination_mgr pub; void **dst_buf; @@ -134,7 +137,7 @@ static void _eet_jpeg_membuf_dst_init(j_compress_ptr cinfo) { /* FIXME: Use eina attribute */ - (void) cinfo; + (void)cinfo; } static boolean @@ -144,15 +147,16 @@ _eet_jpeg_membuf_dst_flush(j_compress_ptr cinfo) unsigned char *buf; if (dst->len >= 0x40000000 || - (buf = realloc(dst->buf, dst->len * 2)) == NULL) { - dst->failed = 1; - dst->pub.next_output_byte = dst->buf; - dst->pub.free_in_buffer = dst->len; - return TRUE; - } + (buf = realloc(dst->buf, dst->len * 2)) == NULL) + { + dst->failed = 1; + dst->pub.next_output_byte = dst->buf; + dst->pub.free_in_buffer = dst->len; + return TRUE; + } dst->pub.next_output_byte = - buf + ((unsigned char *)dst->pub.next_output_byte - dst->buf); + buf + ((unsigned char *)dst->pub.next_output_byte - dst->buf); dst->buf = buf; dst->pub.free_in_buffer += dst->len; dst->len *= 2; @@ -165,15 +169,19 @@ _eet_jpeg_membuf_dst_term(j_compress_ptr cinfo) { struct jpeg_membuf_dst *dst = (struct jpeg_membuf_dst *)cinfo->dest; - if (dst->failed) { - *dst->dst_buf = NULL; - *dst->dst_len = 0; - free(dst->buf); - } else { - *dst->dst_buf = dst->buf; - *dst->dst_len = (unsigned char *)dst->pub.next_output_byte - dst->buf; - } - free(dst); + if (dst->failed) + { + *dst->dst_buf = NULL; + *dst->dst_len = 0; + free(dst->buf); + } + else + { + *dst->dst_buf = dst->buf; + *dst->dst_len = (unsigned char *)dst->pub.next_output_byte - dst->buf; + } + + free(dst); cinfo->dest = NULL; } @@ -183,13 +191,16 @@ eet_jpeg_membuf_dst(j_compress_ptr cinfo, void **buf, size_t *len) struct jpeg_membuf_dst *dst; dst = malloc(sizeof(*dst)); - if (!dst) return -1; + if (!dst) + return -1; dst->buf = malloc(32768); - if (!dst->buf) { - free(dst); - return -1; - } + if (!dst->buf) + { + free(dst); + return -1; + } + dst->len = 32768; cinfo->dest = &dst->pub; @@ -211,13 +222,49 @@ static void _JPEGFatalErrorHandler(j_common_ptr cinfo); static void _JPEGErrorHandler(j_common_ptr cinfo); static void _JPEGErrorHandler2(j_common_ptr cinfo, int msg_level); -static int eet_data_image_jpeg_header_decode(const void *data, int size, unsigned int *w, unsigned int *h); -static int eet_data_image_jpeg_rgb_decode(const void *data, int size, unsigned int src_x, unsigned int src_y, unsigned int *d, unsigned int w, unsigned int h, unsigned int row_stride); -static void *eet_data_image_jpeg_alpha_decode(const void *data, int size, unsigned int src_x, unsigned int src_y, unsigned int *d, unsigned int w, unsigned int h, unsigned int row_stride); -static void *eet_data_image_lossless_convert(int *size, const void *data, unsigned int w, unsigned int h, int alpha); -static void *eet_data_image_lossless_compressed_convert(int *size, const void *data, unsigned int w, unsigned int h, int alpha, int compression); -static void *eet_data_image_jpeg_convert(int *size, const void *data, unsigned int w, unsigned int h, int alpha, int quality); -static void *eet_data_image_jpeg_alpha_convert(int *size, const void *data, unsigned int w, unsigned int h, int alpha, int quality); +static int eet_data_image_jpeg_header_decode(const void *data, + int size, + unsigned int *w, + unsigned int *h); +static int eet_data_image_jpeg_rgb_decode(const void *data, + int size, + unsigned int src_x, + unsigned int src_y, + unsigned int *d, + unsigned int w, + unsigned int h, + unsigned int row_stride); +static void *eet_data_image_jpeg_alpha_decode(const void *data, + int size, + unsigned int src_x, + unsigned int src_y, + unsigned int *d, + unsigned int w, + unsigned int h, + unsigned int row_stride); +static void *eet_data_image_lossless_convert(int *size, + const void *data, + unsigned int w, + unsigned int h, + int alpha); +static void *eet_data_image_lossless_compressed_convert(int *size, + const void *data, + unsigned int w, + unsigned int h, + int alpha, + int compression); +static void *eet_data_image_jpeg_convert(int *size, + const void *data, + unsigned int w, + unsigned int h, + int alpha, + int quality); +static void *eet_data_image_jpeg_alpha_convert(int *size, + const void *data, + unsigned int w, + unsigned int h, + int alpha, + int quality); /*---*/ @@ -226,22 +273,22 @@ static int _eet_image_words_bigendian = -1; /*---*/ #define SWAP64(x) (x) = \ - ((((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)) + ((((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)) #define SWAP32(x) (x) = \ - ((((int)(x) & 0x000000ff ) << 24) |\ - (((int)(x) & 0x0000ff00 ) << 8) |\ - (((int)(x) & 0x00ff0000 ) >> 8) |\ - (((int)(x) & 0xff000000 ) >> 24)) + ((((int)(x) & 0x000000ff) << 24) | \ + (((int)(x) & 0x0000ff00) << 8) | \ + (((int)(x) & 0x00ff0000) >> 8) | \ + (((int)(x) & 0xff000000) >> 24)) #define SWAP16(x) (x) = \ - ((((short)(x) & 0x00ff ) << 8) |\ - (((short)(x) & 0xff00 ) >> 8)) + ((((short)(x) & 0x00ff) << 8) | \ + (((short)(x) & 0xff00) >> 8)) #ifdef CONV8 # undef CONV8 @@ -257,9 +304,9 @@ static int _eet_image_words_bigendian = -1; #endif #define CONV8(x) -#define CONV16(x) {if (_eet_image_words_bigendian) SWAP16(x);} -#define CONV32(x) {if (_eet_image_words_bigendian) SWAP32(x);} -#define CONV64(x) {if (_eet_image_words_bigendian) SWAP64(x);} +#define CONV16(x) {if (_eet_image_words_bigendian) {SWAP16(x); }} +#define CONV32(x) {if (_eet_image_words_bigendian) {SWAP32(x); }} +#define CONV64(x) {if (_eet_image_words_bigendian) {SWAP64(x); }} /*---*/ @@ -268,7 +315,7 @@ _JPEGFatalErrorHandler(j_common_ptr cinfo) { emptr errmgr; - errmgr = (emptr) cinfo->err; + errmgr = (emptr)cinfo->err; /* cinfo->err->output_message(cinfo);*/ longjmp(errmgr->setjmp_buffer, 1); return; @@ -297,7 +344,10 @@ _JPEGErrorHandler2(j_common_ptr cinfo __UNUSED__, int msg_level __UNUSED__) } static int -eet_data_image_jpeg_header_decode(const void *data, int size, unsigned int *w, unsigned int *h) +eet_data_image_jpeg_header_decode(const void *data, + int size, + unsigned int *w, + unsigned int *h) { struct jpeg_decompress_struct cinfo; struct _JPEG_error_mgr jerr; @@ -308,13 +358,15 @@ eet_data_image_jpeg_header_decode(const void *data, int size, unsigned int *w, u jerr.pub.error_exit = _JPEGFatalErrorHandler; jerr.pub.emit_message = _JPEGErrorHandler2; jerr.pub.output_message = _JPEGErrorHandler; - if (setjmp(jerr.setjmp_buffer)) return 0; + if (setjmp(jerr.setjmp_buffer)) + return 0; + jpeg_create_decompress(&cinfo); if (eet_jpeg_membuf_src(&cinfo, data, (size_t)size)) { - jpeg_destroy_decompress(&cinfo); - return 0; + jpeg_destroy_decompress(&cinfo); + return 0; } jpeg_read_header(&cinfo, TRUE); @@ -333,12 +385,19 @@ eet_data_image_jpeg_header_decode(const void *data, int size, unsigned int *w, u if ((*w < 1) || (*h < 1) || (*w > 8192) || (*h > 8192)) return 0; + return 1; } static int -eet_data_image_jpeg_rgb_decode(const void *data, int size, unsigned int src_x, unsigned int src_y, - unsigned int *d, unsigned int w, unsigned int h, unsigned int row_stride) +eet_data_image_jpeg_rgb_decode(const void *data, + int size, + unsigned int src_x, + unsigned int src_y, + unsigned int *d, + unsigned int w, + unsigned int h, + unsigned int row_stride) { struct jpeg_decompress_struct cinfo; struct _JPEG_error_mgr jerr; @@ -349,7 +408,8 @@ eet_data_image_jpeg_rgb_decode(const void *data, int size, unsigned int src_x, u unsigned int i; /* FIXME: handle src_x, src_y and row_stride correctly */ - if (!d) return 0; + if (!d) + return 0; memset(&cinfo, 0, sizeof (struct jpeg_decompress_struct)); @@ -357,13 +417,15 @@ eet_data_image_jpeg_rgb_decode(const void *data, int size, unsigned int src_x, u jerr.pub.error_exit = _JPEGFatalErrorHandler; jerr.pub.emit_message = _JPEGErrorHandler2; jerr.pub.output_message = _JPEGErrorHandler; - if (setjmp(jerr.setjmp_buffer)) return 0; + if (setjmp(jerr.setjmp_buffer)) + return 0; + jpeg_create_decompress(&cinfo); if (eet_jpeg_membuf_src(&cinfo, data, (size_t)size)) { - jpeg_destroy_decompress(&cinfo); - return 0; + jpeg_destroy_decompress(&cinfo); + return 0; } jpeg_read_header(&cinfo, TRUE); @@ -377,89 +439,103 @@ eet_data_image_jpeg_rgb_decode(const void *data, int size, unsigned int src_x, u ih = cinfo.output_height; if ((iw != w) || (ih != h)) { - free(cinfo.src); - cinfo.src = NULL; + free(cinfo.src); + cinfo.src = NULL; - jpeg_destroy_decompress(&cinfo); - return 0; + jpeg_destroy_decompress(&cinfo); + return 0; } + /* end head decoding */ /* data decoding */ if (cinfo.rec_outbuf_height > 16) { - free(cinfo.src); - cinfo.src = NULL; + free(cinfo.src); + cinfo.src = NULL; - jpeg_destroy_decompress(&cinfo); - return 0; + jpeg_destroy_decompress(&cinfo); + return 0; } + tdata = alloca((iw) * 16 * 3); ptr2 = d; if (cinfo.output_components == 3) { - for (i = 0; i < (unsigned int) cinfo.rec_outbuf_height; i++) - line[i] = tdata + (i * (iw) * 3); - for (l = 0; l < ih; l += cinfo.rec_outbuf_height) - { - jpeg_read_scanlines(&cinfo, line, cinfo.rec_outbuf_height); - scans = cinfo.rec_outbuf_height; - if ((ih - l) < scans) scans = ih - l; - ptr = tdata; + for (i = 0; i < (unsigned int)cinfo.rec_outbuf_height; i++) + line[i] = tdata + (i * (iw) * 3); + for (l = 0; l < ih; l += cinfo.rec_outbuf_height) + { + jpeg_read_scanlines(&cinfo, line, cinfo.rec_outbuf_height); + scans = cinfo.rec_outbuf_height; + if ((ih - l) < scans) + scans = ih - l; - if (l + scans >= src_y && l < src_y + h) - { - y = src_y - l; - if (src_y < l) y = 0; - for (ptr += 3 * iw * y; y < scans && (y + l) < (src_y + h); y++) - { - tmp = ptr2; - ptr += 3 * src_x; - for (x = 0; x < w; x++) - { - *ptr2 = - (0xff000000) | ((ptr[0]) << 16) | ((ptr[1]) << 8) | (ptr[2]); - ptr += 3; - ptr2++; - } - ptr += 3 * (iw - w); - ptr2 = tmp + row_stride / 4; - } - } - } + ptr = tdata; + + if (l + scans >= src_y && l < src_y + h) + { + y = src_y - l; + if (src_y < l) + y = 0; + + for (ptr += 3 * iw * y; y < scans && (y + l) < (src_y + h); + y++) + { + tmp = ptr2; + ptr += 3 * src_x; + for (x = 0; x < w; x++) + { + *ptr2 = + (0xff000000) | + ((ptr[0]) << 16) | ((ptr[1]) << 8) | (ptr[2]); + ptr += 3; + ptr2++; + } + ptr += 3 * (iw - w); + ptr2 = tmp + row_stride / 4; + } + } + } } else if (cinfo.output_components == 1) { - for (i = 0; i < (unsigned int) cinfo.rec_outbuf_height; i++) - line[i] = tdata + (i * (iw)); - for (l = 0; l < (ih); l += cinfo.rec_outbuf_height) - { - jpeg_read_scanlines(&cinfo, line, cinfo.rec_outbuf_height); - scans = cinfo.rec_outbuf_height; - if (((ih) - l) < scans) scans = (ih) - l; - ptr = tdata; + for (i = 0; i < (unsigned int)cinfo.rec_outbuf_height; i++) + line[i] = tdata + (i * (iw)); + for (l = 0; l < (ih); l += cinfo.rec_outbuf_height) + { + jpeg_read_scanlines(&cinfo, line, cinfo.rec_outbuf_height); + scans = cinfo.rec_outbuf_height; + if (((ih) - l) < scans) + scans = (ih) - l; - if (l >= src_y && l < src_y + h) - { - y = src_y - l; - if (src_y < l) y = 0; - for (ptr += iw * y; y < scans && (y + l) < (src_y + h); y++) - { - tmp = ptr2; - ptr += src_x; - for (x = 0; x < w; x++) - { - *ptr2 = - (0xff000000) | ((ptr[0]) << 16) | ((ptr[0]) << 8) | (ptr[0]); - ptr++; - ptr2++; - } - ptr += iw - w; - ptr2 = tmp + row_stride / 4; - } - } - } + ptr = tdata; + + if (l >= src_y && l < src_y + h) + { + y = src_y - l; + if (src_y < l) + y = 0; + + for (ptr += iw * y; y < scans && (y + l) < (src_y + h); y++) + { + tmp = ptr2; + ptr += src_x; + for (x = 0; x < w; x++) + { + *ptr2 = + (0xff000000) | + ((ptr[0]) << 16) | ((ptr[0]) << 8) | (ptr[0]); + ptr++; + ptr2++; + } + ptr += iw - w; + ptr2 = tmp + row_stride / 4; + } + } + } } + /* end data decoding */ jpeg_finish_decompress(&cinfo); jpeg_destroy_decompress(&cinfo); @@ -467,8 +543,14 @@ eet_data_image_jpeg_rgb_decode(const void *data, int size, unsigned int src_x, u } static void * -eet_data_image_jpeg_alpha_decode(const void *data, int size, unsigned int src_x, unsigned int src_y, - unsigned int *d, unsigned int w, unsigned int h, unsigned int row_stride) +eet_data_image_jpeg_alpha_decode(const void *data, + int size, + unsigned int src_x, + unsigned int src_y, + unsigned int *d, + unsigned int w, + unsigned int h, + unsigned int row_stride) { struct jpeg_decompress_struct cinfo; struct _JPEG_error_mgr jerr; @@ -483,13 +565,15 @@ eet_data_image_jpeg_alpha_decode(const void *data, int size, unsigned int src_x, jerr.pub.error_exit = _JPEGFatalErrorHandler; jerr.pub.emit_message = _JPEGErrorHandler2; jerr.pub.output_message = _JPEGErrorHandler; - if (setjmp(jerr.setjmp_buffer)) return NULL; + if (setjmp(jerr.setjmp_buffer)) + return NULL; + jpeg_create_decompress(&cinfo); if (eet_jpeg_membuf_src(&cinfo, data, (size_t)size)) { - jpeg_destroy_decompress(&cinfo); - return NULL; + jpeg_destroy_decompress(&cinfo); + return NULL; } jpeg_read_header(&cinfo, TRUE); @@ -503,57 +587,64 @@ eet_data_image_jpeg_alpha_decode(const void *data, int size, unsigned int src_x, if (w != cinfo.output_width || h != cinfo.output_height) { - free(cinfo.src); - cinfo.src = NULL; + free(cinfo.src); + cinfo.src = NULL; - jpeg_destroy_decompress(&cinfo); - return NULL; + jpeg_destroy_decompress(&cinfo); + return NULL; } + /* end head decoding */ /* data decoding */ if (cinfo.rec_outbuf_height > 16) { - free(cinfo.src); - cinfo.src = NULL; + free(cinfo.src); + cinfo.src = NULL; - jpeg_destroy_decompress(&cinfo); - return NULL; + jpeg_destroy_decompress(&cinfo); + return NULL; } + tdata = alloca(w * 16 * 3); ptr2 = d; if (cinfo.output_components == 1) { - for (i = 0; i < (unsigned int) cinfo.rec_outbuf_height; i++) - line[i] = tdata + (i * w); - for (l = 0; l < h; l += cinfo.rec_outbuf_height) - { - jpeg_read_scanlines(&cinfo, line, cinfo.rec_outbuf_height); - scans = cinfo.rec_outbuf_height; - if ((h - l) < scans) scans = h - l; - ptr = tdata; + for (i = 0; i < (unsigned int)cinfo.rec_outbuf_height; i++) + line[i] = tdata + (i * w); + for (l = 0; l < h; l += cinfo.rec_outbuf_height) + { + jpeg_read_scanlines(&cinfo, line, cinfo.rec_outbuf_height); + scans = cinfo.rec_outbuf_height; + if ((h - l) < scans) + scans = h - l; - if (l >= src_y && l < src_y + h) - { - y = src_y - l; - if (src_y < l) y = 0; - for (ptr += iw * y; y < scans && (y + l) < (src_y + h); y++) - { - tmp = ptr2; - ptr += src_x; - for (x = 0; x < w; x++) - { - *ptr2 = - ((*ptr2) & 0x00ffffff) | - ((ptr[0]) << 24); - ptr++; - ptr2++; - } - ptr += iw - w; - ptr2 = tmp + row_stride / 4; - } - } - } + ptr = tdata; + + if (l >= src_y && l < src_y + h) + { + y = src_y - l; + if (src_y < l) + y = 0; + + for (ptr += iw * y; y < scans && (y + l) < (src_y + h); y++) + { + tmp = ptr2; + ptr += src_x; + for (x = 0; x < w; x++) + { + *ptr2 = + ((*ptr2) & 0x00ffffff) | + ((ptr[0]) << 24); + ptr++; + ptr2++; + } + ptr += iw - w; + ptr2 = tmp + row_stride / 4; + } + } + } } + /* end data decoding */ jpeg_finish_decompress(&cinfo); jpeg_destroy_decompress(&cinfo); @@ -561,108 +652,134 @@ eet_data_image_jpeg_alpha_decode(const void *data, int size, unsigned int src_x, } static void * -eet_data_image_lossless_convert(int *size, const void *data, unsigned int w, unsigned int h, int alpha) +eet_data_image_lossless_convert(int *size, + const void *data, + unsigned int w, + unsigned int h, + int alpha) { if (_eet_image_words_bigendian == -1) { - unsigned long int v; + unsigned long int v; - v = htonl(0x12345678); - if (v == 0x12345678) _eet_image_words_bigendian = 1; - else _eet_image_words_bigendian = 0; + v = htonl(0x12345678); + if (v == 0x12345678) + _eet_image_words_bigendian = 1; + else + _eet_image_words_bigendian = 0; } - { - unsigned char *d; - int *header; - d = malloc((w * h * 4) + (8 * 4)); - if (!d) return NULL; + { + unsigned char *d; + int *header; - header = (int *)d; - memset(d, 0, 32); + d = malloc((w * h * 4) + (8 * 4)); + if (!d) + return NULL; - header[0] = 0xac1dfeed; - header[1] = w; - header[2] = h; - header[3] = alpha; + header = (int *)d; + memset(d, 0, 32); - memcpy(d + 32, data, w * h * 4); + header[0] = 0xac1dfeed; + header[1] = w; + header[2] = h; + header[3] = alpha; - if (_eet_image_words_bigendian) - { - unsigned int i; + memcpy(d + 32, data, w * h * 4); - for (i = 0; i < ((w * h) + 8); i++) SWAP32(header[i]); - } - *size = ((w * h * 4) + (8 * 4)); - return d; - } + if (_eet_image_words_bigendian) + { + unsigned int i; + + for (i = 0; i < ((w * h) + 8); i++) SWAP32(header[i]); + } + + *size = ((w * h * 4) + (8 * 4)); + return d; + } } static void * -eet_data_image_lossless_compressed_convert(int *size, const void *data, unsigned int w, unsigned int h, int alpha, int compression) +eet_data_image_lossless_compressed_convert(int *size, + const void *data, + unsigned int w, + unsigned int h, + int alpha, + int compression) { if (_eet_image_words_bigendian == -1) { - unsigned long int v; + unsigned long int v; - v = htonl(0x12345678); - if (v == 0x12345678) _eet_image_words_bigendian = 1; - else _eet_image_words_bigendian = 0; + v = htonl(0x12345678); + if (v == 0x12345678) + _eet_image_words_bigendian = 1; + else + _eet_image_words_bigendian = 0; } - { - unsigned char *d; - unsigned char *comp; - int *header; - int ret; - uLongf buflen; + { + unsigned char *d; + unsigned char *comp; + int *header; + int ret; + uLongf buflen; - d = malloc((w * h * 4) + (8 * 4)); - if (!d) return NULL; - buflen = (((w * h * 101) / 100) + 3) * 4; - comp = malloc(buflen); - if (!comp) - { - free(d); - return NULL; - } - header = (int *)d; - memset(d, 0, 32); + d = malloc((w * h * 4) + (8 * 4)); + if (!d) + return NULL; - header[0] = 0xac1dfeed; - header[1] = w; - header[2] = h; - header[3] = alpha; - header[4] = compression; - memcpy(d + 32, data, w * h * 4); + buflen = (((w * h * 101) / 100) + 3) * 4; + comp = malloc(buflen); + if (!comp) + { + free(d); + return NULL; + } - if (_eet_image_words_bigendian) - { - unsigned int i; + header = (int *)d; + memset(d, 0, 32); - for (i = 0; i < ((w * h) + 8); i++) SWAP32(header[i]); - } - ret = compress2((Bytef *)comp, &buflen, - (Bytef *)(d + 32), - (uLong)(w * h * 4), - compression); - if (ret != Z_OK || buflen > (w * h * 4)) - { - free(comp); - free(d); - *size = -1; - return NULL; - } - memcpy(d + 32, comp, buflen); - *size = (8 * 4) + buflen; - free(comp); - return d; - } + header[0] = 0xac1dfeed; + header[1] = w; + header[2] = h; + header[3] = alpha; + header[4] = compression; + memcpy(d + 32, data, w * h * 4); + + if (_eet_image_words_bigendian) + { + unsigned int i; + + for (i = 0; i < ((w * h) + 8); i++) SWAP32(header[i]); + } + + ret = compress2((Bytef *)comp, &buflen, + (Bytef *)(d + 32), + (uLong)(w * h * 4), + compression); + if (ret != Z_OK || buflen > (w * h * 4)) + { + free(comp); + free(d); + *size = -1; + return NULL; + } + + memcpy(d + 32, comp, buflen); + *size = (8 * 4) + buflen; + free(comp); + return d; + } } static void * -eet_data_image_jpeg_convert(int *size, const void *data, unsigned int w, unsigned int h, int alpha, int quality) +eet_data_image_jpeg_convert(int *size, + const void *data, + unsigned int w, + unsigned int h, + int alpha, + int quality) { struct jpeg_compress_struct cinfo; struct _JPEG_error_mgr jerr; @@ -672,7 +789,7 @@ eet_data_image_jpeg_convert(int *size, const void *data, unsigned int w, unsigne JSAMPROW *jbuf; unsigned char *buf; - (void) alpha; /* unused */ + (void)alpha; /* unused */ buf = alloca(3 * w); @@ -682,13 +799,15 @@ eet_data_image_jpeg_convert(int *size, const void *data, unsigned int w, unsigne jerr.pub.error_exit = _JPEGFatalErrorHandler; jerr.pub.emit_message = _JPEGErrorHandler2; jerr.pub.output_message = _JPEGErrorHandler; - if (setjmp(jerr.setjmp_buffer)) return NULL; + if (setjmp(jerr.setjmp_buffer)) + return NULL; + jpeg_create_compress(&cinfo); if (eet_jpeg_membuf_dst(&cinfo, &d, &sz)) { - jpeg_destroy_compress(&cinfo); - return NULL; + jpeg_destroy_compress(&cinfo); + return NULL; } cinfo.image_width = w; @@ -699,30 +818,31 @@ eet_data_image_jpeg_convert(int *size, const void *data, unsigned int w, unsigne jpeg_set_quality(&cinfo, quality, TRUE); if (quality >= 90) { - cinfo.comp_info[0].h_samp_factor = 1; - cinfo.comp_info[0].v_samp_factor = 1; - cinfo.comp_info[1].h_samp_factor = 1; - cinfo.comp_info[1].v_samp_factor = 1; - cinfo.comp_info[2].h_samp_factor = 1; - cinfo.comp_info[2].v_samp_factor = 1; + cinfo.comp_info[0].h_samp_factor = 1; + cinfo.comp_info[0].v_samp_factor = 1; + cinfo.comp_info[1].h_samp_factor = 1; + cinfo.comp_info[1].v_samp_factor = 1; + cinfo.comp_info[2].h_samp_factor = 1; + cinfo.comp_info[2].v_samp_factor = 1; } + jpeg_start_compress(&cinfo, TRUE); while (cinfo.next_scanline < cinfo.image_height) { - unsigned int i, j; + unsigned int i, j; - /* convert scaline from ARGB to RGB packed */ - ptr = ((const int*) data) + cinfo.next_scanline * w; - for (j = 0, i = 0; i < w; i++) - { - buf[j++] = ((*ptr) >> 16) & 0xff; - buf[j++] = ((*ptr) >> 8) & 0xff; - buf[j++] = ((*ptr)) & 0xff; - ptr++; - } - jbuf = (JSAMPROW *) (&buf); - jpeg_write_scanlines(&cinfo, jbuf, 1); + /* convert scaline from ARGB to RGB packed */ + ptr = ((const int *)data) + cinfo.next_scanline * w; + for (j = 0, i = 0; i < w; i++) + { + buf[j++] = ((*ptr) >> 16) & 0xff; + buf[j++] = ((*ptr) >> 8) & 0xff; + buf[j++] = ((*ptr)) & 0xff; + ptr++; + } + jbuf = (JSAMPROW *)(&buf); + jpeg_write_scanlines(&cinfo, jbuf, 1); } jpeg_finish_compress(&cinfo); @@ -733,185 +853,204 @@ eet_data_image_jpeg_convert(int *size, const void *data, unsigned int w, unsigne } static void * -eet_data_image_jpeg_alpha_convert(int *size, const void *data, unsigned int w, unsigned int h, int alpha, int quality) +eet_data_image_jpeg_alpha_convert(int *size, + const void *data, + unsigned int w, + unsigned int h, + int alpha, + int quality) { unsigned char *d1, *d2; unsigned char *d; int *header; int sz1, sz2; - (void) alpha; /* unused */ + (void)alpha; /* unused */ if (_eet_image_words_bigendian == -1) { - unsigned long int v; + unsigned long int v; - v = htonl(0x12345678); - if (v == 0x12345678) _eet_image_words_bigendian = 1; - else _eet_image_words_bigendian = 0; + v = htonl(0x12345678); + if (v == 0x12345678) + _eet_image_words_bigendian = 1; + else + _eet_image_words_bigendian = 0; } - { - const int *ptr; - void *dst = NULL; - size_t sz = 0; - struct _JPEG_error_mgr jerr; - JSAMPROW *jbuf; - struct jpeg_compress_struct cinfo; - unsigned char *buf; + { + const int *ptr; + void *dst = NULL; + size_t sz = 0; + struct _JPEG_error_mgr jerr; + JSAMPROW *jbuf; + struct jpeg_compress_struct cinfo; + unsigned char *buf; - buf = alloca(3 * w); + buf = alloca(3 * w); - cinfo.err = jpeg_std_error(&(jerr.pub)); - jerr.pub.error_exit = _JPEGFatalErrorHandler; - jerr.pub.emit_message = _JPEGErrorHandler2; - jerr.pub.output_message = _JPEGErrorHandler; - if (setjmp(jerr.setjmp_buffer)) return NULL; + cinfo.err = jpeg_std_error(&(jerr.pub)); + jerr.pub.error_exit = _JPEGFatalErrorHandler; + jerr.pub.emit_message = _JPEGErrorHandler2; + jerr.pub.output_message = _JPEGErrorHandler; + if (setjmp(jerr.setjmp_buffer)) + return NULL; - jpeg_create_compress(&cinfo); - if (eet_jpeg_membuf_dst(&cinfo, &dst, &sz)) - { - jpeg_destroy_compress(&cinfo); - return NULL; - } + jpeg_create_compress(&cinfo); + if (eet_jpeg_membuf_dst(&cinfo, &dst, &sz)) + { + jpeg_destroy_compress(&cinfo); + return NULL; + } - cinfo.image_width = w; - cinfo.image_height = h; - cinfo.input_components = 3; - cinfo.in_color_space = JCS_RGB; - jpeg_set_defaults(&cinfo); - jpeg_set_quality(&cinfo, quality, TRUE); - if (quality >= 90) - { - cinfo.comp_info[0].h_samp_factor = 1; - cinfo.comp_info[0].v_samp_factor = 1; - cinfo.comp_info[1].h_samp_factor = 1; - cinfo.comp_info[1].v_samp_factor = 1; - cinfo.comp_info[2].h_samp_factor = 1; - cinfo.comp_info[2].v_samp_factor = 1; - } - jpeg_start_compress(&cinfo, TRUE); + cinfo.image_width = w; + cinfo.image_height = h; + cinfo.input_components = 3; + cinfo.in_color_space = JCS_RGB; + jpeg_set_defaults(&cinfo); + jpeg_set_quality(&cinfo, quality, TRUE); + if (quality >= 90) + { + cinfo.comp_info[0].h_samp_factor = 1; + cinfo.comp_info[0].v_samp_factor = 1; + cinfo.comp_info[1].h_samp_factor = 1; + cinfo.comp_info[1].v_samp_factor = 1; + cinfo.comp_info[2].h_samp_factor = 1; + cinfo.comp_info[2].v_samp_factor = 1; + } - while (cinfo.next_scanline < cinfo.image_height) - { - unsigned int i, j; + jpeg_start_compress(&cinfo, TRUE); - ptr = ((const int*) data) + cinfo.next_scanline * w; - /* convert scaline from ARGB to RGB packed */ - for (j = 0, i = 0; i < w; i++) - { - buf[j++] = ((*ptr) >> 16) & 0xff; - buf[j++] = ((*ptr) >> 8) & 0xff; - buf[j++] = ((*ptr)) & 0xff; - ptr++; - } - jbuf = (JSAMPROW *) (&buf); - jpeg_write_scanlines(&cinfo, jbuf, 1); - } + while (cinfo.next_scanline < cinfo.image_height) + { + unsigned int i, j; - jpeg_finish_compress(&cinfo); - jpeg_destroy_compress(&cinfo); + ptr = ((const int *)data) + cinfo.next_scanline * w; + /* convert scaline from ARGB to RGB packed */ + for (j = 0, i = 0; i < w; i++) + { + buf[j++] = ((*ptr) >> 16) & 0xff; + buf[j++] = ((*ptr) >> 8) & 0xff; + buf[j++] = ((*ptr)) & 0xff; + ptr++; + } + jbuf = (JSAMPROW *)(&buf); + jpeg_write_scanlines(&cinfo, jbuf, 1); + } - d1 = dst; - sz1 = sz; - } - { - const int *ptr; - void *dst = NULL; - size_t sz = 0; - struct _JPEG_error_mgr jerr; - JSAMPROW *jbuf; - struct jpeg_compress_struct cinfo; - unsigned char *buf; + jpeg_finish_compress(&cinfo); + jpeg_destroy_compress(&cinfo); - buf = alloca(3 * w); + d1 = dst; + sz1 = sz; + } + { + const int *ptr; + void *dst = NULL; + size_t sz = 0; + struct _JPEG_error_mgr jerr; + JSAMPROW *jbuf; + struct jpeg_compress_struct cinfo; + unsigned char *buf; - cinfo.err = jpeg_std_error(&(jerr.pub)); - jerr.pub.error_exit = _JPEGFatalErrorHandler; - jerr.pub.emit_message = _JPEGErrorHandler2; - jerr.pub.output_message = _JPEGErrorHandler; - if (setjmp(jerr.setjmp_buffer)) - { - free(d1); - return NULL; - } + buf = alloca(3 * w); - jpeg_create_compress(&cinfo); - if (eet_jpeg_membuf_dst(&cinfo, &dst, &sz)) - { - jpeg_destroy_compress(&cinfo); - free(d1); - return NULL; - } + cinfo.err = jpeg_std_error(&(jerr.pub)); + jerr.pub.error_exit = _JPEGFatalErrorHandler; + jerr.pub.emit_message = _JPEGErrorHandler2; + jerr.pub.output_message = _JPEGErrorHandler; + if (setjmp(jerr.setjmp_buffer)) + { + free(d1); + return NULL; + } - cinfo.image_width = w; - cinfo.image_height = h; - cinfo.input_components = 1; - cinfo.in_color_space = JCS_GRAYSCALE; - jpeg_set_defaults(&cinfo); - jpeg_set_quality(&cinfo, quality, TRUE); - if (quality >= 90) - { - cinfo.comp_info[0].h_samp_factor = 1; - cinfo.comp_info[0].v_samp_factor = 1; - cinfo.comp_info[1].h_samp_factor = 1; - cinfo.comp_info[1].v_samp_factor = 1; - cinfo.comp_info[2].h_samp_factor = 1; - cinfo.comp_info[2].v_samp_factor = 1; - } - jpeg_start_compress(&cinfo, TRUE); + jpeg_create_compress(&cinfo); + if (eet_jpeg_membuf_dst(&cinfo, &dst, &sz)) + { + jpeg_destroy_compress(&cinfo); + free(d1); + return NULL; + } - while (cinfo.next_scanline < cinfo.image_height) - { - unsigned int i, j; + cinfo.image_width = w; + cinfo.image_height = h; + cinfo.input_components = 1; + cinfo.in_color_space = JCS_GRAYSCALE; + jpeg_set_defaults(&cinfo); + jpeg_set_quality(&cinfo, quality, TRUE); + if (quality >= 90) + { + cinfo.comp_info[0].h_samp_factor = 1; + cinfo.comp_info[0].v_samp_factor = 1; + cinfo.comp_info[1].h_samp_factor = 1; + cinfo.comp_info[1].v_samp_factor = 1; + cinfo.comp_info[2].h_samp_factor = 1; + cinfo.comp_info[2].v_samp_factor = 1; + } - ptr = ((const int*) data) + cinfo.next_scanline * w; - /* convert scaline from ARGB to RGB packed */ - for (j = 0, i = 0; i < w; i++) - { - buf[j++] = ((*ptr) >> 24) & 0xff; - ptr++; - } - jbuf = (JSAMPROW *) (&buf); - jpeg_write_scanlines(&cinfo, jbuf, 1); - } + jpeg_start_compress(&cinfo, TRUE); - jpeg_finish_compress(&cinfo); - jpeg_destroy_compress(&cinfo); + while (cinfo.next_scanline < cinfo.image_height) + { + unsigned int i, j; - d2 = dst; - sz2 = sz; - } + ptr = ((const int *)data) + cinfo.next_scanline * w; + /* convert scaline from ARGB to RGB packed */ + for (j = 0, i = 0; i < w; i++) + { + buf[j++] = ((*ptr) >> 24) & 0xff; + ptr++; + } + jbuf = (JSAMPROW *)(&buf); + jpeg_write_scanlines(&cinfo, jbuf, 1); + } + + jpeg_finish_compress(&cinfo); + jpeg_destroy_compress(&cinfo); + + d2 = dst; + sz2 = sz; + } d = malloc(12 + sz1 + sz2); if (!d) { - free(d1); - free(d2); - return NULL; + free(d1); + free(d2); + return NULL; } + header = (int *)d; header[0] = 0xbeeff00d; header[1] = sz1; header[2] = sz2; if (_eet_image_words_bigendian) { - int i; + int i; - for (i = 0; i < 3; i++) SWAP32(header[i]); + for (i = 0; i < 3; i++) SWAP32(header[i]); } - memcpy(d + 12, d1, sz1); - memcpy(d + 12 + sz1, d2, sz2); - free(d1); - free(d2); + memcpy(d + 12, d1, sz1); + memcpy(d + 12 + sz1, d2, sz2); + + free(d1); + free(d2); *size = 12 + sz1 + sz2; return d; } EAPI int -eet_data_image_write_cipher(Eet_File *ef, const char *name, const char *cipher_key, - const void *data, unsigned int w, unsigned int h, int alpha, - int comp, int quality, int lossy) +eet_data_image_write_cipher(Eet_File *ef, + const char *name, + const char *cipher_key, + const void *data, + unsigned int w, + unsigned int h, + int alpha, + int comp, + int quality, + int lossy) { void *d = NULL; int size = 0; @@ -919,131 +1058,238 @@ eet_data_image_write_cipher(Eet_File *ef, const char *name, const char *cipher_k d = eet_data_image_encode(data, &size, w, h, alpha, comp, quality, lossy); if (d) { - int v; + int v; - v = eet_write_cipher(ef, name, d, size, 0, cipher_key); - free(d); - return v; + v = eet_write_cipher(ef, name, d, size, 0, cipher_key); + free(d); + return v; } + return 0; } EAPI int -eet_data_image_write(Eet_File *ef, const char *name, - const void *data, unsigned int w, unsigned int h, int alpha, - int comp, int quality, int lossy) +eet_data_image_write(Eet_File *ef, + const char *name, + const void *data, + unsigned int w, + unsigned int h, + int alpha, + int comp, + int quality, + int lossy) { - return eet_data_image_write_cipher(ef, name, NULL, data, w, h, alpha, comp, quality, lossy); + return eet_data_image_write_cipher(ef, + name, + NULL, + data, + w, + h, + alpha, + comp, + quality, + lossy); } EAPI void * -eet_data_image_read_cipher(Eet_File *ef, const char *name, const char *cipher_key, - unsigned int *w, unsigned int *h, int *alpha, - int *comp, int *quality, int *lossy) +eet_data_image_read_cipher(Eet_File *ef, + const char *name, + const char *cipher_key, + unsigned int *w, + unsigned int *h, + int *alpha, + int *comp, + int *quality, + int *lossy) { unsigned int *d = NULL; - void *data = NULL; - int free_data = 0; - int size; + void *data = NULL; + int free_data = 0; + int size; if (!cipher_key) - data = (void *)eet_read_direct(ef, name, &size); + data = (void *)eet_read_direct(ef, name, &size); + if (!data) { data = eet_read_cipher(ef, name, &size, cipher_key); - free_data = 1; - if (!data) return NULL; + free_data = 1; + if (!data) + return NULL; } d = eet_data_image_decode(data, size, w, h, alpha, comp, quality, lossy); if (free_data) - free(data); + free(data); return d; } EAPI void * eet_data_image_read(Eet_File *ef, const char *name, - unsigned int *w, unsigned int *h, int *alpha, - int *comp, int *quality, int *lossy) + unsigned int *w, unsigned int *h, int *alpha, + int *comp, int *quality, int *lossy) { - return eet_data_image_read_cipher(ef, name, NULL, w, h, alpha, comp, quality, lossy); + return eet_data_image_read_cipher(ef, + name, + NULL, + w, + h, + alpha, + comp, + quality, + lossy); } EAPI int -eet_data_image_read_to_surface_cipher(Eet_File *ef, const char *name, const char *cipher_key, unsigned int src_x, unsigned int src_y, - unsigned int *d, unsigned int w, unsigned int h, unsigned int row_stride, - int *alpha, int *comp, int *quality, int *lossy) +eet_data_image_read_to_surface_cipher(Eet_File *ef, + const char *name, + const char *cipher_key, + unsigned int src_x, + unsigned int src_y, + unsigned int *d, + unsigned int w, + unsigned int h, + unsigned int row_stride, + int *alpha, + int *comp, + int *quality, + int *lossy) { - void *data = NULL; - int free_data = 0; - int res = 1; - int size; + void *data = NULL; + int free_data = 0; + int res = 1; + int size; if (!cipher_key) - data = (void *)eet_read_direct(ef, name, &size); + data = (void *)eet_read_direct(ef, name, &size); + if (!data) { - data = eet_read_cipher(ef, name, &size, cipher_key); - free_data = 1; - if (!data) return 0; + data = eet_read_cipher(ef, name, &size, cipher_key); + free_data = 1; + if (!data) + return 0; } - res = eet_data_image_decode_to_surface(data, size, src_x, src_y, d, w, h, row_stride, alpha, comp, quality, lossy); + res = eet_data_image_decode_to_surface(data, + size, + src_x, + src_y, + d, + w, + h, + row_stride, + alpha, + comp, + quality, + lossy); if (free_data) - free(data); + free(data); return res; } EAPI int -eet_data_image_read_to_surface(Eet_File *ef, const char *name, unsigned int src_x, unsigned int src_y, - unsigned int *d, unsigned int w, unsigned int h, unsigned int row_stride, - int *alpha, int *comp, int *quality, int *lossy) +eet_data_image_read_to_surface(Eet_File *ef, + const char *name, + unsigned int src_x, + unsigned int src_y, + unsigned int *d, + unsigned int w, + unsigned int h, + unsigned int row_stride, + int *alpha, + int *comp, + int *quality, + int *lossy) { - return eet_data_image_read_to_surface_cipher(ef, name, NULL, src_x, src_y, d, w, h, row_stride, alpha, comp, quality, lossy); + return eet_data_image_read_to_surface_cipher(ef, + name, + NULL, + src_x, + src_y, + d, + w, + h, + row_stride, + alpha, + comp, + quality, + lossy); } EAPI int -eet_data_image_header_read_cipher(Eet_File *ef, const char *name, const char *cipher_key, - unsigned int *w, unsigned int *h, int *alpha, - int *comp, int *quality, int *lossy) +eet_data_image_header_read_cipher(Eet_File *ef, + const char *name, + const char *cipher_key, + unsigned int *w, + unsigned int *h, + int *alpha, + int *comp, + int *quality, + int *lossy) { - void *data = NULL; - int size = 0; - int free_data = 0; - int d; + void *data = NULL; + int size = 0; + int free_data = 0; + int d; if (!cipher_key) - data = (void *)eet_read_direct(ef, name, &size); + data = (void *)eet_read_direct(ef, name, &size); + if (!data) { data = eet_read_cipher(ef, name, &size, cipher_key); - free_data = 1; - if (!data) return 0; + free_data = 1; + if (!data) + return 0; } - d = eet_data_image_header_decode(data, size, w, h, alpha, comp, quality, lossy); + d = eet_data_image_header_decode(data, + size, + w, + h, + alpha, + comp, + quality, + lossy); if (free_data) - free(data); + free(data); return d; } EAPI int eet_data_image_header_read(Eet_File *ef, const char *name, - unsigned int *w, unsigned int *h, int *alpha, - int *comp, int *quality, int *lossy) + unsigned int *w, unsigned int *h, int *alpha, + int *comp, int *quality, int *lossy) { - return eet_data_image_header_read_cipher(ef, name, NULL, w, h, alpha, comp, quality, lossy); + return eet_data_image_header_read_cipher(ef, + name, + NULL, + w, + h, + alpha, + comp, + quality, + lossy); } EAPI void * -eet_data_image_encode_cipher(const void *data, const char *cipher_key, unsigned int w, unsigned int h, int alpha, int comp, int quality, int lossy, int *size_ret) +eet_data_image_encode_cipher(const void *data, + const char *cipher_key, + unsigned int w, + unsigned int h, + int alpha, + int comp, + int quality, + int lossy, + int *size_ret) { void *d = NULL; void *ciphered_d = NULL; @@ -1052,45 +1298,85 @@ eet_data_image_encode_cipher(const void *data, const char *cipher_key, unsigned if (lossy == 0) { - if (comp > 0) - d = eet_data_image_lossless_compressed_convert(&size, data, w, h, alpha, comp); + if (comp > 0) + d = eet_data_image_lossless_compressed_convert(&size, + data, + w, + h, + alpha, + comp); - /* eet_data_image_lossless_compressed_convert will refuse to compress something - if the result is bigger than the entry. */ - if (comp <= 0 || d == NULL) - d = eet_data_image_lossless_convert(&size, data, w, h, alpha); + /* eet_data_image_lossless_compressed_convert will refuse to compress something + if the result is bigger than the entry. */ + if (comp <= 0 || d == NULL) + d = eet_data_image_lossless_convert(&size, data, w, h, alpha); } else { - if (!alpha) - d = eet_data_image_jpeg_convert(&size, data, w, h, alpha, quality); - else - d = eet_data_image_jpeg_alpha_convert(&size, data, w, h, alpha, quality); - } - if (cipher_key) - { - if(!eet_cipher(d, size, cipher_key, strlen(cipher_key), &ciphered_d, &ciphered_sz)) - { - if (d) free(d); - d = ciphered_d; - size = ciphered_sz; - } - else - if (ciphered_d) free(ciphered_d); + if (!alpha) + d = eet_data_image_jpeg_convert(&size, data, w, h, alpha, quality); + else + d = eet_data_image_jpeg_alpha_convert(&size, + data, + w, + h, + alpha, + quality); } - if (size_ret) *size_ret = size; + if (cipher_key) + { + if(!eet_cipher(d, size, cipher_key, strlen(cipher_key), &ciphered_d, + &ciphered_sz)) + { + if (d) + free(d); + + d = ciphered_d; + size = ciphered_sz; + } + else + if (ciphered_d) + free(ciphered_d); + } + + if (size_ret) + *size_ret = size; + return d; } EAPI void * -eet_data_image_encode(const void *data, int *size_ret, unsigned int w, unsigned int h, int alpha, int comp, int quality, int lossy) +eet_data_image_encode(const void *data, + int *size_ret, + unsigned int w, + unsigned int h, + int alpha, + int comp, + int quality, + int lossy) { - return eet_data_image_encode_cipher(data, NULL, w, h, alpha, comp, quality, lossy, size_ret); + return eet_data_image_encode_cipher(data, + NULL, + w, + h, + alpha, + comp, + quality, + lossy, + size_ret); } EAPI int -eet_data_image_header_decode_cipher(const void *data, const char *cipher_key, int size, unsigned int *w, unsigned int *h, int *alpha, int *comp, int *quality, int *lossy) +eet_data_image_header_decode_cipher(const void *data, + const char *cipher_key, + int size, + unsigned int *w, + unsigned int *h, + int *alpha, + int *comp, + int *quality, + int *lossy) { int header[8]; void *deciphered_d = NULL; @@ -1098,215 +1384,310 @@ eet_data_image_header_decode_cipher(const void *data, const char *cipher_key, in if (cipher_key) { - if (!eet_decipher(data, size, cipher_key, strlen(cipher_key), &deciphered_d, &deciphered_sz)) - { - data = deciphered_d; - size = deciphered_sz; - } - else - if (deciphered_d) free(deciphered_d); + if (!eet_decipher(data, size, cipher_key, strlen(cipher_key), + &deciphered_d, &deciphered_sz)) + { + data = deciphered_d; + size = deciphered_sz; + } + else + if (deciphered_d) + free(deciphered_d); } if (_eet_image_words_bigendian == -1) { - unsigned long int v; + unsigned long int v; - v = htonl(0x12345678); - if (v == 0x12345678) _eet_image_words_bigendian = 1; - else _eet_image_words_bigendian = 0; + v = htonl(0x12345678); + if (v == 0x12345678) + _eet_image_words_bigendian = 1; + else + _eet_image_words_bigendian = 0; } - if (size < 32) return 0; + if (size < 32) + return 0; - memcpy(header, data, 32); + memcpy(header, data, 32); if (_eet_image_words_bigendian) { - int i; + int i; - for (i = 0; i < 8; i++) SWAP32(header[i]); + for (i = 0; i < 8; i++) SWAP32(header[i]); } + if ((unsigned)header[0] == 0xac1dfeed) { - int iw, ih, al, cp; + int iw, ih, al, cp; - iw = header[1]; - ih = header[2]; - al = header[3]; - cp = header[4]; - if ((iw < 1) || (ih < 1) || (iw > 8192) || (ih > 8192)) return 0; - if ((cp == 0) && (size < ((iw * ih * 4) + 32))) return 0; - if (w) *w = iw; - if (h) *h = ih; - if (alpha) *alpha = al ? 1 : 0; - if (comp) *comp = cp; - if (lossy) *lossy = 0; - if (quality) *quality = 100; - return 1; + iw = header[1]; + ih = header[2]; + al = header[3]; + cp = header[4]; + if ((iw < 1) || (ih < 1) || (iw > 8192) || (ih > 8192)) + return 0; + + if ((cp == 0) && (size < ((iw * ih * 4) + 32))) + return 0; + + if (w) + *w = iw; + + if (h) + *h = ih; + + if (alpha) + *alpha = al ? 1 : 0; + + if (comp) + *comp = cp; + + if (lossy) + *lossy = 0; + + if (quality) + *quality = 100; + + return 1; } else if ((unsigned)header[0] == 0xbeeff00d) { - unsigned int iw = 0, ih = 0; - unsigned const char *dt; - int sz1; - int ok; + unsigned int iw = 0, ih = 0; + unsigned const char *dt; + int sz1; + int ok; - sz1 = header[1]; -/* sz2 = header[2]; */ - dt = data; - dt += 12; - ok = eet_data_image_jpeg_header_decode(dt, sz1, &iw, &ih); - if (ok) - { - if (w) *w = iw; - if (h) *h = ih; - if (alpha) *alpha = 1; - if (comp) *comp = 0; - if (lossy) *lossy = 1; - if (quality) *quality = 75; - return 1; - } + sz1 = header[1]; +/* sz2 = header[2]; */ + dt = data; + dt += 12; + ok = eet_data_image_jpeg_header_decode(dt, sz1, &iw, &ih); + if (ok) + { + if (w) + *w = iw; + + if (h) + *h = ih; + + if (alpha) + *alpha = 1; + + if (comp) + *comp = 0; + + if (lossy) + *lossy = 1; + + if (quality) + *quality = 75; + + return 1; + } } else { - unsigned int iw = 0, ih = 0; - int ok; + unsigned int iw = 0, ih = 0; + int ok; - ok = eet_data_image_jpeg_header_decode(data, size, &iw, &ih); - if (ok) - { - if (w) *w = iw; - if (h) *h = ih; - if (alpha) *alpha = 0; - if (comp) *comp = 0; - if (lossy) *lossy = 1; - if (quality) *quality = 75; - return 1; - } + ok = eet_data_image_jpeg_header_decode(data, size, &iw, &ih); + if (ok) + { + if (w) + *w = iw; + + if (h) + *h = ih; + + if (alpha) + *alpha = 0; + + if (comp) + *comp = 0; + + if (lossy) + *lossy = 1; + + if (quality) + *quality = 75; + + return 1; + } } + return 0; } EAPI int -eet_data_image_header_decode(const void *data, int size, unsigned int *w, unsigned int *h, int *alpha, int *comp, int *quality, int *lossy) +eet_data_image_header_decode(const void *data, + int size, + unsigned int *w, + unsigned int *h, + int *alpha, + int *comp, + int *quality, + int *lossy) { - return eet_data_image_header_decode_cipher(data, NULL, size, w, h, alpha, comp, quality, lossy); + return eet_data_image_header_decode_cipher(data, + NULL, + size, + w, + h, + alpha, + comp, + quality, + lossy); } static void -_eet_data_image_copy_buffer(const unsigned int *src, unsigned int src_x, unsigned int src_y, unsigned int src_w, - unsigned int *dst, unsigned int w, unsigned int h, unsigned int row_stride) +_eet_data_image_copy_buffer(const unsigned int *src, + unsigned int src_x, + unsigned int src_y, + unsigned int src_w, + unsigned int *dst, + unsigned int w, + unsigned int h, + unsigned int row_stride) { src += src_x + src_y * src_w; if (row_stride == src_w * 4 && w == src_w) - { - memcpy(dst, src, row_stride * h); - } + memcpy(dst, src, row_stride * h); else { - unsigned int *over = dst; - unsigned int y; + unsigned int *over = dst; + unsigned int y; - for (y = 0; y < h; ++y, src += src_w, over += row_stride) - memcpy(over, src, w * 4); + for (y = 0; y < h; ++y, src += src_w, over += row_stride) + memcpy(over, src, w * 4); } } static int -_eet_data_image_decode_inside(const void *data, int size, unsigned int src_x, unsigned int src_y, - unsigned int src_w, unsigned int src_h, - unsigned int *d, unsigned int w, unsigned int h, unsigned int row_stride, - int alpha, int comp, int quality, int lossy) +_eet_data_image_decode_inside(const void *data, + int size, + unsigned int src_x, + unsigned int src_y, + unsigned int src_w, + unsigned int src_h, + unsigned int *d, + unsigned int w, + unsigned int h, + unsigned int row_stride, + int alpha, + int comp, + int quality, + int lossy) { if (lossy == 0 && quality == 100) { - unsigned int *body; + unsigned int *body; - body = ((unsigned int *)data) + 8; - if (!comp) - { - _eet_data_image_copy_buffer(body, src_x, src_y, src_w, d, w, h, row_stride); - } - else - { - if (src_h == h && src_w == w && row_stride == src_w * 4) - { - uLongf dlen; + body = ((unsigned int *)data) + 8; + if (!comp) + _eet_data_image_copy_buffer(body, + src_x, + src_y, + src_w, + d, + w, + h, + row_stride); + else + { + if (src_h == h && src_w == w && row_stride == src_w * 4) + { + uLongf dlen; - dlen = w * h * 4; - uncompress((Bytef *)d, &dlen, (Bytef *)body, - (uLongf)(size - 32)); - } - else - { - Bytef *dtmp; - uLongf dlen = src_w * src_h * 4; + dlen = w * h * 4; + uncompress((Bytef *)d, &dlen, (Bytef *)body, + (uLongf)(size - 32)); + } + else + { + Bytef *dtmp; + uLongf dlen = src_w * src_h * 4; - /* FIXME: This could create a huge alloc. So compressed data and tile could not always work. */ - dtmp = malloc(dlen); - if (!dtmp) return 0; + /* FIXME: This could create a huge alloc. So compressed data and tile could not always work. */ + dtmp = malloc(dlen); + if (!dtmp) + return 0; - uncompress(dtmp, &dlen, (Bytef *)body, (uLongf)(size - 32)); + uncompress(dtmp, &dlen, (Bytef *)body, (uLongf)(size - 32)); - _eet_data_image_copy_buffer((unsigned int *) dtmp, src_x, src_y, src_w, d, w, h, row_stride); + _eet_data_image_copy_buffer((unsigned int *)dtmp, + src_x, + src_y, + src_w, + d, + w, + h, + row_stride); - free(dtmp); - } - } + free(dtmp); + } + } - /* Fix swapiness. */ - if (_eet_image_words_bigendian) - { - unsigned int x; + /* Fix swapiness. */ + if (_eet_image_words_bigendian) + { + unsigned int x; - for (x = 0; x < (w * h); x++) SWAP32(d[x]); - } + for (x = 0; x < (w * h); x++) SWAP32(d[x]); + } } else if (comp == 0 && lossy == 1) { - if (alpha) - { - unsigned const char *dt; - int header[8]; - int sz1, sz2; + if (alpha) + { + unsigned const char *dt; + int header[8]; + int sz1, sz2; - memcpy(header, data, 32); - if (_eet_image_words_bigendian) - { - int i; + memcpy(header, data, 32); + if (_eet_image_words_bigendian) + { + int i; - for (i = 0; i < 8; i++) SWAP32(header[i]); - } + for (i = 0; i < 8; i++) SWAP32(header[i]); + } - sz1 = header[1]; - sz2 = header[2]; - dt = data; - dt += 12; + sz1 = header[1]; + sz2 = header[2]; + dt = data; + dt += 12; - if (eet_data_image_jpeg_rgb_decode(dt, sz1, src_x, src_y, d, w, h, row_stride)) - { - dt += sz1; - if (!eet_data_image_jpeg_alpha_decode(dt, sz2, src_x, src_y, d, w, h, row_stride)) - return 0; - } - } - else - { - if (!eet_data_image_jpeg_rgb_decode(data, size, src_x, src_y, d, w, h, row_stride)) - return 0; - } + if (eet_data_image_jpeg_rgb_decode(dt, sz1, src_x, src_y, d, w, h, + row_stride)) + { + dt += sz1; + if (!eet_data_image_jpeg_alpha_decode(dt, sz2, src_x, src_y, + d, w, h, row_stride)) + return 0; + } + } + else if (!eet_data_image_jpeg_rgb_decode(data, size, src_x, src_y, d, w, + h, row_stride)) + return 0; } else - { - abort(); - } + abort(); return 1; } EAPI void * -eet_data_image_decode_cipher(const void *data, const char *cipher_key, int size, unsigned int *w, unsigned int *h, int *alpha, int *comp, int *quality, int *lossy) +eet_data_image_decode_cipher(const void *data, + const char *cipher_key, + int size, + unsigned int *w, + unsigned int *h, + int *alpha, + int *comp, + int *quality, + int *lossy) { unsigned int *d = NULL; unsigned int iw, ih; @@ -1316,48 +1697,89 @@ eet_data_image_decode_cipher(const void *data, const char *cipher_key, int size, if (cipher_key) { - if (!eet_decipher(data, size, cipher_key, strlen(cipher_key), &deciphered_d, &deciphered_sz)) - { - data = deciphered_d; - size = deciphered_sz; - } - else - if (deciphered_d) free(deciphered_d); + if (!eet_decipher(data, size, cipher_key, strlen(cipher_key), + &deciphered_d, &deciphered_sz)) + { + data = deciphered_d; + size = deciphered_sz; + } + else + if (deciphered_d) + free(deciphered_d); } /* All check are done during header decode, this simplify the code a lot. */ - if (!eet_data_image_header_decode(data, size, &iw, &ih, &ialpha, &icompress, &iquality, &ilossy)) - return NULL; + if (!eet_data_image_header_decode(data, size, &iw, &ih, &ialpha, &icompress, + &iquality, &ilossy)) + return NULL; d = malloc(iw * ih * 4); - if (!d) return NULL; + if (!d) + return NULL; - if (!_eet_data_image_decode_inside(data, size, 0, 0, iw, ih, d, iw, ih, iw * 4, ialpha, icompress, iquality, ilossy)) + if (!_eet_data_image_decode_inside(data, size, 0, 0, iw, ih, d, iw, ih, iw * + 4, ialpha, icompress, iquality, ilossy)) { - free(d); - return NULL; + free(d); + return NULL; } - if (w) *w = iw; - if (h) *h = ih; - if (alpha) *alpha = ialpha; - if (comp) *comp = icompress; - if (quality) *quality = iquality; - if (lossy) *lossy = ilossy; + if (w) + *w = iw; + + if (h) + *h = ih; + + if (alpha) + *alpha = ialpha; + + if (comp) + *comp = icompress; + + if (quality) + *quality = iquality; + + if (lossy) + *lossy = ilossy; return d; } EAPI void * -eet_data_image_decode(const void *data, int size, unsigned int *w, unsigned int *h, int *alpha, int *comp, int *quality, int *lossy) +eet_data_image_decode(const void *data, + int size, + unsigned int *w, + unsigned int *h, + int *alpha, + int *comp, + int *quality, + int *lossy) { - return eet_data_image_decode_cipher(data, NULL, size, w, h, alpha, comp, quality, lossy); + return eet_data_image_decode_cipher(data, + NULL, + size, + w, + h, + alpha, + comp, + quality, + lossy); } EAPI int -eet_data_image_decode_to_surface_cipher(const void *data, const char *cipher_key, int size, unsigned int src_x, unsigned int src_y, - unsigned int *d, unsigned int w, unsigned int h, unsigned int row_stride, - int *alpha, int *comp, int *quality, int *lossy) +eet_data_image_decode_to_surface_cipher(const void *data, + const char *cipher_key, + int size, + unsigned int src_x, + unsigned int src_y, + unsigned int *d, + unsigned int w, + unsigned int h, + unsigned int row_stride, + int *alpha, + int *comp, + int *quality, + int *lossy) { unsigned int iw, ih; int ialpha, icompress, iquality, ilossy; @@ -1366,38 +1788,76 @@ eet_data_image_decode_to_surface_cipher(const void *data, const char *cipher_key if (cipher_key) { - if (!eet_decipher(data, size, cipher_key, strlen(cipher_key), &deciphered_d, &deciphered_sz)) - { - data = deciphered_d; - size = deciphered_sz; - } - else - if (deciphered_d) free(deciphered_d); + if (!eet_decipher(data, size, cipher_key, strlen(cipher_key), + &deciphered_d, &deciphered_sz)) + { + data = deciphered_d; + size = deciphered_sz; + } + else + if (deciphered_d) + free(deciphered_d); } /* All check are done during header decode, this simplify the code a lot. */ - if (!eet_data_image_header_decode(data, size, &iw, &ih, &ialpha, &icompress, &iquality, &ilossy)) - return 0; + if (!eet_data_image_header_decode(data, size, &iw, &ih, &ialpha, &icompress, + &iquality, &ilossy)) + return 0; - if (!d) return 0; - if (w * 4 > row_stride) return 0; - if (w > iw || h > ih) return 0; + if (!d) + return 0; - if (!_eet_data_image_decode_inside(data, size, src_x, src_y, iw, ih, d, w, h, row_stride, ialpha, icompress, iquality, ilossy)) - return 0; + if (w * 4 > row_stride) + return 0; - if (alpha) *alpha = ialpha; - if (comp) *comp = icompress; - if (quality) *quality = iquality; - if (lossy) *lossy = ilossy; + if (w > iw || h > ih) + return 0; + + if (!_eet_data_image_decode_inside(data, size, src_x, src_y, iw, ih, d, w, h, + row_stride, ialpha, icompress, iquality, + ilossy)) + return 0; + + if (alpha) + *alpha = ialpha; + + if (comp) + *comp = icompress; + + if (quality) + *quality = iquality; + + if (lossy) + *lossy = ilossy; return 1; } EAPI int -eet_data_image_decode_to_surface(const void *data, int size, unsigned int src_x, unsigned int src_y, - unsigned int *d, unsigned int w, unsigned int h, unsigned int row_stride, - int *alpha, int *comp, int *quality, int *lossy) +eet_data_image_decode_to_surface(const void *data, + int size, + unsigned int src_x, + unsigned int src_y, + unsigned int *d, + unsigned int w, + unsigned int h, + unsigned int row_stride, + int *alpha, + int *comp, + int *quality, + int *lossy) { - return eet_data_image_decode_to_surface_cipher(data, NULL, size, src_x, src_y, d, w, h, row_stride, alpha, comp, quality, lossy); + return eet_data_image_decode_to_surface_cipher(data, + NULL, + size, + src_x, + src_y, + d, + w, + h, + row_stride, + alpha, + comp, + quality, + lossy); } diff --git a/legacy/eet/src/lib/eet_lib.c b/legacy/eet/src/lib/eet_lib.c index cd3e703092..15501acb15 100644 --- a/legacy/eet/src/lib/eet_lib.c +++ b/legacy/eet/src/lib/eet_lib.c @@ -81,76 +81,76 @@ EAPI Eet_Version *eet_version = &_version; #define EET_MAGIC_FILE2 0x1ee70f42 -typedef struct _Eet_File_Header Eet_File_Header; -typedef struct _Eet_File_Node Eet_File_Node; -typedef struct _Eet_File_Directory Eet_File_Directory; +typedef struct _Eet_File_Header Eet_File_Header; +typedef struct _Eet_File_Node Eet_File_Node; +typedef struct _Eet_File_Directory Eet_File_Directory; struct _Eet_File { - char *path; - FILE *readfp; - Eet_File_Header *header; - Eet_Dictionary *ed; - Eet_Key *key; - const unsigned char *data; - const void *x509_der; - const void *signature; - void *sha1; + char *path; + FILE *readfp; + Eet_File_Header *header; + Eet_Dictionary *ed; + Eet_Key *key; + const unsigned char *data; + const void *x509_der; + const void *signature; + void *sha1; - Eet_File_Mode mode; + Eet_File_Mode mode; - int magic; - int references; + int magic; + int references; - int data_size; - int x509_length; - unsigned int signature_length; - int sha1_length; + int data_size; + int x509_length; + unsigned int signature_length; + int sha1_length; - time_t mtime; + time_t mtime; #ifdef EFL_HAVE_THREADS # ifdef EFL_HAVE_POSIX_THREADS - pthread_mutex_t file_lock; + pthread_mutex_t file_lock; # else - HANDLE file_lock; + HANDLE file_lock; # endif #endif - unsigned char writes_pending : 1; - unsigned char delete_me_now : 1; + unsigned char writes_pending : 1; + unsigned char delete_me_now : 1; }; struct _Eet_File_Header { - int magic; + int magic; Eet_File_Directory *directory; }; struct _Eet_File_Directory { - int size; + int size; Eet_File_Node **nodes; }; struct _Eet_File_Node { - char *name; - void *data; - Eet_File_Node *next; /* FIXME: make buckets linked lists */ + char *name; + void *data; + Eet_File_Node *next; /* FIXME: make buckets linked lists */ - int offset; - int dictionary_offset; - int name_offset; + int offset; + int dictionary_offset; + int name_offset; - int name_size; - int size; - int data_size; + int name_size; + int size; + int data_size; - unsigned char free_name : 1; - unsigned char compression : 1; - unsigned char ciphered : 1; - unsigned char alias : 1; + unsigned char free_name : 1; + unsigned char compression : 1; + unsigned char ciphered : 1; + unsigned char alias : 1; }; #if 0 @@ -181,24 +181,24 @@ int num_directory_entries; /* number of directory entries to follow */ int num_dictionary_entries; /* number of dictionary entries to follow */ struct { - int data_offset; /* bytes offset into file for data chunk */ - int size; /* size of the data chunk */ - int data_size; /* size of the (uncompressed) data chunk */ - int name_offset; /* bytes offset into file for name string */ - int name_size; /* length in bytes of the name field */ - int flags; /* bit flags - for now: - bit 0 => compresion on/off - bit 1 => ciphered on/off - bit 2 => alias - */ + int data_offset; /* bytes offset into file for data chunk */ + int size; /* size of the data chunk */ + int data_size; /* size of the (uncompressed) data chunk */ + int name_offset; /* bytes offset into file for name string */ + int name_size; /* length in bytes of the name field */ + int flags; /* bit flags - for now: + bit 0 => compresion on/off + bit 1 => ciphered on/off + bit 2 => alias + */ } directory[num_directory_entries]; struct { - int hash; - int offset; - int size; - int prev; - int next; + int hash; + int offset; + int size; + int prev; + int next; } dictionary[num_dictionary_entries]; /* now start the string stream. */ /* and right after them the data stream. */ @@ -213,23 +213,37 @@ char x509[x509_length]; /* The public certificate. */ #define EET_FILE2_DIRECTORY_ENTRY_COUNT 6 #define EET_FILE2_DICTIONARY_ENTRY_COUNT 5 -#define EET_FILE2_HEADER_SIZE (sizeof(int) * EET_FILE2_HEADER_COUNT) -#define EET_FILE2_DIRECTORY_ENTRY_SIZE (sizeof(int) * EET_FILE2_DIRECTORY_ENTRY_COUNT) -#define EET_FILE2_DICTIONARY_ENTRY_SIZE (sizeof(int) * EET_FILE2_DICTIONARY_ENTRY_COUNT) +#define EET_FILE2_HEADER_SIZE (sizeof(int) * \ + EET_FILE2_HEADER_COUNT) +#define EET_FILE2_DIRECTORY_ENTRY_SIZE (sizeof(int) * \ + EET_FILE2_DIRECTORY_ENTRY_COUNT) +#define EET_FILE2_DICTIONARY_ENTRY_SIZE (sizeof(int) * \ + EET_FILE2_DICTIONARY_ENTRY_COUNT) /* prototypes of internal calls */ -static Eet_File *eet_cache_find(const char *path, Eet_File **cache, int cache_num); -static void eet_cache_add(Eet_File *ef, Eet_File ***cache, int *cache_num, int *cache_alloc); -static void eet_cache_del(Eet_File *ef, Eet_File ***cache, int *cache_num, int *cache_alloc); -static int eet_string_match(const char *s1, const char *s2); +static Eet_File * eet_cache_find(const char *path, + Eet_File **cache, + int cache_num); +static void eet_cache_add(Eet_File *ef, + Eet_File ***cache, + int *cache_num, + int *cache_alloc); +static void eet_cache_del(Eet_File *ef, + Eet_File ***cache, + int *cache_num, + int *cache_alloc); +static int eet_string_match(const char *s1, const char *s2); #if 0 /* Unused */ -static Eet_Error eet_flush(Eet_File *ef); +static Eet_Error eet_flush(Eet_File *ef); #endif -static Eet_Error eet_flush2(Eet_File *ef); -static Eet_File_Node *find_node_by_name(Eet_File *ef, const char *name); -static int read_data_from_disk(Eet_File *ef, Eet_File_Node *efn, void *buf, int len); +static Eet_Error eet_flush2(Eet_File *ef); +static Eet_File_Node *find_node_by_name(Eet_File *ef, const char *name); +static int read_data_from_disk(Eet_File *ef, + Eet_File_Node *efn, + void *buf, + int len); -static Eet_Error eet_internal_close(Eet_File *ef, Eina_Bool locked); +static Eet_Error eet_internal_close(Eet_File *ef, Eina_Bool locked); #ifdef EFL_HAVE_THREADS @@ -272,13 +286,13 @@ static HANDLE eet_cache_lock = NULL; #endif /* EFL_HAVE_THREADS */ /* cache. i don't expect this to ever be large, so arrays will do */ -static int eet_writers_num = 0; -static int eet_writers_alloc = 0; -static Eet_File **eet_writers = NULL; -static int eet_readers_num = 0; -static int eet_readers_alloc = 0; -static Eet_File **eet_readers = NULL; -static int eet_init_count = 0; +static int eet_writers_num = 0; +static int eet_writers_alloc = 0; +static Eet_File **eet_writers = NULL; +static int eet_readers_num = 0; +static int eet_readers_alloc = 0; +static Eet_File **eet_readers = NULL; +static int eet_init_count = 0; /* log domain variable */ int _eet_log_dom_global = -1; @@ -287,18 +301,21 @@ int _eet_log_dom_global = -1; static inline int eet_check_pointer(const Eet_File *ef) { - if ((!ef) || (ef->magic != EET_MAGIC_FILE)) - return 1; - return 0; + if ((!ef) || (ef->magic != EET_MAGIC_FILE)) + return 1; + + return 0; } static inline int eet_check_header(const Eet_File *ef) { if (!ef->header) - return 1; + return 1; + if (!ef->header->directory) - return 1; + return 1; + return 0; } @@ -307,9 +324,10 @@ eet_test_close(int test, Eet_File *ef) { if (test) { - ef->delete_me_now = 1; - eet_internal_close(ef, EINA_TRUE); + ef->delete_me_now = 1; + eet_internal_close(ef, EINA_TRUE); } + return test; } @@ -322,12 +340,11 @@ eet_cache_find(const char *path, Eet_File **cache, int cache_num) /* walk list */ for (i = 0; i < cache_num; i++) { - /* if matches real path - return it */ - if (eet_string_match(cache[i]->path, path)) - { - if (!cache[i]->delete_me_now) - return cache[i]; - } + /* if matches real path - return it */ + if (eet_string_match(cache[i]->path, path)) + if (!cache[i]->delete_me_now) + return cache[i]; + } /* not found */ @@ -339,31 +356,31 @@ eet_cache_find(const char *path, Eet_File **cache, int cache_num) static void eet_cache_add(Eet_File *ef, Eet_File ***cache, int *cache_num, int *cache_alloc) { - Eet_File **new_cache; - int new_cache_num; - int new_cache_alloc; + Eet_File **new_cache; + int new_cache_num; + int new_cache_alloc; new_cache_num = *cache_num; if (new_cache_num >= 64) /* avoid fd overruns - limit to 128 (most recent) in the cache */ { - Eet_File *del_ef = NULL; - int i; + Eet_File *del_ef = NULL; + int i; - new_cache = *cache; - for (i = 0; i < new_cache_num; i++) - { - if (new_cache[i]->references == 0) - { - del_ef = new_cache[i]; - break; - } - } + new_cache = *cache; + for (i = 0; i < new_cache_num; i++) + { + if (new_cache[i]->references == 0) + { + del_ef = new_cache[i]; + break; + } + } - if (del_ef) - { - del_ef->delete_me_now = 1; + if (del_ef) + { + del_ef->delete_me_now = 1; eet_internal_close(del_ef, EINA_TRUE); - } + } } new_cache = *cache; @@ -372,14 +389,15 @@ eet_cache_add(Eet_File *ef, Eet_File ***cache, int *cache_num, int *cache_alloc) new_cache_num++; if (new_cache_num > new_cache_alloc) { - new_cache_alloc += 16; - new_cache = realloc(new_cache, new_cache_alloc * sizeof(Eet_File *)); - if (!new_cache) - { - CRIT("BAD ERROR! Eet realloc of cache list failed. Abort"); - abort(); - } + new_cache_alloc += 16; + new_cache = realloc(new_cache, new_cache_alloc * sizeof(Eet_File *)); + if (!new_cache) + { + CRIT("BAD ERROR! Eet realloc of cache list failed. Abort"); + abort(); + } } + new_cache[new_cache_num - 1] = ef; *cache = new_cache; *cache_num = new_cache_num; @@ -399,39 +417,40 @@ eet_cache_del(Eet_File *ef, Eet_File ***cache, int *cache_num, int *cache_alloc) new_cache_num = *cache_num; new_cache_alloc = *cache_alloc; if (new_cache_num <= 0) - return; + return; for (i = 0; i < new_cache_num; i++) { - if (new_cache[i] == ef) - break; + if (new_cache[i] == ef) + break; } if (i >= new_cache_num) - return; + return; new_cache_num--; for (j = i; j < new_cache_num; j++) - new_cache[j] = new_cache[j + 1]; + new_cache[j] = new_cache[j + 1]; if (new_cache_num <= (new_cache_alloc - 16)) { - new_cache_alloc -= 16; - if (new_cache_num > 0) - { - new_cache = realloc(new_cache, new_cache_alloc * sizeof(Eet_File *)); - if (!new_cache) - { - CRIT("BAD ERROR! Eet realloc of cache list failed. Abort"); - abort(); - } - } - else - { - free(new_cache); - new_cache = NULL; - } + new_cache_alloc -= 16; + if (new_cache_num > 0) + { + new_cache = realloc(new_cache, new_cache_alloc * sizeof(Eet_File *)); + if (!new_cache) + { + CRIT("BAD ERROR! Eet realloc of cache list failed. Abort"); + abort(); + } + } + else + { + free(new_cache); + new_cache = NULL; + } } + *cache = new_cache; *cache_num = new_cache_num; *cache_alloc = new_cache_alloc; @@ -442,8 +461,12 @@ static int eet_string_match(const char *s1, const char *s2) { /* both null- no match */ - if ((!s1) || (!s2)) return 0; - if (s1 == s2) return 1; + if ((!s1) || (!s2)) + return 0; + + if (s1 == s2) + return 1; + return (!strcmp(s1, s2)); } @@ -467,26 +490,30 @@ eet_flush2(Eet_File *ef) int j; if (eet_check_pointer(ef)) - return EET_ERROR_BAD_OBJECT; + return EET_ERROR_BAD_OBJECT; + if (eet_check_header(ef)) - return EET_ERROR_EMPTY; + return EET_ERROR_EMPTY; + if (!ef->writes_pending) - return EET_ERROR_NONE; + return EET_ERROR_NONE; if ((ef->mode == EET_FILE_MODE_READ_WRITE) || (ef->mode == EET_FILE_MODE_WRITE)) { - int fd; + int fd; - /* opening for write - delete old copy of file right away */ - unlink(ef->path); - fd = open(ef->path, O_CREAT | O_TRUNC | O_RDWR, S_IRUSR | S_IWUSR); - fp = fdopen(fd, "wb"); - if (!fp) return EET_ERROR_NOT_WRITABLE; - fcntl(fileno(fp), F_SETFD, FD_CLOEXEC); + /* opening for write - delete old copy of file right away */ + unlink(ef->path); + fd = open(ef->path, O_CREAT | O_TRUNC | O_RDWR, S_IRUSR | S_IWUSR); + fp = fdopen(fd, "wb"); + if (!fp) + return EET_ERROR_NOT_WRITABLE; + + fcntl(fileno(fp), F_SETFD, FD_CLOEXEC); } else - return EET_ERROR_NOT_WRITABLE; + return EET_ERROR_NOT_WRITABLE; /* calculate string base offset and data base offset */ num = (1 << ef->header->directory->size); @@ -503,16 +530,19 @@ eet_flush2(Eet_File *ef) num_dictionary_entries = ef->ed->count; for (i = 0; i < num_dictionary_entries; ++i) - bytes_strings += ef->ed->all[i].len; + bytes_strings += ef->ed->all[i].len; } /* calculate section bytes size */ - bytes_directory_entries = EET_FILE2_DIRECTORY_ENTRY_SIZE * num_directory_entries + EET_FILE2_HEADER_SIZE; - bytes_dictionary_entries = EET_FILE2_DICTIONARY_ENTRY_SIZE * num_dictionary_entries; + bytes_directory_entries = EET_FILE2_DIRECTORY_ENTRY_SIZE * + num_directory_entries + EET_FILE2_HEADER_SIZE; + bytes_dictionary_entries = EET_FILE2_DICTIONARY_ENTRY_SIZE * + num_dictionary_entries; /* calculate per entry offset */ strings_offset = bytes_directory_entries + bytes_dictionary_entries; - data_offset = bytes_directory_entries + bytes_dictionary_entries + bytes_strings; + data_offset = bytes_directory_entries + bytes_dictionary_entries + + bytes_strings; for (i = 0; i < num; ++i) { @@ -528,58 +558,58 @@ eet_flush2(Eet_File *ef) /* calculate dictionary strings offset */ if (ef->ed) - ef->ed->offset = strings_offset; + ef->ed->offset = strings_offset; /* go thru and write the header */ - head[0] = (int) htonl ((unsigned int) EET_MAGIC_FILE2); - head[1] = (int) htonl ((unsigned int) num_directory_entries); - head[2] = (int) htonl ((unsigned int) num_dictionary_entries); + head[0] = (int)htonl ((unsigned int)EET_MAGIC_FILE2); + head[1] = (int)htonl ((unsigned int)num_directory_entries); + head[2] = (int)htonl ((unsigned int)num_dictionary_entries); fseek(fp, 0, SEEK_SET); if (fwrite(head, sizeof (head), 1, fp) != 1) - goto write_error; + goto write_error; /* write directories entry */ for (i = 0; i < num; i++) { for (efn = ef->header->directory->nodes[i]; efn; efn = efn->next) { - unsigned int flag; + unsigned int flag; int ibuf[EET_FILE2_DIRECTORY_ENTRY_COUNT]; - flag = (efn->alias << 2) | (efn->ciphered << 1) | efn->compression; + flag = (efn->alias << 2) | (efn->ciphered << 1) | efn->compression; - ibuf[0] = (int) htonl ((unsigned int) efn->offset); - ibuf[1] = (int) htonl ((unsigned int) efn->size); - ibuf[2] = (int) htonl ((unsigned int) efn->data_size); - ibuf[3] = (int) htonl ((unsigned int) efn->name_offset); - ibuf[4] = (int) htonl ((unsigned int) efn->name_size); - ibuf[5] = (int) htonl ((unsigned int) flag); + ibuf[0] = (int)htonl ((unsigned int)efn->offset); + ibuf[1] = (int)htonl ((unsigned int)efn->size); + ibuf[2] = (int)htonl ((unsigned int)efn->data_size); + ibuf[3] = (int)htonl ((unsigned int)efn->name_offset); + ibuf[4] = (int)htonl ((unsigned int)efn->name_size); + ibuf[5] = (int)htonl ((unsigned int)flag); if (fwrite(ibuf, sizeof(ibuf), 1, fp) != 1) - goto write_error; + goto write_error; } } /* write dictionnary */ if (ef->ed) { - int offset = strings_offset; + int offset = strings_offset; for (j = 0; j < ef->ed->count; ++j) { - int sbuf[EET_FILE2_DICTIONARY_ENTRY_COUNT]; + int sbuf[EET_FILE2_DICTIONARY_ENTRY_COUNT]; - sbuf[0] = (int) htonl ((unsigned int) ef->ed->all[j].hash); - sbuf[1] = (int) htonl ((unsigned int) offset); - sbuf[2] = (int) htonl ((unsigned int) ef->ed->all[j].len); - sbuf[3] = (int) htonl ((unsigned int) ef->ed->all[j].prev); - sbuf[4] = (int) htonl ((unsigned int) ef->ed->all[j].next); + sbuf[0] = (int)htonl ((unsigned int)ef->ed->all[j].hash); + sbuf[1] = (int)htonl ((unsigned int)offset); + sbuf[2] = (int)htonl ((unsigned int)ef->ed->all[j].len); + sbuf[3] = (int)htonl ((unsigned int)ef->ed->all[j].prev); + sbuf[4] = (int)htonl ((unsigned int)ef->ed->all[j].next); offset += ef->ed->all[j].len; if (fwrite(sbuf, sizeof (sbuf), 1, fp) != 1) - goto write_error; + goto write_error; } } @@ -589,27 +619,22 @@ eet_flush2(Eet_File *ef) for (efn = ef->header->directory->nodes[i]; efn; efn = efn->next) { if (fwrite(efn->name, efn->name_size, 1, fp) != 1) - goto write_error; + goto write_error; } } /* write strings */ if (ef->ed) - { - for (j = 0; j < ef->ed->count; ++j) - { - if (ef->ed->all[j].str) - { - if (fwrite(ef->ed->all[j].str, ef->ed->all[j].len, 1, fp) != 1) - goto write_error; - } - else - { - if (fwrite(ef->ed->all[j].mmap, ef->ed->all[j].len, 1, fp) != 1) - goto write_error; - } - } - } + for (j = 0; j < ef->ed->count; ++j) + { + if (ef->ed->all[j].str) + { + if (fwrite(ef->ed->all[j].str, ef->ed->all[j].len, 1, fp) != 1) + goto write_error; + } + else if (fwrite(ef->ed->all[j].mmap, ef->ed->all[j].len, 1, fp) != 1) + goto write_error; + } /* write data */ for (i = 0; i < num; i++) @@ -617,7 +642,7 @@ eet_flush2(Eet_File *ef) for (efn = ef->header->directory->nodes[i]; efn; efn = efn->next) { if (fwrite(efn->data, efn->size, 1, fp) != 1) - goto write_error; + goto write_error; } } @@ -635,9 +660,9 @@ eet_flush2(Eet_File *ef) /* append signature if required */ if (ef->key) { - error = eet_identity_sign(fp, ef->key); - if (error != EET_ERROR_NONE) - goto sign_error; + error = eet_identity_sign(fp, ef->key); + if (error != EET_ERROR_NONE) + goto sign_error; } /* no more writes pending */ @@ -647,19 +672,24 @@ eet_flush2(Eet_File *ef) return EET_ERROR_NONE; - write_error: +write_error: if (ferror(fp)) { - switch (errno) - { - case EFBIG: error = EET_ERROR_WRITE_ERROR_FILE_TOO_BIG; break; - case EIO: error = EET_ERROR_WRITE_ERROR_IO_ERROR; break; - case ENOSPC: error = EET_ERROR_WRITE_ERROR_OUT_OF_SPACE; break; - case EPIPE: error = EET_ERROR_WRITE_ERROR_FILE_CLOSED; break; - default: error = EET_ERROR_WRITE_ERROR; break; - } + switch (errno) + { + case EFBIG: error = EET_ERROR_WRITE_ERROR_FILE_TOO_BIG; break; + + case EIO: error = EET_ERROR_WRITE_ERROR_IO_ERROR; break; + + case ENOSPC: error = EET_ERROR_WRITE_ERROR_OUT_OF_SPACE; break; + + case EPIPE: error = EET_ERROR_WRITE_ERROR_FILE_CLOSED; break; + + default: error = EET_ERROR_WRITE_ERROR; break; + } } - sign_error: + +sign_error: fclose(fp); return error; } @@ -668,46 +698,50 @@ EAPI int eet_init(void) { if (++eet_init_count != 1) - return eet_init_count; + return eet_init_count; if (!eina_init()) { - fprintf(stderr, "Eet: Eina init failed"); - return --eet_init_count; + fprintf(stderr, "Eet: Eina init failed"); + return --eet_init_count; } + _eet_log_dom_global = eina_log_domain_register("Eet", EET_DEFAULT_LOG_COLOR); if (_eet_log_dom_global < 0) { - EINA_LOG_ERR("Eet Can not create a general log domain."); - goto shutdown_eina; + EINA_LOG_ERR("Eet Can not create a general log domain."); + goto shutdown_eina; } if (!eet_node_init()) { - EINA_LOG_ERR("Eet: Eet_Node mempool creation failed"); - goto unregister_log_domain; + EINA_LOG_ERR("Eet: Eet_Node mempool creation failed"); + goto unregister_log_domain; } #ifdef HAVE_GNUTLS /* Before the library can be used, it must initialize itself if needed. */ if (gcry_control (GCRYCTL_ANY_INITIALIZATION_P) == 0) { - gcry_check_version(NULL); - /* Disable warning messages about problems with the secure memory subsystem. - This command should be run right after gcry_check_version. */ - if (gcry_control(GCRYCTL_DISABLE_SECMEM_WARN)) - goto shutdown_eet; - /* This command is used to allocate a pool of secure memory and thus - enabling the use of secure memory. It also drops all extra privileges the - process has (i.e. if it is run as setuid (root)). If the argument nbytes - is 0, secure memory will be disabled. The minimum amount of secure memory - allocated is currently 16384 bytes; you may thus use a value of 1 to - request that default size. */ - if (gcry_control(GCRYCTL_INIT_SECMEM, 16384, 0)) - WRN("BIG FAT WARNING: I AM UNABLE TO REQUEST SECMEM, Cryptographic operation are at risk !"); + gcry_check_version(NULL); + /* Disable warning messages about problems with the secure memory subsystem. + This command should be run right after gcry_check_version. */ + if (gcry_control(GCRYCTL_DISABLE_SECMEM_WARN)) + goto shutdown_eet; /* This command is used to allocate a pool of secure memory and thus + enabling the use of secure memory. It also drops all extra privileges the + process has (i.e. if it is run as setuid (root)). If the argument nbytes + is 0, secure memory will be disabled. The minimum amount of secure memory + allocated is currently 16384 bytes; you may thus use a value of 1 to + request that default size. */ + + if (gcry_control(GCRYCTL_INIT_SECMEM, 16384, 0)) + WRN( + "BIG FAT WARNING: I AM UNABLE TO REQUEST SECMEM, Cryptographic operation are at risk !"); } + if (gnutls_global_init()) - goto shutdown_eet; + goto shutdown_eet; + #endif #ifdef HAVE_OPENSSL ERR_load_crypto_strings(); @@ -716,12 +750,12 @@ eet_init(void) return eet_init_count; - shutdown_eet: +shutdown_eet: eet_node_shutdown(); - unregister_log_domain: +unregister_log_domain: eina_log_domain_unregister(_eet_log_dom_global); _eet_log_dom_global = -1; - shutdown_eina: +shutdown_eina: eina_shutdown(); return --eet_init_count; } @@ -730,7 +764,7 @@ EAPI int eet_shutdown(void) { if (--eet_init_count != 0) - return eet_init_count; + return eet_init_count; eet_clearcache(); eet_node_shutdown(); @@ -754,14 +788,14 @@ eet_sync(Eet_File *ef) Eet_Error ret; if (eet_check_pointer(ef)) - return EET_ERROR_BAD_OBJECT; + return EET_ERROR_BAD_OBJECT; if ((ef->mode != EET_FILE_MODE_WRITE) && (ef->mode != EET_FILE_MODE_READ_WRITE)) - return EET_ERROR_NOT_WRITABLE; + return EET_ERROR_NOT_WRITABLE; if (!ef->writes_pending) - return EET_ERROR_NONE; + return EET_ERROR_NONE; LOCK_FILE(ef); @@ -774,8 +808,8 @@ eet_sync(Eet_File *ef) EAPI void eet_clearcache(void) { - int num = 0; - int i; + int num = 0; + int i; /* * We need to compute the list of eet file to close separately from the cache, @@ -784,45 +818,48 @@ eet_clearcache(void) LOCK_CACHE; for (i = 0; i < eet_writers_num; i++) { - if (eet_writers[i]->references <= 0) num++; + if (eet_writers[i]->references <= 0) + num++; } for (i = 0; i < eet_readers_num; i++) { - if (eet_readers[i]->references <= 0) num++; + if (eet_readers[i]->references <= 0) + num++; } if (num > 0) { - Eet_File **closelist = NULL; + Eet_File **closelist = NULL; - closelist = alloca(num * sizeof(Eet_File *)); - num = 0; - for (i = 0; i < eet_writers_num; i++) - { - if (eet_writers[i]->references <= 0) - { - closelist[num] = eet_writers[i]; - eet_writers[i]->delete_me_now = 1; - num++; - } - } + closelist = alloca(num * sizeof(Eet_File *)); + num = 0; + for (i = 0; i < eet_writers_num; i++) + { + if (eet_writers[i]->references <= 0) + { + closelist[num] = eet_writers[i]; + eet_writers[i]->delete_me_now = 1; + num++; + } + } - for (i = 0; i < eet_readers_num; i++) - { - if (eet_readers[i]->references <= 0) - { - closelist[num] = eet_readers[i]; - eet_readers[i]->delete_me_now = 1; - num++; - } - } + for (i = 0; i < eet_readers_num; i++) + { + if (eet_readers[i]->references <= 0) + { + closelist[num] = eet_readers[i]; + eet_readers[i]->delete_me_now = 1; + num++; + } + } - for (i = 0; i < num; i++) - { - eet_internal_close(closelist[i], EINA_TRUE); - } + for (i = 0; i < num; i++) + { + eet_internal_close(closelist[i], EINA_TRUE); + } } + UNLOCK_CACHE; } @@ -830,19 +867,20 @@ eet_clearcache(void) static Eet_File * eet_internal_read2(Eet_File *ef) { - const int *data = (const int*) ef->data; - const char *start = (const char*) ef->data; - int idx = 0; - int num_directory_entries; - int bytes_directory_entries; - int num_dictionary_entries; - int bytes_dictionary_entries; - int signature_base_offset; - int i; + const int *data = (const int *)ef->data; + const char *start = (const char *)ef->data; + int idx = 0; + int num_directory_entries; + int bytes_directory_entries; + int num_dictionary_entries; + int bytes_dictionary_entries; + int signature_base_offset; + int i; idx += sizeof(int); - if (eet_test_close((int) ntohl(*data) != EET_MAGIC_FILE2, ef)) - return NULL; + if (eet_test_close((int)ntohl(*data) != EET_MAGIC_FILE2, ef)) + return NULL; + data++; #define GET_INT(Value, Pointer, Index) \ @@ -853,86 +891,92 @@ eet_internal_read2(Eet_File *ef) } /* get entries count and byte count */ - GET_INT(num_directory_entries, data, idx); + GET_INT(num_directory_entries, data, idx); /* get dictionary count and byte count */ GET_INT(num_dictionary_entries, data, idx); - bytes_directory_entries = EET_FILE2_DIRECTORY_ENTRY_SIZE * num_directory_entries + EET_FILE2_HEADER_SIZE; - bytes_dictionary_entries = EET_FILE2_DICTIONARY_ENTRY_SIZE * num_dictionary_entries; + bytes_directory_entries = EET_FILE2_DIRECTORY_ENTRY_SIZE * + num_directory_entries + EET_FILE2_HEADER_SIZE; + bytes_dictionary_entries = EET_FILE2_DICTIONARY_ENTRY_SIZE * + num_dictionary_entries; /* we cant have <= 0 values here - invalid */ if (eet_test_close((num_directory_entries <= 0), ef)) - return NULL; + return NULL; /* we cant have more bytes directory and bytes in dictionaries than the size of the file */ - if (eet_test_close((bytes_directory_entries + bytes_dictionary_entries) > ef->data_size, ef)) - return NULL; + if (eet_test_close((bytes_directory_entries + bytes_dictionary_entries) > + ef->data_size, ef)) + return NULL; /* allocate header */ ef->header = calloc(1, sizeof(Eet_File_Header)); if (eet_test_close(!ef->header, ef)) - return NULL; + return NULL; ef->header->magic = EET_MAGIC_FILE_HEADER; /* allocate directory block in ram */ ef->header->directory = calloc(1, sizeof(Eet_File_Directory)); if (eet_test_close(!ef->header->directory, ef)) - return NULL; + return NULL; /* 8 bit hash table (256 buckets) */ ef->header->directory->size = 8; /* allocate base hash table */ - ef->header->directory->nodes = calloc(1, sizeof(Eet_File_Node *) * (1 << ef->header->directory->size)); + ef->header->directory->nodes = + calloc(1, sizeof(Eet_File_Node *) * (1 << ef->header->directory->size)); if (eet_test_close(!ef->header->directory->nodes, ef)) - return NULL; + return NULL; signature_base_offset = 0; /* actually read the directory block - all of it, into ram */ for (i = 0; i < num_directory_entries; ++i) { - const char *name; - Eet_File_Node *efn; - int name_offset; - int name_size; - int hash; - int flag; + const char *name; + Eet_File_Node *efn; + int name_offset; + int name_size; + int hash; + int flag; /* out directory block is inconsistent - we have oveerun our */ /* dynamic block buffer before we finished scanning dir entries */ efn = malloc (sizeof(Eet_File_Node)); if (eet_test_close(!efn, ef)) - return NULL; + return NULL; /* get entrie header */ - GET_INT(efn->offset, data, idx); - GET_INT(efn->size, data, idx); + GET_INT(efn->offset, data, idx); + GET_INT(efn->size, data, idx); GET_INT(efn->data_size, data, idx); - GET_INT(name_offset, data, idx); - GET_INT(name_size, data, idx); - GET_INT(flag, data, idx); + GET_INT(name_offset, data, idx); + GET_INT(name_size, data, idx); + GET_INT(flag, data, idx); - efn->compression = flag & 0x1 ? 1 : 0; - efn->ciphered = flag & 0x2 ? 1 : 0; - efn->alias = flag & 0x4 ? 1 : 0; + efn->compression = flag & 0x1 ? 1 : 0; + efn->ciphered = flag & 0x2 ? 1 : 0; + efn->alias = flag & 0x4 ? 1 : 0; #define EFN_TEST(Test, Ef, Efn) \ - if (eet_test_close(Test, Ef)) \ - { \ - free(Efn); \ - return NULL; \ - } + if (eet_test_close(Test, Ef)) \ + { \ + free(Efn); \ + return NULL; \ + } /* check data pointer position */ EFN_TEST(!((efn->size > 0) && (efn->offset + efn->size <= ef->data_size) - && (efn->offset > bytes_dictionary_entries + bytes_directory_entries)), ef, efn); + && (efn->offset > bytes_dictionary_entries + + bytes_directory_entries)), ef, efn); /* check name position */ EFN_TEST(!((name_size > 0) && (name_offset + name_size < ef->data_size) - && (name_offset >= bytes_dictionary_entries + bytes_directory_entries)), ef, efn); + && (name_offset >= bytes_dictionary_entries + + bytes_directory_entries)), ef, efn); name = start + name_offset; @@ -940,7 +984,7 @@ eet_internal_read2(Eet_File *ef) EFN_TEST(name[name_size - 1] != '\0', ef, efn); efn->free_name = 0; - efn->name = (char*) name; + efn->name = (char *)name; efn->name_size = name_size; hash = _eet_hash_gen(efn->name, ef->header->directory->size); @@ -949,78 +993,91 @@ eet_internal_read2(Eet_File *ef) /* read-only mode, so currently we have no data loaded */ if (ef->mode == EET_FILE_MODE_READ) - efn->data = NULL; - /* read-write mode - read everything into ram */ + efn->data = NULL; /* read-write mode - read everything into ram */ else { efn->data = malloc(efn->size); if (efn->data) - memcpy(efn->data, ef->data + efn->offset, efn->size); + memcpy(efn->data, ef->data + efn->offset, efn->size); } - /* compute the possible position of a signature */ - if (signature_base_offset < efn->offset + efn->size) - signature_base_offset = efn->offset + efn->size; + /* compute the possible position of a signature */ + if (signature_base_offset < efn->offset + efn->size) + signature_base_offset = efn->offset + efn->size; } ef->ed = NULL; if (num_dictionary_entries) { - const int *dico = (const int*) ef->data + EET_FILE2_DIRECTORY_ENTRY_COUNT * num_directory_entries + EET_FILE2_HEADER_COUNT; - int j; + const int *dico = (const int *)ef->data + + EET_FILE2_DIRECTORY_ENTRY_COUNT * num_directory_entries + + EET_FILE2_HEADER_COUNT; + int j; - if (eet_test_close((num_dictionary_entries * (int) EET_FILE2_DICTIONARY_ENTRY_SIZE + idx) > (bytes_dictionary_entries + bytes_directory_entries), ef)) - return NULL; + if (eet_test_close((num_dictionary_entries * + (int)EET_FILE2_DICTIONARY_ENTRY_SIZE + idx) > + (bytes_dictionary_entries + bytes_directory_entries), + ef)) + return NULL; ef->ed = calloc(1, sizeof (Eet_Dictionary)); - if (eet_test_close(!ef->ed, ef)) return NULL; + if (eet_test_close(!ef->ed, ef)) + return NULL; ef->ed->all = calloc(num_dictionary_entries, sizeof (Eet_String)); - if (eet_test_close(!ef->ed->all, ef)) return NULL; + if (eet_test_close(!ef->ed->all, ef)) + return NULL; ef->ed->count = num_dictionary_entries; - ef->ed->total = num_dictionary_entries; - ef->ed->start = start + bytes_dictionary_entries + bytes_directory_entries; - ef->ed->end = ef->ed->start; + ef->ed->total = num_dictionary_entries; + ef->ed->start = start + bytes_dictionary_entries + + bytes_directory_entries; + ef->ed->end = ef->ed->start; for (j = 0; j < ef->ed->count; ++j) { - int hash; - int offset; + int hash; + int offset; - GET_INT(hash, dico, idx); - GET_INT(offset, dico, idx); - GET_INT(ef->ed->all[j].len, dico, idx); + GET_INT(hash, dico, idx); + GET_INT(offset, dico, idx); + GET_INT(ef->ed->all[j].len, dico, idx); GET_INT(ef->ed->all[j].prev, dico, idx); GET_INT(ef->ed->all[j].next, dico, idx); /* Hash value could be stored on 8bits data, but this will break alignment of all the others data. So stick to int and check the value. */ - if (eet_test_close(hash & 0xFFFFFF00, ef)) return NULL; + if (eet_test_close(hash & 0xFFFFFF00, ef)) + return NULL; /* Check string position */ if (eet_test_close(!((ef->ed->all[j].len > 0) - && (offset > (bytes_dictionary_entries + bytes_directory_entries)) - && (offset + ef->ed->all[j].len < ef->data_size)), ef)) - return NULL; + && (offset > + (bytes_dictionary_entries + + bytes_directory_entries)) + && (offset + ef->ed->all[j].len < + ef->data_size)), ef)) + return NULL; ef->ed->all[j].mmap = start + offset; ef->ed->all[j].str = NULL; - if (ef->ed->all[j].mmap + ef->ed->all[j].len > ef->ed->end) - ef->ed->end = ef->ed->all[j].mmap + ef->ed->all[j].len; + if (ef->ed->all[j].mmap + ef->ed->all[j].len > ef->ed->end) + ef->ed->end = ef->ed->all[j].mmap + ef->ed->all[j].len; /* Check '\0' at the end of the string */ - if (eet_test_close(ef->ed->all[j].mmap[ef->ed->all[j].len - 1] != '\0', ef)) return NULL; + if (eet_test_close(ef->ed->all[j].mmap[ef->ed->all[j].len - 1] != + '\0', ef)) + return NULL; - ef->ed->all[j].hash = hash; + ef->ed->all[j].hash = hash; if (ef->ed->all[j].prev == -1) - ef->ed->hash[hash] = j; + ef->ed->hash[hash] = j; - /* compute the possible position of a signature */ - if (signature_base_offset < offset + ef->ed->all[j].len) - signature_base_offset = offset + ef->ed->all[j].len; + /* compute the possible position of a signature */ + if (signature_base_offset < offset + ef->ed->all[j].len) + signature_base_offset = offset + ef->ed->all[j].len; } } @@ -1033,16 +1090,24 @@ eet_internal_read2(Eet_File *ef) if (signature_base_offset < ef->data_size) { #ifdef HAVE_SIGNATURE - const unsigned char *buffer = ((const unsigned char*) ef->data) + signature_base_offset; - ef->x509_der = eet_identity_check(ef->data, signature_base_offset, - &ef->sha1, &ef->sha1_length, - buffer, ef->data_size - signature_base_offset, - &ef->signature, &ef->signature_length, - &ef->x509_length); + const unsigned char *buffer = ((const unsigned char *)ef->data) + + signature_base_offset; + ef->x509_der = eet_identity_check(ef->data, + signature_base_offset, + &ef->sha1, + &ef->sha1_length, + buffer, + ef->data_size - signature_base_offset, + &ef->signature, + &ef->signature_length, + &ef->x509_length); + + if (eet_test_close(ef->x509_der == NULL, ef)) + return NULL; - if (eet_test_close(ef->x509_der == NULL, ef)) return NULL; #else - ERR("This file could be signed but you didn't compile the necessary code to check the signature."); + ERR( + "This file could be signed but you didn't compile the necessary code to check the signature."); #endif } @@ -1053,63 +1118,67 @@ eet_internal_read2(Eet_File *ef) static Eet_File * eet_internal_read1(Eet_File *ef) { - const unsigned char *dyn_buf = NULL; - const unsigned char *p = NULL; - int idx = 0; - int num_entries; - int byte_entries; - int i; + const unsigned char *dyn_buf = NULL; + const unsigned char *p = NULL; + int idx = 0; + int num_entries; + int byte_entries; + int i; - WRN("EET file format of '%s' is deprecated. You should just open it one time with mode == EET_FILE_MODE_READ_WRITE to solve this issue.", ef->path); + WRN( + "EET file format of '%s' is deprecated. You should just open it one time with mode == EET_FILE_MODE_READ_WRITE to solve this issue.", + ef->path); /* build header table if read mode */ /* geat header */ idx += sizeof(int); if (eet_test_close((int)ntohl(*((int *)ef->data)) != EET_MAGIC_FILE, ef)) - return NULL; + return NULL; #define EXTRACT_INT(Value, Pointer, Index) \ - { \ - int tmp; \ - memcpy(&tmp, Pointer + Index, sizeof(int)); \ - Value = ntohl(tmp); \ - Index += sizeof(int); \ - } + { \ + int tmp; \ + memcpy(&tmp, Pointer + Index, sizeof(int)); \ + Value = ntohl(tmp); \ + Index += sizeof(int); \ + } /* get entries count and byte count */ - EXTRACT_INT(num_entries, ef->data, idx); + EXTRACT_INT(num_entries, ef->data, idx); EXTRACT_INT(byte_entries, ef->data, idx); /* we cant have <= 0 values here - invalid */ if (eet_test_close((num_entries <= 0) || (byte_entries <= 0), ef)) - return NULL; + return NULL; /* we can't have more entires than minimum bytes for those! invalid! */ if (eet_test_close((num_entries * 20) > byte_entries, ef)) - return NULL; + return NULL; /* check we will not outrun the file limit */ - if (eet_test_close(((byte_entries + (int) sizeof(int) * 3) > ef->data_size), ef)) - return NULL; + if (eet_test_close(((byte_entries + (int)sizeof(int) * 3) > ef->data_size), + ef)) + return NULL; /* allocate header */ ef->header = calloc(1, sizeof(Eet_File_Header)); if (eet_test_close(!ef->header, ef)) - return NULL; + return NULL; ef->header->magic = EET_MAGIC_FILE_HEADER; /* allocate directory block in ram */ ef->header->directory = calloc(1, sizeof(Eet_File_Directory)); if (eet_test_close(!ef->header->directory, ef)) - return NULL; + return NULL; /* 8 bit hash table (256 buckets) */ ef->header->directory->size = 8; /* allocate base hash table */ - ef->header->directory->nodes = calloc(1, sizeof(Eet_File_Node *) * (1 << ef->header->directory->size)); + ef->header->directory->nodes = + calloc(1, sizeof(Eet_File_Node *) * (1 << ef->header->directory->size)); if (eet_test_close(!ef->header->directory->nodes, ef)) - return NULL; + return NULL; /* actually read the directory block - all of it, into ram */ dyn_buf = ef->data + idx; @@ -1119,99 +1188,104 @@ eet_internal_read1(Eet_File *ef) for (i = 0; i < num_entries; i++) { - Eet_File_Node *efn; - void *data = NULL; - int indexn = 0; - int name_size; - int hash; - int k; + Eet_File_Node *efn; + void *data = NULL; + int indexn = 0; + int name_size; + int hash; + int k; #define HEADER_SIZE (sizeof(int) * 5) - /* out directory block is inconsistent - we have oveerun our */ - /* dynamic block buffer before we finished scanning dir entries */ - if (eet_test_close(p + HEADER_SIZE >= (dyn_buf + byte_entries), ef)) - return NULL; + /* out directory block is inconsistent - we have oveerun our */ + /* dynamic block buffer before we finished scanning dir entries */ + if (eet_test_close(p + HEADER_SIZE >= (dyn_buf + byte_entries), ef)) + return NULL; - /* allocate all the ram needed for this stored node accounting */ - efn = malloc (sizeof(Eet_File_Node)); - if (eet_test_close(!efn, ef)) - return NULL; + /* allocate all the ram needed for this stored node accounting */ + efn = malloc (sizeof(Eet_File_Node)); + if (eet_test_close(!efn, ef)) + return NULL; /* get entrie header */ - EXTRACT_INT(efn->offset, p, indexn); - EXTRACT_INT(efn->compression, p, indexn); - EXTRACT_INT(efn->size, p, indexn); - EXTRACT_INT(efn->data_size, p, indexn); - EXTRACT_INT(name_size, p, indexn); + EXTRACT_INT(efn->offset, p, indexn); + EXTRACT_INT(efn->compression, p, indexn); + EXTRACT_INT(efn->size, p, indexn); + EXTRACT_INT(efn->data_size, p, indexn); + EXTRACT_INT(name_size, p, indexn); efn->name_size = name_size; - efn->ciphered = 0; - efn->alias = 0; + efn->ciphered = 0; + efn->alias = 0; - /* invalid size */ - if (eet_test_close(efn->size <= 0, ef)) - { - free (efn); - return NULL; - } + /* invalid size */ + if (eet_test_close(efn->size <= 0, ef)) + { + free (efn); + return NULL; + } - /* invalid name_size */ - if (eet_test_close(name_size <= 0, ef)) - { - free (efn); - return NULL; - } + /* invalid name_size */ + if (eet_test_close(name_size <= 0, ef)) + { + free (efn); + return NULL; + } - /* reading name would mean falling off end of dyn_buf - invalid */ - if (eet_test_close((p + 16 + name_size) > (dyn_buf + byte_entries), ef)) - { - free (efn); - return NULL; - } + /* reading name would mean falling off end of dyn_buf - invalid */ + if (eet_test_close((p + 16 + name_size) > (dyn_buf + byte_entries), ef)) + { + free (efn); + return NULL; + } - /* This code is useless if we dont want backward compatibility */ - for (k = name_size; k > 0 && ((unsigned char) * (p + HEADER_SIZE + k)) != 0; --k) - ; + /* This code is useless if we dont want backward compatibility */ + for (k = name_size; + k > 0 && ((unsigned char)*(p + HEADER_SIZE + k)) != 0; --k) + ; - efn->free_name = ((unsigned char) * (p + HEADER_SIZE + k)) != 0; + efn->free_name = ((unsigned char)*(p + HEADER_SIZE + k)) != 0; - if (efn->free_name) - { - efn->name = malloc(sizeof(char) * name_size + 1); - if (eet_test_close(efn->name == NULL, ef)) - { - free(efn); - return NULL; - } + if (efn->free_name) + { + efn->name = malloc(sizeof(char) * name_size + 1); + if (eet_test_close(efn->name == NULL, ef)) + { + free(efn); + return NULL; + } - strncpy(efn->name, (char *)p + HEADER_SIZE, name_size); - efn->name[name_size] = 0; + strncpy(efn->name, (char *)p + HEADER_SIZE, name_size); + efn->name[name_size] = 0; - WRN("File: %s is not up to date for key \"%s\" - needs rebuilding sometime", ef->path, efn->name); - } - else - /* The only really usefull peace of code for efn->name (no backward compatibility) */ - efn->name = (char*)((unsigned char*)(p + HEADER_SIZE)); + WRN( + "File: %s is not up to date for key \"%s\" - needs rebuilding sometime", + ef->path, + efn->name); + } + else + /* The only really usefull peace of code for efn->name (no backward compatibility) */ + efn->name = (char *)((unsigned char *)(p + HEADER_SIZE)); - /* get hash bucket it should go in */ - hash = _eet_hash_gen(efn->name, ef->header->directory->size); - efn->next = ef->header->directory->nodes[hash]; - ef->header->directory->nodes[hash] = efn; + /* get hash bucket it should go in */ + hash = _eet_hash_gen(efn->name, ef->header->directory->size); + efn->next = ef->header->directory->nodes[hash]; + ef->header->directory->nodes[hash] = efn; - /* read-only mode, so currently we have no data loaded */ - if (ef->mode == EET_FILE_MODE_READ) - efn->data = NULL; - /* read-write mode - read everything into ram */ - else - { - data = malloc(efn->size); - if (data) - memcpy(data, ef->data + efn->offset, efn->size); - efn->data = data; - } - /* advance */ - p += HEADER_SIZE + name_size; + /* read-only mode, so currently we have no data loaded */ + if (ef->mode == EET_FILE_MODE_READ) + efn->data = NULL; /* read-write mode - read everything into ram */ + else + { + data = malloc(efn->size); + if (data) + memcpy(data, ef->data + efn->offset, efn->size); + + efn->data = data; + } + + /* advance */ + p += HEADER_SIZE + name_size; } return ef; } @@ -1226,26 +1300,28 @@ eet_internal_read1(Eet_File *ef) static Eet_File * eet_internal_read(Eet_File *ef) { - const int *data = (const int*) ef->data; + const int *data = (const int *)ef->data; if (eet_test_close((ef->data == (void *)-1) || (ef->data == NULL), ef)) - return NULL; + return NULL; - if (eet_test_close(ef->data_size < (int) sizeof(int) * 3, ef)) - return NULL; + if (eet_test_close(ef->data_size < (int)sizeof(int) * 3, ef)) + return NULL; switch (ntohl(*data)) { #if EET_OLD_EET_FILE_FORMAT case EET_MAGIC_FILE: - return eet_internal_read1(ef); + return eet_internal_read1(ef); + #endif case EET_MAGIC_FILE2: - return eet_internal_read2(ef); + return eet_internal_read2(ef); + default: - ef->delete_me_now = 1; - eet_internal_close(ef, EINA_TRUE); - break; + ef->delete_me_now = 1; + eet_internal_close(ef, EINA_TRUE); + break; } return NULL; @@ -1258,15 +1334,17 @@ eet_internal_close(Eet_File *ef, Eina_Bool locked) /* check to see its' an eet file pointer */ if (eet_check_pointer(ef)) - return EET_ERROR_BAD_OBJECT; + return EET_ERROR_BAD_OBJECT; - if (!locked) LOCK_CACHE; + if (!locked) + LOCK_CACHE; /* deref */ ef->references--; /* if its still referenced - dont go any further */ - if (ef->references > 0) goto on_error; - /* flush any writes */ + if (ef->references > 0) + goto on_error; /* flush any writes */ + err = eet_flush2(ef); eet_identity_unref(ef->key); @@ -1274,58 +1352,67 @@ eet_internal_close(Eet_File *ef, Eina_Bool locked) /* if not urgent to delete it - dont free it - leave it in cache */ if ((!ef->delete_me_now) && (ef->mode == EET_FILE_MODE_READ)) - goto on_error; + goto on_error; /* remove from cache */ if (ef->mode == EET_FILE_MODE_READ) - eet_cache_del(ef, &eet_readers, &eet_readers_num, &eet_readers_alloc); - else if ((ef->mode == EET_FILE_MODE_WRITE) || (ef->mode == EET_FILE_MODE_READ_WRITE)) - eet_cache_del(ef, &eet_writers, &eet_writers_num, &eet_writers_alloc); + eet_cache_del(ef, &eet_readers, &eet_readers_num, &eet_readers_alloc); + else if ((ef->mode == EET_FILE_MODE_WRITE) || + (ef->mode == EET_FILE_MODE_READ_WRITE)) + eet_cache_del(ef, &eet_writers, &eet_writers_num, &eet_writers_alloc); /* we can unlock the cache now */ - if (!locked) UNLOCK_CACHE; + if (!locked) + UNLOCK_CACHE; DESTROY_FILE(ef); /* free up data */ if (ef->header) { - if (ef->header->directory) - { - if (ef->header->directory->nodes) - { - int i, num; + if (ef->header->directory) + { + if (ef->header->directory->nodes) + { + int i, num; - num = (1 << ef->header->directory->size); - for (i = 0; i < num; i++) - { - Eet_File_Node *efn; + num = (1 << ef->header->directory->size); + for (i = 0; i < num; i++) + { + Eet_File_Node *efn; - while ((efn = ef->header->directory->nodes[i])) - { - if (efn->data) - free(efn->data); + while ((efn = ef->header->directory->nodes[i])) + { + if (efn->data) + free(efn->data); - ef->header->directory->nodes[i] = efn->next; + ef->header->directory->nodes[i] = efn->next; - if (efn->free_name) - free(efn->name); + if (efn->free_name) + free(efn->name); - free(efn); - } - } - free(ef->header->directory->nodes); - } - free(ef->header->directory); - } - free(ef->header); + free(efn); + } + } + free(ef->header->directory->nodes); + } + + free(ef->header->directory); + } + + free(ef->header); } - eet_dictionary_free(ef->ed); + eet_dictionary_free(ef->ed); - if (ef->sha1) free(ef->sha1); - if (ef->data) munmap((void*)ef->data, ef->data_size); - if (ef->readfp) fclose(ef->readfp); + if (ef->sha1) + free(ef->sha1); + + if (ef->data) + munmap((void *)ef->data, ef->data_size); + + if (ef->readfp) + fclose(ef->readfp); /* zero out ram for struct - caution tactic against stale memory use */ memset(ef, 0, sizeof(Eet_File)); @@ -1334,22 +1421,24 @@ eet_internal_close(Eet_File *ef, Eina_Bool locked) free(ef); return err; - on_error: - if (!locked) UNLOCK_CACHE; +on_error: + if (!locked) + UNLOCK_CACHE; + return EET_ERROR_NONE; } EAPI Eet_File * eet_memopen_read(const void *data, size_t size) { - Eet_File *ef; + Eet_File *ef; if (data == NULL || size == 0) - return NULL; + return NULL; ef = malloc (sizeof (Eet_File)); if (!ef) - return NULL; + return NULL; INIT_FILE(ef); ef->ed = NULL; @@ -1377,92 +1466,103 @@ eet_memopen_read(const void *data, size_t size) EAPI Eet_File * eet_open(const char *file, Eet_File_Mode mode) { - FILE *fp; - Eet_File *ef; - int file_len; - struct stat file_stat; + FILE *fp; + Eet_File *ef; + int file_len; + struct stat file_stat; if (!file) - return NULL; + return NULL; /* find the current file handle in cache*/ ef = NULL; LOCK_CACHE; if (mode == EET_FILE_MODE_READ) { - ef = eet_cache_find((char *)file, eet_writers, eet_writers_num); - if (ef) - { - eet_sync(ef); - ef->references++; - ef->delete_me_now = 1; + ef = eet_cache_find((char *)file, eet_writers, eet_writers_num); + if (ef) + { + eet_sync(ef); + ef->references++; + ef->delete_me_now = 1; eet_internal_close(ef, EINA_TRUE); - } - ef = eet_cache_find((char *)file, eet_readers, eet_readers_num); + } + + ef = eet_cache_find((char *)file, eet_readers, eet_readers_num); } else if ((mode == EET_FILE_MODE_WRITE) || - (mode == EET_FILE_MODE_READ_WRITE)) + (mode == EET_FILE_MODE_READ_WRITE)) { - ef = eet_cache_find((char *)file, eet_readers, eet_readers_num); - if (ef) - { - ef->delete_me_now = 1; - ef->references++; + ef = eet_cache_find((char *)file, eet_readers, eet_readers_num); + if (ef) + { + ef->delete_me_now = 1; + ef->references++; eet_internal_close(ef, EINA_TRUE); - } - ef = eet_cache_find((char *)file, eet_writers, eet_writers_num); + } + + ef = eet_cache_find((char *)file, eet_writers, eet_writers_num); } /* try open the file based on mode */ if ((mode == EET_FILE_MODE_READ) || (mode == EET_FILE_MODE_READ_WRITE)) { - /* Prevent garbage in futur comparison. */ - file_stat.st_mtime = 0; + /* Prevent garbage in futur comparison. */ + file_stat.st_mtime = 0; - fp = fopen(file, "rb"); - if (!fp) goto open_error; - if (fstat(fileno(fp), &file_stat)) - { - fclose(fp); - fp = NULL; - goto open_error; - } - if ((mode == EET_FILE_MODE_READ) && - (file_stat.st_size < ((int) sizeof(int) * 3))) - { - fclose(fp); - fp = NULL; - goto open_error; - } + fp = fopen(file, "rb"); + if (!fp) + goto open_error; - open_error: - if (fp == NULL && mode == EET_FILE_MODE_READ) goto on_error; + if (fstat(fileno(fp), &file_stat)) + { + fclose(fp); + fp = NULL; + goto open_error; + } + + if ((mode == EET_FILE_MODE_READ) && + (file_stat.st_size < ((int)sizeof(int) * 3))) + { + fclose(fp); + fp = NULL; + goto open_error; + } + +open_error: + if (fp == NULL && mode == EET_FILE_MODE_READ) + goto on_error; } else { - if (mode != EET_FILE_MODE_WRITE) return NULL; - memset(&file_stat, 0, sizeof(file_stat)); + if (mode != EET_FILE_MODE_WRITE) + return NULL; - fp = NULL; + memset(&file_stat, 0, sizeof(file_stat)); + + fp = NULL; } /* We found one */ if (ef && - ((file_stat.st_mtime != ef->mtime) || (file_stat.st_size != ef->data_size))) + ((file_stat.st_mtime != ef->mtime) || + (file_stat.st_size != ef->data_size))) { - ef->delete_me_now = 1; - ef->references++; + ef->delete_me_now = 1; + ef->references++; eet_internal_close(ef, EINA_TRUE); - ef = NULL; + ef = NULL; } if (ef) { - /* reference it up and return it */ - if (fp != NULL) fclose(fp); - ef->references++; - UNLOCK_CACHE; - return ef; + /* reference it up and return it */ + if (fp != NULL) + fclose(fp); + + ef->references++; + UNLOCK_CACHE; + return ef; } file_len = strlen(file) + 1; @@ -1470,7 +1570,7 @@ eet_open(const char *file, Eet_File_Mode mode) /* Allocate struct for eet file and have it zero'd out */ ef = malloc(sizeof(Eet_File) + file_len); if (!ef) - goto on_error; + goto on_error; /* fill some of the members */ INIT_FILE(ef); @@ -1491,40 +1591,42 @@ eet_open(const char *file, Eet_File_Mode mode) ef->sha1_length = 0; ef->ed = (mode == EET_FILE_MODE_WRITE) - || (ef->readfp == NULL && mode == EET_FILE_MODE_READ_WRITE) ? - eet_dictionary_add() : NULL; + || (ef->readfp == NULL && mode == EET_FILE_MODE_READ_WRITE) ? + eet_dictionary_add() : NULL; if (ef->readfp == NULL && (mode == EET_FILE_MODE_READ_WRITE || mode == EET_FILE_MODE_WRITE)) - goto empty_file; + goto empty_file; /* if we can't open - bail out */ if (eet_test_close(!ef->readfp, ef)) - goto on_error; + goto on_error; fcntl(fileno(ef->readfp), F_SETFD, FD_CLOEXEC); /* if we opened for read or read-write */ if ((mode == EET_FILE_MODE_READ) || (mode == EET_FILE_MODE_READ_WRITE)) { - ef->data_size = file_stat.st_size; - ef->data = mmap(NULL, ef->data_size, PROT_READ, - MAP_SHARED, fileno(ef->readfp), 0); - if (eet_test_close((ef->data == MAP_FAILED), ef)) - goto on_error; - ef = eet_internal_read(ef); - if (!ef) - goto on_error; + ef->data_size = file_stat.st_size; + ef->data = mmap(NULL, ef->data_size, PROT_READ, + MAP_SHARED, fileno(ef->readfp), 0); + if (eet_test_close((ef->data == MAP_FAILED), ef)) + goto on_error; + + ef = eet_internal_read(ef); + if (!ef) + goto on_error; } - empty_file: +empty_file: /* add to cache */ if (ef->references == 1) { - if (ef->mode == EET_FILE_MODE_READ) - eet_cache_add(ef, &eet_readers, &eet_readers_num, &eet_readers_alloc); - else - if ((ef->mode == EET_FILE_MODE_WRITE) || (ef->mode == EET_FILE_MODE_READ_WRITE)) - eet_cache_add(ef, &eet_writers, &eet_writers_num, &eet_writers_alloc); + if (ef->mode == EET_FILE_MODE_READ) + eet_cache_add(ef, &eet_readers, &eet_readers_num, &eet_readers_alloc); + else + if ((ef->mode == EET_FILE_MODE_WRITE) || + (ef->mode == EET_FILE_MODE_READ_WRITE)) + eet_cache_add(ef, &eet_writers, &eet_writers_num, &eet_writers_alloc); } UNLOCK_CACHE; @@ -1540,26 +1642,32 @@ eet_mode_get(Eet_File *ef) { /* check to see its' an eet file pointer */ if ((!ef) || (ef->magic != EET_MAGIC_FILE)) - return EET_FILE_MODE_INVALID; + return EET_FILE_MODE_INVALID; else - return ef->mode; + return ef->mode; } EAPI const void * eet_identity_x509(Eet_File *ef, int *der_length) { - if (!ef->x509_der) return NULL; + if (!ef->x509_der) + return NULL; + + if (der_length) + *der_length = ef->x509_length; - if (der_length) *der_length = ef->x509_length; return ef->x509_der; } EAPI const void * eet_identity_signature(Eet_File *ef, int *signature_length) { - if (!ef->signature) return NULL; + if (!ef->signature) + return NULL; + + if (signature_length) + *signature_length = ef->signature_length; - if (signature_length) *signature_length = ef->signature_length; return ef->signature; } @@ -1567,9 +1675,13 @@ EAPI const void * eet_identity_sha1(Eet_File *ef, int *sha1_length) { if (!ef->sha1) - ef->sha1 = eet_identity_compute_sha1(ef->data, ef->data_size, &ef->sha1_length); + ef->sha1 = eet_identity_compute_sha1(ef->data, + ef->data_size, + &ef->sha1_length); + + if (sha1_length) + *sha1_length = ef->sha1_length; - if (sha1_length) *sha1_length = ef->sha1_length; return ef->sha1; } @@ -1578,7 +1690,8 @@ eet_identity_set(Eet_File *ef, Eet_Key *key) { Eet_Key *tmp = ef->key; - if (!ef) return EET_ERROR_BAD_OBJECT; + if (!ef) + return EET_ERROR_BAD_OBJECT; ef->key = key; eet_identity_ref(ef->key); @@ -1597,140 +1710,159 @@ eet_close(Eet_File *ef) } EAPI void * -eet_read_cipher(Eet_File *ef, const char *name, int *size_ret, const char *cipher_key) +eet_read_cipher(Eet_File *ef, + const char *name, + int *size_ret, + const char *cipher_key) { Eet_File_Node *efn; char *data = NULL; int size = 0; if (size_ret) - *size_ret = 0; + *size_ret = 0; /* check to see its' an eet file pointer */ if (eet_check_pointer(ef)) - return NULL; + return NULL; + if (!name) - return NULL; + return NULL; + if ((ef->mode != EET_FILE_MODE_READ) && (ef->mode != EET_FILE_MODE_READ_WRITE)) - return NULL; + return NULL; /* no header, return NULL */ if (eet_check_header(ef)) - return NULL; + return NULL; LOCK_FILE(ef); /* hunt hash bucket */ efn = find_node_by_name(ef, name); - if (!efn) goto on_error; + if (!efn) + goto on_error; /* get size (uncompressed, if compressed at all) */ size = efn->data_size; /* allocate data */ data = malloc(size); - if (!data) goto on_error; + if (!data) + goto on_error; /* uncompressed data */ if (efn->compression == 0) { void *data_deciphered = NULL; - unsigned int data_deciphered_sz = 0; - /* if we alreayd have the data in ram... copy that */ + unsigned int data_deciphered_sz = 0; + /* if we alreayd have the data in ram... copy that */ + + if (efn->data) + memcpy(data, efn->data, efn->size); + else + if (!read_data_from_disk(ef, efn, data, size)) + goto on_error; - if (efn->data) - memcpy(data, efn->data, efn->size); - else - if (!read_data_from_disk(ef, efn, data, size)) - goto on_error; if (efn->ciphered && cipher_key) - { - if (eet_decipher(data, size, cipher_key, strlen(cipher_key), &data_deciphered, &data_deciphered_sz)) - { - if (data_deciphered) free(data_deciphered); - goto on_error; - } - free(data); - data = data_deciphered; - size = data_deciphered_sz; - } + { + if (eet_decipher(data, size, cipher_key, strlen(cipher_key), + &data_deciphered, &data_deciphered_sz)) + { + if (data_deciphered) + free(data_deciphered); + + goto on_error; + } + + free(data); + data = data_deciphered; + size = data_deciphered_sz; + } } /* compressed data */ else { - void *tmp_data; - void *data_deciphered = NULL; - unsigned int data_deciphered_sz = 0; - int free_tmp = 0; - int compr_size = efn->size; - uLongf dlen; + void *tmp_data; + void *data_deciphered = NULL; + unsigned int data_deciphered_sz = 0; + int free_tmp = 0; + int compr_size = efn->size; + uLongf dlen; - /* if we already have the data in ram... copy that */ - if (efn->data) - tmp_data = efn->data; - else - { - tmp_data = malloc(compr_size); - if (!tmp_data) - goto on_error; + /* if we already have the data in ram... copy that */ + if (efn->data) + tmp_data = efn->data; + else + { + tmp_data = malloc(compr_size); + if (!tmp_data) + goto on_error; - free_tmp = 1; + free_tmp = 1; - if (!read_data_from_disk(ef, efn, tmp_data, compr_size)) - { - free(tmp_data); - goto on_error; - } - } + if (!read_data_from_disk(ef, efn, tmp_data, compr_size)) + { + free(tmp_data); + goto on_error; + } + } - if (efn->ciphered && cipher_key) - { - if (eet_decipher(tmp_data, compr_size, cipher_key, strlen(cipher_key), &data_deciphered, &data_deciphered_sz)) - { - if (free_tmp) free(tmp_data); - if (data_deciphered) free(data_deciphered); - goto on_error; - } - free(tmp_data); - tmp_data = data_deciphered; - compr_size = data_deciphered_sz; - } + if (efn->ciphered && cipher_key) + { + if (eet_decipher(tmp_data, compr_size, cipher_key, + strlen(cipher_key), &data_deciphered, + &data_deciphered_sz)) + { + if (free_tmp) + free(tmp_data); - /* decompress it */ - dlen = size; - if (uncompress((Bytef *)data, &dlen, - tmp_data, (uLongf)compr_size)) - goto on_error; + if (data_deciphered) + free(data_deciphered); - if (free_tmp) - free(tmp_data); + goto on_error; + } + + free(tmp_data); + tmp_data = data_deciphered; + compr_size = data_deciphered_sz; + } + + /* decompress it */ + dlen = size; + if (uncompress((Bytef *)data, &dlen, + tmp_data, (uLongf)compr_size)) + goto on_error; + + if (free_tmp) + free(tmp_data); } - UNLOCK_FILE(ef); + UNLOCK_FILE(ef); /* handle alias */ if (efn->alias) { - void *tmp; + void *tmp; - if (data[size - 1] != '\0') - goto on_error; + if (data[size - 1] != '\0') + goto on_error; - tmp = eet_read_cipher(ef, data, size_ret, cipher_key); + tmp = eet_read_cipher(ef, data, size_ret, cipher_key); - free(data); + free(data); - data = tmp; + data = tmp; } else - /* fill in return values */ - if (size_ret) - *size_ret = size; + /* fill in return values */ + if (size_ret) + *size_ret = size; return data; - on_error: +on_error: UNLOCK_FILE(ef); free(data); return NULL; @@ -1750,79 +1882,85 @@ eet_read_direct(Eet_File *ef, const char *name, int *size_ret) int size = 0; if (size_ret) - *size_ret = 0; + *size_ret = 0; /* check to see its' an eet file pointer */ if (eet_check_pointer(ef)) - return NULL; + return NULL; + if (!name) - return NULL; + return NULL; + if ((ef->mode != EET_FILE_MODE_READ) && (ef->mode != EET_FILE_MODE_READ_WRITE)) - return NULL; + return NULL; /* no header, return NULL */ if (eet_check_header(ef)) - return NULL; + return NULL; LOCK_FILE(ef); /* hunt hash bucket */ efn = find_node_by_name(ef, name); - if (!efn) goto on_error; + if (!efn) + goto on_error; if (efn->offset < 0 && efn->data == NULL) - goto on_error; + goto on_error; /* get size (uncompressed, if compressed at all) */ size = efn->data_size; if (efn->alias) { - data = efn->data ? efn->data : ef->data + efn->offset; + data = efn->data ? efn->data : ef->data + efn->offset; - /* handle alias case */ - if (efn->compression) - { - char *tmp; - int compr_size = efn->size; - uLongf dlen; + /* handle alias case */ + if (efn->compression) + { + char *tmp; + int compr_size = efn->size; + uLongf dlen; - tmp = alloca(sizeof (compr_size)); - dlen = size; + tmp = alloca(sizeof (compr_size)); + dlen = size; - if (uncompress((Bytef *)tmp, &dlen, (Bytef *) data, (uLongf)compr_size)) - goto on_error; + if (uncompress((Bytef *)tmp, &dlen, (Bytef *)data, + (uLongf)compr_size)) + goto on_error; - if (tmp[compr_size - 1] != '\0') - goto on_error; + if (tmp[compr_size - 1] != '\0') + goto on_error; - return eet_read_direct(ef, tmp, size_ret); - } + return eet_read_direct(ef, tmp, size_ret); + } - if (!data) goto on_error; - if (data[size - 1] != '\0') goto on_error; + if (!data) + goto on_error; - return eet_read_direct(ef, data, size_ret); + if (data[size - 1] != '\0') + goto on_error; + + return eet_read_direct(ef, data, size_ret); } else - /* uncompressed data */ - if (efn->compression == 0 - && efn->ciphered == 0) - data = efn->data ? efn->data : ef->data + efn->offset; - /* compressed data */ - else - data = NULL; + /* uncompressed data */ + if (efn->compression == 0 + && efn->ciphered == 0) + data = efn->data ? efn->data : ef->data + efn->offset; /* compressed data */ + else + data = NULL; /* fill in return values */ if (size_ret) - *size_ret = size; + *size_ret = size; UNLOCK_FILE(ef); return data; - on_error: +on_error: UNLOCK_FILE(ef); return NULL; } @@ -1838,126 +1976,134 @@ eet_alias(Eet_File *ef, const char *name, const char *destination, int comp) /* check to see its' an eet file pointer */ if (eet_check_pointer(ef)) - return EINA_FALSE; + return EINA_FALSE; + if ((!name) || (!destination)) - return EINA_FALSE; + return EINA_FALSE; + if ((ef->mode != EET_FILE_MODE_WRITE) && (ef->mode != EET_FILE_MODE_READ_WRITE)) - return EINA_FALSE; + return EINA_FALSE; LOCK_FILE(ef); if (!ef->header) { - /* allocate header */ - ef->header = calloc(1, sizeof(Eet_File_Header)); - if (!ef->header) - goto on_error; + /* allocate header */ + ef->header = calloc(1, sizeof(Eet_File_Header)); + if (!ef->header) + goto on_error; - ef->header->magic = EET_MAGIC_FILE_HEADER; - /* allocate directory block in ram */ - ef->header->directory = calloc(1, sizeof(Eet_File_Directory)); - if (!ef->header->directory) - { - free(ef->header); - ef->header = NULL; - goto on_error; - } + ef->header->magic = EET_MAGIC_FILE_HEADER; + /* allocate directory block in ram */ + ef->header->directory = calloc(1, sizeof(Eet_File_Directory)); + if (!ef->header->directory) + { + free(ef->header); + ef->header = NULL; + goto on_error; + } - /* 8 bit hash table (256 buckets) */ - ef->header->directory->size = 8; - /* allocate base hash table */ - ef->header->directory->nodes = calloc(1, sizeof(Eet_File_Node *) * (1 << ef->header->directory->size)); - if (!ef->header->directory->nodes) - { - free(ef->header->directory); - ef->header = NULL; - goto on_error; - } + /* 8 bit hash table (256 buckets) */ + ef->header->directory->size = 8; + /* allocate base hash table */ + ef->header->directory->nodes = + calloc(1, sizeof(Eet_File_Node *) * + (1 << ef->header->directory->size)); + if (!ef->header->directory->nodes) + { + free(ef->header->directory); + ef->header = NULL; + goto on_error; + } } /* figure hash bucket */ hash = _eet_hash_gen(name, ef->header->directory->size); data_size = comp ? - 12 + (((strlen(destination) + 1) * 101) / 100) - : strlen(destination) + 1; + 12 + (((strlen(destination) + 1) * 101) / 100) + : strlen(destination) + 1; data2 = malloc(data_size); - if (!data2) goto on_error; + if (!data2) + goto on_error; /* if we want to compress */ if (comp) { - uLongf buflen; + uLongf buflen; - /* compress the data with max compression */ - buflen = (uLongf)data_size; - if (compress2((Bytef *)data2, &buflen, (Bytef *)destination, - (uLong)strlen(destination) + 1, Z_BEST_COMPRESSION) != Z_OK) - { - free(data2); - goto on_error; - } - /* record compressed chunk size */ - data_size = (int)buflen; - if (data_size < 0 || data_size >= (int) (strlen(destination) + 1)) - { - comp = 0; - data_size = strlen(destination) + 1; - } - else - { - void *data3; + /* compress the data with max compression */ + buflen = (uLongf)data_size; + if (compress2((Bytef *)data2, &buflen, (Bytef *)destination, + (uLong)strlen(destination) + 1, + Z_BEST_COMPRESSION) != Z_OK) + { + free(data2); + goto on_error; + } - data3 = realloc(data2, data_size); - if (data3) - data2 = data3; - } + /* record compressed chunk size */ + data_size = (int)buflen; + if (data_size < 0 || data_size >= (int)(strlen(destination) + 1)) + { + comp = 0; + data_size = strlen(destination) + 1; + } + else + { + void *data3; + + data3 = realloc(data2, data_size); + if (data3) + data2 = data3; + } } if (!comp) - memcpy(data2, destination, data_size); + memcpy(data2, destination, data_size); /* Does this node already exist? */ for (efn = ef->header->directory->nodes[hash]; efn; efn = efn->next) { - /* if it matches */ - if ((efn->name) && (eet_string_match(efn->name, name))) - { - free(efn->data); - efn->alias = 1; - efn->ciphered = 0; - efn->compression = !!comp; - efn->size = data_size; - efn->data_size = strlen(destination) + 1; - efn->data = data2; - efn->offset = -1; - exists_already = EINA_TRUE; - break; - } + /* if it matches */ + if ((efn->name) && (eet_string_match(efn->name, name))) + { + free(efn->data); + efn->alias = 1; + efn->ciphered = 0; + efn->compression = !!comp; + efn->size = data_size; + efn->data_size = strlen(destination) + 1; + efn->data = data2; + efn->offset = -1; + exists_already = EINA_TRUE; + break; + } } if (!exists_already) { - efn = malloc(sizeof(Eet_File_Node)); - if (!efn) - { - free(data2); - goto on_error; - } - efn->name = strdup(name); + efn = malloc(sizeof(Eet_File_Node)); + if (!efn) + { + free(data2); + goto on_error; + } + + efn->name = strdup(name); efn->name_size = strlen(efn->name) + 1; efn->free_name = 1; - efn->next = ef->header->directory->nodes[hash]; - ef->header->directory->nodes[hash] = efn; - efn->offset = -1; - efn->alias = 1; - efn->ciphered = 0; - efn->compression = !!comp; - efn->size = data_size; - efn->data_size = strlen(destination) + 1; - efn->data = data2; + efn->next = ef->header->directory->nodes[hash]; + ef->header->directory->nodes[hash] = efn; + efn->offset = -1; + efn->alias = 1; + efn->ciphered = 0; + efn->compression = !!comp; + efn->size = data_size; + efn->data_size = strlen(destination) + 1; + efn->data = data2; } /* flags that writes are pending */ @@ -1966,58 +2112,67 @@ eet_alias(Eet_File *ef, const char *name, const char *destination, int comp) UNLOCK_FILE(ef); return EINA_TRUE; - on_error: +on_error: UNLOCK_FILE(ef); return EINA_FALSE; } EAPI int -eet_write_cipher(Eet_File *ef, const char *name, const void *data, int size, int comp, const char *cipher_key) +eet_write_cipher(Eet_File *ef, + const char *name, + const void *data, + int size, + int comp, + const char *cipher_key) { - Eet_File_Node *efn; - void *data2 = NULL; - int exists_already = 0; - int data_size; - int hash; + Eet_File_Node *efn; + void *data2 = NULL; + int exists_already = 0; + int data_size; + int hash; /* check to see its' an eet file pointer */ if (eet_check_pointer(ef)) - return 0; + return 0; + if ((!name) || (!data) || (size <= 0)) - return 0; + return 0; + if ((ef->mode != EET_FILE_MODE_WRITE) && (ef->mode != EET_FILE_MODE_READ_WRITE)) - return 0; + return 0; LOCK_FILE(ef); if (!ef->header) { - /* allocate header */ - ef->header = calloc(1, sizeof(Eet_File_Header)); - if (!ef->header) - goto on_error; + /* allocate header */ + ef->header = calloc(1, sizeof(Eet_File_Header)); + if (!ef->header) + goto on_error; - ef->header->magic = EET_MAGIC_FILE_HEADER; - /* allocate directory block in ram */ - ef->header->directory = calloc(1, sizeof(Eet_File_Directory)); - if (!ef->header->directory) - { - free(ef->header); - ef->header = NULL; - goto on_error; - } + ef->header->magic = EET_MAGIC_FILE_HEADER; + /* allocate directory block in ram */ + ef->header->directory = calloc(1, sizeof(Eet_File_Directory)); + if (!ef->header->directory) + { + free(ef->header); + ef->header = NULL; + goto on_error; + } - /* 8 bit hash table (256 buckets) */ - ef->header->directory->size = 8; - /* allocate base hash table */ - ef->header->directory->nodes = calloc(1, sizeof(Eet_File_Node *) * (1 << ef->header->directory->size)); - if (!ef->header->directory->nodes) - { - free(ef->header->directory); - ef->header = NULL; - goto on_error; - } + /* 8 bit hash table (256 buckets) */ + ef->header->directory->size = 8; + /* allocate base hash table */ + ef->header->directory->nodes = + calloc(1, sizeof(Eet_File_Node *) * + (1 << ef->header->directory->size)); + if (!ef->header->directory->nodes) + { + free(ef->header->directory); + ef->header = NULL; + goto on_error; + } } /* figure hash bucket */ @@ -2027,103 +2182,111 @@ eet_write_cipher(Eet_File *ef, const char *name, const void *data, int size, int if (comp || !cipher_key) { - data2 = malloc(data_size); - if (!data2) goto on_error; + data2 = malloc(data_size); + if (!data2) + goto on_error; } /* if we want to compress */ if (comp) { - uLongf buflen; + uLongf buflen; - /* compress the data with max compression */ - buflen = (uLongf)data_size; - if (compress2((Bytef *)data2, &buflen, (Bytef *)data, - (uLong)size, Z_BEST_COMPRESSION) != Z_OK) - { - free(data2); - goto on_error; - } - /* record compressed chunk size */ - data_size = (int)buflen; - if (data_size < 0 || data_size >= size) - { - comp = 0; - data_size = size; - } - else - { - void *data3; + /* compress the data with max compression */ + buflen = (uLongf)data_size; + if (compress2((Bytef *)data2, &buflen, (Bytef *)data, + (uLong)size, Z_BEST_COMPRESSION) != Z_OK) + { + free(data2); + goto on_error; + } - data3 = realloc(data2, data_size); - if (data3) - data2 = data3; - } + /* record compressed chunk size */ + data_size = (int)buflen; + if (data_size < 0 || data_size >= size) + { + comp = 0; + data_size = size; + } + else + { + void *data3; + + data3 = realloc(data2, data_size); + if (data3) + data2 = data3; + } } if (cipher_key) { - void *data_ciphered = NULL; - unsigned int data_ciphered_sz = 0; - const void *tmp; + void *data_ciphered = NULL; + unsigned int data_ciphered_sz = 0; + const void *tmp; - tmp = data2 ? data2 : data; - if (!eet_cipher(tmp, data_size, cipher_key, strlen(cipher_key), &data_ciphered, &data_ciphered_sz)) - { - if (data2) free(data2); - data2 = data_ciphered; - data_size = data_ciphered_sz; - size = (data_size > size) ? data_size : size; - } - else - { - if (data_ciphered) free(data_ciphered); - cipher_key = NULL; - } + tmp = data2 ? data2 : data; + if (!eet_cipher(tmp, data_size, cipher_key, strlen(cipher_key), + &data_ciphered, &data_ciphered_sz)) + { + if (data2) + free(data2); + + data2 = data_ciphered; + data_size = data_ciphered_sz; + size = (data_size > size) ? data_size : size; + } + else + { + if (data_ciphered) + free(data_ciphered); + + cipher_key = NULL; + } } else - if (!comp) - memcpy(data2, data, size); + if (!comp) + memcpy(data2, data, size); /* Does this node already exist? */ for (efn = ef->header->directory->nodes[hash]; efn; efn = efn->next) { - /* if it matches */ - if ((efn->name) && (eet_string_match(efn->name, name))) - { - free(efn->data); - efn->alias = 0; - efn->ciphered = cipher_key ? 1 : 0; - efn->compression = !!comp; - efn->size = data_size; - efn->data_size = size; - efn->data = data2; - efn->offset = -1; - exists_already = 1; - break; - } + /* if it matches */ + if ((efn->name) && (eet_string_match(efn->name, name))) + { + free(efn->data); + efn->alias = 0; + efn->ciphered = cipher_key ? 1 : 0; + efn->compression = !!comp; + efn->size = data_size; + efn->data_size = size; + efn->data = data2; + efn->offset = -1; + exists_already = 1; + break; + } } if (!exists_already) { - efn = malloc(sizeof(Eet_File_Node)); - if (!efn) - { - free(data2); - goto on_error; - } - efn->name = strdup(name); + efn = malloc(sizeof(Eet_File_Node)); + if (!efn) + { + free(data2); + goto on_error; + } + + efn->name = strdup(name); efn->name_size = strlen(efn->name) + 1; efn->free_name = 1; - efn->next = ef->header->directory->nodes[hash]; - ef->header->directory->nodes[hash] = efn; - efn->offset = -1; - efn->alias = 0; - efn->ciphered = cipher_key ? 1 : 0; - efn->compression = !!comp; - efn->size = data_size; - efn->data_size = size; - efn->data = data2; + efn->next = ef->header->directory->nodes[hash]; + ef->header->directory->nodes[hash] = efn; + efn->offset = -1; + efn->alias = 0; + efn->ciphered = cipher_key ? 1 : 0; + efn->compression = !!comp; + efn->size = data_size; + efn->data_size = size; + efn->data = data2; } /* flags that writes are pending */ @@ -2131,7 +2294,7 @@ eet_write_cipher(Eet_File *ef, const char *name, const void *data, int size, int UNLOCK_FILE(ef); return data_size; - on_error: +on_error: UNLOCK_FILE(ef); return 0; } @@ -2145,23 +2308,24 @@ eet_write(Eet_File *ef, const char *name, const void *data, int size, int comp) EAPI int eet_delete(Eet_File *ef, const char *name) { - Eet_File_Node *efn; - Eet_File_Node *pefn; - int hash; - int exists_already = 0; + Eet_File_Node *efn; + Eet_File_Node *pefn; + int hash; + int exists_already = 0; /* check to see its' an eet file pointer */ if (eet_check_pointer(ef)) - return 0; + return 0; + if (!name) - return 0; + return 0; /* deleting keys is only possible in RW or WRITE mode */ if (ef->mode == EET_FILE_MODE_READ) - return 0; + return 0; if (eet_check_header(ef)) - return 0; + return 0; LOCK_FILE(ef); @@ -2170,29 +2334,31 @@ eet_delete(Eet_File *ef, const char *name) /* Does this node already exist? */ for (pefn = NULL, efn = ef->header->directory->nodes[hash]; - efn; - pefn = efn, efn = efn->next) + efn; + pefn = efn, efn = efn->next) { - /* if it matches */ - if (eet_string_match(efn->name, name)) - { - if (efn->data) - free(efn->data); + /* if it matches */ + if (eet_string_match(efn->name, name)) + { + if (efn->data) + free(efn->data); - if (pefn == NULL) - ef->header->directory->nodes[hash] = efn->next; - else - pefn->next = efn->next; + if (pefn == NULL) + ef->header->directory->nodes[hash] = efn->next; + else + pefn->next = efn->next; - if (efn->free_name) free(efn->name); - free(efn); - exists_already = 1; - break; - } + if (efn->free_name) + free(efn->name); + + free(efn); + exists_already = 1; + break; + } } /* flags that writes are pending */ if (exists_already) - ef->writes_pending = 1; + ef->writes_pending = 1; UNLOCK_FILE(ef); @@ -2203,7 +2369,8 @@ eet_delete(Eet_File *ef, const char *name) EAPI Eet_Dictionary * eet_dictionary_get(Eet_File *ef) { - if (eet_check_pointer(ef)) return NULL; + if (eet_check_pointer(ef)) + return NULL; return ef->ed; } @@ -2212,11 +2379,11 @@ eet_dictionary_get(Eet_File *ef) EAPI char ** eet_list(Eet_File *ef, const char *glob, int *count_ret) { - Eet_File_Node *efn; - char **list_ret = NULL; - int list_count = 0; - int list_count_alloc = 0; - int i, num; + Eet_File_Node *efn; + char **list_ret = NULL; + int list_count = 0; + int list_count_alloc = 0; + int i, num; /* check to see its' an eet file pointer */ if (eet_check_pointer(ef) || eet_check_header(ef) || @@ -2224,13 +2391,14 @@ eet_list(Eet_File *ef, const char *glob, int *count_ret) ((ef->mode != EET_FILE_MODE_READ) && (ef->mode != EET_FILE_MODE_READ_WRITE))) { - if (count_ret) - *count_ret = 0; + if (count_ret) + *count_ret = 0; - return NULL; + return NULL; } - if (!strcmp(glob, "*")) glob = NULL; + if (!strcmp(glob, "*")) + glob = NULL; LOCK_FILE(ef); @@ -2238,52 +2406,54 @@ eet_list(Eet_File *ef, const char *glob, int *count_ret) num = (1 << ef->header->directory->size); for (i = 0; i < num; i++) { - for (efn = ef->header->directory->nodes[i]; efn; efn = efn->next) - { - /* if the entry matches the input glob - * check for * explicitly, because on some systems, * isn't well - * supported - */ - if ((!glob) || !fnmatch(glob, efn->name, 0)) - { - /* add it to our list */ - list_count++; + for (efn = ef->header->directory->nodes[i]; efn; efn = efn->next) + { + /* if the entry matches the input glob + * check for * explicitly, because on some systems, * isn't well + * supported + */ + if ((!glob) || !fnmatch(glob, efn->name, 0)) + { + /* add it to our list */ + list_count++; - /* only realloc in 32 entry chunks */ - if (list_count > list_count_alloc) - { - char **new_list = NULL; + /* only realloc in 32 entry chunks */ + if (list_count > list_count_alloc) + { + char **new_list = NULL; - list_count_alloc += 64; - new_list = realloc(list_ret, list_count_alloc * (sizeof(char *))); - if (!new_list) - { - free(list_ret); + list_count_alloc += 64; + new_list = + realloc(list_ret, list_count_alloc * (sizeof(char *))); + if (!new_list) + { + free(list_ret); - goto on_error; - } - list_ret = new_list; - } + goto on_error; + } - /* put pointer of name string in */ - list_ret[list_count - 1] = efn->name; - } - } + list_ret = new_list; + } + + /* put pointer of name string in */ + list_ret[list_count - 1] = efn->name; + } + } } UNLOCK_FILE(ef); /* return count and list */ if (count_ret) - *count_ret = list_count; + *count_ret = list_count; return list_ret; - on_error: +on_error: UNLOCK_FILE(ef); if (count_ret) - *count_ret = 0; + *count_ret = 0; return NULL; } @@ -2298,7 +2468,7 @@ eet_num_entries(Eet_File *ef) if (eet_check_pointer(ef) || eet_check_header(ef) || ((ef->mode != EET_FILE_MODE_READ) && (ef->mode != EET_FILE_MODE_READ_WRITE))) - return -1; + return -1; LOCK_FILE(ef); @@ -2306,8 +2476,8 @@ eet_num_entries(Eet_File *ef) num = (1 << ef->header->directory->size); for (i = 0; i < num; i++) { - for (efn = ef->header->directory->nodes[i]; efn; efn = efn->next) - ret++; + for (efn = ef->header->directory->nodes[i]; efn; efn = efn->next) + ret++; } UNLOCK_FILE(ef); @@ -2326,8 +2496,8 @@ find_node_by_name(Eet_File *ef, const char *name) for (efn = ef->header->directory->nodes[hash]; efn; efn = efn->next) { - if (eet_string_match(efn->name, name)) - return efn; + if (eet_string_match(efn->name, name)) + return efn; } return NULL; @@ -2336,24 +2506,28 @@ find_node_by_name(Eet_File *ef, const char *name) static int read_data_from_disk(Eet_File *ef, Eet_File_Node *efn, void *buf, int len) { - if (efn->offset < 0) return 0; + if (efn->offset < 0) + return 0; if (ef->data) { - if ((efn->offset + len) > ef->data_size) return 0; - memcpy(buf, ef->data + efn->offset, len); + if ((efn->offset + len) > ef->data_size) + return 0; + + memcpy(buf, ef->data + efn->offset, len); } else { - if (!ef->readfp) - return 0; + if (!ef->readfp) + return 0; - /* seek to data location */ - if (fseek(ef->readfp, efn->offset, SEEK_SET) < 0) - return 0; + /* seek to data location */ + if (fseek(ef->readfp, efn->offset, SEEK_SET) < 0) + return 0; - /* read it */ - len = fread(buf, len, 1, ef->readfp); + /* read it */ + len = fread(buf, len, 1, ef->readfp); } + return len; } diff --git a/legacy/eet/src/lib/eet_node.c b/legacy/eet/src/lib/eet_node.c index 6f33dda0a6..06c2fdb3c0 100644 --- a/legacy/eet/src/lib/eet_node.c +++ b/legacy/eet/src/lib/eet_node.c @@ -27,7 +27,7 @@ eet_node_new(void) result = eina_mempool_malloc(_eet_node_mp, sizeof (Eet_Node)); if (!result) - return NULL; + return NULL; memset(result, 0, sizeof (Eet_Node)); return result; @@ -45,7 +45,8 @@ _eet_node_new(const char *name, int type) Eet_Node *n; n = eet_node_new(); - if (!n) return NULL; + if (!n) + return NULL; n->type = type; n->name = eina_stringshare_add(name); @@ -60,51 +61,51 @@ _eet_node_append(Eet_Node *n, Eina_List *nodes) Eina_List *l; EINA_LIST_REVERSE_FOREACH(nodes, l, value) - { - value->next = n->values; - n->values = value; - } + { + value->next = n->values; + n->values = value; + } } -#define EET_NODE_NEW(Eet_type, Name, Value, Type) \ - EAPI Eet_Node * \ - eet_node_##Name##_new(const char *name, Type Value) \ - { \ - Eet_Node *n; \ - \ - n = _eet_node_new(name, Eet_type); \ - if (!n) return NULL; \ - \ - n->data.value.Value = Value; \ - \ - return n; \ - } +#define EET_NODE_NEW(Eet_type, Name, Value, Type) \ + EAPI Eet_Node * \ + eet_node_ ## Name ## _new(const char *name, Type Value) \ + { \ + Eet_Node *n; \ + \ + n = _eet_node_new(name, Eet_type); \ + if (!n) { return NULL; } \ + \ + n->data.value.Value = Value; \ + \ + return n; \ + } -#define EET_NODE_STR_NEW(Eet_type, Name, Value, Type) \ - EAPI Eet_Node * \ - eet_node_##Name##_new(const char *name, Type Value) \ - { \ - Eet_Node *n; \ - \ - n = _eet_node_new(name, Eet_type); \ - if (!n) return NULL; \ - \ - n->data.value.Value = eina_stringshare_add(Value); \ - \ - return n; \ - } +#define EET_NODE_STR_NEW(Eet_type, Name, Value, Type) \ + EAPI Eet_Node * \ + eet_node_ ## Name ## _new(const char *name, Type Value) \ + { \ + Eet_Node *n; \ + \ + n = _eet_node_new(name, Eet_type); \ + if (!n) { return NULL; } \ + \ + n->data.value.Value = eina_stringshare_add(Value); \ + \ + return n; \ + } -EET_NODE_NEW(EET_T_CHAR, char, c, char) -EET_NODE_NEW(EET_T_SHORT, short, s, short) -EET_NODE_NEW(EET_T_INT, int, i, int) -EET_NODE_NEW(EET_T_LONG_LONG, long_long, l, long long) -EET_NODE_NEW(EET_T_FLOAT, float, f, float) -EET_NODE_NEW(EET_T_DOUBLE, double, d, double) -EET_NODE_NEW(EET_T_UCHAR, unsigned_char, uc, unsigned char) -EET_NODE_NEW(EET_T_USHORT, unsigned_short, us, unsigned short) -EET_NODE_NEW(EET_T_UINT, unsigned_int, ui, unsigned int) +EET_NODE_NEW(EET_T_CHAR, char, c, char) +EET_NODE_NEW(EET_T_SHORT, short, s, short) +EET_NODE_NEW(EET_T_INT, int, i, int) +EET_NODE_NEW(EET_T_LONG_LONG, long_long, l, long long) +EET_NODE_NEW(EET_T_FLOAT, float, f, float) +EET_NODE_NEW(EET_T_DOUBLE, double, d, double) +EET_NODE_NEW(EET_T_UCHAR, unsigned_char, uc, unsigned char) +EET_NODE_NEW(EET_T_USHORT, unsigned_short, us, unsigned short) +EET_NODE_NEW(EET_T_UINT, unsigned_int, ui, unsigned int) EET_NODE_NEW(EET_T_ULONG_LONG, unsigned_long_long, ul, unsigned long long) -EET_NODE_STR_NEW(EET_T_STRING, string, str, const char *) +EET_NODE_STR_NEW(EET_T_STRING, string, str, const char *) EET_NODE_STR_NEW(EET_T_INLINED_STRING, inlined_string, str, const char *) Eet_Node * @@ -113,7 +114,8 @@ eet_node_null_new(const char *name) Eet_Node *n; n = _eet_node_new(name, EET_T_NULL); - if (!n) return NULL; + if (!n) + return NULL; n->data.value.str = NULL; @@ -126,7 +128,8 @@ eet_node_list_new(const char *name, Eina_List *nodes) Eet_Node *n; n = _eet_node_new(name, EET_G_LIST); - if (!n) return NULL; + if (!n) + return NULL; _eet_node_append(n, nodes); @@ -139,7 +142,8 @@ eet_node_array_new(const char *name, int count, Eina_List *nodes) Eet_Node *n; n = _eet_node_new(name, EET_G_ARRAY); - if (!n) return NULL; + if (!n) + return NULL; n->count = count; @@ -154,7 +158,8 @@ eet_node_var_array_new(const char *name, Eina_List *nodes) Eet_Node *n; n = _eet_node_new(name, EET_G_VAR_ARRAY); - if (!n) return NULL; + if (!n) + return NULL; n->count = eina_list_count(nodes); @@ -169,10 +174,12 @@ eet_node_hash_new(const char *name, const char *key, Eet_Node *node) Eina_List *nodes; Eet_Node *n; - if (!node) return NULL; + if (!node) + return NULL; n = _eet_node_new(name, EET_G_HASH); - if (!n) return NULL; + if (!n) + return NULL; n->key = eina_stringshare_add(key); nodes = eina_list_append(NULL, node); @@ -188,7 +195,8 @@ eet_node_struct_new(const char *name, Eina_List *nodes) Eet_Node *n; n = _eet_node_new(name, EET_G_UNKNOWN); - if (!n) return NULL; + if (!n) + return NULL; _eet_node_append(n, nodes); @@ -201,10 +209,11 @@ eet_node_struct_child_new(const char *parent, Eet_Node *child) Eet_Node *n; if (child->type != EET_G_UNKNOWN) - return child; + return child; n = _eet_node_new(parent, EET_G_UNKNOWN); - if (!n) return NULL; + if (!n) + return NULL; _eet_node_append(n, eina_list_prepend(NULL, child)); @@ -220,23 +229,25 @@ eet_node_list_append(Eet_Node *parent, const char *name, Eet_Node *child) tmp = eina_stringshare_add(name); for (nn = parent->values; nn; nn = nn->next) - if (nn->name == tmp && nn->type == EET_G_LIST) - { - Eet_Node *n; + if (nn->name == tmp && nn->type == EET_G_LIST) + { + Eet_Node *n; - if (!nn->values) nn->values = child; - else - { - for (n = nn->values; n->next; n = n->next) - ; - n->next = child; - } - child->next = NULL; + if (!nn->values) + nn->values = child; + else + { + for (n = nn->values; n->next; n = n->next) + ; + n->next = child; + } - eina_stringshare_del(tmp); + child->next = NULL; - return ; - } + eina_stringshare_del(tmp); + + return; + } /* No list found, so create it. */ nn = eet_node_list_new(tmp, eina_list_append(NULL, child)); @@ -245,7 +256,7 @@ eet_node_list_append(Eet_Node *parent, const char *name, Eet_Node *child) nn->next = parent->values; parent->values = nn; - eina_stringshare_del(tmp); + eina_stringshare_del(tmp); } void @@ -257,41 +268,48 @@ eet_node_struct_append(Eet_Node *parent, const char *name, Eet_Node *child) if (parent->type != EET_G_UNKNOWN) { - ERR("[%s] is not a structure. Will not insert [%s] in it", parent->name, name); - eet_node_del(child); - return ; + ERR("[%s] is not a structure. Will not insert [%s] in it", + parent->name, + name); + eet_node_del(child); + return; } tmp = eina_stringshare_add(name); for (prev = NULL, nn = parent->values; nn; prev = nn, nn = nn->next) - if (nn->name == tmp && nn->type == child->type) - { - if (prev) prev->next = nn->next; - else parent->values = nn->next; + if (nn->name == tmp && nn->type == child->type) + { + if (prev) + prev->next = nn->next; + else + parent->values = nn->next; - nn->next = NULL; - eet_node_del(nn); + nn->next = NULL; + eet_node_del(nn); - break; - } + break; + } if (prev) { - prev->next = child; - child->next = NULL; + prev->next = child; + child->next = NULL; } else { - child->next = NULL; - parent->values = child; + child->next = NULL; + parent->values = child; } - eina_stringshare_del(tmp); + eina_stringshare_del(tmp); } void -eet_node_hash_add(Eet_Node *parent, const char *name, const char *key, Eet_Node *child) +eet_node_hash_add(Eet_Node *parent, + const char *name, + const char *key, + Eet_Node *child) { Eet_Node *nn; @@ -309,27 +327,31 @@ eet_node_del(Eet_Node *n) Eet_Node *nn; Eet_Node *tmp; - if (!n) return ; + if (!n) + return; switch (n->type) { case EET_G_HASH: - eina_stringshare_del(n->key); + eina_stringshare_del(n->key); + case EET_G_UNKNOWN: case EET_G_VAR_ARRAY: case EET_G_ARRAY: case EET_G_LIST: - for (nn = n->values; nn; ) - { - tmp = nn; - nn = nn->next; - eet_node_del(tmp); - } - break; + for (nn = n->values; nn; ) + { + tmp = nn; + nn = nn->next; + eet_node_del(tmp); + } + break; + case EET_T_STRING: case EET_T_INLINED_STRING: - eina_stringshare_del(n->data.value.str); - break; + eina_stringshare_del(n->data.value.str); + break; + case EET_T_CHAR: case EET_T_SHORT: case EET_T_INT: @@ -339,39 +361,41 @@ eet_node_del(Eet_Node *n) case EET_T_UCHAR: case EET_T_USHORT: case EET_T_UINT: - break; + break; } - eina_stringshare_del(n->name); - eet_node_free(n); + eina_stringshare_del(n->name); + eet_node_free(n); } static const char *eet_node_dump_g_name[6] = { - "struct", - "array", - "var_array", - "list", - "hash", - "???" + "struct", + "array", + "var_array", + "list", + "hash", + "???" }; static const char *eet_node_dump_t_name[14][2] = { - { "???: ", "???" }, - { "char: ", "%hhi" }, - { "short: ", "%hi" }, - { "int: ", "%i" }, - { "long_long: ", "%lli" }, - { "float: ", "%1.25f" }, - { "double: ", "%1.25f" }, - { "uchar: ", "%hhu" }, - { "ushort: ", "%i" }, - { "uint: ", "%u" }, - { "ulong_long: ", "%llu" }, - { "null", "" } + { "???: ", "???" }, + { "char: ", "%hhi" }, + { "short: ", "%hi" }, + { "int: ", "%i" }, + { "long_long: ", "%lli" }, + { "float: ", "%1.25f" }, + { "double: ", "%1.25f" }, + { "uchar: ", "%hhu" }, + { "ushort: ", "%i" }, + { "uint: ", "%u" }, + { "ulong_long: ", "%llu" }, + { "null", "" } }; static void -eet_node_dump_level(int level, void (*dumpfunc) (void *data, const char *str), void *dumpdata) +eet_node_dump_level(int level, void (*dumpfunc)(void *data, + const char *str), + void *dumpdata) { int i; @@ -387,36 +411,48 @@ eet_node_string_escape(const char *str) for (strp = str; *strp; strp++) { - if (*strp == '\"') sz += 2; - else if (*strp == '\\') sz += 2; - else if (*strp == '\n') sz += 2; - else sz += 1; + if (*strp == '\"') + sz += 2; + else if (*strp == '\\') + sz += 2; + else if (*strp == '\n') + sz += 2; + else + sz += 1; } s = malloc(sz + 1); - if (!s) return NULL; + if (!s) + return NULL; + for (strp = str, sp = s; *strp; strp++, sp++) { - if (*strp == '\"' - || *strp == '\\' - || *strp == '\n') - { - *sp = '\\'; - sp++; - } - if (*strp == '\n') *sp = 'n'; - else *sp = *strp; + if (*strp == '\"' + || *strp == '\\' + || *strp == '\n') + { + *sp = '\\'; + sp++; + } + + if (*strp == '\n') + *sp = 'n'; + else + *sp = *strp; } *sp = 0; return s; } static void -eet_node_dump_string_escape(void *dumpdata, void dumpfunc(void *data, const char *str), const char *str) +eet_node_dump_string_escape(void *dumpdata, void dumpfunc(void *data, + const char *str), + const char *str) { char *s; s = eet_node_string_escape(str); - if (!s) return ; + if (!s) + return; dumpfunc(dumpdata, s); free(s); @@ -424,7 +460,8 @@ eet_node_dump_string_escape(void *dumpdata, void dumpfunc(void *data, const char static void eet_node_dump_simple_type(Eet_Node *n, int level, - void (*dumpfunc) (void *data, const char *str), void *dumpdata) + void (*dumpfunc)(void *data, + const char *str), void *dumpdata) { const char *type_name = NULL; char tbuf[256]; @@ -432,84 +469,99 @@ eet_node_dump_simple_type(Eet_Node *n, int level, eet_node_dump_level(level, dumpfunc, dumpdata); dumpfunc(dumpdata, "value \""); eet_node_dump_string_escape(dumpdata, dumpfunc, n->name); - dumpfunc(dumpdata, "\" "); + dumpfunc(dumpdata, "\" "); #ifdef EET_T_TYPE # undef EET_T_TYPE #endif -#define EET_T_TYPE(Eet_Type, Type) \ - case Eet_Type: \ - { \ - dumpfunc(dumpdata, eet_node_dump_t_name[Eet_Type][0]); \ - snprintf(tbuf, sizeof (tbuf), eet_node_dump_t_name[Eet_Type][1], n->data.value.Type); \ - dumpfunc(dumpdata, tbuf); \ - break; \ - } +#define EET_T_TYPE(Eet_Type, Type) \ + case Eet_Type: \ + { \ + dumpfunc(dumpdata, eet_node_dump_t_name[Eet_Type][0]); \ + snprintf(tbuf, \ + sizeof (tbuf), \ + eet_node_dump_t_name[Eet_Type][1], \ + n->data.value.Type); \ + dumpfunc(dumpdata, tbuf); \ + break; \ + } switch (n->type) { - EET_T_TYPE(EET_T_CHAR, c); - EET_T_TYPE(EET_T_SHORT, s); - EET_T_TYPE(EET_T_INT, i); - EET_T_TYPE(EET_T_LONG_LONG, l); - EET_T_TYPE(EET_T_FLOAT, f); - EET_T_TYPE(EET_T_DOUBLE, d); - EET_T_TYPE(EET_T_UCHAR, uc); - EET_T_TYPE(EET_T_USHORT, us); - EET_T_TYPE(EET_T_UINT, ui); - EET_T_TYPE(EET_T_ULONG_LONG, ul); - case EET_T_INLINED_STRING: - type_name = "inlined: \""; - case EET_T_STRING: - if (!type_name) type_name = "string: \""; + EET_T_TYPE(EET_T_CHAR, c); + EET_T_TYPE(EET_T_SHORT, s); + EET_T_TYPE(EET_T_INT, i); + EET_T_TYPE(EET_T_LONG_LONG, l); + EET_T_TYPE(EET_T_FLOAT, f); + EET_T_TYPE(EET_T_DOUBLE, d); + EET_T_TYPE(EET_T_UCHAR, uc); + EET_T_TYPE(EET_T_USHORT, us); + EET_T_TYPE(EET_T_UINT, ui); + EET_T_TYPE(EET_T_ULONG_LONG, ul); + + case EET_T_INLINED_STRING: + type_name = "inlined: \""; + + case EET_T_STRING: + if (!type_name) + type_name = "string: \""; + + dumpfunc(dumpdata, type_name); + eet_node_dump_string_escape(dumpdata, dumpfunc, n->data.value.str); + dumpfunc(dumpdata, "\""); + break; - dumpfunc(dumpdata, type_name); - eet_node_dump_string_escape(dumpdata, dumpfunc, n->data.value.str); - dumpfunc(dumpdata, "\""); - break; case EET_T_NULL: - dumpfunc(dumpdata, "null"); - break; + dumpfunc(dumpdata, "null"); + break; + default: - dumpfunc(dumpdata, "???: ???"); - break; + dumpfunc(dumpdata, "???: ???"); + break; } - dumpfunc(dumpdata, ";\n"); + dumpfunc(dumpdata, ";\n"); } static void -eet_node_dump_group_start(int level, void (*dumpfunc) (void *data, const char *str), void *dumpdata, - int group_type, const char *name) +eet_node_dump_group_start(int level, void (*dumpfunc)(void *data, + const char *str), + void *dumpdata, + int group_type, const char *name) { int chnk_type; chnk_type = (group_type >= EET_G_UNKNOWN && group_type <= EET_G_HASH) ? - group_type : EET_G_LAST; + group_type : EET_G_LAST; eet_node_dump_level(level, dumpfunc, dumpdata); dumpfunc(dumpdata, "group \""); eet_node_dump_string_escape(dumpdata, dumpfunc, name); - dumpfunc(dumpdata, "\" "); + dumpfunc(dumpdata, "\" "); dumpfunc(dumpdata, eet_node_dump_g_name[chnk_type - EET_G_UNKNOWN]); - dumpfunc(dumpdata, " {\n"); + dumpfunc(dumpdata, " {\n"); } static void -eet_node_dump_group_end(int level, void (*dumpfunc) (void *data, const char *str), void *dumpdata) +eet_node_dump_group_end(int level, void (*dumpfunc)(void *data, + const char *str), + void *dumpdata) { eet_node_dump_level(level, dumpfunc, dumpdata); dumpfunc(dumpdata, "}\n"); } void -eet_node_dump(Eet_Node *n, int dumplevel, void (*dumpfunc) (void *data, const char *str), void *dumpdata) +eet_node_dump(Eet_Node *n, int dumplevel, void (*dumpfunc)(void *data, + const char *str), + void *dumpdata) { Eet_Node *it; - if (!n) return ; + if (!n) + return; switch (n->type) { @@ -518,32 +570,37 @@ eet_node_dump(Eet_Node *n, int dumplevel, void (*dumpfunc) (void *data, const ch case EET_G_UNKNOWN: case EET_G_HASH: case EET_G_LIST: - eet_node_dump_group_start(dumplevel, dumpfunc, dumpdata, n->type, n->name); + eet_node_dump_group_start(dumplevel, + dumpfunc, + dumpdata, + n->type, + n->name); - if (n->type == EET_G_VAR_ARRAY - || n->type == EET_G_ARRAY) - { - char tbuf[256]; + if (n->type == EET_G_VAR_ARRAY + || n->type == EET_G_ARRAY) + { + char tbuf[256]; - eet_node_dump_level(dumplevel, dumpfunc, dumpdata); - dumpfunc(dumpdata, " count "); - eina_convert_itoa(n->count, tbuf); - dumpfunc(dumpdata, tbuf); - dumpfunc(dumpdata, ";\n"); - } - else if (n->type == EET_G_HASH) - { - eet_node_dump_level(dumplevel, dumpfunc, dumpdata); - dumpfunc(dumpdata, " key \""); - eet_node_dump_string_escape(dumpdata, dumpfunc, n->key); - dumpfunc(dumpdata, "\";\n"); - } + eet_node_dump_level(dumplevel, dumpfunc, dumpdata); + dumpfunc(dumpdata, " count "); + eina_convert_itoa(n->count, tbuf); + dumpfunc(dumpdata, tbuf); + dumpfunc(dumpdata, ";\n"); + } + else if (n->type == EET_G_HASH) + { + eet_node_dump_level(dumplevel, dumpfunc, dumpdata); + dumpfunc(dumpdata, " key \""); + eet_node_dump_string_escape(dumpdata, dumpfunc, n->key); + dumpfunc(dumpdata, "\";\n"); + } - for (it = n->values; it != NULL; it = it->next) - eet_node_dump(it, dumplevel + 2, dumpfunc, dumpdata); + for (it = n->values; it != NULL; it = it->next) + eet_node_dump(it, dumplevel + 2, dumpfunc, dumpdata); + + eet_node_dump_group_end(dumplevel, dumpfunc, dumpdata); + break; - eet_node_dump_group_end(dumplevel, dumpfunc, dumpdata); - break; case EET_T_STRING: case EET_T_INLINED_STRING: case EET_T_CHAR: @@ -556,13 +613,17 @@ eet_node_dump(Eet_Node *n, int dumplevel, void (*dumpfunc) (void *data, const ch case EET_T_USHORT: case EET_T_UINT: case EET_T_ULONG_LONG: - eet_node_dump_simple_type(n, dumplevel, dumpfunc, dumpdata); - break; + eet_node_dump_simple_type(n, dumplevel, dumpfunc, dumpdata); + break; } } -void* -eet_node_walk(void *parent, const char *name, Eet_Node *root, Eet_Node_Walk *cb, void *user_data) +void * +eet_node_walk(void *parent, + const char *name, + Eet_Node *root, + Eet_Node_Walk *cb, + void *user_data) { Eet_Node *it; void *me = NULL; @@ -570,39 +631,59 @@ eet_node_walk(void *parent, const char *name, Eet_Node *root, Eet_Node_Walk *cb, if (!root) { - if (parent) cb->struct_add(parent, name, NULL, user_data); - return NULL; + if (parent) + cb->struct_add(parent, name, NULL, user_data); + + return NULL; } switch (root->type) { case EET_G_UNKNOWN: - me = cb->struct_alloc(root->name, user_data); + me = cb->struct_alloc(root->name, user_data); - for (it = root->values; it != NULL; it = it->next) - eet_node_walk(me, it->name, it, cb, user_data); + for (it = root->values; it != NULL; it = it->next) + eet_node_walk(me, it->name, it, cb, user_data); + + break; - break; case EET_G_VAR_ARRAY: case EET_G_ARRAY: - me = cb->array(root->type == EET_G_VAR_ARRAY ? EINA_TRUE : EINA_FALSE, - root->name, root->count, user_data); + me = cb->array(root->type == EET_G_VAR_ARRAY ? EINA_TRUE : EINA_FALSE, + root->name, root->count, user_data); - for (i = 0, it = root->values; it != NULL; it = it->next) - cb->insert(me, i++, eet_node_walk(NULL, NULL, it, cb, user_data), user_data); + for (i = 0, it = root->values; it != NULL; it = it->next) + cb->insert(me, i++, eet_node_walk(NULL, + NULL, + it, + cb, + user_data), user_data); + + break; - break; case EET_G_LIST: - me = cb->list(root->name, user_data); + me = cb->list(root->name, user_data); - for (it = root->values; it != NULL; it = it->next) - cb->append(me, eet_node_walk(NULL, NULL, it, cb, user_data), user_data); + for (it = root->values; it != NULL; it = it->next) + cb->append(me, eet_node_walk(NULL, + NULL, + it, + cb, + user_data), user_data); + + break; - break; case EET_G_HASH: - if (!parent) return NULL; + if (!parent) + return NULL; + + return cb->hash(parent, root->name, root->key, + eet_node_walk(NULL, + NULL, + root->values, + cb, + user_data), user_data); - return cb->hash(parent, root->name, root->key, eet_node_walk(NULL, NULL, root->values, cb, user_data), user_data); case EET_T_STRING: case EET_T_INLINED_STRING: case EET_T_CHAR: @@ -615,11 +696,13 @@ eet_node_walk(void *parent, const char *name, Eet_Node *root, Eet_Node_Walk *cb, case EET_T_USHORT: case EET_T_UINT: case EET_T_ULONG_LONG: - me = cb->simple(root->type, &root->data, user_data); - break; + me = cb->simple(root->type, &root->data, user_data); + break; } - if (parent) cb->struct_add(parent, name, me, user_data); + if (parent) + cb->struct_add(parent, name, me, user_data); + return me; } @@ -632,9 +715,10 @@ eet_node_init(void) choice = "chained_mempool"; tmp = getenv("EET_MEMPOOL"); if (tmp && tmp[0]) - choice = tmp; + choice = tmp; - _eet_node_mp = eina_mempool_add(choice, "eet-node-alloc", NULL, sizeof(Eet_Node), 1024); + _eet_node_mp = + eina_mempool_add(choice, "eet-node-alloc", NULL, sizeof(Eet_Node), 1024); return _eet_node_mp ? 1 : 0; } diff --git a/legacy/eet/src/lib/eet_utils.c b/legacy/eet/src/lib/eet_utils.c index 46fae93d44..4d7b9dbd64 100644 --- a/legacy/eet/src/lib/eet_utils.c +++ b/legacy/eet/src/lib/eet_utils.c @@ -15,19 +15,20 @@ int _eet_hash_gen(const char *key, int hash_size) { - int hash_num = 0; - int value, i; - int mask; - unsigned char *ptr; + int hash_num = 0; + int value, i; + int mask; + unsigned char *ptr; /* no string - index 0 */ - if (!key) return 0; + if (!key) + return 0; /* calc hash num */ for (i = 0, ptr = (unsigned char *)key, value = (int)(*ptr); - value; - ptr++, i++, value = (int)(*ptr)) - hash_num ^= (value | (value << 8)) >> (i & 0x7); + value; + ptr++, i++, value = (int)(*ptr)) + hash_num ^= (value | (value << 8)) >> (i & 0x7); /* mask it */ mask = (1 << hash_size) - 1; diff --git a/legacy/eet/src/tests/eet_data_suite.c b/legacy/eet/src/tests/eet_data_suite.c index c2bbd96576..65f08bab60 100644 --- a/legacy/eet/src/tests/eet_data_suite.c +++ b/legacy/eet/src/tests/eet_data_suite.c @@ -5,31 +5,35 @@ #include "eet_suite.h" -static char* +static char * _eet_str_direct_alloc(const char *str) { - return (char*) str; + return (char *)str; } static void _eet_str_direct_free(const char *str) { /* FIXME: Use attribute unused */ - (void) str; + (void)str; } static void _eet_eina_hash_foreach(void *hash, Eina_Hash_Foreach cb, void *fdata) { - if (hash) eina_hash_foreach(hash, cb, fdata); + if (hash) + eina_hash_foreach(hash, cb, fdata); } /* Internal wrapper for eina_hash */ -static Eina_Hash* +static Eina_Hash * _eet_eina_hash_add(Eina_Hash *hash, const char *key, const void *data) { - if (!hash) hash = eina_hash_string_superfast_new(NULL); - if (!hash) return NULL; + if (!hash) + hash = eina_hash_string_superfast_new(NULL); + + if (!hash) + return NULL; eina_hash_add(hash, key, data); return hash; @@ -38,7 +42,8 @@ _eet_eina_hash_add(Eina_Hash *hash, const char *key, const void *data) static void _eet_eina_hash_free(Eina_Hash *hash) { - if (hash) eina_hash_free(hash); + if (hash) + eina_hash_free(hash); } void @@ -49,14 +54,14 @@ eet_test_setup_eddc(Eet_Data_Descriptor_Class *eddc) eddc->func.mem_free = NULL; eddc->func.str_alloc = NULL; eddc->func.str_free = NULL; - eddc->func.list_next = (void*) eina_list_next; - eddc->func.list_append = (void*) eina_list_append; - eddc->func.list_data = (void*) eina_list_data_get; - eddc->func.list_free = (void*) eina_list_free; - eddc->func.hash_foreach = (void*) _eet_eina_hash_foreach; - eddc->func.hash_add = (void*) _eet_eina_hash_add; - eddc->func.hash_free = (void*) _eet_eina_hash_free; - eddc->func.str_direct_alloc = (void*) _eet_str_direct_alloc; - eddc->func.str_direct_free = (void*) _eet_str_direct_free; + eddc->func.list_next = (void *)eina_list_next; + eddc->func.list_append = (void *)eina_list_append; + eddc->func.list_data = (void *)eina_list_data_get; + eddc->func.list_free = (void *)eina_list_free; + eddc->func.hash_foreach = (void *)_eet_eina_hash_foreach; + eddc->func.hash_add = (void *)_eet_eina_hash_add; + eddc->func.hash_free = (void *)_eet_eina_hash_free; + eddc->func.str_direct_alloc = (void *)_eet_str_direct_alloc; + eddc->func.str_direct_free = (void *)_eet_str_direct_free; } diff --git a/legacy/eet/src/tests/eet_suite.c b/legacy/eet/src/tests/eet_suite.c index f69889d3ff..768fddfc1d 100644 --- a/legacy/eet/src/tests/eet_suite.c +++ b/legacy/eet/src/tests/eet_suite.c @@ -27,10 +27,10 @@ START_TEST(eet_test_init) int ret; ret = eet_init(); - fail_if(ret != 1); + fail_if(ret != 1); ret = eet_shutdown(); - fail_if(ret != 0); + fail_if(ret != 0); } END_TEST @@ -82,31 +82,47 @@ struct _Eet_Test_Image }; static const Eet_Test_Image test_noalpha = { - 8, 8, 0, - { - 0x00AA0000, 0x0000AA00, 0x000000AA, 0x00110000, 0x00AA0000, 0x0000AA00, 0x000000AA, 0x00110000, - 0x0000AA00, 0x000000AA, 0x00110000, 0x00AA0000, 0x0000AA00, 0x000000AA, 0x00110000, 0x00AA0000, - 0x000000AA, 0x00110000, 0x00AA0000, 0x0000AA00, 0x000000AA, 0x00110000, 0x00AA0000, 0x0000AA00, - 0x00110000, 0x00AA0000, 0x0000AA00, 0x000000AA, 0x00110000, 0x00AA0000, 0x0000AA00, 0x000000AA, - 0x00AA0000, 0x0000AA00, 0x000000AA, 0x00110000, 0x00AA0000, 0x0000AA00, 0x000000AA, 0x00110000, - 0x0000AA00, 0x000000AA, 0x00110000, 0x00AA0000, 0x0000AA00, 0x000000AA, 0x00110000, 0x00AA0000, - 0x000000AA, 0x00110000, 0x00AA0000, 0x0000AA00, 0x000000AA, 0x00110000, 0x00AA0000, 0x0000AA00, - 0x00110000, 0x00AA0000, 0x0000AA00, 0x000000AA, 0x00110000, 0x00AA0000, 0x0000AA00, 0x000000AA - } + 8, 8, 0, + { + 0x00AA0000, 0x0000AA00, 0x000000AA, 0x00110000, 0x00AA0000, 0x0000AA00, + 0x000000AA, 0x00110000, + 0x0000AA00, 0x000000AA, 0x00110000, 0x00AA0000, 0x0000AA00, 0x000000AA, + 0x00110000, 0x00AA0000, + 0x000000AA, 0x00110000, 0x00AA0000, 0x0000AA00, 0x000000AA, 0x00110000, + 0x00AA0000, 0x0000AA00, + 0x00110000, 0x00AA0000, 0x0000AA00, 0x000000AA, 0x00110000, 0x00AA0000, + 0x0000AA00, 0x000000AA, + 0x00AA0000, 0x0000AA00, 0x000000AA, 0x00110000, 0x00AA0000, 0x0000AA00, + 0x000000AA, 0x00110000, + 0x0000AA00, 0x000000AA, 0x00110000, 0x00AA0000, 0x0000AA00, 0x000000AA, + 0x00110000, 0x00AA0000, + 0x000000AA, 0x00110000, 0x00AA0000, 0x0000AA00, 0x000000AA, 0x00110000, + 0x00AA0000, 0x0000AA00, + 0x00110000, 0x00AA0000, 0x0000AA00, 0x000000AA, 0x00110000, 0x00AA0000, + 0x0000AA00, 0x000000AA + } }; static const Eet_Test_Image test_alpha = { - 8, 8, 1, - { - 0x0FAA0000, 0x0000AA00, 0x000000AA, 0x00110000, 0x00AA0000, 0x0000AA00, 0x000000AA, 0x0F110000, - 0x0000AA00, 0x0F0000AA, 0x00110000, 0x00AA0000, 0x0000AA00, 0x000000AA, 0x0F110000, 0x00AA0000, - 0x000000AA, 0x00110000, 0x0FAA0000, 0x0000AA00, 0x000000AA, 0x0F110000, 0x00AA0000, 0x0000AA00, - 0x00110000, 0x00AA0000, 0x0000AA00, 0x0F0000AA, 0x0F110000, 0x00AA0000, 0x0000AA00, 0x000000AA, - 0x00AA0000, 0x0000AA00, 0x000000AA, 0x0F110000, 0x0FAA0000, 0x0000AA00, 0x000000AA, 0x00110000, - 0x0000AA00, 0x000000AA, 0x0F110000, 0x00AA0000, 0x0000AA00, 0x0F0000AA, 0x00110000, 0x00AA0000, - 0x000000AA, 0x0F110000, 0x00AA0000, 0x0000AA00, 0x000000AA, 0x00110000, 0x0FAA0000, 0x0000AA00, - 0x0F110000, 0x00AA0000, 0x0000AA00, 0x000000AA, 0x00110000, 0x00AA0000, 0x0000AA00, 0x0F0000AA - } + 8, 8, 1, + { + 0x0FAA0000, 0x0000AA00, 0x000000AA, 0x00110000, 0x00AA0000, 0x0000AA00, + 0x000000AA, 0x0F110000, + 0x0000AA00, 0x0F0000AA, 0x00110000, 0x00AA0000, 0x0000AA00, 0x000000AA, + 0x0F110000, 0x00AA0000, + 0x000000AA, 0x00110000, 0x0FAA0000, 0x0000AA00, 0x000000AA, 0x0F110000, + 0x00AA0000, 0x0000AA00, + 0x00110000, 0x00AA0000, 0x0000AA00, 0x0F0000AA, 0x0F110000, 0x00AA0000, + 0x0000AA00, 0x000000AA, + 0x00AA0000, 0x0000AA00, 0x000000AA, 0x0F110000, 0x0FAA0000, 0x0000AA00, + 0x000000AA, 0x00110000, + 0x0000AA00, 0x000000AA, 0x0F110000, 0x00AA0000, 0x0000AA00, 0x0F0000AA, + 0x00110000, 0x00AA0000, + 0x000000AA, 0x0F110000, 0x00AA0000, 0x0000AA00, 0x000000AA, 0x00110000, + 0x0FAA0000, 0x0000AA00, + 0x0F110000, 0x00AA0000, 0x0000AA00, 0x000000AA, 0x00110000, 0x00AA0000, + 0x0000AA00, 0x0F0000AA + } }; static void @@ -118,8 +134,8 @@ _eet_test_basic_set(Eet_Test_Basic_Type *res, int i) res->l = EET_TEST_LONG_LONG; res->str = EET_TEST_STRING; res->istr = EET_TEST_STRING; - res->f1 = - EET_TEST_FLOAT; - res->d = - EET_TEST_DOUBLE; + res->f1 = -EET_TEST_FLOAT; + res->d = -EET_TEST_DOUBLE; res->f2 = EET_TEST_FLOAT4; res->uc = EET_TEST_CHAR; res->us = EET_TEST_SHORT; @@ -130,27 +146,27 @@ _eet_test_basic_set(Eet_Test_Basic_Type *res, int i) if (i == 0) { - Eet_Test_Basic_Type *tmp; + Eet_Test_Basic_Type *tmp; - tmp = malloc(sizeof (Eet_Test_Basic_Type)); - fail_if(!tmp); + tmp = malloc(sizeof (Eet_Test_Basic_Type)); + fail_if(!tmp); - res->with = tmp; - tmp->c = EET_TEST_CHAR; - tmp->s = EET_TEST_SHORT; - tmp->i = EET_TEST_INT + i + 1; - tmp->l = EET_TEST_LONG_LONG; - tmp->str = EET_TEST_STRING; - tmp->istr = EET_TEST_STRING; - tmp->f1 = - EET_TEST_FLOAT; - tmp->d = - EET_TEST_DOUBLE; - tmp->f2 = EET_TEST_FLOAT4; - tmp->uc = EET_TEST_CHAR; - tmp->us = EET_TEST_SHORT; - tmp->ui = EET_TEST_INT; - tmp->ul = EET_TEST_LONG_LONG; - tmp->empty = NULL; - tmp->with = NULL; + res->with = tmp; + tmp->c = EET_TEST_CHAR; + tmp->s = EET_TEST_SHORT; + tmp->i = EET_TEST_INT + i + 1; + tmp->l = EET_TEST_LONG_LONG; + tmp->str = EET_TEST_STRING; + tmp->istr = EET_TEST_STRING; + tmp->f1 = -EET_TEST_FLOAT; + tmp->d = -EET_TEST_DOUBLE; + tmp->f2 = EET_TEST_FLOAT4; + tmp->uc = EET_TEST_CHAR; + tmp->us = EET_TEST_SHORT; + tmp->ui = EET_TEST_INT; + tmp->ul = EET_TEST_LONG_LONG; + tmp->empty = NULL; + tmp->with = NULL; } } @@ -159,74 +175,132 @@ _eet_test_basic_check(Eet_Test_Basic_Type *result, int i) { float tmp; - fail_if(result->c != EET_TEST_CHAR); - fail_if(result->s != EET_TEST_SHORT); - fail_if(result->i != EET_TEST_INT + i); - fail_if(result->l != (long long) EET_TEST_LONG_LONG); - fail_if(strcmp(result->str, EET_TEST_STRING) != 0); - fail_if(strcmp(result->istr, EET_TEST_STRING) != 0); - fail_if(result->uc != EET_TEST_CHAR); - fail_if(result->us != EET_TEST_SHORT); - fail_if(result->ui != EET_TEST_INT); - fail_if(result->ul != EET_TEST_LONG_LONG); + fail_if(result->c != EET_TEST_CHAR); + fail_if(result->s != EET_TEST_SHORT); + fail_if(result->i != EET_TEST_INT + i); + fail_if(result->l != (long long)EET_TEST_LONG_LONG); + fail_if(strcmp(result->str, EET_TEST_STRING) != 0); + fail_if(strcmp(result->istr, EET_TEST_STRING) != 0); + fail_if(result->uc != EET_TEST_CHAR); + fail_if(result->us != EET_TEST_SHORT); + fail_if(result->ui != EET_TEST_INT); + fail_if(result->ul != EET_TEST_LONG_LONG); tmp = (result->f1 + EET_TEST_FLOAT); - if (tmp < 0) tmp = -tmp; - fail_if(tmp > 0.005); + if (tmp < 0) + tmp = -tmp; + + fail_if(tmp > 0.005); tmp = (result->f2 - EET_TEST_FLOAT4); - if (tmp < 0) tmp = -tmp; - fail_if(tmp > 0.005); + if (tmp < 0) + tmp = -tmp; + + fail_if(tmp > 0.005); tmp = (result->d + EET_TEST_DOUBLE); - if (tmp < 0) tmp = -tmp; - fail_if(tmp > 0.00005); + if (tmp < 0) + tmp = -tmp; - fail_if(result->empty != NULL); + fail_if(tmp > 0.00005); + + fail_if(result->empty != NULL); if (i == 0) { - Eet_Test_Basic_Type *tmp; + Eet_Test_Basic_Type *tmp; - tmp = result->with; - fail_if(tmp == NULL); + tmp = result->with; + fail_if(tmp == NULL); - fail_if(tmp->c != EET_TEST_CHAR); - fail_if(tmp->s != EET_TEST_SHORT); - fail_if(tmp->i != EET_TEST_INT + i + 1); - fail_if(tmp->l != (long long) EET_TEST_LONG_LONG); - fail_if(strcmp(tmp->str, EET_TEST_STRING) != 0); - fail_if(strcmp(tmp->istr, EET_TEST_STRING) != 0); - fail_if(tmp->uc != EET_TEST_CHAR); - fail_if(tmp->us != EET_TEST_SHORT); - fail_if(tmp->ui != EET_TEST_INT); - fail_if(tmp->ul != EET_TEST_LONG_LONG); + fail_if(tmp->c != EET_TEST_CHAR); + fail_if(tmp->s != EET_TEST_SHORT); + fail_if(tmp->i != EET_TEST_INT + i + 1); + fail_if(tmp->l != (long long)EET_TEST_LONG_LONG); + fail_if(strcmp(tmp->str, EET_TEST_STRING) != 0); + fail_if(strcmp(tmp->istr, EET_TEST_STRING) != 0); + fail_if(tmp->uc != EET_TEST_CHAR); + fail_if(tmp->us != EET_TEST_SHORT); + fail_if(tmp->ui != EET_TEST_INT); + fail_if(tmp->ul != EET_TEST_LONG_LONG); } else - fail_if(result->with != NULL); + fail_if(result->with != NULL); } static void _eet_build_basic_descriptor(Eet_Data_Descriptor *edd) { - EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Basic_Type, "c", c, EET_T_CHAR); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Basic_Type, "s", s, EET_T_SHORT); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Basic_Type, "i", i, EET_T_INT); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Basic_Type, "l", l, EET_T_LONG_LONG); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Basic_Type, "str", str, EET_T_STRING); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Basic_Type, "istr", istr, EET_T_INLINED_STRING); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Basic_Type, "f1", f1, EET_T_FLOAT); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Basic_Type, "f2", f2, EET_T_FLOAT); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Basic_Type, "d", d, EET_T_DOUBLE); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Basic_Type, "uc", uc, EET_T_UCHAR); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Basic_Type, "us", us, EET_T_USHORT); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Basic_Type, "ui", ui, EET_T_UINT); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Basic_Type, "ul", ul, EET_T_ULONG_LONG); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, + Eet_Test_Basic_Type, + "c", + c, + EET_T_CHAR); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, + Eet_Test_Basic_Type, + "s", + s, + EET_T_SHORT); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, + Eet_Test_Basic_Type, + "i", + i, + EET_T_INT); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, + Eet_Test_Basic_Type, + "l", + l, + EET_T_LONG_LONG); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, + Eet_Test_Basic_Type, + "str", + str, + EET_T_STRING); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, + Eet_Test_Basic_Type, + "istr", + istr, + EET_T_INLINED_STRING); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, + Eet_Test_Basic_Type, + "f1", + f1, + EET_T_FLOAT); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, + Eet_Test_Basic_Type, + "f2", + f2, + EET_T_FLOAT); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, + Eet_Test_Basic_Type, + "d", + d, + EET_T_DOUBLE); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, + Eet_Test_Basic_Type, + "uc", + uc, + EET_T_UCHAR); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, + Eet_Test_Basic_Type, + "us", + us, + EET_T_USHORT); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, + Eet_Test_Basic_Type, + "ui", + ui, + EET_T_UINT); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, + Eet_Test_Basic_Type, + "ul", + ul, + EET_T_ULONG_LONG); EET_DATA_DESCRIPTOR_ADD_SUB(edd, Eet_Test_Basic_Type, "empty", empty, edd); - EET_DATA_DESCRIPTOR_ADD_SUB(edd, Eet_Test_Basic_Type, "with", with, edd); + EET_DATA_DESCRIPTOR_ADD_SUB(edd, Eet_Test_Basic_Type, "with", with, edd); } -START_TEST(eet_test_basic_data_type_encoding_decoding) + START_TEST(eet_test_basic_data_type_encoding_decoding) { Eet_Data_Descriptor *edd; Eet_Test_Basic_Type *result; @@ -320,58 +394,145 @@ _eet_build_ex_descriptor(Eet_Data_Descriptor *edd) _eet_build_basic_descriptor(eddb); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Ex_Type, "c", c, EET_T_CHAR); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Ex_Type, "s", s, EET_T_SHORT); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, + Eet_Test_Ex_Type, + "c", + c, + EET_T_CHAR); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, + Eet_Test_Ex_Type, + "s", + s, + EET_T_SHORT); EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Ex_Type, "i", i, EET_T_INT); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Ex_Type, "l", l, EET_T_LONG_LONG); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Ex_Type, "str", str, EET_T_STRING); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Ex_Type, "istr", istr, EET_T_INLINED_STRING); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Ex_Type, "f1", f1, EET_T_FLOAT); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Ex_Type, "f2", f2, EET_T_FLOAT); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Ex_Type, "f3", f3, EET_T_FLOAT); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Ex_Type, "f4", f4, EET_T_FLOAT); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Ex_Type, "d1", d1, EET_T_DOUBLE); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Ex_Type, "d2", d2, EET_T_DOUBLE); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Ex_Type, "d3", d3, EET_T_DOUBLE); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Ex_Type, "d4", d4, EET_T_DOUBLE); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Ex_Type, "uc", uc, EET_T_UCHAR); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Ex_Type, "us", us, EET_T_USHORT); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Ex_Type, "ui", ui, EET_T_UINT); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Ex_Type, "ul", ul, EET_T_ULONG_LONG); - EET_DATA_DESCRIPTOR_ADD_ARRAY(edd, Eet_Test_Ex_Type, "sarray1", sarray1, eddb); - EET_DATA_DESCRIPTOR_ADD_VAR_ARRAY(edd, Eet_Test_Ex_Type, "varray2", varray2, eddb); - eet_data_descriptor_element_add(edd, "varray1", EET_T_INT, EET_G_VAR_ARRAY, - (char *)(&(etbt.varray1)) - (char *)(&(etbt)), - (char *)(&(etbt.varray1_count)) - (char *)(&(etbt)), /* 0, */NULL, NULL); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, + Eet_Test_Ex_Type, + "l", + l, + EET_T_LONG_LONG); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, + Eet_Test_Ex_Type, + "str", + str, + EET_T_STRING); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, + Eet_Test_Ex_Type, + "istr", + istr, + EET_T_INLINED_STRING); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, + Eet_Test_Ex_Type, + "f1", + f1, + EET_T_FLOAT); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, + Eet_Test_Ex_Type, + "f2", + f2, + EET_T_FLOAT); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, + Eet_Test_Ex_Type, + "f3", + f3, + EET_T_FLOAT); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, + Eet_Test_Ex_Type, + "f4", + f4, + EET_T_FLOAT); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, + Eet_Test_Ex_Type, + "d1", + d1, + EET_T_DOUBLE); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, + Eet_Test_Ex_Type, + "d2", + d2, + EET_T_DOUBLE); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, + Eet_Test_Ex_Type, + "d3", + d3, + EET_T_DOUBLE); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, + Eet_Test_Ex_Type, + "d4", + d4, + EET_T_DOUBLE); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, + Eet_Test_Ex_Type, + "uc", + uc, + EET_T_UCHAR); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, + Eet_Test_Ex_Type, + "us", + us, + EET_T_USHORT); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, + Eet_Test_Ex_Type, + "ui", + ui, + EET_T_UINT); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, + Eet_Test_Ex_Type, + "ul", + ul, + EET_T_ULONG_LONG); + EET_DATA_DESCRIPTOR_ADD_ARRAY(edd, + Eet_Test_Ex_Type, + "sarray1", + sarray1, + eddb); + EET_DATA_DESCRIPTOR_ADD_VAR_ARRAY(edd, + Eet_Test_Ex_Type, + "varray2", + varray2, + eddb); + eet_data_descriptor_element_add(edd, + "varray1", + EET_T_INT, + EET_G_VAR_ARRAY, + (char *)(&(etbt.varray1)) - (char *)(&(etbt)), + (char *)(&(etbt.varray1_count)) - + (char *)(&(etbt)), + /* 0, */ NULL, + NULL); eet_data_descriptor_element_add(edd, "sarray2", EET_T_INT, EET_G_ARRAY, - (char *)(&(etbt.sarray2)) - (char *)(&(etbt)), - /* 0, */sizeof(etbt.sarray2)/sizeof(etbt.sarray2[0]), NULL, NULL); + (char *)(&(etbt.sarray2)) - (char *)(&(etbt)), + /* 0, */ sizeof(etbt.sarray2) / + sizeof(etbt.sarray2[0]), NULL, NULL); eet_data_descriptor_element_add(edd, "charray", EET_T_STRING, EET_G_ARRAY, - (char *)(&(etbt.charray)) - (char *)(&(etbt)), - /* 0, */sizeof(etbt.charray)/sizeof(etbt.charray[0]), NULL, NULL); + (char *)(&(etbt.charray)) - (char *)(&(etbt)), + /* 0, */ sizeof(etbt.charray) / + sizeof(etbt.charray[0]), NULL, NULL); EET_DATA_DESCRIPTOR_ADD_LIST(edd, Eet_Test_Ex_Type, "list", list, edd); EET_DATA_DESCRIPTOR_ADD_HASH(edd, Eet_Test_Ex_Type, "hash", hash, edd); - eet_data_descriptor_element_add(edd, "ilist", EET_T_INT, EET_G_LIST, - (char *)(&(etbt.ilist)) - (char *)(&(etbt)), - 0, /* 0, */NULL, NULL); - eet_data_descriptor_element_add(edd, "ihash", EET_T_INT, EET_G_HASH, - (char *)(&(etbt.ihash)) - (char *)(&(etbt)), - 0, /* 0, */NULL, NULL); + eet_data_descriptor_element_add(edd, "ilist", EET_T_INT, EET_G_LIST, + (char *)(&(etbt.ilist)) - (char *)(&(etbt)), + 0, /* 0, */ NULL, NULL); + eet_data_descriptor_element_add(edd, "ihash", EET_T_INT, EET_G_HASH, + (char *)(&(etbt.ihash)) - (char *)(&(etbt)), + 0, /* 0, */ NULL, NULL); eet_data_descriptor_element_add(edd, "slist", EET_T_STRING, EET_G_LIST, - (char *)(&(etbt.slist)) - (char *)(&(etbt)), - 0, /* 0, */NULL, NULL); + (char *)(&(etbt.slist)) - (char *)(&(etbt)), + 0, /* 0, */ NULL, NULL); eet_data_descriptor_element_add(edd, "shash", EET_T_STRING, EET_G_HASH, - (char *)(&(etbt.shash)) - (char *)(&(etbt)), - 0, /* 0, */NULL, NULL); + (char *)(&(etbt.shash)) - (char *)(&(etbt)), + 0, /* 0, */ NULL, NULL); } -static Eet_Test_Ex_Type* +static Eet_Test_Ex_Type * _eet_test_ex_set(Eet_Test_Ex_Type *res, int offset) { unsigned int i; - if (!res) res = malloc( sizeof(Eet_Test_Ex_Type)); - if (!res) return NULL; + if (!res) + res = malloc( sizeof(Eet_Test_Ex_Type)); + + if (!res) + return NULL; res->c = EET_TEST_CHAR + offset; res->s = EET_TEST_SHORT + offset; @@ -393,22 +554,22 @@ _eet_test_ex_set(Eet_Test_Ex_Type *res, int offset) res->ihash = NULL; res->slist = NULL; res->shash = NULL; - for (i = 0; i < sizeof(res->charray)/sizeof(res->charray[0]); ++i) - res->charray[i] = NULL; + for (i = 0; i < sizeof(res->charray) / sizeof(res->charray[0]); ++i) + res->charray[i] = NULL; res->varray2 = malloc(sizeof (Eet_Test_Basic_Type) * 10); res->varray1 = malloc(sizeof (int) * 5); fail_if(!res->varray1 || !res->varray2); for (i = 0; i < 10; ++i) { - _eet_test_basic_set(res->sarray1 + i, i); - _eet_test_basic_set(res->varray2 + i, i); + _eet_test_basic_set(res->sarray1 + i, i); + _eet_test_basic_set(res->varray2 + i, i); } res->varray2_count = 10; for (i = 0; i < 5; ++i) { - res->sarray2[i] = i * 42 + 1; - res->varray1[i] = i * 42 + 1; + res->sarray2[i] = i * 42 + 1; + res->varray1[i] = i * 42 + 1; } res->varray1_count = 5; @@ -426,48 +587,85 @@ _eet_test_ex_check(Eet_Test_Ex_Type *stuff, int offset) double tmp; unsigned int i; - if (!stuff) return 1; + if (!stuff) + return 1; - if (stuff->c != EET_TEST_CHAR + offset) return 1; - if (stuff->s != EET_TEST_SHORT + offset) return 1; - if (stuff->i != EET_TEST_INT + offset) return 1; - if (stuff->l != EET_TEST_LONG_LONG + offset) return 1; - if (strcmp(stuff->str, EET_TEST_STRING) != 0) return 1; - if (strcmp(stuff->istr, EET_TEST_STRING) != 0) return 1; + if (stuff->c != EET_TEST_CHAR + offset) + return 1; + + if (stuff->s != EET_TEST_SHORT + offset) + return 1; + + if (stuff->i != EET_TEST_INT + offset) + return 1; + + if (stuff->l != EET_TEST_LONG_LONG + offset) + return 1; + + if (strcmp(stuff->str, EET_TEST_STRING) != 0) + return 1; + + if (strcmp(stuff->istr, EET_TEST_STRING) != 0) + return 1; tmp = stuff->f1 - (EET_TEST_FLOAT + offset); - if (tmp < 0) tmp = -tmp; - if (tmp > 0.005) return 1; + if (tmp < 0) + tmp = -tmp; + + if (tmp > 0.005) + return 1; tmp = stuff->d1 - (EET_TEST_DOUBLE + offset); - if (tmp < 0) tmp = -tmp; - if (tmp > 0.00005) return 1; + if (tmp < 0) + tmp = -tmp; - if (stuff->f2 != - (EET_TEST_FLOAT2 + offset)) return 1; - if (stuff->d2 != - (EET_TEST_DOUBLE2 + offset)) return 1; + if (tmp > 0.00005) + return 1; - if (stuff->f3 != EET_TEST_FLOAT3 + offset) return 1; - if (stuff->d3 != EET_TEST_DOUBLE3 + offset) return 1; + if (stuff->f2 != -(EET_TEST_FLOAT2 + offset)) + return 1; - if (stuff->f4 != EET_TEST_FLOAT2 + offset) return 1; - if (stuff->d4 != EET_TEST_DOUBLE2 + offset) return 1; + if (stuff->d2 != -(EET_TEST_DOUBLE2 + offset)) + return 1; - if (stuff->uc != EET_TEST_CHAR + offset) return 1; - if (stuff->us != EET_TEST_SHORT + offset) return 1; - if (stuff->ui != (unsigned int) EET_TEST_INT + offset) return 1; - if (stuff->ul != EET_TEST_LONG_LONG + offset) return 1; + if (stuff->f3 != EET_TEST_FLOAT3 + offset) + return 1; - if (stuff->varray1_count != 5) return 1; - if (stuff->varray2_count != 10) return 1; + if (stuff->d3 != EET_TEST_DOUBLE3 + offset) + return 1; + + if (stuff->f4 != EET_TEST_FLOAT2 + offset) + return 1; + + if (stuff->d4 != EET_TEST_DOUBLE2 + offset) + return 1; + + if (stuff->uc != EET_TEST_CHAR + offset) + return 1; + + if (stuff->us != EET_TEST_SHORT + offset) + return 1; + + if (stuff->ui != (unsigned int)EET_TEST_INT + offset) + return 1; + + if (stuff->ul != EET_TEST_LONG_LONG + offset) + return 1; + + if (stuff->varray1_count != 5) + return 1; + + if (stuff->varray2_count != 10) + return 1; for (i = 0; i < 5; ++i) - if (stuff->sarray2[i] != i * 42 + 1 && stuff->varray1[i] != i * 42 + 1) - return 1; + if (stuff->sarray2[i] != i * 42 + 1 && stuff->varray1[i] != i * 42 + 1) + return 1; for (i = 0; i < 10; ++i) { - _eet_test_basic_check(stuff->sarray1 + i, i); - _eet_test_basic_check(stuff->varray2 + i, i); + _eet_test_basic_check(stuff->sarray1 + i, i); + _eet_test_basic_check(stuff->varray2 + i, i); } return 0; @@ -479,21 +677,30 @@ func(__UNUSED__ const Eina_Hash *hash, const void *key, void *data, void *fdata) int *res = fdata; if (strcmp(key, EET_TEST_KEY1) != 0 - && strcmp(key, EET_TEST_KEY2) != 0) *res = 1; - if (_eet_test_ex_check(data, 2)) *res = 1; + && strcmp(key, EET_TEST_KEY2) != 0) + *res = 1; + + if (_eet_test_ex_check(data, 2)) + *res = 1; return EINA_TRUE; } static Eina_Bool -func7(__UNUSED__ const Eina_Hash *hash, __UNUSED__ const void *key, void *data, void *fdata) +func7(__UNUSED__ const Eina_Hash *hash, + __UNUSED__ const void *key, + void *data, + void *fdata) { int *res = fdata; int *val; val = data; - if (!val) *res = 1; - if (*val != 7) *res = 1; + if (!val) + *res = 1; + + if (*val != 7) + *res = 1; return EINA_TRUE; } @@ -513,7 +720,7 @@ START_TEST(eet_test_data_type_encoding_decoding) _eet_test_ex_set(&etbt, 0); etbt.list = eina_list_prepend(etbt.list, _eet_test_ex_set(NULL, 1)); etbt.hash = eina_hash_string_superfast_new(NULL); - eina_hash_add(etbt.hash, EET_TEST_KEY1, _eet_test_ex_set(NULL, 2)); + eina_hash_add(etbt.hash, EET_TEST_KEY1, _eet_test_ex_set(NULL, 2)); etbt.ilist = eina_list_prepend(etbt.ilist, &i42); etbt.ihash = eina_hash_string_superfast_new(NULL); eina_hash_add(etbt.ihash, EET_TEST_KEY1, &i7); @@ -542,7 +749,7 @@ START_TEST(eet_test_data_type_encoding_decoding) fail_if(_eet_test_ex_check(result, 0) != 0); fail_if(_eet_test_ex_check(eina_list_data_get(result->list), 1) != 0); fail_if(eina_list_data_get(result->ilist) == NULL); - fail_if(*((int*)eina_list_data_get(result->ilist)) != 42); + fail_if(*((int *)eina_list_data_get(result->ilist)) != 42); fail_if(eina_list_data_get(result->slist) == NULL); fail_if(strcmp(eina_list_data_get(result->slist), "test") != 0); fail_if(eina_hash_find(result->shash, EET_TEST_KEY1) == NULL); @@ -551,9 +758,13 @@ START_TEST(eet_test_data_type_encoding_decoding) fail_if(strcmp(result->charray[5], "plouf") != 0); test = 0; - if (result->hash) eina_hash_foreach(result->hash, func, &test); + if (result->hash) + eina_hash_foreach(result->hash, func, &test); + fail_if(test != 0); - if (result->ihash) eina_hash_foreach(result->ihash, func7, &test); + if (result->ihash) + eina_hash_foreach(result->ihash, func7, &test); + fail_if(test != 0); eet_shutdown(); @@ -566,7 +777,8 @@ append_string(void *data, const char *str) char **string = data; int length; - if (!data) return ; + if (!data) + return; length = *string ? strlen(*string) : 0; *string = realloc(*string, strlen(str) + length + 1); @@ -625,7 +837,8 @@ START_TEST(eet_test_data_type_dump_undump) eet_data_text_dump(transfert1, size1, append_string, &string1); fail_if(!string1); - transfert2 = eet_data_text_undump(string1, string1 ? strlen(string1) : 0, &size2); + transfert2 = eet_data_text_undump(string1, string1 ? strlen( + string1) : 0, &size2); fail_if(!transfert2 && size2 <= 0); string2 = NULL; @@ -640,7 +853,7 @@ START_TEST(eet_test_data_type_dump_undump) fail_if(_eet_test_ex_check(result, 0) != 0); fail_if(_eet_test_ex_check(eina_list_data_get(result->list), 1) != 0); fail_if(eina_list_data_get(result->ilist) == NULL); - fail_if(*((int*)eina_list_data_get(result->ilist)) != 42); + fail_if(*((int *)eina_list_data_get(result->ilist)) != 42); fail_if(eina_list_data_get(result->slist) == NULL); fail_if(strcmp(eina_list_data_get(result->slist), "test") != 0); fail_if(eina_hash_find(result->shash, EET_TEST_KEY1) == NULL); @@ -648,9 +861,13 @@ START_TEST(eet_test_data_type_dump_undump) fail_if(strcmp(result->charray[0], "test") != 0); test = 0; - if (result->hash) eina_hash_foreach(result->hash, func, &test); + if (result->hash) + eina_hash_foreach(result->hash, func, &test); + fail_if(test != 0); - if (result->ihash) eina_hash_foreach(result->ihash, func7, &test); + if (result->ihash) + eina_hash_foreach(result->ihash, func7, &test); + fail_if(test != 0); eet_shutdown(); @@ -691,13 +908,13 @@ START_TEST(eet_file_simple_write) test = eet_read(ef, "keys/tests", &size); fail_if(!test); - fail_if(size != (int) strlen(buffer) + 1); + fail_if(size != (int)strlen(buffer) + 1); fail_if(memcmp(test, buffer, strlen(buffer) + 1) != 0); test = eet_read(ef, "keys/alias2", &size); fail_if(!test); - fail_if(size != (int) strlen(buffer) + 1); + fail_if(size != (int)strlen(buffer) + 1); fail_if(eet_read_direct(ef, "key/alias2", &size)); @@ -712,7 +929,7 @@ START_TEST(eet_file_simple_write) test = eet_read(ef, "keys/tests", &size); fail_if(!test); - fail_if(size != (int) strlen(buffer) + 1); + fail_if(size != (int)strlen(buffer) + 1); fail_if(memcmp(test, buffer, strlen(buffer) + 1) != 0); @@ -821,7 +1038,7 @@ START_TEST(eet_file_data_test) fail_if(_eet_test_ex_check(result, 0) != 0); fail_if(_eet_test_ex_check(eina_list_data_get(result->list), 1) != 0); fail_if(eina_list_data_get(result->ilist) == NULL); - fail_if(*((int*)eina_list_data_get(result->ilist)) != 42); + fail_if(*((int *)eina_list_data_get(result->ilist)) != 42); fail_if(eina_list_data_get(result->slist) == NULL); fail_if(strcmp(eina_list_data_get(result->slist), "test") != 0); fail_if(eina_hash_find(result->shash, EET_TEST_KEY1) == NULL); @@ -829,17 +1046,25 @@ START_TEST(eet_file_data_test) fail_if(strcmp(result->charray[0], "test") != 0); test = 0; - if (result->hash) eina_hash_foreach(result->hash, func, &test); - fail_if(test != 0); - if (result->ihash) eina_hash_foreach(result->ihash, func7, &test); + if (result->hash) + eina_hash_foreach(result->hash, func, &test); + fail_if(test != 0); + if (result->ihash) + eina_hash_foreach(result->ihash, func7, &test); + + fail_if(test != 0); list = eet_list(ef, "keys/*", &size); - fail_if(eet_num_entries(ef) != 2); - fail_if(size != 2); - fail_if(!(strcmp(list[0], EET_TEST_FILE_KEY1) == 0 && strcmp(list[1], EET_TEST_FILE_KEY2) == 0) - && !(strcmp(list[0], EET_TEST_FILE_KEY2) == 0 && strcmp(list[1], EET_TEST_FILE_KEY1) == 0)); - free(list); + fail_if(eet_num_entries(ef) != 2); + fail_if(size != 2); + fail_if(!(strcmp(list[0], + EET_TEST_FILE_KEY1) == 0 && + strcmp(list[1], EET_TEST_FILE_KEY2) == 0) + && !(strcmp(list[0], + EET_TEST_FILE_KEY2) == 0 && + strcmp(list[1], EET_TEST_FILE_KEY1) == 0)); + free(list); fail_if(eet_delete(ef, NULL) != 0); fail_if(eet_delete(NULL, EET_TEST_FILE_KEY1) != 0); @@ -896,7 +1121,8 @@ START_TEST(eet_file_data_dump_test) memset(&etbt.charray, 0, sizeof(etbt.charray)); etbt.charray[0] = "test"; - eet_eina_file_data_descriptor_class_set(&eddc, "Eet_Test_Ex_Type", sizeof(Eet_Test_Ex_Type)); + eet_eina_file_data_descriptor_class_set(&eddc, "Eet_Test_Ex_Type", + sizeof(Eet_Test_Ex_Type)); edd = eet_data_descriptor_file_new(&eddc); fail_if(!edd); @@ -937,7 +1163,7 @@ START_TEST(eet_file_data_dump_test) fail_if(_eet_test_ex_check(result, 0) != 0); fail_if(_eet_test_ex_check(eina_list_data_get(result->list), 1) != 0); fail_if(eina_list_data_get(result->ilist) == NULL); - fail_if(*((int*)eina_list_data_get(result->ilist)) != 42); + fail_if(*((int *)eina_list_data_get(result->ilist)) != 42); fail_if(eina_list_data_get(result->slist) == NULL); fail_if(strcmp(eina_list_data_get(result->slist), "test") != 0); fail_if(eina_hash_find(result->shash, EET_TEST_KEY1) == NULL); @@ -945,9 +1171,13 @@ START_TEST(eet_file_data_dump_test) fail_if(strcmp(result->charray[0], "test") != 0); test = 0; - if (result->hash) eina_hash_foreach(result->hash, func, &test); + if (result->hash) + eina_hash_foreach(result->hash, func, &test); + fail_if(test != 0); - if (result->ihash) eina_hash_foreach(result->ihash, func7, &test); + if (result->ihash) + eina_hash_foreach(result->ihash, func7, &test); + fail_if(test != 0); fail_if(unlink(file) != 0); @@ -975,57 +1205,106 @@ START_TEST(eet_image) ef = eet_open(file, EET_FILE_MODE_READ_WRITE); fail_if(!ef); - result = eet_data_image_write(ef, EET_TEST_FILE_IMAGE "0", test_noalpha.color, - test_noalpha.w, test_noalpha.h, test_noalpha.alpha, - 0, 100, 0); + result = eet_data_image_write(ef, + EET_TEST_FILE_IMAGE "0", + test_noalpha.color, + test_noalpha.w, + test_noalpha.h, + test_noalpha.alpha, + 0, + 100, + 0); fail_if(result == 0); - result = eet_data_image_write(ef, EET_TEST_FILE_IMAGE "1", test_noalpha.color, - test_noalpha.w, test_noalpha.h, test_noalpha.alpha, - 5, 100, 0); + result = eet_data_image_write(ef, + EET_TEST_FILE_IMAGE "1", + test_noalpha.color, + test_noalpha.w, + test_noalpha.h, + test_noalpha.alpha, + 5, + 100, + 0); fail_if(result == 0); - result = eet_data_image_write(ef, EET_TEST_FILE_IMAGE "2", test_noalpha.color, - test_noalpha.w, test_noalpha.h, test_noalpha.alpha, - 9, 100, 0); + result = eet_data_image_write(ef, + EET_TEST_FILE_IMAGE "2", + test_noalpha.color, + test_noalpha.w, + test_noalpha.h, + test_noalpha.alpha, + 9, + 100, + 0); fail_if(result == 0); - result = eet_data_image_write(ef, EET_TEST_FILE_IMAGE "3", test_noalpha.color, - test_noalpha.w, test_noalpha.h, test_noalpha.alpha, - 0, 100, 1); + result = eet_data_image_write(ef, + EET_TEST_FILE_IMAGE "3", + test_noalpha.color, + test_noalpha.w, + test_noalpha.h, + test_noalpha.alpha, + 0, + 100, + 1); fail_if(result == 0); - result = eet_data_image_write(ef, EET_TEST_FILE_IMAGE "4", test_noalpha.color, - test_noalpha.w, test_noalpha.h, test_noalpha.alpha, - 0, 60, 1); + result = eet_data_image_write(ef, + EET_TEST_FILE_IMAGE "4", + test_noalpha.color, + test_noalpha.w, + test_noalpha.h, + test_noalpha.alpha, + 0, + 60, + 1); fail_if(result == 0); - result = eet_data_image_write(ef, EET_TEST_FILE_IMAGE "5", test_noalpha.color, - test_noalpha.w, test_noalpha.h, test_noalpha.alpha, - 0, 10, 1); + result = eet_data_image_write(ef, + EET_TEST_FILE_IMAGE "5", + test_noalpha.color, + test_noalpha.w, + test_noalpha.h, + test_noalpha.alpha, + 0, + 10, + 1); fail_if(result == 0); - result = eet_data_image_write(ef, EET_TEST_FILE_IMAGE "6", test_noalpha.color, - test_noalpha.w, test_noalpha.h, test_noalpha.alpha, - 0, 0, 1); + result = eet_data_image_write(ef, + EET_TEST_FILE_IMAGE "6", + test_noalpha.color, + test_noalpha.w, + test_noalpha.h, + test_noalpha.alpha, + 0, + 0, + 1); fail_if(result == 0); result = eet_data_image_write(ef, EET_TEST_FILE_IMAGE "7", test_alpha.color, - test_alpha.w, test_alpha.h, test_alpha.alpha, - 9, 100, 0); + test_alpha.w, test_alpha.h, test_alpha.alpha, + 9, 100, 0); fail_if(result == 0); result = eet_data_image_write(ef, EET_TEST_FILE_IMAGE "8", test_alpha.color, - test_alpha.w, test_alpha.h, test_alpha.alpha, - 0, 80, 1); + test_alpha.w, test_alpha.h, test_alpha.alpha, + 0, 80, 1); fail_if(result == 0); result = eet_data_image_write(ef, EET_TEST_FILE_IMAGE "9", test_alpha.color, - test_alpha.w, test_alpha.h, test_alpha.alpha, - 0, 100, 1); + test_alpha.w, test_alpha.h, test_alpha.alpha, + 0, 100, 1); fail_if(result == 0); - data = eet_data_image_read(ef, EET_TEST_FILE_IMAGE "2", &w, &h, &alpha, &compress, &quality, &lossy); + data = eet_data_image_read(ef, + EET_TEST_FILE_IMAGE "2", + &w, + &h, + &alpha, + &compress, + &quality, + &lossy); fail_if(data == NULL); fail_if(w != test_noalpha.w); fail_if(h != test_noalpha.h); @@ -1035,7 +1314,14 @@ START_TEST(eet_image) fail_if(data[0] != test_noalpha.color[0]); free(data); - result = eet_data_image_header_read(ef, EET_TEST_FILE_IMAGE "2", &w, &h, &alpha, &compress, &quality, &lossy); + result = eet_data_image_header_read(ef, + EET_TEST_FILE_IMAGE "2", + &w, + &h, + &alpha, + &compress, + &quality, + &lossy); fail_if(result == 0); fail_if(w != test_noalpha.w); fail_if(h != test_noalpha.h); @@ -1049,7 +1335,14 @@ START_TEST(eet_image) ef = eet_open(file, EET_FILE_MODE_READ); fail_if(!ef); - result = eet_data_image_header_read(ef, EET_TEST_FILE_IMAGE "0", &w, &h, &alpha, &compress, &quality, &lossy); + result = eet_data_image_header_read(ef, + EET_TEST_FILE_IMAGE "0", + &w, + &h, + &alpha, + &compress, + &quality, + &lossy); fail_if(result == 0); fail_if(w != test_noalpha.w); fail_if(h != test_noalpha.h); @@ -1059,7 +1352,18 @@ START_TEST(eet_image) data = malloc(w * h * 4); fail_if(data == NULL); - result = eet_data_image_read_to_surface(ef, EET_TEST_FILE_IMAGE "0", 4, 4, data, 2, 2, w * 4, &alpha, &compress, &quality, &lossy); + result = eet_data_image_read_to_surface(ef, + EET_TEST_FILE_IMAGE "0", + 4, + 4, + data, + 2, + 2, + w * 4, + &alpha, + &compress, + &quality, + &lossy); fail_if(result != 1); fail_if(alpha != test_noalpha.alpha); fail_if(compress != 0); @@ -1070,7 +1374,18 @@ START_TEST(eet_image) data = malloc(w * h * 4); fail_if(data == NULL); - result = eet_data_image_read_to_surface(ef, EET_TEST_FILE_IMAGE "0", 0, 0, data, w, h, w * 4, &alpha, &compress, &quality, &lossy); + result = eet_data_image_read_to_surface(ef, + EET_TEST_FILE_IMAGE "0", + 0, + 0, + data, + w, + h, + w * 4, + &alpha, + &compress, + &quality, + &lossy); fail_if(result != 1); fail_if(alpha != test_noalpha.alpha); fail_if(compress != 0); @@ -1079,7 +1394,14 @@ START_TEST(eet_image) fail_if(data[0] != test_noalpha.color[0]); free(data); - data = eet_data_image_read(ef, EET_TEST_FILE_IMAGE "1", &w, &h, &alpha, &compress, &quality, &lossy); + data = eet_data_image_read(ef, + EET_TEST_FILE_IMAGE "1", + &w, + &h, + &alpha, + &compress, + &quality, + &lossy); fail_if(data == NULL); fail_if(w != test_noalpha.w); fail_if(h != test_noalpha.h); @@ -1090,7 +1412,14 @@ START_TEST(eet_image) fail_if(data[0] != test_noalpha.color[0]); free(data); - data = eet_data_image_read(ef, EET_TEST_FILE_IMAGE "2", &w, &h, &alpha, &compress, &quality, &lossy); + data = eet_data_image_read(ef, + EET_TEST_FILE_IMAGE "2", + &w, + &h, + &alpha, + &compress, + &quality, + &lossy); fail_if(data == NULL); fail_if(w != test_noalpha.w); fail_if(h != test_noalpha.h); @@ -1100,7 +1429,14 @@ START_TEST(eet_image) fail_if(data[0] != test_noalpha.color[0]); free(data); - data = eet_data_image_read(ef, EET_TEST_FILE_IMAGE "3", &w, &h, &alpha, &compress, &quality, &lossy); + data = eet_data_image_read(ef, + EET_TEST_FILE_IMAGE "3", + &w, + &h, + &alpha, + &compress, + &quality, + &lossy); fail_if(data == NULL); fail_if(w != test_noalpha.w); fail_if(h != test_noalpha.h); @@ -1108,7 +1444,14 @@ START_TEST(eet_image) fail_if(lossy != 1); free(data); - data = eet_data_image_read(ef, EET_TEST_FILE_IMAGE "5", &w, &h, &alpha, &compress, &quality, &lossy); + data = eet_data_image_read(ef, + EET_TEST_FILE_IMAGE "5", + &w, + &h, + &alpha, + &compress, + &quality, + &lossy); fail_if(data == NULL); fail_if(w != test_noalpha.w); fail_if(h != test_noalpha.h); @@ -1116,7 +1459,14 @@ START_TEST(eet_image) fail_if(lossy != 1); free(data); - data = eet_data_image_read(ef, EET_TEST_FILE_IMAGE "6", &w, &h, &alpha, &compress, &quality, &lossy); + data = eet_data_image_read(ef, + EET_TEST_FILE_IMAGE "6", + &w, + &h, + &alpha, + &compress, + &quality, + &lossy); fail_if(data == NULL); fail_if(w != test_noalpha.w); fail_if(h != test_noalpha.h); @@ -1124,7 +1474,14 @@ START_TEST(eet_image) fail_if(lossy != 1); free(data); - result = eet_data_image_header_read(ef, EET_TEST_FILE_IMAGE "7", &w, &h, &alpha, &compress, &quality, &lossy); + result = eet_data_image_header_read(ef, + EET_TEST_FILE_IMAGE "7", + &w, + &h, + &alpha, + &compress, + &quality, + &lossy); fail_if(result == 0); fail_if(w != test_alpha.w); fail_if(h != test_alpha.h); @@ -1132,7 +1489,14 @@ START_TEST(eet_image) fail_if(compress != 9); fail_if(lossy != 0); - data = eet_data_image_read(ef, EET_TEST_FILE_IMAGE "7", &w, &h, &alpha, &compress, &quality, &lossy); + data = eet_data_image_read(ef, + EET_TEST_FILE_IMAGE "7", + &w, + &h, + &alpha, + &compress, + &quality, + &lossy); fail_if(data == NULL); fail_if(w != test_alpha.w); fail_if(h != test_alpha.h); @@ -1142,14 +1506,28 @@ START_TEST(eet_image) fail_if(data[0] != test_alpha.color[0]); free(data); - result = eet_data_image_header_read(ef, EET_TEST_FILE_IMAGE "9", &w, &h, &alpha, &compress, &quality, &lossy); + result = eet_data_image_header_read(ef, + EET_TEST_FILE_IMAGE "9", + &w, + &h, + &alpha, + &compress, + &quality, + &lossy); fail_if(result == 0); fail_if(w != test_alpha.w); fail_if(h != test_alpha.h); fail_if(alpha != test_alpha.alpha); fail_if(lossy != 1); - data = eet_data_image_read(ef, EET_TEST_FILE_IMAGE "9", &w, &h, &alpha, &compress, &quality, &lossy); + data = eet_data_image_read(ef, + EET_TEST_FILE_IMAGE "9", + &w, + &h, + &alpha, + &compress, + &quality, + &lossy); fail_if(data == NULL); fail_if(w != test_alpha.w); fail_if(h != test_alpha.h); @@ -1204,7 +1582,14 @@ START_TEST(eet_small_image) ef = eet_open(file, EET_FILE_MODE_READ); fail_if(!ef); - data = (unsigned int*) eet_data_image_read(ef, "/images/test", &w, &h, &alpha, &compression, &quality, &lossy); + data = (unsigned int *)eet_data_image_read(ef, + "/images/test", + &w, + &h, + &alpha, + &compression, + &quality, + &lossy); fail_if(data == NULL); eet_close(ef); @@ -1260,7 +1645,7 @@ START_TEST(eet_identity_simple) test = eet_read(ef, "keys/tests", &size); fail_if(!test); - fail_if(size != (int) strlen(buffer) + 1); + fail_if(size != (int)strlen(buffer) + 1); fail_if(memcmp(test, buffer, strlen(buffer) + 1) != 0); @@ -1304,12 +1689,13 @@ START_TEST(eet_identity_open_simple) eet_init(); - fail_if(chdir("src/tests")); + fail_if(chdir("src/tests")); k = eet_identity_open("cert.pem", "key.pem", NULL); - fail_if(!k); + fail_if(!k); - if (k) eet_identity_close(k); + if (k) + eet_identity_close(k); eet_shutdown(); } @@ -1321,33 +1707,42 @@ START_TEST(eet_identity_open_pkcs8) eet_init(); - fail_if(chdir("src/tests")); + fail_if(chdir("src/tests")); k = eet_identity_open("cert.pem", "key_enc_none.pem", NULL); - fail_if(!k); + fail_if(!k); - if (k) eet_identity_close(k); + if (k) + eet_identity_close(k); eet_shutdown(); } END_TEST -static int pass_get(char *pass, int size, __UNUSED__ int rwflags, __UNUSED__ void *u) +static int pass_get(char *pass, + int size, + __UNUSED__ int rwflags, + __UNUSED__ void *u) { memset(pass, 0, size); - if ((int) strlen("password") > size) - return 0; + if ((int)strlen("password") > size) + return 0; + snprintf(pass, size, "%s", "password"); return strlen(pass); } -static int badpass_get(char *pass, int size, __UNUSED__ int rwflags, __UNUSED__ void *u) +static int badpass_get(char *pass, + int size, + __UNUSED__ int rwflags, + __UNUSED__ void *u) { memset(pass, 0, size); - if ((int) strlen("bad password") > size) - return 0; + if ((int)strlen("bad password") > size) + return 0; + snprintf(pass, size, "%s", "bad password"); return strlen(pass); } @@ -1359,22 +1754,25 @@ START_TEST(eet_identity_open_pkcs8_enc) eet_init(); - fail_if(chdir("src/tests")); + fail_if(chdir("src/tests")); k = eet_identity_open("cert.pem", "key_enc.pem", NULL); - fail_if(k); + fail_if(k); - if (k) eet_identity_close(k); + if (k) + eet_identity_close(k); k = eet_identity_open("cert.pem", "key_enc.pem", &badpass_get); fail_if(k); - if (k) eet_identity_close(k); + if (k) + eet_identity_close(k); k = eet_identity_open("cert.pem", "key_enc.pem", &pass_get); fail_if(!k); - if (k) eet_identity_close(k); + if (k) + eet_identity_close(k); eet_shutdown(); } @@ -1399,7 +1797,8 @@ START_TEST(eet_cipher_decipher_simple) ef = eet_open(file, EET_FILE_MODE_WRITE); fail_if(!ef); - fail_if(!eet_write_cipher(ef, "keys/tests", buffer, strlen(buffer) + 1, 0, key)); + fail_if(!eet_write_cipher(ef, "keys/tests", buffer, strlen(buffer) + 1, 0, + key)); eet_close(ef); @@ -1409,7 +1808,7 @@ START_TEST(eet_cipher_decipher_simple) test = eet_read_cipher(ef, "keys/tests", &size, key); fail_if(!test); - fail_if(size != (int) strlen(buffer) + 1); + fail_if(size != (int)strlen(buffer) + 1); fail_if(memcmp(test, buffer, strlen(buffer) + 1) != 0); @@ -1417,14 +1816,14 @@ START_TEST(eet_cipher_decipher_simple) /* Decrypt an eet file. */ ef = eet_open(file, EET_FILE_MODE_READ); - fail_if(!ef); + fail_if(!ef); test = eet_read_cipher(ef, "keys/tests", &size, key_bad); - if (size == (int) strlen(buffer) + 1) - fail_if(memcmp(test, buffer, strlen(buffer) + 1) == 0); + if (size == (int)strlen(buffer) + 1) + fail_if(memcmp(test, buffer, strlen(buffer) + 1) == 0); - eet_close(ef); + eet_close(ef); fail_if(unlink(file) != 0); @@ -1438,25 +1837,23 @@ static Eina_Bool open_worker_stop; # ifdef EFL_HAVE_POSIX_THREADS -static void* -open_close_worker(void* path) +static void * +open_close_worker(void *path) { while (!open_worker_stop) { - Eet_File* ef = eet_open((char const*)path, EET_FILE_MODE_READ); - if (ef == NULL) - { - pthread_exit("eet_open() failed"); - } - else - { - Eet_Error err_code = eet_close(ef); - if (err_code != EET_ERROR_NONE) - pthread_exit("eet_close() failed"); - } + Eet_File *ef = eet_open((char const *)path, EET_FILE_MODE_READ); + if (ef == NULL) + pthread_exit("eet_open() failed"); + else + { + Eet_Error err_code = eet_close(ef); + if (err_code != EET_ERROR_NONE) + pthread_exit("eet_close() failed"); + } } - pthread_exit(NULL); + pthread_exit(NULL); } # else @@ -1466,20 +1863,18 @@ open_close_worker(void *path) { while (!open_worker_stop) { - Eet_File *ef = eet_open((char const *)path, EET_FILE_MODE_READ); - if (ef == NULL) - { - _endthreadex(-1); - } - else - { - Eet_Error err_code = eet_close(ef); - if (err_code != EET_ERROR_NONE) - _endthreadex(-2); - } + Eet_File *ef = eet_open((char const *)path, EET_FILE_MODE_READ); + if (ef == NULL) + _endthreadex(-1); + else + { + Eet_Error err_code = eet_close(ef); + if (err_code != EET_ERROR_NONE) + _endthreadex(-2); + } } - _endthreadex(0); + _endthreadex(0); } # endif @@ -1517,14 +1912,14 @@ START_TEST(eet_cache_concurrency) /* clear the cache repeatedly in this thread */ for (n = 0; n < 50000; ++n) { - eet_clearcache(); + eet_clearcache(); } /* join the other thread, and fail if it returned an error message */ open_worker_stop = 1; # ifdef EFL_HAVE_POSIX_THREADS fail_if(pthread_join(thread, &thread_ret) != 0); - fail_unless(thread_ret == NULL, (char const*)thread_ret); + fail_unless(thread_ret == NULL, (char const *)thread_ret); # else ret = WaitForSingleObject((HANDLE)thread, INFINITE); fail_if(ret != WAIT_OBJECT_0); @@ -1563,7 +1958,7 @@ _eet_connection_read(const void *eet_data, size_t size, void *user_data) fail_if(_eet_test_ex_check(result, 0) != 0); fail_if(_eet_test_ex_check(eina_list_data_get(result->list), 1) != 0); fail_if(eina_list_data_get(result->ilist) == NULL); - fail_if(*((int*)eina_list_data_get(result->ilist)) != 42); + fail_if(*((int *)eina_list_data_get(result->ilist)) != 42); fail_if(eina_list_data_get(result->slist) == NULL); fail_if(strcmp(eina_list_data_get(result->slist), "test") != 0); fail_if(eina_hash_find(result->shash, EET_TEST_KEY1) == NULL); @@ -1571,15 +1966,19 @@ _eet_connection_read(const void *eet_data, size_t size, void *user_data) fail_if(strcmp(result->charray[0], "test") != 0); test = 0; - if (result->hash) eina_hash_foreach(result->hash, func, &test); - fail_if(test != 0); - if (result->ihash) eina_hash_foreach(result->ihash, func7, &test); + if (result->hash) + eina_hash_foreach(result->hash, func, &test); + fail_if(test != 0); + if (result->ihash) + eina_hash_foreach(result->ihash, func7, &test); + + fail_if(test != 0); if (!dt->test) { - dt->test = EINA_TRUE; - fail_if(!eet_connection_node_send(dt->conn, node, NULL)); + dt->test = EINA_TRUE; + fail_if(!eet_connection_node_send(dt->conn, node, NULL)); } return EINA_TRUE; @@ -1593,15 +1992,16 @@ _eet_connection_write(const void *data, size_t size, void *user_data) if (!dt->test) { - int step = size / 3; + int step = size / 3; - eet_connection_received(dt->conn, data, step); - eet_connection_received(dt->conn, (char*) data + step, step); - size -= 2 * step; - still = eet_connection_received(dt->conn, (char*) data + 2 * step, size); + eet_connection_received(dt->conn, data, step); + eet_connection_received(dt->conn, (char *)data + step, step); + size -= 2 * step; + still = eet_connection_received(dt->conn, (char *)data + 2 * step, size); } else - still = eet_connection_received(dt->conn, data, size); + still = eet_connection_received(dt->conn, data, size); + fail_if(still); return EINA_TRUE; @@ -1635,7 +2035,8 @@ START_TEST(eet_connection_check) memset(&etbt.charray, 0, sizeof(etbt.charray)); etbt.charray[0] = "test"; - eet_eina_file_data_descriptor_class_set(&eddc, "Eet_Test_Ex_Type", sizeof(Eet_Test_Ex_Type)); + eet_eina_file_data_descriptor_class_set(&eddc, "Eet_Test_Ex_Type", + sizeof(Eet_Test_Ex_Type)); edd = eet_data_descriptor_file_new(&eddc); fail_if(!edd); @@ -1668,7 +2069,7 @@ struct _Eet_5FP { Eina_F32p32 fp32; Eina_F16p16 fp16; - Eina_F8p24 fp8; + Eina_F8p24 fp8; Eina_F32p32 f1; Eina_F32p32 f0; }; @@ -1678,7 +2079,7 @@ struct _Eet_5DBL { double fp32; double fp16; - float fp8; + float fp8; double f1; double f0; }; @@ -1702,18 +2103,18 @@ START_TEST(eet_fp) EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5FP, Eet_5FP, "fp32", fp32, EET_T_F32P32); EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5FP, Eet_5FP, "fp16", fp16, EET_T_F16P16); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5FP, Eet_5FP, "fp8", fp8, EET_T_F8P24); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5FP, Eet_5FP, "f1", f1, EET_T_F32P32); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5FP, Eet_5FP, "f0", f0, EET_T_F32P32); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5FP, Eet_5FP, "fp8", fp8, EET_T_F8P24); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5FP, Eet_5FP, "f1", f1, EET_T_F32P32); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5FP, Eet_5FP, "f0", f0, EET_T_F32P32); eet_eina_stream_data_descriptor_class_set(&eddc, "Eet_5FP", sizeof (Eet_5DBL)); edd_5DBL = eet_data_descriptor_stream_new(&eddc); EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5DBL, Eet_5DBL, "fp32", fp32, EET_T_DOUBLE); EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5DBL, Eet_5DBL, "fp16", fp16, EET_T_DOUBLE); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5DBL, Eet_5DBL, "fp8", fp8, EET_T_FLOAT); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5DBL, Eet_5DBL, "f1", f1, EET_T_DOUBLE); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5DBL, Eet_5DBL, "f0", f0, EET_T_DOUBLE); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5DBL, Eet_5DBL, "fp8", fp8, EET_T_FLOAT); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5DBL, Eet_5DBL, "f1", f1, EET_T_DOUBLE); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5DBL, Eet_5DBL, "f0", f0, EET_T_DOUBLE); origin.fp32 = eina_f32p32_double_from(1.125); origin.fp16 = eina_f16p16_int_from(2000); @@ -1764,18 +2165,18 @@ START_TEST(eet_file_fp) EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5FP, Eet_5FP, "fp32", fp32, EET_T_F32P32); EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5FP, Eet_5FP, "fp16", fp16, EET_T_F16P16); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5FP, Eet_5FP, "fp8", fp8, EET_T_F8P24); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5FP, Eet_5FP, "f1", f1, EET_T_F32P32); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5FP, Eet_5FP, "f0", f0, EET_T_F32P32); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5FP, Eet_5FP, "fp8", fp8, EET_T_F8P24); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5FP, Eet_5FP, "f1", f1, EET_T_F32P32); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5FP, Eet_5FP, "f0", f0, EET_T_F32P32); eet_eina_file_data_descriptor_class_set(&eddc, "Eet_5FP", sizeof (Eet_5DBL)); edd_5DBL = eet_data_descriptor_file_new(&eddc); EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5DBL, Eet_5DBL, "fp32", fp32, EET_T_DOUBLE); EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5DBL, Eet_5DBL, "fp16", fp16, EET_T_DOUBLE); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5DBL, Eet_5DBL, "fp8", fp8, EET_T_FLOAT); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5DBL, Eet_5DBL, "f1", f1, EET_T_DOUBLE); - EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5DBL, Eet_5DBL, "f0", f0, EET_T_DOUBLE); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5DBL, Eet_5DBL, "fp8", fp8, EET_T_FLOAT); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5DBL, Eet_5DBL, "f1", f1, EET_T_DOUBLE); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5DBL, Eet_5DBL, "f0", f0, EET_T_DOUBLE); origin.fp32 = eina_f32p32_double_from(1.125); origin.fp16 = eina_f16p16_int_from(2000); @@ -1829,20 +2230,21 @@ typedef struct _Eet_List Eet_List; typedef enum _Eet_Union { - EET_UNKNOWN, - EET_ST1, - EET_ST2, - EET_ST3 + EET_UNKNOWN, + EET_ST1, + EET_ST2, + EET_ST3 } Eet_Union; -struct { +struct +{ Eet_Union u; const char *name; } eet_mapping[] = { - { EET_ST1, "ST1" }, - { EET_ST2, "ST2" }, - { EET_ST3, "ST3" }, - { EET_UNKNOWN, NULL } + { EET_ST1, "ST1" }, + { EET_ST2, "ST2" }, + { EET_ST3, "ST3" }, + { EET_UNKNOWN, NULL } }; struct _Eet_St1 @@ -1915,12 +2317,16 @@ _eet_union_type_get(const void *data, Eina_Bool *unknow) const Eet_Union *u = data; int i; - if (unknow) *unknow = EINA_FALSE; - for (i = 0; eet_mapping[i].name != NULL; ++i) - if (*u == eet_mapping[i].u) - return eet_mapping[i].name; + if (unknow) + *unknow = EINA_FALSE; + + for (i = 0; eet_mapping[i].name != NULL; ++i) + if (*u == eet_mapping[i].u) + return eet_mapping[i].name; + + if (unknow) + *unknow = EINA_TRUE; - if (unknow) *unknow = EINA_TRUE; return NULL; } @@ -1930,14 +2336,15 @@ _eet_union_type_set(const char *type, void *data, Eina_Bool unknow) Eet_Union *u = data; int i; - if (unknow) return EINA_FALSE; + if (unknow) + return EINA_FALSE; for (i = 0; eet_mapping[i].name != NULL; ++i) - if (strcmp(eet_mapping[i].name, type) == 0) - { - *u = eet_mapping[i].u; - return EINA_TRUE; - } + if (strcmp(eet_mapping[i].name, type) == 0) + { + *u = eet_mapping[i].u; + return EINA_TRUE; + } return EINA_FALSE; } @@ -1948,12 +2355,16 @@ _eet_variant_type_get(const void *data, Eina_Bool *unknow) const Eet_Variant_Type *type = data; int i; - if (unknow) *unknow = type->unknow; - for (i = 0; eet_mapping[i].name != NULL; ++i) - if (strcmp(type->type, eet_mapping[i].name) == 0) - return eet_mapping[i].name; + if (unknow) + *unknow = type->unknow; + + for (i = 0; eet_mapping[i].name != NULL; ++i) + if (strcmp(type->type, eet_mapping[i].name) == 0) + return eet_mapping[i].name; + + if (unknow) + *unknow = EINA_FALSE; - if (unknow) *unknow = EINA_FALSE; return type->type; } @@ -1967,7 +2378,7 @@ _eet_variant_type_set(const char *type, void *data, Eina_Bool unknow) return EINA_TRUE; } -static Eet_Data_Descriptor* +static Eet_Data_Descriptor * _eet_st1_dd(void) { Eet_Data_Descriptor_Class eddc; @@ -1975,9 +2386,9 @@ _eet_st1_dd(void) EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Eet_St1); res = eet_data_descriptor_stream_new(&eddc); - EET_DATA_DESCRIPTOR_ADD_BASIC(res, Eet_St1, "val1", val1, EET_T_DOUBLE); + EET_DATA_DESCRIPTOR_ADD_BASIC(res, Eet_St1, "val1", val1, EET_T_DOUBLE); EET_DATA_DESCRIPTOR_ADD_BASIC(res, Eet_St1, "stuff", stuff, EET_T_INT); - EET_DATA_DESCRIPTOR_ADD_BASIC(res, Eet_St1, "s1", s1, EET_T_STRING); + EET_DATA_DESCRIPTOR_ADD_BASIC(res, Eet_St1, "s1", s1, EET_T_STRING); return res; } @@ -1998,13 +2409,15 @@ _eet_st1_cmp(Eet_St1 *st1, int i) fail_if(!st1); tmp = st1->val1 - EET_TEST_DOUBLE; - if (tmp < 0) tmp = -tmp; + if (tmp < 0) + tmp = -tmp; + fail_if(tmp > 0.005); fail_if(st1->stuff != EET_TEST_INT + i); fail_if(strcmp(st1->s1, EET_TEST_STRING)); } -static Eet_Data_Descriptor* +static Eet_Data_Descriptor * _eet_st2_dd(void) { Eet_Data_Descriptor_Class eddc; @@ -2032,7 +2445,7 @@ _eet_st2_cmp(Eet_St2 *st2, int i) fail_if(st2->v1 != EET_TEST_LONG_LONG + i); } -static Eet_Data_Descriptor* +static Eet_Data_Descriptor * _eet_st3_dd(void) { Eet_Data_Descriptor_Class eddc; @@ -2093,21 +2506,21 @@ START_TEST(eet_test_union) l = calloc(1, sizeof (Eet_List)); -#define EUT_NEW(Type_Index) \ - eut = calloc(1, sizeof (Eet_Union_Test)); \ - eut->type = EET_ST##Type_Index; \ - _eet_st##Type_Index##_set(&(eut->u.st##Type_Index), i); +#define EUT_NEW(Type_Index) \ + eut = calloc(1, sizeof (Eet_Union_Test)); \ + eut->type = EET_ST ## Type_Index; \ + _eet_st ## Type_Index ## _set(&(eut->u.st ## Type_Index), i); for (i = 0; i < 3; ++i) { - EUT_NEW(1); - l->list = eina_list_append(l->list, eut); + EUT_NEW(1); + l->list = eina_list_append(l->list, eut); - EUT_NEW(2); - l->list = eina_list_append(l->list, eut); + EUT_NEW(2); + l->list = eina_list_append(l->list, eut); - EUT_NEW(3); - l->list = eina_list_append(l->list, eut); + EUT_NEW(3); + l->list = eina_list_append(l->list, eut); } blob = eet_data_descriptor_encode(m, l, &size); @@ -2118,19 +2531,19 @@ START_TEST(eet_test_union) fail_if(eina_list_count(l->list) != 9); -#define EUT_CMP(Type_Index) \ - eut = eina_list_nth(l->list, i * 3 + Type_Index - 1); \ - fail_if(eut->type != EET_ST##Type_Index); \ - _eet_st##Type_Index##_cmp(&(eut->u.st##Type_Index), i); +#define EUT_CMP(Type_Index) \ + eut = eina_list_nth(l->list, i * 3 + Type_Index - 1); \ + fail_if(eut->type != EET_ST ## Type_Index); \ + _eet_st ## Type_Index ## _cmp(&(eut->u.st ## Type_Index), i); for (i = 0; i < 3; ++i) { - EUT_CMP(1); - EUT_CMP(2); - EUT_CMP(3); + EUT_CMP(1); + EUT_CMP(2); + EUT_CMP(3); } - eet_shutdown(); + eet_shutdown(); eina_shutdown(); } END_TEST @@ -2168,44 +2581,49 @@ START_TEST(eet_test_variant) EET_DATA_DESCRIPTOR_ADD_MAPPING(unified, "ST2", _eet_st2_dd()); EET_DATA_DESCRIPTOR_ADD_MAPPING(unified, "ST3", _eet_st3_dd()); - EET_DATA_DESCRIPTOR_ADD_VARIANT(edd, Eet_Variant_Test, "data", data, t, unified); + EET_DATA_DESCRIPTOR_ADD_VARIANT(edd, + Eet_Variant_Test, + "data", + data, + t, + unified); unified = eet_data_descriptor_stream_new(&eddc); eet_data_descriptor_element_add(unified, "ST1", - EET_T_UNKNOW, EET_G_LIST, - 0, 0, NULL, _eet_st1_dd()); + EET_T_UNKNOW, EET_G_LIST, + 0, 0, NULL, _eet_st1_dd()); eet_data_descriptor_element_add(unified, "ST2", - EET_T_UNKNOW, EET_G_LIST, - 0, 0, NULL, _eet_st2_dd()); + EET_T_UNKNOW, EET_G_LIST, + 0, 0, NULL, _eet_st2_dd()); EET_DATA_DESCRIPTOR_ADD_VARIANT(edd, Eet_Variant_Test, - "data_list", data_list, t, unified); + "data_list", data_list, t, unified); EET_DATA_DESCRIPTOR_ADD_LIST(m, Eet_List, "list", list, edd); l = calloc(1, sizeof (Eet_List)); -#define EVT_NEW(Type_Index) \ - evt = calloc(1, sizeof (Eet_Variant_Test)); \ - evt->t.type = eet_mapping[Type_Index - 1].name; \ - st##Type_Index = calloc(1, sizeof (Eet_St##Type_Index)); \ - _eet_st##Type_Index##_set(st##Type_Index, i); \ - evt->data = st##Type_Index; +#define EVT_NEW(Type_Index) \ + evt = calloc(1, sizeof (Eet_Variant_Test)); \ + evt->t.type = eet_mapping[Type_Index - 1].name; \ + st ## Type_Index = calloc(1, sizeof (Eet_St ## Type_Index)); \ + _eet_st ## Type_Index ## _set(st ## Type_Index, i); \ + evt->data = st ## Type_Index; for (i = 0; i < 3; ++i) { - EVT_NEW(1); - l->list = eina_list_append(l->list, evt); + EVT_NEW(1); + l->list = eina_list_append(l->list, evt); - st1 = calloc(1, sizeof (Eet_St1)); - _eet_st1_set(st1, i); - evt->data_list = eina_list_append(evt->data_list, st1); + st1 = calloc(1, sizeof (Eet_St1)); + _eet_st1_set(st1, i); + evt->data_list = eina_list_append(evt->data_list, st1); - EVT_NEW(2); - l->list = eina_list_append(l->list, evt); + EVT_NEW(2); + l->list = eina_list_append(l->list, evt); - EVT_NEW(3); - l->list = eina_list_append(l->list, evt); + EVT_NEW(3); + l->list = eina_list_append(l->list, evt); } blob = eet_data_descriptor_encode(m, l, &size); @@ -2216,26 +2634,26 @@ START_TEST(eet_test_variant) fail_if(eina_list_count(l->list) != 9); -#define EVT_CMP(Type_Index) \ - evt = eina_list_nth(l->list, i * 3 + Type_Index - 1); \ - fail_if(strcmp(evt->t.type, eet_mapping[Type_Index - 1].name) != 0); \ - _eet_st##Type_Index##_cmp(evt->data, i); +#define EVT_CMP(Type_Index) \ + evt = eina_list_nth(l->list, i * 3 + Type_Index - 1); \ + fail_if(strcmp(evt->t.type, eet_mapping[Type_Index - 1].name) != 0); \ + _eet_st ## Type_Index ## _cmp(evt->data, i); for (i = 0; i < 3; ++i) { - EVT_CMP(1); + EVT_CMP(1); - fail_if(!evt->data_list); - fail_if(eina_list_count(evt->data_list) != 1); + fail_if(!evt->data_list); + fail_if(eina_list_count(evt->data_list) != 1); - st1 = eina_list_data_get(evt->data_list); - _eet_st1_cmp(st1, i); + st1 = eina_list_data_get(evt->data_list); + _eet_st1_cmp(st1, i); - EVT_CMP(2); - EVT_CMP(3); + EVT_CMP(2); + EVT_CMP(3); } - eet_shutdown(); + eet_shutdown(); eina_shutdown(); } END_TEST @@ -2304,9 +2722,9 @@ eet_suite(void) int main(void) { - Suite *s; + Suite *s; SRunner *sr; - int failed_count; + int failed_count; s = eet_suite(); sr = srunner_create(s);