From 15b80247128f233fada5e88c184786c3e2ea18d4 Mon Sep 17 00:00:00 2001 From: gitlost Date: Thu, 16 Jun 2022 16:47:34 +0100 Subject: [PATCH] - library: check symbol->primary for escape sequences also - GUI: error message GS1_MODE -> GS1 mode - GUI: sequence window: fix initial clear button status - GUI: make acceptable for macOS; add iconset for macOS, install - manual: update macOS Homebrew install info; add README.macos - GUI: export window: add no. of sequences to results label --- ChangeLog | 6 ++ README.macos | 59 +++++++++++ backend/composite.c | 30 +++--- backend/dotcode.c | 5 +- backend/font.h | 12 +-- backend/library.c | 26 +++-- backend/qr.c | 10 +- backend/rss.c | 98 +++++++++--------- backend/tests/test_large.c | 2 +- backend/tests/test_library.c | 176 ++++++++++++++++++--------------- docs/Makefile | 2 +- docs/manual.pmd | 46 +++++---- docs/manual.txt | 48 ++++----- docs/zint.1 | 2 +- docs/zint.1.pmd | 2 +- frontend/main.c | 4 +- frontend/test.sh | 2 + frontend_qt/CMakeLists.txt | 21 +++- frontend_qt/exportwindow.cpp | 28 +++--- frontend_qt/exportwindow.h | 11 ++- frontend_qt/mac_icons.sh | 15 +++ frontend_qt/mainWindow.ui | 56 +++++------ frontend_qt/mainwindow.cpp | 139 +++++++++++++++++++++----- frontend_qt/mainwindow.h | 16 ++- frontend_qt/sequencewindow.cpp | 2 +- frontend_qt/zint-qt.icns | Bin 0 -> 110828 bytes getopt/getopt.c | 2 + 27 files changed, 530 insertions(+), 290 deletions(-) create mode 100644 README.macos create mode 100755 frontend_qt/mac_icons.sh create mode 100644 frontend_qt/zint-qt.icns diff --git a/ChangeLog b/ChangeLog index 0fb217db..57eb455b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -14,6 +14,9 @@ Changes button, independently movable picker (NULL parent), preview colour changes, preview Data Window changes, add clear data (del) buttons, add zap button and Factory Reset menu option, various other fixes +- GUI: make acceptable for macOS; add iconset for macOS, install +- manual: update macOS Homebrew install info; add README.macos +- GUI: export window: add no. of sequences to results label Bugs ---- @@ -21,6 +24,9 @@ Bugs - libzint: fix some confusing error messages introduced by segment stuff - GUI: remove unnecessary tabMain min size (better layout rendering on Windows/Fedora) +- library: check symbol->primary for escape sequences also +- GUI: error message GS1_MODE -> GS1 mode +- GUI: sequence window: fix initial clear button status Version 2.11.0 (2022-05-24) diff --git a/README.macos b/README.macos new file mode 100644 index 00000000..85a8dfed --- /dev/null +++ b/README.macos @@ -0,0 +1,59 @@ +% Tested on macOS 12.4 Monterey VirtualBox (thanks to https://github.com/myspaghetti/macos-virtualbox) + +1. Prerequisites for building zint and zint-qt +============================================== + +Start a terminal. + +First if not already installed, install the developer command line tools + + xcode-select --install + +This can take a (very) long time. Once done, check for updates by selecting "System Preferences" > "Software Update", +and clicking "Advanced" and "OK" (with all the checkboxes set) to trigger the check. If updates are found, install. +This can also take a long time. + +With the latest versions of the command line tools, "/usr/include" no longer has the standard C include files. Set +SDKROOT to overcome this (https://stackoverflow.com/a/60002595/664741) + + export SDKROOT=$(xcrun --sdk macosx --show-sdk-path) + +Install Homebrew (unless already installed) + + /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" + +Install CMake, libpng and Qt5 (git, make, cc & c++ should already be available with command line tools) + + brew install cmake + brew install libpng + brew install qt5 + +Add the Qt5 bin directory to the PATH + + export PATH='/usr/local/opt/qt@5/bin':"$PATH" + +Clone the latest zint source + + git clone https://git.code.sf.net/p/zint/code zint + + +2. Build +======== + +The rest is standard CMake + + cd zint + mkdir build + cd build + cmake .. + make + sudo make install + +This installs into "/usr/local". You can then move the GUI "/usr/local/bin/zint-qt.app" into the main "/Applications" +folder if you wish. + + +3. CMake options +================ + +See "README.linux". diff --git a/backend/composite.c b/backend/composite.c index cfb1564e..26d23975 100644 --- a/backend/composite.c +++ b/backend/composite.c @@ -1,8 +1,7 @@ /* composite.c - Handles GS1 Composite Symbols */ - /* libzint - the open source barcode library - Copyright (C) 2008 - 2021 Robin Stuart + Copyright (C) 2008-2022 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -29,7 +28,7 @@ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* vim: set ts=4 sw=4 et : */ +/* SPDX-License-Identifier: BSD-3-Clause */ /* The functions "getBit", "init928" and "encode928" are copyright BSI and are released with permission under the following terms: @@ -1253,20 +1252,21 @@ static int cc_binary_string(struct zint_symbol *symbol, const unsigned char sour return 0; } -static int linear_dummy_run(int input_mode, unsigned char *source, const int length, char *errtxt) { - struct zint_symbol *dummy; +/* Calculate the width of the linear part (primary) */ +static int linear_dummy_run(int input_mode, unsigned char *source, const int length, const int debug, char *errtxt) { + struct zint_symbol dummy = {0}; int error_number; int linear_width; - dummy = ZBarcode_Create(); - dummy->symbology = BARCODE_GS1_128_CC; - dummy->input_mode = input_mode; - error_number = gs1_128_cc(dummy, source, length, 3 /*cc_mode*/, 0 /*cc_rows*/); - linear_width = dummy->width; - if (error_number >= ZINT_ERROR) { - strcpy(errtxt, dummy->errtxt); + dummy.symbology = BARCODE_GS1_128_CC; + dummy.option_1 = -1; + dummy.input_mode = input_mode; + dummy.debug = debug; + error_number = gs1_128_cc(&dummy, source, length, 3 /*cc_mode*/, 0 /*cc_rows*/); + linear_width = dummy.width; + if (error_number >= ZINT_ERROR || (debug & ZINT_DEBUG_TEST)) { + strcpy(errtxt, dummy.errtxt); } - ZBarcode_Delete(dummy); if (error_number >= ZINT_ERROR) { return 0; @@ -1317,7 +1317,7 @@ INTERNAL int composite(struct zint_symbol *symbol, unsigned char source[], int l if (symbol->symbology == BARCODE_GS1_128_CC) { /* Do a test run of encoding the linear component to establish its width */ linear_width = linear_dummy_run(symbol->input_mode, (unsigned char *) symbol->primary, pri_len, - symbol->errtxt); + symbol->debug, symbol->errtxt); if (linear_width == 0) { if (strlen(symbol->errtxt) + strlen(in_linear_comp) < sizeof(symbol->errtxt)) { strcat(symbol->errtxt, in_linear_comp); @@ -1636,3 +1636,5 @@ INTERNAL int composite(struct zint_symbol *symbol, unsigned char source[], int l return error_number ? error_number : warn_number; } + +/* vim: set ts=4 sw=4 et : */ diff --git a/backend/dotcode.c b/backend/dotcode.c index a9683269..89dbe931 100644 --- a/backend/dotcode.c +++ b/backend/dotcode.c @@ -1,5 +1,4 @@ /* dotcode.c - Handles DotCode */ - /* libzint - the open source barcode library Copyright (C) 2017-2022 Robin Stuart @@ -29,6 +28,7 @@ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* SPDX-License-Identifier: BSD-3-Clause */ /* * Attempts to encode DotCode according to (AIMD013) ISS DotCode Rev. 4.0, DRAFT 0.15, TSC Pre-PR #5, @@ -1271,6 +1271,9 @@ INTERNAL int dotcode(struct zint_symbol *symbol, struct zint_seg segs[], const i } } + /* TODO: GS1 General Specifications 22.0 section 5.8.2 says Structured Append and ECIs not supported + for GS1 DotCode so should check and return ZINT_WARN_NONCOMPLIANT if either true */ + data_length = dc_encode_message_segs(symbol, segs, seg_count, codeword_array, &binary_finish, structapp_array, &structapp_size); diff --git a/backend/font.h b/backend/font.h index e7126e26..05b22cdd 100644 --- a/backend/font.h +++ b/backend/font.h @@ -1,8 +1,7 @@ /* font.h - Font for PNG images */ - /* libzint - the open source barcode library - Copyright (C) 2008 - 2021 Robin Stuart + Copyright (C) 2008-2022 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -29,10 +28,10 @@ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* vim: set ts=4 sw=4 et : */ +/* SPDX-License-Identifier: BSD-3-Clause */ -#ifndef FONT_H -#define FONT_H +#ifndef Z_FONT_H +#define Z_FONT_H typedef const unsigned short font_item; @@ -487,4 +486,5 @@ static font_item upcean_small_font[] = { /*39*/ 0x3C, 0x7E, 0xE7, 0xC3, 0xC3, 0xC3, 0xE3, 0x7E, 0x1E, 0x0C, 0x18, 0x30, 0x60, /* 9 */ }; -#endif /* FONT_H */ +/* vim: set ts=4 sw=4 et : */ +#endif /* Z_FONT_H */ diff --git a/backend/library.c b/backend/library.c index 3672cfe7..6c477454 100644 --- a/backend/library.c +++ b/backend/library.c @@ -685,7 +685,8 @@ static int esc_base(struct zint_symbol *symbol, unsigned char *input_string, int } /* Helper to parse escape sequences */ -static int escape_char_process(struct zint_symbol *symbol, unsigned char *input_string, int *length) { +static int escape_char_process(struct zint_symbol *symbol, unsigned char *input_string, int *p_length) { + const int length = *p_length; int in_posn, out_posn; int ch; int val; @@ -693,9 +694,9 @@ static int escape_char_process(struct zint_symbol *symbol, unsigned char *input_ unsigned long unicode; #ifndef _MSC_VER - unsigned char escaped_string[*length + 1]; + unsigned char escaped_string[length + 1]; #else - unsigned char *escaped_string = (unsigned char *) _alloca(*length + 1); + unsigned char *escaped_string = (unsigned char *) _alloca(length + 1); #endif in_posn = 0; @@ -703,7 +704,7 @@ static int escape_char_process(struct zint_symbol *symbol, unsigned char *input_ do { if (input_string[in_posn] == '\\') { - if (in_posn + 1 >= *length) { + if (in_posn + 1 >= length) { strcpy(symbol->errtxt, "236: Incomplete escape character in input data"); return ZINT_ERROR_INVALID_DATA; } @@ -749,7 +750,7 @@ static int escape_char_process(struct zint_symbol *symbol, unsigned char *input_ case 'd': case 'o': /* Undocumented (as not very useful for most people) */ case 'x': - if ((val = esc_base(symbol, input_string, *length, in_posn + 2, ch)) == -1) { + if ((val = esc_base(symbol, input_string, length, in_posn + 2, ch)) == -1) { return ZINT_ERROR_INVALID_DATA; } escaped_string[out_posn] = val; @@ -760,7 +761,7 @@ static int escape_char_process(struct zint_symbol *symbol, unsigned char *input_ break; case 'u': case 'U': - if (in_posn + 6 > *length || (ch == 'U' && in_posn + 8 > *length)) { + if (in_posn + 6 > length || (ch == 'U' && in_posn + 8 > length)) { sprintf(symbol->errtxt, "209: Incomplete '\\%c' escape sequence in input data", ch); return ZINT_ERROR_INVALID_DATA; } @@ -810,11 +811,11 @@ static int escape_char_process(struct zint_symbol *symbol, unsigned char *input_ in_posn++; } out_posn++; - } while (in_posn < *length); + } while (in_posn < length); memcpy(input_string, escaped_string, out_posn); input_string[out_posn] = '\0'; - *length = out_posn; + *p_length = out_posn; return 0; } @@ -1095,7 +1096,7 @@ int ZBarcode_Encode_Segs(struct zint_symbol *symbol, const struct zint_seg segs[ if (seg_count > 1) { /* Note: GS1_MODE not currently supported when using multiple segments */ if ((symbol->input_mode & 0x07) == GS1_MODE) { - return error_tag(symbol, ZINT_ERROR_INVALID_OPTION, "776: GS1_MODE not supported for multiple segments"); + return error_tag(symbol, ZINT_ERROR_INVALID_OPTION, "776: GS1 mode not supported for multiple segments"); } } @@ -1128,6 +1129,13 @@ int ZBarcode_Encode_Segs(struct zint_symbol *symbol, const struct zint_seg segs[ return error_tag(symbol, error_number, NULL); } } + if (symbol->primary[0]) { + int primary_len = (int) strlen(symbol->primary); + error_number = escape_char_process(symbol, (unsigned char *) symbol->primary, &primary_len); + if (error_number != 0) { /* Only returns errors, not warnings */ + return error_tag(symbol, error_number, NULL); + } + } } if ((symbol->input_mode & 0x07) == UNICODE_MODE) { diff --git a/backend/qr.c b/backend/qr.c index 9c250c71..638f5fd8 100644 --- a/backend/qr.c +++ b/backend/qr.c @@ -28,6 +28,7 @@ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* SPDX-License-Identifier: BSD-3-Clause */ #include #ifdef _MSC_VER @@ -1452,7 +1453,7 @@ static int qr_calc_binlen(const int version, char mode[], const unsigned int dda currentMode = ' '; // Null - if (eci != 0) { // RMQR and MICROQR do not support ECI + if (eci != 0) { /* Not applicable to MICROQR */ count += 4; if (eci <= 127) { count += 8; @@ -1536,7 +1537,7 @@ static int qr_calc_binlen_segs(const int version, char mode[], const unsigned in count += 4 + 8 + 8; } - if (gs1 == 1) { /* Not applicable to MICROQR */ + if (gs1) { /* Not applicable to MICROQR */ if (version < RMQR_VERSION) { count += 4; } else { @@ -1672,6 +1673,9 @@ INTERNAL int qrcode(struct zint_symbol *symbol, struct zint_seg segs[], const in p_structapp = &symbol->structapp; } + /* TODO: GS1 General Specifications 22.0 section 5.7.3 says Structured Append and ECIs not supported + for GS1 QR Code so should check and return ZINT_WARN_NONCOMPLIANT if either true */ + est_binlen = qr_calc_binlen_segs(40, mode, ddata, local_segs, seg_count, p_structapp, 0 /*mode_preset*/, gs1, debug_print); @@ -2839,7 +2843,7 @@ INTERNAL int upnqr(struct zint_symbol *symbol, unsigned char source[], int lengt } break; case GS1_MODE: /* Should never happen as checked before being called */ - strcpy(symbol->errtxt, "571: UPNQR does not support GS-1 encoding"); /* Not reached */ + strcpy(symbol->errtxt, "571: UPNQR does not support GS1 data"); /* Not reached */ return ZINT_ERROR_INVALID_OPTION; break; case UNICODE_MODE: diff --git a/backend/rss.c b/backend/rss.c index d177f9fa..7cbb39c5 100644 --- a/backend/rss.c +++ b/backend/rss.c @@ -1,8 +1,7 @@ /* rss.c - GS1 DataBar (formerly Reduced Space Symbology) */ - /* libzint - the open source barcode library - Copyright (C) 2008-2021 Robin Stuart + Copyright (C) 2008-2022 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -29,7 +28,7 @@ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* vim: set ts=4 sw=4 et : */ +/* SPDX-License-Identifier: BSD-3-Clause */ /* The functions "rss_combins" and "getRSSwidths" are copyright BSI and are released with permission under the following terms: @@ -158,18 +157,15 @@ static void getRSSwidths(int widths[], int val, int n, const int elements, const } /* Set GTIN-14 human readable text */ -static void dbar_set_gtin14_hrt(struct zint_symbol *symbol, const unsigned char *source, const int src_len) { - int i; +static void dbar_set_gtin14_hrt(struct zint_symbol *symbol, const unsigned char *source, const int length) { unsigned char *hrt = symbol->text + 4; + const int leading_zeroes = 13 - length; ustrcpy(symbol->text, "(01)"); - for (i = 0; i < 12; i++) { - hrt[i] = '0'; + if (leading_zeroes) { + memset(hrt, '0', leading_zeroes); } - for (i = 0; i < src_len; i++) { - hrt[12 - i] = source[src_len - i - 1]; - } - + memcpy(hrt + leading_zeroes, source, length); hrt[13] = gs1_check_digit(hrt, 13); hrt[14] = '\0'; } @@ -290,7 +286,7 @@ INTERNAL int dbar_omnstk_set_height(struct zint_symbol *symbol, const int first_ } /* GS1 DataBar Omnidirectional/Truncated/Stacked, allowing for composite if `cc_rows` set */ -INTERNAL int dbar_omn_cc(struct zint_symbol *symbol, unsigned char source[], int src_len, const int cc_rows) { +INTERNAL int dbar_omn_cc(struct zint_symbol *symbol, unsigned char source[], int length, const int cc_rows) { int error_number = 0, i; large_int accum; uint64_t left_pair, right_pair; @@ -302,22 +298,22 @@ INTERNAL int dbar_omn_cc(struct zint_symbol *symbol, unsigned char source[], int separator_row = 0; - if (src_len > 14) { /* Allow check digit to be specified (will be verified and ignored) */ + if (length > 14) { /* Allow check digit to be specified (will be verified and ignored) */ strcpy(symbol->errtxt, "380: Input too long (14 character maximum)"); return ZINT_ERROR_TOO_LONG; } - if (!is_sane(NEON_F, source, src_len)) { + if (!is_sane(NEON_F, source, length)) { strcpy(symbol->errtxt, "381: Invalid character in data (digits only)"); return ZINT_ERROR_INVALID_DATA; } - if (src_len == 14) { /* Verify check digit */ + if (length == 14) { /* Verify check digit */ if (gs1_check_digit(source, 13) != source[13]) { sprintf(symbol->errtxt, "388: Invalid check digit '%c', expecting '%c'", source[13], gs1_check_digit(source, 13)); return ZINT_ERROR_INVALID_CHECK; } - src_len--; /* Ignore */ + length--; /* Ignore */ } /* make some room for a separator row for composite symbols */ @@ -331,7 +327,7 @@ INTERNAL int dbar_omn_cc(struct zint_symbol *symbol, unsigned char source[], int break; } - large_load_str_u64(&accum, source, src_len); + large_load_str_u64(&accum, source, length); if (cc_rows) { /* Add symbol linkage flag */ @@ -490,7 +486,7 @@ INTERNAL int dbar_omn_cc(struct zint_symbol *symbol, unsigned char source[], int symbol->rows = symbol->rows + 1; /* Set human readable text */ - dbar_set_gtin14_hrt(symbol, source, src_len); + dbar_set_gtin14_hrt(symbol, source, length); if (symbol->output_options & COMPLIANT_HEIGHT) { /* Minimum height is 13X for truncated symbol ISO/IEC 24724:2011 5.3.1 @@ -621,12 +617,12 @@ INTERNAL int dbar_omn_cc(struct zint_symbol *symbol, unsigned char source[], int } /* GS1 DataBar Omnidirectional/Truncated/Stacked */ -INTERNAL int dbar_omn(struct zint_symbol *symbol, unsigned char source[], int src_len) { - return dbar_omn_cc(symbol, source, src_len, 0 /*cc_rows*/); +INTERNAL int dbar_omn(struct zint_symbol *symbol, unsigned char source[], int length) { + return dbar_omn_cc(symbol, source, length, 0 /*cc_rows*/); } /* GS1 DataBar Limited, allowing for composite if `cc_rows` set */ -INTERNAL int dbar_ltd_cc(struct zint_symbol *symbol, unsigned char source[], int src_len, const int cc_rows) { +INTERNAL int dbar_ltd_cc(struct zint_symbol *symbol, unsigned char source[], int length, const int cc_rows) { int error_number = 0, i; large_int accum; uint64_t left_character, right_character; @@ -639,25 +635,25 @@ INTERNAL int dbar_ltd_cc(struct zint_symbol *symbol, unsigned char source[], int separator_row = 0; - if (src_len > 14) { /* Allow check digit to be specified (will be verified and ignored) */ + if (length > 14) { /* Allow check digit to be specified (will be verified and ignored) */ strcpy(symbol->errtxt, "382: Input too long (14 character maximum)"); return ZINT_ERROR_TOO_LONG; } - if (!is_sane(NEON_F, source, src_len)) { + if (!is_sane(NEON_F, source, length)) { strcpy(symbol->errtxt, "383: Invalid character in data (digits only)"); return ZINT_ERROR_INVALID_DATA; } - if (src_len == 14) { /* Verify check digit */ + if (length == 14) { /* Verify check digit */ if (gs1_check_digit(source, 13) != source[13]) { sprintf(symbol->errtxt, "389: Invalid check digit '%c', expecting '%c'", source[13], gs1_check_digit(source, 13)); return ZINT_ERROR_INVALID_CHECK; } - src_len--; /* Ignore */ + length--; /* Ignore */ } - if (src_len == 13) { + if (length == 13) { if ((source[0] != '0') && (source[0] != '1')) { strcpy(symbol->errtxt, "384: Input out of range (0 to 1999999999999)"); return ZINT_ERROR_INVALID_DATA; @@ -671,7 +667,7 @@ INTERNAL int dbar_ltd_cc(struct zint_symbol *symbol, unsigned char source[], int symbol->rows += 1; } - large_load_str_u64(&accum, source, src_len); + large_load_str_u64(&accum, source, length); if (cc_rows) { /* Add symbol linkage flag */ @@ -795,7 +791,7 @@ INTERNAL int dbar_ltd_cc(struct zint_symbol *symbol, unsigned char source[], int } /* Set human readable text */ - dbar_set_gtin14_hrt(symbol, source, src_len); + dbar_set_gtin14_hrt(symbol, source, length); /* ISO/IEC 24724:2011 6.2 10X minimum height, use as default also */ if (symbol->symbology == BARCODE_DBAR_LTD_CC) { @@ -812,8 +808,8 @@ INTERNAL int dbar_ltd_cc(struct zint_symbol *symbol, unsigned char source[], int } /* GS1 DataBar Limited */ -INTERNAL int dbar_ltd(struct zint_symbol *symbol, unsigned char source[], int src_len) { - return dbar_ltd_cc(symbol, source, src_len, 0 /*cc_rows*/); +INTERNAL int dbar_ltd(struct zint_symbol *symbol, unsigned char source[], int length) { + return dbar_ltd_cc(symbol, source, length, 0 /*cc_rows*/); } /* Check and convert date to DataBar date value */ @@ -1259,8 +1255,23 @@ static void dbar_exp_separator(struct zint_symbol *symbol, int width, const int } } +/* Set HRT for DataBar Expanded */ +static void dbar_exp_hrt(struct zint_symbol *symbol, unsigned char source[], const int length) { + int i; + + for (i = 0; i <= length; i++) { /* Include terminating NUL */ + if (source[i] == '[') { + symbol->text[i] = '('; + } else if (source[i] == ']') { + symbol->text[i] = ')'; + } else { + symbol->text[i] = source[i]; + } + } +} + /* GS1 DataBar Expanded, setting linkage for composite if `cc_rows` set */ -INTERNAL int dbar_exp_cc(struct zint_symbol *symbol, unsigned char source[], int src_len, const int cc_rows) { +INTERNAL int dbar_exp_cc(struct zint_symbol *symbol, unsigned char source[], int length, const int cc_rows) { int error_number, warn_number = 0; int i, j, k, p, codeblocks, data_chars, vs, group, v_odd, v_even; int latch; @@ -1268,7 +1279,7 @@ INTERNAL int dbar_exp_cc(struct zint_symbol *symbol, unsigned char source[], int int check_char, c_odd, c_even, elements[235], pattern_width, reader, writer; int separator_row; /* Allow for 8 bits + 5-bit latch per char + 200 bits overhead/padding */ - unsigned int bin_len = 13 * src_len + 200 + 1; + unsigned int bin_len = 13 * length + 200 + 1; int widths[4]; int bp = 0; int cols_per_row = 0; @@ -1276,16 +1287,16 @@ INTERNAL int dbar_exp_cc(struct zint_symbol *symbol, unsigned char source[], int int stack_rows = 1; const int debug_print = (symbol->debug & ZINT_DEBUG_PRINT); #ifndef _MSC_VER - unsigned char reduced[src_len + 1]; + unsigned char reduced[length + 1]; char binary_string[bin_len]; #else - unsigned char *reduced = (unsigned char *) _alloca(src_len + 1); + unsigned char *reduced = (unsigned char *) _alloca(length + 1); char *binary_string = (char *) _alloca(bin_len); #endif separator_row = 0; - error_number = gs1_verify(symbol, source, src_len, reduced); + error_number = gs1_verify(symbol, source, length, reduced); if (error_number >= ZINT_ERROR) { return error_number; } @@ -1466,16 +1477,7 @@ INTERNAL int dbar_exp_cc(struct zint_symbol *symbol, unsigned char source[], int } symbol->rows = symbol->rows + 1; - /* Add human readable text */ - for (i = 0; i <= src_len; i++) { - if (source[i] == '[') { - symbol->text[i] = '('; - } else if (source[i] == ']') { - symbol->text[i] = ')'; - } else { - symbol->text[i] = source[i]; - } - } + dbar_exp_hrt(symbol, source, length); } else { int current_row, current_block, left_to_right; @@ -1621,6 +1623,8 @@ INTERNAL int dbar_exp_cc(struct zint_symbol *symbol, unsigned char source[], int } /* GS1 DataBar Expanded */ -INTERNAL int dbar_exp(struct zint_symbol *symbol, unsigned char source[], int src_len) { - return dbar_exp_cc(symbol, source, src_len, 0 /*cc_rows*/); +INTERNAL int dbar_exp(struct zint_symbol *symbol, unsigned char source[], int length) { + return dbar_exp_cc(symbol, source, length, 0 /*cc_rows*/); } + +/* vim: set ts=4 sw=4 et : */ diff --git a/backend/tests/test_large.c b/backend/tests/test_large.c index 5f7f8a5c..f09d4d89 100644 --- a/backend/tests/test_large.c +++ b/backend/tests/test_large.c @@ -43,7 +43,7 @@ # elif defined(__GNUC__) # pragma GCC diagnostic ignored "-Wformat" /* Unfortunately doesn't seem to be way to only avoid non-ISO warnings */ # endif -#elif defined(_MSC_VER) || __WORDSIZE == 32 +#elif defined(_MSC_VER) || defined(__APPLE__) || __WORDSIZE == 32 # define LX_FMT "ll" #else # define LX_FMT "l" diff --git a/backend/tests/test_library.c b/backend/tests/test_library.c index e4e596ad..d0fa2763 100644 --- a/backend/tests/test_library.c +++ b/backend/tests/test_library.c @@ -295,7 +295,7 @@ static void test_checks_segs(int index, int debug) { /* 6*/ { BARCODE_CODE128, -1, { { TU("A"), 0, 3 }, { TU("B"), 0, 4 } }, 2, -1, -1, -1, ZINT_ERROR_INVALID_OPTION, "Error 775: Symbology does not support multiple segments" }, /* 7*/ { BARCODE_CODE128, -1, { { TU("A"), 0, 3 }, { NULL, 0, 0 } }, 1, -1, -1, -1, ZINT_ERROR_INVALID_OPTION, "Error 217: Symbology does not support ECI switching" }, /* 8*/ { BARCODE_AZTEC, -1, { { TU("A"), 0, 3 }, { TU("B"), 0, 1 } }, 2, -1, -1, -1, ZINT_ERROR_INVALID_OPTION, "Error 218: Invalid ECI code 1" }, - /* 9*/ { BARCODE_AZTEC, -1, { { TU("A"), 0, 3 }, { TU("B"), 0, 4 } }, 2, GS1_MODE, -1, -1, ZINT_ERROR_INVALID_OPTION, "Error 776: GS1_MODE not supported for multiple segments" }, + /* 9*/ { BARCODE_AZTEC, -1, { { TU("A"), 0, 3 }, { TU("B"), 0, 4 } }, 2, GS1_MODE, -1, -1, ZINT_ERROR_INVALID_OPTION, "Error 776: GS1 mode not supported for multiple segments" }, /* 10*/ { BARCODE_AZTEC, -1, { { TU("A"), 0, 3 }, { TU("\200"), 0, 4 } }, 2, UNICODE_MODE, -1, -1, ZINT_ERROR_INVALID_DATA, "Error 245: Invalid UTF-8 in input data" }, /* 11*/ { BARCODE_AZTEC, -1, { { TU("A"), 0, 3 }, { TU("B"), 0, 4 } }, 2, -1, -1, -1, 0, "" }, /* 12*/ { BARCODE_AZTEC, -1, { { TU("A"), 0, 0 }, { TU("B"), 0, 4 } }, 2, -1, 3, -1, 0, "" }, @@ -458,6 +458,7 @@ static void test_escape_char_process(int index, int generate, int debug) { int input_mode; int eci; char *data; + char *composite; int ret; int expected_width; char *expected; @@ -465,90 +466,95 @@ static void test_escape_char_process(int index, int generate, int debug) { char *comment; }; struct item data[] = { - /* 0*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\0\\E\\a\\b\\t\\n\\v\\f\\r\\e\\G\\R\\x81\\\\", 0, 26, "01 05 08 09 0A 0B 0C 0D 0E 1C 1E 1F EB 02 5D 81 21 0D 92 2E 3D FD B6 9A 37 2A CD 61 FB 95", 0, "" }, - /* 1*/ { BARCODE_CODABLOCKF, DATA_MODE, -1, "\\0\\E\\a\\b\\t\\n\\v\\f\\r\\e\\G\\R\\x81\\\\", 0, 101, "(45) 67 62 43 40 44 47 48 29 6A 67 62 0B 49 4A 4B 4C 18 6A 67 62 0C 4D 5B 5D 5E 62 6A 67", 0, "" }, - /* 2*/ { BARCODE_CODE16K, DATA_MODE, -1, "\\0\\E\\a\\b\\t\\n\\v\\f\\r\\e\\G\\R\\x81\\\\", 0, 70, "(20) 14 64 68 71 72 73 74 75 76 77 91 93 94 101 65 60 103 103 45 61", 0, "" }, - /* 3*/ { BARCODE_DOTCODE, DATA_MODE, -1, "\\0\\E\\a\\b\\t\\n\\v\\f\\r\\e\\G\\R\\x81\\\\", 0, 28, "65 40 44 47 48 49 4A 4B 4C 4D 5B 5D 5E 6E 41 3C 6A", 0, "" }, - /* 4*/ { BARCODE_GRIDMATRIX, DATA_MODE, -1, "\\0\\E\\a\\b\\t\\n\\v\\f\\r\\e\\G\\R\\x81\\\\", 0, 30, "30 1A 00 02 01 61 00 48 28 16 0C 06 46 63 51 74 05 38 00", 0, "" }, - /* 5*/ { BARCODE_HANXIN, DATA_MODE, -1, "\\0\\E\\a\\b\\t\\n\\v\\f\\r\\e\\G\\R\\x81\\\\", 0, 23, "2F 80 10 72 09 28 B3 0D 6F F3 00 20 E8 F4 0A E0 00", 0, "" }, - /* 6*/ { BARCODE_MAXICODE, DATA_MODE, -1, "\\0\\E\\a\\b\\t\\n\\v\\f\\r\\e\\G\\R\\x81\\\\", 0, 30, "(144) 04 3E 3E 00 04 07 08 09 0A 0B 03 3D 2C 24 19 1E 23 1B 18 0E 0C 0D 1E 21 3C 1E 3C 31", 0, "" }, - /* 7*/ { BARCODE_PDF417, DATA_MODE, -1, "\\0\\E\\a\\b\\t\\n\\v\\f\\r\\e\\G\\R\\x81\\\\", 0, 120, "(24) 16 901 0 23 655 318 98 18 461 639 893 122 129 92 900 900 872 438 359 646 522 773 831", 0, "" }, - /* 8*/ { BARCODE_ULTRA, DATA_MODE, -1, "\\0\\E\\a\\b\\t\\n\\v\\f\\r\\e\\G\\R\\x81\\\\", 0, 20, "(15) 257 0 4 7 8 9 10 11 12 13 27 29 30 129 92", 0, "" }, - /* 9*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\0\\E\\a\\b\\t\\n\\v\\f\\r\\e\\G\\R\\x81\\d129\\o201\\\\", 0, 18, "(32) 01 05 08 09 0A 0B 0C 0D 0E 1C 1E 1F E7 32 45 DB 70 5D E3 16 7B 2B 44 60 E1 55 F7 08", 0, "" }, - /* 10*/ { BARCODE_HANXIN, DATA_MODE, -1, "\\0\\E\\a\\b\\t\\n\\v\\f\\r\\e\\G\\R\\x81\\d129\\o201\\\\", 0, 23, "2F 80 10 72 09 28 B3 0D 6F F3 00 30 E8 F4 0C 0C 0A E0 00 00 00", 0, "" }, - /* 11*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\c", ZINT_ERROR_INVALID_DATA, 0, "Error 234: Unrecognised escape character '\\c' in input data", 0, "" }, - /* 12*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\", ZINT_ERROR_INVALID_DATA, 0, "Error 236: Incomplete escape character in input data", 0, "" }, - /* 13*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\x", ZINT_ERROR_INVALID_DATA, 0, "Error 232: Incomplete '\\x' escape sequence in input data", 0, "" }, - /* 14*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\x1", ZINT_ERROR_INVALID_DATA, 0, "Error 232: Incomplete '\\x' escape sequence in input data", 0, "" }, - /* 15*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\x1g", ZINT_ERROR_INVALID_DATA, 0, "Error 233: Invalid character for '\\x' escape sequence in input data (hexadecimal only)", 0, "" }, - /* 16*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\d", ZINT_ERROR_INVALID_DATA, 0, "Error 232: Incomplete '\\d' escape sequence in input data", 0, "" }, - /* 17*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\d1", ZINT_ERROR_INVALID_DATA, 0, "Error 232: Incomplete '\\d' escape sequence in input data", 0, "" }, - /* 18*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\d12", ZINT_ERROR_INVALID_DATA, 0, "Error 232: Incomplete '\\d' escape sequence in input data", 0, "" }, - /* 19*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\d12a", ZINT_ERROR_INVALID_DATA, 0, "Error 233: Invalid character for '\\d' escape sequence in input data (decimal only)", 0, "" }, - /* 20*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\o", ZINT_ERROR_INVALID_DATA, 0, "Error 232: Incomplete '\\o' escape sequence in input data", 0, "" }, - /* 21*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\o1", ZINT_ERROR_INVALID_DATA, 0, "Error 232: Incomplete '\\o' escape sequence in input data", 0, "" }, - /* 22*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\o12", ZINT_ERROR_INVALID_DATA, 0, "Error 232: Incomplete '\\o' escape sequence in input data", 0, "" }, - /* 23*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\o128", ZINT_ERROR_INVALID_DATA, 0, "Error 233: Invalid character for '\\o' escape sequence in input data (octal only)", 0, "" }, - /* 24*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\xA01\\xFF", 0, 12, "EB 21 32 EB 80 D8 49 44 DC 7D 9E 3B", 0, "" }, - /* 25*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\d1601\\d255", 0, 12, "EB 21 32 EB 80 D8 49 44 DC 7D 9E 3B", 1, "" }, - /* 26*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\o2401\\o377", 0, 12, "EB 21 32 EB 80 D8 49 44 DC 7D 9E 3B", 1, "" }, - /* 27*/ { BARCODE_DATAMATRIX, UNICODE_MODE, -1, "\\u00A01\\u00FF", 0, 12, "EB 21 32 EB 80 D8 49 44 DC 7D 9E 3B", 1, "" }, - /* 28*/ { BARCODE_DATAMATRIX, UNICODE_MODE, -1, "\\U0000A01\\U0000FF", 0, 12, "EB 21 32 EB 80 D8 49 44 DC 7D 9E 3B", 1, "" }, - /* 29*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\xc3\\xbF", 0, 12, "EB 44 EB 40 81 30 87 17 C5 68 5C 91", 0, "" }, - /* 30*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\d195\\d191", 0, 12, "EB 44 EB 40 81 30 87 17 C5 68 5C 91", 1, "" }, - /* 31*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\o303\\o277", 0, 12, "EB 44 EB 40 81 30 87 17 C5 68 5C 91", 1, "" }, - /* 32*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\u00fF", 0, 12, "EB 44 EB 40 81 30 87 17 C5 68 5C 91", 1, "" }, - /* 33*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\U0000fF", 0, 12, "EB 44 EB 40 81 30 87 17 C5 68 5C 91", 1, "" }, - /* 34*/ { BARCODE_DATAMATRIX, UNICODE_MODE, -1, "\\xc3\\xbF", 0, 10, "EB 80 81 47 1E 45 FC 93", 0, "" }, - /* 35*/ { BARCODE_DATAMATRIX, UNICODE_MODE, -1, "\\d195\\d191", 0, 10, "EB 80 81 47 1E 45 FC 93", 1, "" }, - /* 36*/ { BARCODE_DATAMATRIX, UNICODE_MODE, -1, "\\o303\\o277", 0, 10, "EB 80 81 47 1E 45 FC 93", 1, "" }, - /* 37*/ { BARCODE_DATAMATRIX, UNICODE_MODE, -1, "\\u00fF", 0, 10, "EB 80 81 47 1E 45 FC 93", 1, "" }, - /* 38*/ { BARCODE_DATAMATRIX, UNICODE_MODE, -1, "\\U0000fF", 0, 10, "EB 80 81 47 1E 45 FC 93", 1, "" }, - /* 39*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\u", ZINT_ERROR_INVALID_DATA, 0, "Error 209: Incomplete '\\u' escape sequence in input data", 0, "" }, - /* 40*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\uF", ZINT_ERROR_INVALID_DATA, 0, "Error 209: Incomplete '\\u' escape sequence in input data", 0, "" }, - /* 41*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\u0F", ZINT_ERROR_INVALID_DATA, 0, "Error 209: Incomplete '\\u' escape sequence in input data", 0, "" }, - /* 42*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\uFG", ZINT_ERROR_INVALID_DATA, 0, "Error 209: Incomplete '\\u' escape sequence in input data", 0, "" }, - /* 43*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\u00F", ZINT_ERROR_INVALID_DATA, 0, "Error 209: Incomplete '\\u' escape sequence in input data", 0, "" }, - /* 44*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\u00FG", ZINT_ERROR_INVALID_DATA, 0, "Error 211: Invalid character for '\\u' escape sequence in input data (hexadecimal only)", 0, "" }, - /* 45*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\ufffe", ZINT_ERROR_INVALID_DATA, 0, "Error 246: Invalid value for '\\u' escape sequence in input data", 0, "Reversed BOM" }, - /* 46*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\ud800", ZINT_ERROR_INVALID_DATA, 0, "Error 246: Invalid value for '\\u' escape sequence in input data", 0, "Surrogate" }, - /* 47*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\udfff", ZINT_ERROR_INVALID_DATA, 0, "Error 246: Invalid value for '\\u' escape sequence in input data", 0, "Surrogate" }, - /* 48*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 17, "\\xE2\\x82\\xAC", 0, 12, "F1 12 EB 25 81 4A 0A 8C 31 AC E3 2E", 0, "Zint manual 4.10 Ex1" }, - /* 49*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 17, "\\u20AC", 0, 12, "F1 12 EB 25 81 4A 0A 8C 31 AC E3 2E", 1, "" }, - /* 50*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 17, "\\U0020AC", 0, 12, "F1 12 EB 25 81 4A 0A 8C 31 AC E3 2E", 1, "" }, - /* 51*/ { BARCODE_DATAMATRIX, DATA_MODE, 17, "\\xA4", 0, 12, "F1 12 EB 25 81 4A 0A 8C 31 AC E3 2E", 1, "" }, - /* 52*/ { BARCODE_DATAMATRIX, DATA_MODE, 28, "\\xB1\\x60", 0, 12, "F1 1D EB 32 61 D9 1C 0C C2 46 C3 B2", 0, "Zint manual 4.10 Ex2" }, - /* 53*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 28, "\\u5E38", 0, 12, "F1 1D EB 32 61 D9 1C 0C C2 46 C3 B2", 1, "" }, - /* 54*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 28, "\\U005E38", 0, 12, "F1 1D EB 32 61 D9 1C 0C C2 46 C3 B2", 1, "" }, - /* 55*/ { BARCODE_DATAMATRIX, UNICODE_MODE, -1, "\\u007F", 0, 10, "80 81 46 73 64 88 6A 84", 0, "" }, - /* 56*/ { BARCODE_DATAMATRIX, UNICODE_MODE, -1, "\\U00007F", 0, 10, "80 81 46 73 64 88 6A 84", 0, "" }, - /* 57*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\U", ZINT_ERROR_INVALID_DATA, 0, "Error 209: Incomplete '\\U' escape sequence in input data", 0, "" }, - /* 58*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\UF", ZINT_ERROR_INVALID_DATA, 0, "Error 209: Incomplete '\\U' escape sequence in input data", 0, "" }, - /* 59*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\U0F", ZINT_ERROR_INVALID_DATA, 0, "Error 209: Incomplete '\\U' escape sequence in input data", 0, "" }, - /* 60*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\UFG", ZINT_ERROR_INVALID_DATA, 0, "Error 209: Incomplete '\\U' escape sequence in input data", 0, "" }, - /* 61*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\U00F", ZINT_ERROR_INVALID_DATA, 0, "Error 209: Incomplete '\\U' escape sequence in input data", 0, "" }, - /* 62*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\U00FG", ZINT_ERROR_INVALID_DATA, 0, "Error 209: Incomplete '\\U' escape sequence in input data", 0, "" }, - /* 63*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\Ufffe", ZINT_ERROR_INVALID_DATA, 0, "Error 209: Incomplete '\\U' escape sequence in input data", 0, "Reversed BOM" }, - /* 64*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\Ud800", ZINT_ERROR_INVALID_DATA, 0, "Error 209: Incomplete '\\U' escape sequence in input data", 0, "Surrogate" }, - /* 65*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\Udfff", ZINT_ERROR_INVALID_DATA, 0, "Error 209: Incomplete '\\U' escape sequence in input data", 0, "Surrogate" }, - /* 66*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\U000F", ZINT_ERROR_INVALID_DATA, 0, "Error 209: Incomplete '\\U' escape sequence in input data", 0, "" }, - /* 67*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\U0000F", ZINT_ERROR_INVALID_DATA, 0, "Error 209: Incomplete '\\U' escape sequence in input data", 0, "" }, - /* 68*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\U110000", ZINT_ERROR_INVALID_DATA, 0, "Error 246: Invalid value for '\\U' escape sequence in input data", 0, "" }, - /* 69*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 25, "\\U10FFFF", 0, 14, "F1 1A 01 01 EB 80 EB 80 3F C0 9C 0B 4B B8 DA B7 B6 1A", 0, "" }, - /* 70*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 26, "\\U10FFFF", 0, 14, "F1 1B 01 E7 EC 71 D7 6C 20 D6 B3 63 E2 18 B6 4C 7D 3E", 0, "" }, - /* 71*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 32, "\\U10FFFF", 0, 32, "F1 21 01 EB 05 32 EB 25 3A 81 7E 98 9B 50 AC 1C E0 4E 51 BA 23", 0, "" }, - /* 72*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 33, "\\U10FFFF", 0, 14, "F1 22 01 01 EB 80 EB 80 A3 E5 BE FB 1A 08 94 2E C3 74", 0, "" }, - /* 73*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 34, "\\U10FFFF", 0, 16, "F1 23 01 01 01 01 01 01 EB 80 EB 80 F6 F1 5D 2A D1 0A BF BC B8 22 65 0C", 0, "" }, - /* 74*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 35, "\\U10FFFF", 0, 16, "F1 24 01 01 01 01 EB 80 EB 80 01 01 7F 58 28 41 7F 63 0E EB A7 D8 D0 1F", 0, "" }, + /* 0*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\0\\E\\a\\b\\t\\n\\v\\f\\r\\e\\G\\R\\x81\\\\", "", 0, 26, "01 05 08 09 0A 0B 0C 0D 0E 1C 1E 1F EB 02 5D 81 21 0D 92 2E 3D FD B6 9A 37 2A CD 61 FB 95", 0, "" }, + /* 1*/ { BARCODE_CODABLOCKF, DATA_MODE, -1, "\\0\\E\\a\\b\\t\\n\\v\\f\\r\\e\\G\\R\\x81\\\\", "", 0, 101, "(45) 67 62 43 40 44 47 48 29 6A 67 62 0B 49 4A 4B 4C 18 6A 67 62 0C 4D 5B 5D 5E 62 6A 67", 0, "" }, + /* 2*/ { BARCODE_CODE16K, DATA_MODE, -1, "\\0\\E\\a\\b\\t\\n\\v\\f\\r\\e\\G\\R\\x81\\\\", "", 0, 70, "(20) 14 64 68 71 72 73 74 75 76 77 91 93 94 101 65 60 103 103 45 61", 0, "" }, + /* 3*/ { BARCODE_DOTCODE, DATA_MODE, -1, "\\0\\E\\a\\b\\t\\n\\v\\f\\r\\e\\G\\R\\x81\\\\", "", 0, 28, "65 40 44 47 48 49 4A 4B 4C 4D 5B 5D 5E 6E 41 3C 6A", 0, "" }, + /* 4*/ { BARCODE_GRIDMATRIX, DATA_MODE, -1, "\\0\\E\\a\\b\\t\\n\\v\\f\\r\\e\\G\\R\\x81\\\\", "", 0, 30, "30 1A 00 02 01 61 00 48 28 16 0C 06 46 63 51 74 05 38 00", 0, "" }, + /* 5*/ { BARCODE_HANXIN, DATA_MODE, -1, "\\0\\E\\a\\b\\t\\n\\v\\f\\r\\e\\G\\R\\x81\\\\", "", 0, 23, "2F 80 10 72 09 28 B3 0D 6F F3 00 20 E8 F4 0A E0 00", 0, "" }, + /* 6*/ { BARCODE_MAXICODE, DATA_MODE, -1, "\\0\\E\\a\\b\\t\\n\\v\\f\\r\\e\\G\\R\\x81\\\\", "", 0, 30, "(144) 04 3E 3E 00 04 07 08 09 0A 0B 03 3D 2C 24 19 1E 23 1B 18 0E 0C 0D 1E 21 3C 1E 3C 31", 0, "" }, + /* 7*/ { BARCODE_PDF417, DATA_MODE, -1, "\\0\\E\\a\\b\\t\\n\\v\\f\\r\\e\\G\\R\\x81\\\\", "", 0, 120, "(24) 16 901 0 23 655 318 98 18 461 639 893 122 129 92 900 900 872 438 359 646 522 773 831", 0, "" }, + /* 8*/ { BARCODE_ULTRA, DATA_MODE, -1, "\\0\\E\\a\\b\\t\\n\\v\\f\\r\\e\\G\\R\\x81\\\\", "", 0, 20, "(15) 257 0 4 7 8 9 10 11 12 13 27 29 30 129 92", 0, "" }, + /* 9*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\0\\E\\a\\b\\t\\n\\v\\f\\r\\e\\G\\R\\x81\\d129\\o201\\\\", "", 0, 18, "(32) 01 05 08 09 0A 0B 0C 0D 0E 1C 1E 1F E7 32 45 DB 70 5D E3 16 7B 2B 44 60 E1 55 F7 08", 0, "" }, + /* 10*/ { BARCODE_HANXIN, DATA_MODE, -1, "\\0\\E\\a\\b\\t\\n\\v\\f\\r\\e\\G\\R\\x81\\d129\\o201\\\\", "", 0, 23, "2F 80 10 72 09 28 B3 0D 6F F3 00 30 E8 F4 0C 0C 0A E0 00 00 00", 0, "" }, + /* 11*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\c", "", ZINT_ERROR_INVALID_DATA, 0, "Error 234: Unrecognised escape character '\\c' in input data", 0, "" }, + /* 12*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\", "", ZINT_ERROR_INVALID_DATA, 0, "Error 236: Incomplete escape character in input data", 0, "" }, + /* 13*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\x", "", ZINT_ERROR_INVALID_DATA, 0, "Error 232: Incomplete '\\x' escape sequence in input data", 0, "" }, + /* 14*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\x1", "", ZINT_ERROR_INVALID_DATA, 0, "Error 232: Incomplete '\\x' escape sequence in input data", 0, "" }, + /* 15*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\x1g", "", ZINT_ERROR_INVALID_DATA, 0, "Error 233: Invalid character for '\\x' escape sequence in input data (hexadecimal only)", 0, "" }, + /* 16*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\d", "", ZINT_ERROR_INVALID_DATA, 0, "Error 232: Incomplete '\\d' escape sequence in input data", 0, "" }, + /* 17*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\d1", "", ZINT_ERROR_INVALID_DATA, 0, "Error 232: Incomplete '\\d' escape sequence in input data", 0, "" }, + /* 18*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\d12", "", ZINT_ERROR_INVALID_DATA, 0, "Error 232: Incomplete '\\d' escape sequence in input data", 0, "" }, + /* 19*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\d12a", "", ZINT_ERROR_INVALID_DATA, 0, "Error 233: Invalid character for '\\d' escape sequence in input data (decimal only)", 0, "" }, + /* 20*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\o", "", ZINT_ERROR_INVALID_DATA, 0, "Error 232: Incomplete '\\o' escape sequence in input data", 0, "" }, + /* 21*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\o1", "", ZINT_ERROR_INVALID_DATA, 0, "Error 232: Incomplete '\\o' escape sequence in input data", 0, "" }, + /* 22*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\o12", "", ZINT_ERROR_INVALID_DATA, 0, "Error 232: Incomplete '\\o' escape sequence in input data", 0, "" }, + /* 23*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\o128", "", ZINT_ERROR_INVALID_DATA, 0, "Error 233: Invalid character for '\\o' escape sequence in input data (octal only)", 0, "" }, + /* 24*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\xA01\\xFF", "", 0, 12, "EB 21 32 EB 80 D8 49 44 DC 7D 9E 3B", 0, "" }, + /* 25*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\d1601\\d255", "", 0, 12, "EB 21 32 EB 80 D8 49 44 DC 7D 9E 3B", 1, "" }, + /* 26*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\o2401\\o377", "", 0, 12, "EB 21 32 EB 80 D8 49 44 DC 7D 9E 3B", 1, "" }, + /* 27*/ { BARCODE_DATAMATRIX, UNICODE_MODE, -1, "\\u00A01\\u00FF", "", 0, 12, "EB 21 32 EB 80 D8 49 44 DC 7D 9E 3B", 1, "" }, + /* 28*/ { BARCODE_DATAMATRIX, UNICODE_MODE, -1, "\\U0000A01\\U0000FF", "", 0, 12, "EB 21 32 EB 80 D8 49 44 DC 7D 9E 3B", 1, "" }, + /* 29*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\xc3\\xbF", "", 0, 12, "EB 44 EB 40 81 30 87 17 C5 68 5C 91", 0, "" }, + /* 30*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\d195\\d191", "", 0, 12, "EB 44 EB 40 81 30 87 17 C5 68 5C 91", 1, "" }, + /* 31*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\o303\\o277", "", 0, 12, "EB 44 EB 40 81 30 87 17 C5 68 5C 91", 1, "" }, + /* 32*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\u00fF", "", 0, 12, "EB 44 EB 40 81 30 87 17 C5 68 5C 91", 1, "" }, + /* 33*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\U0000fF", "", 0, 12, "EB 44 EB 40 81 30 87 17 C5 68 5C 91", 1, "" }, + /* 34*/ { BARCODE_DATAMATRIX, UNICODE_MODE, -1, "\\xc3\\xbF", "", 0, 10, "EB 80 81 47 1E 45 FC 93", 0, "" }, + /* 35*/ { BARCODE_DATAMATRIX, UNICODE_MODE, -1, "\\d195\\d191", "", 0, 10, "EB 80 81 47 1E 45 FC 93", 1, "" }, + /* 36*/ { BARCODE_DATAMATRIX, UNICODE_MODE, -1, "\\o303\\o277", "", 0, 10, "EB 80 81 47 1E 45 FC 93", 1, "" }, + /* 37*/ { BARCODE_DATAMATRIX, UNICODE_MODE, -1, "\\u00fF", "", 0, 10, "EB 80 81 47 1E 45 FC 93", 1, "" }, + /* 38*/ { BARCODE_DATAMATRIX, UNICODE_MODE, -1, "\\U0000fF", "", 0, 10, "EB 80 81 47 1E 45 FC 93", 1, "" }, + /* 39*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\u", "", ZINT_ERROR_INVALID_DATA, 0, "Error 209: Incomplete '\\u' escape sequence in input data", 0, "" }, + /* 40*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\uF", "", ZINT_ERROR_INVALID_DATA, 0, "Error 209: Incomplete '\\u' escape sequence in input data", 0, "" }, + /* 41*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\u0F", "", ZINT_ERROR_INVALID_DATA, 0, "Error 209: Incomplete '\\u' escape sequence in input data", 0, "" }, + /* 42*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\uFG", "", ZINT_ERROR_INVALID_DATA, 0, "Error 209: Incomplete '\\u' escape sequence in input data", 0, "" }, + /* 43*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\u00F", "", ZINT_ERROR_INVALID_DATA, 0, "Error 209: Incomplete '\\u' escape sequence in input data", 0, "" }, + /* 44*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\u00FG", "", ZINT_ERROR_INVALID_DATA, 0, "Error 211: Invalid character for '\\u' escape sequence in input data (hexadecimal only)", 0, "" }, + /* 45*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\ufffe", "", ZINT_ERROR_INVALID_DATA, 0, "Error 246: Invalid value for '\\u' escape sequence in input data", 0, "Reversed BOM" }, + /* 46*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\ud800", "", ZINT_ERROR_INVALID_DATA, 0, "Error 246: Invalid value for '\\u' escape sequence in input data", 0, "Surrogate" }, + /* 47*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\udfff", "", ZINT_ERROR_INVALID_DATA, 0, "Error 246: Invalid value for '\\u' escape sequence in input data", 0, "Surrogate" }, + /* 48*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 17, "\\xE2\\x82\\xAC", "", 0, 12, "F1 12 EB 25 81 4A 0A 8C 31 AC E3 2E", 0, "Zint manual 4.10 Ex1" }, + /* 49*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 17, "\\u20AC", "", 0, 12, "F1 12 EB 25 81 4A 0A 8C 31 AC E3 2E", 1, "" }, + /* 50*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 17, "\\U0020AC", "", 0, 12, "F1 12 EB 25 81 4A 0A 8C 31 AC E3 2E", 1, "" }, + /* 51*/ { BARCODE_DATAMATRIX, DATA_MODE, 17, "\\xA4", "", 0, 12, "F1 12 EB 25 81 4A 0A 8C 31 AC E3 2E", 1, "" }, + /* 52*/ { BARCODE_DATAMATRIX, DATA_MODE, 28, "\\xB1\\x60", "", 0, 12, "F1 1D EB 32 61 D9 1C 0C C2 46 C3 B2", 0, "Zint manual 4.10 Ex2" }, + /* 53*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 28, "\\u5E38", "", 0, 12, "F1 1D EB 32 61 D9 1C 0C C2 46 C3 B2", 1, "" }, + /* 54*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 28, "\\U005E38", "", 0, 12, "F1 1D EB 32 61 D9 1C 0C C2 46 C3 B2", 1, "" }, + /* 55*/ { BARCODE_DATAMATRIX, UNICODE_MODE, -1, "\\u007F", "", 0, 10, "80 81 46 73 64 88 6A 84", 0, "" }, + /* 56*/ { BARCODE_DATAMATRIX, UNICODE_MODE, -1, "\\U00007F", "", 0, 10, "80 81 46 73 64 88 6A 84", 0, "" }, + /* 57*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\U", "", ZINT_ERROR_INVALID_DATA, 0, "Error 209: Incomplete '\\U' escape sequence in input data", 0, "" }, + /* 58*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\UF", "", ZINT_ERROR_INVALID_DATA, 0, "Error 209: Incomplete '\\U' escape sequence in input data", 0, "" }, + /* 59*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\U0F", "", ZINT_ERROR_INVALID_DATA, 0, "Error 209: Incomplete '\\U' escape sequence in input data", 0, "" }, + /* 60*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\UFG", "", ZINT_ERROR_INVALID_DATA, 0, "Error 209: Incomplete '\\U' escape sequence in input data", 0, "" }, + /* 61*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\U00F", "", ZINT_ERROR_INVALID_DATA, 0, "Error 209: Incomplete '\\U' escape sequence in input data", 0, "" }, + /* 62*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\U00FG", "", ZINT_ERROR_INVALID_DATA, 0, "Error 209: Incomplete '\\U' escape sequence in input data", 0, "" }, + /* 63*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\Ufffe", "", ZINT_ERROR_INVALID_DATA, 0, "Error 209: Incomplete '\\U' escape sequence in input data", 0, "Reversed BOM" }, + /* 64*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\Ud800", "", ZINT_ERROR_INVALID_DATA, 0, "Error 209: Incomplete '\\U' escape sequence in input data", 0, "Surrogate" }, + /* 65*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\Udfff", "", ZINT_ERROR_INVALID_DATA, 0, "Error 209: Incomplete '\\U' escape sequence in input data", 0, "Surrogate" }, + /* 66*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\U000F", "", ZINT_ERROR_INVALID_DATA, 0, "Error 209: Incomplete '\\U' escape sequence in input data", 0, "" }, + /* 67*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\U0000F", "", ZINT_ERROR_INVALID_DATA, 0, "Error 209: Incomplete '\\U' escape sequence in input data", 0, "" }, + /* 68*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\U110000", "", ZINT_ERROR_INVALID_DATA, 0, "Error 246: Invalid value for '\\U' escape sequence in input data", 0, "" }, + /* 69*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 25, "\\U10FFFF", "", 0, 14, "F1 1A 01 01 EB 80 EB 80 3F C0 9C 0B 4B B8 DA B7 B6 1A", 0, "" }, + /* 70*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 26, "\\U10FFFF", "", 0, 14, "F1 1B 01 E7 EC 71 D7 6C 20 D6 B3 63 E2 18 B6 4C 7D 3E", 0, "" }, + /* 71*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 32, "\\U10FFFF", "", 0, 32, "F1 21 01 EB 05 32 EB 25 3A 81 7E 98 9B 50 AC 1C E0 4E 51 BA 23", 0, "" }, + /* 72*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 33, "\\U10FFFF", "", 0, 14, "F1 22 01 01 EB 80 EB 80 A3 E5 BE FB 1A 08 94 2E C3 74", 0, "" }, + /* 73*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 34, "\\U10FFFF", "", 0, 16, "F1 23 01 01 01 01 01 01 EB 80 EB 80 F6 F1 5D 2A D1 0A BF BC B8 22 65 0C", 0, "" }, + /* 74*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 35, "\\U10FFFF", "", 0, 16, "F1 24 01 01 01 01 EB 80 EB 80 01 01 7F 58 28 41 7F 63 0E EB A7 D8 D0 1F", 0, "" }, + /* 75*/ { BARCODE_GS1_128_CC, GS1_MODE, -1, "[20]10", "[10]A", 0, 99, "(7) 105 102 20 10 100 59 106", 0, "" }, + /* 76*/ { BARCODE_GS1_128_CC, GS1_MODE | ESCAPE_MODE, -1, "[2\\x30]1\\d048", "[\\x310]\\x41", 0, 99, "(7) 105 102 20 10 100 59 106", 1, "" }, }; int data_size = ARRAY_SIZE(data); int i, length, ret; struct zint_symbol *symbol; char escaped[1024]; + char escaped_composite[1024]; struct zint_symbol previous_symbol; char *input_filename = "test_escape.txt"; + char *text; + testStart("test_escape_char_process"); for (i = 0; i < data_size; i++) { @@ -559,17 +565,25 @@ static void test_escape_char_process(int index, int generate, int debug) { symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); - symbol->debug = ZINT_DEBUG_TEST; // Needed to get codeword dump in errtxt + if (is_composite(data[i].symbology)) { + text = data[i].composite; + strcpy(symbol->primary, data[i].data); + } else { + text = data[i].data; + } - length = testUtilSetSymbol(symbol, data[i].symbology, data[i].input_mode | ESCAPE_MODE, data[i].eci, -1 /*option_1*/, -1, -1, -1 /*output_options*/, data[i].data, -1, debug); + debug |= ZINT_DEBUG_TEST; // Needed to get codeword dump in errtxt - ret = ZBarcode_Encode(symbol, TU(data[i].data), length); + length = testUtilSetSymbol(symbol, data[i].symbology, data[i].input_mode | ESCAPE_MODE, data[i].eci, -1 /*option_1*/, -1, -1, -1 /*output_options*/, text, -1, debug); + + ret = ZBarcode_Encode(symbol, TU(text), length); assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt); if (generate) { - printf(" /*%3d*/ { %s, %s, %d, \"%s\", %s, %d, \"%s\", %d, \"%s\" },\n", + printf(" /*%3d*/ { %s, %s, %d, \"%s\", \"%s\", %s, %d, \"%s\", %d, \"%s\" },\n", i, testUtilBarcodeName(data[i].symbology), testUtilInputModeName(data[i].input_mode), data[i].eci, testUtilEscape(data[i].data, length, escaped, sizeof(escaped)), + testUtilEscape(data[i].composite, strlen(data[i].composite), escaped_composite, sizeof(escaped_composite)), testUtilErrorName(data[i].ret), symbol->width, symbol->errtxt, data[i].compare_previous, data[i].comment); } else { assert_zero(strcmp(symbol->errtxt, data[i].expected), "i:%d strcmp(%s, %s) != 0\n", i, symbol->errtxt, data[i].expected); @@ -583,7 +597,7 @@ static void test_escape_char_process(int index, int generate, int debug) { } memcpy(&previous_symbol, symbol, sizeof(previous_symbol)); - if (ret < 5) { + if (ret < ZINT_ERROR && !data[i].composite[0]) { // Test from input file FILE *fp; struct zint_symbol *symbol2; diff --git a/docs/Makefile b/docs/Makefile index d5492c79..ff508365 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -136,7 +136,7 @@ MAIN_FONT = mainfont="TeX Gyre Pagella" MONO_FONT = monofont="Liberation Mono" CJK_FONT = CJKmainfont="WenQuanYi Micro Hei Mono" PDF_OPTS = --pdf-engine=xelatex --filter pandoc-tablenos -M tablenos-warning-level=0 \ - --highlight-style=$(HIGHLIGHT_THEME) -V colorlinks -V geometry:margin=20mm -V papersize=a4 --dpi=300 + --highlight-style=$(HIGHLIGHT_THEME) -V colorlinks -V geometry:margin=20mm -V papersize=a4 -V csquotes=true --dpi=300 TEX_MAN_PAGE = zint.1.tex TXT_OPTS = --filter pandoc-tablenos -M tablenos-warning-level=0 --columns 80 --eol=lf -t plain MAN_PAGE_OPTS = -s -t man diff --git a/docs/manual.pmd b/docs/manual.pmd index 8119ab5c..7fef5f62 100644 --- a/docs/manual.pmd +++ b/docs/manual.pmd @@ -185,20 +185,24 @@ To build Zint on Windows from source, see `"win32/README"`. ## 2.3 Apple macOS -Zint can be installed using Homebrew. To install Homebrew input the following -line into the macOS terminal +The latest Zint CLI and `libzint` can be installed using Homebrew.[^1] To +install Homebrew input the following line into the macOS terminal ```bash -/usr/bin/ruby -e "$(curl -fsSL - https://raw.githubusercontent.com/Homebrew/install/master/install)" +/bin/bash -c "$(curl -fsSL \ + https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" ``` -Once Homebrew is installed use the following command to install Zint. +Once Homebrew is installed use the following command to install the Zint. ```bash brew install zint ``` +To build from source see `"README.macos"` in the project root directory. + +[^1]: See the Homebrew website [https://brew.sh](https://brew.sh). + ## 2.4 Zint Tcl Backend The Tcl backend in the `"backend_tcl"` sub-directory may be built using the @@ -463,7 +467,7 @@ Sequence Equivalent `\xNN` 0xNN Any 8-bit character where NN is hexadecimal -`\uNNNN` Any 16-bit Unicode BMP[^1] character where +`\uNNNN` Any 16-bit Unicode BMP[^2] character where NNNN is hexadecimal `\UNNNNNN` Any 20-bit Unicode character where NNNNNN @@ -472,7 +476,7 @@ Sequence Equivalent Table: {#tbl:escape_sequences tag=": Escape Sequences"} -[^1]: In Unicode contexts, BMP stands for Basic Multilingual Plane, the plane 0 +[^2]: In Unicode contexts, BMP stands for Basic Multilingual Plane, the plane 0 codeset from U+0000 to U+D7FF and U+E000 to U+FFFF (i.e. excluding surrogates). Not to be confused with the Windows Bitmap file format BMP! @@ -526,7 +530,7 @@ Names are treated case-insensitively by the CLI, and the `BARCODE_` prefix and any underscores are optional. -------------------------------------------------------------------------------- -Numeric Name[^2] Barcode Name +Numeric Name[^3] Barcode Name Value ------- ------------------------ --------------------------------------------- 1 `BARCODE_CODE11` Code 11 @@ -730,7 +734,7 @@ Value Table: {#tbl:barcode_types tag=": Barcode Types (Symbologies)"} -[^2]: The symbologies marked with an asterisk (`*`) in Table +[^3]: The symbologies marked with an asterisk (`*`) in Table {@tbl:barcode_types} above used different names in Zint before version 2.9.0. For example, symbology 29 used the name `BARCODE_RSS14`. These names are now deprecated but are still recognised by Zint and will continue to be supported in @@ -1022,7 +1026,7 @@ Grid Matrix GB 2312 (includes ASCII) N/A Han Xin Latin-1 GB 18030 (includes ASCII) MaxiCode Latin-1 None MicroPDF417 Latin-1 None -Micro QR Code Latin-1 Shift JIS (includes ASCII[^3]) +Micro QR Code Latin-1 Shift JIS (includes ASCII[^4]) PDF417 Latin-1 None QR Code Latin-1 Shift JIS (see above) rMQR Latin-1 Shift JIS (see above) @@ -1032,7 +1036,7 @@ All others ASCII N/A Table: {#tbl:default_character_sets tag=": Default Character Sets"} -[^3]: Shift JIS (JIS X 0201 Roman) re-maps two ASCII characters: backslash (`\`) +[^4]: Shift JIS (JIS X 0201 Roman) re-maps two ASCII characters: backslash (`\`) to the yen sign (¥), and tilde (`~`) to overline (U+203E). If Zint encounters characters which can not be encoded using the default @@ -1126,12 +1130,12 @@ ECI Code Character Encoding Scheme (ISO/IEC 8859 schemes include ASCII) 33 UTF-16LE (Low order byte first) 34 UTF-32BE (High order bytes first) 35 UTF-32LE (Low order bytes first) -170 ISO/IEC 646 Invariant[^4] +170 ISO/IEC 646 Invariant[^5] 899 8-bit binary data Table: {#tbl:eci_codes tag=": ECI Codes"} -[^4]: ISO/IEC 646 Invariant is a subset of ASCII with 12 characters undefined: +[^5]: ISO/IEC 646 Invariant is a subset of ASCII with 12 characters undefined: `#`, `$`, `@`, `[`, `\`, `]`, `^`, `` ` ``, `{`, `|`, `}`, `~`. An ECI value of 0 does not encode any ECI information in the code symbol (unless @@ -1657,7 +1661,7 @@ Variable Name Type Meaning Default Value `height` float Symbol height, excluding Symbol dependent fixed width-to-height - symbols.[^5] + symbols.[^6] `scale` float Scale factor for adjusting 1.0 size of image. @@ -1783,7 +1787,7 @@ Variable Name Type Meaning Default Value Table: API Structure `zint_symbol` {#tbl:api_structure_zint_symbol tag="$ $"} -[^5]: The `height` value is ignored for Aztec (including HIBC and Aztec Rune), +[^6]: The `height` value is ignored for Aztec (including HIBC and Aztec Rune), Code One, Data Matrix (including HIBC), DotCode, Grid Matrix, Han Xin, MaxiCode, QR Code (including HIBC, Micro QR, rMQR and UPNQR), and Ultracode - all of which have a fixed width-to-height ratio (or, in the case of Code One, a fixed @@ -1948,7 +1952,7 @@ Value Effect 0 No options selected. `BARCODE_BIND` Boundary bars above and below the symbol and between - rows if stacking multiple symbols.[^6] + rows if stacking multiple symbols.[^7] `BARCODE_BOX` Add a box surrounding the symbol and whitespace. @@ -1973,7 +1977,7 @@ Value Effect separate colour channels (`OUT_BUFFER` only). `BARCODE_QUIET_ZONES` Add compliant quiet zones (additional to any - specified whitespace).[^7] + specified whitespace).[^8] `BARCODE_NO_QUIET_ZONES` Disable quiet zones, notably those with defaults. @@ -1983,10 +1987,10 @@ Value Effect Table: API `output_options` Values {#tbl:api_output_options tag="$ $"} -[^6]: The `BARCODE_BIND` flag is always set for Codablock-F, Code 16K and Code +[^7]: The `BARCODE_BIND` flag is always set for Codablock-F, Code 16K and Code 49. Special considerations apply to ITF-14 - see [6.1.2.6 ITF-14]. -[^7]: Codablock-F, Code 16K, Code 49, EAN-2 to EAN-13, ISBN, ITF-14, UPC-A and +[^8]: Codablock-F, Code 16K, Code 49, EAN-2 to EAN-13, ISBN, ITF-14, UPC-A and UPC-E have compliant quiet zones added by default. \clearpage @@ -4124,8 +4128,8 @@ company references in particular. This section is intended as a quick reference to the character sets used by Zint. All symbologies use standard ASCII input as shown in section A.1, but -some support extended characters as shown in the subsequent [A.2 Latin Alphabet -No. 1 (ISO/IEC 8859-1)]. +some support extended characters as shown in the subsequent section [A.2 Latin +Alphabet No. 1 (ISO/IEC 8859-1)]. ## A.1 ASCII Standard diff --git a/docs/manual.txt b/docs/manual.txt index 104feb4f..ef5e7a2d 100644 --- a/docs/manual.txt +++ b/docs/manual.txt @@ -360,16 +360,18 @@ To build Zint on Windows from source, see "win32/README". 2.3 Apple macOS -Zint can be installed using Homebrew. To install Homebrew input the following -line into the macOS terminal +The latest Zint CLI and libzint can be installed using Homebrew.[1] To install +Homebrew input the following line into the macOS terminal - /usr/bin/ruby -e "$(curl -fsSL - https://raw.githubusercontent.com/Homebrew/install/master/install)" + /bin/bash -c "$(curl -fsSL \ + https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" -Once Homebrew is installed use the following command to install Zint. +Once Homebrew is installed use the following command to install the Zint. brew install zint +To build from source see "README.macos" in the project root directory. + 2.4 Zint Tcl Backend The Tcl backend in the "backend_tcl" sub-directory may be built using the @@ -615,7 +617,7 @@ sequences are shown in the table below. \xNN 0xNN Any 8-bit character where NN is hexadecimal - \uNNNN Any 16-bit Unicode BMP[1] character where + \uNNNN Any 16-bit Unicode BMP[2] character where NNNN is hexadecimal \UNNNNNN Any 20-bit Unicode character where NNNNNN @@ -664,7 +666,7 @@ Names are treated case-insensitively by the CLI, and the BARCODE_ prefix and any underscores are optional. -------------------------------------------------------------------------------- - Numeric Name[2] Barcode Name + Numeric Name[3] Barcode Name Value --------- ------------------------- -------------------------------------------- 1 BARCODE_CODE11 Code 11 @@ -1122,7 +1124,7 @@ Latin-2 (ISO/IEC 8859-2 plus ASCII). Han Xin Latin-1 GB 18030 (includes ASCII) MaxiCode Latin-1 None MicroPDF417 Latin-1 None - Micro QR Code Latin-1 Shift JIS (includes ASCII[3]) + Micro QR Code Latin-1 Shift JIS (includes ASCII[4]) PDF417 Latin-1 None QR Code Latin-1 Shift JIS (see above) rMQR Latin-1 Shift JIS (see above) @@ -1223,7 +1225,7 @@ formatted. Zint automatically translates the data into the target encoding. 33 UTF-16LE (Low order byte first) 34 UTF-32BE (High order bytes first) 35 UTF-32LE (Low order bytes first) - 170 ISO/IEC 646 Invariant[4] + 170 ISO/IEC 646 Invariant[5] 899 8-bit binary data : Table : ECI Codes: @@ -1703,7 +1705,7 @@ encoding stages. The zint_symbol structure consists of the following variables: height float Symbol height, excluding Symbol dependent fixed width-to-height - symbols.[5] + symbols.[6] scale float Scale factor for adjusting 1.0 size of image. @@ -1976,7 +1978,7 @@ together when adjusting this value: 0 No options selected. BARCODE_BIND Boundary bars above and below the symbol and between - rows if stacking multiple symbols.[6] + rows if stacking multiple symbols.[7] BARCODE_BOX Add a box surrounding the symbol and whitespace. @@ -2001,7 +2003,7 @@ together when adjusting this value: separate colour channels (OUT_BUFFER only). BARCODE_QUIET_ZONES Add compliant quiet zones (additional to any - specified whitespace).[7] + specified whitespace).[8] BARCODE_NO_QUIET_ZONES Disable quiet zones, notably those with defaults. @@ -4026,8 +4028,8 @@ Annex A. Character Encoding This section is intended as a quick reference to the character sets used by Zint. All symbologies use standard ASCII input as shown in section A.1, but some -support extended characters as shown in the subsequent A.2 Latin Alphabet No. 1 -(ISO/IEC 8859-1). +support extended characters as shown in the subsequent section A.2 Latin +Alphabet No. 1 (ISO/IEC 8859-1). A.1 ASCII Standard @@ -4368,7 +4370,7 @@ OPTIONS --quietzones - Add compliant quiet zones for symbols that specify one. This is in addition + Add compliant quiet zones for symbols that specify them. This is in addition to any whitespace specified by -w | --whitesp or --vwhitesp. -r, --reverse @@ -4607,30 +4609,32 @@ AUTHOR Robin Stuart robin@zint.org.uk -[1] In Unicode contexts, BMP stands for Basic Multilingual Plane, the plane 0 +[1] See the Homebrew website https://brew.sh. + +[2] In Unicode contexts, BMP stands for Basic Multilingual Plane, the plane 0 codeset from U+0000 to U+D7FF and U+E000 to U+FFFF (i.e. excluding surrogates). Not to be confused with the Windows Bitmap file format BMP! -[2] The symbologies marked with an asterisk (*) in Table +[3] The symbologies marked with an asterisk (*) in Table : Barcode Types (Symbologies) above used different names in Zint before version 2.9.0. For example, symbology 29 used the name BARCODE_RSS14. These names are now deprecated but are still recognised by Zint and will continue to be supported in future versions. -[3] Shift JIS (JIS X 0201 Roman) re-maps two ASCII characters: backslash (\) to +[4] Shift JIS (JIS X 0201 Roman) re-maps two ASCII characters: backslash (\) to the yen sign (¥), and tilde (~) to overline (U+203E). -[4] ISO/IEC 646 Invariant is a subset of ASCII with 12 characters undefined: #, +[5] ISO/IEC 646 Invariant is a subset of ASCII with 12 characters undefined: #, $, @, [, \, ], ^, `, {, |, }, ~. -[5] The height value is ignored for Aztec (including HIBC and Aztec Rune), Code +[6] The height value is ignored for Aztec (including HIBC and Aztec Rune), Code One, Data Matrix (including HIBC), DotCode, Grid Matrix, Han Xin, MaxiCode, QR Code (including HIBC, Micro QR, rMQR and UPNQR), and Ultracode - all of which have a fixed width-to-height ratio (or, in the case of Code One, a fixed height). -[6] The BARCODE_BIND flag is always set for Codablock-F, Code 16K and Code 49. +[7] The BARCODE_BIND flag is always set for Codablock-F, Code 16K and Code 49. Special considerations apply to ITF-14 - see 6.1.2.6 ITF-14. -[7] Codablock-F, Code 16K, Code 49, EAN-2 to EAN-13, ISBN, ITF-14, UPC-A and +[8] Codablock-F, Code 16K, Code 49, EAN-2 to EAN-13, ISBN, ITF-14, UPC-A and UPC-E have compliant quiet zones added by default. diff --git a/docs/zint.1 b/docs/zint.1 index f77407c4..963eb483 100644 --- a/docs/zint.1 +++ b/docs/zint.1 @@ -317,7 +317,7 @@ For MaxiCode, set the content of the primary message. For GS1 Composite symbols, set the content of the linear symbol. .TP \f[V]--quietzones\f[R] -Add compliant quiet zones for symbols that specify one. +Add compliant quiet zones for symbols that specify them. This is in addition to any whitespace specified by \f[V]-w\f[R] | \f[V]--whitesp\f[R] or \f[V]--vwhitesp\f[R]. .TP diff --git a/docs/zint.1.pmd b/docs/zint.1.pmd index 89a278a6..bfbac6f0 100644 --- a/docs/zint.1.pmd +++ b/docs/zint.1.pmd @@ -254,7 +254,7 @@ Paintbrush (`PCX`), Portable Network Format (`PNG`), Scalable Vector Graphic (`S `--quietzones` -: Add compliant quiet zones for symbols that specify one. This is in addition to any whitespace specified by `-w` | +: Add compliant quiet zones for symbols that specify them. This is in addition to any whitespace specified by `-w` | `--whitesp` or `--vwhitesp`. `-r`, `--reverse` diff --git a/frontend/main.c b/frontend/main.c index fd5a4d8d..819596c6 100644 --- a/frontend/main.c +++ b/frontend/main.c @@ -55,7 +55,7 @@ static void types(void) { " 7 C25IND Industrial 2 of 5 80 DBAR_OMNSTK GS1 DataBar Stack Omni\n" " 8 CODE39 Code 39 81 DBAR_EXPSTK GS1 DataBar Exp Stack\n" " 9 EXCODE39 Extended Code 39 82 PLANET USPS PLANET\n" - "13 EANX EAN 84 MICROPDF417 MicroPDF417\n" + "13 EANX EAN-2 to EAN-13 84 MICROPDF417 MicroPDF417\n" "14 EANX_CHK EAN + Check Digit 85 USPS_IMAIL USPS Intelligent Mail\n" "16 GS1_128 GS1-128 86 PLESSEY UK Plessey\n" "18 CODABAR Codabar 87 TELEPEN_NUM Telepen Numeric\n" @@ -939,7 +939,7 @@ typedef struct { char *arg; int opt; } arg_opt; int main(int argc, char **argv) { struct zint_symbol *my_symbol; - struct zint_seg segs[10] = {0}; + struct zint_seg segs[10] = {{0}}; int error_number = 0; int warn_number = 0; int rotate_angle = 0; diff --git a/frontend/test.sh b/frontend/test.sh index 12d26b89..4b5c4aad 100755 --- a/frontend/test.sh +++ b/frontend/test.sh @@ -1,3 +1,5 @@ +#! /bin/bash +# Create zint test output mkdir test_sh_out cd test_sh_out echo testing Code 11 diff --git a/frontend_qt/CMakeLists.txt b/frontend_qt/CMakeLists.txt index c906b415..7ad0b52c 100644 --- a/frontend_qt/CMakeLists.txt +++ b/frontend_qt/CMakeLists.txt @@ -1,5 +1,6 @@ # Copyright (C) 2008 by BogDan Vatra < bogdan@licentia.eu > -# Copyright (C) 2009-2021 Robin Stuart +# Copyright (C) 2009-2022 Robin Stuart +# SPDX-License-Identifier: GPL-3.0-or-later # vim: set ts=4 sw=4 et : project(zint-qt) @@ -23,7 +24,23 @@ endif() # grpC16k.ui grpChannel.ui grpDBExtend.ui grpITF14.ui grpMSICheck.ui grpUPCA.ui # grpC25.ui grpCodabar.ui grpDM.ui grpLOGMARS.ui grpPDF417.ui grpUPCEAN.ui -add_executable(${PROJECT_NAME} ${zint-qt_SRCS} resources.qrc) +if(APPLE) + # https://doc.qt.io/qt-5/appicon.html + set(MACOSX_BUNDLE_ICON_FILE zint-qt.icns) + set(APP_ICON_MACOSX "${CMAKE_CURRENT_SOURCE_DIR}/zint-qt.icns") + set_source_files_properties(${APP_ICON_MACOSX} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources") + add_executable(${PROJECT_NAME} MACOSX_BUNDLE ${zint-qt_SRCS} resources.qrc ${APP_ICON_MACOSX}) + set_target_properties(${PROJECT_NAME} PROPERTIES + MACOSX_BUNDLE TRUE + MACOSX_BUNDLE_BUNDLE_NAME "Zint Barcode Studio" + MACOSX_BUNDLE_BUNDLE_VERSION ${ZINT_VERSION} + MACOSX_BUNDLE_COPYRIGHT "Copyright © 2006-2022 Robin Stuart and others" + MACOSX_BUNDLE_GUI_IDENTIFIER "uk.org.zint.zint-qt" + MACOSX_BUNDLE_INFO_STRING "A free barcode generator" + MACOSX_BUNDLE_SHORT_VERSION_STRING ${ZINT_VERSION}) +else() + add_executable(${PROJECT_NAME} ${zint-qt_SRCS} resources.qrc) +endif() if(WIN32) target_sources(${PROJECT_NAME} PRIVATE res/qtZint.rc) diff --git a/frontend_qt/exportwindow.cpp b/frontend_qt/exportwindow.cpp index ece58d3d..90af79ff 100644 --- a/frontend_qt/exportwindow.cpp +++ b/frontend_qt/exportwindow.cpp @@ -1,6 +1,6 @@ /* Zint Barcode Generator - the open source barcode generator - Copyright (C) 2009 - 2021 Robin Stuart + Copyright (C) 2009-2022 Robin Stuart This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -/* vim: set ts=4 sw=4 et : */ +/* SPDX-License-Identifier: GPL-3.0-or-later */ //#include #include @@ -30,7 +30,7 @@ // Shorthand #define QSL QStringLiteral -ExportWindow::ExportWindow(BarcodeItem *bc, const QString& output_data) : m_bc(bc), m_output_data(output_data) +ExportWindow::ExportWindow(BarcodeItem *bc, const QString& output_data) : m_bc(bc), m_output_data(output_data), m_lines(0) { setupUi(this); QSettings settings; @@ -54,6 +54,14 @@ ExportWindow::ExportWindow(BarcodeItem *bc, const QString& output_data) : m_bc(b connect(btnCancel, SIGNAL( clicked( bool )), SLOT(close())); connect(btnOK, SIGNAL( clicked( bool )), SLOT(process())); connect(btnDestPath, SIGNAL( clicked( bool )), SLOT(get_directory())); + + m_dataList = m_output_data.split('\n'); + m_lines = m_dataList.size(); + if (m_lines && m_dataList[m_lines - 1].isEmpty()) { + m_lines--; + } + /*: %1 is number of sequences */ + lblFeedback->setText(tr("Export Results (%1):").arg(m_lines)); } ExportWindow::~ExportWindow() @@ -102,18 +110,12 @@ void ExportWindow::process() txtFeedback->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); QApplication::processEvents(QEventLoop::ExcludeUserInputEvents); - QStringList dataList = m_output_data.split('\n'); - int lines = dataList.size(); - if (lines && dataList[lines - 1].isEmpty()) { - lines--; - } - QString biggest; bool needUrlEscape = false; const int fileNameIdx = cmbFileName->currentIndex(); if (fileNameIdx == 1) { - biggest = QString::number(lines + 1); + biggest = QString::number(m_lines + 1); } else { needUrlEscape = m_output_data.contains(urlRE); } @@ -145,8 +147,8 @@ void ExportWindow::process() QStringList Feedback; int successCount = 0, errorCount = 0; - for (int i = 0; i < lines; i++) { - const QString &dataString = dataList[i]; + for (int i = 0; i < m_lines; i++) { + const QString &dataString = m_dataList[i]; QString fileName; switch (fileNameIdx) { case 0: /* Same as Data (URL Escaped) */ @@ -227,3 +229,5 @@ void ExportWindow::process() } txtFeedback->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); } + +/* vim: set ts=4 sw=4 et : */ diff --git a/frontend_qt/exportwindow.h b/frontend_qt/exportwindow.h index 7c1b3757..ecf1c7d5 100644 --- a/frontend_qt/exportwindow.h +++ b/frontend_qt/exportwindow.h @@ -1,6 +1,6 @@ /* Zint Barcode Generator - the open source barcode generator - Copyright (C) 2009-2021 Robin Stuart + Copyright (C) 2009-2022 Robin Stuart This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -16,10 +16,10 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -/* vim: set ts=4 sw=4 et : */ +/* SPDX-License-Identifier: GPL-3.0-or-later */ -#ifndef EXPORTWINDOW_H -#define EXPORTWINDOW_H +#ifndef Z_EXPORTWINDOW_H +#define Z_EXPORTWINDOW_H #include "ui_extExport.h" #include "barcodeitem.h" @@ -39,6 +39,9 @@ private slots: protected: BarcodeItem *m_bc; QString m_output_data; + QStringList m_dataList; + int m_lines; }; +/* vim: set ts=4 sw=4 et : */ #endif diff --git a/frontend_qt/mac_icons.sh b/frontend_qt/mac_icons.sh new file mode 100755 index 00000000..d333d4b5 --- /dev/null +++ b/frontend_qt/mac_icons.sh @@ -0,0 +1,15 @@ +#! /bin/bash +# Create icon set for macOS, requires "brew install librsvg" +mkdir MyIcon.iconset +rsvg-convert -h 16 -d 72 -p 72 images/scalable/zint-qt.svg > MyIcon.iconset/icon_16x16.png +rsvg-convert -h 32 -d 144 -p 144 images/scalable/zint-qt.svg > MyIcon.iconset/icon_16x16@2x.png +rsvg-convert -h 32 -d 72 -p 72 images/scalable/zint-qt.svg > MyIcon.iconset/icon_32x32.png +rsvg-convert -h 64 -d 144 -p 144 images/scalable/zint-qt.svg > MyIcon.iconset/icon_32x32@2x.png +rsvg-convert -h 128 -d 72 -p 72 images/scalable/zint-qt.svg > MyIcon.iconset/icon_128x128.png +rsvg-convert -h 256 -d 144 -p 144 images/scalable/zint-qt.svg > MyIcon.iconset/icon_128x128@2x.png +rsvg-convert -h 256 -d 72 -p 72 images/scalable/zint-qt.svg > MyIcon.iconset/icon_256x256.png +rsvg-convert -h 512 -d 144 -p 144 images/scalable/zint-qt.svg > MyIcon.iconset/icon_256x256@2x.png +rsvg-convert -h 512 -d 72 -p 72 images/scalable/zint-qt.svg > MyIcon.iconset/icon_512x512.png +rsvg-convert -h 1024 -d 144 -p 144 images/scalable/zint-qt.svg > MyIcon.iconset/icon_512x512@2x.png +iconutil -c icns MyIcon.iconset +# rm -R MyIcon.iconset diff --git a/frontend_qt/mainWindow.ui b/frontend_qt/mainWindow.ui index b0c51c06..09a41de6 100644 --- a/frontend_qt/mainWindow.ui +++ b/frontend_qt/mainWindow.ui @@ -27,13 +27,10 @@ false - - - - + @@ -78,14 +75,14 @@ - + QLayout::SetMinimumSize - + - + @@ -141,9 +138,6 @@ false - - - 0 @@ -151,7 +145,7 @@ &Data - + @@ -166,9 +160,9 @@ Data to Enc&ode - + - + @@ -215,7 +209,7 @@ or import from file - + @@ -427,7 +421,7 @@ or import from file - + Qt::Horizontal @@ -520,9 +514,9 @@ for this symbology to defaults GS1 Composite - + - + @@ -534,7 +528,7 @@ for this symbology to defaults - + Qt::Horizontal @@ -601,12 +595,12 @@ for this symbology to defaults - + QLayout::SetMinimumSize - + @@ -703,9 +697,9 @@ Extended Channel Interpretation (ECI) Additional ECI/Data Segments - + - + @@ -966,7 +960,7 @@ or import from file - + @@ -1227,7 +1221,7 @@ or import from file - + @@ -1491,7 +1485,7 @@ or import from file - + Qt::Vertical @@ -1504,9 +1498,9 @@ or import from file - + - + Qt::Horizontal @@ -1606,11 +1600,11 @@ as delimiters for GS1 Application Identifiers A&ppearance - + - + @@ -1698,7 +1692,7 @@ and use standard height (if any) for default - + Width of boundary bars or border in X-dimensions @@ -1733,7 +1727,7 @@ and use standard height (if any) for default - + Add border or box diff --git a/frontend_qt/mainwindow.cpp b/frontend_qt/mainwindow.cpp index 9aded534..7805f975 100644 --- a/frontend_qt/mainwindow.cpp +++ b/frontend_qt/mainwindow.cpp @@ -139,6 +139,53 @@ static const struct bstyle_item bstyle_items[] = { { QSL("VIN (Vehicle Identification Number)"), BARCODE_VIN }, }; +#ifdef Q_OS_MACOS +/* Helper to make widgets look ok on macOS */ +void MainWindow::mac_hack(QWidget *win) +{ + if (!win) { + return; + } + QList widgets = win->findChildren(); + for (int i = 0, cnt = widgets.size(); i < cnt; i++) { + widgets[i]->setAttribute(Qt::WA_MacNormalSize); + } + QList grps = win->findChildren(); + for (int i = 0, cnt = grps.size(); i < cnt; i++) { + // TODO: top of groupbox too near to previous element - how to fix?? + grps[i]->setAlignment(Qt::AlignHCenter); // Poor man's workaround for above + } +} + +/* Helper to make data tab vertical layouts look ok on macOS */ +void MainWindow::mac_hack_vLayouts(QWidget *win) +{ + QList vlayouts = win->findChildren(); + for (int i = 0, cnt = vlayouts.size(); i < cnt; i++) { + if (vlayouts[i]->objectName() == "vLayoutData" || vlayouts[i]->objectName() == "vLayoutComposite" + || vlayouts[i]->objectName() == "vLayoutSegs") { + vlayouts[i]->setSpacing(0); + // If set spacing on QVBoxLayout then it seems its QHBoxLayout children inherit this so undo + QList hlayouts = vlayouts[i]->findChildren(); + for (int j = 0, cnt = hlayouts.size(); j < cnt; j++) { + hlayouts[j]->setSpacing(8); + } + } + } +} + +/* Helper to make status bars look ok on macOS */ +void MainWindow::mac_hack_statusBars(QWidget *win, const char* name) +{ + QList sbars = name ? win->findChildren(name) : win->findChildren(); + QColor bgColor = QGuiApplication::palette().window().color(); + QString sbarSS = QSL("QStatusBar {background-color:") + bgColor.name() + QSL(";}"); + for (int i = 0, cnt = sbars.size(); i < cnt; i++) { + sbars[i]->setStyleSheet(sbarSS); + } +} +#endif + MainWindow::MainWindow(QWidget *parent, Qt::WindowFlags fl) : QWidget(parent, fl), m_optionWidget(nullptr), m_symbology(0), m_menu(nullptr), @@ -162,7 +209,23 @@ MainWindow::MainWindow(QWidget *parent, Qt::WindowFlags fl) setupUi(this); view->setScene(scene); - restoreGeometry(settings.value(QSL("studio/window_geometry")).toByteArray()); + QVariant saved_geometry = settings.value(QSL("studio/window_geometry")); + +#ifdef Q_OS_MACOS + QApplication::setDesktopSettingsAware(false); // Makes group boxes use standard font (may do other stuff) + // Standard width 360 too narrow + if (saved_geometry.isNull()) { + // Seems this is necessary on macOS to get a reasonable initial height + setMinimumSize(QSize(460, (int) (QApplication::primaryScreen->availableSize().height() * 0.9f))); + } else { + setMinimumSize(QSize(460, 0)); + } + mac_hack(this); + mac_hack_vLayouts(this); + mac_hack_statusBars(this, "statusBar"); +#endif + + restoreGeometry(saved_geometry.toByteArray()); m_fgcolor_geometry = settings.value(QSL("studio/fgcolor_geometry")).toByteArray(); m_bgcolor_geometry = settings.value(QSL("studio/bgcolor_geometry")).toByteArray(); @@ -605,7 +668,7 @@ void MainWindow::factory_reset() QMessageBox msgBox(QMessageBox::Question, tr("Factory Reset"), tr("This will clear all saved data and reset all settings for all symbologies to defaults."), QMessageBox::Yes | QMessageBox::No, this); - msgBox.setInformativeText(tr("Do you want to continue?")); + msgBox.setInformativeText(tr("Do you wish to continue?")); msgBox.setDefaultButton(QMessageBox::Yes); if (msgBox.exec() == QMessageBox::No) { return; @@ -637,29 +700,41 @@ void MainWindow::about() QMessageBox::about(this, tr("About Zint"), /*: %1 is Zint version, %2 is Qt version */ - tr("

Zint Barcode Studio %1

" - "

A free barcode generator

" - "

Instruction manual is available at the project homepage:
" - "http://www.zint.org.uk.

" - "

Copyright © 2006-2022 Robin Stuart and others.
" - "Qt backend by BogDan Vatra.
" - "Released under GNU GPL 3.0 or later.

" - "

Qt version %2

" - "

\"QR Code\" is a Registered Trademark of Denso Corp.
" - "\"Telepen\" is a Registered Trademark of SB Electronics.
" - "\"Mailmark\" is a Registered Trademark of Royal Mail.

" - "

With thanks to Harald Oehlmann, Norbert Szabó, Robert Elliott, Milton Neal, " - "Git Lost, Alonso Schaich, Andre Maute and many others at Sourceforge.

" - "

Currently supported standards include:
" - "ISO/IEC 24778:2008, ANSI/AIM BC12-1998, EN 798:1996,
" - "AIM ISS-X-24 (1995), ISO/IEC 15417:2007, EN 12323:2005,
" - "ISO/IEC 16388:2007, ANSI/AIM BC6-2000, ANSI/AIM BC5-1995,
" - "AIM USS Code One (1994), ISO/IEC 16022:2006, ISO/IEC 21471:2019,
" - "ISO/IEC 15420:2009, AIMD014 (v 1.63) (2008), ISO/IEC 24723:2010,
" - "ISO/IEC 24724:2011, ISO/IEC 20830:2021, ISO/IEC 16390:2007,
" - "ISO/IEC 16023:2000, ISO/IEC 24728:2006, ISO/IEC 15438:2015,
" - "ISO/IEC 18004:2015, ISO/IEC 23941:2022, AIM ITS/04-023 (2022)" - "

").arg(zint_version).arg(QT_VERSION_STR)); + tr( +#ifdef Q_OS_MACOS + "" +#endif + "

Zint Barcode Studio %1

" + "

A free barcode generator

" + "

Instruction manual is available at the project homepage:
" + "http://www.zint.org.uk.

" + "

Copyright © 2006-2022 Robin Stuart and others.
" + "Qt backend by BogDan Vatra.
" + "Released under GNU GPL 3.0 or later.

" + "

Qt version %2

" + "

\"QR Code\" is a Registered Trademark of Denso Corp.
" + "\"Telepen\" is a Registered Trademark of SB Electronics.
" + "\"Mailmark\" is a Registered Trademark of Royal Mail.

" + "

With thanks to Harald Oehlmann, Norbert Szabó, Robert Elliott, Milton Neal, " + "Git Lost, Alonso Schaich, Andre Maute and many others at Sourceforge.

" + "

" +#ifndef Q_OS_MACOS + "" +#endif + "Currently supported standards include:
" + "ISO/IEC 24778:2008, ANSI/AIM BC12-1998, EN 798:1996,
" + "AIM ISS-X-24 (1995), ISO/IEC 15417:2007, EN 12323:2005,
" + "ISO/IEC 16388:2007, ANSI/AIM BC6-2000, ANSI/AIM BC5-1995,
" + "AIM USS Code One (1994), ISO/IEC 16022:2006, ISO/IEC 21471:2019,
" + "ISO/IEC 15420:2009, AIMD014 (v 1.63) (2008), ISO/IEC 24723:2010,
" + "ISO/IEC 24724:2011, ISO/IEC 20830:2021, ISO/IEC 16390:2007,
" + "ISO/IEC 16023:2000, ISO/IEC 24728:2006, ISO/IEC 15438:2015,
" + "ISO/IEC 18004:2015, ISO/IEC 23941:2022, AIM ITS/04-023 (2022)" +#ifndef Q_OS_MACOS + "
" +#endif + "

" + ).arg(zint_version).arg(QT_VERSION_STR)); } void MainWindow::help() @@ -741,6 +816,11 @@ void MainWindow::open_data_dialog_seg(const int seg_no) QString originalText = seg_textbox->text(); bool originalChkEscape = chkEscape->isChecked(); DataWindow dlg(originalText, originalChkEscape, seg_no); + +#ifdef Q_OS_MACOS + mac_hack_statusBars(&dlg); +#endif + connect(&dlg, SIGNAL(dataChanged(const QString&, bool, int)), this, SLOT(on_dataChanged(const QString&, bool, int))); (void) dlg.exec(); @@ -840,6 +920,10 @@ void MainWindow::open_cli_dialog() CLIWindow dlg(&m_bc, chkAutoHeight->isEnabled() && chkAutoHeight->isChecked(), m_spnHeightPerRow && m_spnHeightPerRow->isEnabled() ? m_spnHeightPerRow->value() : 0.0); +#ifdef Q_OS_MACOS + mac_hack_statusBars(&dlg); +#endif + (void) dlg.exec(); } @@ -1909,9 +1993,14 @@ void MainWindow::change_options() connect(get_widget(QSL("chkVINImportChar")), SIGNAL(toggled( bool )), SLOT(update_preview())); } else { + m_optionWidget = nullptr; load_sub_settings(settings, symbology); } +#ifdef Q_OS_MACOS + mac_hack(m_optionWidget); +#endif + switch (symbology) { case BARCODE_CODE128: case BARCODE_EANX: diff --git a/frontend_qt/mainwindow.h b/frontend_qt/mainwindow.h index ce633c90..df0a4581 100644 --- a/frontend_qt/mainwindow.h +++ b/frontend_qt/mainwindow.h @@ -15,8 +15,8 @@ ***************************************************************************/ /* SPDX-License-Identifier: GPL-3.0-or-later */ -#ifndef MAINWINDOW_H -#define MAINWINDOW_H +#ifndef Z_MAINWINDOW_H +#define Z_MAINWINDOW_H #include #include @@ -42,6 +42,12 @@ public: static QString get_zint_version(void); +#ifdef Q_OS_MACOS + static void mac_hack(QWidget *win); + static void mac_hack_vLayouts(QWidget *win); + static void mac_hack_statusBars(QWidget *win, const char *name = nullptr); +#endif + public slots: void update_preview(); void change_options(); @@ -125,9 +131,9 @@ protected: QString getColorStr(const QColor color, bool alpha_always = false); void setColorTxtBtn(const QColor color, QLineEdit *txt, QPushButton* btn); - void resizeEvent(QResizeEvent *event); - bool event(QEvent *event) override; - bool eventFilter(QObject *watched, QEvent *event); + virtual void resizeEvent(QResizeEvent *event) override; + virtual bool event(QEvent *event) override; + virtual bool eventFilter(QObject *watched, QEvent *event) override; void combobox_item_enabled(QComboBox *comboBox, int index, bool enabled); void upcean_addon_gap(const QString &comboBoxName, const QString &labelName, int base); diff --git a/frontend_qt/sequencewindow.cpp b/frontend_qt/sequencewindow.cpp index ebcff88a..3215480b 100644 --- a/frontend_qt/sequencewindow.cpp +++ b/frontend_qt/sequencewindow.cpp @@ -52,7 +52,7 @@ SequenceWindow::SequenceWindow(BarcodeItem *bc) : m_bc(bc) QIcon clearIcon(QSL(":res/delete.svg")); btnSeqClose->setIcon(closeIcon); btnSeqClear->setIcon(clearIcon); - btnSeqClear->setEnabled(!txtSeqPreview->toPlainText().isEmpty()); + check_generate(); connect(btnSeqClose, SIGNAL( clicked( bool )), SLOT(close())); connect(btnSeqClear, SIGNAL( clicked( bool )), SLOT(clear_preview())); diff --git a/frontend_qt/zint-qt.icns b/frontend_qt/zint-qt.icns new file mode 100644 index 0000000000000000000000000000000000000000..661f491616650e7ccda48daf6dce0aa22aa2977a GIT binary patch literal 110828 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 WFtWno4;iwakw1L@{`&Rz%>M&gIk0U2 literal 0 HcmV?d00001 diff --git a/getopt/getopt.c b/getopt/getopt.c index cda551f2..30199e9c 100644 --- a/getopt/getopt.c +++ b/getopt/getopt.c @@ -392,6 +392,8 @@ _getopt_initialize (int argc, char *const *argv, const char *optstring) } else nonoption_flags_len = 0; +#else + (void)argc; (void)argv; #endif return optstring;