//========================================================================
//
// UGooString.cc
//
// Unicode string
//
// Copyright 2005 Albert Astals Cid <aacid@kde.org>
//
//========================================================================

#include <string.h>

#include "goo/gmem.h"
#include "goo/GooString.h"
#include "PDFDocEncoding.h"
#include "UGooString.h"

UGooString::UGooString(Unicode *u, int l)
{
  s = u;
  length = l;
}

UGooString::UGooString(GooString &str)
{
  if ((str.getChar(0) & 0xff) == 0xfe && (str.getChar(1) & 0xff) == 0xff)
  {
    length = (str.getLength() - 2) / 2;
    s = (Unicode *)gmallocn(length, sizeof(Unicode));
    for (int j = 0; j < length; ++j) {
      s[j] = ((str.getChar(2 + 2*j) & 0xff) << 8) | (str.getChar(3 + 2*j) & 0xff);
    }
  } else
    initChar(str);
}

UGooString::UGooString(const UGooString &str)
{
  length = str.length;
  s = (Unicode *)gmallocn(length, sizeof(Unicode));
  memcpy(s, str.s, length * sizeof(Unicode));
}

UGooString::UGooString(const char *str)
{
  GooString aux(str);
  initChar(aux);
}

void UGooString::initChar(GooString &str)
{
  length = str.getLength();
  s = (Unicode *)gmallocn(length, sizeof(Unicode));
  for (int j = 0; j < length; ++j) {
    s[j] = pdfDocEncoding[str.getChar(j) & 0xff];
  }
}

UGooString::~UGooString()
{
  gfree(s);
}

int UGooString::cmp(UGooString *str) const
{
  int n1, n2, i, x;
  Unicode *p1, *p2;

  n1 = length;
  n2 = str->length;
  for (i = 0, p1 = s, p2 = str->s; i < n1 && i < n2; ++i, ++p1, ++p2) {
    x = *p1 - *p2;
    if (x != 0) {
      return x;
    }
  }
  return n1 - n2;
}

char *UGooString::getCString() const
{
  char *res = new char[length + 1];
  for (int i = 0; i < length; i++) res[i] = s[i];
  res[length] = '\0';
  return res;
}
