15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/char_iterator.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/icu/source/common/unicode/utf8.h"
8ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/icu/source/common/unicode/utf16.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace i18n {
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UTF8CharIterator::UTF8CharIterator(const std::string* str)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : str_(reinterpret_cast<const uint8_t*>(str->data())),
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      len_(str->size()),
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      array_pos_(0),
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      next_pos_(0),
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      char_pos_(0),
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      char_(0) {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (len_)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    U8_NEXT(str_, next_pos_, len_, char_);
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UTF8CharIterator::~UTF8CharIterator() {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool UTF8CharIterator::Advance() {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (array_pos_ >= len_)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  array_pos_ = next_pos_;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char_pos_++;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (next_pos_ < len_)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    U8_NEXT(str_, next_pos_, len_, char_);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UTF16CharIterator::UTF16CharIterator(const string16* str)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : str_(reinterpret_cast<const char16*>(str->data())),
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      len_(str->size()),
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      array_pos_(0),
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      next_pos_(0),
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      char_pos_(0),
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      char_(0) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (len_)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ReadChar();
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UTF16CharIterator::UTF16CharIterator(const char16* str, size_t str_len)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : str_(str),
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      len_(str_len),
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      array_pos_(0),
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      next_pos_(0),
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      char_pos_(0),
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      char_(0) {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (len_)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ReadChar();
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UTF16CharIterator::~UTF16CharIterator() {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool UTF16CharIterator::Advance() {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (array_pos_ >= len_)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  array_pos_ = next_pos_;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char_pos_++;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (next_pos_ < len_)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ReadChar();
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UTF16CharIterator::ReadChar() {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is actually a huge macro, so is worth having in a separate function.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  U16_NEXT(str_, next_pos_, len_, char_);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace i18n
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base
83