diff --git a/misc/language.c b/misc/language.c index e85100a202..0d9d0689da 100644 --- a/misc/language.c +++ b/misc/language.c @@ -23,226 +23,229 @@ #include "common/common.h" #include "misc/bstr.h" +#define L(s) { #s, sizeof(#s) - 1 } + static const struct lang { - char match[4]; - char canonical[4]; + struct { const char s[3]; uint8_t l; } match; + struct { const char s[3]; uint8_t l; } canonical; } langmap[] = { - {"aa", "aar"}, - {"ab", "abk"}, - {"ae", "ave"}, - {"af", "afr"}, - {"ak", "aka"}, - {"am", "amh"}, - {"an", "arg"}, - {"ar", "ara"}, - {"as", "asm"}, - {"av", "ava"}, - {"ay", "aym"}, - {"az", "aze"}, - {"ba", "bak"}, - {"be", "bel"}, - {"bg", "bul"}, - {"bh", "bih"}, - {"bi", "bis"}, - {"bm", "bam"}, - {"bn", "ben"}, - {"bo", "tib"}, - {"bod", "tib"}, - {"br", "bre"}, - {"bs", "bos"}, - {"ca", "cat"}, - {"ce", "che"}, - {"ces", "cze"}, - {"ch", "cha"}, - {"co", "cos"}, - {"cr", "cre"}, - {"cs", "cze"}, - {"cu", "chu"}, - {"cv", "chv"}, - {"cy", "wel"}, - {"cym", "wel"}, - {"da", "dan"}, - {"de", "ger"}, - {"deu", "ger"}, - {"dv", "div"}, - {"dz", "dzo"}, - {"ee", "ewe"}, - {"el", "gre"}, - {"ell", "gre"}, - {"en", "eng"}, - {"eo", "epo"}, - {"es", "spa"}, - {"et", "est"}, - {"eu", "baq"}, - {"eus", "baq"}, - {"fa", "per"}, - {"fas", "per"}, - {"ff", "ful"}, - {"fi", "fin"}, - {"fj", "fij"}, - {"fo", "fao"}, - {"fr", "fre"}, - {"fra", "fre"}, - {"fy", "fry"}, - {"ga", "gle"}, - {"gd", "gla"}, - {"gl", "glg"}, - {"gn", "grn"}, - {"gu", "guj"}, - {"gv", "glv"}, - {"ha", "hau"}, - {"he", "heb"}, - {"hi", "hin"}, - {"ho", "hmo"}, - {"hr", "hrv"}, - {"ht", "hat"}, - {"hu", "hun"}, - {"hy", "arm"}, - {"hye", "arm"}, - {"hz", "her"}, - {"ia", "ina"}, - {"id", "ind"}, - {"ie", "ile"}, - {"ig", "ibo"}, - {"ii", "iii"}, - {"ik", "ipk"}, - {"io", "ido"}, - {"is", "ice"}, - {"isl", "ice"}, - {"it", "ita"}, - {"iu", "iku"}, - {"ja", "jpn"}, - {"jv", "jav"}, - {"ka", "geo"}, - {"kat", "geo"}, - {"kg", "kon"}, - {"ki", "kik"}, - {"kj", "kua"}, - {"kk", "kaz"}, - {"kl", "kal"}, - {"km", "khm"}, - {"kn", "kan"}, - {"ko", "kor"}, - {"kr", "kau"}, - {"ks", "kas"}, - {"ku", "kur"}, - {"kv", "kom"}, - {"kw", "cor"}, - {"ky", "kir"}, - {"la", "lat"}, - {"lb", "ltz"}, - {"lg", "lug"}, - {"li", "lim"}, - {"ln", "lin"}, - {"lo", "lao"}, - {"lt", "lit"}, - {"lu", "lub"}, - {"lv", "lav"}, - {"mg", "mlg"}, - {"mh", "mah"}, - {"mi", "mao"}, - {"mk", "mac"}, - {"mkd", "mac"}, - {"ml", "mal"}, - {"mn", "mon"}, - {"mr", "mar"}, - {"mri", "mao"}, - {"ms", "may"}, - {"msa", "may"}, - {"mt", "mlt"}, - {"my", "bur"}, - {"mya", "bur"}, - {"na", "nau"}, - {"nb", "nob"}, - {"nd", "nde"}, - {"ne", "nep"}, - {"ng", "ndo"}, - {"nl", "dut"}, - {"nld", "dut"}, - {"nn", "nno"}, - {"no", "nor"}, - {"nr", "nbl"}, - {"nv", "nav"}, - {"ny", "nya"}, - {"oc", "oci"}, - {"oj", "oji"}, - {"om", "orm"}, - {"or", "ori"}, - {"os", "oss"}, - {"pa", "pan"}, - {"pi", "pli"}, - {"pl", "pol"}, - {"ps", "pus"}, - {"pt", "por"}, - {"qu", "que"}, - {"rm", "roh"}, - {"rn", "run"}, - {"ro", "rum"}, - {"ron", "rum"}, - {"ru", "rus"}, - {"rw", "kin"}, - {"sa", "san"}, - {"sc", "srd"}, - {"sd", "snd"}, - {"se", "sme"}, - {"sg", "sag"}, - {"si", "sin"}, - {"sk", "slo"}, - {"sl", "slv"}, - {"slk", "slo"}, - {"sm", "smo"}, - {"sn", "sna"}, - {"so", "som"}, - {"sq", "alb"}, - {"sqi", "alb"}, - {"sr", "srp"}, - {"ss", "ssw"}, - {"st", "sot"}, - {"su", "sun"}, - {"sv", "swe"}, - {"sw", "swa"}, - {"ta", "tam"}, - {"te", "tel"}, - {"tg", "tgk"}, - {"th", "tha"}, - {"ti", "tir"}, - {"tk", "tuk"}, - {"tl", "tgl"}, - {"tn", "tsn"}, - {"to", "ton"}, - {"tr", "tur"}, - {"ts", "tso"}, - {"tt", "tat"}, - {"tw", "twi"}, - {"ty", "tah"}, - {"ug", "uig"}, - {"uk", "ukr"}, - {"ur", "urd"}, - {"uz", "uzb"}, - {"ve", "ven"}, - {"vi", "vie"}, - {"vo", "vol"}, - {"wa", "wln"}, - {"wo", "wol"}, - {"xh", "xho"}, - {"yi", "yid"}, - {"yo", "yor"}, - {"za", "zha"}, - {"zh", "chi"}, - {"zho", "chi"}, - {"zu", "zul"}, + {L(aa), L(aar)}, + {L(ab), L(abk)}, + {L(ae), L(ave)}, + {L(af), L(afr)}, + {L(ak), L(aka)}, + {L(am), L(amh)}, + {L(an), L(arg)}, + {L(ar), L(ara)}, + {L(as), L(asm)}, + {L(av), L(ava)}, + {L(ay), L(aym)}, + {L(az), L(aze)}, + {L(ba), L(bak)}, + {L(be), L(bel)}, + {L(bg), L(bul)}, + {L(bh), L(bih)}, + {L(bi), L(bis)}, + {L(bm), L(bam)}, + {L(bn), L(ben)}, + {L(bo), L(tib)}, + {L(bod), L(tib)}, + {L(br), L(bre)}, + {L(bs), L(bos)}, + {L(ca), L(cat)}, + {L(ce), L(che)}, + {L(ces), L(cze)}, + {L(ch), L(cha)}, + {L(co), L(cos)}, + {L(cr), L(cre)}, + {L(cs), L(cze)}, + {L(cu), L(chu)}, + {L(cv), L(chv)}, + {L(cy), L(wel)}, + {L(cym), L(wel)}, + {L(da), L(dan)}, + {L(de), L(ger)}, + {L(deu), L(ger)}, + {L(dv), L(div)}, + {L(dz), L(dzo)}, + {L(ee), L(ewe)}, + {L(el), L(gre)}, + {L(ell), L(gre)}, + {L(en), L(eng)}, + {L(eo), L(epo)}, + {L(es), L(spa)}, + {L(et), L(est)}, + {L(eu), L(baq)}, + {L(eus), L(baq)}, + {L(fa), L(per)}, + {L(fas), L(per)}, + {L(ff), L(ful)}, + {L(fi), L(fin)}, + {L(fj), L(fij)}, + {L(fo), L(fao)}, + {L(fr), L(fre)}, + {L(fra), L(fre)}, + {L(fy), L(fry)}, + {L(ga), L(gle)}, + {L(gd), L(gla)}, + {L(gl), L(glg)}, + {L(gn), L(grn)}, + {L(gu), L(guj)}, + {L(gv), L(glv)}, + {L(ha), L(hau)}, + {L(he), L(heb)}, + {L(hi), L(hin)}, + {L(ho), L(hmo)}, + {L(hr), L(hrv)}, + {L(ht), L(hat)}, + {L(hu), L(hun)}, + {L(hy), L(arm)}, + {L(hye), L(arm)}, + {L(hz), L(her)}, + {L(ia), L(ina)}, + {L(id), L(ind)}, + {L(ie), L(ile)}, + {L(ig), L(ibo)}, + {L(ii), L(iii)}, + {L(ik), L(ipk)}, + {L(io), L(ido)}, + {L(is), L(ice)}, + {L(isl), L(ice)}, + {L(it), L(ita)}, + {L(iu), L(iku)}, + {L(ja), L(jpn)}, + {L(jv), L(jav)}, + {L(ka), L(geo)}, + {L(kat), L(geo)}, + {L(kg), L(kon)}, + {L(ki), L(kik)}, + {L(kj), L(kua)}, + {L(kk), L(kaz)}, + {L(kl), L(kal)}, + {L(km), L(khm)}, + {L(kn), L(kan)}, + {L(ko), L(kor)}, + {L(kr), L(kau)}, + {L(ks), L(kas)}, + {L(ku), L(kur)}, + {L(kv), L(kom)}, + {L(kw), L(cor)}, + {L(ky), L(kir)}, + {L(la), L(lat)}, + {L(lb), L(ltz)}, + {L(lg), L(lug)}, + {L(li), L(lim)}, + {L(ln), L(lin)}, + {L(lo), L(lao)}, + {L(lt), L(lit)}, + {L(lu), L(lub)}, + {L(lv), L(lav)}, + {L(mg), L(mlg)}, + {L(mh), L(mah)}, + {L(mi), L(mao)}, + {L(mk), L(mac)}, + {L(mkd), L(mac)}, + {L(ml), L(mal)}, + {L(mn), L(mon)}, + {L(mr), L(mar)}, + {L(mri), L(mao)}, + {L(ms), L(may)}, + {L(msa), L(may)}, + {L(mt), L(mlt)}, + {L(my), L(bur)}, + {L(mya), L(bur)}, + {L(na), L(nau)}, + {L(nb), L(nob)}, + {L(nd), L(nde)}, + {L(ne), L(nep)}, + {L(ng), L(ndo)}, + {L(nl), L(dut)}, + {L(nld), L(dut)}, + {L(nn), L(nno)}, + {L(no), L(nor)}, + {L(nr), L(nbl)}, + {L(nv), L(nav)}, + {L(ny), L(nya)}, + {L(oc), L(oci)}, + {L(oj), L(oji)}, + {L(om), L(orm)}, + {L(or), L(ori)}, + {L(os), L(oss)}, + {L(pa), L(pan)}, + {L(pi), L(pli)}, + {L(pl), L(pol)}, + {L(ps), L(pus)}, + {L(pt), L(por)}, + {L(qu), L(que)}, + {L(rm), L(roh)}, + {L(rn), L(run)}, + {L(ro), L(rum)}, + {L(ron), L(rum)}, + {L(ru), L(rus)}, + {L(rw), L(kin)}, + {L(sa), L(san)}, + {L(sc), L(srd)}, + {L(sd), L(snd)}, + {L(se), L(sme)}, + {L(sg), L(sag)}, + {L(si), L(sin)}, + {L(sk), L(slo)}, + {L(sl), L(slv)}, + {L(slk), L(slo)}, + {L(sm), L(smo)}, + {L(sn), L(sna)}, + {L(so), L(som)}, + {L(sq), L(alb)}, + {L(sqi), L(alb)}, + {L(sr), L(srp)}, + {L(ss), L(ssw)}, + {L(st), L(sot)}, + {L(su), L(sun)}, + {L(sv), L(swe)}, + {L(sw), L(swa)}, + {L(ta), L(tam)}, + {L(te), L(tel)}, + {L(tg), L(tgk)}, + {L(th), L(tha)}, + {L(ti), L(tir)}, + {L(tk), L(tuk)}, + {L(tl), L(tgl)}, + {L(tn), L(tsn)}, + {L(to), L(ton)}, + {L(tr), L(tur)}, + {L(ts), L(tso)}, + {L(tt), L(tat)}, + {L(tw), L(twi)}, + {L(ty), L(tah)}, + {L(ug), L(uig)}, + {L(uk), L(ukr)}, + {L(ur), L(urd)}, + {L(uz), L(uzb)}, + {L(ve), L(ven)}, + {L(vi), L(vie)}, + {L(vo), L(vol)}, + {L(wa), L(wln)}, + {L(wo), L(wol)}, + {L(xh), L(xho)}, + {L(yi), L(yid)}, + {L(yo), L(yor)}, + {L(za), L(zha)}, + {L(zh), L(chi)}, + {L(zho), L(chi)}, + {L(zu), L(zul)}, }; static int lang_compare(const void *key, const void *lang) { - return bstrcasecmp0(*(const bstr*)key, ((const struct lang*)lang)->match); + const struct lang *l = lang; + return bstrcasecmp(*(const bstr*)key, (bstr){(unsigned char *)l->match.s, l->match.l}); } static bstr canonicalize(bstr lang) { const struct lang *l = bsearch(&lang, langmap, MP_ARRAY_SIZE(langmap), sizeof(langmap[0]), &lang_compare); - return l ? bstr0(l->canonical) : lang; + return l ? (bstr){(unsigned char *)l->canonical.s, l->canonical.l} : lang; } int mp_match_lang(char **langs, const char *lang)