Fully quality std::* names.
[platform/upstream/libphonenumber.git] / cpp / src / phonenumbers / phonenumberutil.cc
1 // Copyright (C) 2009 The Libphonenumber Authors
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 // Author: Shaopeng Jia
16 // Open-sourced by: Philippe Liard
17
18 #include "phonenumbers/phonenumberutil.h"
19
20 #include <string.h>
21 #include <algorithm>
22 #include <cctype>
23 #include <iterator>
24 #include <map>
25 #include <utility>
26 #include <vector>
27
28 #include <google/protobuf/message_lite.h>
29 #include <unicode/uchar.h>
30 #include <unicode/utf8.h>
31
32 #include "phonenumbers/asyoutypeformatter.h"
33 #include "phonenumbers/base/basictypes.h"
34 #include "phonenumbers/base/logging.h"
35 #include "phonenumbers/base/memory/singleton.h"
36 #include "phonenumbers/default_logger.h"
37 #include "phonenumbers/encoding_utils.h"
38 #include "phonenumbers/metadata.h"
39 #include "phonenumbers/normalize_utf8.h"
40 #include "phonenumbers/phonemetadata.pb.h"
41 #include "phonenumbers/phonenumber.h"
42 #include "phonenumbers/phonenumber.pb.h"
43 #include "phonenumbers/regexp_adapter.h"
44 #include "phonenumbers/regexp_cache.h"
45 #include "phonenumbers/regexp_factory.h"
46 #include "phonenumbers/region_code.h"
47 #include "phonenumbers/stl_util.h"
48 #include "phonenumbers/stringutil.h"
49 #include "phonenumbers/utf/unicodetext.h"
50 #include "phonenumbers/utf/utf.h"
51
52 namespace i18n {
53 namespace phonenumbers {
54
55 using google::protobuf::RepeatedPtrField;
56
57 // static constants
58 const size_t PhoneNumberUtil::kMinLengthForNsn;
59 const size_t PhoneNumberUtil::kMaxLengthForNsn;
60 const size_t PhoneNumberUtil::kMaxLengthCountryCode;
61 const int PhoneNumberUtil::kNanpaCountryCode;
62
63 // static
64 const char PhoneNumberUtil::kPlusChars[] = "+\xEF\xBC\x8B";  /* "++" */
65 // To find out the unicode code-point of the characters below in vim, highlight
66 // the character and type 'ga'. Note that the - is used to express ranges of
67 // full-width punctuation below, as well as being present in the expression
68 // itself. In emacs, you can use M-x unicode-what to query information about the
69 // unicode character.
70 // static
71 const char PhoneNumberUtil::kValidPunctuation[] =
72     /* "-x‐-―−ー--/  ­<U+200B><U+2060> ()()[].\\[\\]/~⁓∼" */
73     "-x\xE2\x80\x90-\xE2\x80\x95\xE2\x88\x92\xE3\x83\xBC\xEF\xBC\x8D-\xEF\xBC"
74     "\x8F \xC2\xA0\xC2\xAD\xE2\x80\x8B\xE2\x81\xA0\xE3\x80\x80()\xEF\xBC\x88"
75     "\xEF\xBC\x89\xEF\xBC\xBB\xEF\xBC\xBD.\\[\\]/~\xE2\x81\x93\xE2\x88\xBC";
76
77 // static
78 const char PhoneNumberUtil::kCaptureUpToSecondNumberStart[] = "(.*)[\\\\/] *x";
79
80 // static
81 const char PhoneNumberUtil::kRegionCodeForNonGeoEntity[] = "001";
82
83 namespace {
84
85 // The prefix that needs to be inserted in front of a Colombian landline
86 // number when dialed from a mobile phone in Colombia.
87 const char kColombiaMobileToFixedLinePrefix[] = "3";
88
89 // The kPlusSign signifies the international prefix.
90 const char kPlusSign[] = "+";
91
92 const char kStarSign[] = "*";
93
94 const char kRfc3966ExtnPrefix[] = ";ext=";
95 const char kRfc3966Prefix[] = "tel:";
96 const char kRfc3966PhoneContext[] = ";phone-context=";
97 const char kRfc3966IsdnSubaddress[] = ";isub=";
98
99 const char kDigits[] = "\\p{Nd}";
100 // We accept alpha characters in phone numbers, ASCII only. We store lower-case
101 // here only since our regular expressions are case-insensitive.
102 const char kValidAlpha[] = "a-z";
103
104 // Default extension prefix to use when formatting. This will be put in front of
105 // any extension component of the number, after the main national number is
106 // formatted. For example, if you wish the default extension formatting to be "
107 // extn: 3456", then you should specify " extn: " here as the default extension
108 // prefix. This can be overridden by region-specific preferences.
109 const char kDefaultExtnPrefix[] = " ext. ";
110
111 // One-character symbols that can be used to indicate an extension.
112 const char kSingleExtnSymbolsForMatching[] =
113     "x\xEF\xBD\x98#\xEF\xBC\x83~\xEF\xBD\x9E";
114
115 bool LoadCompiledInMetadata(PhoneMetadataCollection* metadata) {
116   if (!metadata->ParseFromArray(metadata_get(), metadata_size())) {
117     LOG(ERROR) << "Could not parse binary data.";
118     return false;
119   }
120   return true;
121 }
122
123 // Returns a pointer to the description inside the metadata of the appropriate
124 // type.
125 const PhoneNumberDesc* GetNumberDescByType(
126     const PhoneMetadata& metadata,
127     PhoneNumberUtil::PhoneNumberType type) {
128   switch (type) {
129     case PhoneNumberUtil::PREMIUM_RATE:
130       return &metadata.premium_rate();
131     case PhoneNumberUtil::TOLL_FREE:
132       return &metadata.toll_free();
133     case PhoneNumberUtil::MOBILE:
134       return &metadata.mobile();
135     case PhoneNumberUtil::FIXED_LINE:
136     case PhoneNumberUtil::FIXED_LINE_OR_MOBILE:
137       return &metadata.fixed_line();
138     case PhoneNumberUtil::SHARED_COST:
139       return &metadata.shared_cost();
140     case PhoneNumberUtil::VOIP:
141       return &metadata.voip();
142     case PhoneNumberUtil::PERSONAL_NUMBER:
143       return &metadata.personal_number();
144     case PhoneNumberUtil::PAGER:
145       return &metadata.pager();
146     case PhoneNumberUtil::UAN:
147       return &metadata.uan();
148     case PhoneNumberUtil::VOICEMAIL:
149       return &metadata.voicemail();
150     default:
151       return &metadata.general_desc();
152   }
153 }
154
155 // A helper function that is used by Format and FormatByPattern.
156 void PrefixNumberWithCountryCallingCode(
157     int country_calling_code,
158     PhoneNumberUtil::PhoneNumberFormat number_format,
159     string* formatted_number) {
160   switch (number_format) {
161     case PhoneNumberUtil::E164:
162       formatted_number->insert(0, StrCat(kPlusSign, country_calling_code));
163       return;
164     case PhoneNumberUtil::INTERNATIONAL:
165       formatted_number->insert(0, StrCat(kPlusSign, country_calling_code, " "));
166       return;
167     case PhoneNumberUtil::RFC3966:
168       formatted_number->insert(0, StrCat(kRfc3966Prefix, kPlusSign,
169                                          country_calling_code, "-"));
170       return;
171     case PhoneNumberUtil::NATIONAL:
172     default:
173       // Do nothing.
174       return;
175   }
176 }
177
178 // Returns true when one national number is the suffix of the other or both are
179 // the same.
180 bool IsNationalNumberSuffixOfTheOther(const PhoneNumber& first_number,
181                                       const PhoneNumber& second_number) {
182   const string& first_number_national_number =
183     SimpleItoa(static_cast<uint64>(first_number.national_number()));
184   const string& second_number_national_number =
185     SimpleItoa(static_cast<uint64>(second_number.national_number()));
186   // Note that HasSuffixString returns true if the numbers are equal.
187   return HasSuffixString(first_number_national_number,
188                          second_number_national_number) ||
189          HasSuffixString(second_number_national_number,
190                          first_number_national_number);
191 }
192
193 char32 ToUnicodeCodepoint(const char* unicode_char) {
194   char32 codepoint;
195   EncodingUtils::DecodeUTF8Char(unicode_char, &codepoint);
196   return codepoint;
197 }
198
199 // Helper initialiser method to create the regular-expression pattern to match
200 // extensions, allowing the one-codepoint extension symbols provided by
201 // single_extn_symbols.
202 // Note that there are currently three capturing groups for the extension itself
203 // - if this number is changed, MaybeStripExtension needs to be updated.
204 string CreateExtnPattern(const string& single_extn_symbols) {
205   static const string capturing_extn_digits = StrCat("([", kDigits, "]{1,7})");
206   // The first regular expression covers RFC 3966 format, where the extension is
207   // added using ";ext=". The second more generic one starts with optional white
208   // space and ends with an optional full stop (.), followed by zero or more
209   // spaces/tabs and then the numbers themselves. The third one covers the
210   // special case of American numbers where the extension is written with a hash
211   // at the end, such as "- 503#".
212   // Note that the only capturing groups should be around the digits that you
213   // want to capture as part of the extension, or else parsing will fail!
214   // Canonical-equivalence doesn't seem to be an option with RE2, so we allow
215   // two options for representing the ó - the character itself, and one in the
216   // unicode decomposed form with the combining acute accent.
217   return (StrCat(
218       kRfc3966ExtnPrefix, capturing_extn_digits, "|"
219        /* "[  \\t,]*(?:e?xt(?:ensi(?:ó?|ó))?n?|e?xtn?|single_extn_symbols|"
220           "int|int|anexo)"
221           "[:\\..]?[  \\t,-]*", capturing_extn_digits, "#?|" */
222       "[ \xC2\xA0\\t,]*(?:e?xt(?:ensi(?:o\xCC\x81?|\xC3\xB3))?n?|"
223       "(?:\xEF\xBD\x85)?\xEF\xBD\x98\xEF\xBD\x94(?:\xEF\xBD\x8E)?|"
224       "[", single_extn_symbols, "]|int|"
225       "\xEF\xBD\x89\xEF\xBD\x8E\xEF\xBD\x94|anexo)"
226       "[:\\.\xEF\xBC\x8E]?[ \xC2\xA0\\t,-]*", capturing_extn_digits,
227       "#?|[- ]+([", kDigits, "]{1,5})#"));
228 }
229
230 // Normalizes a string of characters representing a phone number by replacing
231 // all characters found in the accompanying map with the values therein, and
232 // stripping all other characters if remove_non_matches is true.
233 // Parameters:
234 // number - a pointer to a string of characters representing a phone number to
235 //   be normalized.
236 // normalization_replacements - a mapping of characters to what they should be
237 //   replaced by in the normalized version of the phone number
238 // remove_non_matches - indicates whether characters that are not able to be
239 //   replaced should be stripped from the number. If this is false, they will be
240 //   left unchanged in the number.
241 void NormalizeHelper(const map<char32, char>& normalization_replacements,
242                      bool remove_non_matches,
243                      string* number) {
244   DCHECK(number);
245   UnicodeText number_as_unicode;
246   number_as_unicode.PointToUTF8(number->data(), number->size());
247   string normalized_number;
248   char unicode_char[5];
249   for (UnicodeText::const_iterator it = number_as_unicode.begin();
250        it != number_as_unicode.end();
251        ++it) {
252     map<char32, char>::const_iterator found_glyph_pair =
253         normalization_replacements.find(*it);
254     if (found_glyph_pair != normalization_replacements.end()) {
255       normalized_number.push_back(found_glyph_pair->second);
256     } else if (!remove_non_matches) {
257       // Find out how long this unicode char is so we can append it all.
258       int char_len = it.get_utf8(unicode_char);
259       normalized_number.append(unicode_char, char_len);
260     }
261     // If neither of the above are true, we remove this character.
262   }
263   number->assign(normalized_number);
264 }
265
266 PhoneNumberUtil::ValidationResult TestNumberLengthAgainstPattern(
267     const RegExp& number_pattern, const string& number) {
268   string extracted_number;
269   if (number_pattern.FullMatch(number, &extracted_number)) {
270     return PhoneNumberUtil::IS_POSSIBLE;
271   }
272   if (number_pattern.PartialMatch(number, &extracted_number)) {
273     return PhoneNumberUtil::TOO_LONG;
274   } else {
275     return PhoneNumberUtil::TOO_SHORT;
276   }
277 }
278
279 }  // namespace
280
281 void PhoneNumberUtil::SetLogger(Logger* logger) {
282   logger_.reset(logger);
283   Logger::set_logger_impl(logger_.get());
284 }
285
286 class PhoneNumberRegExpsAndMappings {
287  private:
288   void InitializeMapsAndSets() {
289     diallable_char_mappings_.insert(std::make_pair('+', '+'));
290     diallable_char_mappings_.insert(std::make_pair('*', '*'));
291     // Here we insert all punctuation symbols that we wish to respect when
292     // formatting alpha numbers, as they show the intended number groupings.
293     all_plus_number_grouping_symbols_.insert(
294         std::make_pair(ToUnicodeCodepoint("-"), '-'));
295     all_plus_number_grouping_symbols_.insert(
296         std::make_pair(ToUnicodeCodepoint("\xEF\xBC\x8D" /* "-" */), '-'));
297     all_plus_number_grouping_symbols_.insert(
298         std::make_pair(ToUnicodeCodepoint("\xE2\x80\x90" /* "‐" */), '-'));
299     all_plus_number_grouping_symbols_.insert(
300         std::make_pair(ToUnicodeCodepoint("\xE2\x80\x91" /* "‑" */), '-'));
301     all_plus_number_grouping_symbols_.insert(
302         std::make_pair(ToUnicodeCodepoint("\xE2\x80\x92" /* "‒" */), '-'));
303     all_plus_number_grouping_symbols_.insert(
304         std::make_pair(ToUnicodeCodepoint("\xE2\x80\x93" /* "–" */), '-'));
305     all_plus_number_grouping_symbols_.insert(
306         std::make_pair(ToUnicodeCodepoint("\xE2\x80\x94" /* "—" */), '-'));
307     all_plus_number_grouping_symbols_.insert(
308         std::make_pair(ToUnicodeCodepoint("\xE2\x80\x95" /* "―" */), '-'));
309     all_plus_number_grouping_symbols_.insert(
310         std::make_pair(ToUnicodeCodepoint("\xE2\x88\x92" /* "−" */), '-'));
311     all_plus_number_grouping_symbols_.insert(
312         std::make_pair(ToUnicodeCodepoint("/"), '/'));
313     all_plus_number_grouping_symbols_.insert(
314         std::make_pair(ToUnicodeCodepoint("\xEF\xBC\x8F" /* "/" */), '/'));
315     all_plus_number_grouping_symbols_.insert(
316         std::make_pair(ToUnicodeCodepoint(" "), ' '));
317     all_plus_number_grouping_symbols_.insert(
318         std::make_pair(ToUnicodeCodepoint("\xE3\x80\x80" /* " " */), ' '));
319     all_plus_number_grouping_symbols_.insert(
320         std::make_pair(ToUnicodeCodepoint("\xE2\x81\xA0"), ' '));
321     all_plus_number_grouping_symbols_.insert(
322         std::make_pair(ToUnicodeCodepoint("."), '.'));
323     all_plus_number_grouping_symbols_.insert(
324         std::make_pair(ToUnicodeCodepoint("\xEF\xBC\x8E" /* "." */), '.'));
325     // Only the upper-case letters are added here - the lower-case versions are
326     // added programmatically.
327     alpha_mappings_.insert(std::make_pair(ToUnicodeCodepoint("A"), '2'));
328     alpha_mappings_.insert(std::make_pair(ToUnicodeCodepoint("B"), '2'));
329     alpha_mappings_.insert(std::make_pair(ToUnicodeCodepoint("C"), '2'));
330     alpha_mappings_.insert(std::make_pair(ToUnicodeCodepoint("D"), '3'));
331     alpha_mappings_.insert(std::make_pair(ToUnicodeCodepoint("E"), '3'));
332     alpha_mappings_.insert(std::make_pair(ToUnicodeCodepoint("F"), '3'));
333     alpha_mappings_.insert(std::make_pair(ToUnicodeCodepoint("G"), '4'));
334     alpha_mappings_.insert(std::make_pair(ToUnicodeCodepoint("H"), '4'));
335     alpha_mappings_.insert(std::make_pair(ToUnicodeCodepoint("I"), '4'));
336     alpha_mappings_.insert(std::make_pair(ToUnicodeCodepoint("J"), '5'));
337     alpha_mappings_.insert(std::make_pair(ToUnicodeCodepoint("K"), '5'));
338     alpha_mappings_.insert(std::make_pair(ToUnicodeCodepoint("L"), '5'));
339     alpha_mappings_.insert(std::make_pair(ToUnicodeCodepoint("M"), '6'));
340     alpha_mappings_.insert(std::make_pair(ToUnicodeCodepoint("N"), '6'));
341     alpha_mappings_.insert(std::make_pair(ToUnicodeCodepoint("O"), '6'));
342     alpha_mappings_.insert(std::make_pair(ToUnicodeCodepoint("P"), '7'));
343     alpha_mappings_.insert(std::make_pair(ToUnicodeCodepoint("Q"), '7'));
344     alpha_mappings_.insert(std::make_pair(ToUnicodeCodepoint("R"), '7'));
345     alpha_mappings_.insert(std::make_pair(ToUnicodeCodepoint("S"), '7'));
346     alpha_mappings_.insert(std::make_pair(ToUnicodeCodepoint("T"), '8'));
347     alpha_mappings_.insert(std::make_pair(ToUnicodeCodepoint("U"), '8'));
348     alpha_mappings_.insert(std::make_pair(ToUnicodeCodepoint("V"), '8'));
349     alpha_mappings_.insert(std::make_pair(ToUnicodeCodepoint("W"), '9'));
350     alpha_mappings_.insert(std::make_pair(ToUnicodeCodepoint("X"), '9'));
351     alpha_mappings_.insert(std::make_pair(ToUnicodeCodepoint("Y"), '9'));
352     alpha_mappings_.insert(std::make_pair(ToUnicodeCodepoint("Z"), '9'));
353     map<char32, char> lower_case_mappings;
354     map<char32, char> alpha_letters;
355     for (map<char32, char>::const_iterator it = alpha_mappings_.begin();
356          it != alpha_mappings_.end();
357          ++it) {
358       // Convert all the upper-case ASCII letters to lower-case.
359       if (it->first < 128) {
360         char letter_as_upper = static_cast<char>(it->first);
361         char32 letter_as_lower = static_cast<char32>(tolower(letter_as_upper));
362         lower_case_mappings.insert(std::make_pair(letter_as_lower, it->second));
363         // Add the letters in both variants to the alpha_letters map. This just
364         // pairs each letter with its upper-case representation so that it can
365         // be retained when normalising alpha numbers.
366         alpha_letters.insert(std::make_pair(letter_as_lower, letter_as_upper));
367         alpha_letters.insert(std::make_pair(it->first, letter_as_upper));
368       }
369     }
370     // In the Java version we don't insert the lower-case mappings in the map,
371     // because we convert to upper case on the fly. Doing this here would
372     // involve pulling in all of ICU, which we don't want to do if we don't have
373     // to.
374     alpha_mappings_.insert(lower_case_mappings.begin(),
375                            lower_case_mappings.end());
376     alpha_phone_mappings_.insert(alpha_mappings_.begin(),
377                                  alpha_mappings_.end());
378     all_plus_number_grouping_symbols_.insert(alpha_letters.begin(),
379                                              alpha_letters.end());
380     // Add the ASCII digits so that they don't get deleted by NormalizeHelper().
381     for (char c = '0'; c <= '9'; ++c) {
382       diallable_char_mappings_.insert(std::make_pair(c, c));
383       alpha_phone_mappings_.insert(std::make_pair(c, c));
384       all_plus_number_grouping_symbols_.insert(std::make_pair(c, c));
385     }
386
387     mobile_token_mappings_.insert(std::make_pair(52, '1'));
388     mobile_token_mappings_.insert(std::make_pair(54, '9'));
389   }
390
391   // Small string helpers since StrCat has a maximum number of arguments. These
392   // are both used to build valid_phone_number_.
393   const string punctuation_and_star_sign_;
394   const string min_length_phone_number_pattern_;
395
396   // Regular expression of viable phone numbers. This is location independent.
397   // Checks we have at least three leading digits, and only valid punctuation,
398   // alpha characters and digits in the phone number. Does not include extension
399   // data. The symbol 'x' is allowed here as valid punctuation since it is often
400   // used as a placeholder for carrier codes, for example in Brazilian phone
401   // numbers. We also allow multiple plus-signs at the start.
402   // Corresponds to the following:
403   // [digits]{minLengthNsn}|
404   // plus_sign*(([punctuation]|[star])*[digits]){3,}
405   // ([punctuation]|[star]|[digits]|[alpha])*
406   //
407   // The first reg-ex is to allow short numbers (two digits long) to be parsed
408   // if they are entered as "15" etc, but only if there is no punctuation in
409   // them. The second expression restricts the number of digits to three or
410   // more, but then allows them to be in international form, and to have
411   // alpha-characters and punctuation.
412   const string valid_phone_number_;
413
414   // Regexp of all possible ways to write extensions, for use when parsing. This
415   // will be run as a case-insensitive regexp match. Wide character versions are
416   // also provided after each ASCII version.
417   // For parsing, we are slightly more lenient in our interpretation than for
418   // matching. Here we allow a "comma" as a possible extension indicator. When
419   // matching, this is hardly ever used to indicate this.
420   const string extn_patterns_for_parsing_;
421
422  public:
423   scoped_ptr<const AbstractRegExpFactory> regexp_factory_;
424   scoped_ptr<RegExpCache> regexp_cache_;
425
426   // A map that contains characters that are essential when dialling. That means
427   // any of the characters in this map must not be removed from a number when
428   // dialing, otherwise the call will not reach the intended destination.
429   map<char32, char> diallable_char_mappings_;
430   // These mappings map a character (key) to a specific digit that should
431   // replace it for normalization purposes.
432   map<char32, char> alpha_mappings_;
433   // For performance reasons, store a map of combining alpha_mappings with ASCII
434   // digits.
435   map<char32, char> alpha_phone_mappings_;
436
437   // Separate map of all symbols that we wish to retain when formatting alpha
438   // numbers. This includes digits, ascii letters and number grouping symbols
439   // such as "-" and " ".
440   map<char32, char> all_plus_number_grouping_symbols_;
441
442   // Map of country calling codes that use a mobile token before the area code.
443   // One example of when this is relevant is when determining the length of the
444   // national destination code, which should be the length of the area code plus
445   // the length of the mobile token.
446   map<int, char> mobile_token_mappings_;
447
448   // Pattern that makes it easy to distinguish whether a region has a unique
449   // international dialing prefix or not. If a region has a unique international
450   // prefix (e.g. 011 in USA), it will be represented as a string that contains
451   // a sequence of ASCII digits. If there are multiple available international
452   // prefixes in a region, they will be represented as a regex string that
453   // always contains character(s) other than ASCII digits.
454   // Note this regex also includes tilde, which signals waiting for the tone.
455   scoped_ptr<const RegExp> unique_international_prefix_;
456
457   scoped_ptr<const RegExp> digits_pattern_;
458   scoped_ptr<const RegExp> capturing_digit_pattern_;
459   scoped_ptr<const RegExp> capturing_ascii_digits_pattern_;
460
461   // Regular expression of acceptable characters that may start a phone number
462   // for the purposes of parsing. This allows us to strip away meaningless
463   // prefixes to phone numbers that may be mistakenly given to us. This consists
464   // of digits, the plus symbol and arabic-indic digits. This does not contain
465   // alpha characters, although they may be used later in the number. It also
466   // does not include other punctuation, as this will be stripped later during
467   // parsing and is of no information value when parsing a number. The string
468   // starting with this valid character is captured.
469   // This corresponds to VALID_START_CHAR in the java version.
470   scoped_ptr<const RegExp> valid_start_char_pattern_;
471
472   // Regular expression of valid characters before a marker that might indicate
473   // a second number.
474   scoped_ptr<const RegExp> capture_up_to_second_number_start_pattern_;
475
476   // Regular expression of trailing characters that we want to remove. We remove
477   // all characters that are not alpha or numerical characters. The hash
478   // character is retained here, as it may signify the previous block was an
479   // extension. Note the capturing block at the start to capture the rest of the
480   // number if this was a match.
481   // This corresponds to UNWANTED_END_CHAR_PATTERN in the java version.
482   scoped_ptr<const RegExp> unwanted_end_char_pattern_;
483
484   // Regular expression of groups of valid punctuation characters.
485   scoped_ptr<const RegExp> separator_pattern_;
486
487   // Regexp of all possible ways to write extensions, for use when finding phone
488   // numbers in text. This will be run as a case-insensitive regexp match. Wide
489   // character versions are also provided after each ASCII version.
490   const string extn_patterns_for_matching_;
491
492   // Regexp of all known extension prefixes used by different regions followed
493   // by 1 or more valid digits, for use when parsing.
494   scoped_ptr<const RegExp> extn_pattern_;
495
496   // We append optionally the extension pattern to the end here, as a valid
497   // phone number may have an extension prefix appended, followed by 1 or more
498   // digits.
499   scoped_ptr<const RegExp> valid_phone_number_pattern_;
500
501   // We use this pattern to check if the phone number has at least three letters
502   // in it - if so, then we treat it as a number where some phone-number digits
503   // are represented by letters.
504   scoped_ptr<const RegExp> valid_alpha_phone_pattern_;
505
506   scoped_ptr<const RegExp> first_group_capturing_pattern_;
507
508   scoped_ptr<const RegExp> carrier_code_pattern_;
509
510   scoped_ptr<const RegExp> plus_chars_pattern_;
511
512   PhoneNumberRegExpsAndMappings()
513       : punctuation_and_star_sign_(StrCat(PhoneNumberUtil::kValidPunctuation,
514                                           kStarSign)),
515         min_length_phone_number_pattern_(
516             StrCat(kDigits, "{", PhoneNumberUtil::kMinLengthForNsn, "}")),
517         valid_phone_number_(
518             StrCat(min_length_phone_number_pattern_, "|[",
519                    PhoneNumberUtil::kPlusChars, "]*(?:[",
520                    punctuation_and_star_sign_, "]*",
521                    kDigits, "){3,}[", kValidAlpha,
522                    punctuation_and_star_sign_, kDigits,
523                    "]*")),
524         extn_patterns_for_parsing_(
525             CreateExtnPattern(StrCat(",", kSingleExtnSymbolsForMatching))),
526         regexp_factory_(new RegExpFactory()),
527         regexp_cache_(new RegExpCache(*regexp_factory_.get(), 128)),
528         diallable_char_mappings_(),
529         alpha_mappings_(),
530         alpha_phone_mappings_(),
531         all_plus_number_grouping_symbols_(),
532         mobile_token_mappings_(),
533         unique_international_prefix_(regexp_factory_->CreateRegExp(
534             /* "[\\d]+(?:[~⁓∼~][\\d]+)?" */
535             "[\\d]+(?:[~\xE2\x81\x93\xE2\x88\xBC\xEF\xBD\x9E][\\d]+)?")),
536         digits_pattern_(
537             regexp_factory_->CreateRegExp(StrCat("[", kDigits, "]*"))),
538         capturing_digit_pattern_(
539             regexp_factory_->CreateRegExp(StrCat("([", kDigits, "])"))),
540         capturing_ascii_digits_pattern_(
541             regexp_factory_->CreateRegExp("(\\d+)")),
542         valid_start_char_pattern_(regexp_factory_->CreateRegExp(
543             StrCat("[", PhoneNumberUtil::kPlusChars, kDigits, "]"))),
544         capture_up_to_second_number_start_pattern_(
545             regexp_factory_->CreateRegExp(
546                 PhoneNumberUtil::kCaptureUpToSecondNumberStart)),
547         unwanted_end_char_pattern_(
548             regexp_factory_->CreateRegExp("[^\\p{N}\\p{L}#]")),
549         separator_pattern_(
550             regexp_factory_->CreateRegExp(
551                 StrCat("[", PhoneNumberUtil::kValidPunctuation, "]+"))),
552         extn_patterns_for_matching_(
553             CreateExtnPattern(kSingleExtnSymbolsForMatching)),
554         extn_pattern_(regexp_factory_->CreateRegExp(
555             StrCat("(?i)(?:", extn_patterns_for_parsing_, ")$"))),
556         valid_phone_number_pattern_(regexp_factory_->CreateRegExp(
557             StrCat("(?i)", valid_phone_number_,
558                    "(?:", extn_patterns_for_parsing_, ")?"))),
559         valid_alpha_phone_pattern_(regexp_factory_->CreateRegExp(
560             StrCat("(?i)(?:.*?[", kValidAlpha, "]){3}"))),
561         // The first_group_capturing_pattern was originally set to $1 but there
562         // are some countries for which the first group is not used in the
563         // national pattern (e.g. Argentina) so the $1 group does not match
564         // correctly. Therefore, we use \d, so that the first group actually
565         // used in the pattern will be matched.
566         first_group_capturing_pattern_(
567             regexp_factory_->CreateRegExp("(\\$\\d)")),
568         carrier_code_pattern_(regexp_factory_->CreateRegExp("\\$CC")),
569         plus_chars_pattern_(
570             regexp_factory_->CreateRegExp(
571                 StrCat("[", PhoneNumberUtil::kPlusChars, "]+"))) {
572     InitializeMapsAndSets();
573   }
574
575  private:
576   DISALLOW_COPY_AND_ASSIGN(PhoneNumberRegExpsAndMappings);
577 };
578
579 // Private constructor. Also takes care of initialisation.
580 PhoneNumberUtil::PhoneNumberUtil()
581     : logger_(Logger::set_logger_impl(new NullLogger())),
582       reg_exps_(new PhoneNumberRegExpsAndMappings),
583       country_calling_code_to_region_code_map_(new vector<IntRegionsPair>()),
584       nanpa_regions_(new set<string>()),
585       region_to_metadata_map_(new map<string, PhoneMetadata>()),
586       country_code_to_non_geographical_metadata_map_(
587           new map<int, PhoneMetadata>) {
588   Logger::set_logger_impl(logger_.get());
589   // TODO: Update the java version to put the contents of the init
590   // method inside the constructor as well to keep both in sync.
591   PhoneMetadataCollection metadata_collection;
592   if (!LoadCompiledInMetadata(&metadata_collection)) {
593     LOG(DFATAL) << "Could not parse compiled-in metadata.";
594     return;
595   }
596   // Storing data in a temporary map to make it easier to find other regions
597   // that share a country calling code when inserting data.
598   map<int, list<string>* > country_calling_code_to_region_map;
599   for (RepeatedPtrField<PhoneMetadata>::const_iterator it =
600            metadata_collection.metadata().begin();
601        it != metadata_collection.metadata().end();
602        ++it) {
603     const string& region_code = it->id();
604     if (region_code == RegionCode::GetUnknown()) {
605       continue;
606     }
607
608     int country_calling_code = it->country_code();
609     if (kRegionCodeForNonGeoEntity == region_code) {
610       country_code_to_non_geographical_metadata_map_->insert(
611           std::make_pair(country_calling_code, *it));
612     } else {
613       region_to_metadata_map_->insert(std::make_pair(region_code, *it));
614     }
615     map<int, list<string>* >::iterator calling_code_in_map =
616         country_calling_code_to_region_map.find(country_calling_code);
617     if (calling_code_in_map != country_calling_code_to_region_map.end()) {
618       if (it->main_country_for_code()) {
619         calling_code_in_map->second->push_front(region_code);
620       } else {
621         calling_code_in_map->second->push_back(region_code);
622       }
623     } else {
624       // For most country calling codes, there will be only one region code.
625       list<string>* list_with_region_code = new list<string>();
626       list_with_region_code->push_back(region_code);
627       country_calling_code_to_region_map.insert(
628           std::make_pair(country_calling_code, list_with_region_code));
629     }
630     if (country_calling_code == kNanpaCountryCode) {
631         nanpa_regions_->insert(region_code);
632     }
633   }
634
635   country_calling_code_to_region_code_map_->insert(
636       country_calling_code_to_region_code_map_->begin(),
637       country_calling_code_to_region_map.begin(),
638       country_calling_code_to_region_map.end());
639   // Sort all the pairs in ascending order according to country calling code.
640   std::sort(country_calling_code_to_region_code_map_->begin(),
641             country_calling_code_to_region_code_map_->end(),
642             OrderByFirst());
643 }
644
645 PhoneNumberUtil::~PhoneNumberUtil() {
646   STLDeleteContainerPairSecondPointers(
647       country_calling_code_to_region_code_map_->begin(),
648       country_calling_code_to_region_code_map_->end());
649 }
650
651 void PhoneNumberUtil::GetSupportedRegions(set<string>* regions) const {
652   DCHECK(regions);
653   for (map<string, PhoneMetadata>::const_iterator it =
654        region_to_metadata_map_->begin(); it != region_to_metadata_map_->end();
655        ++it) {
656     regions->insert(it->first);
657   }
658 }
659
660 void PhoneNumberUtil::GetSupportedGlobalNetworkCallingCodes(
661     set<int>* calling_codes) const {
662   DCHECK(calling_codes);
663   for (map<int, PhoneMetadata>::const_iterator it =
664            country_code_to_non_geographical_metadata_map_->begin();
665        it != country_code_to_non_geographical_metadata_map_->end(); ++it) {
666     calling_codes->insert(it->first);
667   }
668 }
669
670 // Public wrapper function to get a PhoneNumberUtil instance with the default
671 // metadata file.
672 // static
673 PhoneNumberUtil* PhoneNumberUtil::GetInstance() {
674   return Singleton<PhoneNumberUtil>::GetInstance();
675 }
676
677 const string& PhoneNumberUtil::GetExtnPatternsForMatching() const {
678   return reg_exps_->extn_patterns_for_matching_;
679 }
680
681 bool PhoneNumberUtil::StartsWithPlusCharsPattern(const string& number)
682     const {
683   const scoped_ptr<RegExpInput> number_string_piece(
684       reg_exps_->regexp_factory_->CreateInput(number));
685   return reg_exps_->plus_chars_pattern_->Consume(number_string_piece.get());
686 }
687
688 bool PhoneNumberUtil::ContainsOnlyValidDigits(const string& s) const {
689   return reg_exps_->digits_pattern_->FullMatch(s);
690 }
691
692 void PhoneNumberUtil::TrimUnwantedEndChars(string* number) const {
693   DCHECK(number);
694   UnicodeText number_as_unicode;
695   number_as_unicode.PointToUTF8(number->data(), number->size());
696   char current_char[5];
697   int len;
698   UnicodeText::const_reverse_iterator reverse_it(number_as_unicode.end());
699   for (; reverse_it.base() != number_as_unicode.begin(); ++reverse_it) {
700     len = reverse_it.get_utf8(current_char);
701     current_char[len] = '\0';
702     if (!reg_exps_->unwanted_end_char_pattern_->FullMatch(current_char)) {
703       break;
704     }
705   }
706
707   number->assign(UnicodeText::UTF8Substring(number_as_unicode.begin(),
708                                             reverse_it.base()));
709 }
710
711 bool PhoneNumberUtil::IsFormatEligibleForAsYouTypeFormatter(
712     const string& format) const {
713   // A pattern that is used to determine if a numberFormat under
714   // availableFormats is eligible to be used by the AYTF. It is eligible when
715   // the format element under numberFormat contains groups of the dollar sign
716   // followed by a single digit, separated by valid phone number punctuation.
717   // This prevents invalid punctuation (such as the star sign in Israeli star
718   // numbers) getting into the output of the AYTF.
719   const RegExp& eligible_format_pattern = reg_exps_->regexp_cache_->GetRegExp(
720       StrCat("[", kValidPunctuation, "]*", "(\\$\\d", "[",
721              kValidPunctuation, "]*)+"));
722   return eligible_format_pattern.FullMatch(format);
723 }
724
725 bool PhoneNumberUtil::FormattingRuleHasFirstGroupOnly(
726     const string& national_prefix_formatting_rule) const {
727   // A pattern that is used to determine if the national prefix formatting rule
728   // has the first group only, i.e., does not start with the national prefix.
729   // Note that the pattern explicitly allows for unbalanced parentheses.
730   const RegExp& first_group_only_prefix_pattern =
731       reg_exps_->regexp_cache_->GetRegExp("\\(?\\$1\\)?");
732   return national_prefix_formatting_rule.empty() ||
733       first_group_only_prefix_pattern.FullMatch(
734           national_prefix_formatting_rule);
735 }
736
737 void PhoneNumberUtil::GetNddPrefixForRegion(const string& region_code,
738                                             bool strip_non_digits,
739                                             string* national_prefix) const {
740   DCHECK(national_prefix);
741   const PhoneMetadata* metadata = GetMetadataForRegion(region_code);
742   if (!metadata) {
743     LOG(WARNING) << "Invalid or unknown region code (" << region_code
744                  << ") provided.";
745     return;
746   }
747   national_prefix->assign(metadata->national_prefix());
748   if (strip_non_digits) {
749     // Note: if any other non-numeric symbols are ever used in national
750     // prefixes, these would have to be removed here as well.
751     strrmm(national_prefix, "~");
752   }
753 }
754
755 bool PhoneNumberUtil::IsValidRegionCode(const string& region_code) const {
756   return (region_to_metadata_map_->find(region_code) !=
757           region_to_metadata_map_->end());
758 }
759
760 bool PhoneNumberUtil::HasValidCountryCallingCode(
761     int country_calling_code) const {
762   // Create an IntRegionsPair with the country_code passed in, and use it to
763   // locate the pair with the same country_code in the sorted vector.
764   IntRegionsPair target_pair;
765   target_pair.first = country_calling_code;
766   return (binary_search(country_calling_code_to_region_code_map_->begin(),
767                         country_calling_code_to_region_code_map_->end(),
768                         target_pair, OrderByFirst()));
769 }
770
771 // Returns a pointer to the phone metadata for the appropriate region or NULL
772 // if the region code is invalid or unknown.
773 const PhoneMetadata* PhoneNumberUtil::GetMetadataForRegion(
774     const string& region_code) const {
775   map<string, PhoneMetadata>::const_iterator it =
776       region_to_metadata_map_->find(region_code);
777   if (it != region_to_metadata_map_->end()) {
778     return &it->second;
779   }
780   return NULL;
781 }
782
783 const PhoneMetadata* PhoneNumberUtil::GetMetadataForNonGeographicalRegion(
784     int country_calling_code) const {
785   map<int, PhoneMetadata>::const_iterator it =
786       country_code_to_non_geographical_metadata_map_->find(
787           country_calling_code);
788   if (it != country_code_to_non_geographical_metadata_map_->end()) {
789     return &it->second;
790   }
791   return NULL;
792 }
793
794 void PhoneNumberUtil::Format(const PhoneNumber& number,
795                              PhoneNumberFormat number_format,
796                              string* formatted_number) const {
797   DCHECK(formatted_number);
798   if (number.national_number() == 0) {
799     const string& raw_input = number.raw_input();
800     if (!raw_input.empty()) {
801       // Unparseable numbers that kept their raw input just use that.
802       // This is the only case where a number can be formatted as E164 without a
803       // leading '+' symbol (but the original number wasn't parseable anyway).
804       // TODO: Consider removing the 'if' above so that unparseable
805       // strings without raw input format to the empty string instead of "+00".
806       formatted_number->assign(raw_input);
807       return;
808     }
809   }
810   int country_calling_code = number.country_code();
811   string national_significant_number;
812   GetNationalSignificantNumber(number, &national_significant_number);
813   if (number_format == E164) {
814     // Early exit for E164 case (even if the country calling code is invalid)
815     // since no formatting of the national number needs to be applied.
816     // Extensions are not formatted.
817     formatted_number->assign(national_significant_number);
818     PrefixNumberWithCountryCallingCode(country_calling_code, E164,
819                                        formatted_number);
820     return;
821   }
822   if (!HasValidCountryCallingCode(country_calling_code)) {
823     formatted_number->assign(national_significant_number);
824     return;
825   }
826   // Note here that all NANPA formatting rules are contained by US, so we use
827   // that to format NANPA numbers. The same applies to Russian Fed regions -
828   // rules are contained by Russia. French Indian Ocean country rules are
829   // contained by Réunion.
830   string region_code;
831   GetRegionCodeForCountryCode(country_calling_code, &region_code);
832   // Metadata cannot be NULL because the country calling code is valid (which
833   // means that the region code cannot be ZZ and must be one of our supported
834   // region codes).
835   const PhoneMetadata* metadata =
836       GetMetadataForRegionOrCallingCode(country_calling_code, region_code);
837   FormatNsn(national_significant_number, *metadata, number_format,
838             formatted_number);
839   MaybeAppendFormattedExtension(number, *metadata, number_format,
840                                 formatted_number);
841   PrefixNumberWithCountryCallingCode(country_calling_code, number_format,
842                                      formatted_number);
843 }
844
845 void PhoneNumberUtil::FormatByPattern(
846     const PhoneNumber& number,
847     PhoneNumberFormat number_format,
848     const RepeatedPtrField<NumberFormat>& user_defined_formats,
849     string* formatted_number) const {
850   DCHECK(formatted_number);
851   int country_calling_code = number.country_code();
852   // Note GetRegionCodeForCountryCode() is used because formatting information
853   // for regions which share a country calling code is contained by only one
854   // region for performance reasons. For example, for NANPA regions it will be
855   // contained in the metadata for US.
856   string national_significant_number;
857   GetNationalSignificantNumber(number, &national_significant_number);
858   if (!HasValidCountryCallingCode(country_calling_code)) {
859     formatted_number->assign(national_significant_number);
860     return;
861   }
862   string region_code;
863   GetRegionCodeForCountryCode(country_calling_code, &region_code);
864   // Metadata cannot be NULL because the country calling code is valid.
865   const PhoneMetadata* metadata =
866       GetMetadataForRegionOrCallingCode(country_calling_code, region_code);
867   const NumberFormat* formatting_pattern =
868       ChooseFormattingPatternForNumber(user_defined_formats,
869                                        national_significant_number);
870   if (!formatting_pattern) {
871     // If no pattern above is matched, we format the number as a whole.
872     formatted_number->assign(national_significant_number);
873   } else {
874     NumberFormat num_format_copy;
875     // Before we do a replacement of the national prefix pattern $NP with the
876     // national prefix, we need to copy the rule so that subsequent replacements
877     // for different numbers have the appropriate national prefix.
878     num_format_copy.MergeFrom(*formatting_pattern);
879     string national_prefix_formatting_rule(
880         formatting_pattern->national_prefix_formatting_rule());
881     if (!national_prefix_formatting_rule.empty()) {
882       const string& national_prefix = metadata->national_prefix();
883       if (!national_prefix.empty()) {
884         // Replace $NP with national prefix and $FG with the first group ($1).
885         GlobalReplaceSubstring("$NP", national_prefix,
886                                &national_prefix_formatting_rule);
887         GlobalReplaceSubstring("$FG", "$1",
888                                &national_prefix_formatting_rule);
889         num_format_copy.set_national_prefix_formatting_rule(
890             national_prefix_formatting_rule);
891       } else {
892         // We don't want to have a rule for how to format the national prefix if
893         // there isn't one.
894         num_format_copy.clear_national_prefix_formatting_rule();
895       }
896     }
897     FormatNsnUsingPattern(national_significant_number, num_format_copy,
898                           number_format, formatted_number);
899   }
900   MaybeAppendFormattedExtension(number, *metadata, NATIONAL, formatted_number);
901   PrefixNumberWithCountryCallingCode(country_calling_code, number_format,
902                                      formatted_number);
903 }
904
905 void PhoneNumberUtil::FormatNationalNumberWithCarrierCode(
906     const PhoneNumber& number,
907     const string& carrier_code,
908     string* formatted_number) const {
909   int country_calling_code = number.country_code();
910   string national_significant_number;
911   GetNationalSignificantNumber(number, &national_significant_number);
912   if (!HasValidCountryCallingCode(country_calling_code)) {
913     formatted_number->assign(national_significant_number);
914     return;
915   }
916
917   // Note GetRegionCodeForCountryCode() is used because formatting information
918   // for regions which share a country calling code is contained by only one
919   // region for performance reasons. For example, for NANPA regions it will be
920   // contained in the metadata for US.
921   string region_code;
922   GetRegionCodeForCountryCode(country_calling_code, &region_code);
923   // Metadata cannot be NULL because the country calling code is valid.
924   const PhoneMetadata* metadata =
925       GetMetadataForRegionOrCallingCode(country_calling_code, region_code);
926   FormatNsnWithCarrier(national_significant_number, *metadata, NATIONAL,
927                        carrier_code, formatted_number);
928   MaybeAppendFormattedExtension(number, *metadata, NATIONAL, formatted_number);
929   PrefixNumberWithCountryCallingCode(country_calling_code, NATIONAL,
930                                      formatted_number);
931 }
932
933 const PhoneMetadata* PhoneNumberUtil::GetMetadataForRegionOrCallingCode(
934       int country_calling_code, const string& region_code) const {
935   return kRegionCodeForNonGeoEntity == region_code
936       ? GetMetadataForNonGeographicalRegion(country_calling_code)
937       : GetMetadataForRegion(region_code);
938 }
939
940 void PhoneNumberUtil::FormatNationalNumberWithPreferredCarrierCode(
941     const PhoneNumber& number,
942     const string& fallback_carrier_code,
943     string* formatted_number) const {
944   FormatNationalNumberWithCarrierCode(
945       number,
946       number.has_preferred_domestic_carrier_code()
947           ? number.preferred_domestic_carrier_code()
948           : fallback_carrier_code,
949       formatted_number);
950 }
951
952 void PhoneNumberUtil::FormatNumberForMobileDialing(
953     const PhoneNumber& number,
954     const string& calling_from,
955     bool with_formatting,
956     string* formatted_number) const {
957   int country_calling_code = number.country_code();
958   if (!HasValidCountryCallingCode(country_calling_code)) {
959     formatted_number->assign(number.has_raw_input() ? number.raw_input() : "");
960     return;
961   }
962
963   formatted_number->assign("");
964   // Clear the extension, as that part cannot normally be dialed together with
965   // the main number.
966   PhoneNumber number_no_extension(number);
967   number_no_extension.clear_extension();
968   string region_code;
969   GetRegionCodeForCountryCode(country_calling_code, &region_code);
970   PhoneNumberType number_type = GetNumberType(number_no_extension);
971   bool is_valid_number = (number_type != UNKNOWN);
972   if (calling_from == region_code) {
973     bool is_fixed_line_or_mobile =
974         (number_type == FIXED_LINE) || (number_type == MOBILE) ||
975         (number_type == FIXED_LINE_OR_MOBILE);
976     // Carrier codes may be needed in some countries. We handle this here.
977     if ((region_code == "CO") && (number_type == FIXED_LINE)) {
978       FormatNationalNumberWithCarrierCode(
979           number_no_extension, kColombiaMobileToFixedLinePrefix,
980           formatted_number);
981     } else if ((region_code == "BR") && (is_fixed_line_or_mobile)) {
982       if (number_no_extension.has_preferred_domestic_carrier_code()) {
983       FormatNationalNumberWithPreferredCarrierCode(number_no_extension, "",
984                                                    formatted_number);
985       } else {
986         // Brazilian fixed line and mobile numbers need to be dialed with a
987         // carrier code when called within Brazil. Without that, most of the
988         // carriers won't connect the call. Because of that, we return an empty
989         // string here.
990         formatted_number->assign("");
991       }
992     } else if (is_valid_number && region_code == "HU") {
993       // The national format for HU numbers doesn't contain the national prefix,
994       // because that is how numbers are normally written down. However, the
995       // national prefix is obligatory when dialing from a mobile phone, except
996       // for short numbers. As a result, we add it back here if it is a valid
997       // regular length phone number.
998       Format(number_no_extension, NATIONAL, formatted_number);
999       string hu_national_prefix;
1000       GetNddPrefixForRegion(region_code, true /* strip non-digits */,
1001                             &hu_national_prefix);
1002       formatted_number->assign(
1003           StrCat(hu_national_prefix, " ", *formatted_number));
1004     } else if (country_calling_code == kNanpaCountryCode) {
1005       // For NANPA countries, we output international format for numbers that
1006       // can be dialed internationally, since that always works, except for
1007       // numbers which might potentially be short numbers, which are always
1008       // dialled in national format.
1009       const PhoneMetadata* region_metadata = GetMetadataForRegion(calling_from);
1010       string national_number;
1011       GetNationalSignificantNumber(number_no_extension, &national_number);
1012       if (CanBeInternationallyDialled(number_no_extension) &&
1013           !IsShorterThanPossibleNormalNumber(region_metadata,
1014               national_number)) {
1015         Format(number_no_extension, INTERNATIONAL, formatted_number);
1016       } else {
1017         Format(number_no_extension, NATIONAL, formatted_number);
1018       }
1019     } else {
1020       // For non-geographical countries, and Mexican and Chilean fixed line and
1021       // mobile numbers, we output international format for numbers that can be
1022       // dialed internationally as that always works.
1023       if ((region_code == kRegionCodeForNonGeoEntity ||
1024            // MX fixed line and mobile numbers should always be formatted in
1025            // international format, even when dialed within MX. For national
1026            // format to work, a carrier code needs to be used, and the correct
1027            // carrier code depends on if the caller and callee are from the same
1028            // local area. It is trickier to get that to work correctly than
1029            // using international format, which is tested to work fine on all
1030            // carriers.
1031            // CL fixed line numbers need the national prefix when dialing in the
1032            // national format, but don't have it when used for display. The
1033            // reverse is true for mobile numbers. As a result, we output them in
1034            // the international format to make it work.
1035            ((region_code == "MX" || region_code == "CL") &&
1036                is_fixed_line_or_mobile)) &&
1037           CanBeInternationallyDialled(number_no_extension)) {
1038         Format(number_no_extension, INTERNATIONAL, formatted_number);
1039       } else {
1040         Format(number_no_extension, NATIONAL, formatted_number);
1041       }
1042     }
1043   } else if (is_valid_number &&
1044       CanBeInternationallyDialled(number_no_extension)) {
1045     // We assume that short numbers are not diallable from outside their
1046     // region, so if a number is not a valid regular length phone number, we
1047     // treat it as if it cannot be internationally dialled.
1048     with_formatting
1049         ? Format(number_no_extension, INTERNATIONAL, formatted_number)
1050         : Format(number_no_extension, E164, formatted_number);
1051     return;
1052   }
1053   if (!with_formatting) {
1054     NormalizeDiallableCharsOnly(formatted_number);
1055   }
1056 }
1057
1058 void PhoneNumberUtil::FormatOutOfCountryCallingNumber(
1059     const PhoneNumber& number,
1060     const string& calling_from,
1061     string* formatted_number) const {
1062   DCHECK(formatted_number);
1063   if (!IsValidRegionCode(calling_from)) {
1064     LOG(WARNING) << "Trying to format number from invalid region "
1065                  << calling_from
1066                  << ". International formatting applied.";
1067     Format(number, INTERNATIONAL, formatted_number);
1068     return;
1069   }
1070   int country_code = number.country_code();
1071   string national_significant_number;
1072   GetNationalSignificantNumber(number, &national_significant_number);
1073   if (!HasValidCountryCallingCode(country_code)) {
1074     formatted_number->assign(national_significant_number);
1075     return;
1076   }
1077   if (country_code == kNanpaCountryCode) {
1078     if (IsNANPACountry(calling_from)) {
1079       // For NANPA regions, return the national format for these regions but
1080       // prefix it with the country calling code.
1081       Format(number, NATIONAL, formatted_number);
1082       formatted_number->insert(0, StrCat(country_code, " "));
1083       return;
1084     }
1085   } else if (country_code == GetCountryCodeForValidRegion(calling_from)) {
1086     // If neither region is a NANPA region, then we check to see if the
1087     // country calling code of the number and the country calling code of the
1088     // region we are calling from are the same.
1089     // For regions that share a country calling code, the country calling code
1090     // need not be dialled. This also applies when dialling within a region, so
1091     // this if clause covers both these cases.
1092     // Technically this is the case for dialling from la Réunion to other
1093     // overseas departments of France (French Guiana, Martinique, Guadeloupe),
1094     // but not vice versa - so we don't cover this edge case for now and for
1095     // those cases return the version including country calling code.
1096     // Details here:
1097     // http://www.petitfute.com/voyage/225-info-pratiques-reunion
1098     Format(number, NATIONAL, formatted_number);
1099     return;
1100   }
1101   // Metadata cannot be NULL because we checked 'IsValidRegionCode()' above.
1102   const PhoneMetadata* metadata_calling_from =
1103       GetMetadataForRegion(calling_from);
1104   const string& international_prefix =
1105       metadata_calling_from->international_prefix();
1106
1107   // For regions that have multiple international prefixes, the international
1108   // format of the number is returned, unless there is a preferred international
1109   // prefix.
1110   const string international_prefix_for_formatting(
1111       reg_exps_->unique_international_prefix_->FullMatch(international_prefix)
1112       ? international_prefix
1113       : metadata_calling_from->preferred_international_prefix());
1114
1115   string region_code;
1116   GetRegionCodeForCountryCode(country_code, &region_code);
1117   // Metadata cannot be NULL because the country_code is valid.
1118   const PhoneMetadata* metadata_for_region =
1119       GetMetadataForRegionOrCallingCode(country_code, region_code);
1120   FormatNsn(national_significant_number, *metadata_for_region, INTERNATIONAL,
1121             formatted_number);
1122   MaybeAppendFormattedExtension(number, *metadata_for_region, INTERNATIONAL,
1123                                 formatted_number);
1124   if (!international_prefix_for_formatting.empty()) {
1125     formatted_number->insert(
1126         0, StrCat(international_prefix_for_formatting, " ", country_code, " "));
1127   } else {
1128     PrefixNumberWithCountryCallingCode(country_code, INTERNATIONAL,
1129                                        formatted_number);
1130   }
1131 }
1132
1133 void PhoneNumberUtil::FormatInOriginalFormat(const PhoneNumber& number,
1134                                              const string& region_calling_from,
1135                                              string* formatted_number) const {
1136   DCHECK(formatted_number);
1137
1138   if (number.has_raw_input() &&
1139       (HasUnexpectedItalianLeadingZero(number) ||
1140        !HasFormattingPatternForNumber(number))) {
1141     // We check if we have the formatting pattern because without that, we might
1142     // format the number as a group without national prefix.
1143     formatted_number->assign(number.raw_input());
1144     return;
1145   }
1146   if (!number.has_country_code_source()) {
1147     Format(number, NATIONAL, formatted_number);
1148     return;
1149   }
1150   switch (number.country_code_source()) {
1151     case PhoneNumber::FROM_NUMBER_WITH_PLUS_SIGN:
1152       Format(number, INTERNATIONAL, formatted_number);
1153       break;
1154     case PhoneNumber::FROM_NUMBER_WITH_IDD:
1155       FormatOutOfCountryCallingNumber(number, region_calling_from,
1156                                       formatted_number);
1157       break;
1158     case PhoneNumber::FROM_NUMBER_WITHOUT_PLUS_SIGN:
1159       Format(number, INTERNATIONAL, formatted_number);
1160       formatted_number->erase(formatted_number->begin());
1161       break;
1162     case PhoneNumber::FROM_DEFAULT_COUNTRY:
1163       // Fall-through to default case.
1164     default:
1165       string region_code;
1166       GetRegionCodeForCountryCode(number.country_code(), &region_code);
1167       // We strip non-digits from the NDD here, and from the raw input later, so
1168       // that we can compare them easily.
1169       string national_prefix;
1170       GetNddPrefixForRegion(region_code, true /* strip non-digits */,
1171                             &national_prefix);
1172       if (national_prefix.empty()) {
1173         // If the region doesn't have a national prefix at all, we can safely
1174         // return the national format without worrying about a national prefix
1175         // being added.
1176         Format(number, NATIONAL, formatted_number);
1177         break;
1178       }
1179       // Otherwise, we check if the original number was entered with a national
1180       // prefix.
1181       if (RawInputContainsNationalPrefix(number.raw_input(), national_prefix,
1182                                          region_code)) {
1183         // If so, we can safely return the national format.
1184         Format(number, NATIONAL, formatted_number);
1185         break;
1186       }
1187       // Metadata cannot be NULL here because GetNddPrefixForRegion() (above)
1188       // leaves the prefix empty if there is no metadata for the region.
1189       const PhoneMetadata* metadata = GetMetadataForRegion(region_code);
1190       string national_number;
1191       GetNationalSignificantNumber(number, &national_number);
1192       // This shouldn't be NULL, because we have checked that above with
1193       // HasFormattingPatternForNumber.
1194       const NumberFormat* format_rule =
1195           ChooseFormattingPatternForNumber(metadata->number_format(),
1196                                            national_number);
1197       // The format rule could still be NULL here if the national number was 0
1198       // and there was no raw input (this should not be possible for numbers
1199       // generated by the phonenumber library as they would also not have a
1200       // country calling code and we would have exited earlier).
1201       if (!format_rule) {
1202         Format(number, NATIONAL, formatted_number);
1203         break;
1204       }
1205       // When the format we apply to this number doesn't contain national
1206       // prefix, we can just return the national format.
1207       // TODO: Refactor the code below with the code in
1208       // IsNationalPrefixPresentIfRequired.
1209       string candidate_national_prefix_rule(
1210           format_rule->national_prefix_formatting_rule());
1211       // We assume that the first-group symbol will never be _before_ the
1212       // national prefix.
1213       if (!candidate_national_prefix_rule.empty()) {
1214         candidate_national_prefix_rule.erase(
1215             candidate_national_prefix_rule.find("$1"));
1216         NormalizeDigitsOnly(&candidate_national_prefix_rule);
1217       }
1218       if (candidate_national_prefix_rule.empty()) {
1219         // National prefix not used when formatting this number.
1220         Format(number, NATIONAL, formatted_number);
1221         break;
1222       }
1223       // Otherwise, we need to remove the national prefix from our output.
1224       RepeatedPtrField<NumberFormat> number_formats;
1225       NumberFormat* number_format = number_formats.Add();
1226       number_format->MergeFrom(*format_rule);
1227       number_format->clear_national_prefix_formatting_rule();
1228       FormatByPattern(number, NATIONAL, number_formats, formatted_number);
1229       break;
1230   }
1231   // If no digit is inserted/removed/modified as a result of our formatting, we
1232   // return the formatted phone number; otherwise we return the raw input the
1233   // user entered.
1234   if (!formatted_number->empty() && !number.raw_input().empty()) {
1235     string normalized_formatted_number(*formatted_number);
1236     NormalizeDiallableCharsOnly(&normalized_formatted_number);
1237     string normalized_raw_input(number.raw_input());
1238     NormalizeDiallableCharsOnly(&normalized_raw_input);
1239     if (normalized_formatted_number != normalized_raw_input) {
1240       formatted_number->assign(number.raw_input());
1241     }
1242   }
1243 }
1244
1245 // Check if raw_input, which is assumed to be in the national format, has a
1246 // national prefix. The national prefix is assumed to be in digits-only form.
1247 bool PhoneNumberUtil::RawInputContainsNationalPrefix(
1248     const string& raw_input,
1249     const string& national_prefix,
1250     const string& region_code) const {
1251   string normalized_national_number(raw_input);
1252   NormalizeDigitsOnly(&normalized_national_number);
1253   if (HasPrefixString(normalized_national_number, national_prefix)) {
1254     // Some Japanese numbers (e.g. 00777123) might be mistaken to contain
1255     // the national prefix when written without it (e.g. 0777123) if we just
1256     // do prefix matching. To tackle that, we check the validity of the
1257     // number if the assumed national prefix is removed (777123 won't be
1258     // valid in Japan).
1259     PhoneNumber number_without_national_prefix;
1260     if (Parse(normalized_national_number.substr(national_prefix.length()),
1261               region_code, &number_without_national_prefix)
1262         == NO_PARSING_ERROR) {
1263       return IsValidNumber(number_without_national_prefix);
1264     }
1265   }
1266   return false;
1267 }
1268
1269 bool PhoneNumberUtil::HasUnexpectedItalianLeadingZero(
1270     const PhoneNumber& number) const {
1271   return number.has_italian_leading_zero() &&
1272       !IsLeadingZeroPossible(number.country_code());
1273 }
1274
1275 bool PhoneNumberUtil::HasFormattingPatternForNumber(
1276     const PhoneNumber& number) const {
1277   int country_calling_code = number.country_code();
1278   string region_code;
1279   GetRegionCodeForCountryCode(country_calling_code, &region_code);
1280   const PhoneMetadata* metadata =
1281       GetMetadataForRegionOrCallingCode(country_calling_code, region_code);
1282   if (!metadata) {
1283     return false;
1284   }
1285   string national_number;
1286   GetNationalSignificantNumber(number, &national_number);
1287   const NumberFormat* format_rule =
1288       ChooseFormattingPatternForNumber(metadata->number_format(),
1289                                        national_number);
1290   return format_rule;
1291 }
1292
1293 void PhoneNumberUtil::FormatOutOfCountryKeepingAlphaChars(
1294     const PhoneNumber& number,
1295     const string& calling_from,
1296     string* formatted_number) const {
1297   // If there is no raw input, then we can't keep alpha characters because there
1298   // aren't any. In this case, we return FormatOutOfCountryCallingNumber.
1299   if (number.raw_input().empty()) {
1300     FormatOutOfCountryCallingNumber(number, calling_from, formatted_number);
1301     return;
1302   }
1303   int country_code = number.country_code();
1304   if (!HasValidCountryCallingCode(country_code)) {
1305     formatted_number->assign(number.raw_input());
1306     return;
1307   }
1308   // Strip any prefix such as country calling code, IDD, that was present. We do
1309   // this by comparing the number in raw_input with the parsed number.
1310   string raw_input_copy(number.raw_input());
1311   // Normalize punctuation. We retain number grouping symbols such as " " only.
1312   NormalizeHelper(reg_exps_->all_plus_number_grouping_symbols_, true,
1313                   &raw_input_copy);
1314   // Now we trim everything before the first three digits in the parsed number.
1315   // We choose three because all valid alpha numbers have 3 digits at the start
1316   // - if it does not, then we don't trim anything at all. Similarly, if the
1317   // national number was less than three digits, we don't trim anything at all.
1318   string national_number;
1319   GetNationalSignificantNumber(number, &national_number);
1320   if (national_number.length() > 3) {
1321     size_t first_national_number_digit =
1322         raw_input_copy.find(national_number.substr(0, 3));
1323     if (first_national_number_digit != string::npos) {
1324       raw_input_copy = raw_input_copy.substr(first_national_number_digit);
1325     }
1326   }
1327   const PhoneMetadata* metadata = GetMetadataForRegion(calling_from);
1328   if (country_code == kNanpaCountryCode) {
1329     if (IsNANPACountry(calling_from)) {
1330       StrAppend(formatted_number, country_code, " ", raw_input_copy);
1331       return;
1332     }
1333   } else if (metadata &&
1334              country_code == GetCountryCodeForValidRegion(calling_from)) {
1335     const NumberFormat* formatting_pattern =
1336         ChooseFormattingPatternForNumber(metadata->number_format(),
1337                                          national_number);
1338     if (!formatting_pattern) {
1339       // If no pattern above is matched, we format the original input.
1340       formatted_number->assign(raw_input_copy);
1341       return;
1342     }
1343     NumberFormat new_format;
1344     new_format.MergeFrom(*formatting_pattern);
1345     // The first group is the first group of digits that the user wrote
1346     // together.
1347     new_format.set_pattern("(\\d+)(.*)");
1348     // Here we just concatenate them back together after the national prefix
1349     // has been fixed.
1350     new_format.set_format("$1$2");
1351     // Now we format using this pattern instead of the default pattern, but
1352     // with the national prefix prefixed if necessary.
1353     // This will not work in the cases where the pattern (and not the
1354     // leading digits) decide whether a national prefix needs to be used, since
1355     // we have overridden the pattern to match anything, but that is not the
1356     // case in the metadata to date.
1357     FormatNsnUsingPattern(raw_input_copy, new_format, NATIONAL,
1358                           formatted_number);
1359     return;
1360   }
1361
1362   string international_prefix_for_formatting;
1363   // If an unsupported region-calling-from is entered, or a country with
1364   // multiple international prefixes, the international format of the number is
1365   // returned, unless there is a preferred international prefix.
1366   if (metadata) {
1367     const string& international_prefix = metadata->international_prefix();
1368     international_prefix_for_formatting =
1369         reg_exps_->unique_international_prefix_->FullMatch(international_prefix)
1370         ? international_prefix
1371         : metadata->preferred_international_prefix();
1372   }
1373   if (!international_prefix_for_formatting.empty()) {
1374     StrAppend(formatted_number, international_prefix_for_formatting, " ",
1375               country_code, " ", raw_input_copy);
1376   } else {
1377     // Invalid region entered as country-calling-from (so no metadata was found
1378     // for it) or the region chosen has multiple international dialling
1379     // prefixes.
1380     LOG(WARNING) << "Trying to format number from invalid region "
1381                  << calling_from
1382                  << ". International formatting applied.";
1383     formatted_number->assign(raw_input_copy);
1384     PrefixNumberWithCountryCallingCode(country_code, INTERNATIONAL,
1385                                        formatted_number);
1386   }
1387 }
1388
1389 const NumberFormat* PhoneNumberUtil::ChooseFormattingPatternForNumber(
1390     const RepeatedPtrField<NumberFormat>& available_formats,
1391     const string& national_number) const {
1392   for (RepeatedPtrField<NumberFormat>::const_iterator
1393        it = available_formats.begin(); it != available_formats.end(); ++it) {
1394     int size = it->leading_digits_pattern_size();
1395     if (size > 0) {
1396       const scoped_ptr<RegExpInput> number_copy(
1397           reg_exps_->regexp_factory_->CreateInput(national_number));
1398       // We always use the last leading_digits_pattern, as it is the most
1399       // detailed.
1400       if (!reg_exps_->regexp_cache_->GetRegExp(
1401               it->leading_digits_pattern(size - 1)).Consume(
1402                   number_copy.get())) {
1403         continue;
1404       }
1405     }
1406     const RegExp& pattern_to_match(
1407         reg_exps_->regexp_cache_->GetRegExp(it->pattern()));
1408     if (pattern_to_match.FullMatch(national_number)) {
1409       return &(*it);
1410     }
1411   }
1412   return NULL;
1413 }
1414
1415 // Note that carrier_code is optional - if an empty string, no carrier code
1416 // replacement will take place.
1417 void PhoneNumberUtil::FormatNsnUsingPatternWithCarrier(
1418     const string& national_number,
1419     const NumberFormat& formatting_pattern,
1420     PhoneNumberUtil::PhoneNumberFormat number_format,
1421     const string& carrier_code,
1422     string* formatted_number) const {
1423   DCHECK(formatted_number);
1424   string number_format_rule(formatting_pattern.format());
1425   if (number_format == PhoneNumberUtil::NATIONAL &&
1426       carrier_code.length() > 0 &&
1427       formatting_pattern.domestic_carrier_code_formatting_rule().length() > 0) {
1428     // Replace the $CC in the formatting rule with the desired carrier code.
1429     string carrier_code_formatting_rule =
1430         formatting_pattern.domestic_carrier_code_formatting_rule();
1431     reg_exps_->carrier_code_pattern_->Replace(&carrier_code_formatting_rule,
1432                                               carrier_code);
1433     reg_exps_->first_group_capturing_pattern_->
1434         Replace(&number_format_rule, carrier_code_formatting_rule);
1435   } else {
1436     // Use the national prefix formatting rule instead.
1437     string national_prefix_formatting_rule =
1438         formatting_pattern.national_prefix_formatting_rule();
1439     if (number_format == PhoneNumberUtil::NATIONAL &&
1440         national_prefix_formatting_rule.length() > 0) {
1441       // Apply the national_prefix_formatting_rule as the formatting_pattern
1442       // contains only information on how the national significant number
1443       // should be formatted at this point.
1444       reg_exps_->first_group_capturing_pattern_->Replace(
1445           &number_format_rule, national_prefix_formatting_rule);
1446     }
1447   }
1448   formatted_number->assign(national_number);
1449
1450   const RegExp& pattern_to_match(
1451       reg_exps_->regexp_cache_->GetRegExp(formatting_pattern.pattern()));
1452   pattern_to_match.GlobalReplace(formatted_number, number_format_rule);
1453
1454   if (number_format == RFC3966) {
1455     // First consume any leading punctuation, if any was present.
1456     const scoped_ptr<RegExpInput> number(
1457         reg_exps_->regexp_factory_->CreateInput(*formatted_number));
1458     if (reg_exps_->separator_pattern_->Consume(number.get())) {
1459       formatted_number->assign(number->ToString());
1460     }
1461     // Then replace all separators with a "-".
1462     reg_exps_->separator_pattern_->GlobalReplace(formatted_number, "-");
1463   }
1464 }
1465
1466 // Simple wrapper of FormatNsnUsingPatternWithCarrier for the common case of
1467 // no carrier code.
1468 void PhoneNumberUtil::FormatNsnUsingPattern(
1469     const string& national_number,
1470     const NumberFormat& formatting_pattern,
1471     PhoneNumberUtil::PhoneNumberFormat number_format,
1472     string* formatted_number) const {
1473   DCHECK(formatted_number);
1474   FormatNsnUsingPatternWithCarrier(national_number, formatting_pattern,
1475                                    number_format, "", formatted_number);
1476 }
1477
1478 void PhoneNumberUtil::FormatNsn(const string& number,
1479                                 const PhoneMetadata& metadata,
1480                                 PhoneNumberFormat number_format,
1481                                 string* formatted_number) const {
1482   DCHECK(formatted_number);
1483   FormatNsnWithCarrier(number, metadata, number_format, "", formatted_number);
1484 }
1485
1486 // Note in some regions, the national number can be written in two completely
1487 // different ways depending on whether it forms part of the NATIONAL format or
1488 // INTERNATIONAL format. The number_format parameter here is used to specify
1489 // which format to use for those cases. If a carrier_code is specified, this
1490 // will be inserted into the formatted string to replace $CC.
1491 void PhoneNumberUtil::FormatNsnWithCarrier(const string& number,
1492                                            const PhoneMetadata& metadata,
1493                                            PhoneNumberFormat number_format,
1494                                            const string& carrier_code,
1495                                            string* formatted_number) const {
1496   DCHECK(formatted_number);
1497   // When the intl_number_formats exists, we use that to format national number
1498   // for the INTERNATIONAL format instead of using the number_formats.
1499   const RepeatedPtrField<NumberFormat> available_formats =
1500       (metadata.intl_number_format_size() == 0 || number_format == NATIONAL)
1501       ? metadata.number_format()
1502       : metadata.intl_number_format();
1503   const NumberFormat* formatting_pattern =
1504       ChooseFormattingPatternForNumber(available_formats, number);
1505   if (!formatting_pattern) {
1506     formatted_number->assign(number);
1507   } else {
1508     FormatNsnUsingPatternWithCarrier(number, *formatting_pattern, number_format,
1509                                      carrier_code, formatted_number);
1510   }
1511 }
1512
1513 // Appends the formatted extension of a phone number, if the phone number had an
1514 // extension specified.
1515 void PhoneNumberUtil::MaybeAppendFormattedExtension(
1516     const PhoneNumber& number,
1517     const PhoneMetadata& metadata,
1518     PhoneNumberFormat number_format,
1519     string* formatted_number) const {
1520   DCHECK(formatted_number);
1521   if (number.has_extension() && number.extension().length() > 0) {
1522     if (number_format == RFC3966) {
1523       StrAppend(formatted_number, kRfc3966ExtnPrefix, number.extension());
1524     } else {
1525       if (metadata.has_preferred_extn_prefix()) {
1526         StrAppend(formatted_number, metadata.preferred_extn_prefix(),
1527                   number.extension());
1528       } else {
1529         StrAppend(formatted_number, kDefaultExtnPrefix, number.extension());
1530       }
1531     }
1532   }
1533 }
1534
1535 bool PhoneNumberUtil::IsNANPACountry(const string& region_code) const {
1536   return nanpa_regions_->find(region_code) != nanpa_regions_->end();
1537 }
1538
1539 // Returns the region codes that matches the specific country calling code. In
1540 // the case of no region code being found, region_codes will be left empty.
1541 void PhoneNumberUtil::GetRegionCodesForCountryCallingCode(
1542     int country_calling_code,
1543     list<string>* region_codes) const {
1544   DCHECK(region_codes);
1545   // Create a IntRegionsPair with the country_code passed in, and use it to
1546   // locate the pair with the same country_code in the sorted vector.
1547   IntRegionsPair target_pair;
1548   target_pair.first = country_calling_code;
1549   typedef vector<IntRegionsPair>::const_iterator ConstIterator;
1550   pair<ConstIterator, ConstIterator> range = equal_range(
1551       country_calling_code_to_region_code_map_->begin(),
1552       country_calling_code_to_region_code_map_->end(),
1553       target_pair, OrderByFirst());
1554   if (range.first != range.second) {
1555     region_codes->insert(region_codes->begin(),
1556                          range.first->second->begin(),
1557                          range.first->second->end());
1558   }
1559 }
1560
1561 // Returns the region code that matches the specific country calling code. In
1562 // the case of no region code being found, the unknown region code will be
1563 // returned.
1564 void PhoneNumberUtil::GetRegionCodeForCountryCode(
1565     int country_calling_code,
1566     string* region_code) const {
1567   DCHECK(region_code);
1568   list<string> region_codes;
1569
1570   GetRegionCodesForCountryCallingCode(country_calling_code, &region_codes);
1571   *region_code = (region_codes.size() > 0) ?
1572       region_codes.front() : RegionCode::GetUnknown();
1573 }
1574
1575 void PhoneNumberUtil::GetRegionCodeForNumber(const PhoneNumber& number,
1576                                              string* region_code) const {
1577   DCHECK(region_code);
1578   int country_calling_code = number.country_code();
1579   list<string> region_codes;
1580   GetRegionCodesForCountryCallingCode(country_calling_code, &region_codes);
1581   if (region_codes.size() == 0) {
1582     string number_string;
1583     GetNationalSignificantNumber(number, &number_string);
1584     LOG(WARNING) << "Missing/invalid country calling code ("
1585                  << country_calling_code
1586                  << ") for number " << number_string;
1587     *region_code = RegionCode::GetUnknown();
1588     return;
1589   }
1590   if (region_codes.size() == 1) {
1591     *region_code = region_codes.front();
1592   } else {
1593     GetRegionCodeForNumberFromRegionList(number, region_codes, region_code);
1594   }
1595 }
1596
1597 void PhoneNumberUtil::GetRegionCodeForNumberFromRegionList(
1598     const PhoneNumber& number, const list<string>& region_codes,
1599     string* region_code) const {
1600   DCHECK(region_code);
1601   string national_number;
1602   GetNationalSignificantNumber(number, &national_number);
1603   for (list<string>::const_iterator it = region_codes.begin();
1604        it != region_codes.end(); ++it) {
1605     // Metadata cannot be NULL because the region codes come from the country
1606     // calling code map.
1607     const PhoneMetadata* metadata = GetMetadataForRegion(*it);
1608     if (metadata->has_leading_digits()) {
1609       const scoped_ptr<RegExpInput> number(
1610           reg_exps_->regexp_factory_->CreateInput(national_number));
1611       if (reg_exps_->regexp_cache_->
1612               GetRegExp(metadata->leading_digits()).Consume(number.get())) {
1613         *region_code = *it;
1614         return;
1615       }
1616     } else if (GetNumberTypeHelper(national_number, *metadata) != UNKNOWN) {
1617       *region_code = *it;
1618       return;
1619     }
1620   }
1621   *region_code = RegionCode::GetUnknown();
1622 }
1623
1624 int PhoneNumberUtil::GetCountryCodeForRegion(const string& region_code) const {
1625   if (!IsValidRegionCode(region_code)) {
1626     LOG(WARNING) << "Invalid or unknown region code (" << region_code
1627                  << ") provided.";
1628     return 0;
1629   }
1630   return GetCountryCodeForValidRegion(region_code);
1631 }
1632
1633 int PhoneNumberUtil::GetCountryCodeForValidRegion(
1634     const string& region_code) const {
1635   const PhoneMetadata* metadata = GetMetadataForRegion(region_code);
1636   return metadata->country_code();
1637 }
1638
1639 // Gets a valid fixed-line number for the specified region_code. Returns false
1640 // if the region was unknown or 001 (representing non-geographical regions), or
1641 // if no number exists.
1642 bool PhoneNumberUtil::GetExampleNumber(const string& region_code,
1643                                        PhoneNumber* number) const {
1644   DCHECK(number);
1645   return GetExampleNumberForType(region_code, FIXED_LINE, number);
1646 }
1647
1648 // Gets a valid number for the specified region_code and type.  Returns false if
1649 // the country was unknown or 001 (representing non-geographical regions), or if
1650 // no number exists.
1651 bool PhoneNumberUtil::GetExampleNumberForType(
1652     const string& region_code,
1653     PhoneNumberUtil::PhoneNumberType type,
1654     PhoneNumber* number) const {
1655   DCHECK(number);
1656   if (!IsValidRegionCode(region_code)) {
1657     LOG(WARNING) << "Invalid or unknown region code (" << region_code
1658                  << ") provided.";
1659     return false;
1660   }
1661   const PhoneMetadata* region_metadata = GetMetadataForRegion(region_code);
1662   const PhoneNumberDesc* desc = GetNumberDescByType(*region_metadata, type);
1663   if (desc && desc->has_example_number()) {
1664     ErrorType success = Parse(desc->example_number(), region_code, number);
1665     if (success == NO_PARSING_ERROR) {
1666       return true;
1667     } else {
1668       LOG(ERROR) << "Error parsing example number ("
1669                  << static_cast<int>(success) << ")";
1670     }
1671   }
1672   return false;
1673 }
1674
1675 bool PhoneNumberUtil::GetExampleNumberForNonGeoEntity(
1676     int country_calling_code, PhoneNumber* number) const {
1677   DCHECK(number);
1678   const PhoneMetadata* metadata =
1679       GetMetadataForNonGeographicalRegion(country_calling_code);
1680   if (metadata) {
1681     const PhoneNumberDesc& desc = metadata->general_desc();
1682     if (desc.has_example_number()) {
1683       ErrorType success = Parse(StrCat(kPlusSign,
1684                                        SimpleItoa(country_calling_code),
1685                                        desc.example_number()),
1686                                 RegionCode::ZZ(), number);
1687       if (success == NO_PARSING_ERROR) {
1688         return true;
1689       } else {
1690         LOG(ERROR) << "Error parsing example number ("
1691                    << static_cast<int>(success) << ")";
1692       }
1693     }
1694   } else {
1695     LOG(WARNING) << "Invalid or unknown country calling code provided: "
1696                  << country_calling_code;
1697   }
1698   return false;
1699 }
1700
1701 PhoneNumberUtil::ErrorType PhoneNumberUtil::Parse(const string& number_to_parse,
1702                                                   const string& default_region,
1703                                                   PhoneNumber* number) const {
1704   DCHECK(number);
1705   return ParseHelper(number_to_parse, default_region, false, true, number);
1706 }
1707
1708 PhoneNumberUtil::ErrorType PhoneNumberUtil::ParseAndKeepRawInput(
1709     const string& number_to_parse,
1710     const string& default_region,
1711     PhoneNumber* number) const {
1712   DCHECK(number);
1713   return ParseHelper(number_to_parse, default_region, true, true, number);
1714 }
1715
1716 // Checks to see that the region code used is valid, or if it is not valid, that
1717 // the number to parse starts with a + symbol so that we can attempt to infer
1718 // the country from the number. Returns false if it cannot use the region
1719 // provided and the region cannot be inferred.
1720 bool PhoneNumberUtil::CheckRegionForParsing(
1721     const string& number_to_parse,
1722     const string& default_region) const {
1723   if (!IsValidRegionCode(default_region) && !number_to_parse.empty()) {
1724     const scoped_ptr<RegExpInput> number(
1725         reg_exps_->regexp_factory_->CreateInput(number_to_parse));
1726     if (!reg_exps_->plus_chars_pattern_->Consume(number.get())) {
1727       return false;
1728     }
1729   }
1730   return true;
1731 }
1732
1733 // Converts number_to_parse to a form that we can parse and write it to
1734 // national_number if it is written in RFC3966; otherwise extract a possible
1735 // number out of it and write to national_number.
1736 void PhoneNumberUtil::BuildNationalNumberForParsing(
1737     const string& number_to_parse, string* national_number) const {
1738   size_t index_of_phone_context = number_to_parse.find(kRfc3966PhoneContext);
1739   if (index_of_phone_context != string::npos) {
1740     int phone_context_start =
1741         index_of_phone_context + strlen(kRfc3966PhoneContext);
1742     // If the phone context contains a phone number prefix, we need to capture
1743     // it, whereas domains will be ignored.
1744     if (number_to_parse.at(phone_context_start) == kPlusSign[0]) {
1745       // Additional parameters might follow the phone context. If so, we will
1746       // remove them here because the parameters after phone context are not
1747       // important for parsing the phone number.
1748       size_t phone_context_end = number_to_parse.find(';', phone_context_start);
1749       if (phone_context_end != string::npos) {
1750         StrAppend(
1751             national_number, number_to_parse.substr(
1752                 phone_context_start, phone_context_end - phone_context_start));
1753       } else {
1754         StrAppend(national_number, number_to_parse.substr(phone_context_start));
1755       }
1756     }
1757
1758     // Now append everything between the "tel:" prefix and the phone-context.
1759     // This should include the national number, an optional extension or
1760     // isdn-subaddress component. Note we also handle the case when "tel:" is
1761     // missing, as we have seen in some of the phone number inputs. In that
1762     // case, we append everything from the beginning.
1763     size_t index_of_rfc_prefix = number_to_parse.find(kRfc3966Prefix);
1764     int index_of_national_number = (index_of_rfc_prefix != string::npos) ?
1765         index_of_rfc_prefix + strlen(kRfc3966Prefix) : 0;
1766     StrAppend(
1767         national_number,
1768         number_to_parse.substr(
1769             index_of_national_number,
1770             index_of_phone_context - index_of_national_number));
1771   } else {
1772     // Extract a possible number from the string passed in (this strips leading
1773     // characters that could not be the start of a phone number.)
1774     ExtractPossibleNumber(number_to_parse, national_number);
1775   }
1776
1777   // Delete the isdn-subaddress and everything after it if it is present. Note
1778   // extension won't appear at the same time with isdn-subaddress according to
1779   // paragraph 5.3 of the RFC3966 spec.
1780   size_t index_of_isdn = national_number->find(kRfc3966IsdnSubaddress);
1781   if (index_of_isdn != string::npos) {
1782     national_number->erase(index_of_isdn);
1783   }
1784   // If both phone context and isdn-subaddress are absent but other parameters
1785   // are present, the parameters are left in nationalNumber. This is because
1786   // we are concerned about deleting content from a potential number string
1787   // when there is no strong evidence that the number is actually written in
1788   // RFC3966.
1789 }
1790
1791 PhoneNumberUtil::ErrorType PhoneNumberUtil::ParseHelper(
1792     const string& number_to_parse,
1793     const string& default_region,
1794     bool keep_raw_input,
1795     bool check_region,
1796     PhoneNumber* phone_number) const {
1797   DCHECK(phone_number);
1798
1799   string national_number;
1800   BuildNationalNumberForParsing(number_to_parse, &national_number);
1801
1802   if (!IsViablePhoneNumber(national_number)) {
1803     VLOG(2) << "The string supplied did not seem to be a phone number.";
1804     return NOT_A_NUMBER;
1805   }
1806
1807   if (check_region &&
1808       !CheckRegionForParsing(national_number, default_region)) {
1809     VLOG(1) << "Missing or invalid default country.";
1810     return INVALID_COUNTRY_CODE_ERROR;
1811   }
1812   PhoneNumber temp_number;
1813   if (keep_raw_input) {
1814     temp_number.set_raw_input(number_to_parse);
1815   }
1816   // Attempt to parse extension first, since it doesn't require country-specific
1817   // data and we want to have the non-normalised number here.
1818   string extension;
1819   MaybeStripExtension(&national_number, &extension);
1820   if (!extension.empty()) {
1821     temp_number.set_extension(extension);
1822   }
1823   const PhoneMetadata* country_metadata = GetMetadataForRegion(default_region);
1824   // Check to see if the number is given in international format so we know
1825   // whether this number is from the default country or not.
1826   string normalized_national_number(national_number);
1827   ErrorType country_code_error =
1828       MaybeExtractCountryCode(country_metadata, keep_raw_input,
1829                               &normalized_national_number, &temp_number);
1830   if (country_code_error != NO_PARSING_ERROR) {
1831      const scoped_ptr<RegExpInput> number_string_piece(
1832         reg_exps_->regexp_factory_->CreateInput(national_number));
1833     if ((country_code_error == INVALID_COUNTRY_CODE_ERROR) &&
1834         (reg_exps_->plus_chars_pattern_->Consume(number_string_piece.get()))) {
1835       normalized_national_number.assign(number_string_piece->ToString());
1836       // Strip the plus-char, and try again.
1837       MaybeExtractCountryCode(country_metadata,
1838                               keep_raw_input,
1839                               &normalized_national_number,
1840                               &temp_number);
1841       if (temp_number.country_code() == 0) {
1842         return INVALID_COUNTRY_CODE_ERROR;
1843       }
1844     } else {
1845       return country_code_error;
1846     }
1847   }
1848   int country_code = temp_number.country_code();
1849   if (country_code != 0) {
1850     string phone_number_region;
1851     GetRegionCodeForCountryCode(country_code, &phone_number_region);
1852     if (phone_number_region != default_region) {
1853       country_metadata =
1854           GetMetadataForRegionOrCallingCode(country_code, phone_number_region);
1855     }
1856   } else if (country_metadata) {
1857     // If no extracted country calling code, use the region supplied instead.
1858     // Note that the national number was already normalized by
1859     // MaybeExtractCountryCode.
1860     country_code = country_metadata->country_code();
1861   }
1862   if (normalized_national_number.length() < kMinLengthForNsn) {
1863     VLOG(2) << "The string supplied is too short to be a phone number.";
1864     return TOO_SHORT_NSN;
1865   }
1866   if (country_metadata) {
1867     string carrier_code;
1868     string potential_national_number(normalized_national_number);
1869     MaybeStripNationalPrefixAndCarrierCode(*country_metadata,
1870                                            &potential_national_number,
1871                                            &carrier_code);
1872     // We require that the NSN remaining after stripping the national prefix
1873     // and carrier code be of a possible length for the region. Otherwise, we
1874     // don't do the stripping, since the original number could be a valid short
1875     // number.
1876     if (!IsShorterThanPossibleNormalNumber(country_metadata,
1877         potential_national_number)) {
1878       normalized_national_number.assign(potential_national_number);
1879       if (keep_raw_input) {
1880         temp_number.set_preferred_domestic_carrier_code(carrier_code);
1881       }
1882     }
1883   }
1884   size_t normalized_national_number_length =
1885       normalized_national_number.length();
1886   if (normalized_national_number_length < kMinLengthForNsn) {
1887     VLOG(2) << "The string supplied is too short to be a phone number.";
1888     return TOO_SHORT_NSN;
1889   }
1890   if (normalized_national_number_length > kMaxLengthForNsn) {
1891     VLOG(2) << "The string supplied is too long to be a phone number.";
1892     return TOO_LONG_NSN;
1893   }
1894   temp_number.set_country_code(country_code);
1895   SetItalianLeadingZerosForPhoneNumber(normalized_national_number,
1896       &temp_number);
1897   uint64 number_as_int;
1898   safe_strtou64(normalized_national_number, &number_as_int);
1899   temp_number.set_national_number(number_as_int);
1900   phone_number->Swap(&temp_number);
1901   return NO_PARSING_ERROR;
1902 }
1903
1904 // Attempts to extract a possible number from the string passed in. This
1905 // currently strips all leading characters that could not be used to start a
1906 // phone number. Characters that can be used to start a phone number are
1907 // defined in the valid_start_char_pattern. If none of these characters are
1908 // found in the number passed in, an empty string is returned. This function
1909 // also attempts to strip off any alternative extensions or endings if two or
1910 // more are present, such as in the case of: (530) 583-6985 x302/x2303. The
1911 // second extension here makes this actually two phone numbers, (530) 583-6985
1912 // x302 and (530) 583-6985 x2303. We remove the second extension so that the
1913 // first number is parsed correctly.
1914 void PhoneNumberUtil::ExtractPossibleNumber(const string& number,
1915                                             string* extracted_number) const {
1916   DCHECK(extracted_number);
1917
1918   UnicodeText number_as_unicode;
1919   number_as_unicode.PointToUTF8(number.data(), number.size());
1920   char current_char[5];
1921   int len;
1922   UnicodeText::const_iterator it;
1923   for (it = number_as_unicode.begin(); it != number_as_unicode.end(); ++it) {
1924     len = it.get_utf8(current_char);
1925     current_char[len] = '\0';
1926     if (reg_exps_->valid_start_char_pattern_->FullMatch(current_char)) {
1927       break;
1928     }
1929   }
1930
1931   if (it == number_as_unicode.end()) {
1932     // No valid start character was found. extracted_number should be set to
1933     // empty string.
1934     extracted_number->assign("");
1935     return;
1936   }
1937
1938   extracted_number->assign(
1939       UnicodeText::UTF8Substring(it, number_as_unicode.end()));
1940   TrimUnwantedEndChars(extracted_number);
1941   if (extracted_number->length() == 0) {
1942     return;
1943   }
1944
1945   VLOG(3) << "After stripping starting and trailing characters, left with: "
1946           << *extracted_number;
1947
1948   // Now remove any extra numbers at the end.
1949   reg_exps_->capture_up_to_second_number_start_pattern_->
1950       PartialMatch(*extracted_number, extracted_number);
1951 }
1952
1953 bool PhoneNumberUtil::IsPossibleNumber(const PhoneNumber& number) const {
1954   return IsPossibleNumberWithReason(number) == IS_POSSIBLE;
1955 }
1956
1957 bool PhoneNumberUtil::IsPossibleNumberForString(
1958     const string& number,
1959     const string& region_dialing_from) const {
1960   PhoneNumber number_proto;
1961   if (Parse(number, region_dialing_from, &number_proto) == NO_PARSING_ERROR) {
1962     return IsPossibleNumber(number_proto);
1963   } else {
1964     return false;
1965   }
1966 }
1967
1968 PhoneNumberUtil::ValidationResult PhoneNumberUtil::IsPossibleNumberWithReason(
1969     const PhoneNumber& number) const {
1970   string national_number;
1971   GetNationalSignificantNumber(number, &national_number);
1972   int country_code = number.country_code();
1973   // Note: For Russian Fed and NANPA numbers, we just use the rules from the
1974   // default region (US or Russia) since the GetRegionCodeForNumber will not
1975   // work if the number is possible but not valid. This would need to be
1976   // revisited if the possible number pattern ever differed between various
1977   // regions within those plans.
1978   if (!HasValidCountryCallingCode(country_code)) {
1979     return INVALID_COUNTRY_CODE;
1980   }
1981   string region_code;
1982   GetRegionCodeForCountryCode(country_code, &region_code);
1983   // Metadata cannot be NULL because the country calling code is valid.
1984   const PhoneMetadata* metadata =
1985       GetMetadataForRegionOrCallingCode(country_code, region_code);
1986   const RegExp& possible_number_pattern = reg_exps_->regexp_cache_->GetRegExp(
1987       StrCat("(", metadata->general_desc().possible_number_pattern(), ")"));
1988   return TestNumberLengthAgainstPattern(possible_number_pattern,
1989                                         national_number);
1990 }
1991
1992 bool PhoneNumberUtil::TruncateTooLongNumber(PhoneNumber* number) const {
1993   if (IsValidNumber(*number)) {
1994     return true;
1995   }
1996   PhoneNumber number_copy(*number);
1997   uint64 national_number = number->national_number();
1998   do {
1999     national_number /= 10;
2000     number_copy.set_national_number(national_number);
2001     if (IsPossibleNumberWithReason(number_copy) == TOO_SHORT ||
2002         national_number == 0) {
2003       return false;
2004     }
2005   } while (!IsValidNumber(number_copy));
2006   number->set_national_number(national_number);
2007   return true;
2008 }
2009
2010 PhoneNumberUtil::PhoneNumberType PhoneNumberUtil::GetNumberType(
2011     const PhoneNumber& number) const {
2012   string region_code;
2013   GetRegionCodeForNumber(number, &region_code);
2014   const PhoneMetadata* metadata =
2015       GetMetadataForRegionOrCallingCode(number.country_code(), region_code);
2016   if (!metadata) {
2017     return UNKNOWN;
2018   }
2019   string national_significant_number;
2020   GetNationalSignificantNumber(number, &national_significant_number);
2021   return GetNumberTypeHelper(national_significant_number, *metadata);
2022 }
2023
2024 bool PhoneNumberUtil::IsValidNumber(const PhoneNumber& number) const {
2025   string region_code;
2026   GetRegionCodeForNumber(number, &region_code);
2027   return IsValidNumberForRegion(number, region_code);
2028 }
2029
2030 bool PhoneNumberUtil::IsValidNumberForRegion(const PhoneNumber& number,
2031                                              const string& region_code) const {
2032   int country_code = number.country_code();
2033   const PhoneMetadata* metadata =
2034       GetMetadataForRegionOrCallingCode(country_code, region_code);
2035   if (!metadata ||
2036       ((kRegionCodeForNonGeoEntity != region_code) &&
2037        country_code != GetCountryCodeForValidRegion(region_code))) {
2038     // Either the region code was invalid, or the country calling code for this
2039     // number does not match that of the region code.
2040     return false;
2041   }
2042   string national_number;
2043   GetNationalSignificantNumber(number, &national_number);
2044
2045   return GetNumberTypeHelper(national_number, *metadata) != UNKNOWN;
2046 }
2047
2048 bool PhoneNumberUtil::IsNumberGeographical(
2049     const PhoneNumber& phone_number) const {
2050   PhoneNumberType number_type = GetNumberType(phone_number);
2051   // TODO: Include mobile phone numbers from countries like
2052   // Indonesia, which has some mobile numbers that are geographical.
2053   return number_type == PhoneNumberUtil::FIXED_LINE ||
2054       number_type == PhoneNumberUtil::FIXED_LINE_OR_MOBILE;
2055 }
2056
2057 bool PhoneNumberUtil::IsLeadingZeroPossible(int country_calling_code) const {
2058   string region_code;
2059   GetRegionCodeForCountryCode(country_calling_code, &region_code);
2060   const PhoneMetadata* main_metadata_for_calling_code =
2061       GetMetadataForRegionOrCallingCode(country_calling_code, region_code);
2062   if (!main_metadata_for_calling_code) return false;
2063   return main_metadata_for_calling_code->leading_zero_possible();
2064 }
2065
2066 // A helper function to set the values related to leading zeros in a
2067 // PhoneNumber.
2068 void PhoneNumberUtil::SetItalianLeadingZerosForPhoneNumber(
2069     const string& national_number, PhoneNumber* phone_number) const {
2070   if (national_number.length() > 1 && national_number[0] == '0') {
2071     phone_number->set_italian_leading_zero(true);
2072     size_t number_of_leading_zeros = 1;
2073     // Note that if the national number is all "0"s, the last "0" is not
2074     // counted as a leading zero.
2075     while (number_of_leading_zeros < national_number.length() - 1 &&
2076         national_number[number_of_leading_zeros] == '0') {
2077       number_of_leading_zeros++;
2078     }
2079     if (number_of_leading_zeros != 1) {
2080       phone_number->set_number_of_leading_zeros(number_of_leading_zeros);
2081     }
2082   }
2083 }
2084
2085 bool PhoneNumberUtil::IsNumberPossibleForDesc(
2086     const string& national_number, const PhoneNumberDesc& number_desc) const {
2087   return reg_exps_->regexp_cache_.get()->
2088              GetRegExp(number_desc.possible_number_pattern())
2089              .FullMatch(national_number);
2090 }
2091
2092 bool PhoneNumberUtil::IsNumberMatchingDesc(
2093     const string& national_number, const PhoneNumberDesc& number_desc) const {
2094   return IsNumberPossibleForDesc(national_number, number_desc) &&
2095          reg_exps_->regexp_cache_.get()->
2096              GetRegExp(number_desc.national_number_pattern())
2097              .FullMatch(national_number);
2098 }
2099
2100 PhoneNumberUtil::PhoneNumberType PhoneNumberUtil::GetNumberTypeHelper(
2101     const string& national_number, const PhoneMetadata& metadata) const {
2102   if (!IsNumberMatchingDesc(national_number, metadata.general_desc())) {
2103     VLOG(4) << "Number type unknown - doesn't match general national number"
2104             << " pattern.";
2105     return PhoneNumberUtil::UNKNOWN;
2106   }
2107   if (IsNumberMatchingDesc(national_number, metadata.premium_rate())) {
2108     VLOG(4) << "Number is a premium number.";
2109     return PhoneNumberUtil::PREMIUM_RATE;
2110   }
2111   if (IsNumberMatchingDesc(national_number, metadata.toll_free())) {
2112     VLOG(4) << "Number is a toll-free number.";
2113     return PhoneNumberUtil::TOLL_FREE;
2114   }
2115   if (IsNumberMatchingDesc(national_number, metadata.shared_cost())) {
2116     VLOG(4) << "Number is a shared cost number.";
2117     return PhoneNumberUtil::SHARED_COST;
2118   }
2119   if (IsNumberMatchingDesc(national_number, metadata.voip())) {
2120     VLOG(4) << "Number is a VOIP (Voice over IP) number.";
2121     return PhoneNumberUtil::VOIP;
2122   }
2123   if (IsNumberMatchingDesc(national_number, metadata.personal_number())) {
2124     VLOG(4) << "Number is a personal number.";
2125     return PhoneNumberUtil::PERSONAL_NUMBER;
2126   }
2127   if (IsNumberMatchingDesc(national_number, metadata.pager())) {
2128     VLOG(4) << "Number is a pager number.";
2129     return PhoneNumberUtil::PAGER;
2130   }
2131   if (IsNumberMatchingDesc(national_number, metadata.uan())) {
2132     VLOG(4) << "Number is a UAN.";
2133     return PhoneNumberUtil::UAN;
2134   }
2135   if (IsNumberMatchingDesc(national_number, metadata.voicemail())) {
2136     VLOG(4) << "Number is a voicemail number.";
2137     return PhoneNumberUtil::VOICEMAIL;
2138   }
2139
2140   bool is_fixed_line =
2141       IsNumberMatchingDesc(national_number, metadata.fixed_line());
2142   if (is_fixed_line) {
2143     if (metadata.same_mobile_and_fixed_line_pattern()) {
2144       VLOG(4) << "Fixed-line and mobile patterns equal, number is fixed-line"
2145               << " or mobile";
2146       return PhoneNumberUtil::FIXED_LINE_OR_MOBILE;
2147     } else if (IsNumberMatchingDesc(national_number, metadata.mobile())) {
2148       VLOG(4) << "Fixed-line and mobile patterns differ, but number is "
2149               << "still fixed-line or mobile";
2150       return PhoneNumberUtil::FIXED_LINE_OR_MOBILE;
2151     }
2152     VLOG(4) << "Number is a fixed line number.";
2153     return PhoneNumberUtil::FIXED_LINE;
2154   }
2155   // Otherwise, test to see if the number is mobile. Only do this if certain
2156   // that the patterns for mobile and fixed line aren't the same.
2157   if (!metadata.same_mobile_and_fixed_line_pattern() &&
2158       IsNumberMatchingDesc(national_number, metadata.mobile())) {
2159     VLOG(4) << "Number is a mobile number.";
2160     return PhoneNumberUtil::MOBILE;
2161   }
2162   VLOG(4) << "Number type unknown - doesn\'t match any specific number type"
2163           << " pattern.";
2164   return PhoneNumberUtil::UNKNOWN;
2165 }
2166
2167 void PhoneNumberUtil::GetNationalSignificantNumber(
2168     const PhoneNumber& number,
2169     string* national_number) const {
2170   DCHECK(national_number);
2171   // If leading zero(s) have been set, we prefix this now. Note this is not a
2172   // national prefix.
2173   StrAppend(national_number, number.italian_leading_zero() ?
2174       string(number.number_of_leading_zeros(), '0') : "");
2175   StrAppend(national_number, number.national_number());
2176 }
2177
2178 int PhoneNumberUtil::GetLengthOfGeographicalAreaCode(
2179     const PhoneNumber& number) const {
2180   string region_code;
2181   GetRegionCodeForNumber(number, &region_code);
2182   const PhoneMetadata* metadata = GetMetadataForRegion(region_code);
2183   if (!metadata) {
2184     return 0;
2185   }
2186   // If a country doesn't use a national prefix, and this number doesn't have an
2187   // Italian leading zero, we assume it is a closed dialling plan with no area
2188   // codes.
2189   if (!metadata->has_national_prefix() && !number.italian_leading_zero()) {
2190     return 0;
2191   }
2192
2193   if (!IsNumberGeographical(number)) {
2194     return 0;
2195   }
2196
2197   return GetLengthOfNationalDestinationCode(number);
2198 }
2199
2200 int PhoneNumberUtil::GetLengthOfNationalDestinationCode(
2201     const PhoneNumber& number) const {
2202   PhoneNumber copied_proto(number);
2203   if (number.has_extension()) {
2204     // Clear the extension so it's not included when formatting.
2205     copied_proto.clear_extension();
2206   }
2207
2208   string formatted_number;
2209   Format(copied_proto, INTERNATIONAL, &formatted_number);
2210   const scoped_ptr<RegExpInput> i18n_number(
2211       reg_exps_->regexp_factory_->CreateInput(formatted_number));
2212   string digit_group;
2213   string ndc;
2214   string third_group;
2215   for (int i = 0; i < 3; ++i) {
2216     if (!reg_exps_->capturing_ascii_digits_pattern_->FindAndConsume(
2217             i18n_number.get(), &digit_group)) {
2218       // We should find at least three groups.
2219       return 0;
2220     }
2221     if (i == 1) {
2222       ndc = digit_group;
2223     } else if (i == 2) {
2224       third_group = digit_group;
2225     }
2226   }
2227
2228   if (GetNumberType(number) == MOBILE) {
2229     // For example Argentinian mobile numbers, when formatted in the
2230     // international format, are in the form of +54 9 NDC XXXX.... As a result,
2231     // we take the length of the third group (NDC) and add the length of the
2232     // mobile token, which also forms part of the national significant number.
2233     // This assumes that the mobile token is always formatted separately from
2234     // the rest of the phone number.
2235     string mobile_token;
2236     GetCountryMobileToken(number.country_code(), &mobile_token);
2237     if (!mobile_token.empty()) {
2238       return third_group.size() + mobile_token.size();
2239     }
2240   }
2241   return ndc.size();
2242 }
2243
2244 void PhoneNumberUtil::GetCountryMobileToken(int country_calling_code,
2245                                             string* mobile_token) const {
2246   DCHECK(mobile_token);
2247   map<int, char>::iterator it = reg_exps_->mobile_token_mappings_.find(
2248       country_calling_code);
2249   if (it != reg_exps_->mobile_token_mappings_.end()) {
2250     *mobile_token = it->second;
2251   } else {
2252     mobile_token->assign("");
2253   }
2254 }
2255
2256 void PhoneNumberUtil::NormalizeDigitsOnly(string* number) const {
2257   DCHECK(number);
2258   const RegExp& non_digits_pattern = reg_exps_->regexp_cache_->GetRegExp(
2259       StrCat("[^", kDigits, "]"));
2260   // Delete everything that isn't valid digits.
2261   non_digits_pattern.GlobalReplace(number, "");
2262   // Normalize all decimal digits to ASCII digits.
2263   number->assign(NormalizeUTF8::NormalizeDecimalDigits(*number));
2264 }
2265
2266 void PhoneNumberUtil::NormalizeDiallableCharsOnly(string* number) const {
2267   DCHECK(number);
2268   NormalizeHelper(reg_exps_->diallable_char_mappings_,
2269                   true /* remove non matches */, number);
2270 }
2271
2272 bool PhoneNumberUtil::IsAlphaNumber(const string& number) const {
2273   if (!IsViablePhoneNumber(number)) {
2274     // Number is too short, or doesn't match the basic phone number pattern.
2275     return false;
2276   }
2277   // Copy the number, since we are going to try and strip the extension from it.
2278   string number_copy(number);
2279   string extension;
2280   MaybeStripExtension(&number_copy, &extension);
2281   return reg_exps_->valid_alpha_phone_pattern_->FullMatch(number_copy);
2282 }
2283
2284 void PhoneNumberUtil::ConvertAlphaCharactersInNumber(string* number) const {
2285   DCHECK(number);
2286   NormalizeHelper(reg_exps_->alpha_phone_mappings_, false, number);
2287 }
2288
2289 // Normalizes a string of characters representing a phone number. This performs
2290 // the following conversions:
2291 //   - Punctuation is stripped.
2292 //   For ALPHA/VANITY numbers:
2293 //   - Letters are converted to their numeric representation on a telephone
2294 //     keypad. The keypad used here is the one defined in ITU Recommendation
2295 //     E.161. This is only done if there are 3 or more letters in the number, to
2296 //     lessen the risk that such letters are typos.
2297 //   For other numbers:
2298 //   - Wide-ascii digits are converted to normal ASCII (European) digits.
2299 //   - Arabic-Indic numerals are converted to European numerals.
2300 //   - Spurious alpha characters are stripped.
2301 void PhoneNumberUtil::Normalize(string* number) const {
2302   DCHECK(number);
2303   if (reg_exps_->valid_alpha_phone_pattern_->PartialMatch(*number)) {
2304     NormalizeHelper(reg_exps_->alpha_phone_mappings_, true, number);
2305   }
2306   NormalizeDigitsOnly(number);
2307 }
2308
2309 // Checks to see if the string of characters could possibly be a phone number at
2310 // all. At the moment, checks to see that the string begins with at least 3
2311 // digits, ignoring any punctuation commonly found in phone numbers.  This
2312 // method does not require the number to be normalized in advance - but does
2313 // assume that leading non-number symbols have been removed, such as by the
2314 // method ExtractPossibleNumber.
2315 bool PhoneNumberUtil::IsViablePhoneNumber(const string& number) const {
2316   if (number.length() < kMinLengthForNsn) {
2317     VLOG(2) << "Number too short to be viable:" << number;
2318     return false;
2319   }
2320   return reg_exps_->valid_phone_number_pattern_->FullMatch(number);
2321 }
2322
2323 // Strips the IDD from the start of the number if present. Helper function used
2324 // by MaybeStripInternationalPrefixAndNormalize.
2325 bool PhoneNumberUtil::ParsePrefixAsIdd(const RegExp& idd_pattern,
2326                                        string* number) const {
2327   DCHECK(number);
2328   const scoped_ptr<RegExpInput> number_copy(
2329       reg_exps_->regexp_factory_->CreateInput(*number));
2330   // First attempt to strip the idd_pattern at the start, if present. We make a
2331   // copy so that we can revert to the original string if necessary.
2332   if (idd_pattern.Consume(number_copy.get())) {
2333     // Only strip this if the first digit after the match is not a 0, since
2334     // country calling codes cannot begin with 0.
2335     string extracted_digit;
2336     if (reg_exps_->capturing_digit_pattern_->PartialMatch(
2337             number_copy->ToString(), &extracted_digit)) {
2338       NormalizeDigitsOnly(&extracted_digit);
2339       if (extracted_digit == "0") {
2340         return false;
2341       }
2342     }
2343     number->assign(number_copy->ToString());
2344     return true;
2345   }
2346   return false;
2347 }
2348
2349 // Strips any international prefix (such as +, 00, 011) present in the number
2350 // provided, normalizes the resulting number, and indicates if an international
2351 // prefix was present.
2352 //
2353 // possible_idd_prefix represents the international direct dialing prefix from
2354 // the region we think this number may be dialed in.
2355 // Returns true if an international dialing prefix could be removed from the
2356 // number, otherwise false if the number did not seem to be in international
2357 // format.
2358 PhoneNumber::CountryCodeSource
2359 PhoneNumberUtil::MaybeStripInternationalPrefixAndNormalize(
2360     const string& possible_idd_prefix,
2361     string* number) const {
2362   DCHECK(number);
2363   if (number->empty()) {
2364     return PhoneNumber::FROM_DEFAULT_COUNTRY;
2365   }
2366   const scoped_ptr<RegExpInput> number_string_piece(
2367       reg_exps_->regexp_factory_->CreateInput(*number));
2368   if (reg_exps_->plus_chars_pattern_->Consume(number_string_piece.get())) {
2369     number->assign(number_string_piece->ToString());
2370     // Can now normalize the rest of the number since we've consumed the "+"
2371     // sign at the start.
2372     Normalize(number);
2373     return PhoneNumber::FROM_NUMBER_WITH_PLUS_SIGN;
2374   }
2375   // Attempt to parse the first digits as an international prefix.
2376   const RegExp& idd_pattern =
2377       reg_exps_->regexp_cache_->GetRegExp(possible_idd_prefix);
2378   Normalize(number);
2379   return ParsePrefixAsIdd(idd_pattern, number)
2380       ? PhoneNumber::FROM_NUMBER_WITH_IDD
2381       : PhoneNumber::FROM_DEFAULT_COUNTRY;
2382 }
2383
2384 // Strips any national prefix (such as 0, 1) present in the number provided.
2385 // The number passed in should be the normalized telephone number that we wish
2386 // to strip any national dialing prefix from. The metadata should be for the
2387 // region that we think this number is from. Returns true if a national prefix
2388 // and/or carrier code was stripped.
2389 bool PhoneNumberUtil::MaybeStripNationalPrefixAndCarrierCode(
2390     const PhoneMetadata& metadata,
2391     string* number,
2392     string* carrier_code) const {
2393   DCHECK(number);
2394   string carrier_code_temp;
2395   const string& possible_national_prefix =
2396       metadata.national_prefix_for_parsing();
2397   if (number->empty() || possible_national_prefix.empty()) {
2398     // Early return for numbers of zero length or with no national prefix
2399     // possible.
2400     return false;
2401   }
2402   // We use two copies here since Consume modifies the phone number, and if the
2403   // first if-clause fails the number will already be changed.
2404   const scoped_ptr<RegExpInput> number_copy(
2405       reg_exps_->regexp_factory_->CreateInput(*number));
2406   const scoped_ptr<RegExpInput> number_copy_without_transform(
2407       reg_exps_->regexp_factory_->CreateInput(*number));
2408   string number_string_copy(*number);
2409   string captured_part_of_prefix;
2410   const RegExp& national_number_rule = reg_exps_->regexp_cache_->GetRegExp(
2411       metadata.general_desc().national_number_pattern());
2412   // Check if the original number is viable.
2413   bool is_viable_original_number = national_number_rule.FullMatch(*number);
2414   // Attempt to parse the first digits as a national prefix. We make a
2415   // copy so that we can revert to the original string if necessary.
2416   const string& transform_rule = metadata.national_prefix_transform_rule();
2417   const RegExp& possible_national_prefix_pattern =
2418       reg_exps_->regexp_cache_->GetRegExp(possible_national_prefix);
2419   if (!transform_rule.empty() &&
2420       (possible_national_prefix_pattern.Consume(
2421           number_copy.get(), &carrier_code_temp, &captured_part_of_prefix) ||
2422        possible_national_prefix_pattern.Consume(
2423            number_copy.get(), &captured_part_of_prefix)) &&
2424       !captured_part_of_prefix.empty()) {
2425     // If this succeeded, then we must have had a transform rule and there must
2426     // have been some part of the prefix that we captured.
2427     // We make the transformation and check that the resultant number is still
2428     // viable. If so, replace the number and return.
2429     possible_national_prefix_pattern.Replace(&number_string_copy,
2430                                              transform_rule);
2431     if (is_viable_original_number &&
2432         !national_number_rule.FullMatch(number_string_copy)) {
2433       return false;
2434     }
2435     number->assign(number_string_copy);
2436     if (carrier_code) {
2437       carrier_code->assign(carrier_code_temp);
2438     }
2439   } else if (possible_national_prefix_pattern.Consume(
2440                  number_copy_without_transform.get(), &carrier_code_temp) ||
2441              possible_national_prefix_pattern.Consume(
2442                  number_copy_without_transform.get())) {
2443     VLOG(4) << "Parsed the first digits as a national prefix.";
2444     // If captured_part_of_prefix is empty, this implies nothing was captured by
2445     // the capturing groups in possible_national_prefix; therefore, no
2446     // transformation is necessary, and we just remove the national prefix.
2447     const string number_copy_as_string =
2448         number_copy_without_transform->ToString();
2449     if (is_viable_original_number &&
2450         !national_number_rule.FullMatch(number_copy_as_string)) {
2451       return false;
2452     }
2453     number->assign(number_copy_as_string);
2454     if (carrier_code) {
2455       carrier_code->assign(carrier_code_temp);
2456     }
2457   } else {
2458     return false;
2459     VLOG(4) << "The first digits did not match the national prefix.";
2460   }
2461   return true;
2462 }
2463
2464 // Strips any extension (as in, the part of the number dialled after the call is
2465 // connected, usually indicated with extn, ext, x or similar) from the end of
2466 // the number, and returns it. The number passed in should be non-normalized.
2467 bool PhoneNumberUtil::MaybeStripExtension(string* number, string* extension)
2468     const {
2469   DCHECK(number);
2470   DCHECK(extension);
2471   // There are three extension capturing groups in the regular expression.
2472   string possible_extension_one;
2473   string possible_extension_two;
2474   string possible_extension_three;
2475   string number_copy(*number);
2476   const scoped_ptr<RegExpInput> number_copy_as_regexp_input(
2477       reg_exps_->regexp_factory_->CreateInput(number_copy));
2478   if (reg_exps_->extn_pattern_->Consume(number_copy_as_regexp_input.get(),
2479                             false,
2480                             &possible_extension_one,
2481                             &possible_extension_two,
2482                             &possible_extension_three)) {
2483     // Replace the extensions in the original string here.
2484     reg_exps_->extn_pattern_->Replace(&number_copy, "");
2485     VLOG(4) << "Found an extension. Possible extension one: "
2486             << possible_extension_one
2487             << ". Possible extension two: " << possible_extension_two
2488             << ". Possible extension three: " << possible_extension_three
2489             << ". Remaining number: " << number_copy;
2490     // If we find a potential extension, and the number preceding this is a
2491     // viable number, we assume it is an extension.
2492     if ((!possible_extension_one.empty() || !possible_extension_two.empty() ||
2493          !possible_extension_three.empty()) &&
2494         IsViablePhoneNumber(number_copy)) {
2495       number->assign(number_copy);
2496       if (!possible_extension_one.empty()) {
2497         extension->assign(possible_extension_one);
2498       } else if (!possible_extension_two.empty()) {
2499         extension->assign(possible_extension_two);
2500       } else if (!possible_extension_three.empty()) {
2501         extension->assign(possible_extension_three);
2502       }
2503       return true;
2504     }
2505   }
2506   return false;
2507 }
2508
2509 // Extracts country calling code from national_number, and returns it. It
2510 // assumes that the leading plus sign or IDD has already been removed. Returns 0
2511 // if national_number doesn't start with a valid country calling code, and
2512 // leaves national_number unmodified. Assumes the national_number is at least 3
2513 // characters long.
2514 int PhoneNumberUtil::ExtractCountryCode(string* national_number) const {
2515   int potential_country_code;
2516   if (national_number->empty() || (national_number->at(0) == '0')) {
2517     // Country codes do not begin with a '0'.
2518     return 0;
2519   }
2520   for (size_t i = 1; i <= kMaxLengthCountryCode; ++i) {
2521     safe_strto32(national_number->substr(0, i), &potential_country_code);
2522     string region_code;
2523     GetRegionCodeForCountryCode(potential_country_code, &region_code);
2524     if (region_code != RegionCode::GetUnknown()) {
2525       national_number->erase(0, i);
2526       return potential_country_code;
2527     }
2528   }
2529   return 0;
2530 }
2531
2532 // Tries to extract a country calling code from a number. Country calling codes
2533 // are extracted in the following ways:
2534 //   - by stripping the international dialing prefix of the region the person
2535 //   is dialing from, if this is present in the number, and looking at the next
2536 //   digits
2537 //   - by stripping the '+' sign if present and then looking at the next digits
2538 //   - by comparing the start of the number and the country calling code of the
2539 //   default region. If the number is not considered possible for the numbering
2540 //   plan of the default region initially, but starts with the country calling
2541 //   code of this region, validation will be reattempted after stripping this
2542 //   country calling code. If this number is considered a possible number, then
2543 //   the first digits will be considered the country calling code and removed as
2544 //   such.
2545 //
2546 //   Returns NO_PARSING_ERROR if a country calling code was successfully
2547 //   extracted or none was present, or the appropriate error otherwise, such as
2548 //   if a + was present but it was not followed by a valid country calling code.
2549 //   If NO_PARSING_ERROR is returned, the national_number without the country
2550 //   calling code is populated, and the country_code of the phone_number passed
2551 //   in is set to the country calling code if found, otherwise to 0.
2552 PhoneNumberUtil::ErrorType PhoneNumberUtil::MaybeExtractCountryCode(
2553     const PhoneMetadata* default_region_metadata,
2554     bool keep_raw_input,
2555     string* national_number,
2556     PhoneNumber* phone_number) const {
2557   DCHECK(national_number);
2558   DCHECK(phone_number);
2559   // Set the default prefix to be something that will never match if there is no
2560   // default region.
2561   string possible_country_idd_prefix = default_region_metadata
2562       ?  default_region_metadata->international_prefix()
2563       : "NonMatch";
2564   PhoneNumber::CountryCodeSource country_code_source =
2565       MaybeStripInternationalPrefixAndNormalize(possible_country_idd_prefix,
2566                                                 national_number);
2567   if (keep_raw_input) {
2568     phone_number->set_country_code_source(country_code_source);
2569   }
2570   if (country_code_source != PhoneNumber::FROM_DEFAULT_COUNTRY) {
2571     if (national_number->length() <= kMinLengthForNsn) {
2572       VLOG(2) << "Phone number had an IDD, but after this was not "
2573               << "long enough to be a viable phone number.";
2574       return TOO_SHORT_AFTER_IDD;
2575     }
2576     int potential_country_code = ExtractCountryCode(national_number);
2577     if (potential_country_code != 0) {
2578       phone_number->set_country_code(potential_country_code);
2579       return NO_PARSING_ERROR;
2580     }
2581     // If this fails, they must be using a strange country calling code that we
2582     // don't recognize, or that doesn't exist.
2583     return INVALID_COUNTRY_CODE_ERROR;
2584   } else if (default_region_metadata) {
2585     // Check to see if the number starts with the country calling code for the
2586     // default region. If so, we remove the country calling code, and do some
2587     // checks on the validity of the number before and after.
2588     int default_country_code = default_region_metadata->country_code();
2589     string default_country_code_string(SimpleItoa(default_country_code));
2590     VLOG(4) << "Possible country calling code: " << default_country_code_string;
2591     string potential_national_number;
2592     if (TryStripPrefixString(*national_number,
2593                              default_country_code_string,
2594                              &potential_national_number)) {
2595       const PhoneNumberDesc& general_num_desc =
2596           default_region_metadata->general_desc();
2597       const RegExp& valid_number_pattern =
2598           reg_exps_->regexp_cache_->GetRegExp(
2599               general_num_desc.national_number_pattern());
2600       MaybeStripNationalPrefixAndCarrierCode(*default_region_metadata,
2601                                              &potential_national_number,
2602                                              NULL);
2603       VLOG(4) << "Number without country calling code prefix: "
2604               << potential_national_number;
2605       const RegExp& possible_number_pattern =
2606           reg_exps_->regexp_cache_->GetRegExp(
2607               StrCat("(", general_num_desc.possible_number_pattern(), ")"));
2608       // If the number was not valid before but is valid now, or if it was too
2609       // long before, we consider the number with the country code stripped to
2610       // be a better result and keep that instead.
2611       if ((!valid_number_pattern.FullMatch(*national_number) &&
2612            valid_number_pattern.FullMatch(potential_national_number)) ||
2613            TestNumberLengthAgainstPattern(possible_number_pattern,
2614                                           *national_number) == TOO_LONG) {
2615         national_number->assign(potential_national_number);
2616         if (keep_raw_input) {
2617           phone_number->set_country_code_source(
2618               PhoneNumber::FROM_NUMBER_WITHOUT_PLUS_SIGN);
2619         }
2620         phone_number->set_country_code(default_country_code);
2621         return NO_PARSING_ERROR;
2622       }
2623     }
2624   }
2625   // No country calling code present. Set the country_code to 0.
2626   phone_number->set_country_code(0);
2627   return NO_PARSING_ERROR;
2628 }
2629
2630 PhoneNumberUtil::MatchType PhoneNumberUtil::IsNumberMatch(
2631     const PhoneNumber& first_number_in,
2632     const PhoneNumber& second_number_in) const {
2633   // Make copies of the phone number so that the numbers passed in are not
2634   // edited.
2635   PhoneNumber first_number(first_number_in);
2636   PhoneNumber second_number(second_number_in);
2637   // First clear raw_input and country_code_source and
2638   // preferred_domestic_carrier_code fields and any empty-string extensions so
2639   // that we can use the proto-buffer equality method.
2640   first_number.clear_raw_input();
2641   first_number.clear_country_code_source();
2642   first_number.clear_preferred_domestic_carrier_code();
2643   second_number.clear_raw_input();
2644   second_number.clear_country_code_source();
2645   second_number.clear_preferred_domestic_carrier_code();
2646   if (first_number.extension().empty()) {
2647     first_number.clear_extension();
2648   }
2649   if (second_number.extension().empty()) {
2650     second_number.clear_extension();
2651   }
2652   // Early exit if both had extensions and these are different.
2653   if (first_number.has_extension() && second_number.has_extension() &&
2654       first_number.extension() != second_number.extension()) {
2655     return NO_MATCH;
2656   }
2657   int first_number_country_code = first_number.country_code();
2658   int second_number_country_code = second_number.country_code();
2659   // Both had country calling code specified.
2660   if (first_number_country_code != 0 && second_number_country_code != 0) {
2661     if (ExactlySameAs(first_number, second_number)) {
2662       return EXACT_MATCH;
2663     } else if (first_number_country_code == second_number_country_code &&
2664                IsNationalNumberSuffixOfTheOther(first_number, second_number)) {
2665       // A SHORT_NSN_MATCH occurs if there is a difference because of the
2666       // presence or absence of an 'Italian leading zero', the presence or
2667       // absence of an extension, or one NSN being a shorter variant of the
2668       // other.
2669       return SHORT_NSN_MATCH;
2670     }
2671     // This is not a match.
2672     return NO_MATCH;
2673   }
2674   // Checks cases where one or both country calling codes were not specified. To
2675   // make equality checks easier, we first set the country_code fields to be
2676   // equal.
2677   first_number.set_country_code(second_number_country_code);
2678   // If all else was the same, then this is an NSN_MATCH.
2679   if (ExactlySameAs(first_number, second_number)) {
2680     return NSN_MATCH;
2681   }
2682   if (IsNationalNumberSuffixOfTheOther(first_number, second_number)) {
2683     return SHORT_NSN_MATCH;
2684   }
2685   return NO_MATCH;
2686 }
2687
2688 PhoneNumberUtil::MatchType PhoneNumberUtil::IsNumberMatchWithTwoStrings(
2689     const string& first_number,
2690     const string& second_number) const {
2691   PhoneNumber first_number_as_proto;
2692   ErrorType error_type =
2693       Parse(first_number, RegionCode::GetUnknown(), &first_number_as_proto);
2694   if (error_type == NO_PARSING_ERROR) {
2695     return IsNumberMatchWithOneString(first_number_as_proto, second_number);
2696   }
2697   if (error_type == INVALID_COUNTRY_CODE_ERROR) {
2698     PhoneNumber second_number_as_proto;
2699     ErrorType error_type = Parse(second_number, RegionCode::GetUnknown(),
2700                                  &second_number_as_proto);
2701     if (error_type == NO_PARSING_ERROR) {
2702       return IsNumberMatchWithOneString(second_number_as_proto, first_number);
2703     }
2704     if (error_type == INVALID_COUNTRY_CODE_ERROR) {
2705       error_type  = ParseHelper(first_number, RegionCode::GetUnknown(), false,
2706                                 false, &first_number_as_proto);
2707       if (error_type == NO_PARSING_ERROR) {
2708         error_type = ParseHelper(second_number, RegionCode::GetUnknown(), false,
2709                                  false, &second_number_as_proto);
2710         if (error_type == NO_PARSING_ERROR) {
2711           return IsNumberMatch(first_number_as_proto, second_number_as_proto);
2712         }
2713       }
2714     }
2715   }
2716   // One or more of the phone numbers we are trying to match is not a viable
2717   // phone number.
2718   return INVALID_NUMBER;
2719 }
2720
2721 PhoneNumberUtil::MatchType PhoneNumberUtil::IsNumberMatchWithOneString(
2722     const PhoneNumber& first_number,
2723     const string& second_number) const {
2724   // First see if the second number has an implicit country calling code, by
2725   // attempting to parse it.
2726   PhoneNumber second_number_as_proto;
2727   ErrorType error_type =
2728       Parse(second_number, RegionCode::GetUnknown(), &second_number_as_proto);
2729   if (error_type == NO_PARSING_ERROR) {
2730     return IsNumberMatch(first_number, second_number_as_proto);
2731   }
2732   if (error_type == INVALID_COUNTRY_CODE_ERROR) {
2733     // The second number has no country calling code. EXACT_MATCH is no longer
2734     // possible.  We parse it as if the region was the same as that for the
2735     // first number, and if EXACT_MATCH is returned, we replace this with
2736     // NSN_MATCH.
2737     string first_number_region;
2738     GetRegionCodeForCountryCode(first_number.country_code(),
2739                                 &first_number_region);
2740     if (first_number_region != RegionCode::GetUnknown()) {
2741       PhoneNumber second_number_with_first_number_region;
2742       Parse(second_number, first_number_region,
2743             &second_number_with_first_number_region);
2744       MatchType match = IsNumberMatch(first_number,
2745                                       second_number_with_first_number_region);
2746       if (match == EXACT_MATCH) {
2747         return NSN_MATCH;
2748       }
2749       return match;
2750     } else {
2751       // If the first number didn't have a valid country calling code, then we
2752       // parse the second number without one as well.
2753       error_type = ParseHelper(second_number, RegionCode::GetUnknown(), false,
2754                                false, &second_number_as_proto);
2755       if (error_type == NO_PARSING_ERROR) {
2756         return IsNumberMatch(first_number, second_number_as_proto);
2757       }
2758     }
2759   }
2760   // One or more of the phone numbers we are trying to match is not a viable
2761   // phone number.
2762   return INVALID_NUMBER;
2763 }
2764
2765 AsYouTypeFormatter* PhoneNumberUtil::GetAsYouTypeFormatter(
2766     const string& region_code) const {
2767   return new AsYouTypeFormatter(region_code);
2768 }
2769
2770 bool PhoneNumberUtil::IsShorterThanPossibleNormalNumber(
2771     const PhoneMetadata* country_metadata, const string& number) const {
2772   const RegExp& possible_number_pattern =
2773       reg_exps_->regexp_cache_->GetRegExp(StrCat("(",
2774           country_metadata->general_desc().possible_number_pattern(), ")"));
2775   return TestNumberLengthAgainstPattern(possible_number_pattern, number) ==
2776       PhoneNumberUtil::TOO_SHORT;
2777 }
2778
2779 bool PhoneNumberUtil::CanBeInternationallyDialled(
2780     const PhoneNumber& number) const {
2781   string region_code;
2782   GetRegionCodeForNumber(number, &region_code);
2783   const PhoneMetadata* metadata = GetMetadataForRegion(region_code);
2784   if (!metadata) {
2785     // Note numbers belonging to non-geographical entities (e.g. +800 numbers)
2786     // are always internationally diallable, and will be caught here.
2787     return true;
2788   }
2789   string national_significant_number;
2790   GetNationalSignificantNumber(number, &national_significant_number);
2791   return !IsNumberMatchingDesc(
2792       national_significant_number, metadata->no_international_dialling());
2793 }
2794
2795 }  // namespace phonenumbers
2796 }  // namespace i18n