src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-tag.cc
changeset 48274 51772bf1fb0c
parent 47216 71c04702a3d5
child 50352 25db2c8f3cf8
equal deleted inserted replaced
48273:e2065f7505eb 48274:51772bf1fb0c
    25  * Red Hat Author(s): Behdad Esfahbod
    25  * Red Hat Author(s): Behdad Esfahbod
    26  * Google Author(s): Behdad Esfahbod, Roozbeh Pournader
    26  * Google Author(s): Behdad Esfahbod, Roozbeh Pournader
    27  */
    27  */
    28 
    28 
    29 #include "hb-private.hh"
    29 #include "hb-private.hh"
    30 
       
    31 #include <string.h>
       
    32 
       
    33 
    30 
    34 
    31 
    35 /* hb_script_t */
    32 /* hb_script_t */
    36 
    33 
    37 static hb_tag_t
    34 static hb_tag_t
   199   {"ak",        HB_TAG('T','W','I',' ')},       /* Akan [macrolanguage] */
   196   {"ak",        HB_TAG('T','W','I',' ')},       /* Akan [macrolanguage] */
   200   {"aka",       HB_TAG('A','K','A',' ')},       /* Akan */
   197   {"aka",       HB_TAG('A','K','A',' ')},       /* Akan */
   201   {"alt",       HB_TAG('A','L','T',' ')},       /* [Southern] Altai */
   198   {"alt",       HB_TAG('A','L','T',' ')},       /* [Southern] Altai */
   202   {"am",        HB_TAG('A','M','H',' ')},       /* Amharic */
   199   {"am",        HB_TAG('A','M','H',' ')},       /* Amharic */
   203   {"amf",       HB_TAG('H','B','N',' ')},       /* Hammer-Banna */
   200   {"amf",       HB_TAG('H','B','N',' ')},       /* Hammer-Banna */
       
   201   {"amw",       HB_TAG('S','Y','R',' ')},       /* Western Neo-Aramaic */
   204   {"an",        HB_TAG('A','R','G',' ')},       /* Aragonese */
   202   {"an",        HB_TAG('A','R','G',' ')},       /* Aragonese */
   205   {"ang",       HB_TAG('A','N','G',' ')},       /* Old English (ca. 450-1100) */
   203   {"ang",       HB_TAG('A','N','G',' ')},       /* Old English (ca. 450-1100) */
   206   {"ar",        HB_TAG('A','R','A',' ')},       /* Arabic [macrolanguage] */
   204   {"ar",        HB_TAG('A','R','A',' ')},       /* Arabic [macrolanguage] */
   207   {"arb",       HB_TAG('A','R','A',' ')},       /* Standard Arabic */
   205   {"arb",       HB_TAG('A','R','A',' ')},       /* Standard Arabic */
   208   {"arn",       HB_TAG('M','A','P',' ')},       /* Mapudungun */
   206   {"arn",       HB_TAG('M','A','P',' ')},       /* Mapudungun */
   237   {"bfu",       HB_TAG('L','A','H',' ')},       /* Lahuli */
   235   {"bfu",       HB_TAG('L','A','H',' ')},       /* Lahuli */
   238   {"bfy",       HB_TAG('B','A','G',' ')},       /* Baghelkhandi */
   236   {"bfy",       HB_TAG('B','A','G',' ')},       /* Baghelkhandi */
   239   {"bg",        HB_TAG('B','G','R',' ')},       /* Bulgarian */
   237   {"bg",        HB_TAG('B','G','R',' ')},       /* Bulgarian */
   240   {"bgc",       HB_TAG('B','G','C',' ')},       /* Haryanvi */
   238   {"bgc",       HB_TAG('B','G','C',' ')},       /* Haryanvi */
   241   {"bgq",       HB_TAG('B','G','Q',' ')},       /* Bagri */
   239   {"bgq",       HB_TAG('B','G','Q',' ')},       /* Bagri */
       
   240   {"bgr",       HB_TAG('Q','I','N',' ')},       /* Bawm Chin */
   242   {"bhb",       HB_TAG('B','H','I',' ')},       /* Bhili */
   241   {"bhb",       HB_TAG('B','H','I',' ')},       /* Bhili */
   243   {"bhk",       HB_TAG('B','I','K',' ')},       /* Albay Bicolano (retired code) */
   242   {"bhk",       HB_TAG('B','I','K',' ')},       /* Albay Bicolano (retired code) */
   244   {"bho",       HB_TAG('B','H','O',' ')},       /* Bhojpuri */
   243   {"bho",       HB_TAG('B','H','O',' ')},       /* Bhojpuri */
   245   {"bi",        HB_TAG('B','I','S',' ')},       /* Bislama */
   244   {"bi",        HB_TAG('B','I','S',' ')},       /* Bislama */
   246   {"bik",       HB_TAG('B','I','K',' ')},       /* Bikol [macrolanguage] */
   245   {"bik",       HB_TAG('B','I','K',' ')},       /* Bikol [macrolanguage] */
   268   {"bxr",       HB_TAG('R','B','U',' ')},       /* Russian Buriat */
   267   {"bxr",       HB_TAG('R','B','U',' ')},       /* Russian Buriat */
   269   {"byn",       HB_TAG('B','I','L',' ')},       /* Bilen */
   268   {"byn",       HB_TAG('B','I','L',' ')},       /* Bilen */
   270   {"ca",        HB_TAG('C','A','T',' ')},       /* Catalan */
   269   {"ca",        HB_TAG('C','A','T',' ')},       /* Catalan */
   271   {"cak",       HB_TAG('C','A','K',' ')},       /* Kaqchikel */
   270   {"cak",       HB_TAG('C','A','K',' ')},       /* Kaqchikel */
   272   {"cbk",       HB_TAG('C','B','K',' ')},       /* Chavacano */
   271   {"cbk",       HB_TAG('C','B','K',' ')},       /* Chavacano */
       
   272   {"cbl",       HB_TAG('Q','I','N',' ')},       /* Bualkhaw Chin */
       
   273   {"cco",       HB_TAG('C','C','H','N')},       /* Chinantec */
   273   {"ce",        HB_TAG('C','H','E',' ')},       /* Chechen */
   274   {"ce",        HB_TAG('C','H','E',' ')},       /* Chechen */
   274   {"ceb",       HB_TAG('C','E','B',' ')},       /* Cebuano */
   275   {"ceb",       HB_TAG('C','E','B',' ')},       /* Cebuano */
       
   276   {"cfm",       HB_TAG('H','A','L',' ')},       /* Halam/Falam Chin */
   275   {"cgg",       HB_TAG('C','G','G',' ')},       /* Chiga */
   277   {"cgg",       HB_TAG('C','G','G',' ')},       /* Chiga */
   276   {"ch",        HB_TAG('C','H','A',' ')},       /* Chamorro */
   278   {"ch",        HB_TAG('C','H','A',' ')},       /* Chamorro */
       
   279   {"chj",       HB_TAG('C','C','H','N')},       /* Chinantec */
   277   {"chk",       HB_TAG('C','H','K','0')},       /* Chuukese */
   280   {"chk",       HB_TAG('C','H','K','0')},       /* Chuukese */
   278   {"cho",       HB_TAG('C','H','O',' ')},       /* Choctaw */
   281   {"cho",       HB_TAG('C','H','O',' ')},       /* Choctaw */
   279   {"chp",       HB_TAG('C','H','P',' ')},       /* Chipewyan */
   282   {"chp",       HB_TAG('C','H','P',' ')},       /* Chipewyan */
       
   283   {"chq",       HB_TAG('C','C','H','N')},       /* Chinantec */
   280   {"chr",       HB_TAG('C','H','R',' ')},       /* Cherokee */
   284   {"chr",       HB_TAG('C','H','R',' ')},       /* Cherokee */
   281   {"chy",       HB_TAG('C','H','Y',' ')},       /* Cheyenne */
   285   {"chy",       HB_TAG('C','H','Y',' ')},       /* Cheyenne */
       
   286   {"chz",       HB_TAG('C','C','H','N')},       /* Chinantec */
       
   287   {"cja",       HB_TAG('C','J','A',' ')},       /* Western Cham */
       
   288   {"cjm",       HB_TAG('C','J','M',' ')},       /* Eastern Cham */
       
   289   {"cka",       HB_TAG('Q','I','N',' ')},       /* Khumi Awa Chin */
   282   {"ckb",       HB_TAG('K','U','R',' ')},       /* Central Kurdish (Sorani) */
   290   {"ckb",       HB_TAG('K','U','R',' ')},       /* Central Kurdish (Sorani) */
   283   {"ckt",       HB_TAG('C','H','K',' ')},       /* Chukchi */
   291   {"ckt",       HB_TAG('C','H','K',' ')},       /* Chukchi */
       
   292   {"cld",       HB_TAG('S','Y','R',' ')},       /* Chaldean Neo-Aramaic */
       
   293   {"cle",       HB_TAG('C','C','H','N')},       /* Chinantec */
       
   294   {"cmr",       HB_TAG('Q','I','N',' ')},       /* Mro-Khimi Chin */
       
   295   {"cnb",       HB_TAG('Q','I','N',' ')},       /* Chinbon Chin */
       
   296   {"cnh",       HB_TAG('Q','I','N',' ')},       /* Hakha Chin */
       
   297   {"cnk",       HB_TAG('Q','I','N',' ')},       /* Khumi Chin */
       
   298   {"cnl",       HB_TAG('C','C','H','N')},       /* Chinantec */
       
   299   {"cnt",       HB_TAG('C','C','H','N')},       /* Chinantec */
       
   300   {"cnw",       HB_TAG('Q','I','N',' ')},       /* Ngawn Chin */
   284   {"cop",       HB_TAG('C','O','P',' ')},       /* Coptic */
   301   {"cop",       HB_TAG('C','O','P',' ')},       /* Coptic */
       
   302   {"cpa",       HB_TAG('C','C','H','N')},       /* Chinantec */
   285   {"cpp",       HB_TAG('C','P','P',' ')},       /* Creoles */
   303   {"cpp",       HB_TAG('C','P','P',' ')},       /* Creoles */
   286   {"cr",        HB_TAG('C','R','E',' ')},       /* Cree */
   304   {"cr",        HB_TAG('C','R','E',' ')},       /* Cree */
   287   {"cre",       HB_TAG('Y','C','R',' ')},       /* Y-Cree */
   305   {"cre",       HB_TAG('Y','C','R',' ')},       /* Y-Cree */
   288   {"crh",       HB_TAG('C','R','T',' ')},       /* Crimean Tatar */
   306   {"crh",       HB_TAG('C','R','T',' ')},       /* Crimean Tatar */
   289   {"crj",       HB_TAG('E','C','R',' ')},       /* [Southern] East Cree */
   307   {"crj",       HB_TAG('E','C','R',' ')},       /* [Southern] East Cree */
   290   {"crk",       HB_TAG('W','C','R',' ')},       /* West-Cree */
   308   {"crk",       HB_TAG('W','C','R',' ')},       /* West-Cree */
   291   {"crl",       HB_TAG('E','C','R',' ')},       /* [Northern] East Cree */
   309   {"crl",       HB_TAG('E','C','R',' ')},       /* [Northern] East Cree */
   292   {"crm",       HB_TAG('M','C','R',' ')},       /* Moose Cree */
   310   {"crm",       HB_TAG('M','C','R',' ')},       /* Moose Cree */
   293   {"crx",       HB_TAG('C','R','R',' ')},       /* Carrier */
   311   {"crx",       HB_TAG('C','R','R',' ')},       /* Carrier */
   294   {"cs",        HB_TAG('C','S','Y',' ')},       /* Czech */
   312   {"cs",        HB_TAG('C','S','Y',' ')},       /* Czech */
       
   313   {"csa",       HB_TAG('C','C','H','N')},       /* Chinantec */
   295   {"csb",       HB_TAG('C','S','B',' ')},       /* Kashubian */
   314   {"csb",       HB_TAG('C','S','B',' ')},       /* Kashubian */
       
   315   {"csh",       HB_TAG('Q','I','N',' ')},       /* Asho Chin */
       
   316   {"cso",       HB_TAG('C','C','H','N')},       /* Chinantec */
       
   317   {"csy",       HB_TAG('Q','I','N',' ')},       /* Siyin Chin */
       
   318   {"ctd",       HB_TAG('Q','I','N',' ')},       /* Tedim Chin */
       
   319   {"cte",       HB_TAG('C','C','H','N')},       /* Chinantec */
   296   {"ctg",       HB_TAG('C','T','G',' ')},       /* Chittagonian */
   320   {"ctg",       HB_TAG('C','T','G',' ')},       /* Chittagonian */
       
   321   {"ctl",       HB_TAG('C','C','H','N')},       /* Chinantec */
   297   {"cts",       HB_TAG('B','I','K',' ')},       /* Northern Catanduanes Bikol */
   322   {"cts",       HB_TAG('B','I','K',' ')},       /* Northern Catanduanes Bikol */
   298   {"cu",        HB_TAG('C','S','L',' ')},       /* Church Slavic */
   323   {"cu",        HB_TAG('C','S','L',' ')},       /* Church Slavic */
       
   324   {"cuc",       HB_TAG('C','C','H','N')},       /* Chinantec */
   299   {"cuk",       HB_TAG('C','U','K',' ')},       /* San Blas Kuna */
   325   {"cuk",       HB_TAG('C','U','K',' ')},       /* San Blas Kuna */
   300   {"cv",        HB_TAG('C','H','U',' ')},       /* Chuvash */
   326   {"cv",        HB_TAG('C','H','U',' ')},       /* Chuvash */
       
   327   {"cvn",       HB_TAG('C','C','H','N')},       /* Chinantec */
   301   {"cwd",       HB_TAG('D','C','R',' ')},       /* Woods Cree */
   328   {"cwd",       HB_TAG('D','C','R',' ')},       /* Woods Cree */
   302   {"cy",        HB_TAG('W','E','L',' ')},       /* Welsh */
   329   {"cy",        HB_TAG('W','E','L',' ')},       /* Welsh */
       
   330   {"czt",       HB_TAG('Q','I','N',' ')},       /* Zotung Chin */
   303   {"da",        HB_TAG('D','A','N',' ')},       /* Danish */
   331   {"da",        HB_TAG('D','A','N',' ')},       /* Danish */
       
   332   {"dao",       HB_TAG('Q','I','N',' ')},       /* Daai Chin */
   304   {"dap",       HB_TAG('N','I','S',' ')},       /* Nisi (India) */
   333   {"dap",       HB_TAG('N','I','S',' ')},       /* Nisi (India) */
   305   {"dar",       HB_TAG('D','A','R',' ')},       /* Dargwa */
   334   {"dar",       HB_TAG('D','A','R',' ')},       /* Dargwa */
   306   {"dax",       HB_TAG('D','A','X',' ')},       /* Dayi */
   335   {"dax",       HB_TAG('D','A','X',' ')},       /* Dayi */
   307   {"de",        HB_TAG('D','E','U',' ')},       /* German */
   336   {"de",        HB_TAG('D','E','U',' ')},       /* German */
   308   {"dgo",       HB_TAG('D','G','O',' ')},       /* Dogri */
   337   {"dgo",       HB_TAG('D','G','O',' ')},       /* Dogri */
   341   {"fat",       HB_TAG('F','A','T',' ')},       /* Fanti */
   370   {"fat",       HB_TAG('F','A','T',' ')},       /* Fanti */
   342   {"ff",        HB_TAG('F','U','L',' ')},       /* Fulah [macrolanguage] */
   371   {"ff",        HB_TAG('F','U','L',' ')},       /* Fulah [macrolanguage] */
   343   {"fi",        HB_TAG('F','I','N',' ')},       /* Finnish */
   372   {"fi",        HB_TAG('F','I','N',' ')},       /* Finnish */
   344   {"fil",       HB_TAG('P','I','L',' ')},       /* Filipino */
   373   {"fil",       HB_TAG('P','I','L',' ')},       /* Filipino */
   345   {"fj",        HB_TAG('F','J','I',' ')},       /* Fijian */
   374   {"fj",        HB_TAG('F','J','I',' ')},       /* Fijian */
   346   {"flm",       HB_TAG('H','A','L',' ')},       /* Halam */
   375   {"flm",       HB_TAG('H','A','L',' ')},       /* Halam/Falam Chin [retired ISO639 code] */
   347   {"fo",        HB_TAG('F','O','S',' ')},       /* Faroese */
   376   {"fo",        HB_TAG('F','O','S',' ')},       /* Faroese */
   348   {"fon",       HB_TAG('F','O','N',' ')},       /* Fon */
   377   {"fon",       HB_TAG('F','O','N',' ')},       /* Fon */
   349   {"fr",        HB_TAG('F','R','A',' ')},       /* French */
   378   {"fr",        HB_TAG('F','R','A',' ')},       /* French */
   350   {"frc",       HB_TAG('F','R','C',' ')},       /* Cajun French */
   379   {"frc",       HB_TAG('F','R','C',' ')},       /* Cajun French */
   351   {"frp",       HB_TAG('F','R','P',' ')},       /* Arpitan/Francoprovençal */
   380   {"frp",       HB_TAG('F','R','P',' ')},       /* Arpitan/Francoprovençal */
   363   {"gih",       HB_TAG('G','I','H',' ')},       /* Githabul */
   392   {"gih",       HB_TAG('G','I','H',' ')},       /* Githabul */
   364   {"gil",       HB_TAG('G','I','L','0')},       /* Kiribati (Gilbertese) */
   393   {"gil",       HB_TAG('G','I','L','0')},       /* Kiribati (Gilbertese) */
   365   {"gkp",       HB_TAG('G','K','P',' ')},       /* Kpelle (Guinea) */
   394   {"gkp",       HB_TAG('G','K','P',' ')},       /* Kpelle (Guinea) */
   366   {"gl",        HB_TAG('G','A','L',' ')},       /* Galician */
   395   {"gl",        HB_TAG('G','A','L',' ')},       /* Galician */
   367   {"gld",       HB_TAG('N','A','N',' ')},       /* Nanai */
   396   {"gld",       HB_TAG('N','A','N',' ')},       /* Nanai */
   368   {"gle",       HB_TAG('I','R','T',' ')},       /* Irish Traditional */
       
   369   {"glk",       HB_TAG('G','L','K',' ')},       /* Gilaki */
   397   {"glk",       HB_TAG('G','L','K',' ')},       /* Gilaki */
   370   {"gn",        HB_TAG('G','U','A',' ')},       /* Guarani [macrolanguage] */
   398   {"gn",        HB_TAG('G','U','A',' ')},       /* Guarani [macrolanguage] */
   371   {"gnn",       HB_TAG('G','N','N',' ')},       /* Gumatj */
   399   {"gnn",       HB_TAG('G','N','N',' ')},       /* Gumatj */
   372   {"gno",       HB_TAG('G','O','N',' ')},       /* Northern Gondi */
   400   {"gno",       HB_TAG('G','O','N',' ')},       /* Northern Gondi */
   373   {"gog",       HB_TAG('G','O','G',' ')},       /* Gogo */
   401   {"gog",       HB_TAG('G','O','G',' ')},       /* Gogo */
   388   {"hay",       HB_TAG('H','A','Y',' ')},       /* Haya */
   416   {"hay",       HB_TAG('H','A','Y',' ')},       /* Haya */
   389   {"haz",       HB_TAG('H','A','Z',' ')},       /* Hazaragi */
   417   {"haz",       HB_TAG('H','A','Z',' ')},       /* Hazaragi */
   390   {"he",        HB_TAG('I','W','R',' ')},       /* Hebrew */
   418   {"he",        HB_TAG('I','W','R',' ')},       /* Hebrew */
   391   {"hi",        HB_TAG('H','I','N',' ')},       /* Hindi */
   419   {"hi",        HB_TAG('H','I','N',' ')},       /* Hindi */
   392   {"hil",       HB_TAG('H','I','L',' ')},       /* Hiligaynon */
   420   {"hil",       HB_TAG('H','I','L',' ')},       /* Hiligaynon */
       
   421   {"hlt",       HB_TAG('Q','I','N',' ')},       /* Matu Chin */
   393   {"hmn",       HB_TAG('H','M','N',' ')},       /* Hmong */
   422   {"hmn",       HB_TAG('H','M','N',' ')},       /* Hmong */
   394   {"hnd",       HB_TAG('H','N','D',' ')},       /* [Southern] Hindko */
   423   {"hnd",       HB_TAG('H','N','D',' ')},       /* [Southern] Hindko */
   395   {"hne",       HB_TAG('C','H','H',' ')},       /* Chattisgarhi */
   424   {"hne",       HB_TAG('C','H','H',' ')},       /* Chattisgarhi */
   396   {"hno",       HB_TAG('H','N','D',' ')},       /* [Northern] Hindko */
   425   {"hno",       HB_TAG('H','N','D',' ')},       /* [Northern] Hindko */
   397   {"ho",        HB_TAG('H','M','O',' ')},       /* Hiri Motu */
   426   {"ho",        HB_TAG('H','M','O',' ')},       /* Hiri Motu */
   520   {"lzz",       HB_TAG('L','A','Z',' ')},       /* Laz */
   549   {"lzz",       HB_TAG('L','A','Z',' ')},       /* Laz */
   521   {"mad",       HB_TAG('M','A','D',' ')},       /* Madurese */
   550   {"mad",       HB_TAG('M','A','D',' ')},       /* Madurese */
   522   {"mag",       HB_TAG('M','A','G',' ')},       /* Magahi */
   551   {"mag",       HB_TAG('M','A','G',' ')},       /* Magahi */
   523   {"mai",       HB_TAG('M','T','H',' ')},       /* Maithili */
   552   {"mai",       HB_TAG('M','T','H',' ')},       /* Maithili */
   524   {"mak",       HB_TAG('M','K','R',' ')},       /* Makasar */
   553   {"mak",       HB_TAG('M','K','R',' ')},       /* Makasar */
   525   {"mal",       HB_TAG('M','A','L',' ')},       /* Malayalam */
       
   526   {"mam",       HB_TAG('M','A','M',' ')},       /* Mam */
   554   {"mam",       HB_TAG('M','A','M',' ')},       /* Mam */
   527   {"man",       HB_TAG('M','N','K',' ')},       /* Manding/Mandingo [macrolanguage] */
   555   {"man",       HB_TAG('M','N','K',' ')},       /* Manding/Mandingo [macrolanguage] */
   528   {"mdc",       HB_TAG('M','L','E',' ')},       /* Male (Papua New Guinea) */
   556   {"mdc",       HB_TAG('M','L','E',' ')},       /* Male (Papua New Guinea) */
   529   {"mdf",       HB_TAG('M','O','K',' ')},       /* Moksha */
   557   {"mdf",       HB_TAG('M','O','K',' ')},       /* Moksha */
   530   {"mdr",       HB_TAG('M','D','R',' ')},       /* Mandar */
   558   {"mdr",       HB_TAG('M','D','R',' ')},       /* Mandar */
   551   {"mo",        HB_TAG('M','O','L',' ')},       /* Moldavian */
   579   {"mo",        HB_TAG('M','O','L',' ')},       /* Moldavian */
   552   {"moh",       HB_TAG('M','O','H',' ')},       /* Mohawk */
   580   {"moh",       HB_TAG('M','O','H',' ')},       /* Mohawk */
   553   {"mos",       HB_TAG('M','O','S',' ')},       /* Mossi */
   581   {"mos",       HB_TAG('M','O','S',' ')},       /* Mossi */
   554   {"mpe",       HB_TAG('M','A','J',' ')},       /* Majang */
   582   {"mpe",       HB_TAG('M','A','J',' ')},       /* Majang */
   555   {"mr",        HB_TAG('M','A','R',' ')},       /* Marathi */
   583   {"mr",        HB_TAG('M','A','R',' ')},       /* Marathi */
       
   584   {"mrh",       HB_TAG('Q','I','N',' ')},       /* Mara Chin */
   556   {"mrj",       HB_TAG('H','M','A',' ')},       /* High Mari */
   585   {"mrj",       HB_TAG('H','M','A',' ')},       /* High Mari */
   557   {"ms",        HB_TAG('M','L','Y',' ')},       /* Malay [macrolanguage] */
   586   {"ms",        HB_TAG('M','L','Y',' ')},       /* Malay [macrolanguage] */
   558   {"msc",       HB_TAG('M','N','K',' ')},       /* Sankaran Maninka */
   587   {"msc",       HB_TAG('M','N','K',' ')},       /* Sankaran Maninka */
   559   {"mt",        HB_TAG('M','T','S',' ')},       /* Maltese */
   588   {"mt",        HB_TAG('M','T','S',' ')},       /* Maltese */
   560   {"mtr",       HB_TAG('M','A','W',' ')},       /* Mewari */
   589   {"mtr",       HB_TAG('M','A','W',' ')},       /* Mewari */
   615   {"pap",       HB_TAG('P','A','P','0')},       /* Papiamento */
   644   {"pap",       HB_TAG('P','A','P','0')},       /* Papiamento */
   616   {"pau",       HB_TAG('P','A','U',' ')},       /* Palauan */
   645   {"pau",       HB_TAG('P','A','U',' ')},       /* Palauan */
   617   {"pcc",       HB_TAG('P','C','C',' ')},       /* Bouyei */
   646   {"pcc",       HB_TAG('P','C','C',' ')},       /* Bouyei */
   618   {"pcd",       HB_TAG('P','C','D',' ')},       /* Picard */
   647   {"pcd",       HB_TAG('P','C','D',' ')},       /* Picard */
   619   {"pce",       HB_TAG('P','L','G',' ')},       /* [Ruching] Palaung */
   648   {"pce",       HB_TAG('P','L','G',' ')},       /* [Ruching] Palaung */
       
   649   {"pck",       HB_TAG('Q','I','N',' ')},       /* Paite Chin */
   620   {"pdc",       HB_TAG('P','D','C',' ')},       /* Pennsylvania German */
   650   {"pdc",       HB_TAG('P','D','C',' ')},       /* Pennsylvania German */
   621   {"pes",       HB_TAG('F','A','R',' ')},       /* Iranian Persian */
   651   {"pes",       HB_TAG('F','A','R',' ')},       /* Iranian Persian */
   622   {"phk",       HB_TAG('P','H','K',' ')},       /* Phake */
   652   {"phk",       HB_TAG('P','H','K',' ')},       /* Phake */
   623   {"pi",        HB_TAG('P','A','L',' ')},       /* Pali */
   653   {"pi",        HB_TAG('P','A','L',' ')},       /* Pali */
   624   {"pih",       HB_TAG('P','I','H',' ')},       /* Pitcairn-Norfolk */
   654   {"pih",       HB_TAG('P','I','H',' ')},       /* Pitcairn-Norfolk */
   672   {"scs",       HB_TAG('S','L','A',' ')},       /* [North] Slavey */
   702   {"scs",       HB_TAG('S','L','A',' ')},       /* [North] Slavey */
   673   {"sd",        HB_TAG('S','N','D',' ')},       /* Sindhi */
   703   {"sd",        HB_TAG('S','N','D',' ')},       /* Sindhi */
   674   {"se",        HB_TAG('N','S','M',' ')},       /* Northern Sami */
   704   {"se",        HB_TAG('N','S','M',' ')},       /* Northern Sami */
   675   {"seh",       HB_TAG('S','N','A',' ')},       /* Sena */
   705   {"seh",       HB_TAG('S','N','A',' ')},       /* Sena */
   676   {"sel",       HB_TAG('S','E','L',' ')},       /* Selkup */
   706   {"sel",       HB_TAG('S','E','L',' ')},       /* Selkup */
       
   707   {"sez",       HB_TAG('Q','I','N',' ')},       /* Senthang Chin */
   677   {"sg",        HB_TAG('S','G','O',' ')},       /* Sango */
   708   {"sg",        HB_TAG('S','G','O',' ')},       /* Sango */
   678   {"sga",       HB_TAG('S','G','A',' ')},       /* Old Irish (to 900) */
   709   {"sga",       HB_TAG('S','G','A',' ')},       /* Old Irish (to 900) */
   679   {"sgs",       HB_TAG('S','G','S',' ')},       /* Samogitian */
   710   {"sgs",       HB_TAG('S','G','S',' ')},       /* Samogitian */
   680   {"sgw",       HB_TAG('C','H','G',' ')},       /* Sebat Bet Gurage */
   711   {"sgw",       HB_TAG('C','H','G',' ')},       /* Sebat Bet Gurage */
   681 /*{"sgw",       HB_TAG('S','G','W',' ')},*/     /* Sebat Bet Gurage (in SIL fonts) */
   712 /*{"sgw",       HB_TAG('S','G','W',' ')},*/     /* Sebat Bet Gurage (in SIL fonts) */
   711   {"sw",        HB_TAG('S','W','K',' ')},       /* Swahili [macrolanguage] */
   742   {"sw",        HB_TAG('S','W','K',' ')},       /* Swahili [macrolanguage] */
   712   {"swb",       HB_TAG('C','M','R',' ')},       /* Comorian */
   743   {"swb",       HB_TAG('C','M','R',' ')},       /* Comorian */
   713   {"swh",       HB_TAG('S','W','K',' ')},       /* Kiswahili/Swahili */
   744   {"swh",       HB_TAG('S','W','K',' ')},       /* Kiswahili/Swahili */
   714   {"swv",       HB_TAG('M','A','W',' ')},       /* Shekhawati */
   745   {"swv",       HB_TAG('M','A','W',' ')},       /* Shekhawati */
   715   {"sxu",       HB_TAG('S','X','U',' ')},       /* Upper Saxon */
   746   {"sxu",       HB_TAG('S','X','U',' ')},       /* Upper Saxon */
       
   747   {"syc",       HB_TAG('S','Y','R',' ')},       /* Classical Syriac */
   716   {"syl",       HB_TAG('S','Y','L',' ')},       /* Sylheti */
   748   {"syl",       HB_TAG('S','Y','L',' ')},       /* Sylheti */
   717   {"syr",       HB_TAG('S','Y','R',' ')},       /* Syriac [macrolanguage] */
   749   {"syr",       HB_TAG('S','Y','R',' ')},       /* Syriac [macrolanguage] */
   718   {"szl",       HB_TAG('S','Z','L',' ')},       /* Silesian */
   750   {"szl",       HB_TAG('S','Z','L',' ')},       /* Silesian */
   719   {"ta",        HB_TAG('T','A','M',' ')},       /* Tamil */
   751   {"ta",        HB_TAG('T','A','M',' ')},       /* Tamil */
   720   {"tab",       HB_TAG('T','A','B',' ')},       /* Tabasaran */
   752   {"tab",       HB_TAG('T','A','B',' ')},       /* Tabasaran */
       
   753   {"tcp",       HB_TAG('Q','I','N',' ')},       /* Tawr Chin */
   721   {"tcy",       HB_TAG('T','U','L',' ')},       /* Tulu */
   754   {"tcy",       HB_TAG('T','U','L',' ')},       /* Tulu */
       
   755   {"tcz",       HB_TAG('Q','I','N',' ')},       /* Thado Chin */
   722   {"tdd",       HB_TAG('T','D','D',' ')},       /* Tai Nüa */
   756   {"tdd",       HB_TAG('T','D','D',' ')},       /* Tai Nüa */
   723   {"te",        HB_TAG('T','E','L',' ')},       /* Telugu */
   757   {"te",        HB_TAG('T','E','L',' ')},       /* Telugu */
   724   {"tem",       HB_TAG('T','M','N',' ')},       /* Temne */
   758   {"tem",       HB_TAG('T','M','N',' ')},       /* Temne */
   725   {"tet",       HB_TAG('T','E','T',' ')},       /* Tetum */
   759   {"tet",       HB_TAG('T','E','T',' ')},       /* Tetum */
   726   {"tg",        HB_TAG('T','A','J',' ')},       /* Tajik */
   760   {"tg",        HB_TAG('T','A','J',' ')},       /* Tajik */
   784   {"xwo",       HB_TAG('T','O','D',' ')},       /* Written Oirat (Todo) */
   818   {"xwo",       HB_TAG('T','O','D',' ')},       /* Written Oirat (Todo) */
   785   {"yao",       HB_TAG('Y','A','O',' ')},       /* Yao */
   819   {"yao",       HB_TAG('Y','A','O',' ')},       /* Yao */
   786   {"yap",       HB_TAG('Y','A','P',' ')},       /* Yapese */
   820   {"yap",       HB_TAG('Y','A','P',' ')},       /* Yapese */
   787   {"yi",        HB_TAG('J','I','I',' ')},       /* Yiddish [macrolanguage] */
   821   {"yi",        HB_TAG('J','I','I',' ')},       /* Yiddish [macrolanguage] */
   788   {"yo",        HB_TAG('Y','B','A',' ')},       /* Yoruba */
   822   {"yo",        HB_TAG('Y','B','A',' ')},       /* Yoruba */
       
   823   {"yos",       HB_TAG('Q','I','N',' ')},       /* Yos, deprecated by IANA in favor of Zou [zom] */
   789   {"yso",       HB_TAG('N','I','S',' ')},       /* Nisi (China) */
   824   {"yso",       HB_TAG('N','I','S',' ')},       /* Nisi (China) */
   790   {"za",        HB_TAG('Z','H','A',' ')},       /* Chuang/Zhuang [macrolanguage] */
   825   {"za",        HB_TAG('Z','H','A',' ')},       /* Chuang/Zhuang [macrolanguage] */
   791   {"zea",       HB_TAG('Z','E','A',' ')},       /* Zeeuws */
   826   {"zea",       HB_TAG('Z','E','A',' ')},       /* Zeeuws */
   792   {"zgh",       HB_TAG('Z','G','H',' ')},       /* Standard Morrocan Tamazigh */
   827   {"zgh",       HB_TAG('Z','G','H',' ')},       /* Standard Morrocan Tamazigh */
   793   {"zne",       HB_TAG('Z','N','D',' ')},       /* Zande */
   828   {"zne",       HB_TAG('Z','N','D',' ')},       /* Zande */
       
   829   {"zom",       HB_TAG('Q','I','N',' ')},       /* Zou */
   794   {"zu",        HB_TAG('Z','U','L',' ')},       /* Zulu */
   830   {"zu",        HB_TAG('Z','U','L',' ')},       /* Zulu */
   795   {"zum",       HB_TAG('L','R','C',' ')},       /* Kumzari */
   831   {"zum",       HB_TAG('L','R','C',' ')},       /* Kumzari */
   796   {"zza",       HB_TAG('Z','Z','A',' ')},       /* Zazaki */
   832   {"zza",       HB_TAG('Z','Z','A',' ')},       /* Zazaki */
   797 
   833 
   798   /* The corresponding languages IDs for the following IDs are unclear,
   834   /* The corresponding languages IDs for the following IDs are unclear,
   841   {"zh-hant-mo",HB_TAG('Z','H','H',' ')},       /* Chinese (Macao) */
   877   {"zh-hant-mo",HB_TAG('Z','H','H',' ')},       /* Chinese (Macao) */
   842   {"zh-hant",   HB_TAG('Z','H','T',' ')},       /* Chinese (Traditional) */
   878   {"zh-hant",   HB_TAG('Z','H','T',' ')},       /* Chinese (Traditional) */
   843 };
   879 };
   844 
   880 
   845 static int
   881 static int
   846 lang_compare_first_component (const char *a,
   882 lang_compare_first_component (const void *pa,
   847                               const char *b)
   883                               const void *pb)
   848 {
   884 {
       
   885   const char *a = (const char *) pa;
       
   886   const char *b = (const char *) pb;
   849   unsigned int da, db;
   887   unsigned int da, db;
   850   const char *p;
   888   const char *p;
   851 
   889 
   852   p = strchr (a, '-');
   890   p = strchr (a, '-');
   853   da = p ? (unsigned int) (p - a) : strlen (a);
   891   da = p ? (unsigned int) (p - a) : strlen (a);
   885     for (i = 0; i < 4 && ISALPHA (s[i]); i++)
   923     for (i = 0; i < 4 && ISALPHA (s[i]); i++)
   886       tag[i] = TOUPPER (s[i]);
   924       tag[i] = TOUPPER (s[i]);
   887     if (i) {
   925     if (i) {
   888       for (; i < 4; i++)
   926       for (; i < 4; i++)
   889         tag[i] = ' ';
   927         tag[i] = ' ';
   890       return HB_TAG_CHAR4 (tag);
   928       return HB_TAG (tag[0], tag[1], tag[2], tag[3]);
   891     }
   929     }
   892   }
   930   }
   893 
   931 
   894   /*
   932   /*
   895    * "fonipa" is a variant tag in BCP-47, meaning the International Phonetic Alphabet.
   933    * "fonipa" is a variant tag in BCP-47, meaning the International Phonetic Alphabet.
   905    */
   943    */
   906   if (strstr (lang_str, "-fonnapa")) {
   944   if (strstr (lang_str, "-fonnapa")) {
   907     return HB_TAG('A','P','P','H');  /* Phonetic transcription—Americanist conventions */
   945     return HB_TAG('A','P','P','H');  /* Phonetic transcription—Americanist conventions */
   908   }
   946   }
   909 
   947 
       
   948   /*
       
   949    * "Syre" is a BCP-47 script tag, meaning the Estrangela variant of the Syriac script.
       
   950    * It can be applied to any language.
       
   951    */
       
   952   if (strstr (lang_str, "-syre")) {
       
   953     return HB_TAG('S','Y','R','E');  /* Estrangela Syriac */
       
   954   }
       
   955 
       
   956   /*
       
   957    * "Syrj" is a BCP-47 script tag, meaning the Western variant of the Syriac script.
       
   958    * It can be applied to any language.
       
   959    */
       
   960   if (strstr (lang_str, "-syrj")) {
       
   961     return HB_TAG('S','Y','R','J');  /* Western Syriac */
       
   962   }
       
   963 
       
   964   /*
       
   965    * "Syrn" is a BCP-47 script tag, meaning the Eastern variant of the Syriac script.
       
   966    * It can be applied to any language.
       
   967    */
       
   968   if (strstr (lang_str, "-syrn")) {
       
   969     return HB_TAG('S','Y','R','N');  /* Eastern Syriac */
       
   970   }
       
   971 
   910   /* Find a language matching in the first component */
   972   /* Find a language matching in the first component */
   911   {
   973   {
   912     const LangTag *lang_tag;
   974     const LangTag *lang_tag;
   913     lang_tag = (LangTag *) bsearch (lang_str, ot_languages,
   975     lang_tag = (LangTag *) bsearch (lang_str, ot_languages,
   914                                     ARRAY_LENGTH (ot_languages), sizeof (LangTag),
   976                                     ARRAY_LENGTH (ot_languages), sizeof (LangTag),
   915                                     (hb_compare_func_t) lang_compare_first_component);
   977                                     lang_compare_first_component);
   916     if (lang_tag)
   978     if (lang_tag)
   917       return lang_tag->tag;
   979       return lang_tag->tag;
   918   }
   980   }
   919 
   981 
   920   /* Otherwise, check the Chinese ones */
   982   /* Otherwise, check the Chinese ones */
   946 }
  1008 }
   947 
  1009 
   948 /**
  1010 /**
   949  * hb_ot_tag_to_language:
  1011  * hb_ot_tag_to_language:
   950  *
  1012  *
   951  * 
  1013  *
   952  *
  1014  *
   953  * Return value: (transfer none):
  1015  * Return value: (transfer none):
   954  *
  1016  *
   955  * Since: 0.9.2
  1017  * Since: 0.9.2
   956  **/
  1018  **/
   958 hb_ot_tag_to_language (hb_tag_t tag)
  1020 hb_ot_tag_to_language (hb_tag_t tag)
   959 {
  1021 {
   960   unsigned int i;
  1022   unsigned int i;
   961 
  1023 
   962   if (tag == HB_OT_TAG_DEFAULT_LANGUAGE)
  1024   if (tag == HB_OT_TAG_DEFAULT_LANGUAGE)
   963     return NULL;
  1025     return nullptr;
       
  1026 
       
  1027   /* struct LangTag has only room for 3-letter language tags. */
       
  1028   switch (tag) {
       
  1029   case HB_TAG('A','P','P','H'):  /* Phonetic transcription—Americanist conventions */
       
  1030     return hb_language_from_string ("und-fonnapa", -1);
       
  1031   case HB_TAG('I','P','P','H'):  /* Phonetic transcription—IPA conventions */
       
  1032     return hb_language_from_string ("und-fonipa", -1);
       
  1033   case HB_TAG('S','Y','R',' '):  /* Syriac [macrolanguage] */
       
  1034     return hb_language_from_string ("syr", -1);
       
  1035   case HB_TAG('S','Y','R','E'):  /* Estrangela Syriac */
       
  1036     return hb_language_from_string ("und-Syre", -1);
       
  1037   case HB_TAG('S','Y','R','J'):  /* Western Syriac */
       
  1038     return hb_language_from_string ("und-Syrj", -1);
       
  1039   case HB_TAG('S','Y','R','N'):  /* Eastern Syriac */
       
  1040     return hb_language_from_string ("und-Syrn", -1);
       
  1041   }
   964 
  1042 
   965   for (i = 0; i < ARRAY_LENGTH (ot_languages); i++)
  1043   for (i = 0; i < ARRAY_LENGTH (ot_languages); i++)
   966     if (ot_languages[i].tag == tag)
  1044     if (ot_languages[i].tag == tag)
   967       return hb_language_from_string (ot_languages[i].language, -1);
  1045       return hb_language_from_string (ot_languages[i].language, -1);
   968 
  1046 
   972       case HB_TAG('Z','H','H',' '): return hb_language_from_string ("zh-hk", -1); /* Hong Kong */
  1050       case HB_TAG('Z','H','H',' '): return hb_language_from_string ("zh-hk", -1); /* Hong Kong */
   973       case HB_TAG('Z','H','S',' '): return hb_language_from_string ("zh-Hans", -1); /* Simplified */
  1051       case HB_TAG('Z','H','S',' '): return hb_language_from_string ("zh-Hans", -1); /* Simplified */
   974       case HB_TAG('Z','H','T',' '): return hb_language_from_string ("zh-Hant", -1); /* Traditional */
  1052       case HB_TAG('Z','H','T',' '): return hb_language_from_string ("zh-Hant", -1); /* Traditional */
   975       default: break; /* Fall through */
  1053       default: break; /* Fall through */
   976     }
  1054     }
   977   }
       
   978 
       
   979   /* struct LangTag has only room for 3-letter language tags. */
       
   980   switch (tag) {
       
   981   case HB_TAG('A','P','P','H'):  /* Phonetic transcription—Americanist conventions */
       
   982     return hb_language_from_string ("und-fonnapa", -1);
       
   983   case HB_TAG('I','P','P','H'):  /* Phonetic transcription—IPA conventions */
       
   984     return hb_language_from_string ("und-fonipa", -1);
       
   985   }
  1055   }
   986 
  1056 
   987   /* Else return a custom language in the form of "x-hbotABCD" */
  1057   /* Else return a custom language in the form of "x-hbotABCD" */
   988   {
  1058   {
   989     unsigned char buf[11] = "x-hbot";
  1059     unsigned char buf[11] = "x-hbot";