1/* 2 ******************************************************************************* 3 * 4 * Copyright (C) 2003-2011, International Business Machines 5 * Corporation and others. All Rights Reserved. 6 * 7 ******************************************************************************* 8 * file name: nptrans.h 9 * encoding: US-ASCII 10 * tab size: 8 (not used) 11 * indentation:4 12 * 13 * created on: 2003feb1 14 * created by: Ram Viswanadha 15 */ 16 17#ifndef NPTRANS_H 18#define NPTRANS_H 19 20#include "unicode/utypes.h" 21 22#if !UCONFIG_NO_IDNA 23#if !UCONFIG_NO_TRANSLITERATION 24 25#include "unicode/uniset.h" 26#include "unicode/ures.h" 27#include "unicode/translit.h" 28 29#include "intltest.h" 30 31 32#define ASCII_SPACE 0x0020 33 34class NamePrepTransform { 35 36private : 37 Transliterator *mapping; 38 UnicodeSet unassigned; 39 UnicodeSet prohibited; 40 UnicodeSet labelSeparatorSet; 41 UResourceBundle *bundle; 42 NamePrepTransform(UParseError& parseError, UErrorCode& status); 43 44 45public : 46 47 static NamePrepTransform* createInstance(UParseError& parseError, UErrorCode& status); 48 49 virtual ~NamePrepTransform(); 50 51 52 inline UBool isProhibited(UChar32 ch); 53 54 /** 55 * ICU "poor man's RTTI", returns a UClassID for the actual class. 56 */ 57 inline UClassID getDynamicClassID() const { return getStaticClassID(); } 58 59 /** 60 * ICU "poor man's RTTI", returns a UClassID for this class. 61 */ 62 static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } 63 64 /** 65 * Map every character in input stream with mapping character 66 * in the mapping table and populate the output stream. 67 * For any individual character the mapping table may specify 68 * that that a character be mapped to nothing, mapped to one 69 * other character or to a string of other characters. 70 * 71 * @param src Pointer to UChar buffer containing a single label 72 * @param srcLength Number of characters in the source label 73 * @param dest Pointer to the destination buffer to receive the output 74 * @param destCapacity The capacity of destination array 75 * @param allowUnassigned Unassigned values can be converted to ASCII for query operations 76 * If TRUE unassigned values are treated as normal Unicode code point. 77 * If FALSE the operation fails with U_UNASSIGNED_CODE_POINT_FOUND error code. 78 * @param status ICU error code in/out parameter. 79 * Must fulfill U_SUCCESS before the function call. 80 * @return The number of UChars in the destination buffer 81 */ 82 int32_t map(const UChar* src, int32_t srcLength, 83 UChar* dest, int32_t destCapacity, 84 UBool allowUnassigned, 85 UParseError* parseError, 86 UErrorCode& status ); 87 88 /** 89 * Prepare the input stream with for use. This operation maps, normalizes(NFKC), 90 * checks for prohited and BiDi characters in the order defined by RFC 3454 91 * 92 * @param src Pointer to UChar buffer containing a single label 93 * @param srcLength Number of characters in the source label 94 * @param dest Pointer to the destination buffer to receive the output 95 * @param destCapacity The capacity of destination array 96 * @param allowUnassigned Unassigned values can be converted to ASCII for query operations 97 * If TRUE unassigned values are treated as normal Unicode code point. 98 * If FALSE the operation fails with U_UNASSIGNED_CODE_POINT error code. 99 * @param status ICU error code in/out parameter. 100 * Must fulfill U_SUCCESS before the function call. 101 * @return The number of UChars in the destination buffer 102 */ 103 int32_t process(const UChar* src, int32_t srcLength, 104 UChar* dest, int32_t destCapacity, 105 UBool allowUnassigned, 106 UParseError* parseError, 107 UErrorCode& status ); 108 109 /** 110 * Ascertain if the given code point is a label separator as specified by IDNA 111 * 112 * @return TRUE is the code point is a label separator 113 */ 114 UBool isLabelSeparator(UChar32 ch, UErrorCode& status); 115 116 inline UBool isLDHChar(UChar32 ch); 117 118private: 119 /** 120 * The address of this static class variable serves as this class's ID 121 * for ICU "poor man's RTTI". 122 */ 123 static const char fgClassID; 124}; 125 126inline UBool NamePrepTransform::isLDHChar(UChar32 ch){ 127 // high runner case 128 if(ch>0x007A){ 129 return FALSE; 130 } 131 //[\\u002D \\u0030-\\u0039 \\u0041-\\u005A \\u0061-\\u007A] 132 if( (ch==0x002D) || 133 (0x0030 <= ch && ch <= 0x0039) || 134 (0x0041 <= ch && ch <= 0x005A) || 135 (0x0061 <= ch && ch <= 0x007A) 136 ){ 137 return TRUE; 138 } 139 return FALSE; 140} 141 142#endif /* #if !UCONFIG_NO_TRANSLITERATION */ 143#else 144class NamePrepTransform { 145}; 146#endif /* #if !UCONFIG_NO_IDNA */ 147 148#endif 149 150/* 151 * Hey, Emacs, please set the following: 152 * 153 * Local Variables: 154 * indent-tabs-mode: nil 155 * End: 156 * 157 */ 158