xref: /third_party/icu/tools/colprobe/uprinter.cpp (revision 2e5b6d6d)
1// © 2017 and later: Unicode, Inc. and others.
2// License & terms of use: http://www.unicode.org/copyright.html
3/*
4*******************************************************************************
5*
6*   Copyright (C) 2003, International Business Machines
7*   Corporation and others.  All Rights Reserved.
8*
9*******************************************************************************
10*
11* File uprinter.cpp
12*
13* Modification History:
14*
15*   Date        Name        Description
16*   03/18/2003  weiv        Creation.
17*******************************************************************************
18*/
19
20#include "uprinter.h"
21
22UPrinter::UPrinter(FILE *file, const char *locale, const char *encoding, UBool transliterateNonPrintable) {
23  _on = true;
24  out = u_finit(file, locale, encoding);
25  strcpy(_locale, locale);
26  if(transliterateNonPrintable) {
27    UErrorCode status = U_ZERO_ERROR;
28    UTransliterator *anyHex = utrans_open("[^\\u000d\\u000a\\u0009\\u0020-\\u007f] Any-Hex/Java", UTRANS_FORWARD, NULL, 0, NULL, &status);
29    u_fsettransliterator(out, U_WRITE, anyHex, &status);
30  }
31};
32
33UPrinter::UPrinter(const char *name, const char *locale, const char *encoding, UTransliterator *trans, UBool transliterateNonPrintable) {
34  _on = true;
35  out = u_fopen(name, "wb", locale, encoding);
36  u_fputc(0xFEFF, out); // emit a BOM
37  strcpy(_locale, locale);
38  if(transliterateNonPrintable) {
39    UErrorCode status = U_ZERO_ERROR;
40    if(trans == NULL) {
41      UTransliterator *anyHex = utrans_open("[^\\u000d\\u000a\\u0009\\u0020-\\u007f] Any-Hex/Java", UTRANS_FORWARD, NULL, 0, NULL, &status);
42      u_fsettransliterator(out, U_WRITE, anyHex, &status);
43    } else {
44      u_fsettransliterator(out, U_WRITE, trans, &status);
45    }
46  }
47};
48
49UPrinter::~UPrinter() {
50  u_fclose(out);
51}
52
53void
54UPrinter::log(const UnicodeString &string, UBool nl) {
55  if(_on) {
56    log(((UnicodeString)string).getTerminatedBuffer(), nl);
57  }
58}
59
60void
61UPrinter::log(const UChar *string, UBool nl) {
62  if(_on) {
63    u_fprintf(out, "%S", string);
64    if(nl) {
65      u_fprintf(out, "\n");
66    }
67    u_fflush(out);
68  }
69}
70/*
71void
72UPrinter::log(const char *string, UBool nl) {
73  if(_on) {
74    u_fprintf(out, "%s", string);
75    if(nl) {
76      u_fprintf(out, "\n");
77    }
78  }
79}
80*/
81void
82UPrinter::log(const Line *line, UBool nl) {
83  if(_on) {
84    log(line->name);
85    if(line->expLen) {
86      log("/");
87      log(line->expansionString);
88    }
89    if(nl) {
90      u_fprintf(out, "\n");
91      u_fflush(out);
92    }
93  }
94}
95
96void UPrinter::log(const char *fmt, ...)
97{
98    UChar buffer[4000];
99    va_list ap;
100
101    va_start(ap, fmt);
102    /* sprintf it just to make sure that the information is valid */
103    u_vsprintf(buffer, _locale, fmt, ap);
104    va_end(ap);
105    if( _on ) {
106        log(buffer);
107    }
108}
109
110void
111UPrinter::on(void) {
112  _on = true;
113}
114
115void
116UPrinter::off(void) {
117  _on = false;
118}
119