- BOOL bResult;\r
- punycode_uint* pUnicode;\r
- punycode_uint* p;\r
- BOOL bNeeded;\r
- LPCSTR InputString;\r
- punycode_uint Length;\r
- punycode_uint OutputLength;\r
- bResult = FALSE;\r
- if(pUnicode = malloc(sizeof(punycode_uint) * strlen(Input)))\r
- {\r
- p = pUnicode;\r
- bNeeded = FALSE;\r
- InputString = Input;\r
- Length = 0;\r
- while(*InputString != '\0')\r
- {\r
- *p = 0;\r
- if((*InputString & 0x80) == 0x00)\r
- *p |= (punycode_uint)*InputString & 0x7f;\r
- else if((*InputString & 0xe0) == 0xc0)\r
- *p |= (punycode_uint)*InputString & 0x1f;\r
- else if((*InputString & 0xf0) == 0xe0)\r
- *p |= (punycode_uint)*InputString & 0x0f;\r
- else if((*InputString & 0xf8) == 0xf0)\r
- *p |= (punycode_uint)*InputString & 0x07;\r
- else if((*InputString & 0xfc) == 0xf8)\r
- *p |= (punycode_uint)*InputString & 0x03;\r
- else if((*InputString & 0xfe) == 0xfc)\r
- *p |= (punycode_uint)*InputString & 0x01;\r
- InputString++;\r
- while((*InputString & 0xc0) == 0x80)\r
- {\r
- *p = *p << 6;\r
- *p |= (punycode_uint)*InputString & 0x3f;\r
- InputString++;\r
- }\r
- if(*p >= 0x80)\r
- bNeeded = TRUE;\r
- p++;\r
- Length++;\r
- }\r
- if(bNeeded)\r
- {\r
- if(Count >= strlen("xn--") + 1)\r
- {\r
- strcpy(Output, "xn--");\r
- OutputLength = Count - strlen("xn--");\r
- if(punycode_encode(Length, pUnicode, NULL, (punycode_uint*)&OutputLength, Output + strlen("xn--")) == punycode_success)\r
- {\r
- Output[strlen("xn--") + OutputLength] = '\0';\r
- bResult = TRUE;\r
- }\r
- }\r
- }\r
- free(pUnicode);\r
- }\r
- if(!bResult)\r
- {\r
- if(Count >= strlen(Input) + 1)\r
- {\r
- strcpy(Output, Input);\r
- bResult = TRUE;\r
- }\r
- }\r
- return bResult;\r
-}\r