#209 rss.c, composite.c; DBAR_EXP encodation methods; symbol NO_PNG out.gif

This commit is contained in:
gitlost 2020-12-21 19:30:07 +00:00
parent 2b85585e69
commit bee5f08f50
24 changed files with 1309 additions and 1257 deletions

View File

@ -40,7 +40,7 @@
#include <assert.h> #include <assert.h>
#include "common.h" #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 #define uchar unsigned char
@ -627,7 +627,7 @@ static void SumASCII(uchar **ppOutPos, int Sum, int CharacterSet)
/* Main function called by zint framework /* 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 charCur, dataLength;
int error_number; int error_number;
int rows, columns, useColumns; int rows, columns, useColumns;
@ -685,7 +685,7 @@ INTERNAL int codablock(struct zint_symbol *symbol,const unsigned char source[],
dataLength++; dataLength++;
} }
/* Replace all Codes>127 with <fnc4>Code-128 */ /* Replace all Codes>127 with <fnc4>Code-128 */
for (charCur = 0; charCur < (int) length; charCur++) { for (charCur = 0; charCur < length; charCur++) {
if (source[charCur]>127) if (source[charCur]>127)
{ {
data[dataLength] = aFNC4; data[dataLength] = aFNC4;
@ -710,7 +710,7 @@ INTERNAL int codablock(struct zint_symbol *symbol,const unsigned char source[],
/* nor row nor column count given */ /* nor row nor column count given */
if (rows <= 0 && columns <= 0) { if (rows <= 0 && columns <= 0) {
/* use 1/1 aspect/ratio Codablock */ /* use 1/1 aspect/ratio Codablock */
columns = floor(sqrt(dataLength)) + 5; columns = (int) floor(sqrt(dataLength)) + 5;
if (columns > 67) { if (columns > 67) {
columns = 67; columns = 67;
} else if (columns < 9) { } 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 */ /* Data Check Characters K1 and K2, Annex F */
Sum1 = Sum2 = 0; 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 */ Sum1 = (Sum1 + (charCur + 1) * source[charCur]) % 86; /* Mod as we go along to avoid overflow */
Sum2 = (Sum2 + charCur * source[charCur]) % 86; 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'); A2C128_C(&pOutPos,aFNC1,'\0');
else 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; ++charCur;
/* We need this here to get the good index */ /* We need this here to get the good index */
/* for the termination flags in Set. */ /* for the termination flags in Set. */

View File

@ -209,7 +209,7 @@ INTERNAL void dxsmooth(int list[2][C128_MAX], int *indexliste) {
* Translate Code 128 Set A characters into barcodes. * Translate Code 128 Set A characters into barcodes.
* This set handles all control characters NUL to US. * 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 > 127) {
if (source < 160) { 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 * This set handles all characters which are not part of long numbers and not
* control characters. * 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) { if (source > 127) {
strcat(dest, C128Table[source - 32 - 128]); strcat(dest, C128Table[source - 32 - 128]);
values[(*bar_chars)] = 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 /* Translate Code 128 Set C characters into barcodes
* This set handles numbers in a compressed form * 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; int weight;
weight = (10 * ctoi(source_a)) + ctoi(source_b); 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 */ /* 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; int i, j;
for (i = 0, j = 0; i < source_len && j < (int) sizeof(symbol->text); i++) { 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 */ /* 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 i, j, k, values[C128_MAX] = {0}, bar_characters, read, total_sum;
int error_number, indexchaine, indexliste, f_state; int error_number, indexchaine, indexliste, f_state;
int sourcelen; 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 /* Now we can calculate how long the barcode is going to be - and stop it from
being too long */ being too long */
last_set = set[0]; last_set = set[0];
glyph_count = 0.0; glyph_count = 0.0f;
for (i = 0; i < sourcelen; i++) { for (i = 0; i < sourcelen; i++) {
if ((set[i] == 'a') || (set[i] == 'b')) { 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')) { 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] == 'A') || (set[i] == 'B')) || (set[i] == 'C')) {
if (set[i] != last_set) { if (set[i] != last_set) {
last_set = set[i]; last_set = set[i];
glyph_count = glyph_count + 1.0; glyph_count = glyph_count + 1.0f;
} }
} }
if (i == 0) { if (i == 0) {
if (fset[i] == 'F') { if (fset[i] == 'F') {
glyph_count = glyph_count + 2.0; glyph_count = glyph_count + 2.0f;
} }
} else { } else {
if ((fset[i] == 'F') && (fset[i - 1] != 'F')) { 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')) { if ((fset[i] != 'F') && (fset[i - 1] == 'F')) {
glyph_count = glyph_count + 2.0; glyph_count = glyph_count + 2.0f;
} }
} }
if (set[i] == 'C') { if (set[i] == 'C') {
glyph_count = glyph_count + 0.5; glyph_count = glyph_count + 0.5f;
} else { } 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"); strcpy(symbol->errtxt, "341: Input too long");
return ZINT_ERROR_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) */ /* 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 i, j, values[C128_MAX] = {0}, bar_characters, read, total_sum;
int error_number, indexchaine, indexliste; int error_number, indexchaine, indexliste;
int list[2][C128_MAX] = {{0}}; 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 separator_row, linkage_flag, c_count;
int reduced_length; int reduced_length;
#ifndef _MSC_VER #ifndef _MSC_VER
char reduced[length + 1]; unsigned char reduced[length + 1];
#else #else
char* reduced = (char*) _alloca(length + 1); unsigned char *reduced = (unsigned char *) _alloca(length + 1);
#endif #endif
strcpy(dest, ""); strcpy(dest, "");
@ -735,7 +737,7 @@ INTERNAL int ean_128(struct zint_symbol *symbol, unsigned char source[], const s
if (error_number != 0) { if (error_number != 0) {
return error_number; 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 */ /* Decide on mode using same system as PDF417 and rules of ISO 15417 Annex E */
indexliste = 0; 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 /* Now we can calculate how long the barcode is going to be - and stop it from
being too long */ being too long */
last_set = set[0]; last_set = set[0];
glyph_count = 0.0; glyph_count = 0.0f;
for (i = 0; i < reduced_length; i++) { for (i = 0; i < reduced_length; i++) {
if ((set[i] == 'a') || (set[i] == 'b')) { 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] == 'A') || (set[i] == 'B')) || (set[i] == 'C')) {
if (set[i] != last_set) { if (set[i] != last_set) {
last_set = set[i]; last_set = set[i];
glyph_count = glyph_count + 1.0; glyph_count = glyph_count + 1.0f;
} }
} }
if ((set[i] == 'C') && (reduced[i] != '[')) { if ((set[i] == 'C') && (reduced[i] != '[')) {
glyph_count = glyph_count + 0.5; glyph_count = glyph_count + 0.5f;
} else { } 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"); strcpy(symbol->errtxt, "344: Input too long");
return ZINT_ERROR_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] != ']')) { if ((source[i] != '[') && (source[i] != ']')) {
symbol->text[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[21] = itoc(nve_check);
ean128_equiv[22] = '\0'; 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; 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[17] = itoc(check_digit);
ean128_equiv[18] = '\0'; 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; return error_number;
} }

View File

@ -30,7 +30,9 @@
SUCH DAMAGE. SUCH DAMAGE.
*/ */
/* vim: set ts=4 sw=4 et : */ /* vim: set ts=4 sw=4 et : */
#ifdef ZINT_TEST
#include <stdio.h> #include <stdio.h>
#endif
#ifdef _MSC_VER #ifdef _MSC_VER
#include <malloc.h> #include <malloc.h>
#endif #endif

View File

@ -55,6 +55,7 @@
#define ustrlen(source) strlen((const char *) (source)) #define ustrlen(source) strlen((const char *) (source))
#define ustrcpy(target, source) strcpy((char *) (target), (const char *) (source)) #define ustrcpy(target, source) strcpy((char *) (target), (const char *) (source))
#define ustrcat(target, source) strcat((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) #if defined(__GNUC__) && !defined(_WIN32) && !defined(ZINT_TEST)
#define INTERNAL __attribute__ ((visibility ("hidden"))) #define INTERNAL __attribute__ ((visibility ("hidden")))

File diff suppressed because it is too large Load Diff

View File

@ -38,7 +38,7 @@ static char alphanum_puncs[] = "*,-./";
static char isoiec_puncs[] = "!\"%&'()*+,-./:;<=>?_ "; static char isoiec_puncs[] = "!\"%&'()*+,-./:;<=>?_ ";
/* Returns type of char at `i`. FNC1 counted as NUMERIC. Returns 0 if invalid char */ /* 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')) { if (general_field[i] == '[' || (general_field[i] >= '0' && general_field[i] <= '9')) {
return NUMERIC; 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` */ /* 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) { if (i + num > general_field_len) {
return 0; 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 */ /* 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) { if (i + max_num < general_field_len) {
return 0; 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` */ /* 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--) { for (; i < general_field_len && num; i++, num--) {
if (general_field_type(general_field, i) == type) { if (general_field_type(general_field, i) == type) {
return 0; 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 /* 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) */ * 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 i, d1, d2;
int mode = *p_mode; int mode = *p_mode;
int last_digit = 0; /* Set to odd remaining digit at end if any */ char last_digit = '\0'; /* Set to odd remaining digit at end if any */
int general_field_len = strlen(general_field); int bp = *p_bp;
for (i = 0; i < general_field_len; ) { for (i = 0; i < general_field_len; ) {
int type = general_field_type(general_field, i); 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) { switch (mode) {
case NUMERIC: case NUMERIC:
if (i < general_field_len - 1) { /* If at least 2 characters remain */ 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) */ if (type != NUMERIC || general_field_type(general_field, i + 1) != NUMERIC) {
strcat(binary_string, "0000"); /* Alphanumeric latch */ /* 7.2.5.5.1/5.4.1 a) */
bp = bin_append_posn(0, 4, binary_string, bp); /* Alphanumeric latch "0000" */
mode = ALPHANUMERIC; mode = ALPHANUMERIC;
} else { } else {
d1 = general_field[i] == '[' ? 10 : ctoi(general_field[i]); d1 = general_field[i] == '[' ? 10 : ctoi(general_field[i]);
d2 = general_field[i + 1] == '[' ? 10 : ctoi(general_field[i + 1]); 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; i += 2;
} }
} else { /* If 1 character remains */ } else { /* If 1 character remains */
if (type != NUMERIC) { /* 7.2.5.5.1/5.4.1 b) */ if (type != NUMERIC) {
strcat(binary_string, "0000"); /* Alphanumeric latch */ /* 7.2.5.5.1/5.4.1 b) */
bp = bin_append_posn(0, 4, binary_string, bp); /* Alphanumeric latch "0000" */
mode = ALPHANUMERIC; mode = ALPHANUMERIC;
} else { } 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++; i++;
} }
} }
break; break;
case ALPHANUMERIC: case ALPHANUMERIC:
if (general_field[i] == '[') { /* 7.2.5.5.2/5.4.2 a) */ if (general_field[i] == '[') {
strcat(binary_string, "01111"); /* 7.2.5.5.2/5.4.2 a) */
bp = bin_append_posn(15, 5, binary_string, bp); /* "01111" */
mode = NUMERIC; mode = NUMERIC;
i++; i++;
} else if (type == ISOIEC) { /* 7.2.5.5.2/5.4.2 b) */ } else if (type == ISOIEC) {
strcat(binary_string, "00100"); /* ISO/IEC 646 latch */ /* 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; mode = ISOIEC;
} else if (general_field_next(general_field, i, general_field_len, 6, NUMERIC, 0)) { /* 7.2.5.5.2/5.4.2 c) */ } else if (general_field_next(general_field, i, general_field_len, 6, NUMERIC, 0)) {
strcat(binary_string, "000"); /* Numeric latch */ /* 7.2.5.5.2/5.4.2 c) */
bp = bin_append_posn(0, 3, binary_string, bp); /* Numeric latch "000" */
mode = NUMERIC; 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) */ } else if (general_field_next_terminate(general_field, i, general_field_len, 4,
strcat(binary_string, "000"); /* Numeric latch */ 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; mode = NUMERIC;
} else if ((general_field[i] >= '0') && (general_field[i] <= '9')) { } 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++; i++;
} else if ((general_field[i] >= 'A') && (general_field[i] <= 'Z')) { } 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++; i++;
} else { } 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++; i++;
} }
break; break;
case ISOIEC: case ISOIEC:
if (general_field[i] == '[') { /* 7.2.5.5.3/5.4.3 a) */ if (general_field[i] == '[') {
strcat(binary_string, "01111"); /* 7.2.5.5.3/5.4.3 a) */
bp = bin_append_posn(15, 5, binary_string, bp); /* "01111" */
mode = NUMERIC; mode = NUMERIC;
i++; i++;
} else { } else {
int next_10_not_isoiec = general_field_next_none(general_field, i, general_field_len, 10, ISOIEC); 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) */ if (next_10_not_isoiec && general_field_next(general_field, i, general_field_len, 4,
strcat(binary_string, "000"); /* Numeric latch */ 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; 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 */ /* 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; mode = ALPHANUMERIC;
} else if ((general_field[i] >= '0') && (general_field[i] <= '9')) { } 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++; i++;
} else if ((general_field[i] >= 'A') && (general_field[i] <= 'Z')) { } 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++; i++;
} else if ((general_field[i] >= 'a') && (general_field[i] <= 'z')) { } 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++; i++;
} else { } 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++; i++;
} }
} }
@ -182,5 +200,7 @@ INTERNAL int general_field_encode(char *general_field, int *p_mode, int *p_last_
*p_mode = mode; *p_mode = mode;
*p_last_digit = last_digit; *p_last_digit = last_digit;
*p_bp = bp;
return 1; return 1;
} }

View File

@ -39,7 +39,10 @@
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif /* __cplusplus */ #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 #ifdef __cplusplus
} }
#endif /* __cplusplus */ #endif /* __cplusplus */

View File

@ -69,9 +69,9 @@ static void itostr(char ai_string[], int ai_value) {
} }
/* Returns the number of times a character occurs in a string */ /* Returns the number of times a character occurs in a string */
static int ustrchr_cnt(const unsigned char string[], const size_t length, const unsigned char c) { static int ustrchr_cnt(const unsigned char string[], const int length, const unsigned char c) {
int count = 0; int count = 0;
unsigned int i; int i;
for (i = 0; i < length; i++) { for (i = 0; i < length; i++) {
if (string[i] == c) { if (string[i] == c) {
count++; count++;
@ -80,13 +80,14 @@ static int ustrchr_cnt(const unsigned char string[], const size_t length, const
return count; 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; int i, j, last_ai, ai_latch;
char ai_string[7]; /* 6 char max "(NNNN)" */ char ai_string[7]; /* 6 char max "(NNNN)" */
int bracket_level, max_bracket_level, ai_length, max_ai_length, min_ai_length; int bracket_level, max_bracket_level, ai_length, max_ai_length, min_ai_length;
int ai_count; int ai_count;
int error_latch; int error_latch;
int error_value; int error_value = 0;
#ifdef _MSC_VER #ifdef _MSC_VER
int *ai_value; int *ai_value;
int *ai_location; int *ai_location;
@ -104,7 +105,7 @@ INTERNAL int gs1_verify(struct zint_symbol *symbol, const unsigned char source[]
#endif #endif
/* Detect extended ASCII characters */ /* Detect extended ASCII characters */
for (i = 0; i < (int) src_len; i++) { for (i = 0; i < src_len; i++) {
if (source[i] >= 128) { if (source[i] >= 128) {
strcpy(symbol->errtxt, "250: Extended ASCII characters are not supported by GS1"); strcpy(symbol->errtxt, "250: Extended ASCII characters are not supported by GS1");
return ZINT_ERROR_INVALID_DATA; 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; min_ai_length = 5;
j = 0; j = 0;
ai_latch = 0; ai_latch = 0;
error_value = 0; for (i = 0; i < src_len; i++) {
for (i = 0; i < (int) src_len; i++) {
ai_length += j; ai_length += j;
if (((j == 1) && (source[i] != ']')) && ((source[i] < '0') || (source[i] > '9'))) { if (((j == 1) && (source[i] != ']')) && ((source[i] < '0') || (source[i] > '9'))) {
ai_latch = 1; ai_latch = 1;
@ -198,7 +198,7 @@ INTERNAL int gs1_verify(struct zint_symbol *symbol, const unsigned char source[]
} }
ai_count = 0; ai_count = 0;
for (i = 1; i < (int) src_len; i++) { for (i = 1; i < src_len; i++) {
if (source[i - 1] == '[') { if (source[i - 1] == '[') {
ai_location[ai_count] = i; ai_location[ai_count] = i;
j = 0; j = 0;
@ -223,7 +223,8 @@ INTERNAL int gs1_verify(struct zint_symbol *symbol, const unsigned char source[]
data_length[i] = 0; data_length[i] = 0;
do { do {
data_length[i]++; 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]--; 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' */ /* Resolve AI data - put resulting string in 'reduced' */
j = 0; j = 0;
ai_latch = 1; ai_latch = 1;
for (i = 0; i < (int) src_len; i++) { for (i = 0; i < src_len; i++) {
if ((source[i] != '[') && (source[i] != ']')) { if ((source[i] != '[') && (source[i] != ']')) {
reduced[j++] = source[i]; reduced[j++] = source[i];
} }

View File

@ -2,7 +2,7 @@
/* /*
libzint - the open source barcode library libzint - the open source barcode library
Copyright (C) 2009-2017 Robin Stuart <rstuart114@gmail.com> Copyright (C) 2009 - 2020 Robin Stuart <rstuart114@gmail.com>
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions modification, are permitted provided that the following conditions
@ -37,7 +37,8 @@
extern "C" { extern "C" {
#endif /* __cplusplus */ #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 #ifdef __cplusplus
} }

View File

@ -41,6 +41,10 @@
#define TECHNETIUM "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%" #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 *ZBarcode_Create() {
struct zint_symbol *symbol; struct zint_symbol *symbol;
@ -54,7 +58,11 @@ struct zint_symbol *ZBarcode_Create() {
symbol->fgcolor = &symbol->fgcolour[0]; symbol->fgcolor = &symbol->fgcolour[0];
strcpy(symbol->bgcolour, "ffffff"); strcpy(symbol->bgcolour, "ffffff");
symbol->bgcolor = &symbol->bgcolour[0]; symbol->bgcolor = &symbol->bgcolour[0];
#ifdef NO_PNG
strcpy(symbol->outfile, "out.gif");
#else
strcpy(symbol->outfile, "out.png"); strcpy(symbol->outfile, "out.png");
#endif
symbol->scale = 1.0f; symbol->scale = 1.0f;
symbol->option_1 = -1; symbol->option_1 = -1;
symbol->show_hrt = 1; // Show human readable text 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 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 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 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 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[], const size_t length); /* EAN-128 (GS1-128) */ 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 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 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 */ 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 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 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 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 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 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) */ 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) { if ((symbol->input_mode & 0x07) == UNICODE_MODE) {
/* Prior check ensures ECI only set for those that support it */ /* Prior check ensures ECI only set for those that support it */
preprocessed = preprocessed_buf; 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) { if (error_number != 0) {
strcpy(symbol->errtxt, "204: Invalid characters in input data"); strcpy(symbol->errtxt, "204: Invalid characters in input data");
return error_number; 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) 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; error_number = 0;
if (source == NULL) { 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); error_tag(symbol->errtxt, ZINT_ERROR_INVALID_DATA);
return 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 #ifdef NO_PNG
strcpy(symbol->outfile, "out.gif"); strcpy(symbol->outfile, "out.gif");
#else #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 // 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)) { if (is_composite(symbol->symbology) || !check_force_gs1(symbol->symbology)) {
#ifndef _MSC_VER #ifndef _MSC_VER
char reduced[in_length + 1]; unsigned char reduced[in_length + 1];
#else #else
char* reduced = (char*) _alloca(in_length + 1); unsigned char *reduced = (unsigned char *) _alloca(in_length + 1);
#endif #endif
error_number = gs1_verify(symbol, local_source, in_length, reduced); error_number = gs1_verify(symbol, local_source, in_length, reduced);
if (error_number != 0) { if (error_number != 0) {
@ -1553,7 +1576,7 @@ int ZBarcode_Encode_File(struct zint_symbol *symbol, char *filename) {
if (!strcmp(filename, "-")) { if (!strcmp(filename, "-")) {
file = stdin; file = stdin;
fileLen = ZINT_MAX_FILE_LEN; fileLen = ZINT_MAX_DATA_LEN;
} else { } else {
file = fopen(filename, "rb"); file = fopen(filename, "rb");
if (!file) { if (!file) {
@ -1574,7 +1597,7 @@ int ZBarcode_Encode_File(struct zint_symbol *symbol, char *filename) {
fclose(file); fclose(file);
return ZINT_ERROR_INVALID_DATA; 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"); strcpy(symbol->errtxt, "230: Input file too long");
error_tag(symbol->errtxt, ZINT_ERROR_INVALID_DATA); error_tag(symbol->errtxt, ZINT_ERROR_INVALID_DATA);
fclose(file); fclose(file);
@ -1673,7 +1696,8 @@ int ZBarcode_Encode_File_and_Buffer_Vector(struct zint_symbol *symbol, char *fil
int ZBarcode_Version() { int ZBarcode_Version() {
if (ZINT_VERSION_BUILD) { 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; return (ZINT_VERSION_MAJOR * 10000) + (ZINT_VERSION_MINOR * 100) + ZINT_VERSION_RELEASE;
} }

File diff suppressed because it is too large Load Diff

View File

@ -2852,6 +2852,94 @@ static void test_fuzz(int index, int debug) {
testFinish(); testFinish();
} }
#include <time.h>
#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[]) { int main(int argc, char *argv[]) {
testFunction funcs[] = { /* name, func, has_index, has_generate, has_debug */ 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_encodation_11", test_encodation_11, 1, 1, 1 },
{ "test_addongap", test_addongap, 1, 1, 1 }, { "test_addongap", test_addongap, 1, 1, 1 },
{ "test_fuzz", test_fuzz, 1, 0, 1 }, { "test_fuzz", test_fuzz, 1, 0, 1 },
{ "test_perf", test_perf, 1, 0, 1 },
}; };
testRun(argc, argv, funcs, ARRAY_SIZE(funcs)); testRun(argc, argv, funcs, ARRAY_SIZE(funcs));

View File

@ -286,7 +286,7 @@ static void test_hrt(int index, int debug) {
testFinish(); 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) { static void test_gs1_verify(int index) {
@ -801,7 +801,7 @@ static void test_gs1_verify(int index) {
int length = strlen(data[i].data); 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); 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) { if (ret == 0) {

View File

@ -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_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"); 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); ZBarcode_Delete(symbol);
testFinish(); testFinish();

View File

@ -195,114 +195,115 @@ static void test_examples(int index, int generate, int debug) {
int expected_rows; int expected_rows;
int expected_width; int expected_width;
int bwipp_cmp;
char *comment; char *comment;
char *expected; char *expected;
}; };
// Verified manually against GS1 General Specifications 20.0 (GGS) and ISO/IEC 24724:2011, and verified via bwipp_dump.ps against BWIPP // 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[] = { 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" "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" "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" "010110001100110000101111111100001010010001000011110111001110001010001011110000001110011101011111101101"
"000001110011001111010000000010100101101110111100001000110001110101110100001010100001100010100000010000" "000001110011001111010000000010100101101110111100001000110001110101110100001010100001100010100000010000"
"000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
"000001011111011111001010000001010010111111011100100000000000000000000000000000000000000000000000000000" "000001011111011111001010000001010010111111011100100000000000000000000000000000000000000000000000000000"
"001010100000100000110001111110000101000000100011010010000000000000000000000000000000000000000000000000" "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" "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" "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" "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" "01010100100000000100111111100001011100101101111010"
"00001010101011111010000000111010100011010010000000" "00001010101011111010000000111010100011010010000000"
"10111001010110000101111111000111001100111101110101" "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" "01010100100000000100111110000001010011100110011010"
"00001011011111111010000001010100101100011001100000" "00001011011111111010000001010100101100011001100000"
"00000101010101010101010101010101010101010101010000" "00000101010101010101010101010101010101010101010000"
"00001000100010111010010101010000111101001101110000" "00001000100010111010010101010000111101001101110000"
"10110111011101000101100000000111000010110010001101" "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" "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" "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" "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" "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" "010010000110001101101111111100001011100001100101000110100000011000101011111100001110100111000000100101"
"000001111001110010010000000010100100011110011010111001011111100111010100000010100001011000111111010000" "000001111001110010010000000010100100011110011010111001011111100111010100000010100001011000111111010000"
"000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
"000011101000010011100001000000001011100101100001110110110111110010001001010000001010011000100000110000" "000011101000010011100001000000001011100101100001110110110111110010001001010000001010011000100000110000"
"101000010111101100011100111111110100011010011110001001001000001101110100001111110001100111011111001010" "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" "010100010001111000101111111100001010111000001100010111000110001001101011110000001110010111000111011101"
"000011101110000111010000000010100101000111110011101000111001110110010100001010100001101000111000100000" "000011101110000111010000000010100101000111110011101000111001110110010100001010100001101000111000100000"
"000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
"000000001010000111001010000001010010111011011111100000000000000000000000000000000000000000000000000000" "000000001010000111001010000001010010111011011111100000000000000000000000000000000000000000000000000000"
"001011110101111000110001111110000101000100100000011010000000000000000000000000000000000000000000000000" "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" "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" "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" "01010100100000000100011111111001011111110010101010"
"00000101011111111010100000001010100000001101010000" "00000101011111111010100000001010100000001101010000"
"10101010110000000101111111110111011111111011010101" "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" "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" "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" "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" "0101100111100011001011111111000010100000010101100001100001100111001010111110000001100100001110100001001000011011111010001111110000101001011111100111010"
"0000011000011100110100000000101001011111101010011110011110011000110101000001010100011011110001011110110111100100000101010000001010010110100000011000000" "0000011000011100110100000000101001011111101010011110011110011000110101000001010100011011110001011110110111100100000101010000001010010110100000011000000"
"0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" "0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000"
"0000110111000011011010000000010000100000100111011001100001100100010010100101010100101110110001111001011101100011101110100000000010000000000000000000000" "0000110111000011011010000000010000100000100111011001100001100100010010100101010100101110110001111001011101100011101110100000000010000000000000000000000"
"1011001000111100100101111111100111011111011000100110011110011011101100011000000001010001001110000110100010011100010001011111111100110100000000000000000" "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" "0100001101011000011011111111000010100000010101100001100001100111001010111110000001100100001110100001001000011011111010001111110000101001011111100111010"
"0000110010100111100100000000101001011111101010011110011110011000110101000001010100011011110001011110110111100100000101010000001010010110100000011000000" "0000110010100111100100000000101001011111101010011110011110011000110101000001010100011011110001011110110111100100000101010000001010010110100000011000000"
"0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" "0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000"
"0000011011111011111010000000010000111100101011111001000100011100111010100001010100000000000000000000000000000000000000000000000000000000000000000000000" "0000011011111011111010000000010000111100101011111001000100011100111010100001010100000000000000000000000000000000000000000000000000000000000000000000000"
"1010100100000100000101111111100111000011010100000110111011100011000100011110000001010000000000000000000000000000000000000000000000000000000000000000000" "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" "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" "01000001010000010100011111111001011110110101110010"
"00001100101101101010100001010100100001001010100000" "00001100101101101010100001010100100001001010100000"
"10100011011011000101111110000011001110110111001101" "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" "010101111100001001101111111100001011100001110110010100000011011010001011111000000110011010000001001101"
"000010000011110110010000000010100100011110001001101011111100100101110100000101010001100101111110110000" "000010000011110110010000000010100100011110001001101011111100100101110100000101010001100101111110110000"
"000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
@ -313,64 +314,64 @@ static void test_examples(int index, int generate, int debug) {
"000010111101011110010100101010100100111100110010111001001100011111010100000000010000000000000000000000" "000010111101011110010100101010100100111100110010111001001100011111010100000000010000000000000000000000"
"010001000010100001100011000000001011000011001101000110110011100000101011111111100110100000000000000000" "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" "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" "01000100001010000100011100000001011000100110001010"
"00000011010101011010101011111010100111010101010000" "00000011010101011010101011111010100111010101010000"
"10111100101110100101100000000111011000001000110101" "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" "01011101001000000100010000000001010000001101011010"
"00000010110111111010101010101010101111110010100000" "00000010110111111010101010101010101111110010100000"
"00000101010101010101010101010101010101010101010000" "00000101010101010101010101010101010101010101010000"
"00001101100011001010000000000100101100111011110000" "00001101100011001010000000000100101100111011110000"
"10100010011100110101111111110111010011000100001101" "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" "01001011101110000101110000000001011111011100101010"
"00000100010001111010001010101010100000100011010000" "00000100010001111010001010101010100000100011010000"
"00000101010101010101010101010101010101010101010000" "00000101010101010101010101010101010101010101010000"
"00001000100011001010000000010100100001000100100000" "00001000100011001010000000010100100001000100100000"
"10100111011100110101111111100011011110111011011101" "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" "01001011000010001100111000000001011100010101000010"
"00000100111101110010000101010100100011101010110000" "00000100111101110010000101010100100011101010110000"
"00000101010101010101010101010101010101010101010000" "00000101010101010101010101010101010101010101010000"
"00001110011100101010000010101000110100001000010000" "00001110011100101010000010101000110100001000010000"
"10110001100011010101111100000111001011110111100101" "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" "01001011000010001101111100000001011100010101000010"
"00000100111101110010000010101010100011101010110000" "00000100111101110010000010101010100011101010110000"
"00000101010101010101010101010101010101010101010000" "00000101010101010101010101010101010101010101010000"
"00000111001110101010000000101010110100001000010000" "00000111001110101010000000101010110100001000010000"
"10111000110001010101111111000001001011110111100101" "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" "01001001000000010101111100000001011111000100101010"
"00000110111111101010000010101010100000111011010000" "00000110111111101010000010101010100000111011010000"
"00000101010101010101010101010101010101010101010000" "00000101010101010101010101010101010101010101010000"
"00001110100010111010000000001010111010000111010000" "00001110100010111010000000001010111010000111010000"
"10110001011101000101111111110001000101111000101101" "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" "01000100010010000100111000000001011110111100101010"
"00001011101101111010000101010100100001000011010000" "00001011101101111010000101010100100001000011010000"
"00000101010101010101010101010101010101010101010000" "00000101010101010101010101010101010101010101010000"
"00000100011111001010000101010100101001100001110000" "00000100011111001010000101010100101001100001110000"
"10101011100000110101111000000011010110011110000101" "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" "010010100001111000101111111100001010000010001110110100111110001011101011111100001110001111010011000101"
"000001011110000111010000000010100101111101110001001011000001110100010100000010100001110000101100110000" "000001011110000111010000000010100101111101110001001011000001110100010100000010100001110000101100110000"
"000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
"000000100000000101111110110001101011110001110011010100101000000101000010010111000000000000000000000000" "000000100000000101111110110001101011110001110011010100101000000101000010010111000000000000000000000000"
"101110011111111010000001001110010100001110001100101010000111111000111101101000111101000000000000000000" "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" "010000111100100010101111111100001010001000100000110100111110001011101011111000000110001111010011000101"
"000011000011011101010000000010100101110111011111001011000001110100010100000101010001110000101100110000" "000011000011011101010000000010100101110111011111001011000001110100010100000101010001110000101100110000"
"000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
@ -381,7 +382,7 @@ static void test_examples(int index, int generate, int debug) {
"000010000110110001010100001010100100000111010011000000000000000000000000000000000000000000000000000000" "000010000110110001010100001010100100000111010011000000000000000000000000000000000000000000000000000000"
"010001111001001110100011110000001011111000101100100100000000000000000000000000000000000000000000000000" "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" "010111011100010001101111111100001010000010001110110100111110001011101011111000000110001111010011000101"
"000000100011101110010000000010100101111101110001001011000001110100010100000101010001110000101100110000" "000000100011101110010000000010100101111101110001001011000001110100010100000101010001110000101100110000"
"000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
@ -392,7 +393,7 @@ static void test_examples(int index, int generate, int debug) {
"000010000110110001010100101010100100111000100011011011000110001101110100000000010000000000000000000000" "000010000110110001010100101010100100111000100011011011000110001101110100000000010000000000000000000000"
"010001111001001110100011000000001011000111011100100100111001110010001011111111100110100000000000000000" "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" "010100010011111001101111111100001011001000010000010100111110001011101011111000000110001111010011000101"
"000011101100000110010000000010100100110111101111101011000001110100010100000101010001110000101100110000" "000011101100000110010000000010100100110111101111101011000001110100010100000101010001110000101100110000"
"000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
@ -403,7 +404,7 @@ static void test_examples(int index, int generate, int debug) {
"000010000110110001010100101010100100111000100011011011000110001110110100000000010001101110100001000000" "000010000110110001010100101010100100111000100011011011000110001110110100000000010001101110100001000000"
"010001111001001110100011000000001011000111011100100100111001110001001011111111100110010001011110111101" "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" "010010000111101011101111111100001011100000101100010100111110001011101011110000000010001111010011000101"
"000001111000010100010000000010100100011111010011101011000001110100010100001010101001110000101100110000" "000001111000010100010000000010100100011111010011101011000001110100010100001010101001110000101100110000"
"000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
@ -418,7 +419,7 @@ static void test_examples(int index, int generate, int debug) {
"000000100000000101001001111101100011000010000110010100101010100101011111011100100000000000000000000000" "000000100000000101001001111101100011000010000110010100101010100101011111011100100000000000000000000000"
"101110011111111010110110000010011100111101111001101010000000011000100000100011011101000000000000000000" "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" "0100100001111010111011111111000010111000001011000101001111100010111010111100000000100011110100110001011110001011011110001111110000101010011000111000010"
"0000011110000101000100000000101001000111110100111010110000011101000101000010101010011100001011001110100001110100100001010000001010010101100111000110000" "0000011110000101000100000000101001000111110100111010110000011101000101000010101010011100001011001110100001110100100001010000001010010101100111000110000"
"0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" "0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000"
@ -429,7 +430,7 @@ static void test_examples(int index, int generate, int debug) {
"0000001001110111110101001010101001010011000010000110001101111100100101000000001000000000000000000000000000000000000000000000000000000000000000000000000" "0000001001110111110101001010101001010011000010000110001101111100100101000000001000000000000000000000000000000000000000000000000000000000000000000000000"
"0101110110001000001000110000000010101100111101111001110010000011011010111111110011101000000000000000000000000000000000000000000000000000000000000000000" "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" "010101111100011101101111111100001011100000101100010101111110011110101011110000000010111000111110010101"
"000010000011100010010000000010100100011111010011101010000001100001010100001010101001000111000001100000" "000010000011100010010000000010100100011111010011101010000001100001010100001010101001000111000001100000"
"000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
@ -448,7 +449,7 @@ static void test_examples(int index, int generate, int debug) {
"000010011111000111010001010101010101000111001111011011110100110000110100000000010000000000000000000000" "000010011111000111010001010101010101000111001111011011110100110000110100000000010000000000000000000000"
"010101100000111000100110000000001010111000110000100100001011001111001011111111100110100000000000000000" "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" "010101011110111111101111111100001011001000000101000100111110001011101011110000000010001111010011000101"
"000010100001000000010000000010100100110111111010111011000001110100010100001010101001110000101100110000" "000010100001000000010000000010100100110111111010111011000001110100010100001010101001110000101100110000"
"000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
@ -471,7 +472,7 @@ static void test_examples(int index, int generate, int debug) {
"000001000111010000101000101010101010100001011000110000000000000000000000000000000000000000000000000000" "000001000111010000101000101010101010100001011000110000000000000000000000000000000000000000000000000000"
"001000111000101111010011000000000101011110100111000010000000000000000000000000000000000000000000000000" "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" "0101010111101111111011111111000010110010000001010001001111100010111010111100000000100011110100110001011110001011011110001111110000101010011000111000010"
"0000101000010000000100000000101001001101111110101110110000011101000101000010101010011100001011001110100001110100100001010000001010010101100111000110000" "0000101000010000000100000000101001001101111110101110110000011101000101000010101010011100001011001110100001110100100001010000001010010101100111000110000"
"0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" "0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000"
@ -486,7 +487,7 @@ static void test_examples(int index, int generate, int debug) {
"0000101110001000111010000000001000101111101000110001110001110100001010001010101010101000010110001100000000000000000000000000000000000000000000000000000" "0000101110001000111010000000001000101111101000110001110001110100001010001010101010101000010110001100000000000000000000000000000000000000000000000000000"
"1010010001110111000101111111110011010000010111001110001110001011110100110000000001010111101001110000100000000000000000000000000000000000000000000000000" "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" "01010101111011111110111111110000101100100000010100010011111000101110101111000000001000111101001100010111100010110111100011111100001010100110001110000101001110000010001011110000001110001110001000100101"
"00001010000100000001000000001010010011011111101011101100000111010001010000101010100111000010110011101000011101001000010100000010100101011001110001111010110001111101110100001010100001110001110111010000" "00001010000100000001000000001010010011011111101011101100000111010001010000101010100111000010110011101000011101001000010100000010100101011001110001111010110001111101110100001010100001110001110111010000"
"00000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "00000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
@ -497,7 +498,7 @@ static void test_examples(int index, int generate, int debug) {
"00000011000110001001000000010101010000011110011010101101110001000111010000000001000101111101000110001110001110100001010001010101010101000010110001100000000000000000000000000000000000000000000000000000" "00000011000110001001000000010101010000011110011010101101110001000111010000000001000101111101000110001110001110100001010001010101010101000010110001100000000000000000000000000000000000000000000000000000"
"01011100111001110110011111100000101111100001100101010010001110111000101111111110011010000010111001110001110001011110100110000000001010111101001110000100000000000000000000000000000000000000000000000000" "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" "010101011110111111101111111100001011001000000101000100111110001011101011110000000010001111010011000101111000101101111000111111000010101001100011100001010011100000100010111100000011100011100010001001000111100100111010001111000000101100011101110010010"
"000010100001000000010000000010100100110111111010111011000001110100010100001010101001110000101100111010000111010010000101000000101001010110011100011110101100011111011101000010101000011100011101110110111000011011000101010000101010010011100010001100000" "000010100001000000010000000010100100110111111010111011000001110100010100001010101001110000101100111010000111010010000101000000101001010110011100011110101100011111011101000010101000011100011101110110111000011011000101010000101010010011100010001100000"
"000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000"
@ -508,45 +509,45 @@ static void test_examples(int index, int generate, int debug) {
"000010001110100001010001010101010101000010110001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "000010001110100001010001010101010101000010110001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
"010001110001011110100110000000001010111101001110000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "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" "0101010111101111111011111111000010110010000001010001001111100010111010111100000000100011110100110001011110001011011110001111110000101010011000111000010100111000001000101111000000111000111000100010010001111001001110100011110000001011000111011100100100111001110001001011111111001110100001011110111101"
"0000101000010000000100000000101001001101111110101110110000011101000101000010101010011100001011001110100001110100100001010000001010010101100111000111101011000111110111010000101010000111000111011101101110000110110001010100001010100100111000100011011011000110001110110100000000100001011110100001000000" "0000101000010000000100000000101001001101111110101110110000011101000101000010101010011100001011001110100001110100100001010000001010010101100111000111101011000111110111010000101010000111000111011101101110000110110001010100001010100100111000100011011011000110001110110100000000100001011110100001000000"
"0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
"0000000100111011111010100101010100101001100001000011000100010111101110100000101010001100000110011010010001100011000100100000001010101000001111001101010110111000100011101000000000100010111110100011000111000111010000101000101010101010100001011000110000000000000000000000000000000000000000000000000000" "0000000100111011111010100101010100101001100001000011000100010111101110100000101010001100000110011010010001100011000100100000001010101000001111001101010110111000100011101000000000100010111110100011000111000111010000101000101010101010100001011000110000000000000000000000000000000000000000000000000000"
"0010111011000100000100011000000001010110011110111100111011101000010001011111000000110011111001100101101110011100111011001111110000010111110000110010101001000111011100010111111111001101000001011100111000111000101111010011000000000101011110100111000010000000000000000000000000000000000000000000000000" "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" "01010101111011111110111111110000101100100000010100010011111000101110101111000000001000111101001100010111100010110111100011111100001010100110001110000101001110000010001011110000001110001110001000100100011110010011101000111100000010110001110111001001001110011100010010111111110011101000010111101111011101100010000010001100000000101011001111011110010"
"00001010000100000001000000001010010011011111101011101100000111010001010000101010100111000010110011101000011101001000010100000010100101011001110001111010110001111101110100001010100001110001110111011011100001101100010101000010101001001110001000110110110001100011101101000000001000010111101000010000100010011101111101010010101010010100110000100000000" "00001010000100000001000000001010010011011111101011101100000111010001010000101010100111000010110011101000011101001000010100000010100101011001110001111010110001111101110100001010100001110001110111011011100001101100010101000010101001001110001000110110110001100011101101000000001000010111101000010000100010011101111101010010101010010100110000100000000"
"00000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" "00000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000"
"00000100010111101110100000101010001100000110011010010001100011000100100000001010101000001111001101010110111000100011101000000000100010111110100011000111000111010000101000101010101010100001011000110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "00000100010111101110100000101010001100000110011010010001100011000100100000001010101000001111001101010110111000100011101000000000100010111110100011000111000111010000101000101010101010100001011000110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
"10111011101000010001011111000000110011111001100101101110011100111011001111110000010111110000110010101001000111011100010111111111001101000001011100111000111000101111010011000000000101011110100111000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "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" "010101011110111111101111111100001011001000000101000100111110001011101011110000000010001111010011000101111000101101111000111111000010101001100011100001010011100000100010111100000011100011100010001001000111100100111010001111000000101100011101110010010011100111000100101111111100111010000101111011110111011000100000100011000000001010110011110111100111011101000010001011111000000110011111001100101101"
"000010100001000000010000000010100100110111111010111011000001110100010100001010101001110000101100111010000111010010000101000000101001010110011100011110101100011111011101000010101000011100011101110110111000011011000101010000101010010011100010001101101100011000111011010000000010000101111010000100001000100111011111010100101010100101001100001000011000100010111101110100000101010001100000110011010000" "000010100001000000010000000010100100110111111010111011000001110100010100001010101001110000101100111010000111010010000101000000101001010110011100011110101100011111011101000010101000011100011101110110111000011011000101010000101010010011100010001101101100011000111011010000000010000101111010000100001000100111011111010100101010100101001100001000011000100010111101110100000101010001100000110011010000"
"000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
"000000011000110001001000000010101010000011110011010101101110001000111010000000001000101111101000110001110001110100001010001010101010101000010110001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "000000011000110001001000000010101010000011110011010101101110001000111010000000001000101111101000110001110001110100001010001010101010101000010110001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
"001011100111001110110011111100000101111100001100101010010001110111000101111111110011010000010111001110001110001011110100110000000001010111101001110000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "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" "0101010111101111111011111111000010110010000001010001001111100010111010111100000000100011110100110001011110001011011110001111110000101010011000111000010100111000001000101111000000111000111000100010010001111001001110100011110000001011000111011100100100111001110001001011111111001110100001011110111101110110001000001000110000000010101100111101111001110111010000100010111110000001100111110011001011011100111001110110011111100000101111100001100101010"
"0000101000010000000100000000101001001101111110101110110000011101000101000010101010011100001011001110100001110100100001010000001010010101100111000111101011000111110111010000101010000111000111011101101110000110110001010100001010100100111000100011011011000110001110110100000000100001011110100001000010001001110111110101001010101001010011000010000110001000101111011101000001010100011000001100110100100011000110001001000000010101010000011110011010000" "0000101000010000000100000000101001001101111110101110110000011101000101000010101010011100001011001110100001110100100001010000001010010101100111000111101011000111110111010000101010000111000111011101101110000110110001010100001010100100111000100011011011000110001110110100000000100001011110100001000010001001110111110101001010101001010011000010000110001000101111011101000001010100011000001100110100100011000110001001000000010101010000011110011010000"
"0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" "0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000"
"0000101110001000111010000000001000101111101000110001110001110100001010001010101010101000010110001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "0000101110001000111010000000001000101111101000110001110001110100001010001010101010101000010110001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
"1010010001110111000101111111110011010000010111001110001110001011110100110000000001010111101001110000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "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" "01010101111011111110111111110000101100100000010100010011111000101110101111000000001000111101001100010111100010110111100011111100001010100110001110000101001110000010001011110000001110001110001000100100011110010011101000111100000010110001110111001001001110011100010010111111110011101000010111101111011101100010000010001100000000101011001111011110011101110100001000101111100000011001111100110010110111001110011101100111111000001011111000011001010100100011101110001011111111100110100000101110011101"
"00001010000100000001000000001010010011011111101011101100000111010001010000101010100111000010110011101000011101001000010100000010100101011001110001111010110001111101110100001010100001110001110111011011100001101100010101000010101001001110001000110110110001100011101101000000001000010111101000010000100010011101111101010010101010010100110000100001100010001011110111010000010101000110000011001101001000110001100010010000000101010100000111100110101011011100010001110100000000010001011111010001100000" "00001010000100000001000000001010010011011111101011101100000111010001010000101010100111000010110011101000011101001000010100000010100101011001110001111010110001111101110100001010100001110001110111011011100001101100010101000010101001001110001000110110110001100011101101000000001000010111101000010000100010011101111101010010101010010100110000100001100010001011110111010000010101000110000011001101001000110001100010010000000101010100000111100110101011011100010001110100000000010001011111010001100000"
"00000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "00000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
"00000100011101000010100010101010101010000101100011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "00000100011101000010100010101010101010000101100011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
"00100011100010111101001100000000010101111010011100001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "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" "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" "01010101111011111110111111110000101100100000010100010"
"00001010000100000001000000001010010011011111101010000" "00001010000100000001000000001010010011011111101010000"
"00000101010101010101010101010101010101010101010100000" "00000101010101010101010101010101010101010101010100000"
@ -589,14 +590,14 @@ static void test_examples(int index, int generate, int debug) {
"00001000111010000101000101010101010100001011000110000" "00001000111010000101000101010101010100001011000110000"
"01000111000101111010011000000000101011110100111000010" "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" "0100011101110001011011111111000010110000100101111101101000000110001010111100000000101001110000001001010011111011100110001111110000101110101000011000011010011100011000101111000000111001111000111101010111110010110000100011110000001010110010000010000111011111000100101011111100001110011110011000100101"
"0000100010001110100100000000101001001111011010000010010111111001110101000010101010010110001111110110101100000100011001010000001010010001010111100111100101100011100111010000101010000110000111000010101000001101001111010100001010100101001101111101111000100000111011010100000010100001100001100111010000" "0000100010001110100100000000101001001111011010000010010111111001110101000010101010010110001111110110101100000100011001010000001010010001010111100111100101100011100111010000101010000110000111000010101000001101001111010100001010100101001101111101111000100000111011010100000010100001100001100111010000"
"0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
"0000110000010010011000010000000010111110011010001001111010011011100010010101010010101110100011111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "0000110000010010011000010000000010111110011010001001111010011011100010010101010010101110100011111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
"1010001111101101100111001111111101000001100101110110000101100100011101000000001100010001011100000110100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "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" "0100011101110001011011111111000010110000100101111101101000000110001010111100000000101001110000001001010011111011100110001111110000101110101000011000010"
"0000100010001110100100000000101001001111011010000010010111111001110101000010101010010110001111110110101100000100011001010000001010010001010111100110000" "0000100010001110100100000000101001001111011010000010010111111001110101000010101010010110001111110110101100000100011001010000001010010001010111100110000"
"0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" "0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000"
@ -607,30 +608,114 @@ static void test_examples(int index, int generate, int debug) {
"0000011111000101110101001010101001000111011001011110010001011001111101000000001000011001001000001100000000000000000000000000000000000000000000000000000" "0000011111000101110101001010101001000111011001011110010001011001111101000000001000011001001000001100000000000000000000000000000000000000000000000000000"
"0101100000111010001000110000000010111000100110100001101110100110000010111111110011100110110111110001010000000000000000000000000000000000000000000000000" "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" "01000111011100010110111111110000101100001001011111011010000001100010101111000000001010011100000010010100111110111001100011111100001011101010000110000110100111000110001011110000001110011110001111010101"
"00001000100011101001000000001010010011110110100000100101111110011101010000101010100101100011111101101011000001000110010100000010100100010101111001111001011000111001110100001010100001100001110000100000" "00001000100011101001000000001010010011110110100000100101111110011101010000101010100101100011111101101011000001000110010100000010100100010101111001111001011000111001110100001010100001100001110000100000"
"00000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "00000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
"00001100000100100110000100000000101111100110100010011110100110111000100101010100101011101000111110010110111001100001100001010000001010110111000001000111101111101100101001010100001010111100101100000000" "00001100000100100110000100000000101111100110100010011110100110111000100101010100101011101000111110010110111001100001100001010000001010110111000001000111101111101100101001010100001010111100101100000000"
"10100011111011011001110011111111010000011001011101100001011001000111010000000011000100010111000001101001000110011110011100001111110101001000111110111000010000010011010100000011110001000011010011111010" "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" "010001110111000101101111111100001011000010010111110110100000011000101011110000000010100111000000100101001111101110011000111111000010111010100001100001101001110001100010111100000011100111100011110101011111001011000010001111000000101011001000001000010"
"000010001000111010010000000010100100111101101000001001011111100111010100001010101001011000111111011010110000010001100101000000101001000101011110011110010110001110011101000010101000011000011100001010100000110100111101010000101010010100110111110110000" "000010001000111010010000000010100100111101101000001001011111100111010100001010101001011000111111011010110000010001100101000000101001000101011110011110010110001110011101000010101000011000011100001010100000110100111101010000101010010100110111110110000"
"000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000"
"000001000001110110101000000101000011000011001110110100111110001011101010010101010010001110110010111100100010110011111010000000010000110010010000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "000001000001110110101000000101000011000011001110110100111110001011101010010101010010001110110010111100100010110011111010000000010000110010010000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
"101110111110001001010111111000011100111100110001001011000001110100010001100000000101110001001101000011011101001100000101111111100111001101101111100010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "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" "01000111011100010110111111110000101100001001011111011010000001100010101111000000001010011100000010010100111110111001100011111100001011101010000110000110100111000110001011110000001110011110001111010101111100101100001000111100000010101100100000100001110111110001001010111111000011100111100110001001011000001110100010001100000000101110001001101000010"
"00001000100011101001000000001010010011110110100000100101111110011101010000101010100101100011111101101011000001000110010100000010100100010101111001111001011000111001110100001010100001100001110000101010000011010011110101000010101001010011011111011110001000001110110101000000101000011000011001110110100111110001011101010010101010010001110110010110000" "00001000100011101001000000001010010011110110100000100101111110011101010000101010100101100011111101101011000001000110010100000010100100010101111001111001011000111001110100001010100001100001110000101010000011010011110101000010101001010011011111011110001000001110110101000000101000011000011001110110100111110001011101010010101010010001110110010110000"
"00000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" "00000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000"
"00001000101100111110100000000100001100100100000110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "00001000101100111110100000000100001100100100000110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
"10110111010011000001011111111001110011011011111000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "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" "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); 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); assert_zero(ret, "i:%d ZBarcode_Encode ret %d != 0 (%s)\n", i, ret, symbol->errtxt);
if (generate) { if (generate) {
printf(" /*%3d*/ { %s, %d, \"%s\", %d, %d, \"%s\",\n", 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].comment); 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"); testUtilModulesDump(symbol, " ", "\n");
printf(" },\n"); printf(" },\n");
} else { } 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); 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)) { 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)); if (!data[i].bwipp_cmp) {
assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(symbol->symbology), ret); 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); 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", 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); i, testUtilBarcodeName(symbol->symbology), ret, bwipp_msg, bwipp_buf, data[i].expected);
}
} }
} }

View File

@ -405,52 +405,65 @@ static void test_isbn_input(int index, int debug) {
/* 0*/ { "0", 0, 0 }, // Left zero-padded if < 10 chars /* 0*/ { "0", 0, 0 }, // Left zero-padded if < 10 chars
/* 1*/ { "12345678", ZINT_ERROR_INVALID_CHECK, -1 }, /* 1*/ { "12345678", ZINT_ERROR_INVALID_CHECK, -1 },
/* 2*/ { "12345679", 0, 0 }, // 9 is correct check digit /* 2*/ { "12345679", 0, 0 }, // 9 is correct check digit
/* 3*/ { "123456789", 0, 0 }, /* 3*/ { "98765434", 0, 0 }, // 4 is correct check digit
/* 4*/ { "0123456789", 0, 0 }, /* 4*/ { "123456789", 0, 0 },
/* 5*/ { "1234567890", ZINT_ERROR_INVALID_CHECK, -1 }, /* 5*/ { "340013817", ZINT_ERROR_INVALID_CHECK, -1 },
/* 6*/ { "123456789X", 0, 0 }, // X is correct check digit /* 6*/ { "340013818", 0, 0 }, // 8 is correct check digit
/* 7*/ { "123456789x", 0, 0 }, // x is correct check digit /* 7*/ { "902888455", 0, 0 }, // 5 is correct check digit
/* 8*/ { "8175257660", 0, 0 }, // 0 is correct check digit /* 8*/ { "0123456789", 0, 0 },
/* 9*/ { "0590764845", 0, 0 }, // 5 is correct check digit /* 9*/ { "1234567890", ZINT_ERROR_INVALID_CHECK, -1 },
/* 10*/ { "0906495741", 0, 0 }, // 1 is correct check digit /* 10*/ { "123456789X", 0, 0 }, // X is correct check digit
/* 11*/ { "0140430016", 0, 0 }, // 6 is correct check digit /* 11*/ { "123456789x", 0, 0 }, // x is correct check digit
/* 12*/ { "0571086187", 0, 0 }, // 7 is correct check digit /* 12*/ { "8175257660", 0, 0 }, // 0 is correct check digit
/* 13*/ { "0486600882", 0, 0 }, // 2 is correct check digit /* 13*/ { "0590764845", 0, 0 }, // 5 is correct check digit
/* 14*/ { "12345678901", ZINT_ERROR_TOO_LONG, -1 }, /* 14*/ { "0906495741", 0, 0 }, // 1 is correct check digit
/* 15*/ { "123456789012", ZINT_ERROR_TOO_LONG, -1 }, /* 15*/ { "0140430016", 0, 0 }, // 6 is correct check digit
/* 16*/ { "1234567890123", ZINT_ERROR_INVALID_DATA, -1 }, /* 16*/ { "0571086187", 0, 0 }, // 7 is correct check digit
/* 17*/ { "9784567890120", 0, 0 }, // 0 is correct check digit /* 17*/ { "0486600882", 0, 0 }, // 2 is correct check digit
/* 18*/ { "9783161484100", 0, 0 }, // 0 is correct check digit /* 18*/ { "12345678901", ZINT_ERROR_TOO_LONG, -1 },
/* 19*/ { "9781846688225", 0, 0 }, // 5 is correct check digit /* 19*/ { "123456789012", ZINT_ERROR_TOO_LONG, -1 },
/* 20*/ { "9781847657954", 0, 0 }, // 4 is correct check digit /* 20*/ { "1234567890123", ZINT_ERROR_INVALID_DATA, -1 },
/* 21*/ { "9781846688188", 0, 0 }, // 8 is correct check digit /* 21*/ { "9784567890123", ZINT_ERROR_INVALID_CHECK, -1 },
/* 22*/ { "9781847659293", 0, 0 }, // 3 is correct check digit /* 22*/ { "9784567890120", 0, 0 }, // 0 is correct check digit
/* 23*/ { "97845678901201", ZINT_ERROR_TOO_LONG, -1 }, /* 23*/ { "9783161484100", 0, 0 }, // 0 is correct check digit
/* 24*/ { "3954994+12", 0, 0 }, /* 24*/ { "9781846688225", 0, 0 }, // 5 is correct check digit
/* 25*/ { "3954994+12345", 0, 0 }, /* 25*/ { "9781847657954", 0, 0 }, // 4 is correct check digit
/* 26*/ { "3954994+123456", ZINT_ERROR_TOO_LONG, -1 }, /* 26*/ { "9781846688188", 0, 0 }, // 8 is correct check digit
/* 27*/ { "3954994+", 0, 0 }, /* 27*/ { "9781847659293", 0, 0 }, // 3 is correct check digit
/* 28*/ { "61954993+1", 0, 0 }, /* 28*/ { "97845678901201", ZINT_ERROR_TOO_LONG, -1 },
/* 29*/ { "61954993+123", 0, 0 }, /* 29*/ { "3954994+12", 0, 0 },
/* 30*/ { "361954999+12", 0, 0 }, /* 30*/ { "3954994+12345", 0, 0 },
/* 31*/ { "361954999+1234", 0, 0 }, /* 31*/ { "3954994+123456", ZINT_ERROR_TOO_LONG, -1 },
/* 32*/ { "361954999+12", 0, 0 }, /* 32*/ { "3954994+", 0, 0 },
/* 33*/ { "199900003X+12", 0, 0 }, /* 33*/ { "61954993+1", 0, 0 },
/* 34*/ { "199900003x+12", 0, 0 }, /* 34*/ { "61954992+123", ZINT_ERROR_INVALID_CHECK, -1 },
/* 35*/ { "199900003X+12345", 0, 0 }, /* 35*/ { "61954993+123", 0, 0 },
/* 36*/ { "199900003x+12345", 0, 0 }, /* 36*/ { "361954990+12", ZINT_ERROR_INVALID_CHECK, -1 },
/* 37*/ { "9791234567896+12", 0, 0 }, /* 37*/ { "361954999+12", 0, 0 },
/* 38*/ { "9791234567896+12345", 0, 0 }, /* 38*/ { "361954999+1234", 0, 0 },
/* 39*/ { "9791234567896+", 0, 0 }, /* 39*/ { "361954999+12", 0, 0 },
/* 40*/ { "97912345678961+", ZINT_ERROR_TOO_LONG, -1 }, /* 40*/ { "1999000030+12", ZINT_ERROR_INVALID_CHECK, -1 },
/* 41*/ { "97912345678961+12345", ZINT_ERROR_TOO_LONG, -1 }, /* 41*/ { "199900003X+12", 0, 0 },
/* 42*/ { "9791234567896+123456", ZINT_ERROR_TOO_LONG, -1 }, /* 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); int data_size = sizeof(data) / sizeof(struct item);
for (int i = 0; i < data_size; i++) { for (int i = 0; i < data_size; i++) {
if (index != -1 && i != index) continue; 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(); struct zint_symbol *symbol = ZBarcode_Create();
assert_nonnull(symbol, "Symbol not created\n"); assert_nonnull(symbol, "Symbol not created\n");

View File

@ -42,11 +42,6 @@
#include <unistd.h> #include <unistd.h>
#include <errno.h> #include <errno.h>
#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 tests = 0;
static int failed = 0; static int failed = 0;
static int skipped = 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, 44, 0, 0, 0, 0, 0, },
{ "", -1, 45, 0, 0, 0, 0, 0, }, { "", -1, 45, 0, 0, 0, 0, 0, },
{ "", -1, 46, 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, }, { "", -1, 48, 0, 0, 0, 0, 0, },
{ "symbol", BARCODE_FIM, 49, 0, 0, 0, 0, 0, }, { "symbol", BARCODE_FIM, 49, 0, 0, 0, 0, 0, },
{ "code39", BARCODE_LOGMARS, 50, 0, 1, 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 */ 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 } else if (symbology == BARCODE_PDF417 || symbology == BARCODE_PDF417COMP || symbology == BARCODE_HIBC_PDF
|| symbology == BARCODE_MICROPDF417 || symbology == BARCODE_HIBC_MICPDF) { || symbology == BARCODE_MICROPDF417 || symbology == BARCODE_HIBC_MICPDF) {
for (r = 0; r < symbol->rows; r++) bwipp_row_height[r] = 1; /* Change from 3 */ 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) { } else if (symbology == BARCODE_CODEONE) {
if (option_2 >= 1 && option_2 <= 10) { if (option_2 >= 1 && option_2 <= 10) {
static char codeone_versions[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'S', 'T' }; static const char *codeone_versions[] = { "A", "B", "C", "D", "E", "F", "G", "H" };
sprintf(bwipp_opts_buf + (int) strlen(bwipp_opts_buf), "%sversion=%c", strlen(bwipp_opts_buf) ? " " : "", codeone_versions[option_2 - 1]); 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; 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); 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)); 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 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_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 || symbology == BARCODE_C25INTER || symbology == BARCODE_DPLEIT || symbology == BARCODE_DPIDENT || symbology == BARCODE_ITF14

View File

@ -39,6 +39,10 @@
#include <stdio.h> #include <stdio.h>
#include "../common.h" #include "../common.h"
#ifdef __cplusplus
extern "C" {
#endif
#ifndef ARRAY_SIZE #ifndef ARRAY_SIZE
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
#endif #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_BWIPP 128
#define ZINT_DEBUG_TEST_PERFORMANCE 256 #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); 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); 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 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); int testUtilBwippCmpRow(const struct zint_symbol *symbol, int row, char *msg, const char *bwipp_buf, const char *expected);
#ifdef __cplusplus
}
#endif
#endif /* TESTCOMMON_H */ #endif /* TESTCOMMON_H */

View File

@ -1,5 +1,5 @@
--- ../../../../postscriptbarcode/build/monolithic/barcode.ps 2020-10-26 01:13:25.080992540 +0000 --- ../../../../postscriptbarcode/build/monolithic/barcode.ps 2020-12-19 06:21:55.358036729 +0000
+++ ../tools/bwipp_dump.ps 2020-10-26 11:19:21.268222231 +0000 +++ ../tools/bwipp_dump.ps 2020-12-21 14:41:10.265502623 +0000
@@ -29,6 +29,8 @@ @@ -29,6 +29,8 @@
% CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS % CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
% IN THE SOFTWARE. % IN THE SOFTWARE.
@ -9,7 +9,7 @@
% --BEGIN TEMPLATE-- % --BEGIN TEMPLATE--
% --BEGIN RESOURCE preamble-- % --BEGIN RESOURCE preamble--
@@ -24466,34 +24468,80 @@ @@ -24471,34 +24473,80 @@
pop pop
} ifelse } ifelse
@ -109,7 +109,7 @@
end end
@@ -24552,7 +24600,7 @@ @@ -24557,7 +24605,7 @@
pop pop
} ifelse } ifelse
@ -118,7 +118,7 @@
% Get the result of encoding with ean8 and gs1-cc % Get the result of encoding with ean8 and gs1-cc
options (lintype) (ean8) put options (lintype) (ean8) put
@@ -24560,29 +24608,75 @@ @@ -24565,29 +24613,75 @@
options (dontdraw) true put options (dontdraw) true put
% Plot the linear part % Plot the linear part
@ -214,7 +214,7 @@
end end
@@ -24641,34 +24735,80 @@ @@ -24646,34 +24740,80 @@
pop pop
} ifelse } ifelse
@ -314,7 +314,7 @@
end end
@@ -24742,34 +24882,80 @@ @@ -24747,34 +24887,80 @@
/opt options /opt options
>> def >> def
@ -414,7 +414,7 @@
end end
@@ -24828,7 +25014,7 @@ @@ -24833,7 +25019,7 @@
pop pop
} ifelse } ifelse
@ -423,7 +423,7 @@
options (lintype) (databaromni) put options (lintype) (databaromni) put
options (linkage) true put options (linkage) true put
@@ -24839,7 +25025,7 @@ @@ -24844,7 +25030,7 @@
linear options //databaromni exec linear options //databaromni exec
dup (sbs) get /linsbs exch def dup (sbs) get /linsbs exch def
dup (bhs) get 0 get 72 mul /linheight exch def dup (bhs) get 0 get 72 mul /linheight exch def
@ -432,7 +432,7 @@
% Plot the separator % Plot the separator
/sepfinder { /sepfinder {
@@ -24870,20 +25056,66 @@ @@ -24875,20 +25061,66 @@
sep 0 [0 0 0] putinterval sep 0 [0 0 0] putinterval
sep sep length 4 sub [0 0 0 0] putinterval sep sep length 4 sub [0 0 0 0] putinterval
18 sepfinder 64 sepfinder 18 sepfinder 64 sepfinder
@ -511,7 +511,7 @@
end end
@@ -24941,7 +25173,7 @@ @@ -24946,7 +25178,7 @@
pop pop
} ifelse } ifelse
@ -520,7 +520,7 @@
options (lintype) (databarstacked) put options (lintype) (databarstacked) put
options (linkage) true put options (linkage) true put
@@ -24952,7 +25184,7 @@ @@ -24957,7 +25189,7 @@
linear options //databarstacked exec linear options //databarstacked exec
dup (pixs) get 0 2 index (pixx) get getinterval /bot exch def dup (pixs) get 0 2 index (pixx) get getinterval /bot exch def
dup (pixy) get /linheight exch def dup (pixy) get /linheight exch def
@ -529,7 +529,7 @@
% Plot the separator % Plot the separator
/sepfinder { /sepfinder {
@@ -24980,20 +25212,52 @@ @@ -24985,20 +25217,52 @@
sep 0 [ 0 0 0 0 ] putinterval sep 0 [ 0 0 0 0 ] putinterval
sep sep length 4 sub [ 0 0 0 0 ] putinterval sep sep length 4 sub [ 0 0 0 0 ] putinterval
18 sepfinder 18 sepfinder
@ -594,7 +594,7 @@
end end
@@ -25051,7 +25315,7 @@ @@ -25056,7 +25320,7 @@
pop pop
} ifelse } ifelse
@ -603,7 +603,7 @@
options (lintype) (databarstackedomni) put options (lintype) (databarstackedomni) put
options (linkage) true put options (linkage) true put
@@ -25062,7 +25326,7 @@ @@ -25067,7 +25331,7 @@
linear options //databarstackedomni exec linear options //databarstackedomni exec
dup (pixs) get 0 2 index (pixx) get getinterval /bot exch def dup (pixs) get 0 2 index (pixx) get getinterval /bot exch def
dup (pixy) get /linheight exch def dup (pixy) get /linheight exch def
@ -612,7 +612,7 @@
% Plot the separator % Plot the separator
/sepfinder { /sepfinder {
@@ -25090,20 +25354,52 @@ @@ -25095,20 +25359,52 @@
sep 0 [ 0 0 0 0 ] putinterval sep 0 [ 0 0 0 0 ] putinterval
sep sep length 4 sub [ 0 0 0 0 ] putinterval sep sep length 4 sub [ 0 0 0 0 ] putinterval
18 sepfinder 18 sepfinder
@ -677,7 +677,7 @@
end end
@@ -25276,7 +25572,7 @@ @@ -25281,7 +25577,7 @@
pop pop
} ifelse } ifelse
@ -686,7 +686,7 @@
options (lintype) (databarlimited) put options (lintype) (databarlimited) put
options (linkage) true put options (linkage) true put
@@ -25287,7 +25583,7 @@ @@ -25292,7 +25588,7 @@
linear options //databarlimited exec linear options //databarlimited exec
dup (sbs) get /linsbs exch def dup (sbs) get /linsbs exch def
dup (bhs) get 0 get 72 mul /linheight exch def dup (bhs) get 0 get 72 mul /linheight exch def
@ -695,7 +695,7 @@
% Plot the separator % Plot the separator
mark mark
@@ -25295,22 +25591,68 @@ @@ -25300,22 +25596,68 @@
counttomark 1 sub array astore /sep exch def pop pop counttomark 1 sub array astore /sep exch def pop pop
sep 0 [0 0 0] putinterval 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 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 end
@@ -25369,7 +25711,7 @@ @@ -25374,7 +25716,7 @@
pop pop
} ifelse } ifelse
@ -787,7 +787,7 @@
options (lintype) (databarexpanded) put options (lintype) (databarexpanded) put
options (linkage) true put options (linkage) true put
@@ -25380,7 +25722,7 @@ @@ -25385,7 +25727,7 @@
linear options //databarexpanded exec linear options //databarexpanded exec
dup (sbs) get /linsbs exch def dup (sbs) get /linsbs exch def
dup (bhs) get 0 get 72 mul /linheight exch def dup (bhs) get 0 get 72 mul /linheight exch def
@ -796,7 +796,7 @@
% Plot the separator % Plot the separator
/sepfinder { /sepfinder {
@@ -25409,20 +25751,60 @@ @@ -25414,20 +25756,60 @@
18 98 bot length 13 sub {} for 18 98 bot length 13 sub {} for
69 98 bot length 13 sub {} for 69 98 bot length 13 sub {} for
] {sepfinder} forall ] {sepfinder} forall
@ -869,7 +869,7 @@
end end
@@ -25480,7 +25862,7 @@ @@ -25485,7 +25867,7 @@
pop pop
} ifelse } ifelse
@ -878,7 +878,7 @@
options (lintype) (databarexpandedstacked) put options (lintype) (databarexpandedstacked) put
options (linkage) true put options (linkage) true put
@@ -25491,7 +25873,7 @@ @@ -25496,7 +25878,7 @@
linear options //databarexpandedstacked exec linear options //databarexpandedstacked exec
dup (pixs) get 0 2 index (pixx) get getinterval /bot exch def dup (pixs) get 0 2 index (pixx) get getinterval /bot exch def
dup (pixy) get /linheight exch def dup (pixy) get /linheight exch def
@ -887,7 +887,7 @@
% Plot the separator % Plot the separator
/sepfinder { /sepfinder {
@@ -25517,21 +25899,49 @@ @@ -25522,21 +25904,49 @@
19 98 bot length 13 sub {} for 19 98 bot length 13 sub {} for
70 98 bot length 13 sub {} for 70 98 bot length 13 sub {} for
] {sepfinder} forall ] {sepfinder} forall
@ -950,7 +950,7 @@
end end
@@ -25590,7 +26000,7 @@ @@ -25595,7 +26005,7 @@
pop pop
} ifelse } ifelse
@ -959,7 +959,7 @@
options (inkspread) (0) put options (inkspread) (0) put
options (dontdraw) true put options (dontdraw) true put
@@ -25617,35 +26027,87 @@ @@ -25622,35 +26032,87 @@
linear << options {} forall >> //gs1-128 exec linear << options {} forall >> //gs1-128 exec
dup (sbs) get /linsbs exch def dup (sbs) get /linsbs exch def
dup (bhs) get 0 get 72 mul /linheight exch def dup (bhs) get 0 get 72 mul /linheight exch def
@ -1061,7 +1061,7 @@
end end
@@ -26919,3 +27381,176 @@ @@ -26924,3 +27386,181 @@
% --END ENCODER hibcazteccode-- % --END ENCODER hibcazteccode--
% --END TEMPLATE-- % --END TEMPLATE--
@ -1076,7 +1076,7 @@
+% `-sb=` is the bwipp barcode routine name +% `-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) +% `-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)) +% `-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 +% Command line "-s" options put into system dictionary as strings
+/n systemdict /n known def +/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) + % 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 { + systemdict /r known {
+ /r systemdict /r get cvr def + /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 + /f {} def
+ } ifelse + } ifelse
@ -1231,7 +1236,7 @@
+ } if + } if
+} ifelse +} ifelse
+ +
+% If have renderer +% If have renderer
+ret /ren known { +ret /ren known {
+ % Scale + % Scale
+ /s systemdict /s known { systemdict /s get cvi } { 2 } ifelse def + /s systemdict /s known { systemdict /s get cvi } { 2 } ifelse def

View File

@ -79,17 +79,13 @@ static const char *EANsetB[10] = {
}; };
/* Calculate the correct check digit for a UPC barcode */ /* Calculate the correct check digit for a UPC barcode */
static char upc_check(char source[]) { static char upc_check(const char source[], const int length) {
unsigned int i, count, check_digit; int i, count, check_digit;
count = 0; count = 0;
for (i = 0; i < strlen(source); i++) { for (i = 0; i < length; i++) {
count += ctoi(source[i]); count += (i & 1) ? ctoi(source[i]) : 3 * ctoi(source[i]);
if (!(i & 1)) {
count += 2 * (ctoi(source[i]));
}
} }
check_digit = 10 - (count % 10); 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 */ /* 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[]) { static void upca_draw(const char source[], const int length, unsigned char dest[]) {
unsigned int i, half_way, length = strlen(source); int i, half_way;
half_way = length / 2; half_way = length / 2;
/* start character */ /* start character */
strcat(dest, "111"); ustrcat(dest, "111");
for (i = 0; i < length; i++) { for (i = 0; i < length; i++) {
if (i == half_way) { if (i == half_way) {
/* middle character - separates manufacturer no. from product no. */ /* middle character - separates manufacturer no. from product no. */
/* also inverts right hand characters */ /* 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 */ /* stop character */
strcat(dest, "111"); ustrcat(dest, "111");
} }
/* Make a UPC A barcode when we haven't been given the check digit */ /* 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[]) { static int upca(struct zint_symbol *symbol, const unsigned char source[], int length, unsigned char dest[]) {
int length;
char gtin[15]; char gtin[15];
int error_number = 0; int error_number = 0;
strcpy(gtin, (char*) source); ustrcpy(gtin, source);
length = strlen(gtin);
if (length == 11) { if (length == 11) {
gtin[length] = upc_check(gtin); gtin[length++] = upc_check(gtin, 11);
gtin[length + 1] = '\0'; gtin[length] = '\0';
} else { } else {
gtin[length - 1] = '\0'; if (source[length - 1] != upc_check(gtin, 11)) {
if (source[length - 1] != upc_check(gtin)) {
if (symbol->debug & ZINT_DEBUG_PRINT) { 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"); strcpy(symbol->errtxt, "270: Invalid check digit");
return ZINT_ERROR_INVALID_CHECK; return ZINT_ERROR_INVALID_CHECK;
} }
gtin[length - 1] = upc_check(gtin);
} }
if (symbol->debug & ZINT_DEBUG_PRINT) { 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); ustrcpy(symbol->text, gtin);
return error_number; return error_number;
} }
/* UPC E is a zero-compressed version of UPC A */ /* UPC E is a zero-compressed version of UPC A */
static int upce(struct zint_symbol *symbol, unsigned char source[], char dest[]) { static int upce(struct zint_symbol *symbol, unsigned char source[], int length, unsigned char dest[]) {
unsigned int i, num_system, length; int i, num_system;
char emode, equivalent[12], check_digit, parity[8], temp[9]; char emode, equivalent[12], check_digit, parity[8];
char hrt[9]; char hrt[9];
int error_number = 0; int error_number = 0;
/* Two number systems can be used - system 0 and system 1 */ /* Two number systems can be used - system 0 and system 1 */
if (symbol->symbology != BARCODE_UPCE_CHK) { if ((symbol->symbology != BARCODE_UPCE_CHK && length == 7) || length == 8) {
/* No check digit in input data */ switch (source[0]) {
if (ustrlen(source) == 7) { case '0': num_system = 0;
switch (source[0]) { break;
case '0': num_system = 0; case '1': num_system = 1;
break; break;
case '1': num_system = 1; default: num_system = 0;
break; /* First source char ignored */
default: num_system = 0; break;
/* 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);
} }
ustrcpy(hrt, source);
for (i = 1; i <= length; i++) {
source[i - 1] = hrt[i];
}
length--;
} else { } else {
/* Check digit is included in input data */ /* Length 6 with no check digit, or length 7 with check digit, system 0, insert leading zero */
if (ustrlen(source) == 8) { num_system = 0;
switch (source[0]) { hrt[0] = '0';
case '0': num_system = 0; hrt[1] = '\0';
break; ustrncat(hrt, source, length);
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);
}
} }
/* Expand the zero-compressed UPCE code to make a UPCA equivalent (EN Table 5) */ /* 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'; equivalent[i] = '0';
} }
if (num_system == 1) { if (num_system == 1) {
equivalent[0] = temp[0]; equivalent[0] = hrt[0];
} }
equivalent[1] = source[0]; equivalent[1] = source[0];
equivalent[2] = source[1]; 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 */ /* 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 */ /* Use the number system and check digit information to choose a parity scheme */
if (num_system == 1) { 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 */ /* Take all this information and make the barcode pattern */
/* start character */ /* start character */
strcat(dest, "111"); ustrcat(dest, "111");
length = ustrlen(source);
for (i = 0; i < length; i++) { for (i = 0; i < length; i++) {
switch (parity[i]) { switch (parity[i]) {
case 'A': lookup(NEON, EANsetA, source[i], dest); case 'A': lookup(NEON, EANsetA, source[i], (char *) dest);
break; break;
case 'B': lookup(NEON, EANsetB, source[i], dest); case 'B': lookup(NEON, EANsetB, source[i], (char *) dest);
break; break;
} }
} }
/* stop character */ /* stop character */
strcat(dest, "111111"); ustrcat(dest, "111111");
if (symbol->symbology != BARCODE_UPCE_CHK) { if (symbol->symbology != BARCODE_UPCE_CHK) {
hrt[7] = check_digit; hrt[7] = check_digit;
@ -304,7 +272,8 @@ static int upce(struct zint_symbol *symbol, unsigned char source[], char dest[])
} else { } else {
if (hrt[7] != check_digit) { if (hrt[7] != check_digit) {
if (symbol->debug & ZINT_DEBUG_PRINT) { 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"); strcpy(symbol->errtxt, "274: Invalid check digit");
return ZINT_ERROR_INVALID_CHECK; 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 */ /* 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]; char parity[6];
unsigned int i, code_type, length; int i, code_type;
/* If an add-on then append with space */ /* If an add-on then append with space */
if (addon_gap != 0) { if (addon_gap != 0) {
i = strlen(dest); i = (int) ustrlen(dest);
dest[i] = itoc(addon_gap); dest[i] = itoc(addon_gap);
dest[i + 1] = '\0'; dest[i + 1] = '\0';
} }
/* Start character */ /* Start character */
strcat(dest, "112"); ustrcat(dest, "112");
/* Determine EAN2 or EAN5 add-on */ /* Determine EAN2 or EAN5 add-on */
if (ustrlen(source) == 2) { if (length == 2) {
code_type = EAN2; code_type = EAN2;
} else { } else {
code_type = EAN5; code_type = EAN5;
@ -364,38 +333,32 @@ static void add_on(unsigned char source[], char dest[], int addon_gap) {
strcpy(parity, EAN5Parity[parity_bit]); strcpy(parity, EAN5Parity[parity_bit]);
} }
length = ustrlen(source);
for (i = 0; i < length; i++) { for (i = 0; i < length; i++) {
switch (parity[i]) { switch (parity[i]) {
case 'A': lookup(NEON, EANsetA, source[i], dest); case 'A': lookup(NEON, EANsetA, source[i], (char *) dest);
break; break;
case 'B': lookup(NEON, EANsetB, source[i], dest); case 'B': lookup(NEON, EANsetB, source[i], (char *) dest);
break; break;
} }
/* Glyph separator */ /* Glyph separator */
if (i != (ustrlen(source) - 1)) { if (i != (length - 1)) {
strcat(dest, "11"); ustrcat(dest, "11");
} }
} }
} }
/* ************************ EAN-13 ****************** */ /* ************************ EAN-13 ****************** */
/* Calculate the correct check digit for a EAN-13 barcode */ /* Calculate the correct check digit for a EAN-13 barcode (including ISBN(13)) */
static char ean_check(char source[]) { static char ean_check(const char source[], const int length) {
int i; int i;
unsigned int h, count, check_digit; int count, check_digit;
count = 0; count = 0;
h = strlen(source); for (i = 0; i < length; i++) {
for (i = h - 1; i >= 0; i--) { count += (i & 1) ? 3 * ctoi(source[i]) : ctoi(source[i]);
count += ctoi(source[i]);
if (i & 1) {
count += 2 * ctoi(source[i]);
}
} }
check_digit = 10 - (count % 10); check_digit = 10 - (count % 10);
if (check_digit == 10) { if (check_digit == 10) {
@ -404,34 +367,32 @@ static char ean_check(char source[]) {
return itoc(check_digit); return itoc(check_digit);
} }
static int ean13(struct zint_symbol *symbol, unsigned char source[], char dest[]) { static int ean13(struct zint_symbol *symbol, const unsigned char source[], int length, unsigned char dest[]) {
unsigned int length, i, half_way; int i, half_way;
char parity[6]; char parity[6];
char gtin[15]; char gtin[15];
int error_number = 0; int error_number = 0;
strcpy(parity, ""); parity[0] = '\0';
strcpy(gtin, (char*) source); ustrcpy(gtin, source);
/* Add the appropriate check digit */ /* Add the appropriate check digit */
length = strlen(gtin);
if (length == 12) { if (length == 12) {
gtin[length] = ean_check(gtin); gtin[length++] = ean_check(gtin, 12);
gtin[length + 1] = '\0'; gtin[length] = '\0';
} else { } else {
gtin[length - 1] = '\0'; if (source[length - 1] != ean_check(gtin, 12)) {
if (source[length - 1] != ean_check(gtin)) {
if (symbol->debug & ZINT_DEBUG_PRINT) { 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"); strcpy(symbol->errtxt, "275: Invalid check digit");
return ZINT_ERROR_INVALID_CHECK; return ZINT_ERROR_INVALID_CHECK;
} }
gtin[length - 1] = ean_check(gtin);
} }
if (symbol->debug & ZINT_DEBUG_PRINT) { 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 */ /* 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; half_way = 7;
/* start character */ /* start character */
strcat(dest, "111"); ustrcat(dest, "111");
length = strlen(gtin);
for (i = 1; i < length; i++) { for (i = 1; i < length; i++) {
if (i == half_way) { if (i == half_way) {
/* middle character - separates manufacturer no. from product no. */ /* middle character - separates manufacturer no. from product no. */
/* also inverses right hand characters */ /* also inverses right hand characters */
strcat(dest, "11111"); ustrcat(dest, "11111");
} }
if (((i > 1) && (i < 7)) && (parity[i - 2] == 'B')) { if (((i > 1) && (i < 7)) && (parity[i - 2] == 'B')) {
lookup(NEON, EANsetB, gtin[i], dest); lookup(NEON, EANsetB, gtin[i], (char *) dest);
} else { } else {
lookup(NEON, EANsetA, gtin[i], dest); lookup(NEON, EANsetA, gtin[i], (char *) dest);
} }
} }
/* stop character */ /* stop character */
strcat(dest, "111"); ustrcat(dest, "111");
ustrcpy(symbol->text, gtin); ustrcpy(symbol->text, gtin);
return error_number; return error_number;
} }
/* Make an EAN-8 barcode when we haven't been given the check digit */ /* 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 */ /* EAN-8 is basically the same as UPC-A but with fewer digits */
int length;
char gtin[10]; char gtin[10];
int error_number = 0; int error_number = 0;
strcpy(gtin, (char*) source); ustrcpy(gtin, source);
length = strlen(gtin);
if (length == 7) { if (length == 7) {
gtin[length] = upc_check(gtin); gtin[length++] = upc_check(gtin, 7);
gtin[length + 1] = '\0'; gtin[length] = '\0';
} else { } else {
gtin[length - 1] = '\0'; if (source[length - 1] != upc_check(gtin, 7)) {
if (source[length - 1] != upc_check(gtin)) {
if (symbol->debug & ZINT_DEBUG_PRINT) { 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"); strcpy(symbol->errtxt, "276: Invalid check digit");
return ZINT_ERROR_INVALID_CHECK; return ZINT_ERROR_INVALID_CHECK;
} }
gtin[length - 1] = upc_check(gtin);
} }
if (symbol->debug & ZINT_DEBUG_PRINT) { 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); ustrcpy(symbol->text, gtin);
return error_number; 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 */ /* For ISBN(10) and SBN only */
static char isbn_check(unsigned char source[]) { static char isbn_check(const unsigned char source[], const int length) {
unsigned int i, weight, sum, check, h; int i, weight, sum, check;
char check_char; char check_char;
sum = 0; sum = 0;
weight = 1; 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; sum += ctoi(source[i]) * weight;
weight++; weight++;
} }
@ -541,7 +478,7 @@ static char isbn_check(unsigned char source[]) {
} }
/* Make an EAN-13 barcode from an SBN or ISBN */ /* 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; int i, error_number;
char check_digit; 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; 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 (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"); strcpy(symbol->errtxt, "280: Incorrect ISBN check");
return ZINT_ERROR_INVALID_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 */ { if (src_len == 9 || src_len == 10) /* Using 10 digit ISBN or 9 digit SBN padded with leading zero */ {
check_digit = isbn_check(source); check_digit = isbn_check(source, 9);
if (check_digit != source[ustrlen(source) - 1]) { 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"); strcpy(symbol->errtxt, src_len == 9 ? "281: Incorrect SBN check" : "281: Incorrect ISBN check");
return ZINT_ERROR_INVALID_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'; source[12] = '\0';
} }
return ean13(symbol, source, dest); return ean13(symbol, source, 12, dest);
} }
/* Add leading zeroes to EAN and UPC strings */ /* 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]; unsigned char first_part[20], second_part[7], zfirst_part[20], zsecond_part[7];
int with_addon = 0; int with_addon = 0;
int first_len = 0, second_len = 0, zfirst_len = 0, zsecond_len = 0, i, h; 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++) { for (i = 0; i < h; i++) {
if (source[i] == '+') { if (source[i] == '+') {
with_addon = 1; with_addon = 1;
@ -633,46 +577,52 @@ INTERNAL void ean_leading_zeroes(struct zint_symbol *symbol, unsigned char sourc
second_part[second_len] = '\0'; second_part[second_len] = '\0';
/* Calculate target lengths */ /* Calculate target lengths */
if (second_len <= 5) {
zsecond_len = 5;
}
if (second_len <= 2) {
zsecond_len = 2;
}
if (second_len == 0) { if (second_len == 0) {
zsecond_len = 0; zsecond_len = 0;
} else {
if (second_len <= 5) {
if (second_len <= 2) {
zsecond_len = 2;
} else {
zsecond_len = 5;
}
}
} }
switch (symbol->symbology) { switch (symbol->symbology) {
case BARCODE_EANX: case BARCODE_EANX:
case BARCODE_EANX_CC: case BARCODE_EANX_CC:
if (first_len <= 12) { if (first_len <= 12) {
zfirst_len = 12; if (first_len <= 7) {
} zfirst_len = 7;
if (first_len <= 7) { } else {
zfirst_len = 7; zfirst_len = 12;
}
} }
if (second_len == 0 && symbol->symbology == BARCODE_EANX) { /* No composite EAN-2/5 */ if (second_len == 0 && symbol->symbology == BARCODE_EANX) { /* No composite EAN-2/5 */
if (first_len <= 5) { if (first_len <= 5) {
zfirst_len = 5; if (first_len <= 2) {
} zfirst_len = 2;
if (first_len <= 2) { } else {
zfirst_len = 2; zfirst_len = 5;
}
} }
} }
break; break;
case BARCODE_EANX_CHK: case BARCODE_EANX_CHK:
if (first_len <= 13) { if (first_len <= 13) {
zfirst_len = 13; if (first_len <= 8) {
} zfirst_len = 8;
if (first_len <= 8) { } else {
zfirst_len = 8; zfirst_len = 13;
}
} }
if (second_len == 0) { if (second_len == 0) {
if (first_len <= 5) { if (first_len <= 5) {
zfirst_len = 5; if (first_len <= 2) {
} zfirst_len = 2;
if (first_len <= 2) { } else {
zfirst_len = 2; zfirst_len = 5;
}
} }
} }
break; break;
@ -687,16 +637,14 @@ INTERNAL void ean_leading_zeroes(struct zint_symbol *symbol, unsigned char sourc
case BARCODE_UPCE_CC: case BARCODE_UPCE_CC:
if (first_len == 7) { if (first_len == 7) {
zfirst_len = 7; zfirst_len = 7;
} } else if (first_len <= 6) {
if (first_len <= 6) {
zfirst_len = 6; zfirst_len = 6;
} }
break; break;
case BARCODE_UPCE_CHK: case BARCODE_UPCE_CHK:
if (first_len == 8) { if (first_len == 8) {
zfirst_len = 8; zfirst_len = 8;
} } else if (first_len <= 7) {
if (first_len <= 7) {
zfirst_len = 7; zfirst_len = 7;
} }
break; break;
@ -711,21 +659,21 @@ INTERNAL void ean_leading_zeroes(struct zint_symbol *symbol, unsigned char sourc
/* Add leading zeroes */ /* Add leading zeroes */
zfirst_part[0] = '\0'; zfirst_part[0] = '\0';
for (i = 0; i < (zfirst_len - first_len); i++) { 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'; zsecond_part[0] = '\0';
for (i = 0; i < (zsecond_len - second_len); i++) { 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 */ /* Copy adjusted data back to local_source */
strcat((char*) local_source, (char*) zfirst_part); ustrcat(local_source, zfirst_part);
if (ustrlen(zsecond_part)) { if (*zsecond_part) {
strcat((char*) local_source, "+"); ustrcat(local_source, "+");
strcat((char*) local_source, (char*) zsecond_part); ustrcat(local_source, zsecond_part);
} }
if (p_with_addon) { 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) { 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 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 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 with_addon;
int error_number, i, plus_count; int error_number, i, plus_count;
int addon_gap = 0; int addon_gap = 0;
int first_part_len, second_part_len;
latch = FALSE; latch = FALSE;
writer = 0; writer = 0;
@ -781,6 +730,7 @@ INTERNAL int eanx(struct zint_symbol *symbol, unsigned char source[], int src_le
reader = 0; reader = 0;
if (with_addon) { if (with_addon) {
int local_length = (int) ustrlen(local_source);
do { do {
if (local_source[reader] == '+') { if (local_source[reader] == '+') {
first_part[writer] = '\0'; first_part[writer] = '\0';
@ -798,39 +748,42 @@ INTERNAL int eanx(struct zint_symbol *symbol, unsigned char source[], int src_le
reader++; reader++;
writer++; 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; addon_gap = symbol->option_2 >= 9 && symbol->option_2 <= 12 ? symbol->option_2 : 9;
} else { } else {
addon_gap = symbol->option_2 >= 7 && symbol->option_2 <= 12 ? symbol->option_2 : 7; addon_gap = symbol->option_2 >= 7 && symbol->option_2 <= 12 ? symbol->option_2 : 7;
} }
} else { } else {
strcpy((char*) first_part, (char*) local_source); ustrcpy(first_part, local_source);
} }
first_part_len = (int) ustrlen(first_part);
switch (symbol->symbology) { switch (symbol->symbology) {
case BARCODE_EANX: case BARCODE_EANX:
case BARCODE_EANX_CHK: case BARCODE_EANX_CHK:
switch (ustrlen(first_part)) { switch (first_part_len) {
case 2: add_on(first_part, (char*) dest, 0); case 2: add_on(first_part, first_part_len, dest, 0);
ustrcpy(symbol->text, first_part); ustrcpy(symbol->text, first_part);
break; 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); ustrcpy(symbol->text, first_part);
break; break;
case 7: 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; break;
case 12: 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; break;
default: strcpy(symbol->errtxt, "286: Input wrong length"); default: strcpy(symbol->errtxt, "286: Input wrong length");
return ZINT_ERROR_TOO_LONG; return ZINT_ERROR_TOO_LONG;
} }
break; break;
case BARCODE_EANX_CC: 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); case 7: set_module(symbol, symbol->rows, 1);
set_module(symbol, symbol->rows, 67); set_module(symbol, symbol->rows, 67);
set_module(symbol, symbol->rows + 1, 0); 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 + 1] = 2;
symbol->row_height[symbol->rows + 2] = 2; symbol->row_height[symbol->rows + 2] = 2;
symbol->rows += 3; symbol->rows += 3;
error_number = ean8(symbol, first_part, (char*) dest); error_number = ean8(symbol, first_part, first_part_len, dest);
break; break;
case 12: case 12:
case 13:set_module(symbol, symbol->rows, 1); 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 + 1] = 2;
symbol->row_height[symbol->rows + 2] = 2; symbol->row_height[symbol->rows + 2] = 2;
symbol->rows += 3; symbol->rows += 3;
error_number = ean13(symbol, first_part, (char*) dest); error_number = ean13(symbol, first_part, first_part_len, dest);
break; break;
default: strcpy(symbol->errtxt, "287: Input wrong length"); default: strcpy(symbol->errtxt, "287: Input wrong length");
return ZINT_ERROR_TOO_LONG; return ZINT_ERROR_TOO_LONG;
@ -862,15 +815,15 @@ INTERNAL int eanx(struct zint_symbol *symbol, unsigned char source[], int src_le
break; break;
case BARCODE_UPCA: case BARCODE_UPCA:
case BARCODE_UPCA_CHK: case BARCODE_UPCA_CHK:
if ((ustrlen(first_part) == 11) || (ustrlen(first_part) == 12)) { if ((first_part_len == 11) || (first_part_len == 12)) {
error_number = upca(symbol, first_part, (char*) dest); error_number = upca(symbol, first_part, first_part_len, dest);
} else { } else {
strcpy(symbol->errtxt, "288: Input wrong length"); strcpy(symbol->errtxt, "288: Input wrong length");
return ZINT_ERROR_TOO_LONG; return ZINT_ERROR_TOO_LONG;
} }
break; break;
case BARCODE_UPCA_CC: 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, 1);
set_module(symbol, symbol->rows, 95); set_module(symbol, symbol->rows, 95);
set_module(symbol, symbol->rows + 1, 0); 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 + 1] = 2;
symbol->row_height[symbol->rows + 2] = 2; symbol->row_height[symbol->rows + 2] = 2;
symbol->rows += 3; symbol->rows += 3;
error_number = upca(symbol, first_part, (char*) dest); error_number = upca(symbol, first_part, first_part_len, dest);
} else { } else {
strcpy(symbol->errtxt, "289: Input wrong length"); strcpy(symbol->errtxt, "289: Input wrong length");
return ZINT_ERROR_TOO_LONG; return ZINT_ERROR_TOO_LONG;
@ -889,15 +842,15 @@ INTERNAL int eanx(struct zint_symbol *symbol, unsigned char source[], int src_le
break; break;
case BARCODE_UPCE: case BARCODE_UPCE:
case BARCODE_UPCE_CHK: case BARCODE_UPCE_CHK:
if ((ustrlen(first_part) >= 6) && (ustrlen(first_part) <= (symbol->symbology == BARCODE_UPCE ? 7 : 8))) { if ((first_part_len >= 6) && (first_part_len <= (symbol->symbology == BARCODE_UPCE ? 7 : 8))) {
error_number = upce(symbol, first_part, (char*) dest); error_number = upce(symbol, first_part, first_part_len, dest);
} else { } else {
strcpy(symbol->errtxt, "290: Input wrong length"); strcpy(symbol->errtxt, "290: Input wrong length");
return ZINT_ERROR_TOO_LONG; return ZINT_ERROR_TOO_LONG;
} }
break; break;
case BARCODE_UPCE_CC: 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, 1);
set_module(symbol, symbol->rows, 51); set_module(symbol, symbol->rows, 51);
set_module(symbol, symbol->rows + 1, 0); 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 + 1] = 2;
symbol->row_height[symbol->rows + 2] = 2; symbol->row_height[symbol->rows + 2] = 2;
symbol->rows += 3; symbol->rows += 3;
error_number = upce(symbol, first_part, (char*) dest); error_number = upce(symbol, first_part, first_part_len, dest);
} else { } else {
strcpy(symbol->errtxt, "291: Input wrong length"); strcpy(symbol->errtxt, "291: Input wrong length");
return ZINT_ERROR_TOO_LONG; return ZINT_ERROR_TOO_LONG;
} }
break; break;
case BARCODE_ISBNX: 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; break;
} }
@ -923,24 +876,26 @@ INTERNAL int eanx(struct zint_symbol *symbol, unsigned char source[], int src_le
return error_number; return error_number;
} }
switch (ustrlen(second_part)) { second_part_len = (int) ustrlen(second_part);
switch (second_part_len) {
case 0: break; case 0: break;
case 2: case 2:
add_on(second_part, (char*) dest, addon_gap); add_on(second_part, second_part_len, dest, addon_gap);
strcat((char*) symbol->text, "+"); ustrcat(symbol->text, "+");
strcat((char*) symbol->text, (char*) second_part); ustrcat(symbol->text, second_part);
break; break;
case 5: case 5:
add_on(second_part, (char*) dest, addon_gap); add_on(second_part, second_part_len, dest, addon_gap);
strcat((char*) symbol->text, "+"); ustrcat(symbol->text, "+");
strcat((char*) symbol->text, (char*) second_part); ustrcat(symbol->text, second_part);
break; break;
default: default:
strcpy(symbol->errtxt, "292: Add-on input wrong length"); strcpy(symbol->errtxt, "292: Add-on input wrong length");
return ZINT_ERROR_TOO_LONG; return ZINT_ERROR_TOO_LONG;
} }
expand(symbol, (char*) dest); expand(symbol, (const char *) dest);
switch (symbol->symbology) { switch (symbol->symbology) {
case BARCODE_EANX_CC: case BARCODE_EANX_CC:

View File

@ -307,7 +307,7 @@ extern "C" {
#define ZINT_CAP_MASK 0x0800 #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 // 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 // Debug flags
#define ZINT_DEBUG_PRINT 1 #define ZINT_DEBUG_PRINT 1

View File

@ -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) { static int batch_process(struct zint_symbol *symbol, char *filename, int mirror_mode, char *filetype, int rotate_angle) {
FILE *file; 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; unsigned char character = 0;
int posn = 0, error_number = 0, line_count = 1; int posn = 0, error_number = 0, line_count = 1;
char output_file[256]; char output_file[256];

View File

@ -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_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_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(); testFinish();