aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/eina/src/include/eina_inline_value.x
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/eina/src/include/eina_inline_value.x')
-rw-r--r--libraries/eina/src/include/eina_inline_value.x281
1 files changed, 183 insertions, 98 deletions
diff --git a/libraries/eina/src/include/eina_inline_value.x b/libraries/eina/src/include/eina_inline_value.x
index 59ec315..33c83f5 100644
--- a/libraries/eina/src/include/eina_inline_value.x
+++ b/libraries/eina/src/include/eina_inline_value.x
@@ -19,8 +19,8 @@
19#ifndef EINA_INLINE_VALUE_X_ 19#ifndef EINA_INLINE_VALUE_X_
20#define EINA_INLINE_VALUE_X_ 20#define EINA_INLINE_VALUE_X_
21 21
22#include <stdlib.h>
22#include <string.h> 23#include <string.h>
23#include <alloca.h>
24 24
25#include "eina_stringshare.h" 25#include "eina_stringshare.h"
26 26
@@ -210,7 +210,7 @@ eina_value_compare(const Eina_Value *a, const Eina_Value *b)
210 return 1; 210 return 1;
211 return 0; 211 return 0;
212 } 212 }
213 else if (type == EINA_VALUE_TYPE_ULONG) 213 else if ((type == EINA_VALUE_TYPE_ULONG) || (type == EINA_VALUE_TYPE_TIMESTAMP))
214 { 214 {
215 unsigned long *ta = (unsigned long *) pa, *tb = (unsigned long *) pb; 215 unsigned long *ta = (unsigned long *) pa, *tb = (unsigned long *) pb;
216 if (*ta < *tb) 216 if (*ta < *tb)
@@ -362,7 +362,7 @@ eina_value_vset(Eina_Value *value, va_list args)
362 *tmem = va_arg(args, unsigned int); 362 *tmem = va_arg(args, unsigned int);
363 return EINA_TRUE; 363 return EINA_TRUE;
364 } 364 }
365 else if (type == EINA_VALUE_TYPE_ULONG) 365 else if ((type == EINA_VALUE_TYPE_ULONG) || (type == EINA_VALUE_TYPE_TIMESTAMP))
366 { 366 {
367 unsigned long *tmem = (unsigned long *) mem; 367 unsigned long *tmem = (unsigned long *) mem;
368 *tmem = va_arg(args, unsigned long); 368 *tmem = va_arg(args, unsigned long);
@@ -424,17 +424,22 @@ eina_value_vset(Eina_Value *value, va_list args)
424 else if (type == EINA_VALUE_TYPE_STRING) 424 else if (type == EINA_VALUE_TYPE_STRING)
425 { 425 {
426 const char *str = (const char *) va_arg(args, const char *); 426 const char *str = (const char *) va_arg(args, const char *);
427 free(value->value.ptr); 427 if (value->value.ptr == str) return EINA_TRUE;
428 if (!str) 428 if (!str)
429 value->value.ptr = NULL; 429 {
430 free(value->value.ptr);
431 value->value.ptr = NULL;
432 }
430 else 433 else
431 { 434 {
432 value->value.ptr = strdup(str); 435 char *tmp = strdup(str);
433 if (!value->value.ptr) 436 if (!tmp)
434 { 437 {
435 eina_error_set(EINA_ERROR_OUT_OF_MEMORY); 438 eina_error_set(EINA_ERROR_OUT_OF_MEMORY);
436 return EINA_FALSE; 439 return EINA_FALSE;
437 } 440 }
441 free(value->value.ptr);
442 value->value.ptr = tmp;
438 } 443 }
439 return EINA_TRUE; 444 return EINA_TRUE;
440 } 445 }
@@ -494,18 +499,22 @@ eina_value_pset(Eina_Value *value, const void *ptr)
494 { 499 {
495 const char * const * pstr = (const char * const *) ptr; 500 const char * const * pstr = (const char * const *) ptr;
496 const char *str = *pstr; 501 const char *str = *pstr;
497 502 if (value->value.ptr == str) return EINA_TRUE;
498 free(value->value.ptr);
499 if (!str) 503 if (!str)
500 value->value.ptr = NULL; 504 {
505 free(value->value.ptr);
506 value->value.ptr = NULL;
507 }
501 else 508 else
502 { 509 {
503 value->value.ptr = strdup(str); 510 char *tmp = strdup(str);
504 if (!value->value.ptr) 511 if (!tmp)
505 { 512 {
506 eina_error_set(EINA_ERROR_OUT_OF_MEMORY); 513 eina_error_set(EINA_ERROR_OUT_OF_MEMORY);
507 return EINA_FALSE; 514 return EINA_FALSE;
508 } 515 }
516 free(value->value.ptr);
517 value->value.ptr = tmp;
509 } 518 }
510 return EINA_TRUE; 519 return EINA_TRUE;
511 } 520 }
@@ -607,16 +616,7 @@ eina_value_array_vset(Eina_Value *value, unsigned int position, va_list args)
607 if (!mem) 616 if (!mem)
608 return EINA_FALSE; 617 return EINA_FALSE;
609 618
610 eina_value_type_flush(desc.subtype, mem); 619 return eina_value_type_vset(desc.subtype, mem, args);
611
612 if (!eina_value_type_setup(desc.subtype, mem)) goto error_setup;
613 if (!eina_value_type_vset(desc.subtype, mem, args)) goto error_set;
614 return EINA_TRUE;
615
616 error_set:
617 eina_value_type_flush(desc.subtype, mem);
618 error_setup:
619 return EINA_FALSE;
620} 620}
621 621
622static inline Eina_Bool 622static inline Eina_Bool
@@ -749,16 +749,7 @@ eina_value_array_pset(Eina_Value *value, unsigned int position, const void *ptr)
749 if (!mem) 749 if (!mem)
750 return EINA_FALSE; 750 return EINA_FALSE;
751 751
752 eina_value_type_flush(desc.subtype, mem); 752 return eina_value_type_pset(desc.subtype, mem, ptr);
753
754 if (!eina_value_type_setup(desc.subtype, mem)) goto error_setup;
755 if (!eina_value_type_pset(desc.subtype, mem, ptr)) goto error_set;
756 return EINA_TRUE;
757
758 error_set:
759 eina_value_type_flush(desc.subtype, mem);
760 error_setup:
761 return EINA_FALSE;
762} 753}
763 754
764static inline Eina_Bool 755static inline Eina_Bool
@@ -832,6 +823,29 @@ eina_value_array_pappend(Eina_Value *value, const void *ptr)
832 return EINA_FALSE; 823 return EINA_FALSE;
833} 824}
834 825
826static inline Eina_Bool
827eina_value_array_value_get(const Eina_Value *src, unsigned int position, Eina_Value *dst)
828{
829 Eina_Value_Array desc;
830
831 EINA_VALUE_TYPE_ARRAY_CHECK_RETURN_VAL(src, EINA_FALSE);
832 EINA_SAFETY_ON_NULL_RETURN_VAL(dst, EINA_FALSE);
833
834 if (!eina_value_pget(src, &desc))
835 return EINA_FALSE;
836 if (position >= eina_inarray_count(desc.array))
837 return EINA_FALSE;
838 if (!eina_value_setup(dst, desc.subtype))
839 return EINA_FALSE;
840 if (!eina_value_pset(dst, eina_inarray_nth(desc.array, position)))
841 {
842 eina_value_flush(dst);
843 return EINA_FALSE;
844 }
845
846 return EINA_TRUE;
847}
848
835#undef EINA_VALUE_TYPE_ARRAY_CHECK_RETURN_VAL 849#undef EINA_VALUE_TYPE_ARRAY_CHECK_RETURN_VAL
836 850
837#define EINA_VALUE_TYPE_LIST_CHECK_RETURN_VAL(value, retval) \ 851#define EINA_VALUE_TYPE_LIST_CHECK_RETURN_VAL(value, retval) \
@@ -929,16 +943,7 @@ eina_value_list_vset(Eina_Value *value, unsigned int position, va_list args)
929 if (!mem) 943 if (!mem)
930 return EINA_FALSE; 944 return EINA_FALSE;
931 945
932 eina_value_type_flush(desc->subtype, mem); 946 return eina_value_type_vset(desc->subtype, mem, args);
933
934 if (!eina_value_type_setup(desc->subtype, mem)) goto error_setup;
935 if (!eina_value_type_vset(desc->subtype, mem, args)) goto error_set;
936 return EINA_TRUE;
937
938 error_set:
939 eina_value_type_flush(desc->subtype, mem);
940 error_setup:
941 return EINA_FALSE;
942} 947}
943 948
944static inline Eina_Bool 949static inline Eina_Bool
@@ -1105,16 +1110,7 @@ eina_value_list_pset(Eina_Value *value, unsigned int position, const void *ptr)
1105 if (!mem) 1110 if (!mem)
1106 return EINA_FALSE; 1111 return EINA_FALSE;
1107 1112
1108 eina_value_type_flush(desc->subtype, mem); 1113 return eina_value_type_pset(desc->subtype, mem, ptr);
1109
1110 if (!eina_value_type_setup(desc->subtype, mem)) goto error_setup;
1111 if (!eina_value_type_pset(desc->subtype, mem, ptr)) goto error_set;
1112 return EINA_TRUE;
1113
1114 error_set:
1115 eina_value_type_flush(desc->subtype, mem);
1116 error_setup:
1117 return EINA_FALSE;
1118} 1114}
1119 1115
1120static inline Eina_Bool 1116static inline Eina_Bool
@@ -1284,9 +1280,7 @@ eina_value_hash_vset(Eina_Value *value, const char *key, va_list args)
1284 return EINA_FALSE; 1280 return EINA_FALSE;
1285 1281
1286 mem = eina_hash_find(desc->hash, key); 1282 mem = eina_hash_find(desc->hash, key);
1287 if (mem) 1283 if (!mem)
1288 eina_value_type_flush(desc->subtype, mem);
1289 else
1290 { 1284 {
1291 mem = malloc(desc->subtype->value_size); 1285 mem = malloc(desc->subtype->value_size);
1292 if (!mem) 1286 if (!mem)
@@ -1299,18 +1293,15 @@ eina_value_hash_vset(Eina_Value *value, const char *key, va_list args)
1299 free(mem); 1293 free(mem);
1300 return EINA_FALSE; 1294 return EINA_FALSE;
1301 } 1295 }
1296 if (!eina_value_type_setup(desc->subtype, mem))
1297 {
1298 eina_value_type_flush(desc->subtype, mem);
1299 eina_hash_del_by_key(desc->hash, key);
1300 free(mem);
1301 }
1302 } 1302 }
1303 1303
1304 if (!eina_value_type_setup(desc->subtype, mem)) goto error_setup; 1304 return eina_value_type_vset(desc->subtype, mem, args);
1305 if (!eina_value_type_vset(desc->subtype, mem, args)) goto error_set;
1306 return EINA_TRUE;
1307
1308 error_set:
1309 eina_value_type_flush(desc->subtype, mem);
1310 error_setup:
1311 eina_hash_del_by_key(desc->hash, key);
1312 free(mem);
1313 return EINA_FALSE;
1314} 1305}
1315 1306
1316static inline Eina_Bool 1307static inline Eina_Bool
@@ -1371,9 +1362,7 @@ eina_value_hash_pset(Eina_Value *value, const char *key, const void *ptr)
1371 return EINA_FALSE; 1362 return EINA_FALSE;
1372 1363
1373 mem = eina_hash_find(desc->hash, key); 1364 mem = eina_hash_find(desc->hash, key);
1374 if (mem) 1365 if (!mem)
1375 eina_value_type_flush(desc->subtype, mem);
1376 else
1377 { 1366 {
1378 mem = malloc(desc->subtype->value_size); 1367 mem = malloc(desc->subtype->value_size);
1379 if (!mem) 1368 if (!mem)
@@ -1386,18 +1375,15 @@ eina_value_hash_pset(Eina_Value *value, const char *key, const void *ptr)
1386 free(mem); 1375 free(mem);
1387 return EINA_FALSE; 1376 return EINA_FALSE;
1388 } 1377 }
1378 if (!eina_value_type_setup(desc->subtype, mem))
1379 {
1380 eina_value_type_flush(desc->subtype, mem);
1381 eina_hash_del_by_key(desc->hash, key);
1382 free(mem);
1383 }
1389 } 1384 }
1390 1385
1391 if (!eina_value_type_setup(desc->subtype, mem)) goto error_setup; 1386 return eina_value_type_pset(desc->subtype, mem, ptr);
1392 if (!eina_value_type_pset(desc->subtype, mem, ptr)) goto error_set;
1393 return EINA_TRUE;
1394
1395 error_set:
1396 eina_value_type_flush(desc->subtype, mem);
1397 error_setup:
1398 eina_hash_del_by_key(desc->hash, key);
1399 free(mem);
1400 return EINA_FALSE;
1401} 1387}
1402 1388
1403static inline Eina_Bool 1389static inline Eina_Bool
@@ -1474,15 +1460,7 @@ eina_value_struct_vset(Eina_Value *value, const char *name, va_list args)
1474 if (!mem) 1460 if (!mem)
1475 return EINA_FALSE; 1461 return EINA_FALSE;
1476 1462
1477 eina_value_type_flush(member->type, mem); 1463 return eina_value_type_vset(member->type, mem, args);
1478 if (!eina_value_type_setup(member->type, mem)) goto error_setup;
1479 if (!eina_value_type_vset(member->type, mem, args)) goto error_set;
1480 return EINA_TRUE;
1481
1482 error_set:
1483 eina_value_type_flush(member->type, mem);
1484 error_setup:
1485 return EINA_FALSE;
1486} 1464}
1487 1465
1488static inline Eina_Bool 1466static inline Eina_Bool
@@ -1540,8 +1518,9 @@ eina_value_struct_pset(Eina_Value *value, const char *name, const void *ptr)
1540 Eina_Value_Struct *st; 1518 Eina_Value_Struct *st;
1541 void *mem; 1519 void *mem;
1542 1520
1543 EINA_VALUE_TYPE_STRUCT_CHECK_RETURN_VAL(value, 0); 1521 EINA_VALUE_TYPE_STRUCT_CHECK_RETURN_VAL(value, EINA_FALSE);
1544 EINA_SAFETY_ON_NULL_RETURN_VAL(name, EINA_FALSE); 1522 EINA_SAFETY_ON_NULL_RETURN_VAL(name, EINA_FALSE);
1523 EINA_SAFETY_ON_NULL_RETURN_VAL(ptr, EINA_FALSE);
1545 st = (Eina_Value_Struct *)eina_value_memory_get(value); 1524 st = (Eina_Value_Struct *)eina_value_memory_get(value);
1546 if (!st) 1525 if (!st)
1547 return EINA_FALSE; 1526 return EINA_FALSE;
@@ -1552,15 +1531,7 @@ eina_value_struct_pset(Eina_Value *value, const char *name, const void *ptr)
1552 if (!mem) 1531 if (!mem)
1553 return EINA_FALSE; 1532 return EINA_FALSE;
1554 1533
1555 eina_value_type_flush(member->type, mem); 1534 return eina_value_type_pset(member->type, mem, ptr);
1556 if (!eina_value_type_setup(member->type, mem)) goto error_setup;
1557 if (!eina_value_type_pset(member->type, mem, ptr)) goto error_set;
1558 return EINA_TRUE;
1559
1560 error_set:
1561 eina_value_type_flush(member->type, mem);
1562 error_setup:
1563 return EINA_FALSE;
1564} 1535}
1565 1536
1566static inline Eina_Bool 1537static inline Eina_Bool
@@ -1571,8 +1542,9 @@ eina_value_struct_pget(const Eina_Value *value, const char *name, void *ptr)
1571 const void *mem; 1542 const void *mem;
1572 Eina_Bool ret; 1543 Eina_Bool ret;
1573 1544
1574 EINA_VALUE_TYPE_STRUCT_CHECK_RETURN_VAL(value, 0); 1545 EINA_VALUE_TYPE_STRUCT_CHECK_RETURN_VAL(value, EINA_FALSE);
1575 EINA_SAFETY_ON_NULL_RETURN_VAL(name, EINA_FALSE); 1546 EINA_SAFETY_ON_NULL_RETURN_VAL(name, EINA_FALSE);
1547 EINA_SAFETY_ON_NULL_RETURN_VAL(ptr, EINA_FALSE);
1576 st = (const Eina_Value_Struct *)eina_value_memory_get(value); 1548 st = (const Eina_Value_Struct *)eina_value_memory_get(value);
1577 if (!st) 1549 if (!st)
1578 return EINA_FALSE; 1550 return EINA_FALSE;
@@ -1586,6 +1558,119 @@ eina_value_struct_pget(const Eina_Value *value, const char *name, void *ptr)
1586 ret = eina_value_type_pget(member->type, mem, ptr); 1558 ret = eina_value_type_pget(member->type, mem, ptr);
1587 return ret; 1559 return ret;
1588} 1560}
1561
1562static inline Eina_Bool
1563eina_value_struct_value_get(const Eina_Value *src, const char *name, Eina_Value *dst)
1564{
1565 const Eina_Value_Struct_Member *member;
1566 const Eina_Value_Struct *st;
1567 const void *mem;
1568
1569 EINA_VALUE_TYPE_STRUCT_CHECK_RETURN_VAL(src, EINA_FALSE);
1570 EINA_SAFETY_ON_NULL_RETURN_VAL(name, EINA_FALSE);
1571 EINA_SAFETY_ON_NULL_RETURN_VAL(dst, EINA_FALSE);
1572 st = (const Eina_Value_Struct *)eina_value_memory_get(src);
1573 if (!st)
1574 return EINA_FALSE;
1575 member = eina_value_struct_member_find(st, name);
1576 if (!member)
1577 return EINA_FALSE;
1578 mem = eina_value_struct_member_memory_get(st, member);
1579 if (!mem)
1580 return EINA_FALSE;
1581 if (!eina_value_setup(dst, member->type))
1582 return EINA_FALSE;
1583 if (!eina_value_pset(dst, mem))
1584 {
1585 eina_value_flush(dst);
1586 return EINA_FALSE;
1587 }
1588 return EINA_TRUE;
1589}
1590
1591static inline Eina_Bool
1592eina_value_struct_value_set(Eina_Value *dst, const char *name, const Eina_Value *src)
1593{
1594 const Eina_Value_Struct_Member *member;
1595 Eina_Value_Struct *st;
1596 void *mem;
1597 const void *ptr;
1598
1599 EINA_VALUE_TYPE_STRUCT_CHECK_RETURN_VAL(dst, EINA_FALSE);
1600 EINA_SAFETY_ON_NULL_RETURN_VAL(name, EINA_FALSE);
1601 EINA_SAFETY_ON_NULL_RETURN_VAL(src, EINA_FALSE);
1602
1603 st = (Eina_Value_Struct *)eina_value_memory_get(dst);
1604 if (!st)
1605 return EINA_FALSE;
1606 member = eina_value_struct_member_find(st, name);
1607 if (!member)
1608 return EINA_FALSE;
1609 EINA_SAFETY_ON_FALSE_RETURN_VAL(src->type == member->type, EINA_FALSE);
1610
1611 mem = eina_value_struct_member_memory_get(st, member);
1612 if (!mem)
1613 return EINA_FALSE;
1614
1615 ptr = eina_value_memory_get(src);
1616 if (!ptr)
1617 return EINA_FALSE;
1618
1619 return eina_value_type_pset(member->type, mem, ptr);
1620}
1621
1622static inline Eina_Bool
1623eina_value_struct_member_value_get(const Eina_Value *src, const Eina_Value_Struct_Member *member, Eina_Value *dst)
1624{
1625 const Eina_Value_Struct *st;
1626 const void *mem;
1627
1628 EINA_VALUE_TYPE_STRUCT_CHECK_RETURN_VAL(src, EINA_FALSE);
1629 EINA_SAFETY_ON_NULL_RETURN_VAL(member, EINA_FALSE);
1630 EINA_SAFETY_ON_NULL_RETURN_VAL(dst, EINA_FALSE);
1631 st = (const Eina_Value_Struct *)eina_value_memory_get(src);
1632 if (!st)
1633 return EINA_FALSE;
1634 mem = eina_value_struct_member_memory_get(st, member);
1635 if (!mem)
1636 return EINA_FALSE;
1637 if (!eina_value_setup(dst, member->type))
1638 return EINA_FALSE;
1639 if (!eina_value_pset(dst, mem))
1640 {
1641 eina_value_flush(dst);
1642 return EINA_FALSE;
1643 }
1644 return EINA_TRUE;
1645}
1646
1647static inline Eina_Bool
1648eina_value_struct_member_value_set(Eina_Value *dst, const Eina_Value_Struct_Member *member, const Eina_Value *src)
1649{
1650 Eina_Value_Struct *st;
1651 void *mem;
1652 const void *ptr;
1653
1654 EINA_VALUE_TYPE_STRUCT_CHECK_RETURN_VAL(dst, EINA_FALSE);
1655 EINA_SAFETY_ON_NULL_RETURN_VAL(member, EINA_FALSE);
1656 EINA_SAFETY_ON_NULL_RETURN_VAL(src, EINA_FALSE);
1657
1658 st = (Eina_Value_Struct *)eina_value_memory_get(dst);
1659 if (!st)
1660 return EINA_FALSE;
1661 EINA_SAFETY_ON_FALSE_RETURN_VAL(src->type == member->type, EINA_FALSE);
1662
1663 mem = eina_value_struct_member_memory_get(st, member);
1664 if (!mem)
1665 return EINA_FALSE;
1666
1667 ptr = eina_value_memory_get(src);
1668 if (!ptr)
1669 return EINA_FALSE;
1670
1671 return eina_value_type_pset(member->type, mem, ptr);
1672}
1673
1589#undef EINA_VALUE_TYPE_STRUCT_CHECK_RETURN_VAL 1674#undef EINA_VALUE_TYPE_STRUCT_CHECK_RETURN_VAL
1590 1675
1591 1676