// © 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;
}
