From bee5f08f50508298edcdeab076b089e9fd6d8868 Mon Sep 17 00:00:00 2001 From: gitlost Date: Mon, 21 Dec 2020 19:30:07 +0000 Subject: [PATCH] #209 rss.c, composite.c; DBAR_EXP encodation methods; symbol NO_PNG out.gif --- backend/codablock.c | 13 +- backend/code128.c | 58 +- backend/common.c | 2 + backend/common.h | 1 + backend/composite.c | 763 ++++++++---------- backend/general_field.c | 88 +- backend/general_field.h | 5 +- backend/gs1.c | 21 +- backend/gs1.h | 5 +- backend/library.c | 44 +- backend/rss.c | 625 ++++++-------- backend/tests/test_composite.c | 89 ++ backend/tests/test_gs1.c | 4 +- backend/tests/test_library.c | 5 + backend/tests/test_rss.c | 217 +++-- backend/tests/test_upcean.c | 93 ++- backend/tests/testcommon.c | 45 +- backend/tests/testcommon.h | 10 +- .../tests/tools/bwipp_dump-barcode.ps.diff | 67 +- backend/tests/tools/bwipp_dump.ps.tar.xz | Bin 117128 -> 117252 bytes backend/upcean.c | 405 +++++----- backend/zint.h | 2 +- frontend/main.c | 2 +- frontend/tests/test_args.c | 2 +- 24 files changed, 1309 insertions(+), 1257 deletions(-) diff --git a/backend/codablock.c b/backend/codablock.c index d45fe7e7..bc869ecc 100644 --- a/backend/codablock.c +++ b/backend/codablock.c @@ -40,7 +40,7 @@ #include #include "common.h" -INTERNAL int code_128(struct zint_symbol *symbol, const unsigned char source[], const size_t length); +INTERNAL int code_128(struct zint_symbol *symbol, unsigned char source[], int length); #define uchar unsigned char @@ -627,7 +627,7 @@ static void SumASCII(uchar **ppOutPos, int Sum, int CharacterSet) /* Main function called by zint framework */ -INTERNAL int codablock(struct zint_symbol *symbol,const unsigned char source[], const size_t length) { +INTERNAL int codablock(struct zint_symbol *symbol, unsigned char source[], int length) { int charCur, dataLength; int error_number; int rows, columns, useColumns; @@ -685,7 +685,7 @@ INTERNAL int codablock(struct zint_symbol *symbol,const unsigned char source[], dataLength++; } /* Replace all Codes>127 with Code-128 */ - for (charCur = 0; charCur < (int) length; charCur++) { + for (charCur = 0; charCur < length; charCur++) { if (source[charCur]>127) { data[dataLength] = aFNC4; @@ -710,7 +710,7 @@ INTERNAL int codablock(struct zint_symbol *symbol,const unsigned char source[], /* nor row nor column count given */ if (rows <= 0 && columns <= 0) { /* use 1/1 aspect/ratio Codablock */ - columns = floor(sqrt(dataLength)) + 5; + columns = (int) floor(sqrt(dataLength)) + 5; if (columns > 67) { columns = 67; } else if (columns < 9) { @@ -738,7 +738,7 @@ INTERNAL int codablock(struct zint_symbol *symbol,const unsigned char source[], /* Data Check Characters K1 and K2, Annex F */ Sum1 = Sum2 = 0; - for (charCur = 0; charCur < (int) length; charCur++) { + for (charCur = 0; charCur < length; charCur++) { Sum1 = (Sum1 + (charCur + 1) * source[charCur]) % 86; /* Mod as we go along to avoid overflow */ Sum2 = (Sum2 + charCur * source[charCur]) % 86; } @@ -885,7 +885,8 @@ INTERNAL int codablock(struct zint_symbol *symbol,const unsigned char source[], A2C128_C(&pOutPos,aFNC1,'\0'); else { - A2C128_C(&pOutPos, data[charCur], charCur + 1 < dataLength ? data[charCur + 1] : 0); + A2C128_C(&pOutPos, data[charCur], + (uchar) (charCur + 1 < dataLength ? data[charCur + 1] : 0)); ++charCur; /* We need this here to get the good index */ /* for the termination flags in Set. */ diff --git a/backend/code128.c b/backend/code128.c index 4854b8e7..33abbb5a 100644 --- a/backend/code128.c +++ b/backend/code128.c @@ -209,7 +209,7 @@ INTERNAL void dxsmooth(int list[2][C128_MAX], int *indexliste) { * Translate Code 128 Set A characters into barcodes. * This set handles all control characters NUL to US. */ -static void c128_set_a(unsigned char source, char dest[], int values[], int *bar_chars) { +static void c128_set_a(const unsigned char source, char dest[], int values[], int *bar_chars) { if (source > 127) { if (source < 160) { @@ -236,7 +236,7 @@ static void c128_set_a(unsigned char source, char dest[], int values[], int *bar * This set handles all characters which are not part of long numbers and not * control characters. */ -static void c128_set_b(unsigned char source, char dest[], int values[], int *bar_chars) { +static void c128_set_b(const unsigned char source, char dest[], int values[], int *bar_chars) { if (source > 127) { strcat(dest, C128Table[source - 32 - 128]); values[(*bar_chars)] = source - 32 - 128; @@ -250,7 +250,8 @@ static void c128_set_b(unsigned char source, char dest[], int values[], int *bar /* Translate Code 128 Set C characters into barcodes * This set handles numbers in a compressed form */ -static void c128_set_c(unsigned char source_a, unsigned char source_b, char dest[], int values[], int *bar_chars) { +static void c128_set_c(const unsigned char source_a, const unsigned char source_b, char dest[], int values[], + int *bar_chars) { int weight; weight = (10 * ctoi(source_a)) + ctoi(source_b); @@ -260,7 +261,8 @@ static void c128_set_c(unsigned char source_a, unsigned char source_b, char dest } /* Treats source as ISO 8859-1 and copies into symbol->text, converting to UTF-8. Returns length of symbol->text */ -STATIC_UNLESS_ZINT_TEST int hrt_cpy_iso8859_1(struct zint_symbol *symbol, const unsigned char *source, int source_len) { +STATIC_UNLESS_ZINT_TEST int hrt_cpy_iso8859_1(struct zint_symbol *symbol, const unsigned char *source, + const int source_len) { int i, j; for (i = 0, j = 0; i < source_len && j < (int) sizeof(symbol->text); i++) { @@ -293,7 +295,7 @@ STATIC_UNLESS_ZINT_TEST int hrt_cpy_iso8859_1(struct zint_symbol *symbol, const } /* Handle Code 128, 128B and HIBC 128 */ -INTERNAL int code_128(struct zint_symbol *symbol, const unsigned char source[], const size_t length) { +INTERNAL int code_128(struct zint_symbol *symbol, unsigned char source[], int length) { int i, j, k, values[C128_MAX] = {0}, bar_characters, read, total_sum; int error_number, indexchaine, indexliste, f_state; int sourcelen; @@ -445,40 +447,40 @@ INTERNAL int code_128(struct zint_symbol *symbol, const unsigned char source[], /* Now we can calculate how long the barcode is going to be - and stop it from being too long */ last_set = set[0]; - glyph_count = 0.0; + glyph_count = 0.0f; for (i = 0; i < sourcelen; i++) { if ((set[i] == 'a') || (set[i] == 'b')) { - glyph_count = glyph_count + 1.0; + glyph_count = glyph_count + 1.0f; } if ((fset[i] == 'f') || (fset[i] == 'n')) { - glyph_count = glyph_count + 1.0; + glyph_count = glyph_count + 1.0f; } if (((set[i] == 'A') || (set[i] == 'B')) || (set[i] == 'C')) { if (set[i] != last_set) { last_set = set[i]; - glyph_count = glyph_count + 1.0; + glyph_count = glyph_count + 1.0f; } } if (i == 0) { if (fset[i] == 'F') { - glyph_count = glyph_count + 2.0; + glyph_count = glyph_count + 2.0f; } } else { if ((fset[i] == 'F') && (fset[i - 1] != 'F')) { - glyph_count = glyph_count + 2.0; + glyph_count = glyph_count + 2.0f; } if ((fset[i] != 'F') && (fset[i - 1] == 'F')) { - glyph_count = glyph_count + 2.0; + glyph_count = glyph_count + 2.0f; } } if (set[i] == 'C') { - glyph_count = glyph_count + 0.5; + glyph_count = glyph_count + 0.5f; } else { - glyph_count = glyph_count + 1.0; + glyph_count = glyph_count + 1.0f; } } - if (glyph_count > 60.0) { + if (glyph_count > 60.0f) { strcpy(symbol->errtxt, "341: Input too long"); return ZINT_ERROR_TOO_LONG; } @@ -696,7 +698,7 @@ INTERNAL int code_128(struct zint_symbol *symbol, const unsigned char source[], } /* Handle EAN-128 (Now known as GS1-128) */ -INTERNAL int ean_128(struct zint_symbol *symbol, unsigned char source[], const size_t length) { +INTERNAL int ean_128(struct zint_symbol *symbol, unsigned char source[], int length) { int i, j, values[C128_MAX] = {0}, bar_characters, read, total_sum; int error_number, indexchaine, indexliste; int list[2][C128_MAX] = {{0}}; @@ -706,9 +708,9 @@ INTERNAL int ean_128(struct zint_symbol *symbol, unsigned char source[], const s int separator_row, linkage_flag, c_count; int reduced_length; #ifndef _MSC_VER - char reduced[length + 1]; + unsigned char reduced[length + 1]; #else - char* reduced = (char*) _alloca(length + 1); + unsigned char *reduced = (unsigned char *) _alloca(length + 1); #endif strcpy(dest, ""); @@ -735,7 +737,7 @@ INTERNAL int ean_128(struct zint_symbol *symbol, unsigned char source[], const s if (error_number != 0) { return error_number; } - reduced_length = strlen(reduced); + reduced_length = (int) ustrlen(reduced); /* Decide on mode using same system as PDF417 and rules of ISO 15417 Annex E */ indexliste = 0; @@ -832,25 +834,25 @@ INTERNAL int ean_128(struct zint_symbol *symbol, unsigned char source[], const s /* Now we can calculate how long the barcode is going to be - and stop it from being too long */ last_set = set[0]; - glyph_count = 0.0; + glyph_count = 0.0f; for (i = 0; i < reduced_length; i++) { if ((set[i] == 'a') || (set[i] == 'b')) { - glyph_count = glyph_count + 1.0; + glyph_count = glyph_count + 1.0f; } if (((set[i] == 'A') || (set[i] == 'B')) || (set[i] == 'C')) { if (set[i] != last_set) { last_set = set[i]; - glyph_count = glyph_count + 1.0; + glyph_count = glyph_count + 1.0f; } } if ((set[i] == 'C') && (reduced[i] != '[')) { - glyph_count = glyph_count + 0.5; + glyph_count = glyph_count + 0.5f; } else { - glyph_count = glyph_count + 1.0; + glyph_count = glyph_count + 1.0f; } } - if (glyph_count > 60.0) { + if (glyph_count > 60.0f) { strcpy(symbol->errtxt, "344: Input too long"); return ZINT_ERROR_TOO_LONG; } @@ -1006,7 +1008,7 @@ INTERNAL int ean_128(struct zint_symbol *symbol, unsigned char source[], const s } } - for (i = 0; i < (int) length; i++) { + for (i = 0; i < length; i++) { if ((source[i] != '[') && (source[i] != ']')) { symbol->text[i] = source[i]; } @@ -1059,7 +1061,7 @@ INTERNAL int nve_18(struct zint_symbol *symbol, unsigned char source[], int leng ean128_equiv[21] = itoc(nve_check); ean128_equiv[22] = '\0'; - error_number = ean_128(symbol, ean128_equiv, ustrlen(ean128_equiv)); + error_number = ean_128(symbol, ean128_equiv, (int) ustrlen(ean128_equiv)); return error_number; } @@ -1101,7 +1103,7 @@ INTERNAL int ean_14(struct zint_symbol *symbol, unsigned char source[], int leng ean128_equiv[17] = itoc(check_digit); ean128_equiv[18] = '\0'; - error_number = ean_128(symbol, ean128_equiv, ustrlen(ean128_equiv)); + error_number = ean_128(symbol, ean128_equiv, (int) ustrlen(ean128_equiv)); return error_number; } diff --git a/backend/common.c b/backend/common.c index d2befb5e..891b6379 100644 --- a/backend/common.c +++ b/backend/common.c @@ -30,7 +30,9 @@ SUCH DAMAGE. */ /* vim: set ts=4 sw=4 et : */ +#ifdef ZINT_TEST #include +#endif #ifdef _MSC_VER #include #endif diff --git a/backend/common.h b/backend/common.h index 68b244b7..a8ba5bb6 100644 --- a/backend/common.h +++ b/backend/common.h @@ -55,6 +55,7 @@ #define ustrlen(source) strlen((const char *) (source)) #define ustrcpy(target, source) strcpy((char *) (target), (const char *) (source)) #define ustrcat(target, source) strcat((char *) (target), (const char *) (source)) +#define ustrncat(target, source, count) strncat((char *) (target), (const char *) (source), (count)) #if defined(__GNUC__) && !defined(_WIN32) && !defined(ZINT_TEST) #define INTERNAL __attribute__ ((visibility ("hidden"))) diff --git a/backend/composite.c b/backend/composite.c index 30c7a7f0..6e7a03e2 100644 --- a/backend/composite.c +++ b/backend/composite.c @@ -64,13 +64,15 @@ #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); -INTERNAL void ean_leading_zeroes(struct zint_symbol *symbol, unsigned char source[], unsigned char local_source[], int *p_with_addon); +INTERNAL int ean_128(struct zint_symbol *symbol, unsigned char source[], int length); +INTERNAL void ean_leading_zeroes(struct zint_symbol *symbol, const unsigned char source[], + unsigned char local_source[], int *p_with_addon); INTERNAL int rss14(struct zint_symbol *symbol, unsigned char source[], int length); INTERNAL int rsslimited(struct zint_symbol *symbol, unsigned char source[], int length); INTERNAL int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int length); +INTERNAL int rss_date(const unsigned char source[], const int src_posn); -static int _min(int first, int second) { +static int _min(const int first, const int second) { if (first <= second) return first; @@ -79,12 +81,12 @@ static int _min(int first, int second) { } /* gets bit in bitString at bitPos */ -static int getBit(UINT *bitStr, int bitPos) { +static int getBit(const UINT *bitStr, const int bitPos) { return !!(bitStr[bitPos >> 4] & (0x8000 >> (bitPos & 15))); } /* converts bit string to base 928 values, codeWords[0] is highest order */ -static int encode928(UINT bitString[], UINT codeWords[], int bitLng) { +static int encode928(const UINT bitString[], UINT codeWords[], const int bitLng) { int i, j, b, cwNdx, cwLng; for (cwNdx = cwLng = b = 0; b < bitLng; b += 69, cwNdx += 7) { int bitCnt = _min(bitLng - b, 69); @@ -100,49 +102,37 @@ static int encode928(UINT bitString[], UINT codeWords[], int bitLng) { } for (i = cwCnt - 1; i > 0; i--) { /* add "carries" */ - codeWords[cwNdx + i - 1] += codeWords[cwNdx + i] / 928L; - codeWords[cwNdx + i] %= 928L; + codeWords[cwNdx + i - 1] += codeWords[cwNdx + i] / 928; + codeWords[cwNdx + i] %= 928; } } return (cwLng); } /* CC-A 2D component */ -static int cc_a(struct zint_symbol *symbol, char source[], int cc_width) { +static int cc_a(struct zint_symbol *symbol, const char source[], const int cc_width) { int i, segment, bitlen, cwCnt, variant, rows; - int k, offset, j, total, rsCodeWords[8]; + int k, offset, j, total, rsCodeWords[8] = {0}; int LeftRAPStart, RightRAPStart, CentreRAPStart, StartCluster; - int LeftRAP, RightRAP, CentreRAP, Cluster, dummy[5]; + int LeftRAP, RightRAP, CentreRAP, Cluster; int loop; - UINT codeWords[28]; - UINT bitStr[13]; + UINT codeWords[28] = {0}; + UINT bitStr[13] = {0}; char pattern[580]; - char local_source[210]; /* A copy of source but with padding zeroes to make 208 bits */ + int bp = 0; variant = 0; - for (i = 0; i < 13; i++) { - bitStr[i] = 0; - } - for (i = 0; i < 28; i++) { - codeWords[i] = 0; - } - bitlen = (int)strlen(source); - for (i = 0; i < 208; i++) { - local_source[i] = '0'; - } - for (i = 0; i < bitlen; i++) { - local_source[i] = source[i]; - } - local_source[208] = '\0'; - for (segment = 0; segment < 13; segment++) { int strpos = segment * 16; - for (i = 0; i < 16; i++) { - if (local_source[strpos + i] == '1') { - bitStr[segment] += (0x8000 >> i); + if (strpos >= bitlen) { + break; + } + for (i = 0; i < 16 && strpos + i < bitlen; i++) { + if (source[strpos + i] == '1') { + bitStr[segment] |= (0x8000 >> i); } } } @@ -205,9 +195,6 @@ static int cc_a(struct zint_symbol *symbol, char source[], int cc_width) { /* Reed-Solomon error correction */ - for (i = 0; i < 8; i++) { - rsCodeWords[i] = 0; - } for (i = 0; i < cwCnt; i++) { total = (codeWords[i] + rsCodeWords[k - 1]) % 929; for (j = k - 1; j >= 0; j--) { @@ -242,50 +229,44 @@ static int cc_a(struct zint_symbol *symbol, char source[], int cc_width) { Cluster = StartCluster; /* Cluster can be 0, 1 or 2 for Cluster(0), Cluster(3) and Cluster(6) */ for (i = 0; i < rows; i++) { - strcpy(pattern, ""); + bp = 0; offset = 929 * Cluster; - for (j = 0; j < 5; j++) { - dummy[j] = 0; - } - for (j = 0; j < cc_width; j++) { - dummy[j + 1] = codeWords[i * cc_width + j]; - } + k = i * cc_width; /* Copy the data into codebarre */ if (cc_width != 3) { - bin_append(rap_side[LeftRAP - 1], 10, pattern); - } - bin_append(pdf_bitpattern[offset + dummy[1]], 16, pattern); - strcat(pattern, "0"); - if (cc_width == 3) { - bin_append(rap_centre[CentreRAP - 1], 10, pattern); + bp = bin_append_posn(rap_side[LeftRAP - 1], 10, pattern, bp); } + bp = bin_append_posn(pdf_bitpattern[offset + codeWords[k]], 16, pattern, bp); + pattern[bp++] = '0'; if (cc_width >= 2) { - bin_append(pdf_bitpattern[offset + dummy[2]], 16, pattern); - strcat(pattern, "0"); + if (cc_width == 3) { + bp = bin_append_posn(rap_centre[CentreRAP - 1], 10, pattern, bp); + } + bp = bin_append_posn(pdf_bitpattern[offset + codeWords[k + 1]], 16, pattern, bp); + pattern[bp++] = '0'; + if (cc_width >= 3) { + if (cc_width == 4) { + bp = bin_append_posn(rap_centre[CentreRAP - 1], 10, pattern, bp); + } + bp = bin_append_posn(pdf_bitpattern[offset + codeWords[k + 2]], 16, pattern, bp); + pattern[bp++] = '0'; + if (cc_width == 4) { + bp = bin_append_posn(pdf_bitpattern[offset + codeWords[k + 3]], 16, pattern, bp); + pattern[bp++] = '0'; + } + } } - if (cc_width == 4) { - bin_append(rap_centre[CentreRAP - 1], 10, pattern); - } - if (cc_width >= 3) { - bin_append(pdf_bitpattern[offset + dummy[3]], 16, pattern); - strcat(pattern, "0"); - } - if (cc_width == 4) { - bin_append(pdf_bitpattern[offset + dummy[4]], 16, pattern); - strcat(pattern, "0"); - } - bin_append(rap_side[RightRAP - 1], 10, pattern); - strcat(pattern, "1"); /* stop */ + bp = bin_append_posn(rap_side[RightRAP - 1], 10, pattern, bp); + pattern[bp++] = '1'; /* stop */ /* so now pattern[] holds the string of '1's and '0's. - copy this to the symbol */ - for (loop = 0; loop < (int) strlen(pattern); loop++) { + for (loop = 0; loop < bp; loop++) { if (pattern[loop] == '1') { set_module(symbol, i, loop); } } symbol->row_height[i] = 2; symbol->rows++; - symbol->width = strlen(pattern); /* Set up RAPs and Cluster for next row */ LeftRAP++; @@ -306,6 +287,7 @@ static int cc_a(struct zint_symbol *symbol, char source[], int cc_width) { Cluster = 0; } } + symbol->width = bp; if (symbol->debug & ZINT_DEBUG_PRINT) { printf("CC-A Columns: %d, Rows: %d\n", cc_width, symbol->rows); @@ -315,22 +297,22 @@ static int cc_a(struct zint_symbol *symbol, char source[], int cc_width) { } /* CC-B 2D component */ -static int cc_b(struct zint_symbol *symbol, char source[], int cc_width) { - int length, i; +static int cc_b(struct zint_symbol *symbol, const char source[], const int cc_width) { + int length = (int) strlen(source) / 8; + int i; #ifndef _MSC_VER - unsigned char data_string[(strlen(source) / 8) + 3]; + unsigned char data_string[length + 3]; #else - unsigned char *data_string = (unsigned char *) _alloca((strlen(source) / 8) + 3); + unsigned char *data_string = (unsigned char *) _alloca(length + 3); #endif int chainemc[180], mclength; - int k, j, p, longueur, mccorrection[50], offset; - int total, dummy[5]; + int k, j, p, longueur, mccorrection[50] = {0}, offset; + int total; char pattern[580]; int variant, LeftRAPStart, CentreRAPStart, RightRAPStart, StartCluster; int LeftRAP, CentreRAP, RightRAP, Cluster, loop; int columns; - - length = strlen(source) / 8; + int bp = 0; for (i = 0; i < length; i++) { int binloc = i * 8; @@ -338,12 +320,11 @@ static int cc_b(struct zint_symbol *symbol, char source[], int cc_width) { data_string[i] = 0; for (p = 0; p < 8; p++) { if (source[binloc + p] == '1') { - data_string[i] += (0x80 >> p); + data_string[i] |= (0x80 >> p); } } } - mclength = 0; /* "the CC-B component shall have codeword 920 in the first symbol character position" (section 9a) */ @@ -357,89 +338,66 @@ static int cc_b(struct zint_symbol *symbol, char source[], int cc_width) { variant = 0; if (cc_width == 2) { - variant = 13; - if (mclength <= 33) { - variant = 12; - } - if (mclength <= 29) { - variant = 11; - } - if (mclength <= 24) { - variant = 10; - } - if (mclength <= 19) { - variant = 9; - } - if (mclength <= 13) { - variant = 8; - } if (mclength <= 8) { variant = 7; + } else if (mclength <= 13) { + variant = 8; + } else if (mclength <= 19) { + variant = 9; + } else if (mclength <= 24) { + variant = 10; + } else if (mclength <= 29) { + variant = 11; + } else if (mclength <= 33) { + variant = 12; + } else { + variant = 13; } - } - - if (cc_width == 3) { - variant = 23; - if (mclength <= 70) { - variant = 22; - } - if (mclength <= 58) { - variant = 21; - } - if (mclength <= 46) { - variant = 20; - } - if (mclength <= 34) { - variant = 19; - } - if (mclength <= 24) { - variant = 18; - } - if (mclength <= 18) { - variant = 17; - } - if (mclength <= 14) { - variant = 16; - } - if (mclength <= 10) { - variant = 15; - } + } else if (cc_width == 3) { if (mclength <= 6) { variant = 14; + } else if (mclength <= 10) { + variant = 15; + } else if (mclength <= 14) { + variant = 16; + } else if (mclength <= 18) { + variant = 17; + } else if (mclength <= 24) { + variant = 18; + } else if (mclength <= 34) { + variant = 19; + } else if (mclength <= 46) { + variant = 20; + } else if (mclength <= 58) { + variant = 21; + } else if (mclength <= 70) { + variant = 22; + } else { + variant = 23; } - } - - if (cc_width == 4) { - variant = 34; - if (mclength <= 108) { - variant = 33; - } - if (mclength <= 90) { - variant = 32; - } - if (mclength <= 72) { - variant = 31; - } - if (mclength <= 54) { - variant = 30; - } - if (mclength <= 39) { - variant = 29; - } - if (mclength <= 30) { - variant = 28; - } - if (mclength <= 24) { - variant = 27; - } - if (mclength <= 18) { - variant = 26; - } - if (mclength <= 12) { - variant = 25; - } + } else if (cc_width == 4) { if (mclength <= 8) { variant = 24; + } else if (mclength <= 12) { + variant = 25; + } else if (mclength <= 18) { + variant = 26; + } else if (mclength <= 24) { + variant = 27; + } else if (mclength <= 30) { + variant = 28; + } else if (mclength <= 39) { + variant = 29; + } else if (mclength <= 54) { + variant = 30; + } else if (mclength <= 72) { + variant = 31; + } else if (mclength <= 90) { + variant = 32; + } else if (mclength <= 108) { + variant = 33; + } else { + variant = 34; } } @@ -462,9 +420,6 @@ static int cc_b(struct zint_symbol *symbol, char source[], int cc_width) { /* Reed-Solomon error correction */ longueur = mclength; - for (loop = 0; loop < 50; loop++) { - mccorrection[loop] = 0; - } for (i = 0; i < longueur; i++) { total = (chainemc[i] + mccorrection[k - 1]) % 929; for (j = k - 1; j >= 0; j--) { @@ -502,47 +457,41 @@ static int cc_b(struct zint_symbol *symbol, char source[], int cc_width) { /* Cluster can be 0, 1 or 2 for Cluster(0), Cluster(3) and Cluster(6) */ for (i = 0; i < symbol->rows; i++) { - strcpy(pattern, ""); + bp = 0; offset = 929 * Cluster; - for (j = 0; j < 5; j++) { - dummy[j] = 0; - } - for (j = 0; j < columns; j++) { - dummy[j + 1] = chainemc[i * columns + j]; - } + k = i * columns; /* Copy the data into codebarre */ - bin_append(rap_side[LeftRAP - 1], 10, pattern); - bin_append(pdf_bitpattern[offset + dummy[1]], 16, pattern); - strcat(pattern, "0"); - if (cc_width == 3) { - bin_append(rap_centre[CentreRAP - 1], 10, pattern); - } + bp = bin_append_posn(rap_side[LeftRAP - 1], 10, pattern, bp); + bp = bin_append_posn(pdf_bitpattern[offset + chainemc[k]], 16, pattern, bp); + pattern[bp++] = '0'; if (cc_width >= 2) { - bin_append(pdf_bitpattern[offset + dummy[2]], 16, pattern); - strcat(pattern, "0"); + if (cc_width == 3) { + bp = bin_append_posn(rap_centre[CentreRAP - 1], 10, pattern, bp); + } + bp = bin_append_posn(pdf_bitpattern[offset + chainemc[k + 1]], 16, pattern, bp); + pattern[bp++] = '0'; + if (cc_width >= 3) { + if (cc_width == 4) { + bp = bin_append_posn(rap_centre[CentreRAP - 1], 10, pattern, bp); + } + bp = bin_append_posn(pdf_bitpattern[offset + chainemc[k + 2]], 16, pattern, bp); + pattern[bp++] = '0'; + if (cc_width == 4) { + bp = bin_append_posn(pdf_bitpattern[offset + chainemc[k + 3]], 16, pattern, bp); + pattern[bp++] = '0'; + } + } } - if (cc_width == 4) { - bin_append(rap_centre[CentreRAP - 1], 10, pattern); - } - if (cc_width >= 3) { - bin_append(pdf_bitpattern[offset + dummy[3]], 16, pattern); - strcat(pattern, "0"); - } - if (cc_width == 4) { - bin_append(pdf_bitpattern[offset + dummy[4]], 16, pattern); - strcat(pattern, "0"); - } - bin_append(rap_side[RightRAP - 1], 10, pattern); - strcat(pattern, "1"); /* stop */ + bp = bin_append_posn(rap_side[RightRAP - 1], 10, pattern, bp); + pattern[bp++] = '1'; /* stop */ /* so now pattern[] holds the string of '1's and '0's. - copy this to the symbol */ - for (loop = 0; loop < (int) strlen(pattern); loop++) { + for (loop = 0; loop < bp; loop++) { if (pattern[loop] == '1') { set_module(symbol, i, loop); } } symbol->row_height[i] = 2; - symbol->width = strlen(pattern); /* Set up RAPs and Cluster for next row */ LeftRAP++; @@ -563,6 +512,7 @@ static int cc_b(struct zint_symbol *symbol, char source[], int cc_width) { Cluster = 0; } } + symbol->width = bp; if (symbol->debug & ZINT_DEBUG_PRINT) { printf("CC-B Columns: %d, Rows: %d\n", cc_width, symbol->rows); @@ -572,19 +522,19 @@ static int cc_b(struct zint_symbol *symbol, char source[], int cc_width) { } /* CC-C 2D component - byte compressed PDF417 */ -static int cc_c(struct zint_symbol *symbol, char source[], int cc_width, int ecc_level) { - int length, i, p; +static int cc_c(struct zint_symbol *symbol, const char source[], const int cc_width, const int ecc_level) { + int length = (int) strlen(source) / 8; + int i, p; #ifndef _MSC_VER - unsigned char data_string[(strlen(source) / 8) + 4]; + unsigned char data_string[length + 4]; #else - unsigned char *data_string = (unsigned char *) _alloca((strlen(source) / 8) + 4); + unsigned char *data_string = (unsigned char *) _alloca(length + 4); #endif int chainemc[1000], mclength, k; - int offset, longueur, loop, total, j, mccorrection[520]; + int offset, longueur, loop, total, j, mccorrection[520] = {0}; int c1, c2, c3, dummy[35]; char pattern[580]; - - length = strlen(source) / 8; + int bp = 0; for (i = 0; i < length; i++) { int binloc = i * 8; @@ -592,7 +542,7 @@ static int cc_c(struct zint_symbol *symbol, char source[], int cc_width, int ecc data_string[i] = 0; for (p = 0; p < 8; p++) { if (source[binloc + p] == '1') { - data_string[i] += (0x80 >> p); + data_string[i] |= (0x80 >> p); } } } @@ -636,9 +586,6 @@ static int cc_c(struct zint_symbol *symbol, char source[], int cc_width, int ecc } longueur = mclength; - for (loop = 0; loop < 520; loop++) { - mccorrection[loop] = 0; - } for (i = 0; i < longueur; i++) { total = (chainemc[i] + mccorrection[k - 1]) % 929; for (j = k - 1; j >= 0; j--) { @@ -662,12 +609,13 @@ static int cc_c(struct zint_symbol *symbol, char source[], int cc_width, int ecc } /* 818 - The CW string is finished */ - c1 = (mclength / cc_width - 1) / 3; - c2 = ecc_level * 3 + (mclength / cc_width - 1) % 3; + symbol->rows = mclength / cc_width; + c1 = (symbol->rows - 1) / 3; + c2 = ecc_level * 3 + (symbol->rows - 1) % 3; c3 = cc_width - 1; /* we now encode each row */ - for (i = 0; i <= (mclength / cc_width) - 1; i++) { + for (i = 0; i <= symbol->rows - 1; i++) { for (j = 0; j < cc_width; j++) { dummy[j + 1] = chainemc[i * cc_width + j]; } @@ -689,24 +637,23 @@ static int cc_c(struct zint_symbol *symbol, char source[], int cc_width, int ecc offset = 1858; /* cluster(6) */ break; } - strcpy(pattern, ""); - bin_append(0x1FEA8, 17, pattern); /* Row start */ + bp = 0; + bp = bin_append_posn(0x1FEA8, 17, pattern, bp); /* Row start */ for (j = 0; j <= cc_width + 1; j++) { - bin_append(pdf_bitpattern[offset + dummy[j]], 16, pattern); - strcat(pattern, "0"); + bp = bin_append_posn(pdf_bitpattern[offset + dummy[j]], 16, pattern, bp); + pattern[bp++] = '0'; } - bin_append(0x3FA29, 18, pattern); /* Row Stop */ + bp = bin_append_posn(0x3FA29, 18, pattern, bp); /* Row Stop */ - for (loop = 0; loop < (int) strlen(pattern); loop++) { + for (loop = 0; loop < bp; loop++) { if (pattern[loop] == '1') { set_module(symbol, i, loop); } } symbol->row_height[i] = 3; } - symbol->rows = (mclength / cc_width); - symbol->width = (int)strlen(pattern); + symbol->width = bp; if (symbol->debug & ZINT_DEBUG_PRINT) { printf("CC-C Columns: %d, Rows: %d\n", cc_width, symbol->rows); @@ -715,65 +662,51 @@ static int cc_c(struct zint_symbol *symbol, char source[], int cc_width, int ecc return 0; } -static int calc_padding_cca(int binary_length, int cc_width) { +static int calc_padding_cca(const int binary_length, const int cc_width) { int target_bitsize = 0; switch (cc_width) { case 2: - if (binary_length <= 167) { - target_bitsize = 167; - } - if (binary_length <= 138) { - target_bitsize = 138; - } - if (binary_length <= 118) { - target_bitsize = 118; - } - if (binary_length <= 108) { - target_bitsize = 108; - } - if (binary_length <= 88) { - target_bitsize = 88; - } - if (binary_length <= 78) { - target_bitsize = 78; - } if (binary_length <= 59) { target_bitsize = 59; + } else if (binary_length <= 78) { + target_bitsize = 78; + } else if (binary_length <= 88) { + target_bitsize = 88; + } else if (binary_length <= 108) { + target_bitsize = 108; + } else if (binary_length <= 118) { + target_bitsize = 118; + } else if (binary_length <= 138) { + target_bitsize = 138; + } else if (binary_length <= 167) { + target_bitsize = 167; } break; case 3: - if (binary_length <= 167) { - target_bitsize = 167; - } - if (binary_length <= 138) { - target_bitsize = 138; - } - if (binary_length <= 118) { - target_bitsize = 118; - } - if (binary_length <= 98) { - target_bitsize = 98; - } if (binary_length <= 78) { target_bitsize = 78; + } else if (binary_length <= 98) { + target_bitsize = 98; + } else if (binary_length <= 118) { + target_bitsize = 118; + } else if (binary_length <= 138) { + target_bitsize = 138; + } else if (binary_length <= 167) { + target_bitsize = 167; } break; case 4: - if (binary_length <= 197) { - target_bitsize = 197; - } - if (binary_length <= 167) { - target_bitsize = 167; - } - if (binary_length <= 138) { - target_bitsize = 138; - } - if (binary_length <= 108) { - target_bitsize = 108; - } if (binary_length <= 78) { target_bitsize = 78; + } else if (binary_length <= 108) { + target_bitsize = 108; + } else if (binary_length <= 138) { + target_bitsize = 138; + } else if (binary_length <= 167) { + target_bitsize = 167; + } else if (binary_length <= 197) { + target_bitsize = 197; } break; } @@ -781,98 +714,73 @@ static int calc_padding_cca(int binary_length, int cc_width) { return target_bitsize; } -static int calc_padding_ccb(int binary_length, int cc_width) { +static int calc_padding_ccb(const int binary_length, const int cc_width) { int target_bitsize = 0; switch (cc_width) { case 2: - if (binary_length <= 336) { - target_bitsize = 336; - } - if (binary_length <= 296) { - target_bitsize = 296; - } - if (binary_length <= 256) { - target_bitsize = 256; - } - if (binary_length <= 208) { - target_bitsize = 208; - } - if (binary_length <= 160) { - target_bitsize = 160; - } - if (binary_length <= 104) { - target_bitsize = 104; - } if (binary_length <= 56) { target_bitsize = 56; + } else if (binary_length <= 104) { + target_bitsize = 104; + } else if (binary_length <= 160) { + target_bitsize = 160; + } else if (binary_length <= 208) { + target_bitsize = 208; + } else if (binary_length <= 256) { + target_bitsize = 256; + } else if (binary_length <= 296) { + target_bitsize = 296; + } else if (binary_length <= 336) { + target_bitsize = 336; } break; case 3: - if (binary_length <= 768) { - target_bitsize = 768; - } - if (binary_length <= 648) { - target_bitsize = 648; - } - if (binary_length <= 536) { - target_bitsize = 536; - } - if (binary_length <= 416) { - target_bitsize = 416; - } - if (binary_length <= 304) { - target_bitsize = 304; - } - if (binary_length <= 208) { - target_bitsize = 208; - } - if (binary_length <= 152) { - target_bitsize = 152; - } - if (binary_length <= 112) { - target_bitsize = 112; - } - if (binary_length <= 72) { - target_bitsize = 72; - } if (binary_length <= 32) { target_bitsize = 32; + } else if (binary_length <= 72) { + target_bitsize = 72; + } else if (binary_length <= 112) { + target_bitsize = 112; + } else if (binary_length <= 152) { + target_bitsize = 152; + } else if (binary_length <= 208) { + target_bitsize = 208; + } else if (binary_length <= 304) { + target_bitsize = 304; + } else if (binary_length <= 416) { + target_bitsize = 416; + } else if (binary_length <= 536) { + target_bitsize = 536; + } else if (binary_length <= 648) { + target_bitsize = 648; + } else if (binary_length <= 768) { + target_bitsize = 768; } break; case 4: - if (binary_length <= 1184) { - target_bitsize = 1184; - } - if (binary_length <= 1016) { - target_bitsize = 1016; - } - if (binary_length <= 840) { - target_bitsize = 840; - } - if (binary_length <= 672) { - target_bitsize = 672; - } - if (binary_length <= 496) { - target_bitsize = 496; - } - if (binary_length <= 352) { - target_bitsize = 352; - } - if (binary_length <= 264) { - target_bitsize = 264; - } - if (binary_length <= 208) { - target_bitsize = 208; - } - if (binary_length <= 152) { - target_bitsize = 152; - } - if (binary_length <= 96) { - target_bitsize = 96; - } if (binary_length <= 56) { target_bitsize = 56; + } else if (binary_length <= 96) { + target_bitsize = 96; + } else if (binary_length <= 152) { + target_bitsize = 152; + } else if (binary_length <= 208) { + target_bitsize = 208; + } else if (binary_length <= 264) { + target_bitsize = 264; + } else if (binary_length <= 352) { + target_bitsize = 352; + } else if (binary_length <= 496) { + target_bitsize = 496; + } else if (binary_length <= 672) { + target_bitsize = 672; + } else if (binary_length <= 840) { + target_bitsize = 840; + } else if (binary_length <= 1016) { + target_bitsize = 1016; + } else if (binary_length <= 1184) { + target_bitsize = 1184; } break; } @@ -880,7 +788,7 @@ static int calc_padding_ccb(int binary_length, int cc_width) { return target_bitsize; } -static int calc_padding_ccc(int binary_length, int *cc_width, int lin_width, int *ecc) { +static int calc_padding_ccc(const int binary_length, int *cc_width, const int lin_width, int *ecc) { int target_bitsize = 0; int byte_length, codewords_used, ecc_level, ecc_codewords, rows; int codewords_total, target_codewords, target_bytesize; @@ -918,11 +826,11 @@ static int calc_padding_ccc(int binary_length, int *cc_width, int lin_width, int if (*(cc_width) > 30) { *(cc_width) = 30; } - rows = ceil((double) codewords_used / *(cc_width)); + rows = (int) ceil((double) codewords_used / *(cc_width)); /* stop the symbol from becoming too high */ while (rows > 30 && *(cc_width) < 30) { *(cc_width) = *(cc_width) + 1; - rows = ceil((double) codewords_used / *(cc_width)); + rows = (int) ceil((double) codewords_used / *(cc_width)); } if (rows > 30) { @@ -946,18 +854,20 @@ static int calc_padding_ccc(int binary_length, int *cc_width, int lin_width, int } /* 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) { +static int cc_binary_string(struct zint_symbol *symbol, const unsigned char source[], const int source_len, + char binary_string[], const int cc_mode, int *cc_width, int *ecc, const 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; + int ai90_mode, remainder; + char last_digit = '\0'; int mode; - int source_len = strlen(source); #ifndef _MSC_VER char general_field[source_len + 1]; #else char *general_field = (char *) _alloca(source_len + 1); #endif int target_bitsize; + int bp = 0; int debug = symbol->debug & ZINT_DEBUG_PRINT; encoding_method = 1; @@ -972,53 +882,38 @@ static int cc_binary_string(struct zint_symbol *symbol, const char source[], cha if ((source[0] == '1') && ((source[1] == '0') || (source[1] == '1') || (source[1] == '7'))) { /* Source starts (10), (11) or (17) */ - encoding_method = 2; - } - - if ((source[0] == '9') && (source[1] == '0')) { + if (source[1] == '0' || rss_date(source, 2) >= 0) { /* Check date valid if (11) or (17) */ + encoding_method = 2; + } + } else if ((source[0] == '9') && (source[1] == '0')) { /* Source starts (90) */ encoding_method = 3; } if (encoding_method == 1) { - strcat(binary_string, "0"); + binary_string[bp++] = '0'; if (debug) printf("CC-%c Encodation Method: 0\n", 'A' + (cc_mode - 1)); - } - if (encoding_method == 2) { + } else if (encoding_method == 2) { /* Encoding Method field "10" - date and lot number */ - strcat(binary_string, "10"); + bp = bin_append_posn(2, 2, binary_string, bp); /* "10" */ if (source[1] == '0') { /* No date data */ - strcat(binary_string, "11"); + bp = bin_append_posn(3, 2, binary_string, bp); /* "11" */ read_posn = 2; } else { - long int group_val; /* Production Date (11) or Expiration Date (17) */ - char date_str[4]; - date_str[0] = source[2]; - date_str[1] = source[3]; - date_str[2] = '\0'; - group_val = atoi(date_str) * 384; - date_str[0] = source[4]; - date_str[1] = source[5]; - group_val += (atoi(date_str) - 1) * 32; - - date_str[0] = source[6]; - date_str[1] = source[7]; - group_val += atoi(date_str); - - bin_append(group_val, 16, binary_string); + bp = bin_append_posn(rss_date(source, 2), 16, binary_string, bp); if (source[1] == '1') { /* Production Date AI 11 */ - strcat(binary_string, "0"); + binary_string[bp++] = '0'; } else { /* Expiration Date AI 17 */ - strcat(binary_string, "1"); + binary_string[bp++] = '1'; } read_posn = 8; @@ -1026,21 +921,24 @@ static int cc_binary_string(struct zint_symbol *symbol, const char source[], cha /* Followed by AI 10 - strip this from general field */ read_posn += 2; } else if (source[read_posn]) { - /* ISO/IEC 24723:2010 5.3.1 "If a lot number does not directly follow the date element string, a FNC1 is encoded following the date element string ..." */ + /* ISO/IEC 24723:2010 5.3.1 "If a lot number does not directly follow the date element string, + a FNC1 is encoded following the date element string ..." */ fnc1_latch = 1; } else { /* "... even if no more data follows the date element string" */ - /* So still need FNC1 character but can't do single FNC1 in numeric mode, so insert alphanumeric latch "0000" and alphanumeric FNC1 "01111" - (this implementation detail taken from BWIPP https://github.com/bwipp/postscriptbarcode Copyright (c) 2004-2019 Terry Burton) */ - strcat(binary_string, "000001111"); + /* So still need FNC1 character but can't do single FNC1 in numeric mode, so insert alphanumeric latch + "0000" and alphanumeric FNC1 "01111" (this implementation detail taken from BWIPP + https://github.com/bwipp/postscriptbarcode Copyright (c) 2004-2019 Terry Burton) */ + bp = bin_append_posn(15, 9, binary_string, bp); /* "000001111" */ /* 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 (debug) { + printf("CC-%c Encodation Method: 10, Compaction Field: %.*s\n", 'A' + (cc_mode - 1), read_posn, source); + } - if (encoding_method == 3) { + } else if (encoding_method == 3) { /* Encodation Method field of "11" - AI 90 */ #ifndef _MSC_VER char ninety[source_len + 1]; @@ -1061,7 +959,7 @@ static int cc_binary_string(struct zint_symbol *symbol, const char source[], cha i++; } while ((source_len > i + 2) && ('[' != source[i + 2])); ninety[i] = '\0'; - ninety_len = strlen(ninety); + ninety_len = i; /* Find out if the AI 90 data is alphabetic or numeric or both */ @@ -1109,7 +1007,7 @@ static int cc_binary_string(struct zint_symbol *symbol, const char source[], cha int numeric_value; int table3_letter; /* Encodation method "11" can be used */ - strcat(binary_string, "11"); + bp = bin_append_posn(3, 2, binary_string, bp); /* "11" */ numeric -= test1; alpha--; @@ -1119,15 +1017,17 @@ static int cc_binary_string(struct zint_symbol *symbol, const char source[], cha if (alphanum == 0 && alpha > numeric) { /* Alpha mode */ - strcat(binary_string, "11"); + bp = bin_append_posn(3, 2, binary_string, bp); /* "11" */ ai90_mode = 2; } else if (alphanum == 0 && alpha == 0) { /* Numeric mode */ - strcat(binary_string, "10"); + bp = bin_append_posn(2, 2, binary_string, bp); /* "10" */ ai90_mode = 3; - } else { /* Note if first 4 are digits then it would be shorter to go into NUMERIC mode first; not implemented */ + } 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"); + binary_string[bp++] = '0'; ai90_mode = 1; mode = ALPHANUMERIC; } @@ -1136,7 +1036,8 @@ static int cc_binary_string(struct zint_symbol *symbol, const char source[], cha if (next_ai_posn < source_len && source[next_ai_posn] == '[') { /* There are more AIs afterwards */ - if (next_ai_posn + 2 < source_len && (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; } else if (next_ai_posn + 4 < source_len @@ -1148,12 +1049,12 @@ static int cc_binary_string(struct zint_symbol *symbol, const char source[], cha } switch (ai_crop) { - case 0: strcat(binary_string, "0"); + case 0: binary_string[bp++] = '0'; break; - case 1: strcat(binary_string, "10"); + case 1: bp = bin_append_posn(2, 2, binary_string, bp); /* "10" */ ai_crop_posn = next_ai_posn + 1; break; - case 3: strcat(binary_string, "11"); + case 3: bp = bin_append_posn(3, 2, binary_string, bp); /* "11" */ ai_crop_posn = next_ai_posn + 1; break; } @@ -1177,18 +1078,18 @@ static int cc_binary_string(struct zint_symbol *symbol, const char source[], cha if (table3_letter != -1) { /* Encoding can be done according to 5.3.2 c) 2) */ /* five bit binary string representing value before letter */ - bin_append(numeric_value, 5, binary_string); + bp = bin_append_posn(numeric_value, 5, binary_string, bp); /* followed by four bit representation of letter from Table 3 */ - bin_append(table3_letter, 4, binary_string); + bp = bin_append_posn(table3_letter, 4, binary_string, bp); } else { /* Encoding is done according to 5.3.2 c) 3) */ - bin_append(31, 5, binary_string); + bp = bin_append_posn(31, 5, binary_string, bp); /* ten bit representation of number */ - bin_append(numeric_value, 10, binary_string); + bp = bin_append_posn(numeric_value, 10, binary_string, bp); /* five bit representation of ASCII character */ - bin_append(ninety[test1] - 65, 5, binary_string); + bp = bin_append_posn(ninety[test1] - 65, 5, binary_string, bp); } read_posn = test1 + 3; @@ -1198,13 +1099,13 @@ static int cc_binary_string(struct zint_symbol *symbol, const char source[], cha /* Alpha encodation (section 5.3.3) */ do { if ((source[read_posn] >= 'A') && (source[read_posn] <= 'Z')) { - bin_append(source[read_posn] - 65, 5, binary_string); + bp = bin_append_posn(source[read_posn] - 65, 5, binary_string, bp); } else if ((source[read_posn] >= '0') && (source[read_posn] <= '9')) { - bin_append(source[read_posn] + 4, 6, binary_string); + bp = bin_append_posn(source[read_posn] + 4, 6, binary_string, bp); } else if (source[read_posn] == '[') { - bin_append(31, 5, binary_string); + bp = bin_append_posn(31, 5, binary_string, bp); } read_posn++; @@ -1213,12 +1114,12 @@ static int cc_binary_string(struct zint_symbol *symbol, const char source[], cha } 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)); + printf("CC-%c Encodation Method: 11, Compaction Field: %.*s, Binary: %.*s (%d)\n", + 'A' + (cc_mode - 1), read_posn, source, bp, binary_string, bp); } } else { /* Use general field encodation instead */ - strcat(binary_string, "0"); + binary_string[bp++] = '0'; read_posn = 0; if (debug) printf("CC-%c Encodation Method: 0\n", 'A' + (cc_mode - 1)); } @@ -1249,29 +1150,28 @@ static int cc_binary_string(struct zint_symbol *symbol, const char source[], cha if (debug) { printf("Mode %s, General Field: %.40s%s\n", mode == NUMERIC ? "NUMERIC" : mode == ALPHANUMERIC ? "ALPHANUMERIC" : "ISO646", - general_field, strlen(general_field) > 40 ? "..." : ""); + general_field, j > 40 ? "..." : ""); } - if (strlen(general_field) != 0) { + if (j != 0) { /* If general field not empty */ alpha_pad = 0; + + if (!general_field_encode(general_field, j, &mode, &last_digit, binary_string, &bp)) { + /* Invalid characters in input data */ + strcpy(symbol->errtxt, "441: Invalid characters in input data"); + return ZINT_ERROR_INVALID_DATA; + } } - if (!general_field_encode(general_field, &mode, &last_digit, binary_string)) { - /* Invalid characters in input data */ - strcpy(symbol->errtxt, "441: Invalid characters in input data"); - return ZINT_ERROR_INVALID_DATA; - } - - binary_length = (int)strlen(binary_string); switch (cc_mode) { case 1: - target_bitsize = calc_padding_cca(binary_length, *(cc_width)); + target_bitsize = calc_padding_cca(bp, *(cc_width)); break; case 2: - target_bitsize = calc_padding_ccb(binary_length, *(cc_width)); + target_bitsize = calc_padding_ccb(bp, *(cc_width)); break; case 3: - target_bitsize = calc_padding_ccc(binary_length, cc_width, lin_width, ecc); + target_bitsize = calc_padding_ccc(bp, cc_width, lin_width, ecc); break; } @@ -1280,39 +1180,40 @@ static int cc_binary_string(struct zint_symbol *symbol, const char source[], cha return ZINT_ERROR_TOO_LONG; } - remainder = target_bitsize - binary_length; + remainder = target_bitsize - bp; if (last_digit) { /* There is still one more numeric digit to encode */ if ((remainder >= 4) && (remainder <= 6)) { - /* ISO/IEC 24723:2010 5.4.1 c) 2) "If four to six bits remain, add 1 to the digit value and encode the result in the next four bits. ..." */ - bin_append(ctoi(last_digit) + 1, 4, binary_string); + /* ISO/IEC 24723:2010 5.4.1 c) 2) "If four to six bits remain, add 1 to the digit value and encode the + result in the next four bits. ..." */ + bp = bin_append_posn(ctoi(last_digit) + 1, 4, binary_string, bp); if (remainder > 4) { - /* "... The fifth and sixth bits, if present, shall be “0”s." (Covered by adding truncated alphanumeric latch below but do explicitly anyway) */ - bin_append(0, remainder - 4, binary_string); + /* "... The fifth and sixth bits, if present, shall be “0”s." (Covered by adding truncated + alphanumeric latch below but do explicitly anyway) */ + bp = bin_append_posn(0, remainder - 4, binary_string, bp); } } else { - bin_append((11 * ctoi(last_digit)) + 18, 7, binary_string); + bp = bin_append_posn((11 * ctoi(last_digit)) + 18, 7, binary_string, bp); /* This may push the symbol up to the next size */ } } - if (strlen(binary_string) > 11805) { /* (2361 * 5) */ + if (bp > 11805) { /* (2361 * 5) */ strcpy(symbol->errtxt, "443: Input too long"); return ZINT_ERROR_TOO_LONG; } - binary_length = (int)strlen(binary_string); switch (cc_mode) { case 1: - target_bitsize = calc_padding_cca(binary_length, *(cc_width)); + target_bitsize = calc_padding_cca(bp, *(cc_width)); break; case 2: - target_bitsize = calc_padding_ccb(binary_length, *(cc_width)); + target_bitsize = calc_padding_ccb(bp, *(cc_width)); break; case 3: - target_bitsize = calc_padding_ccc(binary_length, cc_width, lin_width, ecc); + target_bitsize = calc_padding_ccc(bp, cc_width, lin_width, ecc); break; } @@ -1321,35 +1222,32 @@ static int cc_binary_string(struct zint_symbol *symbol, const char source[], cha return ZINT_ERROR_TOO_LONG; } - if (binary_length < target_bitsize) { + if (bp < target_bitsize) { /* Now add padding to binary string */ if (alpha_pad == 1) { - strcat(binary_string, "11111"); + bp = bin_append_posn(31, 5, binary_string, bp); /* "11111" */ /* Extra FNC1 character required after Alpha encodation (section 5.3.3) */ } if (mode == NUMERIC) { - strcat(binary_string, "0000"); + bp = bin_append_posn(0, 4, binary_string, bp); /* "0000" */ } - while (strlen(binary_string) < (unsigned int) target_bitsize) { - strcat(binary_string, "00100"); - } - - if (strlen(binary_string) > (unsigned int) target_bitsize) { - binary_string[target_bitsize] = '\0'; + while (bp < target_bitsize) { + bp = bin_append_posn(4, 5, binary_string, bp); /* "00100" */ } } + binary_string[target_bitsize] = '\0'; if (debug) { printf("ECC: %d, CC width %d\n", *ecc, *cc_width); - printf("Binary: %s (%d)\n", binary_string, (int) strlen(binary_string)); + printf("Binary: %s (%d)\n", binary_string, target_bitsize); } return 0; } -static int linear_dummy_run(unsigned char *source, int length, char *errtxt) { +static int linear_dummy_run(unsigned char *source, const int length, char *errtxt) { struct zint_symbol *dummy; int error_number; int linear_width; @@ -1372,7 +1270,7 @@ static int linear_dummy_run(unsigned char *source, int length, char *errtxt) { } INTERNAL int composite(struct zint_symbol *symbol, unsigned char source[], int length) { - int error_number, cc_mode, cc_width, ecc_level; + int error_number, cc_mode, cc_width = 0, ecc_level = 0; int j, i, k; unsigned int bs = 13 * length + 500 + 1; /* Allow for 8 bits + 5-bit latch per char + 500 bits overhead/padding */ #ifndef _MSC_VER @@ -1420,14 +1318,13 @@ INTERNAL int composite(struct zint_symbol *symbol, unsigned char source[], int l switch (symbol->symbology) { /* Determine width of 2D component according to ISO/IEC 24723 Table 1 */ case BARCODE_EANX_CC: - cc_width = 0; if (pri_len < 20) { int padded_pri_len; int with_addon; - char padded_pri[21]; + unsigned char padded_pri[21]; padded_pri[0] = '\0'; - ean_leading_zeroes(symbol, (unsigned char *) symbol->primary, (unsigned char *) padded_pri, &with_addon); - padded_pri_len = strlen(padded_pri); + ean_leading_zeroes(symbol, (unsigned char *) symbol->primary, padded_pri, &with_addon); + padded_pri_len = (int) ustrlen(padded_pri); if (padded_pri_len <= 7) { /* EAN-8 */ cc_width = 3; } else { @@ -1473,17 +1370,14 @@ INTERNAL int composite(struct zint_symbol *symbol, unsigned char source[], int l break; } - memset(binary_string, 0, bs); - if (cc_mode < 1 || cc_mode > 3) { cc_mode = 1; } if (cc_mode == 1) { - i = cc_binary_string(symbol, (char *) source, binary_string, cc_mode, &cc_width, &ecc_level, linear_width); + i = cc_binary_string(symbol, source, length, binary_string, cc_mode, &cc_width, &ecc_level, linear_width); if (i == ZINT_ERROR_TOO_LONG) { cc_mode = 2; - memset(binary_string, 0, bs); } else if (i != 0) { return i; } @@ -1491,13 +1385,12 @@ INTERNAL int composite(struct zint_symbol *symbol, unsigned char source[], int l if (cc_mode == 2) { /* If the data didn't fit into CC-A it is recalculated for CC-B */ - i = cc_binary_string(symbol, (char *) source, binary_string, cc_mode, &cc_width, &ecc_level, linear_width); + i = cc_binary_string(symbol, source, length, binary_string, cc_mode, &cc_width, &ecc_level, linear_width); if (i == ZINT_ERROR_TOO_LONG) { if (symbol->symbology != BARCODE_GS1_128_CC) { return ZINT_ERROR_TOO_LONG; } cc_mode = 3; - memset(binary_string, 0, bs); } else if (i != 0) { return i; } @@ -1505,7 +1398,7 @@ INTERNAL int composite(struct zint_symbol *symbol, unsigned char source[], int l if (cc_mode == 3) { /* If the data didn't fit in CC-B (and linear part is GS1-128) it is recalculated for CC-C */ - i = cc_binary_string(symbol, (char *) source, binary_string, cc_mode, &cc_width, &ecc_level, linear_width); + i = cc_binary_string(symbol, source, length, binary_string, cc_mode, &cc_width, &ecc_level, linear_width); if (i != 0) { return i; } @@ -1598,14 +1491,16 @@ INTERNAL int composite(struct zint_symbol *symbol, unsigned char source[], int l case BARCODE_GS1_128_CC: if (cc_mode == 3) { bottom_shift = 7; } else { - /* ISO/IEC 24723:2010 12.3 g) "GS1-128 components linked to the right quiet zone of the CC-A or CC-B: the CC-A or CC-B component is - aligned with the last space module of one of the rightmost symbol characters of the linear component. To - calculate the target Code 128 symbol character position for alignment, number the positions from right to - left (0 is the Stop character, 1 is the Check character, etc.), and then Position = (total number of Code 128 symbol characters – 9) div 2" + /* ISO/IEC 24723:2010 12.3 g) "GS1-128 components linked to the right quiet zone of the CC-A or CC-B: + the CC-A or CC-B component is aligned with the last space module of one of the rightmost symbol + characters of the linear component. To calculate the target Code 128 symbol character position for + alignment, number the positions from right to left (0 is the Stop character, 1 is the Check + character, etc.), and then Position = (total number of Code 128 symbol characters – 9) div 2" */ int num_symbols = (linear_width - 2) / 11; int position = (num_symbols - 9) / 2; - int calc_shift = linear->width - position * 11 - 1 - symbol->width; /* Less 1 to align with last space module */ + /* Less 1 to align with last space module */ + int calc_shift = linear->width - position * 11 - 1 - symbol->width; if (position) { calc_shift -= 2; /* Less additional stop modules */ } diff --git a/backend/general_field.c b/backend/general_field.c index b82522e4..89451fd7 100644 --- a/backend/general_field.c +++ b/backend/general_field.c @@ -38,7 +38,7 @@ 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(const char *general_field, const int i) { if (general_field[i] == '[' || (general_field[i] >= '0' && general_field[i] <= '9')) { return NUMERIC; } @@ -52,7 +52,8 @@ 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(const char *general_field, int i, const int general_field_len, int num, const int type, + const int type2) { if (i + num > general_field_len) { return 0; } @@ -66,7 +67,8 @@ 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(const char *general_field, int i, const int general_field_len, int num, + const int max_num, const int type) { if (i + max_num < general_field_len) { return 0; } @@ -79,7 +81,8 @@ 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(const char *general_field, int i, const int general_field_len, int num, + const int type) { for (; i < general_field_len && num; i++, num--) { if (general_field_type(general_field, i) == type) { return 0; @@ -90,11 +93,12 @@ 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(const char *general_field, const int general_field_len, int *p_mode, + char *p_last_digit, char binary_string[], int *p_bp) { int i, d1, d2; int mode = *p_mode; - int last_digit = 0; /* Set to odd remaining digit at end if any */ - int general_field_len = strlen(general_field); + char last_digit = '\0'; /* Set to odd remaining digit at end if any */ + int bp = *p_bp; for (i = 0; i < general_field_len; ) { int type = general_field_type(general_field, i); @@ -104,75 +108,89 @@ INTERNAL int general_field_encode(char *general_field, int *p_mode, int *p_last_ switch (mode) { case NUMERIC: 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 */ + if (type != NUMERIC || general_field_type(general_field, i + 1) != NUMERIC) { + /* 7.2.5.5.1/5.4.1 a) */ + bp = bin_append_posn(0, 4, binary_string, bp); /* Alphanumeric latch "0000" */ mode = ALPHANUMERIC; } else { d1 = general_field[i] == '[' ? 10 : ctoi(general_field[i]); d2 = general_field[i + 1] == '[' ? 10 : ctoi(general_field[i + 1]); - bin_append((11 * d1) + d2 + 8, 7, binary_string); + bp = bin_append_posn((11 * d1) + d2 + 8, 7, binary_string, bp); i += 2; } } else { /* If 1 character remains */ - if (type != NUMERIC) { /* 7.2.5.5.1/5.4.1 b) */ - strcat(binary_string, "0000"); /* Alphanumeric latch */ + if (type != NUMERIC) { + /* 7.2.5.5.1/5.4.1 b) */ + bp = bin_append_posn(0, 4, binary_string, bp); /* Alphanumeric latch "0000" */ 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 */ + /* Ending with single digit. + * 7.2.5.5.1 c) and 5.4.1 c) dealt with separately outside this procedure */ + last_digit = general_field[i]; i++; } } break; case ALPHANUMERIC: - if (general_field[i] == '[') { /* 7.2.5.5.2/5.4.2 a) */ - strcat(binary_string, "01111"); + if (general_field[i] == '[') { + /* 7.2.5.5.2/5.4.2 a) */ + bp = bin_append_posn(15, 5, binary_string, bp); /* "01111" */ mode = NUMERIC; i++; - } else if (type == ISOIEC) { /* 7.2.5.5.2/5.4.2 b) */ - strcat(binary_string, "00100"); /* ISO/IEC 646 latch */ + } else if (type == ISOIEC) { + /* 7.2.5.5.2/5.4.2 b) */ + bp = bin_append_posn(4, 5, binary_string, bp); /* ISO/IEC 646 latch "00100" */ 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) */ - strcat(binary_string, "000"); /* Numeric latch */ + } else if (general_field_next(general_field, i, general_field_len, 6, NUMERIC, 0)) { + /* 7.2.5.5.2/5.4.2 c) */ + bp = bin_append_posn(0, 3, binary_string, bp); /* Numeric latch "000" */ 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) */ - strcat(binary_string, "000"); /* Numeric latch */ + } 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) */ + bp = bin_append_posn(0, 3, binary_string, bp); /* Numeric latch "000" */ mode = NUMERIC; } else if ((general_field[i] >= '0') && (general_field[i] <= '9')) { - bin_append(general_field[i] - 43, 5, binary_string); + bp = bin_append_posn(general_field[i] - 43, 5, binary_string, bp); i++; } else if ((general_field[i] >= 'A') && (general_field[i] <= 'Z')) { - bin_append(general_field[i] - 33, 6, binary_string); + bp = bin_append_posn(general_field[i] - 33, 6, binary_string, bp); i++; } else { - bin_append(posn(alphanum_puncs, general_field[i]) + 58, 6, binary_string); + bp = bin_append_posn(posn(alphanum_puncs, general_field[i]) + 58, 6, binary_string, bp); i++; } break; case ISOIEC: - if (general_field[i] == '[') { /* 7.2.5.5.3/5.4.3 a) */ - strcat(binary_string, "01111"); + if (general_field[i] == '[') { + /* 7.2.5.5.3/5.4.3 a) */ + bp = bin_append_posn(15, 5, binary_string, bp); /* "01111" */ mode = NUMERIC; i++; } else { int next_10_not_isoiec = general_field_next_none(general_field, i, general_field_len, 10, ISOIEC); - 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 */ + 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) */ + bp = bin_append_posn(0, 3, binary_string, bp); /* Numeric latch "000" */ mode = NUMERIC; - } 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) */ + } 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 */ + bp = bin_append_posn(4, 5, binary_string, bp); /* Alphanumeric latch "00100" */ mode = ALPHANUMERIC; } else if ((general_field[i] >= '0') && (general_field[i] <= '9')) { - bin_append(general_field[i] - 43, 5, binary_string); + bp = bin_append_posn(general_field[i] - 43, 5, binary_string, bp); i++; } else if ((general_field[i] >= 'A') && (general_field[i] <= 'Z')) { - bin_append(general_field[i] - 1, 7, binary_string); + bp = bin_append_posn(general_field[i] - 1, 7, binary_string, bp); i++; } else if ((general_field[i] >= 'a') && (general_field[i] <= 'z')) { - bin_append(general_field[i] - 7, 7, binary_string); + bp = bin_append_posn(general_field[i] - 7, 7, binary_string, bp); i++; } else { - bin_append(posn(isoiec_puncs, general_field[i]) + 232, 8, binary_string); + bp = bin_append_posn(posn(isoiec_puncs, general_field[i]) + 232, 8, binary_string, bp); i++; } } @@ -182,5 +200,7 @@ INTERNAL int general_field_encode(char *general_field, int *p_mode, int *p_last_ *p_mode = mode; *p_last_digit = last_digit; + *p_bp = bp; + return 1; } diff --git a/backend/general_field.h b/backend/general_field.h index 184eb291..5ab8847c 100644 --- a/backend/general_field.h +++ b/backend/general_field.h @@ -39,7 +39,10 @@ #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(const char *general_field, const int general_field_len, int *p_mode, + char *p_last_digit, char binary_string[], int *p_bp); + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/backend/gs1.c b/backend/gs1.c index 99ff3c32..255f9e5b 100644 --- a/backend/gs1.c +++ b/backend/gs1.c @@ -69,9 +69,9 @@ static void itostr(char ai_string[], int ai_value) { } /* 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) { +static int ustrchr_cnt(const unsigned char string[], const int length, const unsigned char c) { int count = 0; - unsigned int i; + int i; for (i = 0; i < length; i++) { if (string[i] == c) { count++; @@ -80,13 +80,14 @@ static int ustrchr_cnt(const unsigned char string[], const size_t length, const return count; } -INTERNAL int gs1_verify(struct zint_symbol *symbol, const unsigned char source[], const size_t src_len, char reduced[]) { +INTERNAL int gs1_verify(struct zint_symbol *symbol, const unsigned char source[], const int src_len, + unsigned char reduced[]) { int i, j, last_ai, ai_latch; char ai_string[7]; /* 6 char max "(NNNN)" */ int bracket_level, max_bracket_level, ai_length, max_ai_length, min_ai_length; int ai_count; int error_latch; - int error_value; + int error_value = 0; #ifdef _MSC_VER int *ai_value; int *ai_location; @@ -104,7 +105,7 @@ INTERNAL int gs1_verify(struct zint_symbol *symbol, const unsigned char source[] #endif /* Detect extended ASCII characters */ - for (i = 0; i < (int) src_len; i++) { + for (i = 0; i < src_len; i++) { if (source[i] >= 128) { strcpy(symbol->errtxt, "250: Extended ASCII characters are not supported by GS1"); return ZINT_ERROR_INVALID_DATA; @@ -140,8 +141,7 @@ INTERNAL int gs1_verify(struct zint_symbol *symbol, const unsigned char source[] min_ai_length = 5; j = 0; ai_latch = 0; - error_value = 0; - for (i = 0; i < (int) src_len; i++) { + for (i = 0; i < src_len; i++) { ai_length += j; if (((j == 1) && (source[i] != ']')) && ((source[i] < '0') || (source[i] > '9'))) { ai_latch = 1; @@ -198,7 +198,7 @@ INTERNAL int gs1_verify(struct zint_symbol *symbol, const unsigned char source[] } ai_count = 0; - for (i = 1; i < (int) src_len; i++) { + for (i = 1; i < src_len; i++) { if (source[i - 1] == '[') { ai_location[ai_count] = i; j = 0; @@ -223,7 +223,8 @@ INTERNAL int gs1_verify(struct zint_symbol *symbol, const unsigned char source[] data_length[i] = 0; do { data_length[i]++; - } while ((source[data_location[i] + data_length[i] - 1] != '[') && (data_location[i] + data_length[i] <= (int) src_len)); + } while ((source[data_location[i] + data_length[i] - 1] != '[') + && (data_location[i] + data_length[i] <= src_len)); data_length[i]--; } @@ -689,7 +690,7 @@ INTERNAL int gs1_verify(struct zint_symbol *symbol, const unsigned char source[] /* Resolve AI data - put resulting string in 'reduced' */ j = 0; ai_latch = 1; - for (i = 0; i < (int) src_len; i++) { + for (i = 0; i < src_len; i++) { if ((source[i] != '[') && (source[i] != ']')) { reduced[j++] = source[i]; } diff --git a/backend/gs1.h b/backend/gs1.h index 228af50d..db96f722 100644 --- a/backend/gs1.h +++ b/backend/gs1.h @@ -2,7 +2,7 @@ /* libzint - the open source barcode library - Copyright (C) 2009-2017 Robin Stuart + Copyright (C) 2009 - 2020 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -37,7 +37,8 @@ extern "C" { #endif /* __cplusplus */ - extern int gs1_verify(struct zint_symbol *symbol, const unsigned char source[], const size_t src_len, char reduced[]); +INTERNAL int gs1_verify(struct zint_symbol *symbol, const unsigned char source[], const int src_len, + unsigned char reduced[]); #ifdef __cplusplus } diff --git a/backend/library.c b/backend/library.c index 884aad2d..236eb231 100644 --- a/backend/library.c +++ b/backend/library.c @@ -41,6 +41,10 @@ #define TECHNETIUM "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%" +/* It's assumed that int is at least 32 bits, the following will compile-time fail if not + * https://stackoverflow.com/a/1980056/664741 */ +typedef int static_assert_int_at_least_32bits[CHAR_BIT != 8 || sizeof(int) < 4 ? -1 : 1]; + struct zint_symbol *ZBarcode_Create() { struct zint_symbol *symbol; @@ -54,7 +58,11 @@ struct zint_symbol *ZBarcode_Create() { symbol->fgcolor = &symbol->fgcolour[0]; strcpy(symbol->bgcolour, "ffffff"); symbol->bgcolor = &symbol->bgcolour[0]; +#ifdef NO_PNG + strcpy(symbol->outfile, "out.gif"); +#else strcpy(symbol->outfile, "out.png"); +#endif symbol->scale = 1.0f; symbol->option_1 = -1; symbol->show_hrt = 1; // Show human readable text @@ -132,8 +140,8 @@ INTERNAL int itf14(struct zint_symbol *symbol, unsigned char source[], int lengt INTERNAL int dpleit(struct zint_symbol *symbol, unsigned char source[], int length); /* Deutsche Post Leitcode */ INTERNAL int dpident(struct zint_symbol *symbol, unsigned char source[], int length); /* Deutsche Post Identcode */ INTERNAL int c93(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 93 - a re-working of Code 39+, generates 2 check digits */ -INTERNAL int code_128(struct zint_symbol *symbol, const unsigned char source[], const size_t length); /* Code 128 and NVE-18 */ -INTERNAL int ean_128(struct zint_symbol *symbol, unsigned char source[], const size_t length); /* EAN-128 (GS1-128) */ +INTERNAL int code_128(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 128 and NVE-18 */ +INTERNAL int ean_128(struct zint_symbol *symbol, unsigned char source[], int length); /* EAN-128 (GS1-128) */ INTERNAL int code_11(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 11 */ INTERNAL int msi_handle(struct zint_symbol *symbol, unsigned char source[], int length); /* MSI Plessey */ INTERNAL int telepen(struct zint_symbol *symbol, unsigned char source[], const size_t length); /* Telepen ASCII */ @@ -172,7 +180,7 @@ INTERNAL int code_one(struct zint_symbol *symbol, unsigned char source[], int le INTERNAL int grid_matrix(struct zint_symbol *symbol, unsigned char source[], int length); /* Grid Matrix */ INTERNAL int han_xin(struct zint_symbol * symbol, unsigned char source[], int length); /* Han Xin */ INTERNAL int dotcode(struct zint_symbol * symbol, const unsigned char source[], int length); /* DotCode */ -INTERNAL int codablock(struct zint_symbol * symbol, const unsigned char source[], const size_t length); /* Codablock */ +INTERNAL int codablock(struct zint_symbol *symbol, unsigned char source[], int length); /* Codablock */ INTERNAL int upnqr(struct zint_symbol *symbol, unsigned char source[], int length); /* UPNQR */ INTERNAL int qr_code(struct zint_symbol *symbol, unsigned char source[], int length); /* QR Code */ INTERNAL int dmatrix(struct zint_symbol *symbol, const unsigned char source[], const size_t in_length); /* Data Matrix (IEC16022) */ @@ -749,7 +757,8 @@ static int reduced_charset(struct zint_symbol *symbol, unsigned char *source, in if ((symbol->input_mode & 0x07) == UNICODE_MODE) { /* Prior check ensures ECI only set for those that support it */ preprocessed = preprocessed_buf; - error_number = utf_to_eci(symbol->eci && symbol->eci <= 899 ? symbol->eci : 3, source, preprocessed, &in_length); + error_number = utf_to_eci(symbol->eci && symbol->eci <= 899 ? symbol->eci : 3, source, preprocessed, + &in_length); if (error_number != 0) { strcpy(symbol->errtxt, "204: Invalid characters in input data"); return error_number; @@ -1077,6 +1086,15 @@ int ZBarcode_Encode(struct zint_symbol *symbol, const unsigned char *source, int if (!symbol) return ZINT_ERROR_INVALID_DATA; + if (symbol->debug & ZINT_DEBUG_PRINT) { + printf("ZBarcode_Encode: symbology: %d, input_mode: 0x%X, ECI: %d, option_1: %d, option_2: %d," + " option_3: %d, scale: %g\n output_options: 0x%X, in_length: %d," + " First 10 source: \"%.10s\", First 10 primary: \"%.10s\"\n", + symbol->symbology, symbol->input_mode, symbol->eci, symbol->option_1, symbol->option_2, + symbol->option_3, symbol->scale, symbol->output_options, in_length, + source, symbol->primary); + } + error_number = 0; if (source == NULL) { @@ -1092,8 +1110,13 @@ int ZBarcode_Encode(struct zint_symbol *symbol, const unsigned char *source, int error_tag(symbol->errtxt, ZINT_ERROR_INVALID_DATA); return ZINT_ERROR_INVALID_DATA; } + if (in_length > ZINT_MAX_DATA_LEN) { + strcpy(symbol->errtxt, "243: Input data too long"); + error_tag(symbol->errtxt, ZINT_ERROR_INVALID_DATA); + return ZINT_ERROR_TOO_LONG; + } - if (strcmp(symbol->outfile, "") == 0) { + if (*symbol->outfile == '\0') { #ifdef NO_PNG strcpy(symbol->outfile, "out.gif"); #else @@ -1280,9 +1303,9 @@ int ZBarcode_Encode(struct zint_symbol *symbol, const unsigned char *source, int // Reduce input for composite and non-forced symbologies, others (EAN128 and RSS_EXP based) will handle it themselves if (is_composite(symbol->symbology) || !check_force_gs1(symbol->symbology)) { #ifndef _MSC_VER - char reduced[in_length + 1]; + unsigned char reduced[in_length + 1]; #else - char* reduced = (char*) _alloca(in_length + 1); + unsigned char *reduced = (unsigned char *) _alloca(in_length + 1); #endif error_number = gs1_verify(symbol, local_source, in_length, reduced); if (error_number != 0) { @@ -1553,7 +1576,7 @@ int ZBarcode_Encode_File(struct zint_symbol *symbol, char *filename) { if (!strcmp(filename, "-")) { file = stdin; - fileLen = ZINT_MAX_FILE_LEN; + fileLen = ZINT_MAX_DATA_LEN; } else { file = fopen(filename, "rb"); if (!file) { @@ -1574,7 +1597,7 @@ int ZBarcode_Encode_File(struct zint_symbol *symbol, char *filename) { fclose(file); return ZINT_ERROR_INVALID_DATA; } - if (fileLen > ZINT_MAX_FILE_LEN) { + if (fileLen > ZINT_MAX_DATA_LEN) { strcpy(symbol->errtxt, "230: Input file too long"); error_tag(symbol->errtxt, ZINT_ERROR_INVALID_DATA); fclose(file); @@ -1673,7 +1696,8 @@ int ZBarcode_Encode_File_and_Buffer_Vector(struct zint_symbol *symbol, char *fil int ZBarcode_Version() { if (ZINT_VERSION_BUILD) { - return (ZINT_VERSION_MAJOR * 10000) + (ZINT_VERSION_MINOR * 100) + ZINT_VERSION_RELEASE * 10 + ZINT_VERSION_BUILD; + return (ZINT_VERSION_MAJOR * 10000) + (ZINT_VERSION_MINOR * 100) + ZINT_VERSION_RELEASE * 10 + + ZINT_VERSION_BUILD; } return (ZINT_VERSION_MAJOR * 10000) + (ZINT_VERSION_MINOR * 100) + ZINT_VERSION_RELEASE; } diff --git a/backend/rss.c b/backend/rss.c index 481c9195..3635cd84 100644 --- a/backend/rss.c +++ b/backend/rss.c @@ -77,7 +77,7 @@ * combins(n,r): returns the number of Combinations of r selected from n: * Combinations = n! / ((n - r)! * r!) **********************************************************************/ -static int combins(int n, int r) { +static int combins(const int n, const int r) { int i, j; int maxDenom, minDenom; int val; @@ -117,7 +117,7 @@ static int combins(int n, int r) { * noNarrow = 0 will skip patterns without a one module wide element * **********************************************************************/ -static void getRSSwidths(int widths[], int val, int n, int elements, int maxWidth, int noNarrow) { +static void getRSSwidths(int widths[], int val, int n, const int elements, const int maxWidth, const int noNarrow) { int bar; int elmWidth; int mxwElement; @@ -158,7 +158,7 @@ static void getRSSwidths(int widths[], int val, int n, int elements, int maxWidt } /* Calculate check digit from Annex A */ -static int calc_check_digit(unsigned char *src) { +static int calc_check_digit(const unsigned char *src) { int i, check_digit; int count = 0; @@ -174,7 +174,7 @@ static int calc_check_digit(unsigned char *src) { } /* Set GTIN-14 human readable text */ -static void set_gtin14_hrt(struct zint_symbol *symbol, unsigned char *source, int src_len) { +static void set_gtin14_hrt(struct zint_symbol *symbol, const unsigned char *source, const int src_len) { int i; unsigned char hrt[15]; @@ -193,53 +193,52 @@ static void set_gtin14_hrt(struct zint_symbol *symbol, unsigned char *source, in } /* Expand from a width pattern to a bit pattern */ -static int rss_expand(struct zint_symbol *symbol, int writer, char *p_latch, int width) { +static int rss_expand(struct zint_symbol *symbol, int writer, int *p_latch, const int width) { int j; int latch = *p_latch; for (j = 0; j < width; j++) { - if (latch == '1') { + if (latch) { set_module(symbol, symbol->rows, writer); } else { unset_module(symbol, symbol->rows, writer); } writer++; } - if (latch == '1') { - *p_latch = '0'; - } else { - *p_latch = '1'; - } + + *p_latch = !latch; 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) { +static void rss14_finder_adjust(struct zint_symbol *symbol, const int separator_row, const int above_below, + const 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'; + 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') { + if (latch) { set_module(symbol, separator_row, i); - latch = '0'; + latch = 0; } else { unset_module(symbol, separator_row, i); - latch = '1'; + latch = 1; } } else { unset_module(symbol, separator_row, i); - latch = '1'; + 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) { +static void rss14_separator(struct zint_symbol *symbol, int width, const int separator_row, const int above_below, + const int finder_start, const int finder2_start, const int bottom_finder_value_3) { int i, finder_end, finder_value_3_set; int module_row = separator_row + above_below; @@ -276,7 +275,7 @@ INTERNAL int rss14(struct zint_symbol *symbol, unsigned char source[], int src_l 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 latch; int separator_row; int widths[4]; @@ -325,69 +324,55 @@ INTERNAL int rss14(struct zint_symbol *symbol, unsigned char source[], int src_l /* Calculate four data characters */ - data_character[0] = left_pair / 1597; - data_character[1] = left_pair % 1597; + data_character[0] = (int) (left_pair / 1597); + data_character[1] = (int) (left_pair % 1597); - data_character[2] = right_pair / 1597; - data_character[3] = right_pair % 1597; + data_character[2] = (int) (right_pair / 1597); + data_character[3] = (int) (right_pair % 1597); /* Calculate odd and even subset values */ - if ((data_character[0] >= 0) && (data_character[0] <= 160)) { + if (data_character[0] <= 160) { data_group[0] = 0; - } - if ((data_character[0] >= 161) && (data_character[0] <= 960)) { + } else if (data_character[0] <= 960) { data_group[0] = 1; - } - if ((data_character[0] >= 961) && (data_character[0] <= 2014)) { + } else if (data_character[0] <= 2014) { data_group[0] = 2; - } - if ((data_character[0] >= 2015) && (data_character[0] <= 2714)) { + } else if (data_character[0] <= 2714) { data_group[0] = 3; - } - if ((data_character[0] >= 2715) && (data_character[0] <= 2840)) { + } else { data_group[0] = 4; } - if ((data_character[1] >= 0) && (data_character[1] <= 335)) { + if (data_character[1] <= 335) { data_group[1] = 5; - } - if ((data_character[1] >= 336) && (data_character[1] <= 1035)) { + } else if (data_character[1] <= 1035) { data_group[1] = 6; - } - if ((data_character[1] >= 1036) && (data_character[1] <= 1515)) { + } else if (data_character[1] <= 1515) { data_group[1] = 7; - } - if ((data_character[1] >= 1516) && (data_character[1] <= 1596)) { + } else { data_group[1] = 8; } - if ((data_character[3] >= 0) && (data_character[3] <= 335)) { + if (data_character[3] <= 335) { data_group[3] = 5; - } - if ((data_character[3] >= 336) && (data_character[3] <= 1035)) { + } else if (data_character[3] <= 1035) { data_group[3] = 6; - } - if ((data_character[3] >= 1036) && (data_character[3] <= 1515)) { + } else if (data_character[3] <= 1515) { data_group[3] = 7; - } - if ((data_character[3] >= 1516) && (data_character[3] <= 1596)) { + } else { data_group[3] = 8; } - if ((data_character[2] >= 0) && (data_character[2] <= 160)) { + if (data_character[2] <= 160) { data_group[2] = 0; - } - if ((data_character[2] >= 161) && (data_character[2] <= 960)) { + } else if (data_character[2] <= 960) { data_group[2] = 1; - } - if ((data_character[2] >= 961) && (data_character[2] <= 2014)) { + } else if (data_character[2] <= 2014) { data_group[2] = 2; - } - if ((data_character[2] >= 2015) && (data_character[2] <= 2714)) { + } else if (data_character[2] <= 2714) { data_group[2] = 3; - } - if ((data_character[2] >= 2715) && (data_character[2] <= 2840)) { + } else { data_group[2] = 4; } @@ -472,7 +457,7 @@ INTERNAL int rss14(struct zint_symbol *symbol, unsigned char source[], int src_l /* Put this data into the symbol */ if ((symbol->symbology == BARCODE_DBAR_OMN) || (symbol->symbology == BARCODE_DBAR_OMN_CC)) { writer = 0; - latch = '0'; + latch = 0; for (i = 0; i < 46; i++) { writer = rss_expand(symbol, writer, &latch, total_widths[i]); } @@ -494,7 +479,7 @@ INTERNAL int rss14(struct zint_symbol *symbol, unsigned char source[], int src_l if ((symbol->symbology == BARCODE_DBAR_STK) || (symbol->symbology == BARCODE_DBAR_STK_CC)) { /* top row */ writer = 0; - latch = '0'; + latch = 0; for (i = 0; i < 23; i++) { writer = rss_expand(symbol, writer, &latch, total_widths[i]); } @@ -507,7 +492,7 @@ INTERNAL int rss14(struct zint_symbol *symbol, unsigned char source[], int src_l set_module(symbol, symbol->rows, 0); unset_module(symbol, symbol->rows, 1); writer = 2; - latch = '1'; + latch = 1; for (i = 23; i < 46; i++) { writer = rss_expand(symbol, writer, &latch, total_widths[i]); } @@ -544,7 +529,7 @@ INTERNAL int rss14(struct zint_symbol *symbol, unsigned char source[], int src_l if ((symbol->symbology == BARCODE_DBAR_OMNSTK) || (symbol->symbology == BARCODE_DBAR_OMNSTK_CC)) { /* top row */ writer = 0; - latch = '0'; + latch = 0; for (i = 0; i < 23; i++) { writer = rss_expand(symbol, writer, &latch, total_widths[i]); } @@ -556,7 +541,7 @@ INTERNAL int rss14(struct zint_symbol *symbol, unsigned char source[], int src_l set_module(symbol, symbol->rows, 0); unset_module(symbol, symbol->rows, 1); writer = 2; - latch = '1'; + latch = 1; for (i = 23; i < 46; i++) { writer = rss_expand(symbol, writer, &latch, total_widths[i]); } @@ -599,7 +584,7 @@ INTERNAL int rsslimited(struct zint_symbol *symbol, unsigned char source[], int 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[47], writer; - char latch; + int latch; int separator_row; int widths[7]; @@ -693,10 +678,10 @@ INTERNAL int rsslimited(struct zint_symbol *symbol, unsigned char source[], int right_group = 0; } - left_odd = left_character / t_even_ltd[left_group]; - left_even = left_character % t_even_ltd[left_group]; - right_odd = right_character / t_even_ltd[right_group]; - right_even = right_character % t_even_ltd[right_group]; + left_odd = (int) (left_character / t_even_ltd[left_group]); + left_even = (int) (left_character % t_even_ltd[left_group]); + right_odd = (int) (right_character / t_even_ltd[right_group]); + right_even = (int) (right_character % t_even_ltd[right_group]); getRSSwidths(widths, left_odd, modules_odd_ltd[left_group], 7, widest_odd_ltd[left_group], 1); for (i = 0; i <= 6; i++) { @@ -739,7 +724,7 @@ INTERNAL int rsslimited(struct zint_symbol *symbol, unsigned char source[], int } writer = 0; - latch = '0'; + latch = 0; for (i = 0; i < 47; i++) { writer = rss_expand(symbol, writer, &latch, total_widths[i]); } @@ -765,22 +750,40 @@ INTERNAL int rsslimited(struct zint_symbol *symbol, unsigned char source[], int return error_number; } +/* Check and convert date to RSS date value */ +INTERNAL int rss_date(const unsigned char source[], const int src_posn) { + int yy = to_int(source + src_posn, 2); + int mm = to_int(source + src_posn + 2, 2); + int dd = to_int(source + src_posn + 4, 2); + + /* Month can't be zero but day can (means last day of month, + * GS1 General Specifications Sections 3.4.2 to 3.4.7) */ + if (yy < 0 || mm <= 0 || mm > 12 || dd < 0 || dd > 31) { + return -1; + } + return yy * 384 + (mm - 1) * 32 + dd; +} + /* Handles all data encodation from section 7.2.5 of ISO/IEC 24724 */ -static int rss_binary_string(struct zint_symbol *symbol, char source[], char binary_string[]) { - int encoding_method, i, j, read_posn, last_digit, debug = (symbol->debug & ZINT_DEBUG_PRINT), mode = NUMERIC; +static int rss_binary_string(struct zint_symbol *symbol, const unsigned char source[], char binary_string[], + int *p_bp) { + int encoding_method, i, j, read_posn, debug = (symbol->debug & ZINT_DEBUG_PRINT), mode = NUMERIC; + char last_digit = '\0'; int symbol_characters, characters_per_row; + int length = (int) ustrlen(source); #ifndef _MSC_VER - char general_field[strlen(source) + 1]; + char general_field[length + 1]; #else - char* general_field = (char*) _alloca(strlen(source) + 1); + char *general_field = (char *) _alloca(length + 1); #endif + int bp = *p_bp; int remainder, d1, d2; - char padstring[40]; + int cdf_bp_start; /* Compressed data field start - debug only */ /* Decide whether a compressed data field is required and if so what method to use - method 2 = no compressed data field */ - if ((strlen(source) >= 16) && ((source[0] == '0') && (source[1] == '1'))) { + if ((length >= 16) && ((source[0] == '0') && (source[1] == '1'))) { /* (01) and other AIs */ encoding_method = 1; if (debug) printf("Choosing Method 1\n"); @@ -790,157 +793,110 @@ static int rss_binary_string(struct zint_symbol *symbol, char source[], char bin if (debug) printf("Choosing Method 2\n"); } - if (((strlen(source) >= 20) && (encoding_method == 1)) && ((source[2] == '9') && (source[16] == '3'))) { + if (((length >= 20) && (encoding_method == 1)) && ((source[2] == '9') && (source[16] == '3'))) { /* Possibly encoding method > 2 */ + if (debug) printf("Checking for other methods\n"); - if ((strlen(source) >= 26) && (source[17] == '1')) { + if ((length >= 26) && (source[17] == '1') && (source[18] == '0')) { /* Methods 3, 7, 9, 11 and 13 */ - if (source[18] == '0') { - /* (01) and (310x) */ - char weight_str[7]; + /* (01) and (310x) */ + int weight = to_int(source + 20, 6); - for (i = 0; i < 6; i++) { - weight_str[i] = source[20 + i]; - } - weight_str[6] = '\0'; + /* Maximum weight = 99999 for 7 to 14 (ISO/IEC 24724:2011 7.2.5.4.4) */ + if (weight >= 0 && weight <= 99999) { - if (weight_str[0] == '0') { /* Maximum weight = 99999 */ - - if ((source[19] == '3') && (strlen(source) == 26)) { + if (length == 26) { + if ((source[19] == '3') && weight <= 32767) { /* In grams, max 32.767 kilos */ /* (01) and (3103) */ - float weight; /* In kilos */ - weight = atof(weight_str) / 1000.0; - - if (weight <= 32.767) { - encoding_method = 3; - } + encoding_method = 3; + } else { + /* (01), (310x) - use method 7 with dummy date 38400 */ + encoding_method = 7; } - if (strlen(source) == 34) { - if ((source[26] == '1') && (source[27] == '1')) { - /* (01), (310x) and (11) - metric weight and production date */ - encoding_method = 7; - } + } else if ((length == 34) && (source[26] == '1') && + (source[27] == '1' || source[27] == '3' || source[27] == '5' || source[27] == '7') && + rss_date(source, 28) >= 0) { - if ((source[26] == '1') && (source[27] == '3')) { - /* (01), (310x) and (13) - metric weight and packaging date */ - encoding_method = 9; - } - - if ((source[26] == '1') && (source[27] == '5')) { - /* (01), (310x) and (15) - metric weight and "best before" date */ - encoding_method = 11; - } - - if ((source[26] == '1') && (source[27] == '7')) { - /* (01), (310x) and (17) - metric weight and expiration date */ - encoding_method = 13; - } - } + /* (01), (310x) and (11) - metric weight and production date */ + /* (01), (310x) and (13) - metric weight and packaging date */ + /* (01), (310x) and (15) - metric weight and "best before" date */ + /* (01), (310x) and (17) - metric weight and expiration date */ + encoding_method = 6 + (source[27] - '0'); } } - if (debug) printf("Now using method %d\n", encoding_method); - } - if ((strlen(source) >= 26) && (source[17] == '2')) { + } else if ((length >= 26) && (source[17] == '2') && (source[18] == '0')) { /* Methods 4, 8, 10, 12 and 14 */ - if (source[18] == '0') { - /* (01) and (320x) */ - char weight_str[7]; + /* (01) and (320x) */ + int weight = to_int(source + 20, 6); - for (i = 0; i < 6; i++) { - weight_str[i] = source[20 + i]; - } - weight_str[6] = '\0'; + /* Maximum weight = 99999 for 7 to 14 (ISO/IEC 24724:2011 7.2.5.4.4) */ + if (weight >= 0 && weight <= 99999) { - if (weight_str[0] == '0') { /* Maximum weight = 99999 */ - - if (((source[19] == '2') || (source[19] == '3')) && (strlen(source) == 26)) { + /* (3202) in 0.01 pounds, max 99.99 pounds; (3203) in 0.001 pounds, max 22.767 pounds */ + if (length == 26) { + if ((source[19] == '2' && weight <= 9999) || (source[19] == '3' && weight <= 22767)) { /* (01) and (3202)/(3203) */ - float weight; /* In pounds */ - - if (source[19] == '3') { - weight = (float) (atof(weight_str) / 1000.0F); - if (weight <= 22.767) { - encoding_method = 4; - } - } else { - weight = (float) (atof(weight_str) / 100.0F); - if (weight <= 99.99) { - encoding_method = 4; - } - } - + encoding_method = 4; + } else { + /* (01), (320x) - use method 8 with dummy date 38400 */ + encoding_method = 8; } - if (strlen(source) == 34) { - if ((source[26] == '1') && (source[27] == '1')) { - /* (01), (320x) and (11) - English weight and production date */ - encoding_method = 8; - } + } else if ((length == 34) && (source[26] == '1') && + (source[27] == '1' || source[27] == '3' || source[27] == '5' || source[27] == '7') && + rss_date(source, 28) >= 0) { - if ((source[26] == '1') && (source[27] == '3')) { - /* (01), (320x) and (13) - English weight and packaging date */ - encoding_method = 10; - } - - if ((source[26] == '1') && (source[27] == '5')) { - /* (01), (320x) and (15) - English weight and "best before" date */ - encoding_method = 12; - } - - if ((source[26] == '1') && (source[27] == '7')) { - /* (01), (320x) and (17) - English weight and expiration date */ - encoding_method = 14; - } - } + /* (01), (320x) and (11) - English weight and production date */ + /* (01), (320x) and (13) - English weight and packaging date */ + /* (01), (320x) and (15) - English weight and "best before" date */ + /* (01), (320x) and (17) - English weight and expiration date */ + encoding_method = 7 + (source[27] - '0'); } } - if (debug) printf("Now using method %d\n", encoding_method); - } - - if (source[17] == '9') { + } else if ((source[17] == '9') && ((source[19] >= '0') && (source[19] <= '3'))) { /* Methods 5 and 6 */ - if ((source[18] == '2') && ((source[19] >= '0') && (source[19] <= '3'))) { + if (source[18] == '2') { /* (01) and (392x) */ encoding_method = 5; - } - if ((source[18] == '3') && ((source[19] >= '0') && (source[19] <= '3'))) { + } else if (source[18] == '3' && to_int(source + 20, 3) >= 0) { /* Check 3-digit currency string */ /* (01) and (393x) */ encoding_method = 6; } - if (debug) printf("Now using method %d\n", encoding_method); } + + if (debug && encoding_method != 1) printf("Now using method %d\n", encoding_method); } switch (encoding_method) { /* Encoding method - Table 10 */ - case 1: strcat(binary_string, "1XX"); + case 1: bp = bin_append_posn(4, 3, binary_string, bp); /* "1XX" */ read_posn = 16; break; - case 2: strcat(binary_string, "00XX"); + case 2: bp = bin_append_posn(0, 4, binary_string, bp); /* "00XX" */ read_posn = 0; break; case 3: // 0100 case 4: // 0101 - bin_append(4 + (encoding_method - 3), 4, binary_string); - read_posn = strlen(source); + bp = bin_append_posn(4 + (encoding_method - 3), 4, binary_string, bp); + read_posn = 26; break; - case 5: strcat(binary_string, "01100XX"); + case 5: bp = bin_append_posn(0x30, 7, binary_string, bp); /* "01100XX" */ read_posn = 20; break; - case 6: strcat(binary_string, "01101XX"); + case 6: bp = bin_append_posn(0x34, 7, binary_string, bp); /* "01101XX" */ read_posn = 23; break; default: /* modes 7 to 14 */ - bin_append(56 + (encoding_method - 7), 7, binary_string); - read_posn = strlen(source); + bp = bin_append_posn(56 + (encoding_method - 7), 7, binary_string, bp); + read_posn = length; /* 34 or 26 */ break; } - if (debug) printf("Setting binary = %s\n", binary_string); + if (debug) printf("Setting binary = %.*s\n", bp, binary_string); /* Variable length symbol bit field is just given a place holder (XX) for the time being */ @@ -949,7 +905,7 @@ static int rss_binary_string(struct zint_symbol *symbol, char source[], char bin numeric data before carrying out compression */ for (i = 0; i < read_posn; i++) { if ((source[i] < '0') || (source[i] > '9')) { - if ((source[i] != '[') && (source[i] != ']')) { + if (source[i] != '[') { /* Something is wrong */ strcpy(symbol->errtxt, "385: Invalid characters in input data"); return ZINT_ERROR_INVALID_DATA; @@ -960,155 +916,110 @@ static int rss_binary_string(struct zint_symbol *symbol, char source[], char bin /* Now encode the compressed data field */ if (debug) printf("Proceeding to encode data\n"); + cdf_bp_start = bp; /* Debug use only */ + if (encoding_method == 1) { /* Encoding method field "1" - general item identification data */ - char group[4]; - group[0] = source[2]; - group[1] = '\0'; + bp = bin_append_posn(ctoi(source[2]), 4, binary_string, bp); /* Leading digit after stripped "01" */ - bin_append(atoi(group), 4, binary_string); - - for (i = 1; i < 5; i++) { - group[0] = source[(i * 3)]; - group[1] = source[(i * 3) + 1]; - group[2] = source[(i * 3) + 2]; - group[3] = '\0'; - - bin_append(atoi(group), 10, binary_string); + for (i = 3; i < 15; i += 3) { /* Next 12 digits, excluding final check digit */ + bp = bin_append_posn(to_int(source + i, 3), 10, binary_string, bp); } - } - if ((encoding_method == 3) || (encoding_method == 4)) { + } else if ((encoding_method == 3) || (encoding_method == 4)) { /* Encoding method field "0100" - variable weight item (0,001 kilogram icrements) */ /* Encoding method field "0101" - variable weight item (0,01 or 0,001 pound increment) */ - char group[4]; - char weight_str[7]; - for (i = 1; i < 5; i++) { - group[0] = source[(i * 3)]; - group[1] = source[(i * 3) + 1]; - group[2] = source[(i * 3) + 2]; - group[3] = '\0'; - - bin_append(atoi(group), 10, binary_string); + for (i = 3; i < 15; i += 3) { /* Leading "019" stripped, and final check digit excluded */ + bp = bin_append_posn(to_int(source + i, 3), 10, binary_string, bp); } - for (i = 0; i < 6; i++) { - weight_str[i] = source[20 + i]; - } - weight_str[6] = '\0'; - if ((encoding_method == 4) && (source[19] == '3')) { - bin_append(atoi(weight_str) + 10000, 15, binary_string); + bp = bin_append_posn(to_int(source + 20, 6) + 10000, 15, binary_string, bp); } else { - bin_append(atoi(weight_str), 15, binary_string); + bp = bin_append_posn(to_int(source + 20, 6), 15, binary_string, bp); } - } - if ((encoding_method == 5) || (encoding_method == 6)) { + } else if ((encoding_method == 5) || (encoding_method == 6)) { /* Encoding method "01100" - variable measure item and price */ /* Encoding method "01101" - variable measure item and price with ISO 4217 Currency Code */ - char group[4]; - - for (i = 1; i < 5; i++) { - group[0] = source[(i * 3)]; - group[1] = source[(i * 3) + 1]; - group[2] = source[(i * 3) + 2]; - group[3] = '\0'; - - bin_append(atoi(group), 10, binary_string); + for (i = 3; i < 15; i += 3) { /* Leading "019" stripped, and final check digit excluded */ + bp = bin_append_posn(to_int(source + i, 3), 10, binary_string, bp); } - bin_append(source[19] - '0', 2, binary_string); + bp = bin_append_posn(source[19] - '0', 2, binary_string, bp); /* 0-3 x of 392x/393x */ if (encoding_method == 6) { - char currency_str[5]; - - for (i = 0; i < 3; i++) { - currency_str[i] = source[20 + i]; - } - currency_str[3] = '\0'; - - bin_append(atoi(currency_str), 10, binary_string); + bp = bin_append_posn(to_int(source + 20, 3), 10, binary_string, bp); /* 3-digit currency */ } - } - if ((encoding_method >= 7) && (encoding_method <= 14)) { + } else if ((encoding_method >= 7) && (encoding_method <= 14)) { /* Encoding method fields "0111000" through "0111111" - variable weight item plus date */ - char group[4]; int group_val; char weight_str[8]; - for (i = 1; i < 5; i++) { - group[0] = source[(i * 3)]; - group[1] = source[(i * 3) + 1]; - group[2] = source[(i * 3) + 2]; - group[3] = '\0'; - - bin_append(atoi(group), 10, binary_string); + for (i = 3; i < 15; i += 3) { /* Leading "019" stripped, and final check digit excluded */ + bp = bin_append_posn(to_int(source + i, 3), 10, binary_string, bp); } - weight_str[0] = source[19]; + weight_str[0] = source[19]; /* 0-9 x of 310x/320x */ - for (i = 0; i < 5; i++) { - weight_str[i + 1] = source[21 + i]; + for (i = 1; i < 6; i++) { /* Leading "0" of weight excluded */ + weight_str[i] = source[20 + i]; } weight_str[6] = '\0'; - bin_append(atoi(weight_str), 20, binary_string); + bp = bin_append_posn(atoi(weight_str), 20, binary_string, bp); - if (strlen(source) == 34) { + if (length == 34) { /* Date information is included */ - char date_str[4]; - date_str[0] = source[28]; - date_str[1] = source[29]; - date_str[2] = '\0'; - group_val = atoi(date_str) * 384; - - date_str[0] = source[30]; - date_str[1] = source[31]; - group_val += (atoi(date_str) - 1) * 32; - - date_str[0] = source[32]; - date_str[1] = source[33]; - group_val += atoi(date_str); + group_val = rss_date(source, 28); } else { group_val = 38400; } - bin_append(group_val, 16, binary_string); + bp = bin_append_posn((int) group_val, 16, binary_string, bp); + } + + if (debug && bp > cdf_bp_start) { + printf("Compressed data field (%d) = %.*s\n", bp - cdf_bp_start, bp - cdf_bp_start, + binary_string + cdf_bp_start); } /* The compressed data field has been processed if appropriate - the rest of the data (if any) goes into a general-purpose data compaction field */ j = 0; - for (i = read_posn; i < (int) strlen(source); i++) { + for (i = read_posn; i < length; i++) { general_field[j] = source[i]; j++; } general_field[j] = '\0'; + if (debug) printf("General field data = %s\n", general_field); - if (!general_field_encode(general_field, &mode, &last_digit, binary_string)) { - /* Invalid characters in input data */ - strcpy(symbol->errtxt, "386: Invalid characters in input data"); - return ZINT_ERROR_INVALID_DATA; - } - if (debug) printf("Resultant binary = %s\n", binary_string); - if (debug) printf("\tLength: %d\n", (int) strlen(binary_string)); + if (j != 0) { /* If general field not empty */ - remainder = 12 - (strlen(binary_string) % 12); + if (!general_field_encode(general_field, j, &mode, &last_digit, binary_string, &bp)) { + /* Invalid characters in input data */ + strcpy(symbol->errtxt, "386: Invalid characters in input data"); + return ZINT_ERROR_INVALID_DATA; + } + } + + if (debug) printf("Resultant binary = %.*s\n\tLength: %d\n", bp, binary_string, bp); + + remainder = 12 - (bp % 12); if (remainder == 12) { remainder = 0; } - symbol_characters = ((strlen(binary_string) + remainder) / 12) + 1; + symbol_characters = ((bp + remainder) / 12) + 1; if ((symbol->symbology == BARCODE_DBAR_EXPSTK) || (symbol->symbology == BARCODE_DBAR_EXPSTK_CC)) { characters_per_row = symbol->option_2 * 2; @@ -1126,26 +1037,26 @@ static int rss_binary_string(struct zint_symbol *symbol, char source[], char bin symbol_characters = 4; } - remainder = (12 * (symbol_characters - 1)) - strlen(binary_string); + remainder = (12 * (symbol_characters - 1)) - bp; if (last_digit) { /* There is still one more numeric digit to encode */ if (debug) printf("Adding extra (odd) numeric digit\n"); if ((remainder >= 4) && (remainder <= 6)) { - bin_append(ctoi(last_digit) + 1, 4, binary_string); + bp = bin_append_posn(ctoi(last_digit) + 1, 4, binary_string, bp); } else { d1 = ctoi(last_digit); d2 = 10; - bin_append((11 * d1) + d2 + 8, 7, binary_string); + bp = bin_append_posn((11 * d1) + d2 + 8, 7, binary_string, bp); } - remainder = 12 - (strlen(binary_string) % 12); + remainder = 12 - (bp % 12); if (remainder == 12) { remainder = 0; } - symbol_characters = ((strlen(binary_string) + remainder) / 12) + 1; + symbol_characters = ((bp + remainder) / 12) + 1; if ((symbol->symbology == BARCODE_DBAR_EXPSTK) || (symbol->symbology == BARCODE_DBAR_EXPSTK_CC)) { characters_per_row = symbol->option_2 * 2; @@ -1163,13 +1074,12 @@ static int rss_binary_string(struct zint_symbol *symbol, char source[], char bin symbol_characters = 4; } - remainder = (12 * (symbol_characters - 1)) - strlen(binary_string); + remainder = (12 * (symbol_characters - 1)) - bp; - if (debug) printf("Resultant binary = %s\n", binary_string); - if (debug) printf("\tLength: %d\n", (int) strlen(binary_string)); + if (debug) printf("Resultant binary = %.*s\n\tLength: %d\n", bp, binary_string, bp); } - if (strlen(binary_string) > 252) { /* 252 = (21 * 12) */ + if (bp > 252) { /* 252 = (21 * 12) */ strcpy(symbol->errtxt, "387: Input too long"); return ZINT_ERROR_TOO_LONG; } @@ -1177,18 +1087,13 @@ static int rss_binary_string(struct zint_symbol *symbol, char source[], char bin /* Now add padding to binary string (7.2.5.5.4) */ i = remainder; if (mode == NUMERIC) { - strcpy(padstring, "0000"); + bp = bin_append_posn(0, 4, binary_string, bp); /* "0000" */ i -= 4; - } else { - strcpy(padstring, ""); } for (; i > 0; i -= 5) { - strcat(padstring, "00100"); + bp = bin_append_posn(4, 5, binary_string, bp); /* "00100" */ } - padstring[remainder] = '\0'; - strcat(binary_string, padstring); - /* Patch variable length symbol bit field */ d1 = symbol_characters & 1; @@ -1201,21 +1106,26 @@ static int rss_binary_string(struct zint_symbol *symbol, char source[], char bin if (encoding_method == 1) { binary_string[2] = d1 ? '1' : '0'; binary_string[3] = d2 ? '1' : '0'; - } - if (encoding_method == 2) { + } else if (encoding_method == 2) { binary_string[3] = d1 ? '1' : '0'; binary_string[4] = d2 ? '1' : '0'; - } - if ((encoding_method == 5) || (encoding_method == 6)) { + } else if ((encoding_method == 5) || (encoding_method == 6)) { binary_string[6] = d1 ? '1' : '0'; binary_string[7] = d2 ? '1' : '0'; } - if (debug) printf("Resultant binary = %s\n", binary_string); - if (debug) printf("\tLength: %d\n", (int) strlen(binary_string)); + if (debug) { + printf("Resultant binary = %.*s\n\tLength: %d, Symbol chars: %d\n", bp, binary_string, bp, symbol_characters); + } + + *p_bp = bp; + 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) { +/* Separator for DataBar Expanded Stacked and DataBar Expanded Composite */ +static void rssexp_separator(struct zint_symbol *symbol, int width, const int cols, const int separator_row, + const int above_below, const int special_case_row, const int left_to_right, const 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; @@ -1231,9 +1141,11 @@ static void rssexp_separator(struct zint_symbol *symbol, int width, int cols, in /* 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) */ + /* 49 == data (17) + finder (15) + data(17) triplet, 19 == 2 (guard) + 17 (initial check/data character) */ + k = (49 * j) + 19 + special_case_row; 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 */ + /* Last 13 modules of version 2 finder and first 13 modules of version 1 finder */ + i_start = v2_latch ? 2 : 0; i_end = v2_latch ? 15 : 13; for (i = i_start; i < i_end; i++) { if (module_is_set(symbol, module_row, i + k)) { @@ -1252,7 +1164,8 @@ static void rssexp_separator(struct zint_symbol *symbol, int width, int cols, in 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 */ + /* First 13 modules of version 1 finder and last 13 modules of version 2 finder */ + i_start = v2_latch ? 14 : 12; i_end = v2_latch ? 2 : 0; for (i = i_start; i >= i_end; i--) { if (module_is_set(symbol, module_row, i + k)) { @@ -1278,18 +1191,21 @@ static void rssexp_separator(struct zint_symbol *symbol, int width, int cols, in /* 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]; - char substring[21][14], latch; + int i, j, k, p, codeblocks, data_chars, vs, group, v_odd, v_even; + int latch; int char_widths[21][8], checksum, check_widths[8], c_group; 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 */ + /* Allow for 8 bits + 5-bit latch per char + 200 bits overhead/padding */ + unsigned int bin_len = 13 * src_len + 200 + 1; int widths[4]; + int bp = 0; #ifndef _MSC_VER - char reduced[src_len + 1], binary_string[bin_len]; + unsigned char reduced[src_len + 1]; + char binary_string[bin_len]; #else - char* reduced = (char*) _alloca(src_len + 1); - char* binary_string = (char*) _alloca(bin_len); + unsigned char *reduced = (unsigned char *) _alloca(src_len + 1); + char *binary_string = (char *) _alloca(bin_len); #endif separator_row = 0; @@ -1299,6 +1215,10 @@ INTERNAL int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int return i; } + if (symbol->debug & ZINT_DEBUG_PRINT) { + printf("Reduced (%d): %s\n", (int) ustrlen(reduced), reduced); + } + if ((symbol->symbology == BARCODE_DBAR_EXP_CC) || (symbol->symbology == BARCODE_DBAR_EXPSTK_CC)) { /* make space for a composite separator pattern */ separator_row = symbol->rows; @@ -1306,62 +1226,48 @@ INTERNAL int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int symbol->rows += 1; } - strcpy(binary_string, ""); - if (symbol->option_1 == 2) { /* The "component linkage" flag */ - strcat(binary_string, "1"); + binary_string[bp++] = '1'; } else { - strcat(binary_string, "0"); + binary_string[bp++] = '0'; } - i = rss_binary_string(symbol, reduced, binary_string); + i = rss_binary_string(symbol, reduced, binary_string, &bp); if (i != 0) { return i; } - data_chars = strlen(binary_string) / 12; + data_chars = bp / 12; for (i = 0; i < data_chars; i++) { + k = i * 12; + vs = 0; for (j = 0; j < 12; j++) { - substring[i][j] = binary_string[(i * 12) + j]; - } - substring[i][12] = '\0'; - } - - for (i = 0; i < data_chars; i++) { - vs[i] = 0; - for (p = 0; p < 12; p++) { - if (substring[i][p] == '1') { - vs[i] += (0x800 >> p); + if (binary_string[k + j] == '1') { + vs |= (0x800 >> j); } } - } - for (i = 0; i < data_chars; i++) { - if (vs[i] <= 347) { - group[i] = 1; + if (vs <= 347) { + group = 1; + } else if (vs <= 1387) { + group = 2; + } else if (vs <= 2947) { + group = 3; + } else if (vs <= 3987) { + group = 4; + } else { + group = 5; } - if ((vs[i] >= 348) && (vs[i] <= 1387)) { - group[i] = 2; - } - if ((vs[i] >= 1388) && (vs[i] <= 2947)) { - group[i] = 3; - } - if ((vs[i] >= 2948) && (vs[i] <= 3987)) { - group[i] = 4; - } - if (vs[i] >= 3988) { - group[i] = 5; - } - 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]; + v_odd = (vs - g_sum_exp[group - 1]) / t_even_exp[group - 1]; + v_even = (vs - g_sum_exp[group - 1]) % t_even_exp[group - 1]; - getRSSwidths(widths, v_odd[i], modules_odd_exp[group[i] - 1], 4, widest_odd_exp[group[i] - 1], 0); + getRSSwidths(widths, v_odd, modules_odd_exp[group - 1], 4, widest_odd_exp[group - 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(widths, v_even[i], modules_even_exp[group[i] - 1], 4, widest_even_exp[group[i] - 1], 1); + getRSSwidths(widths, v_even, modules_even_exp[group - 1], 4, widest_even_exp[group - 1], 1); char_widths[i][1] = widths[0]; char_widths[i][3] = widths[1]; char_widths[i][5] = widths[2]; @@ -1388,17 +1294,13 @@ INTERNAL int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int if (check_char <= 347) { c_group = 1; - } - if ((check_char >= 348) && (check_char <= 1387)) { + } else if (check_char <= 1387) { c_group = 2; - } - if ((check_char >= 1388) && (check_char <= 2947)) { + } else if (check_char <= 2947) { c_group = 3; - } - if ((check_char >= 2948) && (check_char <= 3987)) { + } else if (check_char <= 3987) { c_group = 4; - } - if (check_char >= 3988) { + } else { c_group = 5; } @@ -1417,14 +1319,14 @@ INTERNAL int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int check_widths[7] = widths[3]; /* Initialise element array */ - pattern_width = ((((data_chars + 1) / 2) + ((data_chars + 1) & 1)) * 5) + ((data_chars + 1) * 8) + 4; - for (i = 0; i < pattern_width; i++) { - elements[i] = 0; - } + codeblocks = (data_chars + 1) / 2 + ((data_chars + 1) & 1); + pattern_width = (codeblocks * 5) + ((data_chars + 1) * 8) + 4; + memset(elements, 0, sizeof(int) * pattern_width); /* Put finder patterns in element array */ - for (i = 0; i < (((data_chars + 1) / 2) + ((data_chars + 1) & 1)); i++) { - k = ((((((data_chars + 1) - 2) / 2) + ((data_chars + 1) & 1)) - 1) * 11) + i; + p = (((((data_chars + 1) - 2) / 2) + ((data_chars + 1) & 1)) - 1) * 11; + for (i = 0; i < codeblocks; i++) { + k = p + i; for (j = 0; j < 5; j++) { elements[(21 * i) + j + 10] = finder_pattern_exp[((finder_sequence[k] - 1) * 5) + j]; } @@ -1437,15 +1339,17 @@ INTERNAL int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int /* Put forward reading data characters in element array */ for (i = 1; i < data_chars; i += 2) { + k = (((i - 1) / 2) * 21) + 23; for (j = 0; j < 8; j++) { - elements[(((i - 1) / 2) * 21) + 23 + j] = char_widths[i][j]; + elements[k + j] = char_widths[i][j]; } } /* Put reversed data characters in element array */ for (i = 0; i < data_chars; i += 2) { + k = ((i / 2) * 21) + 15; for (j = 0; j < 8; j++) { - elements[((i / 2) * 21) + 15 + j] = char_widths[i][7 - j]; + elements[k + j] = char_widths[i][7 - j]; } } @@ -1459,7 +1363,7 @@ INTERNAL int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int elements[pattern_width - 1] = 1; writer = 0; - latch = '0'; + latch = 0; for (i = 0; i < pattern_width; i++) { writer = rss_expand(symbol, writer, &latch, elements[i]); } @@ -1492,7 +1396,6 @@ INTERNAL int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int * [01]90614141999996[10]1234222222222221 * Patch by Daniel Frede */ - int codeblocks = (data_chars + 1) / 2 + ((data_chars + 1) % 2); if ((symbol->option_2 < 1) || (symbol->option_2 > 11)) { symbol->option_2 = 2; @@ -1528,15 +1431,17 @@ INTERNAL int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int sub_elements[1] = 1; elements_in_sub = 2; - /* If last row and is partial and even-numbered, and have even columns (segment pairs), and odd number of finders */ + /* If last row and is partial and even-numbered, and have even columns (segment pairs), + * and odd number of finders (== odd number of columns) */ if ((current_row == stack_rows) && (num_columns != symbol->option_2) && - !(current_row & 1) && !(symbol->option_2 & 1) && (num_columns & 1)) { /* Odd number of finders == odd number of columns */ + !(current_row & 1) && !(symbol->option_2 & 1) && (num_columns & 1)) { /* Special case bottom row */ special_case_row = 1; sub_elements[0] = 2; /* Extra space (latch set below) */ } - /* If odd number of columns or current row odd-numbered or special case last row then left-to-right, else right-to-left */ + /* If odd number of columns or current row odd-numbered or special case last row then left-to-right, + * else right-to-left */ if ((symbol->option_2 & 1) || (current_row & 1) || special_case_row) { left_to_right = 1; } else { @@ -1545,7 +1450,8 @@ INTERNAL int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int if (symbol->debug & ZINT_DEBUG_PRINT) { if (current_row == stack_rows) { - printf("Last row: number of columns: %d / %d, left to right: %d, special case: %d\n", num_columns, symbol->option_2, left_to_right, special_case_row); + printf("Last row: number of columns: %d / %d, left to right: %d, special case: %d\n", + num_columns, symbol->option_2, left_to_right, special_case_row); } } @@ -1572,7 +1478,7 @@ INTERNAL int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int sub_elements[elements_in_sub + 1] = 1; elements_in_sub += 2; - latch = (current_row & 1) || special_case_row ? '0' : '1'; + latch = (current_row & 1) || special_case_row ? 0 : 1; writer = 0; for (i = 0; i < elements_in_sub; i++) { @@ -1592,13 +1498,15 @@ INTERNAL int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int symbol->row_height[symbol->rows - 2] = 1; /* bottom separator pattern (above current row) */ - rssexp_separator(symbol, writer, reader, symbol->rows - 1, 1 /*above*/, special_case_row, left_to_right, odd_last_row, &v2_latch); + 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; } if (current_row != stack_rows) { /* top separator pattern (below current row) */ - rssexp_separator(symbol, writer, reader, symbol->rows + 1, -1 /*below*/, 0 /*special_case_row*/, left_to_right, 0 /*odd_last_row*/, &v2_latch); + 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; } @@ -1609,7 +1517,8 @@ INTERNAL int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int if (symbol->symbology == BARCODE_DBAR_EXP_CC || symbol->symbology == BARCODE_DBAR_EXPSTK_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); + 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/tests/test_composite.c b/backend/tests/test_composite.c index 0a715364..f718e888 100644 --- a/backend/tests/test_composite.c +++ b/backend/tests/test_composite.c @@ -2852,6 +2852,94 @@ static void test_fuzz(int index, int debug) { testFinish(); } +#include + +#define TEST_PERF_ITERATIONS 1000 + +// Not a real test, just performance indicator +static void test_perf(int index, int debug) { + + if (!(debug & ZINT_DEBUG_TEST_PERFORMANCE)) { /* -d 256 */ + return; + } + + int ret; + struct item { + int symbology; + int option_1; + char *data; + char *composite; + int ret; + + int expected_rows; + int expected_width; + char *comment; + }; + struct item data[] = { + /* 0*/ { BARCODE_EANX_CC, 1, "123456789012", + "[91]123456789012345678901234567890123456789012345678901234", + 0, 11, 99, "58 chars CC-A" }, + /* 1*/ { BARCODE_UPCA_CC, 2, "12345678901", + "[91]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" + "[92]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" + "[93]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" + "[94]12345678901234567890123456789012345678901234567890", + 0, 48, 99, "336 chars CC-B" }, + /* 2*/ { BARCODE_GS1_128_CC, 3, "[01]12345678901231", + "[91]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" + "[92]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" + "[93]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" + "[94]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" + "[95]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" + "[96]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890", + 0, 32, 205, "564 chars CC-C" }, + }; + int data_size = ARRAY_SIZE(data); + + clock_t start, total_encode = 0, total_buffer = 0, diff_encode, diff_buffer; + + for (int i = 0; i < data_size; i++) { + + if (index != -1 && i != index) continue; + + diff_encode = diff_buffer = 0; + + for (int j = 0; j < TEST_PERF_ITERATIONS; j++) { + 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*/, data[i].option_1, -1, -1, -1 /*output_options*/, data[i].data, -1, debug); + assert_zero(length >= 128, "i:%d length %d >= 128\n", i, length); + strcpy(symbol->primary, data[i].data); + + int composite_length = strlen(data[i].composite); + + start = clock(); + ret = ZBarcode_Encode(symbol, (const unsigned char *) data[i].composite, composite_length); + diff_encode += clock() - start; + assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt); + + assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d (%s)\n", i, symbol->rows, data[i].expected_rows, data[i].data); + assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d (%s)\n", i, symbol->width, data[i].expected_width, data[i].data); + + start = clock(); + ret = ZBarcode_Buffer(symbol, 0 /*rotate_angle*/); + diff_buffer += clock() - start; + assert_zero(ret, "i:%d ZBarcode_Buffer ret %d != 0 (%s)\n", i, ret, symbol->errtxt); + + ZBarcode_Delete(symbol); + } + + printf("%s: diff_encode %gms, diff_buffer %gms\n", data[i].comment, diff_encode * 1000.0 / CLOCKS_PER_SEC, diff_buffer * 1000.0 / CLOCKS_PER_SEC); + + total_encode += diff_encode; + total_buffer += diff_buffer; + } + if (index != -1) { + printf("totals: encode %gms, buffer %gms\n", total_encode * 1000.0 / CLOCKS_PER_SEC, total_buffer * 1000.0 / CLOCKS_PER_SEC); + } +} + int main(int argc, char *argv[]) { testFunction funcs[] = { /* name, func, has_index, has_generate, has_debug */ @@ -2865,6 +2953,7 @@ int main(int argc, char *argv[]) { { "test_encodation_11", test_encodation_11, 1, 1, 1 }, { "test_addongap", test_addongap, 1, 1, 1 }, { "test_fuzz", test_fuzz, 1, 0, 1 }, + { "test_perf", test_perf, 1, 0, 1 }, }; testRun(argc, argv, funcs, ARRAY_SIZE(funcs)); diff --git a/backend/tests/test_gs1.c b/backend/tests/test_gs1.c index d9ff1824..66b4ca0c 100644 --- a/backend/tests/test_gs1.c +++ b/backend/tests/test_gs1.c @@ -286,7 +286,7 @@ static void test_hrt(int index, int debug) { testFinish(); } -extern int gs1_verify(struct zint_symbol *symbol, const unsigned char source[], const size_t src_len, char reduced[]); +#include "../gs1.h" static void test_gs1_verify(int index) { @@ -801,7 +801,7 @@ static void test_gs1_verify(int index) { int length = strlen(data[i].data); - ret = gs1_verify(symbol, (unsigned char *) data[i].data, length, reduced); + ret = gs1_verify(symbol, (unsigned char *) data[i].data, length, (unsigned char *) reduced); assert_equal(ret, data[i].ret, "i:%d ret %d != %d (length %d \"%s\") %s\n", i, ret, data[i].ret, length, data[i].data, symbol->errtxt); if (ret == 0) { diff --git a/backend/tests/test_library.c b/backend/tests/test_library.c index 0ab54f92..9607b42b 100644 --- a/backend/tests/test_library.c +++ b/backend/tests/test_library.c @@ -390,6 +390,11 @@ static void test_bad_args(void) { assert_equal(ZBarcode_Encode_File_and_Buffer(symbol, empty, 0), ZINT_ERROR_INVALID_DATA, "ZBarcode_Encode_File_and_Buffer(symbol, empty, 0) != ZINT_ERROR_INVALID_DATA\n"); assert_nonzero(strlen(symbol->errtxt), "ZBarcode_Encode_File_and_Buffer(symbol, empty, 0) no errtxt\n"); + // Data too big + symbol->errtxt[0] = '\0'; + assert_equal(ZBarcode_Encode(symbol, (unsigned char *) empty, 17401), ZINT_ERROR_TOO_LONG, "ZBarcode_Encode(symbol, empty, 17401) != ZINT_ERROR_TOO_LONG\n"); + assert_nonzero(strlen(symbol->errtxt), "ZBarcode_Encode(symbol, empty, 17401) no errtxt\n"); + ZBarcode_Delete(symbol); testFinish(); diff --git a/backend/tests/test_rss.c b/backend/tests/test_rss.c index 08f91903..bb392409 100644 --- a/backend/tests/test_rss.c +++ b/backend/tests/test_rss.c @@ -195,114 +195,115 @@ static void test_examples(int index, int generate, int debug) { int expected_rows; int expected_width; + int bwipp_cmp; char *comment; char *expected; }; // 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_DBAR_OMN, -1, "0950110153001", 1, 96, "GGS Figure 5.5.2.1.1-1. GS1 DataBar Omnidirectional", + /* 0*/ { BARCODE_DBAR_OMN, -1, "0950110153001", 1, 96, 1, "GGS Figure 5.5.2.1.1-1. GS1 DataBar Omnidirectional", "010000010100000101000111110000010111101101011100100011011101000101100000000111001110110111001101" }, - /* 1*/ { BARCODE_DBAR_EXP, -1, "[01]90614141000015[3202]000150", 1, 151, "GGS Figure 5.5.2.3.1-1. GS1 DataBar Expanded", + /* 1*/ { BARCODE_DBAR_EXP, -1, "[01]90614141000015[3202]000150", 1, 151, 1, "GGS Figure 5.5.2.3.1-1. GS1 DataBar Expanded", "0101100011001100001011111111000010100100010000111101110011100010100010111100000011100111010111111011010100000100000110001111110000101000000100011010010" }, - /* 2*/ { BARCODE_DBAR_EXPSTK, -1, "[01]90614141000015[3202]000150", 5, 102, "GGS Figure 5.5.2.3.2-1. GS1 DataBar Expanded Stacked, same (tec-it separator differs)", + /* 2*/ { BARCODE_DBAR_EXPSTK, -1, "[01]90614141000015[3202]000150", 5, 102, 1, "GGS Figure 5.5.2.3.2-1. GS1 DataBar Expanded Stacked, same (tec-it separator differs)", "010110001100110000101111111100001010010001000011110111001110001010001011110000001110011101011111101101" "000001110011001111010000000010100101101110111100001000110001110101110100001010100001100010100000010000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "000001011111011111001010000001010010111111011100100000000000000000000000000000000000000000000000000000" "001010100000100000110001111110000101000000100011010010000000000000000000000000000000000000000000000000" }, - /* 3*/ { BARCODE_DBAR_OMN, -1, "2001234567890", 1, 96, "24724:2011 Figure 1 — GS1 DataBar Omnidirectional", + /* 3*/ { BARCODE_DBAR_OMN, -1, "2001234567890", 1, 96, 1, "24724:2011 Figure 1 — GS1 DataBar Omnidirectional", "010100011101000001001111111000010100110110111110110000010010100101100000000111000110110110001101" }, - /* 4*/ { BARCODE_DBAR_OMN, -1, "0441234567890", 1, 96, "24724:2011 Figure 2 — GS1 DataBar Omnidirectional", + /* 4*/ { BARCODE_DBAR_OMN, -1, "0441234567890", 1, 96, 1, "24724:2011 Figure 2 — GS1 DataBar Omnidirectional", "010010001000010001000111000000010101000001100110101100100100000101111110000011000010100011100101" }, - /* 5*/ { BARCODE_DBAR_OMN, -1, "0001234567890", 1, 96, "24724:2011 Figure 4 — GS1 DataBar Truncated", + /* 5*/ { BARCODE_DBAR_OMN, -1, "0001234567890", 1, 96, 1, "24724:2011 Figure 4 — GS1 DataBar Truncated", "010101001000000001001111111000010111001011011110111001010110000101111111000111001100111101110101" }, - /* 6*/ { BARCODE_DBAR_STK, -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", + /* 6*/ { BARCODE_DBAR_STK, -1, "0001234567890", 3, 50, 1, "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_DBAR_OMNSTK, -1, "0003456789012", 5, 50, "24724:2011 Figure 6 — GS1 DataBar Stacked Omnidirectional", + /* 7*/ { BARCODE_DBAR_OMNSTK, -1, "0003456789012", 5, 50, 1, "24724:2011 Figure 6 — GS1 DataBar Stacked Omnidirectional", "01010100100000000100111110000001010011100110011010" "00001011011111111010000001010100101100011001100000" "00000101010101010101010101010101010101010101010000" "00001000100010111010010101010000111101001101110000" "10110111011101000101100000000111000010110010001101" }, - /* 8*/ { BARCODE_DBAR_LTD, -1, "1501234567890", 1, 79, "24724:2011 Figure 7 — GS1 DataBar Limited", + /* 8*/ { BARCODE_DBAR_LTD, -1, "1501234567890", 1, 79, 1, "24724:2011 Figure 7 — GS1 DataBar Limited", "0100011001100011011010100111010010101101001101001001011000110111001100110100000" }, - /* 9*/ { BARCODE_DBAR_LTD, -1, "0031234567890", 1, 79, "24724:2011 Figure 8 — (a) GS1 DataBar Limited", + /* 9*/ { BARCODE_DBAR_LTD, -1, "0031234567890", 1, 79, 1, "24724:2011 Figure 8 — (a) GS1 DataBar Limited", "0101010000010010001000010111001010110110100101011000001010010010110000010100000" }, - /* 10*/ { BARCODE_DBAR_EXP, -1, "[01]98898765432106[3202]012345[15]991231", 1, 200, "24724:2011 Figure 10 — GS1 DataBar Expanded", + /* 10*/ { BARCODE_DBAR_EXP, -1, "[01]98898765432106[3202]012345[15]991231", 1, 200, 1, "24724:2011 Figure 10 — GS1 DataBar Expanded", "01001000011000110110111111110000101110000110010100011010000001100010101111110000111010011100000010010100111110111001100011111100001011101100000100100100011110010110001011111111001110001101111010000101" }, - /* 11*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3103]001750", 1, 151, "24724:2011 Figure 11 — GS1 DataBar Expanded", + /* 11*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3103]001750", 1, 151, 1, "24724:2011 Figure 11 — GS1 DataBar Expanded", "0101110010000010011011111111000010111000010011000101011110111001100010111100000011100101110001110111011110101111000110001111110000101011000010011111010" }, - /* 12*/ { BARCODE_DBAR_EXPSTK, -1, "[01]98898765432106[3202]012345[15]991231", 5, 102, "24724:2011 Figure 12 — GS1 DataBar Expanded Stacked symbol", + /* 12*/ { BARCODE_DBAR_EXPSTK, -1, "[01]98898765432106[3202]012345[15]991231", 5, 102, 1, "24724:2011 Figure 12 — GS1 DataBar Expanded Stacked symbol", "010010000110001101101111111100001011100001100101000110100000011000101011111100001110100111000000100101" "000001111001110010010000000010100100011110011010111001011111100111010100000010100001011000111111010000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "000011101000010011100001000000001011100101100001110110110111110010001001010000001010011000100000110000" "101000010111101100011100111111110100011010011110001001001000001101110100001111110001100111011111001010" }, - /* 13*/ { BARCODE_DBAR_EXPSTK, -1, "[01]95012345678903[3103]000123", 5, 102, "24724:2011 Figure 13 — GS1 DataBar Expanded Stacked", + /* 13*/ { BARCODE_DBAR_EXPSTK, -1, "[01]95012345678903[3103]000123", 5, 102, 1, "24724:2011 Figure 13 — GS1 DataBar Expanded Stacked", "010100010001111000101111111100001010111000001100010111000110001001101011110000001110010111000111011101" "000011101110000111010000000010100101000111110011101000111001110110010100001010100001101000111000100000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "000000001010000111001010000001010010111011011111100000000000000000000000000000000000000000000000000000" "001011110101111000110001111110000101000100100000011010000000000000000000000000000000000000000000000000" }, - /* 14*/ { BARCODE_DBAR_LTD, -1, "0009876543210", 1, 79, "24724:2011 Figure F.2 — GS1 DataBar Limited", + /* 14*/ { BARCODE_DBAR_LTD, -1, "0009876543210", 1, 79, 1, "24724:2011 Figure F.2 — GS1 DataBar Limited", "0101010010010011000011000001010110100101100101000100010100010000010010010100000" }, - /* 15*/ { BARCODE_DBAR_EXP, -1, "[10]12A", 1, 102, "24724:2011 Figure F.3 — GS1 DataBar Expanded", + /* 15*/ { BARCODE_DBAR_EXP, -1, "[10]12A", 1, 102, 1, "24724:2011 Figure F.3 — GS1 DataBar Expanded", "010100000110100000101111111100001010001000000010110101111100100111001011110000000010011101111111010101" }, - /* 16*/ { BARCODE_DBAR_STK, -1, "0000000000000", 3, 50, "#183 GS1 DataBar Stacked separator alternation; verified manually against tec-it.com", + /* 16*/ { BARCODE_DBAR_STK, -1, "0000000000000", 3, 50, 1, "#183 GS1 DataBar Stacked separator alternation; verified manually against tec-it.com", "01010100100000000100011111111001011111110010101010" "00000101011111111010100000001010100000001101010000" "10101010110000000101111111110111011111111011010101" }, - /* 17*/ { BARCODE_DBAR_EXP, -1, "[255]95011015340010123456789", 1, 232, "GGS 2.6.2.1 Example 1", + /* 17*/ { BARCODE_DBAR_EXP, -1, "[255]95011015340010123456789", 1, 232, 1, "GGS 2.6.2.1 Example 1", "0100011000110001011011111111000010100000010101100001100001100111001010111110000001100100001110100001001000011011111010001111110000101001011111100111011001000111100100101111111100111011111001100100110010011100010111100011110000001010" }, - /* 18*/ { BARCODE_DBAR_EXP, -1, "[255]95011015340010123456789[3900]000", 1, 298, "GGS 2.6.2.1 Example 2", + /* 18*/ { BARCODE_DBAR_EXP, -1, "[255]95011015340010123456789[3900]000", 1, 298, 1, "GGS 2.6.2.1 Example 2", "0101100011111010001011111111000010100001000001001101100001100111001010111110000001100100001110100001001000011011111010001111110000101001011111100111011001000111100100101111111100111011111001100100110010011100010111100011000000001010111111011101000100001000110001101011111111100110011110010010001101" }, - /* 19*/ { BARCODE_DBAR_EXP, -1, "[255]9501101534001[17]160531[3902]050", 1, 281, "GGS 2.6.2.1 Example 3", + /* 19*/ { BARCODE_DBAR_EXP, -1, "[255]9501101534001[17]160531[3902]050", 1, 281, 1, "GGS 2.6.2.1 Example 3", "01011001000110011110111111110000101000000101011000011000011001110010101111100000011001000011101000010010000110111110100011111100001010010111111001110111000010010100001011111111001110000100001100110100010000001101001000110000000010111010011110011101110010110001100010111111111001101" }, - /* 20*/ { BARCODE_DBAR_EXPSTK, 3, "[255]9501101534001012345[8111]0500", 5, 151, "GGS 2.6.2.1 Example 4, same (tec-it separator differs)", + /* 20*/ { BARCODE_DBAR_EXPSTK, 3, "[255]9501101534001012345[8111]0500", 5, 151, 1, "GGS 2.6.2.1 Example 4, same (tec-it separator differs)", "0101100111100011001011111111000010100000010101100001100001100111001010111110000001100100001110100001001000011011111010001111110000101001011111100111010" "0000011000011100110100000000101001011111101010011110011110011000110101000001010100011011110001011110110111100100000101010000001010010110100000011000000" "0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" "0000110111000011011010000000010000100000100111011001100001100100010010100101010100101110110001111001011101100011101110100000000010000000000000000000000" "1011001000111100100101111111100111011111011000100110011110011011101100011000000001010001001110000110100010011100010001011111111100110100000000000000000" }, - /* 21*/ { BARCODE_DBAR_EXPSTK, 3, "[255]9501101534001[3941]0035", 5, 151, "GGS 2.6.2.1 Example 5, same (tec-it separator differs)", + /* 21*/ { BARCODE_DBAR_EXPSTK, 3, "[255]9501101534001[3941]0035", 5, 151, 1, "GGS 2.6.2.1 Example 5, same (tec-it separator differs)", "0100001101011000011011111111000010100000010101100001100001100111001010111110000001100100001110100001001000011011111010001111110000101001011111100111010" "0000110010100111100100000000101001011111101010011110011110011000110101000001010100011011110001011110110111100100000101010000001010010110100000011000000" "0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" "0000011011111011111010000000010000111100101011111001000100011100111010100001010100000000000000000000000000000000000000000000000000000000000000000000000" "1010100100000100000101111111100111000011010100000110111011100011000100011110000001010000000000000000000000000000000000000000000000000000000000000000000" }, - /* 22*/ { BARCODE_DBAR_OMN, -1, "0950110153000", 1, 96, "https://www.gs1.org/standards/barcodes/databar, same, verified manually against tec-it", + /* 22*/ { BARCODE_DBAR_OMN, -1, "0950110153000", 1, 96, 1, "https://www.gs1.org/standards/barcodes/databar, same, verified manually against tec-it", "010000010100000101000111111110010111101101011100100011011011000101111110000011001110110111001101" }, - /* 23*/ { BARCODE_DBAR_STK, -1, "0950110153000", 3, 50, "https://www.gs1.org/standards/barcodes/databar, same, verified manually against tec-it", + /* 23*/ { BARCODE_DBAR_STK, -1, "0950110153000", 3, 50, 1, "https://www.gs1.org/standards/barcodes/databar, same, verified manually against tec-it", "01000001010000010100011111111001011110110101110010" "00001100101101101010100001010100100001001010100000" "10100011011011000101111110000011001110110111001101" }, - /* 24*/ { BARCODE_DBAR_EXPSTK, -1, "[01]09501101530003[17]140704[10]AB-123", 9, 102, "https://www.gs1.org/standards/barcodes/databar, same (tec-it separator differs)", + /* 24*/ { BARCODE_DBAR_EXPSTK, -1, "[01]09501101530003[17]140704[10]AB-123", 9, 102, 1, "https://www.gs1.org/standards/barcodes/databar, same (tec-it separator differs)", "010101111100001001101111111100001011100001110110010100000011011010001011111000000110011010000001001101" "000010000011110110010000000010100100011110001001101011111100100101110100000101010001100101111110110000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" @@ -313,64 +314,64 @@ static void test_examples(int index, int generate, int debug) { "000010111101011110010100101010100100111100110010111001001100011111010100000000010000000000000000000000" "010001000010100001100011000000001011000011001101000110110011100000101011111111100110100000000000000000" }, - /* 25*/ { BARCODE_DBAR_EXP, -1, "[01]09501101530003[17]140704[10]AB-123", 1, 281, "https://www.gs1.org/standards/barcodes/databar, same, verified manually against tec-it", + /* 25*/ { BARCODE_DBAR_EXP, -1, "[01]09501101530003[17]140704[10]AB-123", 1, 281, 1, "https://www.gs1.org/standards/barcodes/databar, same, verified manually against tec-it", "01010111110000100110111111110000101110000111011001010000001101101000101111100000011001101000000100110001110100010001100011111100001010100000111100100100100111000001001011111111001110000011011001000100010000101000011000110000000010110000110011010001101100111000001010111111111001101" }, - /* 26*/ { BARCODE_DBAR_STK, -1, "07010001234567", 3, 50, "https://www.gs1.no/support/standardbibliotek/datafangst/gs1-databar, same, verified manually against tec-it", + /* 26*/ { BARCODE_DBAR_STK, -1, "07010001234567", 3, 50, 1, "https://www.gs1.no/support/standardbibliotek/datafangst/gs1-databar, same, verified manually against tec-it", "01000100001010000100011100000001011000100110001010" "00000011010101011010101011111010100111010101010000" "10111100101110100101100000000111011000001000110101" }, - /* 27*/ { BARCODE_DBAR_OMNSTK, -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))", + /* 27*/ { BARCODE_DBAR_OMNSTK, -1, "12380000000008", 5, 50, 1, "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_DBAR_OMNSTK, -1, "99991234912372", 5, 50, "Example with finder values 8 & 6, same as BWIPP, verified manually against tec-it and IDAutomation", + /* 28*/ { BARCODE_DBAR_OMNSTK, -1, "99991234912372", 5, 50, 1, "Example with finder values 8 & 6, same as BWIPP, verified manually against tec-it and IDAutomation", "01001011101110000101110000000001011111011100101010" "00000100010001111010001010101010100000100011010000" "00000101010101010101010101010101010101010101010000" "00001000100011001010000000010100100001000100100000" "10100111011100110101111111100011011110111011011101" }, - /* 29*/ { BARCODE_DBAR_OMNSTK, -1, "32219876543217", 5, 50, "Example with finder values 6 & 1, same as BWIPP, verified manually against tec-it and IDAutomation", + /* 29*/ { BARCODE_DBAR_OMNSTK, -1, "32219876543217", 5, 50, 1, "Example with finder values 6 & 1, same as BWIPP, verified manually against tec-it and IDAutomation", "01001011000010001100111000000001011100010101000010" "00000100111101110010000101010100100011101010110000" "00000101010101010101010101010101010101010101010000" "00001110011100101010000010101000110100001000010000" "10110001100011010101111100000111001011110111100101" }, - /* 30*/ { BARCODE_DBAR_OMNSTK, -1, "32219876543255", 5, 50, "Example with finder values 7 & 7, same as BWIPP, verified manually against tec-it and IDAutomation", + /* 30*/ { BARCODE_DBAR_OMNSTK, -1, "32219876543255", 5, 50, 1, "Example with finder values 7 & 7, same as BWIPP, verified manually against tec-it and IDAutomation", "01001011000010001101111100000001011100010101000010" "00000100111101110010000010101010100011101010110000" "00000101010101010101010101010101010101010101010000" "00000111001110101010000000101010110100001000010000" "10111000110001010101111111000001001011110111100101" }, - /* 31*/ { BARCODE_DBAR_OMNSTK, -1, "04072912296211", 5, 50, "Example with finder values 7 & 8, same as BWIPP, verified manually against tec-it and IDAutomation", + /* 31*/ { BARCODE_DBAR_OMNSTK, -1, "04072912296211", 5, 50, 1, "Example with finder values 7 & 8, same as BWIPP, verified manually against tec-it and IDAutomation", "01001001000000010101111100000001011111000100101010" "00000110111111101010000010101010100000111011010000" "00000101010101010101010101010101010101010101010000" "00001110100010111010000000001010111010000111010000" "10110001011101000101111111110001000101111000101101" }, - /* 32*/ { BARCODE_DBAR_OMNSTK, -1, "06666666666666", 5, 50, "Example with finder values 6 & 4, same as BWIPP, verified manually against tec-it and IDAutomation", + /* 32*/ { BARCODE_DBAR_OMNSTK, -1, "06666666666666", 5, 50, 1, "Example with finder values 6 & 4, same as BWIPP, verified manually against tec-it and IDAutomation", "01000100010010000100111000000001011110111100101010" "00001011101101111010000101010100100001000011010000" "00000101010101010101010101010101010101010101010000" "00000100011111001010000101010100101001100001110000" "10101011100000110101111000000011010110011110000101" }, - /* 33*/ { BARCODE_DBAR_EXPSTK, -1, "[90]12345678901234567", 5, 102, "Example with 7 chars, 1 full row, bottom 3 chars", + /* 33*/ { BARCODE_DBAR_EXPSTK, -1, "[90]12345678901234567", 5, 102, 1, "Example with 7 chars, 1 full row, bottom 3 chars", "010010100001111000101111111100001010000010001110110100111110001011101011111100001110001111010011000101" "000001011110000111010000000010100101111101110001001011000001110100010100000010100001110000101100110000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "000000100000000101111110110001101011110001110011010100101000000101000010010111000000000000000000000000" "101110011111111010000001001110010100001110001100101010000111111000111101101000111101000000000000000000" }, - /* 34*/ { BARCODE_DBAR_EXPSTK, -1, "[90]123456789012345678901234567", 9, 102, "Example with 10 chars, 2 full rows, bottom 2 chars", + /* 34*/ { BARCODE_DBAR_EXPSTK, -1, "[90]123456789012345678901234567", 9, 102, 1, "Example with 10 chars, 2 full rows, bottom 2 chars", "010000111100100010101111111100001010001000100000110100111110001011101011111000000110001111010011000101" "000011000011011101010000000010100101110111011111001011000001110100010100000101010001110000101100110000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" @@ -381,7 +382,7 @@ static void test_examples(int index, int generate, int debug) { "000010000110110001010100001010100100000111010011000000000000000000000000000000000000000000000000000000" "010001111001001110100011110000001011111000101100100100000000000000000000000000000000000000000000000000" }, - /* 35*/ { BARCODE_DBAR_EXPSTK, -1, "[90]123456789012345678901234567890", 9, 102, "Example with 11 chars, 2 full rows, bottom 3 chars", + /* 35*/ { BARCODE_DBAR_EXPSTK, -1, "[90]123456789012345678901234567890", 9, 102, 1, "Example with 11 chars, 2 full rows, bottom 3 chars", "010111011100010001101111111100001010000010001110110100111110001011101011111000000110001111010011000101" "000000100011101110010000000010100101111101110001001011000001110100010100000101010001110000101100110000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" @@ -392,7 +393,7 @@ static void test_examples(int index, int generate, int debug) { "000010000110110001010100101010100100111000100011011011000110001101110100000000010000000000000000000000" "010001111001001110100011000000001011000111011100100100111001110010001011111111100110100000000000000000" }, - /* 36*/ { BARCODE_DBAR_EXPSTK, -1, "[91]1234567890123456789012345678901234", 9, 102, "Example with 12 chars, 3 full rows", + /* 36*/ { BARCODE_DBAR_EXPSTK, -1, "[91]1234567890123456789012345678901234", 9, 102, 1, "Example with 12 chars, 3 full rows", "010100010011111001101111111100001011001000010000010100111110001011101011111000000110001111010011000101" "000011101100000110010000000010100100110111101111101011000001110100010100000101010001110000101100110000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" @@ -403,7 +404,7 @@ static void test_examples(int index, int generate, int debug) { "000010000110110001010100101010100100111000100011011011000110001110110100000000010001101110100001000000" "010001111001001110100011000000001011000111011100100100111001110001001011111111100110010001011110111101" }, - /* 37*/ { BARCODE_DBAR_EXPSTK, -1, "[91]123456789012345678901234567890123456789012", 13, 102, "Example with 15 chars, 3 full rows, bottom 7 chars", + /* 37*/ { BARCODE_DBAR_EXPSTK, -1, "[91]123456789012345678901234567890123456789012", 13, 102, 1, "Example with 15 chars, 3 full rows, bottom 7 chars", "010010000111101011101111111100001011100000101100010100111110001011101011110000000010001111010011000101" "000001111000010100010000000010100100011111010011101011000001110100010100001010101001110000101100110000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" @@ -418,7 +419,7 @@ static void test_examples(int index, int generate, int debug) { "000000100000000101001001111101100011000010000110010100101010100101011111011100100000000000000000000000" "101110011111111010110110000010011100111101111001101010000000011000100000100011011101000000000000000000" }, - /* 38*/ { BARCODE_DBAR_EXPSTK, 3, "[91]123456789012345678901234567890123456789012", 9, 151, "Example with 15 chars, 2 full rows, bottom 3 chars", + /* 38*/ { BARCODE_DBAR_EXPSTK, 3, "[91]123456789012345678901234567890123456789012", 9, 151, 1, "Example with 15 chars, 2 full rows, bottom 3 chars", "0100100001111010111011111111000010111000001011000101001111100010111010111100000000100011110100110001011110001011011110001111110000101010011000111000010" "0000011110000101000100000000101001000111110100111010110000011101000101000010101010011100001011001110100001110100100001010000001010010101100111000110000" "0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" @@ -429,7 +430,7 @@ static void test_examples(int index, int generate, int debug) { "0000001001110111110101001010101001010011000010000110001101111100100101000000001000000000000000000000000000000000000000000000000000000000000000000000000" "0101110110001000001000110000000010101100111101111001110010000011011010111111110011101000000000000000000000000000000000000000000000000000000000000000000" }, - /* 39*/ { BARCODE_DBAR_EXPSTK, -1, "[91]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFG", 17, 102, "Example with 19 chars, 4 full rows, bottom 3 chars", + /* 39*/ { BARCODE_DBAR_EXPSTK, -1, "[91]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFG", 17, 102, 1, "Example with 19 chars, 4 full rows, bottom 3 chars", "010101111100011101101111111100001011100000101100010101111110011110101011110000000010111000111110010101" "000010000011100010010000000010100100011111010011101010000001100001010100001010101001000111000001100000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" @@ -448,7 +449,7 @@ static void test_examples(int index, int generate, int debug) { "000010011111000111010001010101010101000111001111011011110100110000110100000000010000000000000000000000" "010101100000111000100110000000001010111000110000100100001011001111001011111111100110100000000000000000" }, - /* 40*/ { BARCODE_DBAR_EXPSTK, -1, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 21, 102, "Example with 22 chars, 5 full rows, bottom 2 chars", + /* 40*/ { BARCODE_DBAR_EXPSTK, -1, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 21, 102, 1, "Example with 22 chars, 5 full rows, bottom 2 chars", "010101011110111111101111111100001011001000000101000100111110001011101011110000000010001111010011000101" "000010100001000000010000000010100100110111111010111011000001110100010100001010101001110000101100110000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" @@ -471,7 +472,7 @@ static void test_examples(int index, int generate, int debug) { "000001000111010000101000101010101010100001011000110000000000000000000000000000000000000000000000000000" "001000111000101111010011000000000101011110100111000010000000000000000000000000000000000000000000000000" }, - /* 41*/ { BARCODE_DBAR_EXPSTK, 3, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 13, 151, "Example with 22 chars, 3 full rows, bottom 4 chars", + /* 41*/ { BARCODE_DBAR_EXPSTK, 3, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 13, 151, 1, "Example with 22 chars, 3 full rows, bottom 4 chars", "0101010111101111111011111111000010110010000001010001001111100010111010111100000000100011110100110001011110001011011110001111110000101010011000111000010" "0000101000010000000100000000101001001101111110101110110000011101000101000010101010011100001011001110100001110100100001010000001010010101100111000110000" "0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" @@ -486,7 +487,7 @@ static void test_examples(int index, int generate, int debug) { "0000101110001000111010000000001000101111101000110001110001110100001010001010101010101000010110001100000000000000000000000000000000000000000000000000000" "1010010001110111000101111111110011010000010111001110001110001011110100110000000001010111101001110000100000000000000000000000000000000000000000000000000" }, - /* 42*/ { BARCODE_DBAR_EXPSTK, 4, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 9, 200, "Example with 22 chars, 2 full rows, bottom 6 chars", + /* 42*/ { BARCODE_DBAR_EXPSTK, 4, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 9, 200, 1, "Example with 22 chars, 2 full rows, bottom 6 chars", "01010101111011111110111111110000101100100000010100010011111000101110101111000000001000111101001100010111100010110111100011111100001010100110001110000101001110000010001011110000001110001110001000100101" "00001010000100000001000000001010010011011111101011101100000111010001010000101010100111000010110011101000011101001000010100000010100101011001110001111010110001111101110100001010100001110001110111010000" "00000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" @@ -497,7 +498,7 @@ static void test_examples(int index, int generate, int debug) { "00000011000110001001000000010101010000011110011010101101110001000111010000000001000101111101000110001110001110100001010001010101010101000010110001100000000000000000000000000000000000000000000000000000" "01011100111001110110011111100000101111100001100101010010001110111000101111111110011010000010111001110001110001011110100110000000001010111101001110000100000000000000000000000000000000000000000000000000" }, - /* 43*/ { BARCODE_DBAR_EXPSTK, 5, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 9, 249, "Example with 22 chars, 2 full rows, bottom 2 chars", + /* 43*/ { BARCODE_DBAR_EXPSTK, 5, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 9, 249, 1, "Example with 22 chars, 2 full rows, bottom 2 chars", "010101011110111111101111111100001011001000000101000100111110001011101011110000000010001111010011000101111000101101111000111111000010101001100011100001010011100000100010111100000011100011100010001001000111100100111010001111000000101100011101110010010" "000010100001000000010000000010100100110111111010111011000001110100010100001010101001110000101100111010000111010010000101000000101001010110011100011110101100011111011101000010101000011100011101110110111000011011000101010000101010010011100010001100000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" @@ -508,45 +509,45 @@ static void test_examples(int index, int generate, int debug) { "000010001110100001010001010101010101000010110001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "010001110001011110100110000000001010111101001110000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" }, - /* 44*/ { BARCODE_DBAR_EXPSTK, 6, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 5, 298, "Example with 22 chars, 1 full row, bottom 10 chars", + /* 44*/ { BARCODE_DBAR_EXPSTK, 6, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 5, 298, 1, "Example with 22 chars, 1 full row, bottom 10 chars", "0101010111101111111011111111000010110010000001010001001111100010111010111100000000100011110100110001011110001011011110001111110000101010011000111000010100111000001000101111000000111000111000100010010001111001001110100011110000001011000111011100100100111001110001001011111111001110100001011110111101" "0000101000010000000100000000101001001101111110101110110000011101000101000010101010011100001011001110100001110100100001010000001010010101100111000111101011000111110111010000101010000111000111011101101110000110110001010100001010100100111000100011011011000110001110110100000000100001011110100001000000" "0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "0000000100111011111010100101010100101001100001000011000100010111101110100000101010001100000110011010010001100011000100100000001010101000001111001101010110111000100011101000000000100010111110100011000111000111010000101000101010101010100001011000110000000000000000000000000000000000000000000000000000" "0010111011000100000100011000000001010110011110111100111011101000010001011111000000110011111001100101101110011100111011001111110000010111110000110010101001000111011100010111111111001101000001011100111000111000101111010011000000000101011110100111000010000000000000000000000000000000000000000000000000" }, - /* 45*/ { BARCODE_DBAR_EXPSTK, 7, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 5, 347, "Example with 22 chars, 1 full row, bottom 8 chars", + /* 45*/ { BARCODE_DBAR_EXPSTK, 7, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 5, 347, 1, "Example with 22 chars, 1 full row, bottom 8 chars", "01010101111011111110111111110000101100100000010100010011111000101110101111000000001000111101001100010111100010110111100011111100001010100110001110000101001110000010001011110000001110001110001000100100011110010011101000111100000010110001110111001001001110011100010010111111110011101000010111101111011101100010000010001100000000101011001111011110010" "00001010000100000001000000001010010011011111101011101100000111010001010000101010100111000010110011101000011101001000010100000010100101011001110001111010110001111101110100001010100001110001110111011011100001101100010101000010101001001110001000110110110001100011101101000000001000010111101000010000100010011101111101010010101010010100110000100000000" "00000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" "00000100010111101110100000101010001100000110011010010001100011000100100000001010101000001111001101010110111000100011101000000000100010111110100011000111000111010000101000101010101010100001011000110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "10111011101000010001011111000000110011111001100101101110011100111011001111110000010111110000110010101001000111011100010111111111001101000001011100111000111000101111010011000000000101011110100111000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" }, - /* 46*/ { BARCODE_DBAR_EXPSTK, 8, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 5, 396, "Example with 22 chars, 1 full row, bottom 6 chars", + /* 46*/ { BARCODE_DBAR_EXPSTK, 8, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 5, 396, 1, "Example with 22 chars, 1 full row, bottom 6 chars", "010101011110111111101111111100001011001000000101000100111110001011101011110000000010001111010011000101111000101101111000111111000010101001100011100001010011100000100010111100000011100011100010001001000111100100111010001111000000101100011101110010010011100111000100101111111100111010000101111011110111011000100000100011000000001010110011110111100111011101000010001011111000000110011111001100101101" "000010100001000000010000000010100100110111111010111011000001110100010100001010101001110000101100111010000111010010000101000000101001010110011100011110101100011111011101000010101000011100011101110110111000011011000101010000101010010011100010001101101100011000111011010000000010000101111010000100001000100111011111010100101010100101001100001000011000100010111101110100000101010001100000110011010000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "000000011000110001001000000010101010000011110011010101101110001000111010000000001000101111101000110001110001110100001010001010101010101000010110001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "001011100111001110110011111100000101111100001100101010010001110111000101111111110011010000010111001110001110001011110100110000000001010111101001110000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" }, - /* 47*/ { BARCODE_DBAR_EXPSTK, 9, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 5, 445, "Example with 22 chars, 1 full row, bottom 4 chars", + /* 47*/ { BARCODE_DBAR_EXPSTK, 9, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 5, 445, 1, "Example with 22 chars, 1 full row, bottom 4 chars", "0101010111101111111011111111000010110010000001010001001111100010111010111100000000100011110100110001011110001011011110001111110000101010011000111000010100111000001000101111000000111000111000100010010001111001001110100011110000001011000111011100100100111001110001001011111111001110100001011110111101110110001000001000110000000010101100111101111001110111010000100010111110000001100111110011001011011100111001110110011111100000101111100001100101010" "0000101000010000000100000000101001001101111110101110110000011101000101000010101010011100001011001110100001110100100001010000001010010101100111000111101011000111110111010000101010000111000111011101101110000110110001010100001010100100111000100011011011000110001110110100000000100001011110100001000010001001110111110101001010101001010011000010000110001000101111011101000001010100011000001100110100100011000110001001000000010101010000011110011010000" "0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" "0000101110001000111010000000001000101111101000110001110001110100001010001010101010101000010110001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "1010010001110111000101111111110011010000010111001110001110001011110100110000000001010111101001110000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" }, - /* 48*/ { BARCODE_DBAR_EXPSTK, 10, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 5, 494, "Example with 22 chars, 1 full row, bottom 2 chars", + /* 48*/ { BARCODE_DBAR_EXPSTK, 10, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 5, 494, 1, "Example with 22 chars, 1 full row, bottom 2 chars", "01010101111011111110111111110000101100100000010100010011111000101110101111000000001000111101001100010111100010110111100011111100001010100110001110000101001110000010001011110000001110001110001000100100011110010011101000111100000010110001110111001001001110011100010010111111110011101000010111101111011101100010000010001100000000101011001111011110011101110100001000101111100000011001111100110010110111001110011101100111111000001011111000011001010100100011101110001011111111100110100000101110011101" "00001010000100000001000000001010010011011111101011101100000111010001010000101010100111000010110011101000011101001000010100000010100101011001110001111010110001111101110100001010100001110001110111011011100001101100010101000010101001001110001000110110110001100011101101000000001000010111101000010000100010011101111101010010101010010100110000100001100010001011110111010000010101000110000011001101001000110001100010010000000101010100000111100110101011011100010001110100000000010001011111010001100000" "00000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "00000100011101000010100010101010101010000101100011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "00100011100010111101001100000000010101111010011100001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" }, - /* 49*/ { BARCODE_DBAR_EXPSTK, 11, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 1, 543, "Example with 22 chars, 1 row", + /* 49*/ { BARCODE_DBAR_EXPSTK, 11, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 1, 543, 1, "Example with 22 chars, 1 row", "010101011110111111101111111100001011001000000101000100111110001011101011110000000010001111010011000101111000101101111000111111000010101001100011100001010011100000100010111100000011100011100010001001000111100100111010001111000000101100011101110010010011100111000100101111111100111010000101111011110111011000100000100011000000001010110011110111100111011101000010001011111000000110011111001100101101110011100111011001111110000010111110000110010101001000111011100010111111111001101000001011100111000111000101111010011000000000101011110100111000010" }, - /* 50*/ { BARCODE_DBAR_EXPSTK, 1, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 41, 53, "Example with 22 chars, 11 rows", + /* 50*/ { BARCODE_DBAR_EXPSTK, 1, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 41, 53, 1, "Example with 22 chars, 11 rows", "01010101111011111110111111110000101100100000010100010" "00001010000100000001000000001010010011011111101010000" "00000101010101010101010101010101010101010101010100000" @@ -589,14 +590,14 @@ static void test_examples(int index, int generate, int debug) { "00001000111010000101000101010101010100001011000110000" "01000111000101111010011000000000101011110100111000010" }, - /* 51*/ { BARCODE_DBAR_EXPSTK, 6, "[01]98898765432106[3202]012345[15]991231[3203]001234[17]010203", 5, 298, "#200 Daniel Gredler mostly empty last row, 16 chars, 2 rows, bottom row 4 chars", + /* 51*/ { BARCODE_DBAR_EXPSTK, 6, "[01]98898765432106[3202]012345[15]991231[3203]001234[17]010203", 5, 298, 1, "#200 Daniel Gredler mostly empty last row, 16 chars, 2 rows, bottom row 4 chars", "0100011101110001011011111111000010110000100101111101101000000110001010111100000000101001110000001001010011111011100110001111110000101110101000011000011010011100011000101111000000111001111000111101010111110010110000100011110000001010110010000010000111011111000100101011111100001110011110011000100101" "0000100010001110100100000000101001001111011010000010010111111001110101000010101010010110001111110110101100000100011001010000001010010001010111100111100101100011100111010000101010000110000111000010101000001101001111010100001010100101001101111101111000100000111011010100000010100001100001100111010000" "0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "0000110000010010011000010000000010111110011010001001111010011011100010010101010010101110100011111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "1010001111101101100111001111111101000001100101110110000101100100011101000000001100010001011100000110100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" }, - /* 52*/ { BARCODE_DBAR_EXPSTK, 3, "[01]98898765432106[3202]012345[15]991231[3203]001234[17]010203", 9, 151, "#200 16 chars, 3 rows, bottom row 4 chars", + /* 52*/ { BARCODE_DBAR_EXPSTK, 3, "[01]98898765432106[3202]012345[15]991231[3203]001234[17]010203", 9, 151, 1, "#200 16 chars, 3 rows, bottom row 4 chars", "0100011101110001011011111111000010110000100101111101101000000110001010111100000000101001110000001001010011111011100110001111110000101110101000011000010" "0000100010001110100100000000101001001111011010000010010111111001110101000010101010010110001111110110101100000100011001010000001010010001010111100110000" "0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" @@ -607,30 +608,114 @@ static void test_examples(int index, int generate, int debug) { "0000011111000101110101001010101001000111011001011110010001011001111101000000001000011001001000001100000000000000000000000000000000000000000000000000000" "0101100000111010001000110000000010111000100110100001101110100110000010111111110011100110110111110001010000000000000000000000000000000000000000000000000" }, - /* 53*/ { BARCODE_DBAR_EXPSTK, 4, "[01]98898765432106[3202]012345[15]991231[3203]001234[17]010203", 5, 200, "#200 16 chars, 2 full rows", + /* 53*/ { BARCODE_DBAR_EXPSTK, 4, "[01]98898765432106[3202]012345[15]991231[3203]001234[17]010203", 5, 200, 1, "#200 16 chars, 2 full rows", "01000111011100010110111111110000101100001001011111011010000001100010101111000000001010011100000010010100111110111001100011111100001011101010000110000110100111000110001011110000001110011110001111010101" "00001000100011101001000000001010010011110110100000100101111110011101010000101010100101100011111101101011000001000110010100000010100100010101111001111001011000111001110100001010100001100001110000100000" "00000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "00001100000100100110000100000000101111100110100010011110100110111000100101010100101011101000111110010110111001100001100001010000001010110111000001000111101111101100101001010100001010111100101100000000" "10100011111011011001110011111111010000011001011101100001011001000111010000000011000100010111000001101001000110011110011100001111110101001000111110111000010000010011010100000011110001000011010011111010" }, - /* 54*/ { BARCODE_DBAR_EXPSTK, 5, "[01]98898765432106[3202]012345[15]991231[3203]001234[17]010203", 5, 249, "#200 16 chars, 2 rows, bottom row 6 chars", + /* 54*/ { BARCODE_DBAR_EXPSTK, 5, "[01]98898765432106[3202]012345[15]991231[3203]001234[17]010203", 5, 249, 1, "#200 16 chars, 2 rows, bottom row 6 chars", "010001110111000101101111111100001011000010010111110110100000011000101011110000000010100111000000100101001111101110011000111111000010111010100001100001101001110001100010111100000011100111100011110101011111001011000010001111000000101011001000001000010" "000010001000111010010000000010100100111101101000001001011111100111010100001010101001011000111111011010110000010001100101000000101001000101011110011110010110001110011101000010101000011000011100001010100000110100111101010000101010010100110111110110000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" "000001000001110110101000000101000011000011001110110100111110001011101010010101010010001110110010111100100010110011111010000000010000110010010000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "101110111110001001010111111000011100111100110001001011000001110100010001100000000101110001001101000011011101001100000101111111100111001101101111100010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" }, - /* 55*/ { BARCODE_DBAR_EXPSTK, 7, "[01]98898765432106[3202]012345[15]991231[3203]001234[17]010203", 5, 347, "#200 16 chars, 2 rows, bottom row 2 chars", + /* 55*/ { BARCODE_DBAR_EXPSTK, 7, "[01]98898765432106[3202]012345[15]991231[3203]001234[17]010203", 5, 347, 1, "#200 16 chars, 2 rows, bottom row 2 chars", "01000111011100010110111111110000101100001001011111011010000001100010101111000000001010011100000010010100111110111001100011111100001011101010000110000110100111000110001011110000001110011110001111010101111100101100001000111100000010101100100000100001110111110001001010111111000011100111100110001001011000001110100010001100000000101110001001101000010" "00001000100011101001000000001010010011110110100000100101111110011101010000101010100101100011111101101011000001000110010100000010100100010101111001111001011000111001110100001010100001100001110000101010000011010011110101000010101001010011011111011110001000001110110101000000101000011000011001110110100111110001011101010010101010010001110110010110000" "00000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" "00001000101100111110100000000100001100100100000110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "10110111010011000001011111111001110011011011111000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" }, - /* 56*/ { BARCODE_DBAR_EXPSTK, 8, "[01]98898765432106[3202]012345[15]991231[3203]001234[17]010203", 1, 396, "#200 16 chars, 1 row", + /* 56*/ { BARCODE_DBAR_EXPSTK, 8, "[01]98898765432106[3202]012345[15]991231[3203]001234[17]010203", 1, 396, 1, "#200 16 chars, 1 row", "010001110111000101101111111100001011000010010111110110100000011000101011110000000010100111000000100101001111101110011000111111000010111010100001100001101001110001100010111100000011100111100011110101011111001011000010001111000000101011001000001000011101111100010010101111110000111001111001100010010110000011101000100011000000001011100010011010000110111010011000001011111111001110011011011111000101" }, + /* 57*/ { BARCODE_DBAR_EXP, -1, "[01]00012345678905[10]ABC123", 1, 232, 1, "24724:2011 7.2.5.4.1, encoding method 1 '1'", + "0100011000001011011011111111000010110011000010111101011110011011111010111110000001100010110000110111000111101101011110001111110000101110001100100001010011101111110110101111111100111001011011111101110011011100101111100011110000001010" + }, + /* 58*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3103]001750", 1, 151, 1, "24724:2011 7.2.5.4.2, encoding method 3 '0100'", + "0101110010000010011011111111000010111000010011000101011110111001100010111100000011100101110001110111011110101111000110001111110000101011000010011111010" + }, + /* 59*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3103]032767", 1, 151, 1, "Encoding method 3 '0100' with weight = 32767", + "0101001000111000011011111111000010111000010011000101011110111001100010111100000011100101110001110111011110111011000110001111110000101101111101110111010" + }, + /* 60*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3103]032768", 1, 200, 1, "Possible encoding method 3 '0100' but weight > 32767 so encoding method 7 '0111000' with dummy date", + "01001100000101001110111111110000101000110111000010010111100110111110101111110000111000101100001101110001111011010111100011111100001011000110100110000110100000100110001011111111001110011001111010000101" + }, + /* 61*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3202]000156", 1, 151, 1, "24724:2011 7.2.5.4.3, encoding method 4 '0101'", + "0101001000111100001011111111000010100111000100001101011110111001100010111100000011100101110001110111011110101111000110001111110000101100001000001010010" + }, + /* 62*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3202]009999", 1, 151, 1, "Encoding method 4 '0101' with weight = 9999", + "0101110001000100011011111111000010100111000100001101011110111001100010111100000011100101110001110111011110110100011110001111110000101100111110010001010" + }, + /* 63*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3202]010000", 1, 200, 1, "Possible encoding method 4 '0101' but weight > 9999 so encoding method 8 with dummy date", + "01001000101110000110111111110000101110100011000010010111100110111110101111110000111000101100001101110001111011010111100011111100001010000011101001100111101101001110001011111111001110011001111010000101" + }, + /* 64*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3203]022767", 1, 151, 1, "Encoding method 4 '0101' with weight = 22767", + "0101110010011000001011111111000010100111000100001101011110111001100010111100000011100101110001110111011110111011000110001111110000101101111101110111010" + }, + /* 65*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3203]022768", 1, 200, 1, "Possible encoding method 4 '0101' but weight > 22767 so encoding method 8 with dummy date", + "01000110111000100010111111110000101110100011000010010111100110111110101111110000111000101100001101110001111011010111100011111100001010011100010110000100001101000001101011111111001110011001111010000101" + }, + /* 66*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3922]795", 1, 183, 1, "24724:2011 7.2.5.4.5, encoding method 5 '01100XX', no following AIs", + "010110000010001011101111111100001010011100000101100101111001101111101011111100001110001011000011011100011110110101111000111111000010100111101110100001100011011100100010111111110011101" + }, + /* 67*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3922]795[20]01", 1, 200, 1, "Encoding method 5 '01100XX' with following AI", + "01000110110000110010111111110000101111000100001010010111100110111110101111110000111000101100001101110001111011010111100011111100001010011110111010000110001110001011001011111111001110100111110001110101" + }, + /* 68*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3932]0401234", 1, 200, 1, "24724:2011 7.2.5.4.6, encoding method 6 '01101XX', no following AIs", + "01000111101010000010111111110000101110100000110010010111100110111110101111110000111000101100001101110001111011010111100011111100001011100011001101100100111110001011101011111111001110001101111001011101" + }, + /* 69*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3932]0401234[20]01", 1, 232, 1, "Encoding method 6 '01101XX' with following AI", + "0100010001000110111011111111000010110000101000111001011110011011111010111110000001100010110000110111000111101101011110001111110000101110001100110110010011111000101110101111111100111000100110011110010011101111001000100011110000001010" + }, + /* 70*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3932]A401234", 1, 232, 0, "Possible encoding method 6 '01101XX' but invalid currency code so encoding method 1; BWIPP no check", + "0100011000010011011011111111000010100100011111001101011110011011111010111110000001100010110000110111000111101101011110001111110000101100011001111001010001011011000000101111111100111001101011111110110001111001001110100011110000001010" + }, + /* 71*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3102]099999[11]201209", 1, 200, 1, "Encoding method 7 '0111000' with weight <= 99999 and valid date", + "01000101111001000010111111110000101000110111000010010111100110111110101111110000111000101100001101110001111011010111100011111100001010111100100001000100000011100101001011111111001110010000100100011101" + }, + /* 72*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3102]099999", 1, 200, 1, "Encoding method 7 '0111000' with weight <= 99999 but no date", + "01000111011000010010111111110000101000110111000010010111100110111110101111110000111000101100001101110001111011010111100011111100001010111100100001000110100100011000001011111111001110011001111010000101" + }, + /* 73*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3102]100000[11]201209", 1, 281, 1, "Possible encoding method 7 '0111000' but weight > 99999 so encoding method 1", + "01010011110001110010111111110000101001000111110011010111100110111110101111100000011000101100001101110001111011010111100011111100001010010110001110000110010000011110101011111111001110000011100110101100001001110100011000110000000010100101100000100001011100011001111010111111111001101" + }, + /* 74*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3102]099999[11]200000", 1, 281, 1, "Possible encoding method 7 '0111000' with weight <= 99999 but date invalid so encoding method 1", + "01011001110001001110111111110000101001000111110011010111100110111110101111100000011000101100001101110001111011010111100011111100001010010110001110000110010011110100001011111111001110110011100010111100001001110100011000110000000010101100001000000101010111101111110010111111111001101" + }, + /* 75*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3201]099999[11]201209", 1, 200, 1, "Encoding method 8 '0111001' with weight <= 99999 and valid date", + "01001000001101001110111111110000101110100011000010010111100110111110101111110000111000101100001101110001111011010111100011111100001011000100001101100111010111001110001011111111001110010000100100011101" + }, + /* 76*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3201]099999", 1, 200, 1, "Encoding method 8 '0111001' with weight <= 99999 but no date", + "01000101110010000110111111110000101110100011000010010111100110111110101111110000111000101100001101110001111011010111100011111100001011000100001101100111010000111011101011111111001110011001111010000101" + }, + /* 77*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3201]100000[11]201209", 1, 281, 1, "Possible encoding method 8 '0111001' but weight > 99999 so encoding method 1", + "01011101100011000110111111110000101001000111110011010111100110111110101111100000011000101100001101110001111011010111100011111100001011101010000110000111011110001100101011111111001110000011100110101100001001110100011000110000000010100101100000100001011100011001111010111111111001101" + }, + /* 78*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3201]099999[11]000000", 1, 281, 1, "Possible encoding method 8 '0111001' but date invalid so encoding method 1", + "01011110100001001110111111110000101001000111110011010111100110111110101111100000011000101100001101110001111011010111100011111100001011101010000110000111000011110101101011111111001110110011100010111100001110100001011000110000000010101100001000000101010111101111110010111111111001101" + }, + /* 79*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3100]099999[13]201209", 1, 200, 1, "Encoding method 9 '0111010' with weight <= 99999 and valid date", + "01001000001101001110111111110000101111001010000010010111100110111110101111110000111000101100001101110001111011010111100011111100001011000111000001010111010000110110001011111111001110010000100100011101" + }, + /* 80*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3204]099999[13]201209", 1, 200, 1, "Encoding method 10 '0111011' with weight <= 99999 and valid date", + "01001000111000010110111111110000101100101000001110010111100110111110101111110000111000101100001101110001111011010111100011111100001010011101000011110101110000101111101011111111001110010000100100011101" + }, + /* 81*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3103]012233[15]991231", 1, 200, 1, "24724:2011 7.2.5.4.4, encoding method 11 '0111100' with weight <= 99999 and valid date", + "01001100000100111010111111110000101011100100000110010111100110111110101111110000111000101100001101110001111011010111100011111100001011000011010110000111001100110001001011111111001110001101111010000101" + }, + /* 82*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3205]099999[15]201209", 1, 200, 1, "Encoding method 12 '0111101' with weight <= 99999 and valid date", + "01001110000010011010111111110000101000001101110100010111100110111110101111110000111000101100001101110001111011010111100011111100001011110011010001100101001100011000001011111111001110010000100100011101" + }, + /* 83*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3109]099999[17]201209", 1, 200, 1, "Encoding method 13 '0111110' with weight <= 99999 and valid date", + "01001110000010100110111111110000101110000100110100010111100110111110101111110000111000101100001101110001111011010111100011111100001011011101111101000111010111001110001011111111001110010000100100011101" + }, + /* 84*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3200]099999[17]201209", 1, 200, 1, "Encoding method 14 '0111111' with weight <= 99999 and valid date", + "01001110000010100110111111110000101111000100010100010111100110111110101111110000111000101100001101110001111011010111100011111100001011000111000001010111010000110110001011111111001110010000100100011101" + }, }; int data_size = sizeof(data) / sizeof(struct item); @@ -651,8 +736,8 @@ static void test_examples(int index, int generate, int debug) { assert_zero(ret, "i:%d ZBarcode_Encode ret %d != 0 (%s)\n", i, ret, symbol->errtxt); if (generate) { - printf(" /*%3d*/ { %s, %d, \"%s\", %d, %d, \"%s\",\n", - i, testUtilBarcodeName(symbol->symbology), data[i].option_2, data[i].data, 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, symbol->rows, symbol->width, data[i].bwipp_cmp, data[i].comment); testUtilModulesDump(symbol, " ", "\n"); printf(" },\n"); } else { @@ -664,12 +749,16 @@ static void test_examples(int index, int generate, int debug) { 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(i, symbol, -1, data[i].option_2, -1, debug)) { - ret = testUtilBwipp(i, 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); + if (!data[i].bwipp_cmp) { + if (debug & ZINT_DEBUG_TEST_PRINT) printf("i:%d %s not BWIPP compatible (%s)\n", i, testUtilBarcodeName(symbol->symbology), data[i].comment); + } else { + ret = testUtilBwipp(i, 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); + 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_upcean.c b/backend/tests/test_upcean.c index 89ca2d0b..ca13a29f 100644 --- a/backend/tests/test_upcean.c +++ b/backend/tests/test_upcean.c @@ -405,52 +405,65 @@ static void test_isbn_input(int index, int debug) { /* 0*/ { "0", 0, 0 }, // Left zero-padded if < 10 chars /* 1*/ { "12345678", ZINT_ERROR_INVALID_CHECK, -1 }, /* 2*/ { "12345679", 0, 0 }, // 9 is correct check digit - /* 3*/ { "123456789", 0, 0 }, - /* 4*/ { "0123456789", 0, 0 }, - /* 5*/ { "1234567890", ZINT_ERROR_INVALID_CHECK, -1 }, - /* 6*/ { "123456789X", 0, 0 }, // X is correct check digit - /* 7*/ { "123456789x", 0, 0 }, // x is correct check digit - /* 8*/ { "8175257660", 0, 0 }, // 0 is correct check digit - /* 9*/ { "0590764845", 0, 0 }, // 5 is correct check digit - /* 10*/ { "0906495741", 0, 0 }, // 1 is correct check digit - /* 11*/ { "0140430016", 0, 0 }, // 6 is correct check digit - /* 12*/ { "0571086187", 0, 0 }, // 7 is correct check digit - /* 13*/ { "0486600882", 0, 0 }, // 2 is correct check digit - /* 14*/ { "12345678901", ZINT_ERROR_TOO_LONG, -1 }, - /* 15*/ { "123456789012", ZINT_ERROR_TOO_LONG, -1 }, - /* 16*/ { "1234567890123", ZINT_ERROR_INVALID_DATA, -1 }, - /* 17*/ { "9784567890120", 0, 0 }, // 0 is correct check digit - /* 18*/ { "9783161484100", 0, 0 }, // 0 is correct check digit - /* 19*/ { "9781846688225", 0, 0 }, // 5 is correct check digit - /* 20*/ { "9781847657954", 0, 0 }, // 4 is correct check digit - /* 21*/ { "9781846688188", 0, 0 }, // 8 is correct check digit - /* 22*/ { "9781847659293", 0, 0 }, // 3 is correct check digit - /* 23*/ { "97845678901201", ZINT_ERROR_TOO_LONG, -1 }, - /* 24*/ { "3954994+12", 0, 0 }, - /* 25*/ { "3954994+12345", 0, 0 }, - /* 26*/ { "3954994+123456", ZINT_ERROR_TOO_LONG, -1 }, - /* 27*/ { "3954994+", 0, 0 }, - /* 28*/ { "61954993+1", 0, 0 }, - /* 29*/ { "61954993+123", 0, 0 }, - /* 30*/ { "361954999+12", 0, 0 }, - /* 31*/ { "361954999+1234", 0, 0 }, - /* 32*/ { "361954999+12", 0, 0 }, - /* 33*/ { "199900003X+12", 0, 0 }, - /* 34*/ { "199900003x+12", 0, 0 }, - /* 35*/ { "199900003X+12345", 0, 0 }, - /* 36*/ { "199900003x+12345", 0, 0 }, - /* 37*/ { "9791234567896+12", 0, 0 }, - /* 38*/ { "9791234567896+12345", 0, 0 }, - /* 39*/ { "9791234567896+", 0, 0 }, - /* 40*/ { "97912345678961+", ZINT_ERROR_TOO_LONG, -1 }, - /* 41*/ { "97912345678961+12345", ZINT_ERROR_TOO_LONG, -1 }, - /* 42*/ { "9791234567896+123456", ZINT_ERROR_TOO_LONG, -1 }, + /* 3*/ { "98765434", 0, 0 }, // 4 is correct check digit + /* 4*/ { "123456789", 0, 0 }, + /* 5*/ { "340013817", ZINT_ERROR_INVALID_CHECK, -1 }, + /* 6*/ { "340013818", 0, 0 }, // 8 is correct check digit + /* 7*/ { "902888455", 0, 0 }, // 5 is correct check digit + /* 8*/ { "0123456789", 0, 0 }, + /* 9*/ { "1234567890", ZINT_ERROR_INVALID_CHECK, -1 }, + /* 10*/ { "123456789X", 0, 0 }, // X is correct check digit + /* 11*/ { "123456789x", 0, 0 }, // x is correct check digit + /* 12*/ { "8175257660", 0, 0 }, // 0 is correct check digit + /* 13*/ { "0590764845", 0, 0 }, // 5 is correct check digit + /* 14*/ { "0906495741", 0, 0 }, // 1 is correct check digit + /* 15*/ { "0140430016", 0, 0 }, // 6 is correct check digit + /* 16*/ { "0571086187", 0, 0 }, // 7 is correct check digit + /* 17*/ { "0486600882", 0, 0 }, // 2 is correct check digit + /* 18*/ { "12345678901", ZINT_ERROR_TOO_LONG, -1 }, + /* 19*/ { "123456789012", ZINT_ERROR_TOO_LONG, -1 }, + /* 20*/ { "1234567890123", ZINT_ERROR_INVALID_DATA, -1 }, + /* 21*/ { "9784567890123", ZINT_ERROR_INVALID_CHECK, -1 }, + /* 22*/ { "9784567890120", 0, 0 }, // 0 is correct check digit + /* 23*/ { "9783161484100", 0, 0 }, // 0 is correct check digit + /* 24*/ { "9781846688225", 0, 0 }, // 5 is correct check digit + /* 25*/ { "9781847657954", 0, 0 }, // 4 is correct check digit + /* 26*/ { "9781846688188", 0, 0 }, // 8 is correct check digit + /* 27*/ { "9781847659293", 0, 0 }, // 3 is correct check digit + /* 28*/ { "97845678901201", ZINT_ERROR_TOO_LONG, -1 }, + /* 29*/ { "3954994+12", 0, 0 }, + /* 30*/ { "3954994+12345", 0, 0 }, + /* 31*/ { "3954994+123456", ZINT_ERROR_TOO_LONG, -1 }, + /* 32*/ { "3954994+", 0, 0 }, + /* 33*/ { "61954993+1", 0, 0 }, + /* 34*/ { "61954992+123", ZINT_ERROR_INVALID_CHECK, -1 }, + /* 35*/ { "61954993+123", 0, 0 }, + /* 36*/ { "361954990+12", ZINT_ERROR_INVALID_CHECK, -1 }, + /* 37*/ { "361954999+12", 0, 0 }, + /* 38*/ { "361954999+1234", 0, 0 }, + /* 39*/ { "361954999+12", 0, 0 }, + /* 40*/ { "1999000030+12", ZINT_ERROR_INVALID_CHECK, -1 }, + /* 41*/ { "199900003X+12", 0, 0 }, + /* 42*/ { "199900003x+12", 0, 0 }, + /* 43*/ { "1999000031+12345", ZINT_ERROR_INVALID_CHECK, -1 }, + /* 44*/ { "199900003X+12345", 0, 0 }, + /* 45*/ { "199900003x+12345", 0, 0 }, + /* 46*/ { "9791234567895+12", ZINT_ERROR_INVALID_CHECK, -1 }, + /* 47*/ { "9791234567896+12", 0, 0 }, + /* 48*/ { "9791234567897+12345", ZINT_ERROR_INVALID_CHECK, -1 }, + /* 49*/ { "9791234567896+12345", 0, 0 }, + /* 50*/ { "9791234567892+", ZINT_ERROR_INVALID_CHECK, -1 }, + /* 51*/ { "9791234567896+", 0, 0 }, + /* 52*/ { "97912345678961+", ZINT_ERROR_TOO_LONG, -1 }, + /* 53*/ { "97912345678961+12345", ZINT_ERROR_TOO_LONG, -1 }, + /* 54*/ { "9791234567896+123456", ZINT_ERROR_TOO_LONG, -1 }, }; int data_size = sizeof(data) / sizeof(struct item); for (int i = 0; i < data_size; i++) { if (index != -1 && i != index) continue; + if ((debug & ZINT_DEBUG_TEST_PRINT) && !(debug & ZINT_DEBUG_TEST_LESS_NOISY)) printf("i:%d\n", i); struct zint_symbol *symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); diff --git a/backend/tests/testcommon.c b/backend/tests/testcommon.c index 5325e56e..c8d5a722 100644 --- a/backend/tests/testcommon.c +++ b/backend/tests/testcommon.c @@ -42,11 +42,6 @@ #include #include -#ifndef COMMON_INLINE -extern int module_is_set(const struct zint_symbol *symbol, const int y_coord, const int x_coord); -extern int module_colour_is_set(const struct zint_symbol *symbol, const int y_coord, const int x_coord); -#endif - static int tests = 0; static int failed = 0; static int skipped = 0; @@ -1737,7 +1732,7 @@ static const char *testUtilBwippName(int index, const struct zint_symbol *symbol { "", -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, }, + { "msi", BARCODE_MSI_PLESSEY, 47, 0, 1, 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, }, @@ -2177,6 +2172,26 @@ int testUtilBwipp(int index, const struct zint_symbol *symbol, int option_1, int } bwipp_opts = bwipp_opts_buf; /* Set always as option_2 == 2 is bwipp default */ } + } else if (symbology == BARCODE_PLESSEY) { + sprintf(bwipp_opts_buf + (int) strlen(bwipp_opts_buf), "%sincludecheck", strlen(bwipp_opts_buf) ? " " : ""); + bwipp_opts = bwipp_opts_buf; + } else if (symbology == BARCODE_MSI_PLESSEY) { + if (option_2 > 0) { + sprintf(bwipp_opts_buf + (int) strlen(bwipp_opts_buf), "%sincludecheck", strlen(bwipp_opts_buf) ? " " : ""); + + const char *checktype = NULL; + if (option_2 == 2) { + checktype = "mod1010"; + } else if (option_2 == 3) { + checktype = "mod11 badmod11"; + } else if (option_2 == 4) { + checktype = "mod1110 badmod11"; + } + if (checktype) { + sprintf(bwipp_opts_buf + (int) strlen(bwipp_opts_buf), "%schecktype=%s", strlen(bwipp_opts_buf) ? " " : "", checktype); + } + bwipp_opts = bwipp_opts_buf; + } } else if (symbology == BARCODE_PDF417 || symbology == BARCODE_PDF417COMP || symbology == BARCODE_HIBC_PDF || symbology == BARCODE_MICROPDF417 || symbology == BARCODE_HIBC_MICPDF) { for (r = 0; r < symbol->rows; r++) bwipp_row_height[r] = 1; /* Change from 3 */ @@ -2265,8 +2280,16 @@ int testUtilBwipp(int index, const struct zint_symbol *symbol, int option_1, int } } else if (symbology == BARCODE_CODEONE) { if (option_2 >= 1 && option_2 <= 10) { - static char codeone_versions[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'S', 'T' }; - sprintf(bwipp_opts_buf + (int) strlen(bwipp_opts_buf), "%sversion=%c", strlen(bwipp_opts_buf) ? " " : "", codeone_versions[option_2 - 1]); + static const char *codeone_versions[] = { "A", "B", "C", "D", "E", "F", "G", "H" }; + const char *codeone_version; + if (option_2 == 9) { + codeone_version = length <= 6 ? "S-10" : length <= 12 ? "S-20" : "S-30"; + } else if (option_2 == 10) { + codeone_version = "T-16"; // TODO: Allow for different T sizes + } else { + codeone_version = codeone_versions[option_2 - 1]; + } + sprintf(bwipp_opts_buf + (int) strlen(bwipp_opts_buf), "%sversion=%s", strlen(bwipp_opts_buf) ? " " : "", codeone_version); bwipp_opts = bwipp_opts_buf; } } @@ -2337,6 +2360,12 @@ int testUtilBwipp(int index, const struct zint_symbol *symbol, int option_1, int memmove(cmd + GS_INITIAL_LEN + sizeof(adj), cmd + GS_INITIAL_LEN, strlen(cmd) + 1 - GS_INITIAL_LEN); memcpy(cmd + GS_INITIAL_LEN, adj, sizeof(adj)); } + if (symbology == BARCODE_PLESSEY) { + /* Ceiling ratio 3/4/5 width bar/space -> 2 width then round ratio 2 width bar/space -> 3 width */ + char adj[16] = " -sc=0.4 -sr=1.3"; + memmove(cmd + GS_INITIAL_LEN + sizeof(adj), cmd + GS_INITIAL_LEN, strlen(cmd) + 1 - GS_INITIAL_LEN); + memcpy(cmd + GS_INITIAL_LEN, adj, sizeof(adj)); + } if (symbology == BARCODE_CODE11 || symbology == BARCODE_CODE39 || symbology == BARCODE_EXCODE39 || symbology == BARCODE_HIBC_39 || symbology == BARCODE_LOGMARS || symbology == BARCODE_PHARMA || symbology == BARCODE_PZN || symbology == BARCODE_CODE32 || symbology == BARCODE_VIN || symbology == BARCODE_C25INTER || symbology == BARCODE_DPLEIT || symbology == BARCODE_DPIDENT || symbology == BARCODE_ITF14 diff --git a/backend/tests/testcommon.h b/backend/tests/testcommon.h index 381f922f..e59cbf69 100644 --- a/backend/tests/testcommon.h +++ b/backend/tests/testcommon.h @@ -39,6 +39,10 @@ #include #include "../common.h" +#ifdef __cplusplus +extern "C" { +#endif + #ifndef ARRAY_SIZE #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) #endif @@ -75,7 +79,7 @@ void testRun(int argc, char *argv[], testFunction funcs[], int funcs_size); #define ZINT_DEBUG_TEST_BWIPP 128 #define ZINT_DEBUG_TEST_PERFORMANCE 256 -extern void vector_free(struct zint_symbol *symbol); /* Free vector structures */ +INTERNAL 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); const char *testUtilBarcodeName(int symbology); @@ -119,4 +123,8 @@ int testUtilBwipp(int index, const struct zint_symbol *symbol, int option_1, int 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); +#ifdef __cplusplus +} +#endif + #endif /* TESTCOMMON_H */ diff --git a/backend/tests/tools/bwipp_dump-barcode.ps.diff b/backend/tests/tools/bwipp_dump-barcode.ps.diff index 89b3bdfc..0a4941b3 100644 --- a/backend/tests/tools/bwipp_dump-barcode.ps.diff +++ b/backend/tests/tools/bwipp_dump-barcode.ps.diff @@ -1,5 +1,5 @@ ---- ../../../../postscriptbarcode/build/monolithic/barcode.ps 2020-10-26 01:13:25.080992540 +0000 -+++ ../tools/bwipp_dump.ps 2020-10-26 11:19:21.268222231 +0000 +--- ../../../../postscriptbarcode/build/monolithic/barcode.ps 2020-12-19 06:21:55.358036729 +0000 ++++ ../tools/bwipp_dump.ps 2020-12-21 14:41:10.265502623 +0000 @@ -29,6 +29,8 @@ % CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS % IN THE SOFTWARE. @@ -9,7 +9,7 @@ % --BEGIN TEMPLATE-- % --BEGIN RESOURCE preamble-- -@@ -24466,34 +24468,80 @@ +@@ -24471,34 +24473,80 @@ pop } ifelse @@ -109,7 +109,7 @@ end -@@ -24552,7 +24600,7 @@ +@@ -24557,7 +24605,7 @@ pop } ifelse @@ -118,7 +118,7 @@ % Get the result of encoding with ean8 and gs1-cc options (lintype) (ean8) put -@@ -24560,29 +24608,75 @@ +@@ -24565,29 +24613,75 @@ options (dontdraw) true put % Plot the linear part @@ -214,7 +214,7 @@ end -@@ -24641,34 +24735,80 @@ +@@ -24646,34 +24740,80 @@ pop } ifelse @@ -314,7 +314,7 @@ end -@@ -24742,34 +24882,80 @@ +@@ -24747,34 +24887,80 @@ /opt options >> def @@ -414,7 +414,7 @@ end -@@ -24828,7 +25014,7 @@ +@@ -24833,7 +25019,7 @@ pop } ifelse @@ -423,7 +423,7 @@ options (lintype) (databaromni) put options (linkage) true put -@@ -24839,7 +25025,7 @@ +@@ -24844,7 +25030,7 @@ linear options //databaromni exec dup (sbs) get /linsbs exch def dup (bhs) get 0 get 72 mul /linheight exch def @@ -432,7 +432,7 @@ % Plot the separator /sepfinder { -@@ -24870,20 +25056,66 @@ +@@ -24875,20 +25061,66 @@ sep 0 [0 0 0] putinterval sep sep length 4 sub [0 0 0 0] putinterval 18 sepfinder 64 sepfinder @@ -511,7 +511,7 @@ end -@@ -24941,7 +25173,7 @@ +@@ -24946,7 +25178,7 @@ pop } ifelse @@ -520,7 +520,7 @@ options (lintype) (databarstacked) put options (linkage) true put -@@ -24952,7 +25184,7 @@ +@@ -24957,7 +25189,7 @@ linear options //databarstacked exec dup (pixs) get 0 2 index (pixx) get getinterval /bot exch def dup (pixy) get /linheight exch def @@ -529,7 +529,7 @@ % Plot the separator /sepfinder { -@@ -24980,20 +25212,52 @@ +@@ -24985,20 +25217,52 @@ sep 0 [ 0 0 0 0 ] putinterval sep sep length 4 sub [ 0 0 0 0 ] putinterval 18 sepfinder @@ -594,7 +594,7 @@ end -@@ -25051,7 +25315,7 @@ +@@ -25056,7 +25320,7 @@ pop } ifelse @@ -603,7 +603,7 @@ options (lintype) (databarstackedomni) put options (linkage) true put -@@ -25062,7 +25326,7 @@ +@@ -25067,7 +25331,7 @@ linear options //databarstackedomni exec dup (pixs) get 0 2 index (pixx) get getinterval /bot exch def dup (pixy) get /linheight exch def @@ -612,7 +612,7 @@ % Plot the separator /sepfinder { -@@ -25090,20 +25354,52 @@ +@@ -25095,20 +25359,52 @@ sep 0 [ 0 0 0 0 ] putinterval sep sep length 4 sub [ 0 0 0 0 ] putinterval 18 sepfinder @@ -677,7 +677,7 @@ end -@@ -25276,7 +25572,7 @@ +@@ -25281,7 +25577,7 @@ pop } ifelse @@ -686,7 +686,7 @@ options (lintype) (databarlimited) put options (linkage) true put -@@ -25287,7 +25583,7 @@ +@@ -25292,7 +25588,7 @@ linear options //databarlimited exec dup (sbs) get /linsbs exch def dup (bhs) get 0 get 72 mul /linheight exch def @@ -695,7 +695,7 @@ % Plot the separator mark -@@ -25295,22 +25591,68 @@ +@@ -25300,22 +25596,68 @@ counttomark 1 sub array astore /sep exch def pop pop sep 0 [0 0 0] putinterval sep sep length 9 sub [0 0 0 0 0 0 0 0 0] putinterval % 4 + 5 right guard spaces @@ -778,7 +778,7 @@ end -@@ -25369,7 +25711,7 @@ +@@ -25374,7 +25716,7 @@ pop } ifelse @@ -787,7 +787,7 @@ options (lintype) (databarexpanded) put options (linkage) true put -@@ -25380,7 +25722,7 @@ +@@ -25385,7 +25727,7 @@ linear options //databarexpanded exec dup (sbs) get /linsbs exch def dup (bhs) get 0 get 72 mul /linheight exch def @@ -796,7 +796,7 @@ % Plot the separator /sepfinder { -@@ -25409,20 +25751,60 @@ +@@ -25414,20 +25756,60 @@ 18 98 bot length 13 sub {} for 69 98 bot length 13 sub {} for ] {sepfinder} forall @@ -869,7 +869,7 @@ end -@@ -25480,7 +25862,7 @@ +@@ -25485,7 +25867,7 @@ pop } ifelse @@ -878,7 +878,7 @@ options (lintype) (databarexpandedstacked) put options (linkage) true put -@@ -25491,7 +25873,7 @@ +@@ -25496,7 +25878,7 @@ linear options //databarexpandedstacked exec dup (pixs) get 0 2 index (pixx) get getinterval /bot exch def dup (pixy) get /linheight exch def @@ -887,7 +887,7 @@ % Plot the separator /sepfinder { -@@ -25517,21 +25899,49 @@ +@@ -25522,21 +25904,49 @@ 19 98 bot length 13 sub {} for 70 98 bot length 13 sub {} for ] {sepfinder} forall @@ -950,7 +950,7 @@ end -@@ -25590,7 +26000,7 @@ +@@ -25595,7 +26005,7 @@ pop } ifelse @@ -959,7 +959,7 @@ options (inkspread) (0) put options (dontdraw) true put -@@ -25617,35 +26027,87 @@ +@@ -25622,35 +26032,87 @@ linear << options {} forall >> //gs1-128 exec dup (sbs) get /linsbs exch def dup (bhs) get 0 get 72 mul /linheight exch def @@ -1061,7 +1061,7 @@ end -@@ -26919,3 +27381,176 @@ +@@ -26924,3 +27386,181 @@ % --END ENCODER hibcazteccode-- % --END TEMPLATE-- @@ -1076,7 +1076,7 @@ +% `-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 + @@ -1153,7 +1153,12 @@ + % Check if given ratio arg to adjust width of bars/spaces (e.g. "0.6" reduces 3 -> 2, "1.3" increases 2 -> 3) + systemdict /r known { + /r systemdict /r get cvr def -+ /f { r mul round cvi } def ++ systemdict /c known { % Apply ceiling ratio beforehand ++ /c systemdict /c get cvr def ++ /f { c mul ceiling cvi r mul round cvi } def ++ } { ++ /f { r mul round cvi } def ++ } ifelse + } { + /f {} def + } ifelse @@ -1231,7 +1236,7 @@ + } if +} ifelse + -+% If have renderer ++% If have renderer +ret /ren known { + % Scale + /s systemdict /s known { systemdict /s get cvi } { 2 } ifelse def diff --git a/backend/tests/tools/bwipp_dump.ps.tar.xz b/backend/tests/tools/bwipp_dump.ps.tar.xz index 02dbc179a22654b2ec1f0a04d3749ef2940d0eee..9ebe33c0e8d85bc67b03ab24caac7b9b49e63cae 100644 GIT binary patch literal 117252 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

+kO+kh5cfADkA5cIemKs! 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 RDFd;@XZr#G00004Sz6l7UR?kH diff --git a/backend/upcean.c b/backend/upcean.c index 54478134..1692bc57 100644 --- a/backend/upcean.c +++ b/backend/upcean.c @@ -79,17 +79,13 @@ static const char *EANsetB[10] = { }; /* Calculate the correct check digit for a UPC barcode */ -static char upc_check(char source[]) { - unsigned int i, count, check_digit; +static char upc_check(const char source[], const int length) { + int i, count, check_digit; count = 0; - for (i = 0; i < strlen(source); i++) { - count += ctoi(source[i]); - - if (!(i & 1)) { - count += 2 * (ctoi(source[i])); - } + for (i = 0; i < length; i++) { + count += (i & 1) ? ctoi(source[i]) : 3 * ctoi(source[i]); } check_digit = 10 - (count % 10); @@ -100,115 +96,88 @@ static char upc_check(char source[]) { } /* UPC A is usually used for 12 digit numbers, but this function takes a source of any length */ -static void upca_draw(char source[], char dest[]) { - unsigned int i, half_way, length = strlen(source); +static void upca_draw(const char source[], const int length, unsigned char dest[]) { + int i, half_way; half_way = length / 2; /* start character */ - strcat(dest, "111"); + ustrcat(dest, "111"); for (i = 0; i < length; i++) { if (i == half_way) { /* middle character - separates manufacturer no. from product no. */ /* also inverts right hand characters */ - strcat(dest, "11111"); + ustrcat(dest, "11111"); } - lookup(NEON, EANsetA, source[i], dest); + lookup(NEON, EANsetA, source[i], (char *) dest); } /* stop character */ - strcat(dest, "111"); + ustrcat(dest, "111"); } /* Make a UPC A barcode when we haven't been given the check digit */ -static int upca(struct zint_symbol *symbol, unsigned char source[], char dest[]) { - int length; +static int upca(struct zint_symbol *symbol, const unsigned char source[], int length, unsigned char dest[]) { char gtin[15]; int error_number = 0; - strcpy(gtin, (char*) source); - length = strlen(gtin); + ustrcpy(gtin, source); if (length == 11) { - gtin[length] = upc_check(gtin); - gtin[length + 1] = '\0'; + gtin[length++] = upc_check(gtin, 11); + gtin[length] = '\0'; } else { - gtin[length - 1] = '\0'; - if (source[length - 1] != upc_check(gtin)) { + if (source[length - 1] != upc_check(gtin, 11)) { if (symbol->debug & ZINT_DEBUG_PRINT) { - printf("UPC-A: Invalid check digit %s, gtin: %s, Check digit: %c\n", source, gtin, upc_check(gtin)); + printf("UPC-A: Invalid check digit %s, gtin: %s, Check digit: %c\n", source, gtin, + upc_check(gtin, 11)); } strcpy(symbol->errtxt, "270: Invalid check digit"); return ZINT_ERROR_INVALID_CHECK; } - gtin[length - 1] = upc_check(gtin); } if (symbol->debug & ZINT_DEBUG_PRINT) { - printf("UPC-A: %s, gtin: %s, Check digit: %c\n", source, gtin, length == 11 ? gtin[length] : gtin[length - 1]); + printf("UPC-A: %s, gtin: %s, Check digit: %c\n", source, gtin, + length == 11 ? gtin[length] : gtin[length - 1]); } - upca_draw(gtin, dest); + upca_draw(gtin, length, dest); ustrcpy(symbol->text, gtin); return error_number; } /* UPC E is a zero-compressed version of UPC A */ -static int upce(struct zint_symbol *symbol, unsigned char source[], char dest[]) { - unsigned int i, num_system, length; - char emode, equivalent[12], check_digit, parity[8], temp[9]; +static int upce(struct zint_symbol *symbol, unsigned char source[], int length, unsigned char dest[]) { + int i, num_system; + char emode, equivalent[12], check_digit, parity[8]; char hrt[9]; int error_number = 0; /* Two number systems can be used - system 0 and system 1 */ - if (symbol->symbology != BARCODE_UPCE_CHK) { - /* No check digit in input data */ - if (ustrlen(source) == 7) { - switch (source[0]) { - case '0': num_system = 0; - break; - case '1': num_system = 1; - break; - default: num_system = 0; - /* First source char ignored */ - break; - } - strcpy(temp, (char*) source); - strcpy(hrt, (char*) source); - for (i = 1; i <= 7; i++) { - source[i - 1] = temp[i]; - } - } else { - num_system = 0; - hrt[0] = '0'; - hrt[1] = '\0'; - strcat(hrt, (char*) source); + if ((symbol->symbology != BARCODE_UPCE_CHK && length == 7) || length == 8) { + switch (source[0]) { + case '0': num_system = 0; + break; + case '1': num_system = 1; + break; + default: num_system = 0; + /* First source char ignored */ + break; } + ustrcpy(hrt, source); + for (i = 1; i <= length; i++) { + source[i - 1] = hrt[i]; + } + length--; } else { - /* Check digit is included in input data */ - if (ustrlen(source) == 8) { - switch (source[0]) { - case '0': num_system = 0; - break; - case '1': num_system = 1; - break; - default: num_system = 0; - /* First source char ignored */ - break; - } - strcpy(temp, (char*) source); - strcpy(hrt, (char*) source); - for (i = 1; i <= 8; i++) { - source[i - 1] = temp[i]; - } - } else { - num_system = 0; - hrt[0] = '0'; - hrt[1] = '\0'; - strcat(hrt, (char*) source); - } + /* Length 6 with no check digit, or length 7 with check digit, system 0, insert leading zero */ + num_system = 0; + hrt[0] = '0'; + hrt[1] = '\0'; + ustrncat(hrt, source, length); } /* Expand the zero-compressed UPCE code to make a UPCA equivalent (EN Table 5) */ @@ -217,7 +186,7 @@ static int upce(struct zint_symbol *symbol, unsigned char source[], char dest[]) equivalent[i] = '0'; } if (num_system == 1) { - equivalent[0] = temp[0]; + equivalent[0] = hrt[0]; } equivalent[1] = source[0]; equivalent[2] = source[1]; @@ -271,7 +240,7 @@ static int upce(struct zint_symbol *symbol, unsigned char source[], char dest[]) /* Get the check digit from the expanded UPCA code */ - check_digit = upc_check(equivalent); + check_digit = upc_check(equivalent, 11); /* Use the number system and check digit information to choose a parity scheme */ if (num_system == 1) { @@ -283,20 +252,19 @@ static int upce(struct zint_symbol *symbol, unsigned char source[], char dest[]) /* Take all this information and make the barcode pattern */ /* start character */ - strcat(dest, "111"); + ustrcat(dest, "111"); - length = ustrlen(source); for (i = 0; i < length; i++) { switch (parity[i]) { - case 'A': lookup(NEON, EANsetA, source[i], dest); + case 'A': lookup(NEON, EANsetA, source[i], (char *) dest); break; - case 'B': lookup(NEON, EANsetB, source[i], dest); + case 'B': lookup(NEON, EANsetB, source[i], (char *) dest); break; } } /* stop character */ - strcat(dest, "111111"); + ustrcat(dest, "111111"); if (symbol->symbology != BARCODE_UPCE_CHK) { hrt[7] = check_digit; @@ -304,7 +272,8 @@ static int upce(struct zint_symbol *symbol, unsigned char source[], char dest[]) } else { if (hrt[7] != check_digit) { if (symbol->debug & ZINT_DEBUG_PRINT) { - printf("UPC-E: Invalid check digit %s, equivalent: %s, hrt: %s, Check digit: %c\n", source, equivalent, hrt, check_digit); + printf("UPC-E: Invalid check digit %s, equivalent: %s, hrt: %s, Check digit: %c\n", source, + equivalent, hrt, check_digit); } strcpy(symbol->errtxt, "274: Invalid check digit"); return ZINT_ERROR_INVALID_CHECK; @@ -320,22 +289,22 @@ static int upce(struct zint_symbol *symbol, unsigned char source[], char dest[]) } /* EAN-2 and EAN-5 add-on codes */ -static void add_on(unsigned char source[], char dest[], int addon_gap) { +static void add_on(const unsigned char source[], const int length, unsigned char dest[], const int addon_gap) { char parity[6]; - unsigned int i, code_type, length; + int i, code_type; /* If an add-on then append with space */ if (addon_gap != 0) { - i = strlen(dest); + i = (int) ustrlen(dest); dest[i] = itoc(addon_gap); dest[i + 1] = '\0'; } /* Start character */ - strcat(dest, "112"); + ustrcat(dest, "112"); /* Determine EAN2 or EAN5 add-on */ - if (ustrlen(source) == 2) { + if (length == 2) { code_type = EAN2; } else { code_type = EAN5; @@ -364,38 +333,32 @@ static void add_on(unsigned char source[], char dest[], int addon_gap) { strcpy(parity, EAN5Parity[parity_bit]); } - length = ustrlen(source); for (i = 0; i < length; i++) { switch (parity[i]) { - case 'A': lookup(NEON, EANsetA, source[i], dest); + case 'A': lookup(NEON, EANsetA, source[i], (char *) dest); break; - case 'B': lookup(NEON, EANsetB, source[i], dest); + case 'B': lookup(NEON, EANsetB, source[i], (char *) dest); break; } /* Glyph separator */ - if (i != (ustrlen(source) - 1)) { - strcat(dest, "11"); + if (i != (length - 1)) { + ustrcat(dest, "11"); } } } /* ************************ EAN-13 ****************** */ -/* Calculate the correct check digit for a EAN-13 barcode */ -static char ean_check(char source[]) { +/* Calculate the correct check digit for a EAN-13 barcode (including ISBN(13)) */ +static char ean_check(const char source[], const int length) { int i; - unsigned int h, count, check_digit; + int count, check_digit; count = 0; - h = strlen(source); - for (i = h - 1; i >= 0; i--) { - count += ctoi(source[i]); - - if (i & 1) { - count += 2 * ctoi(source[i]); - } + for (i = 0; i < length; i++) { + count += (i & 1) ? 3 * ctoi(source[i]) : ctoi(source[i]); } check_digit = 10 - (count % 10); if (check_digit == 10) { @@ -404,34 +367,32 @@ static char ean_check(char source[]) { return itoc(check_digit); } -static int ean13(struct zint_symbol *symbol, unsigned char source[], char dest[]) { - unsigned int length, i, half_way; +static int ean13(struct zint_symbol *symbol, const unsigned char source[], int length, unsigned char dest[]) { + int i, half_way; char parity[6]; char gtin[15]; int error_number = 0; - strcpy(parity, ""); - strcpy(gtin, (char*) source); + parity[0] = '\0'; + ustrcpy(gtin, source); /* Add the appropriate check digit */ - length = strlen(gtin); if (length == 12) { - gtin[length] = ean_check(gtin); - gtin[length + 1] = '\0'; + gtin[length++] = ean_check(gtin, 12); + gtin[length] = '\0'; } else { - gtin[length - 1] = '\0'; - if (source[length - 1] != ean_check(gtin)) { + if (source[length - 1] != ean_check(gtin, 12)) { if (symbol->debug & ZINT_DEBUG_PRINT) { - printf("EAN-13 Invalid check digit: %s, gtin: %s, Check digit: %c\n", source, gtin, ean_check(gtin)); + printf("EAN-13 Invalid check digit: %s, gtin: %s, Check digit: %c\n", source, gtin, + ean_check(gtin, 12)); } strcpy(symbol->errtxt, "275: Invalid check digit"); return ZINT_ERROR_INVALID_CHECK; } - gtin[length - 1] = ean_check(gtin); } if (symbol->debug & ZINT_DEBUG_PRINT) { - printf("EAN-13: %s, gtin: %s, Check digit: %c\n", source, gtin, length == 12 ? gtin[length] : gtin[length - 1]); + printf("EAN-13: %s, gtin: %s, Check digit: %c\n", source, gtin, gtin[length - 1]); } /* Get parity for first half of the symbol */ @@ -441,93 +402,69 @@ static int ean13(struct zint_symbol *symbol, unsigned char source[], char dest[] half_way = 7; /* start character */ - strcat(dest, "111"); - length = strlen(gtin); + ustrcat(dest, "111"); for (i = 1; i < length; i++) { if (i == half_way) { /* middle character - separates manufacturer no. from product no. */ /* also inverses right hand characters */ - strcat(dest, "11111"); + ustrcat(dest, "11111"); } if (((i > 1) && (i < 7)) && (parity[i - 2] == 'B')) { - lookup(NEON, EANsetB, gtin[i], dest); + lookup(NEON, EANsetB, gtin[i], (char *) dest); } else { - lookup(NEON, EANsetA, gtin[i], dest); + lookup(NEON, EANsetA, gtin[i], (char *) dest); } } /* stop character */ - strcat(dest, "111"); + ustrcat(dest, "111"); ustrcpy(symbol->text, gtin); return error_number; } /* Make an EAN-8 barcode when we haven't been given the check digit */ -static int ean8(struct zint_symbol *symbol, unsigned char source[], char dest[]) { +static int ean8(struct zint_symbol *symbol, const unsigned char source[], int length, unsigned char dest[]) { /* EAN-8 is basically the same as UPC-A but with fewer digits */ - int length; char gtin[10]; int error_number = 0; - strcpy(gtin, (char*) source); - length = strlen(gtin); + ustrcpy(gtin, source); if (length == 7) { - gtin[length] = upc_check(gtin); - gtin[length + 1] = '\0'; + gtin[length++] = upc_check(gtin, 7); + gtin[length] = '\0'; } else { - gtin[length - 1] = '\0'; - if (source[length - 1] != upc_check(gtin)) { + if (source[length - 1] != upc_check(gtin, 7)) { if (symbol->debug & ZINT_DEBUG_PRINT) { - printf("EAN-8: Invalid check digit %s, gtin: %s, Check digit: %c\n", source, gtin, upc_check(gtin)); + printf("EAN-8: Invalid check digit %s, gtin: %s, Check digit: %c\n", source, gtin, + upc_check(gtin, 7)); } strcpy(symbol->errtxt, "276: Invalid check digit"); return ZINT_ERROR_INVALID_CHECK; } - gtin[length - 1] = upc_check(gtin); } if (symbol->debug & ZINT_DEBUG_PRINT) { - printf("EAN-8: %s, gtin: %s, Check digit: %c\n", source, gtin, length == 7 ? gtin[length] : gtin[length - 1]); + printf("EAN-8: %s, gtin: %s, Check digit: %c\n", source, gtin, + length == 7 ? gtin[length] : gtin[length - 1]); } - upca_draw(gtin, dest); + upca_draw(gtin, length, dest); ustrcpy(symbol->text, gtin); return error_number; } -/* For ISBN(13) only */ -static char isbn13_check(unsigned char source[]) { - unsigned int i, weight, sum, check, h; - - sum = 0; - weight = 1; - h = ustrlen(source) - 1; - - for (i = 0; i < h; i++) { - sum += ctoi(source[i]) * weight; - if (weight == 1) weight = 3; - else weight = 1; - } - - check = sum % 10; - check = 10 - check; - if (check == 10) check = 0; - return itoc(check); -} - /* For ISBN(10) and SBN only */ -static char isbn_check(unsigned char source[]) { - unsigned int i, weight, sum, check, h; +static char isbn_check(const unsigned char source[], const int length) { + int i, weight, sum, check; char check_char; sum = 0; weight = 1; - h = ustrlen(source) - 1; - for (i = 0; i < h; i++) { + for (i = 0; i < length; i++) { /* Length will always be 9 */ sum += ctoi(source[i]) * weight; weight++; } @@ -541,7 +478,7 @@ static char isbn_check(unsigned char source[]) { } /* Make an EAN-13 barcode from an SBN or ISBN */ -static int isbn(struct zint_symbol *symbol, unsigned char source[], const size_t src_len, char dest[]) { +static int isbn(struct zint_symbol *symbol, unsigned char source[], const int src_len, unsigned char dest[]) { int i, error_number; char check_digit; @@ -565,8 +502,11 @@ static int isbn(struct zint_symbol *symbol, unsigned char source[], const size_t return ZINT_ERROR_INVALID_DATA; } - check_digit = isbn13_check(source); + check_digit = ean_check((const char *) source, 12); if (source[src_len - 1] != check_digit) { + if (symbol->debug & ZINT_DEBUG_PRINT) { + printf("ISBN: Invalid check digit %s, Check digit: %c\n", source, check_digit); + } strcpy(symbol->errtxt, "280: Incorrect ISBN check"); return ZINT_ERROR_INVALID_CHECK; } @@ -582,8 +522,11 @@ static int isbn(struct zint_symbol *symbol, unsigned char source[], const size_t } if (src_len == 9 || src_len == 10) /* Using 10 digit ISBN or 9 digit SBN padded with leading zero */ { - check_digit = isbn_check(source); - if (check_digit != source[ustrlen(source) - 1]) { + check_digit = isbn_check(source, 9); + if (check_digit != source[9]) { + if (symbol->debug & ZINT_DEBUG_PRINT) { + printf("ISBN(10)/SBN: Invalid check digit %s, Check digit: %c\n", source, check_digit); + } strcpy(symbol->errtxt, src_len == 9 ? "281: Incorrect SBN check" : "281: Incorrect ISBN check"); return ZINT_ERROR_INVALID_CHECK; } @@ -596,16 +539,17 @@ static int isbn(struct zint_symbol *symbol, unsigned char source[], const size_t source[12] = '\0'; } - return ean13(symbol, source, dest); + return ean13(symbol, source, 12, dest); } /* Add leading zeroes to EAN and UPC strings */ -INTERNAL void ean_leading_zeroes(struct zint_symbol *symbol, unsigned char source[], unsigned char local_source[], int *p_with_addon) { +INTERNAL void ean_leading_zeroes(struct zint_symbol *symbol, const unsigned char source[], + unsigned char local_source[], int *p_with_addon) { unsigned char first_part[20], second_part[7], zfirst_part[20], zsecond_part[7]; int with_addon = 0; int first_len = 0, second_len = 0, zfirst_len = 0, zsecond_len = 0, i, h; - h = ustrlen(source); + h = (int) ustrlen(source); for (i = 0; i < h; i++) { if (source[i] == '+') { with_addon = 1; @@ -633,46 +577,52 @@ INTERNAL void ean_leading_zeroes(struct zint_symbol *symbol, unsigned char sourc second_part[second_len] = '\0'; /* Calculate target lengths */ - if (second_len <= 5) { - zsecond_len = 5; - } - if (second_len <= 2) { - zsecond_len = 2; - } if (second_len == 0) { zsecond_len = 0; + } else { + if (second_len <= 5) { + if (second_len <= 2) { + zsecond_len = 2; + } else { + zsecond_len = 5; + } + } } switch (symbol->symbology) { case BARCODE_EANX: case BARCODE_EANX_CC: if (first_len <= 12) { - zfirst_len = 12; - } - if (first_len <= 7) { - zfirst_len = 7; + if (first_len <= 7) { + zfirst_len = 7; + } else { + zfirst_len = 12; + } } if (second_len == 0 && symbol->symbology == BARCODE_EANX) { /* No composite EAN-2/5 */ if (first_len <= 5) { - zfirst_len = 5; - } - if (first_len <= 2) { - zfirst_len = 2; + if (first_len <= 2) { + zfirst_len = 2; + } else { + zfirst_len = 5; + } } } break; case BARCODE_EANX_CHK: if (first_len <= 13) { - zfirst_len = 13; - } - if (first_len <= 8) { - zfirst_len = 8; + if (first_len <= 8) { + zfirst_len = 8; + } else { + zfirst_len = 13; + } } if (second_len == 0) { if (first_len <= 5) { - zfirst_len = 5; - } - if (first_len <= 2) { - zfirst_len = 2; + if (first_len <= 2) { + zfirst_len = 2; + } else { + zfirst_len = 5; + } } } break; @@ -687,16 +637,14 @@ INTERNAL void ean_leading_zeroes(struct zint_symbol *symbol, unsigned char sourc case BARCODE_UPCE_CC: if (first_len == 7) { zfirst_len = 7; - } - if (first_len <= 6) { + } else if (first_len <= 6) { zfirst_len = 6; } break; case BARCODE_UPCE_CHK: if (first_len == 8) { zfirst_len = 8; - } - if (first_len <= 7) { + } else if (first_len <= 7) { zfirst_len = 7; } break; @@ -711,21 +659,21 @@ INTERNAL void ean_leading_zeroes(struct zint_symbol *symbol, unsigned char sourc /* Add leading zeroes */ zfirst_part[0] = '\0'; for (i = 0; i < (zfirst_len - first_len); i++) { - strcat((char*) zfirst_part, "0"); + ustrcat(zfirst_part, "0"); } - strcat((char*) zfirst_part, (char*) first_part); + ustrcat(zfirst_part, first_part); zsecond_part[0] = '\0'; for (i = 0; i < (zsecond_len - second_len); i++) { - strcat((char*) zsecond_part, "0"); + ustrcat(zsecond_part, "0"); } - strcat((char*) zsecond_part, (char*) second_part); + ustrcat(zsecond_part, second_part); /* Copy adjusted data back to local_source */ - strcat((char*) local_source, (char*) zfirst_part); - if (ustrlen(zsecond_part)) { - strcat((char*) local_source, "+"); - strcat((char*) local_source, (char*) zsecond_part); + ustrcat(local_source, zfirst_part); + if (*zsecond_part) { + ustrcat(local_source, "+"); + ustrcat(local_source, zsecond_part); } if (p_with_addon) { @@ -737,10 +685,11 @@ INTERNAL void ean_leading_zeroes(struct zint_symbol *symbol, unsigned char sourc INTERNAL int eanx(struct zint_symbol *symbol, unsigned char source[], int src_len) { unsigned char first_part[20] = {0}, second_part[7] = {0}, dest[1000] = {0}; unsigned char local_source[21] = {0}; /* Allow 13 + "+" + 6 (too long add-on) + 1 */ - unsigned int latch, reader, writer; + int latch, reader, writer; int with_addon; int error_number, i, plus_count; int addon_gap = 0; + int first_part_len, second_part_len; latch = FALSE; writer = 0; @@ -781,6 +730,7 @@ INTERNAL int eanx(struct zint_symbol *symbol, unsigned char source[], int src_le reader = 0; if (with_addon) { + int local_length = (int) ustrlen(local_source); do { if (local_source[reader] == '+') { first_part[writer] = '\0'; @@ -798,39 +748,42 @@ INTERNAL int eanx(struct zint_symbol *symbol, unsigned char source[], int src_le reader++; writer++; } - } while (reader <= ustrlen(local_source)); + } while (reader <= local_length); - if (symbol->symbology == BARCODE_UPCA || symbol->symbology == BARCODE_UPCA_CHK || symbol->symbology == BARCODE_UPCA_CC) { + if (symbol->symbology == BARCODE_UPCA || symbol->symbology == BARCODE_UPCA_CHK + || symbol->symbology == BARCODE_UPCA_CC) { addon_gap = symbol->option_2 >= 9 && symbol->option_2 <= 12 ? symbol->option_2 : 9; } else { addon_gap = symbol->option_2 >= 7 && symbol->option_2 <= 12 ? symbol->option_2 : 7; } } else { - strcpy((char*) first_part, (char*) local_source); + ustrcpy(first_part, local_source); } + first_part_len = (int) ustrlen(first_part); + switch (symbol->symbology) { case BARCODE_EANX: case BARCODE_EANX_CHK: - switch (ustrlen(first_part)) { - case 2: add_on(first_part, (char*) dest, 0); + switch (first_part_len) { + case 2: add_on(first_part, first_part_len, dest, 0); ustrcpy(symbol->text, first_part); break; - case 5: add_on(first_part, (char*) dest, 0); + case 5: add_on(first_part, first_part_len, dest, 0); ustrcpy(symbol->text, first_part); break; case 7: - case 8: error_number = ean8(symbol, first_part, (char*) dest); + case 8: error_number = ean8(symbol, first_part, first_part_len, dest); break; case 12: - case 13: error_number = ean13(symbol, first_part, (char*) dest); + case 13: error_number = ean13(symbol, first_part, first_part_len, dest); break; default: strcpy(symbol->errtxt, "286: Input wrong length"); return ZINT_ERROR_TOO_LONG; } break; case BARCODE_EANX_CC: - switch (ustrlen(first_part)) { /* Adds vertical separator bars according to ISO/IEC 24723 section 11.4 */ + switch (first_part_len) { /* Adds vertical separator bars according to ISO/IEC 24723 section 11.4 */ case 7: set_module(symbol, symbol->rows, 1); set_module(symbol, symbol->rows, 67); set_module(symbol, symbol->rows + 1, 0); @@ -841,7 +794,7 @@ INTERNAL int eanx(struct zint_symbol *symbol, unsigned char source[], int src_le symbol->row_height[symbol->rows + 1] = 2; symbol->row_height[symbol->rows + 2] = 2; symbol->rows += 3; - error_number = ean8(symbol, first_part, (char*) dest); + error_number = ean8(symbol, first_part, first_part_len, dest); break; case 12: case 13:set_module(symbol, symbol->rows, 1); @@ -854,7 +807,7 @@ INTERNAL int eanx(struct zint_symbol *symbol, unsigned char source[], int src_le symbol->row_height[symbol->rows + 1] = 2; symbol->row_height[symbol->rows + 2] = 2; symbol->rows += 3; - error_number = ean13(symbol, first_part, (char*) dest); + error_number = ean13(symbol, first_part, first_part_len, dest); break; default: strcpy(symbol->errtxt, "287: Input wrong length"); return ZINT_ERROR_TOO_LONG; @@ -862,15 +815,15 @@ INTERNAL int eanx(struct zint_symbol *symbol, unsigned char source[], int src_le break; case BARCODE_UPCA: case BARCODE_UPCA_CHK: - if ((ustrlen(first_part) == 11) || (ustrlen(first_part) == 12)) { - error_number = upca(symbol, first_part, (char*) dest); + if ((first_part_len == 11) || (first_part_len == 12)) { + error_number = upca(symbol, first_part, first_part_len, dest); } else { strcpy(symbol->errtxt, "288: Input wrong length"); return ZINT_ERROR_TOO_LONG; } break; case BARCODE_UPCA_CC: - if (ustrlen(first_part) == 11 || ustrlen(first_part) == 12) { + if (first_part_len == 11 || first_part_len == 12) { set_module(symbol, symbol->rows, 1); set_module(symbol, symbol->rows, 95); set_module(symbol, symbol->rows + 1, 0); @@ -881,7 +834,7 @@ INTERNAL int eanx(struct zint_symbol *symbol, unsigned char source[], int src_le symbol->row_height[symbol->rows + 1] = 2; symbol->row_height[symbol->rows + 2] = 2; symbol->rows += 3; - error_number = upca(symbol, first_part, (char*) dest); + error_number = upca(symbol, first_part, first_part_len, dest); } else { strcpy(symbol->errtxt, "289: Input wrong length"); return ZINT_ERROR_TOO_LONG; @@ -889,15 +842,15 @@ INTERNAL int eanx(struct zint_symbol *symbol, unsigned char source[], int src_le break; case BARCODE_UPCE: case BARCODE_UPCE_CHK: - if ((ustrlen(first_part) >= 6) && (ustrlen(first_part) <= (symbol->symbology == BARCODE_UPCE ? 7 : 8))) { - error_number = upce(symbol, first_part, (char*) dest); + if ((first_part_len >= 6) && (first_part_len <= (symbol->symbology == BARCODE_UPCE ? 7 : 8))) { + error_number = upce(symbol, first_part, first_part_len, dest); } else { strcpy(symbol->errtxt, "290: Input wrong length"); return ZINT_ERROR_TOO_LONG; } break; case BARCODE_UPCE_CC: - if ((ustrlen(first_part) >= 6) && (ustrlen(first_part) <= 7)) { + if ((first_part_len >= 6) && (first_part_len <= 7)) { set_module(symbol, symbol->rows, 1); set_module(symbol, symbol->rows, 51); set_module(symbol, symbol->rows + 1, 0); @@ -908,14 +861,14 @@ INTERNAL int eanx(struct zint_symbol *symbol, unsigned char source[], int src_le symbol->row_height[symbol->rows + 1] = 2; symbol->row_height[symbol->rows + 2] = 2; symbol->rows += 3; - error_number = upce(symbol, first_part, (char*) dest); + error_number = upce(symbol, first_part, first_part_len, dest); } else { strcpy(symbol->errtxt, "291: Input wrong length"); return ZINT_ERROR_TOO_LONG; } break; case BARCODE_ISBNX: - error_number = isbn(symbol, first_part, ustrlen(first_part), (char*) dest); + error_number = isbn(symbol, first_part, first_part_len, dest); break; } @@ -923,24 +876,26 @@ INTERNAL int eanx(struct zint_symbol *symbol, unsigned char source[], int src_le return error_number; } - switch (ustrlen(second_part)) { + second_part_len = (int) ustrlen(second_part); + + switch (second_part_len) { case 0: break; case 2: - add_on(second_part, (char*) dest, addon_gap); - strcat((char*) symbol->text, "+"); - strcat((char*) symbol->text, (char*) second_part); + add_on(second_part, second_part_len, dest, addon_gap); + ustrcat(symbol->text, "+"); + ustrcat(symbol->text, second_part); break; case 5: - add_on(second_part, (char*) dest, addon_gap); - strcat((char*) symbol->text, "+"); - strcat((char*) symbol->text, (char*) second_part); + add_on(second_part, second_part_len, dest, addon_gap); + ustrcat(symbol->text, "+"); + ustrcat(symbol->text, second_part); break; default: strcpy(symbol->errtxt, "292: Add-on input wrong length"); return ZINT_ERROR_TOO_LONG; } - expand(symbol, (char*) dest); + expand(symbol, (const char *) dest); switch (symbol->symbology) { case BARCODE_EANX_CC: diff --git a/backend/zint.h b/backend/zint.h index 7f2483fa..90d58b8c 100644 --- a/backend/zint.h +++ b/backend/zint.h @@ -307,7 +307,7 @@ extern "C" { #define ZINT_CAP_MASK 0x0800 // The largest amount of data that can be encoded is 4350 4-byte UTF-8 chars in Han Xin Code -#define ZINT_MAX_FILE_LEN 17400 +#define ZINT_MAX_DATA_LEN 17400 // Debug flags #define ZINT_DEBUG_PRINT 1 diff --git a/frontend/main.c b/frontend/main.c index c7f1f552..7dc418af 100644 --- a/frontend/main.c +++ b/frontend/main.c @@ -297,7 +297,7 @@ static int is_raster(char *filetype) { static int batch_process(struct zint_symbol *symbol, char *filename, int mirror_mode, char *filetype, int rotate_angle) { FILE *file; - unsigned char buffer[ZINT_MAX_FILE_LEN] = {0}; // Maximum HanXin input + unsigned char buffer[ZINT_MAX_DATA_LEN] = {0}; // Maximum HanXin input unsigned char character = 0; int posn = 0, error_number = 0, line_count = 1; char output_file[256]; diff --git a/frontend/tests/test_args.c b/frontend/tests/test_args.c index e4d29fc2..f11549aa 100644 --- a/frontend/tests/test_args.c +++ b/frontend/tests/test_args.c @@ -389,7 +389,7 @@ static void test_stdin_input(int index, int debug) { assert_nonnull(exec(cmd, buf, sizeof(buf) - 1, debug, i), "i:%d exec(%s) NULL\n", i, cmd); assert_nonzero(testUtilExists(data[i].outfile), "i:%d testUtilExists(%s) != 1\n", i, data[i].outfile); - //assert_zero(remove(data[i].outfile), "i:%d remove(%s) != 0 (%d)\n", i, data[i].outfile, errno); + assert_zero(remove(data[i].outfile), "i:%d remove(%s) != 0 (%d)\n", i, data[i].outfile, errno); } testFinish();