1 /* 2 ******************************************************************************* 3 * Copyright (C) 2015, International Business Machines Corporation 4 * and others. All Rights Reserved. 5 ******************************************************************************* 6 * standardplural.cpp 7 * 8 * created on: 2015dec14 9 * created by: Markus W. Scherer 10 */ 11 12 #include "unicode/utypes.h" 13 14 #if !UCONFIG_NO_FORMATTING 15 16 #include "unicode/unistr.h" 17 #include "cstring.h" 18 #include "standardplural.h" 19 #include "uassert.h" 20 21 U_NAMESPACE_BEGIN 22 23 static const char *gKeywords[StandardPlural::COUNT] = { 24 "zero", "one", "two", "few", "many", "other" 25 }; 26 27 const char *StandardPlural::getKeyword(Form p) { 28 U_ASSERT(ZERO <= p && p < COUNT); 29 return gKeywords[p]; 30 } 31 32 int32_t StandardPlural::indexOrNegativeFromString(const char *keyword) { 33 switch (*keyword++) { 34 case 'f': 35 if (uprv_strcmp(keyword, "ew") == 0) { 36 return FEW; 37 } 38 break; 39 case 'm': 40 if (uprv_strcmp(keyword, "any") == 0) { 41 return MANY; 42 } 43 break; 44 case 'o': 45 if (uprv_strcmp(keyword, "ther") == 0) { 46 return OTHER; 47 } else if (uprv_strcmp(keyword, "ne") == 0) { 48 return ONE; 49 } 50 break; 51 case 't': 52 if (uprv_strcmp(keyword, "wo") == 0) { 53 return TWO; 54 } 55 break; 56 case 'z': 57 if (uprv_strcmp(keyword, "ero") == 0) { 58 return ZERO; 59 } 60 break; 61 default: 62 break; 63 } 64 return -1; 65 } 66 67 static const UChar gZero[] = { 0x7A, 0x65, 0x72, 0x6F }; 68 static const UChar gOne[] = { 0x6F, 0x6E, 0x65 }; 69 static const UChar gTwo[] = { 0x74, 0x77, 0x6F }; 70 static const UChar gFew[] = { 0x66, 0x65, 0x77 }; 71 static const UChar gMany[] = { 0x6D, 0x61, 0x6E, 0x79 }; 72 static const UChar gOther[] = { 0x6F, 0x74, 0x68, 0x65, 0x72 }; 73 74 int32_t StandardPlural::indexOrNegativeFromString(const UnicodeString &keyword) { 75 switch (keyword.length()) { 76 case 3: 77 if (keyword.compare(gOne, 3) == 0) { 78 return ONE; 79 } else if (keyword.compare(gTwo, 3) == 0) { 80 return TWO; 81 } else if (keyword.compare(gFew, 3) == 0) { 82 return FEW; 83 } 84 break; 85 case 4: 86 if (keyword.compare(gMany, 4) == 0) { 87 return MANY; 88 } else if (keyword.compare(gZero, 4) == 0) { 89 return ZERO; 90 } 91 break; 92 case 5: 93 if (keyword.compare(gOther, 5) == 0) { 94 return OTHER; 95 } 96 break; 97 default: 98 break; 99 } 100 return -1; 101 } 102 103 int32_t StandardPlural::indexFromString(const char *keyword, UErrorCode &errorCode) { 104 if (U_FAILURE(errorCode)) { return OTHER; } 105 int32_t i = indexOrNegativeFromString(keyword); 106 if (i >= 0) { 107 return i; 108 } else { 109 errorCode = U_ILLEGAL_ARGUMENT_ERROR; 110 return OTHER; 111 } 112 } 113 114 int32_t StandardPlural::indexFromString(const UnicodeString &keyword, UErrorCode &errorCode) { 115 if (U_FAILURE(errorCode)) { return OTHER; } 116 int32_t i = indexOrNegativeFromString(keyword); 117 if (i >= 0) { 118 return i; 119 } else { 120 errorCode = U_ILLEGAL_ARGUMENT_ERROR; 121 return OTHER; 122 } 123 } 124 125 U_NAMESPACE_END 126 127 #endif // !UCONFIG_NO_FORMATTING 128