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