First stage at creating ZPL compatability mode

Partly resolves #142 and relates to discussion in #197
This commit is contained in:
Robin Stuart 2020-08-22 11:09:57 +01:00
parent 321e1c1372
commit 9f5ae4cbb2
6 changed files with 131 additions and 41 deletions

View file

@ -1018,7 +1018,11 @@ INTERNAL int aztec(struct zint_symbol *symbol, unsigned char source[], const siz
if (!((symbol->option_1 >= -1) && (symbol->option_1 <= 4))) { if (!((symbol->option_1 >= -1) && (symbol->option_1 <= 4))) {
strcpy(symbol->errtxt, "503: Invalid error correction level - using default instead"); strcpy(symbol->errtxt, "503: Invalid error correction level - using default instead");
if (symbol->warn_level == WARN_FAIL_ALL) {
return ZINT_ERROR_INVALID_OPTION;
} else {
err_code = ZINT_WARN_INVALID_OPTION; err_code = ZINT_WARN_INVALID_OPTION;
}
symbol->option_1 = -1; symbol->option_1 = -1;
} }

View file

@ -86,6 +86,7 @@ INTERNAL int gs1_verify(struct zint_symbol *symbol, const unsigned char source[]
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;
#ifdef _MSC_VER #ifdef _MSC_VER
int *ai_value; int *ai_value;
int *ai_location; int *ai_location;
@ -124,7 +125,11 @@ INTERNAL int gs1_verify(struct zint_symbol *symbol, const unsigned char source[]
if (source[0] != '[') { if (source[0] != '[') {
strcpy(symbol->errtxt, "252: Data does not start with an AI"); strcpy(symbol->errtxt, "252: Data does not start with an AI");
if (symbol->warn_level != WARN_ZPL_COMPAT) {
return ZINT_ERROR_INVALID_DATA; return ZINT_ERROR_INVALID_DATA;
} else {
error_value = ZINT_WARN_NONCOMPLIANT;
}
} }
/* Check the position of the brackets */ /* Check the position of the brackets */
@ -135,6 +140,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 < (int) 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'))) {
@ -661,14 +667,22 @@ INTERNAL int gs1_verify(struct zint_symbol *symbol, const unsigned char source[]
itostr(ai_string, ai_value[i]); itostr(ai_string, ai_value[i]);
strcpy(symbol->errtxt, "259: Invalid data length for AI "); strcpy(symbol->errtxt, "259: Invalid data length for AI ");
strcat(symbol->errtxt, ai_string); strcat(symbol->errtxt, ai_string);
if (symbol->warn_level != WARN_ZPL_COMPAT) {
return ZINT_ERROR_INVALID_DATA; return ZINT_ERROR_INVALID_DATA;
} else {
error_value = ZINT_WARN_NONCOMPLIANT;
}
} }
if (error_latch == 2) { if (error_latch == 2) {
itostr(ai_string, ai_value[i]); itostr(ai_string, ai_value[i]);
strcpy(symbol->errtxt, "260: Invalid AI value "); strcpy(symbol->errtxt, "260: Invalid AI value ");
strcat(symbol->errtxt, ai_string); strcat(symbol->errtxt, ai_string);
if (symbol->warn_level != WARN_ZPL_COMPAT) {
return ZINT_ERROR_INVALID_DATA; return ZINT_ERROR_INVALID_DATA;
} else {
error_value = ZINT_WARN_NONCOMPLIANT;
}
} }
} }
@ -706,5 +720,5 @@ INTERNAL int gs1_verify(struct zint_symbol *symbol, const unsigned char source[]
reduced[j] = '\0'; reduced[j] = '\0';
/* the character '[' in the reduced string refers to the FNC1 character */ /* the character '[' in the reduced string refers to the FNC1 character */
return 0; return error_value;
} }

View file

@ -74,6 +74,7 @@ struct zint_symbol *ZBarcode_Create() {
symbol->dot_size = 4.0 / 5.0; symbol->dot_size = 4.0 / 5.0;
symbol->vector = NULL; symbol->vector = NULL;
symbol->debug = 0; symbol->debug = 0;
symbol->warn_level = WARN_DEFAULT;
return symbol; return symbol;
} }
@ -1044,10 +1045,14 @@ int ZBarcode_Encode(struct zint_symbol *symbol, const unsigned char *source, int
/* First check the symbology field */ /* First check the symbology field */
if (symbol->symbology < 1) { if (symbol->symbology < 1) {
strcpy(symbol->errtxt, "206: Symbology out of range, using Code 128"); strcpy(symbol->errtxt, "206: Symbology out of range");
if (symbol->warn_level == WARN_FAIL_ALL) {
return ZINT_ERROR_INVALID_OPTION;
} else {
symbol->symbology = BARCODE_CODE128; symbol->symbology = BARCODE_CODE128;
error_number = ZINT_WARN_INVALID_OPTION; error_number = ZINT_WARN_INVALID_OPTION;
} }
}
/* symbol->symbologys 1 to 86 are defined by tbarcode */ /* symbol->symbologys 1 to 86 are defined by tbarcode */
if (symbol->symbology == 5) { if (symbol->symbology == 5) {
@ -1063,10 +1068,14 @@ int ZBarcode_Encode(struct zint_symbol *symbol, const unsigned char *source, int
symbol->symbology = BARCODE_UPCA; symbol->symbology = BARCODE_UPCA;
} }
if (symbol->symbology == 19) { if (symbol->symbology == 19) {
strcpy(symbol->errtxt, "207: Codabar 18 not supported, using Codabar"); strcpy(symbol->errtxt, "207: Codabar 18 not supported");
if (symbol->warn_level == WARN_FAIL_ALL) {
return WARN_FAIL_ALL;
} else {
symbol->symbology = BARCODE_CODABAR; symbol->symbology = BARCODE_CODABAR;
error_number = ZINT_WARN_INVALID_OPTION; error_number = ZINT_WARN_INVALID_OPTION;
} }
}
if (symbol->symbology == 26) { if (symbol->symbology == 26) {
symbol->symbology = BARCODE_UPCA; symbol->symbology = BARCODE_UPCA;
} }
@ -1090,10 +1099,14 @@ int ZBarcode_Encode(struct zint_symbol *symbol, const unsigned char *source, int
symbol->symbology = BARCODE_NVE18; symbol->symbology = BARCODE_NVE18;
} }
if (symbol->symbology == 54) { if (symbol->symbology == 54) {
strcpy(symbol->errtxt, "210: General Parcel Code not supported, using Code 128"); strcpy(symbol->errtxt, "210: General Parcel Code not supported");
if (symbol->warn_level == WARN_FAIL_ALL) {
return ZINT_ERROR_INVALID_OPTION;
} else {
symbol->symbology = BARCODE_CODE128; symbol->symbology = BARCODE_CODE128;
error_number = ZINT_WARN_INVALID_OPTION; error_number = ZINT_WARN_INVALID_OPTION;
} }
}
if ((symbol->symbology == 59) || (symbol->symbology == 61)) { if ((symbol->symbology == 59) || (symbol->symbology == 61)) {
symbol->symbology = BARCODE_CODE128; symbol->symbology = BARCODE_CODE128;
} }
@ -1113,15 +1126,23 @@ int ZBarcode_Encode(struct zint_symbol *symbol, const unsigned char *source, int
symbol->symbology = BARCODE_GS1_128; symbol->symbology = BARCODE_GS1_128;
} }
if (symbol->symbology == 91) { if (symbol->symbology == 91) {
strcpy(symbol->errtxt, "212: Symbology out of range, using Code 128"); strcpy(symbol->errtxt, "212: Symbology out of range");
if (symbol->warn_level == WARN_FAIL_ALL) {
return ZINT_ERROR_INVALID_OPTION;
} else {
symbol->symbology = BARCODE_CODE128; symbol->symbology = BARCODE_CODE128;
error_number = ZINT_WARN_INVALID_OPTION; error_number = ZINT_WARN_INVALID_OPTION;
} }
}
if ((symbol->symbology >= 94) && (symbol->symbology <= 95)) { if ((symbol->symbology >= 94) && (symbol->symbology <= 95)) {
strcpy(symbol->errtxt, "213: Symbology out of range, using Code 128"); strcpy(symbol->errtxt, "213: Symbology out of range");
if (symbol->warn_level == WARN_FAIL_ALL) {
return ZINT_ERROR_INVALID_OPTION;
} else {
symbol->symbology = BARCODE_CODE128; symbol->symbology = BARCODE_CODE128;
error_number = ZINT_WARN_INVALID_OPTION; error_number = ZINT_WARN_INVALID_OPTION;
} }
}
if (symbol->symbology == 100) { if (symbol->symbology == 100) {
symbol->symbology = BARCODE_HIBC_128; symbol->symbology = BARCODE_HIBC_128;
} }
@ -1144,26 +1165,38 @@ int ZBarcode_Encode(struct zint_symbol *symbol, const unsigned char *source, int
symbol->symbology = BARCODE_HIBC_BLOCKF; symbol->symbology = BARCODE_HIBC_BLOCKF;
} }
if ((symbol->symbology == 113) || (symbol->symbology == 114)) { if ((symbol->symbology == 113) || (symbol->symbology == 114)) {
strcpy(symbol->errtxt, "214: Symbology out of range, using Code 128"); strcpy(symbol->errtxt, "214: Symbology out of range");
if (symbol->warn_level == WARN_FAIL_ALL) {
return ZINT_ERROR_INVALID_OPTION;
} else {
symbol->symbology = BARCODE_CODE128; symbol->symbology = BARCODE_CODE128;
error_number = ZINT_WARN_INVALID_OPTION; error_number = ZINT_WARN_INVALID_OPTION;
} }
}
if (symbol->symbology == 115) { if (symbol->symbology == 115) {
symbol->symbology = BARCODE_DOTCODE; symbol->symbology = BARCODE_DOTCODE;
} }
if ((symbol->symbology >= 117) && (symbol->symbology <= 127)) { if ((symbol->symbology >= 117) && (symbol->symbology <= 127)) {
if (symbol->symbology != 121) { if (symbol->symbology != 121) {
strcpy(symbol->errtxt, "215: Symbology out of range, using Code 128"); strcpy(symbol->errtxt, "215: Symbology out of range");
if (symbol->warn_level == WARN_FAIL_ALL) {
return ZINT_ERROR_INVALID_OPTION;
} else {
symbol->symbology = BARCODE_CODE128; symbol->symbology = BARCODE_CODE128;
error_number = ZINT_WARN_INVALID_OPTION; error_number = ZINT_WARN_INVALID_OPTION;
} }
} }
}
/* Everything from 128 up is Zint-specific */ /* Everything from 128 up is Zint-specific */
if (symbol->symbology > 145) { if (symbol->symbology > 145) {
strcpy(symbol->errtxt, "216: Symbology out of range, using Code 128"); strcpy(symbol->errtxt, "216: Symbology out of range");
if (symbol->warn_level == WARN_FAIL_ALL) {
return ZINT_ERROR_INVALID_OPTION;
} else {
symbol->symbology = BARCODE_CODE128; symbol->symbology = BARCODE_CODE128;
error_number = ZINT_WARN_INVALID_OPTION; error_number = ZINT_WARN_INVALID_OPTION;
} }
}
if ((!(supports_eci(symbol->symbology))) && (symbol->eci != 0)) { if ((!(supports_eci(symbol->symbology))) && (symbol->eci != 0)) {
strcpy(symbol->errtxt, "217: Symbology does not support ECI switching"); strcpy(symbol->errtxt, "217: Symbology does not support ECI switching");

View file

@ -836,14 +836,22 @@ INTERNAL int pdf417enc(struct zint_symbol *symbol, unsigned char source[], const
if ((symbol->option_1 < -1) || (symbol->option_1 > 8)) { if ((symbol->option_1 < -1) || (symbol->option_1 > 8)) {
strcpy(symbol->errtxt, "460: Security value out of range"); strcpy(symbol->errtxt, "460: Security value out of range");
if (symbol->warn_level == WARN_FAIL_ALL) {
return ZINT_ERROR_INVALID_OPTION;
} else {
symbol->option_1 = -1; symbol->option_1 = -1;
error_number = ZINT_WARN_INVALID_OPTION; error_number = ZINT_WARN_INVALID_OPTION;
} }
}
if ((symbol->option_2 < 0) || (symbol->option_2 > 30)) { if ((symbol->option_2 < 0) || (symbol->option_2 > 30)) {
strcpy(symbol->errtxt, "461: Number of columns out of range"); strcpy(symbol->errtxt, "461: Number of columns out of range");
if (symbol->warn_level == WARN_FAIL_ALL) {
return ZINT_ERROR_INVALID_OPTION;
} else {
symbol->option_2 = 0; symbol->option_2 = 0;
error_number = ZINT_WARN_INVALID_OPTION; error_number = ZINT_WARN_INVALID_OPTION;
} }
}
/* 349 */ /* 349 */
codeerr = pdf417(symbol, source, length); codeerr = pdf417(symbol, source, length);
@ -973,9 +981,13 @@ INTERNAL int micro_pdf417(struct zint_symbol *symbol, unsigned char chaine[], co
} }
if (symbol->option_2 > 4) { if (symbol->option_2 > 4) {
strcpy(symbol->errtxt, "468: Specified width out of range"); strcpy(symbol->errtxt, "468: Specified width out of range");
if (symbol->warn_level == WARN_FAIL_ALL) {
return ZINT_ERROR_INVALID_OPTION;
} else {
symbol->option_2 = 0; symbol->option_2 = 0;
codeerr = ZINT_WARN_INVALID_OPTION; codeerr = ZINT_WARN_INVALID_OPTION;
} }
}
if (debug) { if (debug) {
printf("\nEncoded Data Stream:\n"); printf("\nEncoded Data Stream:\n");
@ -991,24 +1003,36 @@ INTERNAL int micro_pdf417(struct zint_symbol *symbol, unsigned char chaine[], co
if ((symbol->option_2 == 1) && (mclength > 20)) { if ((symbol->option_2 == 1) && (mclength > 20)) {
/* the user specified 1 column but the data doesn't fit - go to automatic */ /* the user specified 1 column but the data doesn't fit - go to automatic */
symbol->option_2 = 0;
strcpy(symbol->errtxt, "469: Specified symbol size too small for data"); strcpy(symbol->errtxt, "469: Specified symbol size too small for data");
if (symbol->warn_level == WARN_FAIL_ALL) {
return ZINT_ERROR_INVALID_OPTION;
} else {
symbol->option_2 = 0;
codeerr = ZINT_WARN_INVALID_OPTION; codeerr = ZINT_WARN_INVALID_OPTION;
} }
}
if ((symbol->option_2 == 2) && (mclength > 37)) { if ((symbol->option_2 == 2) && (mclength > 37)) {
/* the user specified 2 columns but the data doesn't fit - go to automatic */ /* the user specified 2 columns but the data doesn't fit - go to automatic */
symbol->option_2 = 0;
strcpy(symbol->errtxt, "470: Specified symbol size too small for data"); strcpy(symbol->errtxt, "470: Specified symbol size too small for data");
if (symbol->warn_level == WARN_FAIL_ALL) {
return ZINT_ERROR_INVALID_OPTION;
} else {
symbol->option_2 = 0;
codeerr = ZINT_WARN_INVALID_OPTION; codeerr = ZINT_WARN_INVALID_OPTION;
} }
}
if ((symbol->option_2 == 3) && (mclength > 82)) { if ((symbol->option_2 == 3) && (mclength > 82)) {
/* the user specified 3 columns but the data doesn't fit - go to automatic */ /* the user specified 3 columns but the data doesn't fit - go to automatic */
symbol->option_2 = 0;
strcpy(symbol->errtxt, "471: Specified symbol size too small for data"); strcpy(symbol->errtxt, "471: Specified symbol size too small for data");
if (symbol->warn_level == WARN_FAIL_ALL) {
return ZINT_ERROR_INVALID_OPTION;
} else {
symbol->option_2 = 0;
codeerr = ZINT_WARN_INVALID_OPTION; codeerr = ZINT_WARN_INVALID_OPTION;
} }
}
if (symbol->option_2 == 1) { if (symbol->option_2 == 1) {
/* the user specified 1 column and the data does fit */ /* the user specified 1 column and the data does fit */

View file

@ -106,6 +106,7 @@ extern "C" {
float dot_size; float dot_size;
struct zint_vector *vector; struct zint_vector *vector;
int debug; int debug;
int warn_level;
}; };
#define ZINT_VERSION_MAJOR 2 #define ZINT_VERSION_MAJOR 2
@ -268,6 +269,7 @@ extern "C" {
// Warning and error conditions // Warning and error conditions
#define ZINT_WARN_INVALID_OPTION 2 #define ZINT_WARN_INVALID_OPTION 2
#define ZINT_WARN_USES_ECI 3 #define ZINT_WARN_USES_ECI 3
#define ZINT_WARN_NONCOMPLIANT 4
#define ZINT_ERROR_TOO_LONG 5 #define ZINT_ERROR_TOO_LONG 5
#define ZINT_ERROR_INVALID_DATA 6 #define ZINT_ERROR_INVALID_DATA 6
#define ZINT_ERROR_INVALID_CHECK 7 #define ZINT_ERROR_INVALID_CHECK 7
@ -292,6 +294,11 @@ extern "C" {
#define ZINT_DEBUG_PRINT 1 #define ZINT_DEBUG_PRINT 1
#define ZINT_DEBUG_TEST 2 #define ZINT_DEBUG_TEST 2
// Warning warn
#define WARN_DEFAULT 0
#define WARN_ZPL_COMPAT 1
#define WARN_FAIL_ALL 2
#if defined(__WIN32__) || defined(_WIN32) || defined(WIN32) || defined(_MSC_VER) #if defined(__WIN32__) || defined(_WIN32) || defined(WIN32) || defined(_MSC_VER)
#if defined (DLL_EXPORT) || defined(PIC) || defined(_USRDLL) #if defined (DLL_EXPORT) || defined(PIC) || defined(_USRDLL)
#define ZINT_EXTERN __declspec(dllexport) #define ZINT_EXTERN __declspec(dllexport)

View file

@ -125,6 +125,8 @@ static void usage(void) {
" -t, --types Display table of barcode types\n" " -t, --types Display table of barcode types\n"
" --vers=NUMBER Set symbol version (size, check digits, other options)\n" " --vers=NUMBER Set symbol version (size, check digits, other options)\n"
" -w, --whitesp=NUMBER Set width of whitespace in multiples of X-dimension\n" " -w, --whitesp=NUMBER Set width of whitespace in multiples of X-dimension\n"
" --werror Convert all warnings into errors\n"
" --wzpl ZPL compatibility mode (allows non-standard symbols)\n"
, ZINT_VERSION_MAJOR, ZINT_VERSION_MINOR, ZINT_VERSION_RELEASE); , ZINT_VERSION_MAJOR, ZINT_VERSION_MINOR, ZINT_VERSION_RELEASE);
} }
@ -885,6 +887,12 @@ int main(int argc, char **argv) {
if (!strcmp(long_options[option_index].name, "nobackground")) { if (!strcmp(long_options[option_index].name, "nobackground")) {
strcpy(my_symbol->bgcolour, "ffffff00"); strcpy(my_symbol->bgcolour, "ffffff00");
} }
if (!strcmp(long_options[option_index].name, "werror")) {
my_symbol->warn_level = WARN_FAIL_ALL;
}
if (!strcmp(long_options[option_index].name, "wzpl")) {
my_symbol->warn_level = WARN_ZPL_COMPAT;
}
break; break;
case 'h': case 'h':