1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/******************************************************************** 2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * COPYRIGHT: 385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * Copyright (c) 1999-2002,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 <stdio.h> 9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <stdlib.h> 10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// Verify that a UErrorCode is successful; exit(1) if not 12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid check(UErrorCode& status, const char* msg) { 13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(status)) { 14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru printf("ERROR: %s (%s)\n", u_errorName(status), msg); 15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru exit(1); 16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // printf("Ok: %s\n", msg); 18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// Append a hex string to the target 21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic UnicodeString& appendHex(uint32_t number, 22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int8_t digits, 23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UnicodeString& target) { 24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru static const UnicodeString DIGIT_STRING("0123456789ABCDEF"); 25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru while (digits > 0) { 26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru target += DIGIT_STRING[(number >> ((--digits) * 4)) & 0xF]; 27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return target; 29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// Replace nonprintable characters with unicode escapes 32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUnicodeString escape(const UnicodeString &source) { 33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t i; 34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UnicodeString target; 35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru target += "\""; 36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru for (i=0; i<source.length(); ++i) { 37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UChar ch = source[i]; 38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (ch < 0x09 || (ch > 0x0A && ch < 0x20) || ch > 0x7E) { 39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru target += "\\u"; 40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru appendHex(ch, 4, target); 41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else { 42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru target += ch; 43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru target += "\""; 46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return target; 47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// Print the given string to stdout 50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid uprintf(const UnicodeString &str) { 51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru char *buf = 0; 52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t len = str.length(); 53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // int32_t bufLen = str.extract(0, len, buf); // Preflight 54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* Preflighting seems to be broken now, so assume 1-1 conversion, 55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru plus some slop. */ 56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t bufLen = len + 16; 57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t actualLen; 58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru buf = new char[bufLen + 1]; 59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru actualLen = str.extract(0, len, buf/*, bufLen*/); // Default codepage conversion 60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru buf[actualLen] = 0; 61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru printf("%s", buf); 6285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho delete[] buf; 63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 64