comparison mupdf-source/thirdparty/zint/backend/tests/fuzz/fuzz.h @ 2:b50eed0cc0ef upstream

ADD: MuPDF v1.26.7: the MuPDF source as downloaded by a default build of PyMuPDF 1.26.4. The directory name has changed: no version number in the expanded directory now.
author Franz Glasner <fzglas.hg@dom66.de>
date Mon, 15 Sep 2025 11:43:07 +0200
parents
children
comparison
equal deleted inserted replaced
1:1d09e1dec1d9 2:b50eed0cc0ef
1 /* fuzz.h - common functions for fuzzing libzint */
2 /*
3 libzint - the open source barcode library
4 Copyright (C) 2024 Robin Stuart <rstuart114@gmail.com>
5
6 Redistribution and use in source and binary forms, with or without
7 modification, are permitted provided that the following conditions
8 are met:
9
10 1. Redistributions of source code must retain the above copyright
11 notice, this list of conditions and the following disclaimer.
12 2. Redistributions in binary form must reproduce the above copyright
13 notice, this list of conditions and the following disclaimer in the
14 documentation and/or other materials provided with the distribution.
15 3. Neither the name of the project nor the names of its contributors
16 may be used to endorse or promote products derived from this software
17 without specific prior written permission.
18
19 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
23 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 SUCH DAMAGE.
30 */
31 /* SPDX-License-Identifier: BSD-3-Clause */
32
33 #ifndef Z_FUZZ_H
34 #define Z_FUZZ_H
35
36 #include <assert.h>
37 #include <stdlib.h>
38 #include <stdio.h>
39 #include <string.h>
40 #include "zint.h"
41
42 #define ZARRAY_SIZE(x) ((int) (sizeof(x) / sizeof((x)[0])))
43
44 #define INPUT_MODE_MASK (ESCAPE_MODE | GS1PARENS_MODE | GS1NOCHECK_MODE | HEIGHTPERROW_MODE | FAST_MODE \
45 | EXTRA_ESCAPE_MODE)
46
47 #ifdef Z_FUZZ_SET_OUTPUT_OPTIONS
48 #define OUTPUT_OPTIONS_MASK (BARCODE_BIND_TOP | BARCODE_BIND | BARCODE_BOX | BARCODE_STDOUT | READER_INIT \
49 | SMALL_TEXT | BOLD_TEXT | CMYK_COLOUR | BARCODE_DOTTY_MODE | GS1_GS_SEPARATOR \
50 | OUT_BUFFER_INTERMEDIATE | BARCODE_QUIET_ZONES | BARCODE_NO_QUIET_ZONES \
51 | COMPLIANT_HEIGHT | EANUPC_GUARD_WHITESPACE | EMBED_VECTOR_FONT)
52 #endif
53
54 /* Based on `is_sane()` flags in "backend/common.h") */
55 #define IS_CTL_F (0x00000001) /* ASCII control (incl. DEL) */
56 #define IS_PRT_F (0x00000002) /* ASCII printable (incl. space) */
57 #define IS_SPC_F (0x00000004 | IS_PRT_F) /* Space */
58 #define IS_HSH_F (0x00000008 | IS_PRT_F) /* Hash sign # */
59 #define IS_AST_F (0x00000010 | IS_PRT_F) /* Asterisk sign * */
60 #define IS_PLS_F (0x00000020 | IS_PRT_F) /* Plus sign + */
61 #define IS_MNS_F (0x00000040 | IS_PRT_F) /* Minus sign - */
62 #define IS_NUM_F (0x00000080 | IS_PRT_F) /* Number 0-9 */
63 #define IS_UPO_F (0x00000100 | IS_PRT_F) /* Uppercase letter, apart from A-F, T and X */
64 #define IS_UAD_F (0x00000200 | IS_PRT_F) /* Uppercase A, D (hex, CALCIUM/FIM/DAFT) */
65 #define IS_UBC_F (0x00000400 | IS_PRT_F) /* Uppercase B, C (hex, CALCIUM/FIM) */
66 #define IS_UE__F (0x00000800 | IS_PRT_F) /* Uppercase E (hex, FIM) */
67 #define IS_UF__F (0x00001000 | IS_PRT_F) /* Uppercase F (hex, DAFT) */
68 #define IS_UT__F (0x00002000 | IS_PRT_F) /* Uppercase T (DAFT) */
69 #define IS_UX__F (0x00004000 | IS_PRT_F) /* Uppercase X (SODIUM_X/ISBNX) */
70 #define IS_LWO_F (0x00008000 | IS_PRT_F) /* Lowercase letter, apart from a-f, t and x */
71 #define IS_LAD_F (0x00010000 | IS_PRT_F) /* Lowercase a, d (hex, CALCIUM/FIM/DAFT) */
72 #define IS_LBC_F (0x00020000 | IS_PRT_F) /* Lowercase b, c (hex, CALCIUM/FIM) */
73 #define IS_LE__F (0x00040000 | IS_PRT_F) /* Lowercase e (hex, FIM) */
74 #define IS_LF__F (0x00080000 | IS_PRT_F) /* Lowercase f (hex, DAFT) */
75 #define IS_LT__F (0x00100000 | IS_PRT_F) /* Lowercase t (DAFT) */
76 #define IS_LX__F (0x00200000 | IS_PRT_F) /* Lowercase x (SODIUM_X/ISBNX) */
77 #define IS_C82_F (0x00400000 | IS_PRT_F) /* CSET82 punctuation (apart from *, + and -) */
78 #define IS_SIL_F (0x00800000 | IS_PRT_F) /* SILVER/TECHNETIUM punctuation .$/% (apart from space, + and -) */
79 #define IS_CLI_F (0x01000000 | IS_PRT_F) /* CALCIUM INNER punctuation $:/. (apart from + and -) (Codabar) */
80 #define IS_ARS_F (0x02000000 | IS_PRT_F) /* ARSENIC uppercase subset (VIN) */
81
82 #define IS_UHX_F (IS_UAD_F | IS_UBC_F | IS_UE__F | IS_UF__F) /* Uppercase hex */
83 #define IS_LHX_F (IS_LAD_F | IS_LBC_F | IS_LE__F | IS_LF__F) /* Lowercase hex */
84 #define IS_UPR_F (IS_UPO_F | IS_UHX_F | IS_UT__F | IS_UX__F) /* Uppercase letters */
85 #define IS_LWR_F (IS_LWO_F | IS_LHX_F | IS_LT__F | IS_LX__F) /* Lowercase letters */
86
87 /* Flag table for `is_chr()` and `is_sane()` (taken from "backend/common.c") */
88 #define IS_CLS_F (IS_CLI_F | IS_SIL_F)
89 static const unsigned int flgs[256] = {
90 IS_CTL_F, IS_CTL_F, IS_CTL_F, IS_CTL_F, IS_CTL_F, IS_CTL_F, IS_CTL_F, IS_CTL_F, /*00-07*/
91 IS_CTL_F, IS_CTL_F, IS_CTL_F, IS_CTL_F, IS_CTL_F, IS_CTL_F, IS_CTL_F, IS_CTL_F, /*08-0F*/
92 IS_CTL_F, IS_CTL_F, IS_CTL_F, IS_CTL_F, IS_CTL_F, IS_CTL_F, IS_CTL_F, IS_CTL_F, /*10-17*/
93 IS_CTL_F, IS_CTL_F, IS_CTL_F, IS_CTL_F, IS_CTL_F, IS_CTL_F, IS_CTL_F, IS_CTL_F, /*18-1F*/
94 IS_SPC_F, IS_C82_F, IS_C82_F, IS_HSH_F, /*20-23*/ /* !"# */
95 IS_CLS_F, IS_SIL_F | IS_C82_F, IS_C82_F, IS_C82_F, /*24-27*/ /* $%&' */
96 IS_C82_F, IS_C82_F, IS_AST_F, IS_PLS_F, /*28-2B*/ /* ()*+ */
97 IS_C82_F, IS_MNS_F, IS_CLS_F | IS_C82_F, IS_CLS_F | IS_C82_F, /*2C-2F*/ /* ,-./ */
98 IS_NUM_F, IS_NUM_F, IS_NUM_F, IS_NUM_F, /*30-33*/ /* 0123 */
99 IS_NUM_F, IS_NUM_F, IS_NUM_F, IS_NUM_F, /*34-37*/ /* 4567 */
100 IS_NUM_F, IS_NUM_F, IS_CLI_F | IS_C82_F, IS_C82_F, /*38-3B*/ /* 89:; */
101 IS_C82_F, IS_C82_F, IS_C82_F, IS_C82_F, /*3C-3F*/ /* <=>? */
102 IS_PRT_F, IS_ARS_F | IS_UAD_F, IS_ARS_F | IS_UBC_F, IS_ARS_F | IS_UBC_F, /*40-43*/ /* @ABC */
103 IS_ARS_F | IS_UAD_F, IS_ARS_F | IS_UE__F, IS_ARS_F | IS_UF__F, IS_ARS_F | IS_UPO_F, /*44-47*/ /* DEFG */
104 IS_ARS_F | IS_UPO_F, IS_UPO_F, IS_ARS_F | IS_UPO_F, IS_ARS_F | IS_UPO_F, /*48-4B*/ /* HIJK */
105 IS_ARS_F | IS_UPO_F, IS_ARS_F | IS_UPO_F, IS_ARS_F | IS_UPO_F, IS_UPO_F, /*4C-4F*/ /* LMNO */
106 IS_ARS_F | IS_UPO_F, IS_UPO_F, IS_ARS_F | IS_UPO_F, IS_ARS_F | IS_UPO_F, /*50-53*/ /* PQRS */
107 IS_ARS_F | IS_UT__F, IS_ARS_F | IS_UPO_F, IS_ARS_F | IS_UPO_F, IS_ARS_F | IS_UPO_F, /*53-57*/ /* TUVW */
108 IS_ARS_F | IS_UX__F, IS_ARS_F | IS_UPO_F, IS_ARS_F | IS_UPO_F, IS_PRT_F, /*58-5B*/ /* XYZ[ */
109 IS_PRT_F, IS_PRT_F, IS_PRT_F, IS_C82_F, /*5C-5F*/ /* \]^_ */
110 IS_PRT_F, IS_LAD_F, IS_LBC_F, IS_LBC_F, /*60-63*/ /* `abc */
111 IS_LAD_F, IS_LE__F, IS_LF__F, IS_LWO_F, /*64-67*/ /* defg */
112 IS_LWO_F, IS_LWO_F, IS_LWO_F, IS_LWO_F, /*68-6B*/ /* hijk */
113 IS_LWO_F, IS_LWO_F, IS_LWO_F, IS_LWO_F, /*6C-6F*/ /* lmno */
114 IS_LWO_F, IS_LWO_F, IS_LWO_F, IS_LWO_F, /*70-73*/ /* pqrs */
115 IS_LT__F, IS_LWO_F, IS_LWO_F, IS_LWO_F, /*74-77*/ /* tuvw */
116 IS_LX__F, IS_LWO_F, IS_LWO_F, IS_PRT_F, /*78-7B*/ /* xyz{ */
117 IS_PRT_F, IS_PRT_F, IS_PRT_F, IS_CTL_F, /*7C-7F*/ /* |}~D */
118 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*80-9F*/
119 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*A0-BF*/
120 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*C0-DF*/
121 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*E0-FF*/
122 };
123
124 /* Verifies that a string only uses valid characters */
125 static int is_sane(const unsigned int flg, const unsigned char source[], const int length) {
126 int i;
127
128 for (i = 0; i < length; i++) {
129 if (!(flgs[source[i]] & flg)) {
130 return 0;
131 }
132 }
133 return 1;
134 }
135
136 #define NEON_F (IS_NUM_F) /* NEON "0123456789" */
137 #define SODIUM_MNS_F (IS_NUM_F | IS_MNS_F) /* SODIUM_MNS "0123456789-" */
138 #define SODIUM_PLS_F (IS_NUM_F | IS_PLS_F) /* SODIUM_PLS "0123456789+" */
139 #define SODIUM_X_F (IS_NUM_F | IS_UX__F | IS_LX__F) /* SODIUM_X "0123456789Xx" */
140 #define ISBNX_ADDON_SANE_F (IS_NUM_F | IS_UX__F | IS_LX__F | IS_PLS_F) /* ISBNX_ADDON_SANE "0123456789Xx+" */
141 /* SILVER "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%" + lowercase */
142 #define SILVER_F (IS_NUM_F | IS_UPR_F | IS_LWR_F | IS_MNS_F | IS_SIL_F | IS_SPC_F | IS_PLS_F)
143 /* CALCIUM "0123456789-$:/.+ABCD" + lowercase */
144 #define CALCIUM_F (IS_NUM_F | IS_MNS_F | IS_CLI_F | IS_PLS_F | IS_UAD_F | IS_UBC_F | IS_LAD_F | IS_LBC_F)
145 /* FIM "ABCDE" + lowercase */
146 #define FIM_F (IS_UAD_F | IS_UBC_F | IS_UE__F | IS_LAD_F | IS_LBC_F | IS_LE__F)
147 /* GDSET "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz #" */
148 #define GDSET_F (IS_NUM_F | IS_UPR_F | IS_LWR_F | IS_SPC_F | IS_HSH_F)
149 #define KRSET_F (IS_NUM_F | IS_UPR_F | IS_LWR_F)
150 /* ARSENIC "0123456789ABCDEFGHJKLMNPRSTUVWXYZ" (no lowercase) */
151 #define ARSENIC_F (IS_NUM_F | IS_ARS_F)
152 /* SHKASUTSET "1234567890-ABCDEFGHIJKLMNOPQRSTUVWXYZ" + lowercase */
153 #define SHKASUTSET_F (IS_NUM_F | IS_MNS_F | IS_UPR_F | IS_LWR_F)
154 #define SSET_F (IS_NUM_F | IS_UHX_F) /* SSET "0123456789ABCDEF" (no lowercase) */
155 /* DAFT "FADT" + lowercase */
156 #define DAFT_F (IS_UAD_F | IS_UF__F | IS_UT__F | IS_LAD_F | IS_LF__F | IS_LT__F)
157 /* RUBIDIUM "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ " + lowercase */
158 #define RUBIDIUM_F (IS_NUM_F | IS_UPR_F | IS_LWR_F | IS_SPC_F)
159 #define ASCII_PRT_F (IS_PRT_F) /* ASCII printable */
160 #define ASCII_F (IS_PRT_F | IS_CTL_F) /* ASCII */
161
162 struct settings_item {
163 const int idx, symbology, sane_flag;
164 const int option_1_min, option_1_max, option_2_min, option_2_max, option_3, len_min, len_max;
165 };
166
167 static const struct settings_item settings[] = {
168 { 0, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
169 { 1, BARCODE_CODE11, SODIUM_MNS_F, 0, -1, 0, 2, 0, 1, 140 },
170 { 2, BARCODE_C25STANDARD, NEON_F, 0, -1, 0, 2, 0, 1, 112 },
171 { 3, BARCODE_C25INTER, NEON_F, 0, -1, 0, 2, 0, 1, 125 },
172 { 4, BARCODE_C25IATA, NEON_F, 0, -1, 0, 2, 0, 1, 80 },
173 { 5, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
174 { 6, BARCODE_C25LOGIC, NEON_F, 0, -1, 0, 2, 0, 1, 113 },
175 { 7, BARCODE_C25IND, NEON_F, 0, -1, 0, 2, 0, 1, 79 },
176 { 8, BARCODE_CODE39, SILVER_F, 0, -1, 0, 2, 0, 1, 86 },
177 { 9, BARCODE_EXCODE39, SILVER_F, 0, -1, 0, 2, 0, 1, 86 },
178 { 10, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
179 { 11, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
180 { 12, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
181 { 13, BARCODE_EANX, SODIUM_PLS_F, 0, -1, 0, -1, 0, 1, 19 },
182 { 14, BARCODE_EANX_CHK, SODIUM_PLS_F, 0, -1, 0, -1, 0, 1, 19 },
183 { 15, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
184 { 16, BARCODE_GS1_128, ASCII_PRT_F, 0, -1, 0, -1, 0, 3, 198 },
185 { 17, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
186 { 18, BARCODE_CODABAR, CALCIUM_F, 0, -1, 0, 2, 0, 3, 103 },
187 { 19, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
188 { 20, BARCODE_CODE128, 0, 0, -1, 0, -1, 0, 1, 198 },
189 { 21, BARCODE_DPLEIT, NEON_F, 0, -1, 0, -1, 0, 1, 13 },
190 { 22, BARCODE_DPIDENT, NEON_F, 0, -1, 0, -1, 0, 1, 11 },
191 { 23, BARCODE_CODE16K, 0, -1, 16, 0, -1, 0, 1, 154 },
192 { 24, BARCODE_CODE49, ASCII_F, 2, 8, 0, -1, 0, 1, 81 },
193 { 25, BARCODE_CODE93, ASCII_F, 0, -1, 0, 1, 0, 1, 123 },
194 { 26, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
195 { 27, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
196 { 28, BARCODE_FLAT, NEON_F, 0, -1, 0, -1, 0, 1, 128 },
197 { 29, BARCODE_DBAR_OMN, NEON_F, 0, -1, 0, -1, 0, 1, 14 },
198 { 30, BARCODE_DBAR_LTD, NEON_F, 0, -1, 0, -1, 0, 1, 14 },
199 { 31, BARCODE_DBAR_EXP, ASCII_PRT_F, 0, -1, 0, -1, 0, 3, 74 },
200 { 32, BARCODE_TELEPEN, ASCII_F, 0, -1, 0, -1, 0, 1, 69 },
201 { 33, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
202 { 34, BARCODE_UPCA, SODIUM_PLS_F, 0, -1, 0, -1, 0, 1, 18 },
203 { 35, BARCODE_UPCA_CHK, SODIUM_PLS_F, 0, -1, 0, -1, 0, 1, 18 },
204 { 36, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
205 { 37, BARCODE_UPCE, SODIUM_PLS_F, 0, -1, 0, -1, 0, 1, 14 },
206 { 38, BARCODE_UPCE_CHK, SODIUM_PLS_F, 0, -1, 0, -1, 0, 1, 14 },
207 { 39, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
208 { 40, BARCODE_POSTNET, NEON_F, 0, -1, 0, -1, 0, 1, 38 },
209 { 41, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
210 { 42, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
211 { 43, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
212 { 44, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
213 { 45, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
214 { 46, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
215 { 47, BARCODE_MSI_PLESSEY, NEON_F, 0, -1, 0, 16, 0, 1, 92 },
216 { 48, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
217 { 49, BARCODE_FIM, FIM_F, 0, -1, 0, -1, 0, 1, 1 },
218 { 50, BARCODE_LOGMARS, SILVER_F, 0, -1, 0, 2, 0, 1, 30 },
219 { 51, BARCODE_PHARMA, NEON_F, 0, -1, 0, -1, 0, 1, 6 },
220 { 52, BARCODE_PZN, NEON_F, 0, -1, 0, 1, 0, 1, 8 },
221 { 53, BARCODE_PHARMA_TWO, NEON_F, 0, -1, 0, -1, 0, 1, 8 },
222 { 54, BARCODE_CEPNET, NEON_F, 0, -1, 0, -1, 0, 8, 8 },
223 { 55, BARCODE_PDF417, 0, -1, 8, 0, 30, 0, 1, 2710 },
224 { 56, BARCODE_PDF417COMP, 0, -1, 8, 0, 30, 0, 1, 2710 },
225 { 57, BARCODE_MAXICODE, 0, -1, 6, 0, 100, 0, 1, 138 },
226 { 58, BARCODE_QRCODE, 0, -1, 4, 0, 40, ZINT_FULL_MULTIBYTE, 1, 7089 },
227 { 59, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
228 { 60, BARCODE_CODE128AB, 0, 0, -1, 0, -1, 0, 1, 99 },
229 { 61, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
230 { 62, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
231 { 63, BARCODE_AUSPOST, GDSET_F, 0, -1, 0, -1, 0, 8, 23 },
232 { 64, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
233 { 65, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
234 { 66, BARCODE_AUSREPLY, GDSET_F, 0, -1, 0, -1, 0, 1, 8 },
235 { 67, BARCODE_AUSROUTE, GDSET_F, 0, -1, 0, -1, 0, 1, 8 },
236 { 68, BARCODE_AUSREDIRECT, GDSET_F, 0, -1, 0, -1, 0, 1, 8 },
237 { 69, BARCODE_ISBNX, ISBNX_ADDON_SANE_F, 0, -1, 0, -1, 0, 9, 19 },
238 { 70, BARCODE_RM4SCC, KRSET_F, 0, -1, 0, -1, 0, 1, 50 },
239 { 71, BARCODE_DATAMATRIX, 0, 0, -1, 0, 48, DM_SQUARE | DM_ISO_144, 1, 3550 },
240 { 72, BARCODE_EAN14, NEON_F, 0, -1, 0, -1, 0, 1, 13 },
241 { 73, BARCODE_VIN, ARSENIC_F, 0, -1, 0, -1, 0, 17, 17 },
242 { 74, BARCODE_CODABLOCKF, 0, -1, 44, -1, 67, 0, 1, 2725 },
243 { 75, BARCODE_NVE18, NEON_F, 0, -1, 0, -1, 0, 1, 17 },
244 { 76, BARCODE_JAPANPOST, SHKASUTSET_F, 0, -1, 0, -1, 0, 1, 20 },
245 { 77, BARCODE_KOREAPOST, NEON_F, 0, -1, 0, -1, 0, 1, 6 },
246 { 78, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
247 { 79, BARCODE_DBAR_STK, NEON_F, 0, -1, 0, -1, 0, 1, 14 },
248 { 80, BARCODE_DBAR_OMNSTK, NEON_F, 0, -1, 0, -1, 0, 1, 14 },
249 { 81, BARCODE_DBAR_EXPSTK, ASCII_PRT_F, 0, -1, 0, 11, 0, 1, 74 },
250 { 82, BARCODE_PLANET, NEON_F, 0, -1, 0, -1, 0, 1, 38 },
251 { 83, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
252 { 84, BARCODE_MICROPDF417, 0, 0, -1, 0, 30, 0, 1, 366 },
253 { 85, BARCODE_USPS_IMAIL, SODIUM_MNS_F, 0, -1, 0, -1, 0, 1, 32 },
254 { 86, BARCODE_PLESSEY, SSET_F, 0, -1, 0, -1, 0, 1, 67 },
255 { 87, BARCODE_TELEPEN_NUM, SODIUM_X_F, 0, -1, 0, -1, 0, 1, 136 },
256 { 88, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
257 { 89, BARCODE_ITF14, NEON_F, 0, -1, 0, -1, 0, 1, 13 },
258 { 90, BARCODE_KIX, KRSET_F, 0, -1, 0, -1, 0, 1, 18 },
259 { 91, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
260 { 92, BARCODE_AZTEC, 0, -1, 4, 0, 36, 0, 1, 4483 },
261 { 93, BARCODE_DAFT, DAFT_F, 0, -1, 50, 900, 0, 1, 576 },
262 { 94, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
263 { 95, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
264 { 96, BARCODE_DPD, KRSET_F, 0, -1, 0, -1, 0, 27, 28 },
265 { 97, BARCODE_MICROQR, 0, -1, 4, 0, 4, 0, 1, 35 },
266 { 98, BARCODE_HIBC_128, SILVER_F, 0, -1, 0, -1, 0, 1, 110 },
267 { 99, BARCODE_HIBC_39, SILVER_F, 0, -1, 0, 2, 0, 1, 70 },
268 { 100, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
269 { 101, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
270 { 102, BARCODE_HIBC_DM, SILVER_F, 0, -1, 0, 48, DM_SQUARE | DM_ISO_144, 1, 110 },
271 { 103, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
272 { 104, BARCODE_HIBC_QR, SILVER_F, -1, 4, 0, 40, ZINT_FULL_MULTIBYTE, 1, 110 },
273 { 105, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
274 { 106, BARCODE_HIBC_PDF, SILVER_F, -1, 8, 0, 30, 0, 1, 110 },
275 { 107, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
276 { 108, BARCODE_HIBC_MICPDF, SILVER_F, 0, -1, 0, 30, 0, 1, 110 },
277 { 109, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
278 { 110, BARCODE_HIBC_BLOCKF, SILVER_F, -1, 44, -1, 67, 0, 1, 110 },
279 { 111, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
280 { 112, BARCODE_HIBC_AZTEC, SILVER_F, -1, 4, 0, 36, 0, 1, 110 },
281 { 113, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
282 { 114, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
283 { 115, BARCODE_DOTCODE, 0, 0, -1, 0, 200, 0, 1, 900 },
284 { 116, BARCODE_HANXIN, 0, -1, 5, 0, 84, ZINT_FULL_MULTIBYTE, 1, 7827 },
285 { 117, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
286 { 118, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
287 { 119, BARCODE_MAILMARK_2D, RUBIDIUM_F, 0, -1, 0, 30, DM_SQUARE | DM_ISO_144, 28, 90 },
288 { 120, BARCODE_UPU_S10, KRSET_F, 0, -1, 0, -1, 0, 12, 13 },
289 { 121, BARCODE_MAILMARK_4S, RUBIDIUM_F, 0, -1, 0, -1, 0, 14, 26 },
290 { 122, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
291 { 123, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
292 { 124, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
293 { 125, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
294 { 126, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
295 { 127, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 },
296 { 128, BARCODE_AZRUNE, NEON_F, 0, -1, 0, -1, 0, 1, 3 },
297 { 129, BARCODE_CODE32, NEON_F, 0, -1, 0, -1, 0, 1, 8 },
298 { 130, BARCODE_EANX_CC, SODIUM_PLS_F, 0, 2, 0, -1, 0, 1, 338 },
299 { 131, BARCODE_GS1_128_CC, ASCII_PRT_F, 0, 3, 0, -1, 0, 1, 2361 },
300 { 132, BARCODE_DBAR_OMN_CC, NEON_F, 0, 2, 0, -1, 0, 1, 338 },
301 { 133, BARCODE_DBAR_LTD_CC, NEON_F, 0, 2, 0, -1, 0, 1, 338 },
302 { 134, BARCODE_DBAR_EXP_CC, ASCII_PRT_F, 0, 2, 0, -1, 0, 1, 338 },
303 { 135, BARCODE_UPCA_CC, SODIUM_PLS_F, 0, 2, 0, -1, 0, 1, 338 },
304 { 136, BARCODE_UPCE_CC, SODIUM_PLS_F, 0, 2, 0, -1, 0, 1, 338 },
305 { 137, BARCODE_DBAR_STK_CC, NEON_F, 0, 2, 0, -1, 0, 1, 338 },
306 { 138, BARCODE_DBAR_OMNSTK_CC, NEON_F, 0, 2, 0, -1, 0, 1, 338 },
307 { 139, BARCODE_DBAR_EXPSTK_CC, ASCII_PRT_F, 0, 2, 0, 11, 0, 1, 338 },
308 { 140, BARCODE_CHANNEL, NEON_F, 0, -1, 3, 8, 0, 1, 7 },
309 { 141, BARCODE_CODEONE, 0, 0, -1, 0, 10, 0, 1, 3550 },
310 { 142, BARCODE_GRIDMATRIX, 0, 0, 5, 0, 13, ZINT_FULL_MULTIBYTE, 1, 1751 },
311 { 143, BARCODE_UPNQR, 0, 0, -1, 0, -1, ZINT_FULL_MULTIBYTE, 1, 411 },
312 { 144, BARCODE_ULTRA, 0, -1, 5, 0, 2, ULTRA_COMPRESSION, 1, 504 },
313 { 145, BARCODE_RMQR, 0, -1, 4, 0, 38, 0, 1, 361 },
314 };
315
316 /* Make sure value `v` is between `min` and `max` */
317 static int clamp(const int v, const int min, const int max) {
318 return v < min ? min : v > max ? max : v;
319 }
320
321 /* Set `symbol` based on `settings[idx]`, returning new length after consuming some `*p_input` (`data`) */
322 static int set_symbol(struct zint_symbol *symbol, const int idx, const int chk_sane, const int no_eci,
323 const unsigned char **p_input, const size_t size) {
324 const unsigned char *input = *p_input;
325 int length = (int) size;
326 const struct settings_item *si;
327
328 assert(idx >= 0 && idx < ZARRAY_SIZE(settings));
329 assert(settings[idx].symbology > 0);
330 assert(settings[idx].symbology == idx);
331
332 si = settings + idx;
333
334 ZBarcode_Reset(symbol);
335
336 symbol->symbology = si->symbology;
337 if (length < si->len_min) {
338 return 0;
339 }
340 /* `input_mode` */
341 if (length > si->len_min) {
342 symbol->input_mode = (*input++ << 3); /* Note DATA/UNICODE/GS1_MODE must be set by caller */
343 length--;
344 }
345 /* `option_1` */
346 if (length > si->len_min && si->option_1_min <= si->option_1_max) {
347 unsigned char ch = *input++;
348 if (ch != 0xFF) { /* Special case 255 as default (-1) */
349 if (si->option_1_min + 1 == si->option_1_max) { /* Only one in it? */
350 symbol->option_1 = (ch & 1) ? si->option_1_min : si->option_1_max; /* Odd/even */
351 } else {
352 symbol->option_1 = clamp(ch, si->option_1_min, si->option_1_max);
353 }
354 }
355 length--;
356 }
357 /* `option_2` */
358 if (length > si->len_min && si->option_2_min <= si->option_2_max) {
359 if (si->option_2_min + 1 == si->option_2_max) { /* Only one in it? */
360 symbol->option_2 = (*input++ & 1) ? si->option_2_min : si->option_2_max; /* Odd/even */
361 } else {
362 symbol->option_2 = clamp(*input++, si->option_2_min, si->option_2_max);
363 }
364 length--;
365 }
366 /* `eci` */
367 if (!no_eci) {
368 if (length > si->len_min && (ZBarcode_Cap(symbol->symbology, ZINT_CAP_ECI) & ZINT_CAP_ECI)) {
369 symbol->eci = *input++;
370 /* Avoid invalid/unconvertible ECIs */
371 if (symbol->eci == 1) {
372 symbol->eci = 899; /* Binary */
373 } else if (symbol->eci > 35 && symbol->eci != 170) {
374 symbol->eci = 35; /* UTF-32LE */
375 } else if (symbol->eci == 2 || symbol->eci == 15 || symbol->eci == 19) {
376 symbol->eci++;
377 }
378 length--;
379 }
380 }
381 /* `option_3` */
382 if (length > si->len_min && si->option_3) {
383 if (*input++ & 1) { /* Odd/even */
384 symbol->option_3 = si->option_3;
385 }
386 length--;
387 }
388 #ifdef Z_FUZZ_SET_OUTPUT_OPTIONS
389 if (length > si->len_min) {
390 symbol->output_options = *input++ & OUTPUT_OPTIONS_MASK;
391 length--;
392 }
393 #endif
394
395 if (length > si->len_max) {
396 return 0;
397 }
398 if (chk_sane && si->sane_flag && !is_sane(si->sane_flag, input, length)) {
399 return 0;
400 }
401
402 #ifdef Z_FUZZ_DEBUG
403 symbol->debug = ZINT_DEBUG_PRINT;
404 #endif
405
406 *p_input = input;
407
408 assert(length >= si->len_min && length <= si->len_max);
409
410 return length;
411 }
412
413 /* vim: set ts=4 sw=4 et : */
414 #endif /* Z_FUZZ_H */