1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "components/autofill/core/browser/state_names.h"
6
7#include "base/basictypes.h"
8#include "base/strings/string_util.h"
9#include "base/strings/utf_string_conversions.h"
10
11namespace autofill {
12namespace state_names {
13
14namespace {
15
16// TODO(jhawkins): Add more states/provinces.  See http://crbug.com/45039.
17
18struct StateData {
19  const char* const name;
20  const char abbreviation[3];
21};
22
23StateData kStateData[] = {
24  { "alabama", "al" },
25  { "alaska", "ak" },
26  { "arizona", "az" },
27  { "arkansas", "ar" },
28  { "california", "ca" },
29  { "colorado", "co" },
30  { "connecticut", "ct" },
31  { "delaware", "de" },
32  { "district of columbia", "dc" },
33  { "florida", "fl" },
34  { "georgia", "ga" },
35  { "hawaii", "hi" },
36  { "idaho", "id" },
37  { "illinois", "il" },
38  { "indiana", "in" },
39  { "iowa", "ia" },
40  { "kansas", "ks" },
41  { "kentucky", "ky" },
42  { "louisiana", "la" },
43  { "maine", "me" },
44  { "maryland", "md" },
45  { "massachusetts", "ma" },
46  { "michigan", "mi" },
47  { "minnesota", "mn" },
48  { "mississippi", "ms" },
49  { "missouri", "mo" },
50  { "montana", "mt" },
51  { "nebraska", "ne" },
52  { "nevada", "nv" },
53  { "new hampshire", "nh" },
54  { "new jersey", "nj" },
55  { "new mexico", "nm" },
56  { "new york", "ny" },
57  { "north carolina", "nc" },
58  { "north dakota", "nd" },
59  { "ohio", "oh" },
60  { "oklahoma", "ok" },
61  { "oregon", "or" },
62  { "pennsylvania", "pa" },
63  { "puerto rico", "pr" },
64  { "rhode island", "ri" },
65  { "south carolina", "sc" },
66  { "south dakota", "sd" },
67  { "tennessee", "tn" },
68  { "texas", "tx" },
69  { "utah", "ut" },
70  { "vermont", "vt" },
71  { "virginia", "va" },
72  { "washington", "wa" },
73  { "west virginia", "wv" },
74  { "wisconsin", "wi" },
75  { "wyoming", "wy" },
76};
77
78}  // namespace
79
80base::string16 GetAbbreviationForName(const base::string16& name) {
81  for (size_t i = 0; i < arraysize(kStateData); ++i) {
82    const StateData& state = kStateData[i];
83    if (LowerCaseEqualsASCII(name, state.name))
84      return base::ASCIIToUTF16(state.abbreviation);
85  }
86  return base::string16();
87}
88
89base::string16 GetNameForAbbreviation(const base::string16& abbreviation) {
90  for (size_t i = 0; i < arraysize(kStateData); ++i) {
91    const StateData& state = kStateData[i];
92    if (LowerCaseEqualsASCII(abbreviation, state.abbreviation))
93      return base::ASCIIToUTF16(state.name);
94  }
95  return base::string16();
96}
97
98void GetNameAndAbbreviation(const base::string16& value,
99                            base::string16* name,
100                            base::string16* abbreviation) {
101  base::string16 full = GetNameForAbbreviation(value);
102  base::string16 abbr = value;
103  if (full.empty()) {
104    abbr = GetAbbreviationForName(value);
105    full = value;
106  }
107
108  if (name)
109    name->swap(full);
110  if (abbreviation)
111    abbreviation->swap(abbr);
112}
113
114}  // namespace state_names
115}  // namespace autofill
116