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:
Kacper Michajłow 2024-05-07 10:45:50 +02:00
parent 5009e13431
commit 4fe67933c2
1 changed files with 211 additions and 208 deletions

View File

@ -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)