16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/******************************************************************** 26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * COPYRIGHT: 36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copyright (c) 1999-2002,2009, International Business Machines Corporation and 46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * others. All Rights Reserved. 56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ********************************************************************/ 66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/unistr.h" 86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdio.h> 96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdlib.h> 106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Verify that a UErrorCode is successful; exit(1) if not 126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid check(UErrorCode& status, const char* msg) { 136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org printf("ERROR: %s (%s)\n", u_errorName(status), msg); 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org exit(1); 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // printf("Ok: %s\n", msg); 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Append a hex string to the target 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UnicodeString& appendHex(uint32_t number, 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int8_t digits, 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString& target) { 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UnicodeString DIGIT_STRING("0123456789ABCDEF"); 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (digits > 0) { 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org target += DIGIT_STRING[(number >> ((--digits) * 4)) & 0xF]; 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return target; 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Replace nonprintable characters with unicode escapes 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString escape(const UnicodeString &source) { 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t i; 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString target; 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org target += "\""; 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i=0; i<source.length(); ++i) { 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar ch = source[i]; 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ch < 0x09 || (ch > 0x0A && ch < 0x20) || ch > 0x7E) { 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org target += "\\u"; 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org appendHex(ch, 4, target); 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org target += ch; 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org target += "\""; 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return target; 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Print the given string to stdout 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid uprintf(const UnicodeString &str) { 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char *buf = 0; 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t len = str.length(); 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // int32_t bufLen = str.extract(0, len, buf); // Preflight 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Preflighting seems to be broken now, so assume 1-1 conversion, 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org plus some slop. */ 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t bufLen = len + 16; 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t actualLen; 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org buf = new char[bufLen + 1]; 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org actualLen = str.extract(0, len, buf/*, bufLen*/); // Default codepage conversion 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org buf[actualLen] = 0; 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org printf("%s", buf); 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete[] buf; 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 64