test_iso3166.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781
  1. /*
  2. libzint - the open source barcode library
  3. Copyright (C) 2021-2022 Robin Stuart <rstuart114@gmail.com>
  4. Redistribution and use in source and binary forms, with or without
  5. modification, are permitted provided that the following conditions
  6. are met:
  7. 1. Redistributions of source code must retain the above copyright
  8. notice, this list of conditions and the following disclaimer.
  9. 2. Redistributions in binary form must reproduce the above copyright
  10. notice, this list of conditions and the following disclaimer in the
  11. documentation and/or other materials provided with the distribution.
  12. 3. Neither the name of the project nor the names of its contributors
  13. may be used to endorse or promote products derived from this software
  14. without specific prior written permission.
  15. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  16. ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  17. IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  18. ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
  19. FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  20. DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  21. OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  22. HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  23. LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  24. OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  25. SUCH DAMAGE.
  26. */
  27. /* SPDX-License-Identifier: BSD-3-Clause */
  28. #include "testcommon.h"
  29. #include "../iso3166.h"
  30. static void test_numeric(const testCtx *const p_ctx) {
  31. struct item {
  32. int data;
  33. int ret;
  34. };
  35. /* s/\/\*[ 0-9]*\*\//\=printf("\/\*%3d*\/", line(".") - line("'<")): */
  36. struct item data[] = {
  37. /* 0*/ { -1, 0 },
  38. /* 1*/ { 0, 0 },
  39. /* 2*/ { 1, 0 },
  40. /* 3*/ { 2, 0 },
  41. /* 4*/ { 3, 0 },
  42. /* 5*/ { 4, 1 },
  43. /* 6*/ { 5, 0 },
  44. /* 7*/ { 6, 0 },
  45. /* 8*/ { 7, 0 },
  46. /* 9*/ { 8, 1 },
  47. /* 10*/ { 9, 0 },
  48. /* 11*/ { 10, 1 },
  49. /* 12*/ { 11, 0 },
  50. /* 13*/ { 12, 1 },
  51. /* 14*/ { 13, 0 },
  52. /* 15*/ { 14, 0 },
  53. /* 16*/ { 15, 0 },
  54. /* 17*/ { 16, 1 },
  55. /* 18*/ { 17, 0 },
  56. /* 19*/ { 18, 0 },
  57. /* 20*/ { 19, 0 },
  58. /* 21*/ { 20, 1 },
  59. /* 22*/ { 21, 0 },
  60. /* 23*/ { 22, 0 },
  61. /* 24*/ { 23, 0 },
  62. /* 25*/ { 24, 1 },
  63. /* 26*/ { 25, 0 },
  64. /* 27*/ { 26, 0 },
  65. /* 28*/ { 27, 0 },
  66. /* 29*/ { 28, 1 },
  67. /* 30*/ { 29, 0 },
  68. /* 31*/ { 30, 0 },
  69. /* 32*/ { 31, 1 },
  70. /* 33*/ { 32, 1 },
  71. /* 34*/ { 33, 0 },
  72. /* 35*/ { 34, 0 },
  73. /* 36*/ { 35, 0 },
  74. /* 37*/ { 36, 1 },
  75. /* 38*/ { 37, 0 },
  76. /* 39*/ { 38, 0 },
  77. /* 40*/ { 39, 0 },
  78. /* 41*/ { 40, 1 },
  79. /* 42*/ { 41, 0 },
  80. /* 43*/ { 47, 0 },
  81. /* 44*/ { 48, 1 },
  82. /* 45*/ { 49, 0 },
  83. /* 46*/ { 50, 1 },
  84. /* 47*/ { 51, 1 },
  85. /* 48*/ { 52, 1 },
  86. /* 49*/ { 53, 0 },
  87. /* 50*/ { 67, 0 },
  88. /* 51*/ { 68, 1 },
  89. /* 52*/ { 69, 0 },
  90. /* 53*/ { 70, 1 },
  91. /* 54*/ { 71, 0 },
  92. /* 55*/ { 72, 1 },
  93. /* 56*/ { 73, 0 },
  94. /* 57*/ { 74, 1 },
  95. /* 58*/ { 75, 0 },
  96. /* 59*/ { 76, 1 },
  97. /* 60*/ { 77, 0 },
  98. /* 61*/ { 83, 0 },
  99. /* 62*/ { 84, 1 },
  100. /* 63*/ { 85, 0 },
  101. /* 64*/ { 86, 1 },
  102. /* 65*/ { 87, 0 },
  103. /* 66*/ { 99, 0 },
  104. /* 67*/ { 100, 1 },
  105. /* 68*/ { 101, 0 },
  106. /* 69*/ { 110, 0 },
  107. /* 70*/ { 119, 0 },
  108. /* 71*/ { 120, 1 },
  109. /* 72*/ { 121, 0 },
  110. /* 73*/ { 130, 0 },
  111. /* 74*/ { 131, 0 },
  112. /* 75*/ { 132, 1 },
  113. /* 76*/ { 133, 0 },
  114. /* 77*/ { 147, 0 },
  115. /* 78*/ { 148, 1 },
  116. /* 79*/ { 149, 0 },
  117. /* 80*/ { 150, 0 },
  118. /* 81*/ { 151, 0 },
  119. /* 82*/ { 152, 1 },
  120. /* 83*/ { 153, 0 },
  121. /* 84*/ { 154, 0 },
  122. /* 85*/ { 155, 0 },
  123. /* 86*/ { 156, 1 },
  124. /* 87*/ { 157, 0 },
  125. /* 88*/ { 158, 1 },
  126. /* 89*/ { 159, 0 },
  127. /* 90*/ { 160, 0 },
  128. /* 91*/ { 161, 0 },
  129. /* 92*/ { 162, 1 },
  130. /* 93*/ { 163, 0 },
  131. /* 94*/ { 169, 0 },
  132. /* 95*/ { 170, 1 },
  133. /* 96*/ { 171, 0 },
  134. /* 97*/ { 177, 0 },
  135. /* 98*/ { 178, 1 },
  136. /* 99*/ { 179, 0 },
  137. /*100*/ { 180, 1 },
  138. /*101*/ { 181, 0 },
  139. /*102*/ { 190, 0 },
  140. /*103*/ { 191, 1 },
  141. /*104*/ { 192, 1 },
  142. /*105*/ { 193, 0 },
  143. /*106*/ { 200, 0 },
  144. /*107*/ { 210, 0 },
  145. /*108*/ { 220, 0 },
  146. /*109*/ { 230, 0 },
  147. /*110*/ { 231, 1 },
  148. /*111*/ { 232, 1 },
  149. /*112*/ { 233, 1 },
  150. /*113*/ { 234, 1 },
  151. /*114*/ { 235, 0 },
  152. /*115*/ { 236, 0 },
  153. /*116*/ { 237, 0 },
  154. /*117*/ { 238, 1 },
  155. /*118*/ { 239, 1 },
  156. /*119*/ { 240, 0 },
  157. /*120*/ { 241, 0 },
  158. /*121*/ { 242, 1 },
  159. /*122*/ { 243, 0 },
  160. /*123*/ { 244, 0 },
  161. /*124*/ { 245, 0 },
  162. /*125*/ { 246, 1 },
  163. /*126*/ { 247, 0 },
  164. /*127*/ { 248, 1 },
  165. /*128*/ { 249, 0 },
  166. /*129*/ { 250, 1 },
  167. /*130*/ { 251, 0 },
  168. /*131*/ { 259, 0 },
  169. /*132*/ { 260, 1 },
  170. /*133*/ { 261, 0 },
  171. /*134*/ { 269, 0 },
  172. /*135*/ { 270, 1 },
  173. /*136*/ { 271, 0 },
  174. /*137*/ { 280, 0 },
  175. /*138*/ { 287, 0 },
  176. /*139*/ { 288, 1 },
  177. /*140*/ { 289, 0 },
  178. /*141*/ { 290, 0 },
  179. /*142*/ { 291, 0 },
  180. /*143*/ { 292, 1 },
  181. /*144*/ { 293, 0 },
  182. /*145*/ { 299, 0 },
  183. /*146*/ { 300, 1 },
  184. /*147*/ { 301, 0 },
  185. /*148*/ { 310, 0 },
  186. /*149*/ { 319, 0 },
  187. /*150*/ { 320, 1 },
  188. /*151*/ { 321, 0 },
  189. /*152*/ { 322, 0 },
  190. /*153*/ { 323, 0 },
  191. /*154*/ { 324, 1 },
  192. /*155*/ { 325, 0 },
  193. /*156*/ { 330, 0 },
  194. /*157*/ { 339, 0 },
  195. /*158*/ { 340, 1 },
  196. /*159*/ { 341, 0 },
  197. /*160*/ { 350, 0 },
  198. /*161*/ { 367, 0 },
  199. /*162*/ { 368, 1 },
  200. /*163*/ { 369, 0 },
  201. /*164*/ { 370, 0 },
  202. /*165*/ { 379, 0 },
  203. /*166*/ { 380, 1 },
  204. /*167*/ { 381, 0 },
  205. /*168*/ { 397, 0 },
  206. /*169*/ { 398, 1 },
  207. /*170*/ { 399, 0 },
  208. /*171*/ { 400, 1 },
  209. /*172*/ { 401, 0 },
  210. /*173*/ { 409, 0 },
  211. /*174*/ { 410, 1 },
  212. /*175*/ { 411, 0 },
  213. /*176*/ { 426, 1 },
  214. /*177*/ { 427, 0 },
  215. /*178*/ { 428, 1 },
  216. /*179*/ { 429, 0 },
  217. /*180*/ { 430, 1 },
  218. /*181*/ { 431, 0 },
  219. /*182*/ { 432, 0 },
  220. /*183*/ { 433, 0 },
  221. /*184*/ { 434, 1 },
  222. /*185*/ { 435, 0 },
  223. /*186*/ { 436, 0 },
  224. /*187*/ { 437, 0 },
  225. /*188*/ { 438, 1 },
  226. /*189*/ { 439, 0 },
  227. /*190*/ { 440, 1 },
  228. /*191*/ { 441, 0 },
  229. /*192*/ { 442, 1 },
  230. /*193*/ { 443, 0 },
  231. /*194*/ { 449, 0 },
  232. /*195*/ { 450, 1 },
  233. /*196*/ { 451, 0 },
  234. /*197*/ { 460, 0 },
  235. /*198*/ { 469, 0 },
  236. /*199*/ { 470, 1 },
  237. /*200*/ { 471, 0 },
  238. /*201*/ { 479, 0 },
  239. /*202*/ { 480, 1 },
  240. /*203*/ { 481, 0 },
  241. /*204*/ { 490, 0 },
  242. /*205*/ { 497, 0 },
  243. /*206*/ { 498, 1 },
  244. /*207*/ { 499, 1 },
  245. /*208*/ { 500, 1 },
  246. /*209*/ { 501, 0 },
  247. /*210*/ { 502, 0 },
  248. /*211*/ { 503, 0 },
  249. /*212*/ { 504, 1 },
  250. /*213*/ { 505, 0 },
  251. /*214*/ { 510, 0 },
  252. /*215*/ { 519, 0 },
  253. /*216*/ { 520, 1 },
  254. /*217*/ { 521, 0 },
  255. /*218*/ { 530, 0 },
  256. /*219*/ { 531, 1 },
  257. /*220*/ { 532, 0 },
  258. /*221*/ { 539, 0 },
  259. /*222*/ { 540, 1 },
  260. /*223*/ { 541, 0 },
  261. /*224*/ { 550, 0 },
  262. /*225*/ { 561, 0 },
  263. /*226*/ { 562, 1 },
  264. /*227*/ { 563, 0 },
  265. /*228*/ { 564, 0 },
  266. /*229*/ { 565, 0 },
  267. /*230*/ { 566, 1 },
  268. /*231*/ { 567, 0 },
  269. /*232*/ { 568, 0 },
  270. /*233*/ { 569, 0 },
  271. /*234*/ { 570, 1 },
  272. /*235*/ { 571, 0 },
  273. /*236*/ { 579, 0 },
  274. /*237*/ { 580, 1 },
  275. /*238*/ { 581, 1 },
  276. /*239*/ { 582, 0 },
  277. /*240*/ { 590, 0 },
  278. /*241*/ { 599, 0 },
  279. /*242*/ { 600, 1 },
  280. /*243*/ { 601, 0 },
  281. /*244*/ { 611, 0 },
  282. /*245*/ { 612, 1 },
  283. /*246*/ { 613, 0 },
  284. /*247*/ { 614, 0 },
  285. /*248*/ { 615, 0 },
  286. /*249*/ { 616, 1 },
  287. /*250*/ { 617, 0 },
  288. /*251*/ { 618, 0 },
  289. /*252*/ { 619, 0 },
  290. /*253*/ { 620, 1 },
  291. /*254*/ { 621, 0 },
  292. /*255*/ { 630, 1 },
  293. /*256*/ { 640, 0 },
  294. /*257*/ { 650, 0 },
  295. /*258*/ { 658, 0 },
  296. /*259*/ { 659, 1 },
  297. /*260*/ { 660, 1 },
  298. /*261*/ { 661, 0 },
  299. /*262*/ { 677, 0 },
  300. /*263*/ { 678, 1 },
  301. /*264*/ { 679, 0 },
  302. /*265*/ { 680, 0 },
  303. /*266*/ { 690, 1 },
  304. /*267*/ { 700, 0 },
  305. /*268*/ { 701, 0 },
  306. /*269*/ { 702, 1 },
  307. /*270*/ { 703, 1 },
  308. /*271*/ { 704, 1 },
  309. /*272*/ { 705, 1 },
  310. /*273*/ { 706, 1 },
  311. /*274*/ { 707, 0 },
  312. /*275*/ { 708, 0 },
  313. /*276*/ { 709, 0 },
  314. /*277*/ { 710, 1 },
  315. /*278*/ { 711, 0 },
  316. /*279*/ { 747, 0 },
  317. /*280*/ { 748, 1 },
  318. /*281*/ { 749, 0 },
  319. /*282*/ { 750, 0 },
  320. /*283*/ { 751, 0 },
  321. /*284*/ { 752, 1 },
  322. /*285*/ { 753, 0 },
  323. /*286*/ { 791, 0 },
  324. /*287*/ { 792, 1 },
  325. /*288*/ { 793, 0 },
  326. /*289*/ { 794, 0 },
  327. /*290*/ { 795, 1 },
  328. /*291*/ { 796, 1 },
  329. /*292*/ { 797, 0 },
  330. /*293*/ { 798, 1 },
  331. /*294*/ { 799, 0 },
  332. /*295*/ { 800, 1 },
  333. /*296*/ { 801, 0 },
  334. /*297*/ { 802, 0 },
  335. /*298*/ { 803, 0 },
  336. /*299*/ { 804, 1 },
  337. /*300*/ { 805, 0 },
  338. /*301*/ { 806, 0 },
  339. /*302*/ { 807, 1 },
  340. /*303*/ { 808, 0 },
  341. /*304*/ { 830, 0 },
  342. /*305*/ { 831, 1 },
  343. /*306*/ { 832, 1 },
  344. /*307*/ { 833, 1 },
  345. /*308*/ { 834, 1 },
  346. /*309*/ { 835, 0 },
  347. /*310*/ { 880, 0 },
  348. /*311*/ { 881, 0 },
  349. /*312*/ { 882, 1 },
  350. /*313*/ { 883, 0 },
  351. /*314*/ { 884, 0 },
  352. /*315*/ { 885, 0 },
  353. /*316*/ { 886, 0 },
  354. /*317*/ { 887, 1 },
  355. /*318*/ { 888, 0 },
  356. /*319*/ { 889, 0 },
  357. /*320*/ { 890, 0 },
  358. /*321*/ { 891, 0 },
  359. /*322*/ { 892, 0 },
  360. /*323*/ { 893, 0 },
  361. /*324*/ { 894, 1 },
  362. /*325*/ { 895, 0 },
  363. /*326*/ { 896, 0 },
  364. /*327*/ { 897, 0 },
  365. /*328*/ { 898, 0 },
  366. /*329*/ { 899, 0 },
  367. /*330*/ { 900, 0 },
  368. /*331*/ { 999, 0 },
  369. /*332*/ { 2000, 0 },
  370. };
  371. int data_size = ARRAY_SIZE(data);
  372. int i, ret;
  373. testStart("test_numeric");
  374. for (i = 0; i < data_size; i++) {
  375. if (testContinue(p_ctx, i)) continue;
  376. ret = iso3166_numeric(data[i].data);
  377. assert_equal(ret, data[i].ret, "i:%d ret %d != %d\n", i, ret, data[i].ret);
  378. }
  379. testFinish();
  380. }
  381. /* Binary chop version: Whether ISO 3166-1 numeric */
  382. static int bc_iso3166_numeric(int cc) {
  383. static const short codes[249] = {
  384. /*AFG*/ 4, /*ALB*/ 8, /*ATA*/ 10, /*DZA*/ 12, /*ASM*/ 16, /*AND*/ 20, /*AGO*/ 24, /*ATG*/ 28, /*AZE*/ 31, /*ARG*/ 32,
  385. /*AUS*/ 36, /*AUT*/ 40, /*BHS*/ 44, /*BHR*/ 48, /*BGD*/ 50, /*ARM*/ 51, /*BRB*/ 52, /*BEL*/ 56, /*BMU*/ 60, /*BTN*/ 64,
  386. /*BOL*/ 68, /*BIH*/ 70, /*BWA*/ 72, /*BVT*/ 74, /*BRA*/ 76, /*BLZ*/ 84, /*IOT*/ 86, /*SLB*/ 90, /*VGB*/ 92, /*BRN*/ 96,
  387. /*BGR*/ 100, /*MMR*/ 104, /*BDI*/ 108, /*BLR*/ 112, /*KHM*/ 116, /*CMR*/ 120, /*CAN*/ 124, /*CPV*/ 132, /*CYM*/ 136, /*CAF*/ 140,
  388. /*LKA*/ 144, /*TCD*/ 148, /*CHL*/ 152, /*CHN*/ 156, /*TWN*/ 158, /*CXR*/ 162, /*CCK*/ 166, /*COL*/ 170, /*COM*/ 174, /*MYT*/ 175,
  389. /*COG*/ 178, /*COD*/ 180, /*COK*/ 184, /*CRI*/ 188, /*HRV*/ 191, /*CUB*/ 192, /*CYP*/ 196, /*CZE*/ 203, /*BEN*/ 204, /*DNK*/ 208,
  390. /*DMA*/ 212, /*DOM*/ 214, /*ECU*/ 218, /*SLV*/ 222, /*GNQ*/ 226, /*ETH*/ 231, /*ERI*/ 232, /*EST*/ 233, /*FRO*/ 234, /*FLK*/ 238,
  391. /*SGS*/ 239, /*FJI*/ 242, /*FIN*/ 246, /*ALA*/ 248, /*FRA*/ 250, /*GUF*/ 254, /*PYF*/ 258, /*ATF*/ 260, /*DJI*/ 262, /*GAB*/ 266,
  392. /*GEO*/ 268, /*GMB*/ 270, /*PSE*/ 275, /*DEU*/ 276, /*GHA*/ 288, /*GIB*/ 292, /*KIR*/ 296, /*GRC*/ 300, /*GRL*/ 304, /*GRD*/ 308,
  393. /*GLP*/ 312, /*GUM*/ 316, /*GTM*/ 320, /*GIN*/ 324, /*GUY*/ 328, /*HTI*/ 332, /*HMD*/ 334, /*VAT*/ 336, /*HND*/ 340, /*HKG*/ 344,
  394. /*HUN*/ 348, /*ISL*/ 352, /*IND*/ 356, /*IDN*/ 360, /*IRN*/ 364, /*IRQ*/ 368, /*IRL*/ 372, /*ISR*/ 376, /*ITA*/ 380, /*CIV*/ 384,
  395. /*JAM*/ 388, /*JPN*/ 392, /*KAZ*/ 398, /*JOR*/ 400, /*KEN*/ 404, /*PRK*/ 408, /*KOR*/ 410, /*KWT*/ 414, /*KGZ*/ 417, /*LAO*/ 418,
  396. /*LBN*/ 422, /*LSO*/ 426, /*LVA*/ 428, /*LBR*/ 430, /*LBY*/ 434, /*LIE*/ 438, /*LTU*/ 440, /*LUX*/ 442, /*MAC*/ 446, /*MDG*/ 450,
  397. /*MWI*/ 454, /*MYS*/ 458, /*MDV*/ 462, /*MLI*/ 466, /*MLT*/ 470, /*MTQ*/ 474, /*MRT*/ 478, /*MUS*/ 480, /*MEX*/ 484, /*MCO*/ 492,
  398. /*MNG*/ 496, /*MDA*/ 498, /*MNE*/ 499, /*MSR*/ 500, /*MAR*/ 504, /*MOZ*/ 508, /*OMN*/ 512, /*NAM*/ 516, /*NRU*/ 520, /*NPL*/ 524,
  399. /*NLD*/ 528, /*CUW*/ 531, /*ABW*/ 533, /*SXM*/ 534, /*BES*/ 535, /*NCL*/ 540, /*VUT*/ 548, /*NZL*/ 554, /*NIC*/ 558, /*NER*/ 562,
  400. /*NGA*/ 566, /*NIU*/ 570, /*NFK*/ 574, /*NOR*/ 578, /*MNP*/ 580, /*UMI*/ 581, /*FSM*/ 583, /*MHL*/ 584, /*PLW*/ 585, /*PAK*/ 586,
  401. /*PAN*/ 591, /*PNG*/ 598, /*PRY*/ 600, /*PER*/ 604, /*PHL*/ 608, /*PCN*/ 612, /*POL*/ 616, /*PRT*/ 620, /*GNB*/ 624, /*TLS*/ 626,
  402. /*PRI*/ 630, /*QAT*/ 634, /*REU*/ 638, /*ROU*/ 642, /*RUS*/ 643, /*RWA*/ 646, /*BLM*/ 652, /*SHN*/ 654, /*KNA*/ 659, /*AIA*/ 660,
  403. /*LCA*/ 662, /*MAF*/ 663, /*SPM*/ 666, /*VCT*/ 670, /*SMR*/ 674, /*STP*/ 678, /*SAU*/ 682, /*SEN*/ 686, /*SRB*/ 688, /*SYC*/ 690,
  404. /*SLE*/ 694, /*SGP*/ 702, /*SVK*/ 703, /*VNM*/ 704, /*SVN*/ 705, /*SOM*/ 706, /*ZAF*/ 710, /*ZWE*/ 716, /*ESP*/ 724, /*SSD*/ 728,
  405. /*SDN*/ 729, /*ESH*/ 732, /*SUR*/ 740, /*SJM*/ 744, /*SWZ*/ 748, /*SWE*/ 752, /*CHE*/ 756, /*SYR*/ 760, /*TJK*/ 762, /*THA*/ 764,
  406. /*TGO*/ 768, /*TKL*/ 772, /*TON*/ 776, /*TTO*/ 780, /*ARE*/ 784, /*TUN*/ 788, /*TUR*/ 792, /*TKM*/ 795, /*TCA*/ 796, /*TUV*/ 798,
  407. /*UGA*/ 800, /*UKR*/ 804, /*MKD*/ 807, /*EGY*/ 818, /*GBR*/ 826, /*GGY*/ 831, /*JEY*/ 832, /*IMN*/ 833, /*TZA*/ 834, /*USA*/ 840,
  408. /*VIR*/ 850, /*BFA*/ 854, /*URY*/ 858, /*UZB*/ 860, /*VEN*/ 862, /*WLF*/ 876, /*WSM*/ 882, /*YEM*/ 887, /*ZMB*/ 894,
  409. };
  410. int s = 0, e = ARRAY_SIZE(codes) - 1;
  411. while (s <= e) {
  412. int m = (s + e) / 2;
  413. if (codes[m] < cc) {
  414. s = m + 1;
  415. } else if (codes[m] > cc) {
  416. e = m - 1;
  417. } else {
  418. return 1;
  419. }
  420. }
  421. return 0;
  422. }
  423. static void test_numeric_bc(const testCtx *const p_ctx) {
  424. int i, ret, bc_ret;
  425. testStart("test_numeric_bc");
  426. for (i = 0; i < 1001; i++) {
  427. if (testContinue(p_ctx, i)) continue;
  428. ret = iso3166_numeric(i);
  429. bc_ret = bc_iso3166_numeric(i);
  430. assert_equal(ret, bc_ret, "i:%d ret %d != bc_ret %d\n", i, ret, bc_ret);
  431. }
  432. testFinish();
  433. }
  434. static void test_alpha2(const testCtx *const p_ctx) {
  435. struct item {
  436. const char *data;
  437. int ret;
  438. };
  439. /* s/\/\*[ 0-9]*\*\//\=printf("\/\*%3d*\/", line(".") - line("'<")): */
  440. struct item data[] = {
  441. /* 0*/ { "", 0 },
  442. /* 1*/ { "A", 0 },
  443. /* 2*/ { "aa", 0 },
  444. /* 3*/ { "AA", 0 },
  445. /* 4*/ { "AB", 0 },
  446. /* 5*/ { "AC", 0 },
  447. /* 6*/ { "AD", 1 },
  448. /* 7*/ { "ad", 0 },
  449. /* 8*/ { "AE", 1 },
  450. /* 9*/ { "AF", 1 },
  451. /* 10*/ { "AG", 1 },
  452. /* 11*/ { "AH", 0 },
  453. /* 12*/ { "AI", 1 },
  454. /* 13*/ { "AJ", 0 },
  455. /* 14*/ { "AP", 0 },
  456. /* 15*/ { "AQ", 1 },
  457. /* 16*/ { "AR", 1 },
  458. /* 17*/ { "AS", 1 },
  459. /* 18*/ { "AT", 1 },
  460. /* 19*/ { "AU", 1 },
  461. /* 20*/ { "AV", 0 },
  462. /* 21*/ { "AW", 1 },
  463. /* 22*/ { "AX", 1 },
  464. /* 23*/ { "AY", 0 },
  465. /* 24*/ { "AZ", 1 },
  466. /* 25*/ { "BA", 1 },
  467. /* 26*/ { "BB", 1 },
  468. /* 27*/ { "BC", 0 },
  469. /* 28*/ { "BD", 1 },
  470. /* 29*/ { "BX", 0 },
  471. /* 30*/ { "BY", 1 },
  472. /* 31*/ { "BZ", 1 },
  473. /* 32*/ { "CA", 1 },
  474. /* 33*/ { "CB", 0 },
  475. /* 34*/ { "CC", 1 },
  476. /* 35*/ { "CD", 1 },
  477. /* 36*/ { "CE", 0 },
  478. /* 37*/ { "CT", 0 },
  479. /* 38*/ { "CU", 1 },
  480. /* 39*/ { "CV", 1 },
  481. /* 40*/ { "CW", 1 },
  482. /* 41*/ { "CX", 1 },
  483. /* 42*/ { "CY", 1 },
  484. /* 43*/ { "CZ", 1 },
  485. /* 44*/ { "DA", 0 },
  486. /* 45*/ { "DD", 0 },
  487. /* 46*/ { "DE", 1 },
  488. /* 47*/ { "DF", 0 },
  489. /* 48*/ { "DY", 0 },
  490. /* 49*/ { "DZ", 1 },
  491. /* 50*/ { "EA", 0 },
  492. /* 51*/ { "EB", 0 },
  493. /* 52*/ { "EC", 1 },
  494. /* 53*/ { "ED", 0 },
  495. /* 54*/ { "EZ", 0 },
  496. /* 55*/ { "FA", 0 },
  497. /* 56*/ { "FQ", 0 },
  498. /* 57*/ { "FR", 1 },
  499. /* 58*/ { "FS", 0 },
  500. /* 59*/ { "FZ", 0 },
  501. /* 60*/ { "GA", 1 },
  502. /* 61*/ { "GB", 1 },
  503. /* 62*/ { "GC", 0 },
  504. /* 63*/ { "GX", 0 },
  505. /* 64*/ { "GY", 1 },
  506. /* 65*/ { "GZ", 0 },
  507. /* 66*/ { "HA", 0 },
  508. /* 67*/ { "HI", 0 },
  509. /* 68*/ { "HJ", 0 },
  510. /* 69*/ { "HK", 1 },
  511. /* 70*/ { "HL", 0 },
  512. /* 71*/ { "HZ", 0 },
  513. /* 72*/ { "IA", 0 },
  514. /* 73*/ { "IC", 0 },
  515. /* 74*/ { "ID", 1 },
  516. /* 75*/ { "IE", 1 },
  517. /* 76*/ { "IF", 0 },
  518. /* 77*/ { "IZ", 0 },
  519. /* 78*/ { "JA", 0 },
  520. /* 79*/ { "JD", 0 },
  521. /* 80*/ { "JE", 1 },
  522. /* 81*/ { "JF", 0 },
  523. /* 82*/ { "JZ", 0 },
  524. /* 83*/ { "KA", 0 },
  525. /* 84*/ { "KD", 0 },
  526. /* 85*/ { "KE", 1 },
  527. /* 86*/ { "KF", 0 },
  528. /* 87*/ { "KG", 1 },
  529. /* 88*/ { "KH", 1 },
  530. /* 89*/ { "KI", 1 },
  531. /* 90*/ { "KJ", 0 },
  532. /* 91*/ { "KX", 0 },
  533. /* 92*/ { "KY", 1 },
  534. /* 93*/ { "KZ", 1 },
  535. /* 94*/ { "LA", 1 },
  536. /* 95*/ { "LB", 1 },
  537. /* 96*/ { "LC", 1 },
  538. /* 97*/ { "LD", 0 },
  539. /* 98*/ { "LE", 0 },
  540. /* 99*/ { "LX", 0 },
  541. /*100*/ { "LY", 1 },
  542. /*101*/ { "LZ", 0 },
  543. /*102*/ { "MA", 1 },
  544. /*103*/ { "MB", 0 },
  545. /*104*/ { "MI", 0 },
  546. /*105*/ { "MJ", 0 },
  547. /*106*/ { "MK", 1 },
  548. /*107*/ { "ML", 1 },
  549. /*108*/ { "MM", 1 },
  550. /*109*/ { "MN", 1 },
  551. /*110*/ { "MO", 1 },
  552. /*111*/ { "MP", 1 },
  553. /*112*/ { "MQ", 1 },
  554. /*113*/ { "MR", 1 },
  555. /*114*/ { "MS", 1 },
  556. /*115*/ { "MT", 1 },
  557. /*116*/ { "MU", 1 },
  558. /*117*/ { "MV", 1 },
  559. /*118*/ { "MW", 1 },
  560. /*119*/ { "MX", 1 },
  561. /*120*/ { "MY", 1 },
  562. /*121*/ { "MZ", 1 },
  563. /*122*/ { "NA", 1 },
  564. /*123*/ { "NB", 0 },
  565. /*124*/ { "NC", 1 },
  566. /*125*/ { "NY", 0 },
  567. /*126*/ { "NZ", 1 },
  568. /*127*/ { "OA", 0 },
  569. /*128*/ { "OL", 0 },
  570. /*129*/ { "OM", 1 },
  571. /*130*/ { "ON", 0 },
  572. /*131*/ { "OZ", 0 },
  573. /*132*/ { "PA", 1 },
  574. /*133*/ { "PB", 0 },
  575. /*134*/ { "PQ", 0 },
  576. /*135*/ { "PR", 1 },
  577. /*136*/ { "PS", 1 },
  578. /*137*/ { "PT", 1 },
  579. /*138*/ { "PU", 0 },
  580. /*139*/ { "PV", 0 },
  581. /*140*/ { "PW", 1 },
  582. /*141*/ { "PX", 0 },
  583. /*142*/ { "PY", 1 },
  584. /*143*/ { "PZ", 0 },
  585. /*144*/ { "QA", 1 },
  586. /*145*/ { "QB", 0 },
  587. /*146*/ { "QZ", 0 },
  588. /*147*/ { "RA", 0 },
  589. /*148*/ { "RC", 0 },
  590. /*149*/ { "RD", 0 },
  591. /*150*/ { "RE", 1 },
  592. /*151*/ { "RF", 0 },
  593. /*152*/ { "RZ", 0 },
  594. /*153*/ { "SA", 1 },
  595. /*154*/ { "SB", 1 },
  596. /*155*/ { "SC", 1 },
  597. /*156*/ { "SD", 1 },
  598. /*157*/ { "SE", 1 },
  599. /*158*/ { "SF", 0 },
  600. /*159*/ { "SW", 0 },
  601. /*160*/ { "SX", 1 },
  602. /*161*/ { "SY", 1 },
  603. /*162*/ { "SZ", 1 },
  604. /*163*/ { "TA", 0 },
  605. /*164*/ { "TB", 0 },
  606. /*165*/ { "TC", 1 },
  607. /*166*/ { "TD", 1 },
  608. /*167*/ { "TE", 0 },
  609. /*168*/ { "TU", 0 },
  610. /*169*/ { "TV", 1 },
  611. /*170*/ { "TW", 1 },
  612. /*171*/ { "TX", 0 },
  613. /*172*/ { "TY", 0 },
  614. /*173*/ { "TZ", 1 },
  615. /*174*/ { "UA", 1 },
  616. /*175*/ { "UB", 0 },
  617. /*176*/ { "UX", 0 },
  618. /*177*/ { "UY", 1 },
  619. /*178*/ { "UZ", 1 },
  620. /*179*/ { "VA", 1 },
  621. /*180*/ { "VB", 0 },
  622. /*181*/ { "VC", 1 },
  623. /*182*/ { "VD", 0 },
  624. /*183*/ { "VZ", 0 },
  625. /*184*/ { "WA", 0 },
  626. /*185*/ { "WE", 0 },
  627. /*186*/ { "WF", 1 },
  628. /*187*/ { "WG", 0 },
  629. /*188*/ { "WZ", 0 },
  630. /*189*/ { "XA", 0 },
  631. /*190*/ { "XZ", 0 },
  632. /*191*/ { "YA", 0 },
  633. /*192*/ { "YC", 0 },
  634. /*193*/ { "YD", 0 },
  635. /*194*/ { "YE", 1 },
  636. /*195*/ { "YF", 0 },
  637. /*196*/ { "YZ", 0 },
  638. /*197*/ { "ZA", 1 },
  639. /*198*/ { "ZB", 0 },
  640. /*199*/ { "ZL", 0 },
  641. /*200*/ { "ZM", 1 },
  642. /*201*/ { "ZN", 0 },
  643. /*202*/ { "ZV", 0 },
  644. /*203*/ { "ZW", 1 },
  645. /*204*/ { "ZX", 0 },
  646. /*205*/ { "ZY", 0 },
  647. /*206*/ { "ZZ", 0 },
  648. /*207*/ { "Z", 0 },
  649. /*208*/ { "zz", 0 },
  650. /*209*/ { "0", 0 },
  651. /*210*/ { "\001", 0 },
  652. /*211*/ { "\177", 0 },
  653. /*212*/ { "\200", 0 },
  654. /*213*/ { "\377", 0 },
  655. };
  656. int data_size = ARRAY_SIZE(data);
  657. int i, ret;
  658. testStart("test_alpha2");
  659. for (i = 0; i < data_size; i++) {
  660. if (testContinue(p_ctx, i)) continue;
  661. ret = iso3166_alpha2(data[i].data);
  662. assert_equal(ret, data[i].ret, "i:%d ret %d != %d\n", i, ret, data[i].ret);
  663. }
  664. testFinish();
  665. }
  666. /* Binary chop version: Whether ISO 3166-1 alpha2 */
  667. static int bc_iso3166_alpha2(const char *cc) {
  668. static const char codes[249][2] = {
  669. {'A','D'}, {'A','E'}, {'A','F'}, {'A','G'}, {'A','I'}, {'A','L'}, {'A','M'}, {'A','O'}, {'A','Q'}, {'A','R'},
  670. {'A','S'}, {'A','T'}, {'A','U'}, {'A','W'}, {'A','X'}, {'A','Z'}, {'B','A'}, {'B','B'}, {'B','D'}, {'B','E'},
  671. {'B','F'}, {'B','G'}, {'B','H'}, {'B','I'}, {'B','J'}, {'B','L'}, {'B','M'}, {'B','N'}, {'B','O'}, {'B','Q'},
  672. {'B','R'}, {'B','S'}, {'B','T'}, {'B','V'}, {'B','W'}, {'B','Y'}, {'B','Z'}, {'C','A'}, {'C','C'}, {'C','D'},
  673. {'C','F'}, {'C','G'}, {'C','H'}, {'C','I'}, {'C','K'}, {'C','L'}, {'C','M'}, {'C','N'}, {'C','O'}, {'C','R'},
  674. {'C','U'}, {'C','V'}, {'C','W'}, {'C','X'}, {'C','Y'}, {'C','Z'}, {'D','E'}, {'D','J'}, {'D','K'}, {'D','M'},
  675. {'D','O'}, {'D','Z'}, {'E','C'}, {'E','E'}, {'E','G'}, {'E','H'}, {'E','R'}, {'E','S'}, {'E','T'}, {'F','I'},
  676. {'F','J'}, {'F','K'}, {'F','M'}, {'F','O'}, {'F','R'}, {'G','A'}, {'G','B'}, {'G','D'}, {'G','E'}, {'G','F'},
  677. {'G','G'}, {'G','H'}, {'G','I'}, {'G','L'}, {'G','M'}, {'G','N'}, {'G','P'}, {'G','Q'}, {'G','R'}, {'G','S'},
  678. {'G','T'}, {'G','U'}, {'G','W'}, {'G','Y'}, {'H','K'}, {'H','M'}, {'H','N'}, {'H','R'}, {'H','T'}, {'H','U'},
  679. {'I','D'}, {'I','E'}, {'I','L'}, {'I','M'}, {'I','N'}, {'I','O'}, {'I','Q'}, {'I','R'}, {'I','S'}, {'I','T'},
  680. {'J','E'}, {'J','M'}, {'J','O'}, {'J','P'}, {'K','E'}, {'K','G'}, {'K','H'}, {'K','I'}, {'K','M'}, {'K','N'},
  681. {'K','P'}, {'K','R'}, {'K','W'}, {'K','Y'}, {'K','Z'}, {'L','A'}, {'L','B'}, {'L','C'}, {'L','I'}, {'L','K'},
  682. {'L','R'}, {'L','S'}, {'L','T'}, {'L','U'}, {'L','V'}, {'L','Y'}, {'M','A'}, {'M','C'}, {'M','D'}, {'M','E'},
  683. {'M','F'}, {'M','G'}, {'M','H'}, {'M','K'}, {'M','L'}, {'M','M'}, {'M','N'}, {'M','O'}, {'M','P'}, {'M','Q'},
  684. {'M','R'}, {'M','S'}, {'M','T'}, {'M','U'}, {'M','V'}, {'M','W'}, {'M','X'}, {'M','Y'}, {'M','Z'}, {'N','A'},
  685. {'N','C'}, {'N','E'}, {'N','F'}, {'N','G'}, {'N','I'}, {'N','L'}, {'N','O'}, {'N','P'}, {'N','R'}, {'N','U'},
  686. {'N','Z'}, {'O','M'}, {'P','A'}, {'P','E'}, {'P','F'}, {'P','G'}, {'P','H'}, {'P','K'}, {'P','L'}, {'P','M'},
  687. {'P','N'}, {'P','R'}, {'P','S'}, {'P','T'}, {'P','W'}, {'P','Y'}, {'Q','A'}, {'R','E'}, {'R','O'}, {'R','S'},
  688. {'R','U'}, {'R','W'}, {'S','A'}, {'S','B'}, {'S','C'}, {'S','D'}, {'S','E'}, {'S','G'}, {'S','H'}, {'S','I'},
  689. {'S','J'}, {'S','K'}, {'S','L'}, {'S','M'}, {'S','N'}, {'S','O'}, {'S','R'}, {'S','S'}, {'S','T'}, {'S','V'},
  690. {'S','X'}, {'S','Y'}, {'S','Z'}, {'T','C'}, {'T','D'}, {'T','F'}, {'T','G'}, {'T','H'}, {'T','J'}, {'T','K'},
  691. {'T','L'}, {'T','M'}, {'T','N'}, {'T','O'}, {'T','R'}, {'T','T'}, {'T','V'}, {'T','W'}, {'T','Z'}, {'U','A'},
  692. {'U','G'}, {'U','M'}, {'U','S'}, {'U','Y'}, {'U','Z'}, {'V','A'}, {'V','C'}, {'V','E'}, {'V','G'}, {'V','I'},
  693. {'V','N'}, {'V','U'}, {'W','F'}, {'W','S'}, {'Y','E'}, {'Y','T'}, {'Z','A'}, {'Z','M'}, {'Z','W'},
  694. };
  695. int s = 0, e = sizeof(codes) / sizeof(codes[0]) - 1;
  696. while (s <= e) {
  697. int m = (s + e) / 2;
  698. int cmp = strncmp(codes[m], cc, 2);
  699. if (cmp < 0) {
  700. s = m + 1;
  701. } else if (cmp > 0) {
  702. e = m - 1;
  703. } else {
  704. return 1;
  705. }
  706. }
  707. return 0;
  708. }
  709. static void test_alpha2_bc(const testCtx *const p_ctx) {
  710. int i, ret, bc_ret;
  711. char data[2];
  712. (void)p_ctx;
  713. testStart("test_alpha2_bc");
  714. for (i = 0; i < 128; i++) {
  715. int j;
  716. for (j = 0; j < 128; j++) {
  717. data[0] = i;
  718. data[1] = j;
  719. ret = iso3166_alpha2(data);
  720. bc_ret = bc_iso3166_alpha2(data);
  721. assert_equal(ret, bc_ret, "i:%d ret %d != bc_ret %d\n", i, ret, bc_ret);
  722. }
  723. }
  724. testFinish();
  725. }
  726. int main(int argc, char *argv[]) {
  727. testFunction funcs[] = { /* name, func */
  728. { "test_numeric", test_numeric },
  729. { "test_alpha2", test_alpha2 },
  730. { "test_numeric_bc", test_numeric_bc },
  731. { "test_alpha2_bc", test_alpha2_bc },
  732. };
  733. testRun(argc, argv, funcs, ARRAY_SIZE(funcs));
  734. testReport();
  735. return 0;
  736. }
  737. /* vim: set ts=4 sw=4 et : */