/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ │ vi: set et ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi │ ╞══════════════════════════════════════════════════════════════════════════════╡ │ Copyright 2021 Justine Alexandra Roberts Tunney │ │ │ │ Permission to use, copy, modify, and/or distribute this software for │ │ any purpose with or without fee is hereby granted, provided that the │ │ above copyright notice and this permission notice appear in all copies. │ │ │ │ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ │ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ │ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ │ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ │ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ │ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/macros.h" #include "third_party/maxmind/maxminddb.h" const struct thatispacked MetroName { short code; const char *name; } kMetroNames[] = { {500, "Portland-Auburn ME"}, {501, "New York NY"}, {502, "Binghamton NY"}, {503, "Macon GA"}, {504, "Philadelphia PA"}, {505, "Detroit MI"}, {506, "Boston MA-Manchester NH"}, {507, "Savannah GA"}, {508, "Pittsburgh PA"}, {509, "Ft. Wayne IN"}, {510, "Cleveland-Akron (Canton) OH"}, {511, "Washington DC (Hagerstown MD)"}, {512, "Baltimore MD"}, {513, "Flint-Saginaw-Bay City MI"}, {514, "Buffalo NY"}, {515, "Cincinnati OH"}, {516, "Erie PA"}, {517, "Charlotte NC"}, {518, "Greensboro-High Point-Winston Salem NC"}, {519, "Charleston SC"}, {520, "Augusta GA"}, {521, "Providence RI-New Bedford MA"}, {522, "Columbus GA"}, {523, "Burlington VT-Plattsburgh NY"}, {524, "Atlanta GA"}, {525, "Albany GA"}, {526, "Utica NY"}, {527, "Indianapolis IN"}, {528, "Miami-Ft. Lauderdale FL"}, {529, "Louisville KY"}, {530, "Tallahassee FL-Thomasville GA"}, {531, "Tri-Cities TN-VA"}, {532, "Albany-Schenectady-Troy NY"}, {533, "Hartford & New Haven CT"}, {534, "Orlando-Daytona Beach-Melbourne FL"}, {535, "Columbus OH"}, {536, "Youngstown OH"}, {537, "Bangor ME"}, {538, "Rochester NY"}, {539, "Tampa-St. Petersburg (Sarasota) FL"}, {540, "Traverse City-Cadillac MI"}, {541, "Lexington KY"}, {542, "Dayton OH"}, {543, "Springfield-Holyoke MA"}, {544, "Norfolk-Portsmouth-Newport News VA"}, {545, "Greenville-New Bern-Washington NC"}, {546, "Columbia SC"}, {547, "Toledo OH"}, {548, "West Palm Beach-Ft. Pierce FL"}, {549, "Watertown NY"}, {550, "Wilmington NC"}, {551, "Lansing MI"}, {552, "Presque Isle ME"}, {553, "Marquette MI"}, {554, "Wheeling WV-Steubenville OH"}, {555, "Syracuse NY"}, {556, "Richmond-Petersburg VA"}, {557, "Knoxville TN"}, {558, "Lima OH"}, {559, "Bluefield-Beckley-Oak Hill WV"}, {560, "Raleigh-Durham (Fayetteville) NC"}, {561, "Jacksonville FL"}, {563, "Grand Rapids-Kalamazoo-Battle Creek MI"}, {564, "Charleston-Huntington WV"}, {565, "Elmira NY"}, {566, "Harrisburg-Lancaster-Lebanon-York PA"}, {567, "Greenville-Spartanburg SC-Asheville NC-Anderson SC"}, {569, "Harrisonburg VA"}, {570, "Florence-Myrtle Beach SC"}, {571, "Ft. Myers-Naples FL"}, {573, "Roanoke-Lynchburg VA"}, {574, "Johnstown-Altoona PA"}, {575, "Chattanooga TN"}, {576, "Salisbury MD"}, {577, "Wilkes Barre-Scranton PA"}, {581, "Terre Haute IN"}, {582, "Lafayette IN"}, {583, "Alpena MI"}, {584, "Charlottesville VA"}, {588, "South Bend-Elkhart IN"}, {592, "Gainesville FL"}, {596, "Zanesville OH"}, {597, "Parkersburg WV"}, {598, "Clarksburg-Weston WV"}, {600, "Corpus Christi TX"}, {602, "Chicago IL"}, {603, "Joplin MO-Pittsburg KS"}, {604, "Columbia-Jefferson City MO"}, {605, "Topeka KS"}, {606, "Dothan AL"}, {609, "St. Louis MO"}, {610, "Rockford IL"}, {611, "Rochester MN-Mason City IA-Austin MN"}, {612, "Shreveport LA"}, {613, "Minneapolis-St. Paul MN"}, {616, "Kansas City MO"}, {617, "Milwaukee WI"}, {618, "Houston TX"}, {619, "Springfield MO"}, {622, "New Orleans LA"}, {623, "Dallas-Ft. Worth TX"}, {624, "Sioux City IA"}, {625, "Waco-Temple-Bryan TX"}, {626, "Victoria TX"}, {627, "Wichita Falls TX & Lawton OK"}, {628, "Monroe LA-El Dorado AR"}, {630, "Birmingham AL"}, {631, "Ottumwa IA-Kirksville MO"}, {632, "Paducah KY-Cape Girardeau MO-Harrisburg-Mount Vernon IL"}, {633, "Odessa-Midland TX"}, {634, "Amarillo TX"}, {635, "Austin TX"}, {636, "Harlingen-Weslaco-Brownsville-McAllen TX"}, {637, "Cedar Rapids-Waterloo-Iowa City & Dubuque IA"}, {638, "St. Joseph MO"}, {639, "Jackson TN"}, {640, "Memphis TN"}, {641, "San Antonio TX"}, {642, "Lafayette LA"}, {643, "Lake Charles LA"}, {644, "Alexandria LA"}, {647, "Greenwood-Greenville MS"}, {648, "Champaign & Springfield-Decatur,IL"}, {649, "Evansville IN"}, {650, "Oklahoma City OK"}, {651, "Lubbock TX"}, {652, "Omaha NE"}, {656, "Panama City FL"}, {657, "Sherman TX-Ada OK"}, {658, "Green Bay-Appleton WI"}, {659, "Nashville TN"}, {661, "San Angelo TX"}, {662, "Abilene-Sweetwater TX"}, {669, "Madison WI"}, {670, "Ft. Smith-Fayetteville-Springdale-Rogers AR"}, {671, "Tulsa OK"}, {673, "Columbus-Tupelo-West Point MS"}, {675, "Peoria-Bloomington IL"}, {676, "Duluth MN-Superior WI"}, {678, "Wichita-Hutchinson KS"}, {679, "Des Moines-Ames IA"}, {682, "Davenport IA-Rock Island-Moline IL"}, {686, "Mobile AL-Pensacola (Ft. Walton Beach) FL"}, {687, "Minot-Bismarck-Dickinson(Williston) ND"}, {691, "Huntsville-Decatur (Florence) AL"}, {692, "Beaumont-Port Arthur TX"}, {693, "Little Rock-Pine Bluff AR"}, {698, "Montgomery (Selma) AL"}, {702, "La Crosse-Eau Claire WI"}, {705, "Wausau-Rhinelander WI"}, {709, "Tyler-Longview(Lufkin & Nacogdoches) TX"}, {710, "Hattiesburg-Laurel MS"}, {711, "Meridian MS"}, {716, "Baton Rouge LA"}, {717, "Quincy IL-Hannibal MO-Keokuk IA"}, {718, "Jackson MS"}, {722, "Lincoln & Hastings-Kearney NE"}, {724, "Fargo-Valley City ND"}, {725, "Sioux Falls(Mitchell) SD"}, {734, "Jonesboro AR"}, {736, "Bowling Green KY"}, {737, "Mankato MN"}, {740, "North Platte NE"}, {743, "Anchorage AK"}, {744, "Honolulu HI"}, {745, "Fairbanks AK"}, {746, "Biloxi-Gulfport MS"}, {747, "Juneau AK"}, {749, "Laredo TX"}, {751, "Denver CO"}, {752, "Colorado Springs-Pueblo CO"}, {753, "Phoenix AZ"}, {754, "Butte-Bozeman MT"}, {755, "Great Falls MT"}, {756, "Billings MT"}, {757, "Boise ID"}, {758, "Idaho Falls-Pocatello ID"}, {759, "Cheyenne WY-Scottsbluff NE"}, {760, "Twin Falls ID"}, {762, "Missoula MT"}, {764, "Rapid City SD"}, {765, "El Paso TX"}, {766, "Helena MT"}, {767, "Casper-Riverton WY"}, {770, "Salt Lake City UT"}, {771, "Yuma AZ-El Centro CA"}, {773, "Grand Junction-Montrose CO"}, {789, "Tucson (Sierra Vista) AZ"}, {790, "Albuquerque-Santa Fe NM"}, {798, "Glendive MT"}, {800, "Bakersfield CA"}, {801, "Eugene OR"}, {802, "Eureka CA"}, {803, "Los Angeles CA"}, {804, "Palm Springs CA"}, {807, "San Francisco-Oakland-San Jose CA"}, {810, "Yakima-Pasco-Richland-Kennewick WA"}, {811, "Reno NV"}, {813, "Medford-Klamath Falls OR"}, {819, "Seattle-Tacoma WA"}, {820, "Portland OR"}, {821, "Bend OR"}, {825, "San Diego CA"}, {828, "Monterey-Salinas CA"}, {839, "Las Vegas NV"}, {855, "Santa Barbara-Santa Maria-San Luis Obispo CA"}, {862, "Sacramento-Stockton-Modesto CA"}, {866, "Fresno-Visalia CA"}, {868, "Chico-Redding CA"}, {881, "Spokane WA"}, }; /** * Returns U.S. Metropolitan Area name. * @see Google Adwords c. 2010 */ const char *GetMetroName(int code) { int m, l, r; l = 0; r = ARRAYLEN(kMetroNames) - 1; while (l <= r) { m = (l & r) + ((l ^ r) >> 1); // floor((a+b)/2) if (kMetroNames[m].code < code) { l = m + 1; } else if (kMetroNames[m].code > code) { r = m - 1; } else { return kMetroNames[m].name; } } return 0; }