1 #include <stddef.h>
2 #include <strings.h>
3 #include "iso639.h"
4
5 static const struct {
6 const char *iso639_1;
7 const char *iso639_2t;
8 const char *iso639_2b;
9 } iso639[] = {
10 {"aa","aar",NULL},
11 {"ab","abk",NULL},
12 {"ae","ave",NULL},
13 {"af","afr",NULL},
14 {"ak","aka",NULL},
15 {"am","amh",NULL},
16 {"an","arg",NULL},
17 {"ar","ara",NULL},
18 {"as","asm",NULL},
19 {"av","ava",NULL},
20 {"ay","aym",NULL},
21 {"az","aze",NULL},
22 {"ba","bak",NULL},
23 {"be","bel",NULL},
24 {"bg","bul",NULL},
25 {"bh","bih",NULL},
26 {"bi","bis",NULL},
27 {"bm","bam",NULL},
28 {"bn","ben",NULL},
29 {"bo","bod","tib"},
30 {"br","bre",NULL},
31 {"bs","bos",NULL},
32 {"ca","cat",NULL},
33 {"ce","che",NULL},
34 {"ch","cha",NULL},
35 {"co","cos",NULL},
36 {"cr","cre",NULL},
37 {"cs","ces","cze"},
38 {"cu","chu",NULL},
39 {"cv","chv",NULL},
40 {"cy","cym","wel"},
41 {"da","dan",NULL},
42 {"de","deu","ger"},
43 {"dv","div",NULL},
44 {"dz","dzo",NULL},
45 {"ee","ewe",NULL},
46 {"el","ell","gre"},
47 {"en","eng",NULL},
48 {"eo","epo",NULL},
49 {"es","spa",NULL},
50 {"et","est",NULL},
51 {"eu","eus","baq"},
52 {"fa","fas","per"},
53 {"ff","ful",NULL},
54 {"fi","fin",NULL},
55 {"fj","fij",NULL},
56 {"fo","fao",NULL},
57 {"fr","fra","fre"},
58 {"fy","fry",NULL},
59 {"ga","gle",NULL},
60 {"gd","gla",NULL},
61 {"gl","glg",NULL},
62 {"gn","grn",NULL},
63 {"gu","guj",NULL},
64 {"gv","glv",NULL},
65 {"ha","hau",NULL},
66 {"he","heb",NULL},
67 {"hi","hin",NULL},
68 {"ho","hmo",NULL},
69 {"hr","hrv","scr"},
70 {"ht","hat",NULL},
71 {"hu","hun",NULL},
72 {"hy","hye","arm"},
73 {"hz","her",NULL},
74 {"ia","ina",NULL},
75 {"id","ind",NULL},
76 {"ie","ile",NULL},
77 {"ig","ibo",NULL},
78 {"ii","iii",NULL},
79 {"ik","ipk",NULL},
80 {"io","ido",NULL},
81 {"is","isl","ice"},
82 {"it","ita",NULL},
83 {"iu","iku",NULL},
84 {"ja","jpn",NULL},
85 {"jv","jav",NULL},
86 {"ka","kat","geo"},
87 {"kg","kon",NULL},
88 {"ki","kik",NULL},
89 {"kj","kua",NULL},
90 {"kk","kaz",NULL},
91 {"kl","kal",NULL},
92 {"km","khm",NULL},
93 {"kn","kan",NULL},
94 {"ko","kor",NULL},
95 {"kr","kau",NULL},
96 {"ks","kas",NULL},
97 {"ku","kur",NULL},
98 {"kv","kom",NULL},
99 {"kw","cor",NULL},
100 {"ky","kir",NULL},
101 {"la","lat",NULL},
102 {"lb","ltz",NULL},
103 {"lg","lug",NULL},
104 {"li","lim",NULL},
105 {"ln","lin",NULL},
106 {"lo","lao",NULL},
107 {"lt","lit",NULL},
108 {"lu","lub",NULL},
109 {"lv","lav",NULL},
110 {"mg","mlg",NULL},
111 {"mh","mah",NULL},
112 {"mi","mri","mao"},
113 {"mk","mkd","mac"},
114 {"ml","mal",NULL},
115 {"mn","mon",NULL},
116 {"mr","mar",NULL},
117 {"ms","msa","may"},
118 {"mt","mlt",NULL},
119 {"my","mya","bur"},
120 {"na","nau",NULL},
121 {"nb","nob",NULL},
122 {"nd","nde",NULL},
123 {"ne","nep",NULL},
124 {"ng","ndo",NULL},
125 {"nl","nld","dut"},
126 {"nn","nno",NULL},
127 {"no","nor",NULL},
128 {"nr","nbl",NULL},
129 {"nv","nav",NULL},
130 {"ny","nya",NULL},
131 {"oc","oci",NULL},
132 {"oj","oji",NULL},
133 {"om","orm",NULL},
134 {"or","ori",NULL},
135 {"os","oss",NULL},
136 {"pa","pan",NULL},
137 {"pi","pli",NULL},
138 {"pl","pol",NULL},
139 {"ps","pus",NULL},
140 {"pt","por",NULL},
141 {"qu","que",NULL},
142 {"rm","roh",NULL},
143 {"rn","run",NULL},
144 {"ro","ron","rum"},
145 {"ru","rus",NULL},
146 {"rw","kin",NULL},
147 {"sa","san",NULL},
148 {"sc","srd",NULL},
149 {"sd","snd",NULL},
150 {"se","sme",NULL},
151 {"sg","sag",NULL},
152 {"si","sin",NULL},
153 {"sk","slk","slo"},
154 {"sl","slv",NULL},
155 {"sm","smo",NULL},
156 {"sn","sna",NULL},
157 {"so","som",NULL},
158 {"sq","sqi","alb"},
159 {"sr","srp","scc"},
160 {"ss","ssw",NULL},
161 {"st","sot",NULL},
162 {"su","sun",NULL},
163 {"sv","swe",NULL},
164 {"sw","swa",NULL},
165 {"ta","tam",NULL},
166 {"te","tel",NULL},
167 {"tg","tgk",NULL},
168 {"th","tha",NULL},
169 {"ti","tir",NULL},
170 {"tk","tuk",NULL},
171 {"tl","tgl",NULL},
172 {"tn","tsn",NULL},
173 {"to","ton",NULL},
174 {"tr","tur",NULL},
175 {"ts","tso",NULL},
176 {"tt","tat",NULL},
177 {"tw","twi",NULL},
178 {"ty","tah",NULL},
179 {"ug","uig",NULL},
180 {"uk","ukr",NULL},
181 {"ur","urd",NULL},
182 {"uz","uzb",NULL},
183 {"ve","ven",NULL},
184 {"vi","vie",NULL},
185 {"vo","vol",NULL},
186 {"wa","wln",NULL},
187 {"wo","wol",NULL},
188 {"xh","xho",NULL},
189 {"yi","yid",NULL},
190 {"yo","yor",NULL},
191 {"za","zha",NULL},
192 {"zh","zho","chi"},
193 {"zu","zul",NULL},
194 };
195
find_iso639_1(const char * iso639_2)196 const char *find_iso639_1(const char *iso639_2)
197 {
198 size_t n;
199 if (!iso639_2) return NULL;
200 for (n=0; n<sizeof(iso639)/sizeof(iso639[0]); ++n) {
201 if (!strcasecmp(iso639_2,iso639[n].iso639_2t) || (iso639[n].iso639_2b && !strcasecmp(iso639_2,iso639[n].iso639_2b))) {
202 return iso639[n].iso639_1;
203 }
204 }
205 return NULL;
206 }
207
208