1b9056914e2627627ffdd615e078a9b6020ab1cf2philip.liard@gmail.com// Copyright (C) 2011 The Libphonenumber Authors
21ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com//
31ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// Licensed under the Apache License, Version 2.0 (the "License");
41ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// you may not use this file except in compliance with the License.
51ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// You may obtain a copy of the License at
61ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com//
71ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// http://www.apache.org/licenses/LICENSE-2.0
81ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com//
91ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// Unless required by applicable law or agreed to in writing, software
101ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// distributed under the License is distributed on an "AS IS" BASIS,
111ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
121ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// See the License for the specific language governing permissions and
131ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// limitations under the License.
141ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
151ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#ifndef I18N_PHONENUMBERS_ENCODING_UTILS_H_
161ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#define I18N_PHONENUMBERS_ENCODING_UTILS_H_
171ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
18af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com#include "phonenumbers/base/basictypes.h"
196a0a07f4f0066eba2dc9bb81465f4e67d670c7b6philip.liard@gmail.com#include "phonenumbers/utf/unilib.h"
201ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include "phonenumbers/utf/utf.h"
211ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
221ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comnamespace i18n {
231ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comnamespace phonenumbers {
241ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
251ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comclass EncodingUtils {
261ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com public:
271ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Decodes one Unicode code-point value from a UTF-8 array. Returns the number
281ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // of bytes read from the array. If the array does not contain valid UTF-8,
291ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // the function stores 0xFFFD in the output variable and returns 1.
301ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  static inline int DecodeUTF8Char(const char* in, char32* out) {
311ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    Rune r;
321ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    int len = chartorune(&r, in);
331ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    *out = r;
341ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    return len;
351ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  }
366a0a07f4f0066eba2dc9bb81465f4e67d670c7b6philip.liard@gmail.com
376a0a07f4f0066eba2dc9bb81465f4e67d670c7b6philip.liard@gmail.com  static const char* AdvanceOneUTF8Character(const char* buf_utf8) {
386a0a07f4f0066eba2dc9bb81465f4e67d670c7b6philip.liard@gmail.com      return buf_utf8 + UniLib::OneCharLen(buf_utf8);
396a0a07f4f0066eba2dc9bb81465f4e67d670c7b6philip.liard@gmail.com  }
406a0a07f4f0066eba2dc9bb81465f4e67d670c7b6philip.liard@gmail.com
416a0a07f4f0066eba2dc9bb81465f4e67d670c7b6philip.liard@gmail.com  static const char* BackUpOneUTF8Character(const char* start,
426a0a07f4f0066eba2dc9bb81465f4e67d670c7b6philip.liard@gmail.com                                            const char* end) {
436a0a07f4f0066eba2dc9bb81465f4e67d670c7b6philip.liard@gmail.com    while (start < end && UniLib::IsTrailByte(*--end)) {}
446a0a07f4f0066eba2dc9bb81465f4e67d670c7b6philip.liard@gmail.com    return end;
456a0a07f4f0066eba2dc9bb81465f4e67d670c7b6philip.liard@gmail.com  }
461ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com};
471ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
481ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com}  // namespace phonenumbers
491ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com}  // namespace i18n
501ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
511ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#endif  // I18N_PHONENUMBERS_ENCODING_UTILS_H_
52