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