diff --git a/ChangeLog b/ChangeLog index 293badc1..c387d4d8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,4 @@ -Version 2.16.0.9 (dev) not released yet (2026-02-02) +Version 2.16.0.9 (dev) not released yet (2026-02-05) ==================================================== **Incompatible changes** @@ -33,6 +33,7 @@ Bugs Bryce Harrison) - AZTEC: fix ECC to be at least advertised percentages (ticket #347, props Francois Grieu) +- CODE32/PZN: fix not restoring `option_2` (props axxel) Version 2.16.0 (2025-12-19) diff --git a/backend/medical.c b/backend/medical.c index 589255e7..2da52537 100644 --- a/backend/medical.c +++ b/backend/medical.c @@ -1,7 +1,7 @@ /* medical.c - Handles Pharmacode One-Track, Pharmacode Two-Track, Italian Pharmacode and PZN */ /* libzint - the open source barcode library - Copyright (C) 2008-2025 Robin Stuart + Copyright (C) 2008-2026 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -266,7 +266,7 @@ INTERNAL int zint_code32(struct zint_symbol *symbol, unsigned char source[], int return error_number; } - if (symbol->option_2 == 1 || symbol->option_2 == 2) { + if (saved_option_2 == 1 || saved_option_2 == 2) { symbol->option_2 = saved_option_2; /* Restore */ } @@ -350,7 +350,7 @@ INTERNAL int zint_pzn(struct zint_symbol *symbol, unsigned char source[], int le error_number = zint_code39(symbol, local_source, 9 - pzn7); - if (symbol->option_2 == 1 || symbol->option_2 == 2) { + if (saved_option_2 == 1 || saved_option_2 == 2) { symbol->option_2 = saved_option_2; /* Restore */ } diff --git a/backend/tests/test_medical.c b/backend/tests/test_medical.c index 450d4320..c674b792 100644 --- a/backend/tests/test_medical.c +++ b/backend/tests/test_medical.c @@ -1,6 +1,6 @@ /* libzint - the open source barcode library - Copyright (C) 2020-2025 Robin Stuart + Copyright (C) 2020-2026 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -290,43 +290,44 @@ static void test_encode(const testCtx *const p_ctx) { int expected_rows; int expected_width; + int expected_option_2; const char *comment; const char *expected; }; static const struct item data[] = { - /* 0*/ { BARCODE_PHARMA, -1, "131070", 0, 1, 78, "", + /* 0*/ { BARCODE_PHARMA, -1, "131070", 0, 1, 78, 0, "", "111001110011100111001110011100111001110011100111001110011100111001110011100111" }, - /* 1*/ { BARCODE_PHARMA, -1, "123456", 0, 1, 58, "", + /* 1*/ { BARCODE_PHARMA, -1, "123456", 0, 1, 58, 0, "", "1110011100111001001001001110010010011100100100100100100111" }, - /* 2*/ { BARCODE_PHARMA_TWO, -1, "64570080", 0, 2, 31, "Verified manually against TEC-IT", + /* 2*/ { BARCODE_PHARMA_TWO, -1, "64570080", 0, 2, 31, 0, "Verified manually against TEC-IT", "1010101010101010101010101010101" "1010101010101010101010101010101" }, - /* 3*/ { BARCODE_PHARMA_TWO, -1, "29876543", 0, 2, 31, "Verified manually against TEC-IT", + /* 3*/ { BARCODE_PHARMA_TWO, -1, "29876543", 0, 2, 31, 0, "Verified manually against TEC-IT", "0010100010001010001010001000101" "1000101010100000100000101010000" }, - /* 4*/ { BARCODE_CODE32, -1, "34567890", 0, 1, 103, "Verified manually against TEC-IT", + /* 4*/ { BARCODE_CODE32, -1, "34567890", 0, 1, 103, 0, "Verified manually against TEC-IT", "1001011011010101101001011010110010110101011011010010101100101101011010010101101010101100110100101101101" }, - /* 5*/ { BARCODE_CODE32, 1, "34567890", 0, 1, 103, "Make sure option_2 doesn't add extra check digit", + /* 5*/ { BARCODE_CODE32, 1, "34567890", 0, 1, 103, 1, "Make sure option_2 doesn't add extra check digit", "1001011011010101101001011010110010110101011011010010101100101101011010010101101010101100110100101101101" }, - /* 6*/ { BARCODE_CODE32, 2, "34567890", 0, 1, 103, "Make sure option_2 doesn't add extra check digit", + /* 6*/ { BARCODE_CODE32, 2, "34567890", 0, 1, 103, 2, "Make sure option_2 doesn't add extra check digit", "1001011011010101101001011010110010110101011011010010101100101101011010010101101010101100110100101101101" }, - /* 7*/ { BARCODE_PZN, -1, "1234567", 0, 1, 142, "Example from IFA Info Code 39 EN V2.1; verified manually against TEC-IT", + /* 7*/ { BARCODE_PZN, -1, "1234567", 0, 1, 142, 0, "Example from IFA Info Code 39 EN V2.1; verified manually against TEC-IT", "1001011011010100101011011011010010101101011001010110110110010101010100110101101101001101010101100110101010100101101101101001011010100101101101" }, - /* 8*/ { BARCODE_PZN, -1, "2758089", 0, 1, 142, "Example from IFA Info Check Digit Calculations EN 15 July 2019; verified manually against TEC-IT", + /* 8*/ { BARCODE_PZN, -1, "2758089", 0, 1, 142, 0, "Example from IFA Info Check Digit Calculations EN 15 July 2019; verified manually against TEC-IT", "1001011011010100101011011010110010101101010010110110110100110101011010010110101010011011010110100101101010110010110101011001011010100101101101" }, - /* 9*/ { BARCODE_PZN, 1, "123456", 0, 1, 129, "Example from BWIPP; verified manually against TEC-IT", + /* 9*/ { BARCODE_PZN, 1, "123456", 0, 1, 129, 1, "Example from BWIPP; verified manually against TEC-IT", "100101101101010010101101101101001010110101100101011011011001010101010011010110110100110101010110011010101011001010110100101101101" }, - /* 10*/ { BARCODE_PZN, 2, "1234567", 0, 1, 142, "Make sure option_2 ignored for check digit", + /* 10*/ { BARCODE_PZN, 2, "1234567", 0, 1, 142, 2, "Make sure option_2 ignored for check digit", "1001011011010100101011011011010010101101011001010110110110010101010100110101101101001101010101100110101010100101101101101001011010100101101101" }, }; @@ -368,6 +369,7 @@ static void test_encode(const testCtx *const p_ctx) { assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d (%s)\n", i, symbol->rows, data[i].expected_rows, data[i].data); assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d (%s)\n", i, symbol->width, data[i].expected_width, data[i].data); + assert_equal(symbol->option_2, data[i].expected_option_2, "i:%d symbol->option_2 %d != %d (%s)\n", i, symbol->option_2, data[i].option_2, data[i].data); ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data);