ajwillia-ms pushed a commit to branch master.

http://git.enlightenment.org/tools/examples.git/commit/?id=e45396c48df3633b81caaa9833f85d92a83ed536

commit e45396c48df3633b81caaa9833f85d92a83ed536
Author: Andy Williams <[email protected]>
Date:   Thu Nov 16 09:52:34 2017 +0000

    eina: Add custom eina_value reference using timezone
---
 reference/c/eina/src/eina_value_custom.c | 171 +++++++++++++++++++++++++++++++
 reference/c/eina/src/meson.build         |   7 ++
 2 files changed, 178 insertions(+)

diff --git a/reference/c/eina/src/eina_value_custom.c 
b/reference/c/eina/src/eina_value_custom.c
new file mode 100644
index 0000000..6b309e5
--- /dev/null
+++ b/reference/c/eina/src/eina_value_custom.c
@@ -0,0 +1,171 @@
+#define EFL_EO_API_SUPPORT 1
+#define EFL_BETA_API_SUPPORT 1
+
+#include <stdio.h>
+
+#include <Eina.h>
+#include <Efl_Core.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
+_tz_flush(const Eina_Value_Type *type EINA_UNUSED, void *mem EINA_UNUSED)
+{
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_tz_copy(const Eina_Value_Type *type EINA_UNUSED, const void *src, void * dst)
+{
+   struct timezone *tzsrc = (struct timezone *)src;
+   struct timezone *tzdst = dst;
+   *tzdst = *tzsrc;
+   return EINA_TRUE;
+}
+
+static int
+_tz_compare(const Eina_Value_Type *type EINA_UNUSED, const void *a, const void 
*b)
+{
+   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
+_tz_pset(const Eina_Value_Type *type EINA_UNUSED, void *mem, const void *ptr)
+{
+   *(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
+_tz_convert_to(const Eina_Value_Type *type EINA_UNUSED, const Eina_Value_Type 
*convert, const void *type_mem, void *convert_mem)
+{
+   struct timezone v = *(struct timezone*)type_mem;
+
+   if (convert == EINA_VALUE_TYPE_UCHAR)
+     {
+        unsigned char val_type = v.tz_minuteswest;
+        return eina_value_type_pset(convert, convert_mem, &val_type);
+     }
+   else if (convert == EINA_VALUE_TYPE_USHORT)
+     {
+        unsigned short val_type = v.tz_minuteswest;
+        return eina_value_type_pset(convert, convert_mem, &val_type);
+     }
+   else if (convert == EINA_VALUE_TYPE_UINT)
+     {
+        unsigned int val_type = v.tz_minuteswest;
+        return eina_value_type_pset(convert, convert_mem, &val_type);
+     }
+   else if ((convert == EINA_VALUE_TYPE_ULONG) || (convert == 
EINA_VALUE_TYPE_TIMESTAMP))
+     {
+        unsigned long val_type = v.tz_minuteswest;
+        return eina_value_type_pset(convert, convert_mem, &val_type);
+     }
+   else if (convert == EINA_VALUE_TYPE_UINT64)
+     {
+        uint64_t val_type = v.tz_minuteswest;
+        return eina_value_type_pset(convert, convert_mem, &val_type);
+     }
+   else if (convert == EINA_VALUE_TYPE_CHAR)
+     {
+        char val_type = v.tz_minuteswest;
+        return eina_value_type_pset(convert, convert_mem, &val_type);
+     }
+   else if (convert == EINA_VALUE_TYPE_SHORT)
+     {
+        short val_type = v.tz_minuteswest;
+        return eina_value_type_pset(convert, convert_mem, &val_type);
+     }
+   else if (convert == EINA_VALUE_TYPE_INT)
+     {
+        int val_type = v.tz_minuteswest;
+        return eina_value_type_pset(convert, convert_mem, &val_type);
+     }
+   else if (convert == EINA_VALUE_TYPE_LONG)
+     {
+        long val_type = v.tz_minuteswest;
+        return eina_value_type_pset(convert, convert_mem, &val_type);
+     }
+   else if (convert == EINA_VALUE_TYPE_INT64)
+     {
+        int64_t val_type = v.tz_minuteswest;
+        return eina_value_type_pset(convert, convert_mem, &val_type);
+     }
+   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 *buf;
+        buf = eina_slstr_printf("+%03dh", v.tz_minuteswest);
+        return eina_value_type_pset(convert, convert_mem, &buf);
+     }
+   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
+};
+
+EAPI_MAIN void
+efl_main(void *data EINA_UNUSED, const Efl_Event *ev EINA_UNUSED)
+{
+   Eina_Value value_tz;
+   struct timeval time;
+   struct timezone zone;
+   char *s;
+
+   eina_value_setup(&value_tz, &TZ_TYPE);
+
+   gettimeofday(&time, &zone);
+   eina_value_set(&value_tz, zone);
+
+   s = eina_value_to_string(&value_tz);
+   printf("Current timezone: %s\n", s);
+   free(s);
+
+   eina_value_free(&value_tz);
+
+   efl_exit(0);
+}
+EFL_MAIN()
+
diff --git a/reference/c/eina/src/meson.build b/reference/c/eina/src/meson.build
index 6872fbd..29a640a 100644
--- a/reference/c/eina/src/meson.build
+++ b/reference/c/eina/src/meson.build
@@ -34,3 +34,10 @@ executable('efl_reference_eina_value',
   include_directories : inc,
   install : true
 )
+
+executable('efl_reference_eina_value_custom',
+  files(['eina_value_custom.c']),
+  dependencies : deps,
+  include_directories : inc,
+  install : true
+)

-- 


Reply via email to