2012-09-16 14:15:43 -07:00
|
|
|
//Compile with:
|
|
|
|
//gcc eina_value_03.c -o eina_value_03 `pkg-config --cflags --libs eina`
|
|
|
|
|
|
|
|
#include <Eina.h>
|
|
|
|
#include <sys/time.h>
|
|
|
|
|
|
|
|
static Eina_Bool
|
|
|
|
_tz_setup(const Eina_Value_Type *type, void *mem)
|
|
|
|
{
|
|
|
|
memset(mem, 0, type->value_size);
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static Eina_Bool
|
2014-02-28 04:32:04 -08:00
|
|
|
_tz_flush(const Eina_Value_Type *type EINA_UNUSED, void *mem EINA_UNUSED)
|
2012-09-16 14:15:43 -07:00
|
|
|
{
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static Eina_Bool
|
2014-02-28 04:32:04 -08:00
|
|
|
_tz_copy(const Eina_Value_Type *type EINA_UNUSED, const void *src, void * dst)
|
2012-09-16 14:15:43 -07:00
|
|
|
{
|
2014-01-09 00:24:04 -08:00
|
|
|
struct timezone *tzsrc = (struct timezone *)src;
|
2012-09-16 14:15:43 -07:00
|
|
|
struct timezone *tzdst = dst;
|
|
|
|
*tzdst = *tzsrc;
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
2014-05-23 17:27:11 -07:00
|
|
|
static int
|
2014-02-28 04:32:04 -08:00
|
|
|
_tz_compare(const Eina_Value_Type *type EINA_UNUSED, const void *a, const void *b)
|
2012-09-16 14:15:43 -07:00
|
|
|
{
|
|
|
|
struct timezone tza = *(struct timezone*)a;
|
|
|
|
struct timezone tzb = *(struct timezone*)b;
|
|
|
|
|
|
|
|
if (tza.tz_minuteswest < tzb.tz_minuteswest)
|
|
|
|
return -1;
|
|
|
|
else if (tza.tz_minuteswest > tzb.tz_minuteswest)
|
|
|
|
return 1;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static Eina_Bool
|
2014-02-28 04:32:04 -08:00
|
|
|
_tz_pset(const Eina_Value_Type *type EINA_UNUSED, void *mem, const void *ptr)
|
2012-09-16 14:15:43 -07:00
|
|
|
{
|
|
|
|
*(struct timezone*)mem = *(struct timezone*)ptr;
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static Eina_Bool
|
|
|
|
_tz_vset(const Eina_Value_Type *type, void *mem, va_list args)
|
|
|
|
{
|
|
|
|
const struct timezone tz = va_arg(args, struct timezone);
|
|
|
|
return _tz_pset(type, mem, &tz);
|
|
|
|
}
|
|
|
|
|
|
|
|
static Eina_Bool
|
|
|
|
_tz_pget(const Eina_Value_Type *type, const void *mem, void *ptr)
|
|
|
|
{
|
|
|
|
memcpy(ptr, mem, type->value_size);
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static Eina_Bool
|
2014-02-28 04:32:04 -08:00
|
|
|
_tz_convert_to(const Eina_Value_Type *type EINA_UNUSED, const Eina_Value_Type *convert, const void *type_mem, void *convert_mem)
|
2012-09-16 14:15:43 -07:00
|
|
|
{
|
|
|
|
struct timezone v = *(struct timezone*)type_mem;
|
|
|
|
|
|
|
|
if (convert == EINA_VALUE_TYPE_UCHAR)
|
|
|
|
{
|
|
|
|
unsigned char other_mem = v.tz_minuteswest;
|
|
|
|
return eina_value_type_pset(convert, convert_mem, &other_mem);
|
|
|
|
}
|
|
|
|
else if (convert == EINA_VALUE_TYPE_USHORT)
|
|
|
|
{
|
|
|
|
unsigned short other_mem = v.tz_minuteswest;
|
|
|
|
return eina_value_type_pset(convert, convert_mem, &other_mem);
|
|
|
|
}
|
|
|
|
else if (convert == EINA_VALUE_TYPE_UINT)
|
|
|
|
{
|
|
|
|
unsigned int other_mem = v.tz_minuteswest;
|
|
|
|
return eina_value_type_pset(convert, convert_mem, &other_mem);
|
|
|
|
}
|
|
|
|
else if ((convert == EINA_VALUE_TYPE_ULONG) || (convert == EINA_VALUE_TYPE_TIMESTAMP))
|
|
|
|
{
|
|
|
|
unsigned long other_mem = v.tz_minuteswest;
|
|
|
|
return eina_value_type_pset(convert, convert_mem, &other_mem);
|
|
|
|
}
|
|
|
|
else if (convert == EINA_VALUE_TYPE_UINT64)
|
|
|
|
{
|
|
|
|
uint64_t other_mem = v.tz_minuteswest;
|
|
|
|
return eina_value_type_pset(convert, convert_mem, &other_mem);
|
|
|
|
}
|
|
|
|
else if (convert == EINA_VALUE_TYPE_CHAR)
|
|
|
|
{
|
|
|
|
char other_mem = v.tz_minuteswest;
|
|
|
|
return eina_value_type_pset(convert, convert_mem, &other_mem);
|
|
|
|
}
|
|
|
|
else if (convert == EINA_VALUE_TYPE_SHORT)
|
|
|
|
{
|
|
|
|
short other_mem = v.tz_minuteswest;
|
|
|
|
return eina_value_type_pset(convert, convert_mem, &other_mem);
|
|
|
|
}
|
|
|
|
else if (convert == EINA_VALUE_TYPE_INT)
|
|
|
|
{
|
|
|
|
int other_mem = v.tz_minuteswest;
|
|
|
|
return eina_value_type_pset(convert, convert_mem, &other_mem);
|
|
|
|
}
|
|
|
|
else if (convert == EINA_VALUE_TYPE_LONG)
|
|
|
|
{
|
|
|
|
long other_mem = v.tz_minuteswest;
|
|
|
|
return eina_value_type_pset(convert, convert_mem, &other_mem);
|
|
|
|
}
|
|
|
|
else if (convert == EINA_VALUE_TYPE_INT64)
|
|
|
|
{
|
|
|
|
int64_t other_mem = v.tz_minuteswest;
|
|
|
|
return eina_value_type_pset(convert, convert_mem, &other_mem);
|
|
|
|
}
|
|
|
|
else if (convert == EINA_VALUE_TYPE_FLOAT)
|
|
|
|
return eina_value_type_pset(convert, convert_mem, &v.tz_minuteswest);
|
|
|
|
else if (convert == EINA_VALUE_TYPE_DOUBLE)
|
|
|
|
return eina_value_type_pset(convert, convert_mem, &v.tz_minuteswest);
|
|
|
|
else if (convert == EINA_VALUE_TYPE_STRINGSHARE ||
|
|
|
|
convert == EINA_VALUE_TYPE_STRING)
|
|
|
|
{
|
|
|
|
const char *other_mem;
|
|
|
|
char buf[64];
|
|
|
|
snprintf(buf, sizeof(buf), "%d", v.tz_minuteswest);
|
|
|
|
other_mem = buf; /* required due &buf == buf */
|
|
|
|
return eina_value_type_pset(convert, convert_mem, &other_mem);
|
|
|
|
}
|
|
|
|
return EINA_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static Eina_Value_Type TZ_TYPE = {
|
|
|
|
EINA_VALUE_TYPE_VERSION,
|
|
|
|
sizeof(struct timezone),
|
|
|
|
"struct timezone",
|
|
|
|
_tz_setup,
|
|
|
|
_tz_flush,
|
|
|
|
_tz_copy,
|
|
|
|
_tz_compare,
|
|
|
|
_tz_convert_to,
|
|
|
|
NULL, //No convert from
|
|
|
|
_tz_vset,
|
|
|
|
_tz_pset,
|
|
|
|
_tz_pget
|
|
|
|
};
|
|
|
|
|
2014-02-28 04:32:04 -08:00
|
|
|
int main(int argc EINA_UNUSED, char **argv EINA_UNUSED)
|
2012-09-16 14:15:43 -07:00
|
|
|
{
|
|
|
|
Eina_Value vtv, vtz;
|
|
|
|
struct timeval tv;
|
|
|
|
struct timezone tz;
|
|
|
|
char *s;
|
|
|
|
|
|
|
|
eina_init();
|
|
|
|
|
|
|
|
eina_value_setup(&vtv, EINA_VALUE_TYPE_TIMEVAL);
|
|
|
|
eina_value_setup(&vtz, &TZ_TYPE);
|
|
|
|
|
|
|
|
gettimeofday(&tv, &tz);
|
|
|
|
eina_value_set(&vtv, tv);
|
|
|
|
eina_value_set(&vtz, tz);
|
|
|
|
|
|
|
|
s = eina_value_to_string(&vtv);
|
|
|
|
printf("time: %s\n", s);
|
|
|
|
free(s);
|
|
|
|
s = eina_value_to_string(&vtz);
|
|
|
|
printf("timezone: %s\n", s);
|
|
|
|
free(s);
|
|
|
|
|
|
|
|
eina_value_flush(&vtz);
|
|
|
|
eina_value_flush(&vtv);
|
|
|
|
}
|