// ISO 639-2 language code lookup program // Example program for iso639-2.c // // Roger Clark (the author) places this code in the public domain #include #include #include #include "iso639-2.c" typedef std::map Iso639LanguageMap; typedef std::pair Iso639LanguagePair; Iso639LanguageMap g_iso639languages_by_alpha3b; Iso639LanguageMap g_iso639languages_by_alpha3t; Iso639LanguageMap g_iso639languages_by_alpha2; void Iso639SetupTables(const Iso639Language* languages) { for (const Iso639Language* lang = languages; lang->bibliographic; lang++) { g_iso639languages_by_alpha3b.insert(Iso639LanguagePair(lang->bibliographic, lang)); if (lang->terminologic != 0) g_iso639languages_by_alpha3t.insert(Iso639LanguagePair(lang->terminologic, lang)); if (lang->alpha2 != 0) g_iso639languages_by_alpha2.insert(Iso639LanguagePair(lang->alpha2, lang)); } } const Iso639Language* Iso639FindLanguage(const Iso639LanguageMap& table, const char* identifier) { Iso639LanguageMap::const_iterator iter = table.find(identifier); if (iter == table.end()) return NULL; return (*iter).second; } const Iso639Language* Iso639LanguageFromBibliographicAlpha3(const char* alpha3) { return Iso639FindLanguage(g_iso639languages_by_alpha3b, alpha3); } const Iso639Language* Iso639LanguageFromTerminologicAlpha3(const char* alpha3) { return Iso639FindLanguage(g_iso639languages_by_alpha3t, alpha3); } const Iso639Language* Iso639LanguageFromAlpha2(const char* alpha2) { return Iso639FindLanguage(g_iso639languages_by_alpha2, alpha2); } void Iso639PrintLanguageInfo(const Iso639Language* lang) { std::cout << lang->bibliographic << "\t"; if (lang->terminologic != 0) std::cout << lang->terminologic; std::cout << "\t"; if (lang->alpha2 != 0) std::cout << lang->alpha2; std::cout << "\t"; std::cout << lang->english << std::endl; } int main(int argc, char* argv[]) { if (argc < 2) { std::cout << "iso639code: gives info about ISO-639 language codes" << std::endl; std::cout << "usage: iso639code [-p] [code]" << std::endl; std::cout << "\t\t-p\t\tprints all codes" << std::endl; std::cout << "\t\t[code]\t\ttries to find [code] in list and prints info" << std::endl; return 1; } std::string arg = argv[1]; if (arg == "-p") { for (size_t i = 0; iso639languages[i].bibliographic; i++) Iso639PrintLanguageInfo(&iso639languages[i]); return 0; } Iso639SetupTables(iso639languages); const Iso639Language* lang = Iso639LanguageFromAlpha2(arg.c_str()); if (lang == 0) lang = Iso639LanguageFromBibliographicAlpha3(arg.c_str()); if (lang == 0) lang = Iso639LanguageFromTerminologicAlpha3(arg.c_str()); if (lang == 0) { std::cout << "couldn't find language matching \"" << arg << "\"" << std::endl; return 1; } Iso639PrintLanguageInfo(lang); return 0; }