1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/******************************************************************** 2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * COPYRIGHT: 385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * Copyright (c) 1999-2003,2009, International Business Machines Corporation and 4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * others. All Rights Reserved. 5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ********************************************************************/ 6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/unistr.h" 8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/fmtable.h" 9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <stdio.h> 10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <stdlib.h> 11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruenum { 13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru U_SPACE=0x20, 14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru U_DQUOTE=0x22, 15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru U_COMMA=0x2c, 16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru U_LEFT_SQUARE_BRACKET=0x5b, 17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru U_BACKSLASH=0x5c, 18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru U_RIGHT_SQUARE_BRACKET=0x5d, 19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru U_SMALL_U=0x75 20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}; 21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// Verify that a UErrorCode is successful; exit(1) if not 23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid check(UErrorCode& status, const char* msg) { 24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(status)) { 25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru printf("ERROR: %s (%s)\n", u_errorName(status), msg); 26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru exit(1); 27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // printf("Ok: %s\n", msg); 29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// Append a hex string to the target 32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic UnicodeString& appendHex(uint32_t number, 33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int8_t digits, 34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UnicodeString& target) { 35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru uint32_t digit; 36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru while (digits > 0) { 37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru digit = (number >> ((--digits) * 4)) & 0xF; 38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru target += (UChar)(digit < 10 ? 0x30 + digit : 0x41 - 10 + digit); 39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return target; 41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// Replace nonprintable characters with unicode escapes 44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUnicodeString escape(const UnicodeString &source) { 45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t i; 46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UnicodeString target; 47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru target += (UChar)U_DQUOTE; 48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru for (i=0; i<source.length(); ++i) { 49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UChar ch = source[i]; 50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (ch < 0x09 || (ch > 0x0D && ch < 0x20) || ch > 0x7E) { 51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru (target += (UChar)U_BACKSLASH) += (UChar)U_SMALL_U; 52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru appendHex(ch, 4, target); 53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else { 54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru target += ch; 55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru target += (UChar)U_DQUOTE; 58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return target; 59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// Print the given string to stdout using the UTF-8 converter 62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid uprintf(const UnicodeString &str) { 63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru char stackBuffer[100]; 64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru char *buf = 0; 65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t bufLen = str.extract(0, 0x7fffffff, stackBuffer, sizeof(stackBuffer), "UTF-8"); 67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(bufLen < sizeof(stackBuffer)) { 68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru buf = stackBuffer; 69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else { 70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru buf = new char[bufLen + 1]; 71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru bufLen = str.extract(0, 0x7fffffff, buf, bufLen + 1, "UTF-8"); 72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru printf("%s", buf); 74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(buf != stackBuffer) { 7585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho delete[] buf; 76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// Create a display string for a formattable 80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUnicodeString formattableToString(const Formattable& f) { 81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru switch (f.getType()) { 82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru case Formattable::kDate: 83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // TODO: Finish implementing this 84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return UNICODE_STRING_SIMPLE("Formattable_DATE_TBD"); 85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru case Formattable::kDouble: 86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { 87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru char buf[256]; 88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru sprintf(buf, "%gD", f.getDouble()); 89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return UnicodeString(buf, ""); 90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru case Formattable::kLong: 92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru case Formattable::kInt64: 93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { 94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru char buf[256]; 95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru sprintf(buf, "%ldL", f.getLong()); 96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return UnicodeString(buf, ""); 97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru case Formattable::kString: 99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return UnicodeString((UChar)U_DQUOTE).append(f.getString()).append((UChar)U_DQUOTE); 100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru case Formattable::kArray: 101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { 102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t i, count; 103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const Formattable* array = f.getArray(count); 104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UnicodeString result((UChar)U_LEFT_SQUARE_BRACKET); 105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru for (i=0; i<count; ++i) { 106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (i > 0) { 107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru (result += (UChar)U_COMMA) += (UChar)U_SPACE; 108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru result += formattableToString(array[i]); 110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru result += (UChar)U_RIGHT_SQUARE_BRACKET; 112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return result; 113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru default: 115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return UNICODE_STRING_SIMPLE("INVALID_Formattable"); 116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 118