// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#if defined(STARBOARD)
#include "starboard/configuration.h"
#endif

#if !defined(STARBOARD) || SB_IS(WCHAR_T_UTF32)

#include "base/strings/string16.h"

#if defined(WCHAR_T_IS_UTF16) && !defined(_AIX)

#error This file should not be used on 2-byte wchar_t systems
// If this winds up being needed on 2-byte wchar_t systems, either the
// definitions below can be used, or the host system's wide character
// functions like wmemcmp can be wrapped.

#elif defined(WCHAR_T_IS_UTF32)

#include <ostream>

#include "base/strings/utf_string_conversions.h"
#include "starboard/memory.h"

namespace base {

int c16SbMemoryCompare(const char16* s1, const char16* s2, size_t n) {
  // We cannot call memcmp because that changes the semantics.
  while (n-- > 0) {
    if (*s1 != *s2) {
      // We cannot use (*s1 - *s2) because char16 is unsigned.
      return ((*s1 < *s2) ? -1 : 1);
    }
    ++s1;
    ++s2;
  }
  return 0;
}

size_t c16len(const char16* s) {
  const char16 *s_orig = s;
  while (*s) {
    ++s;
  }
  return s - s_orig;
}

const char16* c16SbMemoryFindByte(const char16* s, char16 c, size_t n) {
  while (n-- > 0) {
    if (*s == c) {
      return s;
    }
    ++s;
  }
  return nullptr;
}

char16* c16SbMemoryMove(char16* s1, const char16* s2, size_t n) {
  return static_cast<char16*>(SbMemoryMove(s1, s2, n * sizeof(char16)));
}

char16* c16SbMemoryCopy(char16* s1, const char16* s2, size_t n) {
  return static_cast<char16*>(SbMemoryCopy(s1, s2, n * sizeof(char16)));
}

char16* c16SbMemorySet(char16* s, char16 c, size_t n) {
  char16 *s_orig = s;
  while (n-- > 0) {
    *s = c;
    ++s;
  }
  return s_orig;
}

namespace string16_internals {

std::ostream& operator<<(std::ostream& out, const string16& str) {
  return out << UTF16ToUTF8(str);
}

void PrintTo(const string16& str, std::ostream* out) {
  *out << str;
}

}  // namespace string16_internals

}  // namespace base

template class std::
    basic_string<base::char16, base::string16_internals::string16_char_traits>;

#endif  // WCHAR_T_IS_UTF32

#endif  // !STARBOARD || WCHAR_T_IS_UTF32