16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/********************************************************************
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * COPYRIGHT:
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copyright (c) 1999-2010, 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