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