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