diff --git a/src/examples/eina/eina_value_04.c b/src/examples/eina/eina_value_04.c new file mode 100644 index 0000000000..0c81f21d2a --- /dev/null +++ b/src/examples/eina/eina_value_04.c @@ -0,0 +1,32 @@ +//Compile with: +//gcc eina_value_04.c -o eina_value_04 `pkg-config --cflags --libs eina` + +#include +#include + +int main(int argc EINA_UNUSED, char **argv EINA_UNUSED) +{ + Eina_Value tm_val; + time_t rawtime; + struct tm *timeinfo, timeinfo2; + char buf[1024]; + + eina_init(); + + eina_value_setup(&tm_val, EINA_VALUE_TYPE_TM); + + time(&rawtime); + timeinfo = localtime(&rawtime); + + eina_value_set(&tm_val, *timeinfo); + strftime(buf, 1024, "Now its %d/%m/%y", timeinfo); + printf("%s\n", buf); + + eina_value_get(&tm_val, &timeinfo2); + strftime(buf, 1024, "Copy: %d/%m/%y", &timeinfo2); + printf("%s\n", buf); + + eina_value_free(&tm_val); + + eina_shutdown(); +} diff --git a/src/lib/eina/eina_value.c b/src/lib/eina/eina_value.c index 63c26ce5d8..884876ee8e 100644 --- a/src/lib/eina/eina_value.c +++ b/src/lib/eina/eina_value.c @@ -3530,6 +3530,98 @@ static const Eina_Value_Type _EINA_VALUE_TYPE_TIMEVAL = { _eina_value_type_timeval_pget }; +static Eina_Bool +_eina_value_type_tm_setup(const Eina_Value_Type *type, void *mem) +{ + memset(mem, 0, type->value_size); + return EINA_TRUE; +} + +static Eina_Bool +_eina_value_type_tm_flush(const Eina_Value_Type *type EINA_UNUSED, void *mem EINA_UNUSED) +{ + return EINA_TRUE; +} + +static Eina_Bool +_eina_value_type_tm_copy(const Eina_Value_Type *type EINA_UNUSED, const void *src, void * dst) +{ + struct tm *tmsrc = (struct tm *)src; + struct tm *tmdst = dst; + *tmdst = *tmsrc; + return EINA_TRUE; +} + +static int +_eina_value_type_tm_compare(const Eina_Value_Type *type, const void *a, const void *b) +{ + struct tm tma = *(struct tm*)a; + struct tm tmb = *(struct tm*)b; + time_t ta, tb; + + ta = mktime(&tma); + tb = mktime(&tmb); + + return _eina_value_type_timeval_compare(type, &ta, &tb); +} + +static Eina_Bool +_eina_value_type_tm_pset(const Eina_Value_Type *type EINA_UNUSED, void *mem, const void *ptr) +{ + *(struct tm*)mem = *(struct tm*)ptr; + return EINA_TRUE; +} + +static Eina_Bool +_eina_value_type_tm_vset(const Eina_Value_Type *type, void *mem, va_list args) +{ + const struct tm tm_val = va_arg(args, struct tm); + return _eina_value_type_tm_pset(type, mem, &tm_val); +} + +static Eina_Bool +_eina_value_type_tm_pget(const Eina_Value_Type *type, const void *mem, void *ptr) +{ + memcpy(ptr, mem, type->value_size); + return EINA_TRUE; +} + +static Eina_Bool +_eina_value_type_tm_convert_to(const Eina_Value_Type *type, const Eina_Value_Type *convert, const void *type_mem, void *convert_mem) +{ + struct tm tmv = *(struct tm *)type_mem; + time_t t = mktime(&tmv); + struct timeval v = {t, 0}; + + if (convert == EINA_VALUE_TYPE_STRINGSHARE || + convert == EINA_VALUE_TYPE_STRING) + { + const char *other_mem; + char buf[64]; + + strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", &tmv); + other_mem = buf; /* required due &buf == buf */ + return eina_value_type_pset(convert, convert_mem, &other_mem); + } + else + return _eina_value_type_timeval_convert_to(type, convert, &v, convert_mem); +} + +static const Eina_Value_Type _EINA_VALUE_TYPE_TM = { + EINA_VALUE_TYPE_VERSION, + sizeof(struct tm), + "struct tm", + _eina_value_type_tm_setup, + _eina_value_type_tm_flush, + _eina_value_type_tm_copy, + _eina_value_type_tm_compare, + _eina_value_type_tm_convert_to, + NULL, //No convert from + _eina_value_type_tm_vset, + _eina_value_type_tm_pset, + _eina_value_type_tm_pget +}; + static Eina_Bool _eina_value_type_blob_setup(const Eina_Value_Type *type EINA_UNUSED, void *mem) { @@ -5365,6 +5457,7 @@ eina_value_init(void) EINA_VALUE_TYPE_LIST = &_EINA_VALUE_TYPE_LIST; EINA_VALUE_TYPE_HASH = &_EINA_VALUE_TYPE_HASH; EINA_VALUE_TYPE_TIMEVAL = &_EINA_VALUE_TYPE_TIMEVAL; + EINA_VALUE_TYPE_TM = &_EINA_VALUE_TYPE_TM; EINA_VALUE_TYPE_BLOB = &_EINA_VALUE_TYPE_BLOB; EINA_VALUE_TYPE_STRUCT = &_EINA_VALUE_TYPE_STRUCT; @@ -5461,6 +5554,7 @@ EAPI const Eina_Value_Type *EINA_VALUE_TYPE_STRUCT = NULL; EAPI const Eina_Value_Type *EINA_VALUE_TYPE_OPTIONAL = NULL; EAPI const Eina_Value_Type *EINA_VALUE_TYPE_FILE = NULL; EAPI const Eina_Value_Type *EINA_VALUE_TYPE_RECTANGLE = NULL; +EAPI const Eina_Value_Type *EINA_VALUE_TYPE_TM = NULL; EAPI const Eina_Value_Blob_Operations *EINA_VALUE_BLOB_OPERATIONS_MALLOC = NULL; diff --git a/src/lib/eina/eina_value.h b/src/lib/eina/eina_value.h index ee3f84e59f..cd2e1d7b49 100644 --- a/src/lib/eina/eina_value.h +++ b/src/lib/eina/eina_value.h @@ -622,6 +622,20 @@ EAPI extern const Eina_Value_Type *EINA_VALUE_TYPE_BLOB; */ EAPI extern const Eina_Value_Type *EINA_VALUE_TYPE_STRUCT; +/** + * @var EINA_VALUE_TYPE_TM + * manages 'struct tm' type + * + * eina_value_set() takes a "struct tm" from time.h. + * eina_value_pset() takes a pointer to "struct tm". + * + * eina_value_get() and eina_value_pget() takes a pointer to "struct + * tm" and it's an exact copy of value. + * + * @since 1.21 + */ +EAPI extern const Eina_Value_Type *EINA_VALUE_TYPE_TM; + EAPI extern Eina_Error EINA_ERROR_VALUE_FAILED; /** @@ -779,6 +793,7 @@ static inline int eina_value_compare(const Eina_Value *a, * @li EINA_VALUE_TYPE_TIMEVAL: struct timeval * @li EINA_VALUE_TYPE_BLOB: Eina_Value_Blob * @li EINA_VALUE_TYPE_STRUCT: Eina_Value_Struct + * @li EINA_VALUE_TYPE_TM: struct tm* * * @code * Eina_Value *value = eina_value_new(EINA_VALUE_TYPE_INT); @@ -842,6 +857,7 @@ static inline Eina_Bool eina_value_set(Eina_Value *value, * @li EINA_VALUE_TYPE_TIMEVAL: struct timeval* * @li EINA_VALUE_TYPE_BLOB: Eina_Value_Blob* * @li EINA_VALUE_TYPE_STRUCT: Eina_Value_Struct* + * @li EINA_VALUE_TYPE_TM: struct tm* * * @code * Eina_Value *value = eina_value_new(EINA_VALUE_TYPE_INT); @@ -947,6 +963,7 @@ static inline Eina_Bool eina_value_vget(const Eina_Value *value, * @li EINA_VALUE_TYPE_TIMEVAL: struct timeval* * @li EINA_VALUE_TYPE_BLOB: Eina_Value_Blob* * @li EINA_VALUE_TYPE_STRUCT: Eina_Value_Struct* + * @li EINA_VALUE_TYPE_TM: struct tm* * * @note the pointer contents are written using the size defined by * type. It can be larger than void* or uint64_t. @@ -1015,6 +1032,7 @@ static inline Eina_Bool eina_value_pset(Eina_Value *value, * @li EINA_VALUE_TYPE_TIMEVAL: struct timeval* * @li EINA_VALUE_TYPE_BLOB: Eina_Value_Blob* * @li EINA_VALUE_TYPE_BLOB: Eina_Value_Blob* + * @li EINA_VALUE_TYPE_TM: struct tm* * * @code * Eina_Value *value = eina_value_new(EINA_VALUE_TYPE_INT); @@ -1242,6 +1260,7 @@ static inline Eina_Bool eina_value_array_remove(Eina_Value *value, * @li EINA_VALUE_TYPE_TIMEVAL: struct timeval * @li EINA_VALUE_TYPE_BLOB: Eina_Value_Blob * @li EINA_VALUE_TYPE_STRUCT: Eina_Value_Struct + * @li EINA_VALUE_TYPE_TM: struct tm* * * @code * Eina_Value *value = eina_value_array_new(EINA_VALUE_TYPE_INT, 0); @@ -1305,6 +1324,7 @@ static inline Eina_Bool eina_value_array_set(Eina_Value *value, * @li EINA_VALUE_TYPE_TIMEVAL: struct timeval* * @li EINA_VALUE_TYPE_BLOB: Eina_Value_Blob* * @li EINA_VALUE_TYPE_STRUCT: Eina_Value_Struct* + * @li EINA_VALUE_TYPE_TM: struct tm* * * @code * Eina_Value *value = eina_value_array_new(EINA_VALUE_TYPE_INT, 0); @@ -1356,6 +1376,7 @@ static inline Eina_Bool eina_value_array_get(const Eina_Value *value, * @li EINA_VALUE_TYPE_TIMEVAL: struct timeval * @li EINA_VALUE_TYPE_BLOB: Eina_Value_Blob * @li EINA_VALUE_TYPE_STRUCT: Eina_Value_Struct + * @li EINA_VALUE_TYPE_TM: struct tm* * * @code * Eina_Value *value = eina_value_array_new(EINA_VALUE_TYPE_INT, 0); @@ -1413,6 +1434,7 @@ static inline Eina_Bool eina_value_array_insert(Eina_Value *value, * @li EINA_VALUE_TYPE_TIMEVAL: struct timeval * @li EINA_VALUE_TYPE_BLOB: Eina_Value_Blob * @li EINA_VALUE_TYPE_STRUCT: Eina_Value_Struct + * @li EINA_VALUE_TYPE_TM: struct tm* * * @code * Eina_Value *value = eina_value_array_new(EINA_VALUE_TYPE_INT, 0); @@ -1556,6 +1578,7 @@ static inline Eina_Bool eina_value_array_vappend(Eina_Value *value, * @li EINA_VALUE_TYPE_TIMEVAL: struct timeval* * @li EINA_VALUE_TYPE_BLOB: Eina_Value_Blob* * @li EINA_VALUE_TYPE_STRUCT: Eina_Value_Struct* + * @li EINA_VALUE_TYPE_TM: struct tm* * * @note the pointer contents are written using the size defined by * type. It can be larger than void* or uint64_t. @@ -1623,6 +1646,7 @@ static inline Eina_Bool eina_value_array_pset(Eina_Value *value, * @li EINA_VALUE_TYPE_TIMEVAL: struct timeval* * @li EINA_VALUE_TYPE_BLOB: Eina_Value_Blob* * @li EINA_VALUE_TYPE_STRUCT: Eina_Value_Struct* + * @li EINA_VALUE_TYPE_TM: struct tm* * * @code * Eina_Value *value = eina_value_array_new(EINA_VALUE_TYPE_INT, 0); @@ -1675,6 +1699,7 @@ static inline Eina_Bool eina_value_array_pget(const Eina_Value *value, * @li EINA_VALUE_TYPE_TIMEVAL: struct timeval* * @li EINA_VALUE_TYPE_BLOB: Eina_Value_Blob* * @li EINA_VALUE_TYPE_STRUCT: Eina_Value_Struct* + * @li EINA_VALUE_TYPE_TM: struct tm* * * @note the pointer contents are written using the size defined by * type. It can be larger than void* or uint64_t. @@ -1735,6 +1760,7 @@ static inline Eina_Bool eina_value_array_pinsert(Eina_Value *value, * @li EINA_VALUE_TYPE_TIMEVAL: struct timeval* * @li EINA_VALUE_TYPE_BLOB: Eina_Value_Blob* * @li EINA_VALUE_TYPE_STRUCT: Eina_Value_Struct* + * @li EINA_VALUE_TYPE_TM: struct tm* * * @note the pointer contents are written using the size defined by * type. It can be larger than void* or uint64_t. @@ -1950,6 +1976,7 @@ static inline Eina_Bool eina_value_list_remove(Eina_Value *value, * @li EINA_VALUE_TYPE_TIMEVAL: struct timeval * @li EINA_VALUE_TYPE_BLOB: Eina_Value_Blob * @li EINA_VALUE_TYPE_STRUCT: Eina_Value_Struct + * @li EINA_VALUE_TYPE_TM: struct tm* * * @code * Eina_Value *value = eina_value_list_new(EINA_VALUE_TYPE_INT); @@ -2012,6 +2039,7 @@ static inline Eina_Bool eina_value_list_set(Eina_Value *value, * @li EINA_VALUE_TYPE_TIMEVAL: struct timeval* * @li EINA_VALUE_TYPE_BLOB: Eina_Value_Blob* * @li EINA_VALUE_TYPE_STRUCT: Eina_Value_Struct* + * @li EINA_VALUE_TYPE_TM: struct tm* * * @code * Eina_Value *value = eina_value_list_new(EINA_VALUE_TYPE_INT); @@ -2062,6 +2090,7 @@ static inline Eina_Bool eina_value_list_get(const Eina_Value *value, * @li EINA_VALUE_TYPE_TIMEVAL: struct timeval * @li EINA_VALUE_TYPE_BLOB: Eina_Value_Blob * @li EINA_VALUE_TYPE_STRUCT: Eina_Value_Struct + * @li EINA_VALUE_TYPE_TM: struct tm* * * @code * Eina_Value *value = eina_value_list_new(EINA_VALUE_TYPE_INT); @@ -2118,6 +2147,7 @@ static inline Eina_Bool eina_value_list_insert(Eina_Value *value, * @li EINA_VALUE_TYPE_TIMEVAL: struct timeval * @li EINA_VALUE_TYPE_BLOB: Eina_Value_Blob * @li EINA_VALUE_TYPE_STRUCT: Eina_Value_Struct + * @li EINA_VALUE_TYPE_TM: struct tm* * * @code * Eina_Value *value = eina_value_list_new(EINA_VALUE_TYPE_INT); @@ -2260,6 +2290,7 @@ static inline Eina_Bool eina_value_list_vappend(Eina_Value *value, * @li EINA_VALUE_TYPE_TIMEVAL: struct timeval* * @li EINA_VALUE_TYPE_BLOB: Eina_Value_Blob* * @li EINA_VALUE_TYPE_STRUCT: Eina_Value_Struct* + * @li EINA_VALUE_TYPE_TM: struct tm* * * @note the pointer contents are written using the size defined by * type. It can be larger than void* or uint64_t. @@ -2326,6 +2357,7 @@ static inline Eina_Bool eina_value_list_pset(Eina_Value *value, * @li EINA_VALUE_TYPE_TIMEVAL: struct timeval* * @li EINA_VALUE_TYPE_BLOB: Eina_Value_Blob* * @li EINA_VALUE_TYPE_STRUCT: Eina_Value_Struct* + * @li EINA_VALUE_TYPE_TM: struct tm* * * @code * Eina_Value *value = eina_value_list_new(EINA_VALUE_TYPE_INT); @@ -2377,6 +2409,7 @@ static inline Eina_Bool eina_value_list_pget(const Eina_Value *value, * @li EINA_VALUE_TYPE_TIMEVAL: struct timeval* * @li EINA_VALUE_TYPE_BLOB: Eina_Value_Blob* * @li EINA_VALUE_TYPE_STRUCT: Eina_Value_Struct* + * @li EINA_VALUE_TYPE_TM: struct tm* * * @note the pointer contents are written using the size defined by * type. It can be larger than void* or uint64_t. @@ -2436,6 +2469,7 @@ static inline Eina_Bool eina_value_list_pinsert(Eina_Value *value, * @li EINA_VALUE_TYPE_TIMEVAL: struct timeval* * @li EINA_VALUE_TYPE_BLOB: Eina_Value_Blob* * @li EINA_VALUE_TYPE_STRUCT: Eina_Value_Struct* + * @li EINA_VALUE_TYPE_TM: struct tm* * * @note the pointer contents are written using the size defined by * type. It can be larger than void* or uint64_t. @@ -2592,6 +2626,7 @@ static inline Eina_Bool eina_value_hash_del(Eina_Value *value, * @li EINA_VALUE_TYPE_TIMEVAL: struct timeval* * @li EINA_VALUE_TYPE_BLOB: Eina_Value_Blob* * @li EINA_VALUE_TYPE_STRUCT: Eina_Value_Struct* + * @li EINA_VALUE_TYPE_TM: struct tm* * * @code * Eina_Value *value = eina_value_hash_new(EINA_VALUE_TYPE_INT, 0); @@ -2647,6 +2682,7 @@ static inline Eina_Bool eina_value_hash_set(Eina_Value *value, * @li EINA_VALUE_TYPE_TIMEVAL: struct timeval* * @li EINA_VALUE_TYPE_BLOB: Eina_Value_Blob* * @li EINA_VALUE_TYPE_STRUCT: Eina_Value_Struct* + * @li EINA_VALUE_TYPE_TM: struct tm* * * @code * Eina_Value *value = eina_value_hash_new(EINA_VALUE_TYPE_INT, 0); @@ -2735,6 +2771,7 @@ static inline Eina_Bool eina_value_hash_vget(const Eina_Value *value, * @li EINA_VALUE_TYPE_TIMEVAL: struct timeval* * @li EINA_VALUE_TYPE_BLOB: Eina_Value_Blob* * @li EINA_VALUE_TYPE_STRUCT: Eina_Value_Struct* + * @li EINA_VALUE_TYPE_TM: struct tm* * * @note the pointer contents are written using the size defined by * type. It can be larger than void* or uint64_t. @@ -2793,6 +2830,7 @@ static inline Eina_Bool eina_value_hash_pset(Eina_Value *value, * @li EINA_VALUE_TYPE_TIMEVAL: struct timeval* * @li EINA_VALUE_TYPE_BLOB: Eina_Value_Blob* * @li EINA_VALUE_TYPE_STRUCT: Eina_Value_Struct* + * @li EINA_VALUE_TYPE_TM: struct tm* * * @code * Eina_Value *value = eina_value_hash_new(EINA_VALUE_TYPE_INT, 0); @@ -3172,6 +3210,7 @@ static inline const Eina_Value_Struct_Desc *eina_value_struct_desc_get(const Ein * @li EINA_VALUE_TYPE_TIMEVAL: struct timeval* * @li EINA_VALUE_TYPE_BLOB: Eina_Value_Blob* * @li EINA_VALUE_TYPE_STRUCT: Eina_Value_Struct* + * @li EINA_VALUE_TYPE_TM: struct tm* * * @code * struct myst { @@ -3242,6 +3281,7 @@ static inline Eina_Bool eina_value_struct_set(Eina_Value *value, * @li EINA_VALUE_TYPE_TIMEVAL: struct timeval* * @li EINA_VALUE_TYPE_BLOB: Eina_Value_Blob* * @li EINA_VALUE_TYPE_STRUCT: Eina_Value_Struct* + * @li EINA_VALUE_TYPE_TM: struct tm* * * @code * struct myst { @@ -3346,7 +3386,8 @@ static inline Eina_Bool eina_value_struct_vget(const Eina_Value *value, * @li EINA_VALUE_TYPE_TIMEVAL: struct timeval* * @li EINA_VALUE_TYPE_BLOB: Eina_Value_Blob* * @li EINA_VALUE_TYPE_STRUCT: Eina_Value_Struct* - * + * @li EINA_VALUE_TYPE_TM: struct tm* + * * @note the pointer contents are written using the size defined by * type. It can be larger than void* or uint64_t. * @@ -3420,6 +3461,7 @@ static inline Eina_Bool eina_value_struct_pset(Eina_Value *value, * @li EINA_VALUE_TYPE_TIMEVAL: struct timeval* * @li EINA_VALUE_TYPE_BLOB: Eina_Value_Blob* * @li EINA_VALUE_TYPE_STRUCT: Eina_Value_Struct* + * @li EINA_VALUE_TYPE_TM: struct tm* * * @code * struct myst {