From b19de09baea0d824c9864b62a52c104f7294bd79 Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Thu, 17 May 2012 09:56:28 +0000 Subject: [PATCH] eina: don't assume that 'char' is a signed type in Eina_Value The eina_value code TYPE_CHAR conversion code assumes that 'char' is a signed type, which is not true on some platforms like ARM and PPC. We need to explicitely use signed chars to make sure the value is correct. Patch by Albin 'Lutin' Tonnerre SVN revision: 71195 --- legacy/eina/ChangeLog | 4 +++ legacy/eina/NEWS | 2 ++ legacy/eina/src/include/eina_inline_value.x | 4 +-- legacy/eina/src/lib/eina_value.c | 30 ++++++++++----------- 4 files changed, 23 insertions(+), 17 deletions(-) diff --git a/legacy/eina/ChangeLog b/legacy/eina/ChangeLog index 7d61e5a902..02b031fd72 100644 --- a/legacy/eina/ChangeLog +++ b/legacy/eina/ChangeLog @@ -274,3 +274,7 @@ 2012-05-08 Cedric Bail * Add eina_file_map_lines to iterate on lines of a mapped file. + +2012-05-17 Albin Tonnerre + + * Fix portability issue of Eina_Value on ARM and PPC. diff --git a/legacy/eina/NEWS b/legacy/eina/NEWS index 5d82a9de87..04dff6356f 100644 --- a/legacy/eina/NEWS +++ b/legacy/eina/NEWS @@ -10,6 +10,8 @@ Additions: Fixes: * Add missing files in the tarball. * Rounding issue with eina_f32p32_cos and eina_f32p32_sin when getting close to 1.0. + * Portability issue with Eina_Value when char are not signed by default (case on ARM + and PPC). Eina 1.2.0 diff --git a/legacy/eina/src/include/eina_inline_value.x b/legacy/eina/src/include/eina_inline_value.x index fa02c1a8cf..4ca10e07ef 100644 --- a/legacy/eina/src/include/eina_inline_value.x +++ b/legacy/eina/src/include/eina_inline_value.x @@ -230,7 +230,7 @@ eina_value_compare(const Eina_Value *a, const Eina_Value *b) } else if (type == EINA_VALUE_TYPE_CHAR) { - char *ta = (char *) pa, *tb = (char *) pb; + signed char *ta = (signed char *) pa, *tb = (signed char *) pb; if (*ta < *tb) return -1; else if (*ta > *tb) @@ -376,7 +376,7 @@ eina_value_vset(Eina_Value *value, va_list args) } else if (type == EINA_VALUE_TYPE_CHAR) { - char *tmem = (char *) mem; + signed char *tmem = (signed char *) mem; *tmem = va_arg(args, int); /* promoted by va_arg */ return EINA_TRUE; } diff --git a/legacy/eina/src/lib/eina_value.c b/legacy/eina/src/lib/eina_value.c index e3c5a9cd33..5f76bbf310 100644 --- a/legacy/eina/src/lib/eina_value.c +++ b/legacy/eina/src/lib/eina_value.c @@ -86,7 +86,7 @@ static int _eina_value_log_dom = -1; static const unsigned char eina_value_uchar_max = 255U; static const char eina_value_char_max = 127; -static const char eina_value_char_min = -127 - 1; +static const signed char eina_value_char_min = -127 - 1; static const unsigned short eina_value_ushort_max = 65535U; static const short eina_value_short_max = 32767; @@ -179,7 +179,7 @@ _eina_value_type_uchar_convert_to(const Eina_Value_Type *type __UNUSED__, const } else if (convert == EINA_VALUE_TYPE_CHAR) { - char other_mem = v; + signed char other_mem = v; if (EINA_UNLIKELY(v > (unsigned char)eina_value_char_max)) return EINA_FALSE; return eina_value_type_pset(convert, convert_mem, &other_mem); @@ -328,7 +328,7 @@ _eina_value_type_ushort_convert_to(const Eina_Value_Type *type __UNUSED__, const } else if (convert == EINA_VALUE_TYPE_CHAR) { - char other_mem = v; + signed char other_mem = v; if (EINA_UNLIKELY(v > (unsigned char)eina_value_char_max)) return EINA_FALSE; return eina_value_type_pset(convert, convert_mem, &other_mem); @@ -481,7 +481,7 @@ _eina_value_type_uint_convert_to(const Eina_Value_Type *type __UNUSED__, const E } else if (convert == EINA_VALUE_TYPE_CHAR) { - char other_mem = v; + signed char other_mem = v; if (EINA_UNLIKELY(v > (unsigned char)eina_value_char_max)) return EINA_FALSE; return eina_value_type_pset(convert, convert_mem, &other_mem); @@ -638,7 +638,7 @@ _eina_value_type_ulong_convert_to(const Eina_Value_Type *type __UNUSED__, const } else if (convert == EINA_VALUE_TYPE_CHAR) { - char other_mem = v; + signed char other_mem = v; if (EINA_UNLIKELY(v > (unsigned char)eina_value_char_max)) return EINA_FALSE; return eina_value_type_pset(convert, convert_mem, &other_mem); @@ -800,7 +800,7 @@ _eina_value_type_uint64_convert_to(const Eina_Value_Type *type __UNUSED__, const } else if (convert == EINA_VALUE_TYPE_CHAR) { - char other_mem = v; + signed char other_mem = v; if (EINA_UNLIKELY(v > (unsigned char)eina_value_char_max)) return EINA_FALSE; return eina_value_type_pset(convert, convert_mem, &other_mem); @@ -965,7 +965,7 @@ _eina_value_type_char_convert_to(const Eina_Value_Type *type __UNUSED__, const E } else if (convert == EINA_VALUE_TYPE_CHAR) { - char other_mem = v; + signed char other_mem = v; return eina_value_type_pset(convert, convert_mem, &other_mem); } else if (convert == EINA_VALUE_TYPE_SHORT) @@ -1122,7 +1122,7 @@ _eina_value_type_short_convert_to(const Eina_Value_Type *type __UNUSED__, const } else if (convert == EINA_VALUE_TYPE_CHAR) { - char other_mem = v; + signed char other_mem = v; if (EINA_UNLIKELY(v < eina_value_char_min)) return EINA_FALSE; if (EINA_UNLIKELY(v > eina_value_char_max)) @@ -1285,7 +1285,7 @@ _eina_value_type_int_convert_to(const Eina_Value_Type *type __UNUSED__, const Ei } else if (convert == EINA_VALUE_TYPE_CHAR) { - char other_mem = v; + signed char other_mem = v; if (EINA_UNLIKELY(v < eina_value_char_min)) return EINA_FALSE; if (EINA_UNLIKELY(v > eina_value_char_max)) @@ -1454,7 +1454,7 @@ _eina_value_type_long_convert_to(const Eina_Value_Type *type __UNUSED__, const E } else if (convert == EINA_VALUE_TYPE_CHAR) { - char other_mem = v; + signed char other_mem = v; if (EINA_UNLIKELY(v < eina_value_char_min)) return EINA_FALSE; if (EINA_UNLIKELY(v > eina_value_char_max)) @@ -1630,7 +1630,7 @@ _eina_value_type_int64_convert_to(const Eina_Value_Type *type __UNUSED__, const } else if (convert == EINA_VALUE_TYPE_CHAR) { - char other_mem = v; + signed char other_mem = v; if (EINA_UNLIKELY(v < eina_value_char_min)) return EINA_FALSE; if (EINA_UNLIKELY(v > eina_value_char_max)) @@ -1812,7 +1812,7 @@ _eina_value_type_float_convert_to(const Eina_Value_Type *type __UNUSED__, const } else if (convert == EINA_VALUE_TYPE_CHAR) { - char other_mem = v; + signed char other_mem = v; if (EINA_UNLIKELY(v < eina_value_char_min)) return EINA_FALSE; if (EINA_UNLIKELY(v > eina_value_char_max)) @@ -1996,7 +1996,7 @@ _eina_value_type_double_convert_to(const Eina_Value_Type *type __UNUSED__, const } else if (convert == EINA_VALUE_TYPE_CHAR) { - char other_mem = v; + signed char other_mem = v; if (EINA_UNLIKELY(v < eina_value_char_min)) return EINA_FALSE; if (EINA_UNLIKELY(v > eina_value_char_max)) @@ -2165,7 +2165,7 @@ _eina_value_type_string_common_convert_to(const Eina_Value_Type *type __UNUSED__ } else if (convert == EINA_VALUE_TYPE_CHAR) { - char other_mem; + signed char other_mem; if ((sscanf(v, "%hhd", &other_mem) != 1) && (sscanf(v, "%hhx", &other_mem) != 1) && (sscanf(v, "%hho", &other_mem) != 1)) @@ -3503,7 +3503,7 @@ _eina_value_type_timeval_convert_to(const Eina_Value_Type *type __UNUSED__, cons } else if (convert == EINA_VALUE_TYPE_CHAR) { - char other_mem = v.tv_sec; + signed char other_mem = v.tv_sec; if (EINA_UNLIKELY(v.tv_sec < eina_value_char_min)) return EINA_FALSE; if (EINA_UNLIKELY(v.tv_sec > eina_value_char_max))