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