1 /*
2     libzint - the open source barcode library
3     Copyright (C) 2019 - 2021 Robin Stuart <rstuart114@gmail.com>
4 
5     Redistribution and use in source and binary forms, with or without
6     modification, are permitted provided that the following conditions
7     are met:
8 
9     1. Redistributions of source code must retain the above copyright
10        notice, this list of conditions and the following disclaimer.
11     2. Redistributions in binary form must reproduce the above copyright
12        notice, this list of conditions and the following disclaimer in the
13        documentation and/or other materials provided with the distribution.
14     3. Neither the name of the project nor the names of its contributors
15        may be used to endorse or promote products derived from this software
16        without specific prior written permission.
17 
18     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
19     ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20     IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21     ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
22     FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23     DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24     OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26     LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27     OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28     SUCH DAMAGE.
29  */
30 /* vim: set ts=4 sw=4 et : */
31 
32 #include "testcommon.h"
33 
test_large(int index,int debug)34 static void test_large(int index, int debug) {
35 
36     struct item {
37         int symbology;
38         int option_2;
39         char *pattern;
40         int length;
41         int ret;
42         int expected_rows;
43         int expected_width;
44     };
45     // ISO/IEC 16022:2006 Table 7 and ISO/IEC 21471:2020 (DMRE) Table 7
46     // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<"))
47     struct item data[] = {
48         /*  0*/ { BARCODE_DATAMATRIX, -1, "1", 3116, 0, 144, 144 },
49         /*  1*/ { BARCODE_DATAMATRIX, -1, "1", 3117, ZINT_ERROR_TOO_LONG, -1, -1 },
50         /*  2*/ { BARCODE_DATAMATRIX, -1, "A", 2335, 0, 144, 144 },
51         /*  3*/ { BARCODE_DATAMATRIX, -1, "A", 2336, ZINT_ERROR_TOO_LONG, -1, -1 },
52         /*  4*/ { BARCODE_DATAMATRIX, -1, "\200", 1556, 0, 144, 144 }, // Spec says 1555 but 1556 correct as only single byte count of 0 required
53         /*  5*/ { BARCODE_DATAMATRIX, -1, "\200", 1557, ZINT_ERROR_TOO_LONG, -1, -1 },
54         /*  6*/ { BARCODE_HIBC_DM, -1, "1", 110, 0, 32, 32 },
55         /*  7*/ { BARCODE_HIBC_DM, -1, "1", 111, ZINT_ERROR_TOO_LONG, -1, -1 },
56         /*  8*/ { BARCODE_DATAMATRIX, 1, "1", 6, 0, 10, 10 },
57         /*  9*/ { BARCODE_DATAMATRIX, 1, "1", 7, ZINT_ERROR_TOO_LONG, -1, -1 },
58         /* 10*/ { BARCODE_DATAMATRIX, 1, "A", 3, 0, 10, 10 },
59         /* 11*/ { BARCODE_DATAMATRIX, 1, "A", 4, ZINT_ERROR_TOO_LONG, -1, -1 },
60         /* 12*/ { BARCODE_DATAMATRIX, 1, "\200", 1, 0, 10, 10 },
61         /* 13*/ { BARCODE_DATAMATRIX, 1, "\200", 2, ZINT_ERROR_TOO_LONG, -1, -1 },
62         /* 14*/ { BARCODE_DATAMATRIX, 2, "1", 10, 0, 12, 12 },
63         /* 15*/ { BARCODE_DATAMATRIX, 2, "1", 11, ZINT_ERROR_TOO_LONG, -1, -1 },
64         /* 16*/ { BARCODE_DATAMATRIX, 2, "A", 6, 0, 12, 12 },
65         /* 17*/ { BARCODE_DATAMATRIX, 2, "A", 7, ZINT_ERROR_TOO_LONG, -1, -1 },
66         /* 18*/ { BARCODE_DATAMATRIX, 2, "\200", 3, 0, 12, 12 },
67         /* 19*/ { BARCODE_DATAMATRIX, 2, "\200", 4, ZINT_ERROR_TOO_LONG, -1, -1 },
68         /* 20*/ { BARCODE_DATAMATRIX, 3, "1", 16, 0, 14, 14 },
69         /* 21*/ { BARCODE_DATAMATRIX, 3, "1", 17, ZINT_ERROR_TOO_LONG, -1, -1 },
70         /* 22*/ { BARCODE_DATAMATRIX, 3, "A", 10, 0, 14, 14 },
71         /* 23*/ { BARCODE_DATAMATRIX, 3, "A", 11, ZINT_ERROR_TOO_LONG, -1, -1 },
72         /* 24*/ { BARCODE_DATAMATRIX, 3, "\200", 6, 0, 14, 14 },
73         /* 25*/ { BARCODE_DATAMATRIX, 3, "\200", 7, ZINT_ERROR_TOO_LONG, -1, -1 },
74         /* 26*/ { BARCODE_DATAMATRIX, 4, "1", 24, 0, 16, 16 },
75         /* 27*/ { BARCODE_DATAMATRIX, 4, "1", 25, ZINT_ERROR_TOO_LONG, -1, -1 },
76         /* 28*/ { BARCODE_DATAMATRIX, 4, "A", 16, 0, 16, 16 },
77         /* 29*/ { BARCODE_DATAMATRIX, 4, "A", 17, ZINT_ERROR_TOO_LONG, -1, -1 },
78         /* 30*/ { BARCODE_DATAMATRIX, 4, "\200", 10, 0, 16, 16 },
79         /* 31*/ { BARCODE_DATAMATRIX, 4, "\200", 11, ZINT_ERROR_TOO_LONG, -1, -1 },
80         /* 32*/ { BARCODE_DATAMATRIX, 5, "1", 36, 0, 18, 18 },
81         /* 33*/ { BARCODE_DATAMATRIX, 5, "1", 37, ZINT_ERROR_TOO_LONG, -1, -1 },
82         /* 34*/ { BARCODE_DATAMATRIX, 5, "A", 25, 0, 18, 18 },
83         /* 35*/ { BARCODE_DATAMATRIX, 5, "A", 26, ZINT_ERROR_TOO_LONG, -1, -1 },
84         /* 36*/ { BARCODE_DATAMATRIX, 5, "\200", 16, 0, 18, 18 },
85         /* 37*/ { BARCODE_DATAMATRIX, 5, "\200", 17, ZINT_ERROR_TOO_LONG, -1, -1 },
86         /* 38*/ { BARCODE_DATAMATRIX, 6, "1", 44, 0, 20, 20 },
87         /* 39*/ { BARCODE_DATAMATRIX, 6, "1", 45, ZINT_ERROR_TOO_LONG, -1, -1 },
88         /* 40*/ { BARCODE_DATAMATRIX, 6, "A", 31, 0, 20, 20 },
89         /* 41*/ { BARCODE_DATAMATRIX, 6, "A", 32, ZINT_ERROR_TOO_LONG, -1, -1 },
90         /* 42*/ { BARCODE_DATAMATRIX, 6, "\200", 20, 0, 20, 20 },
91         /* 43*/ { BARCODE_DATAMATRIX, 6, "\200", 21, ZINT_ERROR_TOO_LONG, -1, -1 },
92         /* 44*/ { BARCODE_DATAMATRIX, 7, "1", 60, 0, 22, 22 },
93         /* 45*/ { BARCODE_DATAMATRIX, 7, "1", 61, ZINT_ERROR_TOO_LONG, -1, -1 },
94         /* 46*/ { BARCODE_DATAMATRIX, 7, "A", 43, 0, 22, 22 },
95         /* 47*/ { BARCODE_DATAMATRIX, 7, "A", 44, ZINT_ERROR_TOO_LONG, -1, -1 },
96         /* 48*/ { BARCODE_DATAMATRIX, 7, "\200", 28, 0, 22, 22 },
97         /* 49*/ { BARCODE_DATAMATRIX, 7, "\200", 29, ZINT_ERROR_TOO_LONG, -1, -1 },
98         /* 50*/ { BARCODE_DATAMATRIX, 8, "1", 72, 0, 24, 24 },
99         /* 51*/ { BARCODE_DATAMATRIX, 8, "1", 73, ZINT_ERROR_TOO_LONG, -1, -1 },
100         /* 52*/ { BARCODE_DATAMATRIX, 8, "A", 52, 0, 24, 24 },
101         /* 53*/ { BARCODE_DATAMATRIX, 8, "A", 53, ZINT_ERROR_TOO_LONG, -1, -1 },
102         /* 54*/ { BARCODE_DATAMATRIX, 8, "\200", 34, 0, 24, 24 },
103         /* 55*/ { BARCODE_DATAMATRIX, 8, "\200", 35, ZINT_ERROR_TOO_LONG, -1, -1 },
104         /* 56*/ { BARCODE_DATAMATRIX, 9, "1", 88, 0, 26, 26 },
105         /* 57*/ { BARCODE_DATAMATRIX, 9, "1", 89, ZINT_ERROR_TOO_LONG, -1, -1 },
106         /* 58*/ { BARCODE_DATAMATRIX, 9, "A", 64, 0, 26, 26 },
107         /* 59*/ { BARCODE_DATAMATRIX, 9, "A", 65, ZINT_ERROR_TOO_LONG, -1, -1 },
108         /* 60*/ { BARCODE_DATAMATRIX, 9, "\200", 42, 0, 26, 26 },
109         /* 61*/ { BARCODE_DATAMATRIX, 9, "\200", 43, ZINT_ERROR_TOO_LONG, -1, -1 },
110         /* 62*/ { BARCODE_DATAMATRIX, 10, "1", 124, 0, 32, 32 },
111         /* 63*/ { BARCODE_DATAMATRIX, 10, "1", 125, ZINT_ERROR_TOO_LONG, -1, -1 },
112         /* 64*/ { BARCODE_DATAMATRIX, 10, "A", 91, 0, 32, 32 },
113         /* 65*/ { BARCODE_DATAMATRIX, 10, "A", 92, ZINT_ERROR_TOO_LONG, -1, -1 },
114         /* 66*/ { BARCODE_DATAMATRIX, 10, "\200", 60, 0, 32, 32 },
115         /* 67*/ { BARCODE_DATAMATRIX, 10, "\200", 61, ZINT_ERROR_TOO_LONG, -1, -1 },
116         /* 68*/ { BARCODE_DATAMATRIX, 11, "1", 172, 0, 36, 36 },
117         /* 69*/ { BARCODE_DATAMATRIX, 11, "1", 173, ZINT_ERROR_TOO_LONG, -1, -1 },
118         /* 70*/ { BARCODE_DATAMATRIX, 11, "A", 127, 0, 36, 36 },
119         /* 71*/ { BARCODE_DATAMATRIX, 11, "A", 128, ZINT_ERROR_TOO_LONG, -1, -1 },
120         /* 72*/ { BARCODE_DATAMATRIX, 11, "\200", 84, 0, 36, 36 },
121         /* 73*/ { BARCODE_DATAMATRIX, 11, "\200", 85, ZINT_ERROR_TOO_LONG, -1, -1 },
122         /* 74*/ { BARCODE_DATAMATRIX, 12, "1", 228, 0, 40, 40 },
123         /* 75*/ { BARCODE_DATAMATRIX, 12, "1", 229, ZINT_ERROR_TOO_LONG, -1, -1 },
124         /* 76*/ { BARCODE_DATAMATRIX, 12, "A", 169, 0, 40, 40 },
125         /* 77*/ { BARCODE_DATAMATRIX, 12, "A", 170, ZINT_ERROR_TOO_LONG, -1, -1 },
126         /* 78*/ { BARCODE_DATAMATRIX, 12, "\200", 112, 0, 40, 40 },
127         /* 79*/ { BARCODE_DATAMATRIX, 12, "\200", 113, ZINT_ERROR_TOO_LONG, -1, -1 },
128         /* 80*/ { BARCODE_DATAMATRIX, 13, "1", 288, 0, 44, 44 },
129         /* 81*/ { BARCODE_DATAMATRIX, 13, "1", 289, ZINT_ERROR_TOO_LONG, -1, -1 },
130         /* 82*/ { BARCODE_DATAMATRIX, 13, "A", 214, 0, 44, 44 },
131         /* 83*/ { BARCODE_DATAMATRIX, 13, "A", 215, ZINT_ERROR_TOO_LONG, -1, -1 },
132         /* 84*/ { BARCODE_DATAMATRIX, 13, "\200", 142, 0, 44, 44 },
133         /* 85*/ { BARCODE_DATAMATRIX, 13, "\200", 143, ZINT_ERROR_TOO_LONG, -1, -1 },
134         /* 86*/ { BARCODE_DATAMATRIX, 14, "1", 348, 0, 48, 48 },
135         /* 87*/ { BARCODE_DATAMATRIX, 14, "1", 349, ZINT_ERROR_TOO_LONG, -1, -1 },
136         /* 88*/ { BARCODE_DATAMATRIX, 14, "A", 259, 0, 48, 48 },
137         /* 89*/ { BARCODE_DATAMATRIX, 14, "A", 260, ZINT_ERROR_TOO_LONG, -1, -1 },
138         /* 90*/ { BARCODE_DATAMATRIX, 14, "\200", 172, 0, 48, 48 },
139         /* 91*/ { BARCODE_DATAMATRIX, 14, "\200", 173, ZINT_ERROR_TOO_LONG, -1, -1 },
140         /* 92*/ { BARCODE_DATAMATRIX, 15, "1", 408, 0, 52, 52 },
141         /* 93*/ { BARCODE_DATAMATRIX, 15, "1", 409, ZINT_ERROR_TOO_LONG, -1, -1 },
142         /* 94*/ { BARCODE_DATAMATRIX, 15, "A", 304, 0, 52, 52 },
143         /* 95*/ { BARCODE_DATAMATRIX, 15, "A", 305, ZINT_ERROR_TOO_LONG, -1, -1 },
144         /* 96*/ { BARCODE_DATAMATRIX, 15, "\200", 202, 0, 52, 52 },
145         /* 97*/ { BARCODE_DATAMATRIX, 15, "\200", 203, ZINT_ERROR_TOO_LONG, -1, -1 },
146         /* 98*/ { BARCODE_DATAMATRIX, 16, "1", 560, 0, 64, 64 },
147         /* 99*/ { BARCODE_DATAMATRIX, 16, "1", 561, ZINT_ERROR_TOO_LONG, -1, -1 },
148         /*100*/ { BARCODE_DATAMATRIX, 16, "A", 418, 0, 64, 64 },
149         /*101*/ { BARCODE_DATAMATRIX, 16, "A", 419, ZINT_ERROR_TOO_LONG, -1, -1 },
150         /*102*/ { BARCODE_DATAMATRIX, 16, "\200", 278, 0, 64, 64 }, // Spec says 277 but 278 correct as only single byte count of 0 required
151         /*103*/ { BARCODE_DATAMATRIX, 16, "\200", 279, ZINT_ERROR_TOO_LONG, -1, -1 },
152         /*104*/ { BARCODE_DATAMATRIX, 17, "1", 736, 0, 72, 72 },
153         /*105*/ { BARCODE_DATAMATRIX, 17, "1", 737, ZINT_ERROR_TOO_LONG, -1, -1 },
154         /*106*/ { BARCODE_DATAMATRIX, 17, "A", 550, 0, 72, 72 },
155         /*107*/ { BARCODE_DATAMATRIX, 17, "A", 551, ZINT_ERROR_TOO_LONG, -1, -1 },
156         /*108*/ { BARCODE_DATAMATRIX, 17, "\200", 366, 0, 72, 72 }, // Spec says 365 but 366 correct as only single byte count of 0 required
157         /*109*/ { BARCODE_DATAMATRIX, 17, "\200", 367, ZINT_ERROR_TOO_LONG, -1, -1 },
158         /*110*/ { BARCODE_DATAMATRIX, 18, "1", 912, 0, 80, 80 },
159         /*111*/ { BARCODE_DATAMATRIX, 18, "1", 913, ZINT_ERROR_TOO_LONG, -1, -1 },
160         /*112*/ { BARCODE_DATAMATRIX, 18, "A", 682, 0, 80, 80 },
161         /*113*/ { BARCODE_DATAMATRIX, 18, "A", 683, ZINT_ERROR_TOO_LONG, -1, -1 },
162         /*114*/ { BARCODE_DATAMATRIX, 18, "\200", 454, 0, 80, 80 }, // Spec says 453 but 454 correct as only single byte count of 0 required
163         /*115*/ { BARCODE_DATAMATRIX, 18, "\200", 455, ZINT_ERROR_TOO_LONG, -1, -1 },
164         /*116*/ { BARCODE_DATAMATRIX, 19, "1", 1152, 0, 88, 88 },
165         /*117*/ { BARCODE_DATAMATRIX, 19, "1", 1153, ZINT_ERROR_TOO_LONG, -1, -1 },
166         /*118*/ { BARCODE_DATAMATRIX, 19, "A", 862, 0, 88, 88 },
167         /*119*/ { BARCODE_DATAMATRIX, 19, "A", 863, ZINT_ERROR_TOO_LONG, -1, -1 },
168         /*120*/ { BARCODE_DATAMATRIX, 19, "\200", 574, 0, 88, 88 }, // Spec says 573 but 574 correct as only single byte count of 0 required
169         /*121*/ { BARCODE_DATAMATRIX, 19, "\200", 575, ZINT_ERROR_TOO_LONG, -1, -1 },
170         /*122*/ { BARCODE_DATAMATRIX, 20, "1", 1392, 0, 96, 96 },
171         /*123*/ { BARCODE_DATAMATRIX, 20, "1", 1393, ZINT_ERROR_TOO_LONG, -1, -1 },
172         /*124*/ { BARCODE_DATAMATRIX, 20, "A", 1042, 0, 96, 96 },
173         /*125*/ { BARCODE_DATAMATRIX, 20, "A", 1043, ZINT_ERROR_TOO_LONG, -1, -1 },
174         /*126*/ { BARCODE_DATAMATRIX, 20, "\200", 694, 0, 96, 96 }, // Spec says 693 but 694 correct as only single byte count of 0 required
175         /*127*/ { BARCODE_DATAMATRIX, 20, "\200", 695, ZINT_ERROR_TOO_LONG, -1, -1 },
176         /*128*/ { BARCODE_DATAMATRIX, 21, "1", 1632, 0, 104, 104 },
177         /*129*/ { BARCODE_DATAMATRIX, 21, "1", 1633, ZINT_ERROR_TOO_LONG, -1, -1 },
178         /*130*/ { BARCODE_DATAMATRIX, 21, "A", 1222, 0, 104, 104 },
179         /*131*/ { BARCODE_DATAMATRIX, 21, "A", 1223, ZINT_ERROR_TOO_LONG, -1, -1 },
180         /*132*/ { BARCODE_DATAMATRIX, 21, "\200", 814, 0, 104, 104 }, // Spec says 813 but 814 correct as only single byte count of 0 required
181         /*133*/ { BARCODE_DATAMATRIX, 21, "\200", 815, ZINT_ERROR_TOO_LONG, -1, -1 },
182         /*134*/ { BARCODE_DATAMATRIX, 22, "1", 2100, 0, 120, 120 },
183         /*135*/ { BARCODE_DATAMATRIX, 22, "1", 2101, ZINT_ERROR_TOO_LONG, -1, -1 },
184         /*136*/ { BARCODE_DATAMATRIX, 22, "A", 1573, 0, 120, 120 },
185         /*137*/ { BARCODE_DATAMATRIX, 22, "A", 1574, ZINT_ERROR_TOO_LONG, -1, -1 },
186         /*138*/ { BARCODE_DATAMATRIX, 22, "\200", 1048, 0, 120, 120 }, // Spec says 1047 but 1048 correct as only single byte count of 0 required
187         /*139*/ { BARCODE_DATAMATRIX, 22, "\200", 1049, ZINT_ERROR_TOO_LONG, -1, -1 },
188         /*140*/ { BARCODE_DATAMATRIX, 23, "1", 2608, 0, 132, 132 },
189         /*141*/ { BARCODE_DATAMATRIX, 23, "1", 2609, ZINT_ERROR_TOO_LONG, -1, -1 },
190         /*142*/ { BARCODE_DATAMATRIX, 23, "A", 1954, 0, 132, 132 },
191         /*143*/ { BARCODE_DATAMATRIX, 23, "A", 1955, ZINT_ERROR_TOO_LONG, -1, -1 },
192         /*144*/ { BARCODE_DATAMATRIX, 23, "\200", 1302, 0, 132, 132 }, // Spec says 1301 but 1302 correct as only single byte count of 0 required
193         /*145*/ { BARCODE_DATAMATRIX, 23, "\200", 1303, ZINT_ERROR_TOO_LONG, -1, -1 },
194         /*146*/ { BARCODE_DATAMATRIX, 24, "1", 3116, 0, 144, 144 },
195         /*147*/ { BARCODE_DATAMATRIX, 24, "1", 3117, ZINT_ERROR_TOO_LONG, -1, -1 },
196         /*148*/ { BARCODE_DATAMATRIX, 24, "A", 2335, 0, 144, 144 },
197         /*149*/ { BARCODE_DATAMATRIX, 24, "A", 2336, ZINT_ERROR_TOO_LONG, -1, -1 },
198         /*150*/ { BARCODE_DATAMATRIX, 24, "\200", 1556, 0, 144, 144 }, // Spec says 1555 but 1556 correct as only single byte count of 0 required
199         /*151*/ { BARCODE_DATAMATRIX, 24, "\200", 1557, ZINT_ERROR_TOO_LONG, -1, -1 },
200         /*152*/ { BARCODE_DATAMATRIX, 25, "1", 10, 0, 8, 18 },
201         /*153*/ { BARCODE_DATAMATRIX, 25, "1", 11, ZINT_ERROR_TOO_LONG, -1, -1 },
202         /*154*/ { BARCODE_DATAMATRIX, 25, "A", 6, 0, 8, 18 },
203         /*155*/ { BARCODE_DATAMATRIX, 25, "A", 7, ZINT_ERROR_TOO_LONG, -1, -1 },
204         /*156*/ { BARCODE_DATAMATRIX, 25, "\200", 3, 0, 8, 18 },
205         /*157*/ { BARCODE_DATAMATRIX, 25, "\200", 4, ZINT_ERROR_TOO_LONG, -1, -1 },
206         /*158*/ { BARCODE_DATAMATRIX, 26, "1", 20, 0, 8, 32 },
207         /*159*/ { BARCODE_DATAMATRIX, 26, "1", 21, ZINT_ERROR_TOO_LONG, -1, -1 },
208         /*160*/ { BARCODE_DATAMATRIX, 26, "A", 13, 0, 8, 32 },
209         /*161*/ { BARCODE_DATAMATRIX, 26, "A", 14, ZINT_ERROR_TOO_LONG, -1, -1 },
210         /*162*/ { BARCODE_DATAMATRIX, 26, "\200", 8, 0, 8, 32 },
211         /*163*/ { BARCODE_DATAMATRIX, 26, "\200", 9, ZINT_ERROR_TOO_LONG, -1, -1 },
212         /*164*/ { BARCODE_DATAMATRIX, 27, "1", 32, 0, 12, 26 },
213         /*165*/ { BARCODE_DATAMATRIX, 27, "1", 33, ZINT_ERROR_TOO_LONG, -1, -1 },
214         /*166*/ { BARCODE_DATAMATRIX, 27, "A", 22, 0, 12, 26 },
215         /*167*/ { BARCODE_DATAMATRIX, 27, "A", 23, ZINT_ERROR_TOO_LONG, -1, -1 },
216         /*168*/ { BARCODE_DATAMATRIX, 27, "\200", 14, 0, 12, 26 },
217         /*169*/ { BARCODE_DATAMATRIX, 27, "\200", 15, ZINT_ERROR_TOO_LONG, -1, -1 },
218         /*170*/ { BARCODE_DATAMATRIX, 28, "1", 44, 0, 12, 36 },
219         /*171*/ { BARCODE_DATAMATRIX, 28, "1", 45, ZINT_ERROR_TOO_LONG, -1, -1 },
220         /*172*/ { BARCODE_DATAMATRIX, 28, "A", 31, 0, 12, 36 },
221         /*173*/ { BARCODE_DATAMATRIX, 28, "A", 32, ZINT_ERROR_TOO_LONG, -1, -1 },
222         /*174*/ { BARCODE_DATAMATRIX, 28, "\200", 20, 0, 12, 36 },
223         /*175*/ { BARCODE_DATAMATRIX, 28, "\200", 21, ZINT_ERROR_TOO_LONG, -1, -1 },
224         /*176*/ { BARCODE_DATAMATRIX, 29, "1", 64, 0, 16, 36 },
225         /*177*/ { BARCODE_DATAMATRIX, 29, "1", 65, ZINT_ERROR_TOO_LONG, -1, -1 },
226         /*178*/ { BARCODE_DATAMATRIX, 29, "A", 46, 0, 16, 36 },
227         /*179*/ { BARCODE_DATAMATRIX, 29, "A", 47, ZINT_ERROR_TOO_LONG, -1, -1 },
228         /*180*/ { BARCODE_DATAMATRIX, 29, "\200", 30, 0, 16, 36 },
229         /*181*/ { BARCODE_DATAMATRIX, 29, "\200", 31, ZINT_ERROR_TOO_LONG, -1, -1 },
230         /*182*/ { BARCODE_DATAMATRIX, 30, "1", 98, 0, 16, 48 },
231         /*183*/ { BARCODE_DATAMATRIX, 30, "1", 99, ZINT_ERROR_TOO_LONG, -1, -1 },
232         /*184*/ { BARCODE_DATAMATRIX, 30, "A", 72, 0, 16, 48 },
233         /*185*/ { BARCODE_DATAMATRIX, 30, "A", 73, ZINT_ERROR_TOO_LONG, -1, -1 },
234         /*186*/ { BARCODE_DATAMATRIX, 30, "\200", 47, 0, 16, 48 },
235         /*187*/ { BARCODE_DATAMATRIX, 30, "\200", 48, ZINT_ERROR_TOO_LONG, -1, -1 },
236         /*188*/ { BARCODE_DATAMATRIX, 31, "1", 36, 0, 8, 48 },
237         /*189*/ { BARCODE_DATAMATRIX, 31, "1", 37, ZINT_ERROR_TOO_LONG, -1, -1 },
238         /*190*/ { BARCODE_DATAMATRIX, 31, "A", 25, 0, 8, 48 },
239         /*191*/ { BARCODE_DATAMATRIX, 31, "A", 26, ZINT_ERROR_TOO_LONG, -1, -1 },
240         /*192*/ { BARCODE_DATAMATRIX, 31, "\200", 16, 0, 8, 48 },
241         /*193*/ { BARCODE_DATAMATRIX, 31, "\200", 17, ZINT_ERROR_TOO_LONG, -1, -1 },
242         /*194*/ { BARCODE_DATAMATRIX, 32, "1", 48, 0, 8, 64 },
243         /*195*/ { BARCODE_DATAMATRIX, 32, "1", 49, ZINT_ERROR_TOO_LONG, -1, -1 },
244         /*196*/ { BARCODE_DATAMATRIX, 32, "A", 34, 0, 8, 64 },
245         /*197*/ { BARCODE_DATAMATRIX, 32, "A", 35, ZINT_ERROR_TOO_LONG, -1, -1 },
246         /*198*/ { BARCODE_DATAMATRIX, 32, "\200", 22, 0, 8, 64 },
247         /*199*/ { BARCODE_DATAMATRIX, 32, "\200", 23, ZINT_ERROR_TOO_LONG, -1, -1 },
248         /*200*/ { BARCODE_DATAMATRIX, 33, "1", 64, 0, 8, 80 },
249         /*201*/ { BARCODE_DATAMATRIX, 33, "1", 65, ZINT_ERROR_TOO_LONG, -1, -1 },
250         /*202*/ { BARCODE_DATAMATRIX, 33, "A", 46, 0, 8, 80 },
251         /*203*/ { BARCODE_DATAMATRIX, 33, "A", 47, ZINT_ERROR_TOO_LONG, -1, -1 },
252         /*204*/ { BARCODE_DATAMATRIX, 33, "\200", 30, 0, 8, 80 },
253         /*205*/ { BARCODE_DATAMATRIX, 33, "\200", 31, ZINT_ERROR_TOO_LONG, -1, -1 },
254         /*206*/ { BARCODE_DATAMATRIX, 34, "1", 76, 0, 8, 96 },
255         /*207*/ { BARCODE_DATAMATRIX, 34, "1", 77, ZINT_ERROR_TOO_LONG, -1, -1 },
256         /*208*/ { BARCODE_DATAMATRIX, 34, "A", 55, 0, 8, 96 },
257         /*209*/ { BARCODE_DATAMATRIX, 34, "A", 56, ZINT_ERROR_TOO_LONG, -1, -1 },
258         /*210*/ { BARCODE_DATAMATRIX, 34, "\200", 36, 0, 8, 96 },
259         /*211*/ { BARCODE_DATAMATRIX, 34, "\200", 37, ZINT_ERROR_TOO_LONG, -1, -1 },
260         /*212*/ { BARCODE_DATAMATRIX, 35, "1", 98, 0, 8, 120 },
261         /*213*/ { BARCODE_DATAMATRIX, 35, "1", 99, ZINT_ERROR_TOO_LONG, -1, -1 },
262         /*214*/ { BARCODE_DATAMATRIX, 35, "A", 72, 0, 8, 120 },
263         /*215*/ { BARCODE_DATAMATRIX, 35, "A", 73, ZINT_ERROR_TOO_LONG, -1, -1 },
264         /*216*/ { BARCODE_DATAMATRIX, 35, "\200", 47, 0, 8, 120 },
265         /*217*/ { BARCODE_DATAMATRIX, 35, "\200", 48, ZINT_ERROR_TOO_LONG, -1, -1 },
266         /*218*/ { BARCODE_DATAMATRIX, 36, "1", 126, 0, 8, 144 },
267         /*219*/ { BARCODE_DATAMATRIX, 36, "1", 127, ZINT_ERROR_TOO_LONG, -1, -1 },
268         /*220*/ { BARCODE_DATAMATRIX, 36, "A", 93, 0, 8, 144 },
269         /*221*/ { BARCODE_DATAMATRIX, 36, "A", 94, ZINT_ERROR_TOO_LONG, -1, -1 },
270         /*222*/ { BARCODE_DATAMATRIX, 36, "\200", 61, 0, 8, 144 },
271         /*223*/ { BARCODE_DATAMATRIX, 36, "\200", 62, ZINT_ERROR_TOO_LONG, -1, -1 },
272         /*224*/ { BARCODE_DATAMATRIX, 37, "1", 86, 0, 12, 64 },
273         /*225*/ { BARCODE_DATAMATRIX, 37, "1", 87, ZINT_ERROR_TOO_LONG, -1, -1 },
274         /*226*/ { BARCODE_DATAMATRIX, 37, "A", 63, 0, 12, 64 },
275         /*227*/ { BARCODE_DATAMATRIX, 37, "A", 64, ZINT_ERROR_TOO_LONG, -1, -1 },
276         /*228*/ { BARCODE_DATAMATRIX, 37, "\200", 41, 0, 12, 64 },
277         /*229*/ { BARCODE_DATAMATRIX, 37, "\200", 42, ZINT_ERROR_TOO_LONG, -1, -1 },
278         /*230*/ { BARCODE_DATAMATRIX, 38, "1", 128, 0, 12, 88 },
279         /*231*/ { BARCODE_DATAMATRIX, 38, "1", 129, ZINT_ERROR_TOO_LONG, -1, -1 },
280         /*232*/ { BARCODE_DATAMATRIX, 38, "A", 94, 0, 12, 88 },
281         /*233*/ { BARCODE_DATAMATRIX, 38, "A", 95, ZINT_ERROR_TOO_LONG, -1, -1 },
282         /*234*/ { BARCODE_DATAMATRIX, 38, "\200", 62, 0, 12, 88 },
283         /*235*/ { BARCODE_DATAMATRIX, 38, "\200", 63, ZINT_ERROR_TOO_LONG, -1, -1 },
284         /*236*/ { BARCODE_DATAMATRIX, 39, "1", 124, 0, 16, 64 },
285         /*237*/ { BARCODE_DATAMATRIX, 39, "1", 125, ZINT_ERROR_TOO_LONG, -1, -1 },
286         /*238*/ { BARCODE_DATAMATRIX, 39, "A", 91, 0, 16, 64 },
287         /*239*/ { BARCODE_DATAMATRIX, 39, "A", 92, ZINT_ERROR_TOO_LONG, -1, -1 },
288         /*240*/ { BARCODE_DATAMATRIX, 39, "\200", 60, 0, 16, 64 },
289         /*241*/ { BARCODE_DATAMATRIX, 39, "\200", 61, ZINT_ERROR_TOO_LONG, -1, -1 },
290         /*242*/ { BARCODE_DATAMATRIX, 40, "1", 88, 0, 20, 36 },
291         /*243*/ { BARCODE_DATAMATRIX, 40, "1", 89, ZINT_ERROR_TOO_LONG, -1, -1 },
292         /*244*/ { BARCODE_DATAMATRIX, 40, "A", 64, 0, 20, 36 },
293         /*245*/ { BARCODE_DATAMATRIX, 40, "A", 65, ZINT_ERROR_TOO_LONG, -1, -1 },
294         /*246*/ { BARCODE_DATAMATRIX, 40, "\200", 42, 0, 20, 36 },
295         /*247*/ { BARCODE_DATAMATRIX, 40, "\200", 43, ZINT_ERROR_TOO_LONG, -1, -1 },
296         /*248*/ { BARCODE_DATAMATRIX, 41, "1", 112, 0, 20, 44 },
297         /*249*/ { BARCODE_DATAMATRIX, 41, "1", 113, ZINT_ERROR_TOO_LONG, -1, -1 },
298         /*250*/ { BARCODE_DATAMATRIX, 41, "A", 82, 0, 20, 44 },
299         /*251*/ { BARCODE_DATAMATRIX, 41, "A", 83, ZINT_ERROR_TOO_LONG, -1, -1 },
300         /*252*/ { BARCODE_DATAMATRIX, 41, "\200", 54, 0, 20, 44 },
301         /*253*/ { BARCODE_DATAMATRIX, 41, "\200", 55, ZINT_ERROR_TOO_LONG, -1, -1 },
302         /*254*/ { BARCODE_DATAMATRIX, 42, "1", 168, 0, 20, 64 }, // Spec says 186 but typo
303         /*255*/ { BARCODE_DATAMATRIX, 42, "1", 169, ZINT_ERROR_TOO_LONG, -1, -1 },
304         /*256*/ { BARCODE_DATAMATRIX, 42, "A", 124, 0, 20, 64 },
305         /*257*/ { BARCODE_DATAMATRIX, 42, "A", 125, ZINT_ERROR_TOO_LONG, -1, -1 },
306         /*258*/ { BARCODE_DATAMATRIX, 42, "\200", 82, 0, 20, 64 },
307         /*259*/ { BARCODE_DATAMATRIX, 42, "\200", 83, ZINT_ERROR_TOO_LONG, -1, -1 },
308         /*260*/ { BARCODE_DATAMATRIX, 43, "1", 144, 0, 22, 48 },
309         /*261*/ { BARCODE_DATAMATRIX, 43, "1", 145, ZINT_ERROR_TOO_LONG, -1, -1 },
310         /*262*/ { BARCODE_DATAMATRIX, 43, "A", 106, 0, 22, 48 },
311         /*263*/ { BARCODE_DATAMATRIX, 43, "A", 107, ZINT_ERROR_TOO_LONG, -1, -1 },
312         /*264*/ { BARCODE_DATAMATRIX, 43, "\200", 70, 0, 22, 48 },
313         /*265*/ { BARCODE_DATAMATRIX, 43, "\200", 71, ZINT_ERROR_TOO_LONG, -1, -1 },
314         /*266*/ { BARCODE_DATAMATRIX, 44, "1", 160, 0, 24, 48 },
315         /*267*/ { BARCODE_DATAMATRIX, 44, "1", 161, ZINT_ERROR_TOO_LONG, -1, -1 },
316         /*268*/ { BARCODE_DATAMATRIX, 44, "A", 118, 0, 24, 48 },
317         /*269*/ { BARCODE_DATAMATRIX, 44, "A", 119, ZINT_ERROR_TOO_LONG, -1, -1 },
318         /*270*/ { BARCODE_DATAMATRIX, 44, "\200", 78, 0, 24, 48 },
319         /*271*/ { BARCODE_DATAMATRIX, 44, "\200", 79, ZINT_ERROR_TOO_LONG, -1, -1 },
320         /*272*/ { BARCODE_DATAMATRIX, 45, "1", 216, 0, 24, 64 },
321         /*273*/ { BARCODE_DATAMATRIX, 45, "1", 217, ZINT_ERROR_TOO_LONG, -1, -1 },
322         /*274*/ { BARCODE_DATAMATRIX, 45, "A", 160, 0, 24, 64 },
323         /*275*/ { BARCODE_DATAMATRIX, 45, "A", 161, ZINT_ERROR_TOO_LONG, -1, -1 },
324         /*276*/ { BARCODE_DATAMATRIX, 45, "\200", 106, 0, 24, 64 },
325         /*277*/ { BARCODE_DATAMATRIX, 45, "\200", 107, ZINT_ERROR_TOO_LONG, -1, -1 },
326         /*278*/ { BARCODE_DATAMATRIX, 46, "1", 140, 0, 26, 40 },
327         /*279*/ { BARCODE_DATAMATRIX, 46, "1", 141, ZINT_ERROR_TOO_LONG, -1, -1 },
328         /*280*/ { BARCODE_DATAMATRIX, 46, "A", 103, 0, 26, 40 },
329         /*281*/ { BARCODE_DATAMATRIX, 46, "A", 104, ZINT_ERROR_TOO_LONG, -1, -1 },
330         /*282*/ { BARCODE_DATAMATRIX, 46, "\200", 68, 0, 26, 40 },
331         /*283*/ { BARCODE_DATAMATRIX, 46, "\200", 69, ZINT_ERROR_TOO_LONG, -1, -1 },
332         /*284*/ { BARCODE_DATAMATRIX, 47, "1", 180, 0, 26, 48 },
333         /*285*/ { BARCODE_DATAMATRIX, 47, "1", 181, ZINT_ERROR_TOO_LONG, -1, -1 },
334         /*286*/ { BARCODE_DATAMATRIX, 47, "A", 133, 0, 26, 48 },
335         /*287*/ { BARCODE_DATAMATRIX, 47, "A", 134, ZINT_ERROR_TOO_LONG, -1, -1 },
336         /*288*/ { BARCODE_DATAMATRIX, 47, "\200", 88, 0, 26, 48 },
337         /*289*/ { BARCODE_DATAMATRIX, 47, "\200", 89, ZINT_ERROR_TOO_LONG, -1, -1 },
338         /*290*/ { BARCODE_DATAMATRIX, 48, "1", 236, 0, 26, 64 },
339         /*291*/ { BARCODE_DATAMATRIX, 48, "1", 237, ZINT_ERROR_TOO_LONG, -1, -1 },
340         /*292*/ { BARCODE_DATAMATRIX, 48, "A", 175, 0, 26, 64 },
341         /*293*/ { BARCODE_DATAMATRIX, 48, "A", 176, ZINT_ERROR_TOO_LONG, -1, -1 },
342         /*294*/ { BARCODE_DATAMATRIX, 48, "\200", 116, 0, 26, 64 },
343         /*295*/ { BARCODE_DATAMATRIX, 48, "\200", 117, ZINT_ERROR_TOO_LONG, -1, -1 },
344     };
345     int data_size = ARRAY_SIZE(data);
346     int i, length, ret;
347     struct zint_symbol *symbol;
348 
349     char data_buf[3118];
350 
351     testStart("test_large");
352 
353     for (i = 0; i < data_size; i++) {
354 
355         if (index != -1 && i != index) continue;
356 
357         symbol = ZBarcode_Create();
358         assert_nonnull(symbol, "Symbol not created\n");
359 
360         testUtilStrCpyRepeat(data_buf, data[i].pattern, data[i].length);
361         assert_equal(data[i].length, (int) strlen(data_buf), "i:%d length %d != strlen(data_buf) %d\n", i, data[i].length, (int) strlen(data_buf));
362 
363         length = testUtilSetSymbol(symbol, data[i].symbology, -1 /*input_mode*/, -1 /*eci*/, -1 /*option_1*/, data[i].option_2, -1, -1 /*output_options*/, data_buf, data[i].length, debug);
364 
365         ret = ZBarcode_Encode(symbol, (unsigned char *) data_buf, length);
366         assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt);
367 
368         if (ret < ZINT_ERROR) {
369             assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d\n", i, symbol->rows, data[i].expected_rows);
370             assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d\n", i, symbol->width, data[i].expected_width);
371         }
372 
373         ZBarcode_Delete(symbol);
374     }
375 
376     testFinish();
377 }
378 
379 // Note need ZINT_SANITIZE set for these
test_buffer(int index,int debug)380 static void test_buffer(int index, int debug) {
381 
382     struct item {
383         int eci;
384         int input_mode;
385         int output_options;
386         char *data;
387         int ret;
388         char *comment;
389     };
390     // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<"))
391     struct item data[] = {
392         /*  0*/ { 16383, UNICODE_MODE, READER_INIT, "1", 0, "" },
393         /*  1*/ { 3, UNICODE_MODE, 0, "000106j 05 Galeria A Nação0000000000", 0, "From Okapi, consecutive use of upper shift; #176" },
394     };
395     int data_size = ARRAY_SIZE(data);
396     int i, length, ret;
397     struct zint_symbol *symbol;
398 
399     testStart("test_buffer");
400 
401     for (i = 0; i < data_size; i++) {
402 
403         if (index != -1 && i != index) continue;
404 
405         symbol = ZBarcode_Create();
406         assert_nonnull(symbol, "Symbol not created\n");
407 
408         length = testUtilSetSymbol(symbol, BARCODE_DATAMATRIX, data[i].input_mode, data[i].eci, -1 /*option_1*/, -1, -1, data[i].output_options, data[i].data, -1, debug);
409 
410         ret = ZBarcode_Encode(symbol, (unsigned char *) data[i].data, length);
411         assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d\n", i, ret, data[i].ret);
412 
413         ZBarcode_Delete(symbol);
414     }
415 
416     testFinish();
417 }
418 
test_options(int index,int debug)419 static void test_options(int index, int debug) {
420 
421     struct item {
422         int symbology;
423         int input_mode;
424         int option_1;
425         int option_2;
426         int option_3;
427         char *data;
428         int ret;
429 
430         int expected_rows;
431         int expected_width;
432     };
433     // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<"))
434     struct item data[] = {
435         /*  0*/ { BARCODE_DATAMATRIX, -1, -1, -1, -1, "1", 0, 10, 10 },
436         /*  1*/ { BARCODE_DATAMATRIX, -1, 2, -1, -1, "1", ZINT_ERROR_INVALID_OPTION, -1, -1 },
437         /*  2*/ { BARCODE_DATAMATRIX, -1, -1, 1, -1, "1", 0, 10, 10 },
438         /*  3*/ { BARCODE_DATAMATRIX, -1, -1, 2, -1, "1", 0, 12, 12 },
439         /*  4*/ { BARCODE_DATAMATRIX, -1, -1, 48, -1, "1", 0, 26, 64 },
440         /*  5*/ { BARCODE_DATAMATRIX, -1, -1, 49, -1, "1", 0, 10, 10 }, // Ignored
441         /*  6*/ { BARCODE_DATAMATRIX, -1, -1, -1, -1, "ABCDEFGHIJK", 0, 8, 32 },
442         /*  7*/ { BARCODE_DATAMATRIX, -1, -1, -1, DM_SQUARE, "ABCDEFGHIJK", 0, 16, 16 },
443         /*  8*/ { BARCODE_DATAMATRIX, -1, -1, -1, -1, "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTU", 0, 32, 32 },
444         /*  9*/ { BARCODE_DATAMATRIX, -1, -1, -1, DM_DMRE, "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTU", 0, 20, 44 },
445         /* 10*/ { BARCODE_DATAMATRIX, -1, -1, -1, 9999, "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTU", 0, 32, 32 }, // Ignored
446         /* 11*/ { BARCODE_DATAMATRIX, GS1_MODE, -1, -1, -1, "[90]12", 0, 10, 10 },
447         /* 12*/ { BARCODE_DATAMATRIX, GS1_MODE | GS1PARENS_MODE, -1, -1, -1, "(90)12", 0, 10, 10 },
448     };
449     int data_size = ARRAY_SIZE(data);
450     int i, length, ret;
451     struct zint_symbol *symbol;
452 
453     testStart("test_options");
454 
455     for (i = 0; i < data_size; i++) {
456 
457         if (index != -1 && i != index) continue;
458 
459         symbol = ZBarcode_Create();
460         assert_nonnull(symbol, "Symbol not created\n");
461 
462         length = testUtilSetSymbol(symbol, data[i].symbology, data[i].input_mode, -1 /*eci*/, data[i].option_1, data[i].option_2, data[i].option_3, -1 /*output_options*/, data[i].data, -1, debug);
463 
464         ret = ZBarcode_Encode(symbol, (unsigned char *) data[i].data, length);
465         assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt);
466 
467         if (ret < ZINT_ERROR) {
468             assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d (%s)\n", i, symbol->rows, data[i].expected_rows, symbol->errtxt);
469             assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d (%s)\n", i, symbol->width, data[i].expected_width, symbol->errtxt);
470         }
471 
472         ZBarcode_Delete(symbol);
473     }
474 
475     testFinish();
476 }
477 
test_reader_init(int index,int generate,int debug)478 static void test_reader_init(int index, int generate, int debug) {
479 
480     struct item {
481         int symbology;
482         int input_mode;
483         int output_options;
484         char *data;
485         int ret;
486         int expected_rows;
487         int expected_width;
488         char *expected;
489         char *comment;
490     };
491     struct item data[] = {
492         /*  0*/ { BARCODE_DATAMATRIX, UNICODE_MODE, READER_INIT, "A", 0, 10, 10, "EA 42 81 19 A4 53 21 DF", "TODO: Check this" },
493         /*  1*/ { BARCODE_DATAMATRIX, GS1_MODE, READER_INIT, "[91]A", ZINT_ERROR_INVALID_OPTION, 0, 0, "Error 521: Cannot encode in GS1 mode and Reader Initialisation at the same time", "" },
494     };
495     int data_size = ARRAY_SIZE(data);
496     int i, length, ret;
497     struct zint_symbol *symbol;
498 
499     char escaped[1024];
500 
501     testStart("test_reader_init");
502 
503     for (i = 0; i < data_size; i++) {
504 
505         if (index != -1 && i != index) continue;
506 
507         symbol = ZBarcode_Create();
508         assert_nonnull(symbol, "Symbol not created\n");
509 
510         symbol->debug = ZINT_DEBUG_TEST; // Needed to get codeword dump in errtxt
511 
512         length = testUtilSetSymbol(symbol, data[i].symbology, data[i].input_mode, -1 /*eci*/, -1 /*option_1*/, -1 /*option_2*/, -1, data[i].output_options, data[i].data, -1, debug);
513 
514         ret = ZBarcode_Encode(symbol, (unsigned char *) data[i].data, length);
515         assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt);
516 
517         if (generate) {
518             printf("        /*%3d*/ { %s, %s, %s, \"%s\", %s, %d, %d, \"%s\", \"%s\" },\n",
519                     i, testUtilBarcodeName(data[i].symbology), testUtilInputModeName(data[i].input_mode), testUtilOutputOptionsName(data[i].output_options),
520                     testUtilEscape(data[i].data, length, escaped, sizeof(escaped)),
521                     testUtilErrorName(data[i].ret), symbol->rows, symbol->width, symbol->errtxt, data[i].comment);
522         } else {
523             if (ret < ZINT_ERROR) {
524                 assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d (%s)\n", i, symbol->rows, data[i].expected_rows, data[i].data);
525                 assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d (%s)\n", i, symbol->width, data[i].expected_width, data[i].data);
526             }
527             assert_zero(strcmp(symbol->errtxt, data[i].expected), "i:%d strcmp(%s, %s) != 0\n", i, symbol->errtxt, data[i].expected);
528         }
529 
530         ZBarcode_Delete(symbol);
531     }
532 
533     testFinish();
534 }
535 
test_input(int index,int generate,int debug)536 static void test_input(int index, int generate, int debug) {
537 
538     struct item {
539         int input_mode;
540         int eci;
541         int option_2;
542         int option_3;
543         int output_options;
544         char *data;
545         int ret;
546 
547         int expected_eci;
548         int expected_rows;
549         int expected_width;
550         int bwipp_cmp;
551         char *expected;
552         char *comment;
553     };
554     struct item data[] = {
555         /*  0*/ { UNICODE_MODE, 0, -1, -1, -1, "0466010592130100000k*AGUATY80", 0, 0, 18, 18, 1, "(32) 86 C4 83 87 DE 8F 83 82 82 31 6C EE 08 85 D6 D2 EF 65 93 B0 1C 3C 76 FB D4 AB 16 11", "#208" },
556         /*  1*/ { UNICODE_MODE, 0, 5, -1, -1, "0466010592130100000k*AGUATY80", 0, 0, 18, 18, 1, "(32) 86 C4 83 87 DE 8F 83 82 82 31 6C EE 08 85 D6 D2 EF 65 93 B0 1C 3C 76 FB D4 AB 16 11", "" },
557         /*  2*/ { UNICODE_MODE, 0, -1, -1, -1, "0466010592130100000k*AGUATY8", 0, 0, 18, 18, 1, "(32) 86 C4 83 87 DE 8F 83 82 82 E6 19 5C 07 B7 82 5F D4 3D 65 B5 97 30 00 FC 2C 4C 30 52", "" },
558         /*  3*/ { UNICODE_MODE, 0, -1, -1, -1, "0466010592130100000k*AGUATY80U", 0, 0, 20, 20, 1, "(40) 86 C4 83 87 DE 8F 83 82 82 31 6C EE 08 85 D6 D2 EF 65 FE 56 81 76 4F AB 22 B8 6F 0A", "" },
559         /*  4*/ { UNICODE_MODE, 0, 5, -1, -1, "0466010592130100000k*AGUATY80U", ZINT_ERROR_TOO_LONG, -1, 0, 0, 0, "Error 522: Input too long for selected symbol size", "" },
560         /*  5*/ { UNICODE_MODE, 0, 6, -1, -1, "0466010592130100000k*AGUATY80U", 0, 0, 20, 20, 1, "(40) 86 C4 83 87 DE 8F 83 82 82 31 6C EE 08 85 D6 D2 EF 65 FE 56 81 76 4F AB 22 B8 6F 0A", "" },
561         /*  6*/ { UNICODE_MODE, 0, -1, -1, -1, "0466010592130100000k*AGUATY80UA", 0, 0, 20, 20, 0, "(40) 86 C4 83 87 DE 8F 83 82 82 E6 19 5C 07 B7 82 5F D4 3D 1E 5F FE 81 BB 90 01 2A 31 9F", "BWIPP different encodation" },
562         /*  7*/ { UNICODE_MODE, 0, -1, -1, -1, ">*\015>*\015>", 0, 0, 14, 14, 1, "EE 0C A9 0C A9 FE 3F 81 42 B2 11 A8 F9 0A EC C1 1E 41", "X12 symbols_left 3, process_p 1" },
563         /*  8*/ { UNICODE_MODE, 0, -1, -1, -1, ">*\015>*\015>*", 0, 0, 14, 14, 1, "EE 0C A9 0C A9 FE 3F 2B 3F 05 D2 10 1B 9A 55 2F 68 C5", "X12 symbols_left 3, process_p 2" },
564         /*  9*/ { UNICODE_MODE, 0, -1, -1, -1, ">*\015>*\015>*\015", 0, 0, 14, 14, 1, "EE 0C A9 0C A9 0C A9 FE 1F 30 3F EE 45 C1 1C D7 5F 7E", "X12 symbols_left 1, process_p 0" },
565         /* 10*/ { UNICODE_MODE, 0, -1, -1, -1, "ABCDEF", 0, 0, 12, 12, 1, "E6 59 E9 6D 24 3D 15 EF AA 21 F9 59", "C40 symbols_left 0, process_p 0" },
566         /* 11*/ { UNICODE_MODE, 0, -1, -1, -1, "ABCDEFG", 0, 0, 14, 14, 1, "E6 59 E9 6D 24 FE 48 81 8C 7E 09 5E 10 64 BC 5F 4C 91", "C40 symbols_left 3, process_p 1" },
567         /* 12*/ { UNICODE_MODE, 0, -1, -1, -1, "ABCDEFGH", 0, 0, 14, 14, 1, "E6 59 E9 6D 24 FE 48 49 2E 31 00 73 3B 8F 4B 55 93 19", "C40 symbols_left 3, process_p 2" },
568         /* 13*/ { UNICODE_MODE, 0, -1, -1, -1, "ABCDEFGHI", 0, 0, 14, 14, 1, "E6 59 E9 6D 24 80 5F FE 01 DE 20 9F AA C2 FF 8F 08 97", "C40 symbols_left 1, process_p 0" },
569         /* 14*/ { UNICODE_MODE, 0, -1, -1, -1, "ABCDEFGHIJ", 0, 0, 14, 14, 1, "E6 59 E9 6D 24 80 5F 4B AD 47 09 12 FF 2F 95 CA 5B 4A", "C40 symbols_left 1, process_p 1" },
570         /* 15*/ { UNICODE_MODE, 0, -1, -1, -1, "ABCDEFGHIJK", 0, 0, 8, 32, 1, "E6 59 E9 6D 24 80 5F FE 4B 4C D8 69 88 60 B9 33 B9 31 E6 BF CA", "C40 symbols_left 3, process_p 2" },
571         /* 16*/ { UNICODE_MODE, 0, -1, -1, -1, "ABCDEF\001G", 0, 0, 14, 14, 1, "E6 59 E9 6D 24 00 3D FE 5D 5A F5 0A 8A 4E 1D 63 07 B9", "C40 symbols_left 1, process_p 0" },
572         /* 17*/ { UNICODE_MODE, 0, -1, -1, -1, "ABCDEFG\001", 0, 0, 14, 14, 1, "E6 59 E9 6D 24 7D 02 FE 14 A3 27 63 01 2F B1 94 FE FA", "C40 symbols_left 1, process_p 0" },
573         /* 18*/ { UNICODE_MODE, 0, -1, -1, -1, "ABCDEFG\001H", 0, 0, 14, 14, 1, "E6 59 E9 6D 24 7D 02 49 C2 E6 DD 06 89 51 BA 8E 9D 1F", "C40 symbols_left 1, process_p 1" },
574         /* 19*/ { UNICODE_MODE, 0, -1, -1, -1, "ABCDEFGH\001", 0, 0, 8, 32, 1, "E6 59 E9 6D 24 FE 48 49 02 81 BD 6D F3 94 FF 82 A6 BF BB F1 4F", "C40 symbols_left 1, process_p 1, backtracks" },
575         /* 20*/ { UNICODE_MODE, 0, -1, DM_SQUARE, -1, "ABCDEFGH\001", 0, 0, 16, 16, 1, "E6 59 E9 6D 24 FE 48 49 02 81 FB 93 AE 8B 1C 90 DF FE EB C5 A0 2A 6A 4F", "C40 symbols_left 1, process_p 1, backtracks" },
576         /* 21*/ { UNICODE_MODE, 0, -1, -1, -1, "ABCDEFGH\001I", 0, 0, 8, 32, 1, "E6 59 E9 6D 24 FE 48 49 02 4A E1 0D DD BC 56 E4 66 52 E6 AE 02", "C40 symbols_left 3, process_p 2, backtracks" },
577         /* 22*/ { UNICODE_MODE, 0, -1, DM_SQUARE, -1, "ABCDEFGH\001I", 0, 0, 16, 16, 1, "E6 59 E9 6D 24 FE 48 49 02 4A 81 93 51 DF C0 0C D3 F9 72 13 17 52 5B 7E", "C40 symbols_left 5, process_p 2, backtracks" },
578         /* 23*/ { UNICODE_MODE, 0, -1, -1, -1, "ABCDEFGHI\001", 0, 0, 8, 32, 1, "E6 59 E9 6D 24 80 5F FE 02 81 47 6C 3E 49 D3 FA 46 47 53 6E E5", "Switches to ASC for last char" },
579         /* 24*/ { UNICODE_MODE, 0, -1, DM_SQUARE, -1, "ABCDEFGHI\001", 0, 0, 16, 16, 1, "E6 59 E9 6D 24 80 5F FE 02 81 FB 93 33 E3 4F F7 2D 08 8A BF 64 C3 B0 26", "Switches to ASC for last char" },
580         /* 25*/ { UNICODE_MODE, 0, -1, -1, -1, "ABCDEFGH\001I\001", 0, 0, 16, 16, 1, "E6 59 E9 6D 24 FE 48 49 02 4A 02 81 BD 5D C0 B9 09 25 87 3A 09 23 9D C0", "C40 symbols_left 1, process_p 1, backtracks 2" },
581         /* 26*/ { UNICODE_MODE, 0, -1, -1, -1, "ABCDEF+G", 0, 0, 14, 14, 1, "E6 59 E9 6D 24 07 E5 FE 6B 35 71 7F 3D 57 59 46 F7 B9", "C40 symbols_left 1, process_p 0" },
582         /* 27*/ { UNICODE_MODE, 0, -1, -1, -1, "ABCDEFG+", 0, 0, 14, 14, 1, "E6 59 E9 6D 24 7D 33 FE 33 F5 97 60 73 48 13 2E E5 74", "C40 symbols_left 1, process_p 0" },
583         /* 28*/ { UNICODE_MODE, 0, -1, -1, -1, "ABCDEFG+H", 0, 0, 14, 14, 1, "E6 59 E9 6D 24 7D 33 49 E5 B0 6D 05 FB 36 18 34 86 91", "C40 symbols_left 1, process_p 1" },
584         /* 29*/ { UNICODE_MODE, 0, -1, -1, -1, "ABCDEFGH+", 0, 0, 8, 32, 1, "E6 59 E9 6D 24 FE 48 49 2C 81 02 BD 40 CF 3B 06 C2 DF 36 E0 48", "C40 symbols_left 1, process_p 1, backtracks" },
585         /* 30*/ { UNICODE_MODE, 0, -1, DM_SQUARE, -1, "ABCDEFGH+", 0, 0, 16, 16, 1, "E6 59 E9 6D 24 FE 48 49 2C 81 FB 93 F6 78 B5 69 0B 83 C6 32 62 1A D2 FF", "C40 symbols_left 1, process_p 1, backtracks" },
586         /* 31*/ { UNICODE_MODE, 0, -1, -1, -1, "ABCDEFGH+I", 0, 0, 8, 32, 1, "E6 59 E9 6D 24 FE 48 49 2C 4A 5E DD 6E E7 92 60 02 32 6B BF 05", "C40 symbols_left 3, process_p 2, backtracks" },
587         /* 32*/ { UNICODE_MODE, 0, -1, DM_SQUARE, -1, "ABCDEFGH+I", 0, 0, 16, 16, 1, "E6 59 E9 6D 24 FE 48 49 2C 4A 81 93 09 2C 69 F5 07 84 5F E4 D5 62 E3 CE", "C40 symbols_left 5, process_p 2, backtracks" },
588         /* 33*/ { UNICODE_MODE, 0, -1, -1, -1, "ABCDEFGHI+", 0, 0, 8, 32, 1, "E6 59 E9 6D 24 80 5F FE 2C 81 F8 BC 8D 12 17 7E 22 27 DE 7F E2", "C40 symbols_left 3, process_p 2, backtracks" },
589         /* 34*/ { UNICODE_MODE, 0, -1, DM_SQUARE, -1, "ABCDEFGHI+", 0, 0, 16, 16, 1, "E6 59 E9 6D 24 80 5F FE 2C 81 FB 93 6B 10 E6 0E F9 75 A7 48 A6 F3 08 96", "Switches to ASC for last char" },
590         /* 35*/ { UNICODE_MODE, 0, -1, -1, -1, "ABCDEFjG", 0, 0, 14, 14, 1, "E6 59 E9 6D 24 0E 25 FE DA 14 D7 15 47 69 9D 4A 54 6D", "C40 symbols_left 1, process_p 0" },
591         /* 36*/ { UNICODE_MODE, 0, -1, -1, -1, "ABCDEFGj", 0, 0, 14, 14, 1, "E6 59 E9 6D 24 7D 5B FE B5 F3 24 0A 99 26 D6 CC A8 40", "C40 symbols_left 1, process_p 0" },
592         /* 37*/ { UNICODE_MODE, 0, -1, -1, -1, "ABCDEFGjH", 0, 0, 14, 14, 1, "E6 59 E9 6D 24 7D 5B 49 63 B6 DE 6F 11 58 DD D6 CB A5", "C40 symbols_left 1, process_p 1" },
593         /* 38*/ { UNICODE_MODE, 0, -1, -1, -1, "ABCDEFGHj", 0, 0, 8, 32, 1, "E6 59 E9 6D 24 FE 48 49 6B 81 ED 78 CB 9F 52 EE 52 88 91 67 96", "C40 symbols_left 1, process_p 1, backtracks" },
594         /* 39*/ { UNICODE_MODE, 0, -1, DM_SQUARE, -1, "ABCDEFGHj", 0, 0, 16, 16, 1, "E6 59 E9 6D 24 FE 48 49 6B 81 FB 93 BF 72 03 35 09 37 98 FF 39 A7 E3 6D", "C40 symbols_left 1, process_p 1, backtracks" },
595         /* 40*/ { UNICODE_MODE, 0, -1, -1, -1, "ABCDEFGHjI", 0, 0, 8, 32, 1, "E6 59 E9 6D 24 FE 48 49 6B 4A B1 18 E5 B7 FB 88 92 65 CC 38 DB", "C40 symbols_left 3, process_p 2, backtracks" },
596         /* 41*/ { UNICODE_MODE, 0, -1, DM_SQUARE, -1, "ABCDEFGHjI", 0, 0, 16, 16, 1, "E6 59 E9 6D 24 FE 48 49 6B 4A 81 93 40 26 DF A9 05 30 01 29 8E DF D2 5C", "C40 symbols_left 5, process_p 2, backtracks" },
597         /* 42*/ { UNICODE_MODE, 0, -1, -1, -1, "ABCDEFGHIj", 0, 0, 8, 32, 1, "E6 59 E9 6D 24 80 5F FE 6B 81 17 79 06 42 7E 96 B2 70 79 F8 3C", "Switches to ASC for last char" },
598         /* 43*/ { UNICODE_MODE, 0, -1, -1, -1, "ABCDEFGHIJÊ", 0, 0, 16, 16, 1, "E6 59 E9 6D 24 80 5F FE 4B EB 4B 81 DD D9 F9 C9 C5 38 F3 4B DB 80 92 A7", "Switches to ASC for last 2 chars" },
599         /* 44*/ { UNICODE_MODE, 0, -1, -1, -1, "ABCDEFGHIJKÊ", 0, 0, 16, 16, 1, "E6 59 E9 6D 24 80 5F FE 4B 4C EB 4B 15 17 46 06 70 F3 15 74 45 26 72 2D", "C40 symbols_left 3, process_p 2, backtracks" },
600         /* 45*/ { UNICODE_MODE, 0, -1, -1, -1, "ABCDEFGHIJKª", 0, 0, 16, 16, 1, "E6 59 E9 6D 24 80 5F 93 82 BB B2 FE 11 5C 60 32 A6 DE FC 7B 30 F1 03 56", "C40 symbols_left 1, process_p 0" },
601         /* 46*/ { UNICODE_MODE, 0, -1, -1, -1, "ABCDEFGHIJKê", 0, 0, 16, 16, 1, "E6 59 E9 6D 24 80 5F 93 82 BB DB FE 78 43 69 3C C2 FE F5 2E 1B 4F B6 04", "C40 symbols_left 1, process_p 0" },
602         /* 47*/ { GS1_MODE, 0, -1, -1, -1, "[10]ABCDEFGH[10]ABc", 0, 0, 12, 26, 1, "E8 8C E6 59 E9 6D 24 80 4A A9 8D FE 42 43 64 81 83 B4 8F 6B 95 F6 CE A6 3C 5C 77 86 08 50", "C40 symbols_left 3, process_p 1, backtracks" },
603         /* 48*/ { GS1_MODE, 0, -1, -1, GS1_GS_SEPARATOR, "[10]ABCDEFGH[10]ABc", 0, 0, 12, 26, 1, "E8 8C E6 59 E9 6D 24 80 49 B6 0D FE 42 43 64 81 79 E4 20 33 76 5C C7 23 E6 C5 FA 4C FF 88", "C40 symbols_left 3, process_p 1, backtracks" },
604         /* 49*/ { UNICODE_MODE, 0, -1, -1, -1, "abcdef", 0, 0, 12, 12, 1, "EF 59 E9 6D 24 E2 CC D9 B4 55 E2 6A", "TEX symbols_left 0, process_p 0" },
605         /* 50*/ { UNICODE_MODE, 0, -1, -1, -1, "abcdefg", 0, 0, 14, 14, 1, "EF 59 E9 6D 24 FE 68 81 A9 65 CD 3A A2 E9 E0 B7 E1 E5", "TEX symbols_left 3, process_p 1" },
606         /* 51*/ { UNICODE_MODE, 0, -1, -1, -1, "abcdefgh", 0, 0, 14, 14, 1, "EF 59 E9 6D 24 FE 68 69 68 36 28 3C 85 5A E9 D4 49 9A", "TEX symbols_left 3, process_p 2" },
607         /* 52*/ { UNICODE_MODE, 0, -1, -1, -1, "abcdefghi", 0, 0, 14, 14, 1, "EF 59 E9 6D 24 80 5F FE DA BF FA 16 71 15 22 4D E3 F3", "TEX symbols_left 1, process_p 0" },
608         /* 53*/ { UNICODE_MODE, 0, -1, -1, -1, "abcdef\001g", 0, 0, 14, 14, 1, "EF 59 E9 6D 24 00 3D FE 86 3B 2F 83 51 99 C0 A1 EC DD", "TEX symbols_left 1, process_p 0" },
609         /* 54*/ { UNICODE_MODE, 0, -1, -1, -1, "abcdefg\001", 0, 0, 14, 14, 1, "EF 59 E9 6D 24 7D 02 FE CF C2 FD EA DA F8 6C 56 15 9E", "TEX symbols_left 1, process_p 0" },
610         /* 55*/ { UNICODE_MODE, 0, -1, -1, -1, "abcdefg\001h", 0, 0, 14, 14, 1, "EF 59 E9 6D 24 7D 02 69 7A 9B EB A4 5E DE 99 25 01 8C", "TEX symbols_left 1, process_p 1" },
611         /* 56*/ { UNICODE_MODE, 0, -1, -1, -1, "abcdefgh\001", 0, 0, 8, 32, 1, "EF 59 E9 6D 24 FE 68 69 02 81 EB 84 25 32 6E 1B 5A FB 1D 25 4A", "TEX symbols_left 1, process_p 1, backtracks" },
612         /* 57*/ { UNICODE_MODE, 0, -1, DM_SQUARE, -1, "abcdefgh\001", 0, 0, 16, 16, 1, "EF 59 E9 6D 24 FE 68 69 02 81 FB 93 93 FD 1E 3B BA 1D 16 4D 59 41 EC B9", "TEX symbols_left 1, process_p 1, backtracks" },
613         /* 58*/ { UNICODE_MODE, 0, -1, -1, -1, "abcdefgh\001i", 0, 0, 8, 32, 1, "EF 59 E9 6D 24 FE 68 69 02 6A 31 35 48 9B 93 6E 15 BB 02 9D F4", "TEX symbols_left 3, process_p 2, backtracks" },
614         /* 59*/ { UNICODE_MODE, 0, -1, DM_SQUARE, -1, "abcdefgh\001i", 0, 0, 16, 16, 1, "EF 59 E9 6D 24 FE 68 69 02 6A 81 93 DE D7 EC 9B 7D 72 9C 68 B8 6E CF 31", "TEX symbols_left 3, process_p 2, backtracks" },
615         /* 60*/ { UNICODE_MODE, 0, -1, -1, -1, "abcdefghi\001", 0, 0, 8, 32, 1, "EF 59 E9 6D 24 80 5F FE 02 81 4D AB 30 86 CD D1 9D F3 15 F5 B1", "Switches to ASC for last char" },
616         /* 61*/ { UNICODE_MODE, 0, -1, -1, -1, "abcdefgh\001i\001", 0, 0, 16, 16, 1, "EF 59 E9 6D 24 FE 68 69 02 6A 02 81 32 55 EC 2E A7 AE 69 41 A6 1F 09 8F", "TEX symbols_left 1, process_p 1, backtracks 2" },
617         /* 62*/ { UNICODE_MODE, 0, -1, -1, -1, "abcdefJg", 0, 0, 14, 14, 1, "EF 59 E9 6D 24 0E 25 FE 01 75 0D 9C 9C BE 40 88 BF 09", "TEX symbols_left 1, process_p 0" },
618         /* 63*/ { UNICODE_MODE, 0, -1, -1, -1, "abcdefgJ", 0, 0, 14, 14, 1, "EF 59 E9 6D 24 7D 5B FE 6E 92 FE 83 42 F1 0B 0E 43 24", "TEX symbols_left 1, process_p 0" },
619         /* 64*/ { UNICODE_MODE, 0, -1, -1, -1, "abcdefgJh", 0, 0, 14, 14, 1, "EF 59 E9 6D 24 7D 5B 69 DB CB E8 CD C6 D7 FE 7D 57 36", "TEX symbols_left 1, process_p 1" },
620         /* 65*/ { UNICODE_MODE, 0, -1, -1, -1, "abcdefghJ", 0, 0, 8, 32, 1, "EF 59 E9 6D 24 FE 68 69 4B 81 15 8A 35 57 7F 33 B3 48 01 E0 BD", "TEX symbols_left 1, process_p 1, backtracks" },
621         /* 66*/ { UNICODE_MODE, 0, -1, DM_SQUARE, -1, "abcdefghJ", 0, 0, 16, 16, 1, "EF 59 E9 6D 24 FE 68 69 4B 81 FB 93 5B D4 D2 8B EE 85 F2 3E 3F 8E E5 04", "TEX symbols_left 1, process_p 1, backtracks" },
622         /* 67*/ { UNICODE_MODE, 0, -1, -1, -1, "abcdefghJi", 0, 0, 8, 32, 1, "EF 59 E9 6D 24 FE 68 69 4B 6A CF 3B 58 FE 82 46 FC 08 1E 58 03", "TEX symbols_left 3, process_p 2, backtracks" },
623         /* 68*/ { UNICODE_MODE, 0, -1, DM_SQUARE, -1, "abcdefghJi", 0, 0, 16, 16, 1, "EF 59 E9 6D 24 FE 68 69 4B 6A 81 93 16 FE 20 2B 29 EA 78 1B DE A1 C6 8C", "TEX symbols_left 3, process_p 2, backtracks" },
624         /* 69*/ { UNICODE_MODE, 0, -1, -1, -1, "abcdefghiJ", 0, 0, 8, 32, 1, "EF 59 E9 6D 24 80 5F FE 4B 81 B3 A5 20 E3 DC F9 74 40 09 30 46", "Switches to ASC for last char" },
625         /* 70*/ { UNICODE_MODE, 0, -1, -1, -1, "abcdefghijkÊ", 0, 0, 16, 16, 1, "EF 59 E9 6D 24 80 5F 93 82 BB DB FE 3E C8 EC 73 58 A7 42 46 10 49 25 99", "TEX symbols_left 1, process_p 0" },
626         /* 71*/ { UNICODE_MODE, 0, -1, -1, -1, "abcdefghijkª", 0, 0, 16, 16, 1, "EF 59 E9 6D 24 80 5F 93 82 BB B2 FE 57 D7 E5 7D 3C 87 4B 13 3B F7 90 CB", "TEX symbols_left 1, process_p 0" },
627         /* 72*/ { UNICODE_MODE, 0, -1, -1, -1, "abcdefghijkê", 0, 0, 16, 16, 1, "EF 59 E9 6D 24 80 5F FE 6B 6C EB 6B 59 43 1A B1 96 F4 FF C5 B5 08 AE 2F", "TEX symbols_left 3, process_p 2, backtracks" },
628         /* 73*/ { GS1_MODE, 0, -1, -1, -1, "[10]abcdefgh[10]abC", 0, 0, 12, 26, 1, "E8 8C EF 59 E9 6D 24 80 4A A9 8D FE 62 63 44 81 88 DC 73 33 70 A1 83 EA 50 CB 4E 17 90 DB", "TEX symbols left 3, process_p 1, backtracks" },
629         /* 74*/ { GS1_MODE, 0, -1, -1, GS1_GS_SEPARATOR, "[10]abcdefgh[10]abC", 0, 0, 12, 26, 1, "E8 8C EF 59 E9 6D 24 80 49 B6 0D FE 62 63 44 81 72 8C DC 6B 93 0B 8A 6F 8A 52 C3 DD 67 03", "TEX symbols left 3, process_p 1, backtracks" },
630         /* 75*/ { UNICODE_MODE, 0, -1, -1, -1, "\015*>\015*>", 0, 0, 12, 12, 1, "EE 00 2B 00 2B 83 3B 0A CE 32 36 65", "X12 symbols_left 0, process_p 0" },
631         /* 76*/ { UNICODE_MODE, 0, -1, -1, -1, "\015*>\015*>\015", 0, 0, 14, 14, 1, "EE 00 2B 00 2B FE 0E 81 C0 6C BF 37 F6 D6 48 71 E2 38", "Switches to ASC for last char" },
632         /* 77*/ { UNICODE_MODE, 0, -1, -1, -1, "\015*>\015*>\015*", 0, 0, 14, 14, 1, "EE 00 2B 00 2B FE 0E 2B BD DB 7C 8F 14 46 F1 9F 94 BC", "Switches to ASC for last 2 chars" },
633         /* 78*/ { UNICODE_MODE, 0, -1, -1, -1, "\015*>\015*>\015*>", 0, 0, 14, 14, 1, "EE 00 2B 00 2B 00 2B FE BF 81 70 74 1C 65 10 0C 06 38", "X12 symbols_left 1, process_p 0, ASC unlatch at end" },
634         /* 79*/ { UNICODE_MODE, 0, -1, -1, -1, "\015*>\015*>\015*>\015", 0, 0, 14, 14, 1, "EE 00 2B 00 2B 00 2B 0E 1C DB D8 26 3E EC CF 9C C3 4A", "X12 symbols_left 1, process_p 1, ASC no latch at end" },
635         /* 80*/ { UNICODE_MODE, 0, -1, -1, -1, "\015*>\015*>\015*>\015*", 0, 0, 8, 32, 1, "EE 00 2B 00 2B 00 2B FE 0E 2B 65 37 5F 2F F3 96 BE 9A 03 55 68", "X12 symbols_left 3, process_p 2, ASC last 2 chars" },
636         /* 81*/ { UNICODE_MODE, 0, -1, -1, -1, "\015*>\015*>\015*>\015*>", 0, 0, 8, 32, 1, "EE 00 2B 00 2B 00 2B 00 2B FE 6E 95 3A 10 58 4E 96 06 79 09 94", "X12 symbols_left 1, process_p 0, ASC unlatch at end" },
637         /* 82*/ { UNICODE_MODE, 0, -1, -1, -1, "@A1^B2?C", 0, 0, 14, 14, 1, "F0 00 1C 5E 0B 2F C3 81 2D 71 45 13 9B FF A1 B0 0B E2", "EDIFACT symbols_left 1, process_p 0" },
638         /* 83*/ { UNICODE_MODE, 0, -1, -1, -1, "@A1^B2?C3", 0, 0, 14, 14, 1, "F0 00 1C 5E 0B 2F C3 34 81 E8 6C 9E CE 12 CB F5 58 3F", "EDIFACT symbols_left 1, process_p 1" },
639         /* 84*/ { UNICODE_MODE, 0, -1, -1, -1, "@A1^B2?C3+", 0, 0, 8, 32, 1, "F0 00 1C 5E 0B 2F C3 CE B7 C0 33 C6 81 E1 63 6E 5E B4 27 30 C9", "EDIFACT symbols_left 3, process_p 2" },
640         /* 85*/ { UNICODE_MODE, 0, -1, -1, -1, "@A1^B2?C3+D", 0, 0, 8, 32, 1, "F0 00 1C 5E 0B 2F C3 CE B1 1F 4D E1 79 04 2B BC 05 6C 38 73 39", "EDIFACT symbols_left 3, process_p 3" },
641         /* 86*/ { UNICODE_MODE, 0, -1, -1, -1, "@A1^B2?C3+D4", 0, 0, 8, 32, 1, "F0 00 1C 5E 0B 2F C3 CE B1 34 F4 EC B3 DC 03 A3 1F B5 86 C3 F7", "EDIFACT symbols_left 0, process_p 0" },
642         /* 87*/ { UNICODE_MODE, 0, -1, -1, -1, "@A1^B2?C3+D4=", 0, 0, 16, 16, 1, "F0 00 1C 5E 0B 2F C3 CE B1 34 3E 81 42 96 43 6E 92 0D A9 B1 65 3C CF 9B", "EDIFACT symbols_left 2, process_p 1" },
643         /* 88*/ { UNICODE_MODE, 0, -1, -1, -1, "@A1^B2?C3+D4=E", 0, 0, 16, 16, 1, "F0 00 1C 5E 0B 2F C3 CE B1 34 3E 46 AD 8C F2 D8 5D AF F3 65 08 1F E3 A5", "EDIFACT symbols_left 2, process_p 2" },
644         /* 89*/ { DATA_MODE, 0, -1, -1, -1, "\377\376", 0, 0, 12, 12, 1, "EB 80 EB 7F 81 6F A8 0F 21 6F 5F 88", "FN4 A7F FN4 A7E, 1 pad" },
645         /* 90*/ { DATA_MODE, 0, -1, -1, -1, "\377\376\375", 0, 0, 12, 12, 1, "E7 2C C0 55 E9 67 45 8A D2 7E A9 23", "BAS BFF BFE BFD, no padding" },
646         /* 91*/ { DATA_MODE, 3, -1, -1, -1, "\101\102\103\104\300\105\310", 0, 3, 16, 16, 1, "F1 04 E7 5E 2D C4 5B F1 03 1D 36 81 64 0E C0 77 9A 18 52 B2 F9 F0 04 39", "ECI 4 BAS B41 B42 B43 B44 BC0 B45 BC8" },
647         /* 92*/ { UNICODE_MODE, 26, -1, -1, -1, "ABCDÀEÈ", 0, 26, 12, 26, 1, "F1 1B E7 60 2D C4 5B F1 06 58 B3 C7 21 81 57 ED 3D C0 12 2E 6C 80 58 CC 2C 05 0D 31 FC 2D", "ECI 27 BAS B41 B42 B43 B44 BC3 B80 B45 BC3 B88" },
648         /* 93*/ { UNICODE_MODE, 0, -1, -1, -1, "β", ZINT_WARN_USES_ECI, 9, 12, 12, 1, "Warning F1 0A EB 63 81 41 56 DA C0 3D 2D CC", "ECI 10 FN4 A62" },
649         /* 94*/ { UNICODE_MODE, 127, -1, -1, -1, "A", 0, 127, 12, 12, 1, "F1 80 01 42 81 14 A2 86 07 F5 27 30", "ECI 128 A41" },
650         /* 95*/ { UNICODE_MODE, 16382, -1, -1, -1, "A", 0, 16382, 12, 12, 1, "F1 BF FE 42 81 29 57 AA A0 92 B2 45", "ECI 16383 A41" },
651         /* 96*/ { UNICODE_MODE, 810899, -1, -1, -1, "A", 0, 810899, 12, 12, 1, "F1 CC 51 05 42 BB A5 A7 8A C6 6E 0F", "ECI 810900 A41" },
652         /* 97*/ { UNICODE_MODE | ESCAPE_MODE, -1, -1, -1, -1, "[)>\\R05\\GA\\R\\E", 0, 0, 10, 10, 1, "EC 42 81 5D 17 49 F6 B6", "Macro05 A41" },
653         /* 98*/ { UNICODE_MODE, 0, -1, -1, -1, "ABCDEFGHIJKLM*", 0, 0, 16, 16, 1, "EE 59 E9 6D 24 80 5F 93 9A FE 4E 2B 09 FF 50 A2 83 BE 32 E1 2F 17 1E F3", "C40 == X12, p_r_6_2_1 true" },
654     };
655     int data_size = ARRAY_SIZE(data);
656     int i, length, ret;
657     struct zint_symbol *symbol;
658 
659     char escaped[8192];
660     char bwipp_buf[32768];
661     char bwipp_msg[1024];
662 
663     int do_bwipp = (debug & ZINT_DEBUG_TEST_BWIPP) && testUtilHaveGhostscript(); // Only do BWIPP test if asked, too slow otherwise
664 
665     testStart("test_input");
666 
667     for (i = 0; i < data_size; i++) {
668 
669         if (index != -1 && i != index) continue;
670 
671         symbol = ZBarcode_Create();
672         assert_nonnull(symbol, "Symbol not created\n");
673 
674         symbol->debug = ZINT_DEBUG_TEST; // Needed to get codeword dump in errtxt
675 
676         length = testUtilSetSymbol(symbol, BARCODE_DATAMATRIX, data[i].input_mode, data[i].eci, -1 /*option_1*/, data[i].option_2, data[i].option_3, data[i].output_options, data[i].data, -1, debug);
677 
678         ret = ZBarcode_Encode(symbol, (unsigned char *) data[i].data, length);
679         assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt);
680 
681         if (generate) {
682             printf("        /*%3d*/ { %s, %d, %d, %s, %s, \"%s\", %s, %d, %d, %d, %d, \"%s\", \"%s\" },\n",
683                     i, testUtilInputModeName(data[i].input_mode), data[i].eci, data[i].option_2, testUtilOption3Name(data[i].option_3),
684                     testUtilOutputOptionsName(data[i].output_options), testUtilEscape(data[i].data, length, escaped, sizeof(escaped)),
685                     testUtilErrorName(data[i].ret), ret < ZINT_ERROR ? symbol->eci : -1, symbol->rows, symbol->width, data[i].bwipp_cmp, symbol->errtxt, data[i].comment);
686         } else {
687             if (ret < ZINT_ERROR) {
688                 assert_equal(symbol->eci, data[i].expected_eci, "i:%d eci %d != %d\n", i, symbol->eci, data[i].expected_eci);
689                 assert_equal(symbol->rows, data[i].expected_rows, "i:%d rows %d != %d\n", i, symbol->rows, data[i].expected_rows);
690                 assert_equal(symbol->width, data[i].expected_width, "i:%d width %d != %d\n", i, symbol->width, data[i].expected_width);
691             }
692             assert_zero(strcmp(symbol->errtxt, data[i].expected), "i:%d strcmp(%s, %s) != 0\n", i, symbol->errtxt, data[i].expected);
693 
694             if (ret < ZINT_ERROR) {
695                 if (do_bwipp && testUtilCanBwipp(i, symbol, -1, data[i].option_2, data[i].option_3, debug)) {
696                     if (!data[i].bwipp_cmp) {
697                         if (debug & ZINT_DEBUG_TEST_PRINT) printf("i:%d %s not BWIPP compatible (%s)\n", i, testUtilBarcodeName(symbol->symbology), data[i].comment);
698                     } else {
699                         char modules_dump[8192];
700                         assert_notequal(testUtilModulesDump(symbol, modules_dump, sizeof(modules_dump)), -1, "i:%d testUtilModulesDump == -1\n", i);
701                         ret = testUtilBwipp(i, symbol, -1, data[i].option_2, data[i].option_3, data[i].data, length, NULL, bwipp_buf, sizeof(bwipp_buf));
702                         assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(symbol->symbology), ret);
703 
704                         ret = testUtilBwippCmp(symbol, bwipp_msg, bwipp_buf, modules_dump);
705                         assert_zero(ret, "i:%d %s testUtilBwippCmp %d != 0 %s\n  actual: %s\nexpected: %s\n",
706                                        i, testUtilBarcodeName(symbol->symbology), ret, bwipp_msg, bwipp_buf, modules_dump);
707                     }
708                 }
709             }
710         }
711 
712         ZBarcode_Delete(symbol);
713     }
714 
715     testFinish();
716 }
717 
test_encode(int index,int generate,int debug)718 static void test_encode(int index, int generate, int debug) {
719 
720     struct item {
721         int symbology;
722         int input_mode;
723         int eci;
724         int output_options;
725         int option_2;
726         int option_3;
727         char *data;
728         int ret;
729 
730         int expected_rows;
731         int expected_width;
732         int bwipp_cmp;
733         char *comment;
734         char *expected;
735     };
736     // Verified manually against ISO/IEC 16022:2006, ISO/IEC 21471:2020, GS1 General Specifications 21.0.1 (GGS), ANSI/HIBC LIC 2.6-2016 (HIBC/LIC) and
737     // ANSI/HIBC PAS 1.3-2010 (HIBC/PAS), with noted exceptions
738     struct item data[] = {
739         /*  0*/ { BARCODE_DATAMATRIX, -1, -1, -1, -1, -1, "1234abcd", 0, 14, 14, 1, "",
740                     "10101010101010"
741                     "11001010001111"
742                     "11000101100100"
743                     "11001001100001"
744                     "11011001110000"
745                     "10100101011001"
746                     "10101110011000"
747                     "10011101100101"
748                     "10100001001000"
749                     "10101000001111"
750                     "11101100000010"
751                     "11010010100101"
752                     "10011111000100"
753                     "11111111111111"
754                 },
755         /*  1*/ { BARCODE_DATAMATRIX, -1, -1, -1, -1, -1, "A1B2C3D4E5F6G7H8I9J0K1L2", 0, 18, 18, 1, "16022:2006 Figure 1",
756                     "101010101010101010"
757                     "101000101010001111"
758                     "101100000111000010"
759                     "100000101110100111"
760                     "100100000100011100"
761                     "101011111010101111"
762                     "100110011111110110"
763                     "110011101111111101"
764                     "111111111101111100"
765                     "101110110100101101"
766                     "100010110101001110"
767                     "101101111001100001"
768                     "110001101010011110"
769                     "110110100000100011"
770                     "101101001101011010"
771                     "100010011001011011"
772                     "100011000000100100"
773                     "111111111111111111"
774                 },
775         /*  2*/ { BARCODE_DATAMATRIX, -1, -1, -1, -1, -1, "123456", 0, 10, 10, 1, "16022:2006 Figure O.2",
776                     "1010101010"
777                     "1100101101"
778                     "1100000100"
779                     "1100011101"
780                     "1100001000"
781                     "1000001111"
782                     "1110110000"
783                     "1111011001"
784                     "1001110100"
785                     "1111111111"
786                 },
787         /*  3*/ { BARCODE_DATAMATRIX, -1, -1, -1, -1, -1, "30Q324343430794<OQQ", 0, 16, 16, 1, "16022:2006 Figure R.1",
788                     "1010101010101010"
789                     "1010101010000001"
790                     "1010101011101100"
791                     "1010101010110011"
792                     "1010101010001100"
793                     "1010101010001101"
794                     "1010101010000100"
795                     "1010101001101001"
796                     "1010101010000110"
797                     "1000001001011001"
798                     "1111111110000100"
799                     "1101100110010101"
800                     "1111111001100100"
801                     "1110010111100101"
802                     "1110010010100010"
803                     "1111111111111111"
804                 },
805         /*  4*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, -1, 32, -1, "A1B2C3D4E5F6G7H8I9J0K1L2", 0, 8, 64, 1, "21471:2020 Figure 1",
806                     "1010101010101010101010101010101010101010101010101010101010101010"
807                     "1010001010111001101010111011111110001110000000011101010100010101"
808                     "1011000000000110110111111110111010110000101001101101001000010110"
809                     "1000001000110011110001111011111110001100101010111011111111001111"
810                     "1001000111011100101010110001011010010111001000101111101011101100"
811                     "1010101011111011100000000001000110101110011111011000101011000111"
812                     "1101101100110110111100110000001011100011001001101011001001001000"
813                     "1111111111111111111111111111111111111111111111111111111111111111"
814                 },
815         /*  5*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, -1, 31, -1, "123456789012345678901234567890123456", 0, 8, 48, 1, "21471:2020 Figure H.3",
816                     "101010101010101010101010101010101010101010101010"
817                     "110010010100000111110001101001010110100110001011"
818                     "110011000111101000101010110111001110011011011010"
819                     "110001110010001100001001100011001100110111000111"
820                     "111010010010110111101000110001110001000011000000"
821                     "100011010010011010111111111101010010100111000001"
822                     "101101111110001011010010111010001111110101101110"
823                     "111111111111111111111111111111111111111111111111"
824                 },
825         /*  6*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, -1, 29, -1, "30Q324343430794<OQ", 0, 16, 36, 1, "21471:2020 Figure J.1 NOTE: single Q at end, not 2; also not DMRE",
826                     "101010101010101010101010101010101010"
827                     "101010101000000101111110101011001101"
828                     "101010101101111110111111101110001100"
829                     "101010110010101011111000000010111101"
830                     "101010100010101100110101100100100100"
831                     "101010100100011001100110110111011001"
832                     "101010100010101000110100010111010110"
833                     "101010100110000111101110001110111001"
834                     "101010101001110110110000111010000100"
835                     "100000110100111111111110101010100001"
836                     "111101010100100110110011100001011000"
837                     "110100100100010001100111011111001111"
838                     "101100100100000000111011111010010100"
839                     "100111011010111111100011010011001001"
840                     "101111001001100000110110100000010110"
841                     "111111111111111111111111111111111111"
842                 },
843         /*  7*/ { BARCODE_DATAMATRIX, -1, -1, -1, -1, -1, "https://example.com/01/09506000134369", 0, 22, 22, 1, "GGS Figure 2.1.13.1 (and 5.1-9) **NOT SAME**, different encodation; note not GS1",
844                     "1010101010101010101010"
845                     "1100101110000001110101"
846                     "1001010101111100101110"
847                     "1000000100111110100001"
848                     "1101010111011101101000"
849                     "1101110001110000010101"
850                     "1110100101000101111110"
851                     "1101101110110101111111"
852                     "1111010011000010010100"
853                     "1100011101100101001111"
854                     "1000100000001111100010"
855                     "1011000101110110101111"
856                     "1100011101110101101110"
857                     "1011010101010110110011"
858                     "1000000100111110001110"
859                     "1011011101001110111001"
860                     "1110001111111011110000"
861                     "1100100001011110010001"
862                     "1111011110000101001110"
863                     "1110000100000000010101"
864                     "1101001001101110010100"
865                     "1111111111111111111111"
866                 },
867         /*  8*/ { BARCODE_DATAMATRIX, GS1_MODE, -1, -1, -1, -1, "[01]09501101530003[17]150119[10]AB-123", 0, 20, 20, 1, "GGS Figure 2.6.14-3",
868                     "10101010101010101010"
869                     "11001111010100000111"
870                     "10001010001001010100"
871                     "10110011010100010001"
872                     "11101010000001101010"
873                     "10000100111011010111"
874                     "10011010101101010110"
875                     "11010001001110101001"
876                     "11101000110100101100"
877                     "11001111010111001101"
878                     "10001010000001100000"
879                     "11010000100010111011"
880                     "10110010011000001000"
881                     "10011010000011010011"
882                     "11111010101110100110"
883                     "11010010111011100001"
884                     "11010100101100111110"
885                     "11000001110010010101"
886                     "10011011100101011010"
887                     "11111111111111111111"
888                 },
889         /*  9*/ { BARCODE_DATAMATRIX, GS1_MODE, -1, -1, -1, -1, "[01]04012345678901[21]ABCDEFG123456789", 0, 20, 20, 1, "GGS Figure 2.6.14-4",
890                     "10101010101010101010"
891                     "11011000001101000111"
892                     "10001001100001110100"
893                     "10110110110000010001"
894                     "11100010000111110110"
895                     "10101010110011101101"
896                     "11111000100000100010"
897                     "10010010001011110001"
898                     "10101010110011010110"
899                     "11011110011010001111"
900                     "10001010011101010010"
901                     "10111111011110110011"
902                     "11110100101101011000"
903                     "11010111011100100111"
904                     "10000000011001100000"
905                     "11101111110100001011"
906                     "11010001001000101010"
907                     "11010011101000100101"
908                     "10001000100001111010"
909                     "11111111111111111111"
910                 },
911         /* 10*/ { BARCODE_DATAMATRIX, GS1_MODE, -1, -1, -1, -1, "[01]04012345678901[17]170101[10]ABC123", 0, 20, 20, 1, "GGS Figure 4.15-1 (and 5.1-6)",
912                     "10101010101010101010"
913                     "11011000010100000111"
914                     "10001001100001010100"
915                     "10110111001100000001"
916                     "11100010000101101110"
917                     "10101100110001010101"
918                     "11111010101000100110"
919                     "10010011001000100011"
920                     "10101000110010111010"
921                     "11001111001010101111"
922                     "10001010000111000010"
923                     "10110000010101000011"
924                     "11110010000001011000"
925                     "11011000000110101111"
926                     "11111010111011110110"
927                     "11001001001110101111"
928                     "11011010000001110010"
929                     "11010111010111101101"
930                     "10001000000101111010"
931                     "11111111111111111111"
932                 },
933         /* 11*/ { BARCODE_DATAMATRIX, GS1_MODE, -1, GS1_GS_SEPARATOR, -1, -1, "[01]09504000059101[21]12345678p901[10]1234567p[17]141120[8200]http://www.gs1.org/demo/", 0, 32, 32, 1, "GGS Figure 4.15.1-1 **NOT SAME**, uses 0-padded final TEXT triplet",
934                     "10101010101010101010101010101010"
935                     "11001111010000111101100000101001"
936                     "10001010011111001011011001000010"
937                     "10111011001001111101111101000101"
938                     "11100101000010001000011011011110"
939                     "10000101001101111010111000100101"
940                     "10010001000100101000000010011110"
941                     "10010110011101011000101100101111"
942                     "11101010110010001100011100110100"
943                     "11011100110110111101010000010001"
944                     "10001010000101001100001111001110"
945                     "10110011010101111000010011100001"
946                     "11101100100110101110101000010110"
947                     "11100100000000111000000111111001"
948                     "10100010111011101001110100100010"
949                     "11111111111111111111111111111111"
950                     "10101010101010101010101010101010"
951                     "11100011100010011011000101111111"
952                     "11001100001101001110011000000010"
953                     "10111011011110111100010111011101"
954                     "11101011011111101101101100000110"
955                     "10010000011010011111000000111111"
956                     "11000101110000101100110001100100"
957                     "10000010111011011111010001010011"
958                     "10110011100011001101101100110110"
959                     "10111010111101011000100010111001"
960                     "10010011101110101110010011010110"
961                     "11101011001100011011001001000001"
962                     "10001011111000001010010011110000"
963                     "11001011000110111111100011000001"
964                     "10110110011000001010011010011000"
965                     "11111111111111111111111111111111"
966                 },
967         /* 12*/ { BARCODE_DATAMATRIX, GS1_MODE, -1, -1, -1, -1, "[01]09504000059101[21]12345678p901[10]1234567p[17]141120[8200]http://www.gs1.org/demo/", 0, 32, 32, 1, "GGS Figure 4.15.1-2 (and 4.15.1-3) **NOT SAME**, uses 0-padded final TEXT triplet (as does tec-it)",
968                     "10101010101010101010101010101010"
969                     "11001111010000111101100000101001"
970                     "10001010011111001011011001000010"
971                     "10111011001001111101111101000101"
972                     "11100101000010001000011011011110"
973                     "10000101001101111010111000100101"
974                     "10010001110100101000000010011110"
975                     "10010110101101011000101100101111"
976                     "11101010000010001100011100110100"
977                     "11011100110110111101010000011001"
978                     "10001010000101001100000111001010"
979                     "10110011010101111000010011010101"
980                     "11101100100110101110101111011110"
981                     "11100100000000111000011101100111"
982                     "10100010111011101010010111001010"
983                     "11111111111111111111111111111111"
984                     "10101010101010101010101010101010"
985                     "11111011100010011000001101110111"
986                     "11010100001101101010111001101010"
987                     "10100011011110111011111010110101"
988                     "11101011011111001001000000111110"
989                     "10010000011001011101001101100011"
990                     "11000101110110001010111111110000"
991                     "10000010110011111100011111010101"
992                     "10110011011011001011010010110100"
993                     "10111010110110111011000101100001"
994                     "10010010000011101101011111110110"
995                     "11101000010110011011011101111001"
996                     "10001100011101101000101011001100"
997                     "11000001011001011111011001010001"
998                     "10110000011010101010011010011000"
999                     "11111111111111111111111111111111"
1000                 },
1001         /* 13*/ { BARCODE_DATAMATRIX, GS1_MODE, -1, -1, -1, -1, "[01]09512345678901[15]170810[21]abcde", 0, 20, 20, 1, "GGS Figure 5.6.2-1",
1002                     "10101010101010101010"
1003                     "11001111010111100111"
1004                     "10001010100101010100"
1005                     "10110111010010011001"
1006                     "11100010010101101110"
1007                     "10101100101000111101"
1008                     "11111010011000000110"
1009                     "10010011100000101101"
1010                     "10101001101011000010"
1011                     "11000110000100011111"
1012                     "10001011010001100010"
1013                     "10110000101001000011"
1014                     "11110011011001011100"
1015                     "11011101001000101011"
1016                     "11111101001000110110"
1017                     "11011100110000101111"
1018                     "11000100001111110000"
1019                     "11011111110010101101"
1020                     "10011010101001110010"
1021                     "11111111111111111111"
1022                 },
1023         /* 14*/ { BARCODE_DATAMATRIX, GS1_MODE, -1, -1, -1, -1, "[01]00012345678905[17]040115", 0, 12, 26, 1, "GGS Figure 5.6.3.1-1 (left)",
1024                     "10101010101010101010101010"
1025                     "11001000010011010100111111"
1026                     "10001001100010001111001010"
1027                     "10110111011000001001001111"
1028                     "11100010100100100010001100"
1029                     "10101100110101011101101001"
1030                     "11111000111110101001010010"
1031                     "10011111101010111001100001"
1032                     "10101110101000110000010010"
1033                     "11001101010110000111100111"
1034                     "10001001100010100010100000"
1035                     "11111111111111111111111111"
1036                 },
1037         /* 15*/ { BARCODE_DATAMATRIX, GS1_MODE, -1, -1, -1, DM_SQUARE, "[01]00012345678905[17]040115", 0, 18, 18, 1, "GGS Figure 5.6.3.1-1 (right)",
1038                     "101010101010101010"
1039                     "110010000100010101"
1040                     "100010011010111110"
1041                     "101101110001101111"
1042                     "111000100010101100"
1043                     "101011001100010001"
1044                     "111110000010101010"
1045                     "100101100110101101"
1046                     "101010101001110110"
1047                     "110011110001110011"
1048                     "100000111010111100"
1049                     "111100000000010111"
1050                     "111011010101010010"
1051                     "111111111001001011"
1052                     "100011100101010000"
1053                     "111100011101000011"
1054                     "100000101110000100"
1055                     "111111111111111111"
1056                 },
1057         /* 16*/ { BARCODE_DATAMATRIX, GS1_MODE, -1, -1, -1, -1, "[01]00012345678905[17]180401[21]ABCDEFGHIJKL12345678[91]ABCDEFGHI123456789[92]abcdefghi", 0, 32, 32, 0, "GGS Figure 5.6.3.2-3 (left) **NOT SAME** different encodation; BWIPP different encodation",
1058                     "10101010101010101010101010101010"
1059                     "11001000010111111000100110101011"
1060                     "10001001100001101100110010100010"
1061                     "10110111001101111110011001000111"
1062                     "11100010001100101100101001011110"
1063                     "10101101101011111110000000100101"
1064                     "11111010010010101101000010011110"
1065                     "10010100101111011101101100101111"
1066                     "10101000101101101111111100110100"
1067                     "11001110011000111111110000001001"
1068                     "10001010001010101101001111001110"
1069                     "11110001000000111101011100101101"
1070                     "11010001111011001000011010000010"
1071                     "11011100101001111001000111111111"
1072                     "10111100101001101111011101000010"
1073                     "11111111111111111111111111111111"
1074                     "10101010101010101010101010101010"
1075                     "11010100111011111001101111100111"
1076                     "11100111010011001011100001001010"
1077                     "11111001010111011101111000110011"
1078                     "11110000000010101101001110000110"
1079                     "11101110000001111011101000010101"
1080                     "11110101001101101101110000001000"
1081                     "10101011000111111010111001100111"
1082                     "11000101010010001100000011101010"
1083                     "11111101110111011001111011001101"
1084                     "11010111011010001000011101001010"
1085                     "10100111111110111101010111100011"
1086                     "10111011111010001001001100101110"
1087                     "10010101001110111101000101111101"
1088                     "11110110001001001010110111010110"
1089                     "11111111111111111111111111111111"
1090                 },
1091         /* 17*/ { BARCODE_DATAMATRIX, GS1_MODE, -1, -1, 30, -1, "[01]00012345678905[17]180401[21]ABCDEFGHIJKL12345678[91]abcdefghi", 0, 16, 48, 1, "GGS Figure 5.6.3.2-3 (right) **NOT SAME** different encodation",
1092                     "101010101010101010101010101010101010101010101010"
1093                     "110010000101111001000011101101100100111011001111"
1094                     "100010011000011101111100100100011000110010111100"
1095                     "101101110011011100100111100111101110111110100011"
1096                     "111000100011001100111010101000011110001110111110"
1097                     "101011011010110100101101100100010101101110101111"
1098                     "111110100100100101111000101001100001101001001010"
1099                     "100101001011111001111001110110100101101100010111"
1100                     "101010001011111100111100100010000000011110001100"
1101                     "110011100101101010111011110111110111100111011001"
1102                     "100010100011010010111100100100101000001000011110"
1103                     "111100010010101101110001100001000001010110001001"
1104                     "110100001000101000011100101010101100011001001010"
1105                     "110111001110010000011111101111000110100011011011"
1106                     "101110001010001011101010101101111111111000000100"
1107                     "111111111111111111111111111111111111111111111111"
1108                 },
1109         /* 18*/ { BARCODE_DATAMATRIX, GS1_MODE, -1, -1, -1, DM_SQUARE, "[00]395011010013000129[403]123+1021JK+0320+12[421]5281500KM", 0, 24, 24, 1, "GGS Figure 6.6.5-6 **NOT SAME** figure has unnecessary FNC1 at end of data",
1110                     "101010101010101010101010"
1111                     "110001110100011010101101"
1112                     "100010100100101000011000"
1113                     "101000110001001011100001"
1114                     "111010110110100001100010"
1115                     "100001001001010100001111"
1116                     "100110110111100000000100"
1117                     "100101110011001001100001"
1118                     "110000010110101011100010"
1119                     "110011001100011101110101"
1120                     "100000100011111010000000"
1121                     "101010110110011011000001"
1122                     "111010001001101000110000"
1123                     "110001000100011110101101"
1124                     "101011011101110000101000"
1125                     "110111000100011101011111"
1126                     "110101001010111101000010"
1127                     "110000111110111111111001"
1128                     "100101110010001010110110"
1129                     "111011010010000000100111"
1130                     "100110111101001000000100"
1131                     "101111000010010011111101"
1132                     "111001011011101100011010"
1133                     "111111111111111111111111"
1134                 },
1135         /* 19*/ { BARCODE_DATAMATRIX, GS1_MODE, -1, -1, -1, -1, "[00]093123450000000012[421]0362770[401]931234518430GR[403]MEL", 0, 24, 24, 1, "GGS Figure 6.6.5-7 **NOT SAME** different encodation",
1136                     "101010101010101010101010"
1137                     "110011100101100110110101"
1138                     "100010001001111010000100"
1139                     "101001110100001011100011"
1140                     "111000110111000001101010"
1141                     "101011010010100110000111"
1142                     "101110011000011000001100"
1143                     "100101101011010001101001"
1144                     "110000100101011011101110"
1145                     "110010010110101101110001"
1146                     "100010101101001011010000"
1147                     "101010001000100000011001"
1148                     "101000101010000010000100"
1149                     "100110101110101100010101"
1150                     "100010010000111001000000"
1151                     "101000001001111000011011"
1152                     "111110000111001110000010"
1153                     "110001110101001101101111"
1154                     "110111110101100111101110"
1155                     "110100010010101011110101"
1156                     "110011000001011110100010"
1157                     "100111010001010011000101"
1158                     "101110011001110010101010"
1159                     "111111111111111111111111"
1160                 },
1161         /* 20*/ { BARCODE_HIBC_DM, -1, -1, -1, -1, -1, "A123BJC5D6E71", 0, 16, 16, 1, "HIBC/LIC Figure 3 **NOT SAME** different encodation, same no. of codewords",
1162                     "1010101010101010"
1163                     "1110000011011011"
1164                     "1100001110001000"
1165                     "1110101011011111"
1166                     "1100110100001000"
1167                     "1011000001001001"
1168                     "1100010011110100"
1169                     "1000101001010101"
1170                     "1010110011110000"
1171                     "1011000001001111"
1172                     "1000010001001110"
1173                     "1001111110001111"
1174                     "1000110101010010"
1175                     "1101101110100101"
1176                     "1100101101000010"
1177                     "1111111111111111"
1178                 },
1179         /* 21*/ { BARCODE_HIBC_DM, -1, -1, -1, -1, -1, "A123BJC5D6E71/$$52001510X3", 0, 20, 20, 1, "HIBC/LIC Section 4.3.3 **NOT SAME** different encodation; also figure has weird CRLF after check digit",
1180                     "10101010101010101010"
1181                     "11100000100101100001"
1182                     "11000011111010101100"
1183                     "11101011100011000101"
1184                     "11001100011011000100"
1185                     "10110010010000101011"
1186                     "11000000100101100010"
1187                     "10000110010100000101"
1188                     "10111010001100001110"
1189                     "11111100101000000011"
1190                     "11110110001001111110"
1191                     "11100111110010000011"
1192                     "11000010001110101000"
1193                     "10110110001001010001"
1194                     "11100011101111010110"
1195                     "10000010110000110001"
1196                     "10000100001100100110"
1197                     "10111011000001111101"
1198                     "10110110110000011010"
1199                     "11111111111111111111"
1200                 },
1201         /* 22*/ { BARCODE_HIBC_DM, -1, -1, -1, -1, -1, "H123ABC01234567890", 0, 12, 26, 1, "HIBC/LIC Figure C2, same",
1202                     "10101010101010101010101010"
1203                     "10111011011011110101001101"
1204                     "10010110000001001100110100"
1205                     "10010001010100001011110001"
1206                     "11010101011010110100111100"
1207                     "10000101110000001110001101"
1208                     "11011011110011001011100000"
1209                     "10010001101011100010001001"
1210                     "10000001101101100110101010"
1211                     "11001111011110011111010001"
1212                     "10010010001100110000011010"
1213                     "11111111111111111111111111"
1214                 },
1215         /* 23*/ { BARCODE_HIBC_DM, -1, -1, -1, -1, DM_SQUARE, "/ACMRN123456/V200912190833", 0, 20, 20, 1, "HIBC/PAS Section 2.2 Patient Id, same",
1216                     "10101010101010101010"
1217                     "10001000010011001001"
1218                     "11100110001010110100"
1219                     "10000010111001010101"
1220                     "11011100101010111100"
1221                     "10010001110010100001"
1222                     "11011110100100100110"
1223                     "10110000100000101111"
1224                     "11111100011100001000"
1225                     "11001011011010001101"
1226                     "11001010111110110000"
1227                     "11000001111100001111"
1228                     "11110010001100000100"
1229                     "10011011100010110011"
1230                     "11111100110000111110"
1231                     "11000110111111110001"
1232                     "11000001011001100110"
1233                     "10101010010101100101"
1234                     "10000100100110010010"
1235                     "11111111111111111111"
1236                 },
1237         /* 24*/ { BARCODE_DATAMATRIX, DATA_MODE | ESCAPE_MODE, -1, -1, -1, -1, "[)>\\R06\\G+/ACMRN123456/V2009121908334\\R\\E", 0, 20, 20, 1, "HIBC/PAS 1.3-2010 Section 2.2 Patient Id Macro, same",
1238                     "10101010101010101010"
1239                     "10000000001110001111"
1240                     "11010101001010011100"
1241                     "11000000011100110101"
1242                     "11011001101011001100"
1243                     "11001100000100010001"
1244                     "11110111101011000100"
1245                     "11010010001101100001"
1246                     "11110010010110011110"
1247                     "11010010010000010011"
1248                     "10010001100010110000"
1249                     "11101100100001000111"
1250                     "11101010000011111100"
1251                     "11000010000101001011"
1252                     "11001110111110010010"
1253                     "11000010110100011101"
1254                     "11001011001001011100"
1255                     "10010110010000010101"
1256                     "11100110001010111010"
1257                     "11111111111111111111"
1258                 },
1259         /* 25*/ { BARCODE_HIBC_DM, -1, -1, -1, -1, -1, "/EO523201", 0, 14, 14, 1, "HIBC/PAS Section 2.2 Purchase Order, same",
1260                     "10101010101010"
1261                     "10011001010101"
1262                     "11101000011010"
1263                     "10001100011101"
1264                     "11101100101100"
1265                     "10100001101111"
1266                     "10010001010110"
1267                     "10000001011001"
1268                     "11100000010100"
1269                     "11011010100101"
1270                     "10111110101110"
1271                     "11110000101101"
1272                     "10010010000100"
1273                     "11111111111111"
1274                 },
1275         /* 26*/ { BARCODE_HIBC_DM, -1, -1, -1, -1, DM_SQUARE, "/EU720060FF0/O523201", 0, 18, 18, 1, "HIBC/PAS Section 2.2 2nd Purchase Order, same",
1276                     "101010101010101010"
1277                     "100110010100100001"
1278                     "111011110110010110"
1279                     "100000101110011001"
1280                     "111001001010000100"
1281                     "100000000000011101"
1282                     "100101100000101110"
1283                     "111000000111111011"
1284                     "110110111000101010"
1285                     "101001000111000111"
1286                     "100011110101010110"
1287                     "111111001101010011"
1288                     "100000000001101000"
1289                     "110100100011011111"
1290                     "111000100110101110"
1291                     "111010100101000011"
1292                     "111000010011001010"
1293                     "111111111111111111"
1294                 },
1295         /* 27*/ { BARCODE_HIBC_DM, -1, -1, -1, -1, -1, "/EU720060FF0/O523201/Z34H159/M9842431340", 0, 22, 22, 1, "HIBC/PAS Section 2.2 3rd Purchase Order (left), same",
1296                     "1010101010101010101010"
1297                     "1001100101001000000011"
1298                     "1110111101100001111010"
1299                     "1000001011101100111111"
1300                     "1110010010010000111100"
1301                     "1000000000011100000111"
1302                     "1001011010011000001110"
1303                     "1110000010001001101001"
1304                     "1101100110001010100100"
1305                     "1010010011011101000101"
1306                     "1000100011010000001110"
1307                     "1111010100101000010111"
1308                     "1000001001011011101110"
1309                     "1111110111111101100011"
1310                     "1001010110011010000000"
1311                     "1101010100110100010011"
1312                     "1001010011000110000000"
1313                     "1111001010100101110111"
1314                     "1100110010110011010000"
1315                     "1100001011100001000111"
1316                     "1010110000010001001000"
1317                     "1111111111111111111111"
1318                 },
1319         /* 28*/ { BARCODE_DATAMATRIX, DATA_MODE | ESCAPE_MODE, -1, -1, -1, -1, "[)>\\R06\\G+/EU720060FF0/O523201/Z34H159/M9842431340V\\R\\E", 0, 22, 22, 1, "HIBC/PAS Section 2.2 3rd Purchase Order (right), same",
1320                     "1010101010101010101010"
1321                     "1000000000111010011101"
1322                     "1101011100101001011100"
1323                     "1100010000000001101001"
1324                     "1111110110000111100000"
1325                     "1100100000110011001101"
1326                     "1001011001000010000110"
1327                     "1000100101110111110111"
1328                     "1100001001110111111100"
1329                     "1011111001001010001101"
1330                     "1000011000010100101010"
1331                     "1111001101110100101101"
1332                     "1110001101101100001100"
1333                     "1001010101111010110011"
1334                     "1000110111011100101010"
1335                     "1111110011011111010101"
1336                     "1101000011100111101110"
1337                     "1011000010010100110111"
1338                     "1001110101111101000000"
1339                     "1110101001011011000111"
1340                     "1001110110011101101000"
1341                     "1111111111111111111111"
1342                 },
1343         /* 29*/ { BARCODE_HIBC_DM, -1, -1, -1, -1, -1, "/E+/KN12345", 0, 16, 16, 1, "HIBC/PAS Section 2.2 Asset Tag **NOT SAME** check digit 'A' in figure is for '/KN12345', but actual data is as given here, when check digit is 'J'",
1344                     "1010101010101010"
1345                     "1001101010001111"
1346                     "1110001000101100"
1347                     "1000110100101101"
1348                     "1101000000110010"
1349                     "1000101001000001"
1350                     "1110000111001100"
1351                     "1010001101111101"
1352                     "1111101010101000"
1353                     "1101100101010001"
1354                     "1100001011010010"
1355                     "1100001111001001"
1356                     "1100010100000110"
1357                     "1010001101001101"
1358                     "1001000000000010"
1359                     "1111111111111111"
1360                 },
1361         /* 30*/ { BARCODE_HIBC_DM, -1, -1, -1, -1, -1, "/LAH123/NC903", 0, 16, 16, 1, "HIBC/PAS Section 2.2 Surgical Instrument, same",
1362                     "1010101010101010"
1363                     "1001010001010001"
1364                     "1110010100000100"
1365                     "1000001100000011"
1366                     "1110001100101000"
1367                     "1000111111100001"
1368                     "1011001110000100"
1369                     "1100110000001101"
1370                     "1000001110010000"
1371                     "1011001110111111"
1372                     "1001011010011010"
1373                     "1111000110111011"
1374                     "1010010101000100"
1375                     "1011001110110101"
1376                     "1100000101010010"
1377                     "1111111111111111"
1378                 },
1379         /* 31*/ { BARCODE_DATAMATRIX, DATA_MODE | ESCAPE_MODE, -1, -1, 7, -1, "[)>\\R06\\G18VD89536\\G1P8902A\\GS3122A02965\\R\\E", 0, 22, 22, 1, "ANSI MH10.8.17-2017 Figure 4 Macro06 **NOT SAME** 253-state randomising of padding in figure seems incorrect",
1380                     "1010101010101010101010"
1381                     "1101110000111001011011"
1382                     "1010111010001010001110"
1383                     "1100011100101001000111"
1384                     "1110011000100010001100"
1385                     "1111011100011001000101"
1386                     "1011101101000101111010"
1387                     "1100101100010101010111"
1388                     "1110101001001000001100"
1389                     "1000010001111000110101"
1390                     "1110111001110000001000"
1391                     "1010100011101000011011"
1392                     "1100010101011110111010"
1393                     "1011011000011100011111"
1394                     "1011001001000101100110"
1395                     "1000000111001100000001"
1396                     "1011110001100011000010"
1397                     "1100110100000110100111"
1398                     "1100011111110000001110"
1399                     "1100110010010010001101"
1400                     "1000001010010010110100"
1401                     "1111111111111111111111"
1402                 },
1403         /* 32*/ { BARCODE_DATAMATRIX, DATA_MODE | ESCAPE_MODE, -1, -1, -1, -1, "[)>\\R06\\G25S0614141MH80312\\R\\E", 0, 16, 16, 1, "ANSI MH10.8.17-2017 Table B.1 B7",
1404                     "1010101010101010"
1405                     "1101000010101111"
1406                     "1011100001011100"
1407                     "1011010001010101"
1408                     "1110000110111010"
1409                     "1101010011011111"
1410                     "1000010001111100"
1411                     "1101100111110101"
1412                     "1100101101001100"
1413                     "1010100000001111"
1414                     "1001100010010100"
1415                     "1001000000000101"
1416                     "1011110011000010"
1417                     "1110101111010101"
1418                     "1010101010001010"
1419                     "1111111111111111"
1420                 },
1421         /* 33*/ { BARCODE_DATAMATRIX, DATA_MODE | ESCAPE_MODE, -1, -1, -1, -1, "[)>\\R05\\G80040614141MH80312\\R\\E", 0, 16, 16, 1, "ANSI MH10.8.17-2017 Table B.1 B8",
1422                     "1010101010101010"
1423                     "1111100010001111"
1424                     "1010100001100100"
1425                     "1010010001011001"
1426                     "1110000110000110"
1427                     "1001010011101111"
1428                     "1000010010001100"
1429                     "1101100111110101"
1430                     "1100101000101100"
1431                     "1010100001010011"
1432                     "1001001100111100"
1433                     "1001110010011101"
1434                     "1001011000010100"
1435                     "1100110000010101"
1436                     "1010000010101010"
1437                     "1111111111111111"
1438                 },
1439         /* 34*/ { BARCODE_DATAMATRIX, DATA_MODE, 3, -1, -1, -1, "\101\300", 0, 12, 12, 1, "AÀ",
1440                     "101010101010"
1441                     "100010101111"
1442                     "100001011110"
1443                     "110000010001"
1444                     "101100110000"
1445                     "110010100111"
1446                     "101011011100"
1447                     "110100111101"
1448                     "101100110100"
1449                     "101011100101"
1450                     "100011011010"
1451                     "111111111111"
1452                 },
1453         /* 35*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 26, -1, -1, -1, "AÀ", 0, 14, 14, 1, "AÀ",
1454                     "10101010101010"
1455                     "10001010100001"
1456                     "10110101100100"
1457                     "10110001000101"
1458                     "10111000100010"
1459                     "11101011110011"
1460                     "10011100001100"
1461                     "10001100101111"
1462                     "10110110111110"
1463                     "10000111010001"
1464                     "10000001111000"
1465                     "11110100110001"
1466                     "11000110001100"
1467                     "11111111111111"
1468                 },
1469         /* 36*/ { BARCODE_DATAMATRIX, UNICODE_MODE, -1, -1, -1, DM_SQUARE, "abcdefgh+", 0, 16, 16, 1, "TEX last_shift 2, symbols_left 1, process_p 1",
1470                     "1010101010101010"
1471                     "1010011011101001"
1472                     "1011001010010010"
1473                     "1001100100110011"
1474                     "1111100010101100"
1475                     "1111111011110111"
1476                     "1111011111111100"
1477                     "1011001100001111"
1478                     "1000000101011000"
1479                     "1000011011000111"
1480                     "1101011100110100"
1481                     "1100100100110101"
1482                     "1000000111001000"
1483                     "1111111010001101"
1484                     "1101110101001010"
1485                     "1111111111111111"
1486                 },
1487         /* 37*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, -1, -1, -1, "\200\200\200\200\200\200\200", 0, 8, 32, 1, "7 BASE256s, 1 pad",
1488                     "10101010101010101010101010101010"
1489                     "10000101000011011000110100100001"
1490                     "11100111110101001011101110100010"
1491                     "10111011010100111110010110001011"
1492                     "11001000110001101000001111000010"
1493                     "11000010000001111000100101001011"
1494                     "11010000111100001010011101100100"
1495                     "11111111111111111111111111111111"
1496                 },
1497         /* 38*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, -1, -1, -1, "\200\200\200\200\200\200\200\200", 0, 8, 32, 1, "8 BASE256s, no padding",
1498                     "10101010101010101010101010101010"
1499                     "10000101000011011111001101000001"
1500                     "11010111110101001001011001100010"
1501                     "11001011010111111010001100100011"
1502                     "11001000110000101011101100011010"
1503                     "11000010000001111000010010110011"
1504                     "11010000110010001001010001111000"
1505                     "11111111111111111111111111111111"
1506                 },
1507         /* 39*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, -1, -1, DM_SQUARE, "\200\200\200\200\200\200\200\200\200\200", 0, 16, 16, 1, "8 BASE256s, square, no padding",
1508                     "1010101010101010"
1509                     "1000010100001101"
1510                     "1101011111101110"
1511                     "1100101101000101"
1512                     "1000100000110000"
1513                     "1100011100010111"
1514                     "1001010100101100"
1515                     "1110111010010111"
1516                     "1000111000010110"
1517                     "1110001101001001"
1518                     "1000110011010000"
1519                     "1011110101001101"
1520                     "1000000010101100"
1521                     "1001001000100101"
1522                     "1111000011111010"
1523                     "1111111111111111"
1524                 },
1525         /* 40*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, -1, -1, -1, "\200\200\200\200\200\200\200\200\200", 0, 16, 16, 1, "9 BASE256s, 1 pad",
1526                     "1010101010101010"
1527                     "1000010101001101"
1528                     "1110011111000010"
1529                     "1101101101010101"
1530                     "1000100000001010"
1531                     "1100011001101111"
1532                     "1001010111100100"
1533                     "1110111001100111"
1534                     "1000111101000010"
1535                     "1110001101001101"
1536                     "1000011111001000"
1537                     "1011001101010111"
1538                     "1010101000000000"
1539                     "1011001001011101"
1540                     "1100000011011010"
1541                     "1111111111111111"
1542                 },
1543         /* 41*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, -1, -1, -1, "\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200", 0, 22, 22, 1, "22 BASE256s, 6 pads",
1544                     "1010101010101010101010"
1545                     "1010010100011100010101"
1546                     "1000011110111110001100"
1547                     "1010101100010111000101"
1548                     "1000100000010100110110"
1549                     "1100011100101000100101"
1550                     "1001010100111101110100"
1551                     "1110111000010101110111"
1552                     "1000111010101000101100"
1553                     "1110000111111001100111"
1554                     "1000000111110100001010"
1555                     "1011110011101111101001"
1556                     "1111000101101110010000"
1557                     "1100011000111101111001"
1558                     "1111001010100110101110"
1559                     "1111000100111010000001"
1560                     "1110000100011110101100"
1561                     "1100010001111011110101"
1562                     "1000101001101111011100"
1563                     "1111110010000111001001"
1564                     "1111101000110111010100"
1565                     "1111111111111111111111"
1566                 },
1567         /* 42*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, -1, -1, DM_DMRE, "\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200", 0, 8, 64, 1, "22 BASE256s, no padding",
1568                     "1010101010101010101010101010101010101010101010101010101010101010"
1569                     "1000010101100011101010101011101111110100100110011100010011010111"
1570                     "1101011110001010110000001110001010001011010111001010101101100000"
1571                     "1100101000110001110100000001100110010100111101111110000010011111"
1572                     "1000100101001000110110101110011011110110111010101110010111001100"
1573                     "1100001101011011111101111000110110110101110110111111011010011111"
1574                     "1101000011001010111101101101110010111100111101001010010011001000"
1575                     "1111111111111111111111111111111111111111111111111111111111111111"
1576                 },
1577         /* 43*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, -1, -1, -1, "\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\061\062\063\064\065\066", 0, 64, 64, 1, "249 BASE256s + 6 ASCII (3 double-digits)",
1578                     "1010101010101010101010101010101010101010101010101010101010101010"
1579                     "1000010100011101100000010111100110100010110111011011111010000001"
1580                     "1100011110111110100110111101111010101101000010001101001011001100"
1581                     "1101101100010111110011110010101111111101101111111000111010011111"
1582                     "1000100000010100101110100100010011101111110111101111000010011100"
1583                     "1100011100101001111000111100010110100000001000111000010111011111"
1584                     "1001010100111000110001000111000010000110010001101001010100110110"
1585                     "1110111000001001100110011110010110100111101011111101110000100001"
1586                     "1000111010111010101111110111010011110010010000101011111100100100"
1587                     "1110000111101011110100011110010111101001010010011010011100101111"
1588                     "1000000110110110101100000110101010111110101110001001100111001010"
1589                     "1011110011010011100100010101110110010111100011011011000101010001"
1590                     "1111000000110100100110001000001010110000101101001000110010011100"
1591                     "1100010111100011111010011010011110001011111110011001011110110101"
1592                     "1111011001000110110011110110010010011101001110101110100000100000"
1593                     "1111111111111111111111111111111111111111111111111111111111111111"
1594                     "1010101010101010101010101010101010101010101010101010101010101010"
1595                     "1110001011011001101110110011001111000100100101111110101111000101"
1596                     "1110110010110010111000100100011010010000000010101111111101011000"
1597                     "1101000010101101110111100001111110100100111100111100010010010011"
1598                     "1000100110010100110000111011001011101101110101001001100110110100"
1599                     "1111100101011001100001011010011111100110001111111010101010010111"
1600                     "1000001111111110110101011001100011101101000010101100111010001110"
1601                     "1111000000111101101111010011010111000001100001111110000100000001"
1602                     "1111010010101010100000011000001010001110111110101110000001111010"
1603                     "1011001001000111100000011010011110111101001101011110111011000001"
1604                     "1000010001100010101101001011010011100111000010101001111100101110"
1605                     "1111011010100001111100001110110111001001101010111111110010101101"
1606                     "1110100001010010100001011000100010001010100100001101110101001100"
1607                     "1111111110101101111011010111110111101000001011011110100000000011"
1608                     "1001110010110010111011001000101011011110110101101001001010101100"
1609                     "1111111111111111111111111111111111111111111111111111111111111111"
1610                     "1010101010101010101010101010101010101010101010101010101010101010"
1611                     "1101000101000011110110000010110111101010011000011011010101000001"
1612                     "1101111101111010110111110101100011001010001010101100011011100010"
1613                     "1011011101111111111111010000101111011110000101011000011000100011"
1614                     "1011011110000100101000101100100011100101110101001110000101001100"
1615                     "1000101100001001110001110111011111000100111010111111011110001001"
1616                     "1010100101101000110000011111110011001100101111101000111000101100"
1617                     "1100001101001011101001110000100110000100011001011100010001000011"
1618                     "1100000011000000110100100100111011000111110110001101011110011110"
1619                     "1001100111111111101100110100011110111000010011111000001000111111"
1620                     "1010100111101010101001000101100011100100011101001000011100011010"
1621                     "1100100101001111101001111111011111100110000101111001111100010011"
1622                     "1111100101100000100001110001101011001111010110101000001110010100"
1623                     "1110111011000011110010010010111111001001010110011011010111010011"
1624                     "1011110001011110101100100110011010111110100001001010011101010110"
1625                     "1111111111111111111111111111111111111111111111111111111111111111"
1626                     "1010101010101010101010101010101010101010101010101010101010101010"
1627                     "1110111000110011111011100100010111000011100101011011101100010011"
1628                     "1110110010010110100100001110111010010110110001101111010100110000"
1629                     "1001001101100001111011100010000110011101011001111010001001111001"
1630                     "1010011111000110111100001110010010011010011010101000100111101000"
1631                     "1011111111010001100011010010011111110100000001111000101111110011"
1632                     "1011011011010000111100000011000010100000011010001100111100001100"
1633                     "1010100010001111100111010000110110101100110010011011101100010101"
1634                     "1010001000011110101101010000111011011001111110001100011011110010"
1635                     "1100100011011111101101110100101111011111010101011000011100100101"
1636                     "1110001110100110101011000111000011111100100000001001111000001110"
1637                     "1111011111010111111111110100001110110110001101011111010010010111"
1638                     "1111110000011000100110001110001010111110000000001010111101111100"
1639                     "1010101010110001100001110010110111111100001000011001001011101101"
1640                     "1000001101010100110010010110101010000000001010101100100011101010"
1641                     "1111111111111111111111111111111111111111111111111111111111111111"
1642                 },
1643         /* 44*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, -1, -1, -1, "\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\061\062\063\064\065\066", 0, 64, 64, 1, "250 BASE256s + 6 ASCII (3 double-digits)",
1644                     "1010101010101010101010101010101010101010101010101010101010101010"
1645                     "1000010100011101100000010111100110100010110111011011111010000001"
1646                     "1100011110111110100110111101111010101101000010001101001011001100"
1647                     "1110101100010111110011110010101111111101101111111000111010011111"
1648                     "1000100000010100101110100100010011101111110111101111000010011100"
1649                     "1100011100101001111000111100010110100000001000111000010111011111"
1650                     "1001010100111000110001000111000010000110010001101001010100110110"
1651                     "1110111000001001100110011110010110100111101011111101110000100001"
1652                     "1000111010111010101111110111010011110010010000101011111100100100"
1653                     "1110000111101011110100011110010111101001010010011010011100101111"
1654                     "1000000110110110101100000110101010111110101110001001100111001010"
1655                     "1011110011010011100100010101110110010111100011011011000101010001"
1656                     "1111000000110100100110001000001010110000101101001000110010011100"
1657                     "1100010111100011111010011010011110001011111110011001011110111101"
1658                     "1111011001000110110011110110010010011101001110101110100000101100"
1659                     "1111111111111111111111111111111111111111111111111111111111111111"
1660                     "1010101010101010101010101010101010101010101010101010101010101010"
1661                     "1110001011011001101110110011001111000100100101111110101111100101"
1662                     "1110110010110010111000100100011010010000000010101111111100111100"
1663                     "1101000010101101110111100001111110100100111100111100010100100111"
1664                     "1000100110010100110000111011001011101101110101001001100010111100"
1665                     "1111100101011001100001011010011111100110001111111010111110011111"
1666                     "1000001111111110110101011001100011101101000010101100111001110110"
1667                     "1111000000111101101111010011010111000001100001111110011100001001"
1668                     "1111010010101010100000011000001010001110111110101111111000000110"
1669                     "1011001001000111100000011010011110111101001101011101101101000001"
1670                     "1000010001100010101101001011010011100111000010101100000111001110"
1671                     "1111011010100001111100001110110111001001101010111000001101110001"
1672                     "1110100001010010100001011000100010001010110100101111101011111010"
1673                     "1111111110101101111011010111110111101000000011011100011010110011"
1674                     "1001110010110010111011001000101011011101000101001101001000111100"
1675                     "1111111111111111111111111111111111111111111111111111111111111111"
1676                     "1010101010101010101010101010101010101010101010101010101010101010"
1677                     "1101000101000011110110000010110111101001011000111010110010100001"
1678                     "1101111101111010110111110101100011001010101001101000101001101010"
1679                     "1011011101111111111111010000101111010010000101111010110001110011"
1680                     "1011011110000100101000101100100011101101110110001000100001011000"
1681                     "1000101100001001110001110111011111100100110001111010001000000011"
1682                     "1010100101101000110000011111111010100100111100001000101101101010"
1683                     "1100001101001011101001110000101111100100010010111110010000001011"
1684                     "1100000011000000110100100100100011000110000010101000010110110110"
1685                     "1001100111111111101100110100000110111000011000011100001111101111"
1686                     "1010100111101010101001000101001011100101100111001001001111010110"
1687                     "1100100101001111101001111111011111100001111110011101111100010111"
1688                     "1111100101100000100001110001101011001010100100101100010000010100"
1689                     "1110111011000011110010010010111111100100100001111100111010001101"
1690                     "1011110001011110101100100110010010101001010100101101000001110010"
1691                     "1111111111111111111111111111111111111111111111111111111111111111"
1692                     "1010101010101010101010101010101010101010101010101010101010101010"
1693                     "1110111000110011111011100100011111101101100100111111000011010011"
1694                     "1110110010010110100100001110010011101110010000001010101110001000"
1695                     "1001001101100001111011100010101111000101010111011100100110111001"
1696                     "1010011111000110111100001101100010111100111111101001010010101100"
1697                     "1011111111010001100011010010100111101001000010111010100101101111"
1698                     "1011011011010000111100001110110011011110010110101010011100011000"
1699                     "1010100010001111100111010011101110110010101101111101010110000111"
1700                     "1010001000011110101101100000011010001010000001001110110101111010"
1701                     "1100100011011111101101111000111110011111110000111101110101101101"
1702                     "1110001110100110101001011010011010100101010101101100001001011110"
1703                     "1111011111010111111101011100110110100100010110011100011100000111"
1704                     "1111110000011000101010001010011011001100101101101000111111001000"
1705                     "1011101010110001101111110010010111001010000001111001100011111101"
1706                     "1000001101010100111000010100101010000010001011101100100111101010"
1707                     "1111111111111111111111111111111111111111111111111111111111111111"
1708                 },
1709         /* 45*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, -1, -1, -1, "\101\102\103\104\105\106\107\110\111\112\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\061\062\063\064\065\066", 0, 64, 64, 1, "10 ASCII + 251 BASE256s + 6 ASCII",
1710                     "1010101010101010101010101010101010101010101010101010101010101010"
1711                     "1010011010011101100000010111100110100010110111011011111010000001"
1712                     "1011001010111110100110111101111010101101000010001101001011001100"
1713                     "1001100010010111110011110010101111111101101111111000111010011111"
1714                     "1010100001010100101110100100010011101111110111101111000010011100"
1715                     "1000001110101001111000111100010110100000001000111000010111011111"
1716                     "1100011000111000110001000111000010000110010001101001010100110100"
1717                     "1111100000001001100110011110010110100111101011111101110000100001"
1718                     "1110101010111010101111110111010011110010010000101011111100100110"
1719                     "1110100111101011110100011110010111101001010010011010011100101111"
1720                     "1100000110110110101100000110101010111110101110001001100111001010"
1721                     "1111110011010011100100010101110110010111100011011011000101010111"
1722                     "1111000000110100100110001000001010110000101101001000110010011110"
1723                     "1000010111100011111010011010011110001011111110011001011110100111"
1724                     "1111011001000110110011110110010010011101001110101110100000101000"
1725                     "1111111111111111111111111111111111111111111111111111111111111111"
1726                     "1010101010101010101010101010101010101010101010101010101010101010"
1727                     "1110001011011001101110110011001111000100100101111110101111000001"
1728                     "1110110010110010111000100100011010010000000010101111111100010100"
1729                     "1101000010101101110111100001111110100100111100111100010100011011"
1730                     "1000100110010100110000111011001011101101110101001001100011101110"
1731                     "1111100101011001100001011010011111100110001111111010110111111111"
1732                     "1000001111111110110101011001100011101101000010101100110011000110"
1733                     "1111000000111101101111010011010111000001100001111110000000101001"
1734                     "1111010010101010100000011000001010001110111110101111000001010010"
1735                     "1011001001000111100000011010011110111101001101011011010101100001"
1736                     "1000010001100010101101001011010011100111000010101000000000111110"
1737                     "1111011010100001111100001110110111001001101010111000100011100111"
1738                     "1110100001010010100001011000100010001010110100101010000001111100"
1739                     "1111111110101101111011010111110111101000000011111010000111001011"
1740                     "1001110010110010111011001000101011011101000101001100110000010100"
1741                     "1111111111111111111111111111111111111111111111111111111111111111"
1742                     "1010101010101010101010101010101010101010101010101010101010101010"
1743                     "1101000101000011110110000010110111101001011000111100010011010001"
1744                     "1101111101111010110111110101100011001110101011001010000000010110"
1745                     "1011011101111111111111010000101111011010000100111110111001010011"
1746                     "1011011110000100101000101100100011100111110011001111110100000000"
1747                     "1000101100001001110001110111011111000100110101111011010110000011"
1748                     "1010100101101000110000011111110010001100110000001001101010011010"
1749                     "1100001101001011101001110000100111000100100111111111011000011011"
1750                     "1100000011000000110100100100101011000111011101101001000000110110"
1751                     "1001100111111111101100110100101110111010010111011011011001111111"
1752                     "1010100111101010101001000101100011101100010100001111010110111110"
1753                     "1100100101001111101001111100011111101100001000111010011110100111"
1754                     "1111100101100000100001111100101011011100011111101010000100001100"
1755                     "1110111011000011110010010100111111001101110101011011101100110001"
1756                     "1011110001011110101100011110011011000000100000001111100001111110"
1757                     "1111111111111111111111111111111111111111111111111111111111111111"
1758                     "1010101010101010101010101010101010101010101010101010101010101010"
1759                     "1110111000110011111011101100010111001111000011011001011111010011"
1760                     "1110110010010110100100100110001010110011000011101001101000101000"
1761                     "1001001101100001111000000010010110101111101001011010001101010001"
1762                     "1010011111000110111001001100001010000000011111101000001111111100"
1763                     "1011111111010001100111010000111110111110101101111110101011100011"
1764                     "1011011011010000100000000000001011001011001110001000100100100000"
1765                     "1010100010001111101111011011100110010010101001111111100001101111"
1766                     "1010001000011010101101100001111010010101101111001101000111100100"
1767                     "1100100011010011101101101000000111010011100001011011101110111101"
1768                     "1110001110101100101010000000001011111110110100101001000111100110"
1769                     "1111011111100101111110011110011110100000010010011001010011111111"
1770                     "1111110010100000101110000101001011111010000011001100110100101100"
1771                     "1011101011110001110011111110010111100110000000011001001101100001"
1772                     "1001010101010100111010010100101010000010001011001100101011101010"
1773                     "1111111111111111111111111111111111111111111111111111111111111111"
1774                 },
1775         /* 46*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, -1, -1, -1, "\101\102\103\104\105\106\107\110\111\112\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\061\062\063\064\065\066\067\070\071\060\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\061\062\063\064\065\066", 0, 88, 88, 1, "10 ASCII + 252 BASE256s + 10 ASCII + 253 BASE256 + 6 ASCII",
1776                     "1010101010101010101010101010101010101010101010101010101010101010101010101010101010101010"
1777                     "1010011010011100000001110111100010001011011111001111101000000110011111111000100110101111"
1778                     "1011001010111110011010111101111010110100001010010100101100110010101011111110101001100000"
1779                     "1001100010010111001111110010101111110110111111100011101001100100011100101011100101001111"
1780                     "1010100001010100111010100100010110111111011011111100001001111100101011000101111000110100"
1781                     "1000001110101001100011111100010010000000100110100001011101011010111111000101011110001111"
1782                     "1100011000111001000100100111000000011001000011100101010011011101001001110001001001110000"
1783                     "1111100100001000011001111110010010011110101111110111000000010000011111100000101111100001"
1784                     "1110101010111010111110110111010111001001000010101111110010010001101101110001010010011110"
1785                     "1110100111101011010001111110010110100101001110001001101011010100011111101100001000111101"
1786                     "1100000110110110110000100110101011111010111010000110011111101100001001111011110110101100"
1787                     "1111110011010010010001110101110001011110001111001101110110100100011101111010010101001111"
1788                     "1111000000110100011000101000001011000010110011000011011001100110001011000110010000100110"
1789                     "1000010111100011101001111010011000101111111110000010000000111010011010011110000010000111"
1790                     "1111011001000111001110110110010001110100111010111010000011110011101001000010011000110100"
1791                     "1110001011011000111011110011001100010010010111110010010110001111011011001010101101010101"
1792                     "1110110010110011100010100100011001000000001010111110110100111001101010111110011110101100"
1793                     "1101000010101101011111100001111010010011110110010110101011010001111010011100001111100001"
1794                     "1000100110010101000010111011001110110111010011000110000101010100001010101111100111010110"
1795                     "1111100101011000000101111010011110011000110111110001010110010000111110111110001110011111"
1796                     "1000001111111111010100111001100110110100001010110011111111100111001100010101010111010110"
1797                     "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
1798                     "1010101010101010101010101010101010101010101010101010101010101010101010101010101010101010"
1799                     "1111000000111100111101110011010100000111101110010000001111101101011100011101100011000001"
1800                     "1111010010101010000000111000001000111011110011111100101011100100001110001110101000011010"
1801                     "1011001001000110000001111010011011110011001110110010010011011000011100001000010010101101"
1802                     "1000010001100010110100101011010110011100001010000100011011111010101110101111000001010010"
1803                     "1111011010100001110001101110110100111110000111110110111111111101111010010011011011011001"
1804                     "1110100001010010000100111000100000101010010011101000000110011001001001110010111100111010"
1805                     "1111111110101101101101110111110110000101101111111110001001011001111111010011010100101011"
1806                     "1001110010110011101100101000101101110000010010011101100000111011001000000110100011000100"
1807                     "1101000101000011011001100010110100111011100111010101001000101100111100010010100111001001"
1808                     "1101111101111011011110110101100100111010011011011011101100110111001111111000010011111010"
1809                     "1011011101111111111101110000100110000001001110100111111111011001011010100101111100001011"
1810                     "1011011110000100100010101100101010011110010010100101100001110111001001010111001010000000"
1811                     "1000101100001001000111110110100000110110111110100101000000111101011011101000010010011011"
1812                     "1010100101101001000000111111111011010000110011101100111010001001001000101111110001101010"
1813                     "1100001101001010100111110110101000000101011110111001001000101110011101100011110100001011"
1814                     "1100000011000001010010100100101000011010001011011110110011100010001010111111100011110110"
1815                     "1001100111111110110011101101111010111010111110111001011001010010011001011111111001100111"
1816                     "1010100111101010100100100111010110000100010010100000101001010011101001100100000000001010"
1817                     "1100100101001110100101111101011101111100000111001111111001111110011100101010000001010011"
1818                     "1111100101100000000110111100010011111110100011011001010011111100101010100100101010010000"
1819                     "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
1820                     "1010101010101010101010101010101010101010101010101010101010101010101010101010101010101010"
1821                     "1110111011000011000011100110100001000011101111100100110001010001011000011011100111110001"
1822                     "1011110001011110110010111000010110101100000010111111100001100111101100111000101001100100"
1823                     "1110111000110011010011100100101011010111101111001001110010101000111110100000111110011011"
1824                     "1110110010010110010110111110000100011110100010011011010001100111101101000010111011100000"
1825                     "1001001101100111110101100101000110000101011110111011100001110110111001101000010000100001"
1826                     "1010011111000111111000101110000110010111100010010011100110100111001001010110010011000100"
1827                     "1011111111001001110101111101001010101000010111011000011111100111011000010010010100110111"
1828                     "1011011011010000010000110011001111000011100010000000001110111001101100010000011000110000"
1829                     "1010100011101100011011101011110011110011100110001111000000101000011110010010011010111011"
1830                     "1010001000011010111010110110001011000000110011011100000000100010001001100000110110001110"
1831                     "1100100001100110110001100001110101111011110111010000001110000011111000111000000000011101"
1832                     "1110001111000110110100101110001001101101101011011100011100011010001110000101100100100110"
1833                     "1111010000110111100101110001101010000100000110011110010110010001111011000100000111100111"
1834                     "1111110011000001111100101110001011010010001011101111011001001111001011100011001001110100"
1835                     "1010001100000001101001110011111010100010101111001101101010101110011011011111110001001001"
1836                     "1000010111011010100000100111100011110101100011111000111101011110101000010110011111001110"
1837                     "1011010111001100001111100100010111111100001110101000110101100001011111010100111000110101"
1838                     "1110110110110001011010111001011010001000011011010100110101001111101001100111110001010100"
1839                     "1111110001100101100011101101110100111110000111000000000000101001011111111011011110000111"
1840                     "1010001001101110110100110011000100001001011010111110010111000110001101010100100000101100"
1841                     "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
1842                     "1010101010101010101010101010101010101010101010101010101010101010101010101010101010101010"
1843                     "1000001000101010111111100010100100011111100111111001010000110111111110011011011110111011"
1844                     "1011111001101000001110100010111101010001001011011011100111011000101110111011010100011000"
1845                     "1111101000010101010011110011100100001101001110001011010000001000011000010111011000100001"
1846                     "1000111101011010101100110110101011111111110010011100110000100001101000110110001000101010"
1847                     "1011010110000010111111100101011010000011000111111101010000001001111101010101000111000101"
1848                     "1000010000110101101110110100000110110000101011001010111110101001101000010100010001000010"
1849                     "1111101100100000100111101110011111010101011110111101101010000000011001001011011011110101"
1850                     "1000101000110000000100100101001000011010011010101101100111101101101100111010010010011110"
1851                     "1000011101010100111111101011010111101000100110001100101100101000011010110111010010011011"
1852                     "1001110101110101001010101010100110010011100011101110011000110100001101000101101101110110"
1853                     "1110111110100110010111110110101110010100101111010011011000001100011010110111000001001001"
1854                     "1010110001101110011000100101010001110100011010110110100111110101001100000110010011001000"
1855                     "1110010001000010100001100001100011000001011111111010001110100010011100111001100100100001"
1856                     "1000100010000000110110110010011101011111000010001010111110101001101010000011000101010000"
1857                     "1100010110111111001001110000010001011010100110010111110001000011111100101101010000001001"
1858                     "1100111101111100100110111110111100111011011011110010110000001001101011011100110100100100"
1859                     "1010101101010111011011110011001001010101101111111011110110101011011001010111101011000111"
1860                     "1110001001100111001100101100111100010100100011110101011111010101001000101001111001111010"
1861                     "1001111110110111000111110010110001110001110111100111011110000010111010010101111110111001"
1862                     "1101010100110101110000110100001000100000101010010010101110100111001111100010001001001100"
1863                     "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
1864                 },
1865         /* 47*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, -1, -1, -1, "\101\102\103\104\105\106\107\110\111\112\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\061\062\063\064\065\066\067\070\071\060\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200", 0, 88, 88, 1, "10 ASCII + 252 BASE256s + 10 ASCII + 304 BASE256, no padding",
1866                     "1010101010101010101010101010101010101010101010101010101010101010101010101010101010101010"
1867                     "1010011010011100000001110111100010001011011111001111101000000110011111111000100110101111"
1868                     "1011001010111110011010111101111010110100001010010100101100110010101011111110101001100000"
1869                     "1001100010010111001111110010101111110110111111100011101001100100011100101011100101001111"
1870                     "1010100001010100111010100100010110111111011011111100001001111100101011000101111000110100"
1871                     "1000001110101001100011111100010010000000100110100001011101011010111111000101011110001111"
1872                     "1100011000111001000100100111000000011001000011100101010011011101001001110001001001110000"
1873                     "1111100100001000011001111110010010011110101111110111000000010000011111100000101111100001"
1874                     "1110101010111010111110110111010111001001000010101111110010010001101101110001010010011110"
1875                     "1110100111101011010001111110010110100101001110001001101011010100011111101100001000111101"
1876                     "1100000110110110110000100110101011111010111010000110011111101100001001111011110110101100"
1877                     "1111110011010010010001110101110001011110001111001101110110100100011101111010010101001111"
1878                     "1111000000110100011000101000001011000010110011000011011001100110001011000110010000100110"
1879                     "1000010111100011101001111010011000101111111110000010000000111010011010011110000010010111"
1880                     "1111011001000111001110110110010001110100111010111010000011110011101001000010011000111000"
1881                     "1110001011011000111011110011001100010010010111110010010110001111011011001010101100001001"
1882                     "1110110010110011100010100100011001000000001010111110110100111001101010111110011110110100"
1883                     "1101000010101101011111100001111010010011110110010110101011010001111010011100001101000001"
1884                     "1000100110010101000010111011001110110111010011000110000101010100001010101111100000111110"
1885                     "1111100101011000000101111010011110011000110111110001010110010000111110111110011111011111"
1886                     "1000001111111111010100111001100110110100001010110011111111100111001100010101011001101110"
1887                     "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
1888                     "1010101010101010101010101010101010101010101010101010101010101010101010101010101010101010"
1889                     "1111000000111100111101110011010100000111101110010000001111101101011100011100100111001001"
1890                     "1111010010101010000000111000001000111011110011111100101011100100001110001110110001001110"
1891                     "1011001001000110000001111010011011110011001110110010010011011000011100001110110011111001"
1892                     "1000010001100010110100101011010110011100001010000100011011111010101110101000100001100110"
1893                     "1111011010100001110001101110110100111110000111110110111111111101111010000110011011011111"
1894                     "1110100001010010000100111000100000101010010011101000000110011001001001111000110000001010"
1895                     "1111111110101101101101110111110110000101101111111110001001011001111111000011011101111011"
1896                     "1001110010110011101100101000101101110000010010011101100000111011001000111101111101001100"
1897                     "1101000101000011011001100010110100111011100111010101001000101100111000110010101011010001"
1898                     "1101111101111011011110110101100100111010011011011011101100110111001000010011100100011010"
1899                     "1011011101111111111101110000100110000001001110100111111111011000111101011111111010010111"
1900                     "1011011110000100100010101100101010011110010010100101100001110111001111110101011010110000"
1901                     "1000101100001001000111110110100000110110111110100101000000111111111111001001000011000101"
1902                     "1010100101101001000000111111111011010000110011101100111010001011101010000101111001101100"
1903                     "1100001101001010100111110110101000000101011110111001001000101010011011001011001111101011"
1904                     "1100000011000001010010100100101000011010001011011110110011100000001101100001100011010110"
1905                     "1001100111111110110011101101111010111010111110111001011001010001111101011110100111001111"
1906                     "1010100111101010100100100111010110000100010010100000101001011011101000011100010100100110"
1907                     "1100100101001110100101111101011101111100000111001111111001111101011101010000100010110011"
1908                     "1111100101100000000110111100010011111110100011011001010011011011101100000001010000110000"
1909                     "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
1910                     "1010101010101010101010101010101010101010101010101010101010101010101010101010101010101010"
1911                     "1110111011000011000011100110100001000011101111100100110001001110011000000001000001111101"
1912                     "1011110001011110110010111000010110101100000010111111100011010000001100111010011101011110"
1913                     "1110111000110011010011100100101011010111101111001001110010000000011111110111111010000011"
1914                     "1110110010010110010110111110000100011110100010011011010100011000101110110101100000000000"
1915                     "1001001101100111110101100101000110000101011110111011101100001010011110111100001101010001"
1916                     "1010011111000111001000101110000110010111100010010011001010101100001010000101101001101000"
1917                     "1011111111001001100101111101001010101000010111011000001001000001111101001011000001000011"
1918                     "1011011011010000101000110011001111000011100010000010011011111110001000111101000110010100"
1919                     "1010100011101100011011101011110011110011100110001110000000111111111011101011111111101111"
1920                     "1010001000011010111010110110001011000000110011010000101011000001001010100000101011100010"
1921                     "1100100001100110110001100001110101111011110111011101100000010010011001011001111001001101"
1922                     "1110001111000110110100101110001001101101101011111101111000110001001001100000100000001110"
1923                     "1111010000110111100101110001101010000100000110001101010110100010111100100101011100011111"
1924                     "1111110011000001111100101110001011010010000011100001110011100110001000000101100010100100"
1925                     "1010001100000001101001110011111010100010101110010111111000110101011100110010101111100001"
1926                     "1000010111011010100000100111100011110101110010110110000110001100101101001111000001111010"
1927                     "1011010111001100001111100100010111111100110110100000011010110110111110100011100110010011"
1928                     "1110110110110001011010111001011010001010111010001010101001110100101010110101100011110000"
1929                     "1111110001100101100011101101110100111100101110111011010111011110111010101011110011010111"
1930                     "1010001001101110110100110011000100000010110010011110011101101001001101001001010011000100"
1931                     "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
1932                     "1010101010101010101010101010101010101010101010101010101010101010101010101010101010101010"
1933                     "1000001000101010111111100010100100011001111111000011111100010010111110000100000100101011"
1934                     "1011111001101000001110100010111101100101011011010001000100111101101100101010001011101100"
1935                     "1111101000010101010011110011100100111000101110000011000001010011111011000110101100110101"
1936                     "1000111101011010101100110110101001000010101010001010111111110101001010001001001010010110"
1937                     "1011010110000010111111100101011000101001010110001101010110100000111110110000111101110001"
1938                     "1000010000110101101110110100001110111101001011010010000111011111101111011101001000100110"
1939                     "1111101100100000100111101110011001101110101110100001011100101001011110010100111111100101"
1940                     "1000101000110000000100100101010111001110010010011011001010001000101000100100100101001110"
1941                     "1000011101010100111111101011111011101010110111111110000000111001111100011101100110100011"
1942                     "1001110101110101001010101000000010000010110011100010010000111011101111111100101110011110"
1943                     "1110111110100110010111110100110000100101000110001000000010101101111010000001011110010001"
1944                     "1010110001101110011000101011011111001111011010011011011000010100001011100101011010111100"
1945                     "1110010001000010100001101000001111111101000110101000001000010010011001110111101011100011"
1946                     "1000100010000000110100101001001001000100110010110000000001011100001001100001000110001110"
1947                     "1100010110111111001011111101011101110010100110111111010100001010111100011011100011100001"
1948                     "1100111101111100101100101010011100111101001010011110000111110011101100100000001011011100"
1949                     "1010101101010111010011111000011100100011011110011011010001011000111010101000010111010111"
1950                     "1110001001100111011110111101000101001011000011100101001111000111101100100000000000011110"
1951                     "1001111110110111100111101011110100110001000110000111011111101000111100001101011010100001"
1952                     "1101010100110101100000110110001000001000101011110010001110100101001111000010001111001100"
1953                     "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
1954                 },
1955         /* 48*/ { BARCODE_DATAMATRIX, -1, -1, -1, -1, -1, "@@@@@@@@@_", 0, 8, 32, 0, "EDI; BWIPP uses different encodation, switching to ASC for last 2 chars, not last 3 like Zint",
1956                     "10101010101010101010101010101010"
1957                     "10000000001001111001101100001101"
1958                     "10000000000001001001110011001100"
1959                     "10000000000110011111100101100001"
1960                     "11000000110101101100001101111000"
1961                     "11000001110100111000111101101011"
1962                     "11000000000000001001000001011010"
1963                     "11111111111111111111111111111111"
1964                 },
1965         /* 49*/ { BARCODE_DATAMATRIX, -1, -1, -1, -1, -1, "@@@@@@@@@@_", 0, 16, 16, 0, "EDI; BWIPP uses different encodation, switching to ASC for last 3 chars, not last 4 like Zint",
1966                     "1010101010101010"
1967                     "1000000001000001"
1968                     "1000000000111110"
1969                     "1000000100010001"
1970                     "1000000000101110"
1971                     "1000001001110111"
1972                     "1000010001010110"
1973                     "1110100011110001"
1974                     "1110001110011000"
1975                     "1010010110010101"
1976                     "1000111010010110"
1977                     "1001011001000001"
1978                     "1000110101100010"
1979                     "1110100110001101"
1980                     "1010100000010010"
1981                     "1111111111111111"
1982                 },
1983         /* 50*/ { BARCODE_DATAMATRIX, -1, -1, -1, -1, -1, "@@@@@@@@@@@_", 0, 16, 16, 0, "EDI; BWIPP uses different encodation, switching to ASC for last 4 chars, not last 5 like Zint",
1984                     "1010101010101010"
1985                     "1000000000100001"
1986                     "1000000000001010"
1987                     "1000000010001001"
1988                     "1000000100001000"
1989                     "1000001000110111"
1990                     "1000000011101110"
1991                     "1110100111100001"
1992                     "1110000111010100"
1993                     "1010011001111101"
1994                     "1000000000000110"
1995                     "1001010011101111"
1996                     "1010000011111000"
1997                     "1101100111110101"
1998                     "1001100000100010"
1999                     "1111111111111111"
2000                 },
2001         /* 51*/ { BARCODE_DATAMATRIX, -1, -1, -1, -1, -1, "@@@@@@@@@@@@_", 0, 16, 16, 0, "EDI; BWIPP uses same encodation for this case, switching to ASC for last 5 chars, not last 2 like Zint",
2002                     "1010101010101010"
2003                     "1000000000100001"
2004                     "1000000000111000"
2005                     "1000000010111001"
2006                     "1000000100100100"
2007                     "1000001000100111"
2008                     "1000000011111110"
2009                     "1000000110111001"
2010                     "1000110010010100"
2011                     "1001111110000101"
2012                     "1000000010010000"
2013                     "1000101101011001"
2014                     "1001010001011110"
2015                     "1000000111000101"
2016                     "1011100000010010"
2017                     "1111111111111111"
2018                 },
2019         /* 52*/ { BARCODE_DATAMATRIX, -1, -1, -1, -1, -1, "@@@@@@@@@@@@@_", 0, 12, 26, 0, "EDI; BWIPP uses different encodation, switching to ASC for last 2 chars, not last 3 like Zint",
2020                     "10101010101010101010101010"
2021                     "10000000001001100100101011"
2022                     "10000000000010000000111000"
2023                     "10000000000100011100111111"
2024                     "10000000110100111100011110"
2025                     "10000001110100100011100001"
2026                     "10000000111110000011001100"
2027                     "10000000101110100110101101"
2028                     "10000000101010000110010000"
2029                     "10000010101001111100101001"
2030                     "10000001000001101011010000"
2031                     "11111111111111111111111111"
2032                 },
2033         /* 53*/ { BARCODE_DATAMATRIX, -1, 26, -1, -1, -1, "abcdefghi1234FGHIJKLMNabc@@@@@@@@@é", 0, 24, 24, 0, "Mix of modes TEX ASC C40 ASC EDI BAS; BWIPP uses different encodation for EDI as above",
2034                     "101010101010101010101010"
2035                     "100111011110011100100101"
2036                     "101111001100101100001100"
2037                     "101110110110001010011011"
2038                     "100100110000101000010110"
2039                     "111011010011000001000111"
2040                     "101010011000101111100110"
2041                     "100111101000011110110001"
2042                     "100111010000000001111100"
2043                     "101110101000001010011011"
2044                     "101111100000000100111110"
2045                     "111111100000101101010001"
2046                     "100111000000111111101100"
2047                     "101000000001011001011101"
2048                     "110100000001101010011000"
2049                     "100000001000001001110001"
2050                     "111000011110010010110100"
2051                     "111000110011110110101011"
2052                     "111011010100011100100000"
2053                     "100010010011101010000101"
2054                     "100010001010001100011100"
2055                     "110011110000001011001101"
2056                     "110111010101111111011010"
2057                     "111111111111111111111111"
2058                 },
2059     };
2060     int data_size = ARRAY_SIZE(data);
2061     int i, length, ret;
2062     struct zint_symbol *symbol;
2063 
2064     char escaped[8192];
2065     char bwipp_buf[32768];
2066     char bwipp_msg[1024];
2067 
2068     int do_bwipp = (debug & ZINT_DEBUG_TEST_BWIPP) && testUtilHaveGhostscript(); // Only do BWIPP test if asked, too slow otherwise
2069 
2070     testStart("test_encode");
2071 
2072     for (i = 0; i < data_size; i++) {
2073 
2074         if (index != -1 && i != index) continue;
2075 
2076         symbol = ZBarcode_Create();
2077         assert_nonnull(symbol, "Symbol not created\n");
2078 
2079         length = testUtilSetSymbol(symbol, data[i].symbology, data[i].input_mode, data[i].eci, -1 /*option_1*/, data[i].option_2, data[i].option_3, data[i].output_options, data[i].data, -1, debug);
2080 
2081         ret = ZBarcode_Encode(symbol, (unsigned char *) data[i].data, length);
2082         assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d\n", i, ret, data[i].ret);
2083 
2084         if (generate) {
2085             printf("        /*%3d*/ { %s, %s, %d, %s, %d, %s, \"%s\", %s, %d, %d, %d, \"%s\",\n",
2086                     i, testUtilBarcodeName(data[i].symbology), testUtilInputModeName(data[i].input_mode), data[i].eci, testUtilOutputOptionsName(data[i].output_options),
2087                     data[i].option_2, testUtilOption3Name(data[i].option_3), testUtilEscape(data[i].data, length, escaped, sizeof(escaped)),
2088                     testUtilErrorName(data[i].ret), symbol->rows, symbol->width, data[i].bwipp_cmp, data[i].comment);
2089             testUtilModulesPrint(symbol, "                    ", "\n");
2090             printf("                },\n");
2091         } else {
2092             if (ret < ZINT_ERROR) {
2093                 int width, row;
2094 
2095                 assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d (%s)\n", i, symbol->rows, data[i].expected_rows, data[i].data);
2096                 assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d (%s)\n", i, symbol->width, data[i].expected_width, data[i].data);
2097 
2098                 ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row);
2099                 assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data);
2100 
2101                 if (do_bwipp && testUtilCanBwipp(i, symbol, -1, data[i].option_2, data[i].option_3, debug)) {
2102                     if (!data[i].bwipp_cmp) {
2103                         if (debug & ZINT_DEBUG_TEST_PRINT) printf("i:%d %s not BWIPP compatible (%s)\n", i, testUtilBarcodeName(symbol->symbology), data[i].comment);
2104                     } else {
2105                         ret = testUtilBwipp(i, symbol, -1, data[i].option_2, data[i].option_3, data[i].data, length, NULL, bwipp_buf, sizeof(bwipp_buf));
2106                         assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(symbol->symbology), ret);
2107 
2108                         ret = testUtilBwippCmp(symbol, bwipp_msg, bwipp_buf, data[i].expected);
2109                         assert_zero(ret, "i:%d %s testUtilBwippCmp %d != 0 %s\n  actual: %s\nexpected: %s\n",
2110                                        i, testUtilBarcodeName(symbol->symbology), ret, bwipp_msg, bwipp_buf, data[i].expected);
2111                     }
2112                 }
2113             }
2114         }
2115 
2116         ZBarcode_Delete(symbol);
2117     }
2118 
2119     testFinish();
2120 }
2121 
2122 #include <time.h>
2123 
2124 #define TEST_PERF_ITERATIONS    1000
2125 
2126 // Not a real test, just performance indicator
test_perf(int index,int debug)2127 static void test_perf(int index, int debug) {
2128 
2129     struct item {
2130         int symbology;
2131         int input_mode;
2132         int option_1;
2133         int option_2;
2134         char *data;
2135         int ret;
2136 
2137         int expected_rows;
2138         int expected_width;
2139         char *comment;
2140     };
2141     struct item data[] = {
2142         /*  0*/ { BARCODE_DATAMATRIX, -1, -1, -1,
2143                     "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz&,:#-.$/+%*=^ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678901234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLM"
2144                     "NOPQRSTUVWXYZ;<>@[]_`~!||()?{}'123456789012345678901234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJK"
2145                     "LMNOPQRSTUVWXYZ12345678912345678912345678912345678900001234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyzABCDEFG"
2146                     "HIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ12345678901234567"
2147                     "890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcde"
2148                     "fghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNO",
2149                     0, 96, 96, "960 chars, text/numeric" },
2150         /*  1*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, -1,
2151                     "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240"
2152                     "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240"
2153                     "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240"
2154                     "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240"
2155                     "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240"
2156                     "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240"
2157                     "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240"
2158                     "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240"
2159                     "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240"
2160                     "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240"
2161                     "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240"
2162                     "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240"
2163                     "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240"
2164                     "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240"
2165                     "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240"
2166                     "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240"
2167                     "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240"
2168                     "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240"
2169                     "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240"
2170                     "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240"
2171                     "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240"
2172                     "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240"
2173                     "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240"
2174                     "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240",
2175                     0, 120, 120, "960 chars, byte" },
2176     };
2177     int data_size = ARRAY_SIZE(data);
2178     int i, length, ret;
2179 
2180     clock_t start, total_encode = 0, total_buffer = 0, diff_encode, diff_buffer;
2181 
2182     if (!(debug & ZINT_DEBUG_TEST_PERFORMANCE)) { /* -d 256 */
2183         return;
2184     }
2185 
2186     for (i = 0; i < data_size; i++) {
2187         int j;
2188 
2189         if (index != -1 && i != index) continue;
2190 
2191         diff_encode = diff_buffer = 0;
2192 
2193         for (j = 0; j < TEST_PERF_ITERATIONS; j++) {
2194             struct zint_symbol *symbol = ZBarcode_Create();
2195             assert_nonnull(symbol, "Symbol not created\n");
2196 
2197             length = testUtilSetSymbol(symbol, data[i].symbology, data[i].input_mode, -1 /*eci*/, data[i].option_1, data[i].option_2, -1, -1 /*output_options*/, data[i].data, -1, debug);
2198 
2199             start = clock();
2200             ret = ZBarcode_Encode(symbol, (unsigned char *) data[i].data, length);
2201             diff_encode += clock() - start;
2202             assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt);
2203 
2204             assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d (%s)\n", i, symbol->rows, data[i].expected_rows, data[i].data);
2205             assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d (%s)\n", i, symbol->width, data[i].expected_width, data[i].data);
2206 
2207             start = clock();
2208             ret = ZBarcode_Buffer(symbol, 0 /*rotate_angle*/);
2209             diff_buffer += clock() - start;
2210             assert_zero(ret, "i:%d ZBarcode_Buffer ret %d != 0 (%s)\n", i, ret, symbol->errtxt);
2211 
2212             ZBarcode_Delete(symbol);
2213         }
2214 
2215         printf("%s: diff_encode %gms, diff_buffer %gms\n", data[i].comment, diff_encode * 1000.0 / CLOCKS_PER_SEC, diff_buffer * 1000.0 / CLOCKS_PER_SEC);
2216 
2217         total_encode += diff_encode;
2218         total_buffer += diff_buffer;
2219     }
2220     if (index != -1) {
2221         printf("totals: encode %gms, buffer %gms\n", total_encode * 1000.0 / CLOCKS_PER_SEC, total_buffer * 1000.0 / CLOCKS_PER_SEC);
2222     }
2223 }
2224 
main(int argc,char * argv[])2225 int main(int argc, char *argv[]) {
2226 
2227     testFunction funcs[] = { /* name, func, has_index, has_generate, has_debug */
2228         { "test_large", test_large, 1, 0, 1 },
2229         { "test_buffer", test_buffer, 1, 0, 1 },
2230         { "test_options", test_options, 1, 0, 1 },
2231         { "test_reader_init", test_reader_init, 1, 1, 1 },
2232         { "test_input", test_input, 1, 1, 1 },
2233         { "test_encode", test_encode, 1, 1, 1 },
2234         { "test_perf", test_perf, 1, 0, 1 },
2235     };
2236 
2237     testRun(argc, argv, funcs, ARRAY_SIZE(funcs));
2238 
2239     testReport();
2240 
2241     return 0;
2242 }
2243