1 // Copyright 2011 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef V8_CHAR_PREDICATES_INL_H_ 6 #define V8_CHAR_PREDICATES_INL_H_ 7 8 #include "src/char-predicates.h" 9 10 namespace v8 { 11 namespace internal { 12 13 14 // If c is in 'A'-'Z' or 'a'-'z', return its lower-case. 15 // Else, return something outside of 'A'-'Z' and 'a'-'z'. 16 // Note: it ignores LOCALE. 17 inline int AsciiAlphaToLower(uc32 c) { 18 return c | 0x20; 19 } 20 21 22 inline bool IsCarriageReturn(uc32 c) { 23 return c == 0x000D; 24 } 25 26 27 inline bool IsLineFeed(uc32 c) { 28 return c == 0x000A; 29 } 30 31 32 inline bool IsInRange(int value, int lower_limit, int higher_limit) { 33 ASSERT(lower_limit <= higher_limit); 34 return static_cast<unsigned int>(value - lower_limit) <= 35 static_cast<unsigned int>(higher_limit - lower_limit); 36 } 37 38 39 inline bool IsDecimalDigit(uc32 c) { 40 // ECMA-262, 3rd, 7.8.3 (p 16) 41 return IsInRange(c, '0', '9'); 42 } 43 44 45 inline bool IsHexDigit(uc32 c) { 46 // ECMA-262, 3rd, 7.6 (p 15) 47 return IsDecimalDigit(c) || IsInRange(AsciiAlphaToLower(c), 'a', 'f'); 48 } 49 50 51 inline bool IsOctalDigit(uc32 c) { 52 // ECMA-262, 6th, 7.8.3 53 return IsInRange(c, '0', '7'); 54 } 55 56 57 inline bool IsBinaryDigit(uc32 c) { 58 // ECMA-262, 6th, 7.8.3 59 return c == '0' || c == '1'; 60 } 61 62 63 inline bool IsRegExpWord(uc16 c) { 64 return IsInRange(AsciiAlphaToLower(c), 'a', 'z') 65 || IsDecimalDigit(c) 66 || (c == '_'); 67 } 68 69 70 inline bool IsRegExpNewline(uc16 c) { 71 switch (c) { 72 // CR LF LS PS 73 case 0x000A: case 0x000D: case 0x2028: case 0x2029: 74 return false; 75 default: 76 return true; 77 } 78 } 79 80 81 } } // namespace v8::internal 82 83 #endif // V8_CHAR_PREDICATES_INL_H_ 84