| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2011 The Android Open Source Project | 2 * Copyright 2011 The Android Open Source Project |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #ifndef SkFontMgr_android_parser_DEFINED | 8 #ifndef SkFontMgr_android_parser_DEFINED |
| 9 #define SkFontMgr_android_parser_DEFINED | 9 #define SkFontMgr_android_parser_DEFINED |
| 10 | 10 |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 119 | 119 |
| 120 } // SkFontMgr_Android_Parser namespace | 120 } // SkFontMgr_Android_Parser namespace |
| 121 | 121 |
| 122 | 122 |
| 123 /** Parses a null terminated string into an integer type, checking for overflow. | 123 /** Parses a null terminated string into an integer type, checking for overflow. |
| 124 * http://www.w3.org/TR/html-markup/datatypes.html#common.data.integer.non-nega
tive-def | 124 * http://www.w3.org/TR/html-markup/datatypes.html#common.data.integer.non-nega
tive-def |
| 125 * | 125 * |
| 126 * If the string cannot be parsed into 'value', returns false and does not chan
ge 'value'. | 126 * If the string cannot be parsed into 'value', returns false and does not chan
ge 'value'. |
| 127 */ | 127 */ |
| 128 template <typename T> static bool parse_non_negative_integer(const char* s, T* v
alue) { | 128 template <typename T> static bool parse_non_negative_integer(const char* s, T* v
alue) { |
| 129 SK_COMPILE_ASSERT(std::numeric_limits<T>::is_integer, T_must_be_integer); | 129 static_assert(std::numeric_limits<T>::is_integer, "T_must_be_integer"); |
| 130 | 130 |
| 131 if (*s == '\0') { | 131 if (*s == '\0') { |
| 132 return false; | 132 return false; |
| 133 } | 133 } |
| 134 | 134 |
| 135 const T nMax = std::numeric_limits<T>::max() / 10; | 135 const T nMax = std::numeric_limits<T>::max() / 10; |
| 136 const T dMax = std::numeric_limits<T>::max() - (nMax * 10); | 136 const T dMax = std::numeric_limits<T>::max() - (nMax * 10); |
| 137 T n = 0; | 137 T n = 0; |
| 138 for (; *s; ++s) { | 138 for (; *s; ++s) { |
| 139 // Check if digit | 139 // Check if digit |
| (...skipping 16 matching lines...) Expand all Loading... |
| 156 * Like http://www.w3.org/TR/html-markup/datatypes.html#common.data.float-def , | 156 * Like http://www.w3.org/TR/html-markup/datatypes.html#common.data.float-def , |
| 157 * but may start with '.' and does not support 'e'. '-?((:digit:+(.:digit:+)?)|
(.:digit:+))' | 157 * but may start with '.' and does not support 'e'. '-?((:digit:+(.:digit:+)?)|
(.:digit:+))' |
| 158 * | 158 * |
| 159 * Checks for overflow. | 159 * Checks for overflow. |
| 160 * Low bit rounding is not defined (is currently truncate). | 160 * Low bit rounding is not defined (is currently truncate). |
| 161 * Bias (N) required to allow for the sign bit and 4 bits of integer. | 161 * Bias (N) required to allow for the sign bit and 4 bits of integer. |
| 162 * | 162 * |
| 163 * If the string cannot be parsed into 'value', returns false and does not chan
ge 'value'. | 163 * If the string cannot be parsed into 'value', returns false and does not chan
ge 'value'. |
| 164 */ | 164 */ |
| 165 template <int N, typename T> static bool parse_fixed(const char* s, T* value) { | 165 template <int N, typename T> static bool parse_fixed(const char* s, T* value) { |
| 166 SK_COMPILE_ASSERT(std::numeric_limits<T>::is_integer, T_must_be_integer); | 166 static_assert(std::numeric_limits<T>::is_integer, "T_must_be_integer"); |
| 167 SK_COMPILE_ASSERT(std::numeric_limits<T>::is_signed, T_must_be_signed); | 167 static_assert(std::numeric_limits<T>::is_signed, "T_must_be_signed"); |
| 168 SK_COMPILE_ASSERT(sizeof(T) * CHAR_BIT - N >= 5, N_must_leave_four_bits_plus
_sign); | 168 static_assert(sizeof(T) * CHAR_BIT - N >= 5, "N_must_leave_four_bits_plus_si
gn"); |
| 169 | 169 |
| 170 bool negate = false; | 170 bool negate = false; |
| 171 if (*s == '-') { | 171 if (*s == '-') { |
| 172 ++s; | 172 ++s; |
| 173 negate = true; | 173 negate = true; |
| 174 } | 174 } |
| 175 if (*s == '\0') { | 175 if (*s == '\0') { |
| 176 return false; | 176 return false; |
| 177 } | 177 } |
| 178 | 178 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 209 } | 209 } |
| 210 if (negate) { | 210 if (negate) { |
| 211 n = -n; | 211 n = -n; |
| 212 frac = -frac; | 212 frac = -frac; |
| 213 } | 213 } |
| 214 *value = (n << N) + frac; | 214 *value = (n << N) + frac; |
| 215 return true; | 215 return true; |
| 216 } | 216 } |
| 217 | 217 |
| 218 #endif /* SkFontMgr_android_parser_DEFINED */ | 218 #endif /* SkFontMgr_android_parser_DEFINED */ |
| OLD | NEW |