diff --git a/ChangeLog b/ChangeLog index 8d449a6c..b3374407 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,4 @@ -Version 2.16.0.9 (dev) not released yet (2026-03-18) +Version 2.16.0.9 (dev) not released yet (2026-03-22) ==================================================== **Incompatible changes** @@ -42,6 +42,7 @@ Bugs - CODE32/PZN: fix not restoring `option_2` (props axxel) - DBAR_EXP_CC/DBAR_EXPSTK_CC: fix separator over finder patterns when linear part is greater than 4 codeblocks +- raster/vector: fix BARCODE_BIND_TOP trumping BARCODE_BOX Version 2.16.0 (2025-12-19) diff --git a/backend/output.c b/backend/output.c index 6df039de..351b1acd 100644 --- a/backend/output.c +++ b/backend/output.c @@ -710,7 +710,8 @@ INTERNAL void zint_out_set_whitespace_offsets(const struct zint_symbol *symbol, *p_xoffset = symbol->whitespace_width + qz_left; *p_roffset = symbol->whitespace_width + qz_right; - if (symbol->output_options & BARCODE_BOX) { + /* BARCODE_BIND_TOP trumps BARCODE_BOX */ + if (!(symbol->output_options & BARCODE_BIND_TOP) && (symbol->output_options & BARCODE_BOX)) { *p_xoffset += symbol->border_width; *p_roffset += symbol->border_width; } diff --git a/backend/raster.c b/backend/raster.c index fa08bb56..35fe5472 100644 --- a/backend/raster.c +++ b/backend/raster.c @@ -727,7 +727,8 @@ static void draw_bind_box(const struct zint_symbol *symbol, unsigned char *pixel DEFAULT_INK); } } - if (symbol->output_options & BARCODE_BOX) { + /* BARCODE_BIND_TOP trumps BARCODE_BOX */ + if (!(symbol->output_options & BARCODE_BIND_TOP) && (symbol->output_options & BARCODE_BOX)) { /* Vertical side bars */ const int xbox_right = image_width - bwidth_si; int box_top = yoffset_si; diff --git a/backend/tests/fuzz/Dockerfile b/backend/tests/fuzz/Dockerfile index 2ddd4333..7c5b1ae1 100644 --- a/backend/tests/fuzz/Dockerfile +++ b/backend/tests/fuzz/Dockerfile @@ -17,5 +17,6 @@ FROM gcr.io/oss-fuzz-base/base-builder RUN apt-get update && apt-get install -y make cmake RUN git clone --depth 1 https://git.code.sf.net/p/zint/code zint +#ADD ./zint.tar.gz zint WORKDIR zint COPY build.sh $SRC/ diff --git a/backend/tests/fuzz/README b/backend/tests/fuzz/README new file mode 100644 index 00000000..ab1ff5e7 --- /dev/null +++ b/backend/tests/fuzz/README @@ -0,0 +1,56 @@ +% backend/tests/fuzz/README 2026-03-22 +% vim: set ts=4 sw=4 et : + +To run fuzzers "fuzz_data" and "fuzz_gs1" using OSS-Fuzz + +Assuming have cloned OSS-Fuzz somewhere: + + git clone https://github.com/google/oss-fuzz + +and using the following shell vars: + + export OSS_FUZZ_DIR= + export ZINT_DIR= + export PROJECT_NAME=zint + +make sure have latest: + + cd $OSS_FUZZ_DIR + git pull origin master + +Link zint's "backend/tests/fuzz" to a sub-dir of OSS-Fuzz`s project dir as "zint", e.g.: + + cd $OSS_FUZZ_DIR/projects + ln -s $ZINT_DIR/backend/tests/fuzz $PROJECT_NAME + +Create corpus dirs, e.g. could create in the "build" dir in "": + + mkdir -p $OSS_FUZZ_DIR/build/corpus_data + mkdir -p $OSS_FUZZ_DIR/build/corpus_gs1 + +Then can use OSS-Fuzz's python helpers to build the docker image and fuzzers: + + cd $OSS_FUZZ_DIR/projects/$PROJECT_NAME + python3 $OSS_FUZZ_DIR/infra/helper.py build_image $PROJECT_NAME + +(on any subsequent runs can add "--no-pull" option to avoid question) + + python3 $OSS_FUZZ_DIR/infra/helper.py build_fuzzers $PROJECT_NAME + +Then run "fuzz_data": + + python3 $OSS_FUZZ_DIR/infra/helper.py run_fuzzer --corpus-dir=build/corpus_data $PROJECT_NAME fuzz_data + +and/or "fuzz_gs1": + + python3 $OSS_FUZZ_DIR/infra/helper.py run_fuzzer --corpus-dir=build/corpus_gs1 $PROJECT_NAME fuzz_gs1 + +If want to test local changes not in zint's commit tree, then create an archive, e.g. + + cd $ZINT_DIR + git stash + git archive -o backend/tests/fuzz/zint.tar.gz 'stash@{0}' + git stash pop + +then edit "Dockerfile" and comment out "RUN zint clone ..." and uncomment "ADD ./zint.tar.gz zint" and +rebuild Docker image and fuzzers. diff --git a/backend/tests/fuzz/fuzz.h b/backend/tests/fuzz/fuzz.h index 1a86752f..bf8eb66b 100644 --- a/backend/tests/fuzz/fuzz.h +++ b/backend/tests/fuzz/fuzz.h @@ -42,14 +42,13 @@ #define ZARRAY_SIZE(x) ((int) (sizeof(x) / sizeof((x)[0]))) #define INPUT_MODE_MASK (ESCAPE_MODE | GS1PARENS_MODE | GS1NOCHECK_MODE | HEIGHTPERROW_MODE | FAST_MODE \ - | EXTRA_ESCAPE_MODE) + | EXTRA_ESCAPE_MODE | GS1SYNTAXENGINE_MODE | GS1RAW_MODE) -#ifdef Z_FUZZ_SET_OUTPUT_OPTIONS #define OUTPUT_OPTIONS_MASK (BARCODE_BIND_TOP | BARCODE_BIND | BARCODE_BOX | BARCODE_STDOUT | READER_INIT \ | SMALL_TEXT | BOLD_TEXT | CMYK_COLOUR | BARCODE_DOTTY_MODE | GS1_GS_SEPARATOR \ | OUT_BUFFER_INTERMEDIATE | BARCODE_QUIET_ZONES | BARCODE_NO_QUIET_ZONES \ - | COMPLIANT_HEIGHT | EANUPC_GUARD_WHITESPACE | EMBED_VECTOR_FONT) -#endif + | COMPLIANT_HEIGHT | EANUPC_GUARD_WHITESPACE | EMBED_VECTOR_FONT \ + | BARCODE_CONTENT_SEGS) /* BARCODE_MEMORY_FILE always set */ /* Based on `z_not_sane()` flags in "backend/common.h") */ #define IS_CTL_F (0x00000001) /* ASCII control (incl. DEL) */ @@ -161,160 +160,160 @@ static int not_sane(const unsigned int flg, const unsigned char source[], const struct settings_item { const int idx, symbology, sane_flag; - const int option_1_min, option_1_max, option_2_min, option_2_max, option_3, len_min, len_max; + const int option_1_min, option_1_max, option_2_min, option_2_max, option_3_min, option_3_max, len_min, len_max; }; static const struct settings_item settings[] = { - { 0, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 1, BARCODE_CODE11, SODIUM_MNS_F, 0, -1, 0, 2, 0, 1, 140 }, - { 2, BARCODE_C25STANDARD, NEON_F, 0, -1, 0, 2, 0, 1, 112 }, - { 3, BARCODE_C25INTER, NEON_F, 0, -1, 0, 2, 0, 1, 125 }, - { 4, BARCODE_C25IATA, NEON_F, 0, -1, 0, 2, 0, 1, 80 }, - { 5, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 6, BARCODE_C25LOGIC, NEON_F, 0, -1, 0, 2, 0, 1, 113 }, - { 7, BARCODE_C25IND, NEON_F, 0, -1, 0, 2, 0, 1, 79 }, - { 8, BARCODE_CODE39, SILVER_F, 0, -1, 0, 2, 0, 1, 86 }, - { 9, BARCODE_EXCODE39, SILVER_F, 0, -1, 0, 2, 0, 1, 86 }, - { 10, BARCODE_EAN8, SODIUM_PLS_F, 0, -1, 0, -1, 0, 1, 14 }, - { 11, BARCODE_EAN_2ADDON, NEON_F, 0, -1, 0, -1, 0, 1, 2 }, - { 12, BARCODE_EAN_5ADDON, NEON_F, 0, -1, 0, -1, 0, 1, 5 }, - { 13, BARCODE_EANX, SODIUM_PLS_F, 0, -1, 0, -1, 0, 1, 19 }, - { 14, BARCODE_EANX_CHK, SODIUM_PLS_F, 0, -1, 0, -1, 0, 1, 19 }, - { 15, BARCODE_EAN13, SODIUM_PLS_F, 0, -1, 0, -1, 0, 1, 19 }, - { 16, BARCODE_GS1_128, ASCII_PRT_F, 0, -1, 0, -1, 0, 3, 198 }, - { 17, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 18, BARCODE_CODABAR, CALCIUM_F, 0, -1, 0, 2, 0, 3, 103 }, - { 19, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 20, BARCODE_CODE128, 0, 0, -1, 0, -1, 0, 1, 198 }, - { 21, BARCODE_DPLEIT, NEON_F, 0, -1, 0, -1, 0, 1, 13 }, - { 22, BARCODE_DPIDENT, NEON_F, 0, -1, 0, -1, 0, 1, 11 }, - { 23, BARCODE_CODE16K, 0, -1, 16, 0, -1, 0, 1, 154 }, - { 24, BARCODE_CODE49, ASCII_F, 2, 8, 0, -1, 0, 1, 81 }, - { 25, BARCODE_CODE93, ASCII_F, 0, -1, 0, 1, 0, 1, 123 }, - { 26, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 27, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 28, BARCODE_FLAT, NEON_F, 0, -1, 0, -1, 0, 1, 128 }, - { 29, BARCODE_DBAR_OMN, NEON_F, 0, -1, 0, -1, 0, 1, 14 }, - { 30, BARCODE_DBAR_LTD, NEON_F, 0, -1, 0, -1, 0, 1, 14 }, - { 31, BARCODE_DBAR_EXP, ASCII_PRT_F, 0, -1, 0, -1, 0, 3, 74 }, - { 32, BARCODE_TELEPEN, ASCII_F, 0, -1, 0, -1, 0, 1, 69 }, - { 33, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 34, BARCODE_UPCA, SODIUM_PLS_F, 0, -1, 0, -1, 0, 1, 18 }, - { 35, BARCODE_UPCA_CHK, SODIUM_PLS_F, 0, -1, 0, -1, 0, 1, 18 }, - { 36, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 37, BARCODE_UPCE, SODIUM_PLS_F, 0, -1, 0, -1, 0, 1, 14 }, - { 38, BARCODE_UPCE_CHK, SODIUM_PLS_F, 0, -1, 0, -1, 0, 1, 14 }, - { 39, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 40, BARCODE_POSTNET, NEON_F, 0, -1, 0, -1, 0, 1, 38 }, - { 41, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 42, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 43, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 44, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 45, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 46, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 47, BARCODE_MSI_PLESSEY, NEON_F, 0, -1, 0, 16, 0, 1, 92 }, - { 48, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 49, BARCODE_FIM, FIM_F, 0, -1, 0, -1, 0, 1, 1 }, - { 50, BARCODE_LOGMARS, SILVER_F, 0, -1, 0, 2, 0, 1, 30 }, - { 51, BARCODE_PHARMA, NEON_F, 0, -1, 0, -1, 0, 1, 6 }, - { 52, BARCODE_PZN, NEON_F, 0, -1, 0, 1, 0, 1, 8 }, - { 53, BARCODE_PHARMA_TWO, NEON_F, 0, -1, 0, -1, 0, 1, 8 }, - { 54, BARCODE_CEPNET, NEON_F, 0, -1, 0, -1, 0, 8, 8 }, - { 55, BARCODE_PDF417, 0, -1, 8, 0, 30, 0, 1, 2710 }, - { 56, BARCODE_PDF417COMP, 0, -1, 8, 0, 30, 0, 1, 2710 }, - { 57, BARCODE_MAXICODE, 0, -1, 6, 0, 100, 0, 1, 138 }, - { 58, BARCODE_QRCODE, 0, -1, 4, 0, 40, ZINT_FULL_MULTIBYTE, 1, 7089 }, - { 59, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 60, BARCODE_CODE128AB, 0, 0, -1, 0, -1, 0, 1, 99 }, - { 61, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 62, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 63, BARCODE_AUSPOST, GDSET_F, 0, -1, 0, -1, 0, 8, 23 }, - { 64, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 65, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 66, BARCODE_AUSREPLY, GDSET_F, 0, -1, 0, -1, 0, 1, 8 }, - { 67, BARCODE_AUSROUTE, GDSET_F, 0, -1, 0, -1, 0, 1, 8 }, - { 68, BARCODE_AUSREDIRECT, GDSET_F, 0, -1, 0, -1, 0, 1, 8 }, - { 69, BARCODE_ISBNX, ISBNX_ADDON_SANE_F, 0, -1, 0, -1, 0, 9, 19 }, - { 70, BARCODE_RM4SCC, KRSET_F, 0, -1, 0, -1, 0, 1, 50 }, - { 71, BARCODE_DATAMATRIX, 0, 0, -1, 0, 48, DM_SQUARE | DM_ISO_144, 1, 3550 }, - { 72, BARCODE_EAN14, NEON_F, 0, -1, 0, -1, 0, 1, 13 }, - { 73, BARCODE_VIN, ARSENIC_F, 0, -1, 0, -1, 0, 17, 17 }, - { 74, BARCODE_CODABLOCKF, 0, -1, 44, -1, 67, 0, 1, 2725 }, - { 75, BARCODE_NVE18, NEON_F, 0, -1, 0, -1, 0, 1, 17 }, - { 76, BARCODE_JAPANPOST, SHKASUTSET_F, 0, -1, 0, -1, 0, 1, 20 }, - { 77, BARCODE_KOREAPOST, NEON_F, 0, -1, 0, -1, 0, 1, 6 }, - { 78, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 79, BARCODE_DBAR_STK, NEON_F, 0, -1, 0, -1, 0, 1, 14 }, - { 80, BARCODE_DBAR_OMNSTK, NEON_F, 0, -1, 0, -1, 0, 1, 14 }, - { 81, BARCODE_DBAR_EXPSTK, ASCII_PRT_F, 0, -1, 0, 11, 0, 1, 74 }, - { 82, BARCODE_PLANET, NEON_F, 0, -1, 0, -1, 0, 1, 38 }, - { 83, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 84, BARCODE_MICROPDF417, 0, 0, -1, 0, 30, 0, 1, 366 }, - { 85, BARCODE_USPS_IMAIL, SODIUM_MNS_F, 0, -1, 0, -1, 0, 1, 32 }, - { 86, BARCODE_PLESSEY, SSET_F, 0, -1, 0, -1, 0, 1, 67 }, - { 87, BARCODE_TELEPEN_NUM, SODIUM_X_F, 0, -1, 0, -1, 0, 1, 136 }, - { 88, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 89, BARCODE_ITF14, NEON_F, 0, -1, 0, -1, 0, 1, 13 }, - { 90, BARCODE_KIX, KRSET_F, 0, -1, 0, -1, 0, 1, 18 }, - { 91, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 92, BARCODE_AZTEC, 0, -1, 4, 0, 36, 0, 1, 4483 }, - { 93, BARCODE_DAFT, DAFT_F, 0, -1, 50, 900, 0, 1, 576 }, - { 94, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 95, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 96, BARCODE_DPD, KRSET_F, 0, -1, 0, -1, 0, 27, 28 }, - { 97, BARCODE_MICROQR, 0, -1, 4, 0, 4, 0, 1, 35 }, - { 98, BARCODE_HIBC_128, SILVER_F, 0, -1, 0, -1, 0, 1, 110 }, - { 99, BARCODE_HIBC_39, SILVER_F, 0, -1, 0, 2, 0, 1, 70 }, - { 100, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 101, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 102, BARCODE_HIBC_DM, SILVER_F, 0, -1, 0, 48, DM_SQUARE | DM_ISO_144, 1, 110 }, - { 103, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 104, BARCODE_HIBC_QR, SILVER_F, -1, 4, 0, 40, ZINT_FULL_MULTIBYTE, 1, 110 }, - { 105, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 106, BARCODE_HIBC_PDF, SILVER_F, -1, 8, 0, 30, 0, 1, 110 }, - { 107, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 108, BARCODE_HIBC_MICPDF, SILVER_F, 0, -1, 0, 30, 0, 1, 110 }, - { 109, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 110, BARCODE_HIBC_BLOCKF, SILVER_F, -1, 44, -1, 67, 0, 1, 110 }, - { 111, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 112, BARCODE_HIBC_AZTEC, SILVER_F, -1, 4, 0, 36, 0, 1, 110 }, - { 113, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 114, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 115, BARCODE_DOTCODE, 0, 0, -1, 0, 200, 0, 1, 900 }, - { 116, BARCODE_HANXIN, 0, -1, 5, 0, 84, ZINT_FULL_MULTIBYTE, 1, 7827 }, - { 117, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 118, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 119, BARCODE_MAILMARK_2D, RUBIDIUM_F, 0, -1, 0, 30, DM_SQUARE | DM_ISO_144, 28, 90 }, - { 120, BARCODE_UPU_S10, KRSET_F, 0, -1, 0, -1, 0, 12, 13 }, - { 121, BARCODE_MAILMARK_4S, RUBIDIUM_F, 0, -1, 0, -1, 0, 14, 26 }, - { 122, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 123, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 124, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 125, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 126, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 127, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, /*len*/ 0, -1 }, - { 128, BARCODE_AZRUNE, NEON_F, 0, -1, 0, -1, 0, 1, 3 }, - { 129, BARCODE_CODE32, NEON_F, 0, -1, 0, -1, 0, 1, 8 }, - { 130, BARCODE_EANX_CC, SODIUM_PLS_F, 0, 2, 0, -1, 0, 1, 338 }, - { 131, BARCODE_GS1_128_CC, ASCII_PRT_F, 0, 3, 0, -1, 0, 1, 2361 }, - { 132, BARCODE_DBAR_OMN_CC, NEON_F, 0, 2, 0, -1, 0, 1, 338 }, - { 133, BARCODE_DBAR_LTD_CC, NEON_F, 0, 2, 0, -1, 0, 1, 338 }, - { 134, BARCODE_DBAR_EXP_CC, ASCII_PRT_F, 0, 2, 0, -1, 0, 1, 338 }, - { 135, BARCODE_UPCA_CC, SODIUM_PLS_F, 0, 2, 0, -1, 0, 1, 338 }, - { 136, BARCODE_UPCE_CC, SODIUM_PLS_F, 0, 2, 0, -1, 0, 1, 338 }, - { 137, BARCODE_DBAR_STK_CC, NEON_F, 0, 2, 0, -1, 0, 1, 338 }, - { 138, BARCODE_DBAR_OMNSTK_CC, NEON_F, 0, 2, 0, -1, 0, 1, 338 }, - { 139, BARCODE_DBAR_EXPSTK_CC, ASCII_PRT_F, 0, 2, 0, 11, 0, 1, 338 }, - { 140, BARCODE_CHANNEL, NEON_F, 0, -1, 3, 8, 0, 1, 7 }, - { 141, BARCODE_CODEONE, 0, 0, -1, 0, 10, 0, 1, 3550 }, - { 142, BARCODE_GRIDMATRIX, 0, 0, 5, 0, 13, ZINT_FULL_MULTIBYTE, 1, 1751 }, - { 143, BARCODE_UPNQR, 0, 0, -1, 0, -1, ZINT_FULL_MULTIBYTE, 1, 411 }, - { 144, BARCODE_ULTRA, 0, -1, 5, 0, 2, ULTRA_COMPRESSION, 1, 504 }, - { 145, BARCODE_RMQR, 0, -1, 4, 0, 38, 0, 1, 361 }, - { 146, BARCODE_BC412, ARSENIC_F, 0, -1, 0, -1, 0, 7, 18 }, - { 147, BARCODE_DXFILMEDGE, SILVER_F, 0, -1, 0, -1, 0, 1, 10 }, - { 148, BARCODE_EAN8_CC, SODIUM_PLS_F, 0, 2, 0, -1, 0, 1, 335 }, - { 149, BARCODE_EAN13_CC, SODIUM_PLS_F, 0, 2, 0, -1, 0, 1, 338 }, + { 0, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 1, BARCODE_CODE11, SODIUM_MNS_F, 0, -1, 0, 2, 0, -1, 1, 140 }, + { 2, BARCODE_C25STANDARD, NEON_F, 0, -1, 0, 2, 0, -1, 1, 112 }, + { 3, BARCODE_C25INTER, NEON_F, 0, -1, 0, 2, 0, -1, 1, 125 }, + { 4, BARCODE_C25IATA, NEON_F, 0, -1, 0, 2, 0, -1, 1, 80 }, + { 5, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 6, BARCODE_C25LOGIC, NEON_F, 0, -1, 0, 2, 0, -1, 1, 113 }, + { 7, BARCODE_C25IND, NEON_F, 0, -1, 0, 2, 0, -1, 1, 79 }, + { 8, BARCODE_CODE39, SILVER_F, 0, -1, 0, 2, 0, -1, 1, 86 }, + { 9, BARCODE_EXCODE39, SILVER_F, 0, -1, 0, 2, 0, -1, 1, 86 }, + { 10, BARCODE_EAN8, SODIUM_PLS_F, 0, -1, 0, -1, 0, -1, 1, 14 }, + { 11, BARCODE_EAN_2ADDON, NEON_F, 0, -1, 0, -1, 0, -1, 1, 2 }, + { 12, BARCODE_EAN_5ADDON, NEON_F, 0, -1, 0, -1, 0, -1, 1, 5 }, + { 13, BARCODE_EANX, SODIUM_PLS_F, 0, -1, 0, -1, 0, -1, 1, 19 }, + { 14, BARCODE_EANX_CHK, SODIUM_PLS_F, 0, -1, 0, -1, 0, -1, 1, 19 }, + { 15, BARCODE_EAN13, SODIUM_PLS_F, 0, -1, 0, -1, 0, -1, 1, 19 }, + { 16, BARCODE_GS1_128, ASCII_PRT_F, 0, -1, 0, -1, 0, -1, 3, 198 }, + { 17, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 18, BARCODE_CODABAR, CALCIUM_F, 0, -1, 0, 2, 0, -1, 3, 103 }, + { 19, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 20, BARCODE_CODE128, 0, 0, -1, 0, -1, 0, -1, 1, 198 }, + { 21, BARCODE_DPLEIT, NEON_F, 0, -1, 0, -1, 0, -1, 1, 13 }, + { 22, BARCODE_DPIDENT, NEON_F, 0, -1, 0, -1, 0, -1, 1, 11 }, + { 23, BARCODE_CODE16K, 0, -1, 16, 0, -1, 0, 4, 1, 154 }, + { 24, BARCODE_CODE49, ASCII_F, 2, 8, 0, -1, 1, 4, 1, 81 }, + { 25, BARCODE_CODE93, ASCII_F, 0, -1, 0, 1, 0, -1, 1, 123 }, + { 26, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 27, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 28, BARCODE_FLAT, NEON_F, 0, -1, 0, -1, 0, -1, 1, 128 }, + { 29, BARCODE_DBAR_OMN, NEON_F, 0, -1, 0, -1, 0, -1, 1, 14 }, + { 30, BARCODE_DBAR_LTD, NEON_F, 0, -1, 0, -1, 0, -1, 1, 14 }, + { 31, BARCODE_DBAR_EXP, ASCII_PRT_F, 0, -1, 0, -1, 0, -1, 3, 74 }, + { 32, BARCODE_TELEPEN, ASCII_F, 0, -1, 0, -1, 0, -1, 1, 69 }, + { 33, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 34, BARCODE_UPCA, SODIUM_PLS_F, 0, -1, 0, -1, 0, -1, 1, 18 }, + { 35, BARCODE_UPCA_CHK, SODIUM_PLS_F, 0, -1, 0, -1, 0, -1, 1, 18 }, + { 36, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 37, BARCODE_UPCE, SODIUM_PLS_F, 0, -1, 0, -1, 0, -1, 1, 14 }, + { 38, BARCODE_UPCE_CHK, SODIUM_PLS_F, 0, -1, 0, -1, 0, -1, 1, 14 }, + { 39, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 40, BARCODE_POSTNET, NEON_F, 0, -1, 0, -1, 0, -1, 1, 38 }, + { 41, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 42, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 43, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 44, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 45, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 46, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 47, BARCODE_MSI_PLESSEY, NEON_F, 0, -1, 0, 16, 0, -1, 1, 92 }, + { 48, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 49, BARCODE_FIM, FIM_F, 0, -1, 0, -1, 0, -1, 1, 1 }, + { 50, BARCODE_LOGMARS, SILVER_F, 0, -1, 0, 2, 0, -1, 1, 30 }, + { 51, BARCODE_PHARMA, NEON_F, 0, -1, 0, -1, 0, -1, 1, 6 }, + { 52, BARCODE_PZN, NEON_F, 0, -1, 0, 1, 0, -1, 1, 8 }, + { 53, BARCODE_PHARMA_TWO, NEON_F, 0, -1, 0, -1, 0, -1, 1, 8 }, + { 54, BARCODE_CEPNET, NEON_F, 0, -1, 0, -1, 0, -1, 8, 8 }, + { 55, BARCODE_PDF417, 0, -1, 8, 0, 30, 1, 4, 1, 2710 }, + { 56, BARCODE_PDF417COMP, 0, -1, 8, 0, 30, 4, 4, 1, 2710 }, + { 57, BARCODE_MAXICODE, 0, -1, 6, 0, 100, 0, -1, 1, 138 }, + { 58, BARCODE_QRCODE, 0, -1, 4, 0, 40, 200, 200, 1, 7089 }, + { 59, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 60, BARCODE_CODE128AB, 0, 0, -1, 0, -1, 0, -1, 1, 99 }, + { 61, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 62, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 63, BARCODE_AUSPOST, GDSET_F, 0, -1, 0, -1, 0, -1, 8, 23 }, + { 64, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 65, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 66, BARCODE_AUSREPLY, GDSET_F, 0, -1, 0, -1, 0, -1, 1, 8 }, + { 67, BARCODE_AUSROUTE, GDSET_F, 0, -1, 0, -1, 0, -1, 1, 8 }, + { 68, BARCODE_AUSREDIRECT, GDSET_F, 0, -1, 0, -1, 0, -1, 1, 8 }, + { 69, BARCODE_ISBNX, ISBNX_ADDON_SANE_F, 0, -1, 0, -1, 0, -1, 9, 19 }, + { 70, BARCODE_RM4SCC, KRSET_F, 0, -1, 0, -1, 0, -1, 1, 50 }, + { 71, BARCODE_DATAMATRIX, 0, 0, -1, 0, 48, 128, 128, 1, 3550 }, + { 72, BARCODE_EAN14, NEON_F, 0, -1, 0, -1, 0, -1, 1, 13 }, + { 73, BARCODE_VIN, ARSENIC_F, 0, -1, 0, -1, 0, -1, 17, 17 }, + { 74, BARCODE_CODABLOCKF, 0, -1, 44, -1, 67, 4, 4, 1, 2725 }, + { 75, BARCODE_NVE18, NEON_F, 0, -1, 0, -1, 0, -1, 1, 17 }, + { 76, BARCODE_JAPANPOST, SHKASUTSET_F, 0, -1, 0, -1, 0, -1, 1, 20 }, + { 77, BARCODE_KOREAPOST, NEON_F, 0, -1, 0, -1, 0, -1, 1, 6 }, + { 78, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 79, BARCODE_DBAR_STK, NEON_F, 0, -1, 0, -1, 0, -1, 1, 14 }, + { 80, BARCODE_DBAR_OMNSTK, NEON_F, 0, -1, 0, -1, 0, -1, 1, 14 }, + { 81, BARCODE_DBAR_EXPSTK, ASCII_PRT_F, 0, -1, 0, 11, 0, -1, 1, 74 }, + { 82, BARCODE_PLANET, NEON_F, 0, -1, 0, -1, 0, -1, 1, 38 }, + { 83, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 84, BARCODE_MICROPDF417, 0, 0, -1, 0, 30, 4, 4, 1, 366 }, + { 85, BARCODE_USPS_IMAIL, SODIUM_MNS_F, 0, -1, 0, -1, 0, -1, 1, 32 }, + { 86, BARCODE_PLESSEY, SSET_F, 0, -1, 0, -1, 0, -1, 1, 67 }, + { 87, BARCODE_TELEPEN_NUM, SODIUM_X_F, 0, -1, 0, -1, 0, -1, 1, 136 }, + { 88, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 89, BARCODE_ITF14, NEON_F, 0, -1, 0, -1, 0, 4, 1, 13 }, + { 90, BARCODE_KIX, KRSET_F, 0, -1, 0, -1, 0, -1, 1, 18 }, + { 91, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 92, BARCODE_AZTEC, 0, -1, 4, 0, 36, 128, 128, 1, 4483 }, + { 93, BARCODE_DAFT, DAFT_F, 0, -1, 50, 900, 0, -1, 1, 576 }, + { 94, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 95, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 96, BARCODE_DPD, KRSET_F, 0, -1, 0, -1, 0, 4, 27, 28 }, + { 97, BARCODE_MICROQR, 0, -1, 4, 0, 4, 0, -1, 1, 35 }, + { 98, BARCODE_HIBC_128, SILVER_F, 0, -1, 0, -1, 0, -1, 1, 110 }, + { 99, BARCODE_HIBC_39, SILVER_F, 0, -1, 0, 2, 0, -1, 1, 70 }, + { 100, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 101, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 102, BARCODE_HIBC_DM, SILVER_F, 0, -1, 0, 48, 100, 101, 1, 110 }, + { 103, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 104, BARCODE_HIBC_QR, SILVER_F, -1, 4, 0, 40, 200, 200, 1, 110 }, + { 105, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 106, BARCODE_HIBC_PDF, SILVER_F, -1, 8, 0, 30, 0, -1, 1, 110 }, + { 107, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 108, BARCODE_HIBC_MICPDF, SILVER_F, 0, -1, 0, 30, 0, -1, 1, 110 }, + { 109, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 110, BARCODE_HIBC_BLOCKF, SILVER_F, -1, 44, -1, 67, 0, -1, 1, 110 }, + { 111, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 112, BARCODE_HIBC_AZTEC, SILVER_F, -1, 4, 0, 36, 128, 128, 1, 110 }, + { 113, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 114, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 115, BARCODE_DOTCODE, 0, 0, -1, 0, 200, 0, -1, 1, 900 }, + { 116, BARCODE_HANXIN, 0, -1, 5, 0, 84, 200, 200, 1, 7827 }, + { 117, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 118, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 119, BARCODE_MAILMARK_2D, RUBIDIUM_F, 0, -1, 0, 30, 100, 101, 28, 90 }, + { 120, BARCODE_UPU_S10, KRSET_F, 0, -1, 0, -1, 0, -1, 12, 13 }, + { 121, BARCODE_MAILMARK_4S, RUBIDIUM_F, 0, -1, 0, -1, 0, -1, 14, 26 }, + { 122, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 123, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 124, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 125, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 126, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 127, /*symbology*/ -1, /*sane_flag*/ 0, /*opt_1*/ 0, -1, /*opt_2*/ 0, -1, /*opt_3*/ 0, -1, /*len*/ 0, -1 }, + { 128, BARCODE_AZRUNE, NEON_F, 0, -1, 0, -1, 0, -1, 1, 3 }, + { 129, BARCODE_CODE32, NEON_F, 0, -1, 0, -1, 0, -1, 1, 8 }, + { 130, BARCODE_EANX_CC, SODIUM_PLS_F, 0, 2, 0, -1, 0, -1, 1, 338 }, + { 131, BARCODE_GS1_128_CC, ASCII_PRT_F, 0, 3, 0, -1, 0, -1, 1, 2361 }, + { 132, BARCODE_DBAR_OMN_CC, NEON_F, 0, 2, 0, -1, 0, -1, 1, 338 }, + { 133, BARCODE_DBAR_LTD_CC, NEON_F, 0, 2, 0, -1, 0, -1, 1, 338 }, + { 134, BARCODE_DBAR_EXP_CC, ASCII_PRT_F, 0, 2, 0, -1, 0, -1, 1, 338 }, + { 135, BARCODE_UPCA_CC, SODIUM_PLS_F, 0, 2, 0, -1, 0, -1, 1, 338 }, + { 136, BARCODE_UPCE_CC, SODIUM_PLS_F, 0, 2, 0, -1, 0, -1, 1, 338 }, + { 137, BARCODE_DBAR_STK_CC, NEON_F, 0, 2, 0, -1, 0, -1, 1, 338 }, + { 138, BARCODE_DBAR_OMNSTK_CC, NEON_F, 0, 2, 0, -1, 0, -1, 1, 338 }, + { 139, BARCODE_DBAR_EXPSTK_CC, ASCII_PRT_F, 0, 2, 0, 11, 0, -1, 1, 338 }, + { 140, BARCODE_CHANNEL, NEON_F, 0, -1, 3, 8, 0, -1, 1, 7 }, + { 141, BARCODE_CODEONE, 0, 0, -1, 0, 10, 0, -1, 1, 3550 }, + { 142, BARCODE_GRIDMATRIX, 0, 0, 5, 0, 13, 200, 200, 1, 1751 }, + { 143, BARCODE_UPNQR, 0, 0, -1, 0, -1, 200, 200, 1, 411 }, + { 144, BARCODE_ULTRA, 0, -1, 5, 0, 2, 128, 128, 1, 504 }, + { 145, BARCODE_RMQR, 0, -1, 4, 0, 38, 0, -1, 1, 361 }, + { 146, BARCODE_BC412, ARSENIC_F, 0, -1, 0, -1, 0, -1, 7, 18 }, + { 147, BARCODE_DXFILMEDGE, SILVER_F, 0, -1, 0, -1, 0, -1, 1, 10 }, + { 148, BARCODE_EAN8_CC, SODIUM_PLS_F, 0, 2, 0, -1, 0, -1, 1, 335 }, + { 149, BARCODE_EAN13_CC, SODIUM_PLS_F, 0, 2, 0, -1, 0, -1, 1, 338 }, }; /* Make sure value `v` is between `min` and `max` */ @@ -383,18 +382,29 @@ static int set_symbol(struct zint_symbol *symbol, const int idx, const int chk_s } } /* `option_3` */ - if (length > si->len_min && si->option_3) { - if (*input++ & 1) { /* Odd/even */ - symbol->option_3 = si->option_3; + if (length > si->len_min && (si->option_3_min <= si->option_3_max)) { + if (si->option_3_min + 1 == si->option_3_max) { /* Only one in it? */ + symbol->option_3 = (*input++ & 1) ? si->option_3_min : si->option_3_max; /* Odd/even */ + } else { + symbol->option_3 = clamp(*input++, si->option_3_min, si->option_3_max); } length--; } -#ifdef Z_FUZZ_SET_OUTPUT_OPTIONS + /* `height` */ + if (length > si->len_min && !(ZBarcode_Cap(symbol->symbology, ZINT_CAP_FIXED_RATIO) & ZINT_CAP_FIXED_RATIO)) { + symbol->height = *input++; + length--; + } + /* `border_width` */ + if (length > si->len_min) { + symbol->border_width = *input++; + length--; + } + /* `output_options` */ if (length > si->len_min) { symbol->output_options = *input++ & OUTPUT_OPTIONS_MASK; length--; } -#endif if (length > si->len_max) { return 0; @@ -414,5 +424,54 @@ static int set_symbol(struct zint_symbol *symbol, const int idx, const int chk_s return length; } +/* Boilerplate for stand-alone testing of "fuzz_data" and "fuzz_gs1" to take single corpus file when + `Z_FUZZ_MAIN` defined */ +#define Z_FUZZ_MAIN_READ_ARGV_1(idx, buf) \ +int main(int argc, char *argv[]) { \ + unsigned char data[16384]; \ + size_t size = 0; \ + struct zint_symbol *symbol; \ + int idx; \ + unsigned char *buf; \ + { \ + long fsize; \ + size_t n; \ + FILE *fp; \ + if (argc != 2) { \ + fprintf(stderr, "usage: \n"); \ + return -1; \ + } \ + if (!(fp = fopen(argv[1], "rb"))) { \ + fprintf(stderr, "failed to open input file \"%s\" (%d, %s)\n", argv[1], errno, strerror(errno)); \ + return -1; \ + } \ + if (fseek(fp, 0, SEEK_END) != 0 \ + || (fsize = ftell(fp)) <= 0 || fsize == LONG_MAX \ + || fseek(fp, 0, SEEK_SET) != 0) { \ + fprintf(stderr, "failed to seek input file \"%s\" (%d, %s)\n", argv[1], errno, strerror(errno)); \ + return -1; \ + } \ + if (fsize > (long) sizeof(data)) { \ + fprintf(stderr, "Input file \"%s\" too big, file size %d, buffer max %d\n", argv[1], \ + (int) fsize, (int) sizeof(data)); \ + return -1; \ + } \ + do { \ + n = fread(data + size, 1, fsize - size, fp); \ + if (ferror(fp)) { \ + fprintf(stderr, "Input file \"%s\" read error (%d: %s)", argv[1], errno, strerror(errno)); \ + (void) fclose(fp); \ + return -1; \ + } \ + size += n; \ + } while (!feof(fp) && n > 0 && (long) size < fsize); \ + (void) fclose(fp); \ + if ((long) size != fsize) { \ + fprintf(stderr, "Failed to fully read input file \"%s\" read %d, file size %d\n", \ + argv[1], (int) size, (int) fsize); \ + return -1; \ + } \ + } + /* vim: set ts=4 sw=4 et : */ #endif /* Z_FUZZ_H */ diff --git a/backend/tests/fuzz/fuzz_data.c b/backend/tests/fuzz/fuzz_data.c index b883bf17..e8a7faca 100644 --- a/backend/tests/fuzz/fuzz_data.c +++ b/backend/tests/fuzz/fuzz_data.c @@ -1,7 +1,7 @@ /* fuzz_data.c - fuzzer for libzint (DATA_MODE, all symbologies except GS1_128, DBAR_EXP/STK & composites) */ /* libzint - the open source barcode library - Copyright (C) 2024 Robin Stuart + Copyright (C) 2024-2026 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -36,13 +36,24 @@ extern "C" { #if 0 #define Z_FUZZ_DEBUG /* Set `symbol->debug` flag */ -#define Z_FUZZ_SET_OUTPUT_OPTIONS /* Set `symbol->output_options` */ #endif #include "fuzz.h" +#if Z_FUZZ_MAIN +/* For testing that a corpus file reproduces a bug: + cc -g -O0 -DZ_FUZZ_MAIN fuzz_data.c -o fuzz_data -lzint -fsanitize=address + ./fuzz_data +*/ +#include +#include +Z_FUZZ_MAIN_READ_ARGV_1(idx, buf) +#else int LLVMFuzzerTestOneInput(const unsigned char *data, size_t size) { struct zint_symbol *symbol; int idx; + unsigned char *buf; /* Dummy, used by "fuzz_gs1.c" */ +#endif + (void)buf; /* Ignore empty or very large input */ if (size < 1 || size > 10000) { @@ -70,8 +81,9 @@ int LLVMFuzzerTestOneInput(const unsigned char *data, size_t size) { if (!length) { continue; } + symbol->output_options |= BARCODE_MEMORY_FILE; - ret = ZBarcode_Encode(symbol, input, length); + ret = ZBarcode_Encode_and_Print(symbol, input, length, 0 /*rotate_angle*/); assert(ret != ZINT_ERROR_ENCODING_PROBLEM); } diff --git a/backend/tests/fuzz/fuzz_data_seed_corpus.zip b/backend/tests/fuzz/fuzz_data_seed_corpus.zip index d2a53dfd..5016719f 100644 Binary files a/backend/tests/fuzz/fuzz_data_seed_corpus.zip and b/backend/tests/fuzz/fuzz_data_seed_corpus.zip differ diff --git a/backend/tests/fuzz/fuzz_gs1.c b/backend/tests/fuzz/fuzz_gs1.c index b33fa0e4..9a0253a5 100644 --- a/backend/tests/fuzz/fuzz_gs1.c +++ b/backend/tests/fuzz/fuzz_gs1.c @@ -36,20 +36,30 @@ extern "C" { #if 0 #define Z_FUZZ_DEBUG /* Set `symbol->debug` flag */ -#define Z_FUZZ_SET_OUTPUT_OPTIONS /* Set `symbol->output_options` */ #endif #include "fuzz.h" +static const int symbologies[] = { + BARCODE_AZTEC, BARCODE_CODE16K, BARCODE_CODE49, BARCODE_CODEONE, BARCODE_DATAMATRIX, BARCODE_DBAR_EXP, + BARCODE_DBAR_EXPSTK, BARCODE_DOTCODE, BARCODE_GS1_128, BARCODE_QRCODE, BARCODE_RMQR, BARCODE_ULTRA, + BARCODE_EANX_CC, BARCODE_GS1_128_CC, BARCODE_DBAR_OMN_CC, BARCODE_DBAR_LTD_CC, BARCODE_DBAR_EXP_CC, + BARCODE_UPCA_CC, BARCODE_UPCE_CC, BARCODE_DBAR_STK_CC, BARCODE_DBAR_OMNSTK_CC, BARCODE_DBAR_EXPSTK_CC, +}; + +#if Z_FUZZ_MAIN +/* For testing that a corpus file reproduces a bug: + cc -g -O0 -DZ_FUZZ_MAIN fuzz_gs1.c -o fuzz_data -lzint -fsanitize=address + ./fuzz_gs1 +*/ +#include +#include +Z_FUZZ_MAIN_READ_ARGV_1(i, gs1_buf) +#else int LLVMFuzzerTestOneInput(const unsigned char *data, size_t size) { - static const int symbologies[] = { - BARCODE_AZTEC, BARCODE_CODE16K, BARCODE_CODE49, BARCODE_CODEONE, BARCODE_DATAMATRIX, BARCODE_DBAR_EXP, - BARCODE_DBAR_EXPSTK, BARCODE_DOTCODE, BARCODE_GS1_128, BARCODE_QRCODE, BARCODE_RMQR, BARCODE_ULTRA, - BARCODE_EANX_CC, BARCODE_GS1_128_CC, BARCODE_DBAR_OMN_CC, BARCODE_DBAR_LTD_CC, BARCODE_DBAR_EXP_CC, - BARCODE_UPCA_CC, BARCODE_UPCE_CC, BARCODE_DBAR_STK_CC, BARCODE_DBAR_OMNSTK_CC, BARCODE_DBAR_EXPSTK_CC, - }; struct zint_symbol *symbol; - unsigned char *gs1_buf; int i; + unsigned char *gs1_buf; +#endif /* Ignore empty or very large input */ if (size < 1 || size > 10000) { @@ -65,12 +75,16 @@ int LLVMFuzzerTestOneInput(const unsigned char *data, size_t size) { gs1_buf[1] = ']'; for (i = 0; i < ZARRAY_SIZE(symbologies); i++) { + static const char primary_ai_raw[] = "0112345678901231"; + static const char primary_ai_caret[] = "^0112345678901231"; + static const char primary_ai_parens[] = "(01)12345678901231"; static const char primary_ai[] = "[01]12345678901231"; static const char primary_upce[] = "12345670"; static const char primary[] = "123456789012"; const int idx = symbologies[i]; const int is_composite = ZBarcode_Cap(idx, ZINT_CAP_COMPOSITE) & ZINT_CAP_COMPOSITE; const unsigned char *input; + int input_mode; int length; int ret; @@ -81,10 +95,21 @@ int LLVMFuzzerTestOneInput(const unsigned char *data, size_t size) { if (!length) { continue; } + input_mode = symbol->input_mode; + + symbol->output_options |= BARCODE_MEMORY_FILE; if (is_composite) { if (idx == BARCODE_GS1_128_CC || idx == BARCODE_DBAR_EXP_CC || idx == BARCODE_DBAR_EXPSTK_CC) { - memcpy(symbol->primary, primary_ai, sizeof(primary_ai)); + if (input_mode & GS1RAW_MODE) { + memcpy(symbol->primary, primary_ai_raw, sizeof(primary_ai_raw)); + } else if (input[0] == '^') { + memcpy(symbol->primary, primary_ai_caret, sizeof(primary_ai_caret)); + } else if (input_mode & GS1PARENS_MODE) { + memcpy(symbol->primary, primary_ai_parens, sizeof(primary_ai_parens)); + } else { + memcpy(symbol->primary, primary_ai, sizeof(primary_ai)); + } } else if (idx == BARCODE_UPCE_CC) { memcpy(symbol->primary, primary_upce, sizeof(primary_upce)); } else { @@ -92,21 +117,21 @@ int LLVMFuzzerTestOneInput(const unsigned char *data, size_t size) { } } - /* Try it first without GS1NOCHECK_MODE */ - symbol->input_mode = (symbol->input_mode & ~0x07) | GS1_MODE; + /* Try it first with GS1NOCHECK_MODE */ + symbol->input_mode = (input_mode & ~0x07) | GS1_MODE | GS1NOCHECK_MODE; - ret = ZBarcode_Encode(symbol, input, length); + ret = ZBarcode_Encode_and_Print(symbol, input, length, 0 /*rotate_angle*/); assert(ret != ZINT_ERROR_ENCODING_PROBLEM); ZBarcode_Clear(symbol); - /* Now with GS1NOCHECK_MODE */ - symbol->input_mode = (symbol->input_mode & ~0x07) | GS1_MODE | GS1NOCHECK_MODE; - symbol->input_mode &= ~GS1PARENS_MODE; + /* Now without GS1NOCHECK_MODE */ + symbol->input_mode = (input_mode & ~0x07) | GS1_MODE; + symbol->input_mode &= ~GS1NOCHECK_MODE; memcpy(gs1_buf + 2, input, length); - ret = ZBarcode_Encode(symbol, gs1_buf, length + 2); + ret = ZBarcode_Encode_and_Print(symbol, gs1_buf, length + 2, 90 * (size % 3) /*rotate_angle*/); assert(ret != ZINT_ERROR_ENCODING_PROBLEM); } diff --git a/backend/tests/fuzz/fuzz_gs1.dict b/backend/tests/fuzz/fuzz_gs1.dict index dd11f36f..6bbd7c5c 100644 --- a/backend/tests/fuzz/fuzz_gs1.dict +++ b/backend/tests/fuzz/fuzz_gs1.dict @@ -1,10 +1,10 @@ +"[10]" +"[91]" +"^" +"^10" +"^91" +"10" +"91" +"\x1D" "%" "%%" -"[01]" -"[10]" -"[15]" -"[17]" -"[20]" -"[3103]" -"[3202]" -"[91]" diff --git a/backend/tests/fuzz/fuzz_gs1_seed_corpus.zip b/backend/tests/fuzz/fuzz_gs1_seed_corpus.zip index 378a9c8d..feddc6fe 100644 Binary files a/backend/tests/fuzz/fuzz_gs1_seed_corpus.zip and b/backend/tests/fuzz/fuzz_gs1_seed_corpus.zip differ diff --git a/backend/tests/fuzz/gen_corpora.c b/backend/tests/fuzz/gen_corpora.c index 935c387a..a22dd24c 100644 --- a/backend/tests/fuzz/gen_corpora.c +++ b/backend/tests/fuzz/gen_corpora.c @@ -6,7 +6,7 @@ rm -rf fuzz_data_corpus fuzz_gs1_corpus rm -f fuzz_data_seed_corpus.zip fuzz_gs1_seed_corpus.zip - gcc gen_corpora.c -o gen_corpora -lzint -fsanitize=address + cc gen_corpora.c -o gen_corpora -lzint -fsanitize=address ./gen_corpora zip -j fuzz_data_seed_corpus.zip fuzz_data_corpus/* zip -j fuzz_gs1_seed_corpus.zip fuzz_gs1_corpus/* @@ -59,29 +59,32 @@ struct item { int test_fuzz_idx; int symbology; int input_mode; + int output_options; int eci; int option_1; int option_2; int option_3; + float height; + int border_width; char *data; int length; }; /* DATA_MODE data */ static const struct item data_data[] = { - /* 0*/ { 0, BARCODE_CODEONE, -1, -1, -1, -1, -1, "3333P33B\035333V3333333333333\0363", -1 }, /* #181 Nico Gunkel, OSS-Fuzz */ - /* 1*/ { 1, BARCODE_CODEONE, -1, -1, -1, -1, -1, "{{-06\024755712162106130000000829203983\377", -1 }, /* #232 Jan Schrewe, CI-Fuzz, out-of-bounds in is_last_single_ascii() sp + 1 */ - /* 2*/ { 2, BARCODE_CODEONE, -1, -1, -1, -1, -1, "\000\000\000\367\000\000\000\000\000\103\040\000\000\244\137\140\140\000\000\000\000\000\000\000\000\000\005\000\000\000\000\000\165\060\060\060\060\061\060\060\114\114\060\010\102\102\102\102\102\102\102\102\057\102\100\102\057\233\100\102", 60 }, /* #300 (#4) Andre Maute (`c1_c40text_cnt()` not accounting for extended ASCII shifts) */ - /* 3*/ { 3, BARCODE_CODEONE, -1, -1, -1, 10, -1, "\153\153\153\060\001\000\134\153\153\015\015\353\362\015\015\015\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\015\015\015\015\015\015\015\015\015\015\015\015\015\015\015\362\362\000", 65 }, /* #300 (#8) Andre Maute (`c1_encode()` looping on latch) */ - /* 4*/ { 4, BARCODE_CODEONE, -1, -1, -1, 10, -1, "\015\015\353\362\015\015\015\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\015\015\015\015\015\015\015\015\015\015\015\015\015\015\015\362\362\000", 39 }, /* #300 (#8 shortened) Andre Maute */ - /* 5*/ { 5, BARCODE_CODEONE, -1, -1, -1, 10, -1, "\153\153\153\153\153\060\001\000\000\134\153\153\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\153\153\153\153\153\153\043\000\000\307\000\147\000\000\000\043\113\153\162\162\215\220", 90 }, /* #300 (#12) Andre Maute (too small buffer for Version T) */ - /* 6*/ { 0, BARCODE_TELEPEN, -1, -1, -1, -1, -1, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000", 69 }, /* #181 Nico Gunkel OSS-Fuzz */ - /* 7*/ { 2, BARCODE_TELEPEN_NUM, -1, -1, -1, -1, -1, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000", 70 }, - /* 8*/ { 3, BARCODE_TELEPEN_NUM, -1, -1, -1, -1, -1, "0404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404", 136 }, - /* 9*/ { 5, BARCODE_TELEPEN_NUM, -1, -1, -1, -1, -1, "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000X", 136 }, - /* 10*/ { 6, BARCODE_TELEPEN_NUM, -1, -1, -1, -1, -1, "9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999", 136 }, - /* 11*/ { 0, BARCODE_CODABLOCKF, -1, -1, -1, -1, -1, "\034\034I", 3 }, /* #181 Christian Hartlage OSS-Fuzz */ - /* 12*/ { 0, BARCODE_AZTEC, -1, -1, -1, -1, -1, + /* 0*/ { 0, BARCODE_CODEONE, -1, 0, -1, -1, -1, -1, 0, 0, "3333P33B\035333V3333333333333\0363", -1 }, /* #181 Nico Gunkel, OSS-Fuzz */ + /* 1*/ { 1, BARCODE_CODEONE, -1, 0, -1, -1, -1, -1, 0, 0, "{{-06\024755712162106130000000829203983\377", -1 }, /* #232 Jan Schrewe, CI-Fuzz, out-of-bounds in is_last_single_ascii() sp + 1 */ + /* 2*/ { 2, BARCODE_CODEONE, -1, 0, -1, -1, -1, -1, 0, 0, "\000\000\000\367\000\000\000\000\000\103\040\000\000\244\137\140\140\000\000\000\000\000\000\000\000\000\005\000\000\000\000\000\165\060\060\060\060\061\060\060\114\114\060\010\102\102\102\102\102\102\102\102\057\102\100\102\057\233\100\102", 60 }, /* #300 (#4) Andre Maute (`c1_c40text_cnt()` not accounting for extended ASCII shifts) */ + /* 3*/ { 3, BARCODE_CODEONE, -1, 0, -1, -1, 10, -1, 0, 0, "\153\153\153\060\001\000\134\153\153\015\015\353\362\015\015\015\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\015\015\015\015\015\015\015\015\015\015\015\015\015\015\015\362\362\000", 65 }, /* #300 (#8) Andre Maute (`c1_encode()` looping on latch) */ + /* 4*/ { 4, BARCODE_CODEONE, -1, 0, -1, -1, 10, -1, 0, 0, "\015\015\353\362\015\015\015\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\110\015\015\015\015\015\015\015\015\015\015\015\015\015\015\015\362\362\000", 39 }, /* #300 (#8 shortened) Andre Maute */ + /* 5*/ { 5, BARCODE_CODEONE, -1, 0, -1, -1, 10, -1, 0, 0, "\153\153\153\153\153\060\001\000\000\134\153\153\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\153\153\153\153\153\153\043\000\000\307\000\147\000\000\000\043\113\153\162\162\215\220", 90 }, /* #300 (#12) Andre Maute (too small buffer for Version T) */ + /* 6*/ { 0, BARCODE_TELEPEN, -1, 0, -1, -1, -1, -1, 0, 0, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000", 69 }, /* #181 Nico Gunkel OSS-Fuzz */ + /* 7*/ { 2, BARCODE_TELEPEN_NUM, -1, 0, -1, -1, -1, -1, 0, 0, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000", 70 }, + /* 8*/ { 3, BARCODE_TELEPEN_NUM, -1, 0, -1, -1, -1, -1, 0, 0, "0404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404", 136 }, + /* 9*/ { 5, BARCODE_TELEPEN_NUM, -1, 0, -1, -1, -1, -1, 0, 0, "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000X", 136 }, + /* 10*/ { 6, BARCODE_TELEPEN_NUM, -1, 0, -1, -1, -1, -1, 0, 0, "9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999", 136 }, + /* 11*/ { 0, BARCODE_CODABLOCKF, -1, 0, -1, -1, -1, -1, 0, 0, "\034\034I", 3 }, /* #181 Christian Hartlage OSS-Fuzz */ + /* 12*/ { 0, BARCODE_AZTEC, -1, 0, -1, -1, -1, -1, 0, 0, "\133\060\060\060\135\060\125\125\125\125\140\060\125\125\125\125\060\060\060\271\060\060\125\103\164\125\125\125\377\377\125\125" "\125\125\125\125\125\133\060\076\060\135\261\177\261\261\261\236\261\261\261\040\261\261\261\261\261\261\261\020\261\261\261\261" "\261\261\265\261\261\261\261\261\261\261\261\261\261\261\261\040\224\261\261\261\261\261\000\000\004\000\031\060\031\031\031\031" @@ -154,7 +157,7 @@ static const struct item data_data[] = { "\377\377\377\377\377\377\261\261\261\261\261\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\135\135\135\135\135\135" "\135\335\135\060\060\010\010\010\010\010\060", 2251 }, /* Original OSS-Fuzz triggering data for malloc leak */ - /* 13*/ { 1, BARCODE_AZTEC, -1, -1, -1, -1, -1, + /* 13*/ { 1, BARCODE_AZTEC, -1, 0, -1, -1, -1, -1, 0, 0, "\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060" "\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\000\060\060\060\060\000\060\060\000\060\060\060\060" "\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060" @@ -244,7 +247,7 @@ static const struct item data_data[] = { "\175\060\060\060\175\175\175\175\060\060\005\060\005\060\005\060\060\060\060\000\000\060\060\060\060\060\060\377\060\060\060\060" "\377\060\377\377\060\060\057\060\060\057\060\060\060\000\000\060\060", 2801 }, /* Original OSS-Fuzz triggering data for binary_string buffer overrun */ - /* 14*/ { 2, BARCODE_AZTEC, -1, -1, 1, -1, -1, + /* 14*/ { 2, BARCODE_AZTEC, -1, 0, -1, 1, -1, -1, 0, 0, "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" @@ -280,7 +283,7 @@ static const struct item data_data[] = { "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123", 4483 }, /* 4483 = (1664 (Max codewords) - 169 (ECC codewords) - 5/12 (D/L) - 3/12 (padding)) * 3 (3 4-bit digits per 12-bit wordcode) = 4483 */ - /* 15*/ { 8, BARCODE_AZTEC, -1, -1, -1, 1, -1, + /* 15*/ { 8, BARCODE_AZTEC, -1, 0, -1, -1, 1, -1, 0, 0, "\105\105\000\000\000\000\000\000\000\000\077\012\377\377\377\072\376\376\350\350\350\350\350\250\350\350\350\350\354\350\350\350\350\350\001\000\000\000\000\000" "\000\036\103\012\072\103\103\000\100\116\000\000\000\000\000\000\000\000\000\000\002\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\077\012" "\377\377\377\072\376\376\350\350\350\350\350\250\350\350\350\350\354\350\350\350\000\000\000\000\000\000\000\033\000\036\103\012\072\103\103\000\100\116\000\000" @@ -338,7 +341,7 @@ static const struct item data_data[] = { "\377\377\103\377\364\377\364", 2167 }, /* #300 (#2) Andre Maute */ - /* 16*/ { 10, BARCODE_AZTEC, -1, -1, -1, 1, -1, + /* 16*/ { 10, BARCODE_AZTEC, -1, 0, -1, -1, 1, -1, 0, 0, "\105\105\000\000\000\000\000\000\000\000\077\012\377\377\377\072\376\376\350\350\350\350\350\250\350\350\350\350\354\350\350\350\350\350\001\000\000\000\000\000" "\000\036\103\012\072\103\103\000\100\116\000\000\000\000\000\000\000\000\000\000\002\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\077\012" "\377\377\377\072\376\376\350\350\350\350\350\250\350\350\350\350\354\350\350\350\000\000\000\000\000\000\000\033\000\036\103\012\072\103\103\000\100\116\000\000" @@ -395,7 +398,7 @@ static const struct item data_data[] = { "\027\027\027\027\027\027\027\027\027\000\027\027\027\027\000\004\000\000\000\000\000\135\000\044\103\000\000\377\377\377\377\377\103\377\364\377\364", 2157 }, /* #300 (#3) Andre Maute */ - /* 17*/ { 11, BARCODE_AZTEC, -1, -1, 2, -1, -1, + /* 17*/ { 11, BARCODE_AZTEC, -1, 0, -1, 2, -1, -1, 0, 0, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" @@ -423,7 +426,7 @@ static const struct item data_data[] = { "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000", 996 }, /* Padding 11 example causing issue with ZXing-C++ */ - /* 18*/ { 12, BARCODE_AZTEC, -1, -1, -1, -1, -1, + /* 18*/ { 12, BARCODE_AZTEC, -1, 0, -1, -1, -1, -1, 0, 0, "\133\060\060\060\135\060\125\125\125\125\140\060\125\125\125\125\060\060\060\271\060\060\125\103\164\125\125\125\377\377\125\125\125\125\125\125\125\133\060\076" "\060\135\261\177\261\261\261\236\261\261\261\040\261\261\261\261\261\261\261\020\261\261\261\261\261\261\265\261\261\261\261\261\261\261\261\261\261\261\261\040" "\224\261\261\261\261\261\000\000\004\000\031\060\031\031\031\031\031\031\031\031\261\261\040\261\261\261\261\261\261\261\020\261\377\377\377\377\377\377\377\377" @@ -537,7 +540,7 @@ static const struct item data_data[] = { "\010\060", 4402 }, /* fuzz_data (1st) */ - /* 19*/ { 0, BARCODE_PDF417, FAST_MODE, -1, -1, -1, -1, + /* 19*/ { 0, BARCODE_PDF417, FAST_MODE, 0, -1, -1, -1, -1, 0, 0, "\060\075\204\060\204\060\204\041\060\075\060\204\060\075\060\075\204\060\075\060\103\204\060\204\060\003\120\060\075\060\004\060\204\060\074\204\060\204\060\075" "\204\060\075\060\103\204\060\214\060\204\060\075\060\031\060\073\060\025\060\075\060\204\060\103\204\060\075\060\204\060\000\075\060\226\060\100\204\060\204\060" "\204\060\075\204\060\120\214\060\204\060\074\377\060\075\204\060\075\060\103\204\060\214\060\204\060\075\060\041\060\000\060\204\060\120\214\060\204\060\074\204" @@ -565,7 +568,7 @@ static const struct item data_data[] = { "\204\060\003\060\204\075\060\120\214\060\204\060\004\060\103\204\060\204\060\003\060\211\074\060\120\060\124\060\351\060\120\060\075\060\351\060\072\375\060\204\060", 1001 }, /* Original OSS-Fuzz triggering data */ - /* 20*/ { 1, BARCODE_PDF417, -1, -1, -1, -1, -1, + /* 20*/ { 1, BARCODE_PDF417, -1, 0, -1, -1, -1, -1, 0, 0, "\060\075\204\060\204\060\204\041\060\075\060\204\060\075\060\075\204\060\075\060\103\204\060\204\060\003\120\060\075\060\004\060\204\060\074\204\060\204\060\075" "\204\060\075\060\103\204\060\214\060\204\060\075\060\031\060\073\060\025\060\075\060\204\060\103\204\060\075\060\204\060\000\075\060\226\060\100\204\060\204\060" "\204\060\075\204\060\120\214\060\204\060\074\377\060\075\204\060\075\060\103\204\060\214\060\204\060\075\060\041\060\000\060\204\060\120\214\060\204\060\074\204" @@ -593,7 +596,7 @@ static const struct item data_data[] = { "\204\060\003\060\204\075\060\120\214\060\204\060\004\060\103\204\060\204\060\003\060\211\074\060\120\060\124\060\351\060\120\060\075\060\351\060\072\375\060\204\060", 1001 }, /* Original OSS-Fuzz triggering data */ - /* 21*/ { 28, BARCODE_PDF417COMP, FAST_MODE, -1, 0, -1, -1, + /* 21*/ { 28, BARCODE_PDF417COMP, FAST_MODE, 0, -1, 0, -1, -1, 0, 0, "\000\000\000\377\377\010\002\000\000\033\005\031\000\000\002\000\000\000\000\101\101\101\101\101\101\101\101\000\000\000\000\000\000\000\374\000\101\101\101\000" "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\323\000\000\000\000\000\010\000\000\000\000\165\000\000\000\000\000\000\000\000\000\000\000\000\056" "\000\000\000\000\000\000\000\000\000\000\100\000\000\101\101\101\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\323\000\000\000\000\000\010\000" @@ -623,7 +626,7 @@ static const struct item data_data[] = { "\000\000\000\000\000\000\000\000", 1048 }, /* #300 (#1) Andre Maute (`pdf_text_submode_length()` not checking if previous/next BYT) */ - /* 22*/ { 29, BARCODE_PDF417, FAST_MODE, -1, -1, -1, -1, + /* 22*/ { 29, BARCODE_PDF417, FAST_MODE, 0, -1, -1, -1, -1, 0, 0, "\060\060\060\060\060\060\060\060\060\060\060\162\162\162\162\162\162\162\162\162\162\047\122\162\000\000\167\211\206\001\000\047\153\153\153\153\153\067\066\164" "\060\060\060\060\060\060\060\060\060\060\060\162\162\162\162\162\162\162\162\162\162\047\122\162\000\000\167\211\206\001\000\047\153\153\153\153\153\153\153\164" "\164\164\164\164\164\124\164\164\164\164\164\164\164\164\164\164\164\164\164\164\060\060\060\060\060\060\060\060\060\060\060\162\162\162\162\162\162\162\162\162" @@ -692,7 +695,7 @@ static const struct item data_data[] = { "\162\162\001\100\167\167\001\044\204\167\167", 2611 }, /* #300 (#7) Andre Maute */ - /* 23*/ { 30, BARCODE_PDF417, -1, -1, -1, -1, -1, + /* 23*/ { 30, BARCODE_PDF417, -1, 0, -1, -1, -1, -1, 0, 0, "\060\060\060\060\060\060\060\060\060\060\060\162\162\162\162\162\162\162\162\162\162\047\122\162\000\000\167\211\206\001\000\047\153\153\153\153\153\067\066\164" "\060\060\060\060\060\060\060\060\060\060\060\162\162\162\162\162\162\162\162\162\162\047\122\162\000\000\167\211\206\001\000\047\153\153\153\153\153\153\153\164" "\164\164\164\164\164\124\164\164\164\164\164\164\164\164\164\164\164\164\164\164\060\060\060\060\060\060\060\060\060\060\060\162\162\162\162\162\162\162\162\162" @@ -761,7 +764,7 @@ static const struct item data_data[] = { "\162\162\001\100\167\167\001\044\204\167\167", 2611 }, /* #300 (#7) Andre Maute !FAST_MODE */ - /* 24*/ { 31, BARCODE_PDF417, FAST_MODE, -1, -1, 0 /*same effect as 242*/, -1, + /* 24*/ { 31, BARCODE_PDF417, FAST_MODE, 0, -1, -1, 0 /*same effect as 242*/, -1, 0, 0, "\000\000\000\000\000\000\000\000\000\000\000\212\377\000\000\153\153\153\153\153\153\153\060\047\047\043\047\057\153\000\153\153\137\377\153\153\000\134\000\000" "\000\153\153\343\153\153\153\060\047\047\043\047\057\157\153\153\153\000\162\162\162\162\162\162\377\053\377\377\377\134\134\134\142\134\162\162\377\377\377\167" "\001\100\000\377\004\002\000\000\000\000\000\001\000\000\134\077\162\072\176\000\162\162\162\162\162\162\377\053\377\377\377\134\134\134\142\134\162\162\162\162" @@ -832,17 +835,17 @@ static const struct item data_data[] = { "\057\262\054\377\134\134\142\153\330\153", 2690 }, /* #300 (#10) Andre Maute */ - /* 25*/ { 1, BARCODE_QRCODE, -1, -1, -1, -1, ZINT_FULL_MULTIBYTE, "\215\215\350\2156750\215\215\215\215\215\215\000\000\000\025\215\215\215\215\215\232\215\232\232\001\361\215\215\215\215\215\221\215\215\215\215JJJJJJNJJJJJJ\215\215\215\2159999\215\215\215\215\215\215\215\215\215\235\215\215\215\215\215\035\004\000\000@\000\000\000\000\375\000\000\000\000\000\000\000\000\000\000\000\000\000\241\000\000\000\000\000\000\000\241\247^^^\377\377\377\000 \000\000\000\000\000\000\377\377u\000\000\000\000\000\000\000^\377\377^^\000:\000\177\377\377\377?\377\377\377\377\377\377\377\377\377\377\377\377\377\377\241\241\232\232\232\232\232\232\232\232\000\377\377\377\242\003\000\000\377\377/\000AA\000\000\000\000\000\000\000\000\000\000\000\000T\000\000\000\000\000\000\000\000WWW\237\250WWWWWW\377\377R30 \377\377\000\000\000", 231 }, /* #300 (#15), Andre Maute */ - /* 26*/ { 2, BARCODE_QRCODE, -1, 35, -1, -1, ZINT_FULL_MULTIBYTE, "\215\215\215\215\215\350\215\215999\215\21500000\215\215\215\215\215\215\377O\000\000\036\000\000\000\000\357\376\026\377\377\377\377\241\241\232\232\232\232\232\232\235\032@\374:JGB \000\000@d\000\000\000\241\241\000\000\027\002\241\241\000\000\014\000\000\000\000\357\327\004\000\000\000\000\000\000\000\375\000\000\000\000\000\000\000\000\000\000\000\000\0000253]9R4R44,44,4404[255\350999\215\21599999\215\215\215\2150000\215\215\215\215\215\215\215\215\215]9444442<4444,4044%44vA\000\000\002\000'\000\000\215\377@\215\215\350\215\215\215\215\215\215\215\307\306\306n\215\215\000\000\001\000\000\203\000\000\000\000\000\000@\215\215\215[\2154315@]R0", 229 }, /* #300 (#16), Andre Maute */ - /* 27*/ { 0, BARCODE_AUSROUTE, -1, -1, -1, -1, -1, "A\000\000\000", 4 }, /* #181 Christian Hartlage OSS-Fuzz */ - /* 28*/ { 1, BARCODE_AUSROUTE, -1, -1, -1, -1, -1, "1\000\000\000", 4 }, /* #181 Christian Hartlage OSS-Fuzz */ - /* 29*/ { 0, BARCODE_EANX, -1, -1, -1, -1, -1, "55++15", -1, }, /* #181 Christian Hartlage OSS-Fuzz */ - /* 30*/ { 1, BARCODE_EANX, -1, -1, -1, -1, -1, "+123456789012345678", -1, }, /* #181 Christian Hartlage OSS-Fuzz */ - /* 31*/ { 8, BARCODE_EANX, -1, -1, -1, -1, -1, "+12345", -1, }, /* #181 Christian Hartlage OSS-Fuzz */ - /* 32*/ { 9, BARCODE_EANX, -1, -1, -1, -1, -1, "+123456", -1, }, /* #181 Christian Hartlage OSS-Fuzz */ - /* 33*/ { 10, BARCODE_EANX, -1, -1, -1, -1, -1, "000002000000200+203", -1 }, /* #218 Jan Schrewe CI-Fuzz */ - /* 34*/ { 0, BARCODE_DOTCODE, -1, -1, -1, -1, -1, "(\207'", -1 }, /* #181 Christian Hartlage / Nico Gunkel OSS-Fuzz */ - /* 35*/ { 1, BARCODE_DOTCODE, -1, -1, -1, -1, -1, + /* 25*/ { 1, BARCODE_QRCODE, -1, 0, -1, -1, -1, ZINT_FULL_MULTIBYTE, 0, 0, "\215\215\350\2156750\215\215\215\215\215\215\000\000\000\025\215\215\215\215\215\232\215\232\232\001\361\215\215\215\215\215\221\215\215\215\215JJJJJJNJJJJJJ\215\215\215\2159999\215\215\215\215\215\215\215\215\215\235\215\215\215\215\215\035\004\000\000@\000\000\000\000\375\000\000\000\000\000\000\000\000\000\000\000\000\000\241\000\000\000\000\000\000\000\241\247^^^\377\377\377\000 \000\000\000\000\000\000\377\377u\000\000\000\000\000\000\000^\377\377^^\000:\000\177\377\377\377?\377\377\377\377\377\377\377\377\377\377\377\377\377\377\241\241\232\232\232\232\232\232\232\232\000\377\377\377\242\003\000\000\377\377/\000AA\000\000\000\000\000\000\000\000\000\000\000\000T\000\000\000\000\000\000\000\000WWW\237\250WWWWWW\377\377R30 \377\377\000\000\000", 231 }, /* #300 (#15), Andre Maute */ + /* 26*/ { 2, BARCODE_QRCODE, -1, 0, 35, -1, -1, ZINT_FULL_MULTIBYTE, 0, 0, "\215\215\215\215\215\350\215\215999\215\21500000\215\215\215\215\215\215\377O\000\000\036\000\000\000\000\357\376\026\377\377\377\377\241\241\232\232\232\232\232\232\235\032@\374:JGB \000\000@d\000\000\000\241\241\000\000\027\002\241\241\000\000\014\000\000\000\000\357\327\004\000\000\000\000\000\000\000\375\000\000\000\000\000\000\000\000\000\000\000\000\0000253]9R4R44,44,4404[255\350999\215\21599999\215\215\215\2150000\215\215\215\215\215\215\215\215\215]9444442<4444,4044%44vA\000\000\002\000'\000\000\215\377@\215\215\350\215\215\215\215\215\215\215\307\306\306n\215\215\000\000\001\000\000\203\000\000\000\000\000\000@\215\215\215[\2154315@]R0", 229 }, /* #300 (#16), Andre Maute */ + /* 27*/ { 0, BARCODE_AUSROUTE, -1, 0, -1, -1, -1, -1, 0, 0, "A\000\000\000", 4 }, /* #181 Christian Hartlage OSS-Fuzz */ + /* 28*/ { 1, BARCODE_AUSROUTE, -1, 0, -1, -1, -1, -1, 0, 0, "1\000\000\000", 4 }, /* #181 Christian Hartlage OSS-Fuzz */ + /* 29*/ { 0, BARCODE_EANX, -1, 0, -1, -1, -1, -1, 0, 0, "55++15", -1, }, /* #181 Christian Hartlage OSS-Fuzz */ + /* 30*/ { 1, BARCODE_EANX, -1, 0, -1, -1, -1, -1, 0, 0, "+123456789012345678", -1, }, /* #181 Christian Hartlage OSS-Fuzz */ + /* 31*/ { 8, BARCODE_EANX, -1, 0, -1, -1, -1, -1, 0, 0, "+12345", -1, }, /* #181 Christian Hartlage OSS-Fuzz */ + /* 32*/ { 9, BARCODE_EANX, -1, 0, -1, -1, -1, -1, 0, 0, "+123456", -1, }, /* #181 Christian Hartlage OSS-Fuzz */ + /* 33*/ { 10, BARCODE_EANX, -1, 0, -1, -1, -1, -1, 0, 0, "000002000000200+203", -1 }, /* #218 Jan Schrewe CI-Fuzz */ + /* 34*/ { 0, BARCODE_DOTCODE, -1, 0, -1, -1, -1, -1, 0, 0, "(\207'", -1 }, /* #181 Christian Hartlage / Nico Gunkel OSS-Fuzz */ + /* 35*/ { 1, BARCODE_DOTCODE, -1, 0, -1, -1, -1, -1, 0, 0, "\133\061\106\133\061\106\070\161\116\133\116\116\067\040\116\016\000\116\125\111\125\125\316\125\125\116\116\116\116\117\116\125" "\111\125\103\316\125\125\116\116\116\116\117\000\000\116\136\116\116\001\116\316\076\116\116\057\136\116\116\134\000\000\116\116" "\116\230\116\116\116\116\125\125\125\257\257\257\000\001\116\130\212\212\212\212\212\212\212\377\377\210\212\212\177\000\212\212" @@ -859,14 +862,14 @@ static const struct item data_data[] = { "\071\071\071\071\071", 421 }, /* Original OSS-Fuzz triggering data for index out of bounds (encoding of HT/FS/GS/RS when shifting to code set B) */ - /* 36*/ { 2, BARCODE_DOTCODE, -1, -1, -1, -1, -1, "\233:", -1 }, /* Original OSS-Fuzz triggering data for codeword_array buffer overflow, L777 */ - /* 37*/ { 3, BARCODE_DOTCODE, -1, -1, -1, -1, -1, "\241\034", -1 }, /* As above L793 */ - /* 38*/ { 4, BARCODE_DOTCODE, -1, -1, -1, -1, -1, "\270\036", -1 }, /* As above L799 */ - /* 39*/ { 5, BARCODE_DOTCODE, -1, -1, -1, -1, -1, "\237\032", -1 }, /* As above L904 */ - /* 40*/ { 6, BARCODE_DOTCODE, -1, -1, -1, -1, -1, "\237", -1 }, /* As above L1090 */ - /* 41*/ { 0, BARCODE_MAXICODE, -1, -1, -1, -1, -1, "\223\223\223\223\223\200\000\060\060\020\122\104\060\343\000\000\040\104\104\104\104\177\377\040\000\324\336\000\000\000\000\104\060\060\060\060\104\104\104\104\104\104\104\104\104\104\104\104\104\104\104\104\104\104\104\104\104\104\104\104\104\104\104\060\104\104\000\000\000\040\104\104\104\104\177\377\377\377\324\336\000\000\000\000\104\377\104\001\104\104\104\104\104\104\233\233\060\060\060\060\060\060\060\060\060\325\074", 107 }, /* #181 Nico Gunkel OSS-Fuzz - original OSS-Fuzz triggering data */ - /* 42*/ { 1, BARCODE_MAXICODE, -1, -1, -1, -1, -1, "AaAaAaAaAaAaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA123456789", -1 }, /* Add 6 lowercase a's so 6 SHIFTS inserted so 6 + 138 (max input len) = 144 and numbers come at end of buffer */ - /* 43*/ { 0, BARCODE_CODE128, DATA_MODE | EXTRA_ESCAPE_MODE, -1, -1, -1, -1, + /* 36*/ { 2, BARCODE_DOTCODE, -1, 0, -1, -1, -1, -1, 0, 0, "\233:", -1 }, /* Original OSS-Fuzz triggering data for codeword_array buffer overflow, L777 */ + /* 37*/ { 3, BARCODE_DOTCODE, -1, 0, -1, -1, -1, -1, 0, 0, "\241\034", -1 }, /* As above L793 */ + /* 38*/ { 4, BARCODE_DOTCODE, -1, 0, -1, -1, -1, -1, 0, 0, "\270\036", -1 }, /* As above L799 */ + /* 39*/ { 5, BARCODE_DOTCODE, -1, 0, -1, -1, -1, -1, 0, 0, "\237\032", -1 }, /* As above L904 */ + /* 40*/ { 6, BARCODE_DOTCODE, -1, 0, -1, -1, -1, -1, 0, 0, "\237", -1 }, /* As above L1090 */ + /* 41*/ { 0, BARCODE_MAXICODE, -1, 0, -1, -1, -1, -1, 0, 0, "\223\223\223\223\223\200\000\060\060\020\122\104\060\343\000\000\040\104\104\104\104\177\377\040\000\324\336\000\000\000\000\104\060\060\060\060\104\104\104\104\104\104\104\104\104\104\104\104\104\104\104\104\104\104\104\104\104\104\104\104\104\104\104\060\104\104\000\000\000\040\104\104\104\104\177\377\377\377\324\336\000\000\000\000\104\377\104\001\104\104\104\104\104\104\233\233\060\060\060\060\060\060\060\060\060\325\074", 107 }, /* #181 Nico Gunkel OSS-Fuzz - original OSS-Fuzz triggering data */ + /* 42*/ { 1, BARCODE_MAXICODE, -1, 0, -1, -1, -1, -1, 0, 0, "AaAaAaAaAaAaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA123456789", -1 }, /* Add 6 lowercase a's so 6 SHIFTS inserted so 6 + 138 (max input len) = 144 and numbers come at end of buffer */ + /* 43*/ { 0, BARCODE_CODE128, DATA_MODE | EXTRA_ESCAPE_MODE, 0, -1, -1, -1, -1, 0, 0, "\003\134\136\103\103\103\103\103\103\103\103\103\103\103\103\103\103\103\103\103\103\000\000\051\000\054\103\103\103\377\377\377" "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\242\053\134\136\061\067\242\242\242\242\242" @@ -875,15 +878,19 @@ static const struct item data_data[] = { "\136\136", 162 }, /* fuzz_data (2nd) */ + /* 44*/ { 1, BARCODE_CODABLOCKF, -1, 0, -1, -1, -1, 4, 2, 0, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", -1 }, /* #353, Simon Resch (raster/vector: allow for separator height being > twice row height) */ + /* 45*/ { 2, BARCODE_MAXICODE, -1, BARCODE_BIND_TOP | BARCODE_BOX, -1, -1, -1, -1, 0, 52, "^11%", -1 }, /* fuzz_data (3rd) */ }; /* GS1_MODE data */ static const struct item gs1_data[] = { - /* 0*/ { 0, BARCODE_QRCODE, GS1_MODE | GS1NOCHECK_MODE, -1, -1, -1, -1, "[]CCCCCLLLLLLLLLLLLLLLLLLLLLCCCCCCCC@CCCCCCCCCCCCCCCCCCCCCCC%%C%C%%%%%%%%%%%%%%LLLCCCCCCCC%%C%C%%%%%%%%%%%%%%LLLLLLLLLLLLLLLLLLL000000032861710*383556LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL155816162LLLLLCC%%C%C%%%%%%%%%%%%%%LLLCCCCCCCC%%C%C%%%%%%%%%%%%%%LLLLLLLLLL)!1661055777[723]T5", -1 }, /* #300 (#14), Andre Maute */ - /* 1*/ { 5, BARCODE_EANX_CC, GS1_MODE | GS1PARENS_MODE | GS1NOCHECK_MODE, -1, -1, -1, -1, "()111%", -1 }, /* #300 (#5), Andre Maute (`dbar_date()` not checking length + other non-checks) */ - /* 2*/ { 6, BARCODE_UPCA_CC, GS1_MODE | GS1PARENS_MODE | GS1NOCHECK_MODE, -1, -1, -1, -1, "()90", -1, }, /* #300 (#6), Andre Maute (`dbar_date()` not checking length + other non-checks) */ - /* 3*/ { 7, BARCODE_UPCA_CC, GS1_MODE | GS1PARENS_MODE | GS1NOCHECK_MODE, -1, -1, -1, -1, "()904OOOOO)CK0336680OOOOOOOOOOOOOO29[0kkkk%%%%(", -1 }, /* #300 (#11), Andre Maute (`gs1_verify()` not checking length on resolve AI data loop) */ - /* 4*/ { 8, BARCODE_GS1_128_CC, GS1_MODE | GS1NOCHECK_MODE, -1, 3, -1, -1, "[]RRR___________________KKKRRR0000", -1 }, /* #300 (#13), Andre Maute (`calc_padding_ccc()` dividing by zero when linear width == 68) */ + /* 0*/ { 0, BARCODE_QRCODE, GS1_MODE | GS1NOCHECK_MODE, 0, -1, -1, -1, -1, 0, 0, "[]CCCCCLLLLLLLLLLLLLLLLLLLLLCCCCCCCC@CCCCCCCCCCCCCCCCCCCCCCC%%C%C%%%%%%%%%%%%%%LLLCCCCCCCC%%C%C%%%%%%%%%%%%%%LLLLLLLLLLLLLLLLLLL000000032861710*383556LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL155816162LLLLLCC%%C%C%%%%%%%%%%%%%%LLLCCCCCCCC%%C%C%%%%%%%%%%%%%%LLLLLLLLLL)!1661055777[723]T5", -1 }, /* #300 (#14), Andre Maute */ + /* 1*/ { 5, BARCODE_EANX_CC, GS1_MODE | GS1PARENS_MODE | GS1NOCHECK_MODE, 0, -1, -1, -1, -1, 0, 0, "()111%", -1 }, /* #300 (#5), Andre Maute (`dbar_date()` not checking length + other non-checks) */ + /* 2*/ { 6, BARCODE_UPCA_CC, GS1_MODE | GS1PARENS_MODE | GS1NOCHECK_MODE, 0, -1, -1, -1, -1, 0, 0, "()90", -1, }, /* #300 (#6), Andre Maute (`dbar_date()` not checking length + other non-checks) */ + /* 3*/ { 7, BARCODE_UPCA_CC, GS1_MODE | GS1PARENS_MODE | GS1NOCHECK_MODE, 0, -1, -1, -1, -1, 0, 0, "()904OOOOO)CK0336680OOOOOOOOOOOOOO29[0kkkk%%%%(", -1 }, /* #300 (#11), Andre Maute (`gs1_verify()` not checking length on resolve AI data loop) */ + /* 4*/ { 8, BARCODE_GS1_128_CC, GS1_MODE | GS1NOCHECK_MODE, 0, -1, 3, -1, -1, 0, 0, "[]RRR___________________KKKRRR0000", -1 }, /* #300 (#13), Andre Maute (`calc_padding_ccc()` dividing by zero when linear width == 68) */ + /* 5*/ { 9, BARCODE_DBAR_EXP, GS1_MODE | GS1RAW_MODE, 0, -1, -1, -1, -1, 0, 0, "1012345678901234567890211", -1 }, /* #352, Simon Resch (`gs1_lint_parse_raw_caret()` check that data of AIs with non-predefined lengths are terminated with separators (unless last)) */ + /* 5*/ { 10, BARCODE_DBAR_EXP, GS1_MODE | GS1NOCHECK_MODE | HEIGHTPERROW_MODE | FAST_MODE, 0, -1, -1, -1, -1, 0, 0, "1012345678901234567890211", -1 }, /* #352, Simon Resch (`gs1_lint_parse_raw_caret()` check that data of AIs with non-predefined lengths are terminated with separators (unless last)) */ }; /* Write a setting as 1 char to filename, allowing for -1 meaning none (255 or zero) */ @@ -935,22 +942,29 @@ static void write_corp(const char dirname[], const struct item data[], const int if (data[i].input_mode != -1) { /* Shift out DATA/UNICODE/GS1_MODE (shifted back in `set_symbol()` in "fuzz.h") */ - write_setting(filename, data[i].input_mode >> 3, 0, fp); + write_setting(filename, data[i].input_mode >> 3, 0 /*none*/, fp); } else { - write_setting(filename, data[i].input_mode, 0, fp); + write_setting(filename, data[i].input_mode, 0 /*none*/, fp); } if (si->option_1_min <= si->option_1_max) { - write_setting(filename, data[i].option_1, 0xFF, fp); + write_setting(filename, data[i].option_1, 0xFF /*none*/, fp); } if (si->option_2_min <= si->option_2_max) { - write_setting(filename, data[i].option_2, 0, fp); + write_setting(filename, data[i].option_2, 0 /*none*/, fp); } if (!no_eci && (ZBarcode_Cap(data[i].symbology, ZINT_CAP_ECI) & ZINT_CAP_ECI)) { - write_setting(filename, data[i].eci, 0, fp); + write_setting(filename, data[i].eci, 0 /*none*/, fp); } - if (si->option_3) { - write_setting(filename, data[i].option_3 != -1, 0, fp); + if (si->option_3_min <= si->option_3_max) { + write_setting(filename, data[i].option_3 != -1, 0 /*none*/, fp); } + if (!(ZBarcode_Cap(data[i].symbology, ZINT_CAP_FIXED_RATIO) & ZINT_CAP_FIXED_RATIO)) { + write_setting(filename, data[i].height, 0 /*none*/, fp); + } + /* `border_width` */ + write_setting(filename, data[i].border_width, 0 /*none*/, fp); + /* `output_options` */ + write_setting(filename, data[i].output_options, 0 /*none*/, fp); ret = fwrite(data[i].data, sizeof(char), length, fp); if (ret != length) { diff --git a/backend/tests/test_output.c b/backend/tests/test_output.c index 79b9eb52..8e7c047e 100644 --- a/backend/tests/test_output.c +++ b/backend/tests/test_output.c @@ -1,6 +1,6 @@ /* libzint - the open source barcode library - Copyright (C) 2021-2025 Robin Stuart + Copyright (C) 2021-2026 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -260,9 +260,9 @@ static void test_set_whitespace_offsets(const testCtx *const p_ctx) { /* 5*/ { BARCODE_CODE128, 2, 3, 1, BARCODE_BIND_TOP, 0, 0, 1.0f, /*expected*/ 2.0f, 4.0f, 2.0f, 3.0f, 0.0f }, /* 6*/ { BARCODE_CODE128, 2, 3, 1, BARCODE_BIND_TOP | BARCODE_BIND, 0, 0, 1.0f, /*expected*/ 2.0f, 4.0f, 2.0f, 3.0f, 0.0f }, /* BIND_TOP wins */ /* 7*/ { BARCODE_CODE128, 2, 3, 1, BARCODE_BOX, 0, 0, 1.0f, /*expected*/ 3.0f, 4.0f, 3.0f, 4.0f, 0.0f }, - /* 8*/ { BARCODE_CODE128, 2, 3, 1, BARCODE_BIND_TOP | BARCODE_BOX, 0, 0, 1.0f, /*expected*/ 3.0f, 4.0f, 3.0f, 3.0f, 0.0f }, /* BIND_TOP wins */ + /* 8*/ { BARCODE_CODE128, 2, 3, 1, BARCODE_BIND_TOP | BARCODE_BOX, 0, 0, 1.0f, /*expected*/ 2.0f, 4.0f, 2.0f, 3.0f, 0.0f }, /* BIND_TOP wins */ /* 9*/ { BARCODE_CODE128, 2, 3, 1, BARCODE_BOX | BARCODE_BIND, 0, 0, 1.0f, /*expected*/ 3.0f, 4.0f, 3.0f, 4.0f, 0.0f }, /* BIND_BOX wins */ - /* 10*/ { BARCODE_CODE128, 2, 3, 1, BARCODE_BIND_TOP | BARCODE_BOX | BARCODE_BIND, 0, 0, 1.0f, /*expected*/ 3.0f, 4.0f, 3.0f, 3.0f, 0.0f }, /* BIND_TOP wins */ + /* 10*/ { BARCODE_CODE128, 2, 3, 1, BARCODE_BIND_TOP | BARCODE_BOX | BARCODE_BIND, 0, 0, 1.0f, /*expected*/ 2.0f, 4.0f, 2.0f, 3.0f, 0.0f }, /* BIND_TOP wins */ /* 11*/ { BARCODE_CODE128, 2, 3, 1, BARCODE_BOX | BARCODE_QUIET_ZONES, 0, 0, 1.0f, /*expected*/ 13.0f, 4.0f, 13.0f, 4.0f, 10.0f }, }; const int data_size = ARRAY_SIZE(data); diff --git a/backend/tests/test_raster.c b/backend/tests/test_raster.c index 4689d281..5394af33 100644 --- a/backend/tests/test_raster.c +++ b/backend/tests/test_raster.c @@ -1044,29 +1044,37 @@ static void test_output_options(const testCtx *const p_ctx) { /* 70*/ { BARCODE_MAXICODE, -1, -1, 5, BARCODE_BOX, 0, 0, "A123", 0, 165, 33, 30, 299 + 50 * 2, 298 + 50 * 2, 0, 347, 50 }, /* 71*/ { BARCODE_MAXICODE, -1, -1, 5, BARCODE_BIND, 0, 0, "A123", 0, 165, 33, 30, 299, 298 + 50 * 2, 1, 50, 15 }, /* 72*/ { BARCODE_MAXICODE, -1, -1, 5, BARCODE_BIND | BARCODE_QUIET_ZONES, 0, 0, "A123", 0, 165, 33, 30, 299 + 10 * 2, 298 + (50 + 10) * 2, 0, 50, 15 }, - /* 73*/ { BARCODE_MAXICODE, -1, -1, -1, -1, 0, 0, "A123", 0, 165, 33, 30, 299, 298, 1, 0, 14 }, - /* 74*/ { BARCODE_MAXICODE, 6, -1, -1, -1, 0, 0, "A123", 0, 165, 33, 30, 299 + 60 * 2, 298, 0, 0, 14 }, - /* 75*/ { BARCODE_MAXICODE, 6, -1, -1, -1, 0, 0, "A123", 0, 165, 33, 30, 299 + 60 * 2, 298, 0, 0, 47 }, - /* 76*/ { BARCODE_MAXICODE, 6, -1, 5, BARCODE_BIND, 0, 0, "A123", 0, 165, 33, 30, 299 + 60 * 2, 298 + 50 * 2, 1, 0, 47 }, - /* 77*/ { BARCODE_MAXICODE, 6, -1, 5, BARCODE_BIND, 0, 0, "A123", 0, 165, 33, 30, 299 + 60 * 2, 298 + 50 * 2, 0, 50, 0 }, - /* 78*/ { BARCODE_MAXICODE, 6, -1, 5, BARCODE_BOX, 0, 0, "A123", 0, 165, 33, 30, 299 + (60 + 50) * 2, 298 + 50 * 2, 1, 50, 0 }, - /* 79*/ { BARCODE_MAXICODE, -1, -1, -1, BARCODE_DOTTY_MODE, 0, 0, "A123", ZINT_ERROR_INVALID_OPTION, -1, -1, -1, -1, -1, -1, -1, -1 }, - /* 80*/ { BARCODE_MAXICODE, -1, -1, -1, OUT_BUFFER_INTERMEDIATE, 0, 0, "A123", 0, 165, 33, 30, 299, 298, 0, 4, 4 }, - /* 81*/ { BARCODE_MAXICODE, -1, -1, -1, OUT_BUFFER_INTERMEDIATE, 0, 0, "A123", 0, 165, 33, 30, 299, 298, 1, 4, 14 }, - /* 82*/ { BARCODE_MAXICODE, -1, -1, -1, OUT_BUFFER_INTERMEDIATE, 270, 0, "A123", 0, 165, 33, 30, 298, 299, 1, 4, 4 }, - /* 83*/ { BARCODE_MAXICODE, -1, -1, -1, OUT_BUFFER_INTERMEDIATE, 270, 0, "A123", 0, 165, 33, 30, 298, 299, 0, 4, 14 }, - /* 84*/ { BARCODE_ITF14, -1, -1, -1, -1, 0, 0, "123", 0, 50, 1, 135, 330, 136, 1, 110, 0 }, - /* 85*/ { BARCODE_ITF14, -1, -1, -1, -1, 90, 0, "123", 0, 50, 1, 135, 136, 330, 1, 0, 110 }, - /* 86*/ { BARCODE_ITF14, -1, -1, 0, -1, 0, 0, "123", 0, 50, 1, 135, 330, 136, 1, 110, 0 }, - /* 87*/ { BARCODE_ITF14, -1, -1, 0, BARCODE_BOX, 0, 0, "123", 0, 50, 1, 135, 310, 116, 0, 100, 0 }, - /* 88*/ { BARCODE_ITF14, -1, -1, -1, OUT_BUFFER_INTERMEDIATE, 0, 0, "123", 0, 50, 1, 135, 330, 136, 1, 110, 0 }, - /* 89*/ { BARCODE_ITF14, -1, -1, -1, OUT_BUFFER_INTERMEDIATE, 90, 0, "123", 0, 50, 1, 135, 136, 330, 1, 0, 110 }, - /* 90*/ { BARCODE_CODABLOCKF, -1, -1, -1, -1, 0, 0, "A123", 0, 20, 2, 101, 242, 44, 1, 43, 24 }, - /* 91*/ { BARCODE_CODABLOCKF, -1, -1, -1, BARCODE_BIND_TOP, 0, 0, "A123", 0, 20, 2, 101, 242, 42, 0, 41, 24 }, - /* 92*/ { BARCODE_CODE16K, -1, -1, -1, -1, 0, 0, "A123", 0, 20, 2, 70, 162, 44, 1, 43, 0 }, - /* 93*/ { BARCODE_CODE16K, -1, -1, -1, BARCODE_BIND_TOP, 0, 0, "A123", 0, 20, 2, 70, 162, 42, 0, 41, 0 }, - /* 94*/ { BARCODE_CODE49, -1, -1, -1, -1, 0, 0, "A123", 0, 20, 2, 70, 162, 44, 1, 43, 0 }, - /* 95*/ { BARCODE_CODE49, -1, -1, -1, BARCODE_BIND_TOP, 0, 0, "A123", 0, 20, 2, 70, 162, 42, 0, 41, 0 }, + /* 73*/ { BARCODE_MAXICODE, -1, -1, 30, BARCODE_BIND, 0, 0, "A123", 0, 165, 33, 30, 299, 298 + 300 * 2, 1, 299, 0 }, + /* 74*/ { BARCODE_MAXICODE, -1, -1, 30, BARCODE_BIND, 0, 0, "A123", 0, 165, 33, 30, 299, 298 + 300 * 2, 0, 300, 0 }, + /* 75*/ { BARCODE_MAXICODE, -1, -1, 30, BARCODE_BIND | BARCODE_BIND_TOP, 0, 0, "A123", 0, 165, 33, 30, 299, 298 + 300, 1, 299, 0 }, /* BIND_TOP trumps BIND */ + /* 76*/ { BARCODE_MAXICODE, -1, -1, 30, BARCODE_BIND | BARCODE_BIND_TOP, 0, 0, "A123", 0, 165, 33, 30, 299, 298 + 300, 0, 300, 0 }, + /* 77*/ { BARCODE_MAXICODE, -1, -1, 30, BARCODE_BOX, 0, 0, "A123", 0, 165, 33, 30, 299 + 300 * 2, 298 + 300 * 2, 1, 300, 299 }, + /* 78*/ { BARCODE_MAXICODE, -1, -1, 30, BARCODE_BOX, 0, 0, "A123", 0, 165, 33, 30, 299 + 300 * 2, 298 + 300 * 2, 0, 300, 300 }, + /* 79*/ { BARCODE_MAXICODE, -1, -1, 30, BARCODE_BOX | BARCODE_BIND_TOP, 0, 0, "A123", 0, 165, 33, 30, 299, 298 + 300, 1, 299, 0 }, /* BIND_TOP trumps BOX */ + /* 80*/ { BARCODE_MAXICODE, -1, -1, 30, BARCODE_BOX | BARCODE_BIND_TOP, 0, 0, "A123", 0, 165, 33, 30, 299, 298 + 300, 0, 300, 0 }, + /* 81*/ { BARCODE_MAXICODE, -1, -1, -1, -1, 0, 0, "A123", 0, 165, 33, 30, 299, 298, 1, 0, 14 }, + /* 82*/ { BARCODE_MAXICODE, 6, -1, -1, -1, 0, 0, "A123", 0, 165, 33, 30, 299 + 60 * 2, 298, 0, 0, 14 }, + /* 83*/ { BARCODE_MAXICODE, 6, -1, -1, -1, 0, 0, "A123", 0, 165, 33, 30, 299 + 60 * 2, 298, 0, 0, 47 }, + /* 84*/ { BARCODE_MAXICODE, 6, -1, 5, BARCODE_BIND, 0, 0, "A123", 0, 165, 33, 30, 299 + 60 * 2, 298 + 50 * 2, 1, 0, 47 }, + /* 85*/ { BARCODE_MAXICODE, 6, -1, 5, BARCODE_BIND, 0, 0, "A123", 0, 165, 33, 30, 299 + 60 * 2, 298 + 50 * 2, 0, 50, 0 }, + /* 86*/ { BARCODE_MAXICODE, 6, -1, 5, BARCODE_BOX, 0, 0, "A123", 0, 165, 33, 30, 299 + (60 + 50) * 2, 298 + 50 * 2, 1, 50, 0 }, + /* 87*/ { BARCODE_MAXICODE, -1, -1, -1, BARCODE_DOTTY_MODE, 0, 0, "A123", ZINT_ERROR_INVALID_OPTION, -1, -1, -1, -1, -1, -1, -1, -1 }, + /* 88*/ { BARCODE_MAXICODE, -1, -1, -1, OUT_BUFFER_INTERMEDIATE, 0, 0, "A123", 0, 165, 33, 30, 299, 298, 0, 4, 4 }, + /* 89*/ { BARCODE_MAXICODE, -1, -1, -1, OUT_BUFFER_INTERMEDIATE, 0, 0, "A123", 0, 165, 33, 30, 299, 298, 1, 4, 14 }, + /* 90*/ { BARCODE_MAXICODE, -1, -1, -1, OUT_BUFFER_INTERMEDIATE, 270, 0, "A123", 0, 165, 33, 30, 298, 299, 1, 4, 4 }, + /* 91*/ { BARCODE_MAXICODE, -1, -1, -1, OUT_BUFFER_INTERMEDIATE, 270, 0, "A123", 0, 165, 33, 30, 298, 299, 0, 4, 14 }, + /* 92*/ { BARCODE_ITF14, -1, -1, -1, -1, 0, 0, "123", 0, 50, 1, 135, 330, 136, 1, 110, 0 }, + /* 93*/ { BARCODE_ITF14, -1, -1, -1, -1, 90, 0, "123", 0, 50, 1, 135, 136, 330, 1, 0, 110 }, + /* 94*/ { BARCODE_ITF14, -1, -1, 0, -1, 0, 0, "123", 0, 50, 1, 135, 330, 136, 1, 110, 0 }, + /* 95*/ { BARCODE_ITF14, -1, -1, 0, BARCODE_BOX, 0, 0, "123", 0, 50, 1, 135, 310, 116, 0, 100, 0 }, + /* 96*/ { BARCODE_ITF14, -1, -1, -1, OUT_BUFFER_INTERMEDIATE, 0, 0, "123", 0, 50, 1, 135, 330, 136, 1, 110, 0 }, + /* 97*/ { BARCODE_ITF14, -1, -1, -1, OUT_BUFFER_INTERMEDIATE, 90, 0, "123", 0, 50, 1, 135, 136, 330, 1, 0, 110 }, + /* 98*/ { BARCODE_CODABLOCKF, -1, -1, -1, -1, 0, 0, "A123", 0, 20, 2, 101, 242, 44, 1, 43, 24 }, + /* 99*/ { BARCODE_CODABLOCKF, -1, -1, -1, BARCODE_BIND_TOP, 0, 0, "A123", 0, 20, 2, 101, 242, 42, 0, 41, 24 }, + /*100*/ { BARCODE_CODE16K, -1, -1, -1, -1, 0, 0, "A123", 0, 20, 2, 70, 162, 44, 1, 43, 0 }, + /*101*/ { BARCODE_CODE16K, -1, -1, -1, BARCODE_BIND_TOP, 0, 0, "A123", 0, 20, 2, 70, 162, 42, 0, 41, 0 }, + /*102*/ { BARCODE_CODE49, -1, -1, -1, -1, 0, 0, "A123", 0, 20, 2, 70, 162, 44, 1, 43, 0 }, + /*103*/ { BARCODE_CODE49, -1, -1, -1, BARCODE_BIND_TOP, 0, 0, "A123", 0, 20, 2, 70, 162, 42, 0, 41, 0 }, }; const int data_size = ARRAY_SIZE(data); int i, length, ret; diff --git a/backend/tests/test_vector.c b/backend/tests/test_vector.c index 37f21522..0630161b 100644 --- a/backend/tests/test_vector.c +++ b/backend/tests/test_vector.c @@ -1389,16 +1389,24 @@ static void test_output_options(const testCtx *const p_ctx) { /* 44*/ { BARCODE_MAXICODE, 6, -1, 5, BARCODE_BIND, "A123", 0, 165, 33, 30, 84, 77.733398, 1, 0, 67.7334 }, /* 45*/ { BARCODE_MAXICODE, 6, -1, 5, BARCODE_BIND, "A123", 0, 165, 33, 30, 84, 77.733398, 0, 94, 10 }, /* 46*/ { BARCODE_MAXICODE, 6, -1, 5, BARCODE_BOX, "A123", 0, 165, 33, 30, 104, 77.733398, 1, 94, 10 }, - /* 47*/ { BARCODE_MAXICODE, -1, -1, -1, BARCODE_DOTTY_MODE, "A123", ZINT_ERROR_INVALID_OPTION, -1, -1, -1, -1, -1, -1, -1, -1 }, - /* 48*/ { BARCODE_ITF14, -1, -1, -1, -1, "123", 0, 50, 1, 135, 330, 136.28, 1, 320, 10 }, - /* 49*/ { BARCODE_ITF14, -1, -1, 0, -1, "123", 0, 50, 1, 135, 330, 136.28, 1, 320, 10 }, - /* 50*/ { BARCODE_ITF14, -1, -1, 0, BARCODE_BOX, "123", 0, 50, 1, 135, 310, 116.28, 0, 300, 0 }, /* No zero-width/height rectangles */ - /* 51*/ { BARCODE_CODABLOCKF, -1, -1, -1, -1, "A123", 0, 20, 2, 101, 242, 44, 1, 20, 42 }, - /* 52*/ { BARCODE_CODABLOCKF, -1, -1, -1, BARCODE_BIND_TOP, "A123", 0, 20, 2, 101, 242, 42, 0, 20, 42 }, - /* 53*/ { BARCODE_CODE16K, -1, -1, -1, -1, "A123", 0, 20, 2, 70, 162, 44, 1, 0, 42 }, - /* 54*/ { BARCODE_CODE16K, -1, -1, -1, BARCODE_BIND_TOP, "A123", 0, 20, 2, 70, 162, 42, 0, 0, 42 }, - /* 55*/ { BARCODE_CODE49, -1, -1, -1, -1, "A123", 0, 20, 2, 70, 162, 44, 1, 0, 42 }, - /* 56*/ { BARCODE_CODE49, -1, -1, -1, BARCODE_BIND_TOP, "A123", 0, 20, 2, 70, 162, 42, 0, 0, 42 }, + /* 47*/ { BARCODE_MAXICODE, -1, -1, 30, BARCODE_BIND, "A123", 0, 165, 33, 30, 60, 177.733398, 1, 0, 0 }, + /* 48*/ { BARCODE_MAXICODE, -1, -1, 30, BARCODE_BIND, "A123", 0, 165, 33, 30, 60, 177.733398, 1, 0, 117.733398 }, + /* 49*/ { BARCODE_MAXICODE, -1, -1, 30, BARCODE_BIND_TOP, "A123", 0, 165, 33, 30, 60, 117.733398, 1, 0, 0 }, + /* 50*/ { BARCODE_MAXICODE, -1, -1, 30, BARCODE_BIND_TOP, "A123", 0, 165, 33, 30, 60, 117.733398, 0, 0, 117.733398 }, + /* 51*/ { BARCODE_MAXICODE, -1, -1, 30, BARCODE_BIND_TOP | BARCODE_BIND, "A123", 0, 165, 33, 30, 60, 117.733398, 1, 0, 0 }, /* BIND_TOP trumps BIND */ + /* 52*/ { BARCODE_MAXICODE, -1, -1, 30, BARCODE_BIND_TOP | BARCODE_BIND, "A123", 0, 165, 33, 30, 60, 117.733398, 0, 0, 117.733398 }, + /* 53*/ { BARCODE_MAXICODE, -1, -1, 30, BARCODE_BIND_TOP | BARCODE_BOX, "A123", 0, 165, 33, 30, 60, 117.733398, 1, 0, 0 }, /* BIND_TOP trumps BOX */ + /* 54*/ { BARCODE_MAXICODE, -1, -1, 30, BARCODE_BIND_TOP | BARCODE_BOX, "A123", 0, 165, 33, 30, 60, 117.733398, 0, 0, 117.733398 }, + /* 55*/ { BARCODE_MAXICODE, -1, -1, -1, BARCODE_DOTTY_MODE, "A123", ZINT_ERROR_INVALID_OPTION, -1, -1, -1, -1, -1, -1, -1, -1 }, + /* 56*/ { BARCODE_ITF14, -1, -1, -1, -1, "123", 0, 50, 1, 135, 330, 136.28, 1, 320, 10 }, + /* 57*/ { BARCODE_ITF14, -1, -1, 0, -1, "123", 0, 50, 1, 135, 330, 136.28, 1, 320, 10 }, + /* 58*/ { BARCODE_ITF14, -1, -1, 0, BARCODE_BOX, "123", 0, 50, 1, 135, 310, 116.28, 0, 300, 0 }, /* No zero-width/height rectangles */ + /* 59*/ { BARCODE_CODABLOCKF, -1, -1, -1, -1, "A123", 0, 20, 2, 101, 242, 44, 1, 20, 42 }, + /* 60*/ { BARCODE_CODABLOCKF, -1, -1, -1, BARCODE_BIND_TOP, "A123", 0, 20, 2, 101, 242, 42, 0, 20, 42 }, + /* 61*/ { BARCODE_CODE16K, -1, -1, -1, -1, "A123", 0, 20, 2, 70, 162, 44, 1, 0, 42 }, + /* 62*/ { BARCODE_CODE16K, -1, -1, -1, BARCODE_BIND_TOP, "A123", 0, 20, 2, 70, 162, 42, 0, 0, 42 }, + /* 63*/ { BARCODE_CODE49, -1, -1, -1, -1, "A123", 0, 20, 2, 70, 162, 44, 1, 0, 42 }, + /* 64*/ { BARCODE_CODE49, -1, -1, -1, BARCODE_BIND_TOP, "A123", 0, 20, 2, 70, 162, 42, 0, 0, 42 }, }; int data_size = ARRAY_SIZE(data); int i, length, ret; diff --git a/backend/vector.c b/backend/vector.c index 6e15a93a..8c653946 100644 --- a/backend/vector.c +++ b/backend/vector.c @@ -1017,24 +1017,24 @@ INTERNAL int zint_plot_vector(struct zint_symbol *symbol, int rotate_angle, int last_rect->x = xoffset; last_rect->width -= xoffset + roffset; } - } - if (symbol->output_options & BARCODE_BOX) { - const float xbox_right = vector->width - symbol->border_width; - float box_top = yoffset; - /* Following equivalent to symbol->height except for BARCODE_MAXICODE */ - float box_height = vector->height - textoffset - dot_overspill - yoffset - boffset; - if (horz_outside) { - box_top = symbol->border_width; - box_height = vector->height - symbol->border_width * 2; - } else if (upceanflag == 2 || upceanflag == 5) { - box_top += textoffset; + if (symbol->output_options & BARCODE_BOX) { + const float xbox_right = vector->width - symbol->border_width; + float box_top = yoffset; + /* Following equivalent to symbol->height except for BARCODE_MAXICODE */ + float box_height = vector->height - textoffset - dot_overspill - yoffset - boffset; + if (horz_outside) { + box_top = symbol->border_width; + box_height = vector->height - symbol->border_width * 2; + } else if (upceanflag == 2 || upceanflag == 5) { + box_top += textoffset; + } + /* Left */ + if (!vector_add_rect(symbol, 0.0f, box_top, symbol->border_width, box_height, &last_rect)) + return ZINT_ERROR_MEMORY; + /* Right */ + if (!vector_add_rect(symbol, xbox_right, box_top, symbol->border_width, box_height, &last_rect)) + return ZINT_ERROR_MEMORY; } - /* Left */ - if (!vector_add_rect(symbol, 0.0f, box_top, symbol->border_width, box_height, &last_rect)) - return ZINT_ERROR_MEMORY; - /* Right */ - if (!vector_add_rect(symbol, xbox_right, box_top, symbol->border_width, box_height, &last_rect)) - return ZINT_ERROR_MEMORY; } } diff --git a/docs/README b/docs/README index 89e061c6..65a97637 100644 --- a/docs/README +++ b/docs/README @@ -1,4 +1,5 @@ -% docs/README 2026-03-17 +% docs/README 2026-03-22 +% vim: set ts=4 sw=4 et : For generation of "docs/manual.html", "docs/manual.pdf" and "docs/manual.txt" from "manual.pmd" and man pages "docs/zint.1" from "docs/zint.1.pmd" and "docs/zint-qt.1" from "docs/zint-qt.1.pmd" @@ -6,8 +7,8 @@ using pandoc >= 3.8.2. On Ubuntu/Debian (tested on Ubuntu 22.04 and Ubuntu 24.04) - wget https://github.com/jgm/pandoc/releases/download/3.9/pandoc-3.9-1-amd64.deb - sudo dpkg -i pandoc-3.9-1-amd64.deb + wget https://github.com/jgm/pandoc/releases/download/3.9.0.2/pandoc-3.9.0.2-1-amd64.deb + sudo dpkg -i pandoc-3.9.0.2-1-amd64.deb sudo apt install librsvg2-bin sudo apt install texlive-xetex sudo apt install texlive-lang-cjk @@ -16,9 +17,9 @@ On Ubuntu/Debian (tested on Ubuntu 22.04 and Ubuntu 24.04) On Fedora (tested on Fedora Linux 38 (Workstation Edition) and Fedora Linux 42 (Workstation Edition)) - wget https://github.com/jgm/pandoc/releases/download/3.9/pandoc-3.9-linux-amd64.tar.gz - tar xf pandoc-3.9-linux-amd64.tar.gz - sudo mv -i pandoc-3.9/bin/pandoc /usr/local/bin + wget https://github.com/jgm/pandoc/releases/download/3.9.0.2/pandoc-3.9.0.2-linux-amd64.tar.gz + tar xf pandoc-3.9.0.2-linux-amd64.tar.gz + sudo mv -i pandoc-3.9.0.2/bin/pandoc /usr/local/bin sudo dnf install librsvg2-tools.x86_64 sudo dnf install texlive-xetex sudo dnf install texlive-ctex.noarch diff --git a/docs/zint-qt.1 b/docs/zint-qt.1 index cfeaec01..72bd0b60 100644 --- a/docs/zint-qt.1 +++ b/docs/zint-qt.1 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pandoc 3.9 +.\" Automatically generated by Pandoc 3.9.0.2 .\" .TH "ZINT\-QT" "1" "March 2026" "Version 2.16.0.9" .SH NAME