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);