Evas text utils: Check syntax in color parse
authorJean-Philippe Andre <jp.andre@samsung.com>
Mon, 30 Dec 2013 09:13:32 +0000 (18:13 +0900)
committerJean-Philippe Andre <jp.andre@samsung.com>
Fri, 7 Feb 2014 06:38:42 +0000 (15:38 +0900)
If the color string is not correct (ie. not #RRGGBBAA, #RGBA, #RGB, #RRGGBB),
return an error.

src/lib/evas/common/evas_text_utils.c
src/lib/evas/common/evas_text_utils.h

index a1ea6e5..bb38f48 100644 (file)
@@ -558,11 +558,12 @@ evas_common_text_props_content_create(void *_fi, const Eina_Unicode *text,
  * @return numeric value of HEX.
  */
 static int
-_hex_string_get(char ch)
+_hex_string_get(char ch, Eina_Bool *ok)
 {
    if ((ch >= '0') && (ch <= '9')) return (ch - '0');
    else if ((ch >= 'A') && (ch <= 'F')) return (ch - 'A' + 10);
    else if ((ch >= 'a') && (ch <= 'f')) return (ch - 'a' + 10);
+   *ok = EINA_FALSE;
    return 0;
 }
 
@@ -581,49 +582,54 @@ _hex_string_get(char ch)
  * @param[out] b The Blue value - NOT NULL.
  * @param[out] a The Alpha value - NOT NULL.
  */
-void
+Eina_Bool
 evas_common_format_color_parse(const char *str, int slen,
                                unsigned char *r, unsigned char *g,
                                unsigned char *b, unsigned char *a)
 {
+   Eina_Bool v = EINA_TRUE;
+
    *r = *g = *b = *a = 0;
 
    if (slen == 7) /* #RRGGBB */
      {
-        *r = (_hex_string_get(str[1]) << 4) | (_hex_string_get(str[2]));
-        *g = (_hex_string_get(str[3]) << 4) | (_hex_string_get(str[4]));
-        *b = (_hex_string_get(str[5]) << 4) | (_hex_string_get(str[6]));
+        *r = (_hex_string_get(str[1], &v) << 4) | (_hex_string_get(str[2], &v));
+        *g = (_hex_string_get(str[3], &v) << 4) | (_hex_string_get(str[4], &v));
+        *b = (_hex_string_get(str[5], &v) << 4) | (_hex_string_get(str[6], &v));
         *a = 0xff;
      }
    else if (slen == 9) /* #RRGGBBAA */
      {
-        *r = (_hex_string_get(str[1]) << 4) | (_hex_string_get(str[2]));
-        *g = (_hex_string_get(str[3]) << 4) | (_hex_string_get(str[4]));
-        *b = (_hex_string_get(str[5]) << 4) | (_hex_string_get(str[6]));
-        *a = (_hex_string_get(str[7]) << 4) | (_hex_string_get(str[8]));
+        *r = (_hex_string_get(str[1], &v) << 4) | (_hex_string_get(str[2], &v));
+        *g = (_hex_string_get(str[3], &v) << 4) | (_hex_string_get(str[4], &v));
+        *b = (_hex_string_get(str[5], &v) << 4) | (_hex_string_get(str[6], &v));
+        *a = (_hex_string_get(str[7], &v) << 4) | (_hex_string_get(str[8], &v));
      }
    else if (slen == 4) /* #RGB */
      {
-        *r = _hex_string_get(str[1]);
+        *r = _hex_string_get(str[1], &v);
         *r = (*r << 4) | *r;
-        *g = _hex_string_get(str[2]);
+        *g = _hex_string_get(str[2], &v);
         *g = (*g << 4) | *g;
-        *b = _hex_string_get(str[3]);
+        *b = _hex_string_get(str[3], &v);
         *b = (*b << 4) | *b;
         *a = 0xff;
      }
    else if (slen == 5) /* #RGBA */
      {
-        *r = _hex_string_get(str[1]);
+        *r = _hex_string_get(str[1], &v);
         *r = (*r << 4) | *r;
-        *g = _hex_string_get(str[2]);
+        *g = _hex_string_get(str[2], &v);
         *g = (*g << 4) | *g;
-        *b = _hex_string_get(str[3]);
+        *b = _hex_string_get(str[3], &v);
         *b = (*b << 4) | *b;
-        *a = _hex_string_get(str[4]);
+        *a = _hex_string_get(str[4], &v);
         *a = (*a << 4) | *a;
      }
+   else v = EINA_FALSE;
+
    *r = (*r * *a) / 255;
    *g = (*g * *a) / 255;
    *b = (*b * *a) / 255;
+   return v;
 }
index 96f78ca..e54046d 100644 (file)
@@ -188,6 +188,6 @@ EAPI void
 evas_common_text_props_merge(Evas_Text_Props *item1, const Evas_Text_Props *item2);
 
 /* Common to Textblock and Filters */
-void evas_common_format_color_parse(const char *str, int slen, unsigned char *r, unsigned char *g, unsigned char *b, unsigned char *a);
+Eina_Bool evas_common_format_color_parse(const char *str, int slen, unsigned char *r, unsigned char *g, unsigned char *b, unsigned char *a);
 
 #endif