| // © 2017 and later: Unicode, Inc. and others. |
| // License & terms of use: http://www.unicode.org/copyright.html |
| /* |
| ******************************************************************************* |
| * |
| * Copyright (C) 2003, International Business Machines |
| * Corporation and others. All Rights Reserved. |
| * |
| ******************************************************************************* |
| * |
| * File uprinter.cpp |
| * |
| * Modification History: |
| * |
| * Date Name Description |
| * 03/18/2003 weiv Creation. |
| ******************************************************************************* |
| */ |
| |
| #include "uprinter.h" |
| |
| UPrinter::UPrinter(FILE *file, const char *locale, const char *encoding, UBool transliterateNonPrintable) { |
| _on = TRUE; |
| out = u_finit(file, locale, encoding); |
| strcpy(_locale, locale); |
| if(transliterateNonPrintable) { |
| UErrorCode status = U_ZERO_ERROR; |
| UTransliterator *anyHex = utrans_open("[^\\u000d\\u000a\\u0009\\u0020-\\u007f] Any-Hex/Java", UTRANS_FORWARD, NULL, 0, NULL, &status); |
| u_fsettransliterator(out, U_WRITE, anyHex, &status); |
| } |
| }; |
| |
| UPrinter::UPrinter(const char *name, const char *locale, const char *encoding, UTransliterator *trans, UBool transliterateNonPrintable) { |
| _on = TRUE; |
| out = u_fopen(name, "wb", locale, encoding); |
| u_fputc(0xFEFF, out); // emit a BOM |
| strcpy(_locale, locale); |
| if(transliterateNonPrintable) { |
| UErrorCode status = U_ZERO_ERROR; |
| if(trans == NULL) { |
| UTransliterator *anyHex = utrans_open("[^\\u000d\\u000a\\u0009\\u0020-\\u007f] Any-Hex/Java", UTRANS_FORWARD, NULL, 0, NULL, &status); |
| u_fsettransliterator(out, U_WRITE, anyHex, &status); |
| } else { |
| u_fsettransliterator(out, U_WRITE, trans, &status); |
| } |
| } |
| }; |
| |
| UPrinter::~UPrinter() { |
| u_fclose(out); |
| } |
| |
| void |
| UPrinter::log(const UnicodeString &string, UBool nl) { |
| if(_on) { |
| log(((UnicodeString)string).getTerminatedBuffer(), nl); |
| } |
| } |
| |
| void |
| UPrinter::log(const UChar *string, UBool nl) { |
| if(_on) { |
| u_fprintf(out, "%S", string); |
| if(nl) { |
| u_fprintf(out, "\n"); |
| } |
| u_fflush(out); |
| } |
| } |
| /* |
| void |
| UPrinter::log(const char *string, UBool nl) { |
| if(_on) { |
| u_fprintf(out, "%s", string); |
| if(nl) { |
| u_fprintf(out, "\n"); |
| } |
| } |
| } |
| */ |
| void |
| UPrinter::log(const Line *line, UBool nl) { |
| if(_on) { |
| log(line->name); |
| if(line->expLen) { |
| log("/"); |
| log(line->expansionString); |
| } |
| if(nl) { |
| u_fprintf(out, "\n"); |
| u_fflush(out); |
| } |
| } |
| } |
| |
| void UPrinter::log(const char *fmt, ...) |
| { |
| UChar buffer[4000]; |
| va_list ap; |
| |
| va_start(ap, fmt); |
| /* sprintf it just to make sure that the information is valid */ |
| u_vsprintf(buffer, _locale, fmt, ap); |
| va_end(ap); |
| if( _on ) { |
| log(buffer); |
| } |
| } |
| |
| void |
| UPrinter::on(void) { |
| _on = TRUE; |
| } |
| |
| void |
| UPrinter::off(void) { |
| _on = FALSE; |
| } |