%{ /* * raptor_cc.gperf - Raptor ISO 3166 country code handling (gperf input) * * $Id$ * * The C file raptor_cc.c is generated by from the source file * raptor_cc.gperf by gperf, the near-perfect hash table program * which maps from country codes to country names. * * The generation is done something like: * * gperf --struct-type --duplicates --language=ANSI-C --readonly-tables --delimiters=\; raptor_cc.gperf > raptor_cc.c * * The table was generated from the ISO 3166-1 maintenance agency page: * http://www.din.de/gremien/nas/nabd/iso3166ma/codlstp1/db_en.html * last modified 12 Feb 2002 (checked on 5th March 2002) * * Copyright (C) 2002 David Beckett - http://purl.org/net/dajobe/ * Institute for Learning and Research Technology - http://www.ilrt.org/ * University of Bristol - http://www.bristol.ac.uk/ * * This package is Free Software or Open Source available under the * following licenses (these are alternatives): * 1. GNU Lesser General Public License (LGPL) * 2. GNU General Public License (GPL) * 3. Mozilla Public License (MPL) * * See LICENSE.html or LICENSE.txt at the top of this package for the * full license terms. * */ /* declarations */ #include #include /* This section of code is inserted directly into the output. */ const int raptor_country_code_is_valid(const char * const code); const char * const raptor_get_country_name_by_code(const char * const country_code); static const struct country_code * in_word_set (register const char *str, register unsigned int len); #define index key_index /* the definition of struct country_code below is read by gperf */ %} struct country_code { const char * const name; const char * const country_name; }; %% "AF";"AFGHANISTAN" "AL";"ALBANIA" "DZ";"ALGERIA" "AS";"AMERICAN SAMOA" "AD";"ANDORRA" "AO";"ANGOLA" "AI";"ANGUILLA" "AQ";"ANTARCTICA" "AG";"ANTIGUA AND BARBUDA" "AR";"ARGENTINA" "AM";"ARMENIA" "AW";"ARUBA" "AU";"AUSTRALIA" "AT";"AUSTRIA" "AZ";"AZERBAIJAN" "BS";"BAHAMAS" "BH";"BAHRAIN" "BD";"BANGLADESH" "BB";"BARBADOS" "BY";"BELARUS" "BE";"BELGIUM" "BZ";"BELIZE" "BJ";"BENIN" "BM";"BERMUDA" "BT";"BHUTAN" "BO";"BOLIVIA" "BA";"BOSNIA AND HERZEGOVINA" "BW";"BOTSWANA" "BV";"BOUVET ISLAND" "BR";"BRAZIL" "IO";"BRITISH INDIAN OCEAN TERRITORY" "BN";"BRUNEI DARUSSALAM" "BG";"BULGARIA" "BF";"BURKINA FASO" "BI";"BURUNDI" "KH";"CAMBODIA" "CM";"CAMEROON" "CA";"CANADA" "CV";"CAPE VERDE" "KY";"CAYMAN ISLANDS" "CF";"CENTRAL AFRICAN REPUBLIC" "TD";"CHAD" "CL";"CHILE" "CN";"CHINA" "CX";"CHRISTMAS ISLAND" "CC";"COCOS (KEELING) ISLANDS" "CO";"COLOMBIA" "KM";"COMOROS" "CG";"CONGO" "CD";"CONGO, THE DEMOCRATIC REPUBLIC OF THE" "CK";"COOK ISLANDS" "CR";"COSTA RICA" "CI";"COTE D'IVOIRE" "HR";"CROATIA" "CU";"CUBA" "CY";"CYPRUS" "CZ";"CZECH REPUBLIC" "DK";"DENMARK" "DJ";"DJIBOUTI" "DM";"DOMINICA" "DO";"DOMINICAN REPUBLIC" "TP";"EAST TIMOR" "EC";"ECUADOR" "EG";"EGYPT" "SV";"EL SALVADOR" "GQ";"EQUATORIAL GUINEA" "ER";"ERITREA" "EE";"ESTONIA" "ET";"ETHIOPIA" "FK";"FALKLAND ISLANDS (MALVINAS)" "FO";"FAROE ISLANDS" "FJ";"FIJI" "FI";"FINLAND" "FR";"FRANCE" "GF";"FRENCH GUIANA" "PF";"FRENCH POLYNESIA" "TF";"FRENCH SOUTHERN TERRITORIES" "GA";"GABON" "GM";"GAMBIA" "GE";"GEORGIA" "DE";"GERMANY" "GH";"GHANA" "GI";"GIBRALTAR" "GR";"GREECE" "GL";"GREENLAND" "GD";"GRENADA" "GP";"GUADELOUPE" "GU";"GUAM" "GT";"GUATEMALA" "GN";"GUINEA" "GW";"GUINEA-BISSAU" "GY";"GUYANA" "HT";"HAITI" "HM";"HEARD ISLAND AND MCDONALD ISLANDS" "VA";"HOLY SEE (VATICAN CITY STATE)" "HN";"HONDURAS" "HK";"HONG KONG" "HU";"HUNGARY" "IS";"ICELAND" "IN";"INDIA" "ID";"INDONESIA" "IR";"IRAN, ISLAMIC REPUBLIC OF" "IQ";"IRAQ" "IE";"IRELAND" "IL";"ISRAEL" "IT";"ITALY" "JM";"JAMAICA" "JP";"JAPAN" "JO";"JORDAN" "KZ";"KAZAKSTAN" "KE";"KENYA" "KI";"KIRIBATI" "KP";"KOREA, DEMOCRATIC PEOPLE'S REPUBLIC OF" "KR";"KOREA, REPUBLIC OF" "KW";"KUWAIT" "KG";"KYRGYZSTAN" "LA";"LAO PEOPLE'S DEMOCRATIC REPUBLIC" "LV";"LATVIA" "LB";"LEBANON" "LS";"LESOTHO" "LR";"LIBERIA" "LY";"LIBYAN ARAB JAMAHIRIYA" "LI";"LIECHTENSTEIN" "LT";"LITHUANIA" "LU";"LUXEMBOURG" "MO";"MACAU" "MK";"MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF" "MG";"MADAGASCAR" "MW";"MALAWI" "MY";"MALAYSIA" "MV";"MALDIVES" "ML";"MALI" "MT";"MALTA" "MH";"MARSHALL ISLANDS" "MQ";"MARTINIQUE" "MR";"MAURITANIA" "MU";"MAURITIUS" "YT";"MAYOTTE" "MX";"MEXICO" "FM";"MICRONESIA, FEDERATED STATES OF" "MD";"MOLDOVA, REPUBLIC OF" "MC";"MONACO" "MN";"MONGOLIA" "MS";"MONTSERRAT" "MA";"MOROCCO" "MZ";"MOZAMBIQUE" "MM";"MYANMAR" "NA";"NAMIBIA" "NR";"NAURU" "NP";"NEPAL" "NL";"NETHERLANDS" "AN";"NETHERLANDS ANTILLES" "NC";"NEW CALEDONIA" "NZ";"NEW ZEALAND" "NI";"NICARAGUA" "NE";"NIGER" "NG";"NIGERIA" "NU";"NIUE" "NF";"NORFOLK ISLAND" "MP";"NORTHERN MARIANA ISLANDS" "NO";"NORWAY" "OM";"OMAN" "PK";"PAKISTAN" "PW";"PALAU" "PS";"PALESTINIAN TERRITORY, OCCUPIED" "PA";"PANAMA" "PG";"PAPUA NEW GUINEA" "PY";"PARAGUAY" "PE";"PERU" "PH";"PHILIPPINES" "PN";"PITCAIRN" "PL";"POLAND" "PT";"PORTUGAL" "PR";"PUERTO RICO" "QA";"QATAR" "RE";"REUNION" "RO";"ROMANIA" "RU";"RUSSIAN FEDERATION" "RW";"RWANDA" "SH";"SAINT HELENA" "KN";"SAINT KITTS AND NEVIS" "LC";"SAINT LUCIA" "PM";"SAINT PIERRE AND MIQUELON" "VC";"SAINT VINCENT AND THE GRENADINES" "WS";"SAMOA" "SM";"SAN MARINO" "ST";"SAO TOME AND PRINCIPE" "SA";"SAUDI ARABIA" "SN";"SENEGAL" "SC";"SEYCHELLES" "SL";"SIERRA LEONE" "SG";"SINGAPORE" "SK";"SLOVAKIA" "SI";"SLOVENIA" "SB";"SOLOMON ISLANDS" "SO";"SOMALIA" "ZA";"SOUTH AFRICA" "GS";"SOUTH GEORGIA AND THE SOUTH SANDWICH ISLANDS" "ES";"SPAIN" "LK";"SRI LANKA" "SD";"SUDAN" "SR";"SURINAME" "SJ";"SVALBARD AND JAN MAYEN" "SZ";"SWAZILAND" "SE";"SWEDEN" "CH";"SWITZERLAND" "SY";"SYRIAN ARAB REPUBLIC" "TW";"TAIWAN, PROVINCE OF CHINA" "TJ";"TAJIKISTAN" "TZ";"TANZANIA, UNITED REPUBLIC OF" "TH";"THAILAND" "TG";"TOGO" "TK";"TOKELAU" "TO";"TONGA" "TT";"TRINIDAD AND TOBAGO" "TN";"TUNISIA" "TR";"TURKEY" "TM";"TURKMENISTAN" "TC";"TURKS AND CAICOS ISLANDS" "TV";"TUVALU" "UG";"UGANDA" "UA";"UKRAINE" "AE";"UNITED ARAB EMIRATES" "GB";"UNITED KINGDOM" "US";"UNITED STATES" "UM";"UNITED STATES MINOR OUTLYING ISLANDS" "UY";"URUGUAY" "UZ";"UZBEKISTAN" "VU";"VANUATU" "VE";"VENEZUELA" "VN";"VIET NAM" "VG";"VIRGIN ISLANDS, BRITISH" "VI";"VIRGIN ISLANDS, U.S." "WF";"WALLIS AND FUTUNA" "EH";"WESTERN SAHARA" "YE";"YEMEN" "YU";"YUGOSLAVIA" "ZM";"ZAMBIA" "ZW";"ZIMBABWE" %% /** * raptor_country_code_is_valid - Validate a country code * @code: country code * * Validates the 2-letter country codes from ISO 3166-1 * (case independent). * * Return value: non zero if the code is valid **/ const int raptor_country_code_is_valid(const char *code) { char code_buffer[3]; /* long enough for 2-letter codes \0 */ if(!code) return 0; /* probably faster than if(strlen(code)==2) */ if(!code[0] || !code[1] || code[2]) return 0; code_buffer[0]=islower(code[0]) ? toupper(code[0]) : code[0]; code_buffer[1]=islower(code[1]) ? toupper(code[1]) : code[1]; code_buffer[2]='\0'; return hash(code_buffer, 2) != 0; } /** * raptor_get_country_name_by_code - Get a country name by country code * @code: country code * * Gets the (English) country name from ISO 3166-1 for the * 2-letter country codes (which are case independent). * * Return value: Pointer to country name or NULL if code is invalid. **/ const char * const raptor_get_country_name_by_code(const char *code) { char code_buffer[3]; /* long enough for 2-letter codes \0 */ const struct country_code *country; if(!code) return NULL; /* probably faster than if(strlen(code)==2) */ if(!code[0] || !code[1] || code[2]) return NULL; code_buffer[0]=islower(code[0]) ? toupper(code[0]) : code[0]; code_buffer[1]=islower(code[1]) ? toupper(code[1]) : code[1]; code_buffer[2]='\0'; country=in_word_set(code_buffer, 2); if(!country) return NULL; return country->country_name; } #ifdef STANDALONE #include /* one more prototype */ int main(int argc, char *argv[]); int main(int argc, char *argv[]) { char *program=argv[0]; struct tv { const char *code; const char *name; }; struct tv test_good_values[]={ {"FR", "FRANCE"}, {"fr", "FRANCE"}, {"Fr", "FRANCE"}, {"fR", "FRANCE"}, {NULL, NULL} }; struct tv test_bad_values[]={ {"FR ", NULL}, {"FR ", NULL}, {"F R", NULL}, {" ", NULL}, {"", NULL}, {NULL, NULL} }; struct tv *t; int i; fprintf(stderr, "%s: Testing raptor country_code functions for successes\n", program); for(i=0; (t=&test_good_values[i]) && t->code; i++) { const char *code=t->code; const char *name; if(!raptor_country_code_is_valid(code)) { fprintf(stderr, "%s: raptor_country_code_is_valid '%s' should succeed but failed\n", program, code); return(1); } name=raptor_get_country_name_by_code(code); if(!name) { fprintf(stderr, "%s: raptor_get_country_name_by_code failed to find code %s\n", program, code); return(1); } if(strcmp(name, t->name)) { fprintf(stderr, "%s: raptor_get_country_name_by_code returned '%s' - expected '%s'\n", program, name, t->name); return(1); } fprintf(stderr, " '%s' => '%s' succeeded - OK\n", code, name); } fprintf(stderr, "%s: Testing raptor country_code functions for failures\n", program); for(i=0; (t=&test_bad_values[i]) && t->code; i++) { const char *code=t->code; const char *name; if(raptor_country_code_is_valid(code)) { fprintf(stderr, "%s: raptor_country_code_is_valid '%s' should fail but returned OK\n", program, code); return(1); } name=raptor_get_country_name_by_code(code); if(name) { fprintf(stderr, "%s: raptor_get_country_name_by_code '%s' should fail but returned '%s'\n", program, code, name); return(1); } fprintf(stderr, " '%s' => failed - OK\n", code); } /* keep gcc -Wall happy */ return(0); } #endif /* * Local Variables: * mode:c * c-basic-offset: 2 * End: */