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