EFL 1.7 svn doobies
[profile/ivi/eina.git] / src / examples / eina_value_03.c
1 //Compile with:
2 //gcc eina_value_03.c -o eina_value_03 `pkg-config --cflags --libs eina`
3
4 #include <Eina.h>
5 #include <sys/time.h>
6
7 static Eina_Bool
8 _tz_setup(const Eina_Value_Type *type, void *mem)
9 {
10    memset(mem, 0, type->value_size);
11    return EINA_TRUE;
12 }
13
14 static Eina_Bool
15 _tz_flush(const Eina_Value_Type *type, void *mem)
16 {
17    return EINA_TRUE;
18 }
19
20 static Eina_Bool
21 _tz_copy(const Eina_Value_Type *type, const void *src, void * dst)
22 {
23    struct timezone *tzsrc = src;
24    struct timezone *tzdst = dst;
25    *tzdst = *tzsrc;
26    return EINA_TRUE;
27 }
28
29 static Eina_Bool
30 _tz_compare(const Eina_Value_Type *type, const void *a, const void *b)
31 {
32    struct timezone tza = *(struct timezone*)a;
33    struct timezone tzb = *(struct timezone*)b;
34
35    if (tza.tz_minuteswest < tzb.tz_minuteswest)
36      return -1;
37    else if (tza.tz_minuteswest > tzb.tz_minuteswest)
38      return 1;
39    return 0;
40 }
41
42 static Eina_Bool
43 _tz_pset(const Eina_Value_Type *type, void *mem, const void *ptr)
44 {
45    *(struct timezone*)mem = *(struct timezone*)ptr;
46    return EINA_TRUE;
47 }
48
49 static Eina_Bool
50 _tz_vset(const Eina_Value_Type *type, void *mem, va_list args)
51 {
52    const struct timezone tz = va_arg(args, struct timezone);
53    return _tz_pset(type, mem, &tz);
54 }
55
56 static Eina_Bool
57 _tz_pget(const Eina_Value_Type *type, const void *mem, void *ptr)
58 {
59    memcpy(ptr, mem, type->value_size);
60    return EINA_TRUE;
61 }
62
63 static Eina_Bool
64 _tz_convert_to(const Eina_Value_Type *type, const Eina_Value_Type *convert, const void *type_mem, void *convert_mem)
65 {
66    struct timezone v = *(struct timezone*)type_mem;
67
68    eina_error_set(0);
69
70    if (convert == EINA_VALUE_TYPE_UCHAR)
71      {
72         unsigned char other_mem = v.tz_minuteswest;
73         return eina_value_type_pset(convert, convert_mem, &other_mem);
74      }
75    else if (convert == EINA_VALUE_TYPE_USHORT)
76      {
77         unsigned short other_mem = v.tz_minuteswest;
78         return eina_value_type_pset(convert, convert_mem, &other_mem);
79      }
80    else if (convert == EINA_VALUE_TYPE_UINT)
81      {
82         unsigned int other_mem = v.tz_minuteswest;
83         return eina_value_type_pset(convert, convert_mem, &other_mem);
84      }
85    else if ((convert == EINA_VALUE_TYPE_ULONG) || (convert == EINA_VALUE_TYPE_TIMESTAMP))
86      {
87         unsigned long other_mem = v.tz_minuteswest;
88         return eina_value_type_pset(convert, convert_mem, &other_mem);
89      }
90    else if (convert == EINA_VALUE_TYPE_UINT64)
91      {
92         uint64_t other_mem = v.tz_minuteswest;
93         return eina_value_type_pset(convert, convert_mem, &other_mem);
94      }
95    else if (convert == EINA_VALUE_TYPE_CHAR)
96      {
97         char other_mem = v.tz_minuteswest;
98         return eina_value_type_pset(convert, convert_mem, &other_mem);
99      }
100    else if (convert == EINA_VALUE_TYPE_SHORT)
101      {
102         short other_mem = v.tz_minuteswest;
103         return eina_value_type_pset(convert, convert_mem, &other_mem);
104      }
105    else if (convert == EINA_VALUE_TYPE_INT)
106      {
107         int other_mem = v.tz_minuteswest;
108         return eina_value_type_pset(convert, convert_mem, &other_mem);
109      }
110    else if (convert == EINA_VALUE_TYPE_LONG)
111      {
112         long other_mem = v.tz_minuteswest;
113         return eina_value_type_pset(convert, convert_mem, &other_mem);
114      }
115    else if (convert == EINA_VALUE_TYPE_INT64)
116      {
117         int64_t other_mem = v.tz_minuteswest;
118         return eina_value_type_pset(convert, convert_mem, &other_mem);
119      }
120    else if (convert == EINA_VALUE_TYPE_FLOAT)
121      return eina_value_type_pset(convert, convert_mem, &v.tz_minuteswest);
122    else if (convert == EINA_VALUE_TYPE_DOUBLE)
123      return eina_value_type_pset(convert, convert_mem, &v.tz_minuteswest);
124    else if (convert == EINA_VALUE_TYPE_STRINGSHARE ||
125             convert == EINA_VALUE_TYPE_STRING)
126      {
127         const char *other_mem;
128         char buf[64];
129         snprintf(buf, sizeof(buf), "%d", v.tz_minuteswest);
130         other_mem = buf; /* required due &buf == buf */
131         return eina_value_type_pset(convert, convert_mem, &other_mem);
132      }
133
134    eina_error_set(EINA_ERROR_VALUE_FAILED);
135    return EINA_FALSE;
136 }
137
138 static Eina_Value_Type TZ_TYPE = {
139    EINA_VALUE_TYPE_VERSION,
140    sizeof(struct timezone),
141    "struct timezone",
142    _tz_setup,
143    _tz_flush,
144    _tz_copy,
145    _tz_compare,
146    _tz_convert_to,
147    NULL, //No convert from
148    _tz_vset,
149    _tz_pset,
150    _tz_pget
151 };
152
153 int main(int argc, char **argv)
154 {
155    Eina_Value vtv, vtz;
156    struct timeval tv;
157    struct timezone tz;
158    char *s;
159
160    eina_init();
161
162    eina_value_setup(&vtv, EINA_VALUE_TYPE_TIMEVAL);
163    eina_value_setup(&vtz, &TZ_TYPE);
164
165    gettimeofday(&tv, &tz);
166    eina_value_set(&vtv, tv);
167    eina_value_set(&vtz, tz);
168
169    s = eina_value_to_string(&vtv);
170    printf("time: %s\n", s);
171    free(s);
172    s = eina_value_to_string(&vtz);
173    printf("timezone: %s\n", s);
174    free(s);
175
176    eina_value_flush(&vtz);
177    eina_value_flush(&vtv);
178 }