From c1fb51ba426380acb6683cb32a745ab102456f6f Mon Sep 17 00:00:00 2001 From: gitlost Date: Fri, 10 Jul 2020 19:39:32 +0100 Subject: [PATCH] rss.c: some fixes for separators, allow check digit, refactoring; bwipp_dump.ps --- backend/code.c | 4 + backend/code128.c | 7 +- backend/common.c | 37 +- backend/common.h | 17 +- backend/composite.c | 111 +- backend/composite.h | 75 +- backend/general_field.c | 27 +- backend/general_field.h | 6 +- backend/gs1.c | 13 +- backend/rss.c | 723 ++++----- backend/rss.h | 3 +- backend/tests/CMakeLists.txt | 8 + backend/tests/test_channel.c | 13 + backend/tests/test_codablock.c | 48 +- backend/tests/test_code.c | 13 + backend/tests/test_code128.c | 17 +- backend/tests/test_composite.c | 1322 ++++++++++++++--- backend/tests/test_gs1.c | 36 +- backend/tests/test_rss.c | 962 ++++++++---- backend/tests/test_telepen.c | 13 + backend/tests/test_tif.c | 2 +- backend/tests/testcommon.c | 866 ++++++++--- backend/tests/testcommon.h | 9 + .../tests/tools/bwipp_dump-barcode.ps.diff | 1154 ++++++++++++++ backend/tests/tools/bwipp_dump.ps.tar.xz | Bin 0 -> 114172 bytes backend/upcean.c | 14 +- docs/manual.txt | 191 +-- frontend/main.c | 12 +- frontend_qt/grpChannel.ui | 6 + frontend_qt/grpDBExtend.ui | 28 +- frontend_qt/mainWindow.ui | 2 +- frontend_qt/mainwindow.cpp | 68 +- frontend_qt/mainwindow.h | 4 +- 33 files changed, 4451 insertions(+), 1360 deletions(-) create mode 100644 backend/tests/tools/bwipp_dump-barcode.ps.diff create mode 100644 backend/tests/tools/bwipp_dump.ps.tar.xz diff --git a/backend/code.c b/backend/code.c index 455491c7..74005a92 100644 --- a/backend/code.c +++ b/backend/code.c @@ -196,6 +196,10 @@ INTERNAL int code_11(struct zint_symbol *symbol, unsigned char source[], int len } } + if (symbol->debug & ZINT_DEBUG_PRINT) { + printf("Check digit (%d): %s\n", num_check_digits, num_check_digits ? checkstr : ""); + } + /* Stop character */ strcat(dest, "11221"); diff --git a/backend/code128.c b/backend/code128.c index b69613ab..814d96b8 100644 --- a/backend/code128.c +++ b/backend/code128.c @@ -33,7 +33,6 @@ /* vim: set ts=4 sw=4 et : */ #include -#include #ifdef _MSC_VER #include #endif @@ -648,7 +647,8 @@ INTERNAL int code_128(struct zint_symbol *symbol, const unsigned char source[], for (i = 0; i < bar_characters; i++) { printf(" %d", values[i]); } - printf("\n"); + printf(" (%d)\n", bar_characters); + printf("Barspaces: %s\n", dest); } #ifdef ZINT_TEST if (symbol->debug & ZINT_DEBUG_TEST) { @@ -951,7 +951,8 @@ INTERNAL int ean_128(struct zint_symbol *symbol, unsigned char source[], const s for (i = 0; i < bar_characters; i++) { printf(" %d", values[i]); } - printf("\n"); + printf(" (%d)\n", bar_characters); + printf("Barspaces: %s\n", dest); } #ifdef ZINT_TEST if (symbol->debug & ZINT_DEBUG_TEST) { diff --git a/backend/common.c b/backend/common.c index f2950990..8050bcfa 100644 --- a/backend/common.c +++ b/backend/common.c @@ -135,18 +135,6 @@ INTERNAL int posn(const char set_string[], const char data) { return -1; } -/* Returns the number of times a character occurs in a string */ -INTERNAL int ustrchr_cnt(const unsigned char string[], const size_t length, const unsigned char c) { - int count = 0; - unsigned int i; - for (i = 0; i < length; i++) { - if (string[i] == c) { - count++; - } - } - return count; -} - /* Return true (1) if a module is dark/black/colour, otherwise false (0) */ INTERNAL int module_is_set(const struct zint_symbol *symbol, const int y_coord, const int x_coord) { if (symbol->symbology == BARCODE_ULTRA) { @@ -272,7 +260,7 @@ INTERNAL int istwodigits(const unsigned char source[], const int length, const i } /* State machine to decode UTF-8 to Unicode codepoints (state 0 means done, state 12 means error) */ -INTERNAL unsigned int decode_utf8(unsigned int* state, unsigned int* codep, const unsigned char byte) { +INTERNAL unsigned int decode_utf8(unsigned int *state, unsigned int *codep, const unsigned char byte) { /* Copyright (c) 2008-2009 Bjoern Hoehrmann @@ -375,8 +363,9 @@ INTERNAL void set_minimum_height(struct zint_symbol *symbol, const int min_heigh } /* Calculate optimized encoding modes. Adapted from Project Nayuki */ -INTERNAL void pn_define_mode(char* mode, const unsigned int data[], const size_t length, const int debug, - unsigned int state[], const char mode_types[], const int num_modes, pn_head_costs head_costs, pn_switch_cost switch_cost, pn_eod_cost eod_cost, pn_cur_cost cur_cost) { +INTERNAL void pn_define_mode(char *mode, const unsigned int data[], const size_t length, const int debug, + unsigned int state[], const char mode_types[], const int num_modes, + pn_head_costs head_costs, pn_switch_cost switch_cost, pn_eod_cost eod_cost, pn_cur_cost cur_cost) { /* * Copyright (c) Project Nayuki. (MIT License) * https://www.nayuki.io/page/qr-code-generator-library @@ -398,12 +387,12 @@ INTERNAL void pn_define_mode(char* mode, const unsigned int data[], const size_t char char_modes[length * num_modes]; unsigned int cur_costs[num_modes]; #else - unsigned int* prev_costs; - char* char_modes; - unsigned int* cur_costs; - prev_costs = (unsigned int*) _alloca(num_modes * sizeof(unsigned int)); - char_modes = (char*) _alloca(length * num_modes); - cur_costs = (unsigned int*) _alloca(num_modes * sizeof(unsigned int)); + unsigned int *prev_costs; + char *char_modes; + unsigned int *cur_costs; + prev_costs = (unsigned int *) _alloca(num_modes * sizeof(unsigned int)); + char_modes = (char *) _alloca(length * num_modes); + cur_costs = (unsigned int *) _alloca(num_modes * sizeof(unsigned int)); #endif /* char_modes[i * num_modes + j] represents the mode to encode the code point at index i such that the final @@ -462,13 +451,13 @@ INTERNAL void pn_define_mode(char* mode, const unsigned int data[], const size_t } if (debug & ZINT_DEBUG_PRINT) { - printf(" Mode: %.*s\n", (int)length, mode); + printf(" Mode: %.*s\n", (int) length, mode); } } #ifdef ZINT_TEST /* Dumps hex-formatted codewords in symbol->errtxt (for use in testing) */ -void debug_test_codeword_dump(struct zint_symbol *symbol, unsigned char* codewords, int length) { +void debug_test_codeword_dump(struct zint_symbol *symbol, unsigned char *codewords, int length) { int i, max = length, cnt_len = 0; if (length > 30) { /* 30*3 < errtxt 92 (100 - "Warning ") chars */ sprintf(symbol->errtxt, "(%d) ", length); /* Place the number of codewords at the front */ @@ -481,7 +470,7 @@ void debug_test_codeword_dump(struct zint_symbol *symbol, unsigned char* codewor symbol->errtxt[strlen(symbol->errtxt) - 1] = '\0'; /* Zap last space */ } -void debug_test_codeword_dump_int(struct zint_symbol *symbol, int* codewords, int length) { +void debug_test_codeword_dump_int(struct zint_symbol *symbol, int *codewords, int length) { int i, max = 0, cnt_len, errtxt_len; char temp[20]; errtxt_len = sprintf(symbol->errtxt, "(%d) ", length); /* Place the number of codewords at the front */ diff --git a/backend/common.h b/backend/common.h index 649eaeb2..b86d2766 100644 --- a/backend/common.h +++ b/backend/common.h @@ -79,7 +79,6 @@ extern "C" { INTERNAL void bin_append(const int arg, const int length, char *binary); INTERNAL void bin_append_posn(const int arg, const int length, char *binary, size_t posn); INTERNAL int posn(const char set_string[], const char data); - INTERNAL int ustrchr_cnt(const unsigned char string[], const size_t length, const unsigned char c); INTERNAL int module_is_set(const struct zint_symbol *symbol, const int y_coord, const int x_coord); INTERNAL void set_module(struct zint_symbol *symbol, const int y_coord, const int x_coord); INTERNAL void set_module_colour(struct zint_symbol *symbol, const int y_coord, const int x_coord, const int colour); @@ -89,20 +88,22 @@ extern "C" { INTERNAL int is_extendable(const int symbology); INTERNAL int is_composite(const int symbology); INTERNAL int istwodigits(const unsigned char source[], int length, const int position); - INTERNAL unsigned int decode_utf8(unsigned int* state, unsigned int* codep, const unsigned char byte); + INTERNAL unsigned int decode_utf8(unsigned int *state, unsigned int *codep, const unsigned char byte); INTERNAL int utf8_to_unicode(struct zint_symbol *symbol, const unsigned char source[], unsigned int vals[], size_t *length, int disallow_4byte); INTERNAL void set_minimum_height(struct zint_symbol *symbol, const int min_height); - typedef unsigned int* (*pn_head_costs)(unsigned int state[]); + typedef unsigned int *(*pn_head_costs)(unsigned int state[]); typedef unsigned int (*pn_switch_cost)(unsigned int state[], const int k, const int j); typedef unsigned int (*pn_eod_cost)(unsigned int state[], const int k); - typedef void (*pn_cur_cost)(unsigned int state[], const unsigned int data[], const size_t length, const int i, char* char_modes, unsigned int prev_costs[], unsigned int cur_costs[]); - INTERNAL void pn_define_mode(char* mode, const unsigned int data[], const size_t length, const int debug, - unsigned int state[], const char mode_types[], const int num_modes, pn_head_costs head_costs, pn_switch_cost switch_cost, pn_eod_cost eod_cost, pn_cur_cost cur_cost); + typedef void (*pn_cur_cost)(unsigned int state[], const unsigned int data[], const size_t length, const int i, + char *char_modes, unsigned int prev_costs[], unsigned int cur_costs[]); + INTERNAL void pn_define_mode(char *mode, const unsigned int data[], const size_t length, const int debug, + unsigned int state[], const char mode_types[], const int num_modes, + pn_head_costs head_costs, pn_switch_cost switch_cost, pn_eod_cost eod_cost, pn_cur_cost cur_cost); #ifdef ZINT_TEST - void debug_test_codeword_dump(struct zint_symbol *symbol, unsigned char* codewords, int length); - void debug_test_codeword_dump_int(struct zint_symbol *symbol, int* codewords, int length); + void debug_test_codeword_dump(struct zint_symbol *symbol, unsigned char *codewords, int length); + void debug_test_codeword_dump_int(struct zint_symbol *symbol, int *codewords, int length); #endif #ifdef __cplusplus diff --git a/backend/composite.c b/backend/composite.c index 11849658..49f9f780 100644 --- a/backend/composite.c +++ b/backend/composite.c @@ -2,7 +2,7 @@ /* libzint - the open source barcode library - Copyright (C) 2008-2019 Robin Stuart + Copyright (C) 2008 - 2020 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -50,20 +50,18 @@ */ #include -#include -#include #include #include #ifdef _MSC_VER #include #endif #include "common.h" -#include "composite.h" #include "pdf417.h" #include "gs1.h" #include "general_field.h" #define UINT unsigned short +#include "composite.h" INTERNAL int eanx(struct zint_symbol *symbol, unsigned char source[], int length); INTERNAL int ean_128(struct zint_symbol *symbol, unsigned char source[], const size_t length); @@ -72,8 +70,6 @@ INTERNAL int rss14(struct zint_symbol *symbol, unsigned char source[], int lengt INTERNAL int rsslimited(struct zint_symbol *symbol, unsigned char source[], int length); INTERNAL int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int length); -static UINT pwr928[69][7]; - static int _min(int first, int second) { if (first <= second) @@ -87,26 +83,6 @@ static int getBit(UINT *bitStr, int bitPos) { return !!(bitStr[bitPos >> 4] & (0x8000 >> (bitPos & 15))); } -/* initialize pwr928 encoding table */ -static void init928(void) { - int i, j, v; - int cw[7]; - cw[6] = 1L; - for (i = 5; i >= 0; i--) - cw[i] = 0; - - for (i = 0; i < 7; i++) - pwr928[0][i] = cw[i]; - for (j = 1; j < 69; j++) { - for (v = 0, i = 6; i >= 1; i--) { - v = (2 * cw[i]) + (v / 928); - pwr928[j][i] = cw[i] = v % 928; - } - pwr928[j][0] = cw[0] = (2 * cw[0]) + (v / 928); - } - return; -} - /* converts bit string to base 928 values, codeWords[0] is highest order */ static int encode928(UINT bitString[], UINT codeWords[], int bitLng) { int i, j, b, cwNdx, cwLng; @@ -171,7 +147,6 @@ static int cc_a(struct zint_symbol *symbol, char source[], int cc_width) { } } - init928(); /* encode codeWords from bitStr */ cwCnt = encode928(bitStr, codeWords, bitlen); @@ -332,6 +307,10 @@ static int cc_a(struct zint_symbol *symbol, char source[], int cc_width) { } } + if (symbol->debug & ZINT_DEBUG_PRINT) { + printf("CC-A Columns: %d, Rows: %d\n", cc_width, symbol->rows); + } + return 0; } @@ -341,7 +320,7 @@ static int cc_b(struct zint_symbol *symbol, char source[], int cc_width) { #ifndef _MSC_VER unsigned char data_string[(strlen(source) / 8) + 3]; #else - unsigned char* data_string = (unsigned char*) _alloca((strlen(source) / 8) + 3); + unsigned char *data_string = (unsigned char *) _alloca((strlen(source) / 8) + 3); #endif int chainemc[180], mclength; int k, j, p, longueur, mccorrection[50], offset; @@ -584,6 +563,10 @@ static int cc_b(struct zint_symbol *symbol, char source[], int cc_width) { } } + if (symbol->debug & ZINT_DEBUG_PRINT) { + printf("CC-B Columns: %d, Rows: %d\n", cc_width, symbol->rows); + } + return 0; } @@ -593,7 +576,7 @@ static int cc_c(struct zint_symbol *symbol, char source[], int cc_width, int ecc #ifndef _MSC_VER unsigned char data_string[(strlen(source) / 8) + 4]; #else - unsigned char* data_string = (unsigned char*) _alloca((strlen(source) / 8) + 4); + unsigned char *data_string = (unsigned char *) _alloca((strlen(source) / 8) + 4); #endif int chainemc[1000], mclength, k; int offset, longueur, loop, total, j, mccorrection[520]; @@ -724,6 +707,10 @@ static int cc_c(struct zint_symbol *symbol, char source[], int cc_width, int ecc symbol->rows = (mclength / cc_width); symbol->width = (int)strlen(pattern); + if (symbol->debug & ZINT_DEBUG_PRINT) { + printf("CC-C Columns: %d, Rows: %d\n", cc_width, symbol->rows); + } + return 0; } @@ -788,9 +775,9 @@ static int calc_padding_cca(int binary_length, int cc_width) { target_bitsize = 78; } break; - } + } - return target_bitsize; + return target_bitsize; } static int calc_padding_ccb(int binary_length, int cc_width) { @@ -957,7 +944,8 @@ static int calc_padding_ccc(int binary_length, int *cc_width, int lin_width, int return target_bitsize; } -static int cc_binary_string(struct zint_symbol *symbol, const char source[], char binary_string[], int cc_mode, int *cc_width, int *ecc, int lin_width) { /* Handles all data encodation from section 5 of ISO/IEC 24723 */ +/* Handles all data encodation from section 5 of ISO/IEC 24723 */ +static int cc_binary_string(struct zint_symbol *symbol, const char source[], char binary_string[], int cc_mode, int *cc_width, int *ecc, int lin_width) { int encoding_method, read_posn, alpha_pad; int i, j, ai_crop, ai_crop_posn, fnc1_latch; int ai90_mode, last_digit, remainder, binary_length; @@ -966,9 +954,10 @@ static int cc_binary_string(struct zint_symbol *symbol, const char source[], cha #ifndef _MSC_VER char general_field[source_len + 1]; #else - char* general_field = (char*) _alloca(source_len + 1); + char *general_field = (char *) _alloca(source_len + 1); #endif int target_bitsize; + int debug = symbol->debug & ZINT_DEBUG_PRINT; encoding_method = 1; read_posn = 0; @@ -976,7 +965,6 @@ static int cc_binary_string(struct zint_symbol *symbol, const char source[], cha ai_crop_posn = -1; fnc1_latch = 0; alpha_pad = 0; - ai90_mode = 0; *ecc = 0; target_bitsize = 0; mode = NUMERIC; @@ -993,6 +981,7 @@ static int cc_binary_string(struct zint_symbol *symbol, const char source[], cha if (encoding_method == 1) { strcat(binary_string, "0"); + if (debug) printf("CC-%c Encodation Method: 0\n", 'A' + (cc_mode - 1)); } if (encoding_method == 2) { @@ -1046,6 +1035,8 @@ static int cc_binary_string(struct zint_symbol *symbol, const char source[], cha /* Note an alphanumeric FNC1 is also a numeric latch, so now in numeric mode */ } } + + if (debug) printf("CC-%c Encodation Method: 10, Compaction Field: %.*s\n", 'A' + (cc_mode - 1), read_posn, source); } if (encoding_method == 3) { @@ -1053,7 +1044,7 @@ static int cc_binary_string(struct zint_symbol *symbol, const char source[], cha #ifndef _MSC_VER char ninety[source_len + 1]; #else - char* ninety = (char*) _alloca(source_len + 1); + char *ninety = (char *) _alloca(source_len + 1); #endif int ninety_len, alpha, alphanum, numeric, test1, test2, test3; @@ -1126,30 +1117,30 @@ static int cc_binary_string(struct zint_symbol *symbol, const char source[], cha /* Alpha mode is a special mode for AI 90 */ if (alphanum == 0 && alpha > numeric) { - /* Alphabetic mode */ + /* Alpha mode */ strcat(binary_string, "11"); ai90_mode = 2; } else if (alphanum == 0 && alpha == 0) { /* Numeric mode */ strcat(binary_string, "10"); ai90_mode = 3; - } else { + } else { /* Note if first 4 are digits then it would be shorter to go into NUMERIC mode first; not implemented */ /* Alphanumeric mode */ strcat(binary_string, "0"); ai90_mode = 1; - mode = ALPHA; + mode = ALPHANUMERIC; } next_ai_posn = 2 + ninety_len; - if (source[next_ai_posn] == '[') { + if (next_ai_posn < source_len && source[next_ai_posn] == '[') { /* There are more AIs afterwards */ - if ((source[next_ai_posn + 1] == '2') && (source[next_ai_posn + 2] == '1')) { + if (next_ai_posn + 2 < source_len && (source[next_ai_posn + 1] == '2') && (source[next_ai_posn + 2] == '1')) { /* AI 21 follows */ ai_crop = 1; - } - - if ((source[next_ai_posn + 1] == '8') && (source[next_ai_posn + 2] == '0') && (source[next_ai_posn + 3] == '0') && (source[next_ai_posn + 4] == '4')) { + } else if (next_ai_posn + 4 < source_len + && (source[next_ai_posn + 1] == '8') && (source[next_ai_posn + 2] == '0') + && (source[next_ai_posn + 3] == '0') && (source[next_ai_posn + 4] == '4')) { /* AI 8004 follows */ ai_crop = 3; } @@ -1220,10 +1211,15 @@ static int cc_binary_string(struct zint_symbol *symbol, const char source[], cha alpha_pad = 1; /* This is overwritten if a general field is encoded */ } + if (debug) { + printf("CC-%c Encodation Method: 11, Compaction Field: %.*s, Binary: %s (%d)\n", + 'A' + (cc_mode - 1), read_posn, source, binary_string, (int) strlen(binary_string)); + } } else { /* Use general field encodation instead */ strcat(binary_string, "0"); read_posn = 0; + if (debug) printf("CC-%c Encodation Method: 0\n", 'A' + (cc_mode - 1)); } } @@ -1249,6 +1245,12 @@ static int cc_binary_string(struct zint_symbol *symbol, const char source[], cha } general_field[j] = '\0'; + if (debug) { + printf("Mode %s, General Field: %.40s%s\n", + mode == NUMERIC ? "NUMERIC" : mode == ALPHANUMERIC ? "ALPHANUMERIC" : "ISO646", + general_field, strlen(general_field) > 40 ? "..." : ""); + } + if (strlen(general_field) != 0) { alpha_pad = 0; } @@ -1322,7 +1324,6 @@ static int cc_binary_string(struct zint_symbol *symbol, const char source[], cha /* Now add padding to binary string */ if (alpha_pad == 1) { strcat(binary_string, "11111"); - alpha_pad = 0; /* Extra FNC1 character required after Alpha encodation (section 5.3.3) */ } @@ -1339,6 +1340,11 @@ static int cc_binary_string(struct zint_symbol *symbol, const char source[], cha } } + if (debug) { + printf("ECC: %d, CC width %d\n", *ecc, *cc_width); + printf("Binary: %s (%d)\n", binary_string, (int) strlen(binary_string)); + } + return 0; } @@ -1368,7 +1374,7 @@ INTERNAL int composite(struct zint_symbol *symbol, unsigned char source[], int l #ifndef _MSC_VER char binary_string[bs]; #else - char* binary_string = (char*) _alloca(bs); + char *binary_string = (char *) _alloca(bs); #endif unsigned int pri_len; struct zint_symbol *linear; @@ -1402,6 +1408,9 @@ INTERNAL int composite(struct zint_symbol *symbol, unsigned char source[], int l strcpy(symbol->errtxt, "448: Invalid data"); return ZINT_ERROR_INVALID_DATA; } + if (symbol->debug & ZINT_DEBUG_PRINT) { + printf("GS1-128 linear width: %d\n", linear_width); + } } switch (symbol->symbology) { @@ -1412,7 +1421,7 @@ INTERNAL int composite(struct zint_symbol *symbol, unsigned char source[], int l int padded_pri_len; char padded_pri[20]; padded_pri[0] = '\0'; - ean_leading_zeroes(symbol, (unsigned char*) symbol->primary, (unsigned char*) padded_pri); + ean_leading_zeroes(symbol, (unsigned char *) symbol->primary, (unsigned char *) padded_pri); padded_pri_len = strlen(padded_pri); if (padded_pri_len <= 7) { /* EAN-8 */ cc_width = 3; @@ -1511,6 +1520,7 @@ INTERNAL int composite(struct zint_symbol *symbol, unsigned char source[], int l linear = ZBarcode_Create(); /* Symbol contains the 2D component and Linear contains the rest */ linear->symbology = symbol->symbology; + linear->debug = symbol->debug; if (linear->symbology != BARCODE_EAN128_CC) { /* Set the "component linkage" flag in the linear component */ @@ -1598,7 +1608,7 @@ INTERNAL int composite(struct zint_symbol *symbol, unsigned char source[], int l break; case BARCODE_RSS14_CC: bottom_shift = 4; break; - case BARCODE_RSS_LTD_CC: + case BARCODE_RSS_LTD_CC: if (cc_mode == 1) { top_shift = 1; } else { @@ -1627,6 +1637,10 @@ INTERNAL int composite(struct zint_symbol *symbol, unsigned char source[], int l break; } + if (symbol->debug & ZINT_DEBUG_PRINT) { + printf("Top shift: %d, Bottom shift: %d\n", top_shift, bottom_shift); + } + if (top_shift != 0) { /* Move the 2d component of the symbol horizontally */ for (i = 0; i <= symbol->rows; i++) { @@ -1660,7 +1674,8 @@ INTERNAL int composite(struct zint_symbol *symbol, unsigned char source[], int l symbol->width += top_shift; } symbol->rows += linear->rows; - ustrcpy(symbol->text, (unsigned char *) linear->text); + + ustrcpy(symbol->text, linear->text); ZBarcode_Delete(linear); diff --git a/backend/composite.h b/backend/composite.h index 6195d293..5fa610f8 100644 --- a/backend/composite.h +++ b/backend/composite.h @@ -2,7 +2,7 @@ /* libzint - the open source barcode library - Copyright (C) 2008-2017 Robin Stuart + Copyright (C) 2008 - 2020 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -65,3 +65,76 @@ static const char aRAPTable[68] = { }; /* Row Address Patterns are as defined in pdf417.h */ + +/* Generated by tools/gen_pwr928_table.php */ +static UINT pwr928[69][7] = { + { 0, 0, 0, 0, 0, 0, 1, }, + { 0, 0, 0, 0, 0, 0, 2, }, + { 0, 0, 0, 0, 0, 0, 4, }, + { 0, 0, 0, 0, 0, 0, 8, }, + { 0, 0, 0, 0, 0, 0, 16, }, + { 0, 0, 0, 0, 0, 0, 32, }, + { 0, 0, 0, 0, 0, 0, 64, }, + { 0, 0, 0, 0, 0, 0, 128, }, + { 0, 0, 0, 0, 0, 0, 256, }, + { 0, 0, 0, 0, 0, 0, 512, }, + { 0, 0, 0, 0, 0, 1, 96, }, + { 0, 0, 0, 0, 0, 2, 192, }, + { 0, 0, 0, 0, 0, 4, 384, }, + { 0, 0, 0, 0, 0, 8, 768, }, + { 0, 0, 0, 0, 0, 17, 608, }, + { 0, 0, 0, 0, 0, 35, 288, }, + { 0, 0, 0, 0, 0, 70, 576, }, + { 0, 0, 0, 0, 0, 141, 224, }, + { 0, 0, 0, 0, 0, 282, 448, }, + { 0, 0, 0, 0, 0, 564, 896, }, + { 0, 0, 0, 0, 1, 201, 864, }, + { 0, 0, 0, 0, 2, 403, 800, }, + { 0, 0, 0, 0, 4, 807, 672, }, + { 0, 0, 0, 0, 9, 687, 416, }, + { 0, 0, 0, 0, 19, 446, 832, }, + { 0, 0, 0, 0, 38, 893, 736, }, + { 0, 0, 0, 0, 77, 859, 544, }, + { 0, 0, 0, 0, 155, 791, 160, }, + { 0, 0, 0, 0, 311, 654, 320, }, + { 0, 0, 0, 0, 623, 380, 640, }, + { 0, 0, 0, 1, 318, 761, 352, }, + { 0, 0, 0, 2, 637, 594, 704, }, + { 0, 0, 0, 5, 347, 261, 480, }, + { 0, 0, 0, 10, 694, 523, 32, }, + { 0, 0, 0, 21, 461, 118, 64, }, + { 0, 0, 0, 42, 922, 236, 128, }, + { 0, 0, 0, 85, 916, 472, 256, }, + { 0, 0, 0, 171, 905, 16, 512, }, + { 0, 0, 0, 343, 882, 33, 96, }, + { 0, 0, 0, 687, 836, 66, 192, }, + { 0, 0, 1, 447, 744, 132, 384, }, + { 0, 0, 2, 895, 560, 264, 768, }, + { 0, 0, 5, 863, 192, 529, 608, }, + { 0, 0, 11, 798, 385, 131, 288, }, + { 0, 0, 23, 668, 770, 262, 576, }, + { 0, 0, 47, 409, 612, 525, 224, }, + { 0, 0, 94, 819, 297, 122, 448, }, + { 0, 0, 189, 710, 594, 244, 896, }, + { 0, 0, 379, 493, 260, 489, 864, }, + { 0, 0, 759, 58, 521, 51, 800, }, + { 0, 1, 590, 117, 114, 103, 672, }, + { 0, 3, 252, 234, 228, 207, 416, }, + { 0, 6, 504, 468, 456, 414, 832, }, + { 0, 13, 81, 8, 912, 829, 736, }, + { 0, 26, 162, 17, 897, 731, 544, }, + { 0, 52, 324, 35, 867, 535, 160, }, + { 0, 104, 648, 71, 807, 142, 320, }, + { 0, 209, 368, 143, 686, 284, 640, }, + { 0, 418, 736, 287, 444, 569, 352, }, + { 0, 837, 544, 574, 889, 210, 704, }, + { 1, 747, 161, 221, 850, 421, 480, }, + { 3, 566, 322, 443, 772, 843, 32, }, + { 7, 204, 644, 887, 617, 758, 64, }, + { 14, 409, 361, 847, 307, 588, 128, }, + { 28, 818, 723, 766, 615, 248, 256, }, + { 57, 709, 519, 605, 302, 496, 512, }, + { 115, 491, 111, 282, 605, 65, 96, }, + { 231, 54, 222, 565, 282, 130, 192, }, + { 462, 108, 445, 202, 564, 260, 384, }, +}; diff --git a/backend/general_field.c b/backend/general_field.c index 13c5ed00..b82522e4 100644 --- a/backend/general_field.c +++ b/backend/general_field.c @@ -2,7 +2,7 @@ /* libzint - the open source barcode library - Copyright (C) 2008-2019 Robin Stuart + Copyright (C) 2019 - 2020 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -31,7 +31,6 @@ */ /* vim: set ts=4 sw=4 et : */ -#include #include "common.h" #include "general_field.h" @@ -39,12 +38,12 @@ static char alphanum_puncs[] = "*,-./"; static char isoiec_puncs[] = "!\"%&'()*+,-./:;<=>?_ "; /* Returns type of char at `i`. FNC1 counted as NUMERIC. Returns 0 if invalid char */ -static int general_field_type(char* general_field, int i) { +static int general_field_type(char *general_field, int i) { if (general_field[i] == '[' || (general_field[i] >= '0' && general_field[i] <= '9')) { return NUMERIC; } if ((general_field[i] >= 'A' && general_field[i] <= 'Z') || strchr(alphanum_puncs, general_field[i])) { - return ALPHA; + return ALPHANUMERIC; } if ((general_field[i] >= 'a' && general_field[i] <= 'z') || strchr(isoiec_puncs, general_field[i])) { return ISOIEC; @@ -53,7 +52,7 @@ static int general_field_type(char* general_field, int i) { } /* Returns true if next (including `i`) `num` chars of type `type`, or if given (non-zero), `type2` */ -static int general_field_next(char* general_field, int i, int general_field_len, int num, int type, int type2) { +static int general_field_next(char *general_field, int i, int general_field_len, int num, int type, int type2) { if (i + num > general_field_len) { return 0; } @@ -67,7 +66,7 @@ static int general_field_next(char* general_field, int i, int general_field_len, } /* Returns true if next (including `i`) `num` up to `max_num` chars of type `type` and occur at end */ -static int general_field_next_terminate(char* general_field, int i, int general_field_len, int num, int max_num, int type) { +static int general_field_next_terminate(char *general_field, int i, int general_field_len, int num, int max_num, int type) { if (i + max_num < general_field_len) { return 0; } @@ -80,7 +79,7 @@ static int general_field_next_terminate(char* general_field, int i, int general_ } /* Returns true if none of the next (including `i`) `num` chars (or end occurs) of type `type` */ -static int general_field_next_none(char* general_field, int i, int general_field_len, int num, int type) { +static int general_field_next_none(char *general_field, int i, int general_field_len, int num, int type) { for (; i < general_field_len && num; i++, num--) { if (general_field_type(general_field, i) == type) { return 0; @@ -91,7 +90,7 @@ static int general_field_next_none(char* general_field, int i, int general_field /* Attempts to apply encoding rules from sections 7.2.5.5.1 to 7.2.5.5.3 * of ISO/IEC 24724:2011 (same as sections 5.4.1 to 5.4.3 of ISO/IEC 24723:2010) */ -INTERNAL int general_field_encode(char* general_field, int* p_mode, int* p_last_digit, char binary_string[]) { +INTERNAL int general_field_encode(char *general_field, int *p_mode, int *p_last_digit, char binary_string[]) { int i, d1, d2; int mode = *p_mode; int last_digit = 0; /* Set to odd remaining digit at end if any */ @@ -107,7 +106,7 @@ INTERNAL int general_field_encode(char* general_field, int* p_mode, int* p_last_ if (i < general_field_len - 1) { /* If at least 2 characters remain */ if (type != NUMERIC || general_field_type(general_field, i + 1) != NUMERIC) { /* 7.2.5.5.1/5.4.1 a) */ strcat(binary_string, "0000"); /* Alphanumeric latch */ - mode = ALPHA; + mode = ALPHANUMERIC; } else { d1 = general_field[i] == '[' ? 10 : ctoi(general_field[i]); d2 = general_field[i + 1] == '[' ? 10 : ctoi(general_field[i + 1]); @@ -117,14 +116,14 @@ INTERNAL int general_field_encode(char* general_field, int* p_mode, int* p_last_ } else { /* If 1 character remains */ if (type != NUMERIC) { /* 7.2.5.5.1/5.4.1 b) */ strcat(binary_string, "0000"); /* Alphanumeric latch */ - mode = ALPHA; + mode = ALPHANUMERIC; } else { last_digit = general_field[i]; /* Ending with single digit. 7.2.5.5.1 c) and 5.4.1 c) dealt with separately outside this procedure */ i++; } } break; - case ALPHA: + case ALPHANUMERIC: if (general_field[i] == '[') { /* 7.2.5.5.2/5.4.2 a) */ strcat(binary_string, "01111"); mode = NUMERIC; @@ -132,7 +131,7 @@ INTERNAL int general_field_encode(char* general_field, int* p_mode, int* p_last_ } else if (type == ISOIEC) { /* 7.2.5.5.2/5.4.2 b) */ strcat(binary_string, "00100"); /* ISO/IEC 646 latch */ mode = ISOIEC; - } else if (general_field_next(general_field, i, general_field_len, 6, NUMERIC, 0)) { /* 7.2.5.5.2/5.4.2 c) */ + } else if (general_field_next(general_field, i, general_field_len, 6, NUMERIC, 0)) { /* 7.2.5.5.2/5.4.2 c) */ strcat(binary_string, "000"); /* Numeric latch */ mode = NUMERIC; } else if (general_field_next_terminate(general_field, i, general_field_len, 4, 5 /*Can limit to 5 max due to above*/, NUMERIC)) { /* 7.2.5.5.2/5.4.2 d) */ @@ -159,10 +158,10 @@ INTERNAL int general_field_encode(char* general_field, int* p_mode, int* p_last_ if (next_10_not_isoiec && general_field_next(general_field, i, general_field_len, 4, NUMERIC, 0)) { /* 7.2.5.5.3/5.4.3 b) */ strcat(binary_string, "000"); /* Numeric latch */ mode = NUMERIC; - } else if (next_10_not_isoiec && general_field_next(general_field, i, general_field_len, 5, ALPHA, NUMERIC)) { /* 7.2.5.5.3/5.4.3 c) */ + } else if (next_10_not_isoiec && general_field_next(general_field, i, general_field_len, 5, ALPHANUMERIC, NUMERIC)) { /* 7.2.5.5.3/5.4.3 c) */ /* Note this rule can produce longer bitstreams if most of the alphanumerics are numeric */ strcat(binary_string, "00100"); /* Alphanumeric latch */ - mode = ALPHA; + mode = ALPHANUMERIC; } else if ((general_field[i] >= '0') && (general_field[i] <= '9')) { bin_append(general_field[i] - 43, 5, binary_string); i++; diff --git a/backend/general_field.h b/backend/general_field.h index 11db0710..184eb291 100644 --- a/backend/general_field.h +++ b/backend/general_field.h @@ -1,6 +1,6 @@ /* libzint - the open source barcode library - Copyright (C) 2007-2017 Robin Stuart + Copyright (C) 2019 - 2020 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -33,13 +33,13 @@ #define __GENERAL_FIELD_H #define NUMERIC 110 -#define ALPHA 97 +#define ALPHANUMERIC 97 #define ISOIEC 105 #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ - INTERNAL int general_field_encode(char* general_field, int* p_mode, int* p_last_digit, char binary_string[]); + INTERNAL int general_field_encode(char *general_field, int *p_mode, int *p_last_digit, char binary_string[]); #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/backend/gs1.c b/backend/gs1.c index 39791f8e..2bee8631 100644 --- a/backend/gs1.c +++ b/backend/gs1.c @@ -31,7 +31,6 @@ */ /* vim: set ts=4 sw=4 et : */ -#include #include #ifdef _MSC_VER #include @@ -69,6 +68,18 @@ static void itostr(char ai_string[], int ai_value) { strcat(ai_string, ")"); } +/* Returns the number of times a character occurs in a string */ +static int ustrchr_cnt(const unsigned char string[], const size_t length, const unsigned char c) { + int count = 0; + unsigned int i; + for (i = 0; i < length; i++) { + if (string[i] == c) { + count++; + } + } + return count; +} + INTERNAL int gs1_verify(struct zint_symbol *symbol, const unsigned char source[], const size_t src_len, char reduced[]) { int i, j, last_ai, ai_latch; char ai_string[7]; /* 6 char max "(NNNN)" */ diff --git a/backend/rss.c b/backend/rss.c index d71177be..84ebb099 100644 --- a/backend/rss.c +++ b/backend/rss.c @@ -109,16 +109,15 @@ static int combins(int n, int r) { * routine to generate widths for RSS elements for a given value.# * * Calling arguments: + * int widths[] = element widths * val = required value * n = number of modules * elements = elements in a set (RSS-14 & Expanded = 4; RSS Limited = 7) * maxWidth = maximum module width of an element * noNarrow = 0 will skip patterns without a one module wide element * - * Return: - * static int widths[] = element widths **********************************************************************/ -static void getRSSwidths(int val, int n, int elements, int maxWidth, int noNarrow) { +static void getRSSwidths(int widths[], int val, int n, int elements, int maxWidth, int noNarrow) { int bar; int elmWidth; int mxwElement; @@ -158,19 +157,132 @@ static void getRSSwidths(int val, int n, int elements, int maxWidth, int noNarro return; } -/* GS1 DataBar-14 */ +/* Calculate check digit from Annex A */ +static int calc_check_digit(unsigned char *src) { + int i, check_digit; + int count = 0; + + for (i = 0; i < 13; i++) { + count += (i & 1) ? ctoi(src[i]) : 3 * ctoi(src[i]); + } + check_digit = 10 - (count % 10); + if (check_digit == 10) { + check_digit = 0; + } + + return check_digit; +} + +/* Set GTIN-14 human readable text */ +static void set_gtin14_hrt(struct zint_symbol *symbol, unsigned char *source, int src_len) { + int i; + unsigned char hrt[15]; + + ustrcpy(symbol->text, "(01)"); + for (i = 0; i < 12; i++) { + hrt[i] = '0'; + } + for (i = 0; i < src_len; i++) { + hrt[12 - i] = source[src_len - i - 1]; + } + + hrt[13] = itoc(calc_check_digit(hrt)); + hrt[14] = '\0'; + + ustrcat(symbol->text, hrt); +} + +/* Expand from a width pattern to a bit pattern */ +static int rss_expand(struct zint_symbol *symbol, int writer, char *p_latch, int width) { + int j; + int latch = *p_latch; + + for (j = 0; j < width; j++) { + if (latch == '1') { + set_module(symbol, symbol->rows, writer); + } else { + unset_module(symbol, symbol->rows, writer); + } + writer++; + } + if (latch == '1') { + *p_latch = '0'; + } else { + *p_latch = '1'; + } + + return writer; +} + +/* Adjust top/bottom separator for finder patterns */ +static void rss14_finder_adjust(struct zint_symbol *symbol, int separator_row, int above_below, int finder_start) { + int i, finder_end; + int module_row = separator_row + above_below; + int latch; + + /* Alternation is always left-to-right for Omnidirectional separators (unlike for Expanded) */ + latch = '1'; + for (i = finder_start, finder_end = finder_start + 13; i < finder_end; i++) { + if (!module_is_set(symbol, module_row, i)) { + if (latch == '1') { + set_module(symbol, separator_row, i); + latch = '0'; + } else { + unset_module(symbol, separator_row, i); + latch = '1'; + } + } else { + unset_module(symbol, separator_row, i); + latch = '1'; + } + } +} + +/* Top/bottom separator for DataBar */ +static void rss14_separator(struct zint_symbol *symbol, int width, int separator_row, int above_below, int finder_start, int finder2_start, int bottom_finder_value_3) { + int i, finder_end, finder_value_3_set; + int module_row = separator_row + above_below; + + for (i = 4, width -= 4; i < width; i++) { + if (!module_is_set(symbol, module_row, i)) { + set_module(symbol, separator_row, i); + } + } + if (bottom_finder_value_3) { + /* ISO/IEC 24724:2011 5.3.2.2 "The single dark module that occurs in the 13 modules over finder value 3 is + * shifted one module to the right so that it is over the start of the three module-wide finder bar." */ + finder_value_3_set = finder_start + 10; + for (i = finder_start, finder_end = finder_start + 13; i < finder_end; i++) { + if (i == finder_value_3_set) { + set_module(symbol, separator_row, i); + } else { + unset_module(symbol, separator_row, i); + } + } + } else { + if (finder_start) { + rss14_finder_adjust(symbol, separator_row, above_below, finder_start); + } + if (finder2_start) { + rss14_finder_adjust(symbol, separator_row, above_below, finder2_start); + } + } +} + +/* GS1 DataBar Omnidirectional/Truncated/Stacked */ INTERNAL int rss14(struct zint_symbol *symbol, unsigned char source[], int src_len) { - int error_number = 0, i, j; + int error_number = 0, i; large_int accum; uint64_t left_pair, right_pair; int data_character[4] = {0}, data_group[4] = {0}, v_odd[4], v_even[4]; int data_widths[8][4], checksum, c_left, c_right, total_widths[46], writer; char latch; int separator_row; + int widths[4]; separator_row = 0; - if (src_len > 13) { + if (src_len > 14) { /* Allow check digit to be specified (will be verified and ignored) */ strcpy(symbol->errtxt, "380: Input too long"); return ZINT_ERROR_TOO_LONG; } @@ -180,6 +292,14 @@ INTERNAL int rss14(struct zint_symbol *symbol, unsigned char source[], int src_l return error_number; } + if (src_len == 14) { /* Verify check digit */ + if (calc_check_digit(source) != ctoi(source[13])) { + strcpy(symbol->errtxt, "388: Invalid check digit"); + return ZINT_ERROR_INVALID_CHECK; + } + src_len--; /* Ignore */ + } + /* make some room for a separator row for composite symbols */ switch (symbol->symbology) { case BARCODE_RSS14_CC: @@ -228,6 +348,7 @@ INTERNAL int rss14(struct zint_symbol *symbol, unsigned char source[], int src_l if ((data_character[0] >= 2715) && (data_character[0] <= 2840)) { data_group[0] = 4; } + if ((data_character[1] >= 0) && (data_character[1] <= 335)) { data_group[1] = 5; } @@ -240,6 +361,7 @@ INTERNAL int rss14(struct zint_symbol *symbol, unsigned char source[], int src_l if ((data_character[1] >= 1516) && (data_character[1] <= 1596)) { data_group[1] = 8; } + if ((data_character[3] >= 0) && (data_character[3] <= 335)) { data_group[3] = 5; } @@ -252,6 +374,7 @@ INTERNAL int rss14(struct zint_symbol *symbol, unsigned char source[], int src_l if ((data_character[3] >= 1516) && (data_character[3] <= 1596)) { data_group[3] = 8; } + if ((data_character[2] >= 0) && (data_character[2] <= 160)) { data_group[2] = 0; } @@ -281,23 +404,23 @@ INTERNAL int rss14(struct zint_symbol *symbol, unsigned char source[], int src_l /* Use RSS subset width algorithm */ for (i = 0; i < 4; i++) { if ((i == 0) || (i == 2)) { - getRSSwidths(v_odd[i], modules_odd[data_group[i]], 4, widest_odd[data_group[i]], 1); + getRSSwidths(widths, v_odd[i], modules_odd[data_group[i]], 4, widest_odd[data_group[i]], 1); data_widths[0][i] = widths[0]; data_widths[2][i] = widths[1]; data_widths[4][i] = widths[2]; data_widths[6][i] = widths[3]; - getRSSwidths(v_even[i], modules_even[data_group[i]], 4, widest_even[data_group[i]], 0); + getRSSwidths(widths, v_even[i], modules_even[data_group[i]], 4, widest_even[data_group[i]], 0); data_widths[1][i] = widths[0]; data_widths[3][i] = widths[1]; data_widths[5][i] = widths[2]; data_widths[7][i] = widths[3]; } else { - getRSSwidths(v_odd[i], modules_odd[data_group[i]], 4, widest_odd[data_group[i]], 0); + getRSSwidths(widths, v_odd[i], modules_odd[data_group[i]], 4, widest_odd[data_group[i]], 0); data_widths[0][i] = widths[0]; data_widths[2][i] = widths[1]; data_widths[4][i] = widths[2]; data_widths[6][i] = widths[3]; - getRSSwidths(v_even[i], modules_even[data_group[i]], 4, widest_even[data_group[i]], 1); + getRSSwidths(widths, v_even[i], modules_even[data_group[i]], 4, widest_even[data_group[i]], 1); data_widths[1][i] = widths[0]; data_widths[3][i] = widths[1]; data_widths[5][i] = widths[2]; @@ -326,6 +449,10 @@ INTERNAL int rss14(struct zint_symbol *symbol, unsigned char source[], int src_l c_left = checksum / 9; c_right = checksum % 9; + if (symbol->debug & ZINT_DEBUG_PRINT) { + printf("c_left: %d, c_right: %d\n", c_left, c_right); + } + /* Put element widths together */ total_widths[0] = 1; total_widths[1] = 1; @@ -344,95 +471,22 @@ INTERNAL int rss14(struct zint_symbol *symbol, unsigned char source[], int src_l /* Put this data into the symbol */ if ((symbol->symbology == BARCODE_RSS14) || (symbol->symbology == BARCODE_RSS14_CC)) { - int count; - int check_digit; - char hrt[15]; writer = 0; latch = '0'; for (i = 0; i < 46; i++) { - for (j = 0; j < total_widths[i]; j++) { - if (latch == '1') { - set_module(symbol, symbol->rows, writer); - } - writer++; - } - if (latch == '1') { - latch = '0'; - } else { - latch = '1'; - } + writer = rss_expand(symbol, writer, &latch, total_widths[i]); } if (symbol->width < writer) { symbol->width = writer; } if (symbol->symbology == BARCODE_RSS14_CC) { /* separator pattern for composite symbol */ - for (i = 4; i < 92; i++) { - if (!(module_is_set(symbol, separator_row + 1, i))) { - set_module(symbol, separator_row, i); - } - } - latch = '1'; - for (i = 16; i < 32; i++) { - if (!(module_is_set(symbol, separator_row + 1, i))) { - if (latch == '1') { - set_module(symbol, separator_row, i); - latch = '0'; - } else { - unset_module(symbol, separator_row, i); - latch = '1'; - } - } else { - unset_module(symbol, separator_row, i); - latch = '1'; - } - } - latch = '1'; - for (i = 63; i < 78; i++) { - if (!(module_is_set(symbol, separator_row + 1, i))) { - if (latch == '1') { - set_module(symbol, separator_row, i); - latch = '0'; - } else { - unset_module(symbol, separator_row, i); - latch = '1'; - } - } else { - unset_module(symbol, separator_row, i); - latch = '1'; - } - } + rss14_separator(symbol, 96, separator_row, 1 /*above*/, 18, 63, 0 /*bottom_finder_value_3*/); } symbol->rows = symbol->rows + 1; - count = 0; - check_digit = 0; - - /* Calculate check digit from Annex A and place human readable text */ - ustrcpy(symbol->text, (unsigned char*) "(01)"); - for (i = 0; i < 14; i++) { - hrt[i] = '0'; - } - for (i = 0; i < src_len; i++) { - hrt[12 - i] = source[src_len - i - 1]; - } - hrt[14] = '\0'; - - for (i = 0; i < 13; i++) { - count += ctoi(hrt[i]); - - if (!(i & 1)) { - count += 2 * (ctoi(hrt[i])); - } - } - - check_digit = 10 - (count % 10); - if (check_digit == 10) { - check_digit = 0; - } - hrt[13] = itoc(check_digit); - - strcat((char*) symbol->text, hrt); + /* Set human readable text */ + set_gtin14_hrt(symbol, source, src_len); set_minimum_height(symbol, 14); // Minimum height is 14X for truncated symbol } @@ -442,46 +496,25 @@ INTERNAL int rss14(struct zint_symbol *symbol, unsigned char source[], int src_l writer = 0; latch = '0'; for (i = 0; i < 23; i++) { - for (j = 0; j < total_widths[i]; j++) { - if (latch == '1') { - set_module(symbol, symbol->rows, writer); - } else { - unset_module(symbol, symbol->rows, writer); - } - writer++; - } - if (latch == '1') { - latch = '0'; - } else { - latch = '1'; - } + writer = rss_expand(symbol, writer, &latch, total_widths[i]); } set_module(symbol, symbol->rows, writer); unset_module(symbol, symbol->rows, writer + 1); symbol->row_height[symbol->rows] = 5; + /* bottom row */ symbol->rows = symbol->rows + 2; set_module(symbol, symbol->rows, 0); unset_module(symbol, symbol->rows, 1); - writer = 0; + writer = 2; latch = '1'; for (i = 23; i < 46; i++) { - for (j = 0; j < total_widths[i]; j++) { - if (latch == '1') { - set_module(symbol, symbol->rows, writer + 2); - } else { - unset_module(symbol, symbol->rows, writer + 2); - } - writer++; - } - if (latch == '1') { - latch = '0'; - } else { - latch = '1'; - } + writer = rss_expand(symbol, writer, &latch, total_widths[i]); } symbol->row_height[symbol->rows] = 7; + /* separator pattern */ + /* See #183 for this interpretation of ISO/IEC 24724:2011 5.3.2.1 */ for (i = 1; i < 46; i++) { if (module_is_set(symbol, symbol->rows - 2, i) == module_is_set(symbol, symbol->rows, i)) { if (!(module_is_set(symbol, symbol->rows - 2, i))) { @@ -497,28 +530,10 @@ INTERNAL int rss14(struct zint_symbol *symbol, unsigned char source[], int src_l unset_module(symbol, symbol->rows - 1, 2); unset_module(symbol, symbol->rows - 1, 3); symbol->row_height[symbol->rows - 1] = 1; + if (symbol->symbology == BARCODE_RSS14STACK_CC) { /* separator pattern for composite symbol */ - for (i = 4; i < 46; i++) { - if (!(module_is_set(symbol, separator_row + 1, i))) { - set_module(symbol, separator_row, i); - } - } - latch = '1'; - for (i = 16; i < 32; i++) { - if (!(module_is_set(symbol, separator_row + 1, i))) { - if (latch == '1') { - set_module(symbol, separator_row, i); - latch = '0'; - } else { - unset_module(symbol, separator_row, i); - latch = '1'; - } - } else { - unset_module(symbol, separator_row, i); - latch = '1'; - } - } + rss14_separator(symbol, 50, separator_row, 1 /*above*/, 18, 0, 0 /*bottom_finder_value_3*/); } symbol->rows = symbol->rows + 1; if (symbol->width < 50) { @@ -531,120 +546,48 @@ INTERNAL int rss14(struct zint_symbol *symbol, unsigned char source[], int src_l writer = 0; latch = '0'; for (i = 0; i < 23; i++) { - for (j = 0; j < total_widths[i]; j++) { - if (latch == '1') { - set_module(symbol, symbol->rows, writer); - } else { - unset_module(symbol, symbol->rows, writer); - } - writer++; - } - latch = (latch == '1' ? '0' : '1'); + writer = rss_expand(symbol, writer, &latch, total_widths[i]); } set_module(symbol, symbol->rows, writer); unset_module(symbol, symbol->rows, writer + 1); + /* bottom row */ symbol->rows = symbol->rows + 4; set_module(symbol, symbol->rows, 0); unset_module(symbol, symbol->rows, 1); - writer = 0; + writer = 2; latch = '1'; for (i = 23; i < 46; i++) { - for (j = 0; j < total_widths[i]; j++) { - if (latch == '1') { - set_module(symbol, symbol->rows, writer + 2); - } else { - unset_module(symbol, symbol->rows, writer + 2); - } - writer++; - } - if (latch == '1') { - latch = '0'; - } else { - latch = '1'; - } + writer = rss_expand(symbol, writer, &latch, total_widths[i]); } + /* middle separator */ for (i = 5; i < 46; i += 2) { set_module(symbol, symbol->rows - 2, i); } symbol->row_height[symbol->rows - 2] = 1; + /* top separator */ - for (i = 4; i < 46; i++) { - if (!(module_is_set(symbol, symbol->rows - 4, i))) { - set_module(symbol, symbol->rows - 3, i); - } - } - latch = '1'; - for (i = 17; i < 33; i++) { - if (!(module_is_set(symbol, symbol->rows - 4, i))) { - if (latch == '1') { - set_module(symbol, symbol->rows - 3, i); - latch = '0'; - } else { - unset_module(symbol, symbol->rows - 3, i); - latch = '1'; - } - } else { - unset_module(symbol, symbol->rows - 3, i); - latch = '1'; - } - } + rss14_separator(symbol, 50, symbol->rows - 3, -1 /*below*/, 18, 0, 0 /*bottom_finder_value_3*/); symbol->row_height[symbol->rows - 3] = 1; + /* bottom separator */ - for (i = 4; i < 46; i++) { - if (!(module_is_set(symbol, symbol->rows, i))) { - set_module(symbol, symbol->rows - 1, i); - } - } - latch = '1'; - for (i = 16; i < 32; i++) { - if (!(module_is_set(symbol, symbol->rows, i))) { - if (latch == '1') { - set_module(symbol, symbol->rows - 1, i); - latch = '0'; - } else { - unset_module(symbol, symbol->rows - 1, i); - latch = '1'; - } - } else { - unset_module(symbol, symbol->rows - 1, i); - latch = '1'; - } - } + /* 17 == 2 (guard) + 15 (inner char); +2 to skip over finder elements 4 & 5 (right to left) */ + rss14_separator(symbol, 50, symbol->rows - 1, 1 /*above*/, 17 + 2, 0, c_right == 3); symbol->row_height[symbol->rows - 1] = 1; if (symbol->width < 50) { symbol->width = 50; } + if (symbol->symbology == BARCODE_RSS14_OMNI_CC) { /* separator pattern for composite symbol */ - for (i = 4; i < 46; i++) { - if (!(module_is_set(symbol, separator_row + 1, i))) { - set_module(symbol, separator_row, i); - } - } - latch = '1'; - for (i = 16; i < 32; i++) { - if (!(module_is_set(symbol, separator_row + 1, i))) { - if (latch == '1') { - set_module(symbol, separator_row, i); - latch = '0'; - } else { - unset_module(symbol, separator_row, i); - latch = '1'; - } - } else { - unset_module(symbol, separator_row, i); - latch = '1'; - } - } + rss14_separator(symbol, 50, separator_row, 1 /*above*/, 18, 0, 0 /*bottom_finder_value_3*/); } symbol->rows = symbol->rows + 1; set_minimum_height(symbol, 33); } - return error_number; } @@ -655,13 +598,14 @@ INTERNAL int rsslimited(struct zint_symbol *symbol, unsigned char source[], int uint64_t left_character, right_character; int left_group, right_group, left_odd, left_even, right_odd, right_even; int left_widths[14], right_widths[14]; - int checksum, check_elements[14], total_widths[46], writer, j, check_digit, count; - char latch, hrt[15]; + int checksum, check_elements[14], total_widths[46], writer; + char latch; int separator_row; + int widths[7]; separator_row = 0; - if (src_len > 13) { + if (src_len > 14) { /* Allow check digit to be specified (will be verified and ignored) */ strcpy(symbol->errtxt, "382: Input too long"); return ZINT_ERROR_TOO_LONG; } @@ -670,6 +614,15 @@ INTERNAL int rsslimited(struct zint_symbol *symbol, unsigned char source[], int strcpy(symbol->errtxt, "383: Invalid characters in data"); return error_number; } + + if (src_len == 14) { /* Verify check digit */ + if (calc_check_digit(source) != ctoi(source[13])) { + strcpy(symbol->errtxt, "389: Invalid check digit"); + return ZINT_ERROR_INVALID_CHECK; + } + src_len--; /* Ignore */ + } + if (src_len == 13) { if ((source[0] != '0') && (source[0] != '1')) { strcpy(symbol->errtxt, "384: Input out of range"); @@ -745,38 +698,22 @@ INTERNAL int rsslimited(struct zint_symbol *symbol, unsigned char source[], int right_odd = right_character / t_even_ltd[right_group]; right_even = right_character % t_even_ltd[right_group]; - getRSSwidths(left_odd, modules_odd_ltd[left_group], 7, widest_odd_ltd[left_group], 1); - left_widths[0] = widths[0]; - left_widths[2] = widths[1]; - left_widths[4] = widths[2]; - left_widths[6] = widths[3]; - left_widths[8] = widths[4]; - left_widths[10] = widths[5]; - left_widths[12] = widths[6]; - getRSSwidths(left_even, modules_even_ltd[left_group], 7, widest_even_ltd[left_group], 0); - left_widths[1] = widths[0]; - left_widths[3] = widths[1]; - left_widths[5] = widths[2]; - left_widths[7] = widths[3]; - left_widths[9] = widths[4]; - left_widths[11] = widths[5]; - left_widths[13] = widths[6]; - getRSSwidths(right_odd, modules_odd_ltd[right_group], 7, widest_odd_ltd[right_group], 1); - right_widths[0] = widths[0]; - right_widths[2] = widths[1]; - right_widths[4] = widths[2]; - right_widths[6] = widths[3]; - right_widths[8] = widths[4]; - right_widths[10] = widths[5]; - right_widths[12] = widths[6]; - getRSSwidths(right_even, modules_even_ltd[right_group], 7, widest_even_ltd[right_group], 0); - right_widths[1] = widths[0]; - right_widths[3] = widths[1]; - right_widths[5] = widths[2]; - right_widths[7] = widths[3]; - right_widths[9] = widths[4]; - right_widths[11] = widths[5]; - right_widths[13] = widths[6]; + getRSSwidths(widths, left_odd, modules_odd_ltd[left_group], 7, widest_odd_ltd[left_group], 1); + for (i = 0; i <= 6; i++) { + left_widths[i * 2] = widths[i]; + } + getRSSwidths(widths, left_even, modules_even_ltd[left_group], 7, widest_even_ltd[left_group], 0); + for (i = 0; i <= 6; i++) { + left_widths[i * 2 + 1] = widths[i]; + } + getRSSwidths(widths, right_odd, modules_odd_ltd[right_group], 7, widest_odd_ltd[right_group], 1); + for (i = 0; i <= 6; i++) { + right_widths[i * 2] = widths[i]; + } + getRSSwidths(widths, right_even, modules_even_ltd[right_group], 7, widest_even_ltd[right_group], 0); + for (i = 0; i <= 6; i++) { + right_widths[i * 2 + 1] = widths[i]; + } checksum = 0; /* Calculate the checksum */ @@ -803,15 +740,7 @@ INTERNAL int rsslimited(struct zint_symbol *symbol, unsigned char source[], int writer = 0; latch = '0'; for (i = 0; i < 46; i++) { - for (j = 0; j < total_widths[i]; j++) { - if (latch == '1') { - set_module(symbol, symbol->rows, writer); - } else { - unset_module(symbol, symbol->rows, writer); - } - writer++; - } - latch = (latch == '1' ? '0' : '1'); + writer = rss_expand(symbol, writer, &latch, total_widths[i]); } if (symbol->width < writer) { symbol->width = writer; @@ -827,36 +756,8 @@ INTERNAL int rsslimited(struct zint_symbol *symbol, unsigned char source[], int } } - /* Calculate check digit from Annex A and place human readable text */ - - check_digit = 0; - count = 0; - - ustrcpy(symbol->text, (unsigned char*) "(01)"); - for (i = 0; i < 14; i++) { - hrt[i] = '0'; - } - for (i = 0; i < src_len; i++) { - hrt[12 - i] = source[src_len - i - 1]; - } - - for (i = 0; i < 13; i++) { - count += ctoi(hrt[i]); - - if (!(i & 1)) { - count += 2 * (ctoi(hrt[i])); - } - } - - check_digit = 10 - (count % 10); - if (check_digit == 10) { - check_digit = 0; - } - - hrt[13] = itoc(check_digit); - hrt[14] = '\0'; - - strcat((char*) symbol->text, hrt); + /* Set human readable text */ + set_gtin14_hrt(symbol, source, src_len); set_minimum_height(symbol, 10); @@ -875,8 +776,6 @@ static int rss_binary_string(struct zint_symbol *symbol, char source[], char bin int remainder, d1, d2; char padstring[40]; - read_posn = 0; - /* Decide whether a compressed data field is required and if so what method to use - method 2 = no compressed data field */ @@ -1315,6 +1214,67 @@ static int rss_binary_string(struct zint_symbol *symbol, char source[], char bin return 0; } +static void rssexp_separator(struct zint_symbol *symbol, int width, int cols, int separator_row, int above_below, int special_case_row, int left_to_right, int odd_last_row, int *p_v2_latch) { + int i, i_start, i_end, j, k; + int module_row = separator_row + above_below; + int v2_latch = p_v2_latch ? *p_v2_latch : 0; + int space_latch = 0; + + for (j = 4 + special_case_row, width -= 4; j < width; j++) { + if (module_is_set(symbol, module_row, j)) { + unset_module(symbol, separator_row, j); + } else { + set_module(symbol, separator_row, j); + } + } + + /* finder adjustment */ + for (j = 0; j < cols; j++) { + k = (49 * j) + 19 + special_case_row; /* 49 == data (17) + finder (15) + data(17) triplet, 19 == 2 (guard) + 17 (initial check/data character) */ + if (left_to_right) { + i_start = v2_latch ? 2 : 0; /* Last 13 modules of version 2 finder and first 13 modules of version 1 finder */ + i_end = v2_latch ? 15 : 13; + for (i = i_start; i < i_end; i++) { + if (module_is_set(symbol, module_row, i + k)) { + unset_module(symbol, separator_row, i + k); + space_latch = 0; + } else { + if (space_latch) { + unset_module(symbol, separator_row, i + k); + } else { + set_module(symbol, separator_row, i + k); + } + space_latch = !space_latch; + } + } + } else { + if (odd_last_row) { + k -= 17; /* No data char at beginning of row, i.e. ends with finder */ + } + i_start = v2_latch ? 14 : 12; /* First 13 modules of version 1 finder and last 13 modules of version 2 finder */ + i_end = v2_latch ? 2 : 0; + for (i = i_start; i >= i_end; i--) { + if (module_is_set(symbol, module_row, i + k)) { + unset_module(symbol, separator_row, i + k); + space_latch = 0; + } else { + if (space_latch) { + unset_module(symbol, separator_row, i + k); + } else { + set_module(symbol, separator_row, i + k); + } + space_latch = !space_latch; + } + } + } + v2_latch = !v2_latch; + } + + if (p_v2_latch && above_below == -1) { /* Only set if below */ + *p_v2_latch = v2_latch; + } +} + /* GS1 DataBar Expanded */ INTERNAL int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int src_len) { int i, j, k, p, data_chars, vs[21], group[21], v_odd[21], v_even[21]; @@ -1323,6 +1283,7 @@ INTERNAL int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int int check_char, c_odd, c_even, elements[235], pattern_width, reader, writer; int separator_row; unsigned int bin_len = 13 * src_len + 200 + 1; /* Allow for 8 bits + 5-bit latch per char + 200 bits overhead/padding */ + int widths[4]; #ifndef _MSC_VER char reduced[src_len + 1], binary_string[bin_len]; #else @@ -1330,9 +1291,6 @@ INTERNAL int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int char* binary_string = (char*) _alloca(bin_len); #endif - separator_row = 0; - reader = 0; - i = gs1_verify(symbol, source, src_len, reduced); if (i != 0) { return i; @@ -1347,7 +1305,7 @@ INTERNAL int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int strcpy(binary_string, ""); - if (symbol->option_1 == 2) { + if (symbol->option_1 == 2) { /* The "component linkage" flag */ strcat(binary_string, "1"); } else { strcat(binary_string, "0"); @@ -1395,12 +1353,12 @@ INTERNAL int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int v_odd[i] = (vs[i] - g_sum_exp[group[i] - 1]) / t_even_exp[group[i] - 1]; v_even[i] = (vs[i] - g_sum_exp[group[i] - 1]) % t_even_exp[group[i] - 1]; - getRSSwidths(v_odd[i], modules_odd_exp[group[i] - 1], 4, widest_odd_exp[group[i] - 1], 0); + getRSSwidths(widths, v_odd[i], modules_odd_exp[group[i] - 1], 4, widest_odd_exp[group[i] - 1], 0); char_widths[i][0] = widths[0]; char_widths[i][2] = widths[1]; char_widths[i][4] = widths[2]; char_widths[i][6] = widths[3]; - getRSSwidths(v_even[i], modules_even_exp[group[i] - 1], 4, widest_even_exp[group[i] - 1], 1); + getRSSwidths(widths, v_even[i], modules_even_exp[group[i] - 1], 4, widest_even_exp[group[i] - 1], 1); char_widths[i][1] = widths[0]; char_widths[i][3] = widths[1]; char_widths[i][5] = widths[2]; @@ -1421,6 +1379,10 @@ INTERNAL int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int check_char = (211 * ((data_chars + 1) - 4)) + (checksum % 211); + if (symbol->debug & ZINT_DEBUG_PRINT) { + printf("Data chars: %d, Check char: %d\n", data_chars, check_char); + } + if (check_char <= 347) { c_group = 1; } @@ -1440,12 +1402,12 @@ INTERNAL int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int c_odd = (check_char - g_sum_exp[c_group - 1]) / t_even_exp[c_group - 1]; c_even = (check_char - g_sum_exp[c_group - 1]) % t_even_exp[c_group - 1]; - getRSSwidths(c_odd, modules_odd_exp[c_group - 1], 4, widest_odd_exp[c_group - 1], 0); + getRSSwidths(widths, c_odd, modules_odd_exp[c_group - 1], 4, widest_odd_exp[c_group - 1], 0); check_widths[0] = widths[0]; check_widths[2] = widths[1]; check_widths[4] = widths[2]; check_widths[6] = widths[3]; - getRSSwidths(c_even, modules_even_exp[c_group - 1], 4, widest_even_exp[c_group - 1], 1); + getRSSwidths(widths, c_even, modules_even_exp[c_group - 1], 4, widest_even_exp[c_group - 1], 1); check_widths[1] = widths[0]; check_widths[3] = widths[1]; check_widths[5] = widths[2]; @@ -1496,44 +1458,12 @@ INTERNAL int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int writer = 0; latch = '0'; for (i = 0; i < pattern_width; i++) { - for (j = 0; j < elements[i]; j++) { - if (latch == '1') { - set_module(symbol, symbol->rows, writer); - } else { - unset_module(symbol, symbol->rows, writer); - } - writer++; - } - if (latch == '1') { - latch = '0'; - } else { - latch = '1'; - } + writer = rss_expand(symbol, writer, &latch, elements[i]); } if (symbol->width < writer) { symbol->width = writer; } symbol->rows = symbol->rows + 1; - if (symbol->symbology == BARCODE_RSS_EXP_CC) { - for (j = 4; j < (symbol->width - 4); j++) { - if (module_is_set(symbol, separator_row + 1, j)) { - unset_module(symbol, separator_row, j); - } else { - set_module(symbol, separator_row, j); - } - } - /* finder bar adjustment */ - for (j = 0; j < (writer / 49); j++) { - k = (49 * j) + 18; - for (i = 0; i < 15; i++) { - if ((!(module_is_set(symbol, separator_row + 1, i + k - 1))) && - (!(module_is_set(symbol, separator_row + 1, i + k))) && - module_is_set(symbol, separator_row, i + k - 1)) { - unset_module(symbol, separator_row, i + k); - } - } - } - } /* Add human readable text */ for (i = 0; i <= src_len; i++) { @@ -1552,6 +1482,7 @@ INTERNAL int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int } else { int stack_rows; int current_row, current_block, left_to_right; + int v2_latch = 0; /* RSS Expanded Stacked */ /* Bug corrected: Character missing for message @@ -1560,8 +1491,7 @@ INTERNAL int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int */ int codeblocks = (data_chars + 1) / 2 + ((data_chars + 1) % 2); - - if ((symbol->option_2 < 1) || (symbol->option_2 > 10)) { + if ((symbol->option_2 < 1) || (symbol->option_2 > 11)) { symbol->option_2 = 2; } if ((symbol->option_1 == 2) && (symbol->option_2 == 1)) { @@ -1591,27 +1521,30 @@ INTERNAL int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int elements_in_sub = 2; /* Row Data */ + if (((symbol->option_2 & 1) || (current_row & 1)) || + ((current_row == stack_rows) && (codeblocks != (current_row * symbol->option_2)) && + (((current_row * symbol->option_2) - codeblocks) & 1))) { + left_to_right = 1; + } else { + left_to_right = 0; + } reader = 0; do { - if (((symbol->option_2 & 1) || (current_row & 1)) || - ((current_row == stack_rows) && (codeblocks != (current_row * symbol->option_2)) && - (((current_row * symbol->option_2) - codeblocks) & 1))) { + if (left_to_right) { /* left to right */ - left_to_right = 1; i = 2 + (current_block * 21); for (j = 0; j < 21; j++) { if ((i + j) < pattern_width) { - sub_elements[j + (reader * 21) + 2] = elements[i + j]; + sub_elements[j + (reader * 21) + 2] = elements[i + j]; } elements_in_sub++; } } else { /* right to left */ - left_to_right = 0; i = 2 + (((current_row * symbol->option_2) - reader - 1) * 21); for (j = 0; j < 21; j++) { if ((i + j) < pattern_width) { - sub_elements[(20 - j) + (reader * 21) + 2] = elements[i + j]; + sub_elements[(20 - j) + (reader * 21) + 2] = elements[i + j]; } elements_in_sub++; } @@ -1637,122 +1570,40 @@ INTERNAL int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int writer = 0; for (i = 0; i < elements_in_sub; i++) { - for (j = 0; j < sub_elements[i]; j++) { - if (latch == '1') { - set_module(symbol, symbol->rows, writer); - } else { - unset_module(symbol, symbol->rows, writer); - } - writer++; - } - if (latch == '1') { - latch = '0'; - } else { - latch = '1'; - } + writer = rss_expand(symbol, writer, &latch, sub_elements[i]); } if (symbol->width < writer) { symbol->width = writer; } if (current_row != 1) { + int odd_last_row = (current_row == stack_rows) && (data_chars % 2 == 0); + /* middle separator pattern (above current row) */ for (j = 5; j < (49 * symbol->option_2); j += 2) { set_module(symbol, symbol->rows - 2, j); } symbol->row_height[symbol->rows - 2] = 1; + /* bottom separator pattern (above current row) */ - for (j = 4 + special_case_row; j < (writer - 4); j++) { - if (module_is_set(symbol, symbol->rows, j)) { - unset_module(symbol, symbol->rows - 1, j); - } else { - set_module(symbol, symbol->rows - 1, j); - } - } + rssexp_separator(symbol, writer, reader, symbol->rows - 1, 1 /*above*/, special_case_row, left_to_right, odd_last_row, &v2_latch); symbol->row_height[symbol->rows - 1] = 1; - /* finder bar adjustment */ - for (j = 0; j < reader; j++) { - k = (49 * j) + 18 + special_case_row; - if (left_to_right) { - for (i = 0; i < 15; i++) { - if ((!(module_is_set(symbol, symbol->rows, i + k - 1))) && - (!(module_is_set(symbol, symbol->rows, i + k))) && - module_is_set(symbol, symbol->rows - 1, i + k - 1)) { - unset_module(symbol, symbol->rows - 1, i + k); - } - } - } else { - if ((current_row == stack_rows) && (data_chars % 2 == 0)) { - k -= 18; - } - for (i = 14; i >= 0; i--) { - if ((!(module_is_set(symbol, symbol->rows, i + k + 1))) && - (!(module_is_set(symbol, symbol->rows, i + k))) && - module_is_set(symbol, symbol->rows - 1, i + k + 1)) { - unset_module(symbol, symbol->rows - 1, i + k); - } - } - } - } } if (current_row != stack_rows) { /* top separator pattern (below current row) */ - for (j = 4; j < (writer - 4); j++) { - if (module_is_set(symbol, symbol->rows, j)) { - unset_module(symbol, symbol->rows + 1, j); - } else { - set_module(symbol, symbol->rows + 1, j); - } - } + rssexp_separator(symbol, writer, reader, symbol->rows + 1, -1 /*below*/, 0 /*special_case_row*/, left_to_right, 0 /*odd_last_row*/, &v2_latch); symbol->row_height[symbol->rows + 1] = 1; - /* finder bar adjustment */ - for (j = 0; j < reader; j++) { - k = (49 * j) + 18; - if (left_to_right) { - for (i = 0; i < 15; i++) { - if ((!(module_is_set(symbol, symbol->rows, i + k - 1))) && - (!(module_is_set(symbol, symbol->rows, i + k))) && - module_is_set(symbol, symbol->rows + 1, i + k - 1)) { - unset_module(symbol, symbol->rows + 1, i + k); - } - } - } else { - for (i = 14; i >= 0; i--) { - if ((!(module_is_set(symbol, symbol->rows, i + k + 1))) && - (!(module_is_set(symbol, symbol->rows, i + k))) && - module_is_set(symbol, symbol->rows + 1, i + k + 1)) { - unset_module(symbol, symbol->rows + 1, i + k); - } - } - } - } } symbol->rows = symbol->rows + 4; } symbol->rows = symbol->rows - 3; - if (symbol->symbology == BARCODE_RSS_EXPSTACK_CC) { - for (j = 4; j < (symbol->width - 4); j++) { - if (module_is_set(symbol, separator_row + 1, j)) { - unset_module(symbol, separator_row, j); - } else { - set_module(symbol, separator_row, j); - } - } - /* finder bar adjustment */ - for (j = 0; j < reader; j++) { - k = (49 * j) + 18; - for (i = 0; i < 15; i++) { - if ((!(module_is_set(symbol, separator_row + 1, i + k - 1))) && - (!(module_is_set(symbol, separator_row + 1, i + k))) && - module_is_set(symbol, separator_row, i + k - 1)) { - unset_module(symbol, separator_row, i + k); - } - } - } - } + } + if (symbol->symbology == BARCODE_RSS_EXP_CC || symbol->symbology == BARCODE_RSS_EXPSTACK_CC) { + /* Composite separator */ + rssexp_separator(symbol, symbol->width, 4, separator_row, 1 /*above*/, 0 /*special_case_row*/, 1 /*left_to_right*/, 0 /*odd_last_row*/, NULL); } for (i = 0; i < symbol->rows; i++) { diff --git a/backend/rss.h b/backend/rss.h index d6c1fb95..5676a572 100644 --- a/backend/rss.h +++ b/backend/rss.h @@ -2,7 +2,7 @@ /* libzint - the open source barcode library - Copyright (C) 2007-2017 Robin Stuart + Copyright (C) 2007 - 2020 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -56,7 +56,6 @@ static const char widest_even[9] = { 1, 3, 5, 6, 8, 7, 5, 3, 1 }; -static int widths[8]; static const char finder_pattern[45] = { 3, 8, 2, 1, 1, 3, 5, 5, 1, 1, diff --git a/backend/tests/CMakeLists.txt b/backend/tests/CMakeLists.txt index f3f55690..492bc8a9 100644 --- a/backend/tests/CMakeLists.txt +++ b/backend/tests/CMakeLists.txt @@ -22,6 +22,14 @@ else() add_definitions(-DNO_PNG) endif() +set(BWIPP_TAR ${CMAKE_CURRENT_SOURCE_DIR}/tools/bwipp_dump.ps.tar.xz) +set(BWIPP_PS ${CMAKE_CURRENT_SOURCE_DIR}/tools/bwipp_dump.ps) + +if(NOT EXISTS ${BWIPP_PS}) + execute_process(COMMAND ${CMAKE_COMMAND} -E tar -xf ${BWIPP_TAR} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/tools) +endif() + if(${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU") if(ZINT_DEBUG) add_compile_options("-g") diff --git a/backend/tests/test_channel.c b/backend/tests/test_channel.c index 2882bdae..6eaf2643 100644 --- a/backend/tests/test_channel.c +++ b/backend/tests/test_channel.c @@ -122,6 +122,8 @@ static void test_encode(int index, int generate, int debug) { testStart(""); + int do_bwipp = (debug & ZINT_DEBUG_TEST_BWIPP) && testUtilHaveGhostscript(); // Only do BWIPP test if asked, too slow otherwise + int ret; struct item { int option_2; @@ -348,6 +350,8 @@ static void test_encode(int index, int generate, int debug) { int data_size = ARRAY_SIZE(data); char escaped[1024]; + char bwipp_buf[8192]; + char bwipp_msg[1024]; for (int i = 0; i < data_size; i++) { @@ -377,6 +381,15 @@ static void test_encode(int index, int generate, int debug) { 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); } + + if (do_bwipp && testUtilCanBwipp(symbol->symbology, -1, data[i].option_2, -1, debug)) { + ret = testUtilBwipp(symbol, -1, data[i].option_2, -1, data[i].data, length, NULL, bwipp_buf, sizeof(bwipp_buf)); + assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(symbol->symbology), ret); + + ret = testUtilBwippCmp(symbol, bwipp_msg, bwipp_buf, data[i].expected); + assert_zero(ret, "i:%d %s testUtilBwippCmp %d != 0 %s\n actual: %s\nexpected: %s\n", + i, testUtilBarcodeName(symbol->symbology), ret, bwipp_msg, bwipp_buf, data[i].expected); + } } } diff --git a/backend/tests/test_codablock.c b/backend/tests/test_codablock.c index 7b757540..83ddbf89 100644 --- a/backend/tests/test_codablock.c +++ b/backend/tests/test_codablock.c @@ -320,6 +320,8 @@ static void test_encode(int index, int generate, int debug) { testStart(""); + int do_bwipp = (debug & ZINT_DEBUG_TEST_BWIPP) && testUtilHaveGhostscript(); // Only do BWIPP test if asked, too slow otherwise + int ret; struct item { int symbology; @@ -330,54 +332,55 @@ static void test_encode(int index, int generate, int debug) { int expected_rows; int expected_width; + int bwipp_cmp; char *comment; char *expected; }; struct item data[] = { - /* 0*/ { BARCODE_CODABLOCKF, 1, -1, "AIM", 0, 1, 68, "Same as CODE128", + /* 0*/ { BARCODE_CODABLOCKF, 1, -1, "AIM", 0, 1, 68, 1, "Same as CODE128 (not supported by BWIPP)", "11010010000101000110001100010001010111011000101110110001100011101011" }, - /* 1*/ { BARCODE_CODABLOCKF, -1, -1, "AAAAAAA", 0, 3, 101, "Defaults to rows 3, columns 9 (4 data); verified manually against bwipp and tec-it", + /* 1*/ { BARCODE_CODABLOCKF, -1, -1, "AAAAAAA", 0, 3, 101, 1, "Defaults to rows 3, columns 9 (4 data); verified manually against tec-it", "11010000100101111011101001011000010100011000101000110001010001100010100011000110110011001100011101011" "11010000100101111011101100010010010100011000101000110001010001100010111011110100100111101100011101011" "11010000100101111011101011001110010111011110101111011101100001010011011101110111100101001100011101011" }, - /* 2*/ { BARCODE_CODABLOCKF, -1, -1, "AAAAAAAAAA", 0, 3, 101, "Defaults to rows 3, columns 9 (4 data); verified manually against bwipp and tec-it", + /* 2*/ { BARCODE_CODABLOCKF, -1, -1, "AAAAAAAAAA", 0, 3, 101, 1, "Defaults to rows 3, columns 9 (4 data); verified manually against tec-it", "11010000100101111011101001011000010100011000101000110001010001100010100011000110110011001100011101011" "11010000100101111011101100010010010100011000101000110001010001100010100011000111101000101100011101011" "11010000100101111011101011001110010100011000101000110001110110010010010110000111000101101100011101011" }, - /* 3*/ { BARCODE_CODABLOCKF, -1, -1, "AAAAAAAAAAA", 0, 4, 101, "Defaults to rows 4, columns 9 (4 data); verified manually against bwipp and tec-it", + /* 3*/ { BARCODE_CODABLOCKF, -1, -1, "AAAAAAAAAAA", 0, 4, 101, 1, "Defaults to rows 4, columns 9 (4 data); verified manually against tec-it", "11010000100101111011101001000011010100011000101000110001010001100010100011000110011001101100011101011" "11010000100101111011101100010010010100011000101000110001010001100010100011000111101000101100011101011" "11010000100101111011101011001110010100011000101000110001010001100010111011110100111101001100011101011" "11010000100101111011101001101110010111011110101111011101110101100011101100100110010111001100011101011" }, - /* 4*/ { BARCODE_CODABLOCKF, -1, -1, "AAAAAAAAAAAAAA", 0, 4, 101, "Defaults to rows 4, columns 9 (4 data); verified manually against bwipp and tec-it", + /* 4*/ { BARCODE_CODABLOCKF, -1, -1, "AAAAAAAAAAAAAA", 0, 4, 101, 1, "Defaults to rows 4, columns 9 (4 data); verified manually against tec-it", "11010000100101111011101001000011010100011000101000110001010001100010100011000110011001101100011101011" "11010000100101111011101100010010010100011000101000110001010001100010100011000111101000101100011101011" "11010000100101111011101011001110010100011000101000110001010001100010100011000101111011101100011101011" "11010000100101111011101001101110010100011000101000110001011110100010111011000100110000101100011101011" }, - /* 5*/ { BARCODE_CODABLOCKF, -1, -1, "AAAAAAAAAAAAAAA", 0, 5, 101, "Defaults to rows 5, columns 9 (4 data); verified manually against bwipp (columns=4) and tec-it", + /* 5*/ { BARCODE_CODABLOCKF, -1, -1, "AAAAAAAAAAAAAAA", 0, 5, 101, 1, "Defaults to rows 5, columns 9 (4 data); verified manually against tec-it", "11010000100101111011101000010110010100011000101000110001010001100010100011000100100011001100011101011" "11010000100101111011101100010010010100011000101000110001010001100010100011000111101000101100011101011" "11010000100101111011101011001110010100011000101000110001010001100010100011000101111011101100011101011" "11010000100101111011101001101110010100011000101000110001010001100010111011110111101001001100011101011" "11010000100101111011101001100111010111011110101111011101000110001010111101000110001010001100011101011" }, - /* 6*/ { BARCODE_CODABLOCKF, -1, 14, "AAAAAAAAAAAAAAA", 0, 2, 156, "Rows 2, columns 14 (9 data); verified manually against bwipp (columns=9) and tec-it", + /* 6*/ { BARCODE_CODABLOCKF, -1, 14, "AAAAAAAAAAAAAAA", 0, 2, 156, 1, "Rows 2, columns 14 (9 data); verified manually against tec-it", "110100001001011110111010100001100101000110001010001100010100011000101000110001010001100010100011000101000110001010001100010100011000110001000101100011101011" "110100001001011110111011000100100101000110001010001100010100011000101000110001010001100010100011000101110111101110111101011011000110111000101101100011101011" }, - /* 7*/ { BARCODE_CODABLOCKF, -1, -1, "AAAAAAAAAAAAAAAA", 0, 5, 101, "Defaults to rows 5, columns 9 (4 data); verified manually against bwipp (columns=4) and tec-it", + /* 7*/ { BARCODE_CODABLOCKF, -1, -1, "AAAAAAAAAAAAAAAA", 0, 5, 101, 1, "Defaults to rows 5, columns 9 (4 data); verified manually against tec-it", "11010000100101111011101000010110010100011000101000110001010001100010100011000100100011001100011101011" "11010000100101111011101100010010010100011000101000110001010001100010100011000111101000101100011101011" "11010000100101111011101011001110010100011000101000110001010001100010100011000101111011101100011101011" "11010000100101111011101001101110010100011000101000110001010001100010100011000111101011101100011101011" "11010000100101111011101001100111010111011110101111011101011100011010001100010100011101101100011101011" }, - /* 8*/ { BARCODE_CODABLOCKF, -1, -1, "AAAAAAAAAAAAAAAAAAAAAAAAA", 0, 6, 112, "Defaults to rows 6, columns 10 (5 data); verified manually against bwipp (columns=5) and tec-it", + /* 8*/ { BARCODE_CODABLOCKF, -1, -1, "AAAAAAAAAAAAAAAAAAAAAAAAA", 0, 6, 112, 1, "Defaults to rows 6, columns 10 (5 data); verified manually against tec-it", "1101000010010111101110100001001101010001100010100011000101000110001010001100010100011000110110001101100011101011" "1101000010010111101110110001001001010001100010100011000101000110001010001100010100011000110010011101100011101011" "1101000010010111101110101100111001010001100010100011000101000110001010001100010100011000110011101001100011101011" @@ -385,23 +388,23 @@ static void test_encode(int index, int generate, int debug) { "1101000010010111101110100110011101010001100010100011000101000110001010001100010100011000111001001101100011101011" "1101000010010111101110101110011001011101111010111101110101110111101110100011010100001100110001010001100011101011" }, - /* 9*/ { BARCODE_CODABLOCKF, 4, -1, "CODABLOCK F 34567890123456789010040digit", 0, 4, 145, "AIM ISS-X-24 Figure 1", + /* 9*/ { BARCODE_CODABLOCKF, 4, -1, "CODABLOCK F 34567890123456789010040digit", 0, 4, 145, 1, "AIM ISS-X-24 Figure 1", "1101000010010111101110100100001101000100011010001110110101100010001010001100010001011000100011011101000111011010001000110110110011001100011101011" "1101000010010111101110110001001001011000111011011001100100011000101101100110010111011110100010110001110001011011000010100101100111001100011101011" "1101000010010111011110100011011101101111011010110011100100010110001110001011011000010100110111101101100100010010010001100100011000101100011101011" "1101000010010111101110100110111001001110110010000100110100001101001001101000010000110100100111101001101110111010111000110110010000101100011101011" }, - /* 10*/ { BARCODE_CODABLOCKF, 3, -1, "CODABLOCK F Symbology", 0, 3, 145, "AIM ISS-X-24 Figure on front page", + /* 10*/ { BARCODE_CODABLOCKF, 3, -1, "CODABLOCK F Symbology", 0, 3, 145, 1, "AIM ISS-X-24 Figure on front page", "1101000010010111101110100101100001000100011010001110110101100010001010001100010001011000100011011101000111011010001000110111010111101100011101011" "1101000010010111101110110001001001011000111011011001100100011000101101100110011011101000110110111101111011101010010000110100100111101100011101011" "1101000010010111101110101100111001000111101011001010000100011110101001101000011011011110101110111101000011001011011101110101001111001100011101011" }, - /* 11*/ { BARCODE_HIBC_BLOCKF, 3, -1, "A123BJC5D6E71", 0, 3, 123, "Verified manually against tec-it; differs from bwipp (columns=6) which uses Code C for final 71 (same no. of codewords)", + /* 11*/ { BARCODE_HIBC_BLOCKF, 3, -1, "A123BJC5D6E71", 0, 3, 123, 0, "Verified manually against tec-it; differs from BWIPP (columns=6) which uses Code C for final 71 (same no. of codewords)", "110100001001011110111010010110000110001001001010001100010011100110110011100101100101110010001011000100100001101100011101011" "110100001001011110111011000100100101101110001000100011011011100100101100010001100111010010001101000111001001101100011101011" "110100001001011110111010110011100111011011101001110011011010001000101110111101011100011011001110100100100110001100011101011" }, - /* 12*/ { BARCODE_HIBC_BLOCKF, -1, -1, "$$52001510X3G", 0, 4, 101, "Verified manually against bwipp (columns=4); tec-it differs as adds unnecessary Code C at end of 1st line", + /* 12*/ { BARCODE_HIBC_BLOCKF, -1, -1, "$$52001510X3G", 0, 4, 101, 1, "tec-it differs as adds unnecessary Code C at end of 1st line", "11010000100101111011101001000011011000100100100100011001001000110011011100100101110011001100011101011" "11010000100101110111101011000111011001001110110011011001101110100010111101110100001100101100011101011" "11010000100101111011101011001110010011101100111000101101100101110011010001000100100011001100011101011" @@ -411,6 +414,8 @@ static void test_encode(int index, int generate, int debug) { int data_size = ARRAY_SIZE(data); char escaped[1024]; + char bwipp_buf[8192]; + char bwipp_msg[1024]; for (int i = 0; i < data_size; i++) { @@ -425,9 +430,9 @@ static void test_encode(int index, int generate, int debug) { 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, %d, %d, \"%s\", %s, %d, %d, \"%s\",\n", + printf(" /*%3d*/ { %s, %d, %d, \"%s\", %s, %d, %d, %d, \"%s\",\n", i, testUtilBarcodeName(data[i].symbology), data[i].option_1, data[i].option_2, testUtilEscape(data[i].data, length, escaped, sizeof(escaped)), - testUtilErrorName(data[i].ret), symbol->rows, symbol->width, data[i].comment); + testUtilErrorName(data[i].ret), symbol->rows, data[i].bwipp_cmp, symbol->width, data[i].comment); testUtilModulesDump(symbol, " ", "\n"); printf(" },\n"); } else { @@ -440,6 +445,19 @@ static void test_encode(int index, int generate, int debug) { 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); } + + if (do_bwipp && testUtilCanBwipp(symbol->symbology, data[i].option_1, data[i].option_2, -1, debug)) { + if (!data[i].bwipp_cmp) { + if (debug & ZINT_DEBUG_TEST_PRINT) printf("%d: %s skipped, not BWIPP compatible\n", i, testUtilBarcodeName(symbol->symbology)); + } else { + ret = testUtilBwipp(symbol, data[i].option_1, data[i].option_2, -1, data[i].data, length, NULL, bwipp_buf, sizeof(bwipp_buf)); + assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(data[i].symbology), ret); + + ret = testUtilBwippCmp(symbol, bwipp_msg, bwipp_buf, data[i].expected); + assert_zero(ret, "i:%d %s testUtilBwippCmp %d != 0 %s\n actual: %s\nexpected: %s\n", + i, testUtilBarcodeName(data[i].symbology), ret, bwipp_msg, bwipp_buf, data[i].expected); + } + } } } diff --git a/backend/tests/test_code.c b/backend/tests/test_code.c index bffc7f8a..50cd81a9 100644 --- a/backend/tests/test_code.c +++ b/backend/tests/test_code.c @@ -241,6 +241,8 @@ static void test_encode(int index, int generate, int debug) { testStart(""); + int do_bwipp = (debug & ZINT_DEBUG_TEST_BWIPP) && testUtilHaveGhostscript(); // Only do BWIPP test if asked, too slow otherwise + int ret; struct item { int symbology; @@ -337,6 +339,8 @@ static void test_encode(int index, int generate, int debug) { int data_size = ARRAY_SIZE(data); char escaped[1024]; + char bwipp_buf[8192]; + char bwipp_msg[1024]; for (int i = 0; i < data_size; i++) { @@ -366,6 +370,15 @@ static void test_encode(int index, int generate, int debug) { 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); } + + if (do_bwipp && testUtilCanBwipp(symbol->symbology, -1, data[i].option_2, -1, debug)) { + ret = testUtilBwipp(symbol, -1, data[i].option_2, -1, data[i].data, length, NULL, bwipp_buf, sizeof(bwipp_buf)); + assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(data[i].symbology), ret); + + ret = testUtilBwippCmp(symbol, bwipp_msg, bwipp_buf, data[i].expected); + assert_zero(ret, "i:%d %s testUtilBwippCmp %d != 0 %s\n actual: %s\nexpected: %s\n", + i, testUtilBarcodeName(data[i].symbology), ret, bwipp_msg, bwipp_buf, data[i].expected); + } } } diff --git a/backend/tests/test_code128.c b/backend/tests/test_code128.c index d9a2ba61..a3e41743 100644 --- a/backend/tests/test_code128.c +++ b/backend/tests/test_code128.c @@ -432,6 +432,8 @@ static void test_encode(int index, int generate, int debug) { testStart(""); + int do_bwipp = (debug & ZINT_DEBUG_TEST_BWIPP) && testUtilHaveGhostscript(); // Only do BWIPP test if asked, too slow otherwise + int ret; struct item { int symbology; @@ -521,10 +523,10 @@ static void test_encode(int index, int generate, int debug) { /* 24*/ { BARCODE_EAN128, GS1_MODE, "[00]340433935039756615", 0, 1, 156, "DHL Identcode https://www.dhl.de/de/geschaeftskunden/paket/information/geschaeftskunden/abrechnung/leitcodierung.html", "110100111001111010111011011001100100010110001001000110010100011000101000111101100010111011010001000110000100101001000011010111001100100111001101100011101011" }, - /* 25*/ { BARCODE_EAN14, GS1_MODE, "4070071967072", 0, 1, 134, "Verified manually against bwipp and tec-it", + /* 25*/ { BARCODE_EAN14, GS1_MODE, "4070071967072", 0, 1, 134, "Verified manually against tec-it", "11010011100111101011101100110110011000101000101100001001001100010011001011100100001011001001100010011001001110110111001001100011101011" }, - /* 26*/ { BARCODE_NVE18, GS1_MODE, "40700000071967072", 0, 1, 156, "Verified manually against bwipp (sscc18) and tec-it", + /* 26*/ { BARCODE_NVE18, GS1_MODE, "40700000071967072", 0, 1, 156, "Verified manually against tec-it", "110100111001111010111011011001100110001010001011000010011011001100110110011001001100010011001011100100001011001001100010011001001110110111011101100011101011" }, /* 27*/ { BARCODE_HIBC_128, UNICODE_MODE, "83278F8G9H0J2G", 0, 1, 211, "ANSI/HIBC 2.6 - 2016 Section 4.1, not same, uses different encoding (eg begins StartA instead of StartB)", @@ -540,6 +542,8 @@ static void test_encode(int index, int generate, int debug) { int data_size = sizeof(data) / sizeof(struct item); char escaped[1024]; + char bwipp_buf[8192]; + char bwipp_msg[1024]; for (int i = 0; i < data_size; i++) { @@ -569,6 +573,15 @@ static void test_encode(int index, int generate, int debug) { 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); } + + if (do_bwipp && testUtilCanBwipp(symbol->symbology, -1, -1, -1, debug)) { + ret = testUtilBwipp(symbol, -1, -1, -1, data[i].data, length, NULL, bwipp_buf, sizeof(bwipp_buf)); + assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(data[i].symbology), ret); + + ret = testUtilBwippCmp(symbol, bwipp_msg, bwipp_buf, data[i].expected); + assert_zero(ret, "i:%d %s testUtilBwippCmp %d != 0 %s\n actual: %s\nexpected: %s\n", + i, testUtilBarcodeName(data[i].symbology), ret, bwipp_msg, bwipp_buf, data[i].expected); + } } } diff --git a/backend/tests/test_composite.c b/backend/tests/test_composite.c index 87c2ed5e..c98eec27 100644 --- a/backend/tests/test_composite.c +++ b/backend/tests/test_composite.c @@ -38,8 +38,8 @@ static void test_eanx_leading_zeroes(int index, int debug) { int ret; struct item { int symbology; - unsigned char *data; - unsigned char *composite; + char *data; + char *composite; int ret; int expected_rows; @@ -90,10 +90,13 @@ static void test_eanx_leading_zeroes(int index, int debug) { int composite_length = strlen(data[i].composite); - ret = ZBarcode_Encode(symbol, data[i].composite, composite_length); - assert_equal(ret, data[i].ret, "i:%d ret %d != %d\n", i, ret, data[i].ret); - assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d\n", i, symbol->rows, data[i].expected_rows); - assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d\n", i, symbol->width, data[i].expected_width); + ret = ZBarcode_Encode(symbol, (const unsigned char *) data[i].composite, composite_length); + assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt); + + if (ret < 5) { + assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d\n", i, symbol->rows, data[i].expected_rows); + assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d\n", i, symbol->width, data[i].expected_width); + } ZBarcode_Delete(symbol); } @@ -101,41 +104,57 @@ static void test_eanx_leading_zeroes(int index, int debug) { testFinish(); } -static void test_helper_generate(const struct zint_symbol *symbol, int ret, int i, unsigned char *data, unsigned char *composite, int option_1, int option_2, int option_3, char *comment) { +static void test_helper_generate(const struct zint_symbol *symbol, int ret, int i, char *data, char *composite, int option_1, char *comment, int bwipp_cmp) { + char esc_data[1024]; + char esc_composite[4096]; + + testUtilEscape(data, strlen(data), esc_data, sizeof(esc_data)); + testUtilEscape(composite, strlen(composite), esc_composite, sizeof(esc_composite)); + if (ret == 0) { - printf(" /*%2d*/ { %s, \"%s\", \"%s\", %d, %d, %d, %d, %d, %d, \"%s\",\n", - i, testUtilBarcodeName(symbol->symbology), data, composite, option_1, option_2, option_3, ret, symbol->rows, symbol->width, comment); + if (bwipp_cmp == -1) { + printf(" /*%2d*/ { %s, %d, \"%s\", \"%s\", %d, %d, %d, \"%s\",\n", + i, testUtilBarcodeName(symbol->symbology), option_1, esc_data, esc_composite, ret, symbol->rows, symbol->width, comment); + } else { + printf(" /*%2d*/ { %s, %d, \"%s\", \"%s\", %d, %d, %d, %d, \"%s\",\n", + i, testUtilBarcodeName(symbol->symbology), option_1, esc_data, esc_composite, ret, symbol->rows, symbol->width, bwipp_cmp, comment); + } testUtilModulesDump(symbol, " ", "\n"); printf(" },\n"); } else { - printf(" /*%2d*/ { %s, \"%s\", \"%s\", %d, %d, %d, %s, %d, %d, \"%s\", \"\" },\n", - i, testUtilBarcodeName(symbol->symbology), data, composite, option_1, option_2, option_3, testUtilErrorName(ret), symbol->rows, symbol->width, comment); + if (bwipp_cmp == -1) { + printf(" /*%2d*/ { %s, %d, \"%s\", \"%s\", %s, %d, %d, \"%s\", \"\" },\n", + i, testUtilBarcodeName(symbol->symbology), option_1, esc_data, esc_composite, testUtilErrorName(ret), symbol->rows, symbol->width, comment); + } else { + printf(" /*%2d*/ { %s, %d, \"%s\", \"%s\", %s, %d, %d, %d, \"%s\", \"\" },\n", + i, testUtilBarcodeName(symbol->symbology), option_1, esc_data, esc_composite, testUtilErrorName(ret), symbol->rows, symbol->width, bwipp_cmp, comment); + } } } -// Replicate examples from GS1 General Specifications 19.1 and ISO/IEC 24723:2010 +// Replicate examples from GS1 General Specifications 20.0 and ISO/IEC 24723:2010 static void test_examples(int index, int generate, int debug) { testStart(""); + int do_bwipp = (debug & ZINT_DEBUG_TEST_BWIPP) && testUtilHaveGhostscript(); // Only do BWIPP test if asked, too slow otherwise + int ret; struct item { int symbology; - unsigned char *data; - unsigned char *composite; int option_1; - int option_2; - int option_3; + char *data; + char *composite; int ret; int expected_rows; int expected_width; char *comment; - unsigned char *expected; + char *expected; }; - // Verified manually against GS1 General Specifications 19.1 and ISO/IEC 24723:2010, with noted exceptions + // Verified manually against GS1 General Specifications 20.0 (GGS) and ISO/IEC 24723:2010, with noted exceptions, and verified via bwipp_dump.ps against BWIPP struct item data[] = { - /* 0*/ { BARCODE_RSS14_OMNI_CC, "0401234567890", "[17]050101[10]ABC123", 1, 0, 0, 0, 11, 56, "Figure 5.1-5. GS1 DataBar Stacked Omnidirectional barcode with a Composite Component", + /* 0*/ { BARCODE_RSS14_OMNI_CC, 1, "0401234567890", "[17]050101[10]ABC123", 0, 11, 56, "GSS Figure 5.1-5. GS1 DataBar Stacked Omnidirectional barcode with a Composite Component", "01101100110101110001001100001000000110100111011110101001" "01101101110110001100010100001100001000010110011100101001" "01101101100111000101110001101001100011111010011101101001" @@ -148,7 +167,7 @@ static void test_examples(int index, int generate, int debug) { "00001000110000101010000000101010111011001111000000000000" "10100111001111010101111111000001000100110000110101000000" }, - /* 1*/ { BARCODE_RSS_LTD_CC, "1311234567890", "[17]010615[10]A123456", 1, 0, 0, 0, 6, 74, "Figure 5.9.2-1. GS1 DataBar Limited Composite symbol with CC-A", + /* 1*/ { BARCODE_RSS_LTD_CC, 1, "1311234567890", "[17]010615[10]A123456", 0, 6, 74, "GGS Figure 5.9.2-1. (24723:2010 Figure 1) GS1 DataBar Limited Composite symbol with CC-A", "01111000101101100010100110001111101001100111011101001111001110111010011010" "01001111100011010010101110001111011110101111010011110111001110111010111010" "01001100110100000010101100001110010001101111011110111100101000111010110010" @@ -156,7 +175,7 @@ static void test_examples(int index, int generate, int debug) { "00000011000001010100110011101010110101001100101011110001011001101001110000" "01011100111110101011001100010101001010110011010100001110100110010110000101" }, - /* 2*/ { BARCODE_EAN128_CC, "[01]03812345678908", "[10]ABCD123456[410]3898765432108", 3, 0, 0, 0, 7, 154, "Figure 5.9.2-2. GS1-128 Composite symbol with CC-C **NOT SAME** (uses encodation '10')", + /* 2*/ { BARCODE_EAN128_CC, 3, "[01]03812345678908", "[10]ABCD123456[410]3898765432108", 0, 7, 154, "GGS Figure 5.9.2-2. GS1-128 Composite symbol with CC-C **NOT SAME** as zint uses encodation '10', same if '0' forced", "1111111101010100011110101011110000111101011001111101110111110111010010000010000100010110010000101100001111011110110011011110101001111000111111101000101001" "1111111101010100011111101010001110100001000111101001100101110010000011100001011000100100100111110110001011100001011111011111101010111000111111101000101001" "1111111101010100011101010011111100110001111010001101000101011110000010001111101100010111101101111101001001011000111110011101010001111110111111101000101001" @@ -165,7 +184,16 @@ static void test_examples(int index, int generate, int debug) { "0000000001011000110000101000100110010011011011001110110100001100010010001010001001110111101001100100100001011100110110100001000100100001001001110001010000" "0000000110100111001111010111011001101100100100110001001011110011101101110101110110001000010110011011011110100011001001011110111011011110110110001110101100" }, - /* 3*/ { BARCODE_EANX_CC, "331234567890", "[21]1234-abcd", 1, 0, 0, 0, 7, 99, "Figure 5.9.8-1. EAN-13 symbol with a four-column CC-A component (note [21] not [99])", + /* 3*/ { BARCODE_EAN128_CC, 3, "[01]93812345678901", "[10]ABCD123456[410]3898765432108", 0, 7, 154, "24723:2010 Figure 2 GS1-128 Composite symbol with 5-row CC-C **NOT SAME** ditto as above", + "1111111101010100011110101011110000111101011001111101110111110111010010000010000100010110010000101100001111011110110011011110101001111000111111101000101001" + "1111111101010100011111101010001110100001000111101001100101110010000011100001011000100100100111110110001011100001011111011111101010111000111111101000101001" + "1111111101010100011101010011111100110001111010001101000101011110000010001111101100010111101101111101001001011000111110011101010001111110111111101000101001" + "1111111101010100010101111001111000110010011001110001111010100111100010011110111101000110000110001000101100001011101111011111010111111010111111101000101001" + "1111111101010100011101011100001100101000111111011101011110001001111011111011001000100111100111011101001101101111001000011101011100110000111111101000101001" + "0000000001011000110000101000100110010011010111000010110100001100010010001010001001110111101001100100100001001100100110100001000100001001001001110001010000" + "0000000110100111001111010111011001101100101000111101001011110011101101110101110110001000010110011011011110110011011001011110111011110110110110001110101100" + }, + /* 4*/ { BARCODE_EANX_CC, 1, "331234567890", "[21]1234-abcd", 0, 7, 99, "GGS Figure 5.9.8-1. EAN-13 symbol with a four-column CC-A component (note [21] not [99])", "110110111011010000100000110100110011101100001001110100100001011001100001100111000110001011011000101" "110110110011000110111100010111011001110000101001100100100000010111101001101011100010000011001000101" "110110100010011010001110000111111010001100101001100110111111010001101001010000011011111011101000101" @@ -174,7 +202,16 @@ static void test_examples(int index, int generate, int debug) { "000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010" "000101011110100110010011011010000100111010110001010101010000100010010010001110100111001010000101010" }, - /* 4*/ { BARCODE_UPCA_CC, "61414101234", "[91]abcdefghijklmnopqrstuvwxyz", 2, 0, 0, 0, 14, 99, "Figure 5.9.8-2. UPC-A symbol with a four-column CC-B component **NOT SAME** (using [91] not [10] as length > 20 max for [10])", + /* 5*/ { BARCODE_EANX_CC, 1, "331234567890", "[99]1234-abcd", 0, 7, 99, "24723:2010 Figure 5 An EAN-13 composite symbol (with CC-A)", + "110110111011100110111011110100010100000010001001110100111011010110000001100110010000100011011000101" + "110110110011100010011101100111110001000101101001100100100001101011111101101011100010000011001000101" + "110110100010001011101111110110011100100011101001100110100000011101011001011110001001000011101000101" + "000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010" + "001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001" + "000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010" + "000101011110100110010011011010000100111010110001010101010000100010010010001110100111001010000101010" + }, + /* 6*/ { BARCODE_UPCA_CC, 2, "61414101234", "[91]abcdefghijklmnopqrstuvwxyz", 0, 14, 99, "GGS Figure 5.9.8-2. UPC-A symbol with a four-column CC-B component **NOT SAME** (using [91] not [10] as length > 20 max for [10])", "110001001010000001110010110110011111101100101001111010100100101111000001110101001111110011000100101" "111001001011101110101000000111101101000111001011111010100011000110000101110011010000110011100100101" "111101001011110110001101000111101000100000101011110010101001111001000001011111010001110011110100101" @@ -190,7 +227,7 @@ static void test_examples(int index, int generate, int debug) { "000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010" "000101010111100110010100011001100101000110011001010101110010110011011011001000010101110010000101010" }, - /* 5*/ { BARCODE_EANX_CC, "1234567", "[21]A12345678", -1, 0, 0, 0, 8, 72, "Figure 5.9.8-3. EAN-8 symbol with a three-column CC-A", + /* 7*/ { BARCODE_EANX_CC, -1, "1234567", "[21]A12345678", 0, 8, 72, "GGS Figure 5.9.8-3. (24723:2010 Figure 4) EAN-8 symbol with a three-column CC-A", "101001111000001001010011000111110101110111101001101001111110011101001101" "111110010011100101010111000101110011011100001111110100011001011101011101" "110011001000010001010110000101000001000010001001000110110000011101011001" @@ -200,7 +237,7 @@ static void test_examples(int index, int generate, int debug) { "000010000000000000000000000000000000000000000000000000000000000000000010" "000010100110010010011011110101000110101010011101010000100010011100101010" }, - /* 6*/ { BARCODE_UPCE_CC, "121230", "[15]021231", 1, 0, 0, 0, 9, 55, "Figure 5.9.8-4. UPC-E symbol with a two-column CC-A", + /* 8*/ { BARCODE_UPCE_CC, 1, "0121230", "[15]021231", 0, 9, 55, "GGS Figure 5.9.8-4. (24723:2010 Figure 3) UPC-E symbol with a two-column CC-A", "1101100110111010011111010001100111100010110011110101001" "1101101110110010010000110001101000011011100011100101001" "1101101100111101001000000101000101111000010011101101001" @@ -211,14 +248,14 @@ static void test_examples(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010110011001001100110010011011011110101001110101010" }, - /* 7*/ { BARCODE_RSS14_CC, "0361234567890", "[11]990102", 1, 0, 0, 0, 5, 100, "Figure 5.9.8-5. GS1 DataBar Omnidirectional symbol with a four-column CC-A", + /* 9*/ { BARCODE_RSS14_CC, 1, "0361234567890", "[11]990102", 0, 5, 100, "GGS Figure 5.9.8-5. (24723:2010 Figure 8) GS1 DataBar Omnidirectional symbol with a four-column CC-A", "1101101110110000101000110001111001010111100010011101001110011101100110011001001100111000110110001010" "1101101100110111011111001001000011010111111010011001001101000000111010010010111111001110110010001010" "1101101000110010010111110001011001101111000010011001101111010011110010010000011001011100111010001010" "0000000000010110001110100000000101001011010111111011001101010000011010000000010100101000110011110000" "0000010011101001110001001111111000010100101000000100110010101111100101111111100011010111001100001101" }, - /* 8*/ { BARCODE_RSS14STACK_CC, "0341234567890", "[17]010200", 1, 0, 0, 0, 9, 56, "Figure 5.9.8-6. GS1 DataBar Stacked symbol with a two-column CC-A", + /*10*/ { BARCODE_RSS14STACK_CC, 1, "0341234567890", "[17]010200", 0, 9, 56, "GGS Figure 5.9.8-6. (24723:2010 Figure 6) GS1 DataBar Stacked symbol with a two-column CC-A", "01101100110101110011100111101010000100001111011110101001" "01101101110110110001000010001110111101100100011100101001" "01101101100110100001111011001111110011010110011101101001" @@ -229,7 +266,7 @@ static void test_examples(int index, int generate, int debug) { "00000011010111101010000010101010101001001101010000000000" "10101100111000010101111111110111000110110011100101000000" }, - /* 9*/ { BARCODE_RSS_LTD_CC, "0351234567890", "[91]abcdefghijklmnopqrstuv", 2, 0, 0, 0, 17, 83, "Figure 5.9.8-7. GS1 DataBar Limited symbol with a three-column CC-B **NOT SAME** (using [91] not [21] as length > 20 max for [21])", + /*11*/ { BARCODE_RSS_LTD_CC, 2, "0351234567890", "[91]abcdefghijklmnopqrstuv", 0, 17, 83, "GGS Figure 5.9.8-7. (24723:2010 Figure 7) GS1 DataBar Limited symbol with a three-column CC-B **NOT SAME** (using [91] not [21] as length > 20 max for [21])", "11011101001110111110111010010110001001000001000010001011111011010011110110111010010" "11011001001111110101001110010110001101111011000011001010100001111000100110110010010" "11011001101001111000010010010100001101110111001011110011011100100011100110110011010" @@ -248,14 +285,14 @@ static void test_examples(int index, int generate, int debug) { "00000000000001111011100011010001110101010110101001100101110100100111000110101110000" "00000000001010000100011100101110001010101001010110011010001011011000111001010000101" }, - /*10*/ { BARCODE_RSS_EXP_CC, "[01]93712345678904[3103]001234", "[91]1A2B3C4D5E", 1, 0, 0, 0, 5, 151, "Figure 5.9.8-8. GS1 DataBar Expanded symbol with a four-column CC-A", + /*12*/ { BARCODE_RSS_EXP_CC, 1, "[01]93712345678904[3103]001234", "[91]1A2B3C4D5E", 0, 5, 151, "GGS Figure 5.9.8-8. (24723:2010 Figure 9) GS1 DataBar Expanded symbol with a four-column CC-A, same, verified against BWIPP and tec-it", "0011011011101110011010011000011100011100110110100111010011010001000011000101101110011000001101100010100000000000000000000000000000000000000000000000000" "0011011011001101110111110100011010001111001100100110010010111111001001100100101111110011101100100010100000000000000000000000000000000000000000000000000" "0011011010001010111011111100011111011011110010100110011011000011010011110100001011001111101110100010100000000000000000000000000000000000000000000000000" - "0000011011111011000100000000101001010000011101001110100110001100111001000010101000011010001110001000100001010000111001010000001010010111000110010110000" + "0000011011111011000100000000101001010000011101001110100110001100111101000010101000011010001110001000100001010000111001010000001010010111000110010110000" "0101100100000100111011111111000010101111100010110001011001110011000010111100000011100101110001110111011110101111000110001111110000101000111001101000010" }, - /*11*/ { BARCODE_EAN128_CC, "[01]03212345678906", "[21]A1B2C3D4E5F6G7H8", 1, 0, 0, 0, 6, 145, "Figure 5.9.8-9. GS1-128 symbol with a four-column CC-A", + /*13*/ { BARCODE_EAN128_CC, 1, "[01]03212345678906", "[21]A1B2C3D4E5F6G7H8", 0, 6, 145, "GGS Figure 5.9.8-9. (24723:2010 Figure 11) GS1-128 symbol with a four-column CC-A", "0000000000000000000001101001000110100001000001101101011110111110010010001101010000010010000011101110100010000111011001010000000000000000000000000" "0000000000000000000001101011000110101111001100001111010001101100010010000101111000011001101011100101100001000110011001010000000000000000000000000" "0000000000000000000001101011100100011001100111101011000101110000010110000101001100110011110011011110011001110110111001010000000000000000000000000" @@ -263,11 +300,11 @@ static void test_examples(int index, int generate, int debug) { "0010110001100001010001001100100110110110011100100011011000100100010100010011101111010011001001000010110011011100010100001000100010010011100010100" "1101001110011110101110110011011001001001100011011100100111011011101011101100010000101100110110111101001100100011101011110111011101101100011101011" }, - /*12*/ { BARCODE_RSS_EXPSTACK_CC, "[01]00012345678905[10]ABCDEF", "[21]12345678", 1, 0, 0, 0, 13, 102, "24723:2010 Figure 10 — A GS1 DataBar Expanded Stacked Composite symbol (with CC-A)", + /*14*/ { BARCODE_RSS_EXPSTACK_CC, 1, "[01]00012345678905[10]ABCDEF", "[21]12345678", 0, 13, 102, "24723:2010 Figure 10 — A GS1 DataBar Expanded Stacked Composite symbol (with CC-A) **NOT SAME** bottom 1st and top 2nd linear row separators different; zint same as BWIPP and hard to see how figure in standard could be correct", "001101101110110100001000001101001100111011000010011101001000110011100110010100111011100000110110001010" "001101101100101111110100011001111101101000001010011001001011111011011110011010111000100000110010001010" "001101101000100101001111000001000111011101111010011001101011110110110000011010001011111000111010001010" - "000001000111011100010000000010100100001101100000101010000110010000010100000111111001110100111100100000" + "000001000111011100010000000010100100001101100000101010000110010000010100000101010001110100111100100000" "010110111000100011101111111100001011110010011111010101111001101111101011111000000110001011000011011101" "000001000111011100010000000010100100001101100000101010000110010000010100000101010001110100111100100000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" @@ -278,7 +315,7 @@ static void test_examples(int index, int generate, int debug) { "000000111001111101010100001010100101011111000010100000000000000000000000000000000000000000000000000000" "010111000110000010100011110000001010100000111101000100000000000000000000000000000000000000000000000000" }, - /*13*/ { BARCODE_EAN128_CC, "[00]030123456789012340", "[02]13012345678909[37]24[10]1234567ABCDEFG", 3, 0, 0, 0, 7, 174, "24723:2010 Figure 12 — A GS1-128 Composite symbol (with CC-C)", + /*15*/ { BARCODE_EAN128_CC, 3, "[00]030123456789012340", "[02]13012345678909[37]24[10]1234567ABCDEFG", 0, 7, 174, "24723:2010 Figure 12 — A GS1-128 Composite symbol (with CC-C)", "111111110101010001111010101111000011010111011110000111011111011101001000001000010001011110101100111110111010010001110001000100011000011011111010100111110111111101000101001000" "111111110101010001111110101000111010000100111101000110011110101111101111010001010000011111000110010100111001011100011001001001111101100011111101010111000111111101000101001000" "111111110101010001010100011110000011001111100001010110100010111110001110111101011100011000001101011110101111001000000101100001011111101011101010001111110111111101000101001000" @@ -287,20 +324,827 @@ static void test_examples(int index, int generate, int debug) { "000000000101100011000010100010010011001101101100111001100100110001001000101000100111011110100110010010000100110010011000100100010011101011101000010001000100001010011100010100" "000000011010011100111101011101101100110010010011000110011011001110110111010111011000100001011001101101111011001101100111011011101100010100010111101110111011110101100011101011" }, + /*16*/ { BARCODE_RSS14STACK_CC, 1, "12345678901231", "[91]12345678901234567890", 0, 10, 56, "Example with CC-A 2 cols, 6 rows", + "01100100010111100110100111001011101110001000011100101101" + "01110100010110001011101000001000111010111110011000101101" + "01110110010110101100111111001000111100001001011000101001" + "01100110010111100100010111101101100100100000011001101001" + "01101110010111110011010010001011111101000011011011101001" + "01101111010111111001011010001000001100010111011011001001" + "00000110001100011010100000000100101101110000100000000000" + "01001001110011100100011111111001010010001111011010000000" + "00000110001101011010101010101010101101010000100000000000" + "10101001111010000101100000000111000010100111011101000000" + }, + /*17*/ { BARCODE_RSS14_OMNI_CC, 1, "12345678901231", "[91]1234567890123456789012", 0, 13, 56, "Example with CC-A 2 cols, 7 rows", + "01110110110100100011111001101110001011100110011100010101" + "01110010110111000110101111101001111100110010011000010101" + "01100010110111010110011110001110001110110011011000110101" + "01100010100110010111101100001001011111001100011000100101" + "01100110100101110000001011001110111010011110011100100101" + "01101110100110100000010001101100011010010000011110100101" + "01101100100111001011000100001111000001001010011110101101" + "00000110001100011010100000000100101101110000100000000000" + "01001001110011100100011111111001010010001111011010000000" + "00000110001100011010100000000100101101110000100000000000" + "00000101010101010101010101010101010101010101010000000000" + "00000110000101111010010101010000111101011000100000000000" + "10101001111010000101100000000111000010100111011101000000" + }, + /*18*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]1234567890123456789012345678", 0, 12, 55, "Example with CC-A 3 cols, 8 rows", + "1110111010100100011111001101110001011100110011011011101" + "1110011010111000110101111101001111100110010011011011001" + "1111011010111010110011110001110001110110011011011010001" + "1111001010110010111101100001101101111000010011010010001" + "1110001010100011111011001001000000100101111011010110001" + "1100001010111001111011000101110011001100111011010111001" + "1100011010111011100111100101111110011100101011010111101" + "1100010010101111100011010001111110010111011011010011101" + "0001000000000000000000000000000000000000000000000000010" + "0010000000000000000000000000000000000000000000000000001" + "0001000000000000000000000000000000000000000000000000010" + "0001010010011011110101000110111001000010100100010101010" + }, + /*19*/ { BARCODE_RSS14STACK_CC, 1, "12345678901231", "[91]1234567890123456789012345678901", 0, 13, 56, "Example with CC-A 2 cols, 9 rows", + "01100011010100100011111001101110001011100110011010111101" + "01100010010111000110101111101001111100110010011010011101" + "01110010010111010110011110001110001110110011011010011001" + "01111010010110010111101100001111001000101000011010001001" + "01111010110100111000010011001000111110001101011010001101" + "01111010100111000100010011101010000010000100011010000101" + "01110010100101100111111011001100010111000010011011000101" + "01110110100100011001000111001000010010111100011001000101" + "01110100100111001110011001101011000011101100011101000101" + "00000110001100011010100000000100101101110000100000000000" + "01001001110011100100011111111001010010001111011010000000" + "00000110001101011010101010101010101101010000100000000000" + "10101001111010000101100000000111000010100111011101000000" + }, + /*20*/ { BARCODE_RSS14_OMNI_CC, 1, "12345678901231", "[91]1234567890123456789012345678901234567", 0, 16, 56, "Example with CC-A 2 cols, 10 rows", + "01101001000111100110100111001011101110001000011101001101" + "01101011000110001011101000001000111010111110011101011101" + "01101011100110101100111111001000111100001001011101011001" + "01101011110111100100010111101000100110000110011101010001" + "01101001110111000101110110001111011011100110011001010001" + "01101001100101111100001100101000111100010100011001011001" + "01101000100101000001101100001111101111001011011001011101" + "01101000110111000101100100001111001001000001011001001101" + "01101000010101100111011111001000011101001100011001101101" + "01101100010110001101010000001000100001110111011101101101" + "00000110001100011010100000000100101101110000100000000000" + "01001001110011100100011111111001010010001111011010000000" + "00000110001100011010100000000100101101110000100000000000" + "00000101010101010101010101010101010101010101010000000000" + "00000110000101111010010101010000111101011000100000000000" + "10101001111010000101100000000111000010100111011101000000" + }, + /*21*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]123456789012345678901234567890123456789012334", 0, 16, 55, "Example with CC-A 2 cols, 12 rows", + "1110010100100100011111001101110001011100110011011000101" + "1110110100111000110101111101001111100110010011001000101" + "1110100100111010110011110001110001110110011011101000101" + "1110100110110010111101100001001000011110001011101100101" + "1110101110100011010011100001100010100111110011001100101" + "1110101100111101111001001001100001101100011011011100101" + "1110101000111010001100010001101111010111110011011110101" + "1100101000100110000001011101000111100100010011001110101" + "1100101100100010011101110001110000110100110011101110101" + "1100101110111101000000100101111001010000001011100110101" + "1100100110111110010111101101100011100100111011110110101" + "1100110110100011101110100001000110011101100011110010101" + "0001000000000000000000000000000000000000000000000000010" + "0010000000000000000000000000000000000000000000000000001" + "0001000000000000000000000000000000000000000000000000010" + "0001010010011011110101000110111001000010100100010101010" + }, + /*22*/ { BARCODE_RSS_LTD_CC, 1, "12345678901231", "[91]1234567890123456789012345", 0, 7, 74, "Example with CC-A 3 cols, 5 rows", + "01111001101001110010011010001011101110001000010111011100100000110000101010" + "01000111010111110010111010001110101100100000011001111010111110110001101010" + "01011001110111110010110010001101100000101111011100010111110010110001001010" + "01011001111000111010110011001100110000110011010001000110011000111001001010" + "01111101010110000010110001001100010111100011011011101111101000111101001010" + "00001011101000001010111000001010101000110110101101010110101111100011100000" + "01010100010111110101000111110101010111001001010010101001010000011100011101" + }, + /*23*/ { BARCODE_EANX_CC, 1, "1234567", "[91]1234567890123456789012345678901", 0, 10, 72, "Example with CC-A 3 cols, 6 rows", + "100100011111001101011000100111000101110011001100010111010000011110100101" + "100111110011001001011000110110101100111111001000111100001001011110101101" + "111100100010111101010000110111011000001011001000010100001000011110101001" + "101111110010011001010001110111100010110011001111101000110111011100101001" + "101110111000111101010001100100001001011110001000110010001110011101101001" + "101110111000010001010011100111001110011001101011000011101100011101001001" + "000010000000000000000000000000000000000000000000000000000000000000000010" + "000100000000000000000000000000000000000000000000000000000000000000000001" + "000010000000000000000000000000000000000000000000000000000000000000000010" + "000010100110010010011011110101000110101010011101010000100010011100101010" + }, + /*24*/ { BARCODE_RSS_LTD_CC, 1, "12345678901231", "[91]1234567890123456789012345678901234567", 0, 9, 74, "Example with CC-A 3 cols, 7 rows", + "01000100011011111010110100001100011010001111011100011010111110110010100010" + "01100000100110111010010100001110101100111100011100011101100110110010110010" + "01100101111011000010010110001001000011110001011100010111011000110010111010" + "01100010100111110010010111001011111000011001010001111000101000110010011010" + "01010000011011000010110111001111101111001011011000011011001100110011011010" + "01100100001110100010110111101011111010011100010110000101111110111011011010" + "01010001100011111010110011101011001100111100010011011011110000111001011010" + "00001011101000001010111000001010101000110110101101010110101111100011100000" + "01010100010111110101000111110101010111001001010010101001010000011100011101" + }, + /*25*/ { BARCODE_UPCA_CC, 1, "12345678901", "[91]12345678901234567890", 0, 7, 99, "Example with CC-A 4 cols, 3 rows", + "110110111011110011010011100101110111000100001001110100101110111001000001100000100110111011011000101" + "110110110011101011001000000110011110101111101001100100110010111101100001110010111011000011001000101" + "110110100010011101000001100100111111011101001001100110111111001011010001000001100010111011101000101" + "000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010" + "001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001" + "000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010" + "000101001100100100110111101010001101100010101111010101000100100100011101001110010110011011011001010" + }, + /*26*/ { BARCODE_RSS14_CC, 1, "12345678901231", "[91]1234567890123456789012345678", 0, 6, 100, "Example with CC-A 4 cols, 4 rows", + "1101001000111100110100111001011101110001000010010001101011101110010000011000001001101110111011001010" + "1101011000111010110010000001100111101011111010010000101100101111011000011011011110000100110011001010" + "1101011100100011111011001001000000100101111010110000101100011111010010011000110101111000110111001010" + "1101011110100011011001000001110011100010001010111000101101111011110011011100101000111000110111101010" + "0000000001100011000110101000000001001011011100001001010110000101111010010101010000111101011000100000" + "0000010010011100111001000111111110010100100011110110101001111010000101100000000111000010100111011101" + }, + /*27*/ { BARCODE_RSS_EXP_CC, 1, "[01]12345678901231", "[91]1234567890123456789012345678901234567", 0, 7, 134, "Example with CC-A 4 cols, 5 rows", + "00110101111011110011010011100101110111000100001011100010101110111001000001100000100110111011011110101000000000000000000000000000000000" + "00110100111011101011001000000110011110101111101011100110110010111101100001001000011110001011001110101000000000000000000000000000000000" + "00110100110010001101001110000110001010011111001011100100101111100001100101000111100010100011101110101000000000000000000000000000000000" + "00110100010010100000110110000111110111100101101011101100110001000100110001101100010001000011100110101000000000000000000000000000000000" + "00110100011011001011110110000100111001001111101001101100111110011000101001001101111110011011110110101000000000000000000000000000000000" + "00001011100111110001000000001010010011000000101001100011100100111011010000101010000111000011110101001101011110000010010100000010100000" + "01010100011000001110111111110000101100111111010110011100011011000100101111000000111000111100001010110010100001111101100011111100001010" + }, + /*28*/ { BARCODE_RSS_EXPSTACK_CC, 1, "[01]12345678901231", "[91]123456789012345678901234567890123456789012345", 0, 12, 102, "Example with CC-A 4 cols, 6 rows", + "001100010110111100110100111001011101110001000010011100101011101110010000011000001001101110110101111010" + "001100010100111010110010000001100111101011111010011110101100101111011000010010000111100010110100111010" + "001100110100100011010011100001100010100111110010111110101011111000011001010001111000101000110100110010" + "001101110100101000001101100001110011100010100010111100101111011101100111010000010110110000110100010010" + "001101100100111110001010001101100000101111011010111101101111000101110111010011110010111100110100011010" + "001101100110110101100111111001110001001111101010011101101001111000101000011001110100111000110100001010" + "000001101110011110010000000010100100001100110001001000111001001110110100001010100001110000111101010000" + "010110010001100001101111111100001011110011001110110111000110110001001011110000001110001111000010101101" + "000001101110011110010000000010100100001100110001001000111001001110110100001010100001110000111101010000" + "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" + "000000101111000001001010000001010010111100111110110000000000000000000000000000000000000000000000000000" + "001001010000111110110001111110000101000011000001001010000000000000000000000000000000000000000000000000" + }, + /*29*/ { BARCODE_EANX_CC, 1, "123456789012", "[91]123456789012345678901234567890123456789012345678901234", 0, 11, 99, "Example with CC-A 4 cols, 7 rows", + "110010111010010001111100110111000101110011001000011010110001011101000001000111010111110011011011001" + "110010011011010110011111100100011110000100101000111010101100111011111001011100010011000011011010001" + "110011011011011101110011000101100011010000001000110010111101111001001001100001101100011011010010001" + "111011011011101000110001000110111101011111001000100010101110010111110001110100011000001011010110001" + "111001011010011110001010000100111110000110101001100010111001101001111101000011110100001011010111001" + "110001011011001110001100010111011111011100101001110010111010000101110001110011000010110011010111101" + "110001010011110100110011000111101000010010001001111010111110100010011001001001111001000011010011101" + "000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010" + "001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001" + "000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010" + "000101001001101111010011101011000100001010010001010101001000111010011100101100110110110010010001010" + }, + /*30*/ { BARCODE_UPCE_CC, 2, "1234567", "[91]1234567890123", 0, 12, 55, "Example with CC-B 2 cols, 8 rows", + "1100100010111011111011101001000001000010001011001000101" + "1110100010110100001111011001100101110000100011101000101" + "1110110010101100100111000001011111011000001011101100101" + "1100110010110000110010100001010001000010000011001100101" + "1101110010111110110001001001100100111110111011011100101" + "1101111010100001111000101001110111111001001011011110101" + "1100111010100010001000000101110010000101110011001110101" + "1110111010111110001010110001111000100101000011101110101" + "0001000000000000000000000000000000000000000000000000010" + "0010000000000000000000000000000000000000000000000000001" + "0001000000000000000000000000000000000000000000000000010" + "0001010010011011110101000110111001000010100100010101010" + }, + /*31*/ { BARCODE_RSS14STACK_CC, 2, "12345678901231", "[91]123456789012345678901234567", 0, 15, 56, "Example with CC-B 2 cols, 11 rows", + "01100100010111011111011101001000001000010001011100110101" + "01110100010110100001111011001100101110000100011110110101" + "01110110010101100100111000001011111011000001011110010101" + "01100110010110000110010100001111100101011111011100010101" + "01101110010111011001111001101110100011000010011000010101" + "01101111010101100010111000001111101001110100011000110101" + "01100111010111011010110000001000110000111011011000100101" + "01110111010100010111110110001001001111010000011100100101" + "01110011010100111101000001001010110001111100011110100101" + "01111011010100010000111011101001100001100100011110101101" + "01111001010111101010000100001001110010111110011110101001" + "00000110001100011010100000000100101101110000100000000000" + "01001001110011100100011111111001010010001111011010000000" + "00000110001101011010101010101010101101010000100000000000" + "10101001111010000101100000000111000010100111011101000000" + }, + /*32*/ { BARCODE_RSS14_OMNI_CC, 2, "12345678901231", "[91]1234567890123456789012345678901234567890123", 0, 20, 56, "Example with CC-B 2 cols, 14 rows", + "01110111010100011111010011101101111110101110011101110101" + "01110011010100100101111000001001000100001111011100110101" + "01111011010101101111001110001111011110101000011110110101" + "01111001010110001110111110101110100011100011011110010101" + "01110001010110011001000111101001010000111100011100010101" + "01100001010110010001000011001101001111011111011000010101" + "01100011010110110111101000001111101100011011011000110101" + "01100010010100111100000100101011000101110000011000100101" + "01110010010100101110001110001111101101011110011100100101" + "01111010010111010000110100001001111101001110011110100101" + "01111010110100111100011011001011110001101100011110101101" + "01111010100111101110101100001111010001011110011110101001" + "01110010100100010111100000101101100111110011011100101001" + "01110110100101100100000111001000000110100111011101101001" + "00000110001100011010100000000100101101110000100000000000" + "01001001110011100100011111111001010010001111011010000000" + "00000110001100011010100000000100101101110000100000000000" + "00000101010101010101010101010101010101010101010000000000" + "00000110000101111010010101010000111101011000100000000000" + "10101001111010000101100000000111000010100111011101000000" + }, + /*33*/ { BARCODE_UPCE_CC, 2, "1234567", "[91]123456789012345678901234567890123456789012345678901234567", 0, 21, 55, "Example with CC-B 2 cols, 17 rows", + "1100110100100000011100101101100111111011001011001101001" + "1101110100111110110100111101110110010000110011011101001" + "1101100100111001011001000001110001101110100011011001001" + "1101100110110111111001101001100101100111111011011001101" + "1101101110100010110001100001010000011000110011011011101" + "1101101100100101111101100001111110100101110011011011001" + "1101101000100010110001111101011100100001100011011010001" + "1101001000111110111100101101100100010000110011010010001" + "1101011000111010000110010001110110111000100011010110001" + "1101011100101110110000111001011110110011000011010111001" + "1101011110110111100111010001000010010000100011010111101" + "1101001110101001111000100001110100110000010011010011101" + "1101001100111010011111101101101110010000111011010011001" + "1101000100110001000110011101101100111001110011010001001" + "1101000110100111110100011101100100000111001011010001101" + "1101000010101111000001101101001000000101111011010000101" + "1101100010110001100001101101011101110001000011011000101" + "0001000000000000000000000000000000000000000000000000010" + "0010000000000000000000000000000000000000000000000000001" + "0001000000000000000000000000000000000000000000000000010" + "0001010010011011110101000110111001000010100100010101010" + }, + /*34*/ { BARCODE_RSS14STACK_CC, 2, "12345678901231", "[91]1234567890123456789012345678901234567890123456789012345678901234567890", 0, 24, 56, "Example with CC-B 2 cols, 20 rows", + "01111010100111011111011101001000001000010001011110101001" + "01110010100110100001111011001100101110000100011100101001" + "01110110100101100100111000001011111011000001011101101001" + "01110100100110000110010100001111100101011111011101001001" + "01110100110111011001111001101110100011000010011101001101" + "01110101110101100010111000001111101001110100011101011101" + "01110101100101100011000010001100110110110000011101011001" + "01110101000100011001111100101001011111011000011101010001" + "01100101000101101001110000001100010100011111011001010001" + "01100101100100010110000011001000100001000001011001011001" + "01100101110111110001100010101101110011111010011001011101" + "01100100110100100101111000001100111001011100011001001101" + "01100110110111101001001111001001000010010000011001101101" + "01110110110100100001111010001010011111101110011101101101" + "01110010110111010001011111101011110111101111011100101101" + "01100010110100001001110111001000110110000100011000101101" + "01100010100111100100100001001000110011111001011000101001" + "01100110100110111010001110001001101001110000011001101001" + "01101110100101010000010000001110100010011100011011101001" + "01101100100101111101011100001001110100111110011011001001" + "00000110001100011010100000000100101101110000100000000000" + "01001001110011100100011111111001010010001111011010000000" + "00000110001101011010101010101010101101010000100000000000" + "10101001111010000101100000000111000010100111011101000000" + }, + /*35*/ { BARCODE_RSS14_OMNI_CC, 2, "12345678901231", "[91]1234567890123456789012345678901234567890123456789012345678901234567890123456789012", 0, 29, 56, "Example with CC-B 2 cols, 23 rows", + "01110011010100000011100101101100111111011001011110100101" + "01111011010111110110100111101110110010000110011110101101" + "01111001010111001011001000001110001101110100011110101001" + "01110001010110111111001101001100101100111111011100101001" + "01100001010100010110001100001010000011000110011101101001" + "01100011010100101111101100001111110100101110011101001001" + "01100010010100010110001111101011100100001100011101001101" + "01110010010111110111100101101100100010000110011101011101" + "01111010010111010000110010001110110111000100011101011001" + "01111010110101110110000111001011110110011000011101010001" + "01111010100110111100111010001000010010000100011001010001" + "01110010100110100001111011001100110111100010011001011001" + "01110110100111101011111001101000101000111100011001011101" + "01110100100111001101110111101011011000100000011001001101" + "01110100110111111010100011101110011001110100011001101101" + "01110101110100000010101111001001110111001111011101101101" + "01110101100111010010001110001101110011000100011100101101" + "01110101000100010111100000101010011110000100011000101101" + "01100101000101100110001111001011010000001110011000101001" + "01100101100110001000010110001011110111101000011001101001" + "01100101110111111010010011101000101111100011011011101001" + "01100100110110111101000001101110111101001110011011001001" + "01100110110110000010010011001101110001100100011011001101" + "00000110001100011010100000000100101101110000100000000000" + "01001001110011100100011111111001010010001111011010000000" + "00000110001100011010100000000100101101110000100000000000" + "00000101010101010101010101010101010101010101010000000000" + "00000110000101111010010101010000111101011000100000000000" + "10101001111010000101100000000111000010100111011101000000" + }, + /*36*/ { BARCODE_UPCE_CC, 2, "1234567", "[91]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890", 0, 30, 55, "Example with CC-B 2 cols, 26 rows", + "1100101000100000011100101101000001111001010011000101001" + "1100101100111110110100111101110110010000110011001101001" + "1100101110111001011001000001110001101110100011011101001" + "1100100110110111111001101001100101100111111011011001001" + "1100110110100010110001100001010000011000110011011001101" + "1110110110100101111101100001111110100101110011011011101" + "1110010110100010110001111101011100100001100011011011001" + "1100010110111110111100101101100100010000110011011010001" + "1100010100111010000110010001110110111000100011010010001" + "1100110100101110110000111001011110110011000011010110001" + "1101110100110111100111010001000010010000100011010111001" + "1101100100110100001111011001100110111100010011010111101" + "1101100110111101011111001101000101000111100011010011101" + "1101101110111001101110111101011011000100000011010011001" + "1101101100111111010100011101110011001110100011010001001" + "1101101000100000010101111001001110111001111011010001101" + "1101001000110100010110000001100110001000001011010000101" + "1101011000100110011111000101101011110110000011011000101" + "1101011100100110011011110001100111111001101011001000101" + "1101011110101001110001110001010011000011000011101000101" + "1101001110111101011100011101110101100010000011101100101" + "1101001100110011111000101001000011001101111011001100101" + "1101000100101000001001000001100011001001000011011100101" + "1101000110100010111111011101101000000111010011011110101" + "1101000010111111010001100101011001100111100011001110101" + "1101100010111011000110011101100001000001011011101110101" + "0001000000000000000000000000000000000000000000000000010" + "0010000000000000000000000000000000000000000000000000001" + "0001000000000000000000000000000000000000000000000000010" + "0001010010011011110101000110111001000010100100010101010" + }, + /*37*/ { BARCODE_RSS_LTD_CC, 2, "12345678901231", "[91]123456", 0, 8, 83, "Example with CC-B 3 cols, 6 rows", + "11001000101110111110111010010110011101000001000010001011101000010001110110010001010" + "11101000101110101111011100010010011101010000111100100011010111000000100111010001010" + "11101100101100110100001111010011011101101111101000100010110010011100000111011001010" + "11001100101110001001000111010001011101110111100011010011100111011001100110011001010" + "11011100101111001011100111010001001101111010001000010011110100010000100110111001010" + "11011110101001111001001000010001101101000011110011011010111001110011110110111101010" + "00000000000001011101000001010111000001010101000110110101101010110101111100011100000" + "00000000001010100010111110101000111110101010111001001010010101001010000011100011101" + }, + /*38*/ { BARCODE_EANX_CC, 2, "1234567", "[91]123456789012345678", 0, 12, 82, "Example with CC-B 3 cols, 8 rows", + "1100111010111011111011101001000010110100000100001000101111101101001111011001110101" + "1110111010110010111000010001000010010111001011001000001110001101110100011101110101" + "1110011010110111111001101001000011010101000101111000001100100110111111011100110101" + "1111011010111011010000110001000111010110000110110011001110011010011000011110110101" + "1111001010111011011100100001000110010111011101111001001010011110000100011110010101" + "1110001010111111010110001001000100010111001011111101101001111000011011011100010101" + "1100001010111100100010111101001100010111001111001100101001110001110010011000010101" + "1100011010110011001111010001001110010111110111101110101011100111111001011000110101" + "0000000000000010000000000000000000000000000000000000000000000000000000000000000010" + "0000000000000100000000000000000000000000000000000000000000000000000000000000000001" + "0000000000000010000000000000000000000000000000000000000000000000000000000000000010" + "0000000000000010100110010010011011110101000110101010011101010000100010011100101010" + }, + /*39*/ { BARCODE_RSS_LTD_CC, 2, "12345678901231", "[91]12345678901234567890123456789", 0, 12, 83, "Example with CC-B 3 cols, 10 rows", + "11000100101000000111001011010011110101100111111011001010010010111100000110001001010" + "11100100101110110010000110010111110101011011110011100011110111101010000111001001010" + "11110100101100011101111101010111100101110100011100011011101100111100110111101001010" + "11110101101001010000111100010111101101011000101110000011111010011101000111101011010" + "11110101001110110100011000010011101101101000010011000011100111101100100111101010010" + "11100101001011111100100011010011101001001100111110001011110101100001100111001010010" + "11101101001000010100001111010011001001011110100000010010010011101111110111011010010" + "11101001001100100010000110010011001101110111001100110011101110100010000111010010010" + "11101001101110001100111001010010001101100010011110110011110110001100010111010011010" + "11101011101101111101000100010010000101011110011000011011011101001110000111010111010" + "00000000000001011101000001010111000001010101000110110101101010110101111100011100000" + "00000000001010100010111110101000111110101010111001001010010101001010000011100011101" + }, + /*40*/ { BARCODE_EANX_CC, 2, "1234567", "[91]12345678901234567890123456789012345678901", 0, 16, 82, "Example with CC-B 3 cols, 12 rows", + "1110101100111011111011101001011000010100000100001000101111101101001111011101011001" + "1110101000110010111000010001011100010111001011001000001110001101110100011101010001" + "1100101000110111111001101001011100110110010110011111101100110010001111011001010001" + "1100101100101000001100011001011100100110010001000011001101001111011111011001011001" + "1100101110110110111101000001011101100111110110001101101000110011111001011001011101" + "1100100110101100010111000001001101100101101001110000001011010000011100011001001101" + "1100110110101110011111011101000101100111100111001011001100011000011011011001101101" + "1110110110111110100100110001000101000100111111010110001000010011111011011101101101" + "1110010110101101100000111101001101000101101110001111101011000000101110011100101101" + "1100010110101101100001000001011101000110011000100001001101110110001000011000101101" + "1100010100100001110101111101011001000101111011001111101111000110110001011000101001" + "1100110100100000110010011101011001100110000100101111101101111000101100011001101001" + "0000000000000010000000000000000000000000000000000000000000000000000000000000000010" + "0000000000000100000000000000000000000000000000000000000000000000000000000000000001" + "0000000000000010000000000000000000000000000000000000000000000000000000000000000010" + "0000000000000010100110010010011011110101000110101010011101010000100010011100101010" + }, + /*41*/ { BARCODE_RSS_LTD_CC, 2, "12345678901231", "[91]123456789012345678901234567890123456789012345678901234567", 0, 17, 83, "Example with CC-B 3 cols, 15 rows", + "11011101001110111110111010010110001001000001000010001011111011010011110110111010010" + "11011001001100101110000100010110001101110010110010000011100011011101000110110010010" + "11011001101101111110011010010100001101100101100111111011001100100011110110110011010" + "11011011101010000011000110010100011101100100010000110011010011110111110110110111010" + "11011011001101101111010000010100011001111101100011011010001100111110010110110110010" + "11011010001011000101110000010100111001011010011100000011000101000111110110110100010" + "11010010001000101100000110010100110001000100001000001011011110011101000110100100010" + "11010110001101110011111010010101110001010011110001000011101001100000100110101100010" + "11010111001000001111010001010101100001000000110100111011010110111111000110101110010" + "11010111101011100111110111010100100001111001101001110010000110001110110110101111010" + "11010011101110111011110010010110100001110010000001101011011110100111110110100111010" + "11010011001110001111010111010010100001011101100011100010000011010011100110100110010" + "11010001001001100111100111010010110001000110011110111010000110111000110110100010010" + "11010001101111010000100001010010111001110000100001101010111111010001100110100011010" + "11010000101011111100111010010110111001110110101111100011000101111110100110100001010" + "00000000000001011101000001010111000001010101000110110101101010110101111100011100000" + "00000000001010100010111110101000111110101010111001001010010101001010000011100011101" + }, + /*42*/ { BARCODE_EANX_CC, 2, "1234567", "[91]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[92]12345678901234567890123", 0, 30, 82, "Example with CC-B 3 cols, 26 rows", + "1100100010111011111011101001000011010100000100001000101111101101001111011110100101" + "1110100010110010111000010001000111010111001011001000001110001101110100011110101101" + "1110110010110111111001101001000110010110010110011111101100110010001111011110101001" + "1100110010101000001100011001000100010110010001000011001101001111011111011100101001" + "1101110010110110111101000001001100010111110110001101101000110011111001011101101001" + "1101111010101100010111000001001110010101101001110000001100010100011111011101001001" + "1100111010100010110000011001001111010100010000100000101101111001110100011101001101" + "1110111010110111001111101001011111010110100001111011001100110111100010011101011101" + "1110011010111101011111001101011110010100010100011110001001100011001111011101011001" + "1111011010101101100010000001011110110111010100011100001011100011110110011101010001" + "1111001010101111010111100001001110110111100010011011001111110100100111011001010001" + "1110001010101111010010000001001110100110111100001011001110100101111110011001011001" + "1100001010110001010011000001001100100110010001100011101110111001000001011001011101" + "1100011010100111011111101001001100110111110011011001101000111010011111011001001101" + "1100010010111101000111101001001000110101100100000011101010110001111100011001101101" + "1110010010101000001000010001001000010110010001100011101011011100011000011101101101" + "1111010010111100011001101001011000010111011101111010001101100001111010011100101101" + "1111010110100001001011110001011100010110001110001011101110111000101111011000101101" + "1111010100111001011101111101011100110111101110100110001001000011011000011000101001" + "1110010100100111011111101001011100100101011110000100001110010001100100011001101001" + "1110110100101111001001000001011101100110001110100111001100111010011100011011101001" + "1110100100110100000010011001001101100100001001100001101011000111101110011011001001" + "1110100110111001000110100001000101100110101111000001101000110010111111011011001101" + "1110101110110000110101111001000101000101110011001110001000011100100011011011011101" + "1110101100110000110000100101001101000101011110011110001101000111011110011011011001" + "1110101000111011011110011001011101000110011011110001001111000101100110011011010001" + "0000000000000010000000000000000000000000000000000000000000000000000000000000000010" + "0000000000000100000000000000000000000000000000000000000000000000000000000000000001" + "0000000000000010000000000000000000000000000000000000000000000000000000000000000010" + "0000000000000010100110010010011011110101000110101010011101010000100010011100101010" + }, + /*43*/ { BARCODE_RSS_LTD_CC, 2, "12345678901231", "[91]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[92]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[93]1234567890123456789012345678901", 0, 46, 83, "Example with CC-B 3 cols, 44 rows", + "11001000101110111110111010010110000101100011100011010011111011010011110110100010010" + "11101000101100101110000100010111000101110010110010000011100011011101000110100011010" + "11101100101101111110011010010111001101100101100111111011001100100011110110100001010" + "11001100101010000011000110010111001001100100010000110011010011110111110110110001010" + "11011100101101101111010000010111011001111101100011011010001100111110010110010001010" + "11011110101011000101110000010011011001011010011100000011000101000111110111010001010" + "11001110101000101100000110010001011001000100001000001011011110011101000111011001010" + "11101110101101110011111010010001010001101000011110110011001101111000100110011001010" + "11100110101111010111110011010011010001000101000111100010011000110011110110111001010" + "11110110101011011000100000010111010001110101000111000010111000111101100110111101010" + "11110010101011110101111000010110010001111000100110110011111101001001110110011101010" + "11100010101011110100100000010110011001101111000010110011101001011111100111011101010" + "11000010101100010100110000010110001001100100011000111011101110010000010111001101010" + "11000110101001110111111010010110001101111100110110011010001110100111110111101101010" + "11000100101110110100011111010100001101100111100010011010001110001000110111100101010" + "11100100101000110000110010010100011101100011101100001011101001100011110111000101010" + "11110100101111100010101100010100011001110000001011001011111011010000100110000101010" + "11110101101100111110001001010100111001111010111110110010001111011101110110001101010" + "11110101001100011011000011010100110001011100111100110010110000011000100110001001010" + "11100101001110010111001100010101110001110000010011001011010000111000100111001001010" + "11101101001000100000101111010101100001000110100000111011111101001100100111101001010" + "11101001001111010001011110010100100001000100111011100010110000011001000111101011010" + "11101001101111101000001011010110100001111010000011011011101000011010000111101010010" + "11101011101011000001101111010010100001000111101000010011011101000011100111001010010" + "11101011001001000001010000010010110001101100001000001010110111000110000111011010010" + "11101010001111100111011001010010111001110000101100001011101000001110110111010010010" + "11001010001110101111110110010110111001110011110010111010011110001100110111010011010" + "11001011001111011101101110010110111101100100000101100010101000000100000111010111010" + "11001011101011010111111000010110011101001110111111001010111100010111100111010110010" + "11001001101110100111110001010010011101000010101111000011100101111100010111010100010" + "11001101101001101100000100010011011101101001101110000011110110001001110110010100010" + "11101101101001000111100100010001011101011011111000010010010111100000100110010110010" + "11100101101101111110011001010001001101011110111000111010000100010111100110010111010" + "11000101101100011011000011010001101101110101100111100011100110001011000110010011010" + "11000101001000010111110011010000101101100100111001000011011011110001000110011011010" + "11001101001110100011111010010000100101011110000011011011100100101111110111011011010" + "11011101001001100011100110010000110101000011011101100010011011000001000111001011010" + "11011001001000110011111010010001110101100001011100010011110001011101110110001011010" + "11011001101101111010001100010001100101011111000011001011001011111101000110001010010" + "11011011101000010110001100010001000101101000111011110011001110011010000110011010010" + "11011011001111100100110111010011000101111011100111001011100110011101000110111010010" + "11011010001110110100111110010011100101000111100000101011011111001000100110110010010" + "11010010001001000001001000010011110101001100001100001011011010001000000110110011010" + "11010110001100001001111011010111110101111000101000010011000010111000100110110111010" + "00000000000001011101000001010111000001010101000110110101101010110101111100011100000" + "00000000001010100010111110101000111110101010111001001010010101001010000011100011101" + }, + /*44*/ { BARCODE_UPCA_CC, 2, "12345678901", "[91]1234567890123", 0, 8, 99, "Example with CC-B 4 cols, 4 rows", + "110100111010001111101001110110111111010111001001110110110100001111011001100101110000100011010010001" + "110100110010110010011100000101111101100000101001110100110111111001101001110100111110010011010110001" + "110100010011100110100001100110010000010110001001100100100111101111010001110001110100010011010111001" + "110100011011000101110000010111011011100100001001100110111110001010110001111000100101000011010111101" + "000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010" + "001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001" + "000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010" + "000101001100100100110111101010001101100010101111010101000100100100011101001110010110011011011001010" + }, + /*45*/ { BARCODE_EANX_CC, 2, "123456789012", "[91]1234567890123456789012345", 0, 10, 99, "Example with CC-B 4 cols, 6 rows", + "110010001011101111101110100110001110001101001011001110111110110100111101110110010000110011001000101" + "111010001011100101100100000111000110111010001001001110110001110111110101110100011100011011101000101" + "111011001011001100100011110100101000011110001001101110101100010111000001010011000111110011101100101" + "110011001011000010010110000100111101111101101000101110111110101001111101100110000101000011001100101" + "110111001011111001000010110111110011010000101000100110111111001010111001110100001101000011011100101" + "110111101010011100001000110110011100010111001000110110100000100010111101111110010011010011011110101" + "000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010" + "001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001" + "000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010" + "000101001001101111010011101011000100001010010001010101001000111010011100101100110110110010010001010" + }, + /*46*/ { BARCODE_EAN128_CC, 2, "[01]12345678901231", "[91]12345678901234567890123456789012345678901", 0, 10, 145, "Example with CC-B 4 cols, 8 rows", + "0000000000000000000001100111010111011111011101001000001000010001010000101101111101101001111011101100100001100110011101010000000000000000000000000" + "0000000000000000000001110111010111001011001000001110001101110100010000100101100011101111101011101000111000110111011101010000000000000000000000000" + "0000000000000000000001110011010110011001000111101001010000111100010000110101011000101110000011111010011101000111001101010000000000000000000000000" + "0000000000000000000001111011010101100011000010001100110110110000010001110101111101111001011011001000100001100111101101010000000000000000000000000" + "0000000000000000000001111001010111010000110010001101000011100010010001100101000001001111010011100110001110010111100101010000000000000000000000000" + "0000000000000000000001110001010110001010111110001001010011110000010001000101011111101111011011011111100110010111000101010000000000000000000000000" + "0000000000000000000001100001010101000110001100001101100001000100010011000101011110011111011011000010001011000110000101010000000000000000000000000" + "0000000000000000000001100011010110111000111110101111100010010011010011100101000011010111111011001100001111010110001101010000000000000000000000000" + "0010110001100001010001001100100110100110001101110100111000111010010011110101100100001001010011000110010011100100010100001000101001110011100010100" + "1101001110011110101110110011011001011001110010001011000111000101101100001010011011110110101100111001101100011011101011110111010110001100011101011" + }, + /*47*/ { BARCODE_RSS14_CC, 2, "12345678901231", "[91]123456789012345678901234567890123456789012345678901234567", 0, 12, 100, "Example with CC-B 4 cols, 10 rows", + "1100010010100000011100101101100111111011001010011110101001001011110000010010001000011110110001001010" + "1110010010101101111001110001111011110101000010111110101100001100101000011111001010111110111001001010" + "1111010010111011001111001101110100011000010010111100101001011111011000011111101001011100111101001010" + "1111010110100010110001111101011100100001100010111101101001111000001001010110001011100000111101011010" + "1111010100100101110001110001100100001001100010011101101000101100000110010001000010000010111101010010" + "1110010100111110001100010101101110011111010010011101001010011110001000011101001100000100111001010010" + "1110110100100000111101101101101110000101110010011001001100011110100011010000100101111000111011010010" + "1110100100100110111000110001000100001100110010011001101000101000000100011100010010011100111010010010" + "1110100110110110011110000101110000100011010010010001101111101100001010010110011111000100111010011010" + "1110101110101111000010010001011110000010001010010000101001010000111100011011110001011000111010111010" + "0000000001100011000110101000000001001011011100001001010110000101111010010101010000111101011000100000" + "0000010010011100111001000111111110010100100011110110101001111010000101100000000111000010100111011101" + }, + /*48*/ { BARCODE_RSS_EXP_CC, 2, "[01]12345678901231", "[91]1234567890123456789012345678901234567890123456789012345678901234567890123", 0, 14, 134, "Example with CC-B 4 cols, 12 rows", + "00111010110011101111101110100100000100001000101011000010111110110100111101110110010000110011101011001000000000000000000000000000000000" + "00111010100011100101100100000111000110111010001011100010110001110111110101110100011100011011101010001000000000000000000000000000000000" + "00110010100011001100100011110100101000011110001011100110101100010111000001111101001110100011001010001000000000000000000000000000000000" + "00110010110010110001100001000110011011011000001011100100111110111100101101100100010000110011001011001000000000000000000000000000000000" + "00110010111011101000011001000111011011100010001011101100110110011110000101001101111101000011001011101000000000000000000000000000000000" + "00110010011010000111010001100110001110101110001001101100100100101111000001100111001011100011001001101000000000000000000000000000000000" + "00110011011011110100100111100100100001001000001000101100111001101110111101101000011000111011001101101000000000000000000000000000000000" + "00111011011011101001100000010111010011000100001000101000111110111101110101001111010111100011101101101000000000000000000000000000000000" + "00111001011010100101111000000111010111110100001001101000101111011000011001100011001001111011100101101000000000000000000000000000000000" + "00110001011011101110001000010111001110010100001011101000100001000100001001100111100111010011000101101000000000000000000000000000000000" + "00110001010010000001011110100111100110110100001011001000111011011100010001101000111000010011000101001000000000000000000000000000000000" + "00110011010011111101001110110110110001011110001011001100110001111010011001000001110110111011001101001000000000000000000000000000000000" + "00001011100111110001000000001010010011000000101001100011100100111011010000101010000111000011110101001101011110000010010100000010100000" + "01010100011000001110111111110000101100111111010110011100011011000100101111000000111000111100001010110010100001111101100011111100001010" + }, + /*49*/ { BARCODE_RSS_EXPSTACK_CC, 2, "[01]12345678901231", "[91]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[92]1234567890123456789012345678901234567890123456", 0, 26, 102, "Example with CC-B 4 cols, 20 rows", + "001100100010111011111011101001000001000010001010111100101111101101001111011101100100001100111001011010" + "001110100010111001011001000001110001101110100010111101101100011101111101011101000111000110110001011010" + "001110110010110011001000111101001010000111100010011101101011000101110000011111010011101000110001010010" + "001100110010101100011000010001100110110110000010011101001111101111001011011001000100001100110011010010" + "001101110010111010000110010001110110111000100010011001001101100111100001010011011111010000110111010010" + "001101111010100001110100011001100011101011100010011001101001001011110000011001110010111000110110010010" + "001100111010111101001001111001001000010010000010010001101110011011101111010110110001000000110110011010" + "001110111010111111010100011101110011001110100010010000101011110101111000011110001001101100110110111010" + "001110011010111110100111001001011110100100000010110000101101111000010110011101001011111100110110110010" + "001111011010110001010011000001100100011000111010111000101110111001000001011110111100101000110110100010" + "001111001010111110011011001101000111010011111010111001101110100001110110010011101001111100110100100010" + "001110001010100011100010001101000111101000100010111001001011111100111001011010010000111110110101100010" + "001100001010110111011000100001110001110010100010111011001001000111011100011000111011010000110101110010" + "001100011010111101011000011001110101111001110010011011001100001000111010011100010110001000110101111010" + "001100010010111001111110100101001001100011111010001011001110101011111100011101100111111010110100111010" + "001110010010100110000110000101000001000110011010001010001110001010111000011010010001100000110100110010" + "001111010010111100000101010001000110111111011010011010001001110111111010010011111000101110110100010010" + "001111010110111110001011101001001110011101111010111010001111110100011010010011100100110000110100011010" + "001111010100111110111010011101001000110000011010110010001101011100011110010000110111101110110100001010" + "001110010100100111111010110001010011111000011010110011001110010001110110011110010000110110110110001010" + "000001101110011110010000000010100100001100110001001000111001001110110100001010100001110000111101010000" + "010110010001100001101111111100001011110011001110110111000110110001001011110000001110001111000010101101" + "000001101110011110010000000010100100001100110001001000111001001110110100001010100001110000111101010000" + "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" + "000000101111000001001010000001010010111100111110110000000000000000000000000000000000000000000000000000" + "001001010000111110110001111110000101000011000001001010000000000000000000000000000000000000000000000000" + }, + /*50*/ { BARCODE_UPCA_CC, 2, "12345678901", "[91]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[92]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[93]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[94]123456789012345678901234567890123456789012345678901234567", 0, 48, 99, "Example with CC-B 4 cols, 44 rows", + "110010001011101111101110100100000100001000101011000010111110110100111101110110010000110011010001001" + "111010001011100101100100000111000110111010001011100010110001110111110101110100011100011011010001101" + "111011001011001100100011110100101000011110001011100110101100010111000001111101001110100011010000101" + "110011001010110001100001000110011011011000001011100100111110111100101101100100010000110011011000101" + "110111001011101000011001000111011011100010001011101100110110011110000101001101111101000011001000101" + "110111101010000111010001100110001110101110001001101100100100101111000001100111001011100011101000101" + "110011101011110100100111100100100001001000001000101100111001101110111101011011000100000011101100101" + "111011101011111101010001110111001100111010001000101000101111010111100001111000100110110011001100101" + "111001101011111010011100100101111010010000001001101000110111100001011001110100101111110011011100101" + "111101101011000101001100000110010001100011101011101000111011100100000101111011110010100011011110101" + "111100101011111001101100110100011101001111101011001000111010000111011001001110100111110011001110101" + "111000101010001110001000110100011110100010001011001100101111110011100101101001000011111011101110101" + "110000101011011101100010000111000111001010001011000100100100011101110001100011101101000011100110101" + "110001101011010111000001000101111000101111001011000110100010000111101001001101111110110011110110101" + "110001001011110111010111110110010001001111101010000110111001111100101101011010000011100011110010101" + "111001001011101110100100000110011001100001101010001110111010011101111101111010001011110011100010101" + "111101001010010000111110110111101100110010001010001100111110100000101101111010000011011011000010101" + "111101011011101101011111000101100000110111101010011100100011110100001001101110100001110011000110101" + "111101010010010000010100000110110000100000101010011000101101110001100001000110001101000011000100101" + "111001010011100001011000010111010000011101101010111000101011110010000001000110100111111011100100101" + "111011010010011110001100110101110000010110001010110000101100000100111001011011000011110011110100101" + "111010010011101110001000010111101100100011101010010000110101101110000001100101000011000011110101101" + "111010011011111011100011010110000010011100101011010000111101000100001001100010011110110011110101001" + "111010111011111001011101000111000111010111101001010000100111100111011101011101110011110011100101001" + "111010110010010000110000110100100001000010001001011000101100111000110001010011000110000011101101001" + "111010100011000010011101000110111001111101001001011100110010011100001001110001011100011011101001001" + "110010100011100111110101100100010100011110001011011100100011110001010001000100011011111011101001101" + "110010110011000100001000110110001000110011101011011110111011110110010001001110000111010011101011101" + "110010111011101000110001000110010111100011001011001110110010001111011001110001101110100011101011001" + "110010011010011000110011110110100010111110001001001110100001110001011001101110100111000011101010001" + "110011011011100110100011000111100111101000101001101110111110010101111101111010010011110011001010001" + "111011011011110100111011100110100000011100101000101110111101101110011001101111110101110011001011001" + "111001011010000111000100110101100100001110001000100110110011100001011101011100001011000011001011101" + "110001011010000010100010000110100110111000001000110110100100000110110001001000011011000011001001101" + "110001010010100001111100110101101111110001101000010110111110010001001101111100010110111011001101101" + "110011010011011010011110000110111001000111001000010010110111010000111001001111100110001011101101101" + "110111010011000011010010000111101100100011101000011010100001100111011001110111101100010011100101101" + "110110010010101111110111000110101111100111001000111010100100011111001101111000001010010011000101101" + "110110011010110100000011100100000100100111101000110010100001011001111101000111101001000011000101001" + "110110111011001111011100100110111000110010001000100010100100001100110001110001110011011011001101001" + "110110110010111101000011110100100001111001001001100010111001110111100101111010100000010011011101001" + "110110100011011100100111000110001111010110001001110010100011101101110001100010001011111011011001001" + "110100100010001110111010000111000100001011101001111010110000110110001101100110000100100011011001101" + "110101100011100000010110100111100010001010001011111010111101000101000001001111101011100011011011101" + "000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010" + "001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001" + "000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010" + "000101001100100100110111101010001101100010101111010101000100100100011101001110010110011011011001010" + }, + /*51*/ { BARCODE_EAN128_CC, 3, "[01]12345678901231", "[91]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[92]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[93]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[94]12345678901234567890123456789012345678901234567890123456789012345678901234567", 0, 32, 154, "Example with CC-C 5 cols, 30 rows", + "1111111101010100010101000001000000101000001000001001110111110111010010000010000100010111110110100111101110110010000110011110101001111000111111101000101001" + "1111111101010100011111010100000110111001011001000001110001101110100011000111011111010111010001110001101110110011110011011111010100001100111111101000101001" + "1111111101010100011101010011111100100101000011110001011000101110000011111010011101000100010110001111101011100100001100011111101011010000111111101000101001" + "1111111101010100011101001001110000111110111100101101100100010000110010010111000111000110010000100110001000101100000110011111010111111010111111101000101001" + "1111111101010100011010111101100000100110111110100001111100011000101011011100111110100110100001111011001100110111100010011101011100000110111111101000101001" + "1111111101010100011111010111100110111101011111001101000101000111100010011000110011110101101110111110001110101000111111011101011111000100111111101000101001" + "1111111101010100010100111100111100101110001111011001111011110010001011100110001000110110100010110000001100110001000001011010011100111100111111101000101001" + "1111111101010100011111101001001110100110011111000101010111100001000011110010001101100101101001111110001111001101101000011110100100100000111111101000101001" + "1111111101010100011010011001111110101111100001101001000010001011110010001111000100010111011010001111101100111100010011011111010011100100111111101000101001" + "1111111101010100010100011110111100111100111001011001000110000110010011000111011000010111010011000111101101110110001000010100011101110000111111101000101001" + "1111111101010100011010011100000010111000000101100101111101101000010010000010001111010110101110000010001011110001011110011101001110000110111111101000101001" + "1111111101010100010100010000011110110001110100111001100011000101111011110111010111110110010001001111101110011111001011011111010001110100111111101000101001" + "1111111101010100011101000001001110111110110101111001110111010010000011001100110000110111010011101111101111010001011110010100000101000000111111101000101001" + "1111111101010100011110100011011000100100001111101101111011001100100011111010000010110111101000001101101110100001101000011110100010000010111111101000101001" + "1111111101010100010100000100111100101100000110111101000111101000010011011101000011100100110110111100001100010010111110011100101011111100111111101000101001" + "1111111101010100011001011001110000101101110001100001000110001101000011000110010000010110110110011000001101001000011000010010100000100000111111101000101001" + "1111111101010100010100011111101110100011010011111101111000010001001011100100000011010111101101100001001110100000110100010100011111001100111111101000101001" + "1111111101010100011111001011100010100001000010111101101100110011111010101101111100000100101110011111101000011001000111011100101111100100111111101000101001" + "1111111101010100011101101000001100110000110110011001101000001001100010011000110000100110010100011000001100001001000011011110110100011100111111101000101001" + "1111111101010100011110100000100010110000100111101101011001111100001010010011110100000111001001110110001111101101000100011111010000010110111111101000101001" + "1111111101010100010110110111100000110100100011111001011111011101100011000111010111000111000101111100101000110100000111010010010000111100111111101000101001" + "1111111101010100010110111000011000110111100011100101001000010010000011000011011000110111100110100111001100010000100011010110111001100000111111101000101001" + "1111111101010100011110010100000010110001011110011001100011011110001011110000010100100111010001100010001100101111000110011111001010000110111111101000101001" + "1111111101010100011110010011110010101110110000011101011111011000001010011000110011110110100010111110001000011100010110011001001111110010111111101000101001" + "1111111101010100011001000100110000110001010110000001110011010001100011110011110100010110110010000010001111011001011100011011001000000100111111101000101001" + "1111111101010100011100101111001110110001011100100001110010111101110010011110101111000111010110001000001111100100001011010010111100100000111111101000101001" + "1111111101010100011111100100011010100110100111000001011000110001111011000011010111100111110100111010001011100000010110011111011001111010111111101000101001" + "1111111101010100010010001110001110111001101000110001100100010000011010001110011110110101001100110000001000110001101000010010001110111000111111101000101001" + "1111111101010100011111101101101110100100111101000001010000111110011011110110011010000111110011001000101101000001110100011110110110100000111111101000101001" + "1111111101010100010110001110111110100111000000101101000001101000111011111001011101000101111101111011101000111011001110010010000010111100111111101000101001" + "0000000001011000110000101000100110010011010011000110111010011100011101001001111010110010000100101001100011001001110010100001000101110010001001110001010000" + "0000000110100111001111010111011001101100101100111001000101100011100010110110000101001101111011010110011100110110001101011110111010001101110110001110101100" + }, + /*52*/ { BARCODE_EAN128_CC, 3, "[01]12345678901231", "[91]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[92]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[93]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[94]12345678901234567890123456789012345678901234567890123456789012345678901234567890", 0, 28, 171, "Example with CC-C 6 cols, 25 rows", + "111111110101010001101010000110000011010000001001100111011111011101001000001000010001011111011010011110111011001000011001011011110011100011111010100111110111111101000101001" + "111111110101010001111010100000100011100011011101000110001110111110101110100011100011011101100111100110111010001100001001001011111011000011110101000010000111111101000101001" + "111111110101010001010100011110000011111010011101000100010110001111101011100100001100010011110000010010101100010111000001011010011100000010101000001111000111111101000101001" + "111111110101010001101001001100000011001000010011000100010110000011001000100001000001011011110011101000100001001000010001111101101001111011101001011100000111111101000101001" + "111111110101010001101011100000010011001101111000100110101110000001001111001001100011010010000111101000101000001111010001111110101000111011010111000001000111111101000101001" + "111111110101010001111010111100010010001100001011100100000010101111001001110111001111011111010011100100101111010010000001101111000010110011110101111100110111111101000101001" + "111111110101010001101001111011111011101001101111000110001010011000001100100011000111011101110010000010111101111001010001101110011010000010100111000111000111111101000101001" + "111111110101010001111101001001100010001110100111110111010000111011001001110100111110011000110111101000110000100001110101000111001011111011111101001011100111111101000101001" + "111111110101010001111110100110001011010010000111110101110000011011101000011110110110010110001110111110110011111000100101111010111110110010100111011111100111111101000101001" + "111111110101010001010001110001110011001110000110100110001101100001101011100111100110010110000011000100110110010001000001000011011010000011010001110111100111111101000101001" + "111111110101010001101001110000010011010000111000100111001000001100101110001011100011010101111110111000111110100100011001001000011111011011010011100001000111111101000101001" + "111111110101010001111110100011010011101110101111000110010010001111101001001000001111011101101011111000101100000110111101000111101000010010100011000111110111111101000101001" + "111111110101010001101000001001100011000101000110000100100000101000001101100001000001010110111000110000100011000110100001100011001000001011010000010110000111111101000101001" + "111111110101010001110100011010000011101000001110110101011110010000001000110100111111011110000100010010111001000000110101111011011000010011110100010000100111111101000101001" + "111111110101010001010000010001111010110110000111100100001000010111101101100110011111010101101111100000100101110011111101000011001000111011001010111110000111111101000101001" + "111111110101010001001011001100000011000011011001100110100000100110001001100011000010011001010001100000110000100100001101110111101100010011001011011100000111111101000101001" + "111111110101010001010001111100011010110011111000010100100111101000001110010011101100011111011010001000110101111101110001100001001110100011010001111101110111111101000101001" + "111111110101010001111001011110100011000111010111000111000101111100101000110100000111011100111110101100100010100011110001000111100010100011110010111110110111111101000101001" + "111111110101010001101101000001000011110011010011100110001000010001101100010001100111011101111011001000100111000011101001010000011011000011011010000100000111111101000101001" + "111111110101010001111010000010010011001011110001100110010001111011001110001101110100010010000111101000111101001100001101000001011110001011110100000101000111111101000101001" + "111111110101010001001001001111000011011101001110000101110111101111101000001110010110010110011000011110101100100000011101000110100011100010110110001111000111111101000101001" + "111111110101010001001001100001100011011001101100000110001110110010001101011000111000011100010010111000101100011110111001001000110000110011011011100111000111111101000101001" + "111111110101010001111001010000010011110111001110010101001111110111001101100011110010011110110110000100100001101111101001100001001111011011110010100001000111111101000101001" + "111111110101010001111011011111001011010110011111100100101001111000001101110010000111010001111100011010100001001001111001101001111110100011001001111110100111111101000101001" + "111111110101010001101100110110000011110100010011110110001000010001101010011101110000011011100011000010111100111000101101011011000010000011001000101100000111111101000101001" + "111111110101010001100101111001100011011110101111100111110010000101101000010011111011011110011011100110111000100011101101100000010111010011100101111011100111111101000101001" + "000000000101100011000010100010011001001101001100011011101001110001110100100111101011001000010010100110001100100111001010000100010111001000100111000101000000000000000000000" + "000000011010011100111101011101100110110010110011100100010110001110001011011000010100110111101101011001110011011000110101111011101000110111011000111010110000000000000000000" + }, + /*53*/ { BARCODE_EAN128_CC, 3, "[01]12345678901231", "[91]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[92]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[93]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[94]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[95]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[96]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[97]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[98]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[99]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[91]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[92]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[93]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[94]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[95]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[96]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[97]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[98]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[99]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[91]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[92]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[93]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[94]1234567890123456789012345678901234567890", 0, 32, 528, "Example with CC-C 27 cols, 30 rows", + "111111110101010001010100000100000010000100001000010111011111011101001000001000010001011111011010011110111011001000011001011011110011100011110111101010000110000110010100001111100101011111010001011000110000101000001100011001100100010000110011010011110111110101100011000010001100110110110000011111011110010110110010001000011001001011100011100011001000010011000100010110000011001000100001000001011011110011101000100001001000010001111101101001111010111001110010000111101001001111001001000010010000011101011100111110111111101000101001" + "111111110101010001111010110011000010010000111101000101000001111010001111110101000111011100110011101000101111010111100001111000100110110011111101001001110111001101110010001001100111110001010101111000010000111100100011011001011010011111100011110011011010000100111011111101001111100110110011010001110100111110111010000111011001001110100111110011000110111101000110000100001110101000111001011111010101111100110000111110001010110001110000001011001011111011010000100100000100011110101101011100000100011111010100001100111111101000101001" + "111111110101010001111110101110011010001111011101110110001110100111001100011000101111011110111010111110110010001001111101110011111001011010110100000111000100010000010111101000110100000111011111101001100100111110100111000101011100010001100011101110101111000110010010001111101001001000001111011101101011111000101100000110111101000111101000010011011101000011100100110110111100001100010010111110011101101111110100100111100011011001000111001000011011001001101111110111010111111011001110011110010111011111101011000100111111101000101001" + "111111110101010001110100100111000010011100111010000111101110110111001111011000100111011110010010111100111011100010000101111011001000111011010110111000000110010100001100001000010011000011011000011011001100110100000100110001001100011000010011001010001100000110000100100001101110111101100010011111001101011110100100001100001101001000010000100010110011100011000101001100011000001111011110100001010000100100001000110010000110011101100110011000011011011110001110010100100001001000001100001101100011011010011000111000111111101000101001" + "111111110101010001010111100010000010010001111100110111001101111001101100010111100110011000110111100010111100000101001001110100011000100011001011110001100110010001111011001110001101110100010010000111101000111101001100001101000001011110001011110010001000010111110110001010001110000001011010011100101110000110111001011000000101100010111001000011100101111011100100111101011110001110101100010000011111001000010110111001001111011101111110110100011011110111001110010101001111110111001110010000111011011101011100000110111111101000101001" + "111111110101010001010010000111100010100010011110000111001001111100101110111110100011010100110011111000110110011001111101011011110111111011001001101111110101111101100000101111100100011101010110001000001110100110110000111101000110000100111010001111001100110110010111111001001011110000010100011010001111110100100111110111011001000111101000010011100010111110100101011100111111001100011110001011011110101111010000100001100110111101111110010110010010011100110111000101100001001110001111010000111101011010111111000100111111101000101001" + "111111110101010001010011110011110011010100011000000111101000100111101100111000110010011000100110111000110100111001111001100100011001110011101100010001100111101100001011101000011011110111010001100011100110110110010000010001001000100010000010110111100111000110110010010000001100011000011011011001110110000010110010000110111001110100011001111011100011010000110111001110001010001010000011001100011100100100111000101100111011000001110110010000110010000010100010000110011011011000001010011110111100011101000110111100111111101000101001" + "111111110101010001111010010000001011110011001100010110111001111100101111000001010010011011100011111010110010111110111001110010000111011011110010100100000100011001111101001001111001001111011110100010100000101110110011111101000010111100001011110001000100010100100001111101101111100101101110011110100000010010111010000011000101001111000101111011110100010000010110100011110011001110111011110010011000101110001000111100000101101101001001111010000011001000111001000110000101111001101101000001110010011110100100100000111111101000101001" + "111111110101010001010001011110000010001100001001110100001110101100001111110001001101011101111000101110100100110001111101000111100001010010011111001100100110001010011111001110001011111010011010001001111100101001110111111001110111111010100011001100100111100110101100011111101011100000100110010100000010111100110001011011111101101100000101111011011000010011110100000101000111101101101001111000011001100001011110111101011111011001001100110001111011110101111001000101011000011111001100001011111101011110100111100010111111101000101001" + "111111110101010001010001111011110010010001110111000110010011001110001010001000010000010010011101110000110011100011010001001001111001111011101011101111100110000110101000001111011011001111010011101111001100110010110111000001001100111101110011110111100100010110001011100111101101110011000010011010001110011110111101110000101101001100001100100010011011001000000101101100010000001101100110110000011011000100000010100000101010000001111011100110111010011100111100110100100000100000101110011101000010010100001100110000111111101000101001" + "111111110101010001110100111100111011010001110010000100010111110110001110110001110001011111011010000010111100111011100101110011011101000011111011100011010110100001111011001111001000110110011101000011010000111101010000100001110101110000011011101011110011100111001001101000001110001100111001011111011010000100111000100110100001110100011000010010100001111000010101111001011110001011101011111000011110010011011000101100111110001001111010000110110011100001000110100101001111010000001001000011111011011101001110000110111111101000101001" + "111111110101010001111110100001101010111001110111100101110100000110001110010111110001011101001111100100110011100001011101000111100010001011011100100011100101011001111100001101100010011110010000010110111110111001010111111001110111000101111011000100100111110101001000001111001101100010011110010110000100111000101000010011110001010001110111111010001100010011100100011110111011101001111101110011011000100111111010101111001001000001011110100001000011000111001001110100111110110000101010000100001111011101000111110010111111101000101001" + "111111110101010001110100000100111010101000000100000100000100010100001110111000101000011011110001110010101000100010000001001110111101100011000101110011110110010010110000001111011110100010010100100000010000100011000110010001101100010010000010001101111011100110100001011000001010000010100000011001010011000000111000011001001101111011110100010010100000100000100111001010111000001110100000010111010110001110110000110100011011100001110001100101100011110110010111000100011011100011001000101000010000011001010011000000111111101000101001" + "111111110101010001110100011000010011111001000100110100010111111011101011000101111110011101001100000010100010111100000101110001000110010011111101010111000111010001110001101110110011110011011101000110000100100101111101100001111110100101110011011011110100000111110110001101101000110011111001010010111110110000111010000110010001110110111000100011011001111000010100110111110100001111100011000101011011100111110100110100001111011001100110111100010010101111001000000101110100001111101100011000111101011110100010000010111111101000101001" + "111111110101010001111110010110001010001000100011110100110110001111001001110011101111011000111100101100100001101101111001101110101110000011111100101110110110101011111000001111100010111001010111110001101000101100011001111001000110010001110010111110000110100100001000101111001000111100010001011101101000111110110011110001001101000111000100011010001111010001000101111110011100101101001000011111010111000001101110100001111011011001011000111011111011001111100010010111101011111011001000111101110111010010100001111000111111101000101001" + "111111110101010001100101100111000011000110110000110101110011110011001011000001100010011011001000100000100001101100001001110010001011100011010000010001100100001100110010001011011000100000011101010001110000101110001111011001111011110010001011100110001000110110100010110000001100110001000001011000010110011100111010010001110001000110000110100010010000010100000110110000100000101011011100011000010001100011010000110001100100000101101101100110000011010010000110000110000100011011101001110011101000011101101011000000111111101000101001" + "111111110101010001111010000100001011100100000011010111101101100001001110100000110100011111101110100010110010111000100001111010100000010010100011110001000111110111000110101100000100111001011110100010000100110001001111011001010001111100011011100001000110100100010000111100101000111100101111010000101111010000101011111101110001111101001000110010010000111110110111101100110010001111101000001011011110100000110110111010000110100001111110010010111011110010000100010110010011100000101001000111110011010100011111001100111111101000101001" + "111111110101010001011010000111000010011100101100000100011011000111101000011000010111011100111110100110100101000111100001111011001111101010111011000001110101111101100000101001100011001111011010001011111000100001110001011001101110100111000010111011110111110100000111001011001011001100001111010110010000001110100011010001110001001000110011111010000111100100010101100100001110001110010100111111011101111001001110111101011110001001001100101110000011111100010110010100100001000111101101001000111110011011010111100000111111101000101001" + "111111110101010001110110100000110011110111101000010100001001000010001100100001100111011101110110000110111011000010011001110100100011100011000010001000110111001000100111001011001110110000011011000011001100111101110000101101110000110100110010010111011100000100001011110111101110100001000111011000011010010000101111001111010001001000011001100010101110001110000100001101100001001010111100111100010000100111001110111001010111000001001100011100011010010001110011100111101101001110001111011101000110010110110000010000111111101000101001" + "111111110101010001110100000111011011101011000100000111110010000101101110010011110111011111101101000110111101110011100101010011111101110011100100001110110111010011000000101111001010000100010000101111100110111010111001100001101011100001000010111000010111110110100001110010001000100111110110011101101111001100111010011000000101111000100001001011011110101111100111101000110001101110100000110001011111011010100000110010111000010001100000101110100011111011000110110111110100101100001111001100110001011111010000010110111111101000101001" + "111111110101010001111100100111010010001110100110000111001111101001101100111101001100011011000101111000100110001000011101110001011111010010111100010000010101110011000011101111010011110010010000111010000110100010000101111001101001100111111011001000010111110100100000010111101100110100011110010011111001110110101111100011101101001010000111100011111001011100100101111001110011101000110100001110010001111001010000110011010111100001100110010011110011110111110101110111111011011101001000110000100111011001001101111110111111101000101001" + "111111110101010001011011100001100011000110000101000110010000010001101001100000110100010110110000100000111000011001001101100000100110111010110001101000000100100001100110001010001100011000010100111100011110111000011010001101000101100110000011101101011000000110110001110011101110101101111000011001110011010000101000011000001101100010000010110011001110111001100110111000111001101000100111011100011001001110011110110110110000110001110010010011100010011101111011000100011000110010001001000111011100011101100100110000111111101000101001" + "111111110101010001111100101100111011111100101011100111110100110111001111001010000010010011100100111110111001011000010001111010110000110011111000011010100110100000111000101111000110110010010100011110000100100010111111011101011110101111000010010001111001000111100010011001101110100111000110011101110111101000111100010001001001111011000110001011010000011110110111101001000001001001011110000010011000100011110110101110110011111101101001110000010011110010010000100111111001001011101111000100001001011111001010000110111111101000101001" + "111111110101010001011001101111000011011010011110000110011000010111101111010111110110010111011100111100111001111010111001000010010011110011001010011111000110111010001110001110110101111100010101000011110000111010111110010001110101111110011010110000011011110101111100011010001011000111011111010001100110011110100101000011110001001001001111000011000111101101110100111001100111001011000000101110010011001100111100111101101011111101101111100010010010100011101111110110111000100011101011101000000110011101100100111110111111101000101001" + "111111110101010001100100010011000011001101100011000110110100001000001001100111101110011111011110100110110001110110010001001000001000001011100111010000100101000000100000101101110111100111010011011000010000110010001110111101101100010001000010000110110010000110001001011000001000010010000001011010000100000110111101000010111101000100001110111011001110000110100110000110100010001100100000010110011101110001100110100010000100100001110001100100011010000010110000110111010000110111101010100000010000010010001100110000111111101000101001" + "111111110101010001001011111011000010011110110111110101110101111100001011110000101111011110100100000010111110000100101101100100011110011010000101111101100110001101111001001110110011100100011110100001010000111110100110111001100110011110001010001110100111110111101100011010001111110101101111010010111110001100111101110011101001110100011010000011101000111001100110100011101000001110010011100011011110100110001100111110000101011001110010110000001011111001100001010111101100111001101111100100010011010010111100100000111111101000101001" + "111111110101010001001000010111100010011101000110000110111001011100001010001001111000011001110101110000100111000110111001110101011111100011001011001111110110011001000111101001010000111100010110001011100000111110100111010001000101100011111010111001000000110101100010111000001101001100111111011001001000111110101001011110000001011111001110011010110000010111000100000100010111101010001100011111010100000100111100111111001011000101000111100001010010001110001011000100110010000011101000100010001111010110001011100000111111101000101001" + "111111110101010001001000111000111011001000001001100100110000111011001100110011100111011010011100111100110010011101111001000101111011110010100001110001110100011000011010001101111011100010010100110001100000101100011110111001111011110101000010000010001101100100011011001000001101010000110000011010011100011110111010110011110001100001100001010010100100000100000101100111011000001111011110110011010001101100010000111000011000101101111001110101100011011110011100010110110000100100001000011000110010011100100001011100111111101000101001" + "111111110101010001111011011000010011111101011011110111101010000010001111001011000110011111011101100100110100011100000101010111110001100011010111111011110100011110100111101101011110001100010110111111001100111110100010001101011010011111100010011101011111000111110110100010001110001101110001010000001011110010100101111110011101100001011110011011110100111011100111001001110001101111010001000001010111000100111110100001011110010001101110111110100011111011010001000111001011000001001100110001111001011110110110100000111111101000101001" + "111111110101010001000101001111000010011101001100000100001100010111001000001101000111010001011011111000101011000011111001011001100111100011011110000100110101101111011111101011111101110001011110110111110010110001111101010001001111010100000011100011110101110100110000100111001010001000111100010110111011111000111111010011001001001111001110111010111011000111000101100000100011101010010000111100010010001101111100100100110111110001100111101011000011110010001111010111011101000111101100111110100010010110000010011100111111101000101001" + "000000000101100011000010100010011001001101001100011011101001110001110100100111101011001000010010100110001100100111001010000100010111001000100111000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000011010011100111101011101100110110010110011100100010110001110001011011000010100110111101101011001110011011000110101111011101000110111011000111010110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + /*54*/ { BARCODE_EAN128_CC, 3, "[01]12345678901231", "[91]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[92]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[93]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[94]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[95]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[96]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[97]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[98]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[99]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[91]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[92]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[93]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[94]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[95]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[96]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[97]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[98]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[99]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[91]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[92]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[93]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[94]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[95]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[96]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[97]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[98]123456789012345678901234567890123456789012345", 0, 32, 579, "Example with CC-C 30 cols, 30 rows (max)", + "111111110101010001010100000100000010001110111000100111011111011101001100011100011010011111011010011110111011001000011001011011110011100011110111101010000110000110010100001111100101011111010001011000110000101000001100011001100100010000110011010011110111110101100011000010001100110110110000011111011110010110110010001000011001001011100011100011001000010011000100010110000011001000100001000001011011110011101000100001001000010001111101101001111010111001110010000111101001001111001001000010010000011100110111011110101101100010000001110101000111000010101111011110000111111101000101001" + "111111110101010001111101011011100011100110011101000101111010111100001111000100110110011111101001001110111001101110010001001100111110001010101111000010000111100100011011001011010011111100011110011011010000100111011111101001111100110110011010001110100111110111010000111011001001110100111110011000110111101000110000100001110101000111001011111010101111100110000111110001010110001110000001011001011111011010000100100000100011110101101011100000100010111100010111100100010000111101001001101111110110011111011001100110111001011100110001110000010011001011111010100001100111111101000101001" + "111111110101010001010111000111111010110100000111000100010000010111101000110100000111011111101001100100111110100111000101011100010001100011101110101111000110010010001111101001001000001111011101101011111000101100000110111101000111101000010011011101000011100100110110111100001100010010111110011101101111110100100111100011011001000111001000011011001001101111110111010111111011001110011110010111010011110001100110101110000010110001011000001001110010110110000111100100001000010111101101100110011111010101101111100000100101110011111101000011001000111011111101011001000111111101000101001" + "111111110101010001110100100111000011000011011001100110100000100110001001100011000010011001010001100000110000100100001101110111101100010011111001101011110100100001100001101001000010000100010110011100011000101001100011000001111011110100001010000100100001000110010000110011101100110011000011011011110001110010100100001001000001100001101100011011110011010011100110001000010001101100010001100111011101111011001000100111000011101001010000011011000011101100110011100110001011101111001111011110101000011100110111011110101000110011000001000001011101110011010011000011100111111101000101001" + "111111110101010001010111100100000011110010001000010111110110001010001110000001011010011100101110000110111001011000000101100010111001000011100101111011100100111101011110001110101100010000011111001000010110111001001111011101111110110100011011110111001110010101001111110111001110010000111011011101001100000010111100101000010001000010111110011011010111111011110110010111000100001111001010100000011101000001110110111000110111010001100101111001100011111011010100000100100111111011101110111011110100011111000011010010111110100001001101011100100011111011101011100000110111111101000101001" + "111111110101010001111110100110100011010001111110100100111110111011001000111101000010011100010111110100101011100111111001100011110001011011110101111010000100001100110111101111110010110010010011100110111000101100001001110001111010000111101011010100011111000111101001111001001000011101000011010001000010111100110100110011111101100100001011111010010000001011110110011010001111001001111100111011010111110001110110101100110000111101111001000111101010110010011100000110010001011111001000111101001000010011110110000110111100010111101001010001001111000011101011111101100111111101000101001" + "111111110101010001010011110011110011100011010000110111001110001010001010000011001100011100100100111000101100111011000001110110010000110010000010100010000110011011011000001010011110111100010111000111000100100011011000010001001110000111010011110011101001100101100110000100001001101100000100011100100110011110100111001111001101000001000100001010100001100000110110001000001011001100111011100110011011100011100110100010011101110001100100111001111011011011000011000111001001001110001000111011110110011101000001001110100101000010000001100110000010010011101000110011110111111101000101001" + "111111110101010001111010010000100011000101110001000111100000101101101001001111010000011001000111001000110000101111001101101000001110010011101110111101000111111011110110101111101100101000011000100011101000111101000000101001000111011111101010001110101111100111101101110011001101101111000100011010011101000000111110100100110001111000011011010011001000111001000111010110001000001100100000011101011111010001000110110010011101000001111001001000010011111100100101110111100010000100101111010000110011011110010000010100110101110000010001001000111110110011110100100100000111111101000101001" + "111111110101010001010001001111000011110101111001000101011000011111001100001011111101010110001110111110111100100111101001110100111110010011001001111110100100001110100110001011001000011100011111101011101100100001110001001101111110010011001011001111001000110111100101111010001001110100011000010000001010111100110001000101111101111011110101111011010001101111110100011000010011101100111000101110010111001000000110101101110111110001001000110011111010001010111100000100011110010100001000010001001111011011111000010010100010011001111101100111101000110011110100111101000111111101000101001" + "111111110101010001010001111011110010100000010000010110111011110011101001101100001000011001000111011110101111011110100001101110011000100010000100110000110111110110100111101100010100110000010010111001110000110101000011000001110100100111000010100100000100000110110001000010001101111011110011010010001110111000111011100110011001010000011000110011011010000100000101111001111000101110111000101000011101100010000110111001101011000001100101110011110010011100111001000111101000010111101000100111011100010001001100110000111000101000111001100101100011100011010000110001110111111101000101001" + "111111110101010001110100111101110011111010011011100110011001111000101000111010011111011110110001101000111111010110111101001011111000110011110111001110100111101000110110001011000111110010010110111111011000110101111100111001001011111000110011111001001011000101001111000001001010011110100000010011011111100110101111000101111001111000001001010011110010001001000111111011101101101110001001110110011110000101101100100000101111001001010011111001100011111010100000110100111101101111101011101011111000010111100001011110111101001000000101111100001001011011101001110000110111111101000101001" + "111111110101010001111101000011101011000100010111110101101100011110001000111000100110010100101111000000101111100111001101011000001011100010000010001011110101000110001111101010000010011110011111100101100010100011110000101001000111000100110011100101001111110111111001011001001001010000011110011110001011110010110100111111000101001111010000010010110010000001110100011101100111001101110100000111011011101011100000100111010001100001101110010111000010100010011110000110011101011100001001110001101110011101010111111000110010110011111101100110010001111011110100011110100111111101000101001" + "111111110101010001110100000100111010100000110001100110010001000011001101001111011111010110001100001000110011011011000001111101111001011011001000100001100100101110001110001100100001001100010001011000001100100010000100000101101111001110100010000100100001000111110110100111101011100111001000011010010000110000111001100001011001000010000010001011110011010111000110010000010011001110011000010110010000010100100000100011011001000001001000000100100011100101000111000111010101110000001001000011011000011011110111100110110010001100011101110111001000001011001010001100000111111101000101001" + "111111110101010001111010001100110010011101111110100111110011011001101000111010011111011101000011101100100111010011111001100011011110100011000010000111010100011100101111101010111110011000011111000101011000111000000101100101111101101000010010000010001111010110101110000010001011110001011110010001000011110100100110111111011001111101100110011011100101110011000100001101111101001001011110100000011110100011011000101111101000111001010000011110100011111101010001110111001100111010001011110101111000011110001001101100111111010010011101110011011100100011110100010000010111111101000101001" + "111111110101010001111100101110100011011110000101100111010111110000101110001111010111010011011011110000110001001011111001110110111111010010011110001101100100011100100001101100100110111111011101011111101100111001111001011101001111000110011010111000001011000101100000100111001011011000011110010000100001011110110110011001111101010110111110000010010111001111110100001100100011101100111110010001010100000010011110110011100100111001111001011111011011011111000100100110001110100011101100011111001010010011110111001110111111010011001001111101001110001011100101001111110111111101000101001" + "111111110101010001100101100111000010001001110111000101100000110010001110110100000110011011011011000000100101110011100001011001111001110011100010010011100110110001110011101111001101001110011000100001000110110001000110011101110111101100100010011100001110100101000001101100001110110011001110011000101110111100111101111010100001110011011101111010100011001100000100000101110111001100010101100000011100110100011000111100111101000101101100100000100011110110010111000110001000100001101101100110110000011000011000100010100100111100111101010000010000010011101101001100000111111101000101001" + "111111110101010001111010000100100010011001001111110111101011100011101110010001100001011100100111011000111110110100010001101011111011100011000010011101000110111001111101001100100111000010011110001010001000110010011110001101110101111011100011000010111100110110010111100110001111101101010000010010011111101110111011101111010001111100001101001011111010000100110101110010001111101010011110001000010000110101111110110011100111110101101101111000100011101011101100000100001101111101001110101110011000011110111000111010111010001110011001000100111110011010100011111001100111111101000101001" + "111111110101010001101101000001111010110000100111000101101000000111001101110000101110011010110001111110101110010001100001001101001110000010110001100011110110000110101111001111101000011101010011000100001110101000100111100001110010011111001011101111101000110111101011110100001111010111100001010011110100001000101101000011100001000110001011100011110001011110100101000100111100001000001010001111010000001010011110110010100011111001111110010011010010110001000001110100100010000111101100111110110110010111001000011000101001100001111101101111001100111011100101111110110111111101000101001" + "111111110101010001110110100000110010001101100001000100111000011101001111001110100110010110011000010000100110110000010001001000011001100011000010100110000100010011011000001111010001001111011001110001100100110001001101110001101001110011110011001000110011100111011000100011001111011000010111010000110111101110100011000111001101010000011000110010010100001000000110011000001001001001100110000100010000010101000000100100001100001101000101100110000011000010001000110111011011001110001111011100001011011000110000101000110010000010001101001100000110100011100100110111100111111101000101001" + "111111110101010001110100000110010011110100000010100100011101111110101000111010111110011110110111001100110110111100010001101001110100000011111010010011000111100001101101001100100011100100011010000111001000110010011100000101111010110110000010001101111100010111101000101000001011101100111111010000101111000010111100010001000101001000011111011011111001011011100111101000000100101110100000110001011111000010010110111100111011101001111101101000010011111100101011100111110100110111001111001010000010010011100100111110111001011000010001111010110000110011111010000010110111111101000101001" + "111111110101010001111100100111001010000111000100110111111001001100101100111100100011011110010111101000100111010001100001000000101011110011000100010111110111101111010111101101000110111111010001100001001110110011100010111001011100100000011010010011001111100111101001111001001100100011111101010111100011001100101111001000010001010001100011111011011000001011110110110000100111101000001010001111011011010011110000110011000010111101111010111110110010111011100111100111001111010111001000010010011110011001010011111000110111010001110001110110101111100010110110000011110111111101000101001" + "111111110101010001011011100001100011010100001100000111010010011100001010010000010000011011000100001000110111101111001101001000111011100011101110011001100101000001100011001101101000010000010111100111100010111011100010100001110110001000011011100110101100000110010111001111001001110011100100011110100001011110110001001110111101100010100001100011001101100011000110110100001000001001100111101110011111011110100110110001110110010001001000001000001011100111010000100101000000100000101101110111100111010011011000010000110010001110111101101100010001000011101100100011000111111101000101001" + "111111110101010001111100101101110011000011011110100111100100001010001001100011111010010100111100000100101001111010000001001101111110011010111100010111100111100000100101001111001000100100011111101110110110111000100111011001111000010110110010000010111100100101001111100110001111101010000011010011110110111110101110101111100001011110000101111011110100100000010111110000100101101100100011110011010000101111101100110001101111001001110110011100100011110100001010000111110100110111001100110011110001010001110100111110111101100011010001111110101101111011111001010000110111111101000101001" + "111111110101010001011001100111100011011000100111100100000101101111101100101011111000011111100101100100100101000001111001111000101111001011010011111100010100111101000001001011001000000111010001110110011100110111010000011101101110101110000010011101000110000110111001011100001010001001111000011001110101110000100111000110111001110101011111100011001011001111110110011001000111101001010000111100010110001011100000111110100111010001000101100011111010111001000000110101100010111000001101001100111111011001001000111110101001011110000001011111001110011011101100101111100111111101000101001" + "111111110101010001100100010011000011011000100100000100011011110111001101000010110000010100000101000000110010100110000001110000110010011011111011110101100100010111011100001111001101011100011001000001001100111001100001011001000001010010000010001101100100000100100000010010001110010100011100011101010111000000100100001101100001101111011110011011001000110001110111011100100000101111011110010100011011100110100000100001101110110001001011111011111011101111011100110111100111001011001000110000110010011000111011000010110100111011110001000100011011000011011001110011100111111101000101001" + "111111110101010001001011110000100011100100011100110101110010001111101111010011001100011101101110001000110110011110000101001101111101000011111000110001010110111001111101001101000011110110011001101111000100110101110000001001111001001100011010010000111101000101000001111010001111110101000111011100110011101000101111010111100001111000100110110011111101001001110111001101110010001001100111110001011101011110111000111000110001110101001001111101100010010011110000010111110010100011001111100111011001011100001011000010111010000011101101010111100100000010010111100100000111111101000101001" + "111111110101010001001000010011110011100111100101110100111100011001101000010100001111011001100010111100110011111001010001100010111111001011101111100010110111010111111001101111010111110110010001111011101110110001110100111001100011000101111011110111010111110110010001001111101110011111001011010110100000111000100010000010111101000110100000111011111101001100100111110100111000101011100010001100011101110101111000110010010001111101001001000001111011101101011111000110110000100111101011100100000110011000101111110010100010001101111101001110010110000011100100011111010111111101000101001" + "111111110101010001001000111000111011000100011001110111011110110010001001110000111010010100000110110000111011001100111001100010111011110011001110011001000101100001100001001111011000100111011110010010111100111011100010000101111011001000111011010110111000000110010100001100001000010011000011011000011011001100110100000100110001001100011000010011001010001100000110000100100001101110111101100010011111001101011110100100001100001101001000010000100010110011100011000101001100011000001111011110100001010000100100001000110010000110011101110111011000011011001000010011000111111101000101001" + "111111110101010001111100100100011011001001111000110111010111101110001100001011110011011001011110011000111110110101000001001001111110111011101110111101000111110000110100101111101000010011010111001000111110111010001110011001110110111100110010110101111110000111101001100001101000001011110001011110010001000010111110110001010001110000001011010011100101110000110111001011000000101100010111001000011100101111011100100111101011110001110101100010000011111001000010110111001001111011101111110110100011011110011000110010110110000111101001001110111111001011110110110100000111111101000101001" + "111111110101010001100010100011111011011101000111000100010010011110001001100011001111010001101100011110110000111110100101010000110011111011000011111010100100010011011111001010001000011110010011110011000110101111000110001101111011011111010010111001000011000110010010011111001110000101111101010101110011111100111111000101100101111110100110001011111100101110110100010011011111001001100011011110010111101100000110101111011001100001111100010111001010100010111100000110100100011111001110111100101110010000111010001100111111010011001001010001000011110010110000110011110111111101000101001" + "000000000101100011000010100010011001001101001100011011101001110001110100100111101011001000010010100110001100100111001010000100010111001000100111000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000011010011100111101011101100110110010110011100100010110001110001011011000010100110111101101011001110011011000110101111011101000110111011000111010110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + /*55*/ { BARCODE_EAN128_CC, 3, "[01]12345678901231", "[91]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[92]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[93]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[94]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[95]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[96]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[97]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[98]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[99]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[91]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[92]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[93]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[94]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[95]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[96]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEF", 0, 32, 579, "Example with CC-C 30 cols, 30 rows (max)", + "111111110101010001010100000100000010001110111000100111011111011101001100011100011010011111011010011110110100100110000001001100110100000011001100100100000100011000001101001011001100001000010001100001100010100001011000001101110111101101000010000010100001000100100001100110001011000111000011010011000001100010111011001000011001110110100000110010001010000001000100011000110000101100110000100001011110110101110000111011001000110001100100010110000011101100101100000100101110111000001100001011001110011000010000100110110010000100110001110011101000010010101111011110000111111101000101001" + "111111110101010001111101011011100011010001110000100111010001100010001010011111101110011111011001100110111010000011010001111010001000100011111101110110110111100110110010001111001011000011011110001000100010101110011011111101111110011010011011110000101000010111100100100001001110100111101110010001000111100100111101011101110001110101111000111011111101100101100100010011110100001110001000110010011111100010101110101101111100001001111001010000100011110101100110000111010000111011001111101100010100011000100011110110111111011010001101111101100000101011111010100001100111111101000101001" + "111111110101010001010111000111111010010111011111100100001101000011101111110110011101011101011111000100110110001001111001001110011001110010011000011011110111001111100101101110110001011111010010010111100000110001101011110001101110101110000010010110001111100101001011110000001101000100111110011100110100111110111010111110000101101110011001111011100100011111010110111111001100101010010011110000011101011111010000110011000101111001001001100011111010001110110001110111001110101111001110111111010010010000011010011100110111000101110001100111000101110011111101011001000111111101000101001" + "111111110101010001110100100111000010001001000001000100011000110100001010001100110000010010011001100000100110011000010001100111000110010011001010000110000111101111001101101110010100011100011001001110111100110111001101000001110011010000110010111011110110000100010110110000001101000000100011010001001111011110110110001100001101111011110100100011110010110111110111010011011110001101100010100000010001001100110000110110111100111101101000111011110010000100010000010110011000110011001000001000100001010110110000010000110110001100001101001001100110000011010011000011100111111101000101001" + "111111110101010001010111100100000010110000101111110111101011101110001010111110011000011010111111011110111111010110111101101000000111001010011010001111110110011011110001001111010010000010011110111011101000111000100000110101001100111111011010001000111100100110100111010000001110010110000100011010000011100010100001011110001001111000100001001011111011010000100110100111100110001110010001101000010000010111101000111111011010110001111011011000010010111000010111110111000001011010001110101100010000010010011111000110111011011100001001011011111010000011101011100000110111111101000101001" + "111111110101010001111110100110100011100010011111010101000001101111101101110010001110010100100001111000110010010011111001011100011000111011001111110110100111010111111001101111110100111011011101111100010110110001111101010001110100011111010011111101000011010111010011111101101011100100001100011011100010001110111101101111101001100100100111110010100011011111000100110110001111001111100001011101010011101000110000100101011110000001011000010000111010001111000100100111001010111111001011100100001100010100110111110000111001001111100101111110101100010011101011111101100111111101000101001" + "111111110101010001010011110011110010010111110111110111001101000110001100001010000110010010001100001100111100110010111001100101101110000011000011010001000111000111001010001110110000100110011110011110100100101000001100110001110110000010011011011001100001100110001011100111101000101101100000010110110000100000111010101110000001000011001100001010110011000010000100011000011000101000010110000011011101111011010000100000101000010001001000011001100010110001110000110100110000011000101110110010000110011101101000001100100010100000010001000110001100001011101000110011110111111101000101001" + "111111110101010001111010010000100010011001001111110111010000111001101111001011100111011001011100000010111001011000001001111101000010011010011001111100010111100011001101001110110111000100010111000111111010110100011100001001110100011000100010100111111011100111110110011001101110100000110100011110100010001000111111011101101101111001101100100011110010110000110111100010001000101011100110111111011111100110100110111100001010000101111001001000010011110100110001100111100010011011001000010011111011010100000111100100111101001110011101111110001101011011110100100100000111111101000101001" + "111111110101010001010001001111000010111101000000100110000011101011101111100100111010011100010111110100100111000001011001101110000010111010001111010100000110111000100011101010001110111111011011110100110000111111000101101001000110101110000010111100010100000111010111110001001101100010011110010011100110011100100110000110111101110011111001011011101100010111110100100101111000001100011010111100011011101011100000100101100011111001010010111100000011010001001111100111001101001111101110101111100001011011100110011110111001000111110101101111110011001011110100111101000111111101000101001" + "111111110101010001010001111011110011110100110111110111110100101111101110011011001110010110110000100000100001001110111001101110111100111011000011010000010111101111001101101100010011000111010011000011001000100010010000010001000110001101000010100011001100000100100110011000001001100110000100011001110001100100110010100001100001111011110011011011100101000111000110010011101111001101110011010000011100110100001100111101110101100001010111000111000010000101000010000100010110001100001011001100100000011101011011110000101100111100011101000011011000001011010000110001110111111101000101001" + "111111110101010001110100111101110011110100011011000111011000111101101100011001111010011100100110010000100010111110011001111001100110001011100010011000010111100001101101001100100111001000011010001111011000111100000110110101000111010111110011110000010110110110101111110111101111110101101111011010000001110010100110100011111101100110111100010011110100100000100111101110111010001110001000001101010011001111110110100010001111001001101001110100000011100101100001000110100000111000101000010111100010011110001000010010111110110100001001101001111001100011101001110000110111111101000101001" + "111111110101010001111101000011101010111010001100000100111110110001001001000010111100010110000010011100100111101000010001100111110100001011010110001111110100110110001111001000101000001111011001101001111000111000100111110101010000011011111011011100100011100101001000011110001100100100111110010111000110001110110011111101101001110101111110011011111101001110110111011111000101101000011100010110011100101001111110101111110011100101101100100001111011001110001001110101111000001101101001110100000011010011110110110000110110000010111101111010001111010011110100011110100111111101000101001" + "111111110101010001110100000100111011000010100000110110101110001111001101001101110000010110000110001000101110011100010001011100011110011011001100100001000110110000100001001001001100001100011110101100111110100101111101111101110011010001100011000010100001100100100011000011001111001100101110011001011011100000110000110100010001110001110010100011101100001001100111100111101001001010000011001100011101100000100110110110011000011001100010111001111010001011011000000101101100001000001110101011100000010000110011000010101100110000100001000110000110001011001010001100000111111101000101001" + "111111110101010001111010001100110011111101110010100110000100111001001110000010111011011011011110001000110010011110110001100010001110010011001011100001000111110100000101101110110011100001011100111011110010100110010011111101110100001110011011110010111001110110010111000000101110010110000010011111010000100110100110011111000101111000110011010011110010100100000111010001100100001111101001000011011111010010110000111111001001011101110100011110111011110010100000010111110011011001101111101100010010010001011110001000110010001110100001111010001110111011110100010000010111111101000101001" + "111111110101010001111100101110100010111000110111000111110001011101001100011100010111011110010111100100111010010111111001011000011011110010111001110111100110110010011110001111110100011010011011111010000010101111010000001001100000111010111011111001001110100111000101111101001001110000010110011011100000101110100011110101000001101110001000111010100011101111110110111101001100001111110001011010010001101011100000101111000101000001110101111100010011011000100111100100111001100111001001100001101111011100111110010110111011000101111101001001011110000011100101001111110111111101000101001" + "111111110101010001100101100111000011100110011001110100100000010010001110010100111000010100100000010000101000110001100001101100001010000011101001000111000100110110000100001110010001000111011100011101101100111101001101111101111101001011111011100110110011100101101100001000001000010011101110011011101111001110100110000011010001110001110011011011010011000111000111011010000110001111101110101110010001110011101000101001000001000001010011110011110010111101111010000111001111011001001010000100010000010100001100110000101000100000010001100110110110000011101101001100000111111101000101001" + "111111110101010001111010000100100010110001111110110111100101001000001010000111110110011010011100010000100100111110001101110001011001000010001011111101110111101000100000101111001001001000010000110111110010111101000110110001110110001111011011000110011110100111001001100100001000101111100110011110011001100010111000100110000101111000011011010011001001110010000110100011110110001111000001101101010001110101111100111100000101101101101011111101111011111101011011110110100000011100101001101000111111011001101111000100111101001000001001111011101110100010100011111001100111111101000101001" + "111111110101010001101101000001111010001110111011110101111000010001001011110001100011011010001001111100101100100001110001111110010011001011011111010010000100000101000111101011000111011111011101000111110100101110100011000001001111101100010010010000101111000101100000100111001101110100111000010011111011000010100111100110011001011110111001110010010001101111100101100100000111001100101111110010011011110000101100101111100111011001100010100011111011001111010001100111111001011000101001010001111000011111010000111010111101110101111101011011000011110011100101111110110111111101000101001" + "111111110101010001110110100000110011101000001011100111011100011001101111001100010111010110111110011110110111000111001101110001101001100011110111001011000110011101100100001110110001001100011010000100110000110000101000001101101011100011110011010011011100000101100001100010001011100111000100010111000111100110110011001000010001101100001000010010010011000011000111101011001111101001011111011111011100110100011000110000101000011001001000110000110011110011001011100110010110111000001100001101000100011100011100101000111011000010011001111001111010010011100100110111100111111101000101001" + "111111110101010001110100000110010011110100011000110111110010001011001001011111001100010010001111001000110010001110100001111010000001010011111010101100000101111100101110001100101111101110010000100001111010111111011100101001100011011110100010111110000101110111101011011000001001100100111111011100010011001000111101000001101101001011111000011011110100000010100111100010000010101000101111101100011110000110110010101111010001111001001000011110010011110001000100100110010000111010001111100111011001011110100110000110111110010101100001100010111000100011111010000010110111111101000101001" + "111111110101010001111100100111001010000111010000110100101110011111101000001101001110011111100101110110110010011111100101000010001011110011101110010111100100001001101111101110011001011111010010110111110000101110001101110001111100010111010011000111000101110111100101111001001110100101111110010110000110111100101110011101111001101100100111100011111101000110100110111110100000101011110100000010011000001110101110111110010011101001110001011111010010011100000101100110111000001011101000111101010000011011100010001110101000111011111101101111010011000010110110000011110111111101000101001" + "111111110101010001011011100001100011011000110011000110011001100110001100110000010001011010010001100000100100010000001001110111000101000011110111010011000100001101101000001101100110000110011110110100111000100100001010000001000010011100111011110101001111000100100011101110001010000100010000011110001010111100100000101100110001001000110011000011110110001001110111001110100000101011110001111001011010110001110000110010000010011001011000110010000010110001111001110111011000001001101110100000101110011110001001011110110100110001110001110110100001100011101100100011000111111101000101001" + "111111110101010001111100101101110011101100001110100100111110110111101110101111001110011110100100100000111100111011100101000000101111010011010011110011000110100111110011101111101001100111011111011000110110101100011111101101111001010010000010100001111101100110100111000100001001001111100011011100010110010000100010111111011101111010001000001011110010010010000100001101111100101111010001101100011101100011110110110001100111101001110010011001000010001011111001100111100110011000101110001001100001011110000110110100110010011100100001101000111101100011111001010000110111111101000101001" + "111111110101010001011001100111100011000111110100100100111110011001001000111100101000010100110011111000101011001111100001111100100111001010011101101110000101111010000010001101110010001110011110111101011110101111101110001101001100100111000010111101111011110110110001011110001000011100101100010111100001000010101111101110011001100011110010011011100010111110100111001101011111001011110001000100010010001000011110110010010001111101100110010111100010011110000100100111011110010011101101101000011110010110011001111000100100011011111001011001000001110011101100101111100111111101000101001" + "111111110101010001100100010011000010010111011100000110000101100111001100001000010011011001000010011000111001110100001001100101001100000010100000110110000110100001100011101011000001100010011110010010111100111010000010111001110111000110011011110011000101110101101111100111101101110001110011011100011010011000111101110010110001100111011001000011101100010011000110100001001100001100001010000011011010111000111100110100110111000001011000011000100010111001110001000101110001111001101100110010000100011011000010000100100100110000110001111010110011111011011001110011100111111101000101001" + "111111110101010001001011110000100011101000011101100111110110001010001100010001111011011111101101000110111110110000010101010001111001000010011000111110010100000100111100101101011110110000010010111110001100101110101111100001110110000111001011100000100110010100101111100110001101000011110110011100010110000010111110010001001101101000111000001011010111100011000110100111010000001001001111001000011101011110111000111011000111000101001011110000100010000110011111010110101111000011001110101110000110011110010000110110111101000000101001111000100000101010010111100100000111111101000101001" + "111111110101010001001000010011110011100111010111100111011111101001001000001101001110011011100010111000110011100010111001011100110001110010011110001101100110100010111110001111101101111001010001101000011100100001110100001101001011100111111010000011010011100111111001011101101100100111111001010000100010111100111011100101111001000010011011111011100110010111110100101101111100001011100011011100011111000101110100110001110001011101111001011110010011101001011111100101100001101111001011100111011110011011001001111000111111010001101001101111101000001011100100011111010111111101000101001" + "111111110101010001001000111000111011001100011001100100000100010000101011011000001000011011000110000110101101111101111001010000011001100011011000100100000100001001100110001010011100111000011010110011100000111001001101111001111011100100110010111001110010000111101000100111101100110000110011010001101111001110100001011000011001100001010000011010100011000110000100100111100111101111011011001111010011101110010000111000110100001101001000111011100010100001000100000111100010101111001000001011001100010010001100110000111101100010011101110011101000001011001000010011000111111101000101001" + "111111110101010001111100100100011011100000101101000111010110001000001001001111100011011101101110000100101101111101000001111100100010110011110100010001000111101100011010001110101111101111010100001111101100111011000011101001001111101101111011101011110011100111101001001000001111001110111001010000001011110100110100111100110001101001111100111011111010011001110111110110001101101011000111111011011110010100100000101000011111011001101001110001000010010011111000110111000101100100001000101111110111011111010001011000100101111000010001111110011101010011110110110100000111111101000101001" + "111111110101010001100010100011111011011000001011110110011101000011101110101111101000010011110110110000110001110100111001100011111010001011100100101111110100011110110011001100111010111000011011111010001000110011111010001001010110011111000010011111001101000101111100011001001110110101111100011001101011110000110001111010110001110111101000111010010111001111110100111000000101101111110101101000010111100100100000110001110010011101101011111100010010011110000010010100001110100001101000001110010110010001110001101110100111010001100001110110111111001010110000110011110111111101000101001" + "000000000101100011000010100010011001001101001100011011101001110001110100100111101011001000010010100110001100100111001010000100010111001000100111000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000011010011100111101011101100110110010110011100100010110001110001011011000010100110111101101011001110011011000110101111011101000110111011000111010110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, }; int data_size = sizeof(data) / sizeof(struct item); + char bwipp_buf[32768]; + char bwipp_msg[1024]; + for (int i = 0; i < data_size; i++) { if (index != -1 && i != index) continue; + if (debug & ZINT_DEBUG_TEST_PRINT) printf("i:%d\n", i); struct zint_symbol *symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); symbol->symbology = data[i].symbology; symbol->option_1 = data[i].option_1; - symbol->option_2 = data[i].option_2; - symbol->option_3 = data[i].option_3; symbol->debug |= debug; int length = strlen(data[i].data); @@ -309,11 +1153,11 @@ static void test_examples(int index, int generate, int debug) { int composite_length = strlen(data[i].composite); - ret = ZBarcode_Encode(symbol, data[i].composite, composite_length); - assert_equal(ret, data[i].ret, "i:%d ret %d != %d %s\n", i, ret, data[i].ret, symbol->errtxt); + ret = ZBarcode_Encode(symbol, (const unsigned char *) data[i].composite, composite_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) { - test_helper_generate(symbol, ret, i, data[i].data, data[i].composite, data[i].option_1, data[i].option_2, data[i].option_3, data[i].comment); + test_helper_generate(symbol, ret, i, data[i].data, data[i].composite, data[i].option_1, data[i].comment, -1 /*bwipp_cmp*/); } else { assert_equal(symbol->rows, data[i].expected_rows, "i:%d %s symbol->rows %d != %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), symbol->rows, data[i].expected_rows, data[i].data); assert_equal(symbol->width, data[i].expected_width, "i:%d %s symbol->width %d != %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), symbol->width, data[i].expected_width, data[i].data); @@ -322,6 +1166,15 @@ static void test_examples(int index, int generate, int debug) { int width, row; ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); assert_zero(ret, "i:%d %s testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), ret, width, row, data[i].data); + + if (do_bwipp && testUtilCanBwipp(symbol->symbology, data[i].option_1, -1, -1, debug)) { + ret = testUtilBwipp(symbol, data[i].option_1, -1, -1, data[i].composite, composite_length, symbol->primary, bwipp_buf, sizeof(bwipp_buf)); + assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(data[i].symbology), ret); + + ret = testUtilBwippCmp(symbol, bwipp_msg, bwipp_buf, data[i].expected); + assert_zero(ret, "i:%d %s testUtilBwippCmp %d != 0 %s\n actual: %s\nexpected: %s\n", + i, testUtilBarcodeName(data[i].symbology), ret, bwipp_msg, bwipp_buf, data[i].expected); + } } } @@ -335,24 +1188,24 @@ static void test_odd_numbered_numeric(int index, int generate, int debug) { testStart(""); + int do_bwipp = (debug & ZINT_DEBUG_TEST_BWIPP) && testUtilHaveGhostscript(); // Only do BWIPP test if asked, too slow otherwise + int ret; struct item { int symbology; - unsigned char *data; - unsigned char *composite; int option_1; - int option_2; - int option_3; + char *data; + char *composite; int ret; int expected_rows; int expected_width; char *comment; - unsigned char *expected; + char *expected; }; - // Verified manually against tec-it.com and bwipp + // Verified via bwipp_dump.ps against BWIPP, and manually against tec-it.com struct item data[] = { - /* 0*/ { BARCODE_UPCE_CC, "1234567", "[91]1234567890123", 1, 0, 0, 0, 9, 55, "Test odd-numbered numeric, 1st fit, 9-bit remainder, 7-bit final, 2-bit alphanumeric latch, no padding", + /* 0*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]1234567890123", 0, 9, 55, "Test odd-numbered numeric, 1st fit, 9-bit remainder, 7-bit final, 2-bit alphanumeric latch, no padding", "1101100110111011101011110001001111100110010011110101001" "1101101110110001100001000101100010000100110011100101001" "1101101100111110001001001101100100111110111011101101001" @@ -363,7 +1216,7 @@ static void test_odd_numbered_numeric(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /* 1*/ { BARCODE_UPCE_CC, "1234567", "[91]12345678901234", 1, 0, 0, 0, 9, 55, "Test even-numbered numeric, 1st fit, 2-bit remainder, 2-bit alphanumeric latch, no padding", + /* 1*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]12345678901234", 0, 9, 55, "Test even-numbered numeric, 1st fit, 2-bit remainder, 2-bit alphanumeric latch, no padding", "1101100110111011101011110001001111100110010011110101001" "1101101110110001100001000101100010000100110011100101001" "1101101100111110001001001101100100111001000011101101001" @@ -374,7 +1227,7 @@ static void test_odd_numbered_numeric(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /* 2*/ { BARCODE_UPCE_CC, "1234567", "[91]123456789012345", 1, 0, 0, 0, 10, 55, "Test odd-numbered numeric, 2nd fit, alphanumeric latch, padding", + /* 2*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]123456789012345", 0, 10, 55, "Test odd-numbered numeric, 2nd fit, alphanumeric latch, padding", "1100100010111100110100111001011101110001000011100101101" "1110100010110001011101000001000111010111110011000101101" "1110110010110101100111111001000111100001001011000101001" @@ -386,7 +1239,7 @@ static void test_odd_numbered_numeric(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /* 3*/ { BARCODE_UPCE_CC, "1234567", "[91]ABCD12345678901", 1, 0, 0, 0, 10, 55, "Test odd-numbered numeric, 1st fit, 4-bit final, no alphanumeric latch or padding", + /* 3*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]ABCD12345678901", 0, 10, 55, "Test odd-numbered numeric, 1st fit, 4-bit final, no alphanumeric latch or padding", "1100100010111100110100111001110101110111110011100101101" "1110100010101111100110111101111000001000101011000101101" "1110110010110111100001001101101000111111001011000101001" @@ -398,7 +1251,7 @@ static void test_odd_numbered_numeric(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /* 4*/ { BARCODE_UPCE_CC, "1234567", "[91]ABCDE123456789", 1, 0, 0, 0, 10, 55, "Test odd-numbered numeric, 1st fit, 5-bit final, no alphanumeric latch or padding", + /* 4*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]ABCDE123456789", 0, 10, 55, "Test odd-numbered numeric, 1st fit, 5-bit final, no alphanumeric latch or padding", "1100100010111100110100111001110101110111110011100101101" "1110100010101111100110111101100000100011101011000101101" "1110110010100110000010111001111101011110011011000101001" @@ -410,7 +1263,7 @@ static void test_odd_numbered_numeric(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /* 5*/ { BARCODE_UPCE_CC, "1234567", "[91]1234567890123456789", 1, 0, 0, 0, 10, 55, "Test odd-numbered numeric, 1st fit, 7-bit final, no alphanumeric latch or padding", + /* 5*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]1234567890123456789", 0, 10, 55, "Test odd-numbered numeric, 1st fit, 7-bit final, no alphanumeric latch or padding", "1100100010111100110100111001011101110001000011100101101" "1110100010110001011101000001000111010111110011000101101" "1110110010110101100111111001000111100001001011000101001" @@ -422,7 +1275,7 @@ static void test_odd_numbered_numeric(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /* 6*/ { BARCODE_UPCE_CC, "1234567", "[91]1234A", 1, 0, 0, 0, 9, 55, "Test even-numbered numeric, ending in non-digit", + /* 6*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]1234A", 0, 9, 55, "Test even-numbered numeric, ending in non-digit", "1101100110111011101011110001001111100110010011110101001" "1101101110100001000100001001110110011001110011100101001" "1101101100100101111100110001000001011111011011101101001" @@ -433,7 +1286,7 @@ static void test_odd_numbered_numeric(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /* 7*/ { BARCODE_UPCE_CC, "1234567", "[91]12345A", 1, 0, 0, 0, 9, 55, "Test odd-numbered numeric, ending in non-digit", + /* 7*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]12345A", 0, 9, 55, "Test odd-numbered numeric, ending in non-digit", "1101100110111011101011110001001111100110010011110101001" "1101101110100111011100100001100010110001110011100101001" "1101101100100100011111001101111101001101110011101101001" @@ -447,17 +1300,19 @@ static void test_odd_numbered_numeric(int index, int generate, int debug) { }; int data_size = sizeof(data) / sizeof(struct item); + char bwipp_buf[8192]; + char bwipp_msg[1024]; + for (int i = 0; i < data_size; i++) { if (index != -1 && i != index) continue; + if (debug & ZINT_DEBUG_TEST_PRINT) printf("i:%d\n", i); struct zint_symbol *symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); symbol->symbology = data[i].symbology; symbol->option_1 = data[i].option_1; - symbol->option_2 = data[i].option_2; - symbol->option_3 = data[i].option_3; symbol->debug |= debug; int length = strlen(data[i].data); @@ -466,11 +1321,11 @@ static void test_odd_numbered_numeric(int index, int generate, int debug) { int composite_length = strlen(data[i].composite); - ret = ZBarcode_Encode(symbol, data[i].composite, composite_length); - assert_equal(ret, data[i].ret, "i:%d ret %d != %d %s\n", i, ret, data[i].ret, symbol->errtxt); + ret = ZBarcode_Encode(symbol, (const unsigned char *) data[i].composite, composite_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) { - test_helper_generate(symbol, ret, i, data[i].data, data[i].composite, data[i].option_1, data[i].option_2, data[i].option_3, data[i].comment); + test_helper_generate(symbol, ret, i, data[i].data, data[i].composite, data[i].option_1, data[i].comment, -1 /*bwipp_cmp*/); } else { assert_equal(symbol->rows, data[i].expected_rows, "i:%d %s symbol->rows %d != %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), symbol->rows, data[i].expected_rows, data[i].data); assert_equal(symbol->width, data[i].expected_width, "i:%d %s symbol->width %d != %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), symbol->width, data[i].expected_width, data[i].data); @@ -479,6 +1334,15 @@ static void test_odd_numbered_numeric(int index, int generate, int debug) { int width, row; ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); assert_zero(ret, "i:%d %s testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), ret, width, row, data[i].data); + + if (do_bwipp && testUtilCanBwipp(symbol->symbology, data[i].option_1, -1, -1, debug)) { + ret = testUtilBwipp(symbol, data[i].option_1, -1, -1, data[i].composite, composite_length, symbol->primary, bwipp_buf, sizeof(bwipp_buf)); + assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(data[i].symbology), ret); + + ret = testUtilBwippCmp(symbol, bwipp_msg, bwipp_buf, data[i].expected); + assert_zero(ret, "i:%d %s testUtilBwippCmp %d != 0 %s\n actual: %s\nexpected: %s\n", + i, testUtilBarcodeName(data[i].symbology), ret, bwipp_msg, bwipp_buf, data[i].expected); + } } } @@ -492,66 +1356,86 @@ static void test_ean128_cc_shift(int index, int generate, int debug) { testStart(""); + int do_bwipp = (debug & ZINT_DEBUG_TEST_BWIPP) && testUtilHaveGhostscript(); // Only do BWIPP test if asked, too slow otherwise + int ret; struct item { int symbology; - unsigned char *data; - unsigned char *composite; int option_1; - int option_2; - int option_3; + char *data; + char *composite; int ret; int expected_rows; int expected_width; + int bwipp_cmp; char *comment; - unsigned char *expected; + char *expected; }; - // Verified manually with bwipp (tec-it.com seems to be off by 2 for top shifts > 1) + // Verified via bwipp_dump.ps against BWIPP except where noted, when shift verified manually (tec-it.com seems to be off by 2 for top shifts > 1) struct item data[] = { - /* 0*/ { BARCODE_EAN128_CC, "[91]A", "[21]A1B2C3D4E5F6G7H8", -1, 0, 0, 0, 6, 100, "CC-A alignment, bottom shift 10", + /* 0*/ { BARCODE_EAN128_CC, -1, "[91]1", "[21]A1B2C3D4E5F6G7H8", 0, 6, 100, 0, "CC-A alignment, bottom shift 10, **NOT SAME** as BWIPP, Start B whereas BWIPP uses Start C, codeword count the same", "1101001000110100001000001101101011110111110010010001101010000010010000011101110100010000111011001010" "1101011000110101111001100001111010001101100010010000101111000011001101011100101100001000110011001010" "1101011100100011001100111101011000101110000010110000101001100110011110011011110011001110110111001010" "1101011110111000111011011001110010001011100010111000101011000011100110010000100000100010110111101010" - "0000000000001011011110000101000100011010011011000110010101110011101000100001011001110110011100010100" - "0000000000110100100001111010111011100101100100111001101010001100010111011110100110001001100011101011" + "0000000000001011011110000101000100011010011011000110010110001100101000100001010001110010011100010100" + "0000000000110100100001111010111011100101100100111001101001110011010111011110101110001101100011101011" }, - /* 1*/ { BARCODE_EAN128_CC, "[91]AB", "[21]A1B2C3D4E5F6G7H8", -1, 0, 0, 0, 6, 101, "CC-A alignment, top shift 1", + /* 1*/ { BARCODE_EAN128_CC, -1, "[91]12", "[21]A1B2C3D4E5F6G7H8", 0, 6, 99, 1, "CC-A alignment, bottom shift 12", + "110100100011010000100000110110101111011111001001000110101000001001000001110111010001000011101100101" + "110101100011010111100110000111101000110110001001000010111100001100110101110010110000100011001100101" + "110101110010001100110011110101100010111000001011000010100110011001111001101111001100111011011100101" + "110101111011100011101101100111001000101110001011100010101100001110011001000010000010001011011110101" + "000000000000001011000110000101000100001001001010011000110001010000101110110011001110001010000000000" + "000000000000110100111001111010111011110110110101100111001110101111010001001100110001110101100000000" + }, + /* 2*/ { BARCODE_EAN128_CC, -1, "[91]123", "[21]A1B2C3D4E5F6G7H8", 0, 6, 101, 1, "CC-A alignment, top shift 1", "01101001000110100001000001101101011110111110010010001101010000010010000011101110100010000111011001010" "01101011000110101111001100001111010001101100010010000101111000011001101011100101100001000110011001010" "01101011100100011001100111101011000101110000010110000101001100110011110011011110011001110110111001010" "01101011110111000111011011001110010001011100010111000101011000011100110010000100000100010110111101010" - "00101101111000010100010001101001101100011001010111001110111010011101000100001010011110110011100010100" - "11010010000111101011101110010110010011100110101000110001000101100010111011110101100001001100011101011" + "00101100011000010100010000100100101001100011010000100010011010001101000100001011001111010011100010100" + "11010011100111101011101111011011010110011100101111011101100101110010111011110100110000101100011101011" }, - /* 2*/ { BARCODE_EAN128_CC, "[91]ABC", "[21]A1B2C3D4E5F6G7H8", -1, 0, 0, 0, 6, 112, "CC-A alignment, top shift 12", + /* 3*/ { BARCODE_EAN128_CC, -1, "[91]12345", "[21]A1B2C3D4E5F6G7H8", 0, 6, 112, 1, "CC-A alignment, top shift 12", "0000000000001101001000110100001000001101101011110111110010010001101010000010010000011101110100010000111011001010" "0000000000001101011000110101111001100001111010001101100010010000101111000011001101011100101100001000110011001010" "0000000000001101011100100011001100111101011000101110000010110000101001100110011110011011110011001110110111001010" "0000000000001101011110111000111011011001110010001011100010111000101011000011100110010000100000100010110111101010" - "0010110111100001010001000110100110110001100101011100111011101001110111011100101000100001010011110110011100010100" - "1101001000011110101110111001011001001110011010100011000100010110001000100011010111011110101100001001100011101011" + "0010110001100001010001000010010010100110001101110100111010000100010010001101101000100001000110110010011100010100" + "1101001110011110101110111101101101011001110010001011000101111011101101110010010111011110111001001101100011101011" }, - /* 3*/ { BARCODE_EAN128_CC, "[91]ABCD", "[21]A1B2C3D4E5F6G7H8", -1, 0, 0, 0, 6, 123, "CC-A alignment, top shift 10", + /* 4*/ { BARCODE_EAN128_CC, -1, "[91]1234567", "[21]A1B2C3D4E5F6G7H8", 0, 6, 123, 1, "CC-A alignment, top shift 10", "000000000011010010001101000010000011011010111101111100100100011010100000100100000111011101000100001110110010100000000000000" "000000000011010110001101011110011000011110100011011000100100001011110000110011010111001011000010001100110010100000000000000" "000000000011010111001000110011001111010110001011100000101100001010011001100111100110111100110011101101110010100000000000000" "000000000011010111101110001110110110011100100010111000101110001010110000111001100100001000001000101101111010100000000000000" - "001011011110000101000100011010011011000110010101110011101110100111011101110010100111011101000100001001101101110011100010100" - "110100100001111010111011100101100100111001101010001100010001011000100010001101011000100010111011110110010010001100011101011" + "001011000110000101000100001001001010011000110111010011100011101001010000100010001001000101000100001000110100110011100010100" + "110100111001111010111011110110110101100111001000101100011100010110101111011101110110111010111011110111001011001100011101011" }, - /* 4*/ { BARCODE_EAN128_CC, "[91]ABCDEF", "[21]A1B2C3D4E5F6G7H8", -1, 0, 0, 0, 6, 145, "CC-A alignment, top shift 21", + /* 5*/ { BARCODE_EAN128_CC, -1, "[91]123456789", "[21]A1B2C3D4E5F6G7H8", 0, 6, 134, 1, "CC-A alignment, top shift 21", + "00000000000000000000011010010001101000010000011011010111101111100100100011010100000100100000111011101000100001110110010100000000000000" + "00000000000000000000011010110001101011110011000011110100011011000100100001011110000110011010111001011000010001100110010100000000000000" + "00000000000000000000011010111001000110011001111010110001011100000101100001010011001100111100110111100110011101101110010100000000000000" + "00000000000000000000011010111101110001110110110011100100010111000101110001010110000111001100100001000001000101101111010100000000000000" + "00101100011000010100010000100100101001100011011101001110001110100100111101011010000100010001101001101000100001001101110110011100010100" + "11010011100111101011101111011011010110011100100010110001110001011011000010100101111011101110010110010111011110110010001001100011101011" + }, + /* 6*/ { BARCODE_EAN128_CC, -1, "[91]12345678901", "[21]A1B2C3D4E5F6G7H8", 0, 6, 145, 1, "CC-A alignment, top shift 21", "0000000000000000000001101001000110100001000001101101011110111110010010001101010000010010000011101110100010000111011001010000000000000000000000000" "0000000000000000000001101011000110101111001100001111010001101100010010000101111000011001101011100101100001000110011001010000000000000000000000000" "0000000000000000000001101011100100011001100111101011000101110000010110000101001100110011110011011110011001110110111001010000000000000000000000000" "0000000000000000000001101011110111000111011011001110010001011100010111000101011000011100110010000100000100010110111101010000000000000000000000000" - "0010110111100001010001000110100110110001100101011100111011101001110111011100101001110111011100101110111001110101000100001001000110110011100010100" - "1101001000011110101110111001011001001110011010100011000100010110001000100011010110001000100011010001000110001010111011110110111001001100011101011" + "0010110001100001010001000010010010100110001101110100111000111010010011110101100100001001010000100010110001100101000100001011001011110011100010100" + "1101001110011110101110111101101101011001110010001011000111000101101100001010011011110110101111011101001110011010111011110100110100001100011101011" }, }; int data_size = sizeof(data) / sizeof(struct item); + char bwipp_buf[8192]; + char bwipp_msg[1024]; + for (int i = 0; i < data_size; i++) { if (index != -1 && i != index) continue; @@ -561,8 +1445,6 @@ static void test_ean128_cc_shift(int index, int generate, int debug) { symbol->symbology = data[i].symbology; symbol->option_1 = data[i].option_1; - symbol->option_2 = data[i].option_2; - symbol->option_3 = data[i].option_3; symbol->debug |= debug; int length = strlen(data[i].data); @@ -571,11 +1453,11 @@ static void test_ean128_cc_shift(int index, int generate, int debug) { int composite_length = strlen(data[i].composite); - ret = ZBarcode_Encode(symbol, data[i].composite, composite_length); - assert_equal(ret, data[i].ret, "i:%d ret %d != %d %s\n", i, ret, data[i].ret, symbol->errtxt); + ret = ZBarcode_Encode(symbol, (const unsigned char *) data[i].composite, composite_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) { - test_helper_generate(symbol, ret, i, data[i].data, data[i].composite, data[i].option_1, data[i].option_2, data[i].option_3, data[i].comment); + test_helper_generate(symbol, ret, i, data[i].data, data[i].composite, data[i].option_1, data[i].comment, data[i].bwipp_cmp); } else { assert_equal(symbol->rows, data[i].expected_rows, "i:%d %s symbol->rows %d != %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), symbol->rows, data[i].expected_rows, data[i].data); assert_equal(symbol->width, data[i].expected_width, "i:%d %s symbol->width %d != %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), symbol->width, data[i].expected_width, data[i].data); @@ -584,6 +1466,19 @@ static void test_ean128_cc_shift(int index, int generate, int debug) { int width, row; ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); assert_zero(ret, "i:%d %s testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), ret, width, row, data[i].data); + + if (do_bwipp && testUtilCanBwipp(symbol->symbology, data[i].option_1, -1, -1, debug)) { + if (!data[i].bwipp_cmp) { + if (debug & ZINT_DEBUG_TEST_PRINT) printf("%d: %s skipped, not BWIPP compatible\n", i, testUtilBarcodeName(symbol->symbology)); + } else { + ret = testUtilBwipp(symbol, data[i].option_1, -1, -1, data[i].composite, composite_length, symbol->primary, bwipp_buf, sizeof(bwipp_buf)); + assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(data[i].symbology), ret); + + ret = testUtilBwippCmp(symbol, bwipp_msg, bwipp_buf, data[i].expected); + assert_zero(ret, "i:%d %s testUtilBwippCmp %d != 0 %s\n actual: %s\nexpected: %s\n", + i, testUtilBarcodeName(data[i].symbology), ret, bwipp_msg, bwipp_buf, data[i].expected); + } + } } } @@ -599,15 +1494,15 @@ static void test_ean128_cc_width(int index, int generate, int debug) { int ret; struct item { - unsigned char *data; - unsigned char *composite; + char *data; + char *composite; int ret; int expected_rows; int expected_width; char *comment; }; - // Verified manually with bwipp (except very large tests) + // Verified manually with BWIPP (except very large tests) struct item data[] = { /* 0*/ { "[91]1", "[02]13012345678909", 0, 11, 103, "" }, /* 1*/ { "[91]12", "[02]13012345678909", 0, 20, 86, "" }, @@ -642,8 +1537,8 @@ static void test_ean128_cc_width(int index, int generate, int debug) { int composite_length = strlen(data[i].composite); - ret = ZBarcode_Encode(symbol, data[i].composite, composite_length); - assert_equal(ret, data[i].ret, "i:%d ret %d != %d %s\n", i, ret, data[i].ret, symbol->errtxt); + ret = ZBarcode_Encode(symbol, (const unsigned char *) data[i].composite, composite_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(" /*%2d*/ { \"%s\", \"%s\", %s, %d, %d, \"%s\" },\n", @@ -664,24 +1559,24 @@ static void test_encodation_0(int index, int generate, int debug) { testStart(""); + int do_bwipp = (debug & ZINT_DEBUG_TEST_BWIPP) && testUtilHaveGhostscript(); // Only do BWIPP test if asked, too slow otherwise + int ret; struct item { int symbology; - unsigned char *data; - unsigned char *composite; int option_1; - int option_2; - int option_3; + char *data; + char *composite; int ret; int expected_rows; int expected_width; char *comment; - unsigned char *expected; + char *expected; }; - // Verified manually against tec-it.com (with noted exception) and/or bwipp + // Verified via bwipp_dump.ps against BWIPP and manually against tec-it.com (with noted exception) struct item data[] = { - /* 0*/ { BARCODE_UPCE_CC, "1234567", "[91]1", 1, 0, 0, 0, 9, 55, "Single numeric", + /* 0*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]1", 0, 9, 55, "Single numeric", "1101100110111101110101111101010001000111100011110101001" "1101101110111011000010001101110010101110000011100101001" "1101101100110001011111011101111010000100100011101101001" @@ -692,7 +1587,7 @@ static void test_encodation_0(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /* 1*/ { BARCODE_UPCE_CC, "1234567", "[91]12", 1, 0, 0, 0, 9, 55, "2 numerics", + /* 1*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]12", 0, 9, 55, "2 numerics", "1101100110111011101011110001101111110110010011110101001" "1101101110101110011110011001001100110000100011100101001" "1101101100100101111010000001101000001110100011101101001" @@ -703,7 +1598,7 @@ static void test_encodation_0(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /* 2*/ { BARCODE_UPCE_CC, "1234567", "[91]123", 1, 0, 0, 0, 9, 55, "Odd-numbered numeric", + /* 2*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]123", 0, 9, 55, "Odd-numbered numeric", "1101100110111011101011110001000111100010001011110101001" "1101101110100111000111001001101000010001100011100101001" "1101101100110101110001000001111010001000001011101101001" @@ -714,7 +1609,7 @@ static void test_encodation_0(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /* 3*/ { BARCODE_UPCE_CC, "1234567", "[91]1234", 1, 0, 0, 0, 9, 55, "Even-numbered numeric", + /* 3*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]1234", 0, 9, 55, "Even-numbered numeric", "1101100110111011101011110001001111100110010011110101001" "1101101110110001100110011001101100100000010011100101001" "1101101100101111101001110001001110010111110011101101001" @@ -725,7 +1620,7 @@ static void test_encodation_0(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /* 4*/ { BARCODE_UPCE_CC, "1234567", "[20]12[91]12", 1, 0, 0, 0, 9, 55, "Fixed len + even-numbered numeric", + /* 4*/ { BARCODE_UPCE_CC, 1, "1234567", "[20]12[91]12", 0, 9, 55, "Fixed len + even-numbered numeric", "1101100110111111010001100101001111010001000011110101001" "1101101110100011001110011001110010000010111011100101001" "1101101100101111000101111001111010010001000011101101001" @@ -736,7 +1631,7 @@ static void test_encodation_0(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /* 5*/ { BARCODE_UPCE_CC, "1234567", "[20]12[91]123", 1, 0, 0, 0, 9, 55, "Fixed len + odd-numbered numeric", + /* 5*/ { BARCODE_UPCE_CC, 1, "1234567", "[20]12[91]123", 0, 9, 55, "Fixed len + odd-numbered numeric", "1101100110111111010001100101001111010001000011110101001" "1101101110100011001110011001100001101000100011100101001" "1101101100101110010001111101111000010001010011101101001" @@ -747,7 +1642,7 @@ static void test_encodation_0(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /* 6*/ { BARCODE_UPCE_CC, "1234567", "[91]A1234567C", 1, 0, 0, 0, 9, 55, "Alphanumeric followed by 7 digits and alphanumeric", + /* 6*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]A1234567C", 0, 9, 55, "Alphanumeric followed by 7 digits and alphanumeric", "1101100110111011101011110001011100010001100011110101001" "1101101110111001001011100001110010001011100011100101001" "1101101100111000001000110101001011111100111011101101001" @@ -758,7 +1653,7 @@ static void test_encodation_0(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /* 7*/ { BARCODE_UPCE_CC, "1234567", "[91]A123456C", 1, 0, 0, 0, 9, 55, "Alphanumeric followed by 6 digits and alphanumeric", + /* 7*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]A123456C", 0, 9, 55, "Alphanumeric followed by 6 digits and alphanumeric", "1101100110111011101011110001011100010001100011110101001" "1101101110111001001011100001110010001011100011100101001" "1101101100111000011001110101111110011010110011101101001" @@ -769,7 +1664,7 @@ static void test_encodation_0(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /* 8*/ { BARCODE_UPCE_CC, "1234567", "[91]A12345B", 1, 0, 0, 0, 9, 55, "Alphanumeric followed by 5 digits and alphanumeric", + /* 8*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]A12345B", 0, 9, 55, "Alphanumeric followed by 5 digits and alphanumeric", "1101100110111011101011110001011100010001100011110101001" "1101101110110011101100100001110110001000110011100101001" "1101101100101111100110111101111110100101110011101101001" @@ -780,7 +1675,7 @@ static void test_encodation_0(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /* 9*/ { BARCODE_UPCE_CC, "1234567", "[91]A1234567", 1, 0, 0, 0, 9, 55, "Alphanumeric followed by 7 digits, terminating", + /* 9*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]A1234567", 0, 9, 55, "Alphanumeric followed by 7 digits, terminating", "1101100110111011101011110001011100010001100011110101001" "1101101110111001001011100001111001000101111011100101001" "1101101100111101011001100001111100110001010011101101001" @@ -791,7 +1686,7 @@ static void test_encodation_0(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*10*/ { BARCODE_UPCE_CC, "1234567", "[91]A123456", 1, 0, 0, 0, 9, 55, "Alphanumeric followed by 6 digits, terminating", + /*10*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]A123456", 0, 9, 55, "Alphanumeric followed by 6 digits, terminating", "1101100110111011101011110001011100010001100011110101001" "1101101110111001001011100001110010001011100011100101001" "1101101100111100000100010101001111101000111011101101001" @@ -802,7 +1697,7 @@ static void test_encodation_0(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*11*/ { BARCODE_UPCE_CC, "1234567", "[91]A12345", 1, 0, 0, 0, 9, 55, "Alphanumeric followed by 5 digits, terminating", + /*11*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]A12345", 0, 9, 55, "Alphanumeric followed by 5 digits, terminating", "1101100110111011101011110001011100010001100011110101001" "1101101110111001001011100001111001000101111011100101001" "1101101100111000101110001101001111001011110011101101001" @@ -813,7 +1708,7 @@ static void test_encodation_0(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*12*/ { BARCODE_UPCE_CC, "1234567", "[91]A1234", 1, 0, 0, 0, 9, 55, "Alphanumeric followed by 4 digits, terminating", + /*12*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]A1234", 0, 9, 55, "Alphanumeric followed by 4 digits, terminating", "1101100110111011101011110001011100010001100011110101001" "1101101110111001001011100001110110010011000011100101001" "1101101100111100110111001101011111101011000011101101001" @@ -824,7 +1719,7 @@ static void test_encodation_0(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*13*/ { BARCODE_UPCE_CC, "1234567", "[91]A123", 1, 0, 0, 0, 9, 55, "Alphanumeric followed by 3 digits, terminating", + /*13*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]A123", 0, 9, 55, "Alphanumeric followed by 3 digits, terminating", "1101100110111011101011110001011100010001100011110101001" "1101101110110011101100100001001000111001110011100101001" "1101101100100101111100110001011101001111100011101101001" @@ -835,7 +1730,7 @@ static void test_encodation_0(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*14*/ { BARCODE_UPCE_CC, "1234567", "[91]A123[10]C", 1, 0, 0, 0, 9, 55, "Alphanumeric followed by 3 digits, 2-digit AI (3 numerics including FNC1) and alphanumeric", + /*14*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]A123[10]C", 0, 9, 55, "Alphanumeric followed by 3 digits, 2-digit AI (3 numerics including FNC1) and alphanumeric", "1101100110111011101011110001011100010001100011110101001" "1101101110111001001011100001100010101100000011100101001" "1101101100110100001110010001110111101111101011101101001" @@ -846,7 +1741,7 @@ static void test_encodation_0(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*15*/ { BARCODE_UPCE_CC, "1234567", "[91]A12[10]C", 1, 0, 0, 0, 9, 55, "Alphanumeric followed by 2 digits, 2-digit AI (3 numerics including FNC1) and alphanumeric", + /*15*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]A12[10]C", 0, 9, 55, "Alphanumeric followed by 2 digits, 2-digit AI (3 numerics including FNC1) and alphanumeric", "1101100110111011101011110001011100010001100011110101001" "1101101110110011101100100001000001001010000011100101001" "1101101100111110110100001001111110111101101011101101001" @@ -857,7 +1752,7 @@ static void test_encodation_0(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*16*/ { BARCODE_UPCE_CC, "1234567", "[91]A12[10]1", 1, 0, 0, 0, 9, 55, "Alphanumeric followed by 2 digits, 2-digit AI (3 numerics including FNC1) and 1 digit, terminating", + /*16*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]A12[10]1", 0, 9, 55, "Alphanumeric followed by 2 digits, 2-digit AI (3 numerics including FNC1) and 1 digit, terminating", "1101100110111011101011110001011100010001100011110101001" "1101101110111100100101111001000010000110110011100101001" "1101101100100100011110010001001110010111110011101101001" @@ -868,7 +1763,7 @@ static void test_encodation_0(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*17*/ { BARCODE_UPCE_CC, "1234567", "[91]A1[10]1", 1, 0, 0, 0, 9, 55, "Alphanumeric followed by 1 digit, 2-digit AI (3 numerics including FNC1) and 1 digit, terminating; **NOT SAME** as tec-it.com, which does not switch to numeric mode after 'A'; same as bwipp", + /*17*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]A1[10]1", 0, 9, 55, "Alphanumeric followed by 1 digit, 2-digit AI (3 numerics including FNC1) and 1 digit, terminating; **NOT SAME** as tec-it.com, which does not switch to numeric mode after 'A'; same as BWIPP", "1101100110111011101011110001011100010001100011110101001" "1101101110110010011001110001110010010011100011100101001" "1101101100111110110001001001010111111000111011101101001" @@ -879,7 +1774,7 @@ static void test_encodation_0(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*18*/ { BARCODE_UPCE_CC, "1234567", "[91]A[10]1", 1, 0, 0, 0, 9, 55, "Alphanumeric followed by 2-digit AI (3 numerics including FNC1) and 1 digit, terminating", + /*18*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]A[10]1", 0, 9, 55, "Alphanumeric followed by 2-digit AI (3 numerics including FNC1) and 1 digit, terminating", "1101100110111011101011110001101110001000111011110101001" "1101101110111001100010110001100010000010110011100101001" "1101101100101111110010011001001101111110110011101101001" @@ -890,7 +1785,7 @@ static void test_encodation_0(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*19*/ { BARCODE_UPCE_CC, "1234567", "[91]a1234ABCDEFGb", 1, 0, 0, 0, 12, 55, "ISO-646 followed by 11 non-ISO-646 non-terminating, starting 4 digits", + /*19*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]a1234ABCDEFGb", 0, 12, 55, "ISO-646 followed by 11 non-ISO-646 non-terminating, starting 4 digits", "1110111010101100111111011001011111000100111011011011101" "1110011010101100001100111101011101000001100011011011001" "1111011010100100001001000001001110011110110011011010001" @@ -904,7 +1799,7 @@ static void test_encodation_0(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*20*/ { BARCODE_UPCE_CC, "1234567", "[91]a1234ABCDEFb", 1, 0, 0, 0, 12, 55, "ISO-646 followed by 10 non-ISO-646 non-terminating, starting 4 digits", + /*20*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]a1234ABCDEFb", 0, 12, 55, "ISO-646 followed by 10 non-ISO-646 non-terminating, starting 4 digits", "1110111010101100111111011001011111000100111011011011101" "1110011010101100001100111101011101000001100011011011001" "1111011010100100001001000001001110011110110011011010001" @@ -918,7 +1813,7 @@ static void test_encodation_0(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*21*/ { BARCODE_UPCE_CC, "1234567", "[91]a1234ABCDEF", 1, 0, 0, 0, 11, 55, "ISO-646 followed by 10 non-ISO-646 terminating, starting 4 digits", + /*21*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]a1234ABCDEF", 0, 11, 55, "ISO-646 followed by 10 non-ISO-646 terminating, starting 4 digits", "1110110110101100111111011001011111000100111011100010101" "1110010110101100001100111101011101000001100011000010101" "1100010110100100001001000001001110011110110011000110101" @@ -931,7 +1826,7 @@ static void test_encodation_0(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*22*/ { BARCODE_UPCE_CC, "1234567", "[91]a1234ABCDEb", 1, 0, 0, 0, 11, 55, "ISO-646 followed by 9 non-ISO-646 non-terminating, starting 4 digits", + /*22*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]a1234ABCDEb", 0, 11, 55, "ISO-646 followed by 9 non-ISO-646 non-terminating, starting 4 digits", "1110110110101100111111011001011111000100111011100010101" "1110010110101100000010011101110111100010111011000010101" "1100010110110010011100111101011000111100111011000110101" @@ -944,7 +1839,7 @@ static void test_encodation_0(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*23*/ { BARCODE_UPCE_CC, "1234567", "[91]a1234ABCDE", 1, 0, 0, 0, 10, 55, "ISO-646 followed by 9 non-ISO-646 terminating, starting 4 digits", + /*23*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]a1234ABCDE", 0, 10, 55, "ISO-646 followed by 9 non-ISO-646 terminating, starting 4 digits", "1100100010111001101001100001111001111010100011100101101" "1110100010111110010010001101110110011100100011000101101" "1110110010100010100011110001001111000011011011000101001" @@ -956,7 +1851,7 @@ static void test_encodation_0(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*24*/ { BARCODE_UPCE_CC, "1234567", "[91]a123ABCDEFGb", 1, 0, 0, 0, 12, 55, "ISO-646 followed by 10 non-ISO-646 non-terminating, starting 3 digits (5 alphanumerics rule applies)", + /*24*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]a123ABCDEFGb", 0, 12, 55, "ISO-646 followed by 10 non-ISO-646 non-terminating, starting 3 digits (5 alphanumerics rule applies)", "1110111010101100111111011001011111000100111011011011101" "1110011010100100000010111101101111001100111011011011001" "1111011010111101100100011101001011110111100011011010001" @@ -970,7 +1865,7 @@ static void test_encodation_0(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*25*/ { BARCODE_UPCE_CC, "1234567", "[91]aABCDEF12345b", 1, 0, 0, 0, 12, 55, "ISO-646 followed by 11 non-ISO-646 non-terminating, starting 6 letters", + /*25*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]aABCDEF12345b", 0, 12, 55, "ISO-646 followed by 11 non-ISO-646 non-terminating, starting 6 letters", "1110111010101100111111011001011111000100111011011011101" "1110011010101100000110111101111010011111011011011011001" "1111011010100001001100001101010010000010000011011010001" @@ -984,7 +1879,7 @@ static void test_encodation_0(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*26*/ { BARCODE_UPCE_CC, "1234567", "[91]aABCDEF1234b", 1, 0, 0, 0, 12, 55, "ISO-646 followed by 10 non-ISO-646 non-terminating, starting 6 letters", + /*26*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]aABCDEF1234b", 0, 12, 55, "ISO-646 followed by 10 non-ISO-646 non-terminating, starting 6 letters", "1110111010101100111111011001011111000100111011011011101" "1110011010101100000110111101111010011111011011011011001" "1111011010100001001100001101010010000010000011011010001" @@ -998,7 +1893,7 @@ static void test_encodation_0(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*27*/ { BARCODE_UPCE_CC, "1234567", "[91]aABCDE12345b", 1, 0, 0, 0, 12, 55, "ISO-646 followed by 10 non-ISO-646 non-terminating, starting 5 letters", + /*27*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]aABCDE12345b", 0, 12, 55, "ISO-646 followed by 10 non-ISO-646 non-terminating, starting 5 letters", "1110111010101100111111011001011111000100111011011011101" "1110011010101100000110111101111010011111011011011011001" "1111011010100001001100001101010010000010000011011010001" @@ -1012,7 +1907,7 @@ static void test_encodation_0(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*28*/ { BARCODE_UPCE_CC, "1234567", "[91]aABCDE12345", 1, 0, 0, 0, 11, 55, "ISO-646 followed by 10 non-ISO-646 terminating, starting 5 letters", + /*28*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]aABCDE12345", 0, 11, 55, "ISO-646 followed by 10 non-ISO-646 terminating, starting 5 letters", "1110110110101100111111011001011111000100111011100010101" "1110010110101100000110111101111010011111011011000010101" "1100010110100001001100001101010010000010000011000110101" @@ -1025,7 +1920,7 @@ static void test_encodation_0(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*29*/ { BARCODE_UPCE_CC, "1234567", "[91]aABCD012345b", 1, 0, 0, 0, 12, 55, "ISO-646 followed by 10 non-ISO-646 non-terminating, starting 4 letters + numeric", + /*29*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]aABCD012345b", 0, 12, 55, "ISO-646 followed by 10 non-ISO-646 non-terminating, starting 4 letters + numeric", "1110111010101100111111011001011111000100111011011011101" "1110011010101100000110111101111010011111011011011011001" "1111011010100001001100001101110101000111000011011010001" @@ -1039,7 +1934,7 @@ static void test_encodation_0(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*30*/ { BARCODE_UPCE_CC, "1234567", "[91]aABCD012345", 1, 0, 0, 0, 10, 55, "ISO-646 followed by 10 non-ISO-646 terminating, starting 4 letters + numeric", + /*30*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]aABCD012345", 0, 10, 55, "ISO-646 followed by 10 non-ISO-646 terminating, starting 4 letters + numeric", "1100100010111001101001100001111001111010100011100101101" "1110100010111001001101000001111010011011000011000101101" "1110110010100001100100011101110101000111111011000101001" @@ -1051,7 +1946,7 @@ static void test_encodation_0(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*31*/ { BARCODE_UPCE_CC, "1234567", "[91]aABCDE1234b", 1, 0, 0, 0, 11, 55, "ISO-646 followed by 9 non-ISO-646 non-terminating, starting 5 letters", + /*31*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]aABCDE1234b", 0, 11, 55, "ISO-646 followed by 9 non-ISO-646 non-terminating, starting 5 letters", "1110110110101100111111011001011111000100111011100010101" "1110010110100010110001111101011000001101111011000010101" "1100010110111101101100111101000110000110100011000110101" @@ -1064,7 +1959,7 @@ static void test_encodation_0(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*32*/ { BARCODE_UPCE_CC, "1234567", "[91]aABCDE1234", 1, 0, 0, 0, 10, 55, "ISO-646 followed by 9 non-ISO-646 terminating, starting 5 letters", + /*32*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]aABCDE1234", 0, 10, 55, "ISO-646 followed by 9 non-ISO-646 terminating, starting 5 letters", "1100100010111001101001100001111001111010100011100101101" "1110100010111001001101000001111010011011000011000101101" "1110110010100001100100011101110101111110011011000101001" @@ -1076,7 +1971,7 @@ static void test_encodation_0(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*33*/ { BARCODE_UPCE_CC, "1234567", "[91]aABCDE123", 1, 0, 0, 0, 10, 55, "ISO-646 followed by 8 non-ISO-646 terminating, starting 5 letters", + /*33*/ { BARCODE_UPCE_CC, 1, "1234567", "[91]aABCDE123", 0, 10, 55, "ISO-646 followed by 8 non-ISO-646 terminating, starting 5 letters", "1100100010111001101001100001111001111010100011100101101" "1110100010111001001101000001111010011011000011000101101" "1110110010100001100100011101110101111110011011000101001" @@ -1091,6 +1986,9 @@ static void test_encodation_0(int index, int generate, int debug) { }; int data_size = sizeof(data) / sizeof(struct item); + char bwipp_buf[8192]; + char bwipp_msg[1024]; + for (int i = 0; i < data_size; i++) { if (index != -1 && i != index) continue; @@ -1100,8 +1998,6 @@ static void test_encodation_0(int index, int generate, int debug) { symbol->symbology = data[i].symbology; symbol->option_1 = data[i].option_1; - symbol->option_2 = data[i].option_2; - symbol->option_3 = data[i].option_3; symbol->debug |= debug; int length = strlen(data[i].data); @@ -1110,11 +2006,11 @@ static void test_encodation_0(int index, int generate, int debug) { int composite_length = strlen(data[i].composite); - ret = ZBarcode_Encode(symbol, data[i].composite, composite_length); - assert_equal(ret, data[i].ret, "i:%d ret %d != %d %s\n", i, ret, data[i].ret, symbol->errtxt); + ret = ZBarcode_Encode(symbol, (const unsigned char *) data[i].composite, composite_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) { - test_helper_generate(symbol, ret, i, data[i].data, data[i].composite, data[i].option_1, data[i].option_2, data[i].option_3, data[i].comment); + test_helper_generate(symbol, ret, i, data[i].data, data[i].composite, data[i].option_1, data[i].comment, -1 /*bwipp_cmp*/); } else { assert_equal(symbol->rows, data[i].expected_rows, "i:%d %s symbol->rows %d != %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), symbol->rows, data[i].expected_rows, data[i].data); assert_equal(symbol->width, data[i].expected_width, "i:%d %s symbol->width %d != %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), symbol->width, data[i].expected_width, data[i].data); @@ -1123,6 +2019,15 @@ static void test_encodation_0(int index, int generate, int debug) { int width, row; ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); assert_zero(ret, "i:%d %s testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), ret, width, row, data[i].data); + + if (do_bwipp && testUtilCanBwipp(symbol->symbology, data[i].option_1, -1, -1, debug)) { + ret = testUtilBwipp(symbol, data[i].option_1, -1, -1, data[i].composite, composite_length, symbol->primary, bwipp_buf, sizeof(bwipp_buf)); + assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(data[i].symbology), ret); + + ret = testUtilBwippCmp(symbol, bwipp_msg, bwipp_buf, data[i].expected); + assert_zero(ret, "i:%d %s testUtilBwippCmp %d != 0 %s\n actual: %s\nexpected: %s\n", + i, testUtilBarcodeName(data[i].symbology), ret, bwipp_msg, bwipp_buf, data[i].expected); + } } } @@ -1136,24 +2041,24 @@ static void test_encodation_10(int index, int generate, int debug) { testStart(""); + int do_bwipp = (debug & ZINT_DEBUG_TEST_BWIPP) && testUtilHaveGhostscript(); // Only do BWIPP test if asked, too slow otherwise + int ret; struct item { int symbology; - unsigned char *data; - unsigned char *composite; int option_1; - int option_2; - int option_3; + char *data; + char *composite; int ret; int expected_rows; int expected_width; char *comment; - unsigned char *expected; + char *expected; }; - // Verified manually against bwipp (and with noted exceptions, tec-it.com) + // Verified via bwipp_dump.ps against BWIPP, and manually, with noted exceptions, against tec-it.com struct item data[] = { - /* 0*/ { BARCODE_UPCE_CC, "1234567", "[11]201001[10]AB1234", 1, 0, 0, 0, 9, 55, "Mode '10' date + even-numbered numeric lot, 1st fit, alphanumeric latch and padding", + /* 0*/ { BARCODE_UPCE_CC, 1, "1234567", "[11]201001[10]AB1234", 0, 9, 55, "Mode '10' date + even-numbered numeric lot, 1st fit, alphanumeric latch and padding", "1101100110101110000100011001001000100111100011110101001" "1101101110110010100011000001100110010000001011100101001" "1101101100111011011101000001110100111000110011101101001" @@ -1164,7 +2069,7 @@ static void test_encodation_10(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /* 1*/ { BARCODE_UPCE_CC, "1234567", "[11]201001[10]AB12345", 1, 0, 0, 0, 9, 55, "Mode '10' date + odd-numbered numeric lot, 1st fit, 7-bit final, no alphanumeric latch or padding", + /* 1*/ { BARCODE_UPCE_CC, 1, "1234567", "[11]201001[10]AB12345", 0, 9, 55, "Mode '10' date + odd-numbered numeric lot, 1st fit, 7-bit final, no alphanumeric latch or padding", "1101100110101110000100011001001000100111100011110101001" "1101101110110010100011000001100110010000001011100101001" "1101101100111011011101000001111010000110110011101101001" @@ -1175,7 +2080,7 @@ static void test_encodation_10(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /* 2*/ { BARCODE_UPCE_CC, "1234567", "[11]201001", 1, 0, 0, 0, 9, 55, "Mode '10' date, no lot or other data", + /* 2*/ { BARCODE_UPCE_CC, 1, "1234567", "[11]201001", 0, 9, 55, "Mode '10' date, no lot or other data", "1101100110101110000100011001001000100111100011110101001" "1101101110110010100110000001010000010010000011100101001" "1101101100111011000001110101000001011111011011101101001" @@ -1186,7 +2091,7 @@ static void test_encodation_10(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /* 3*/ { BARCODE_UPCE_CC, "1234567", "[11]201001[20]12", 1, 0, 0, 0, 9, 55, "Mode '10' date, no lot, other data", + /* 3*/ { BARCODE_UPCE_CC, 1, "1234567", "[11]201001[20]12", 0, 9, 55, "Mode '10' date, no lot, other data", "1101100110101110000100011001100100010011111011110101001" "1101101110101110111010000001000101100001100011100101001" "1101101100111010011000100001111110101001110011101101001" @@ -1197,7 +2102,7 @@ static void test_encodation_10(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /* 4*/ { BARCODE_UPCE_CC, "1234567", "[10]1234", 1, 0, 0, 0, 9, 55, "Mode '10' no date, numeric lot, no other data; **NOT SAME** as tec-it.com; same as bwipp", + /* 4*/ { BARCODE_UPCE_CC, 1, "1234567", "[10]1234", 0, 9, 55, "Mode '10' no date, numeric lot, no other data; **NOT SAME** as tec-it.com; same as BWIPP", "1101100110100111000110011101110011100101111011110101001" "1101101110110100100110000001111011100101100011100101001" "1101101100100111101011110001111110011010110011101101001" @@ -1208,7 +2113,7 @@ static void test_encodation_10(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /* 5*/ { BARCODE_UPCE_CC, "1234567", "[10]ABCD", 1, 0, 0, 0, 9, 55, "Mode '10' no date, alphanumeric lot, no other data; **NOT SAME** as tec-it.com; same as bwipp", + /* 5*/ { BARCODE_UPCE_CC, 1, "1234567", "[10]ABCD", 0, 9, 55, "Mode '10' no date, alphanumeric lot, no other data; **NOT SAME** as tec-it.com; same as BWIPP", "1101100110101111001100011001111000010111101011110101001" "1101101110100010111100111101100110010010000011100101001" "1101101100100111101001111001000010111110110011101101001" @@ -1222,6 +2127,9 @@ static void test_encodation_10(int index, int generate, int debug) { }; int data_size = sizeof(data) / sizeof(struct item); + char bwipp_buf[8192]; + char bwipp_msg[1024]; + for (int i = 0; i < data_size; i++) { if (index != -1 && i != index) continue; @@ -1231,8 +2139,6 @@ static void test_encodation_10(int index, int generate, int debug) { symbol->symbology = data[i].symbology; symbol->option_1 = data[i].option_1; - symbol->option_2 = data[i].option_2; - symbol->option_3 = data[i].option_3; symbol->debug |= debug; int length = strlen(data[i].data); @@ -1241,11 +2147,11 @@ static void test_encodation_10(int index, int generate, int debug) { int composite_length = strlen(data[i].composite); - ret = ZBarcode_Encode(symbol, data[i].composite, composite_length); - assert_equal(ret, data[i].ret, "i:%d ret %d != %d %s\n", i, ret, data[i].ret, symbol->errtxt); + ret = ZBarcode_Encode(symbol, (const unsigned char *) data[i].composite, composite_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) { - test_helper_generate(symbol, ret, i, data[i].data, data[i].composite, data[i].option_1, data[i].option_2, data[i].option_3, data[i].comment); + test_helper_generate(symbol, ret, i, data[i].data, data[i].composite, data[i].option_1, data[i].comment, -1 /*bwipp_cmp*/); } else { assert_equal(symbol->rows, data[i].expected_rows, "i:%d %s symbol->rows %d != %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), symbol->rows, data[i].expected_rows, data[i].data); assert_equal(symbol->width, data[i].expected_width, "i:%d %s symbol->width %d != %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), symbol->width, data[i].expected_width, data[i].data); @@ -1254,6 +2160,15 @@ static void test_encodation_10(int index, int generate, int debug) { int width, row; ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); assert_zero(ret, "i:%d %s testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), ret, width, row, data[i].data); + + if (do_bwipp && testUtilCanBwipp(symbol->symbology, data[i].option_1, -1, -1, debug)) { + ret = testUtilBwipp(symbol, data[i].option_1, -1, -1, data[i].composite, composite_length, symbol->primary, bwipp_buf, sizeof(bwipp_buf)); + assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(data[i].symbology), ret); + + ret = testUtilBwippCmp(symbol, bwipp_msg, bwipp_buf, data[i].expected); + assert_zero(ret, "i:%d %s testUtilBwippCmp %d != 0 %s\n actual: %s\nexpected: %s\n", + i, testUtilBarcodeName(data[i].symbology), ret, bwipp_msg, bwipp_buf, data[i].expected); + } } } @@ -1267,24 +2182,24 @@ static void test_encodation_11(int index, int generate, int debug) { testStart(""); + int do_bwipp = (debug & ZINT_DEBUG_TEST_BWIPP) && testUtilHaveGhostscript(); // Only do BWIPP test if asked, too slow otherwise + int ret; struct item { int symbology; - unsigned char *data; - unsigned char *composite; int option_1; - int option_2; - int option_3; + char *data; + char *composite; int ret; int expected_rows; int expected_width; char *comment; - unsigned char *expected; + char *expected; }; - // Verified manually against tec-it.com (with noted exception) (bwipp 2019-10-13 has some issues with encodation 11 so not used) + // Verified via bwipp_dump.ps against BWIPP, and manually against tec-it.com (with noted exception) struct item data[] = { - /* 0*/ { BARCODE_UPCE_CC, "1234567", "[90]A", 1, 0, 0, 0, 9, 55, "Mode '11', letter prefix only", + /* 0*/ { BARCODE_UPCE_CC, 1, "1234567", "[90]A", 0, 9, 55, "Mode '11', letter prefix only", "1101100110100111100000101001110110010011111011110101001" "1101101110110001000101100001100011010010000011100101001" "1101101100110001000011100101001110010011111011101101001" @@ -1295,7 +2210,7 @@ static void test_encodation_11(int index, int generate, int debug) "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /* 1*/ { BARCODE_UPCE_CC, "1234567", "[90]1A", 1, 0, 0, 0, 9, 55, "Mode '11', 1 digit letter prefix only", + /* 1*/ { BARCODE_UPCE_CC, 1, "1234567", "[90]1A", 0, 9, 55, "Mode '11', 1 digit letter prefix only", "1101100110100111100000101001011001000111000011110101001" "1101101110101101111011100001011100111010000011100101001" "1101101100111000010011010001101011100001000011101101001" @@ -1306,7 +2221,7 @@ static void test_encodation_11(int index, int generate, int debug) "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /* 2*/ { BARCODE_UPCE_CC, "1234567", "[90]12A", 1, 0, 0, 0, 9, 55, "Mode '11', 2 digit letter prefix only", + /* 2*/ { BARCODE_UPCE_CC, 1, "1234567", "[90]12A", 0, 9, 55, "Mode '11', 2 digit letter prefix only", "1101100110100111100000101001011001101111000011110101001" "1101101110110001010000110001110111010000010011100101001" "1101101100111110011010000101111100100110111011101101001" @@ -1317,7 +2232,7 @@ static void test_encodation_11(int index, int generate, int debug) "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /* 3*/ { BARCODE_UPCE_CC, "1234567", "[90]123A", 1, 0, 0, 0, 9, 55, "Mode '11', 3 digit letter prefix only", + /* 3*/ { BARCODE_UPCE_CC, 1, "1234567", "[90]123A", 0, 9, 55, "Mode '11', 3 digit letter prefix only", "1101100110100111100000101001100110101111000011110101001" "1101101110100001001010000001101110110100000011100101001" "1101101100111110110000101001100101111100111011101101001" @@ -1328,7 +2243,7 @@ static void test_encodation_11(int index, int generate, int debug) "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /* 4*/ { BARCODE_UPCE_CC, "1234567", "[90]A1234", 1, 0, 0, 0, 9, 55, "Mode '11', even-numbered numeric [90]", + /* 4*/ { BARCODE_UPCE_CC, 1, "1234567", "[90]A1234", 0, 9, 55, "Mode '11', even-numbered numeric [90]", "1101100110100111100000101001110110010011111011110101001" "1101101110110001000100110001101000100110000011100101001" "1101101100111100010111011101100011011110100011101101001" @@ -1339,7 +2254,7 @@ static void test_encodation_11(int index, int generate, int debug) "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /* 5*/ { BARCODE_UPCE_CC, "1234567", "[90]A12345", 1, 0, 0, 0, 9, 55, "Mode '11', odd-numbered numeric [90]", + /* 5*/ { BARCODE_UPCE_CC, 1, "1234567", "[90]A12345", 0, 9, 55, "Mode '11', odd-numbered numeric [90]", "1101100110100111100000101001110110010011111011110101001" "1101101110110001000100110001110100010011100011100101001" "1101101100101000011110010001110100011010000011101101001" @@ -1350,7 +2265,7 @@ static void test_encodation_11(int index, int generate, int debug) "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /* 6*/ { BARCODE_UPCE_CC, "1234567", "[90]1ABC4", 1, 0, 0, 0, 9, 55, "Mode '11', alpha [90]", + /* 6*/ { BARCODE_UPCE_CC, 1, "1234567", "[90]1ABC4", 0, 9, 55, "Mode '11', alpha [90]", "1101100110100111110110010001001110011000111011110101001" "1101101110110110011000011001010011000011000011100101001" "1101101100101000111100000101110000100110010011101101001" @@ -1361,7 +2276,7 @@ static void test_encodation_11(int index, int generate, int debug) "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /* 7*/ { BARCODE_UPCE_CC, "1234567", "[90]1AB34", 1, 0, 0, 0, 9, 55, "Mode '11', alphanumeric [90] (letters <= numbers)", + /* 7*/ { BARCODE_UPCE_CC, 1, "1234567", "[90]1AB34", 0, 9, 55, "Mode '11', alphanumeric [90] (letters <= numbers)", "1101100110100011100110111001011111101110010011110101001" "1101101110110000110100010001100101100011100011100101001" "1101101100110010000011100101101100011110001011101101001" @@ -1372,7 +2287,7 @@ static void test_encodation_11(int index, int generate, int debug) "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /* 8*/ { BARCODE_UPCE_CC, "1234567", "[90]1AB.D", 1, 0, 0, 0, 9, 55, "Mode '11', alphanumeric [90]", + /* 8*/ { BARCODE_UPCE_CC, 1, "1234567", "[90]1AB.D", 0, 9, 55, "Mode '11', alphanumeric [90]", "1101100110100011100110111001011111101110010011110101001" "1101101110110000110100010001000010100000100011100101001" "1101101100101110100001111101110111000111101011101101001" @@ -1383,7 +2298,7 @@ static void test_encodation_11(int index, int generate, int debug) "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /* 9*/ { BARCODE_UPCE_CC, "1234567", "[90]1AB+D", 1, 0, 0, 0, 9, 55, "Mode '11', ISO-646 [90]", + /* 9*/ { BARCODE_UPCE_CC, 1, "1234567", "[90]1AB+D", 0, 9, 55, "Mode '11', ISO-646 [90]", "1101100110100011100110111001011111101110010011110101001" "1101101110110000110100010001101000111001111011100101001" "1101101100111110110100001001100101111101110011101101001" @@ -1394,7 +2309,7 @@ static void test_encodation_11(int index, int generate, int debug) "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*10*/ { BARCODE_UPCE_CC, "1234567", "[90]1A+BD", 1, 0, 0, 0, 9, 55, "Mode '11', immediate ISO-646 [90]", + /*10*/ { BARCODE_UPCE_CC, 1, "1234567", "[90]1A+BD", 0, 9, 55, "Mode '11', immediate ISO-646 [90]", "1101100110100011100110111001011111101110010011110101001" "1101101110101111000111100101111011101011000011100101001" "1101101100101000011110010001001111001011110011101101001" @@ -1405,8 +2320,8 @@ static void test_encodation_11(int index, int generate, int debug) "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*11*/ { BARCODE_UPCE_CC, "1234567", "[90]1AB#D", 1, 0, 0, ZINT_ERROR_INVALID_DATA, 0, 0, "Mode '11', invalid char [90]", "" }, - /*12*/ { BARCODE_UPCE_CC, "1234567", "[90]A12345[21]AB", 1, 0, 0, 0, 10, 55, "Mode '11', numeric [90], with [21]", + /*11*/ { BARCODE_UPCE_CC, 1, "1234567", "[90]1AB#D", ZINT_ERROR_INVALID_DATA, 0, 0, "Mode '11', invalid char [90]", "" }, + /*12*/ { BARCODE_UPCE_CC, 1, "1234567", "[90]A12345[21]AB", 0, 10, 55, "Mode '11', numeric [90], with [21]", "1100100010111000111011011001001100011000010011100101101" "1110100010101000001111001001111100110100010011000101101" "1110110010101110010000110001100111000100111011000101001" @@ -1418,7 +2333,7 @@ static void test_encodation_11(int index, int generate, int debug) "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*13*/ { BARCODE_UPCE_CC, "1234567", "[90]1ABC4[21]AB12", 1, 0, 0, 0, 10, 55, "Mode '11', alpha [90], with [21]", + /*13*/ { BARCODE_UPCE_CC, 1, "1234567", "[90]1ABC4[21]AB12", 0, 10, 55, "Mode '11', alpha [90], with [21]", "1100100010100011100111101101011000111000110011100101101" "1110100010111010000110001001110100011000001011000101101" "1110110010100001100100011101110111111010100011000101001" @@ -1430,7 +2345,7 @@ static void test_encodation_11(int index, int generate, int debug) "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*14*/ { BARCODE_UPCE_CC, "1234567", "[90]1AB.D[21]AB", 1, 0, 0, 0, 10, 55, "Mode '11', alphanumeric [90], with [21]", + /*14*/ { BARCODE_UPCE_CC, 1, "1234567", "[90]1AB.D[21]AB", 0, 10, 55, "Mode '11', alphanumeric [90], with [21]", "1100100010110011100011000101110001110110011011100101101" "1110100010111101101100100001110010011100011011000101101" "1110110010110000110101111001011100110001110011000101001" @@ -1442,7 +2357,7 @@ static void test_encodation_11(int index, int generate, int debug) "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*15*/ { BARCODE_UPCE_CC, "1234567", "[90]1AB+D[21]A.", 1, 0, 0, 0, 10, 55, "Mode '11', ISO-646 [90], with [21]; **NOT SAME** as tec-it.com, which probably includes '21' in 5 alphanumeric count", + /*15*/ { BARCODE_UPCE_CC, 1, "1234567", "[90]1AB+D[21]A.", 0, 10, 55, "Mode '11', ISO-646 [90], with [21]; **NOT SAME** as tec-it.com, which probably includes '21' in 5 alphanumeric count", "1100100010110011100011000101110001110110011011100101101" "1110100010111101101100100001110101110001100011000101101" "1110110010100000111000101101110010111110001011000101001" @@ -1454,7 +2369,7 @@ static void test_encodation_11(int index, int generate, int debug) "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*16*/ { BARCODE_UPCE_CC, "1234567", "[90]1A+BD[21]A12", 1, 0, 0, 0, 11, 55, "Mode '11', immediate ISO-646 [90], with [21]; tec-it.com same, probably since have 5 alphanumerics with or without '21'", + /*16*/ { BARCODE_UPCE_CC, 1, "1234567", "[90]1A+BD[21]A12", 0, 11, 55, "Mode '11', immediate ISO-646 [90], with [21]; tec-it.com same, probably since have 5 alphanumerics with or without '21'", "1110110110111100011000110101100111101011111011100010101" "1110010110100100001101111101000100010111100011000010101" "1100010110100010100000100001110011101000001011000110101" @@ -1467,7 +2382,7 @@ static void test_encodation_11(int index, int generate, int debug) "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*17*/ { BARCODE_UPCE_CC, "1234567", "[90]A12[8004]12", 1, 0, 0, 0, 9, 55, "Mode '11', numeric [90], with [8004]", + /*17*/ { BARCODE_UPCE_CC, 1, "1234567", "[90]A12[8004]12", 0, 9, 55, "Mode '11', numeric [90], with [8004]", "1101100110110001111010011001000001101101111011110101001" "1101101110110100100000110001011100111101100011100101001" "1101101100110100000111010001100100001110001011101101001" @@ -1478,7 +2393,7 @@ static void test_encodation_11(int index, int generate, int debug) "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*18*/ { BARCODE_UPCE_CC, "1234567", "[90]AB[8004]12", 1, 0, 0, 0, 9, 55, "Mode '11', alpha [90], with [8004]", + /*18*/ { BARCODE_UPCE_CC, 1, "1234567", "[90]AB[8004]12", 0, 9, 55, "Mode '11', alpha [90], with [8004]", "1101100110100111110011001001100101111110010011110101001" "1101101110101000100000100001011000111001100011100101001" "1101101100100111110100011101111000100001001011101101001" @@ -1489,7 +2404,7 @@ static void test_encodation_11(int index, int generate, int debug) "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*19*/ { BARCODE_UPCE_CC, "1234567", "[90]A.[8004]12", 1, 0, 0, 0, 9, 55, "Mode '11', alphanumeric [90], with [8004]", + /*19*/ { BARCODE_UPCE_CC, 1, "1234567", "[90]A.[8004]12", 0, 9, 55, "Mode '11', alphanumeric [90], with [8004]", "1101100110110111110011001101111110100110001011110101001" "1101101110100010001001000001100101100011100011100101001" "1101101100100001011110001001100001100111101011101101001" @@ -1500,7 +2415,7 @@ static void test_encodation_11(int index, int generate, int debug) "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*20*/ { BARCODE_UPCE_CC, "1234567", "[90]A+[8004]12", 1, 0, 0, 0, 9, 55, "Mode '11', ISO-646 [90], with [8004]", + /*20*/ { BARCODE_UPCE_CC, 1, "1234567", "[90]A+[8004]12", 0, 9, 55, "Mode '11', ISO-646 [90], with [8004]", "1101100110110111110011001101111110100110001011110101001" "1101101110111100110010111001001110001110100011100101001" "1101101100111001011100011001101001110000010011101101001" @@ -1511,7 +2426,7 @@ static void test_encodation_11(int index, int generate, int debug) "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*21*/ { BARCODE_UPCE_CC, "1234567", "[90]12A1[10]12", 1, 0, 0, 0, 9, 55, "Mode '11', numeric [90], other data", + /*21*/ { BARCODE_UPCE_CC, 1, "1234567", "[90]12A1[10]12", 0, 9, 55, "Mode '11', numeric [90], other data", "1101100110100111100000101001011001101111000011110101001" "1101101110111000101101111001110110100001100011100101001" "1101101100111100001010001001110000100110010011101101001" @@ -1522,7 +2437,7 @@ static void test_encodation_11(int index, int generate, int debug) "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*22*/ { BARCODE_UPCE_CC, "1234567", "[90]123AB[10]12", 1, 0, 0, 0, 9, 55, "Mode '11', alpha [90], other data", + /*22*/ { BARCODE_UPCE_CC, 1, "1234567", "[90]123AB[10]12", 0, 9, 55, "Mode '11', alpha [90], other data", "1101100110100111110110010001100011101000111011110101001" "1101101110111001110100000101100110001100110011100101001" "1101101100110110011111001101111010100001000011101101001" @@ -1533,7 +2448,7 @@ static void test_encodation_11(int index, int generate, int debug) "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*23*/ { BARCODE_UPCE_CC, "1234567", "[90]123AB.D[10]12", 1, 0, 0, 0, 10, 55, "Mode '11', alphanumeric [90], other data", + /*23*/ { BARCODE_UPCE_CC, 1, "1234567", "[90]123AB.D[10]12", 0, 10, 55, "Mode '11', alphanumeric [90], other data", "1100100010100011000110000101110110000100110011100101101" "1110100010101101111100100001011111001001110011000101101" "1110110010101111100110001001101111001000110011000101001" @@ -1545,7 +2460,7 @@ static void test_encodation_11(int index, int generate, int debug) "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*24*/ { BARCODE_UPCE_CC, "1234567", "[90]123AB+D[10]12", 1, 0, 0, 0, 10, 55, "Mode '11', ISO-646 [90], other data", + /*24*/ { BARCODE_UPCE_CC, 1, "1234567", "[90]123AB+D[10]12", 0, 10, 55, "Mode '11', ISO-646 [90], other data", "1100100010100011000110000101110110000100110011100101101" "1110100010101101111100100001100100111000001011000101101" "1110110010100010110011111001000110100111000011000101001" @@ -1557,7 +2472,7 @@ static void test_encodation_11(int index, int generate, int debug) "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*25*/ { BARCODE_UPCE_CC, "1234567", "[90]A123[21]AB[91]A123", 1, 0, 0, 0, 12, 55, "Mode '11', numeric [90], with [21], other data", + /*25*/ { BARCODE_UPCE_CC, 1, "1234567", "[90]A123[21]AB[91]A123", 0, 12, 55, "Mode '11', numeric [90], with [21], other data", "1110111010100001100111110101100010011110110011011011101" "1110011010111111011011100101001110110011100011011011001" "1111011010101000111011100001001011110011110011011010001" @@ -1571,7 +2486,7 @@ static void test_encodation_11(int index, int generate, int debug) "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*26*/ { BARCODE_UPCE_CC, "1234567", "[90]AB[8004]1[10]12", 1, 0, 0, 0, 9, 55, "Mode '11', alpha [90], with [8004], other data", + /*26*/ { BARCODE_UPCE_CC, 1, "1234567", "[90]AB[8004]1[10]12", 0, 9, 55, "Mode '11', alpha [90], with [8004], other data", "1101100110100111110011001001100101111110010011110101001" "1101101110101000100000100001101100011100111011100101001" "1101101100100010011111011001100110011110001011101101001" @@ -1582,9 +2497,23 @@ static void test_encodation_11(int index, int generate, int debug) "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, + /*27*/ { BARCODE_UPCE_CC, 1, "1234567", "[90]12A1234B", 0, 9, 55, "Mode '11', alphanumeric [90], with first 4 digits (choosing NUMERIC would be better, not implemented)", + "1101100110100011100110111001001111100011001011110101001" + "1101101110100101100000110001111010110011111011100101001" + "1101101100111100000101001001111110111101101011101101001" + "1101101000100000011101011001001110100000110011101001001" + "1101001000111000110100011001100011000010001011101001101" + "0001000000000000000000000000000000000000000000000000010" + "0010000000000000000000000000000000000000000000000000001" + "0001000000000000000000000000000000000000000000000000010" + "0001010010011011110101000110111001000010100100010101010" + }, }; int data_size = sizeof(data) / sizeof(struct item); + char bwipp_buf[8192]; + char bwipp_msg[1024]; + for (int i = 0; i < data_size; i++) { if (index != -1 && i != index) continue; @@ -1594,8 +2523,6 @@ static void test_encodation_11(int index, int generate, int debug) symbol->symbology = data[i].symbology; symbol->option_1 = data[i].option_1; - symbol->option_2 = data[i].option_2; - symbol->option_3 = data[i].option_3; symbol->debug |= debug; int length = strlen(data[i].data); @@ -1604,11 +2531,11 @@ static void test_encodation_11(int index, int generate, int debug) int composite_length = strlen(data[i].composite); - ret = ZBarcode_Encode(symbol, data[i].composite, composite_length); - assert_equal(ret, data[i].ret, "i:%d ret %d != %d %s\n", i, ret, data[i].ret, symbol->errtxt); + ret = ZBarcode_Encode(symbol, (const unsigned char *) data[i].composite, composite_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) { - test_helper_generate(symbol, ret, i, data[i].data, data[i].composite, data[i].option_1, data[i].option_2, data[i].option_3, data[i].comment); + test_helper_generate(symbol, ret, i, data[i].data, data[i].composite, data[i].option_1, data[i].comment, -1 /*bwipp_cmp*/); } else { assert_equal(symbol->rows, data[i].expected_rows, "i:%d %s symbol->rows %d != %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), symbol->rows, data[i].expected_rows, data[i].data); assert_equal(symbol->width, data[i].expected_width, "i:%d %s symbol->width %d != %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), symbol->width, data[i].expected_width, data[i].data); @@ -1617,6 +2544,15 @@ static void test_encodation_11(int index, int generate, int debug) int width, row; ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); assert_zero(ret, "i:%d %s testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), ret, width, row, data[i].data); + + if (do_bwipp && testUtilCanBwipp(symbol->symbology, data[i].option_1, -1, -1, debug)) { + ret = testUtilBwipp(symbol, data[i].option_1, -1, -1, data[i].composite, composite_length, symbol->primary, bwipp_buf, sizeof(bwipp_buf)); + assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(data[i].symbology), ret); + + ret = testUtilBwippCmp(symbol, bwipp_msg, bwipp_buf, data[i].expected); + assert_zero(ret, "i:%d %s testUtilBwippCmp %d != 0 %s\n actual: %s\nexpected: %s\n", + i, testUtilBarcodeName(data[i].symbology), ret, bwipp_msg, bwipp_buf, data[i].expected); + } } } @@ -1634,9 +2570,9 @@ static void test_fuzz(int index, int debug) int ret; struct item { int symbology; - unsigned char *data; + char *data; int length; - unsigned char *composite; + char *composite; int ret; }; // s/\/\*[ 0-9]*\*\//\=printf("\/*%2d*\/", line(".") - line("'<")) @@ -1668,8 +2604,8 @@ static void test_fuzz(int index, int debug) int composite_length = strlen(data[i].composite); - ret = ZBarcode_Encode(symbol, data[i].composite, composite_length); - assert_equal(ret, data[i].ret, "i:%d ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt); + ret = ZBarcode_Encode(symbol, (const unsigned char *) data[i].composite, composite_length); + assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt); ZBarcode_Delete(symbol); } diff --git a/backend/tests/test_gs1.c b/backend/tests/test_gs1.c index 82d794a8..7b95e953 100644 --- a/backend/tests/test_gs1.c +++ b/backend/tests/test_gs1.c @@ -38,6 +38,8 @@ static void test_gs1_reduce(int index, int generate, int debug) { testStart(""); + int do_bwipp = (debug & ZINT_DEBUG_TEST_BWIPP) && testUtilHaveGhostscript(); // Only do BWIPP test if asked, too slow otherwise + int ret; struct item { int symbology; @@ -51,7 +53,7 @@ static void test_gs1_reduce(int index, int generate, int debug) { }; struct item data[] = { /* 0*/ { BARCODE_EAN128, -1, "12345678901234", "", ZINT_ERROR_INVALID_DATA, "GS1 data required", "" }, - /* 1*/ { BARCODE_EAN128, -1, "[01]12345678901234", "", 0, "Input mode ignored; verified manually against bwipp and tec-it", + /* 1*/ { BARCODE_EAN128, -1, "[01]12345678901234", "", 0, "Input mode ignored; verified manually against tec-it", "11010011100111101011101100110110010110011100100010110001110001011011000010100110111101101011001110010001011000111010111101100011101011" }, /* 2*/ { BARCODE_EAN128, GS1_MODE, "[01]12345678901234", "", 0, "Input mode ignored", @@ -81,7 +83,7 @@ static void test_gs1_reduce(int index, int generate, int debug) { "0010110001100001010001001100100110100110001101110100111000111010010011110101100100001001010011000110111010011100010100001011010000110011100010100" "1101001110011110101110110011011001011001110010001011000111000101101100001010011011110110101100111001000101100011101011110100101111001100011101011" }, - /* 7*/ { BARCODE_EAN14, -1, "1234567890123", "", 0, "Input mode ignored; verified manually against bwipp and tec-it", + /* 7*/ { BARCODE_EAN14, -1, "1234567890123", "", 0, "Input mode ignored; verified manually against tec-it", "11010011100111101011101100110110010110011100100010110001110001011011000010100110111101101011001110011011000110100001100101100011101011" }, /* 8*/ { BARCODE_EAN14, GS1_MODE, "1234567890123", "", 0, "Input mode ignored", @@ -90,7 +92,7 @@ static void test_gs1_reduce(int index, int generate, int debug) { /* 9*/ { BARCODE_EAN14, UNICODE_MODE, "1234567890123", "", 0, "Input mode ignored", "11010011100111101011101100110110010110011100100010110001110001011011000010100110111101101011001110011011000110100001100101100011101011" }, - /*10*/ { BARCODE_NVE18, -1, "12345678901234567", "", 0, "Input mode ignored; verified manually against bwipp (sscc18) and tec-it", + /*10*/ { BARCODE_NVE18, -1, "12345678901234567", "", 0, "Input mode ignored; verified manually against tec-it", "110100111001111010111011011001100101100111001000101100011100010110110000101001101111011010110011100100010110001110001011011000010010101101110001100011101011" }, /*11*/ { BARCODE_NVE18, GS1_MODE, "12345678901234567", "", 0, "Input mode ignored", @@ -109,25 +111,25 @@ static void test_gs1_reduce(int index, int generate, int debug) { /*16*/ { BARCODE_RSS_EXP, UNICODE_MODE, "[20]12", "", 0, "Input mode ignored", "010010000010000101101111111100001010000010000110010101111100101110001011110000000010101111100001011101" }, - /*17*/ { BARCODE_RSS_EXP_CC, -1, "[20]12", "[21]1234", 0, "Input mode ignored", + /*17*/ { BARCODE_RSS_EXP_CC, -1, "[20]12", "[21]1234", 0, "Input mode ignored; verified manually against tec-it", "001101101110110100001000001101001100111011000010011101001100001010001100010010011011000000110110001010" "001101101100111110100010011001101011100100000010011001001001111001011110011101011001000000110010001010" "001101101000101111100110000101001111010000001010011001101011101110011110010011110110000110111010001010" - "000001111111010110010000000010100100111001100001011010000011010001100100001010101001010000011110100000" + "000001111111010110010000000010100100111001100001011010000011010001110100001010101001010000011110100000" "010010000000101001101111111100001011000110011110100101111100101110001011110000000010101111100001011101" }, /*18*/ { BARCODE_RSS_EXP_CC, GS1_MODE, "[20]12", "[21]1234", 0, "Input mode ignored", "001101101110110100001000001101001100111011000010011101001100001010001100010010011011000000110110001010" "001101101100111110100010011001101011100100000010011001001001111001011110011101011001000000110010001010" "001101101000101111100110000101001111010000001010011001101011101110011110010011110110000110111010001010" - "000001111111010110010000000010100100111001100001011010000011010001100100001010101001010000011110100000" + "000001111111010110010000000010100100111001100001011010000011010001110100001010101001010000011110100000" "010010000000101001101111111100001011000110011110100101111100101110001011110000000010101111100001011101" }, /*19*/ { BARCODE_RSS_EXP_CC, UNICODE_MODE, "[20]12", "[21]1234", 0, "Input mode ignored", "001101101110110100001000001101001100111011000010011101001100001010001100010010011011000000110110001010" "001101101100111110100010011001101011100100000010011001001001111001011110011101011001000000110010001010" "001101101000101111100110000101001111010000001010011001101011101110011110010011110110000110111010001010" - "000001111111010110010000000010100100111001100001011010000011010001100100001010101001010000011110100000" + "000001111111010110010000000010100100111001100001011010000011010001110100001010101001010000011110100000" "010010000000101001101111111100001011000110011110100101111100101110001011110000000010101111100001011101" }, /*20*/ { BARCODE_RSS_EXPSTACK, -1, "12", "", ZINT_ERROR_INVALID_DATA, "GS1 data required", "" }, @@ -141,25 +143,25 @@ static void test_gs1_reduce(int index, int generate, int debug) { "010010000010000101101111111100001010000010000110010101111100101110001011110000000010101111100001011101" }, /*24*/ { BARCODE_RSS_EXPSTACK_CC, -1, "12", "[21]1234", ZINT_ERROR_INVALID_DATA, "GS1 data required", "" }, - /*25*/ { BARCODE_RSS_EXPSTACK_CC, -1, "[20]12", "[21]1234", 0, "Input mode ignored", + /*25*/ { BARCODE_RSS_EXPSTACK_CC, -1, "[20]12", "[21]1234", 0, "Input mode ignored; verified manually against tec-it (same as BARCODE_RSS_EXP_CC above)", "001101101110110100001000001101001100111011000010011101001100001010001100010010011011000000110110001010" "001101101100111110100010011001101011100100000010011001001001111001011110011101011001000000110010001010" "001101101000101111100110000101001111010000001010011001101011101110011110010011110110000110111010001010" - "000001111111010110010000000010100100111001100001011010000011010001100100001010101001010000011110100000" + "000001111111010110010000000010100100111001100001011010000011010001110100001010101001010000011110100000" "010010000000101001101111111100001011000110011110100101111100101110001011110000000010101111100001011101" }, /*26*/ { BARCODE_RSS_EXPSTACK_CC, GS1_MODE, "[20]12", "[21]1234", 0, "Input mode ignored", "001101101110110100001000001101001100111011000010011101001100001010001100010010011011000000110110001010" "001101101100111110100010011001101011100100000010011001001001111001011110011101011001000000110010001010" "001101101000101111100110000101001111010000001010011001101011101110011110010011110110000110111010001010" - "000001111111010110010000000010100100111001100001011010000011010001100100001010101001010000011110100000" + "000001111111010110010000000010100100111001100001011010000011010001110100001010101001010000011110100000" "010010000000101001101111111100001011000110011110100101111100101110001011110000000010101111100001011101" }, /*27*/ { BARCODE_RSS_EXPSTACK_CC, UNICODE_MODE, "[20]12", "[21]1234", 0, "Input mode ignored", "001101101110110100001000001101001100111011000010011101001100001010001100010010011011000000110110001010" "001101101100111110100010011001101011100100000010011001001001111001011110011101011001000000110010001010" "001101101000101111100110000101001111010000001010011001101011101110011110010011110110000110111010001010" - "000001111111010110010000000010100100111001100001011010000011010001100100001010101001010000011110100000" + "000001111111010110010000000010100100111001100001011010000011010001110100001010101001010000011110100000" "010010000000101001101111111100001011000110011110100101111100101110001011110000000010101111100001011101" }, }; @@ -167,6 +169,9 @@ static void test_gs1_reduce(int index, int generate, int debug) { char *text; + char bwipp_buf[8196]; + char bwipp_msg[1024]; + for (int i = 0; i < data_size; i++) { if (index != -1 && i != index) continue; @@ -207,6 +212,15 @@ static void test_gs1_reduce(int index, int generate, int debug) { int width, row; ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); assert_zero(ret, "i:%d %s testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), ret, width, row, data[i].data); + + if (do_bwipp && testUtilCanBwipp(symbol->symbology, -1, -1, -1, debug)) { + ret = testUtilBwipp(symbol, -1, -1, -1, text, length, symbol->primary, bwipp_buf, sizeof(bwipp_buf)); + assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(data[i].symbology), ret); + + ret = testUtilBwippCmp(symbol, bwipp_msg, bwipp_buf, data[i].expected); + assert_zero(ret, "i:%d %s testUtilBwippCmp %d != 0 %s\n actual: %s\nexpected: %s\n", + i, testUtilBarcodeName(data[i].symbology), ret, bwipp_msg, bwipp_buf, data[i].expected); + } } } diff --git a/backend/tests/test_rss.c b/backend/tests/test_rss.c index 6e864ca5..9074bc57 100644 --- a/backend/tests/test_rss.c +++ b/backend/tests/test_rss.c @@ -35,96 +35,99 @@ static void test_binary_div_modulo_divisor(int index, int generate, int debug) { testStart(""); + int do_bwipp = (debug & ZINT_DEBUG_TEST_BWIPP) && testUtilHaveGhostscript(); // Only do BWIPP test if asked, too slow otherwise + int ret; struct item { int symbology; - unsigned char *data; - int ret_encode; + char *data; float w; float h; - int ret_vector; int expected_rows; int expected_width; - unsigned char *expected; + char *expected; }; struct item data[] = { - /* 0*/ { BARCODE_RSS14, "1234567890123", 0, 100, 30, 0, 1, 96, "010111010010000001001110000000010100001011111010110100011001100101111111110001011011000111000101" }, - /* 1*/ { BARCODE_RSS14, "0000004537076", 0, 100, 30, 0, 1, 96, "010101001000000001000100000000010111111100101010111101111101010101111111110111010100100000000101" }, - /* 2*/ { BARCODE_RSS14, "0000004537077", 0, 100, 30, 0, 1, 96, "010101001000000001000111000000010111111101001010101010110000000101111100000111011111111011010101" }, - /* 3*/ { BARCODE_RSS14, "0000004537078", 0, 100, 30, 0, 1, 96, "010101001000000001000111000000010111111101001010101011010000000101111000000011011111111011010101" }, - /* 4*/ { BARCODE_RSS14, "0000000001596", 0, 100, 30, 0, 1, 96, "010101001000000001001111100000010111111100101010111101111101010101111100000111011111111011010101" }, - /* 5*/ { BARCODE_RSS14, "0000000001597", 0, 100, 30, 0, 1, 96, "010101001000000001011111000000010111111100101010101010110000000101111100000111011111110111010101" }, - /* 6*/ { BARCODE_RSS14, "0000000001598", 0, 100, 30, 0, 1, 96, "010101001000000001011111000000010111111100101010101011010000000101111000000011011111110111010101" }, - /* 7*/ { BARCODE_RSS14, "0000000000000", 0, 100, 30, 0, 1, 96, "010101001000000001000111111110010111111100101010101010110000000101111111110111011111111011010101" }, - /* 8*/ { BARCODE_RSS14, "0000000257117", 0, 100, 30, 0, 1, 96, "010101001000000001001111100000010111111100101010101010110000000101111110000011000111111011010101" }, - /* 9*/ { BARCODE_RSS14, "0000000536592", 0, 100, 30, 0, 1, 96, "010101001000000001000111000000010111111100101010101010110000000101100000000111011101100011110101" }, - /* 10*/ { BARCODE_RSS14, "0000001644132", 0, 100, 30, 0, 1, 96, "010101001000000001001111100000010111111100101010100100001111010101111100000111000001101111010101" }, - /* 11*/ { BARCODE_RSS14, "0000002421052", 0, 100, 30, 0, 1, 96, "010101001000000001011111000000010111111100101010101010110000000101111100000111011100010001101101" }, - /* 12*/ { BARCODE_RSS14, "0000003217955", 0, 100, 30, 0, 1, 96, "010101001000000001000111000000010111111100101010101010110000000101111111000001000000111001010101" }, - /* 13*/ { BARCODE_RSS14, "0000004792584", 0, 100, 30, 0, 1, 96, "010101001000000001000111110000010111111101001010111011111101010101111111110111010110101111111101" }, - /* 14*/ { BARCODE_RSS14, "0000006062184", 0, 100, 30, 0, 1, 96, "010101001000000001000111111110010111111101001010110111111101010101111111110111001010011011111101" }, - /* 15*/ { BARCODE_RSS14, "0000007734882", 0, 100, 30, 0, 1, 96, "010101001000000001000111111110010111111101001010110111000010010101111111000111001010001100111101" }, - /* 16*/ { BARCODE_RSS14, "0000008845782", 0, 100, 30, 0, 1, 96, "010101001000000001011111000000010111111101001010111101111101010101111111000001000010101000011101" }, - /* 17*/ { BARCODE_RSS14, "0000009329661", 0, 100, 30, 0, 1, 96, "010101001000000001001111111000010111111101010010111011111101010101111000000011010110101111111101" }, - /* 18*/ { BARCODE_RSS14, "0000009607386", 0, 100, 30, 0, 1, 96, "010101001000000001011111000000010111111101010010100111001011110101111111110111011100011011110101" }, - /* 19*/ { BARCODE_RSS14, "0000010718286", 0, 100, 30, 0, 1, 96, "010101001000000001000111110000010111111101010010100100001111010101111100000111000001101111010101" }, - /* 20*/ { BARCODE_RSS14, "0000011607006", 0, 100, 30, 0, 1, 96, "010101001000000001000111111110010111111101010010101101000100000101111000000011010011100001101101" }, - /* 21*/ { BARCODE_RSS14, "0004360130997", 0, 100, 30, 0, 1, 96, "010101001000000001000100000000010110010010011110101010110000000101111000000011011111111011010101" }, - /* 22*/ { BARCODE_RSS14, "0004360386504", 0, 100, 30, 0, 1, 96, "010101001000000001000111000000010110010010011110111011111101010101111111100011010110101111111101" }, - /* 23*/ { BARCODE_RSS14, "0009142746747", 0, 100, 30, 0, 1, 96, "010101000100000001000111111110010100111110001010101010110000000101111111000111011101100011110101" }, - /* 24*/ { BARCODE_RSS14, "0012319818547", 0, 100, 30, 0, 1, 96, "010101000100000001000100000000010110001100101000101010110000000101111111000111001100011110010101" }, - /* 25*/ { BARCODE_RSS14, "0013775011335", 0, 100, 30, 0, 1, 96, "010101000100000001000100000000010101001100000110101010110000000101111100000111011111010011100101" }, - /* 26*/ { BARCODE_RSS14, "0018894538190", 0, 100, 30, 0, 1, 96, "010101000010000001000100000000010110100100111100101010110000000101111111110001010001100011110101" }, - /* 27*/ { BARCODE_RSS14, "0021059247735", 0, 100, 30, 0, 1, 96, "010101000010000001000100000000010101000011001100101010110000000101111111100011010110111000001101" }, - /* 28*/ { BARCODE_RSS14, "0024094346235", 0, 100, 30, 0, 1, 96, "010101000001000001000100000000010111010000111010101010110000000101100000000111000110011001101101" }, - /* 29*/ { BARCODE_RSS14, "1995000595035", 0, 100, 30, 0, 1, 96, "010100011011000001001110000000010111010111010000101010110000000101111000000011000110011001101101" }, - /* 30*/ { BARCODE_RSS14, "9999999999999", 0, 100, 30, 0, 1, 96, "010010111011100001000111111110010111101101001110100011111101010101111111000001000111110101011101" }, - /* 31*/ { BARCODE_RSS14_CC, "0000000000000", 0, 100, 30, 0, 5, 100, "0000010010111011100001001110000000010111101101001110110001010111110101111111110001000111110101011101" }, - /* 32*/ { BARCODE_RSS14_CC, "0000729476171", 0, 100, 30, 0, 5, 100, "0000010010111011100001011100000000010111100110100010101010110000000101111111100011011111111011010101" }, - /* 33*/ { BARCODE_RSS14_CC, "0004359674363", 0, 100, 30, 0, 5, 100, "0000010010111011100001011100000000010101110010000100101010110000000101111000000011011101100011110101" }, - /* 34*/ { BARCODE_RSS14_CC, "0009142871421", 0, 100, 30, 0, 5, 100, "0000010010111101000011000111111110010100010111110010101010110000000101111111000111001100011110010101" }, - /* 35*/ { BARCODE_RSS14_CC, "0012319591881", 0, 100, 30, 0, 5, 100, "0000010010111101000011000100000000010101000111010000101010110000000101111111000111011100010001101101" }, - /* 36*/ { BARCODE_RSS14_CC, "6975446373038", 0, 100, 30, 0, 5, 100, "0000010111001110010111001111111000010101000111010000101010110000000101111100000111011111111011010101" }, - /* 37*/ { BARCODE_RSS14_CC, "9999999999999", 0, 100, 30, 0, 5, 100, "0000010110101111011111001111111000010110111100100010100110111001110101111111110001001100110001110101" }, - /* 38*/ { BARCODE_RSS_LTD, "1234567890123", 0, 100, 30, 0, 1, 74, "01001100111100101000100111010110101011001001010010101001010000011100011101" }, - /* 39*/ { BARCODE_RSS_LTD, "0000002013570", 0, 100, 30, 0, 1, 74, "01010101010100000010000001110100101101011001010111111110111111010101010101" }, - /* 40*/ { BARCODE_RSS_LTD, "0000002013571", 0, 100, 30, 0, 1, 74, "01010101010100000011000000110101011010100011010101010101000000100000011101" }, - /* 41*/ { BARCODE_RSS_LTD, "0000002013572", 0, 100, 30, 0, 1, 74, "01010101010100000011000000110101010010111001010101010101000000110000001101" }, - /* 42*/ { BARCODE_RSS_LTD, "0000000917879", 0, 100, 30, 0, 1, 74, "01010101010100000010000001110100110101010011010100110111011111010110011101" }, - /* 43*/ { BARCODE_RSS_LTD, "0000000000000", 0, 100, 30, 0, 1, 74, "01010101010100000010000001110101110101001001010101010101000000100000011101" }, - /* 44*/ { BARCODE_RSS_LTD, "0000000183063", 0, 100, 30, 0, 1, 74, "01010101010100000010000001110110101010010011010000001110000001010101010101" }, - /* 45*/ { BARCODE_RSS_LTD, "0000000183064", 0, 100, 30, 0, 1, 74, "01010101010100000010000001110010101010111001010101010101000111100000111101" }, - /* 46*/ { BARCODE_RSS_LTD, "0000000820063", 0, 100, 30, 0, 1, 74, "01010101010100000010000001110010101010011011010000011110001111010101010101" }, - /* 47*/ { BARCODE_RSS_LTD, "0000000820064", 0, 100, 30, 0, 1, 74, "01010101010100000010000001110110101101001001010101010101011111100011111101" }, - /* 48*/ { BARCODE_RSS_LTD, "0000001000775", 0, 100, 30, 0, 1, 74, "01010101010100000010000001110010110101011001010001111110111111010101010101" }, - /* 49*/ { BARCODE_RSS_LTD, "0000001000776", 0, 100, 30, 0, 1, 74, "01010101010100000010000001110101110101010001010101010101000001100000111101" }, - /* 50*/ { BARCODE_RSS_LTD, "0000001491020", 0, 100, 30, 0, 1, 74, "01010101010100000010000001110010101010110011010000011110000011010101010101" }, - /* 51*/ { BARCODE_RSS_LTD, "0000001491021", 0, 100, 30, 0, 1, 74, "01010101010100000010000001110101001010110011010101010101001111100001111101" }, - /* 52*/ { BARCODE_RSS_LTD, "0000001979844", 0, 100, 30, 0, 1, 74, "01010101010100000010000001110101010100011011010000111110011111010101010101" }, - /* 53*/ { BARCODE_RSS_LTD, "0000001979845", 0, 100, 30, 0, 1, 74, "01010101010100000010000001110101110100101001010101010101000000100000000101" }, - /* 54*/ { BARCODE_RSS_LTD, "0000001996938", 0, 100, 30, 0, 1, 74, "01010101010100000010000001110101101010001011010000000010000001010101010101" }, - /* 55*/ { BARCODE_RSS_LTD, "0000001996939", 0, 100, 30, 0, 1, 74, "01010101010100000010000001110110110101010001010101010101011111101111111101" }, - /* 56*/ { BARCODE_RSS_LTD, "0000012013571", 0, 100, 30, 0, 1, 74, "01010101010111000000100000010101010010100111010001110111100101001101101101" }, - /* 57*/ { BARCODE_RSS_LTD, "0368610347973", 0, 100, 30, 0, 1, 74, "01000000111000000101010101010010101011101001010101010101000000100000011101" }, - /* 58*/ { BARCODE_RSS_LTD, "0368612361544", 0, 100, 30, 0, 1, 74, "01010101010100011110000011110101001101010011010101010101000000100000011101" }, - /* 59*/ { BARCODE_RSS_LTD, "1651255074973", 0, 100, 30, 0, 1, 74, "01000001111000111101010101010101101001010011010101010101000000100000011101" }, - /* 60*/ { BARCODE_RSS_LTD, "1651257088544", 0, 100, 30, 0, 1, 74, "01010101010101111110001111110101101001101001010101010101000000100000011101" }, - /* 61*/ { BARCODE_RSS_LTD, "1999999999999", 0, 100, 30, 0, 1, 74, "01001111001101101011011111010101011010110001010100001011100011010111100101" }, - /* 62*/ { BARCODE_RSS_LTD_CC, "0000000000000", 0, 100, 30, 0, 6, 74, "01010101010100000110000011110100101011010011010101010101000000100000011101" }, - /* 63*/ { BARCODE_RSS_LTD_CC, "0000002013571", 0, 100, 30, 0, 6, 74, "01010101010100000111000001110101101010001011010101010101000000100000011101" }, - /* 64*/ { BARCODE_RSS_LTD_CC, "0987141101324", 0, 100, 30, 0, 6, 74, "01000001111000001101010101010110101010100011010101010101000000100000011101" }, - /* 65*/ { BARCODE_RSS_LTD_CC, "0987143114895", 0, 100, 30, 0, 6, 74, "01010101010100111110000111110101110101010001010101010101000000100000011101" }, - /* 66*/ { BARCODE_RSS_LTD_CC, "1971422931828", 0, 100, 30, 0, 6, 74, "01000011111001111101010101010100101010100111010101010101000000100000011101" }, - /* 67*/ { BARCODE_RSS_LTD_CC, "1971424945399", 0, 100, 30, 0, 6, 74, "01010101010100000010000000010110101010010011010101010101000000100000011101" }, - /* 68*/ { BARCODE_RSS_LTD_CC, "1999999999999", 0, 100, 30, 0, 6, 74, "01000010000001010101000001010110101101001001010100001011100011010111100101" }, - /* 69*/ { BARCODE_RSS_LTD, "1651257071912", 0, 100, 30, 0, 1, 74, "01000001111000111101010101010101110101001001010101010101011111101111111101" }, - /* 70*/ { BARCODE_RSS_LTD_CC, "0987144605916", 0, 100, 30, 0, 6, 74, "01010101010100111110000111110110101101001001010101010101001111100001111101" }, + /* 0*/ { BARCODE_RSS14, "1234567890123", 100, 30, 1, 96, "010111010010000001001110000000010100001011111010110100011001100101111111110001011011000111000101" }, + /* 1*/ { BARCODE_RSS14, "0000004537076", 100, 30, 1, 96, "010101001000000001000100000000010111111100101010111101111101010101111111110111010100100000000101" }, + /* 2*/ { BARCODE_RSS14, "0000004537077", 100, 30, 1, 96, "010101001000000001000111000000010111111101001010101010110000000101111100000111011111111011010101" }, + /* 3*/ { BARCODE_RSS14, "0000004537078", 100, 30, 1, 96, "010101001000000001000111000000010111111101001010101011010000000101111000000011011111111011010101" }, + /* 4*/ { BARCODE_RSS14, "0000000001596", 100, 30, 1, 96, "010101001000000001001111100000010111111100101010111101111101010101111100000111011111111011010101" }, + /* 5*/ { BARCODE_RSS14, "0000000001597", 100, 30, 1, 96, "010101001000000001011111000000010111111100101010101010110000000101111100000111011111110111010101" }, + /* 6*/ { BARCODE_RSS14, "0000000001598", 100, 30, 1, 96, "010101001000000001011111000000010111111100101010101011010000000101111000000011011111110111010101" }, + /* 7*/ { BARCODE_RSS14, "0000000000000", 100, 30, 1, 96, "010101001000000001000111111110010111111100101010101010110000000101111111110111011111111011010101" }, + /* 8*/ { BARCODE_RSS14, "0000000257117", 100, 30, 1, 96, "010101001000000001001111100000010111111100101010101010110000000101111110000011000111111011010101" }, + /* 9*/ { BARCODE_RSS14, "0000000536592", 100, 30, 1, 96, "010101001000000001000111000000010111111100101010101010110000000101100000000111011101100011110101" }, + /* 10*/ { BARCODE_RSS14, "0000001644132", 100, 30, 1, 96, "010101001000000001001111100000010111111100101010100100001111010101111100000111000001101111010101" }, + /* 11*/ { BARCODE_RSS14, "0000002421052", 100, 30, 1, 96, "010101001000000001011111000000010111111100101010101010110000000101111100000111011100010001101101" }, + /* 12*/ { BARCODE_RSS14, "0000003217955", 100, 30, 1, 96, "010101001000000001000111000000010111111100101010101010110000000101111111000001000000111001010101" }, + /* 13*/ { BARCODE_RSS14, "0000004792584", 100, 30, 1, 96, "010101001000000001000111110000010111111101001010111011111101010101111111110111010110101111111101" }, + /* 14*/ { BARCODE_RSS14, "0000006062184", 100, 30, 1, 96, "010101001000000001000111111110010111111101001010110111111101010101111111110111001010011011111101" }, + /* 15*/ { BARCODE_RSS14, "0000007734882", 100, 30, 1, 96, "010101001000000001000111111110010111111101001010110111000010010101111111000111001010001100111101" }, + /* 16*/ { BARCODE_RSS14, "0000008845782", 100, 30, 1, 96, "010101001000000001011111000000010111111101001010111101111101010101111111000001000010101000011101" }, + /* 17*/ { BARCODE_RSS14, "0000009329661", 100, 30, 1, 96, "010101001000000001001111111000010111111101010010111011111101010101111000000011010110101111111101" }, + /* 18*/ { BARCODE_RSS14, "0000009607386", 100, 30, 1, 96, "010101001000000001011111000000010111111101010010100111001011110101111111110111011100011011110101" }, + /* 19*/ { BARCODE_RSS14, "0000010718286", 100, 30, 1, 96, "010101001000000001000111110000010111111101010010100100001111010101111100000111000001101111010101" }, + /* 20*/ { BARCODE_RSS14, "0000011607006", 100, 30, 1, 96, "010101001000000001000111111110010111111101010010101101000100000101111000000011010011100001101101" }, + /* 21*/ { BARCODE_RSS14, "0004360130997", 100, 30, 1, 96, "010101001000000001000100000000010110010010011110101010110000000101111000000011011111111011010101" }, + /* 22*/ { BARCODE_RSS14, "0004360386504", 100, 30, 1, 96, "010101001000000001000111000000010110010010011110111011111101010101111111100011010110101111111101" }, + /* 23*/ { BARCODE_RSS14, "0009142746747", 100, 30, 1, 96, "010101000100000001000111111110010100111110001010101010110000000101111111000111011101100011110101" }, + /* 24*/ { BARCODE_RSS14, "0012319818547", 100, 30, 1, 96, "010101000100000001000100000000010110001100101000101010110000000101111111000111001100011110010101" }, + /* 25*/ { BARCODE_RSS14, "0013775011335", 100, 30, 1, 96, "010101000100000001000100000000010101001100000110101010110000000101111100000111011111010011100101" }, + /* 26*/ { BARCODE_RSS14, "0018894538190", 100, 30, 1, 96, "010101000010000001000100000000010110100100111100101010110000000101111111110001010001100011110101" }, + /* 27*/ { BARCODE_RSS14, "0021059247735", 100, 30, 1, 96, "010101000010000001000100000000010101000011001100101010110000000101111111100011010110111000001101" }, + /* 28*/ { BARCODE_RSS14, "0024094346235", 100, 30, 1, 96, "010101000001000001000100000000010111010000111010101010110000000101100000000111000110011001101101" }, + /* 29*/ { BARCODE_RSS14, "1995000595035", 100, 30, 1, 96, "010100011011000001001110000000010111010111010000101010110000000101111000000011000110011001101101" }, + /* 30*/ { BARCODE_RSS14, "9999999999999", 100, 30, 1, 96, "010010111011100001000111111110010111101101001110100011111101010101111111000001000111110101011101" }, + /* 31*/ { BARCODE_RSS14_CC, "0000000000000", 100, 30, 5, 100, "0000010010111011100001001110000000010111101101001110110001010111110101111111110001000111110101011101" }, + /* 32*/ { BARCODE_RSS14_CC, "0000729476171", 100, 30, 5, 100, "0000010010111011100001011100000000010111100110100010101010110000000101111111100011011111111011010101" }, + /* 33*/ { BARCODE_RSS14_CC, "0004359674363", 100, 30, 5, 100, "0000010010111011100001011100000000010101110010000100101010110000000101111000000011011101100011110101" }, + /* 34*/ { BARCODE_RSS14_CC, "0009142871421", 100, 30, 5, 100, "0000010010111101000011000111111110010100010111110010101010110000000101111111000111001100011110010101" }, + /* 35*/ { BARCODE_RSS14_CC, "0012319591881", 100, 30, 5, 100, "0000010010111101000011000100000000010101000111010000101010110000000101111111000111011100010001101101" }, + /* 36*/ { BARCODE_RSS14_CC, "6975446373038", 100, 30, 5, 100, "0000010111001110010111001111111000010101000111010000101010110000000101111100000111011111111011010101" }, + /* 37*/ { BARCODE_RSS14_CC, "9999999999999", 100, 30, 5, 100, "0000010110101111011111001111111000010110111100100010100110111001110101111111110001001100110001110101" }, + /* 38*/ { BARCODE_RSS_LTD, "1234567890123", 100, 30, 1, 74, "01001100111100101000100111010110101011001001010010101001010000011100011101" }, + /* 39*/ { BARCODE_RSS_LTD, "0000002013570", 100, 30, 1, 74, "01010101010100000010000001110100101101011001010111111110111111010101010101" }, + /* 40*/ { BARCODE_RSS_LTD, "0000002013571", 100, 30, 1, 74, "01010101010100000011000000110101011010100011010101010101000000100000011101" }, + /* 41*/ { BARCODE_RSS_LTD, "0000002013572", 100, 30, 1, 74, "01010101010100000011000000110101010010111001010101010101000000110000001101" }, + /* 42*/ { BARCODE_RSS_LTD, "0000000917879", 100, 30, 1, 74, "01010101010100000010000001110100110101010011010100110111011111010110011101" }, + /* 43*/ { BARCODE_RSS_LTD, "0000000000000", 100, 30, 1, 74, "01010101010100000010000001110101110101001001010101010101000000100000011101" }, + /* 44*/ { BARCODE_RSS_LTD, "0000000183063", 100, 30, 1, 74, "01010101010100000010000001110110101010010011010000001110000001010101010101" }, + /* 45*/ { BARCODE_RSS_LTD, "0000000183064", 100, 30, 1, 74, "01010101010100000010000001110010101010111001010101010101000111100000111101" }, + /* 46*/ { BARCODE_RSS_LTD, "0000000820063", 100, 30, 1, 74, "01010101010100000010000001110010101010011011010000011110001111010101010101" }, + /* 47*/ { BARCODE_RSS_LTD, "0000000820064", 100, 30, 1, 74, "01010101010100000010000001110110101101001001010101010101011111100011111101" }, + /* 48*/ { BARCODE_RSS_LTD, "0000001000775", 100, 30, 1, 74, "01010101010100000010000001110010110101011001010001111110111111010101010101" }, + /* 49*/ { BARCODE_RSS_LTD, "0000001000776", 100, 30, 1, 74, "01010101010100000010000001110101110101010001010101010101000001100000111101" }, + /* 50*/ { BARCODE_RSS_LTD, "0000001491020", 100, 30, 1, 74, "01010101010100000010000001110010101010110011010000011110000011010101010101" }, + /* 51*/ { BARCODE_RSS_LTD, "0000001491021", 100, 30, 1, 74, "01010101010100000010000001110101001010110011010101010101001111100001111101" }, + /* 52*/ { BARCODE_RSS_LTD, "0000001979844", 100, 30, 1, 74, "01010101010100000010000001110101010100011011010000111110011111010101010101" }, + /* 53*/ { BARCODE_RSS_LTD, "0000001979845", 100, 30, 1, 74, "01010101010100000010000001110101110100101001010101010101000000100000000101" }, + /* 54*/ { BARCODE_RSS_LTD, "0000001996938", 100, 30, 1, 74, "01010101010100000010000001110101101010001011010000000010000001010101010101" }, + /* 55*/ { BARCODE_RSS_LTD, "0000001996939", 100, 30, 1, 74, "01010101010100000010000001110110110101010001010101010101011111101111111101" }, + /* 56*/ { BARCODE_RSS_LTD, "0000012013571", 100, 30, 1, 74, "01010101010111000000100000010101010010100111010001110111100101001101101101" }, + /* 57*/ { BARCODE_RSS_LTD, "0368610347973", 100, 30, 1, 74, "01000000111000000101010101010010101011101001010101010101000000100000011101" }, + /* 58*/ { BARCODE_RSS_LTD, "0368612361544", 100, 30, 1, 74, "01010101010100011110000011110101001101010011010101010101000000100000011101" }, + /* 59*/ { BARCODE_RSS_LTD, "1651255074973", 100, 30, 1, 74, "01000001111000111101010101010101101001010011010101010101000000100000011101" }, + /* 60*/ { BARCODE_RSS_LTD, "1651257088544", 100, 30, 1, 74, "01010101010101111110001111110101101001101001010101010101000000100000011101" }, + /* 61*/ { BARCODE_RSS_LTD, "1999999999999", 100, 30, 1, 74, "01001111001101101011011111010101011010110001010100001011100011010111100101" }, + /* 62*/ { BARCODE_RSS_LTD_CC, "0000000000000", 100, 30, 6, 74, "01010101010100000110000011110100101011010011010101010101000000100000011101" }, + /* 63*/ { BARCODE_RSS_LTD_CC, "0000002013571", 100, 30, 6, 74, "01010101010100000111000001110101101010001011010101010101000000100000011101" }, + /* 64*/ { BARCODE_RSS_LTD_CC, "0987141101324", 100, 30, 6, 74, "01000001111000001101010101010110101010100011010101010101000000100000011101" }, + /* 65*/ { BARCODE_RSS_LTD_CC, "0987143114895", 100, 30, 6, 74, "01010101010100111110000111110101110101010001010101010101000000100000011101" }, + /* 66*/ { BARCODE_RSS_LTD_CC, "1971422931828", 100, 30, 6, 74, "01000011111001111101010101010100101010100111010101010101000000100000011101" }, + /* 67*/ { BARCODE_RSS_LTD_CC, "1971424945399", 100, 30, 6, 74, "01010101010100000010000000010110101010010011010101010101000000100000011101" }, + /* 68*/ { BARCODE_RSS_LTD_CC, "1999999999999", 100, 30, 6, 74, "01000010000001010101000001010110101101001001010100001011100011010111100101" }, + /* 69*/ { BARCODE_RSS_LTD, "1651257071912", 100, 30, 1, 74, "01000001111000111101010101010101110101001001010101010101011111101111111101" }, + /* 70*/ { BARCODE_RSS_LTD_CC, "0987144605916", 100, 30, 6, 74, "01010101010100111110000111110110101101001001010101010101001111100001111101" }, }; int data_size = sizeof(data) / sizeof(struct item); char *text; + char bwipp_buf[1024]; + char bwipp_msg[1024]; + for (int i = 0; i < data_size; i++) { if (index != -1 && i != index) continue; @@ -143,12 +146,12 @@ static void test_binary_div_modulo_divisor(int index, int generate, int debug) { } int length = strlen(text); - ret = ZBarcode_Encode(symbol, text, length); - assert_equal(ret, data[i].ret_encode, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret_encode, symbol->errtxt); + ret = ZBarcode_Encode(symbol, (const unsigned char *) text, length); + assert_zero(ret, "i:%d ZBarcode_Encode ret %d != 0 (%s)\n", i, ret, symbol->errtxt); if (generate) { - printf(" /*%3d*/ { %s, \"%s\", %d, %.0f, %.0f, %d, %d, %d, ", - i, testUtilBarcodeName(data[i].symbology), data[i].data, ret, data[i].w, data[i].h, data[i].ret_vector, symbol->rows, symbol->width); + printf(" /*%3d*/ { %s, \"%s\", %.0f, %.0f, %d, %d, ", + i, testUtilBarcodeName(data[i].symbology), data[i].data, data[i].w, data[i].h, symbol->rows, symbol->width); testUtilModulesDumpRow(symbol, symbol->rows - 1, "", " },\n"); } else { assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d\n", i, symbol->rows, data[i].expected_rows); @@ -159,7 +162,16 @@ static void test_binary_div_modulo_divisor(int index, int generate, int debug) { assert_zero(ret, "i:%d testUtilModulesCmpRow ret %d != 0 width %d row %d\n", i, ret, width, symbol->rows - 1); ret = ZBarcode_Buffer_Vector(symbol, 0); - assert_equal(ret, data[i].ret_vector, "i:%d ZBarcode_Buffer_Vector ret %d != %d\n", i, ret, data[i].ret_vector); + assert_zero(ret, "i:%d ZBarcode_Buffer_Vector ret %d != 0\n", i, ret); + + if (do_bwipp && testUtilCanBwipp(symbol->symbology, -1, -1, -1, debug)) { + ret = testUtilBwipp(symbol, -1, -1, -1, text, length, symbol->primary, bwipp_buf, sizeof(bwipp_buf)); + assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(data[i].symbology), ret); + + ret = testUtilBwippCmpRow(symbol, symbol->rows - 1, bwipp_msg, bwipp_buf, data[i].expected); + assert_zero(ret, "i:%d %s testUtilBwippCmp %d != 0 %s\n actual: %s\nexpected: %s\n", + i, testUtilBarcodeName(data[i].symbology), ret, bwipp_msg, bwipp_buf, data[i].expected); + } } ZBarcode_Delete(symbol); @@ -173,147 +185,450 @@ static void test_examples(int index, int generate, int debug) { testStart(""); + int do_bwipp = (debug & ZINT_DEBUG_TEST_BWIPP) && testUtilHaveGhostscript(); // Only do BWIPP test if asked, too slow otherwise + int ret; struct item { int symbology; int option_2; - unsigned char *data; - int ret; + char *data; int expected_rows; int expected_width; char *comment; - unsigned char *expected; + char *expected; }; - // Verified manually against GS1 General Specifications 20.0 and ISO/IEC 24724:2011 + // Verified manually against GS1 General Specifications 20.0 (GGS) and ISO/IEC 24724:2011, and verified via bwipp_dump.ps against BWIPP struct item data[] = { - /* 0*/ { BARCODE_RSS14, -1, "0950110153001", 0, 1, 96, "Figure 5.5.2.1.1-1. GS1 DataBar Omnidirectional", - "010000010100000101000111110000010111101101011100100011011101000101100000000111001110110111001101" - }, - /* 1*/ { BARCODE_RSS_EXP, -1, "[01]90614141000015[3202]000150", 0, 1, 151, "Figure 5.5.2.3.1-1. GS1 DataBar Expanded", - "0101100011001100001011111111000010100100010000111101110011100010100010111100000011100111010111111011010100000100000110001111110000101000000100011010010" - }, - /* 2*/ { BARCODE_RSS_EXPSTACK, -1, "[01]90614141000015[3202]000150", 0, 5, 102, "Figure 5.5.2.3.2-1. GS1 DataBar Expanded Stacked", - "010110001100110000101111111100001010010001000011110111001110001010001011110000001110011101011111101101" - "000001110011001111010000000010100101101110111100001000110001110101100100001010100001100010100000010000" - "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" - "000001011111011111001010000001010010111111011100100000000000000000000000000000000000000000000000000000" - "001010100000100000110001111110000101000000100011010010000000000000000000000000000000000000000000000000" - }, - /* 3*/ { BARCODE_RSS14, -1, "2001234567890", 0, 1, 96, "24724:2011 Figure 1 — GS1 DataBar Omnidirectional", - "010100011101000001001111111000010100110110111110110000010010100101100000000111000110110110001101" - }, - /* 4*/ { BARCODE_RSS14, -1, "0441234567890", 0, 1, 96, "24724:2011 Figure 2 — GS1 DataBar Omnidirectional", - "010010001000010001000111000000010101000001100110101100100100000101111110000011000010100011100101" - }, - /* 5*/ { BARCODE_RSS14, -1, "0001234567890", 0, 1, 96, "24724:2011 Figure 4 — GS1 DataBar Truncated", - "010101001000000001001111111000010111001011011110111001010110000101111111000111001100111101110101" - }, - /* 6*/ { BARCODE_RSS14STACK, -1, "0001234567890", 0, 3, 50, "24724:2011 Figure 5 — GS1 DataBar Stacked", - "01010100100000000100111111100001011100101101111010" - "00001010101011111010000000111010100011010010000000" - "10111001010110000101111111000111001100111101110101" - }, - /* 7*/ { BARCODE_RSS14STACK_OMNI, -1, "0003456789012", 0, 5, 50, "24724:2011 Figure 6 — GS1 DataBar Stacked Omnidirectional", - "01010100100000000100111110000001010011100110011010" - "00001011011111111010000001010100101100011001100000" - "00000101010101010101010101010101010101010101010000" - "00001000100010111010010101010000111101001101110000" - "10110111011101000101100000000111000010110010001101" - }, - /* 8*/ { BARCODE_RSS_LTD, -1, "1501234567890", 0, 1, 74, "24724:2011 Figure 7 — GS1 DataBar Limited", - "01000110011000110110101001110100101011010011010010010110001101110011001101" - }, - /* 9*/ { BARCODE_RSS_LTD, -1, "0031234567890", 0, 1, 74, "24724:2011 Figure 8 — (a) GS1 DataBar Limited", - "01010100000100100010000101110010101101101001010110000010100100101100000101" - }, - /*10*/ { BARCODE_RSS_EXP, -1, "[01]98898765432106[3202]012345[15]991231", 0, 1, 200, "24724:2011 Figure 10 — GS1 DataBar Expanded", - "01001000011000110110111111110000101110000110010100011010000001100010101111110000111010011100000010010100111110111001100011111100001011101100000100100100011110010110001011111111001110001101111010000101" - }, - /*11*/ { BARCODE_RSS_EXP, -1, "[01]90012345678908[3103]001750", 0, 1, 151, "24724:2011 Figure 11 — GS1 DataBar Expanded", - "0101110010000010011011111111000010111000010011000101011110111001100010111100000011100101110001110111011110101111000110001111110000101011000010011111010" - }, - /*12*/ { BARCODE_RSS_EXPSTACK, -1, "[01]98898765432106[3202]012345[15]991231", 0, 5, 102, "24724:2011 Figure 12 — GS1 DataBar Expanded Stacked symbol", - "010010000110001101101111111100001011100001100101000110100000011000101011111100001110100111000000100101" - "000001111001110010010000000010100100011110011010111001011111100111010100000010100001011000111111010000" - "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" - "000011101000010011100001000000001011100101100001110110110111110010001001010000001010011000100000110000" - "101000010111101100011100111111110100011010011110001001001000001101110100001111110001100111011111001010" - }, - /*13*/ { BARCODE_RSS_EXPSTACK, -1, "[01]95012345678903[3103]000123", 0, 5, 102, "24724:2011 Figure 13 — GS1 DataBar Expanded Stacked", - "010100010001111000101111111100001010111000001100010111000110001001101011110000001110010111000111011101" - "000011101110000111010000000010100101000111110011101000111001110110010100001010100001101000111000100000" - "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" - "000000001010000111001010000001010010111011011111100000000000000000000000000000000000000000000000000000" - "001011110101111000110001111110000101000100100000011010000000000000000000000000000000000000000000000000" - }, - /*14*/ { BARCODE_RSS_LTD, -1, "0009876543210", 0, 1, 74, "24724:2011 Figure F.2 — GS1 DataBar Limited", - "01010100100100110000110000010101101001011001010001000101000100000100100101" - }, - /*15*/ { BARCODE_RSS_EXP, -1, "[10]12A", 0, 1, 102, "24724:2011 Figure F.3 — GS1 DataBar Expanded", - "010100000110100000101111111100001010001000000010110101111100100111001011110000000010011101111111010101" - }, - /*16*/ { BARCODE_RSS14STACK, -1, "0000000000000", 0, 3, 50, "#183 GS1 DataBar Stacked separator alternation; verified manually against tec-it.com (bwipp differs)", - "01010100100000000100011111111001011111110010101010" - "00000101011111111010100000001010100000001101010000" - "10101010110000000101111111110111011111111011010101" - }, - /*17*/ { BARCODE_RSS_EXP, -1, "[255]95011015340010123456789", 0, 1, 232, "2.6.2.1 Example 1", - "0100011000110001011011111111000010100000010101100001100001100111001010111110000001100100001110100001001000011011111010001111110000101001011111100111011001000111100100101111111100111011111001100100110010011100010111100011110000001010" - }, - /*18*/ { BARCODE_RSS_EXP, -1, "[255]95011015340010123456789[3900]000", 0, 1, 298, "2.6.2.1 Example 2", - "0101100011111010001011111111000010100001000001001101100001100111001010111110000001100100001110100001001000011011111010001111110000101001011111100111011001000111100100101111111100111011111001100100110010011100010111100011000000001010111111011101000100001000110001101011111111100110011110010010001101" - }, - /*19*/ { BARCODE_RSS_EXP, -1, "[255]9501101534001[17]160531[3902]050", 0, 1, 281, "2.6.2.1 Example 3", - "01011001000110011110111111110000101000000101011000011000011001110010101111100000011001000011101000010010000110111110100011111100001010010111111001110111000010010100001011111111001110000100001100110100010000001101001000110000000010111010011110011101110010110001100010111111111001101" - }, - /*20*/ { BARCODE_RSS_EXPSTACK, 3, "[255]9501101534001012345[8111]0500", 0, 5, 151, "2.6.2.1 Example 4 **NOT SAME** separator bar differs TODO: investigate", - "0101100111100011001011111111000010100000010101100001100001100111001010111110000001100100001110100001001000011011111010001111110000101001011111100111010" - "0000011000011100110100000000101001011111101010011110011110011000110101000001010100011011110001011110110111100100000101010000001010010110100000011000000" - "0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" - "0000110111000011010010000000010000100000100111011001100001100100010010100101010100101110110001111001011101100011101100100000000010000000000000000000000" - "1011001000111100100101111111100111011111011000100110011110011011101100011000000001010001001110000110100010011100010001011111111100110100000000000000000" - }, - /*21*/ { BARCODE_RSS_EXPSTACK, 3, "[255]9501101534001[3941]0035", 0, 5, 151, "2.6.2.1 Example 5 **NOT SAME** separator bar differs TODO: investigate", - "0100001101011000011011111111000010100000010101100001100001100111001010111110000001100100001110100001001000011011111010001111110000101001011111100111010" - "0000110010100111100100000000101001011111101010011110011110011000110101000001010100011011110001011110110111100100000101010000001010010110100000011000000" - "0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" - "0000011011111011110010000000010000111100101011111001000100011100111010100001010100000000000000000000000000000000000000000000000000000000000000000000000" - "1010100100000100000101111111100111000011010100000110111011100011000100011110000001010000000000000000000000000000000000000000000000000000000000000000000" - }, + /* 0*/ { BARCODE_RSS14, -1, "0950110153001", 1, 96, "GGS Figure 5.5.2.1.1-1. GS1 DataBar Omnidirectional", + "010000010100000101000111110000010111101101011100100011011101000101100000000111001110110111001101" + }, + /* 1*/ { BARCODE_RSS_EXP, -1, "[01]90614141000015[3202]000150", 1, 151, "GGS Figure 5.5.2.3.1-1. GS1 DataBar Expanded", + "0101100011001100001011111111000010100100010000111101110011100010100010111100000011100111010111111011010100000100000110001111110000101000000100011010010" + }, + /* 2*/ { BARCODE_RSS_EXPSTACK, -1, "[01]90614141000015[3202]000150", 5, 102, "GGS Figure 5.5.2.3.2-1. GS1 DataBar Expanded Stacked, same (tec-it separator differs)", + "010110001100110000101111111100001010010001000011110111001110001010001011110000001110011101011111101101" + "000001110011001111010000000010100101101110111100001000110001110101110100001010100001100010100000010000" + "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" + "000001011111011111001010000001010010111111011100100000000000000000000000000000000000000000000000000000" + "001010100000100000110001111110000101000000100011010010000000000000000000000000000000000000000000000000" + }, + /* 3*/ { BARCODE_RSS14, -1, "2001234567890", 1, 96, "24724:2011 Figure 1 — GS1 DataBar Omnidirectional", + "010100011101000001001111111000010100110110111110110000010010100101100000000111000110110110001101" + }, + /* 4*/ { BARCODE_RSS14, -1, "0441234567890", 1, 96, "24724:2011 Figure 2 — GS1 DataBar Omnidirectional", + "010010001000010001000111000000010101000001100110101100100100000101111110000011000010100011100101" + }, + /* 5*/ { BARCODE_RSS14, -1, "0001234567890", 1, 96, "24724:2011 Figure 4 — GS1 DataBar Truncated", + "010101001000000001001111111000010111001011011110111001010110000101111111000111001100111101110101" + }, + /* 6*/ { BARCODE_RSS14STACK, -1, "0001234567890", 3, 50, "24724:2011 Figure 5 — GS1 DataBar Stacked NOTE: Figure 5 separator differs from GGS Figure 5.5.2.1.3-1. which has ends set", + "01010100100000000100111111100001011100101101111010" + "00001010101011111010000000111010100011010010000000" + "10111001010110000101111111000111001100111101110101" + }, + /* 7*/ { BARCODE_RSS14STACK_OMNI, -1, "0003456789012", 5, 50, "24724:2011 Figure 6 — GS1 DataBar Stacked Omnidirectional", + "01010100100000000100111110000001010011100110011010" + "00001011011111111010000001010100101100011001100000" + "00000101010101010101010101010101010101010101010000" + "00001000100010111010010101010000111101001101110000" + "10110111011101000101100000000111000010110010001101" + }, + /* 8*/ { BARCODE_RSS_LTD, -1, "1501234567890", 1, 74, "24724:2011 Figure 7 — GS1 DataBar Limited", + "01000110011000110110101001110100101011010011010010010110001101110011001101" + }, + /* 9*/ { BARCODE_RSS_LTD, -1, "0031234567890", 1, 74, "24724:2011 Figure 8 — (a) GS1 DataBar Limited", + "01010100000100100010000101110010101101101001010110000010100100101100000101" + }, + /* 10*/ { BARCODE_RSS_EXP, -1, "[01]98898765432106[3202]012345[15]991231", 1, 200, "24724:2011 Figure 10 — GS1 DataBar Expanded", + "01001000011000110110111111110000101110000110010100011010000001100010101111110000111010011100000010010100111110111001100011111100001011101100000100100100011110010110001011111111001110001101111010000101" + }, + /* 11*/ { BARCODE_RSS_EXP, -1, "[01]90012345678908[3103]001750", 1, 151, "24724:2011 Figure 11 — GS1 DataBar Expanded", + "0101110010000010011011111111000010111000010011000101011110111001100010111100000011100101110001110111011110101111000110001111110000101011000010011111010" + }, + /* 12*/ { BARCODE_RSS_EXPSTACK, -1, "[01]98898765432106[3202]012345[15]991231", 5, 102, "24724:2011 Figure 12 — GS1 DataBar Expanded Stacked symbol", + "010010000110001101101111111100001011100001100101000110100000011000101011111100001110100111000000100101" + "000001111001110010010000000010100100011110011010111001011111100111010100000010100001011000111111010000" + "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" + "000011101000010011100001000000001011100101100001110110110111110010001001010000001010011000100000110000" + "101000010111101100011100111111110100011010011110001001001000001101110100001111110001100111011111001010" + }, + /* 13*/ { BARCODE_RSS_EXPSTACK, -1, "[01]95012345678903[3103]000123", 5, 102, "24724:2011 Figure 13 — GS1 DataBar Expanded Stacked", + "010100010001111000101111111100001010111000001100010111000110001001101011110000001110010111000111011101" + "000011101110000111010000000010100101000111110011101000111001110110010100001010100001101000111000100000" + "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" + "000000001010000111001010000001010010111011011111100000000000000000000000000000000000000000000000000000" + "001011110101111000110001111110000101000100100000011010000000000000000000000000000000000000000000000000" + }, + /* 14*/ { BARCODE_RSS_LTD, -1, "0009876543210", 1, 74, "24724:2011 Figure F.2 — GS1 DataBar Limited", + "01010100100100110000110000010101101001011001010001000101000100000100100101" + }, + /* 15*/ { BARCODE_RSS_EXP, -1, "[10]12A", 1, 102, "24724:2011 Figure F.3 — GS1 DataBar Expanded", + "010100000110100000101111111100001010001000000010110101111100100111001011110000000010011101111111010101" + }, + /* 16*/ { BARCODE_RSS14STACK, -1, "0000000000000", 3, 50, "#183 GS1 DataBar Stacked separator alternation; verified manually against tec-it.com", + "01010100100000000100011111111001011111110010101010" + "00000101011111111010100000001010100000001101010000" + "10101010110000000101111111110111011111111011010101" + }, + /* 17*/ { BARCODE_RSS_EXP, -1, "[255]95011015340010123456789", 1, 232, "GGS 2.6.2.1 Example 1", + "0100011000110001011011111111000010100000010101100001100001100111001010111110000001100100001110100001001000011011111010001111110000101001011111100111011001000111100100101111111100111011111001100100110010011100010111100011110000001010" + }, + /* 18*/ { BARCODE_RSS_EXP, -1, "[255]95011015340010123456789[3900]000", 1, 298, "GGS 2.6.2.1 Example 2", + "0101100011111010001011111111000010100001000001001101100001100111001010111110000001100100001110100001001000011011111010001111110000101001011111100111011001000111100100101111111100111011111001100100110010011100010111100011000000001010111111011101000100001000110001101011111111100110011110010010001101" + }, + /* 19*/ { BARCODE_RSS_EXP, -1, "[255]9501101534001[17]160531[3902]050", 1, 281, "GGS 2.6.2.1 Example 3", + "01011001000110011110111111110000101000000101011000011000011001110010101111100000011001000011101000010010000110111110100011111100001010010111111001110111000010010100001011111111001110000100001100110100010000001101001000110000000010111010011110011101110010110001100010111111111001101" + }, + /* 20*/ { BARCODE_RSS_EXPSTACK, 3, "[255]9501101534001012345[8111]0500", 5, 151, "GGS 2.6.2.1 Example 4, same (tec-it separator differs)", + "0101100111100011001011111111000010100000010101100001100001100111001010111110000001100100001110100001001000011011111010001111110000101001011111100111010" + "0000011000011100110100000000101001011111101010011110011110011000110101000001010100011011110001011110110111100100000101010000001010010110100000011000000" + "0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" + "0000110111000011011010000000010000100000100111011001100001100100010010100101010100101110110001111001011101100011101110100000000010000000000000000000000" + "1011001000111100100101111111100111011111011000100110011110011011101100011000000001010001001110000110100010011100010001011111111100110100000000000000000" + }, + /* 21*/ { BARCODE_RSS_EXPSTACK, 3, "[255]9501101534001[3941]0035", 5, 151, "GGS 2.6.2.1 Example 5, same (tec-it separator differs)", + "0100001101011000011011111111000010100000010101100001100001100111001010111110000001100100001110100001001000011011111010001111110000101001011111100111010" + "0000110010100111100100000000101001011111101010011110011110011000110101000001010100011011110001011110110111100100000101010000001010010110100000011000000" + "0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" + "0000011011111011111010000000010000111100101011111001000100011100111010100001010100000000000000000000000000000000000000000000000000000000000000000000000" + "1010100100000100000101111111100111000011010100000110111011100011000100011110000001010000000000000000000000000000000000000000000000000000000000000000000" + }, + /* 22*/ { BARCODE_RSS14, -1, "0950110153000", 1, 96, "https://www.gs1.org/standards/barcodes/databar, same, verified manually against tec-it", + "010000010100000101000111111110010111101101011100100011011011000101111110000011001110110111001101" + }, + /* 23*/ { BARCODE_RSS14STACK, -1, "0950110153000", 3, 50, "https://www.gs1.org/standards/barcodes/databar, same, verified manually against tec-it", + "01000001010000010100011111111001011110110101110010" + "00001100101101101010100001010100100001001010100000" + "10100011011011000101111110000011001110110111001101" + }, + /* 24*/ { BARCODE_RSS_EXPSTACK, -1, "[01]09501101530003[17]140704[10]AB-123", 9, 102, "https://www.gs1.org/standards/barcodes/databar, same (tec-it separator differs)", + "010101111100001001101111111100001011100001110110010100000011011010001011111000000110011010000001001101" + "000010000011110110010000000010100100011110001001101011111100100101110100000101010001100101111110110000" + "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" + "000011011001001111100001000000001011011111000110110110110000111110101001010000001010011101110100010000" + "101000100110110000011100111111110100100000111001001001001111000001010100001111110001100010001011100010" + "000011011001001111100001000000001011011111000110110110110000111110101001010000001010011101110100010000" + "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" + "000010111101011110010100101010100100111100110010111001001100011111010100000000010000000000000000000000" + "010001000010100001100011000000001011000011001101000110110011100000101011111111100110100000000000000000" + }, + /* 25*/ { BARCODE_RSS_EXP, -1, "[01]09501101530003[17]140704[10]AB-123", 1, 281, "https://www.gs1.org/standards/barcodes/databar, same, verified manually against tec-it", + "01010111110000100110111111110000101110000111011001010000001101101000101111100000011001101000000100110001110100010001100011111100001010100000111100100100100111000001001011111111001110000011011001000100010000101000011000110000000010110000110011010001101100111000001010111111111001101" + }, + /* 26*/ { BARCODE_RSS14STACK, -1, "07010001234567", 3, 50, "https://www.gs1.no/support/standardbibliotek/datafangst/gs1-databar, same, verified manually against tec-it", + "01000100001010000100011100000001011000100110001010" + "00000011010101011010101011111010100111010101010000" + "10111100101110100101100000000111011000001000110101" + }, + /* 27*/ { BARCODE_RSS14STACK_OMNI, -1, "12380000000008", 5, 50, "Example with finder values 3 & 3; for bottom row see 5.3.2.2, same as BWIPP (tec-it and IDAutomation differ (ie no shift))", + "01011101001000000100010000000001010000001101011010" + "00000010110111111010101010101010101111110010100000" + "00000101010101010101010101010101010101010101010000" + "00001101100011001010000000000100101100111011110000" + "10100010011100110101111111110111010011000100001101" + }, + /* 28*/ { BARCODE_RSS14STACK_OMNI, -1, "99991234912372", 5, 50, "Example with finder values 8 & 6, same as BWIPP, verified manually against tec-it and IDAutomation", + "01001011101110000101110000000001011111011100101010" + "00000100010001111010001010101010100000100011010000" + "00000101010101010101010101010101010101010101010000" + "00001000100011001010000000010100100001000100100000" + "10100111011100110101111111100011011110111011011101" + }, + /* 29*/ { BARCODE_RSS14STACK_OMNI, -1, "32219876543217", 5, 50, "Example with finder values 6 & 1, same as BWIPP, verified manually against tec-it and IDAutomation", + "01001011000010001100111000000001011100010101000010" + "00000100111101110010000101010100100011101010110000" + "00000101010101010101010101010101010101010101010000" + "00001110011100101010000010101000110100001000010000" + "10110001100011010101111100000111001011110111100101" + }, + /* 30*/ { BARCODE_RSS14STACK_OMNI, -1, "32219876543255", 5, 50, "Example with finder values 7 & 7, same as BWIPP, verified manually against tec-it and IDAutomation", + "01001011000010001101111100000001011100010101000010" + "00000100111101110010000010101010100011101010110000" + "00000101010101010101010101010101010101010101010000" + "00000111001110101010000000101010110100001000010000" + "10111000110001010101111111000001001011110111100101" + }, + /* 31*/ { BARCODE_RSS14STACK_OMNI, -1, "04072912296211", 5, 50, "Example with finder values 7 & 8, same as BWIPP, verified manually against tec-it and IDAutomation", + "01001001000000010101111100000001011111000100101010" + "00000110111111101010000010101010100000111011010000" + "00000101010101010101010101010101010101010101010000" + "00001110100010111010000000001010111010000111010000" + "10110001011101000101111111110001000101111000101101" + }, + /* 32*/ { BARCODE_RSS14STACK_OMNI, -1, "06666666666666", 5, 50, "Example with finder values 6 & 4, same as BWIPP, verified manually against tec-it and IDAutomation", + "01000100010010000100111000000001011110111100101010" + "00001011101101111010000101010100100001000011010000" + "00000101010101010101010101010101010101010101010000" + "00000100011111001010000101010100101001100001110000" + "10101011100000110101111000000011010110011110000101" + }, + /* 33*/ { BARCODE_RSS_EXPSTACK, -1, "[90]12345678901234567", 5, 102, "Example with 7 chars, 1 full row, bottom 3 chars", + "010010100001111000101111111100001010000010001110110100111110001011101011111100001110001111010011000101" + "000001011110000111010000000010100101111101110001001011000001110100010100000010100001110000101100110000" + "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" + "000000100000000101111110110001101011110001110011010100101000000101000010010111000000000000000000000000" + "101110011111111010000001001110010100001110001100101010000111111000111101101000111101000000000000000000" + }, + /* 34*/ { BARCODE_RSS_EXPSTACK, -1, "[90]123456789012345678901234567", 9, 102, "Example with 10 chars, 2 full rows, bottom 2 chars", + "010000111100100010101111111100001010001000100000110100111110001011101011111000000110001111010011000101" + "000011000011011101010000000010100101110111011111001011000001110100010100000101010001110000101100110000" + "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" + "000010111011100011100001000000001011101111100011010111100011100110101001010000001010000100101110000000" + "101001000100011100011100111111110100010000011100101000011100011001010100001111110001111011010001111010" + "000010111011100011100001000000001011101111100011010111100011100110101001010000001010000100101110000000" + "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" + "000010000110110001010100001010100100000111010011000000000000000000000000000000000000000000000000000000" + "010001111001001110100011110000001011111000101100100100000000000000000000000000000000000000000000000000" + }, + /* 35*/ { BARCODE_RSS_EXPSTACK, -1, "[90]123456789012345678901234567890", 9, 102, "Example with 11 chars, 2 full rows, bottom 3 chars", + "010111011100010001101111111100001010000010001110110100111110001011101011111000000110001111010011000101" + "000000100011101110010000000010100101111101110001001011000001110100010100000101010001110000101100110000" + "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" + "000010111011100011100001000000001011101111100011010111100011100110101001010000001010000100101110000000" + "101001000100011100011100111111110100010000011100101000011100011001010100001111110001111011010001111010" + "000010111011100011100001000000001011101111100011010111100011100110101001010000001010000100101110000000" + "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" + "000010000110110001010100101010100100111000100011011011000110001101110100000000010000000000000000000000" + "010001111001001110100011000000001011000111011100100100111001110010001011111111100110100000000000000000" + }, + /* 36*/ { BARCODE_RSS_EXPSTACK, -1, "[91]1234567890123456789012345678901234", 9, 102, "Example with 12 chars, 3 full rows", + "010100010011111001101111111100001011001000010000010100111110001011101011111000000110001111010011000101" + "000011101100000110010000000010100100110111101111101011000001110100010100000101010001110000101100110000" + "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" + "000010111011100011100001000000001011101111100011010111100011100110101001010000001010000100101110000000" + "101001000100011100011100111111110100010000011100101000011100011001010100001111110001111011010001111010" + "000010111011100011100001000000001011101111100011010111100011100110101001010000001010000100101110000000" + "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" + "000010000110110001010100101010100100111000100011011011000110001110110100000000010001101110100001000000" + "010001111001001110100011000000001011000111011100100100111001110001001011111111100110010001011110111101" + }, + /* 37*/ { BARCODE_RSS_EXPSTACK, -1, "[91]123456789012345678901234567890123456789012", 13, 102, "Example with 15 chars, 3 full rows, bottom 7 chars", + "010010000111101011101111111100001011100000101100010100111110001011101011110000000010001111010011000101" + "000001111000010100010000000010100100011111010011101011000001110100010100001010101001110000101100110000" + "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" + "000010111011100011100001010100001011101111100011010111100011100110101001010000001010000100101110000000" + "101001000100011100011100000011110100010000011100101000011100011001010100001111110001111011010001111010" + "000010111011100011100001010100001011101111100011010111100011100110101001010000001010000100101110000000" + "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" + "000010000110110001010100001010100100111000100011011011000110001110110100000010100001011110100001000000" + "010001111001001110100011110000001011000111011100100100111001110001001011111100001110100001011110111101" + "000010000110110001010100001010100100111000100011011011000110001110110100000010100001011110100001000000" + "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" + "000000100000000101001001111101100011000010000110010100101010100101011111011100100000000000000000000000" + "101110011111111010110110000010011100111101111001101010000000011000100000100011011101000000000000000000" + }, + /* 38*/ { BARCODE_RSS_EXPSTACK, 3, "[91]123456789012345678901234567890123456789012", 9, 151, "Example with 15 chars, 2 full rows, bottom 3 chars", + "0100100001111010111011111111000010111000001011000101001111100010111010111100000000100011110100110001011110001011011110001111110000101010011000111000010" + "0000011110000101000100000000101001000111110100111010110000011101000101000010101010011100001011001110100001110100100001010000001010010101100111000110000" + "0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" + "0000011000111110111010000101010000111000111011101101110000110110001010100001010100100111000100011011011000110001110110100000010100001011110100001000000" + "1010100111000001000101111000000111000111000100010010001111001001110100011110000001011000111011100100100111001110001001011111100001110100001011110111101" + "0000011000111110111010000101010000111000111011101101110000110110001010100001010100100111000100011011011000110001110110100000010100001011110100001000000" + "0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" + "0000001001110111110101001010101001010011000010000110001101111100100101000000001000000000000000000000000000000000000000000000000000000000000000000000000" + "0101110110001000001000110000000010101100111101111001110010000011011010111111110011101000000000000000000000000000000000000000000000000000000000000000000" + }, + /* 39*/ { BARCODE_RSS_EXPSTACK, -1, "[91]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFG", 17, 102, "Example with 19 chars, 4 full rows, bottom 3 chars", + "010101111100011101101111111100001011100000101100010101111110011110101011110000000010111000111110010101" + "000010000011100010010000000010100100011111010011101010000001100001010100001010101001000111000001100000" + "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" + "000011110000110101100001010100001011001011000011110100001001101111001001010000001010100011100111100000" + "101100001111001010011100000011110100110100111100001011110110010000110100001111110001011100011000010010" + "000011110000110101100001010100001011001011000011110100001001101111001001010000001010100011100111100000" + "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" + "000001000010000111010100001010100101000010000111001011010111011111110100000010100001100011000010010000" + "010110111101111000100011110000001010111101111000110100101000100000001011111100001110011100111101100101" + "000001000010000111010100001010100101000010000111001011010111011111110100000010100001100011000010010000" + "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" + "000010000110111011100010101000001011000011110110100101001111000011001001010101001010011111001010010000" + "101101111001000100011000000111110100111100001001011010110000111100110100000000110001100000110101100010" + "000010000110111011100010101000001011000011110110100101001111000011001001010101001010011111001010010000" + "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" + "000010011111000111010001010101010101000111001111011011110100110000110100000000010000000000000000000000" + "010101100000111000100110000000001010111000110000100100001011001111001011111111100110100000000000000000" + }, + /* 40*/ { BARCODE_RSS_EXPSTACK, -1, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 21, 102, "Example with 22 chars, 5 full rows, bottom 2 chars", + "010101011110111111101111111100001011001000000101000100111110001011101011110000000010001111010011000101" + "000010100001000000010000000010100100110111111010111011000001110100010100001010101001110000101100110000" + "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" + "000010111011100011100001010100001011101111100011010111100011100110101001010000001010000100101110000000" + "101001000100011100011100000011110100010000011100101000011100011001010100001111110001111011010001111010" + "000010111011100011100001010100001011101111100011010111100011100110101001010000001010000100101110000000" + "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" + "000010000110110001010100001010100100111000100011011011000110001110110100000000100001011110100001000000" + "010001111001001110100011110000001011000111011100100100111001110001001011111111001110100001011110111101" + "000010000110110001010100001010100100111000100011011011000110001110110100000000100001011110100001000000" + "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" + "000010110011000001100010101000001011101111010001000110000100001100101001010101001010111110111001000000" + "101101001100111110011000000111110100010000101110111001111011110011010100000000110001000001000110111010" + "000010110011000001100010101000001011101111010001000110000100001100101001010101001010111110111001000000" + "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" + "000000110001100010010000000101010100000111100110101011011100010001110100000000010001011111010001100000" + "010111001110011101100111111000001011111000011001010100100011101110001011111111100110100000101110011101" + "000000110001100010010000000101010100000111100110101011011100010001110100000000010001011111010001100000" + "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" + "000001000111010000101000101010101010100001011000110000000000000000000000000000000000000000000000000000" + "001000111000101111010011000000000101011110100111000010000000000000000000000000000000000000000000000000" + }, + /* 41*/ { BARCODE_RSS_EXPSTACK, 3, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 13, 151, "Example with 22 chars, 3 full rows, bottom 4 chars", + "0101010111101111111011111111000010110010000001010001001111100010111010111100000000100011110100110001011110001011011110001111110000101010011000111000010" + "0000101000010000000100000000101001001101111110101110110000011101000101000010101010011100001011001110100001110100100001010000001010010101100111000110000" + "0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" + "0000011000111110111010000101010000111000111011101101110000110110001010100001010100100111000100011011011000110001110110100000000100001011110100001000000" + "1010100111000001000101111000000111000111000100010010001111001001110100011110000001011000111011100100100111001110001001011111111001110100001011110111101" + "0000011000111110111010000101010000111000111011101101110000110110001010100001010100100111000100011011011000110001110110100000000100001011110100001000000" + "0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" + "0000001001110111110101001010101001010011000010000110001000101111011101000001010100011000001100110100100011000110001001000000010101010000011110011010000" + "0101110110001000001000110000000010101100111101111001110111010000100010111110000001100111110011001011011100111001110110011111100000101111100001100101010" + "0000001001110111110101001010101001010011000010000110001000101111011101000001010100011000001100110100100011000110001001000000010101010000011110011010000" + "0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" + "0000101110001000111010000000001000101111101000110001110001110100001010001010101010101000010110001100000000000000000000000000000000000000000000000000000" + "1010010001110111000101111111110011010000010111001110001110001011110100110000000001010111101001110000100000000000000000000000000000000000000000000000000" + }, + /* 42*/ { BARCODE_RSS_EXPSTACK, 4, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 9, 200, "Example with 22 chars, 2 full rows, bottom 6 chars", + "01010101111011111110111111110000101100100000010100010011111000101110101111000000001000111101001100010111100010110111100011111100001010100110001110000101001110000010001011110000001110001110001000100101" + "00001010000100000001000000001010010011011111101011101100000111010001010000101010100111000010110011101000011101001000010100000010100101011001110001111010110001111101110100001010100001110001110111010000" + "00000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" + "00001011001100000110001010100000101110111101000100011000010000110010100101010100101011111011100100010000100001011110100001000000001011011100011000110110110001000111001001010100001010100011011000010000" + "10110100110011111001100000011111010001000010111011100111101111001101010000000011000100000100011011101111011110100001011100111111110100100011100111001001001110111000110100000011110001011100100111100010" + "00001011001100000110001010100000101110111101000100011000010000110010100101010100101011111011100100010000100001011110100001000000001011011100011000110110110001000111001001010100001010100011011000010000" + "00000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" + "00000011000110001001000000010101010000011110011010101101110001000111010000000001000101111101000110001110001110100001010001010101010101000010110001100000000000000000000000000000000000000000000000000000" + "01011100111001110110011111100000101111100001100101010010001110111000101111111110011010000010111001110001110001011110100110000000001010111101001110000100000000000000000000000000000000000000000000000000" + }, + /* 43*/ { BARCODE_RSS_EXPSTACK, 5, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 9, 249, "Example with 22 chars, 2 full rows, bottom 2 chars", + "010101011110111111101111111100001011001000000101000100111110001011101011110000000010001111010011000101111000101101111000111111000010101001100011100001010011100000100010111100000011100011100010001001000111100100111010001111000000101100011101110010010" + "000010100001000000010000000010100100110111111010111011000001110100010100001010101001110000101100111010000111010010000101000000101001010110011100011110101100011111011101000010101000011100011101110110111000011011000101010000101010010011100010001100000" + "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" + "000010001100011101101000000001000010111101000010000100010011101111101010010101010010100110000100001100010001011110111010000010101000110000011001101001000110001100010010000000101010100000111100110101011011100010001110100000000010001011111010001100000" + "101001110011100010010111111110011101000010111101111011101100010000010001100000000101011001111011110011101110100001000101111100000011001111100110010110111001110011101100111111000001011111000011001010100100011101110001011111111100110100000101110011101" + "000010001100011101101000000001000010111101000010000100010011101111101010010101010010100110000100001100010001011110111010000010101000110000011001101001000110001100010010000000101010100000111100110101011011100010001110100000000010001011111010001100000" + "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" + "000010001110100001010001010101010101000010110001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "010001110001011110100110000000001010111101001110000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + /* 44*/ { BARCODE_RSS_EXPSTACK, 6, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 5, 298, "Example with 22 chars, 1 full row, bottom 10 chars", + "0101010111101111111011111111000010110010000001010001001111100010111010111100000000100011110100110001011110001011011110001111110000101010011000111000010100111000001000101111000000111000111000100010010001111001001110100011110000001011000111011100100100111001110001001011111111001110100001011110111101" + "0000101000010000000100000000101001001101111110101110110000011101000101000010101010011100001011001110100001110100100001010000001010010101100111000111101011000111110111010000101010000111000111011101101110000110110001010100001010100100111000100011011011000110001110110100000000100001011110100001000000" + "0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" + "0000000100111011111010100101010100101001100001000011000100010111101110100000101010001100000110011010010001100011000100100000001010101000001111001101010110111000100011101000000000100010111110100011000111000111010000101000101010101010100001011000110000000000000000000000000000000000000000000000000000" + "0010111011000100000100011000000001010110011110111100111011101000010001011111000000110011111001100101101110011100111011001111110000010111110000110010101001000111011100010111111111001101000001011100111000111000101111010011000000000101011110100111000010000000000000000000000000000000000000000000000000" + }, + /* 45*/ { BARCODE_RSS_EXPSTACK, 7, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 5, 347, "Example with 22 chars, 1 full row, bottom 8 chars", + "01010101111011111110111111110000101100100000010100010011111000101110101111000000001000111101001100010111100010110111100011111100001010100110001110000101001110000010001011110000001110001110001000100100011110010011101000111100000010110001110111001001001110011100010010111111110011101000010111101111011101100010000010001100000000101011001111011110010" + "00001010000100000001000000001010010011011111101011101100000111010001010000101010100111000010110011101000011101001000010100000010100101011001110001111010110001111101110100001010100001110001110111011011100001101100010101000010101001001110001000110110110001100011101101000000001000010111101000010000100010011101111101010010101010010100110000100000000" + "00000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" + "00000100010111101110100000101010001100000110011010010001100011000100100000001010101000001111001101010110111000100011101000000000100010111110100011000111000111010000101000101010101010100001011000110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "10111011101000010001011111000000110011111001100101101110011100111011001111110000010111110000110010101001000111011100010111111111001101000001011100111000111000101111010011000000000101011110100111000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + /* 46*/ { BARCODE_RSS_EXPSTACK, 8, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 5, 396, "Example with 22 chars, 1 full row, bottom 6 chars", + "010101011110111111101111111100001011001000000101000100111110001011101011110000000010001111010011000101111000101101111000111111000010101001100011100001010011100000100010111100000011100011100010001001000111100100111010001111000000101100011101110010010011100111000100101111111100111010000101111011110111011000100000100011000000001010110011110111100111011101000010001011111000000110011111001100101101" + "000010100001000000010000000010100100110111111010111011000001110100010100001010101001110000101100111010000111010010000101000000101001010110011100011110101100011111011101000010101000011100011101110110111000011011000101010000101010010011100010001101101100011000111011010000000010000101111010000100001000100111011111010100101010100101001100001000011000100010111101110100000101010001100000110011010000" + "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" + "000000011000110001001000000010101010000011110011010101101110001000111010000000001000101111101000110001110001110100001010001010101010101000010110001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "001011100111001110110011111100000101111100001100101010010001110111000101111111110011010000010111001110001110001011110100110000000001010111101001110000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + /* 47*/ { BARCODE_RSS_EXPSTACK, 9, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 5, 445, "Example with 22 chars, 1 full row, bottom 4 chars", + "0101010111101111111011111111000010110010000001010001001111100010111010111100000000100011110100110001011110001011011110001111110000101010011000111000010100111000001000101111000000111000111000100010010001111001001110100011110000001011000111011100100100111001110001001011111111001110100001011110111101110110001000001000110000000010101100111101111001110111010000100010111110000001100111110011001011011100111001110110011111100000101111100001100101010" + "0000101000010000000100000000101001001101111110101110110000011101000101000010101010011100001011001110100001110100100001010000001010010101100111000111101011000111110111010000101010000111000111011101101110000110110001010100001010100100111000100011011011000110001110110100000000100001011110100001000010001001110111110101001010101001010011000010000110001000101111011101000001010100011000001100110100100011000110001001000000010101010000011110011010000" + "0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" + "0000101110001000111010000000001000101111101000110001110001110100001010001010101010101000010110001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "1010010001110111000101111111110011010000010111001110001110001011110100110000000001010111101001110000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + /* 48*/ { BARCODE_RSS_EXPSTACK, 10, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 5, 494, "Example with 22 chars, 1 full row, bottom 2 chars", + "01010101111011111110111111110000101100100000010100010011111000101110101111000000001000111101001100010111100010110111100011111100001010100110001110000101001110000010001011110000001110001110001000100100011110010011101000111100000010110001110111001001001110011100010010111111110011101000010111101111011101100010000010001100000000101011001111011110011101110100001000101111100000011001111100110010110111001110011101100111111000001011111000011001010100100011101110001011111111100110100000101110011101" + "00001010000100000001000000001010010011011111101011101100000111010001010000101010100111000010110011101000011101001000010100000010100101011001110001111010110001111101110100001010100001110001110111011011100001101100010101000010101001001110001000110110110001100011101101000000001000010111101000010000100010011101111101010010101010010100110000100001100010001011110111010000010101000110000011001101001000110001100010010000000101010100000111100110101011011100010001110100000000010001011111010001100000" + "00000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" + "00000100011101000010100010101010101010000101100011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "00100011100010111101001100000000010101111010011100001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + /* 49*/ { BARCODE_RSS_EXPSTACK, 11, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 1, 543, "Example with 22 chars, 1 row", + "010101011110111111101111111100001011001000000101000100111110001011101011110000000010001111010011000101111000101101111000111111000010101001100011100001010011100000100010111100000011100011100010001001000111100100111010001111000000101100011101110010010011100111000100101111111100111010000101111011110111011000100000100011000000001010110011110111100111011101000010001011111000000110011111001100101101110011100111011001111110000010111110000110010101001000111011100010111111111001101000001011100111000111000101111010011000000000101011110100111000010" + }, + /* 50*/ { BARCODE_RSS_EXPSTACK, 1, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 41, 53, "Example with 22 chars, 11 rows", + "01010101111011111110111111110000101100100000010100010" + "00001010000100000001000000001010010011011111101010000" + "00000101010101010101010101010101010101010101010100000" + "00001000001110100010100001010101001110000101100110000" + "10100111110001011101011110000000010001111010011000101" + "00001000001110100010100001010101001110000101100110000" + "00000101010101010101010101010101010101010101010100000" + "00000001110100100001010000001010010101100111000110000" + "01011110001011011110001111110000101010011000111000010" + "00000001110100100001010000001010010101100111000110000" + "00000101010101010101010101010101010101010101010100000" + "00000110001111101110100001010100001110001110111010000" + "10101001110000010001011110000001110001110001000100101" + "00000110001111101110100001010100001110001110111010000" + "00000101010101010101010101010101010101010101010100000" + "00001000011011000101010000101010010011100010001100000" + "01000111100100111010001111000000101100011101110010010" + "00001000011011000101010000101010010011100010001100000" + "00000101010101010101010101010101010101010101010100000" + "00001000110001110110100000000100001011110100001000000" + "10100111001110001001011111111001110100001011110111101" + "00001000110001110110100000000100001011110100001000000" + "00000101010101010101010101010101010101010101010100000" + "00000010011101111101010010101010010100110000100000000" + "01011101100010000010001100000000101011001111011110010" + "00000010011101111101010010101010010100110000100000000" + "00000101010101010101010101010101010101010101010100000" + "00000100010111101110100000101010001100000110011010000" + "10111011101000010001011111000000110011111001100101101" + "00000100010111101110100000101010001100000110011010000" + "00000101010101010101010101010101010101010101010100000" + "00000011000110001001000000010101010000011110011010000" + "01011100111001110110011111100000101111100001100101010" + "00000011000110001001000000010101010000011110011010000" + "00000101010101010101010101010101010101010101010100000" + "00001011100010001110100000000010001011111010001100000" + "10100100011101110001011111111100110100000101110011101" + "00001011100010001110100000000010001011111010001100000" + "00000101010101010101010101010101010101010101010100000" + "00001000111010000101000101010101010100001011000110000" + "01000111000101111010011000000000101011110100111000010" + }, }; int data_size = sizeof(data) / sizeof(struct item); + char bwipp_buf[4096]; + char bwipp_msg[1024]; + int pix; + for (int i = 0; i < data_size; i++) { if (index != -1 && i != index) continue; + if (debug & ZINT_DEBUG_TEST_PRINT) printf("i:%d\n", i); struct zint_symbol *symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); int length = testUtilSetSymbol(symbol, data[i].symbology, -1 /*input_mode*/, -1 /*eci*/, -1 /*option_1*/, data[i].option_2, -1, -1 /*output_options*/, data[i].data, -1, debug); - ret = ZBarcode_Encode(symbol, data[i].data, length); - assert_equal(ret, data[i].ret, "i:%d ret %d != %d %s\n", i, ret, data[i].ret, symbol->errtxt); + ret = ZBarcode_Encode(symbol, (const unsigned char *) data[i].data, length); + assert_zero(ret, "i:%d ZBarcode_Encode ret %d != 0 (%s)\n", i, ret, symbol->errtxt); if (generate) { - if (ret == 0) { - printf(" /*%2d*/ { %s, %d, \"%s\", %d, %d, %d, \"%s\",\n", - i, testUtilBarcodeName(symbol->symbology), data[i].option_2, data[i].data, ret, symbol->rows, symbol->width, data[i].comment); - testUtilModulesDump(symbol, " ", "\n"); - printf(" },\n"); - } else { - printf(" /*%2d*/ { %s, \"%s\", %s, %d, %d, \"%s\", \"\" },\n", - i, testUtilBarcodeName(symbol->symbology), data[i].data, testUtilErrorName(ret), symbol->rows, symbol->width, data[i].comment); - } + printf(" /*%3d*/ { %s, %d, \"%s\", %d, %d, %d, \"%s\",\n", + i, testUtilBarcodeName(symbol->symbology), data[i].option_2, data[i].data, ret, symbol->rows, symbol->width, data[i].comment); + testUtilModulesDump(symbol, " ", "\n"); + printf(" },\n"); } else { assert_equal(symbol->rows, data[i].expected_rows, "i:%d %s symbol->rows %d != %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), symbol->rows, data[i].expected_rows, data[i].data); assert_equal(symbol->width, data[i].expected_width, "i:%d %s symbol->width %d != %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), symbol->width, data[i].expected_width, data[i].data); - if (ret == 0) { - int width, row; - ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); - assert_zero(ret, "i:%d %s testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), ret, width, row, data[i].data); + int width, row; + ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); + assert_zero(ret, "i:%d %s testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), ret, width, row, data[i].data); + + if (do_bwipp && testUtilCanBwipp(symbol->symbology, -1, data[i].option_2, -1, debug)) { + ret = testUtilBwipp(symbol, -1, data[i].option_2, -1, data[i].data, length, NULL, bwipp_buf, sizeof(bwipp_buf)); + assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(data[i].symbology), ret); + + ret = testUtilBwippCmp(symbol, bwipp_msg, bwipp_buf, data[i].expected); + assert_zero(ret, "i:%d %s testUtilBwippCmp %d != 0 %s\n actual: %s\nexpected: %s\n", + i, testUtilBarcodeName(data[i].symbology), ret, bwipp_msg, bwipp_buf, data[i].expected); } } @@ -331,154 +646,153 @@ static void test_general_field(int index, int generate, int debug) { int ret; struct item { int symbology; - unsigned char *data; - int ret; + char *data; int expected_rows; int expected_width; char *comment; - unsigned char *expected; + char *expected; }; - // Verified manually against bwipp and tec-it.com (bottom separator differs from tec-it.com where noted) + // Verified via bwipp_dump.ps against BWIPP and manually against tec-it.com (some separators differ from tec-it.com where noted) struct item data[] = { - /* 0*/ { BARCODE_RSS_EXP, "[91]1", 0, 1, 102, "Single numeric", + /* 0*/ { BARCODE_RSS_EXP, "[91]1", 1, 102, "Single numeric", "010100000001000101101111111100001011001000010000010110111110101100001011110000000010101111100001011101" }, - /* 1*/ { BARCODE_RSS_EXP, "[91]12", 0, 1, 102, "2 numerics", + /* 1*/ { BARCODE_RSS_EXP, "[91]12", 1, 102, "2 numerics", "010010000010000101101111111100001011001000010000010101111100101110001011110000000010101111100001011101" }, - /* 2*/ { BARCODE_RSS_EXP, "[91]123", 0, 1, 102, "Odd-numbered numeric", + /* 2*/ { BARCODE_RSS_EXP, "[91]123", 1, 102, "Odd-numbered numeric", "010100000110000100101111111100001011001000010000010100011111010111001011110000000010000011000110100101" }, - /* 3*/ { BARCODE_RSS_EXP, "[91]1234", 0, 1, 102, "Even-numbered numeric", + /* 3*/ { BARCODE_RSS_EXP, "[91]1234", 1, 102, "Even-numbered numeric", "010110010000001000101111111100001011001000010000010100111110001011101011110000000010001101111001011101" }, - /* 4*/ { BARCODE_RSS_EXP, "[91]A1234567C", 0, 1, 183, "Alphanumeric followed by 7 digits and alphanumeric", + /* 4*/ { BARCODE_RSS_EXP, "[91]A1234567C", 1, 183, "Alphanumeric followed by 7 digits and alphanumeric", "010100000111001001101111111100001011000001000101110101111110111101001011111100001110100110111110111100001111010110011000111111000010110001000001101101110111101111010010111111110011101" }, - /* 5*/ { BARCODE_RSS_EXP, "[91]A123456C", 0, 1, 151, "Alphanumeric followed by 6 digits and alphanumeric", + /* 5*/ { BARCODE_RSS_EXP, "[91]A123456C", 1, 151, "Alphanumeric followed by 6 digits and alphanumeric", "0101100111001000001011111111000010110010000100000101011111101111010010111100000011101001101111101111000011110101100110001111110000101000100011000111010" }, - /* 6*/ { BARCODE_RSS_EXP, "[91]A12345B", 0, 1, 151, "Alphanumeric followed by 5 digits and alphanumeric", + /* 6*/ { BARCODE_RSS_EXP, "[91]A12345B", 1, 151, "Alphanumeric followed by 5 digits and alphanumeric", "0101111001000001001011111111000010110010000100000101011111101111010010111100000011100000010111001001010000111101000010001111110000101100000001001010010" }, - /* 7*/ { BARCODE_RSS_EXP, "[91]A1234567", 0, 1, 151, "Alphanumeric followed by 7 digits, terminating", + /* 7*/ { BARCODE_RSS_EXP, "[91]A1234567", 1, 151, "Alphanumeric followed by 7 digits, terminating", "0101100100011100001011111111000010110010000100000101011111101111010010111100000011101001101111101111000011110110100110001111110000101101011110111100010" }, - /* 8*/ { BARCODE_RSS_EXP, "[91]A123456", 0, 1, 134, "Alphanumeric followed by 6 digits, terminating", + /* 8*/ { BARCODE_RSS_EXP, "[91]A123456", 1, 134, "Alphanumeric followed by 6 digits, terminating", "01000101001100000010111111110000101100000100010111010111111011110100101111000000111010011011111011110000111101011001100011111100001010" }, - /* 9*/ { BARCODE_RSS_EXP, "[91]A12345", 0, 1, 134, "Alphanumeric followed by 5 digits, terminating", + /* 9*/ { BARCODE_RSS_EXP, "[91]A12345", 1, 134, "Alphanumeric followed by 5 digits, terminating", "01000110010100000010111111110000101100000100010111010111111011110100101111000000111010011011111011110000101100111110100011111100001010" }, - /*10*/ { BARCODE_RSS_EXP, "[91]A1234", 0, 1, 134, "Alphanumeric followed by 4 digits, terminating", + /*10*/ { BARCODE_RSS_EXP, "[91]A1234", 1, 134, "Alphanumeric followed by 4 digits, terminating", "01011101000010000110111111110000101100000100010111010111111011110100101111000000111010011011111011110001101111100100100011111100001010" }, - /*11*/ { BARCODE_RSS_EXP, "[91]A123", 0, 1, 134, "Alphanumeric followed by 3 digits, terminating", + /*11*/ { BARCODE_RSS_EXP, "[91]A123", 1, 134, "Alphanumeric followed by 3 digits, terminating", "01000010110010000010111111110000101100000100010111010111111011110100101111000000111000000101110010010001000010000101100011111100001010" }, - /*12*/ { BARCODE_RSS_EXP, "[91]a1234ABCDEFGb", 0, 1, 249, "ISO-646 followed by 11 non-ISO-646 non-terminating, starting 4 digits", + /*12*/ { BARCODE_RSS_EXP, "[91]a1234ABCDEFGb", 1, 249, "ISO-646 followed by 11 non-ISO-646 non-terminating, starting 4 digits", "010000100011100110101111111100001011001000010000010101101111110011101011111000000110000110110100011100001110000101011000111111000010100111000010110001000000100110110010111111110011101000001110010001010011011111100110001111000000101110111010011000010" }, - /*13*/ { BARCODE_RSS_EXP, "[91]a1234ABCDEFb", 0, 1, 249, "ISO-646 followed by 10 non-ISO-646 non-terminating, starting 4 digits", + /*13*/ { BARCODE_RSS_EXP, "[91]a1234ABCDEFb", 1, 249, "ISO-646 followed by 10 non-ISO-646 non-terminating, starting 4 digits", "010111010001110001101111111100001011001000010000010101101111110011101011111000000110000110110100011100001110000101011000111111000010100111000010110001000000100110110010111111110011101000001110010001001100011011100110001111000000101101000111001110010" }, - /*14*/ { BARCODE_RSS_EXP, "[91]a1234ABCDEF", 0, 1, 232, "ISO-646 followed by 10 non-ISO-646 terminating, starting 4 digits", + /*14*/ { BARCODE_RSS_EXP, "[91]a1234ABCDEF", 1, 232, "ISO-646 followed by 10 non-ISO-646 terminating, starting 4 digits", "0100001011010000111011111111000010110000010001011101011011111100111010111110000001100001101101000111000011100001010110001111110000101001110000101100010000001001101100101111111100111010000011100100010011100111000101100011110000001010" }, - /*15*/ { BARCODE_RSS_EXP, "[91]a1234ABCDEb", 0, 1, 232, "ISO-646 followed by 9 non-ISO-646 non-terminating, starting 4 digits", + /*15*/ { BARCODE_RSS_EXP, "[91]a1234ABCDEb", 1, 232, "ISO-646 followed by 9 non-ISO-646 non-terminating, starting 4 digits", "0100001011011000011011111111000010110000010001011101011011111100111010111110000001100100011100100111011110010111110010001111110000101111100011001010010110001000011110101111111100111011100101111000110111001000011110100011110000001010" }, - /*16*/ { BARCODE_RSS_EXP, "[91]a1234ABCDE", 0, 1, 200, "ISO-646 followed by 9 non-ISO-646 terminating, starting 4 digits", + /*16*/ { BARCODE_RSS_EXP, "[91]a1234ABCDE", 1, 200, "ISO-646 followed by 9 non-ISO-646 terminating, starting 4 digits", "01001000011000111010111111110000101100100001000001010110111111001110101111110000111000011011010001110000111000010101100011111100001010011100001011000100000010011011001011111111001110010011100000100101" }, - /*17*/ { BARCODE_RSS_EXP, "[91]aABCDEF12345b", 0, 1, 249, "ISO-646 followed by 11 non-ISO-646 non-terminating, starting 6 letters", + /*17*/ { BARCODE_RSS_EXP, "[91]aABCDEF12345b", 1, 249, "ISO-646 followed by 11 non-ISO-646 non-terminating, starting 6 letters", "010000100010100111101111111100001011001000010000010101101111110011101011111000000110100001110001011100010000010100011000111111000010111101000100100001100111010000110010111111110011101000001110011011000100000110101110001111000000101011110010001110010" }, - /*18*/ { BARCODE_RSS_EXP, "[91]aABCDEF1234b", 0, 1, 249, "ISO-646 followed by 10 non-ISO-646 non-terminating, starting 6 letters", + /*18*/ { BARCODE_RSS_EXP, "[91]aABCDEF1234b", 1, 249, "ISO-646 followed by 10 non-ISO-646 non-terminating, starting 6 letters", "010110111100110000101111111100001011001000010000010101101111110011101011111000000110100001110001011100010000010100011000111111000010111101000100100001100111010000110010111111110011101000001110011011000100001001110110001111000000101111110110110001010" }, - /*19*/ { BARCODE_RSS_EXP, "[91]aABCDE12345b", 0, 1, 249, "ISO-646 followed by 10 non-ISO-646 non-terminating, starting 5 letters", + /*19*/ { BARCODE_RSS_EXP, "[91]aABCDE12345b", 1, 249, "ISO-646 followed by 10 non-ISO-646 non-terminating, starting 5 letters", "010000100010011011101111111100001011001000010000010101101111110011101011111000000110100001110001011100010000010100011000111111000010111101000100100001100100001110011010111111110011100110110010000111000101111000101110001111000000101111011001101000010" }, - /*20*/ { BARCODE_RSS_EXP, "[91]aABCDE1234", 0, 1, 200, "ISO-646 followed by 10 non-ISO-646 terminating, starting 5 letters", + /*20*/ { BARCODE_RSS_EXP, "[91]aABCDE1234", 1, 200, "ISO-646 followed by 10 non-ISO-646 terminating, starting 5 letters", "01000101100011100010111111110000101100100001000001010110111111001110101111110000111010000111000101110001000001010001100011111100001011110100010010000110000100101111001011111111001110010010001110011101" }, - /*21*/ { BARCODE_RSS_EXP, "[91]aABCDE1234b", 0, 1, 232, "ISO-646 followed by 9 non-ISO-646 non-terminating, starting 5 letters", + /*21*/ { BARCODE_RSS_EXP, "[91]aABCDE1234b", 1, 232, "ISO-646 followed by 9 non-ISO-646 non-terminating, starting 5 letters", "0100010000110011011011111111000010110000010001011101011011111100111010111110000001100001000110110111010000010110000010001111110000101000011101001100011001000011100110101111111100111011001100100001110111001000011110100011110000001010" }, - /*22*/ { BARCODE_RSS_EXP, "[91]aABCDE1234", 0, 1, 200, "ISO-646 followed by 9 non-ISO-646 terminating, starting 5 letters", + /*22*/ { BARCODE_RSS_EXP, "[91]aABCDE1234", 1, 200, "ISO-646 followed by 9 non-ISO-646 terminating, starting 5 letters", "01000101100011100010111111110000101100100001000001010110111111001110101111110000111010000111000101110001000001010001100011111100001011110100010010000110000100101111001011111111001110010010001110011101" }, - /*23*/ { BARCODE_RSS_EXPSTACK, "[91]1", 0, 1, 102, "Single numeric", + /*23*/ { BARCODE_RSS_EXPSTACK, "[91]1", 1, 102, "Single numeric", "010100000001000101101111111100001011001000010000010110111110101100001011110000000010101111100001011101" }, - /*24*/ { BARCODE_RSS_EXPSTACK, "[91]12", 0, 1, 102, "2 numerics", + /*24*/ { BARCODE_RSS_EXPSTACK, "[91]12", 1, 102, "2 numerics", "010010000010000101101111111100001011001000010000010101111100101110001011110000000010101111100001011101" }, - /*25*/ { BARCODE_RSS_EXPSTACK, "[91]123", 0, 1, 102, "Odd-numbered numeric", + /*25*/ { BARCODE_RSS_EXPSTACK, "[91]123", 1, 102, "Odd-numbered numeric", "010100000110000100101111111100001011001000010000010100011111010111001011110000000010000011000110100101" }, - /*26*/ { BARCODE_RSS_EXPSTACK, "[91]1234", 0, 1, 102, "Even-numbered numeric", + /*26*/ { BARCODE_RSS_EXPSTACK, "[91]1234", 1, 102, "Even-numbered numeric", "010110010000001000101111111100001011001000010000010100111110001011101011110000000010001101111001011101" }, - /*27*/ { BARCODE_RSS_EXPSTACK, "[91]A1234567C", 0, 5, 102, "Alphanumeric followed by 7 digits and alphanumeric", + /*27*/ { BARCODE_RSS_EXPSTACK, "[91]A1234567C", 5, 102, "Alphanumeric followed by 7 digits and alphanumeric **NOTE** bottom separator differs from tec-it, same as BWIPP", "010100000111001001101111111100001011000001000101110101111110111101001011111100001110100110111110111101" - "000011111000110110010000000010100100111110111010001010000001000010100100000010100001011001000001000000" + "000011111000110110010000000010100100111110111010001010000001000010110100000010100001011001000001000000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" - "000000100000000101101000010000100010010011111011100100101000000011001100101000011000000000000000000000" + "000000100000000101101000010000100010010011111011100100101000000101001100101000011000000000000000000000" "101110011111111010010111101111011101101100000100011010000111111000110011010111100001000000000000000000" }, - /*28*/ { BARCODE_RSS_EXPSTACK, "[91]A123456C", 0, 5, 102, "Alphanumeric followed by 6 digits and alphanumeric", + /*28*/ { BARCODE_RSS_EXPSTACK, "[91]A123456C", 5, 102, "Alphanumeric followed by 6 digits and alphanumeric **NOTE** bottom separator differs from tec-it, same as BWIPP", "010110011100100000101111111100001011001000010000010101111110111101001011110000001110100110111110111101" - "000001100011011111010000000010100100110111101111101010000001000010100100001010100001011001000001000000" + "000001100011011111010000000010100100110111101111101010000001000010110100001010100001011001000001000000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "000001100001010011001010000001010010111011100111000000000000000000000000000000000000000000000000000000" "001000011110101100110001111110000101000100011000111010000000000000000000000000000000000000000000000000" }, - /*29*/ { BARCODE_RSS_EXPSTACK, "[91]A12345B", 0, 5, 102, "Alphanumeric followed by 5 digits and alphanumeric", + /*29*/ { BARCODE_RSS_EXPSTACK, "[91]A12345B", 5, 102, "Alphanumeric followed by 5 digits and alphanumeric **NOTE** ditto", "010111100100000100101111111100001011001000010000010101111110111101001011110000001110000001011100100101" - "000000011011111011010000000010100100110111101111101010000001000010100100001010100001111110100011010000" + "000000011011111011010000000010100100110111101111101010000001000010110100001010100001111110100011010000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "000001111000010111101010000001010010011111110110100000000000000000000000000000000000000000000000000000" "001010000111101000010001111110000101100000001001010010000000000000000000000000000000000000000000000000" }, - /*30*/ { BARCODE_RSS_EXPSTACK, "[91]A1234567", 0, 5, 102, "Alphanumeric followed by 7 digits, terminating **NOTE** bottom separator differs from tec-it.com, same as bwipp", + /*30*/ { BARCODE_RSS_EXPSTACK, "[91]A1234567", 5, 102, "Alphanumeric followed by 7 digits, terminating **NOTE** ditto", "010110010001110000101111111100001011001000010000010101111110111101001011110000001110100110111110111101" - "000001101110001111010000000010100100110111101111101010000001000010100100001010100001011001000001000000" + "000001101110001111010000000010100100110111101111101010000001000010110100001010100001011001000001000000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "000001100001001011001010000001010010010100001000010000000000000000000000000000000000000000000000000000" "001000011110110100110001111110000101101011110111100010000000000000000000000000000000000000000000000000" }, - /*31*/ { BARCODE_RSS_EXPSTACK, "[91]A123456", 0, 5, 102, "Alphanumeric followed by 6 digits, terminating **NOTE** ditto", + /*31*/ { BARCODE_RSS_EXPSTACK, "[91]A123456", 5, 102, "Alphanumeric followed by 6 digits, terminating **NOTE** ditto", "010100001100111000101111111100001011001000010000010101111110111101001011110000001110100110111110111101" - "000011110011000111010000000010100100110111101111101010000001000010100100001010100001011001000001000000" + "000011110011000111010000000010100100110111101111101010000001000010110100001010100001011001000001000000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "000001100001010011001010000001010010011101011111110000000000000000000000000000000000000000000000000000" "001000011110101100110001111110000101100010100000001010000000000000000000000000000000000000000000000000" }, - /*32*/ { BARCODE_RSS_EXPSTACK, "[91]A12345", 0, 5, 102, "Alphanumeric followed by 5 digits, terminating **NOTE** ditto", + /*32*/ { BARCODE_RSS_EXPSTACK, "[91]A12345", 5, 102, "Alphanumeric followed by 5 digits, terminating **NOTE** ditto", "010100100011000011101111111100001011001000010000010101111110111101001011110000001110100110111110111101" - "000011011100111100010000000010100100110111101111101010000001000010100100001010100001011001000001000000" + "000011011100111100010000000010100100110111101111101010000001000010110100001010100001011001000001000000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "000001101001100000101010000001010010011101011111110000000000000000000000000000000000000000000000000000" "001000010110011111010001111110000101100010100000001010000000000000000000000000000000000000000000000000" }, - /*33*/ { BARCODE_RSS_EXPSTACK, "[91]A1234", 0, 5, 102, "Alphanumeric followed by 4 digits, terminating **NOTE** ditto", + /*33*/ { BARCODE_RSS_EXPSTACK, "[91]A1234", 5, 102, "Alphanumeric followed by 4 digits, terminating **NOTE** ditto", "010111000010010001101111111100001011001000010000010101111110111101001011110000001110100110111110111101" - "000000111101101110010000000010100100110111101111101010000001000010100100001010100001011001000001000000" + "000000111101101110010000000010100100110111101111101010000001000010110100001010100001011001000001000000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "000001001000001101101010000001010010000111011101110000000000000000000000000000000000000000000000000000" "001000110111110010010001111110000101111000100010001010000000000000000000000000000000000000000000000000" }, - /*34*/ { BARCODE_RSS_EXPSTACK, "[91]A123", 0, 5, 102, "Alphanumeric followed by 3 digits, terminating **NOTE** ditto", + /*34*/ { BARCODE_RSS_EXPSTACK, "[91]A123", 5, 102, "Alphanumeric followed by 3 digits, terminating **NOTE** ditto", "010110000100111000101111111100001011001000010000010101111110111101001011110000001110000001011100100101" - "000001111011000111010000000010100100110111101111101010000001000010100100001010100001111110100011010000" + "000001111011000111010000000010100100110111101111101010000001000010110100001010100001111110100011010000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "000001011110111101001010000001010010101111100001010000000000000000000000000000000000000000000000000000" "001000100001000010110001111110000101010000011110100010000000000000000000000000000000000000000000000000" }, - /*35*/ { BARCODE_RSS_EXPSTACK, "[91]a1234ABCDEFGb", 0, 9, 102, "ISO-646 followed by 11 non-ISO-646 non-terminating, starting 4 digits **NOTE** ditto", + /*35*/ { BARCODE_RSS_EXPSTACK, "[91]a1234ABCDEFGb", 9, 102, "ISO-646 followed by 11 non-ISO-646 non-terminating, starting 4 digits **NOTE** separators differ from tec-it, same as BWIPP", "010000100011100110101111111100001011001000010000010101101111110011101011111000000110000110110100011101" "000011011100011001010000000010100100110111101111101010010000001100010100000101010001111001001011100000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" @@ -489,7 +803,7 @@ static void test_general_field(int index, int generate, int debug) { "000011001000000110010100001010100100010001011001100000000000000000000000000000000000000000000000000000" "010100110111111001100011110000001011101110100110000100000000000000000000000000000000000000000000000000" }, - /*36*/ { BARCODE_RSS_EXPSTACK, "[91]a1234ABCDEFb", 0, 9, 102, "ISO-646 followed by 10 non-ISO-646 non-terminating, starting 4 digits", + /*36*/ { BARCODE_RSS_EXPSTACK, "[91]a1234ABCDEFb", 9, 102, "ISO-646 followed by 10 non-ISO-646 non-terminating, starting 4 digits **NOTE** top separator differs from tec-it, same as BWIPP", "010111010001110001101111111100001011001000010000010101101111110011101011111000000110000110110100011101" "000000101110001110010000000010100100110111101111101010010000001100010100000101010001111001001011100000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" @@ -500,7 +814,7 @@ static void test_general_field(int index, int generate, int debug) { "000000111001000110010100001010100100101110001100000000000000000000000000000000000000000000000000000000" "010011000110111001100011110000001011010001110011100100000000000000000000000000000000000000000000000000" }, - /*37*/ { BARCODE_RSS_EXPSTACK, "[91]a1234ABCDEF", 0, 9, 102, "ISO-646 followed by 10 non-ISO-646 terminating, starting 4 digits **NOTE** ditto", + /*37*/ { BARCODE_RSS_EXPSTACK, "[91]a1234ABCDEF", 9, 102, "ISO-646 followed by 10 non-ISO-646 terminating, starting 4 digits **NOTE** separators differ from tec-it, same as BWIPP", "010110111001000011101111111100001011001000010000010101101111110011101011111000000110000110110100011101" "000001000110111100010000000010100100110111101111101010010000001100010100000101010001111001001011100000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" @@ -511,7 +825,7 @@ static void test_general_field(int index, int generate, int debug) { "000000011000111010010100001010100101011111000010100000000000000000000000000000000000000000000000000000" "010011100111000101100011110000001010100000111101000100000000000000000000000000000000000000000000000000" }, - /*38*/ { BARCODE_RSS_EXPSTACK, "[91]a1234ABCDEb", 0, 9, 102, "ISO-646 followed by 9 non-ISO-646 non-terminating, starting 4 digits **NOTE** ditto", + /*38*/ { BARCODE_RSS_EXPSTACK, "[91]a1234ABCDEb", 9, 102, "ISO-646 followed by 9 non-ISO-646 non-terminating, starting 4 digits **NOTE** ditto", "010110111001100001101111111100001011001000010000010101101111110011101011111000000110010001110010011101" "000001000110011110010000000010100100110111101111101010010000001100010100000101010001101110001101100000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" @@ -522,14 +836,14 @@ static void test_general_field(int index, int generate, int debug) { "000000110111100001010100001010100101011111000010100000000000000000000000000000000000000000000000000000" "010111001000011110100011110000001010100000111101000100000000000000000000000000000000000000000000000000" }, - /*39*/ { BARCODE_RSS_EXPSTACK, "[91]a1234ABCDE", 0, 5, 102, "ISO-646 followed by 9 non-ISO-646 terminating, starting 4 digits", + /*39*/ { BARCODE_RSS_EXPSTACK, "[91]a1234ABCDE", 5, 102, "ISO-646 followed by 9 non-ISO-646 terminating, starting 4 digits **NOTE** bottom separator differs from tec-it, same as BWIPP", "010010000110001110101111111100001011001000010000010101101111110011101011111100001110000110110100011101" "000001111001110001010000000010100100110111101111101010010000001100010100000010100001111001001011100000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "000010111110001101100001000000001011001001101111110111001011110001101001010000001010010101111000110000" "101001000001110010011100111111110100110110010000001000110100001110010100001111110001101010000111000010" }, - /*40*/ { BARCODE_RSS_EXPSTACK, "[91]aABCDEF12345b", 0, 9, 102, "ISO-646 followed by 11 non-ISO-646 non-terminating, starting 6 letters", + /*40*/ { BARCODE_RSS_EXPSTACK, "[91]aABCDEF12345b", 9, 102, "ISO-646 followed by 11 non-ISO-646 non-terminating, starting 6 letters **NOTE** top separator differs from tec-it, same as BWIPP", "010000100010100111101111111100001011001000010000010101101111110011101011111000000110100001110001011101" "000011011101011000010000000010100100110111101111101010010000001100010100000101010001011110001110100000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" @@ -540,7 +854,7 @@ static void test_general_field(int index, int generate, int debug) { "000010111110010100010100001010100101000011011100000000000000000000000000000000000000000000000000000000" "010001000001101011100011110000001010111100100011100100000000000000000000000000000000000000000000000000" }, - /*41*/ { BARCODE_RSS_EXPSTACK, "[91]aABCDEF1234b", 0, 9, 102, "ISO-646 followed by 10 non-ISO-646 non-terminating, starting 6 letters **NOTE** ditto", + /*41*/ { BARCODE_RSS_EXPSTACK, "[91]aABCDEF1234b", 9, 102, "ISO-646 followed by 10 non-ISO-646 non-terminating, starting 6 letters **NOTE** separators differ from tec-it, same as BWIPP", "010110111100110000101111111100001011001000010000010101101111110011101011111000000110100001110001011101" "000001000011001111010000000010100100110111101111101010010000001100010100000101010001011110001110100000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" @@ -551,7 +865,7 @@ static void test_general_field(int index, int generate, int debug) { "000010111101100010010100001010100100000010010011100000000000000000000000000000000000000000000000000000" "010001000010011101100011110000001011111101101100010100000000000000000000000000000000000000000000000000" }, - /*42*/ { BARCODE_RSS_EXPSTACK, "[91]aABCDE12345b", 0, 9, 102, "ISO-646 followed by 10 non-ISO-646 non-terminating, starting 5 letters **NOTE** ditto", + /*42*/ { BARCODE_RSS_EXPSTACK, "[91]aABCDE12345b", 9, 102, "ISO-646 followed by 10 non-ISO-646 non-terminating, starting 5 letters **NOTE** ditto", "010000100010011011101111111100001011001000010000010101101111110011101011111000000110100001110001011101" "000011011101100100010000000010100100110111101111101010010000001100010100000101010001011110001110100000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" @@ -562,14 +876,14 @@ static void test_general_field(int index, int generate, int debug) { "000010100001110100010100001010100100001001100101100000000000000000000000000000000000000000000000000000" "010001011110001011100011110000001011110110011010000100000000000000000000000000000000000000000000000000" }, - /*43*/ { BARCODE_RSS_EXPSTACK, "[91]aABCDE1234", 0, 5, 102, "ISO-646 followed by 10 non-ISO-646 terminating, starting 5 letters", + /*43*/ { BARCODE_RSS_EXPSTACK, "[91]aABCDE1234", 5, 102, "ISO-646 followed by 10 non-ISO-646 terminating, starting 5 letters **NOTE** bottom separator differs from tec-it, same as BWIPP", "010001011000111000101111111100001011001000010000010101101111110011101011111100001110100001110001011101" "000010100111000111010000000010100100110111101111101010010000001100010100000010100001011110001110100000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "000001100011101101100001000000001011000010110111100111101101110100001001010000001010011101011111010000" "101110011100010010011100111111110100111101001000011000010010001011110100001111110001100010100000100010" }, - /*44*/ { BARCODE_RSS_EXPSTACK, "[91]aABCDE1234b", 0, 9, 102, "ISO-646 followed by 9 non-ISO-646 non-terminating, starting 5 letters **NOTE** ditto", + /*44*/ { BARCODE_RSS_EXPSTACK, "[91]aABCDE1234b", 9, 102, "ISO-646 followed by 9 non-ISO-646 non-terminating, starting 5 letters **NOTE** separators differ from tec-it, same as BWIPP", "010000100001110110101111111100001011001000010000010101101111110011101011111000000110000100011011011101" "000011011110001001010000000010100100110111101111101010010000001100010100000101010001111011100100100000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" @@ -580,7 +894,7 @@ static void test_general_field(int index, int generate, int debug) { "000000110111100001010100001010100101011111000010100000000000000000000000000000000000000000000000000000" "010111001000011110100011110000001010100000111101000100000000000000000000000000000000000000000000000000" }, - /*45*/ { BARCODE_RSS_EXPSTACK, "[91]aABCDE1234", 0, 5, 102, "ISO-646 followed by 9 non-ISO-646 terminating, starting 5 letters", + /*45*/ { BARCODE_RSS_EXPSTACK, "[91]aABCDE1234", 5, 102, "ISO-646 followed by 9 non-ISO-646 terminating, starting 5 letters **NOTE** bottom separator differs from tec-it, same as BWIPP", "010001011000111000101111111100001011001000010000010101101111110011101011111100001110100001110001011101" "000010100111000111010000000010100100110111101111101010010000001100010100000010100001011110001110100000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" @@ -602,28 +916,21 @@ static void test_general_field(int index, int generate, int debug) { int length = strlen(data[i].data); - ret = ZBarcode_Encode(symbol, data[i].data, length); - assert_equal(ret, data[i].ret, "i:%d ret %d != %d %s\n", i, ret, data[i].ret, symbol->errtxt); + ret = ZBarcode_Encode(symbol, (const unsigned char *) data[i].data, length); + assert_zero(ret, "i:%d ZBarcode_Encode ret %d != 0 (%s)\n", i, ret, symbol->errtxt); if (generate) { - if (ret == 0) { - printf(" /*%2d*/ { %s, \"%s\", %d, %d, %d, \"%s\",\n", - i, testUtilBarcodeName(symbol->symbology), data[i].data, ret, symbol->rows, symbol->width, data[i].comment); - testUtilModulesDump(symbol, " ", "\n"); - printf(" },\n"); - } else { - printf(" /*%2d*/ { %s, \"%s\", %s, %d, %d, \"%s\", \"\" },\n", - i, testUtilBarcodeName(symbol->symbology), data[i].data, testUtilErrorName(ret), symbol->rows, symbol->width, data[i].comment); - } + printf(" /*%2d*/ { %s, \"%s\", %d, %d, %d, \"%s\",\n", + i, testUtilBarcodeName(symbol->symbology), data[i].data, ret, symbol->rows, symbol->width, data[i].comment); + testUtilModulesDump(symbol, " ", "\n"); + printf(" },\n"); } else { assert_equal(symbol->rows, data[i].expected_rows, "i:%d %s symbol->rows %d != %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), symbol->rows, data[i].expected_rows, data[i].data); assert_equal(symbol->width, data[i].expected_width, "i:%d %s symbol->width %d != %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), symbol->width, data[i].expected_width, data[i].data); - if (ret == 0) { - int width, row; - ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); - assert_zero(ret, "i:%d %s testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), ret, width, row, data[i].data); - } + int width, row; + ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); + assert_zero(ret, "i:%d %s testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), ret, width, row, data[i].data); } ZBarcode_Delete(symbol); @@ -638,7 +945,7 @@ static void test_binary_buffer_size(int index, int generate, int debug) { int ret; struct item { - unsigned char *data; + char *data; int ret; int expected_rows; @@ -669,8 +976,8 @@ static void test_binary_buffer_size(int index, int generate, int debug) { int length = strlen(data[i].data); - ret = ZBarcode_Encode(symbol, data[i].data, length); - assert_equal(ret, data[i].ret, "i:%d ret %d != %d %s\n", i, ret, data[i].ret, symbol->errtxt); + ret = ZBarcode_Encode(symbol, (const unsigned char *) data[i].data, 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(" /*%2d*/ { \"%s\", %s, %d, %d, \"%s\" },\n", @@ -686,6 +993,117 @@ static void test_binary_buffer_size(int index, int generate, int debug) { testFinish(); } +static void test_hrt(int index, int debug) { + + testStart(""); + + int ret; + struct item { + int symbology; + char *data; + + char *expected; + }; + // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<")) + struct item data[] = { + /* 0*/ { BARCODE_RSS14, "1234567890123", "(01)12345678901231" }, + /* 1*/ { BARCODE_RSS14, "12345678901231", "(01)12345678901231" }, + /* 2*/ { BARCODE_RSS14, "1000000000009", "(01)10000000000090" }, + /* 3*/ { BARCODE_RSS_LTD, "1341056790138", "(01)13410567901384" }, + /* 4*/ { BARCODE_RSS_LTD, "13410567901384", "(01)13410567901384" }, + /* 5*/ { BARCODE_RSS_EXP, "[01]12345678901234", "(01)12345678901234" }, + /* 6*/ { BARCODE_RSS14STACK, "12345678901231", "" }, + /* 7*/ { BARCODE_RSS14STACK_OMNI, "10000000000090", "" }, + /* 8*/ { BARCODE_RSS_EXPSTACK, "[01]12345678901234", "" }, + }; + int data_size = ARRAY_SIZE(data); + + char *text; + + for (int i = 0; i < data_size; i++) { + + if (index != -1 && i != index) continue; + + struct zint_symbol *symbol = ZBarcode_Create(); + assert_nonnull(symbol, "Symbol not created\n"); + + int length = testUtilSetSymbol(symbol, data[i].symbology, -1 /*input_mode*/, -1 /*eci*/, -1 /*option_1*/, -1, -1, -1 /*output_options*/, data[i].data, -1, debug); + + ret = ZBarcode_Encode(symbol, (const unsigned char *) data[i].data, length); + assert_zero(ret, "i:%d ZBarcode_Encode ret %d != 0 %s\n", i, ret, symbol->errtxt); + + assert_zero(strcmp((const char *) symbol->text, data[i].expected), "i:%d strcmp(%s, %s) != 0\n", i, symbol->text, data[i].expected); + + ZBarcode_Delete(symbol); + } + + testFinish(); +} + +static void test_input(int index, int debug) { + + testStart(""); + + int ret; + struct item { + int symbology; + char *data; + int ret; + int expected_rows; + int expected_width; + }; + // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<")) + struct item data[] = { + /* 0*/ { BARCODE_RSS14, "1234567890123", 0, 1, 96 }, + /* 1*/ { BARCODE_RSS14, "123456789012A", ZINT_ERROR_INVALID_DATA, -1, -1 }, + /* 2*/ { BARCODE_RSS14, "12345678901234", ZINT_ERROR_INVALID_CHECK, -1, -1 }, + /* 3*/ { BARCODE_RSS14, "123456789012315", ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 4*/ { BARCODE_RSS_LTD, "1234567890123", 0, 1, 74 }, + /* 5*/ { BARCODE_RSS_LTD, "123456789012A", ZINT_ERROR_INVALID_DATA, -1, -1 }, + /* 6*/ { BARCODE_RSS_LTD, "12345678901235", ZINT_ERROR_INVALID_CHECK, -1, -1 }, + /* 7*/ { BARCODE_RSS_LTD, "123456789012315", ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 8*/ { BARCODE_RSS_LTD, "2234567890123", ZINT_ERROR_INVALID_DATA, -1, -1 }, + /* 9*/ { BARCODE_RSS_LTD, "22345678901238", ZINT_ERROR_INVALID_DATA, -1, -1 }, + /* 10*/ { BARCODE_RSS_EXP, "[01]12345678901234", 0, 1, 134 }, + /* 11*/ { BARCODE_RSS_EXP, "[01]1234567890123A", ZINT_ERROR_INVALID_DATA, -1, -1 }, + /* 12*/ { BARCODE_RSS_EXP, "[01]123456789012315", ZINT_ERROR_INVALID_DATA, -1, -1 }, + /* 13*/ { BARCODE_RSS14STACK, "1234567890123", 0, 3, 50 }, + /* 14*/ { BARCODE_RSS14STACK, "123456789012A", ZINT_ERROR_INVALID_DATA, -1, -1 }, + /* 15*/ { BARCODE_RSS14STACK, "12345678901235", ZINT_ERROR_INVALID_CHECK, -1, -1 }, + /* 16*/ { BARCODE_RSS14STACK, "123456789012315", ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 17*/ { BARCODE_RSS14STACK_OMNI, "1234567890123", 0, 5, 50 }, + /* 18*/ { BARCODE_RSS14STACK_OMNI, "123456789012A", ZINT_ERROR_INVALID_DATA, -1, -1 }, + /* 19*/ { BARCODE_RSS14STACK_OMNI, "12345678901236", ZINT_ERROR_INVALID_CHECK, -1, -1 }, + /* 20*/ { BARCODE_RSS14STACK_OMNI, "123456789012315", ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 21*/ { BARCODE_RSS_EXPSTACK, "[01]12345678901234", 0, 5, 102 }, + /* 22*/ { BARCODE_RSS_EXPSTACK, "[01]123456789012A", ZINT_ERROR_INVALID_DATA, -1, -1 }, + /* 23*/ { BARCODE_RSS_EXPSTACK, "[01]123456789012315", ZINT_ERROR_INVALID_DATA, -1, -1 }, + }; + int data_size = ARRAY_SIZE(data); + + for (int i = 0; i < data_size; i++) { + + if (index != -1 && i != index) continue; + + struct zint_symbol *symbol = ZBarcode_Create(); + assert_nonnull(symbol, "Symbol not created\n"); + + int length = testUtilSetSymbol(symbol, data[i].symbology, -1 /*input_mode*/, -1 /*eci*/, -1 /*option_1*/, -1, -1, -1 /*output_options*/, data[i].data, -1, debug); + + ret = ZBarcode_Encode(symbol, (const unsigned char *) data[i].data, length); + assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt); + + if (ret < 5) { + assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d\n", i, symbol->rows, data[i].expected_rows); + assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d\n", i, symbol->width, data[i].expected_width); + } + + ZBarcode_Delete(symbol); + } + + testFinish(); +} + int main(int argc, char *argv[]) { testFunction funcs[] = { /* name, func, has_index, has_generate, has_debug */ @@ -693,6 +1111,8 @@ int main(int argc, char *argv[]) { { "test_examples", test_examples, 1, 1, 1 }, { "test_general_field", test_general_field, 1, 1, 1 }, { "test_binary_buffer_size", test_binary_buffer_size, 1, 1, 1 }, + { "test_hrt", test_hrt, 1, 0, 1 }, + { "test_input", test_input, 1, 0, 1 }, }; testRun(argc, argv, funcs, ARRAY_SIZE(funcs)); diff --git a/backend/tests/test_telepen.c b/backend/tests/test_telepen.c index 428120ec..0ba3332a 100644 --- a/backend/tests/test_telepen.c +++ b/backend/tests/test_telepen.c @@ -184,6 +184,8 @@ static void test_encode(int index, int generate, int debug) { testStart(""); + int do_bwipp = (debug & ZINT_DEBUG_TEST_BWIPP) && testUtilHaveGhostscript(); // Only do BWIPP test if asked, too slow otherwise + int ret; struct item { int symbology; @@ -228,6 +230,8 @@ static void test_encode(int index, int generate, int debug) { int data_size = ARRAY_SIZE(data); char escaped[1024]; + char bwipp_buf[8192]; + char bwipp_msg[1024]; for (int i = 0; i < data_size; i++) { @@ -257,6 +261,15 @@ static void test_encode(int index, int generate, int debug) { 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); } + + if (do_bwipp && testUtilCanBwipp(symbol->symbology, -1, -1, -1, debug)) { + ret = testUtilBwipp(symbol, -1, -1, -1, data[i].data, length, NULL, bwipp_buf, sizeof(bwipp_buf)); + assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(data[i].symbology), ret); + + ret = testUtilBwippCmp(symbol, bwipp_msg, bwipp_buf, data[i].expected); + assert_zero(ret, "i:%d %s testUtilBwippCmp %d != 0 %s\n actual: %s\nexpected: %s\n", + i, testUtilBarcodeName(data[i].symbology), ret, bwipp_msg, bwipp_buf, data[i].expected); + } } } diff --git a/backend/tests/test_tif.c b/backend/tests/test_tif.c index ad535b13..96d85f83 100644 --- a/backend/tests/test_tif.c +++ b/backend/tests/test_tif.c @@ -120,7 +120,7 @@ static void test_pixel_plot(int index, int debug) { ret = testUtilVerifyIdentify(symbol->outfile, debug); assert_zero(ret, "i:%d identify %s ret %d != 0\n", i, symbol->outfile, ret); - if (!(debug & 8)) { + if (!(debug & ZINT_DEBUG_TEST_KEEP_OUTFILE)) { assert_zero(remove(symbol->outfile), "i:%d remove(%s) != 0\n", i, symbol->outfile); } diff --git a/backend/tests/testcommon.c b/backend/tests/testcommon.c index c2fe68de..bbc13c83 100644 --- a/backend/tests/testcommon.c +++ b/backend/tests/testcommon.c @@ -225,157 +225,157 @@ void testRun(int argc, char *argv[], testFunction funcs[], int funcs_size) { char *testUtilBarcodeName(int symbology) { struct item { - int define; char *name; + int define; int val; }; struct item data[] = { - { -1, "", 0 }, - { BARCODE_CODE11, "BARCODE_CODE11", 1 }, - { BARCODE_C25MATRIX, "BARCODE_C25MATRIX", 2 }, - { BARCODE_C25INTER, "BARCODE_C25INTER", 3 }, - { BARCODE_C25IATA, "BARCODE_C25IATA", 4 }, - { -1, "", 5 }, - { BARCODE_C25LOGIC, "BARCODE_C25LOGIC", 6 }, - { BARCODE_C25IND, "BARCODE_C25IND", 7 }, - { BARCODE_CODE39, "BARCODE_CODE39", 8 }, - { BARCODE_EXCODE39, "BARCODE_EXCODE39", 9 }, - { -1, "", 10 }, - { -1, "", 11 }, - { -1, "", 12 }, - { BARCODE_EANX, "BARCODE_EANX", 13 }, - { BARCODE_EANX_CHK, "BARCODE_EANX_CHK", 14 }, - { -1, "", 15 }, - { BARCODE_EAN128, "BARCODE_EAN128", 16 }, - { -1, "", 17 }, - { BARCODE_CODABAR, "BARCODE_CODABAR", 18 }, - { -1, "", 19 }, - { BARCODE_CODE128, "BARCODE_CODE128", 20 }, - { BARCODE_DPLEIT, "BARCODE_DPLEIT", 21 }, - { BARCODE_DPIDENT, "BARCODE_DPIDENT", 22 }, - { BARCODE_CODE16K, "BARCODE_CODE16K", 23 }, - { BARCODE_CODE49, "BARCODE_CODE49", 24 }, - { BARCODE_CODE93, "BARCODE_CODE93", 25 }, - { -1, "", 26 }, - { -1, "", 27 }, - { BARCODE_FLAT, "BARCODE_FLAT", 28 }, - { BARCODE_RSS14, "BARCODE_RSS14", 29 }, - { BARCODE_RSS_LTD, "BARCODE_RSS_LTD", 30 }, - { BARCODE_RSS_EXP, "BARCODE_RSS_EXP", 31 }, - { BARCODE_TELEPEN, "BARCODE_TELEPEN", 32 }, - { -1, "", 33 }, - { BARCODE_UPCA, "BARCODE_UPCA", 34 }, - { BARCODE_UPCA_CHK, "BARCODE_UPCA_CHK", 35 }, - { -1, "", 36 }, - { BARCODE_UPCE, "BARCODE_UPCE", 37 }, - { BARCODE_UPCE_CHK, "BARCODE_UPCE_CHK", 38 }, - { -1, "", 39 }, - { BARCODE_POSTNET, "BARCODE_POSTNET", 40 }, - { -1, "", 41 }, - { -1, "", 42 }, - { -1, "", 43 }, - { -1, "", 44 }, - { -1, "", 45 }, - { -1, "", 46 }, - { BARCODE_MSI_PLESSEY, "BARCODE_MSI_PLESSEY", 47 }, - { -1, "", 48 }, - { BARCODE_FIM, "BARCODE_FIM", 49 }, - { BARCODE_LOGMARS, "BARCODE_LOGMARS", 50 }, - { BARCODE_PHARMA, "BARCODE_PHARMA", 51 }, - { BARCODE_PZN, "BARCODE_PZN", 52 }, - { BARCODE_PHARMA_TWO, "BARCODE_PHARMA_TWO", 53 }, - { -1, "", 54 }, - { BARCODE_PDF417, "BARCODE_PDF417", 55 }, - { BARCODE_PDF417TRUNC, "BARCODE_PDF417TRUNC", 56 }, - { BARCODE_MAXICODE, "BARCODE_MAXICODE", 57 }, - { BARCODE_QRCODE, "BARCODE_QRCODE", 58 }, - { -1, "", 59 }, - { BARCODE_CODE128B, "BARCODE_CODE128B", 60 }, - { -1, "", 61 }, - { -1, "", 62 }, - { BARCODE_AUSPOST, "BARCODE_AUSPOST", 63 }, - { -1, "", 64 }, - { -1, "", 65 }, - { BARCODE_AUSREPLY, "BARCODE_AUSREPLY", 66 }, - { BARCODE_AUSROUTE, "BARCODE_AUSROUTE", 67 }, - { BARCODE_AUSREDIRECT, "BARCODE_AUSREDIRECT", 68 }, - { BARCODE_ISBNX, "BARCODE_ISBNX", 69 }, - { BARCODE_RM4SCC, "BARCODE_RM4SCC", 70 }, - { BARCODE_DATAMATRIX, "BARCODE_DATAMATRIX", 71 }, - { BARCODE_EAN14, "BARCODE_EAN14", 72 }, - { BARCODE_VIN, "BARCODE_VIN", 73 }, - { BARCODE_CODABLOCKF, "BARCODE_CODABLOCKF", 74 }, - { BARCODE_NVE18, "BARCODE_NVE18", 75 }, - { BARCODE_JAPANPOST, "BARCODE_JAPANPOST", 76 }, - { BARCODE_KOREAPOST, "BARCODE_KOREAPOST", 77 }, - { -1, "", 78 }, - { BARCODE_RSS14STACK, "BARCODE_RSS14STACK", 79 }, - { BARCODE_RSS14STACK_OMNI, "BARCODE_RSS14STACK_OMNI", 80 }, - { BARCODE_RSS_EXPSTACK, "BARCODE_RSS_EXPSTACK", 81 }, - { BARCODE_PLANET, "BARCODE_PLANET", 82 }, - { -1, "", 83 }, - { BARCODE_MICROPDF417, "BARCODE_MICROPDF417", 84 }, - { BARCODE_ONECODE, "BARCODE_ONECODE", 85 }, - { BARCODE_PLESSEY, "BARCODE_PLESSEY", 86 }, - { BARCODE_TELEPEN_NUM, "BARCODE_TELEPEN_NUM", 87 }, - { -1, "", 88 }, - { BARCODE_ITF14, "BARCODE_ITF14", 89 }, - { BARCODE_KIX, "BARCODE_KIX", 90 }, - { -1, "", 91 }, - { BARCODE_AZTEC, "BARCODE_AZTEC", 92 }, - { BARCODE_DAFT, "BARCODE_DAFT", 93 }, - { -1, "", 94 }, - { -1, "", 95 }, - { -1, "", 96 }, - { BARCODE_MICROQR, "BARCODE_MICROQR", 97 }, - { BARCODE_HIBC_128, "BARCODE_HIBC_128", 98 }, - { BARCODE_HIBC_39, "BARCODE_HIBC_39", 99 }, - { -1, "", 100 }, - { -1, "", 101 }, - { BARCODE_HIBC_DM, "BARCODE_HIBC_DM", 102 }, - { -1, "", 103 }, - { BARCODE_HIBC_QR, "BARCODE_HIBC_QR", 104 }, - { -1, "", 105 }, - { BARCODE_HIBC_PDF, "BARCODE_HIBC_PDF", 106 }, - { -1, "", 107 }, - { BARCODE_HIBC_MICPDF, "BARCODE_HIBC_MICPDF", 108 }, - { -1, "", 109 }, - { BARCODE_HIBC_BLOCKF, "BARCODE_HIBC_BLOCKF", 110 }, - { -1, "", 111 }, - { BARCODE_HIBC_AZTEC, "BARCODE_HIBC_AZTEC", 112 }, - { -1, "", 113 }, - { -1, "", 114 }, - { BARCODE_DOTCODE, "BARCODE_DOTCODE", 115 }, - { BARCODE_HANXIN, "BARCODE_HANXIN", 116 }, - { -1, "", 117 }, - { -1, "", 118 }, - { -1, "", 119 }, - { -1, "", 120 }, - { BARCODE_MAILMARK, "BARCODE_MAILMARK", 121 }, - { -1, "", 122 }, - { -1, "", 123 }, - { -1, "", 124 }, - { -1, "", 125 }, - { -1, "", 126 }, - { -1, "", 127 }, - { BARCODE_AZRUNE, "BARCODE_AZRUNE", 128 }, - { BARCODE_CODE32, "BARCODE_CODE32", 129 }, - { BARCODE_EANX_CC, "BARCODE_EANX_CC", 130 }, - { BARCODE_EAN128_CC, "BARCODE_EAN128_CC", 131 }, - { BARCODE_RSS14_CC, "BARCODE_RSS14_CC", 132 }, - { BARCODE_RSS_LTD_CC, "BARCODE_RSS_LTD_CC", 133 }, - { BARCODE_RSS_EXP_CC, "BARCODE_RSS_EXP_CC", 134 }, - { BARCODE_UPCA_CC, "BARCODE_UPCA_CC", 135 }, - { BARCODE_UPCE_CC, "BARCODE_UPCE_CC", 136 }, - { BARCODE_RSS14STACK_CC, "BARCODE_RSS14STACK_CC", 137 }, - { BARCODE_RSS14_OMNI_CC, "BARCODE_RSS14_OMNI_CC", 138 }, - { BARCODE_RSS_EXPSTACK_CC, "BARCODE_RSS_EXPSTACK_CC", 139 }, - { BARCODE_CHANNEL, "BARCODE_CHANNEL", 140 }, - { BARCODE_CODEONE, "BARCODE_CODEONE", 141 }, - { BARCODE_GRIDMATRIX, "BARCODE_GRIDMATRIX", 142 }, - { BARCODE_UPNQR, "BARCODE_UPNQR", 143 }, - { BARCODE_ULTRA, "BARCODE_ULTRA", 144 }, - { BARCODE_RMQR, "BARCODE_RMQR", 145 }, + { "", -1, 0 }, + { "BARCODE_CODE11", BARCODE_CODE11, 1 }, + { "BARCODE_C25MATRIX", BARCODE_C25MATRIX, 2 }, + { "BARCODE_C25INTER", BARCODE_C25INTER, 3 }, + { "BARCODE_C25IATA", BARCODE_C25IATA, 4 }, + { "", -1, 5 }, + { "BARCODE_C25LOGIC", BARCODE_C25LOGIC, 6 }, + { "BARCODE_C25IND", BARCODE_C25IND, 7 }, + { "BARCODE_CODE39", BARCODE_CODE39, 8 }, + { "BARCODE_EXCODE39", BARCODE_EXCODE39, 9 }, + { "", -1, 10 }, + { "", -1, 11 }, + { "", -1, 12 }, + { "BARCODE_EANX", BARCODE_EANX, 13 }, + { "BARCODE_EANX_CHK", BARCODE_EANX_CHK, 14 }, + { "", -1, 15 }, + { "BARCODE_EAN128", BARCODE_EAN128, 16 }, + { "", -1, 17 }, + { "BARCODE_CODABAR", BARCODE_CODABAR, 18 }, + { "", -1, 19 }, + { "BARCODE_CODE128", BARCODE_CODE128, 20 }, + { "BARCODE_DPLEIT", BARCODE_DPLEIT, 21 }, + { "BARCODE_DPIDENT", BARCODE_DPIDENT, 22 }, + { "BARCODE_CODE16K", BARCODE_CODE16K, 23 }, + { "BARCODE_CODE49", BARCODE_CODE49, 24 }, + { "BARCODE_CODE93", BARCODE_CODE93, 25 }, + { "", -1, 26 }, + { "", -1, 27 }, + { "BARCODE_FLAT", BARCODE_FLAT, 28 }, + { "BARCODE_RSS14", BARCODE_RSS14, 29 }, + { "BARCODE_RSS_LTD", BARCODE_RSS_LTD, 30 }, + { "BARCODE_RSS_EXP", BARCODE_RSS_EXP, 31 }, + { "BARCODE_TELEPEN", BARCODE_TELEPEN, 32 }, + { "", -1, 33 }, + { "BARCODE_UPCA", BARCODE_UPCA, 34 }, + { "BARCODE_UPCA_CHK", BARCODE_UPCA_CHK, 35 }, + { "", -1, 36 }, + { "BARCODE_UPCE", BARCODE_UPCE, 37 }, + { "BARCODE_UPCE_CHK", BARCODE_UPCE_CHK, 38 }, + { "", -1, 39 }, + { "BARCODE_POSTNET", BARCODE_POSTNET, 40 }, + { "", -1, 41 }, + { "", -1, 42 }, + { "", -1, 43 }, + { "", -1, 44 }, + { "", -1, 45 }, + { "", -1, 46 }, + { "BARCODE_MSI_PLESSEY", BARCODE_MSI_PLESSEY, 47 }, + { "", -1, 48 }, + { "BARCODE_FIM", BARCODE_FIM, 49 }, + { "BARCODE_LOGMARS", BARCODE_LOGMARS, 50 }, + { "BARCODE_PHARMA", BARCODE_PHARMA, 51 }, + { "BARCODE_PZN", BARCODE_PZN, 52 }, + { "BARCODE_PHARMA_TWO", BARCODE_PHARMA_TWO, 53 }, + { "", -1, 54 }, + { "BARCODE_PDF417", BARCODE_PDF417, 55 }, + { "BARCODE_PDF417TRUNC", BARCODE_PDF417TRUNC, 56 }, + { "BARCODE_MAXICODE", BARCODE_MAXICODE, 57 }, + { "BARCODE_QRCODE", BARCODE_QRCODE, 58 }, + { "", -1, 59 }, + { "BARCODE_CODE128B", BARCODE_CODE128B, 60 }, + { "", -1, 61 }, + { "", -1, 62 }, + { "BARCODE_AUSPOST", BARCODE_AUSPOST, 63 }, + { "", -1, 64 }, + { "", -1, 65 }, + { "BARCODE_AUSREPLY", BARCODE_AUSREPLY, 66 }, + { "BARCODE_AUSROUTE", BARCODE_AUSROUTE, 67 }, + { "BARCODE_AUSREDIRECT", BARCODE_AUSREDIRECT, 68 }, + { "BARCODE_ISBNX", BARCODE_ISBNX, 69 }, + { "BARCODE_RM4SCC", BARCODE_RM4SCC, 70 }, + { "BARCODE_DATAMATRIX", BARCODE_DATAMATRIX, 71 }, + { "BARCODE_EAN14", BARCODE_EAN14, 72 }, + { "BARCODE_VIN", BARCODE_VIN, 73 }, + { "BARCODE_CODABLOCKF", BARCODE_CODABLOCKF, 74 }, + { "BARCODE_NVE18", BARCODE_NVE18, 75 }, + { "BARCODE_JAPANPOST", BARCODE_JAPANPOST, 76 }, + { "BARCODE_KOREAPOST", BARCODE_KOREAPOST, 77 }, + { "", -1, 78 }, + { "BARCODE_RSS14STACK", BARCODE_RSS14STACK, 79 }, + { "BARCODE_RSS14STACK_OMNI", BARCODE_RSS14STACK_OMNI, 80 }, + { "BARCODE_RSS_EXPSTACK", BARCODE_RSS_EXPSTACK, 81 }, + { "BARCODE_PLANET", BARCODE_PLANET, 82 }, + { "", -1, 83 }, + { "BARCODE_MICROPDF417", BARCODE_MICROPDF417, 84 }, + { "BARCODE_ONECODE", BARCODE_ONECODE, 85 }, + { "BARCODE_PLESSEY", BARCODE_PLESSEY, 86 }, + { "BARCODE_TELEPEN_NUM", BARCODE_TELEPEN_NUM, 87 }, + { "", -1, 88 }, + { "BARCODE_ITF14", BARCODE_ITF14, 89 }, + { "BARCODE_KIX", BARCODE_KIX, 90 }, + { "", -1, 91 }, + { "BARCODE_AZTEC", BARCODE_AZTEC, 92 }, + { "BARCODE_DAFT", BARCODE_DAFT, 93 }, + { "", -1, 94 }, + { "", -1, 95 }, + { "", -1, 96 }, + { "BARCODE_MICROQR", BARCODE_MICROQR, 97 }, + { "BARCODE_HIBC_128", BARCODE_HIBC_128, 98 }, + { "BARCODE_HIBC_39", BARCODE_HIBC_39, 99 }, + { "", -1, 100 }, + { "", -1, 101 }, + { "BARCODE_HIBC_DM", BARCODE_HIBC_DM, 102 }, + { "", -1, 103 }, + { "BARCODE_HIBC_QR", BARCODE_HIBC_QR, 104 }, + { "", -1, 105 }, + { "BARCODE_HIBC_PDF", BARCODE_HIBC_PDF, 106 }, + { "", -1, 107 }, + { "BARCODE_HIBC_MICPDF", BARCODE_HIBC_MICPDF, 108 }, + { "", -1, 109 }, + { "BARCODE_HIBC_BLOCKF", BARCODE_HIBC_BLOCKF, 110 }, + { "", -1, 111 }, + { "BARCODE_HIBC_AZTEC", BARCODE_HIBC_AZTEC, 112 }, + { "", -1, 113 }, + { "", -1, 114 }, + { "BARCODE_DOTCODE", BARCODE_DOTCODE, 115 }, + { "BARCODE_HANXIN", BARCODE_HANXIN, 116 }, + { "", -1, 117 }, + { "", -1, 118 }, + { "", -1, 119 }, + { "", -1, 120 }, + { "BARCODE_MAILMARK", BARCODE_MAILMARK, 121 }, + { "", -1, 122 }, + { "", -1, 123 }, + { "", -1, 124 }, + { "", -1, 125 }, + { "", -1, 126 }, + { "", -1, 127 }, + { "BARCODE_AZRUNE", BARCODE_AZRUNE, 128 }, + { "BARCODE_CODE32", BARCODE_CODE32, 129 }, + { "BARCODE_EANX_CC", BARCODE_EANX_CC, 130 }, + { "BARCODE_EAN128_CC", BARCODE_EAN128_CC, 131 }, + { "BARCODE_RSS14_CC", BARCODE_RSS14_CC, 132 }, + { "BARCODE_RSS_LTD_CC", BARCODE_RSS_LTD_CC, 133 }, + { "BARCODE_RSS_EXP_CC", BARCODE_RSS_EXP_CC, 134 }, + { "BARCODE_UPCA_CC", BARCODE_UPCA_CC, 135 }, + { "BARCODE_UPCE_CC", BARCODE_UPCE_CC, 136 }, + { "BARCODE_RSS14STACK_CC", BARCODE_RSS14STACK_CC, 137 }, + { "BARCODE_RSS14_OMNI_CC", BARCODE_RSS14_OMNI_CC, 138 }, + { "BARCODE_RSS_EXPSTACK_CC", BARCODE_RSS_EXPSTACK_CC, 139 }, + { "BARCODE_CHANNEL", BARCODE_CHANNEL, 140 }, + { "BARCODE_CODEONE", BARCODE_CODEONE, 141 }, + { "BARCODE_GRIDMATRIX", BARCODE_GRIDMATRIX, 142 }, + { "BARCODE_UPNQR", BARCODE_UPNQR, 143 }, + { "BARCODE_ULTRA", BARCODE_ULTRA, 144 }, + { "BARCODE_RMQR", BARCODE_RMQR, 145 }, }; int data_size = sizeof(data) / sizeof(struct item); @@ -419,23 +419,23 @@ int testUtilSetSymbol(struct zint_symbol *symbol, int symbology, int input_mode, char *testUtilErrorName(int error_number) { struct item { - int define; char *name; + int define; int val; }; struct item data[] = { - { 0, "0", 0 }, - { -1, "", 1 }, - { ZINT_WARN_INVALID_OPTION, "ZINT_WARN_INVALID_OPTION", 2 }, - { ZINT_WARN_USES_ECI, "ZINT_WARN_USES_ECI", 3 }, - { -1, "", 4 }, - { ZINT_ERROR_TOO_LONG, "ZINT_ERROR_TOO_LONG", 5 }, - { ZINT_ERROR_INVALID_DATA, "ZINT_ERROR_INVALID_DATA", 6 }, - { ZINT_ERROR_INVALID_CHECK, "ZINT_ERROR_INVALID_CHECK", 7 }, - { ZINT_ERROR_INVALID_OPTION, "ZINT_ERROR_INVALID_OPTION", 8 }, - { ZINT_ERROR_ENCODING_PROBLEM, "ZINT_ERROR_ENCODING_PROBLEM", 9 }, - { ZINT_ERROR_FILE_ACCESS, "ZINT_ERROR_FILE_ACCESS", 10 }, - { ZINT_ERROR_MEMORY, "ZINT_ERROR_MEMORY", 11 }, + { "0", 0, 0 }, + { "", -1, 1 }, + { "ZINT_WARN_INVALID_OPTION", ZINT_WARN_INVALID_OPTION, 2 }, + { "ZINT_WARN_USES_ECI", ZINT_WARN_USES_ECI, 3 }, + { "", -1, 4 }, + { "ZINT_ERROR_TOO_LONG", ZINT_ERROR_TOO_LONG, 5 }, + { "ZINT_ERROR_INVALID_DATA", ZINT_ERROR_INVALID_DATA, 6 }, + { "ZINT_ERROR_INVALID_CHECK", ZINT_ERROR_INVALID_CHECK, 7 }, + { "ZINT_ERROR_INVALID_OPTION", ZINT_ERROR_INVALID_OPTION, 8 }, + { "ZINT_ERROR_ENCODING_PROBLEM", ZINT_ERROR_ENCODING_PROBLEM, 9 }, + { "ZINT_ERROR_FILE_ACCESS", ZINT_ERROR_FILE_ACCESS, 10 }, + { "ZINT_ERROR_MEMORY", ZINT_ERROR_MEMORY, 11 }, }; int data_size = sizeof(data) / sizeof(struct item); @@ -451,22 +451,22 @@ char *testUtilErrorName(int error_number) { char *testUtilInputModeName(int input_mode) { struct item { - int define; char *name; + int define; int val; }; struct item data[] = { - { DATA_MODE, "DATA_MODE", 0 }, - { UNICODE_MODE, "UNICODE_MODE", 1 }, - { GS1_MODE, "GS1_MODE", 2 }, - { -1, "", 3 }, - { -1, "", 4 }, - { -1, "", 5 }, - { -1, "", 6 }, - { -1, "", 7 }, - { DATA_MODE | ESCAPE_MODE, "DATA_MODE | ESCAPE_MODE", 8 }, - { UNICODE_MODE | ESCAPE_MODE, "UNICODE_MODE | ESCAPE_MODE", 9 }, - { GS1_MODE | ESCAPE_MODE, "GS1_MODE | ESCAPE_MODE", 10 }, + { "DATA_MODE", DATA_MODE, 0 }, + { "UNICODE_MODE", UNICODE_MODE, 1 }, + { "GS1_MODE", GS1_MODE, 2 }, + { "", -1, 3 }, + { "", -1, 4 }, + { "", -1, 5 }, + { "", -1, 6 }, + { "", -1, 7 }, + { "DATA_MODE | ESCAPE_MODE", DATA_MODE | ESCAPE_MODE, 8 }, + { "UNICODE_MODE | ESCAPE_MODE", UNICODE_MODE | ESCAPE_MODE, 9 }, + { "GS1_MODE | ESCAPE_MODE", GS1_MODE | ESCAPE_MODE, 10 }, }; int data_size = sizeof(data) / sizeof(struct item); @@ -1391,9 +1391,9 @@ int testUtilVerifyIdentify(char *filename, int debug) { return -1; } // Verbose option does a more thorough check - if (debug & ZINT_DEBUG_PRINT) { + if (debug & ZINT_DEBUG_TEST_PRINT) { // Verbose very noisy though so for quick check just return default output - if (debug & 4) { + if (debug & ZINT_DEBUG_TEST_LESS_NOISY) { sprintf(buf, "identify %s", filename); } else { sprintf(buf, "identify -verbose %s", filename); @@ -1416,7 +1416,7 @@ int testUtilVerifyInkscape(char *filename, int debug) { if (strlen(filename) > 512) { return -1; } - if (debug & ZINT_DEBUG_PRINT) { + if (debug & ZINT_DEBUG_TEST_PRINT) { sprintf(buf, "inkscape -z -f %s", filename); // Prints nothing unless bad printf("%s\n", buf); } else { @@ -1437,12 +1437,522 @@ int testUtilVerifyGhostscript(char *filename, int debug) { if (strlen(filename) > 512) { return -1; } - if (debug & ZINT_DEBUG_PRINT) { - sprintf(buf, "gs -dNOPAUSE -dBATCH -sDEVICE=nullpage -q %s", filename); // Prints nothing of interest with or without -q unless bad + if (debug & ZINT_DEBUG_TEST_PRINT) { + sprintf(buf, "gs -dNOPAUSE -dBATCH -dNODISPLAY -q %s", filename); // Prints nothing of interest with or without -q unless bad printf("%s\n", buf); } else { - sprintf(buf, "gs -dNOPAUSE -dBATCH -sDEVICE=nullpage -q %s", filename); + sprintf(buf, "gs -dNOPAUSE -dBATCH -dNODISPLAY -q %s", filename); } return system(buf); } + +static char *testUtilBwippName(int symbology, int option_1, int option_2, int option_3, int *linear_row_height, int *gs1_cvt) { + struct item { + char *name; + int define; + int val; + int can_option_1; + int can_option_2; + int can_option_3; + int linear_row_height; + int gs1_cvt; + }; + struct item data[] = { + { "", -1, 0, 0, 0, 0, 0, 0, }, + { "code11", BARCODE_CODE11, 1, 0, 1, 0, 0, 0, }, + { "matrix2of5", BARCODE_C25MATRIX, 2, 0, 0, 0, 0, 0, }, + { "interleaved2of5", BARCODE_C25INTER, 3, 0, 0, 0, 0, 0, }, + { "iata2of5", BARCODE_C25IATA, 4, 0, 0, 0, 0, 0, }, + { "", -1, 5, 0, 0, 0, 0, 0, }, + { "datalogic2of5", BARCODE_C25LOGIC, 6, 0, 0, 0, 0, 0, }, + { "industrial2of5", BARCODE_C25IND, 7, 0, 0, 0, 0, 0, }, + { "code39", BARCODE_CODE39, 8, 0, 1, 0, 0, 0, }, + { "code39ext", BARCODE_EXCODE39, 9, 0, 1, 0, 0, 0, }, + { "", -1, 10, 0, 0, 0, 0, 0, }, + { "", -1, 11, 0, 0, 0, 0, 0, }, + { "", -1, 12, 0, 0, 0, 0, 0, }, + { "ean13", BARCODE_EANX, 13, 0, 0, 0, 0, 0, }, + { "ean13", BARCODE_EANX_CHK, 14, 0, 0, 0, 0, 0, }, + { "", -1, 15, 0, 0, 0, 0, 0, }, + { "gs1-128", BARCODE_EAN128, 16, 0, 0, 0, 0, 1 /*gs1_cnt*/, }, + { "", -1, 17, 0, 0, 0, 0, 0, }, + { "rationalizedCodabar", BARCODE_CODABAR, 18, 0, 0, 0, 0, 0, }, + { "", -1, 19, 0, 0, 0, 0, 0, }, + { "code128", BARCODE_CODE128, 20, 0, 0, 0, 0, 0, }, + { "leitcode", BARCODE_DPLEIT, 21, 0, 0, 0, 0, 0, }, + { "identcode", BARCODE_DPIDENT, 22, 0, 0, 0, 0, 0, }, + { "code16k", BARCODE_CODE16K, 23, 0, 0, 0, 0, 0, }, + { "code49", BARCODE_CODE49, 24, 0, 0, 0, 0, 0, }, + { "code93", BARCODE_CODE93, 25, 0, 0, 0, 0, 0, }, + { "", -1, 26, 0, 0, 0, 0, 0, }, + { "", -1, 27, 0, 0, 0, 0, 0, }, + { "flattermarken", BARCODE_FLAT, 28, 0, 0, 0, 0, 0, }, + { "databaromni", BARCODE_RSS14, 29, 0, 0, 0, 0, 1 /*gs1_cvt*/, }, + { "databarlimited", BARCODE_RSS_LTD, 30, 0, 0, 0, 0, 1, }, + { "databarexpanded", BARCODE_RSS_EXP, 31, 0, 1, 0, 1 /*linear_row_height*/, 1, }, + { "telepen", BARCODE_TELEPEN, 32, 0, 0, 0, 0, 0, }, + { "", -1, 33, 0, 0, 0, 0, 0, }, + { "upca", BARCODE_UPCA, 34, 0, 0, 0, 0, 0, }, + { "upca", BARCODE_UPCA_CHK, 35, 0, 0, 0, 0, 0, }, + { "", -1, 36, 0, 0, 0, 0, 0, }, + { "upce", BARCODE_UPCE, 37, 0, 0, 0, 0, 0, }, + { "upce", BARCODE_UPCE_CHK, 38, 0, 0, 0, 0, 0, }, + { "", -1, 39, 0, 0, 0, 0, 0, }, + { "postnet", BARCODE_POSTNET, 40, 0, 0, 0, 0, 0, }, + { "", -1, 41, 0, 0, 0, 0, 0, }, + { "", -1, 42, 0, 0, 0, 0, 0, }, + { "", -1, 43, 0, 0, 0, 0, 0, }, + { "", -1, 44, 0, 0, 0, 0, 0, }, + { "", -1, 45, 0, 0, 0, 0, 0, }, + { "", -1, 46, 0, 0, 0, 0, 0, }, + { "msi", BARCODE_MSI_PLESSEY, 47, 0, 0, 0, 0, 0, }, + { "", -1, 48, 0, 0, 0, 0, 0, }, + { "symbol", BARCODE_FIM, 49, 0, 0, 0, 0, 0, }, + { "code39", BARCODE_LOGMARS, 50, 0, 1, 0, 0, 0, }, + { "pharmacode", BARCODE_PHARMA, 51, 0, 0, 0, 0, 0, }, + { "pzn", BARCODE_PZN, 52, 0, 0, 0, 0, 0, }, + { "pharmacode2", BARCODE_PHARMA_TWO, 53, 0, 0, 0, 0, 0, }, + { "", -1, 54, 0, 0, 0, 0, 0, }, + { "pdf417", BARCODE_PDF417, 55, 0, 0, 0, 0, 0, }, + { "pdf417compact", BARCODE_PDF417TRUNC, 56, 0, 0, 0, 0, 0, }, + { "maxicode", BARCODE_MAXICODE, 57, 0, 0, 0, 0, 0, }, + { "qrcode", BARCODE_QRCODE, 58, 0, 0, 0, 0, 0, }, + { "", -1, 59, 0, 0, 0, 0, 0, }, + { "", BARCODE_CODE128B, 60, 0, 0, 0, 0, 0, }, + { "", -1, 61, 0, 0, 0, 0, 0, }, + { "", -1, 62, 0, 0, 0, 0, 0, }, + { "auspost", BARCODE_AUSPOST, 63, 0, 0, 0, 0, 0, }, + { "", -1, 64, 0, 0, 0, 0, 0, }, + { "", -1, 65, 0, 0, 0, 0, 0, }, + { "", BARCODE_AUSREPLY, 66, 0, 0, 0, 0, 0, }, + { "", BARCODE_AUSROUTE, 67, 0, 0, 0, 0, 0, }, + { "", BARCODE_AUSREDIRECT, 68, 0, 0, 0, 0, 0, }, + { "isbn", BARCODE_ISBNX, 69, 0, 0, 0, 0, 0, }, + { "royalmail", BARCODE_RM4SCC, 70, 0, 0, 0, 0, 0, }, + { "datamatrix", BARCODE_DATAMATRIX, 71, 0, 0, 0, 0, 0, }, + { "ean14", BARCODE_EAN14, 72, 0, 0, 0, 0, 1 /*gs1_cvt*/, }, + { "code39", BARCODE_VIN, 73, 0, 0, 0, 0, 0, }, + { "codablockf", BARCODE_CODABLOCKF, 74, 1, 1, 0, 0, 0, }, + { "sscc18", BARCODE_NVE18, 75, 0, 0, 0, 0, 1 /*gs1_cvt*/, }, + { "japanpost", BARCODE_JAPANPOST, 76, 0, 0, 0, 0, 0, }, + { "", BARCODE_KOREAPOST, 77, 0, 0, 0, 0, 0, }, + { "", -1, 78, 0, 0, 0, 0, 0, }, + { "databarstacked", BARCODE_RSS14STACK, 79, 0, 0, 0, 0, 1 /*gs1_cvt*/, }, + { "databarstackedomni", BARCODE_RSS14STACK_OMNI, 80, 0, 0, 0, 0, 1, }, + { "databarexpandedstacked", BARCODE_RSS_EXPSTACK, 81, 0, 1, 0, 0, 1, }, + { "planet", BARCODE_PLANET, 82, 0, 0, 0, 0, 0, }, + { "", -1, 83, 0, 0, 0, 0, 0, }, + { "micropdf417", BARCODE_MICROPDF417, 84, 0, 0, 0, 0, 0, }, + { "onecode", BARCODE_ONECODE, 85, 0, 0, 0, 0, 0, }, + { "plessey", BARCODE_PLESSEY, 86, 0, 0, 0, 0, 0, }, + { "telepennumeric", BARCODE_TELEPEN_NUM, 87, 0, 0, 0, 0, 0, }, + { "", -1, 88, 0, 0, 0, 0, 0, }, + { "itf14", BARCODE_ITF14, 89, 0, 0, 0, 0, 0, }, + { "kix", BARCODE_KIX, 90, 0, 0, 0, 0, 0, }, + { "", -1, 91, 0, 0, 0, 0, 0, }, + { "azteccode", BARCODE_AZTEC, 92, 0, 0, 0, 0, 0, }, + { "daft", BARCODE_DAFT, 93, 0, 0, 0, 0, 0, }, + { "", -1, 94, 0, 0, 0, 0, 0, }, + { "", -1, 95, 0, 0, 0, 0, 0, }, + { "", -1, 96, 0, 0, 0, 0, 0, }, + { "microqrcode", BARCODE_MICROQR, 97, 0, 0, 0, 0, 0, }, + { "hibccode128", BARCODE_HIBC_128, 98, 0, 0, 0, 0, 0, }, + { "hibccode39", BARCODE_HIBC_39, 99, 0, 0, 0, 0, 0, }, + { "", -1, 100, 0, 0, 0, 0, 0, }, + { "", -1, 101, 0, 0, 0, 0, 0, }, + { "hibcdatamatrix", BARCODE_HIBC_DM, 102, 0, 0, 0, 0, 0, }, + { "", -1, 103, 0, 0, 0, 0, 0, }, + { "hibcqrcode", BARCODE_HIBC_QR, 104, 0, 0, 0, 0, 0, }, + { "", -1, 105, 0, 0, 0, 0, 0, }, + { "hibcpdf417", BARCODE_HIBC_PDF, 106, 0, 0, 0, 0, 0, }, + { "", -1, 107, 0, 0, 0, 0, 0, }, + { "hibcmicropdf417", BARCODE_HIBC_MICPDF, 108, 0, 0, 0, 0, 0, }, + { "", -1, 109, 0, 0, 0, 0, 0, }, + { "hibccodablockf", BARCODE_HIBC_BLOCKF, 110, 1, 1, 0, 0, 0, }, + { "", -1, 111, 0, 0, 0, 0, 0, }, + { "hibcazteccode", BARCODE_HIBC_AZTEC, 112, 0, 0, 0, 0, 0, }, + { "", -1, 113, 0, 0, 0, 0, 0, }, + { "", -1, 114, 0, 0, 0, 0, 0, }, + { "dotcode", BARCODE_DOTCODE, 115, 0, 0, 0, 0, 0, }, + { "hanxin", BARCODE_HANXIN, 116, 0, 0, 0, 0, 0, }, + { "", -1, 117, 0, 0, 0, 0, 0, }, + { "", -1, 118, 0, 0, 0, 0, 0, }, + { "", -1, 119, 0, 0, 0, 0, 0, }, + { "", -1, 120, 0, 0, 0, 0, 0, }, + { "mailmark", BARCODE_MAILMARK, 121, 0, 0, 0, 0, 0, }, + { "", -1, 122, 0, 0, 0, 0, 0, }, + { "", -1, 123, 0, 0, 0, 0, 0, }, + { "", -1, 124, 0, 0, 0, 0, 0, }, + { "", -1, 125, 0, 0, 0, 0, 0, }, + { "", -1, 126, 0, 0, 0, 0, 0, }, + { "", -1, 127, 0, 0, 0, 0, 0, }, + { "aztecrune", BARCODE_AZRUNE, 128, 0, 0, 0, 0, 0, }, + { "code32", BARCODE_CODE32, 129, 0, 0, 0, 0, 0, }, + { "ean13composite", BARCODE_EANX_CC, 130, 1, 0, 0, 72 /*linear_row_height*/, 1 /*gs1_cvt*/, }, + { "gs1-128composite", BARCODE_EAN128_CC, 131, 1, 0, 0, 36, 1, }, + { "databaromnicomposite", BARCODE_RSS14_CC, 132, 1, 0, 0, 33, 1, }, + { "databarlimitedcomposite", BARCODE_RSS_LTD_CC, 133, 1, 0, 0, 0, 1, }, + { "databarexpandedcomposite", BARCODE_RSS_EXP_CC, 134, 1, 1, 0, 0, 1, }, + { "upcacomposite", BARCODE_UPCA_CC, 135, 1, 0, 0, 72, 1, }, + { "upcecomposite", BARCODE_UPCE_CC, 136, 1, 0, 0, 72, 1, }, + { "databarstackedcomposite", BARCODE_RSS14STACK_CC, 137, 1, 0, 0, 0, 1, }, + { "databarstackedomnicomposite", BARCODE_RSS14_OMNI_CC, 138, 1, 0, 0, 0, 1, }, + { "databarexpandedstackedcomposite", BARCODE_RSS_EXPSTACK_CC, 139, 1, 1, 0, 0, 1, }, + { "channelcode", BARCODE_CHANNEL, 140, 0, 0, 0, 0, 0, }, + { "codeone", BARCODE_CODEONE, 141, 0, 0, 0, 0, 0, }, + { "", BARCODE_GRIDMATRIX, 142, 0, 0, 0, 0, 0, }, + { "", BARCODE_UPNQR, 143, 0, 0, 0, 0, 0, }, + { "ultracode", BARCODE_ULTRA, 144, 0, 0, 0, 0, 0, }, + { "rectangularmicroqrcode", BARCODE_RMQR, 145, 0, 0, 0, 0, 0, }, + }; + int data_size = ARRAY_SIZE(data); + + if (symbology < 0 || symbology >= data_size) { + return NULL; + } + if (data[symbology].val != symbology || (data[symbology].define != -1 && data[symbology].define != symbology)) { // Self-check + fprintf(stderr, "testUtilBarcodeName data table out of sync (%d)\n", symbology); + abort(); + } + if (data[symbology].name[0] == '\0') { + return NULL; + } + if ((option_1 != -1 && !data[symbology].can_option_1) || (option_2 != -1 && !data[symbology].can_option_2) + || (option_3 != -1 && !data[symbology].can_option_3)) { + return NULL; + } + + if (symbology == BARCODE_CODE11) { + if (option_2 != 1 && option_2 != 2) { /* 2 check digits (Zint default) not supported */ + return NULL; + } + } else if (symbology == BARCODE_CODABLOCKF || symbology == BARCODE_HIBC_BLOCKF) { + if (option_1 == 1) { /* Single row i.e. CODE128 not supported */ + return NULL; + } + } + + if (linear_row_height) { + *linear_row_height = data[symbology].linear_row_height; + } + if (gs1_cvt) { + *gs1_cvt = data[symbology].gs1_cvt; + } + + return data[symbology].name; +} + +int testUtilCanBwipp(int symbology, int option_1, int option_2, int option_3, int debug) { + if (testUtilBwippName(symbology, option_1, option_2, option_3, NULL, NULL) != NULL) { + return 1; + } + if (debug & ZINT_DEBUG_TEST_PRINT) { + printf("testUtilCanBwipp: not supported %s, option_1 %d, option_2 %d, option_3 %d\n", testUtilBarcodeName(symbology), option_1, option_2, option_3); + } + + return 0; +} + +static void testUtilBwippCvtGS1Data(char *bwipp_data) { + char *b; + + for (b = bwipp_data; *b; b++) { + if (*b == '[') { + *b = '('; + } else if (*b == ']') { + *b = ')'; + } + } +} + +static char *testUtilBwippEscape(char *bwipp_data, int bwipp_data_size, const char *data, int length, int *parse) { + char *b = bwipp_data; + char *be = b + bwipp_data_size; + unsigned char *d = (unsigned char *) data; + unsigned char *de = (unsigned char *) data + length; + + *parse = 0; + + while (b < be && d < de) { + if (*d < 0x20 || *d >= 0x7F || *d == '\'') { /* Escape single quote also to avoid having to do proper shell escaping TODO: proper shell escaping */ + sprintf(b, "^%03u", *d++); + b += 4; + *parse = 1; + } else { + *b++ = *d++; + } + } + + if (b == be && d < de) { + fprintf(stderr, "testUtilBwippEscape: bwipp_data buffer full\n"); + return NULL; + } + *b = '\0'; + + return bwipp_data; +} + +#define GS_INITIAL_LEN 35 /* Length of cmd up to -q */ + +int testUtilBwipp(const struct zint_symbol *symbol, int option_1, int option_2, int option_3, const char *data, int length, const char *primary, char *buffer, int buffer_size) { + const char *cmd_fmt = "gs -dNOPAUSE -dBATCH -dNODISPLAY -q -sb=%s -sd='%s' ../tools/bwipp_dump.ps"; + const char *cmd_opts_fmt = "gs -dNOPAUSE -dBATCH -dNODISPLAY -q -sb=%s -sd='%s' -so='%s' ../tools/bwipp_dump.ps"; + const char *cmd_fmt2 = "gs -dNOPAUSE -dBATCH -dNODISPLAY -q -sb=%s -sd='%.2043s' -sd2='%s' ../tools/bwipp_dump.ps"; // If data > 2K + const char *cmd_opts_fmt2 = "gs -dNOPAUSE -dBATCH -dNODISPLAY -q -sb=%s -sd='%.2043s' -sd2='%s' -so='%s' ../tools/bwipp_dump.ps"; + + int symbology = symbol->symbology; + int data_len = length == -1 ? (int) strlen(data) : length; + int primary_len = primary ? (int) strlen(primary) : 0; + int max_data_len = 4 + primary_len + 1 + 1 + data_len * 4; /* 4 AI prefix + primary + '|' + leading zero + escaped data */ + + char cmd[max_data_len + 1024]; + char *bwipp_barcode = NULL; + char *bwipp_opts = NULL; + char bwipp_data[max_data_len + 1]; + char bwipp_opts_buf[512]; + int bwipp_row_height[symbol->rows]; + int linear_row_height; + int gs1_cvt; + + FILE *fp = NULL; + int cnt; + + char *b = buffer; + char *be = buffer + buffer_size; + int r, h; + int parse; + + bwipp_data[0] = bwipp_opts_buf[0] = '\0'; + + bwipp_barcode = testUtilBwippName(symbology, option_1, option_2, option_3, &linear_row_height, &gs1_cvt); + if (!bwipp_barcode) { + fprintf(stderr, "testUtilBwipp: no mapping for %s, option_1 %d, option_2 %d, option_3 %d\n", testUtilBarcodeName(symbology), option_1, option_2, option_3); + return -1; + } + + for (r = 0; r < symbol->rows; r++) { + bwipp_row_height[r] = symbol->row_height[r]; + } + if (linear_row_height) { + bwipp_row_height[symbol->rows - 1] = linear_row_height; + } + + if (is_composite(symbology)) { + if (symbology == BARCODE_EANX_CC && primary_len <= 7) { + bwipp_barcode = "ean8composite"; + } + if (!primary) { + fprintf(stderr, "testUtilBwipp: no primary data given %s\n", testUtilBarcodeName(symbology)); + return -1; + } + if (*primary != '[' && symbology != BARCODE_EANX_CC && symbology != BARCODE_UPCE_CC && symbology != BARCODE_UPCA_CC) { + strcat(bwipp_data, "(01)"); + } + strcat(bwipp_data, primary); + strcat(bwipp_data, "|"); + strcat(bwipp_data, data); + testUtilBwippCvtGS1Data(bwipp_data); + + if (option_1 > 0) { + sprintf(bwipp_opts_buf + (int) strlen(bwipp_opts_buf), "%sccversion=%c", strlen(bwipp_opts_buf) ? " " : "", option_1 == 1 ? 'a' : option_1 == 2 ? 'b' : 'c'); + bwipp_opts = bwipp_opts_buf; + } + if (option_2 > 0) { + sprintf(bwipp_opts_buf + (int) strlen(bwipp_opts_buf), "%ssegments=%d", strlen(bwipp_opts_buf) ? " " : "", option_2 * 2); + bwipp_opts = bwipp_opts_buf; + } + } else { + if (gs1_cvt) { + if (*data != '[') { + strcat(bwipp_data, symbology == BARCODE_NVE18 ? "(00)" : "(01)"); + } + strcat(bwipp_data, data); + testUtilBwippCvtGS1Data(bwipp_data); + + if (option_2 > 0) { + if (symbology == BARCODE_RSS_EXP || symbology == BARCODE_RSS_EXPSTACK) { + sprintf(bwipp_opts_buf + (int) strlen(bwipp_opts_buf), "%ssegments=%d", strlen(bwipp_opts_buf) ? " " : "", option_2 * 2); + bwipp_opts = bwipp_opts_buf; + } + } + } else { + testUtilBwippEscape(bwipp_data, sizeof(bwipp_data), data, data_len, &parse); + if (parse) { + sprintf(bwipp_opts_buf + (int) strlen(bwipp_opts_buf), "%sparse", strlen(bwipp_opts_buf) ? " " : ""); + bwipp_opts = bwipp_opts_buf; + } + + if (symbology == BARCODE_CODE93) { + sprintf(bwipp_opts_buf + (int) strlen(bwipp_opts_buf), "%sincludecheck", strlen(bwipp_opts_buf) ? " " : ""); + if (parse) { + bwipp_barcode = "code93ext"; + } + bwipp_opts = bwipp_opts_buf; + } else if (symbology == BARCODE_PZN) { + sprintf(bwipp_opts_buf + (int) strlen(bwipp_opts_buf), "%spzn8", strlen(bwipp_opts_buf) ? " " : ""); + bwipp_opts = bwipp_opts_buf; + } else if (symbology == BARCODE_TELEPEN_NUM) { + if (data_len & 1) { // Add leading zero + memmove(bwipp_data + 1, bwipp_data, strlen(bwipp_data) + 1); + *bwipp_data = '0'; + } + } else if (symbology == BARCODE_CODABLOCKF || symbology == BARCODE_HIBC_BLOCKF) { + sprintf(bwipp_opts_buf + (int) strlen(bwipp_opts_buf), "%ssepheight=0", strlen(bwipp_opts_buf) ? " " : ""); + if (option_1 > 0) { + sprintf(bwipp_opts_buf + (int) strlen(bwipp_opts_buf), "%srows=%d", strlen(bwipp_opts_buf) ? " " : "", option_1); + } + //} else { /* BWIPP does not really support both row and column given */ + if (option_2 > 0) { + sprintf(bwipp_opts_buf + (int) strlen(bwipp_opts_buf), "%scolumns=%d", strlen(bwipp_opts_buf) ? " " : "", option_2 - 5); + } else { + sprintf(bwipp_opts_buf + (int) strlen(bwipp_opts_buf), "%scolumns=%d", strlen(bwipp_opts_buf) ? " " : "", (symbol->width - 57) / 11); + } + //} + bwipp_opts = bwipp_opts_buf; + } else if (symbology == BARCODE_CODE11 || symbology == BARCODE_CODE39 || symbology == BARCODE_EXCODE39 || symbology == BARCODE_LOGMARS) { + if (option_2 > 0) { + if (option_2 == 1) { + sprintf(bwipp_opts_buf + (int) strlen(bwipp_opts_buf), "%sincludecheck", strlen(bwipp_opts_buf) ? " " : ""); + } + bwipp_opts = bwipp_opts_buf; /* Set always as option_2 == 2 is bwipp default */ + } + } + } + } + + if ((option_1 != -1 || option_2 != -1 || option_3 != -1) && !bwipp_opts) { + fprintf(stderr, "testUtilBwipp: no mapping option_1 %d, option_2 %d, option_3 %d for symbology %s\n", option_1, option_2, option_3, testUtilBarcodeName(symbology)); + return -1; + } + + if (bwipp_opts) { + if (data_len >= 2043) { /* Ghostscript's `arg_str_max` 2048 less "-sd=" */ + sprintf(cmd, cmd_opts_fmt2, bwipp_barcode, bwipp_data, bwipp_data + 2043, bwipp_opts); + } else { + sprintf(cmd, cmd_opts_fmt, bwipp_barcode, bwipp_data, bwipp_opts); + } + } else { + if (data_len >= 2043) { + sprintf(cmd, cmd_fmt2, bwipp_barcode, bwipp_data, bwipp_data + 2043); + } else { + sprintf(cmd, cmd_fmt, bwipp_barcode, bwipp_data); + } + } + + /* Hack in various adjustments */ + if (symbology == BARCODE_RSS14 || symbology == BARCODE_RSS_LTD || symbology == BARCODE_RSS_EXP) { + /* Begin with space */ + memmove(cmd + GS_INITIAL_LEN + 5, cmd + GS_INITIAL_LEN, strlen(cmd) + 1 - GS_INITIAL_LEN); + memcpy(cmd + GS_INITIAL_LEN, " -sbs", 5); + } + if (symbology == BARCODE_CODE11 || symbology == BARCODE_CODE39 || symbology == BARCODE_EXCODE39 || symbology == BARCODE_PZN || symbology == BARCODE_VIN) { + /* Ratio 3 width bar/space -> 2 width */ + memmove(cmd + GS_INITIAL_LEN + 8, cmd + GS_INITIAL_LEN, strlen(cmd) + 1 - GS_INITIAL_LEN); + memcpy(cmd + GS_INITIAL_LEN, " -sr=0.6", 8); + } + if (symbology == BARCODE_CODE11 || symbology == BARCODE_CODE39 || symbology == BARCODE_EXCODE39 || symbology == BARCODE_HIBC_39 + || symbology == BARCODE_LOGMARS || symbology == BARCODE_PZN || symbology == BARCODE_VIN) { + /* End sbs loop on bar */ + memmove(cmd + GS_INITIAL_LEN + 6, cmd + GS_INITIAL_LEN, strlen(cmd) + 1 - GS_INITIAL_LEN); + memcpy(cmd + GS_INITIAL_LEN, " -selb", 6); + } + + if (symbol->debug & ZINT_DEBUG_TEST_PRINT) { + printf("testUtilBwipp: cmd %s\n", cmd); + } + + fp = popen(cmd, "r"); + if (!fp) { + fprintf(stderr, "testUtilBwipp: failed to run '%s'\n", cmd); + return -1; + } + + for (r = 0; r < symbol->rows; r++) { + if (b + symbol->width > be) { + fprintf(stderr, "testUtilBwipp: row %d, width %d, row width iteration overrun (%s)\n", r, symbol->width, cmd); + pclose(fp); + return -1; + } + cnt = fread(b, 1, symbol->width, fp); + if (cnt != symbol->width) { + fprintf(stderr, "testUtilBwipp: failed to read symbol->width %d bytes, cnt %d (%s)\n", symbol->width, cnt, cmd); + pclose(fp); + return -1; + } + b += cnt; + for (h = bwipp_row_height[r]; h > 1; h--) { /* Ignore row copies if any */ + cnt = fread(b, 1, symbol->width, fp); + if (cnt != symbol->width) { + fprintf(stderr, "testUtilBwipp: failed to read/ignore symbol->width %d bytes, cnt %d (%s)\n", symbol->width, cnt, cmd); + pclose(fp); + return -1; + } + } + } + *b = '\0'; + + if (fgetc(fp) != EOF) { + fprintf(stderr, "testUtilBwipp: failed to read full stream (%s)\n", cmd); + pclose(fp); + return -1; + } + + pclose(fp); + + return 0; +} + +int testUtilBwippCmp(const struct zint_symbol *symbol, char *msg, const char *bwipp_buf, const char *expected) { + int bwipp_len = strlen(bwipp_buf); + int expected_len = strlen(expected); + int ret_memcmp; + int i; + + (void)symbol; + + if (bwipp_len != expected_len) { + sprintf(msg, "bwipp_len %d != expected_len %d", bwipp_len, expected_len); + return 2; + } + + ret_memcmp = memcmp(bwipp_buf, expected, expected_len); + if (ret_memcmp != 0) { + for (i = 0; i < expected_len; i++) { + if (bwipp_buf[i] != expected[i]) { + break; + } + } + sprintf(msg, "bwipp memcmp %d != 0, at %d, len %d", ret_memcmp, i, expected_len); + return ret_memcmp; + } + + return 0; +} + +int testUtilBwippCmpRow(const struct zint_symbol *symbol, int row, char *msg, const char *bwipp_buf, const char *expected) { + int bwipp_len = strlen(bwipp_buf); + int expected_len = strlen(expected); + int ret_memcmp; + int i, j; + + (void)symbol; + + if (bwipp_len != expected_len * symbol->rows) { + sprintf(msg, "bwipp_len %d != expected_len %d * symbol->rows %d", bwipp_len, expected_len, symbol->rows); + return 2; + } + + ret_memcmp = memcmp(bwipp_buf + expected_len * row, expected, expected_len); + if (ret_memcmp != 0) { + for (i = 0, j = expected_len * row; i < expected_len; i++, j++) { + if (bwipp_buf[j] != expected[i]) { + break; + } + } + sprintf(msg, "bwipp memcmp %d != 0, at %d (%d), len %d", ret_memcmp, i, j, expected_len); + return ret_memcmp; + } + + return 0; +} diff --git a/backend/tests/testcommon.h b/backend/tests/testcommon.h index b6047696..ac690b8a 100644 --- a/backend/tests/testcommon.h +++ b/backend/tests/testcommon.h @@ -69,6 +69,11 @@ void testRun(int argc, char *argv[], testFunction funcs[], int funcs_size); #define assert_fail(...) assert_exp(0, __VA_ARGS__) #define assert_nothing(__exp__, ...) {printf(__VA_ARGS__); __exp__;} +#define ZINT_DEBUG_TEST_PRINT 16 +#define ZINT_DEBUG_TEST_LESS_NOISY 32 +#define ZINT_DEBUG_TEST_KEEP_OUTFILE 64 +#define ZINT_DEBUG_TEST_BWIPP 128 + extern void vector_free(struct zint_symbol *symbol); /* Free vector structures */ int testUtilSetSymbol(struct zint_symbol *symbol, int symbology, int input_mode, int eci, int option_1, int option_2, int option_3, int output_options, char *data, int length, int debug); @@ -104,5 +109,9 @@ int testUtilHaveInkscape(); int testUtilVerifyInkscape(char *filename, int debug); int testUtilHaveGhostscript(); int testUtilVerifyGhostscript(char *filename, int debug); +int testUtilCanBwipp(int symbology, int option_1, int option_2, int option_3, int debug); +int testUtilBwipp(const struct zint_symbol *symbol, int option_1, int option_2, int option_3, const char *data, int length, const char *primary, char *buffer, int buffer_size); +int testUtilBwippCmp(const struct zint_symbol *symbol, char *msg, const char *bwipp_buf, const char *expected); +int testUtilBwippCmpRow(const struct zint_symbol *symbol, int row, char *msg, const char *bwipp_buf, const char *expected); #endif /* TESTCOMMON_H */ diff --git a/backend/tests/tools/bwipp_dump-barcode.ps.diff b/backend/tests/tools/bwipp_dump-barcode.ps.diff new file mode 100644 index 00000000..fb044787 --- /dev/null +++ b/backend/tests/tools/bwipp_dump-barcode.ps.diff @@ -0,0 +1,1154 @@ +--- ../../../../postscriptbarcode/build/monolithic/barcode.ps 2020-07-10 13:08:57.215118693 +0100 ++++ ../tools/bwipp_dump.ps 2020-07-10 13:44:00.892056648 +0100 +@@ -29,6 +29,8 @@ + % CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + % IN THE SOFTWARE. + ++% vim: set ts=4 sw=4 et : ++ + % --BEGIN TEMPLATE-- + + % --BEGIN RESOURCE preamble-- +@@ -24484,34 +24486,72 @@ + pop + } ifelse + +- gsave ++ dontdraw not { gsave } if + + options (lintype) (ean13) put + options (inkspread) (0) put + options (dontdraw) true put + + % Plot the linear part +- linear options //ean13 exec //renlinear exec ++ linear options //ean13 exec ++ dontdraw not { ++ //renlinear exec ++ ++ % Plot the separator ++ -1 72 rmoveto << ++ /ren //renmatrix ++ /pixs [ ++ 0 1 93 {0} repeat 1 0 ++ 1 0 93 {0} repeat 0 1 ++ 0 1 93 {0} repeat 1 0 ++ ] ++ /pixx 97 ++ /pixy 3 ++ /height 6 72 div ++ /width 97 72 div ++ /opt options ++ >> //renmatrix exec + +- % Plot the separator +- -1 72 rmoveto << +- /ren //renmatrix +- /pixs [ +- 0 1 93 {0} repeat 1 0 +- 1 0 93 {0} repeat 0 1 +- 0 1 93 {0} repeat 1 0 +- ] +- /pixx 97 +- /pixy 3 +- /height 6 72 div +- /width 97 72 div +- /opt options +- >> //renmatrix exec ++ % Plot the 2D part ++ -2 6 rmoveto comp options //gs1-cc exec //renmatrix exec + +- % Plot the 2D part +- -2 6 rmoveto comp options //gs1-cc exec //renmatrix exec ++ grestore ++ } { ++ /linsym exch def ++ /linpixs [ ++ linsym /sbs get { 1 index 1 eq {{0}} {{1}} ifelse repeat } forall % Alternates x 1/0's ++ ] def ++ /linheight linsym /bhs get 0 get 72 mul cvi def + +- grestore ++ /compsym comp options //gs1-cc exec def ++ /ccpixs compsym /pixs get def ++ /ccpixx compsym /pixx get def ++ ++ /linpad [ ccpixx 97 sub {0} repeat ] def ++ ++ /pixs [ ++ 0 ccpixx ccpixs length 1 sub { ++ /i exch def ++ 2 { ccpixs i ccpixx getinterval aload pop } repeat ++ } for ++ 2 { linpad aload pop 0 1 93 {0} repeat 1 0 } repeat ++ 2 { linpad aload pop 1 0 93 {0} repeat 0 1 } repeat ++ 2 { linpad aload pop 0 1 93 {0} repeat 1 0 } repeat ++ linheight { linpad aload pop 0 linpixs aload pop 0 } repeat ++ ] def ++ ++ /pixx ccpixx def ++ /pixy pixs length pixx idiv def ++ << ++ /ren //renmatrix ++ /pixs pixs ++ /pixx pixx ++ /pixy pixy ++ /height pixy 72 div ++ /width pixx 72 div ++ /opt options ++ >> ++ } ifelse + + end + +@@ -24570,7 +24610,7 @@ + pop + } ifelse + +- gsave ++ dontdraw not { gsave } if + + % Get the result of encoding with ean8 and gs1-cc + options (lintype) (ean8) put +@@ -24578,29 +24618,67 @@ + options (dontdraw) true put + + % Plot the linear part +- linear options //ean8 exec //renlinear exec ++ linear options //ean8 exec ++ dontdraw not { ++ //renlinear exec ++ ++ % Plot the separator ++ -1 72 rmoveto << ++ /ren //renmatrix ++ /pixs [ ++ 0 1 65 {0} repeat 1 0 ++ 1 0 65 {0} repeat 0 1 ++ 0 1 65 {0} repeat 1 0 ++ ] ++ /pixx 69 ++ /pixy 3 ++ /height 6 72 div ++ /width 69 72 div ++ /opt options ++ >> //renmatrix exec ++ ++ % Plot the 2D part ++ comp options //gs1-cc exec ++ dup (pixx) get 69 exch sub 6 rmoveto ++ //renmatrix exec + +- % Plot the separator +- -1 72 rmoveto << +- /ren //renmatrix +- /pixs [ +- 0 1 65 {0} repeat 1 0 +- 1 0 65 {0} repeat 0 1 +- 0 1 65 {0} repeat 1 0 +- ] +- /pixx 69 +- /pixy 3 +- /height 6 72 div +- /width 69 72 div +- /opt options +- >> //renmatrix exec ++ grestore ++ } { ++ /linsym exch def ++ /linpixs [ ++ linsym /sbs get { 1 index 1 eq {{0}} {{1}} ifelse repeat } forall % Alternates x 1/0's ++ ] def ++ /linheight linsym /bhs get 0 get 72 mul cvi def + +- % Plot the 2D part +- comp options //gs1-cc exec +- dup (pixx) get 69 exch sub 6 rmoveto +- //renmatrix exec ++ /compsym comp options //gs1-cc exec def ++ /ccpixs compsym /pixs get def ++ /ccpixx compsym /pixx get def + +- grestore ++ /linpad [ ccpixx 69 sub {0} repeat ] def ++ ++ /pixs [ ++ 0 ccpixx ccpixs length 1 sub { ++ /i exch def ++ 2 { ccpixs i ccpixx getinterval aload pop } repeat ++ } for ++ 2 { linpad aload pop 0 1 65 {0} repeat 1 0 } repeat ++ 2 { linpad aload pop 1 0 65 {0} repeat 0 1 } repeat ++ 2 { linpad aload pop 0 1 65 {0} repeat 1 0 } repeat ++ linheight { linpad aload pop 0 linpixs aload pop 0 } repeat ++ ] def ++ ++ /pixx ccpixx def ++ /pixy pixs length pixx idiv def ++ << ++ /ren //renmatrix ++ /pixs pixs ++ /pixx pixx ++ /pixy pixy ++ /height pixy 72 div ++ /width pixx 72 div ++ /opt options ++ >> ++ } ifelse + + end + +@@ -24659,34 +24737,72 @@ + pop + } ifelse + +- gsave ++ dontdraw not { gsave } if + + options (lintype) (ean13) put + options (inkspread) (0) put + options (dontdraw) true put + + % Plot the linear part +- linear options //upca exec //renlinear exec ++ linear options //upca exec ++ dontdraw not { ++ //renlinear exec ++ ++ % Plot the separator ++ -1 72 rmoveto << ++ /ren //renmatrix ++ /pixs [ ++ 0 1 93 {0} repeat 1 0 ++ 1 0 93 {0} repeat 0 1 ++ 0 1 93 {0} repeat 1 0 ++ ] ++ /pixx 97 ++ /pixy 3 ++ /height 6 72 div ++ /width 97 72 div ++ /opt options ++ >> //renmatrix exec + +- % Plot the separator +- -1 72 rmoveto << +- /ren //renmatrix +- /pixs [ +- 0 1 93 {0} repeat 1 0 +- 1 0 93 {0} repeat 0 1 +- 0 1 93 {0} repeat 1 0 +- ] +- /pixx 97 +- /pixy 3 +- /height 6 72 div +- /width 97 72 div +- /opt options +- >> //renmatrix exec ++ % Plot the 2D part ++ -2 6 rmoveto comp options //gs1-cc exec //renmatrix exec + +- % Plot the 2D part +- -2 6 rmoveto comp options //gs1-cc exec //renmatrix exec ++ grestore ++ } { ++ /linsym exch def ++ /linpixs [ ++ linsym /sbs get { 1 index 1 eq {{0}} {{1}} ifelse repeat } forall % Alternates x 1/0's ++ ] def ++ /linheight linsym /bhs get 0 get 72 mul cvi def + +- grestore ++ /compsym comp options //gs1-cc exec def ++ /ccpixs compsym /pixs get def ++ /ccpixx compsym /pixx get def ++ ++ /linpad [ ccpixx 97 sub {0} repeat ] def ++ ++ /pixs [ ++ 0 ccpixx ccpixs length 1 sub { ++ /i exch def ++ 2 { ccpixs i ccpixx getinterval aload pop } repeat ++ } for ++ 2 { linpad aload pop 0 1 93 {0} repeat 1 0 } repeat ++ 2 { linpad aload pop 1 0 93 {0} repeat 0 1 } repeat ++ 2 { linpad aload pop 0 1 93 {0} repeat 1 0 } repeat ++ linheight { linpad aload pop 0 linpixs aload pop 0 } repeat ++ ] def ++ ++ /pixx ccpixx def ++ /pixy pixs length pixx idiv def ++ << ++ /ren //renmatrix ++ /pixs pixs ++ /pixx pixx ++ /pixy pixy ++ /height pixy 72 div ++ /width pixx 72 div ++ /opt options ++ >> ++ } ifelse + + end + +@@ -24760,34 +24876,72 @@ + /opt options + >> def + +- gsave ++ dontdraw not { gsave } if + + options (lintype) (upce) put + options (inkspread) (0) put + options (dontdraw) true put + + % Plot the linear part +- linear options //upce exec //renlinear exec ++ linear options //upce exec ++ dontdraw not { ++ //renlinear exec ++ ++ % Plot the separator ++ -1 72 rmoveto << ++ /ren //renmatrix ++ /pixs [ ++ 0 1 49 {0} repeat 1 0 ++ 1 0 49 {0} repeat 0 1 ++ 0 1 49 {0} repeat 1 0 ++ ] ++ /pixx 53 ++ /pixy 3 ++ /height 6 72 div ++ /width 53 72 div ++ /opt options ++ >> //renmatrix exec + +- % Plot the separator +- -1 72 rmoveto << +- /ren //renmatrix +- /pixs [ +- 0 1 49 {0} repeat 1 0 +- 1 0 49 {0} repeat 0 1 +- 0 1 49 {0} repeat 1 0 +- ] +- /pixx 53 +- /pixy 3 +- /height 6 72 div +- /width 53 72 div +- /opt options +- >> //renmatrix exec ++ % Plot the 2D part ++ -2 6 rmoveto comp options //gs1-cc exec //renmatrix exec + +- % Plot the 2D part +- -2 6 rmoveto comp options //gs1-cc exec //renmatrix exec ++ grestore ++ } { ++ /linsym exch def ++ /linpixs [ ++ linsym /sbs get { 1 index 1 eq {{0}} {{1}} ifelse repeat } forall % Alternates x 1/0's ++ ] def ++ /linheight linsym /bhs get 0 get 72 mul cvi def + +- grestore ++ /compsym comp options //gs1-cc exec def ++ /ccpixs compsym /pixs get def ++ /ccpixx compsym /pixx get def ++ ++ /linpad [ ccpixx 53 sub {0} repeat ] def ++ ++ /pixs [ ++ 0 ccpixx ccpixs length 1 sub { ++ /i exch def ++ 2 { ccpixs i ccpixx getinterval aload pop } repeat ++ } for ++ 2 { linpad aload pop 0 1 49 {0} repeat 1 0 } repeat ++ 2 { linpad aload pop 1 0 49 {0} repeat 0 1 } repeat ++ 2 { linpad aload pop 0 1 49 {0} repeat 1 0 } repeat ++ linheight { linpad aload pop 0 linpixs aload pop 0 } repeat ++ ] def ++ ++ /pixx ccpixx def ++ /pixy pixs length pixx idiv def ++ << ++ /ren //renmatrix ++ /pixs pixs ++ /pixx pixx ++ /pixy pixy ++ /height pixy 72 div ++ /width pixx 72 div ++ /opt options ++ >> ++ } ifelse + + end + +@@ -24846,7 +25000,7 @@ + pop + } ifelse + +- gsave ++ dontdraw not { gsave } if + + options (lintype) (databaromni) put + options (linkage) true put +@@ -24857,7 +25011,7 @@ + linear options //databaromni exec + dup (sbs) get /linsbs exch def + dup (bhs) get 0 get 72 mul /linheight exch def +- //renlinear exec ++ dontdraw not { //renlinear exec } { pop } ifelse + + % Plot the separator + /sepfinder { +@@ -24888,20 +25042,66 @@ + sep 0 [0 0 0] putinterval + sep sep length 4 sub [0 0 0 0] putinterval + 18 sepfinder 64 sepfinder +- 0 linheight rmoveto << +- /ren //renmatrix +- /pixs sep +- /pixx sep length +- /pixy 1 +- /height 1 72 div +- /width sep length 72 div +- /opt options +- >> //renmatrix exec ++ dontdraw not { ++ 0 linheight rmoveto << ++ /ren //renmatrix ++ /pixs sep ++ /pixx sep length ++ /pixy 1 ++ /height 1 72 div ++ /width sep length 72 div ++ /opt options ++ >> //renmatrix exec + +- % Plot the 2D part +- -5 1 rmoveto comp options //gs1-cc exec //renmatrix exec ++ % Plot the 2D part ++ -5 1 rmoveto comp options //gs1-cc exec //renmatrix exec + +- grestore ++ grestore ++ } { ++ /compsym comp options //gs1-cc exec def ++ /ccpixs compsym /pixs get def ++ /ccpixx compsym /pixx get def ++ ++ /linpixs [ 0 % Begin with left guard space ++ linsbs { 1 index 0 eq {{1}} {{0}} ifelse repeat } forall % Alternates x 1/0's ++ ] def ++ /sep [ 0 sep aload pop ] def % Pad with left guard space ++ ++ /linheight linheight cvi def ++ /diff linpixs length ccpixx sub def ++ diff 0 gt { % Centre align composite, doubling up rows ++ /ccpad [ diff 2 idiv {0} repeat ] def ++ /pixs [ ++ 0 ccpixx ccpixs length 1 sub { ++ /i exch def ++ 2 { ccpad aload pop ccpixs i ccpixx getinterval aload pop ccpad aload pop } repeat ++ } for ++ sep aload pop linheight { linpixs aload pop } repeat ++ ] def ++ /pixx linpixs length def ++ } { % Right pad composite, doubling up rows, and left pad (right align) separator/linear ++ /linpad [ diff neg 1 add {0} repeat ] def ++ /pixs [ ++ 0 ccpixx ccpixs length 1 sub { % Right pad composite with 1 space ++ /i exch def ++ 2 { ccpixs i ccpixx getinterval aload pop 0 } repeat ++ } for ++ linpad aload pop sep aload pop linheight { linpad aload pop linpixs aload pop } repeat ++ ] def ++ /pixx ccpixx 1 add def ++ } ifelse ++ ++ /pixy pixs length pixx idiv def ++ << ++ /ren //renmatrix ++ /pixs pixs ++ /pixx pixx ++ /pixy pixy ++ /height pixy 72 div ++ /width pixx 72 div ++ /opt options ++ >> ++ } ifelse + + end + +@@ -24959,7 +25159,7 @@ + pop + } ifelse + +- gsave ++ dontdraw not { gsave } if + + options (lintype) (databarstacked) put + options (linkage) true put +@@ -24970,7 +25170,7 @@ + linear options //databarstacked exec + dup (pixs) get 0 2 index (pixx) get getinterval /bot exch def + dup (pixy) get /linheight exch def +- //renmatrix exec ++ dontdraw not { //renmatrix exec } { /pixs get /linpixs exch def } ifelse + + % Plot the separator + /sepfinder { +@@ -24998,20 +25198,52 @@ + sep 0 [ 0 0 0 0 ] putinterval + sep sep length 4 sub [ 0 0 0 0 ] putinterval + 18 sepfinder +- 0 linheight rmoveto << +- /ren //renmatrix +- /pixs sep +- /pixx sep length +- /pixy 1 +- /height 1 72 div +- /width sep length 72 div +- /opt options +- >> //renmatrix exec ++ dontdraw not { ++ 0 linheight rmoveto << ++ /ren //renmatrix ++ /pixs sep ++ /pixx sep length ++ /pixy 1 ++ /height 1 72 div ++ /width sep length 72 div ++ /opt options ++ >> //renmatrix exec + +- % Plot the 2D part +- 1 1 rmoveto comp options //gs1-cc exec //renmatrix exec ++ % Plot the 2D part ++ 1 1 rmoveto comp options //gs1-cc exec //renmatrix exec + +- grestore ++ grestore ++ } { ++ /compsym comp options //gs1-cc exec def ++ /ccpixs compsym /pixs get def ++ /ccpixx compsym /pixx get def ++ ++ /linwidth sep length def ++ /pixx ccpixx 1 add def ++ /linpad [ pixx linwidth sub {0} repeat ] def ++ /pixs [ ++ 0 ccpixx ccpixs length 1 sub { % Left pad composite with 1 space, doubling up rows ++ /i exch def ++ 2 { 0 ccpixs i ccpixx getinterval aload pop } repeat ++ } for ++ sep aload pop linpad aload pop ++ 0 linwidth linpixs length 1 sub { % Right pad linear ++ /i exch def ++ linpixs i linwidth getinterval aload pop linpad aload pop ++ } for ++ ] def ++ ++ /pixy pixs length pixx idiv def ++ << ++ /ren //renmatrix ++ /pixs pixs ++ /pixx pixx ++ /pixy pixy ++ /height pixy 72 div ++ /width pixx 72 div ++ /opt options ++ >> ++ } ifelse + + end + +@@ -25069,7 +25301,7 @@ + pop + } ifelse + +- gsave ++ dontdraw not { gsave } if + + options (lintype) (databarstackedomni) put + options (linkage) true put +@@ -25080,7 +25312,7 @@ + linear options //databarstackedomni exec + dup (pixs) get 0 2 index (pixx) get getinterval /bot exch def + dup (pixy) get /linheight exch def +- //renmatrix exec ++ dontdraw not { //renmatrix exec } { /pixs get /linpixs exch def } ifelse + + % Plot the separator + /sepfinder { +@@ -25108,20 +25340,52 @@ + sep 0 [ 0 0 0 0 ] putinterval + sep sep length 4 sub [ 0 0 0 0 ] putinterval + 18 sepfinder +- 0 linheight rmoveto << +- /ren //renmatrix +- /pixs sep +- /pixx sep length +- /pixy 1 +- /height 1 72 div +- /width sep length 72 div +- /opt options +- >> //renmatrix exec ++ dontdraw not { ++ 0 linheight rmoveto << ++ /ren //renmatrix ++ /pixs sep ++ /pixx sep length ++ /pixy 1 ++ /height 1 72 div ++ /width sep length 72 div ++ /opt options ++ >> //renmatrix exec + +- % Plot the 2D part +- 1 1 rmoveto comp options //gs1-cc exec //renmatrix exec ++ % Plot the 2D part ++ 1 1 rmoveto comp options //gs1-cc exec //renmatrix exec + +- grestore ++ grestore ++ } { ++ /compsym comp options //gs1-cc exec def ++ /ccpixs compsym /pixs get def ++ /ccpixx compsym /pixx get def ++ ++ /linwidth sep length def ++ /pixx ccpixx 1 add def ++ /linpad [ pixx linwidth sub {0} repeat ] def ++ /pixs [ ++ 0 ccpixx ccpixs length 1 sub { % Left pad composite with 1 space, doubling up rows ++ /i exch def ++ 2 { 0 ccpixs i ccpixx getinterval aload pop } repeat ++ } for ++ sep aload pop linpad aload pop ++ 0 linwidth linpixs length 1 sub { % Right pad linear ++ /i exch def ++ linpixs i linwidth getinterval aload pop linpad aload pop ++ } for ++ ] def ++ ++ /pixy pixs length pixx idiv def ++ << ++ /ren //renmatrix ++ /pixs pixs ++ /pixx pixx ++ /pixy pixy ++ /height pixy 72 div ++ /width pixx 72 div ++ /opt options ++ >> ++ } ifelse + + end + +@@ -25294,7 +25558,7 @@ + pop + } ifelse + +- gsave ++ dontdraw not { gsave } if + + options (lintype) (databarlimited) put + options (linkage) true put +@@ -25305,7 +25569,7 @@ + linear options //databarlimited exec + dup (sbs) get /linsbs exch def + dup (bhs) get 0 get 72 mul /linheight exch def +- //renlinear exec ++ dontdraw not { //renlinear exec } { pop } ifelse + + % Plot the separator + mark +@@ -25313,22 +25577,68 @@ + counttomark 1 sub array astore /sep exch def pop pop + sep 0 [0 0 0] putinterval + sep sep length 4 sub [0 0 0 0] putinterval +- 0 linheight rmoveto << +- /ren //renmatrix +- /pixs sep +- /pixx sep length +- /pixy 1 +- /height 1 72 div +- /width sep length 72 div +- /opt options +- >> //renmatrix exec ++ dontdraw not { ++ 0 linheight rmoveto << ++ /ren //renmatrix ++ /pixs sep ++ /pixx sep length ++ /pixy 1 ++ /height 1 72 div ++ /width sep length 72 div ++ /opt options ++ >> //renmatrix exec ++ ++ % Plot the 2D part ++ comp options //gs1-cc exec ++ dup (pixx) get 72 exch sub 1 rmoveto ++ //renmatrix exec + +- % Plot the 2D part +- comp options //gs1-cc exec +- dup (pixx) get 72 exch sub 1 rmoveto +- //renmatrix exec ++ grestore ++ } { ++ /compsym comp options //gs1-cc exec def ++ /ccpixs compsym /pixs get def ++ /ccpixx compsym /pixx get def + +- grestore ++ /linpixs [ 0 % Begin with left guard space ++ linsbs { 1 index 0 eq {{1}} {{0}} ifelse repeat } forall % Alternates x 1/0's ++ ] def ++ /sep [ 0 sep aload pop ] def % Offset by 1 ++ ++ /linheight linheight cvi def ++ /diff linpixs length ccpixx sub def ++ diff 0 gt { % 2 column - centre align ++ /ccpad [ diff 2 idiv {0} repeat ] def ++ /pixs [ ++ 0 ccpixx ccpixs length 1 sub { ++ /i exch def ++ 2 { ccpad aload pop ccpixs i ccpixx getinterval aload pop ccpad aload pop } repeat ++ } for ++ sep aload pop linheight { linpixs aload pop } repeat ++ ] def ++ /pixx linpixs length def ++ } { % 3/4 column - right pad 1 and right align separator/linear ++ /linpad [ diff neg 1 add {0} repeat ] def ++ /pixs [ ++ 0 ccpixx ccpixs length 1 sub { % Right pad composite with 1 space ++ /i exch def ++ 2 { ccpixs i ccpixx getinterval aload pop 0 } repeat ++ } for ++ linpad aload pop sep aload pop linheight { linpad aload pop linpixs aload pop } repeat ++ ] def ++ /pixx ccpixx 1 add def ++ } ifelse ++ ++ /pixy pixs length pixx idiv def ++ << ++ /ren //renmatrix ++ /pixs pixs ++ /pixx pixx ++ /pixy pixy ++ /height pixy 72 div ++ /width pixx 72 div ++ /opt options ++ >> ++ } ifelse + + end + +@@ -25387,7 +25697,7 @@ + pop + } ifelse + +- gsave ++ dontdraw not { gsave } if + + options (lintype) (databarexpanded) put + options (linkage) true put +@@ -25398,7 +25708,7 @@ + linear options //databarexpanded exec + dup (sbs) get /linsbs exch def + dup (bhs) get 0 get 72 mul /linheight exch def +- //renlinear exec ++ dontdraw not { //renlinear exec } { pop } ifelse + + % Plot the separator + /sepfinder { +@@ -25427,20 +25737,60 @@ + 18 98 bot length 13 sub {} for + 69 98 bot length 13 sub {} for + ] {sepfinder} forall +- 0 linheight rmoveto << +- /ren //renmatrix +- /pixs sep +- /pixx sep length +- /pixy 1 +- /height 1 72 div +- /width sep length 72 div +- /opt options +- >> //renmatrix exec ++ dontdraw not { ++ 0 linheight rmoveto << ++ /ren //renmatrix ++ /pixs sep ++ /pixx sep length ++ /pixy 1 ++ /height 1 72 div ++ /width sep length 72 div ++ /opt options ++ >> //renmatrix exec + +- % Plot the 2D part +- 1 1 rmoveto comp options //gs1-cc exec //renmatrix exec ++ % Plot the 2D part ++ 1 1 rmoveto comp options //gs1-cc exec //renmatrix exec + +- grestore ++ grestore ++ } { ++ /compsym comp options //gs1-cc exec def ++ /ccpixs compsym /pixs get def ++ /ccpixx compsym /pixx get def ++ ++ /linpixs [ 0 % Begin with left guard space ++ linsbs { 1 index 0 eq {{1}} {{0}} ifelse repeat } forall % Alternates x 1/0's ++ ] def ++ /sep [ 0 sep aload pop ] def % Offset by 1 ++ ++ /linheight linheight cvi def ++ /diff linpixs length ccpixx sub def ++ diff 2 ge { ++ /cclpad [ 0 0 ] def ++ /ccrpad [ diff 2 sub {0} repeat ] def ++ } { ++ /cclpad [ diff {0} repeat ] def ++ /ccrpad 0 array def ++ } ifelse ++ /pixs [ ++ 0 ccpixx ccpixs length 1 sub { ++ /i exch def ++ 2 { cclpad aload pop ccpixs i ccpixx getinterval aload pop ccrpad aload pop } repeat ++ } for ++ sep aload pop linheight { linpixs aload pop } repeat ++ ] def ++ ++ /pixx linpixs length def ++ /pixy pixs length pixx idiv def ++ << ++ /ren //renmatrix ++ /pixs pixs ++ /pixx pixx ++ /pixy pixy ++ /height pixy 72 div ++ /width pixx 72 div ++ /opt options ++ >> ++ } ifelse + + end + +@@ -25498,7 +25848,7 @@ + pop + } ifelse + +- gsave ++ dontdraw not { gsave } if + + options (lintype) (databarexpandedstacked) put + options (linkage) true put +@@ -25509,7 +25859,7 @@ + linear options //databarexpandedstacked exec + dup (pixs) get 0 2 index (pixx) get getinterval /bot exch def + dup (pixy) get /linheight exch def +- //renmatrix exec ++ dontdraw not { //renmatrix exec } { /pixs get /linpixs exch def } ifelse + + % Plot the separator + /sepfinder { +@@ -25529,27 +25879,55 @@ + } for + } bind def + /sep [ bot {1 exch sub} forall ] def +- sep 0 [ 0 0 0 ] putinterval ++ sep 0 [ 0 0 0 0 ] putinterval + sep sep length 4 sub [ 0 0 0 0 ] putinterval + [ % Finder pattern module positions + 19 98 bot length 13 sub {} for + 70 98 bot length 13 sub {} for + ] {sepfinder} forall +- 0 linheight rmoveto << +- /ren //renmatrix +- /pixs sep +- /pixx sep length +- /pixy 1 +- /height 1 72 div +- /width sep length 72 div +- /opt options +- >> //renmatrix exec ++ dontdraw not { ++ 0 linheight rmoveto << ++ /ren //renmatrix ++ /pixs sep ++ /pixx sep length ++ /pixy 1 ++ /height 1 72 div ++ /width sep length 72 div ++ /opt options ++ >> //renmatrix exec ++ ++ % Plot the 2D part ++ bot 0 get 0 eq {2} {0} ifelse 1 rmoveto ++ comp options //gs1-cc exec //renmatrix exec + +- % Plot the 2D part +- bot 0 get 0 eq {2} {0} ifelse 1 rmoveto +- comp options //gs1-cc exec //renmatrix exec ++ grestore ++ } { ++ /compsym comp options //gs1-cc exec def ++ /ccpixs compsym /pixs get def ++ /ccpixx compsym /pixx get def ++ ++ /pixx sep length def ++ /cclpad [ pixx ccpixx sub 1 add 2 idiv {0} repeat ] def % Add 1 to allow for odd difference ++ /ccrpad [ pixx ccpixx sub 2 idiv {0} repeat ] def ++ /pixs [ ++ 0 ccpixx ccpixs length 1 sub { % Centre align composite ++ /i exch def ++ 2 { cclpad aload pop ccpixs i ccpixx getinterval aload pop ccrpad aload pop } repeat ++ } for ++ sep aload pop linpixs aload pop ++ ] def + +- grestore ++ /pixy pixs length pixx idiv def ++ << ++ /ren //renmatrix ++ /pixs pixs ++ /pixx pixx ++ /pixy pixy ++ /height pixy 72 div ++ /width pixx 72 div ++ /opt options ++ >> ++ } ifelse + + end + +@@ -25608,7 +25986,7 @@ + pop + } ifelse + +- gsave ++ dontdraw not { gsave } if + + options (inkspread) (0) put + options (dontdraw) true put +@@ -25635,35 +26013,87 @@ + linear << options {} forall >> //gs1-128 exec + dup (sbs) get /linsbs exch def + dup (bhs) get 0 get 72 mul /linheight exch def +- //renlinear exec ++ dontdraw not { //renlinear exec } { pop } ifelse + + % Plot the separator + mark + 1 linsbs {1 index 0 eq {{1}} {{0}} ifelse repeat} forall + counttomark 1 sub array astore /sep exch def pop pop +- 0 linheight rmoveto << +- /ren //renmatrix +- /pixs sep +- /pixx sep length +- /pixy 1 +- /height 1 72 div +- /width sep length 72 div +- /opt options +- >> //renmatrix exec ++ dontdraw not { ++ 0 linheight rmoveto << ++ /ren //renmatrix ++ /pixs sep ++ /pixx sep length ++ /pixy 1 ++ /height 1 72 div ++ /width sep length 72 div ++ /opt options ++ >> //renmatrix exec ++ } if + + % Plot the 2D part + linktype (a) eq { + /s linwidth 2 sub 11 idiv def + /p s 9 sub 2 idiv def + /x s p sub 1 sub 11 mul 10 add p 0 eq {2 add} if 99 sub def +- x 1 rmoveto ++ dontdraw not { x 1 rmoveto } if + } { +- -7 1 rmoveto ++ dontdraw not { -7 1 rmoveto } { /x -7 def } ifelse + } ifelse + +- compsym //renmatrix exec ++ dontdraw not { ++ compsym //renmatrix exec + +- grestore ++ grestore ++ } { ++ /ccpixs compsym /pixs get def ++ /ccpixx compsym /pixx get def ++ ++ /linpixs [ ++ linsbs { 1 index 1 eq {{0}} {{1}} ifelse repeat } forall % Alternates x 1/0's ++ ] def ++ ++ x 0 gt { % Left pad composite ++ /cclpad [ x {0} repeat ] def ++ /linlpad 0 array def ++ /diff linwidth ccpixx x add sub def ++ } { % Left pad linear ++ /cclpad 0 array def ++ /linlpad [ x neg {0} repeat ] def ++ /diff linwidth x sub ccpixx sub def ++ } ifelse ++ ++ diff 0 gt { % Right pad composite ++ /ccrpad [ diff {0} repeat ] def ++ /linrpad 0 array def ++ } { % Right pad linear ++ /ccrpad 0 array def ++ /linrpad [ diff neg {0} repeat ] def ++ } ifelse ++ ++ /linheight linheight cvi def ++ /ccrepeat linktype (a) eq {2} {3} ifelse def ++ /pixs [ ++ 0 ccpixx ccpixs length 1 sub { ++ /i exch def ++ ccrepeat { cclpad aload pop ccpixs i ccpixx getinterval aload pop ccrpad aload pop } repeat ++ } for ++ linlpad aload pop sep aload pop linrpad aload pop ++ linheight { linlpad aload pop linpixs aload pop linrpad aload pop } repeat ++ ] def ++ ++ /pixx cclpad length ccpixx add ccrpad length add def ++ /pixy pixs length pixx idiv def ++ << ++ /ren //renmatrix ++ /pixs pixs ++ /pixx pixx ++ /pixy pixy ++ /height pixy 72 div ++ /width pixx 72 div ++ /opt options ++ >> ++ } ifelse + + end + +@@ -26961,3 +27391,115 @@ + % --END ENCODER hibcazteccode-- + + % --END TEMPLATE-- ++%!PS ++ ++% To compress: tar cv bwipp_dump.ps | xz -e9 > bwipp_dump.ps.tar.xz ++ ++% Dumps bwipp barcode binary to stdout. If `-sn` given, appends a newline after each symbol row, otherwise doesn't. ++% ++% To run e.g. gs -dNOPAUSE -dBATCH -dNODISPLAY -q -sb=databarexpanded -sd='(01)98898765432106' -so='includetext segments=6' bwipp_dump.ps ++% where ++% `-sb=` is the bwipp barcode routine name ++% `-sd=` is the data (`sd2=` is also available for overspill data > 2K to get around Ghostscript arg_str_max) ++% `-so=` are options (as space separated key=val pairs (or just key if boolean true)) ++ ++% Command line "-s" options put into system dictionary as strings ++/n systemdict /n known def ++ ++% Append d2 to d if given ++systemdict /d2 known { ++ /d d length d2 length add string dup dup 0 d putinterval d length d2 putinterval def ++} if ++ ++% Strip start/end parens from data if any ++d 0 1 getinterval (\() eq d d length 1 sub 1 getinterval (\)) eq and { ++ /d d 1 d length 2 sub getinterval d length 2 sub string copy def ++} if ++ ++% Options ++systemdict /o known { ++ o type /stringtype eq o length 0 gt and { ++ o length 2 ge { ++ % Strip start/end parens from options if any ++ o 0 1 getinterval (\() eq o o length 1 sub 1 getinterval (\)) eq and { ++ /o o 1 o length 2 sub getinterval o length 2 sub string copy def ++ } if ++ } if ++ 3 dict begin ++ o { ++ token not {exit} if ++ dup length string cvs (=) search { ++ cvlit exch pop exch def ++ } { ++ cvlit true def ++ } ifelse ++ } loop ++ currentdict end /o exch def ++ } { ++ /o 1 dict def ++ } ifelse ++} { ++ /o 1 dict def ++} ifelse ++ ++o (dontdraw) true put ++ ++/ret d o b cvn /uk.co.terryburton.bwipp findresource exec def ++ ++% pixs is renmatrix input ++ret /pixs known { ++ /pixs ret /pixs get def ++ ++ n ret /pixx known and { % If newlines requested and have row width ++ /pixx ret /pixx get def ++ 0 pixx pixs length 1 sub { % For i = 0; i < pixs length; i += pixx ++ pixs exch pixx getinterval { % For j = i; j < i + pixx; j++ ++ 1 string cvs print ++ } forall ++ (\n) print ++ } for ++ } { % Else dump the whole thing, no newlines ++ pixs { 1 string cvs print } forall ++ } ifelse ++} { ++ % sbs is renlinear input ++ ret /sbs known { ++ /sbs ret /sbs get def ++ ++ % Check if given ratio arg to adjust width of bars/spaces (eg "0.6" reduces 3 -> 2) ++ systemdict /r known { ++ /r systemdict /r get cvr def ++ /f { r mul ceiling cvi } def ++ } { ++ /f {} def ++ } ifelse ++ ++ % If should begin with space ++ systemdict /bs known { (0) print } if ++ ++ % If should end sbs loop on bar (i.e. ignore last index of even-length sbs) ++ /limit systemdict /elb known { ++ sbs length 1 add 2 idiv 2 mul 2 sub ++ } { ++ sbs length 1 sub ++ } ifelse def ++ ++ 0 1 limit { ++ /i exch def ++ i 2 mod 0 eq { % i is even ++ sbs i get f { (1) print } repeat ++ } { ++ sbs i get f { (0) print } repeat ++ } ifelse ++ } for ++ n { (\n) print } if ++ } if ++} ifelse ++ ++% If have renderer ++ret /ren known { ++ % Scale ++ /s systemdict /s known { systemdict /s get cvi } { 2 } ifelse def ++ % If not -dNODISPLAY then render for debugging ++ currentpagedevice /Name get (nullpage) ne { s s scale 10 10 moveto ret ret /ren get exec } if ++} if diff --git a/backend/tests/tools/bwipp_dump.ps.tar.xz b/backend/tests/tools/bwipp_dump.ps.tar.xz new file mode 100644 index 0000000000000000000000000000000000000000..447a11c9b18d95bd4cb631707517e3f2b297363c GIT binary patch literal 114172 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 qBj#R`|m=AA%vXEd1!v}lGY_$)-an$CLE_vxpN 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 + Copyright (C) 2008 - 2020 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -30,13 +30,11 @@ */ /* vim: set ts=4 sw=4 et : */ -#define SODIUM "0123456789+" -#define EAN2 102 -#define EAN5 105 +#define SODIUM "0123456789+" +#define EAN2 102 +#define EAN5 105 #include -#include -#include #include "common.h" /* UPC and EAN tables checked against EN 797:1996 */ @@ -265,6 +263,10 @@ static int upce(struct zint_symbol *symbol, unsigned char source[], char dest[]) check_digit = upc_check(equivalent); + if (symbol->debug & ZINT_DEBUG_PRINT) { + printf("UPC-E: %s, Check digit: %c\n", equivalent, check_digit); + } + /* Use the number system and check digit information to choose a parity scheme */ if (num_system == 1) { strcpy(parity, UPCParity1[ctoi(check_digit)]); diff --git a/docs/manual.txt b/docs/manual.txt index 99e1c0e6..5c4de702 100644 --- a/docs/manual.txt +++ b/docs/manual.txt @@ -267,14 +267,14 @@ Numeric Value | Barcode Name 24 | Code 49 25 | Code 93 28 | Flattermarken -29 | GS1 DataBar-14 +29 | GS1 DataBar Omnidirectional (including GS1 DataBar Truncated) 30 | GS1 DataBar Limited 31 | GS1 DataBar Expanded 32 | Telepen Alpha -34 | UPC A -35 | UPC A + Check Digit -37 | UPC E -38 | UPC E + Check Digit +34 | UPC-A +35 | UPC-A + Check Digit +37 | UPC-E +38 | UPC-E + Check Digit 40 | PostNet 47 | MSI Plessey 49 | FIM @@ -295,17 +295,17 @@ Numeric Value | Barcode Name 70 | Royal Mail 4 State (RM4SCC) 71 | Data Matrix (ECC200) 72 | EAN-14 -73 | Vehicle Identification Number (America) +73 | Vehicle Identification Number 74 | Codablock-F 75 | NVE-18 76 | Japanese Postal Code 77 | Korea Post -79 | GS1 DataBar-14 Stacked -80 | GS1 DataBar-14 Stacked Omnidirectional +79 | GS1 DataBar Stacked (stacked version of GS1 DataBar Truncated) +80 | GS1 DataBar Stacked Omnidirectional 81 | GS1 DataBar Expanded Stacked 82 | PLANET 84 | MicroPDF417 -85 | USPS OneCode +85 | USPS Intelligent Mail (OneCode) 86 | Plessey Code 87 | Telepen Numeric 89 | ITF-14 @@ -327,13 +327,14 @@ Numeric Value | Barcode Name 129 | Code 32 130 | Composite Symbol with EAN linear component 131 | Composite Symbol with GS1-128 linear component -132 | Composite Symbol with GS1 DataBar-14 linear component -133 | Composite Symbol with GS1 DataBar Limited component -134 | Composite Symbol with GS1 DataBar Expanded component -135 | Composite Symbol with UPC A linear component -136 | Composite Symbol with UPC E linear component -137 | Composite Symbol with GS1 DataBar-14 Stacked component -138 | Composite Symbol with GS1 DataBar-14 Stacked Omnidirectional +132 | Composite Symbol with GS1 DataBar Omnidirectional linear + | component +133 | Composite Symbol with GS1 DataBar Limited linear component +134 | Composite Symbol with GS1 DataBar Expanded linear component +135 | Composite Symbol with UPC-A linear component +136 | Composite Symbol with UPC-E linear component +137 | Composite Symbol with GS1 DataBar Stacked component +138 | Composite Symbol with GS1 DataBar Stacked Omnidirectional | component 139 | Composite Symbol with GS1 DataBar Expanded Stacked component 140 | Channel Code @@ -434,8 +435,9 @@ have been inserted into a symbol. GS1 data can be encoded in a number of symbologies. Application identifiers should be enclosed in [square brackets] followed by the data to be encoded (see 5.1.12.3). To encode GS1 data use the --gs1 option. GS1 mode is assumed (and -doesn't need to be set) for EAN-128, DataBar and Composite symbologies but is -also available for Code 16k, Data Matrix, Aztec Code, DotCode and QR Code. +doesn't need to be set) for GS1-128, EAN-14, DataBar and Composite symbologies +but is also available for Aztec Code, Code 16k, Code 49, Code One, Data Matrix, +DotCode, QR Code and Ultracode. HIBC data may also be encoded in the symbologies Code 39, Code128, Codablock-F, Data Matrix, QR Code, PDF417 and Aztec Code. Within this mode, the leading '+' @@ -999,14 +1001,14 @@ Value | 24 | BARCODE_CODE49 | Code 49 25 | BARCODE_CODE93 | Code 93 28 | BARCODE_FLAT | Flattermarken -29 | BARCODE_RSS14 | GS1 DataBar-14 +29 | BARCODE_RSS14 | GS1 DataBar Omnidirectional 30 | BARCODE_RSS_LTD | GS1 DataBar Limited 31 | BARCODE_RSS_EXP | GS1 DataBar Expanded 32 | BARCODE_TELEPEN | Telepen Alpha -34 | BARCODE_UPCA | UPC A -35 | BARCODE_UPCA_CHK | UPC A + Check Digit -37 | BARCODE_UPCE | UPC E -38 | BARCODE_UPCE_CHK | UPC E + Check Digit +34 | BARCODE_UPCA | UPC-A +35 | BARCODE_UPCA_CHK | UPC-A + Check Digit +37 | BARCODE_UPCE | UPC-E +38 | BARCODE_UPCE_CHK | UPC-E + Check Digit 40 | BARCODE_POSTNET | PostNet 47 | BARCODE_MSI_PLESSEY | MSI Plessey 49 | BARCODE_FIM | FIM @@ -1032,12 +1034,12 @@ Value | 75 | BARCODE_NVE18 | NVE-18 76 | BARCODE_JAPANPOST | Japanese Postal Code 77 | BARCODE_KOREAPOST | Korea Post -79 | BARCODE_RSS14STACK | GS1 DataBar-14 Stacked -80 | BARCODE_RSS14STACK_OMNI | GS1 DataBar-14 Stacked Omnidirectional +79 | BARCODE_RSS14STACK | GS1 DataBar Stacked +80 | BARCODE_RSS14STACK_OMNI | GS1 DataBar Stacked Omnidirectional 81 | BARCODE_RSS_EXPSTACK | GS1 DataBar Expanded Stacked 82 | BARCODE_PLANET | PLANET 84 | BARCODE_MICROPDF417 | MicroPDF417 -85 | BARCODE_ONECODE | USPS OneCode +85 | BARCODE_ONECODE | USPS Intelligent Mail (OneCode) 86 | BARCODE_PLESSEY | Plessey Code 87 | BARCODE_TELEPEN_NUM | Telepen Numeric 89 | BARCODE_ITF14 | ITF-14 @@ -1061,18 +1063,18 @@ Value | 130 | BARCODE_EANX_CC | Composite Symbol with EAN linear component 131 | BARCODE_EAN128_CC | Composite Symbol with GS1-128 linear | | component -132 | BARCODE_RSS14_CC | Composite Symbol with GS1 DataBar-14 linear - | | component +132 | BARCODE_RSS14_CC | Composite Symbol with GS1 DataBar + | | Omnidirectional linear component 133 | BARCODE_RSS_LTD_CC | Composite Symbol with GS1 DataBar Limited - | | component + | | linear component 134 | BARCODE_RSS_EXP_CC | Composite Symbol with GS1 DataBar Expanded + | | linear component +135 | BARCODE_UPCA_CC | Composite Symbol with UPC-A linear component +136 | BARCODE_UPCE_CC | Composite Symbol with UPC-E linear component +137 | BARCODE_RSS14STACK_CC | Composite Symbol with GS1 DataBar Stacked | | component -135 | BARCODE_UPCA_CC | Composite Symbol with UPC A linear component -136 | BARCODE_UPCE_CC | Composite Symbol with UPC E linear component -137 | BARCODE_RSS14STACK_CC | Composite Symbol with GS1 DataBar-14 - | | Stacked component -138 | BARCODE_RSS14_OMNI_CC | Composite Symbol with GS1 DataBar-14 - | | Stacked Omnidirectional component +138 | BARCODE_RSS14_OMNI_CC | Composite Symbol with GS1 DataBar Stacked + | | Omnidirectional component 139 | BARCODE_RSS_EXPSTACK_CC | Composite Symbol with GS1 DataBar Expanded | | Stacked component 140 | BARCODE_CHANNEL | Channel Code @@ -1152,8 +1154,8 @@ if (ZBarcode_ValidID(BARCODE_PDF417) != 0) { } [1] This value is ignored for Australia Post 4-State Barcodes, PostNet, PLANET, -USPS OneCode, RM4SCC, PDF417, Data Matrix, Maxicode, QR Code, GS1 -DataBar-14 Stacked, PDF417 and MicroPDF417 - all of which have a fixed height. +USPS Intelligent Mail, RM4SCC, PDF417, Data Matrix, Maxicode, QR Code, GS1 +DataBar Stacked, PDF417 and MicroPDF417 - all of which have a fixed height. [2] This value is ignored for Code 16k, Codablock-F and ITF-14 symbols. @@ -1435,15 +1437,15 @@ suppresses mode C in favour of mode B. 6.1.11.3 GS1-128 ---------------- -A variation of Code 128 also known as UCC/EAN-128, this symbology is defined by -the GS1 General Specification. Application Identifiers (AIs) should be entered -using [square bracket] notation. These will be converted to (round brackets) -for the human readable text. This will allow round brackets to be used in the -data strings to be encoded. Fixed length data should be entered at the -appropriate length for correct encoding. GS1-128 does not support extended -ASCII characters. Check digits for GTIN data (AI 01) are not generated and -need to be included in the input data. The following is an example of a valid -GS1-128 input: +A variation of Code 128 previously known as UCC/EAN-128, this symbology is +defined by the GS1 General Specifications. Application Identifiers (AIs) should +be entered using [square bracket] notation. These will be converted to (round +brackets) for the human readable text. This will allow round brackets to be used +in the data strings to be encoded. Fixed length data should be entered at the +appropriate length for correct encoding. GS1-128 does not support extended ASCII +characters. Check digits for GTIN data (AI 01) are not generated and need to be +included in the input data. The following is an example of a valid GS1-128 +input: zint --barcode=16 -d "[01]98898765432106[3202]012345[15]991231" @@ -1466,39 +1468,42 @@ standards. 6.1.12 GS1 DataBar (ISO 24724) ------------------------------ -Also known as RSS (Reduced Spaced Symbology) these symbols are due to replace -GS1-128 symbols in accordance with the GS1 General Specification. If a GS1 -DataBar symbol is to be printed with a 2D component as specified in ISO 24723 -set option_1 = 2 or use the option --mode=2 at the command prompt. See section -6.3 of this manual to find out how to generate DataBar symbols with 2D +Previously known as RSS (Reduced Spaced Symbology) these symbols are due to +replace GS1-128 symbols in accordance with the GS1 General Specifications. If a +GS1 DataBar symbol is to be printed with a 2D component as specified in ISO +24723 set option_1 = 2 or use the option --mode=2 at the command prompt. See +section 6.3 of this manual to find out how to generate DataBar symbols with 2D components. -6.1.12.1 DataBar-14 and DataBar-14 Truncated --------------------------------------------- -Also known as RSS-14 this standard encodes a 13 digit item code. A check digit -and application identifier of (01) are added by Zint. To produce a truncated -symbol set the symbol height to a value between 32 and 13. Normal DataBar-14 -symbols should have a height of 33 or greater. +6.1.12.1 DataBar Omnidirectional and DataBar Truncated +------------------------------------------------------ +Previously known as RSS-14 this standard encodes a 13 digit item code. A check +digit and application identifier of (01) are added by Zint. (A 14 digit code +that appends the check digit may be given, in which case the check digit will be +verified.) To produce a truncated symbol set the symbol height to a value +between 32 and 13. Normal DataBar Omnidirectional symbols should have a height +of 33 or greater. 6.1.12.2 DataBar Limited ------------------------ -Also known as RSS Limited this standard encodes a 13 digit item code and can be -used in the same way as DataBar-14 above. DataBar Limited, however, is limited -to data starting with digits 0 and 1 (i.e. numbers in the range 0 to -1999999999999). As with DataBar-14 a check digit and application identifier of -(01) are added by Zint. +Previously known as RSS Limited this standard encodes a 13 digit item code and +can be used in the same way as DataBar above. DataBar Limited, however, is +limited to data starting with digits 0 and 1 (i.e. numbers in the range 0 to +1999999999999). As with DataBar Omnidirectional a check digit and application +identifier of (01) are added by Zint, and a 14 digit code may be given in which +case the check digit will be verified. 6.1.12.3 DataBar Expanded ------------------------- -Also known as RSS Expanded this is a variable length symbology capable of +Previously known as RSS Expanded this is a variable length symbology capable of encoding data from a number of AIs in a single symbol. AIs should be encased in [square brackets] in the input data. This will be converted to (rounded brackets) before it is included in the human readable text attached to the symbol. This method allows the inclusion of rounded brackets in the data to be encoded. GTIN data (AI 01) should also include the check digit data as this is not calculated by Zint when this symbology is encoded. Fixed length data should -be entered at the appropriate length for correct encoding. The following is -an example of a valid DataBar Expanded input: +be entered at the appropriate length for correct encoding. The following is an +example of a valid DataBar Expanded input: zint --barcode=31 -d "[01]98898765432106[3202]012345[15]991231" @@ -1612,19 +1617,19 @@ mechanism. A separate symbology ID can be used to encode Health Industry Barcode (HIBC) data which adds a leading '+' character and a modulo-49 check digit to the encoded data. -6.2.7 GS1 DataBar-14 Stacked (ISO 24724) ----------------------------------------- -A stacked variation of the GS1 DataBar-14 symbol requiring the same input (see -section 6.1.12.1). The height of this symbol is fixed. The data is encoded in -two rows of bars with a central finder pattern. This symbol can be generated +6.2.7 GS1 DataBar Stacked (ISO 24724) +------------------------------------- +A stacked variation of the GS1 DataBar Truncated symbol requiring the same input +(see section 6.1.12.1). The height of this symbol is fixed. The data is encoded +in two rows of bars with a central finder pattern. This symbol can be generated with a two-dimensional component to make a composite symbol. -6.2.8 GS1 DataBar-14 Stacked Omnidirectional (ISO 24724) --------------------------------------------------------- -Another variation of the GS1 DataBar-14 symbol requiring the same input (see -section 6.1.12.1). The data is encoded in two rows of bars with a central -finder pattern. This symbol can be generated with a two-dimensional component -to make a composite symbol. +6.2.8 GS1 DataBar Stacked Omnidirectional (ISO 24724) +----------------------------------------------------- +A stacked variation of the GS1 DataBar Omnidirectional symbol requiring the same +input (see section 6.1.12.1). The data is encoded in two rows of bars with a +central finder pattern. This symbol can be generated with a two-dimensional +component to make a composite symbol. 6.2.9 GS1 DataBar Expanded Stacked (ISO 24724) ---------------------------------------------- @@ -1647,7 +1652,7 @@ characters or 81 numeric digits. GS1 data encoding is also supported. --------------------------------- Composite symbols employ a mixture of components to give more comprehensive information about a product. The permissible contents of a composite symbol is -determined by the terms of the GS1 General Specification. Composite symbols +determined by the terms of the GS1 General Specifications. Composite symbols consist of a linear component which can be an EAN, UPC, GS1-128 or GS1 DataBar symbol, a 2D component which is based on PDF417 or MicroPDF417, and a separator pattern. The type of linear component to be used is determined using the -b or @@ -1661,18 +1666,18 @@ Value | 130 | BARCODE_EANX_CC | Composite Symbol with EAN linear component 131 | BARCODE_EAN128_CC | Composite Symbol with GS1-128 linear | | component -132 | BARCODE_RSS14_CC | Composite Symbol with GS1 DataBar-14 linear - | | component +132 | BARCODE_RSS14_CC | Composite Symbol with GS1 DataBar + | | Omnidirectional linear component 133 | BARCODE_RSS_LTD_CC | Composite Symbol with GS1 DataBar Limited - | | component + | | linear component 134 | BARCODE_RSS_EXP_CC | Composite Symbol with GS1 DataBar Expanded + | | linear component +135 | BARCODE_UPCA_CC | Composite Symbol with UPC-A linear component +136 | BARCODE_UPCE_CC | Composite Symbol with UPC-E linear component +137 | BARCODE_RSS14STACK_CC | Composite Symbol with GS1 DataBar Stacked | | component -135 | BARCODE_UPCA_CC | Composite Symbol with UPC A linear component -136 | BARCODE_UPCE_CC | Composite Symbol with UPC E linear component -137 | BARCODE_RSS14STACK_CC | Composite Symbol with GS1 DataBar-14 - | | Stacked component -138 | BARCODE_RSS14_OMNI_CC | Composite Symbol with GS1 DataBar-14 - | | Stacked Omnidirectional component +138 | BARCODE_RSS14_OMNI_CC | Composite Symbol with GS1 DataBar Stacked + | | Omnidirectional component 139 | BARCODE_RSS_EXPSTACK_CC | Composite Symbol with GS1 DataBar Expanded | | Stacked component -------------------------------------------------------------------------------- @@ -1817,15 +1822,15 @@ Reed Solomon error correction. Input is a pre-formatted alphanumeric string of trailing space characters - these will be appended by Zint if not included in the input data. -6.5.5 USPS OneCode ------------------- -Also known as the Intelligent Mail Barcode and used in the US by the United -States Postal Service (USPS), the OneCode system replaced the PostNet and -PLANET symbologies in 2009. OneCode is a fixed length (65-bar) symbol which +6.5.5 USPS Intelligent Mail +--------------------------- +Also known as the OneCode barcode and used in the US by the United States Postal +Service (USPS), the Intelligent Mail system replaced the PostNet and PLANET +symbologies in 2009. Intelligent Mail is a fixed length (65-bar) symbol which combines routing and customer information in a single symbol. Input data consists of a 20 digit tracking code, followed by a dash (-), followed by a -delivery point zip-code which can be 0, 5, 9 or 11 digits in length. For -example all of the following inputs are valid data entries: +delivery point zip-code which can be 0, 5, 9 or 11 digits in length. For example +all of the following inputs are valid data entries: "01234567094987654321" diff --git a/frontend/main.c b/frontend/main.c index 0e9234a1..ef47fa92 100644 --- a/frontend/main.c +++ b/frontend/main.c @@ -53,17 +53,17 @@ static void types(void) { "20: Code 128 70: RM4SCC 128: Aztec Runes\n" "21: Leitcode 71: Data Matrix 129: Code 32\n" "22: Identcode 72: EAN-14 130: Comp EAN\n" - "23: Code 16k 73: VIN (North America) 131: Comp GS1-128\n" + "23: Code 16k 73: VIN 131: Comp GS1-128\n" "24: Code 49 74: Codablock-F 132: Comp DataBar Omni\n" "25: Code 93 75: NVE-18 133: Comp DataBar Ltd\n" - "28: Flattermarken 76: Japanese Post 134: Comp DataBar ExpOm\n" + "28: Flattermarken 76: Japanese Post 134: Comp DataBar Exp\n" "29: GS1 DataBar Omni 77: Korea Post 135: Comp UPC-A\n" "30: GS1 DataBar Ltd 79: GS1 DataBar Stack 136: Comp UPC-E\n" - "31: GS1 DataBar ExpOm 80: GS1 DataBar Stack Omni 137: Comp DataBar Stack\n" - "32: Telepen Alpha 81: GS1 DataBar ESO 138: Comp DataBar Stack Omni\n" - "34: UPC-A 82: Planet 139: Comp DataBar ESO\n" + "31: GS1 DataBar Exp 80: GS1 DataBar Stack Omni 137: Comp DataBar Stack\n" + "32: Telepen Alpha 81: GS1 DataBar Exp Stack 138: Comp DataBar Stack Omni\n" + "34: UPC-A 82: Planet 139: Comp DataBar Exp Stack\n" "35: UPC-A + Check 84: MicroPDF 140: Channel Code\n" - "37: UPC-E 85: USPS OneCode 141: Code One\n" + "37: UPC-E 85: USPS Intelligent Mail 141: Code One\n" "38: UPC-E + Check 86: UK Plessey 142: Grid Matrix\n" "40: Postnet 87: Telepen Numeric 143: UPNQR\n" "47: MSI Plessey 89: ITF-14 144: Ultracode\n" diff --git a/frontend_qt/grpChannel.ui b/frontend_qt/grpChannel.ui index 8b4e84a0..1c6964bb 100644 --- a/frontend_qt/grpChannel.ui +++ b/frontend_qt/grpChannel.ui @@ -9,6 +9,12 @@ 78 + + + 600 + 16777215 + + Form diff --git a/frontend_qt/grpDBExtend.ui b/frontend_qt/grpDBExtend.ui index b3941203..46d63443 100644 --- a/frontend_qt/grpDBExtend.ui +++ b/frontend_qt/grpDBExtend.ui @@ -44,47 +44,57 @@ - 1 + 1 (2 segments) - 2 + 2 (4 segments) - 3 + 3 (6 segments) - 4 + 4 (8 segments) - 5 + 5 (10 segments) - 6 + 6 (12 segments) - 7 + 7 (14 segments) - 8 + 8 (16 segments) - 9 + 9 (18 segments) + + + + + 10 (20 segments) + + + + + 11 (22 segments) diff --git a/frontend_qt/mainWindow.ui b/frontend_qt/mainWindow.ui index 911bac2f..558524e6 100644 --- a/frontend_qt/mainWindow.ui +++ b/frontend_qt/mainWindow.ui @@ -454,7 +454,7 @@ p, li { white-space: pre-wrap; } - &Whitespace: + Horizontal &Whitespace: Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter diff --git a/frontend_qt/mainwindow.cpp b/frontend_qt/mainwindow.cpp index 7e0c3d2c..8d9a24ac 100644 --- a/frontend_qt/mainwindow.cpp +++ b/frontend_qt/mainwindow.cpp @@ -37,7 +37,7 @@ MainWindow::MainWindow(QWidget* parent, Qt::WindowFlags fl) : QWidget(parent, fl), m_optionWidget(0) { - m_bc.bc.setDebug(QCoreApplication::arguments().contains("--verbose")); + m_bc.bc.setDebug(QCoreApplication::arguments().contains("--verbose")); // Undocumented command line debug flag QCoreApplication::setOrganizationName("zint"); QCoreApplication::setOrganizationDomain("zint.org.uk"); @@ -80,15 +80,15 @@ MainWindow::MainWindow(QWidget* parent, Qt::WindowFlags fl) "Facing Identification Mark (FIM)", "Flattermarken", "Grid Matrix", - "GS1 DataBar Expanded Omnidirectional", - "GS1 DataBar Expanded Stacked Omnidirectional", + "GS1 DataBar Expanded", + "GS1 DataBar Expanded Stacked", "GS1 DataBar Limited", - "GS1 DataBar Omnidirectional", + "GS1 DataBar Omnidirectional (and Truncated)", "GS1 DataBar Stacked", "GS1 DataBar Stacked Omnidirectional", "Han Xin (Chinese Sensible) Code", - "ITF-14", "International Standard Book Number (ISBN)", + "ITF-14", "Japanese Postal Barcode", "Korean Postal Barcode", "LOGMARS", @@ -111,10 +111,10 @@ MainWindow::MainWindow(QWidget* parent, Qt::WindowFlags fl) "Telepen Numeric", "UK Plessey", "Ultracode", - "UPNQR", "Universal Product Code (UPC-A)", "Universal Product Code (UPC-E)", - "USPS Intelligent Mail", + "UPNQR", + "USPS Intelligent Mail (OneCode)", "VIN (Vehicle Identification Number)" }; @@ -124,26 +124,32 @@ MainWindow::MainWindow(QWidget* parent, Qt::WindowFlags fl) view->setScene(scene); m_fgcolor=qRgb(settings.value("studio/ink/red", 0).toInt(), - settings.value("studio/ink/green", 0).toInt(), - settings.value("studio/ink/blue", 0).toInt()); + settings.value("studio/ink/green", 0).toInt(), + settings.value("studio/ink/blue", 0).toInt()); m_bgcolor=qRgb(settings.value("studio/paper/red", 0xff).toInt(), - settings.value("studio/paper/green", 0xff).toInt(), - settings.value("studio/paper/blue", 0xff).toInt()); - for (int i=0;ienumerator(0).keyCount();i++) { + settings.value("studio/paper/green", 0xff).toInt(), + settings.value("studio/paper/blue", 0xff).toInt()); + + for (int i = 0; i < metaObject()->enumerator(0).keyCount(); i++) { bstyle->addItem(metaObject()->enumerator(0).key(i)); - bstyle->setItemText(i,bstyle_text[i]); + bstyle->setItemText(i, bstyle_text[i]); } + bstyle->setCurrentIndex(settings.value("studio/symbology", 10).toInt()); - txtData->setText(settings.value("studio/data", "Your Data Here!").toString()); - txtComposite->setText(settings.value("studio/composite_text", "Your Data Here!").toString()); - heightb->setValue(settings.value("studio/appearance/height", 50).toInt()); - bwidth->setValue(settings.value("studio/appearance/border", 50).toInt()); - spnWhitespace->setValue(settings.value("studio/appearance/whitespace", 0).toInt()); - spnScale->setValue(settings.value("studio/appearance/scale", 1.0).toFloat()); - btype->setCurrentIndex(settings.value("studio/appearance/border_type", 0).toInt()); + + txtData->setText(settings.value("studio/data", "Your Data Here!").toString()); + txtComposite->setText(settings.value("studio/composite_text", "Your Data Here!").toString()); + heightb->setValue(settings.value("studio/appearance/height", 50).toInt()); + bwidth->setValue(settings.value("studio/appearance/border", 50).toInt()); + spnWhitespace->setValue(settings.value("studio/appearance/whitespace", 0).toInt()); + spnScale->setValue(settings.value("studio/appearance/scale", 1.0).toFloat()); + btype->setCurrentIndex(settings.value("studio/appearance/border_type", 0).toInt()); + change_options(); - scene->addItem(&m_bc); + scene->addItem(&m_bc); + update_preview(); + connect(bstyle, SIGNAL(currentIndexChanged( int )), SLOT(change_options())); connect(bstyle, SIGNAL(currentIndexChanged( int )), SLOT(update_preview())); connect(heightb, SIGNAL(valueChanged( int )), SLOT(update_preview())); @@ -253,17 +259,17 @@ bool MainWindow::save() } if(m_bc.bc.save_to_file(filename) == false) { - if (m_bc.bc.getError() > 4) { - QMessageBox::critical(this,tr("Save Error"),m_bc.bc.error_message()); - return false; - } else { - QMessageBox::warning(this, tr("Save Warning"),m_bc.bc.error_message()); - return true; - } + if (m_bc.bc.getError() > 4) { + QMessageBox::critical(this, tr("Save Error"), m_bc.bc.error_message()); + return false; + } else { + QMessageBox::warning(this, tr("Save Warning"), m_bc.bc.error_message()); + return true; + } } - settings.setValue("studio/default_dir", filename.mid(0, filename.lastIndexOf(QDir::separator()))); - settings.setValue("studio/default_suffix", suffix); + settings.setValue("studio/default_dir", filename.mid(0, filename.lastIndexOf(QDir::separator()))); + settings.setValue("studio/default_suffix", suffix); return true; } @@ -1092,12 +1098,10 @@ void MainWindow::update_preview() if(m_optionWidget->findChild("radQRGS1")->isChecked()) m_bc.bc.setInputMode(GS1_MODE); - printf("cmbQRSize stylesheet %s\n", (const char *) m_optionWidget->findChild("cmbQRSize")->styleSheet().toLatin1()); item_val = m_optionWidget->findChild("cmbQRSize")->currentIndex(); if (item_val) { m_bc.bc.setOption2(item_val); } - printf("cmbQRECC stylesheet %s\n", (const char *) m_optionWidget->findChild("cmbQRECC")->styleSheet().toLatin1()); item_val = m_optionWidget->findChild("cmbQRECC")->currentIndex(); if (item_val) { m_bc.bc.setSecurityLevel(item_val); diff --git a/frontend_qt/mainwindow.h b/frontend_qt/mainwindow.h index c73c9280..f8123fea 100644 --- a/frontend_qt/mainwindow.h +++ b/frontend_qt/mainwindow.h @@ -80,8 +80,8 @@ public: RSS14STACK = 79, RSS14STACK_OMNI = 80, HANXIN = 116, - ITF14 = 89, ISBNX = 69, + ITF14 = 89, JAPANPOST = 76, KOREAPOST = 77, LOGMARS = 50, @@ -104,9 +104,9 @@ public: TELEPEN_NUM = 87, PLESSEY = 86, ULTRA = 144, - UPNQR = 143, UPCA = 34, UPCE = 37, + UPNQR = 143, ONECODE = 85, VIN = 73 };