1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2006 The Android Open Source Project
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
8ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkParse.h"
118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic inline bool is_between(int c, int min, int max)
138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return (unsigned)(c - min) <= (unsigned)(max - min);
158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic inline bool is_ws(int c)
188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return is_between(c, 1, 32);
208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic inline bool is_digit(int c)
238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return is_between(c, '0', '9');
258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic inline bool is_sep(int c)
288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return is_ws(c) || c == ',' || c == ';';
308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic int to_hex(int c)
338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (is_digit(c))
358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return c - '0';
368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    c |= 0x20;  // make us lower-case
388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (is_between(c, 'a', 'f'))
398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return c + 10 - 'a';
408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    else
418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return -1;
428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic inline bool is_hex(int c)
458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return to_hex(c) >= 0;
478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic const char* skip_ws(const char str[])
508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(str);
528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    while (is_ws(*str))
538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        str++;
548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return str;
558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic const char* skip_sep(const char str[])
588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(str);
608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    while (is_sep(*str))
618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        str++;
628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return str;
638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
65d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comint SkParse::Count(const char str[])
668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    char c;
688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    int count = 0;
698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    goto skipLeading;
708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    do {
718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        count++;
728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        do {
738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            if ((c = *str++) == '\0')
748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                goto goHome;
758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        } while (is_sep(c) == false);
768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comskipLeading:
778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        do {
788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            if ((c = *str++) == '\0')
798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                goto goHome;
808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        } while (is_sep(c));
818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    } while (true);
828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comgoHome:
838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return count;
848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
86d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comint SkParse::Count(const char str[], char separator)
878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    char c;
898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    int count = 0;
908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    goto skipLeading;
918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    do {
928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        count++;
938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        do {
948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            if ((c = *str++) == '\0')
958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                goto goHome;
968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        } while (c != separator);
978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comskipLeading:
988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        do {
998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            if ((c = *str++) == '\0')
1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                goto goHome;
1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        } while (c == separator);
1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    } while (true);
1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comgoHome:
1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return count;
1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst char* SkParse::FindHex(const char str[], uint32_t* value)
1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(str);
1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    str = skip_ws(str);
1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (!is_hex(*str))
1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return NULL;
1148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t n = 0;
1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    int max_digits = 8;
1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    int digit;
1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    while ((digit = to_hex(*str)) >= 0)
1208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (--max_digits < 0)
1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return NULL;
1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        n = (n << 4) | digit;
1248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        str += 1;
1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (*str == 0 || is_ws(*str))
1288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
1298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (value)
1308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            *value = n;
1318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return str;
1328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
13317b78946096265d80215a6c946286ecaa35ea7edepoger@google.com    return NULL;
1348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst char* SkParse::FindS32(const char str[], int32_t* value)
1378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(str);
1398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    str = skip_ws(str);
1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    int sign = 0;
1428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (*str == '-')
1438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
1448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        sign = -1;
1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        str += 1;
1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (!is_digit(*str))
1498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return NULL;
1508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    int n = 0;
1528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    while (is_digit(*str))
1538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
1548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        n = 10*n + *str - '0';
1558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        str += 1;
1568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (value)
1588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        *value = (n ^ sign) - sign;
1598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return str;
1608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst char* SkParse::FindMSec(const char str[], SkMSec* value)
1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
1648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(str);
1658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    str = skip_ws(str);
1668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    int sign = 0;
1688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (*str == '-')
1698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
1708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        sign = -1;
1718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        str += 1;
1728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (!is_digit(*str))
1758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return NULL;
1768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    int n = 0;
1788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    while (is_digit(*str))
1798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
1808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        n = 10*n + *str - '0';
1818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        str += 1;
1828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    int remaining10s = 3;
1848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (*str == '.') {
1858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        str++;
1868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        while (is_digit(*str))
1878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        {
1888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            n = 10*n + *str - '0';
1898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            str += 1;
1908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            if (--remaining10s == 0)
1918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                break;
1928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
1938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    while (--remaining10s >= 0)
1958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        n *= 10;
1968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (value)
1978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        *value = (n ^ sign) - sign;
1988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return str;
1998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
201a8cf0aa53374337f2c133073db83c1c869b6501creed@android.comconst char* SkParse::FindScalar(const char str[], SkScalar* value) {
2028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(str);
2038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    str = skip_ws(str);
2048f4d2306fa866a26f9448048ff63f692b2ba43aareed@google.com
205a8cf0aa53374337f2c133073db83c1c869b6501creed@android.com    char* stop;
206e191b16fda2f5afea3a90653c1cd4f5a3c436e89reed@android.com    float v = (float)strtod(str, &stop);
207a8cf0aa53374337f2c133073db83c1c869b6501creed@android.com    if (str == stop) {
208a8cf0aa53374337f2c133073db83c1c869b6501creed@android.com        return NULL;
209a8cf0aa53374337f2c133073db83c1c869b6501creed@android.com    }
210a8cf0aa53374337f2c133073db83c1c869b6501creed@android.com    if (value) {
211a8cf0aa53374337f2c133073db83c1c869b6501creed@android.com        *value = v;
212a8cf0aa53374337f2c133073db83c1c869b6501creed@android.com    }
213a8cf0aa53374337f2c133073db83c1c869b6501creed@android.com    return stop;
2148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst char* SkParse::FindScalars(const char str[], SkScalar value[], int count)
2178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
2188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(count >= 0);
2198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (count > 0)
2218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
2228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        for (;;)
2238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        {
2248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            str = SkParse::FindScalar(str, value);
2258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            if (--count == 0 || str == NULL)
2268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                break;
2278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            // keep going
2298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            str = skip_sep(str);
2308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            if (value)
2318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                value += 1;
2328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
2338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
2348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return str;
2358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic bool lookup_str(const char str[], const char** table, int count)
2388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
2398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    while (--count >= 0)
2408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (!strcmp(str, table[count]))
2418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return true;
2428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return false;
2438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SkParse::FindBool(const char str[], bool* value)
2468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
2478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static const char* gYes[] = { "yes", "1", "true" };
2488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static const char* gNo[] = { "no", "0", "false" };
2498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (lookup_str(str, gYes, SK_ARRAY_COUNT(gYes)))
2518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
2528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (value) *value = true;
2538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return true;
2548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
2558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    else if (lookup_str(str, gNo, SK_ARRAY_COUNT(gNo)))
2568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
2578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (value) *value = false;
2588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return true;
2598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
2608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return false;
2618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comint SkParse::FindList(const char target[], const char list[])
2648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
2658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    size_t  len = strlen(target);
2668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    int     index = 0;
2678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    for (;;)
2698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
2708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        const char* end = strchr(list, ',');
2718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        size_t      entryLen;
2728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (end == NULL) // last entry
2748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            entryLen = strlen(list);
2758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        else
2768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            entryLen = end - list;
2778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (entryLen == len && memcmp(target, list, len) == 0)
2798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return index;
2808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (end == NULL)
2818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            break;
2828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        list = end + 1; // skip the ','
2848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        index += 1;
2858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
2868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return -1;
2878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_SUPPORT_UNITTEST
290d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comvoid SkParse::UnitTest()
2918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
2928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // !!! additional parse tests go here
2938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkParse::TestColor();
2948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
296