From f9300cb37e56c8e722c9a5ae8fcacf5eb677f9e6 Mon Sep 17 00:00:00 2001 From: gitlost Date: Mon, 18 Jan 2021 20:10:52 +0000 Subject: [PATCH] gs1_verify: validate AIs from BWIPP gs1-format-spec.txt --- backend/code128.c | 4 +- backend/composite.c | 11 +- backend/gs1.c | 1593 +++++++++----- backend/gs1_lint.h | 841 ++++++++ backend/iso3166.h | 88 + backend/iso4217.h | 65 + backend/library.c | 2 +- backend/rss.c | 11 +- backend/tests/CMakeLists.txt | 2 + backend/tests/test_code128.c | 6 +- backend/tests/test_composite.c | 19 +- backend/tests/test_gs1.c | 1876 ++++++++++++----- backend/tests/test_iso3166.c | 776 +++++++ backend/tests/test_iso4217.c | 513 +++++ backend/tests/test_library.c | 2 +- backend/tests/test_raster.c | 14 +- backend/tests/test_rss.c | 287 ++- backend/tests/test_vector.c | 16 +- .../tests/tools/bwipp_dump-barcode.ps.diff | 233 +- backend/tests/tools/bwipp_dump.ps.tar.xz | Bin 117252 -> 122272 bytes backend/tools/gen_gs1_lint.php | 409 ++++ backend/tools/gen_iso3166_h.php | 225 ++ backend/tools/gen_iso4217_h.php | 145 ++ win32/libzint.vcxproj | 3 + win32/vs2008/libzint.vcproj | 12 + win32/vs2015/libzint.vcxproj | 3 + win32/vs2015/vsx/libzintMD.vcxproj | 3 + win32/vs2019/libzint.vcxproj | 3 + 28 files changed, 5887 insertions(+), 1275 deletions(-) create mode 100644 backend/gs1_lint.h create mode 100644 backend/iso3166.h create mode 100644 backend/iso4217.h create mode 100644 backend/tests/test_iso3166.c create mode 100644 backend/tests/test_iso4217.c create mode 100644 backend/tools/gen_gs1_lint.php create mode 100644 backend/tools/gen_iso3166_h.php create mode 100644 backend/tools/gen_iso4217_h.php diff --git a/backend/code128.c b/backend/code128.c index 33abbb5a..eeeb37d4 100644 --- a/backend/code128.c +++ b/backend/code128.c @@ -2,7 +2,7 @@ /* libzint - the open source barcode library - Copyright (C) 2008-2020 Robin Stuart + Copyright (C) 2008-2021 Robin Stuart Bugfixes thanks to Christian Sakowski and BogDan Vatra Redistribution and use in source and binary forms, with or without @@ -734,7 +734,7 @@ INTERNAL int ean_128(struct zint_symbol *symbol, unsigned char source[], int len } error_number = gs1_verify(symbol, source, length, reduced); - if (error_number != 0) { + if (error_number >= ZINT_ERROR) { return error_number; } reduced_length = (int) ustrlen(reduced); diff --git a/backend/composite.c b/backend/composite.c index 6e7a03e2..09240e6c 100644 --- a/backend/composite.c +++ b/backend/composite.c @@ -2,7 +2,7 @@ /* libzint - the open source barcode library - Copyright (C) 2008 - 2020 Robin Stuart + Copyright (C) 2008 - 2021 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -1257,16 +1257,15 @@ static int linear_dummy_run(unsigned char *source, const int length, char *errtx dummy->option_1 = 3; error_number = ean_128(dummy, source, length); linear_width = dummy->width; - if (error_number != 0) { + if (error_number >= ZINT_ERROR) { strcpy(errtxt, dummy->errtxt); } ZBarcode_Delete(dummy); - if (error_number == 0) { - return linear_width; - } else { + if (error_number >= ZINT_ERROR) { return 0; } + return linear_width; } INTERNAL int composite(struct zint_symbol *symbol, unsigned char source[], int length) { @@ -1456,7 +1455,7 @@ INTERNAL int composite(struct zint_symbol *symbol, unsigned char source[], int l break; } - if (error_number != 0) { + if (error_number >= ZINT_ERROR) { strcpy(symbol->errtxt, linear->errtxt); strcat(symbol->errtxt, " in linear component"); ZBarcode_Delete(linear); diff --git a/backend/gs1.c b/backend/gs1.c index 7f65d0f4..76c847f9 100644 --- a/backend/gs1.c +++ b/backend/gs1.c @@ -38,58 +38,1105 @@ #include "common.h" #include "gs1.h" -/* This code does some checks on the integrity of GS1 data. It is not intended - to be bulletproof, nor does it report very accurately what problem was found - or where, but should prevent some of the more common encoding errors */ +/* gs1_lint() validators and checkers */ -static void itostr(char ai_string[], int ai_value) { - int thou, hund, ten, unit; - char temp[2]; +/* Validate numeric */ +static int numeric(const unsigned char *data, int data_len, int offset, int min, int max, int *p_err_no, + int *p_err_posn, char err_msg[50]) { - strcpy(ai_string, "("); - thou = ai_value / 1000; - hund = (ai_value - (1000 * thou)) / 100; - ten = (ai_value - ((1000 * thou) + (100 * hund))) / 10; - unit = ai_value - ((1000 * thou) + (100 * hund) + (10 * ten)); + data_len -= offset; - temp[1] = '\0'; - if (ai_value >= 1000) { - temp[0] = itoc(thou); - strcat(ai_string, temp); + if (data_len < min) { + return 0; } - if (ai_value >= 100) { - temp[0] = itoc(hund); - strcat(ai_string, temp); + + if (data_len) { + const unsigned char *d = data + offset; + const unsigned char *de = d + (data_len > max ? max : data_len); + + for (; d < de; d++) { + if (*d < '0' || *d > '9') { + *p_err_no = 3; + *p_err_posn = d - data + 1; + sprintf(err_msg, "Non-numeric character '%c'", *d); + return 0; + } + } } - temp[0] = itoc(ten); - strcat(ai_string, temp); - temp[0] = itoc(unit); - strcat(ai_string, temp); - strcat(ai_string, ")"); + + return 1; } +/* Validate of character set 82 (GS1 General Spec Figure 7.11-1) */ +static int cset82(const unsigned char *data, int data_len, int offset, int min, int max, int *p_err_no, + int *p_err_posn, char err_msg[50]) { + + /* These 13 characters plus all <= ' ' = 13 + 33 = 46 + 82 = 128 */ + static const char not_in_set82[] = "#$@[\\]^`{|}~\177"; + + data_len -= offset; + + if (data_len < min) { + return 0; + } + + if (data_len) { + const unsigned char *d = data + offset; + const unsigned char *de = d + (data_len > max ? max : data_len); + + for (; d < de; d++) { + if (*d <= ' ' || strchr(not_in_set82, *d) != NULL) { + *p_err_no = 3; + *p_err_posn = d - data + 1; + sprintf(err_msg, "Invalid CSET 82 character '%c'", *d); + return 0; + } + } + } + + return 1; +} + +/* Validate of character set 39 (GS1 General Spec Figure 7.11-2) */ +static int cset39(const unsigned char *data, int data_len, int offset, int min, int max, int *p_err_no, + int *p_err_posn, char err_msg[50]) { + + data_len -= offset; + + if (data_len < min) { + return 0; + } + + if (data_len) { + const unsigned char *d = data + offset; + const unsigned char *de = d + (data_len > max ? max : data_len); + + for (; d < de; d++) { + /* 0-9, A-Z and "#", "-", "/" */ + if ((*d < '0' && *d != '#' && *d != '-' && *d != '/') || (*d > '9' && *d < 'A') || *d > 'Z') { + *p_err_no = 3; + *p_err_posn = d - data + 1; + sprintf(err_msg, "Invalid CSET 39 character '%c'", *d); + return 0; + } + } + } + + return 1; +} + +/* Check a check digit (GS1 General Spec 7.9.1) */ +static int csum(const unsigned char *data, int data_len, int offset, int min, int max, int *p_err_no, + int *p_err_posn, char err_msg[50], const int length_only) { + + data_len -= offset; + + if (data_len < min) { + return 0; + } + + if (!length_only && data_len) { + const unsigned char *d = data + offset; + const unsigned char *de = d + (data_len > max ? max : data_len) - 1; /* Note less last character */ + int checksum = 0; + int factor = (min & 1) ? 1 : 3; + + for (; d < de; d++) { + checksum += (*d - '0') * factor; + factor = factor == 3 ? 1 : 3; + } + checksum = 10 - checksum % 10; + if (checksum == 10) { + checksum = 0; + } + if (checksum != *d - '0') { + *p_err_no = 3; + *p_err_posn = d - data + 1; + sprintf(err_msg, "Bad checksum '%c', expected '%c'", *d, checksum + '0'); + return 0; + } + } + + return 1; +} + +/* Check for a GS1 Prefix (GS1 General Spec GS1 1.4.2) */ +static int key(const unsigned char *data, int data_len, int offset, int min, int max, int *p_err_no, + int *p_err_posn, char err_msg[50], const int length_only) { + (void)max; + + data_len -= offset; + + if (data_len < min) { + return 0; + } + if (data_len && data_len < 2) { /* Do this check separately for backward compatibility */ + *p_err_no = 4; + return 0; + } + + if (!length_only && data_len) { + data += offset; + + if (data[0] < '0' || data[0] > '9' || data[1] < '0' || data[1] > '9') { + *p_err_no = 3; + *p_err_posn = offset + (data[0] < '0' || data[0] > '9' ? 0 : 1) + 1; + sprintf(err_msg, "Non-numeric company prefix '%c'", data[0] < '0' || data[0] > '9' ? data[0] : data[1]); + return 0; + } + } + + return 1; +} + +/* Check for a date YYMMDD with zero day allowed */ +static int yymmd0(const unsigned char *data, int data_len, int offset, int min, int max, int *p_err_no, + int *p_err_posn, char err_msg[50], const int length_only) { + + static char days_in_month[] = { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; + + (void)max; + + data_len -= offset; + + if (data_len < min || (data_len && data_len < 6)) { + return 0; + } + + if (!length_only && data_len) { + int month, day; + + month = to_int(data + offset + 2, 2); + if (month == 0 || month > 12) { + *p_err_no = 3; + *p_err_posn = offset + 2 + 1; + sprintf(err_msg, "Invalid month '%.2s'", data + offset + 2); + return 0; + } + + day = to_int(data + offset + 4, 2); + if (day && day > days_in_month[month]) { + *p_err_no = 3; + *p_err_posn = offset + 4 + 1; + sprintf(err_msg, "Invalid day '%.2s'", data + offset + 4); + return 0; + } + if (month == 2 && day == 29) { /* Leap year check */ + int year = to_int(data + offset, 2); + if (year & 3) { /* Good until 2050 when 00 will mean 2100 (GS1 General Spec 7.12) */ + *p_err_no = 3; + *p_err_posn = offset + 4 + 1; + sprintf(err_msg, "Invalid day '%.2s'", data + offset + 4); + return 0; + } + } + } + + return 1; +} + +/* Check for a date YYMMDD. Zero day NOT allowed */ +static int yymmdd(const unsigned char *data, int data_len, int offset, int min, int max, int *p_err_no, + int *p_err_posn, char err_msg[50], const int length_only) { + + if (!yymmd0(data, data_len, offset, min, max, p_err_no, p_err_posn, err_msg, length_only)) { + return 0; + } + + data_len -= offset; + + if (!length_only && data_len) { + int day = to_int(data + offset + 4, 2); + if (day == 0) { + *p_err_no = 3; + *p_err_posn = offset + 4 + 1; + sprintf(err_msg, "Invalid day '%.2s'", data + offset + 4); + return 0; + } + } + + return 1; +} + +/* Check for a date and hours YYMMDDHH */ +static int yymmddhh(const unsigned char *data, int data_len, int offset, int min, int max, int *p_err_no, + int *p_err_posn, char err_msg[50], const int length_only) { + + if (data_len < min || (data_len && data_len < 8)) { + return 0; + } + + if (!yymmdd(data, data_len, offset, min, max, p_err_no, p_err_posn, err_msg, length_only)) { + return 0; + } + + data_len -= offset; + + if (!length_only && data_len) { + int hour = to_int(data + offset + 6, 2); + if (hour > 23) { + *p_err_no = 3; + *p_err_posn = offset + 6 + 1; + sprintf(err_msg, "Invalid hour of day '%.2s'", data + offset + 6); + return 0; + } + } + + return 1; +} + +/* Check for a time HHMM */ +static int hhmm(const unsigned char *data, int data_len, int offset, int min, int max, int *p_err_no, + int *p_err_posn, char err_msg[50], const int length_only) { + (void)max; + + data_len -= offset; + + if (data_len < min || (data_len && data_len < 4)) { + return 0; + } + + if (!length_only && data_len) { + int hour, mins; + + hour = to_int(data + offset, 2); + if (hour > 23) { + *p_err_no = 3; + *p_err_posn = offset + 1; + sprintf(err_msg, "Invalid hour of day '%.2s'", data + offset); + return 0; + } + mins = to_int(data + offset + 2, 2); + if (mins > 59) { + *p_err_no = 3; + *p_err_posn = offset + 2 + 1; + sprintf(err_msg, "Invalid minutes in the hour '%.2s'", data + offset + 2); + return 0; + } + } + + return 1; +} + +/* Check for a time MMSS with seconds optional */ +static int mmoptss(const unsigned char *data, int data_len, int offset, int min, int max, int *p_err_no, + int *p_err_posn, char err_msg[50], const int length_only) { + (void)max; + + data_len -= offset; + + if (data_len < min || (data_len && data_len < 2) + || (data_len > 2 && data_len < 4)) { + return 0; + } + + if (!length_only && data_len) { + int mins = to_int(data + offset, 2); + if (mins > 59) { + *p_err_no = 3; + *p_err_posn = offset + 1; + sprintf(err_msg, "Invalid minutes in the hour '%.2s'", data + offset); + return 0; + } + if (data_len > 2) { + int secs = to_int(data + offset + 2, 2); + if (secs > 59) { + *p_err_no = 3; + *p_err_posn = offset + 2 + 1; + sprintf(err_msg, "Invalid seconds in the minute '%.2s'", data + offset + 2); + return 0; + } + } + } + + return 1; +} + +/* Generated by "php backend/tools/gen_iso3166_h.php > backend/iso3166.h" */ +#include "iso3166.h" + +/* Check for an ISO 3166-1 numeric country code */ +static int iso3166(const unsigned char *data, int data_len, int offset, int min, int max, int *p_err_no, + int *p_err_posn, char err_msg[50], const int length_only) { + (void)max; + + data_len -= offset; + + if (data_len < min || (data_len && data_len < 3)) { + return 0; + } + + if (!length_only && data_len) { + if (!iso3166_numeric(to_int(data + offset, 3))) { + *p_err_no = 3; + *p_err_posn = offset + 1; + sprintf(err_msg, "Unknown country code '%.3s'", data + offset); + return 0; + } + } + + return 1; +} + +/* Check for a list of ISO 3166-1 numeric country codes */ +static int iso3166list(const unsigned char *data, int data_len, int offset, int min, int max, int *p_err_no, + int *p_err_posn, char err_msg[50], const int length_only) { + + int data_len_max; + + data_len -= offset; + data_len_max = data_len > max ? max : data_len; + + if (data_len < min || (data_len && data_len < 3)) { + return 0; + } + if (data_len && data_len_max % 3) { /* Do this check separately for backward compatibility */ + *p_err_no = 4; + return 0; + } + + if (!length_only && data_len) { + int i; + for (i = 0; i < data_len_max; i += 3) { + if (!iso3166(data, offset + data_len, offset + i, 3, 3, p_err_no, p_err_posn, err_msg, length_only)) { + return 0; + } + } + } + + return 1; +} + +/* Check for an ISO 3166-1 numeric country code allowing "999" */ +static int iso3166999(const unsigned char *data, int data_len, int offset, int min, int max, int *p_err_no, + int *p_err_posn, char err_msg[50], const int length_only) { + (void)max; + + data_len -= offset; + + if (data_len < min || (data_len && data_len < 3)) { + return 0; + } + + if (!length_only && data_len) { + int cc = to_int(data + offset, 3); + if (cc != 999 && !iso3166_numeric(cc)) { + *p_err_no = 3; + *p_err_posn = offset + 1; + sprintf(err_msg, "Unknown country code '%.3s'", data + offset); + return 0; + } + } + + return 1; +} + +/* Check for an ISO 3166-1 alpha2 country code */ +static int iso3166alpha2(const unsigned char *data, int data_len, int offset, int min, int max, int *p_err_no, + int *p_err_posn, char err_msg[50], const int length_only) { + (void)max; + + data_len -= offset; + + if (data_len < min || (data_len && data_len < 2)) { + return 0; + } + + if (!length_only && data_len) { + if (!iso3166_alpha2((const char *) (data + offset))) { + *p_err_no = 3; + *p_err_posn = offset + 1; + sprintf(err_msg, "Unknown country code '%.2s'", data + offset); + return 0; + } + } + + return 1; +} + +/* Generated by "php backend/tools/gen_iso4217_h.php > backend/iso4217.h" */ +#include "iso4217.h" + +/* Check for an ISO 4217 currency code */ +static int iso4217(const unsigned char *data, int data_len, int offset, int min, int max, int *p_err_no, + int *p_err_posn, char err_msg[50], const int length_only) { + (void)max; + + data_len -= offset; + + if (data_len < min || (data_len && data_len < 3)) { + return 0; + } + + if (!length_only && data_len) { + if (!iso4217_numeric(to_int(data + offset, 3))) { + *p_err_no = 3; + *p_err_posn = offset + 1; + sprintf(err_msg, "Unknown currency code '%.3s'", data + offset); + return 0; + } + } + + return 1; +} + +/* Check for percent encoded */ +static int pcenc(const unsigned char *data, int data_len, int offset, int min, int max, int *p_err_no, + int *p_err_posn, char err_msg[50], const int length_only) { + + static const char hex_chars[] = "0123456789ABCDEFabcdef"; + + data_len -= offset; + + if (data_len < min) { + return 0; + } + + if (!length_only && data_len) { + const unsigned char *d = data + offset; + const unsigned char *de = d + (data_len > max ? max : data_len); + + for (; d < de; d++) { + if (*d == '%') { + if (de - d < 3) { + *p_err_no = 3; + *p_err_posn = d - data + 1; + strcpy(err_msg, "Invalid % escape"); + return 0; + } + if (strchr(hex_chars, *(++d)) == NULL || strchr(hex_chars, *(++d)) == NULL) { + *p_err_no = 3; + *p_err_posn = d - data + 1; + strcpy(err_msg, "Invalid characters for percent encoding"); + return 0; + } + } + } + } + + return 1; +} + +/* Check for yes/no (1/0) indicator */ +static int yesno(const unsigned char *data, int data_len, int offset, int min, int max, int *p_err_no, + int *p_err_posn, char err_msg[50], const int length_only) { + (void)max; + + data_len -= offset; + + if (data_len < min) { + return 0; + } + + if (!length_only && data_len) { + if (data[offset] != '0' && data[offset] != '1') { + *p_err_no = 3; + *p_err_posn = offset + 1; + strcpy(err_msg, "Neither 0 nor 1 for yes or no"); + return 0; + } + } + + return 1; +} + +/* Check for importer index (GS1 General Spec 3.8.17) */ +static int importeridx(const unsigned char *data, int data_len, int offset, int min, int max, int *p_err_no, + int *p_err_posn, char err_msg[50], const int length_only) { + (void)max; + + data_len -= offset; + + if (data_len < min) { + return 0; + } + + if (!length_only && data_len) { + const unsigned char *d = data + offset; + + /* 0-9, A-Z, a-z and "-", "_" */ + if ((*d < '0' && *d != '-') || (*d > '9' && *d < 'A') || (*d > 'Z' && *d < 'a' && *d != '_') || *d > 'z') { + *p_err_no = 3; + *p_err_posn = offset + 1; + sprintf(err_msg, "Invalid importer index '%c'", *d); + return 0; + } + } + + return 1; +} + +/* Check non-zero */ +static int nonzero(const unsigned char *data, int data_len, int offset, int min, int max, int *p_err_no, + int *p_err_posn, char err_msg[50], const int length_only) { + + data_len -= offset; + + if (data_len < min) { + return 0; + } + + if (!length_only && data_len) { + int val = to_int(data + offset, data_len > max ? max : data_len); + + if (val == 0) { + *p_err_no = 3; + *p_err_posn = offset + 1; + strcpy(err_msg, "Zero not permitted"); + return 0; + } + } + + return 1; +} + +/* Check winding direction (0/1/9) (GS1 General Spec 3.9.1) */ +static int winding(const unsigned char *data, int data_len, int offset, int min, int max, int *p_err_no, + int *p_err_posn, char err_msg[50], const int length_only) { + (void)max; + + data_len -= offset; + + if (data_len < min) { + return 0; + } + + if (!length_only && data_len) { + if (data[offset] != '0' && data[offset] != '1' && data[offset] != '9') { + *p_err_no = 3; + *p_err_posn = offset + 1; + sprintf(err_msg, "Invalid winding direction '%c'", data[offset]); + return 0; + } + } + + return 1; +} + +/* Check zero */ +static int zero(const unsigned char *data, int data_len, int offset, int min, int max, int *p_err_no, + int *p_err_posn, char err_msg[50], const int length_only) { + (void)max; + + data_len -= offset; + + if (data_len < min) { + return 0; + } + + if (!length_only && data_len) { + if (data[offset] != '0') { + *p_err_no = 3; + *p_err_posn = offset + 1; + strcpy(err_msg, "Zero is required"); + return 0; + } + } + + return 1; +} + +/* Check piece of a trade item (GS1 General Spec 3.9.6 and 3.9.17) */ +static int pieceoftotal(const unsigned char *data, int data_len, int offset, int min, int max, int *p_err_no, + int *p_err_posn, char err_msg[50], const int length_only) { + (void)max; + + data_len -= offset; + + if (data_len < min || (data_len && data_len < 4)) { + return 0; + } + + if (!length_only && data_len) { + int pieces, total; + + pieces = to_int(data + offset, 2); + if (pieces == 0) { + *p_err_no = 3; + *p_err_posn = offset + 1; + strcpy(err_msg, "Piece number cannot be zero"); + return 0; + } + total = to_int(data + offset + 2, 2); + if (total == 0) { + *p_err_no = 3; + *p_err_posn = offset + 1; + strcpy(err_msg, "Total number cannot be zero"); + return 0; + } + if (pieces > total) { + *p_err_no = 3; + *p_err_posn = offset + 1; + sprintf(err_msg, "Piece number '%.2s' exceeds total '%.2s'", data + offset, data + offset + 2); + return 0; + } + } + + return 1; +} + +/* Check IBAN (ISO 13616) */ +static int iban(const unsigned char *data, int data_len, int offset, int min, int max, int *p_err_no, + int *p_err_posn, char err_msg[50], const int length_only) { + + data_len -= offset; + + if (data_len < min) { + return 0; + } + if (data_len && data_len < 5) { /* Do this check separately for backward compatibility */ + *p_err_no = 4; + return 0; + } + + if (!length_only && data_len) { + const unsigned char *d = data + offset; + const unsigned char *de = d + (data_len > max ? max : data_len); + int checksum = 0; + int given_checksum; + + if (d[0] < 'A' || d[0] > 'Z' || d[1] < 'A' || d[1] > 'Z') { /* 1st 2 chars alphabetic country code */ + *p_err_no = 3; + *p_err_posn = d - data + 1; + sprintf(err_msg, "Non-alphabetic IBAN country code '%.2s'", d); + return 0; + } + if (!iso3166_alpha2((const char *) d)) { + *p_err_no = 3; + *p_err_posn = d - data + 1; + sprintf(err_msg, "Invalid IBAN country code '%.2s'", d); + return 0; + } + d += 2; + if (d[0] < '0' || d[0] > '9' || d[1] < '0' || d[1] > '9') { /* 2nd 2 chars numeric checksum */ + *p_err_no = 3; + *p_err_posn = d - data + 1; + sprintf(err_msg, "Non-numeric IBAN checksum '%.2s'", d); + return 0; + } + given_checksum = to_int(d, 2); + d += 2; + for (; d < de; d++) { + /* 0-9, A-Z */ + if (*d < '0' || (*d > '9' && *d < 'A') || *d > 'Z') { + *p_err_no = 3; + *p_err_posn = d - data + 1; + sprintf(err_msg, "Invalid IBAN character '%c'", *d); + return 0; + } + if (*d >= 'A') { + checksum = checksum * 100 + *d - 'A' + 10; + } else { + checksum = checksum * 10 + *d - '0'; + } + checksum %= 97; + } + + /* Add in country code */ + checksum = (((checksum * 100) % 97) + (data[offset] - 'A' + 10)) * 100 + data[offset + 1] - 'A' + 10; + checksum %= 97; + + checksum *= 100; /* Allow for checksum "00" */ + checksum %= 97; + + checksum = 98 - checksum; + + if (checksum != given_checksum) { + *p_err_no = 3; + *p_err_posn = offset + 2 + 1; + sprintf(err_msg, "Bad IBAN checksum '%.2s', expected '%02d'", data + offset + 2, checksum); + return 0; + } + } + + return 1; +} + +/* Check CPID does not begin with zero */ +static int nozeroprefix(const unsigned char *data, int data_len, int offset, int min, int max, int *p_err_no, + int *p_err_posn, char err_msg[50], const int length_only) { + (void)max; + + data_len -= offset; + + if (data_len < min) { + return 0; + } + + if (!length_only && data_len) { + /* GS1 General Specifications 3.9.11 "The C/P serial number SHALL NOT begin with a "0" digit, unless the + entire serial number consists of the single digit '0'." */ + if (data[0] == '0' && data_len != 1) { + *p_err_no = 3; + *p_err_posn = offset + 1; + strcpy(err_msg, "Zero prefix is not permitted"); + return 0; + } + } + + return 1; +} + +/* Helper to parse coupon Variable Length Indicator (VLI) and associated field. If `vli_nine` set + * then a VLI of '9' means no field present */ +static const unsigned char *coupon_vli(const unsigned char *data, const int data_len, const unsigned char *d, + const char *name, const int vli_offset, const int vli_min, const int vli_max, const int vli_nine, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + const unsigned char *de; + int vli; + + if (d - data + 1 > data_len) { + *p_err_no = 3; + *p_err_posn = d - data + 1; + sprintf(err_msg, "%s VLI missing", name); + return NULL; + } + vli = to_int(d, 1); + if ((vli < vli_min || vli > vli_max) && (vli != 9 || !vli_nine)) { + *p_err_no = 3; + *p_err_posn = d - data + 1; + sprintf(err_msg, vli < 0 ? "Non-numeric %s VLI '%c'" : "Invalid %s VLI '%c'", name, *d); + return NULL; + } + d++; + if (vli != 9 || !vli_nine) { + if (d - data + vli + vli_offset > data_len) { + *p_err_no = 3; + *p_err_posn = d - data + 1; + sprintf(err_msg, "%s incomplete", name); + return NULL; + } + de = d + vli + vli_offset; + for (; d < de; d++) { + if (*d < '0' || *d > '9') { + *p_err_no = 3; + *p_err_posn = d - data + 1; + sprintf(err_msg, "Non-numeric %s '%c'", name, *d); + return NULL; + } + } + } + + return d; +} + +/* Helper to parse coupon value field (numeric) */ +static const unsigned char *coupon_val(const unsigned char *data, const int data_len, const unsigned char *d, + const char *name, const int val_len, int *p_val, int *p_err_no, int *p_err_posn, char err_msg[50]) { + int val; + + if (d - data + val_len > data_len) { + *p_err_no = 3; + *p_err_posn = d - data + 1; + sprintf(err_msg, "%s incomplete", name); + return NULL; + } + val = to_int(d, val_len); + if (val < 0) { + *p_err_no = 3; + *p_err_posn = d - data + 1; + sprintf(err_msg, "Non-numeric %s", name); + return NULL; + } + d += val_len; + + if (p_val) { + *p_val = val; + } + return d; +} + +/* Check North American Coupon Code */ +/* Note all fields including optional must be numeric so type could be N..70 */ +static int couponcode(const unsigned char *data, int data_len, int offset, int min, int max, int *p_err_no, + int *p_err_posn, char err_msg[50], const int length_only) { + + /* Minimum possible required fields length = 21 + * (from "North American Coupon Application Guideline Using GS1 DataBar Expanded Symbols R2.0 (Feb 13 2015)") + * VLI - Variable Length Indicator; GCP - GS1 Company Prefix; OC - Offer Code; SV - Save Value; + * PPR - Primary Purchase Requirement; PPFC - Primary Purchase Family Code */ + const int min_req_len = 1 /*GCP VLI*/ + 6 /*GCP*/ + 6 /*OC*/ + 1 /*SV VLI*/ + 1 /*SV*/ + + 1 /*PPR VLI*/ + 1 /*PPR*/ + 1 /*PPR Code*/ + 3 /*PPFC*/; + + (void)max; + + data_len -= offset; + + if (data_len < min) { + return 0; + } + if (data_len && data_len < min_req_len) { /* Do separately for backward compatibility */ + *p_err_no = 4; + return 0; + } + + if (!length_only && data_len) { + const unsigned char *d = data + offset; + int val; + + data_len += offset; + + /* Required fields */ + d = coupon_vli(data, data_len, d, "Primary GS1 Co. Prefix", 6, 0, 6, 0, p_err_no, p_err_posn, err_msg); + if (d == NULL) { + return 0; + } + d = coupon_val(data, data_len, d, "Offer Code", 6, NULL, p_err_no, p_err_posn, err_msg); + if (d == NULL) { + return 0; + } + d = coupon_vli(data, data_len, d, "Save Value", 0, 1, 5, 0, p_err_no, p_err_posn, err_msg); + if (d == NULL) { + return 0; + } + d = coupon_vli(data, data_len, d, "Primary Purch. Req.", 0, 1, 5, 0, p_err_no, p_err_posn, err_msg); + if (d == NULL) { + return 0; + } + d = coupon_val(data, data_len, d, "Primary Purch. Req. Code", 1, &val, p_err_no, p_err_posn, err_msg); + if (d == NULL) { + return 0; + } + if (val > 5 && val < 9) { + *p_err_no = 3; + *p_err_posn = d - 1 - data + 1; + sprintf(err_msg, "Invalid Primary Purch. Req. Code '%c'", *(d - 1)); + return 0; + } + d = coupon_val(data, data_len, d, "Primary Purch. Family Code", 3, NULL, p_err_no, p_err_posn, err_msg); + if (d == NULL) { + return 0; + } + + /* Optional fields */ + while (d - data < data_len) { + int data_field = to_int(d, 1); + d++; + + if (data_field == 1) { + + d = coupon_val(data, data_len, d, "Add. Purch. Rules Code", 1, &val, p_err_no, p_err_posn, err_msg); + if (d == NULL) { + return 0; + } + if (val > 3) { + *p_err_no = 3; + *p_err_posn = d - 1 - data + 1; + sprintf(err_msg, "Invalid Add. Purch. Rules Code '%c'", *(d - 1)); + return 0; + } + d = coupon_vli(data, data_len, d, "2nd Purch. Req.", 0, 1, 5, 0, p_err_no, p_err_posn, err_msg); + if (d == NULL) { + return 0; + } + d = coupon_val(data, data_len, d, "2nd Purch. Req. Code", 1, &val, p_err_no, p_err_posn, err_msg); + if (d == NULL) { + return 0; + } + if (val > 4 && val < 9) { + *p_err_no = 3; + *p_err_posn = d - 1 - data + 1; + sprintf(err_msg, "Invalid 2nd Purch. Req. Code '%c'", *(d - 1)); + return 0; + } + d = coupon_val(data, data_len, d, "2nd Purch. Family Code", 3, NULL, p_err_no, p_err_posn, err_msg); + if (d == NULL) { + return 0; + } + d = coupon_vli(data, data_len, d, "2nd Purch. GS1 Co. Prefix", 6, 0, 6, 1, p_err_no, p_err_posn, err_msg); + if (d == NULL) { + return 0; + } + + } else if (data_field == 2) { + + d = coupon_vli(data, data_len, d, "3rd Purch. Req.", 0, 1, 5, 0, p_err_no, p_err_posn, err_msg); + if (d == NULL) { + return 0; + } + d = coupon_val(data, data_len, d, "3rd Purch. Req. Code", 1, &val, p_err_no, p_err_posn, err_msg); + if (d == NULL) { + return 0; + } + if (val > 4 && val < 9) { + *p_err_no = 3; + *p_err_posn = d - 1 - data + 1; + sprintf(err_msg, "Invalid 3rd Purch. Req. Code '%c'", *(d - 1)); + return 0; + } + d = coupon_val(data, data_len, d, "3rd Purch. Family Code", 3, NULL, p_err_no, p_err_posn, err_msg); + if (d == NULL) { + return 0; + } + d = coupon_vli(data, data_len, d, "3rd Purch. GS1 Co. Prefix", 6, 0, 6, 1, p_err_no, p_err_posn, err_msg); + if (d == NULL) { + return 0; + } + + } else if (data_field == 3) { + + d = coupon_val(data, data_len, d, "Expiration Date", 6, NULL, p_err_no, p_err_posn, err_msg); + if (d == NULL) { + return 0; + } + if (!yymmd0(data, data_len, d - 6 - data, 6, 6, p_err_no, p_err_posn, err_msg, 0)) { + return 0; + } + + } else if (data_field == 4) { + + d = coupon_val(data, data_len, d, "Start Date", 6, NULL, p_err_no, p_err_posn, err_msg); + if (d == NULL) { + return 0; + } + if (!yymmd0(data, data_len, d - 6 - data, 6, 6, p_err_no, p_err_posn, err_msg, 0)) { + return 0; + } + + } else if (data_field == 5) { + + d = coupon_vli(data, data_len, d, "Serial Number", 6, 0, 9, 0, p_err_no, p_err_posn, err_msg); + if (d == NULL) { + return 0; + } + + } else if (data_field == 6) { + + d = coupon_vli(data, data_len, d, "Retailer ID", 6, 1, 7, 0, p_err_no, p_err_posn, err_msg); + if (d == NULL) { + return 0; + } + + } else if (data_field == 9) { + + d = coupon_val(data, data_len, d, "Save Value Code", 1, &val, p_err_no, p_err_posn, err_msg); + if (d == NULL) { + return 0; + } + if ((val > 2 && val < 5) || val > 6) { + *p_err_no = 3; + *p_err_posn = d - 1 - data + 1; + sprintf(err_msg, "Invalid Save Value Code '%c'", *(d - 1)); + return 0; + } + d = coupon_val(data, data_len, d, "Save Value Applies To", 1, &val, p_err_no, p_err_posn, err_msg); + if (d == NULL) { + return 0; + } + if (val > 2) { + *p_err_no = 3; + *p_err_posn = d - 1 - data + 1; + sprintf(err_msg, "Invalid Save Value Applies To '%c'", *(d - 1)); + return 0; + } + d = coupon_val(data, data_len, d, "Store Coupon Flag", 1, NULL, p_err_no, p_err_posn, err_msg); + if (d == NULL) { + return 0; + } + d = coupon_val(data, data_len, d, "Don't Multiply Flag", 1, &val, p_err_no, p_err_posn, err_msg); + if (d == NULL) { + return 0; + } + if (val > 1) { + *p_err_no = 3; + *p_err_posn = d - 1 - data + 1; + sprintf(err_msg, "Invalid Don't Multiply Flag '%c'", *(d - 1)); + return 0; + } + + } else { + + *p_err_no = 3; + *p_err_posn = d - 1 - data + 1; + sprintf(err_msg, data_field < 0 ? "Non-numeric Data Field '%c'" : "Invalid Data Field '%c'", *(d - 1)); + return 0; + } + } + } + + return 1; +} + +/* Check North American Positive Offer File */ +/* Note max is currently set at 36 numeric digits with remaining 34 characters reserved */ +static int couponposoffer(const unsigned char *data, int data_len, int offset, int min, int max, int *p_err_no, + int *p_err_posn, char err_msg[50], const int length_only) { + + /* Minimum possible length = 21 + * (from "GS1 AI (8112) Coupon Data Specifications Release 1.0 (March 2020)") + * CFMT - Coupon Format; CFID - Coupon Funder ID; VLI - Variable Length Indicator; + * OC - Offer Code; SN - Serial Number */ + const int min_len = 1 /*CFMT*/ + 1 /*CFID VLI*/ + 6 /*CFID*/ + 6 /*OC*/ + 1 /*SN VLI*/ + 6 /*SN*/; + const int max_len = 36; + + (void)max; + + data_len -= offset; + + if (data_len < min) { + return 0; + } + if (data_len && (data_len < min_len || data_len > max_len)) { /* Do separately for backward compatibility */ + *p_err_no = 4; + return 0; + } + + if (!length_only && data_len) { + const unsigned char *d = data + offset; + int val; + + d = coupon_val(data, data_len, d, "Coupon Format", 1, &val, p_err_no, p_err_posn, err_msg); + if (d == NULL) { + return 0; + } + if (val != 0 && val != 1) { + *p_err_no = 3; + *p_err_posn = d - 1 - data + 1; + strcpy(err_msg, "Coupon Format must be 0 or 1"); + return 0; + } + d = coupon_vli(data, data_len, d, "Coupon Funder ID", 6, 0, 6, 0, p_err_no, p_err_posn, err_msg); + if (d == NULL) { + return 0; + } + d = coupon_val(data, data_len, d, "Offer Code", 6, NULL, p_err_no, p_err_posn, err_msg); + if (d == NULL) { + return 0; + } + d = coupon_vli(data, data_len, d, "Serial Number", 6, 0, 9, 0, p_err_no, p_err_posn, err_msg); + if (d == NULL) { + return 0; + } + if (d - data != data_len) { + *p_err_no = 3; + *p_err_posn = d - data + 1; + strcpy(err_msg, "Reserved trailing characters"); + return 0; + } + } + + return 1; +} + +/* Generated by "php backend/tools/gen_gs1_linter.php > backend/gs1_lint.h" */ +#include "gs1_lint.h" + +/* Verify a GS1 input string */ INTERNAL int gs1_verify(struct zint_symbol *symbol, const unsigned char source[], const int src_len, unsigned char reduced[]) { int i, j, last_ai, ai_latch; - char ai_string[7]; /* 6 char max "(NNNN)" */ + char ai_string[5]; /* 4 char max "NNNN" */ int bracket_level, max_bracket_level, ai_length, max_ai_length, min_ai_length; int ai_count; - int error_latch; int error_value = 0; -#ifdef _MSC_VER - int *ai_value; - int *ai_location; - int *data_location; - int *data_length; -#endif int ai_max = chr_cnt(source, src_len, '[') + 1; /* Plus 1 so non-zero */ #ifndef _MSC_VER int ai_value[ai_max], ai_location[ai_max], data_location[ai_max], data_length[ai_max]; #else - ai_value = (int*) _alloca(ai_max * sizeof(int)); - ai_location = (int*) _alloca(ai_max * sizeof(int)); - data_location = (int*) _alloca(ai_max * sizeof(int)); - data_length = (int*) _alloca(ai_max * sizeof(int)); + int *ai_value = (int *) _alloca(ai_max * sizeof(int)); + int *ai_location = (int *) _alloca(ai_max * sizeof(int)); + int *data_location = (int *) _alloca(ai_max * sizeof(int)); + int *data_length = (int *) _alloca(ai_max * sizeof(int)); #endif /* Detect extended ASCII characters */ @@ -204,474 +1251,42 @@ INTERNAL int gs1_verify(struct zint_symbol *symbol, const unsigned char source[] data_location[i] = ai_location[i] + 3; if (ai_value[i] >= 100) { data_location[i]++; - } - if (ai_value[i] >= 1000) { - data_location[i]++; + if (ai_value[i] >= 1000) { + data_location[i]++; + } } data_length[i] = 0; - do { + while ((data_location[i] + data_length[i] < src_len) + && (source[data_location[i] + data_length[i]] != '[')) { data_length[i]++; - } while ((source[data_location[i] + data_length[i] - 1] != '[') - && (data_location[i] + data_length[i] <= src_len)); - data_length[i]--; - } - - for (i = 0; i < ai_count; i++) { + } if (data_length[i] == 0) { /* No data for given AI */ strcpy(symbol->errtxt, "258: Empty data field in input data"); return ZINT_ERROR_INVALID_DATA; } } - + strcpy(ai_string, ""); - + // Check for valid AI values and data lengths according to GS1 General - // Specification Release 19, January 2019 + // Specifications Release 20.0, January 2020 for (i = 0; i < ai_count; i++) { - - error_latch = 2; - switch (ai_value[i]) { - // Length 2 Fixed - case 20: // VARIANT - if (data_length[i] != 2) { - error_latch = 1; - } else { - error_latch = 0; - } - break; - - // Length 3 Fixed - case 422: // ORIGIN - case 424: // COUNTRY PROCESS - case 426: // COUNTRY FULL PROCESS - if (data_length[i] != 3) { - error_latch = 1; - } else { - error_latch = 0; - } - break; - - // Length 4 Fixed - case 7040: // UIC+EXT - case 8111: // POINTS - if (data_length[i] != 4) { - error_latch = 1; - } else { - error_latch = 0; - } - break; - - // Length 6 Fixed - case 11: // PROD DATE - case 12: // DUE DATE - case 13: // PACK DATE - case 15: // BEST BY - case 16: // SELL BY - case 17: // USE BY - case 7006: // FIRST FREEZE DATE - case 8005: // PRICE PER UNIT - if (data_length[i] != 6) { - error_latch = 1; - } else { - error_latch = 0; - } - break; - - // Length 10 Fixed - case 7003: // EXPIRY TIME - if (data_length[i] != 10) { - error_latch = 1; - } else { - error_latch = 0; - } - break; - - // Length 13 Fixed - case 410: // SHIP TO LOC - case 411: // BILL TO - case 412: // PURCHASE FROM - case 413: // SHIP FOR LOC - case 414: // LOC NO - case 415: // PAY TO - case 416: // PROD/SERV LOC - case 417: // PARTY GLN - case 7001: // NSN - if (data_length[i] != 13) { - error_latch = 1; - } else { - error_latch = 0; - } - break; - - // Length 14 Fixed - case 1: // GTIN - case 2: // CONTENT - case 8001: // DIMENSIONS - if (data_length[i] != 14) { - error_latch = 1; - } else { - error_latch = 0; - } - break; - - // Length 17 Fixed - case 402: // GSIN - if (data_length[i] != 17) { - error_latch = 1; - } else { - error_latch = 0; - } - break; - - // Length 18 Fixed - case 0: // SSCC - case 8006: // ITIP - case 8017: // GSRN PROVIDER - case 8018: // GSRN RECIPIENT - case 8026: // ITIP CONTENT - if (data_length[i] != 18) { - error_latch = 1; - } else { - error_latch = 0; - } - break; - - // Length 2 Max - case 7010: // PROD METHOD - if (data_length[i] > 2) { - error_latch = 1; - } else { - error_latch = 0; - } - break; - - // Length 3 Max - case 427: // ORIGIN SUBDIVISION - case 7008: // AQUATIC SPECIES - if (data_length[i] > 3) { - error_latch = 1; - } else { - error_latch = 0; - } - break; - - // Length 4 Max - case 7004: // ACTIVE POTENCY - if (data_length[i] > 4) { - error_latch = 1; - } else { - error_latch = 0; - } - break; - - // Length 6 Max - case 242: // MTO VARIANT - if (data_length[i] > 6) { - error_latch = 1; - } else { - error_latch = 0; - } - break; - - // Length 8 Max - case 30: // VAR COUNT - case 37: // COUNT - if (data_length[i] > 8) { - error_latch = 1; - } else { - error_latch = 0; - } - break; - - // Length 10 Max - case 7009: // FISHING GEAR TYPE - case 8019: // SRIN - if (data_length[i] > 10) { - error_latch = 1; - } else { - error_latch = 0; - } - break; - - // Length 12 Max - case 7005: // CATCH AREA - case 8011: // CPID SERIAL - if (data_length[i] > 12) { - error_latch = 1; - } else { - error_latch = 0; - } - break; - - // Length 20 Max - case 10: // BATCH/LOT - case 21: // SERIAL - case 22: // CPV - case 243: // PCN - case 254: // GLN EXTENSION COMPONENT - case 420: // SHIP TO POST - case 7020: // REFURB LOT - case 7021: // FUNC STAT - case 7022: // REV STAT - case 710: // NHRN PZN - case 711: // NHRN CIP - case 712: // NHRN CN - case 713: // NHRN DRN - case 714: // NHRN AIM - case 7240: // PROTOCOL - case 8002: // CMT NO - case 8012: // VERSION - if (data_length[i] > 20) { - error_latch = 1; - } else { - error_latch = 0; - } - break; - - // Length 25 Max - case 8020: // REF NO - if (data_length[i] > 25) { - error_latch = 1; - } else { - error_latch = 0; - } - break; - - // Length 28 Max - case 235: // TPX - if (data_length[i] > 28) { - error_latch = 1; - } else { - error_latch = 0; - } - break; - - // Length 30 Max - case 240: // ADDITIONAL ID - case 241: // CUST PART NO - case 250: // SECONDARY SERIAL - case 251: // REF TO SOURCE - case 400: // ORDER NUMBER - case 401: // GINC - case 403: // ROUTE - case 7002: // MEAT CUT - case 7023: // GIAI ASSEMBLY - case 8004: // GIAI - case 8010: // CPID - case 8013: // BUDI-DI - case 90: // INTERNAL - if (data_length[i] > 30) { - error_latch = 1; - } else { - error_latch = 0; - } - break; - - // Length 34 Max - case 8007: // IBAN - if (data_length[i] > 34) { - error_latch = 1; - } else { - error_latch = 0; - } - break; - - // Length 50 Max - case 8009: // OPTSEN - if (data_length[i] > 50) { - error_latch = 1; - } else { - error_latch = 0; - } - break; - - // Length 70 Max - case 8110: // Coupon code - case 8112: // Paperless coupon code - case 8200: // PRODUCT URL - if (data_length[i] > 70) { - error_latch = 1; - } else { - error_latch = 0; - } - break; - - } - - if (ai_value[i] == 253) { // GDTI - if ((data_length[i] < 13) || (data_length[i] > 30)) { - error_latch = 1; + int err_no, err_posn; + char err_msg[50]; + if (!gs1_lint(ai_value[i], source + data_location[i], data_length[i], &err_no, &err_posn, err_msg)) { + if (err_no == 1) { + sprintf(symbol->errtxt, "260: Invalid AI (%02d)", ai_value[i]); + } else if (err_no == 2 || err_no == 4) { /* 4 is backward-incompatible bad length */ + sprintf(symbol->errtxt, "259: Invalid data length for AI (%02d)", ai_value[i]); } else { - error_latch = 0; + sprintf(symbol->errtxt, "261: AI (%02d) position %d: %s", ai_value[i], err_posn, err_msg); } - } - - if (ai_value[i] == 255) { // GCN - if ((data_length[i] < 13) || (data_length[i] > 25)) { - error_latch = 1; - } else { - error_latch = 0; - } - } - - if ((ai_value[i] >= 3100) && (ai_value[i] <= 3169)) { - if (data_length[i] != 6) { - error_latch = 1; - } else { - error_latch = 0; - } - } - - if ((ai_value[i] >= 3200) && (ai_value[i] <= 3379)) { - if (data_length[i] != 6) { - error_latch = 1; - } else { - error_latch = 0; - } - } - - if ((ai_value[i] >= 3400) && (ai_value[i] <= 3579)) { - if (data_length[i] != 6) { - error_latch = 1; - } else { - error_latch = 0; - } - } - - if ((ai_value[i] >= 3600) && (ai_value[i] <= 3699)) { - if (data_length[i] != 6) { - error_latch = 1; - } else { - error_latch = 0; - } - } - - if ((ai_value[i] >= 3900) && (ai_value[i] <= 3909)) { // AMOUNT - if (data_length[i] > 15) { - error_latch = 1; - } else { - error_latch = 0; - } - } - - if ((ai_value[i] >= 3910) && (ai_value[i] <= 3919)) { // AMOUNT - if ((data_length[i] < 4) || (data_length[i] > 18)) { - error_latch = 1; - } else { - error_latch = 0; - } - } - - if ((ai_value[i] >= 3920) && (ai_value[i] <= 3929)) { // PRICE - if (data_length[i] > 15) { - error_latch = 1; - } else { - error_latch = 0; - } - } - - if ((ai_value[i] >= 3930) && (ai_value[i] <= 3939)) { // PRICE - if ((data_length[i] < 4) || (data_length[i] > 18)) { - error_latch = 1; - } else { - error_latch = 0; - } - } - - if ((ai_value[i] >= 3940) && (ai_value[i] <= 3949)) { // PRCNT OFF - if (data_length[i] != 4) { - error_latch = 1; - } else { - error_latch = 0; - } - } - - if (ai_value[i] == 421) { // SHIP TO POST - if ((data_length[i] < 4) || (data_length[i] > 12)) { - error_latch = 1; - } else { - error_latch = 0; - } - } - - if ((ai_value[i] == 423) || (ai_value[i] == 425)) { - // COUNTRY INITIAL PROCESS || COUNTRY DISASSEMBLY - if ((data_length[i] < 4) || (data_length[i] > 15)) { - error_latch = 1; - } else { - error_latch = 0; - } - } - - if (ai_value[i] == 7007) { // HARVEST DATE - if ((data_length[i] != 6) && (data_length[i] != 12)) { - error_latch = 1; - } else { - error_latch = 0; - } - } - - if ((ai_value[i] >= 7030) && (ai_value[i] <= 7039)) { // PROCESSOR # - if ((data_length[i] < 4) || (data_length[i] > 30)) { - error_latch = 1; - } else { - error_latch = 0; - } - } - - if ((ai_value[i] >= 7230) && (ai_value[i] <= 7239)) { // CERT # - if ((data_length[i] < 3) || (data_length[i] > 30)) { - error_latch = 1; - } else { - error_latch = 0; - } - } - - if (ai_value[i] == 8003) { // GRAI - if ((data_length[i] < 15) || (data_length[i] > 30)) { - error_latch = 1; - } else { - error_latch = 0; - } - } - - if (ai_value[i] == 8008) { // PROD TIME - if ((data_length[i] != 8) && (data_length[i] != 10) && (data_length[i] != 12)) { - error_latch = 1; - } else { - error_latch = 0; - } - } - - if ((ai_value[i] >= 91) && (ai_value[i] <= 99)) { // INTERNAL - if (data_length[i] > 90) { - error_latch = 1; - } else { - error_latch = 0; - } - } - - if (error_latch == 1) { - itostr(ai_string, ai_value[i]); - strcpy(symbol->errtxt, "259: Invalid data length for AI "); - strcat(symbol->errtxt, ai_string); - if (symbol->warn_level != WARN_ZPL_COMPAT) { + /* For backward compatibility only error on unknown AI or bad length */ + if ((err_no == 1 || err_no == 2) && symbol->warn_level != WARN_ZPL_COMPAT) { return ZINT_ERROR_INVALID_DATA; - } else { - error_value = ZINT_WARN_NONCOMPLIANT; - } - } - - if (error_latch == 2) { - itostr(ai_string, ai_value[i]); - strcpy(symbol->errtxt, "260: Invalid AI value "); - strcat(symbol->errtxt, ai_string); - if (symbol->warn_level != WARN_ZPL_COMPAT) { - return ZINT_ERROR_INVALID_DATA; - } else { - error_value = ZINT_WARN_NONCOMPLIANT; } + error_value = ZINT_WARN_NONCOMPLIANT; } } @@ -692,8 +1307,8 @@ INTERNAL int gs1_verify(struct zint_symbol *symbol, const unsigned char source[] ai_string[2] = '\0'; last_ai = atoi(ai_string); ai_latch = 0; - /* The following values from "GS-1 General Specification Release 20.0" - figure 7.8.4-2 "Element Strings with Predefined Length Using Application Identifiers" */ + /* The following values from "GS1 General Specifications Release 20.0" + Figure 7.8.4-2 "Element strings with predefined length using GS1 Application Identifiers" */ if ( ((last_ai >= 0) && (last_ai <= 4)) || ((last_ai >= 11) && (last_ai <= 20)) diff --git a/backend/gs1_lint.h b/backend/gs1_lint.h new file mode 100644 index 00000000..a07e449c --- /dev/null +++ b/backend/gs1_lint.h @@ -0,0 +1,841 @@ +/* + * GS1 AI checker generated by "backend/tools/gen_gs1_lint.php" from + * https://raw.githubusercontent.com/bwipp/postscriptbarcode/master/contrib/development/gs1-format-spec.txt + */ +/* + libzint - the open source barcode library + Copyright (C) 2021 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#ifndef GS1_LINT_H +#define GS1_LINT_H + +/* N18,csum,key */ +static int n18_csum_key(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len == 18 + && csum(data, data_len, 0, 18, 18, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && key(data, data_len, 0, 18, 18, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && numeric(data, data_len, 0, 18, 18, p_err_no, p_err_posn, err_msg) + && csum(data, data_len, 0, 18, 18, p_err_no, p_err_posn, err_msg, 0) + && key(data, data_len, 0, 18, 18, p_err_no, p_err_posn, err_msg, 0); +} + +/* N14,csum,key */ +static int n14_csum_key(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len == 14 + && csum(data, data_len, 0, 14, 14, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && key(data, data_len, 0, 14, 14, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && numeric(data, data_len, 0, 14, 14, p_err_no, p_err_posn, err_msg) + && csum(data, data_len, 0, 14, 14, p_err_no, p_err_posn, err_msg, 0) + && key(data, data_len, 0, 14, 14, p_err_no, p_err_posn, err_msg, 0); +} + +/* X..20 */ +static int x__20(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len >= 1 && data_len <= 20 + && cset82(data, data_len, 0, 1, 20, p_err_no, p_err_posn, err_msg); +} + +/* N6,yymmd0 */ +static int n6_yymmd0(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len == 6 + && yymmd0(data, data_len, 0, 6, 6, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && numeric(data, data_len, 0, 6, 6, p_err_no, p_err_posn, err_msg) + && yymmd0(data, data_len, 0, 6, 6, p_err_no, p_err_posn, err_msg, 0); +} + +/* N2 */ +static int n2(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len == 2 + && numeric(data, data_len, 0, 2, 2, p_err_no, p_err_posn, err_msg); +} + +/* X..28 */ +static int x__28(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len >= 1 && data_len <= 28 + && cset82(data, data_len, 0, 1, 28, p_err_no, p_err_posn, err_msg); +} + +/* X..30 */ +static int x__30(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len >= 1 && data_len <= 30 + && cset82(data, data_len, 0, 1, 30, p_err_no, p_err_posn, err_msg); +} + +/* N..6 */ +static int n__6(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len >= 1 && data_len <= 6 + && numeric(data, data_len, 0, 1, 6, p_err_no, p_err_posn, err_msg); +} + +/* N13,csum,key X0..17 */ +static int n13_csum_key_x0__17(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len >= 13 && data_len <= 30 + && csum(data, data_len, 0, 13, 13, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && key(data, data_len, 0, 13, 13, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && numeric(data, data_len, 0, 13, 13, p_err_no, p_err_posn, err_msg) + && csum(data, data_len, 0, 13, 13, p_err_no, p_err_posn, err_msg, 0) + && key(data, data_len, 0, 13, 13, p_err_no, p_err_posn, err_msg, 0) + && cset82(data, data_len, 13, 0, 17, p_err_no, p_err_posn, err_msg); +} + +/* N13,csum,key N0..12 */ +static int n13_csum_key_n0__12(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len >= 13 && data_len <= 25 + && csum(data, data_len, 0, 13, 13, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && key(data, data_len, 0, 13, 13, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && numeric(data, data_len, 0, 13, 13, p_err_no, p_err_posn, err_msg) + && csum(data, data_len, 0, 13, 13, p_err_no, p_err_posn, err_msg, 0) + && key(data, data_len, 0, 13, 13, p_err_no, p_err_posn, err_msg, 0) + && numeric(data, data_len, 13, 0, 12, p_err_no, p_err_posn, err_msg); +} + +/* N..8 */ +static int n__8(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len >= 1 && data_len <= 8 + && numeric(data, data_len, 0, 1, 8, p_err_no, p_err_posn, err_msg); +} + +/* N6 */ +static int n6(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len == 6 + && numeric(data, data_len, 0, 6, 6, p_err_no, p_err_posn, err_msg); +} + +/* N..15 */ +static int n__15(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len >= 1 && data_len <= 15 + && numeric(data, data_len, 0, 1, 15, p_err_no, p_err_posn, err_msg); +} + +/* N3,iso4217 N..15 */ +static int n3_iso4217_n__15(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len >= 4 && data_len <= 18 + && iso4217(data, data_len, 0, 3, 3, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && numeric(data, data_len, 0, 3, 3, p_err_no, p_err_posn, err_msg) + && iso4217(data, data_len, 0, 3, 3, p_err_no, p_err_posn, err_msg, 0) + && numeric(data, data_len, 3, 1, 15, p_err_no, p_err_posn, err_msg); +} + +/* N4 */ +static int n4(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len == 4 + && numeric(data, data_len, 0, 4, 4, p_err_no, p_err_posn, err_msg); +} + +/* X..30,key */ +static int x__30_key(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len >= 1 && data_len <= 30 + && key(data, data_len, 0, 1, 30, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && cset82(data, data_len, 0, 1, 30, p_err_no, p_err_posn, err_msg) + && key(data, data_len, 0, 1, 30, p_err_no, p_err_posn, err_msg, 0); +} + +/* N17,csum,key */ +static int n17_csum_key(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len == 17 + && csum(data, data_len, 0, 17, 17, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && key(data, data_len, 0, 17, 17, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && numeric(data, data_len, 0, 17, 17, p_err_no, p_err_posn, err_msg) + && csum(data, data_len, 0, 17, 17, p_err_no, p_err_posn, err_msg, 0) + && key(data, data_len, 0, 17, 17, p_err_no, p_err_posn, err_msg, 0); +} + +/* N13,csum,key */ +static int n13_csum_key(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len == 13 + && csum(data, data_len, 0, 13, 13, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && key(data, data_len, 0, 13, 13, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && numeric(data, data_len, 0, 13, 13, p_err_no, p_err_posn, err_msg) + && csum(data, data_len, 0, 13, 13, p_err_no, p_err_posn, err_msg, 0) + && key(data, data_len, 0, 13, 13, p_err_no, p_err_posn, err_msg, 0); +} + +/* N3,iso3166 X..9 */ +static int n3_iso3166_x__9(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len >= 4 && data_len <= 12 + && iso3166(data, data_len, 0, 3, 3, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && numeric(data, data_len, 0, 3, 3, p_err_no, p_err_posn, err_msg) + && iso3166(data, data_len, 0, 3, 3, p_err_no, p_err_posn, err_msg, 0) + && cset82(data, data_len, 3, 1, 9, p_err_no, p_err_posn, err_msg); +} + +/* N3,iso3166 */ +static int n3_iso3166(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len == 3 + && iso3166(data, data_len, 0, 3, 3, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && numeric(data, data_len, 0, 3, 3, p_err_no, p_err_posn, err_msg) + && iso3166(data, data_len, 0, 3, 3, p_err_no, p_err_posn, err_msg, 0); +} + +/* N..15,iso3166list */ +static int n__15_iso3166list(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len >= 1 && data_len <= 15 + && iso3166list(data, data_len, 0, 1, 15, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && numeric(data, data_len, 0, 1, 15, p_err_no, p_err_posn, err_msg) + && iso3166list(data, data_len, 0, 1, 15, p_err_no, p_err_posn, err_msg, 0); +} + +/* X..3 */ +static int x__3(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len >= 1 && data_len <= 3 + && cset82(data, data_len, 0, 1, 3, p_err_no, p_err_posn, err_msg); +} + +/* X..35,pcenc */ +static int x__35_pcenc(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len >= 1 && data_len <= 35 + && pcenc(data, data_len, 0, 1, 35, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && cset82(data, data_len, 0, 1, 35, p_err_no, p_err_posn, err_msg) + && pcenc(data, data_len, 0, 1, 35, p_err_no, p_err_posn, err_msg, 0); +} + +/* X..70,pcenc */ +static int x__70_pcenc(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len >= 1 && data_len <= 70 + && pcenc(data, data_len, 0, 1, 70, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && cset82(data, data_len, 0, 1, 70, p_err_no, p_err_posn, err_msg) + && pcenc(data, data_len, 0, 1, 70, p_err_no, p_err_posn, err_msg, 0); +} + +/* X2,iso3166alpha2 */ +static int x2_iso3166alpha2(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len == 2 + && iso3166alpha2(data, data_len, 0, 2, 2, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && cset82(data, data_len, 0, 2, 2, p_err_no, p_err_posn, err_msg) + && iso3166alpha2(data, data_len, 0, 2, 2, p_err_no, p_err_posn, err_msg, 0); +} + +/* X..30,pcenc */ +static int x__30_pcenc(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len >= 1 && data_len <= 30 + && pcenc(data, data_len, 0, 1, 30, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && cset82(data, data_len, 0, 1, 30, p_err_no, p_err_posn, err_msg) + && pcenc(data, data_len, 0, 1, 30, p_err_no, p_err_posn, err_msg, 0); +} + +/* N1,yesno */ +static int n1_yesno(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len == 1 + && yesno(data, data_len, 0, 1, 1, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && numeric(data, data_len, 0, 1, 1, p_err_no, p_err_posn, err_msg) + && yesno(data, data_len, 0, 1, 1, p_err_no, p_err_posn, err_msg, 0); +} + +/* N6,yymmd0 N4,hhmm */ +static int n6_yymmd0_n4_hhmm(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len == 10 + && yymmd0(data, data_len, 0, 6, 6, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && hhmm(data, data_len, 6, 4, 4, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && numeric(data, data_len, 0, 6, 6, p_err_no, p_err_posn, err_msg) + && yymmd0(data, data_len, 0, 6, 6, p_err_no, p_err_posn, err_msg, 0) + && numeric(data, data_len, 6, 4, 4, p_err_no, p_err_posn, err_msg) + && hhmm(data, data_len, 6, 4, 4, p_err_no, p_err_posn, err_msg, 0); +} + +/* N6,yymmdd */ +static int n6_yymmdd(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len == 6 + && yymmdd(data, data_len, 0, 6, 6, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && numeric(data, data_len, 0, 6, 6, p_err_no, p_err_posn, err_msg) + && yymmdd(data, data_len, 0, 6, 6, p_err_no, p_err_posn, err_msg, 0); +} + +/* N13 */ +static int n13(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len == 13 + && numeric(data, data_len, 0, 13, 13, p_err_no, p_err_posn, err_msg); +} + +/* N6,yymmdd N4,hhmm */ +static int n6_yymmdd_n4_hhmm(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len == 10 + && yymmdd(data, data_len, 0, 6, 6, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && hhmm(data, data_len, 6, 4, 4, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && numeric(data, data_len, 0, 6, 6, p_err_no, p_err_posn, err_msg) + && yymmdd(data, data_len, 0, 6, 6, p_err_no, p_err_posn, err_msg, 0) + && numeric(data, data_len, 6, 4, 4, p_err_no, p_err_posn, err_msg) + && hhmm(data, data_len, 6, 4, 4, p_err_no, p_err_posn, err_msg, 0); +} + +/* N..4 */ +static int n__4(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len >= 1 && data_len <= 4 + && numeric(data, data_len, 0, 1, 4, p_err_no, p_err_posn, err_msg); +} + +/* X..12 */ +static int x__12(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len >= 1 && data_len <= 12 + && cset82(data, data_len, 0, 1, 12, p_err_no, p_err_posn, err_msg); +} + +/* N6,yymmdd N0..6,yymmdd */ +static int n6_yymmdd_n0__6_yymmdd(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len >= 6 && data_len <= 12 + && yymmdd(data, data_len, 0, 6, 6, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && yymmdd(data, data_len, 6, 0, 6, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && numeric(data, data_len, 0, 6, 6, p_err_no, p_err_posn, err_msg) + && yymmdd(data, data_len, 0, 6, 6, p_err_no, p_err_posn, err_msg, 0) + && numeric(data, data_len, 6, 0, 6, p_err_no, p_err_posn, err_msg) + && yymmdd(data, data_len, 6, 0, 6, p_err_no, p_err_posn, err_msg, 0); +} + +/* X..10 */ +static int x__10(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len >= 1 && data_len <= 10 + && cset82(data, data_len, 0, 1, 10, p_err_no, p_err_posn, err_msg); +} + +/* X..2 */ +static int x__2(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len >= 1 && data_len <= 2 + && cset82(data, data_len, 0, 1, 2, p_err_no, p_err_posn, err_msg); +} + +/* N3,iso3166999 X..27 */ +static int n3_iso3166999_x__27(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len >= 4 && data_len <= 30 + && iso3166999(data, data_len, 0, 3, 3, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && numeric(data, data_len, 0, 3, 3, p_err_no, p_err_posn, err_msg) + && iso3166999(data, data_len, 0, 3, 3, p_err_no, p_err_posn, err_msg, 0) + && cset82(data, data_len, 3, 1, 27, p_err_no, p_err_posn, err_msg); +} + +/* N1 X1 X1 X1,importeridx */ +static int n1_x1_x1_x1_importeridx(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len == 4 + && importeridx(data, data_len, 3, 1, 1, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && numeric(data, data_len, 0, 1, 1, p_err_no, p_err_posn, err_msg) + && cset82(data, data_len, 1, 1, 1, p_err_no, p_err_posn, err_msg) + && cset82(data, data_len, 2, 1, 1, p_err_no, p_err_posn, err_msg) + && cset82(data, data_len, 3, 1, 1, p_err_no, p_err_posn, err_msg) + && importeridx(data, data_len, 3, 1, 1, p_err_no, p_err_posn, err_msg, 0); +} + +/* X2 X..28 */ +static int x2_x__28(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len >= 3 && data_len <= 30 + && cset82(data, data_len, 0, 2, 2, p_err_no, p_err_posn, err_msg) + && cset82(data, data_len, 2, 1, 28, p_err_no, p_err_posn, err_msg); +} + +/* N4,nonzero N5,nonzero N3,nonzero N1,winding N1 */ +static int n4_nonzero_n5_nonzero_n3_nonzero_n1_winding_n1(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len == 14 + && nonzero(data, data_len, 0, 4, 4, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && nonzero(data, data_len, 4, 5, 5, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && nonzero(data, data_len, 9, 3, 3, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && winding(data, data_len, 12, 1, 1, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && numeric(data, data_len, 0, 4, 4, p_err_no, p_err_posn, err_msg) + && nonzero(data, data_len, 0, 4, 4, p_err_no, p_err_posn, err_msg, 0) + && numeric(data, data_len, 4, 5, 5, p_err_no, p_err_posn, err_msg) + && nonzero(data, data_len, 4, 5, 5, p_err_no, p_err_posn, err_msg, 0) + && numeric(data, data_len, 9, 3, 3, p_err_no, p_err_posn, err_msg) + && nonzero(data, data_len, 9, 3, 3, p_err_no, p_err_posn, err_msg, 0) + && numeric(data, data_len, 12, 1, 1, p_err_no, p_err_posn, err_msg) + && winding(data, data_len, 12, 1, 1, p_err_no, p_err_posn, err_msg, 0) + && numeric(data, data_len, 13, 1, 1, p_err_no, p_err_posn, err_msg); +} + +/* N1,zero N13,csum,key X0..16 */ +static int n1_zero_n13_csum_key_x0__16(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len >= 14 && data_len <= 30 + && zero(data, data_len, 0, 1, 1, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && csum(data, data_len, 1, 13, 13, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && key(data, data_len, 1, 13, 13, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && numeric(data, data_len, 0, 1, 1, p_err_no, p_err_posn, err_msg) + && zero(data, data_len, 0, 1, 1, p_err_no, p_err_posn, err_msg, 0) + && numeric(data, data_len, 1, 13, 13, p_err_no, p_err_posn, err_msg) + && csum(data, data_len, 1, 13, 13, p_err_no, p_err_posn, err_msg, 0) + && key(data, data_len, 1, 13, 13, p_err_no, p_err_posn, err_msg, 0) + && cset82(data, data_len, 14, 0, 16, p_err_no, p_err_posn, err_msg); +} + +/* N14,csum N4,pieceoftotal */ +static int n14_csum_n4_pieceoftotal(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len == 18 + && csum(data, data_len, 0, 14, 14, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && pieceoftotal(data, data_len, 14, 4, 4, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && numeric(data, data_len, 0, 14, 14, p_err_no, p_err_posn, err_msg) + && csum(data, data_len, 0, 14, 14, p_err_no, p_err_posn, err_msg, 0) + && numeric(data, data_len, 14, 4, 4, p_err_no, p_err_posn, err_msg) + && pieceoftotal(data, data_len, 14, 4, 4, p_err_no, p_err_posn, err_msg, 0); +} + +/* X..34,iban */ +static int x__34_iban(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len >= 1 && data_len <= 34 + && iban(data, data_len, 0, 1, 34, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && cset82(data, data_len, 0, 1, 34, p_err_no, p_err_posn, err_msg) + && iban(data, data_len, 0, 1, 34, p_err_no, p_err_posn, err_msg, 0); +} + +/* N8,yymmddhh N0..4,mmoptss */ +static int n8_yymmddhh_n0__4_mmoptss(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len >= 8 && data_len <= 12 + && yymmddhh(data, data_len, 0, 8, 8, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && mmoptss(data, data_len, 8, 0, 4, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && numeric(data, data_len, 0, 8, 8, p_err_no, p_err_posn, err_msg) + && yymmddhh(data, data_len, 0, 8, 8, p_err_no, p_err_posn, err_msg, 0) + && numeric(data, data_len, 8, 0, 4, p_err_no, p_err_posn, err_msg) + && mmoptss(data, data_len, 8, 0, 4, p_err_no, p_err_posn, err_msg, 0); +} + +/* X..50 */ +static int x__50(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len >= 1 && data_len <= 50 + && cset82(data, data_len, 0, 1, 50, p_err_no, p_err_posn, err_msg); +} + +/* C..30,key */ +static int c__30_key(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len >= 1 && data_len <= 30 + && key(data, data_len, 0, 1, 30, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && cset39(data, data_len, 0, 1, 30, p_err_no, p_err_posn, err_msg) + && key(data, data_len, 0, 1, 30, p_err_no, p_err_posn, err_msg, 0); +} + +/* N..12,nozeroprefix */ +static int n__12_nozeroprefix(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len >= 1 && data_len <= 12 + && nozeroprefix(data, data_len, 0, 1, 12, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && numeric(data, data_len, 0, 1, 12, p_err_no, p_err_posn, err_msg) + && nozeroprefix(data, data_len, 0, 1, 12, p_err_no, p_err_posn, err_msg, 0); +} + +/* N18,csum */ +static int n18_csum(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len == 18 + && csum(data, data_len, 0, 18, 18, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && numeric(data, data_len, 0, 18, 18, p_err_no, p_err_posn, err_msg) + && csum(data, data_len, 0, 18, 18, p_err_no, p_err_posn, err_msg, 0); +} + +/* N..10 */ +static int n__10(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len >= 1 && data_len <= 10 + && numeric(data, data_len, 0, 1, 10, p_err_no, p_err_posn, err_msg); +} + +/* X..25 */ +static int x__25(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len >= 1 && data_len <= 25 + && cset82(data, data_len, 0, 1, 25, p_err_no, p_err_posn, err_msg); +} + +/* X..70,couponcode */ +static int x__70_couponcode(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len >= 1 && data_len <= 70 + && couponcode(data, data_len, 0, 1, 70, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && cset82(data, data_len, 0, 1, 70, p_err_no, p_err_posn, err_msg) + && couponcode(data, data_len, 0, 1, 70, p_err_no, p_err_posn, err_msg, 0); +} + +/* X..70,couponposoffer */ +static int x__70_couponposoffer(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len >= 1 && data_len <= 70 + && couponposoffer(data, data_len, 0, 1, 70, p_err_no, p_err_posn, err_msg, 1 /*length_only*/) + && cset82(data, data_len, 0, 1, 70, p_err_no, p_err_posn, err_msg) + && couponposoffer(data, data_len, 0, 1, 70, p_err_no, p_err_posn, err_msg, 0); +} + +/* X..70 */ +static int x__70(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len >= 1 && data_len <= 70 + && cset82(data, data_len, 0, 1, 70, p_err_no, p_err_posn, err_msg); +} + +/* X..90 */ +static int x__90(const unsigned char *data, const int data_len, + int *p_err_no, int *p_err_posn, char err_msg[50]) { + return data_len >= 1 && data_len <= 90 + && cset82(data, data_len, 0, 1, 90, p_err_no, p_err_posn, err_msg); +} + +/* Entry point. Returns 1 on success, 0 on failure: `*p_err_no` set to 1 if unknown AI, 2 if bad data length */ +static int gs1_lint(const int ai, const unsigned char *data, const int data_len, int *p_err_no, int *p_err_posn, + char err_msg[50]) { + + /* Assume data length failure */ + *p_err_no = 2; + + if (ai < 100) { + + if (ai == 0) { + return n18_csum_key(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 1 || ai == 2) { + return n14_csum_key(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 10 || ai == 21 || ai == 22) { + return x__20(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai >= 11 && ai <= 17) { + return n6_yymmd0(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 20) { + return n2(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 30 || ai == 37) { + return n__8(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 90) { + return x__30(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai >= 91) { + return x__90(data, data_len, p_err_no, p_err_posn, err_msg); + } + + } else if (ai < 300) { + + if (ai == 235) { + return x__28(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 240 || ai == 241 || ai == 250 || ai == 251) { + return x__30(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 242) { + return n__6(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 243 || ai == 254) { + return x__20(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 253) { + return n13_csum_key_x0__17(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 255) { + return n13_csum_key_n0__12(data, data_len, p_err_no, p_err_posn, err_msg); + } + + } else if (ai < 500) { + + if (ai == 400 || ai == 403) { + return x__30(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 401) { + return x__30_key(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 402) { + return n17_csum_key(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai >= 410 && ai <= 417) { + return n13_csum_key(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 420) { + return x__20(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 421) { + return n3_iso3166_x__9(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 422 || ai == 424 || ai == 426) { + return n3_iso3166(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 423 || ai == 425) { + return n__15_iso3166list(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 427) { + return x__3(data, data_len, p_err_no, p_err_posn, err_msg); + } + + } else if (ai < 800) { + + if (ai >= 710 && ai <= 714) { + return x__20(data, data_len, p_err_no, p_err_posn, err_msg); + } + + } else if (ai < 3200) { + + if ((ai >= 3100 && ai <= 3105) || (ai >= 3110 && ai <= 3115) || (ai >= 3120 && ai <= 3125) + || (ai >= 3130 && ai <= 3135) || (ai >= 3140 && ai <= 3145) || (ai >= 3150 && ai <= 3155) + || (ai >= 3160 && ai <= 3165)) { + return n6(data, data_len, p_err_no, p_err_posn, err_msg); + } + + } else if (ai < 3300) { + + if (ai <= 3205 || (ai >= 3210 && ai <= 3215) || (ai >= 3220 && ai <= 3225) || (ai >= 3230 && ai <= 3235) + || (ai >= 3240 && ai <= 3245) || (ai >= 3250 && ai <= 3255) || (ai >= 3260 && ai <= 3265) + || (ai >= 3270 && ai <= 3275) || (ai >= 3280 && ai <= 3285) || (ai >= 3290 && ai <= 3295)) { + return n6(data, data_len, p_err_no, p_err_posn, err_msg); + } + + } else if (ai < 3400) { + + if (ai <= 3305 || (ai >= 3310 && ai <= 3315) || (ai >= 3320 && ai <= 3325) || (ai >= 3330 && ai <= 3335) + || (ai >= 3340 && ai <= 3345) || (ai >= 3350 && ai <= 3355) || (ai >= 3360 && ai <= 3365) + || (ai >= 3370 && ai <= 3375)) { + return n6(data, data_len, p_err_no, p_err_posn, err_msg); + } + + } else if (ai < 3500) { + + if (ai <= 3405 || (ai >= 3410 && ai <= 3415) || (ai >= 3420 && ai <= 3425) || (ai >= 3430 && ai <= 3435) + || (ai >= 3440 && ai <= 3445) || (ai >= 3450 && ai <= 3455) || (ai >= 3460 && ai <= 3465) + || (ai >= 3470 && ai <= 3475) || (ai >= 3480 && ai <= 3485) || (ai >= 3490 && ai <= 3495)) { + return n6(data, data_len, p_err_no, p_err_posn, err_msg); + } + + } else if (ai < 3600) { + + if (ai <= 3505 || (ai >= 3510 && ai <= 3515) || (ai >= 3520 && ai <= 3525) || (ai >= 3530 && ai <= 3535) + || (ai >= 3540 && ai <= 3545) || (ai >= 3550 && ai <= 3555) || (ai >= 3560 && ai <= 3565) + || (ai >= 3570 && ai <= 3575)) { + return n6(data, data_len, p_err_no, p_err_posn, err_msg); + } + + } else if (ai < 3700) { + + if (ai <= 3605 || (ai >= 3610 && ai <= 3615) || (ai >= 3620 && ai <= 3625) || (ai >= 3630 && ai <= 3635) + || (ai >= 3640 && ai <= 3645) || (ai >= 3650 && ai <= 3655) || (ai >= 3660 && ai <= 3665) + || (ai >= 3670 && ai <= 3675) || (ai >= 3680 && ai <= 3685) || (ai >= 3690 && ai <= 3695)) { + return n6(data, data_len, p_err_no, p_err_posn, err_msg); + } + + } else if (ai < 4000) { + + if ((ai >= 3900 && ai <= 3909) || (ai >= 3920 && ai <= 3929)) { + return n__15(data, data_len, p_err_no, p_err_posn, err_msg); + } + if ((ai >= 3910 && ai <= 3919) || (ai >= 3930 && ai <= 3939)) { + return n3_iso4217_n__15(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai >= 3940 && ai <= 3943) { + return n4(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai >= 3950 && ai <= 3955) { + return n6(data, data_len, p_err_no, p_err_posn, err_msg); + } + + } else if (ai < 4400) { + + if (ai == 4300 || ai == 4301 || ai == 4310 || ai == 4311 || ai == 4320) { + return x__35_pcenc(data, data_len, p_err_no, p_err_posn, err_msg); + } + if ((ai >= 4302 && ai <= 4306) || (ai >= 4312 && ai <= 4316)) { + return x__70_pcenc(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 4307 || ai == 4317) { + return x2_iso3166alpha2(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 4308) { + return x__30_pcenc(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 4318) { + return x__20(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 4319) { + return x__30(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai >= 4321 && ai <= 4323) { + return n1_yesno(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 4324 || ai == 4325) { + return n6_yymmd0_n4_hhmm(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 4326) { + return n6_yymmdd(data, data_len, p_err_no, p_err_posn, err_msg); + } + + } else if (ai < 7100) { + + if (ai == 7001) { + return n13(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 7002) { + return x__30(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 7003) { + return n6_yymmdd_n4_hhmm(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 7004) { + return n__4(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 7005) { + return x__12(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 7006) { + return n6_yymmdd(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 7007) { + return n6_yymmdd_n0__6_yymmdd(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 7008) { + return x__3(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 7009) { + return x__10(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 7010) { + return x__2(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai >= 7020 && ai <= 7022) { + return x__20(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 7023) { + return x__30_key(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai >= 7030 && ai <= 7039) { + return n3_iso3166999_x__27(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 7040) { + return n1_x1_x1_x1_importeridx(data, data_len, p_err_no, p_err_posn, err_msg); + } + + } else if (ai < 7300) { + + if (ai >= 7230 && ai <= 7239) { + return x2_x__28(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 7240) { + return x__20(data, data_len, p_err_no, p_err_posn, err_msg); + } + + } else if (ai < 8100) { + + if (ai == 8001) { + return n4_nonzero_n5_nonzero_n3_nonzero_n1_winding_n1(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 8002 || ai == 8012) { + return x__20(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 8003) { + return n1_zero_n13_csum_key_x0__16(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 8004 || ai == 8013) { + return x__30_key(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 8005) { + return n6(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 8006 || ai == 8026) { + return n14_csum_n4_pieceoftotal(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 8007) { + return x__34_iban(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 8008) { + return n8_yymmddhh_n0__4_mmoptss(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 8009) { + return x__50(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 8010) { + return c__30_key(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 8011) { + return n__12_nozeroprefix(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 8017 || ai == 8018) { + return n18_csum(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 8019) { + return n__10(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 8020) { + return x__25(data, data_len, p_err_no, p_err_posn, err_msg); + } + + } else if (ai < 8200) { + + if (ai == 8110) { + return x__70_couponcode(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 8111) { + return n4(data, data_len, p_err_no, p_err_posn, err_msg); + } + if (ai == 8112) { + return x__70_couponposoffer(data, data_len, p_err_no, p_err_posn, err_msg); + } + + } else if (ai < 8300) { + + if (ai == 8200) { + return x__70(data, data_len, p_err_no, p_err_posn, err_msg); + } + } + + /* Unknown AI */ + *p_err_no = 1; + return 0; +} + +#endif /* GS1_LINT_H */ diff --git a/backend/iso3166.h b/backend/iso3166.h new file mode 100644 index 00000000..0a5b221a --- /dev/null +++ b/backend/iso3166.h @@ -0,0 +1,88 @@ +/* + * ISO 3166 country codes generated by "backend/tools/gen_iso3166_h.php" + */ +/* + libzint - the open source barcode library + Copyright (C) 2021 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#ifndef ISO3166_H +#define ISO3166_H + +/* Whether ISO 3166-1 numeric */ +static int iso3166_numeric(int cc) { + static const unsigned char codes[112] = { + 0x10, 0x15, 0x11, 0x91, 0x11, 0x11, 0x1D, 0x11, + 0x51, 0x15, 0x50, 0x14, 0x11, 0x11, 0x11, 0x11, + 0x10, 0x11, 0x11, 0x51, 0x44, 0xC4, 0x14, 0x91, + 0x11, 0x18, 0x51, 0x44, 0x84, 0xC7, 0x44, 0x45, + 0x54, 0x54, 0x18, 0x00, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x51, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x41, 0x11, 0x45, 0x46, 0x54, 0x44, 0x45, + 0x44, 0x44, 0x44, 0x44, 0x11, 0x10, 0x1D, 0x11, + 0x11, 0x11, 0xE9, 0x10, 0x10, 0x44, 0x44, 0x44, + 0xB4, 0x87, 0x40, 0x11, 0x11, 0x11, 0x45, 0x44, + 0x4C, 0x50, 0xD8, 0x44, 0x44, 0x44, 0x45, 0xC0, + 0x47, 0x10, 0x10, 0x13, 0x10, 0x11, 0x11, 0x15, + 0x11, 0x11, 0x11, 0x59, 0x91, 0x00, 0x04, 0x84, + 0x07, 0x01, 0x44, 0x54, 0x00, 0x10, 0x84, 0x40, + }; + int b = cc >> 3; + + if (b < 0 || b >= 112) { + return 0; + } + return codes[b] & (1 << (cc & 0x7)) ? 1 : 0; +} + +/* Whether ISO 3166-1 alpha2 */ +static int iso3166_alpha2(const char *cc) { + static const unsigned char codes[85] = { + 0x78, 0x59, 0xDF, 0xEE, 0xEF, 0xBD, 0xDD, 0xDE, + 0x27, 0x3F, 0x84, 0x15, 0x80, 0xD4, 0x00, 0x0E, + 0x00, 0x5C, 0x09, 0xB0, 0x9F, 0xFB, 0x15, 0x00, + 0x8D, 0x06, 0x18, 0x78, 0x0F, 0x40, 0x40, 0x03, + 0x00, 0x1D, 0x2B, 0xF4, 0x41, 0x81, 0x4F, 0xFD, + 0xFC, 0xFF, 0xD7, 0x25, 0x4B, 0x08, 0x00, 0x01, + 0x40, 0x3C, 0x8F, 0x53, 0x01, 0x00, 0x00, 0x40, + 0x00, 0x51, 0xF1, 0xFD, 0xE7, 0x3A, 0xBB, 0x9F, + 0x9A, 0x41, 0x10, 0x04, 0x57, 0x85, 0x40, 0x00, + 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, + 0x08, 0x04, 0x40, 0x00, 0x01, + }; + int cc_int; + + if (cc[0] < 'A' || cc[0] > 'Z' || cc[1] < 'A' || cc[1] > 'Z') { + return 0; + } + cc_int = (cc[0] - 'A') * 26 + (cc[1] - 'A'); + + return codes[cc_int >> 3] & (1 << (cc_int & 0x7)) ? 1 : 0; +} + +#endif /* ISO3166_H */ diff --git a/backend/iso4217.h b/backend/iso4217.h new file mode 100644 index 00000000..6959d17c --- /dev/null +++ b/backend/iso4217.h @@ -0,0 +1,65 @@ +/* + * ISO 4217 currency codes generated by "backend/tools/gen_iso4217_h.php" + */ +/* + libzint - the open source barcode library + Copyright (C) 2021 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#ifndef ISO4217_H +#define ISO4217_H + +/* Whether ISO 4217-1 numeric */ +static int iso4217_numeric(int cc) { + static const unsigned char codes[125] = { + 0x00, 0x11, 0x00, 0x00, 0x11, 0x10, 0x1D, 0x10, + 0x11, 0x01, 0x10, 0x04, 0x01, 0x11, 0x10, 0x10, + 0x10, 0x01, 0x01, 0x11, 0x00, 0x44, 0x00, 0x90, + 0x01, 0x08, 0x41, 0x40, 0x40, 0x41, 0x04, 0x00, + 0x40, 0x40, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x11, 0x11, 0x10, 0x11, 0x11, 0x11, 0x01, 0x01, + 0x10, 0x41, 0x11, 0x45, 0x46, 0x44, 0x04, 0x40, + 0x40, 0x44, 0x00, 0x00, 0x11, 0x00, 0x05, 0x01, + 0x11, 0x10, 0x30, 0x00, 0x10, 0x44, 0x40, 0x00, + 0x04, 0x44, 0x40, 0x11, 0x01, 0x00, 0x00, 0x04, + 0x48, 0x40, 0x00, 0x00, 0x00, 0x04, 0x44, 0x40, + 0x45, 0x00, 0x00, 0x01, 0x00, 0x10, 0x11, 0x11, + 0x00, 0x11, 0x11, 0x00, 0x81, 0x00, 0x04, 0x04, + 0x04, 0x01, 0x00, 0x14, 0x00, 0x00, 0x44, 0x00, + 0x20, 0x00, 0x00, 0x80, 0x7F, 0xB5, 0xFD, 0xFB, + 0xBF, 0xBF, 0x3F, 0x47, 0xA4, + }; + int b = cc >> 3; + + if (b < 0 || b >= 125) { + return 0; + } + return codes[b] & (1 << (cc & 0x7)) ? 1 : 0; +} + +#endif /* ISO4217_H */ diff --git a/backend/library.c b/backend/library.c index 25b2bdde..ab1d193e 100644 --- a/backend/library.c +++ b/backend/library.c @@ -1300,7 +1300,7 @@ int ZBarcode_Encode(struct zint_symbol *symbol, const unsigned char *source, int unsigned char *reduced = (unsigned char *) _alloca(in_length + 1); #endif error_number = gs1_verify(symbol, local_source, in_length, reduced); - if (error_number != 0) { + if (error_number >= ZINT_ERROR) { const char in_2d_comp[] = " in 2D component"; if (is_composite(symbol->symbology) && strlen(symbol->errtxt) < 100 - strlen(in_2d_comp)) { strcat(symbol->errtxt, in_2d_comp); diff --git a/backend/rss.c b/backend/rss.c index 3635cd84..6577adca 100644 --- a/backend/rss.c +++ b/backend/rss.c @@ -2,7 +2,7 @@ /* libzint - the open source barcode library - Copyright (C) 2008-2020 Robin Stuart + Copyright (C) 2008-2021 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -1191,6 +1191,7 @@ static void rssexp_separator(struct zint_symbol *symbol, int width, const int co /* GS1 DataBar Expanded */ INTERNAL int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int src_len) { + int error_number; int i, j, k, p, codeblocks, data_chars, vs, group, v_odd, v_even; int latch; int char_widths[21][8], checksum, check_widths[8], c_group; @@ -1210,9 +1211,9 @@ INTERNAL int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int separator_row = 0; - i = gs1_verify(symbol, source, src_len, reduced); - if (i != 0) { - return i; + error_number = gs1_verify(symbol, source, src_len, reduced); + if (error_number >= ZINT_ERROR) { + return error_number; } if (symbol->debug & ZINT_DEBUG_PRINT) { @@ -1527,5 +1528,5 @@ INTERNAL int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int } } - return 0; + return error_number; } diff --git a/backend/tests/CMakeLists.txt b/backend/tests/CMakeLists.txt index d54d6deb..a7a0d42d 100644 --- a/backend/tests/CMakeLists.txt +++ b/backend/tests/CMakeLists.txt @@ -102,6 +102,8 @@ zint_add_test(gridmtx, test_gridmtx) zint_add_test(gs1, test_gs1) zint_add_test(hanxin, test_hanxin) zint_add_test(imail, test_imail) +zint_add_test(iso3166, test_iso3166) +zint_add_test(iso4217, test_iso4217) zint_add_test(ksx1001, test_ksx1001) zint_add_test(large, test_large) zint_add_test(library, test_library) diff --git a/backend/tests/test_code128.c b/backend/tests/test_code128.c index 75c59088..e8a85a46 100644 --- a/backend/tests/test_code128.c +++ b/backend/tests/test_code128.c @@ -1,6 +1,6 @@ /* libzint - the open source barcode library - Copyright (C) 2020 Robin Stuart + Copyright (C) 2020 - 2021 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -228,8 +228,8 @@ static void test_reader_init(int index, int generate, int debug) { /* 1*/ { BARCODE_CODE128, UNICODE_MODE, READER_INIT, "12", 0, 1, 68, "(6) 104 96 99 12 22 106", "StartB FNC3 CodeC 12" }, /* 2*/ { BARCODE_CODE128B, UNICODE_MODE, READER_INIT, "\0371234", 0, 1, 101, "(9) 103 96 95 17 18 19 20 6 106", "StartA FNC3 US 1 2 3 4" }, /* 3*/ { BARCODE_GS1_128, GS1_MODE, READER_INIT, "[90]12", 0, 1, 68, "(6) 105 102 90 12 11 106", "StartC FNC1 90 12 (Reader Initialise not supported by GS1 barcodes (use CODE128))" }, - /* 4*/ { BARCODE_EAN14, GS1_MODE, READER_INIT, "12", 0, 1, 134, "(12) 105 102 1 0 0 0 0 0 1 25 30 106", "StartC FNC1 01 00 (5) 01 (Reader Initialise not supported by GS1 barcodes (use CODE128))" }, - /* 5*/ { BARCODE_NVE18, GS1_MODE, READER_INIT, "12", 0, 1, 156, "(14) 105 102 0 0 0 0 0 0 0 0 1 25 80 106", "StartC FNC1 00 (8) 01 (Reader Initialise not supported by GS1 barcodes (use CODE128))" }, + /* 4*/ { BARCODE_EAN14, GS1_MODE, READER_INIT, "12", ZINT_WARN_NONCOMPLIANT, 1, 134, "Warning (12) 105 102 1 0 0 0 0 0 1 25 30 106", "StartC FNC1 01 00 (5) 01 (Reader Initialise not supported by GS1 barcodes (use CODE128))" }, + /* 5*/ { BARCODE_NVE18, GS1_MODE, READER_INIT, "12", ZINT_WARN_NONCOMPLIANT, 1, 156, "Warning (14) 105 102 0 0 0 0 0 0 0 0 1 25 80 106", "StartC FNC1 00 (8) 01 (Reader Initialise not supported by GS1 barcodes (use CODE128))" }, /* 6*/ { BARCODE_HIBC_128, UNICODE_MODE, READER_INIT, "A", 0, 1, 79, "(7) 104 96 11 33 24 5 106", "StartA FNC3 + A 8 (check) (Not sensible, use CODE128)" }, }; int data_size = ARRAY_SIZE(data); diff --git a/backend/tests/test_composite.c b/backend/tests/test_composite.c index f718e888..8e95d38b 100644 --- a/backend/tests/test_composite.c +++ b/backend/tests/test_composite.c @@ -1,6 +1,6 @@ /* libzint - the open source barcode library - Copyright (C) 2019 - 2020 Robin Stuart + Copyright (C) 2019 - 2021 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -1608,8 +1608,8 @@ static void test_ean128_cc_width(int index, int generate, int debug) { /* 8*/ { "[91]123A1234A", "[02]13012345678909", 0, 5, 174, "" }, /* 9*/ { "[91]123A1234A1", "[02]13012345678909", 0, 5, 188, "" }, /*10*/ { "[91]123A1234A12", "[02]13012345678909", 0, 5, 205, "" }, - /*11*/ { "[00]123456789012345678", "[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[91]1234567890", 0, 32, 579, "With composite 2372 digits == max" }, - /*12*/ { "[00]123456789012345678", "[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[91]12345678901", ZINT_ERROR_TOO_LONG, 0, 0, "With composite 2373 digits > max" }, + /*11*/ { "[00]123456789012345675", "[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345678[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[91]1234567890", 0, 32, 579, "With composite 2372 digits == max" }, + /*12*/ { "[00]123456789012345675", "[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[91]12345678901", ZINT_ERROR_TOO_LONG, 0, 0, "With composite 2373 digits > max" }, }; int data_size = sizeof(data) / sizeof(struct item); @@ -2574,12 +2574,13 @@ static void test_encodation_11(int index, int generate, int debug) { "0001000000000000000000000000000000000000000000000000010" "0001010010011011110101000110111001000010100100010101010" }, - /*26*/ { BARCODE_UPCE_CC, 1, "1234567", "[90]AB[8004]1[10]12", 0, 9, 55, "Mode '11', alpha [90], with [8004], other data", - "1101100110100111110011001001100101111110010011110101001" - "1101101110101000100000100001101100011100111011100101001" - "1101101100100010011111011001100110011110001011101101001" - "1101101000110101100111111001000011001000111011101001001" - "1101001000100010000010100001101001111011111011101001101" + /*26*/ { BARCODE_UPCE_CC, 1, "1234567", "[90]AB[8004]12[10]12", 0, 10, 55, "Mode '11', alpha [90], with [8004], other data", + "1100100010110000110000101001101111011101000011100101101" + "1110100010110100011110001101001110001011111011000101101" + "1110110010100011100110111001011101101110000011000101001" + "1100110010100000100010001001010000010000100011001101001" + "1101110010111010000110000101101011100010000011011101001" + "1101111010110011110010001101000111101100110011011001001" "0001000000000000000000000000000000000000000000000000010" "0010000000000000000000000000000000000000000000000000001" "0001000000000000000000000000000000000000000000000000010" diff --git a/backend/tests/test_gs1.c b/backend/tests/test_gs1.c index 66b4ca0c..82a42e5b 100644 --- a/backend/tests/test_gs1.c +++ b/backend/tests/test_gs1.c @@ -1,6 +1,6 @@ /* libzint - the open source barcode library - Copyright (C) 2019 - 2020 Robin Stuart + Copyright (C) 2019 - 2021 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -53,35 +53,35 @@ static void test_gs1_reduce(int index, int generate, int debug) { }; struct item data[] = { /* 0*/ { BARCODE_GS1_128, -1, "12345678901234", "", ZINT_ERROR_INVALID_DATA, "GS1 data required", "" }, - /* 1*/ { BARCODE_GS1_128, -1, "[01]12345678901234", "", 0, "Input mode ignored; verified manually against tec-it", - "11010011100111101011101100110110010110011100100010110001110001011011000010100110111101101011001110010001011000111010111101100011101011" + /* 1*/ { BARCODE_GS1_128, -1, "[01]12345678901231", "", 0, "Input mode ignored; verified manually against tec-it", + "11010011100111101011101100110110010110011100100010110001110001011011000010100110111101101011001110011011000110100001100101100011101011" }, - /* 2*/ { BARCODE_GS1_128, GS1_MODE, "[01]12345678901234", "", 0, "Input mode ignored", - "11010011100111101011101100110110010110011100100010110001110001011011000010100110111101101011001110010001011000111010111101100011101011" + /* 2*/ { BARCODE_GS1_128, GS1_MODE, "[01]12345678901231", "", 0, "Input mode ignored", + "11010011100111101011101100110110010110011100100010110001110001011011000010100110111101101011001110011011000110100001100101100011101011" }, - /* 3*/ { BARCODE_GS1_128, UNICODE_MODE, "[01]12345678901234", "", 0, "Input mode ignored", - "11010011100111101011101100110110010110011100100010110001110001011011000010100110111101101011001110010001011000111010111101100011101011" + /* 3*/ { BARCODE_GS1_128, UNICODE_MODE, "[01]12345678901231", "", 0, "Input mode ignored", + "11010011100111101011101100110110010110011100100010110001110001011011000010100110111101101011001110011011000110100001100101100011101011" }, - /* 4*/ { BARCODE_GS1_128_CC, -1, "[01]12345678901234", "[21]1234", 0, "Input mode ignored", + /* 4*/ { BARCODE_GS1_128_CC, -1, "[01]12345678901231", "[21]1234", 0, "Input mode ignored", "0000000000000000000001101101110110100001000001101001100111011000010011101001100001010001100010010011011000000110110001010000000000000000000000000" "0000000000000000000001101101100111110100010011001101011100100000010011001001001111001011110011101011001000000110010001010000000000000000000000000" "0000000000000000000001101101000101111100110000101001111010000001010011001101011101110011110010011110110000110111010001010000000000000000000000000" - "0010110001100001010001001100100110100110001101110100111000111010010011110101100100001001010011000110111010011100010100001011010000110011100010100" - "1101001110011110101110110011011001011001110010001011000111000101101100001010011011110110101100111001000101100011101011110100101111001100011101011" + "0010110001100001010001001100100110100110001101110100111000111010010011110101100100001001010011000110010011100100010100001000101001110011100010100" + "1101001110011110101110110011011001011001110010001011000111000101101100001010011011110110101100111001101100011011101011110111010110001100011101011" }, - /* 5*/ { BARCODE_GS1_128_CC, GS1_MODE, "[01]12345678901234", "[21]1234", 0, "Input mode ignored", + /* 5*/ { BARCODE_GS1_128_CC, GS1_MODE, "[01]12345678901231", "[21]1234", 0, "Input mode ignored", "0000000000000000000001101101110110100001000001101001100111011000010011101001100001010001100010010011011000000110110001010000000000000000000000000" "0000000000000000000001101101100111110100010011001101011100100000010011001001001111001011110011101011001000000110010001010000000000000000000000000" "0000000000000000000001101101000101111100110000101001111010000001010011001101011101110011110010011110110000110111010001010000000000000000000000000" - "0010110001100001010001001100100110100110001101110100111000111010010011110101100100001001010011000110111010011100010100001011010000110011100010100" - "1101001110011110101110110011011001011001110010001011000111000101101100001010011011110110101100111001000101100011101011110100101111001100011101011" + "0010110001100001010001001100100110100110001101110100111000111010010011110101100100001001010011000110010011100100010100001000101001110011100010100" + "1101001110011110101110110011011001011001110010001011000111000101101100001010011011110110101100111001101100011011101011110111010110001100011101011" }, - /* 6*/ { BARCODE_GS1_128_CC, UNICODE_MODE, "[01]12345678901234", "[21]1234", 0, "Input mode ignored", + /* 6*/ { BARCODE_GS1_128_CC, UNICODE_MODE, "[01]12345678901231", "[21]1234", 0, "Input mode ignored", "0000000000000000000001101101110110100001000001101001100111011000010011101001100001010001100010010011011000000110110001010000000000000000000000000" "0000000000000000000001101101100111110100010011001101011100100000010011001001001111001011110011101011001000000110010001010000000000000000000000000" "0000000000000000000001101101000101111100110000101001111010000001010011001101011101110011110010011110110000110111010001010000000000000000000000000" - "0010110001100001010001001100100110100110001101110100111000111010010011110101100100001001010011000110111010011100010100001011010000110011100010100" - "1101001110011110101110110011011001011001110010001011000111000101101100001010011011110110101100111001000101100011101011110100101111001100011101011" + "0010110001100001010001001100100110100110001101110100111000111010010011110101100100001001010011000110010011100100010100001000101001110011100010100" + "1101001110011110101110110011011001011001110010001011000111000101101100001010011011110110101100111001101100011011101011110111010110001100011101011" }, /* 7*/ { BARCODE_EAN14, -1, "1234567890123", "", 0, "Input mode ignored; verified manually against tec-it", "11010011100111101011101100110110010110011100100010110001110001011011000010100110111101101011001110011011000110100001100101100011101011" @@ -165,7 +165,7 @@ static void test_gs1_reduce(int index, int generate, int debug) { "010010000000101001101111111100001011000110011110100101111100101110001011110000000010101111100001011101" }, }; - int data_size = sizeof(data) / sizeof(struct item); + int data_size = ARRAY_SIZE(data); char *text; @@ -240,20 +240,27 @@ static void test_hrt(int index, int debug) { char *data; char *composite; + int ret; char *expected; }; // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<")) struct item data[] = { - /* 0*/ { BARCODE_GS1_128, "[01]12345678901234[20]12", "", "(01)12345678901234(20)12" }, - /* 1*/ { BARCODE_GS1_128_CC, "[01]12345678901234[20]12", "[21]12345", "(01)12345678901234(20)12" }, - /* 2*/ { BARCODE_EAN14, "1234567890123", "", "(01)12345678901231" }, - /* 3*/ { BARCODE_NVE18, "12345678901234567", "", "(00)123456789012345675" }, - /* 4*/ { BARCODE_DBAR_EXP, "[01]12345678901234[20]12", "", "(01)12345678901234(20)12" }, - /* 5*/ { BARCODE_DBAR_EXP_CC, "[01]12345678901234", "[21]12345", "(01)12345678901234" }, - /* 6*/ { BARCODE_DBAR_EXPSTK, "[01]12345678901234[20]12", "", "" }, - /* 7*/ { BARCODE_DBAR_EXPSTK_CC, "[01]12345678901234[20]12", "[21]12345", "" }, + /* 0*/ { BARCODE_GS1_128, "[01]12345678901234[20]12", "", ZINT_WARN_NONCOMPLIANT, "(01)12345678901234(20)12" }, + /* 1*/ { BARCODE_GS1_128, "[01]12345678901231[20]12", "", 0, "(01)12345678901231(20)12" }, + /* 2*/ { BARCODE_GS1_128_CC, "[01]12345678901234[20]12", "[21]12345", ZINT_WARN_NONCOMPLIANT, "(01)12345678901234(20)12" }, + /* 3*/ { BARCODE_GS1_128_CC, "[01]12345678901231[20]12", "[21]12345", 0, "(01)12345678901231(20)12" }, + /* 4*/ { BARCODE_EAN14, "1234567890123", "", 0, "(01)12345678901231" }, + /* 5*/ { BARCODE_NVE18, "12345678901234567", "", 0, "(00)123456789012345675" }, + /* 6*/ { BARCODE_DBAR_EXP, "[01]12345678901234[20]12", "", ZINT_WARN_NONCOMPLIANT, "(01)12345678901234(20)12" }, + /* 7*/ { BARCODE_DBAR_EXP, "[01]12345678901231[20]12", "", 0, "(01)12345678901231(20)12" }, + /* 8*/ { BARCODE_DBAR_EXP_CC, "[01]12345678901234", "[21]12345", ZINT_WARN_NONCOMPLIANT, "(01)12345678901234" }, + /* 9*/ { BARCODE_DBAR_EXP_CC, "[01]12345678901231", "[21]12345", 0, "(01)12345678901231" }, + /* 10*/ { BARCODE_DBAR_EXPSTK, "[01]12345678901234[20]12", "", ZINT_WARN_NONCOMPLIANT, "" }, + /* 11*/ { BARCODE_DBAR_EXPSTK, "[01]12345678901231[20]12", "", 0, "" }, + /* 12*/ { BARCODE_DBAR_EXPSTK_CC, "[01]12345678901234[20]12", "[21]12345", ZINT_WARN_NONCOMPLIANT, "" }, + /* 13*/ { BARCODE_DBAR_EXPSTK_CC, "[01]12345678901231[20]12", "[21]12345", 0, "" }, }; - int data_size = sizeof(data) / sizeof(struct item); + int data_size = ARRAY_SIZE(data); char *text; @@ -276,7 +283,7 @@ static void test_hrt(int index, int debug) { int length = strlen(text); ret = ZBarcode_Encode(symbol, (unsigned char *) text, length); - assert_zero(ret, "i:%d ZBarcode_Encode ret %d != 0 %s\n", i, ret, symbol->errtxt); + assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, data[i].ret, ret, symbol->errtxt); assert_zero(strcmp((char *) symbol->text, data[i].expected), "i:%d strcmp(%s, %s) != 0\n", i, symbol->text, data[i].expected); @@ -288,7 +295,7 @@ static void test_hrt(int index, int debug) { #include "../gs1.h" -static void test_gs1_verify(int index) { +static void test_gs1_verify(int index, int debug) { testStart(""); @@ -309,492 +316,979 @@ static void test_gs1_verify(int index) { /* 6*/ { "[90]\n", ZINT_ERROR_INVALID_DATA, "" }, /* 7*/ { "[90]\x7F", ZINT_ERROR_INVALID_DATA, "" }, /* 8*/ { "[90]\x80", ZINT_ERROR_INVALID_DATA, "" }, - /* 9*/ { "[00]123456789012345678", 0, "00123456789012345678" }, - /* 10*/ { "[00]12345678901234567", ZINT_ERROR_INVALID_DATA, "" }, - /* 11*/ { "[01]12345678901234", 0, "0112345678901234" }, - /* 12*/ { "[01]123456789012345", ZINT_ERROR_INVALID_DATA, "" }, - /* 13*/ { "[02]12345678901234", 0, "0212345678901234" }, - /* 14*/ { "[02]1234567890123", ZINT_ERROR_INVALID_DATA, "" }, - /* 15*/ { "[03]12345678901234", ZINT_ERROR_INVALID_DATA, "" }, - /* 16*/ { "[04]1234", ZINT_ERROR_INVALID_DATA, "" }, - /* 17*/ { "[05]1234", ZINT_ERROR_INVALID_DATA, "" }, - /* 18*/ { "[06]1234", ZINT_ERROR_INVALID_DATA, "" }, - /* 19*/ { "[07]1234", ZINT_ERROR_INVALID_DATA, "" }, - /* 20*/ { "[08]1234", ZINT_ERROR_INVALID_DATA, "" }, - /* 21*/ { "[09]1234", ZINT_ERROR_INVALID_DATA, "" }, - /* 22*/ { "[10]ABCD123456", 0, "10ABCD123456" }, - /* 23*/ { "[10]123456789012345678901", ZINT_ERROR_INVALID_DATA, "" }, - /* 24*/ { "[100]1234", ZINT_ERROR_INVALID_DATA, "" }, - /* 25*/ { "[11]990102", 0, "11990102" }, - /* 26*/ { "[11]9901023", ZINT_ERROR_INVALID_DATA, "" }, - /* 27*/ { "[12]000100", 0, "12000100" }, - /* 28*/ { "[12]00010", ZINT_ERROR_INVALID_DATA, "" }, - /* 29*/ { "[13]991301", 0, "13991301" }, - /* 30*/ { "[13]9913011", ZINT_ERROR_INVALID_DATA, "" }, - /* 31*/ { "[14]1234", ZINT_ERROR_INVALID_DATA, "" }, - /* 32*/ { "[15]021231", 0, "15021231" }, - /* 33*/ { "[15]02123", ZINT_ERROR_INVALID_DATA, "" }, - /* 34*/ { "[16]000000", 0, "16000000" }, - /* 35*/ { "[16]00000", ZINT_ERROR_INVALID_DATA, "" }, - /* 36*/ { "[17]010200", 0, "17010200" }, - /* 37*/ { "[17]0102000", ZINT_ERROR_INVALID_DATA, "" }, - /* 38*/ { "[18]1234", ZINT_ERROR_INVALID_DATA, "" }, - /* 39*/ { "[19]1234", ZINT_ERROR_INVALID_DATA, "" }, - /* 40*/ { "[20]12", 0, "2012" }, - /* 41*/ { "[20]1", ZINT_ERROR_INVALID_DATA, "" }, - /* 42*/ { "[200]1234", ZINT_ERROR_INVALID_DATA, "" }, - /* 43*/ { "[21]A12345678", 0, "21A12345678" }, - /* 44*/ { "[21]123456789012345678901", ZINT_ERROR_INVALID_DATA, "" }, - /* 45*/ { "[22]abcdefghijklmnopqrst", 0, "22abcdefghijklmnopqrst" }, - /* 46*/ { "[22]abcdefghijklmnopqrstu", ZINT_ERROR_INVALID_DATA, "" }, - /* 47*/ { "[23]1234", ZINT_ERROR_INVALID_DATA, "" }, - /* 48*/ { "[235]1abcdefghijklmnopqrstuvwxyz0", 0, "2351abcdefghijklmnopqrstuvwxyz0" }, - /* 49*/ { "[235]1abcdefghijklmnopqrstuvwxyz01", ZINT_ERROR_INVALID_DATA, "" }, - /* 50*/ { "[24]1234", ZINT_ERROR_INVALID_DATA, "" }, - /* 51*/ { "[240]abcdefghijklmnopqrstuvwxyz1234", 0, "240abcdefghijklmnopqrstuvwxyz1234" }, - /* 52*/ { "[240]abcdefghijklmnopqrstuvwxyz12345", ZINT_ERROR_INVALID_DATA, "" }, - /* 53*/ { "[241]abcdefghijklmnopqrstuvwxyz1234", 0, "241abcdefghijklmnopqrstuvwxyz1234" }, - /* 54*/ { "[241]abcdefghijklmnopqrstuvwxyz12345", ZINT_ERROR_INVALID_DATA, "" }, - /* 55*/ { "[242]12345", 0, "24212345" }, - /* 56*/ { "[242]1234567", ZINT_ERROR_INVALID_DATA, "" }, - /* 57*/ { "[243]abcdefghijklmnopqrst", 0, "243abcdefghijklmnopqrst" }, - /* 58*/ { "[243]abcdefghijklmnopqrstu", ZINT_ERROR_INVALID_DATA, "" }, - /* 59*/ { "[244]1234", ZINT_ERROR_INVALID_DATA, "" }, - /* 60*/ { "[249]1234", ZINT_ERROR_INVALID_DATA, "" }, - /* 61*/ { "[25]1234", ZINT_ERROR_INVALID_DATA, "" }, - /* 62*/ { "[250]abcdefghijklmnopqrstuvwxyz1234", 0, "250abcdefghijklmnopqrstuvwxyz1234" }, - /* 63*/ { "[250]abcdefghijklmnopqrstuvwxyz12345", ZINT_ERROR_INVALID_DATA, "" }, - /* 64*/ { "[251]abcdefghijklmnopqrstuvwxyz1234", 0, "251abcdefghijklmnopqrstuvwxyz1234" }, - /* 65*/ { "[251]abcdefghijklmnopqrstuvwxyz12345", ZINT_ERROR_INVALID_DATA, "" }, - /* 66*/ { "[252]1234", ZINT_ERROR_INVALID_DATA, "" }, - /* 67*/ { "[253]131313131313", ZINT_ERROR_INVALID_DATA, "" }, - /* 68*/ { "[253]1313131313134", 0, "2531313131313134" }, - /* 69*/ { "[253]131313131313412345678901234567", 0, "253131313131313412345678901234567" }, - /* 70*/ { "[253]1313131313134123456789012345678", ZINT_ERROR_INVALID_DATA, "" }, - /* 71*/ { "[254]abcdefghijklmnopqrst", 0, "254abcdefghijklmnopqrst" }, - /* 72*/ { "[254]abcdefghijklmnopqrstu", ZINT_ERROR_INVALID_DATA, "" }, - /* 73*/ { "[255]131313131313", ZINT_ERROR_INVALID_DATA, "" }, - /* 74*/ { "[255]1313131313134", 0, "2551313131313134" }, - /* 75*/ { "[255]1313131313134123456789012", 0, "2551313131313134123456789012" }, - /* 76*/ { "[255]13131313131341234567890123", ZINT_ERROR_INVALID_DATA, "" }, - /* 77*/ { "[256]1234", ZINT_ERROR_INVALID_DATA, "" }, - /* 78*/ { "[259]1234", ZINT_ERROR_INVALID_DATA, "" }, - /* 79*/ { "[26]1234", ZINT_ERROR_INVALID_DATA, "" }, - /* 80*/ { "[27]1234", ZINT_ERROR_INVALID_DATA, "" }, - /* 81*/ { "[28]1234", ZINT_ERROR_INVALID_DATA, "" }, - /* 82*/ { "[29]1234", ZINT_ERROR_INVALID_DATA, "" }, - /* 83*/ { "[30]12345678", 0, "3012345678" }, - /* 84*/ { "[30]123456789", ZINT_ERROR_INVALID_DATA, "" }, - /* 85*/ { "[3000]1234", ZINT_ERROR_INVALID_DATA, "" }, - /* 86*/ { "[31]123456", ZINT_ERROR_INVALID_DATA, "" }, - /* 87*/ { "[3100]123456", 0, "3100123456" }, - /* 88*/ { "[3100]12345", ZINT_ERROR_INVALID_DATA, "" }, - /* 89*/ { "[3101]123456", 0, "3101123456" }, - /* 90*/ { "[3101]12345", ZINT_ERROR_INVALID_DATA, "" }, - /* 91*/ { "[3109]123456", 0, "3109123456" }, - /* 92*/ { "[3110]123456", 0, "3110123456" }, - /* 93*/ { "[3110]12345", ZINT_ERROR_INVALID_DATA, "" }, - /* 94*/ { "[3119]123456", 0, "3119123456" }, - /* 95*/ { "[3120]123456", 0, "3120123456" }, - /* 96*/ { "[3120]1234567", ZINT_ERROR_INVALID_DATA, "" }, - /* 97*/ { "[3129]123456", 0, "3129123456" }, - /* 98*/ { "[3130]123456", 0, "3130123456" }, - /* 99*/ { "[3130]1234567", ZINT_ERROR_INVALID_DATA, "" }, - /*100*/ { "[3139]123456", 0, "3139123456" }, - /*101*/ { "[3140]123456", 0, "3140123456" }, - /*102*/ { "[3140]1234567", ZINT_ERROR_INVALID_DATA, "" }, - /*103*/ { "[3149]123456", 0, "3149123456" }, - /*104*/ { "[3150]123456", 0, "3150123456" }, - /*105*/ { "[3150]1234567", ZINT_ERROR_INVALID_DATA, "" }, - /*106*/ { "[3159]123456", 0, "3159123456" }, - /*107*/ { "[3160]123456", 0, "3160123456" }, - /*108*/ { "[3160]1234567", ZINT_ERROR_INVALID_DATA, "" }, - /*109*/ { "[3169]123456", 0, "3169123456" }, - /*110*/ { "[3170]123456", ZINT_ERROR_INVALID_DATA, "" }, - /*111*/ { "[3180]123456", ZINT_ERROR_INVALID_DATA, "" }, - /*112*/ { "[3190]123456", ZINT_ERROR_INVALID_DATA, "" }, - /*113*/ { "[32]123456", ZINT_ERROR_INVALID_DATA, "" }, - /*114*/ { "[3200]123456", 0, "3200123456" }, - /*115*/ { "[3200]1234567", ZINT_ERROR_INVALID_DATA, "" }, - /*116*/ { "[3210]123456", 0, "3210123456" }, - /*117*/ { "[3210]1234567", ZINT_ERROR_INVALID_DATA, "" }, - /*118*/ { "[3220]123456", 0, "3220123456" }, - /*119*/ { "[3220]1234567", ZINT_ERROR_INVALID_DATA, "" }, - /*120*/ { "[3230]123456", 0, "3230123456" }, - /*121*/ { "[3240]123456", 0, "3240123456" }, - /*122*/ { "[3250]123456", 0, "3250123456" }, - /*123*/ { "[3260]123456", 0, "3260123456" }, - /*124*/ { "[3270]123456", 0, "3270123456" }, - /*125*/ { "[3280]123456", 0, "3280123456" }, - /*126*/ { "[3290]123456", 0, "3290123456" }, - /*127*/ { "[3290]1234567", ZINT_ERROR_INVALID_DATA, "" }, - /*128*/ { "[3299]123456", 0, "3299123456" }, - /*129*/ { "[33]123456", ZINT_ERROR_INVALID_DATA, "" }, - /*130*/ { "[3300]123456", 0, "3300123456" }, - /*131*/ { "[3300]1234567", ZINT_ERROR_INVALID_DATA, "" }, - /*132*/ { "[3310]123456", 0, "3310123456" }, - /*133*/ { "[3310]1234567", ZINT_ERROR_INVALID_DATA, "" }, - /*134*/ { "[3320]123456", 0, "3320123456" }, - /*135*/ { "[3330]123456", 0, "3330123456" }, - /*136*/ { "[3340]123456", 0, "3340123456" }, - /*137*/ { "[3350]123456", 0, "3350123456" }, - /*138*/ { "[3360]123456", 0, "3360123456" }, - /*139*/ { "[3370]123456", 0, "3370123456" }, - /*140*/ { "[3370]1234567", ZINT_ERROR_INVALID_DATA, "" }, - /*141*/ { "[3379]123456", 0, "3379123456" }, - /*142*/ { "[3380]123456", ZINT_ERROR_INVALID_DATA, "" }, - /*143*/ { "[3390]123456", ZINT_ERROR_INVALID_DATA, "" }, - /*144*/ { "[34]123456", ZINT_ERROR_INVALID_DATA, "" }, - /*145*/ { "[3400]123456", 0, "3400123456" }, - /*146*/ { "[3400]12345", ZINT_ERROR_INVALID_DATA, "" }, - /*147*/ { "[3410]123456", 0, "3410123456" }, - /*148*/ { "[3410]12345", ZINT_ERROR_INVALID_DATA, "" }, - /*149*/ { "[3420]123456", 0, "3420123456" }, - /*150*/ { "[3430]123456", 0, "3430123456" }, - /*151*/ { "[3440]123456", 0, "3440123456" }, - /*152*/ { "[3450]123456", 0, "3450123456" }, - /*153*/ { "[3460]123456", 0, "3460123456" }, - /*154*/ { "[3470]123456", 0, "3470123456" }, - /*155*/ { "[3480]123456", 0, "3480123456" }, - /*156*/ { "[3490]123456", 0, "3490123456" }, - /*157*/ { "[3490]12345", ZINT_ERROR_INVALID_DATA, "" }, - /*158*/ { "[3499]123456", 0, "3499123456" }, - /*159*/ { "[35]123456", ZINT_ERROR_INVALID_DATA, "" }, - /*160*/ { "[3500]123456", 0, "3500123456" }, - /*161*/ { "[3500]1234567", ZINT_ERROR_INVALID_DATA, "" }, - /*162*/ { "[3510]123456", 0, "3510123456", }, - /*163*/ { "[3510]1234567", ZINT_ERROR_INVALID_DATA, "" }, - /*164*/ { "[3520]123456", 0, "3520123456", }, - /*165*/ { "[3530]123456", 0, "3530123456", }, - /*166*/ { "[3540]123456", 0, "3540123456", }, - /*167*/ { "[3550]123456", 0, "3550123456", }, - /*168*/ { "[3560]123456", 0, "3560123456", }, - /*169*/ { "[3570]123456", 0, "3570123456", }, - /*170*/ { "[3579]123456", 0, "3579123456" }, - /*171*/ { "[3580]123456", ZINT_ERROR_INVALID_DATA, "" }, - /*172*/ { "[3590]123456", ZINT_ERROR_INVALID_DATA, "" }, - /*173*/ { "[36]123456", ZINT_ERROR_INVALID_DATA, "" }, - /*174*/ { "[3600]123456", 0, "3600123456" }, - /*175*/ { "[3600]12345", ZINT_ERROR_INVALID_DATA, "" }, - /*176*/ { "[3610]123456", 0, "3610123456" }, - /*177*/ { "[3610]12345", ZINT_ERROR_INVALID_DATA, "" }, - /*178*/ { "[3620]123456", 0, "3620123456", }, - /*179*/ { "[3630]123456", 0, "3630123456", }, - /*180*/ { "[3640]123456", 0, "3640123456", }, - /*181*/ { "[3650]123456", 0, "3650123456", }, - /*182*/ { "[3660]123456", 0, "3660123456", }, - /*183*/ { "[3670]123456", 0, "3670123456", }, - /*184*/ { "[3680]123456", 0, "3680123456", }, - /*185*/ { "[3680]123456", 0, "3680123456", }, - /*186*/ { "[3680]12345", ZINT_ERROR_INVALID_DATA, "" }, - /*187*/ { "[3690]123456", 0, "3690123456" }, - /*188*/ { "[3699]123456", 0, "3699123456" }, - /*189*/ { "[37]12345678", 0, "3712345678" }, - /*190*/ { "[37]123456789", ZINT_ERROR_INVALID_DATA, "" }, - /*191*/ { "[3700]12345678", ZINT_ERROR_INVALID_DATA, "" }, - /*192*/ { "[38]123456", ZINT_ERROR_INVALID_DATA, "" }, - /*193*/ { "[3800]123456", ZINT_ERROR_INVALID_DATA, "" }, - /*194*/ { "[39]123456", ZINT_ERROR_INVALID_DATA, "" }, - /*195*/ { "[3900]123456789012345", 0, "3900123456789012345" }, - /*196*/ { "[3900]1234567890123456", ZINT_ERROR_INVALID_DATA, "" }, - /*197*/ { "[3909]123456789012345", 0, "3909123456789012345" }, - /*198*/ { "[3910]123123456789012345", 0, "3910123123456789012345" }, - /*199*/ { "[3910]1231234567890123456", ZINT_ERROR_INVALID_DATA, "" }, - /*200*/ { "[3910]123", ZINT_ERROR_INVALID_DATA, "" }, - /*201*/ { "[3920]123456789012345", 0, "3920123456789012345" }, - /*202*/ { "[3920]1234567890123456", ZINT_ERROR_INVALID_DATA, "" }, - /*203*/ { "[3930]123123456789012345", 0, "3930123123456789012345" }, - /*204*/ { "[3930]1231234567890123456", ZINT_ERROR_INVALID_DATA, "" }, - /*205*/ { "[3930]123", ZINT_ERROR_INVALID_DATA, "" }, - /*206*/ { "[3940]1234", 0, "39401234" }, - /*207*/ { "[3940]12345", ZINT_ERROR_INVALID_DATA, "" }, - /*208*/ { "[3940]123", ZINT_ERROR_INVALID_DATA, "" }, - /*209*/ { "[3949]1234", 0, "39491234" }, - /*210*/ { "[3950]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*211*/ { "[3960]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*212*/ { "[3970]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*213*/ { "[3980]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*214*/ { "[3999]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*215*/ { "[40]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*216*/ { "[400]123456789012345678901234567890", 0, "400123456789012345678901234567890" }, - /*217*/ { "[400]1234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" }, - /*218*/ { "[401]1234abcdefghijklmnopqrstuvwxyz", 0, "4011234abcdefghijklmnopqrstuvwxyz" }, - /*219*/ { "[401]1234abcdefghijklmnopqrstuvwxyz1", ZINT_ERROR_INVALID_DATA, "" }, - /*220*/ { "[402]13131313131313132", 0, "40213131313131313132" }, - /*221*/ { "[402]1313131313131313", ZINT_ERROR_INVALID_DATA, "" }, - /*222*/ { "[403]abcdefghijklmnopqrstuvwxyz1234", 0, "403abcdefghijklmnopqrstuvwxyz1234" }, - /*223*/ { "[403]abcdefghijklmnopqrstuvwxyz12345", ZINT_ERROR_INVALID_DATA, "" }, - /*224*/ { "[404]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*225*/ { "[409]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*226*/ { "[410]3898765432108", 0, "4103898765432108" }, - /*227*/ { "[410]12345678901234", ZINT_ERROR_INVALID_DATA, "" }, - /*228*/ { "[411]1313131313134", 0, "4111313131313134" }, - /*229*/ { "[411]13131313131", ZINT_ERROR_INVALID_DATA, "" }, - /*230*/ { "[412]1313131313134", 0, "4121313131313134" }, - /*231*/ { "[412]13131313131", ZINT_ERROR_INVALID_DATA, "" }, - /*232*/ { "[413]1313131313134", 0, "4131313131313134" }, - /*233*/ { "[413]13131313131", ZINT_ERROR_INVALID_DATA, "" }, - /*234*/ { "[414]1313131313134", 0, "4141313131313134" }, - /*235*/ { "[414]13131313131", ZINT_ERROR_INVALID_DATA, "" }, - /*236*/ { "[415]1313131313134", 0, "4151313131313134" }, - /*237*/ { "[415]13131313131", ZINT_ERROR_INVALID_DATA, "" }, - /*238*/ { "[416]1313131313134", 0, "4161313131313134" }, - /*239*/ { "[416]13131313131", ZINT_ERROR_INVALID_DATA, "" }, - /*240*/ { "[417]1313131313134", 0, "4171313131313134" }, - /*241*/ { "[417]13131313131", ZINT_ERROR_INVALID_DATA, "" }, - /*242*/ { "[418]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*243*/ { "[419]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*244*/ { "[420]abcdefghijklmnopqrst", 0, "420abcdefghijklmnopqrst" }, - /*245*/ { "[420]abcdefghijklmnopqrstu", ZINT_ERROR_INVALID_DATA, "" }, - /*246*/ { "[421]123abcdefghi", 0, "421123abcdefghi" }, - /*247*/ { "[421]123abcdefghij", ZINT_ERROR_INVALID_DATA, "" }, - /*248*/ { "[422]123", 0, "422123" }, - /*249*/ { "[422]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*250*/ { "[422]12", ZINT_ERROR_INVALID_DATA, "" }, - /*251*/ { "[423]123123123123123", 0, "423123123123123123" }, - /*252*/ { "[423]1231231231231231", ZINT_ERROR_INVALID_DATA, "" }, - /*253*/ { "[423]12", ZINT_ERROR_INVALID_DATA, "" }, - /*254*/ { "[424]123", 0, "424123" }, - /*255*/ { "[424]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*256*/ { "[424]12", ZINT_ERROR_INVALID_DATA, "" }, - /*257*/ { "[425]123123123123123", 0, "425123123123123123" }, - /*258*/ { "[425]1231231231231231", ZINT_ERROR_INVALID_DATA, "" }, - /*259*/ { "[425]12", ZINT_ERROR_INVALID_DATA, "" }, - /*260*/ { "[426]123", 0, "426123" }, - /*261*/ { "[426]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*262*/ { "[426]12", ZINT_ERROR_INVALID_DATA, "" }, - /*263*/ { "[427]abc", 0, "427abc" }, - /*264*/ { "[427]abcd", ZINT_ERROR_INVALID_DATA, "" }, - /*265*/ { "[428]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*266*/ { "[429]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*267*/ { "[430]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*268*/ { "[499]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*269*/ { "[50]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*270*/ { "[500]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*271*/ { "[5000]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*272*/ { "[51]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*273*/ { "[59]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*274*/ { "[60]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*275*/ { "[600]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*276*/ { "[6000]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*277*/ { "[61]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*278*/ { "[69]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*279*/ { "[70]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*280*/ { "[700]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*281*/ { "[7000]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*282*/ { "[7001]1234567890123", 0, "70011234567890123" }, - /*283*/ { "[7001]123456789012", ZINT_ERROR_INVALID_DATA, "" }, - /*284*/ { "[7002]abcdefghijklmnopqrstuvwxyz1234", 0, "7002abcdefghijklmnopqrstuvwxyz1234" }, - /*285*/ { "[7002]abcdefghijklmnopqrstuvwxyz12345", ZINT_ERROR_INVALID_DATA, "" }, - /*286*/ { "[7003]1212121212", 0, "70031212121212" }, - /*287*/ { "[7003]121212121", ZINT_ERROR_INVALID_DATA, "" }, - /*288*/ { "[7004]1234", 0, "70041234" }, - /*289*/ { "[7004]12345", ZINT_ERROR_INVALID_DATA, "" }, - /*290*/ { "[7005]abcdefghijkl", 0, "7005abcdefghijkl" }, - /*291*/ { "[7005]abcdefghijklm", ZINT_ERROR_INVALID_DATA, "" }, - /*292*/ { "[7006]200132", 0, "7006200132" }, - /*293*/ { "[7006]2001320", ZINT_ERROR_INVALID_DATA, "" }, - /*294*/ { "[7007]010101121212", 0, "7007010101121212" }, - /*295*/ { "[7007]01010112121", ZINT_ERROR_INVALID_DATA, "" }, - /*296*/ { "[7007]121212", 0, "7007121212" }, - /*297*/ { "[7007]12121", ZINT_ERROR_INVALID_DATA, "" }, - /*298*/ { "[7007]1212121", ZINT_ERROR_INVALID_DATA, "" }, - /*299*/ { "[7008]abc", 0, "7008abc" }, - /*300*/ { "[7008]abcd", ZINT_ERROR_INVALID_DATA, "" }, - /*301*/ { "[7009]abcdefghij", 0, "7009abcdefghij" }, - /*302*/ { "[7009]abcdefghijk", ZINT_ERROR_INVALID_DATA, "" }, - /*303*/ { "[7010]01", 0, "701001" }, - /*304*/ { "[7010]1", 0, "70101" }, - /*305*/ { "[7010]012", ZINT_ERROR_INVALID_DATA, "" }, - /*306*/ { "[7011]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*307*/ { "[7012]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*308*/ { "[7019]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*309*/ { "[7020]abcdefghijklmnopqrst", 0, "7020abcdefghijklmnopqrst" }, - /*310*/ { "[7020]abcdefghijklmnopqrstu", ZINT_ERROR_INVALID_DATA, "" }, - /*311*/ { "[7021]abcdefghijklmnopqrst", 0, "7021abcdefghijklmnopqrst" }, - /*312*/ { "[7021]abcdefghijklmnopqrstu", ZINT_ERROR_INVALID_DATA, "" }, - /*313*/ { "[7022]abcdefghijklmnopqrst", 0, "7022abcdefghijklmnopqrst" }, - /*314*/ { "[7022]abcdefghijklmnopqrstu", ZINT_ERROR_INVALID_DATA, "" }, - /*315*/ { "[7023]1234abcdefghijklmnopqrstuvwxyz", 0, "70231234abcdefghijklmnopqrstuvwxyz" }, - /*316*/ { "[7023]1234abcdefghijklmnopqrstuvwxyza", ZINT_ERROR_INVALID_DATA, "" }, - /*317*/ { "[7024]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*318*/ { "[7025]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*319*/ { "[7029]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*320*/ { "[7030]123abcdefghijklmnopqrstuvwxyza", 0, "7030123abcdefghijklmnopqrstuvwxyza" }, - /*321*/ { "[7030]123abcdefghijklmnopqrstuvwxyzab", ZINT_ERROR_INVALID_DATA, "" }, - /*322*/ { "[7031]123abcdefghijklmnopqrstuvwxyza", 0, "7031123abcdefghijklmnopqrstuvwxyza" }, - /*323*/ { "[7031]123abcdefghijklmnopqrstuvwxyzab", ZINT_ERROR_INVALID_DATA, "" }, - /*324*/ { "[7032]123abcdefghijklmnopqrstuvwxyza", 0, "7032123abcdefghijklmnopqrstuvwxyza" }, - /*325*/ { "[7033]123abcdefghijklmnopqrstuvwxyza", 0, "7033123abcdefghijklmnopqrstuvwxyza" }, - /*326*/ { "[7034]123abcdefghijklmnopqrstuvwxyza", 0, "7034123abcdefghijklmnopqrstuvwxyza" }, - /*327*/ { "[7035]123abcdefghijklmnopqrstuvwxyza", 0, "7035123abcdefghijklmnopqrstuvwxyza" }, - /*328*/ { "[7036]123abcdefghijklmnopqrstuvwxyza", 0, "7036123abcdefghijklmnopqrstuvwxyza" }, - /*329*/ { "[7037]123abcdefghijklmnopqrstuvwxyza", 0, "7037123abcdefghijklmnopqrstuvwxyza" }, - /*330*/ { "[7038]123abcdefghijklmnopqrstuvwxyza", 0, "7038123abcdefghijklmnopqrstuvwxyza" }, - /*331*/ { "[7039]123abcdefghijklmnopqrstuvwxyza", 0, "7039123abcdefghijklmnopqrstuvwxyza" }, - /*332*/ { "[7039]123abcdefghijklmnopqrstuvwxyzab", ZINT_ERROR_INVALID_DATA, "" }, - /*333*/ { "[7040]1abc", 0, "70401abc" }, - /*334*/ { "[7040]1ab", ZINT_ERROR_INVALID_DATA, "" }, - /*335*/ { "[7040]1abcd", ZINT_ERROR_INVALID_DATA, "" }, - /*336*/ { "[7041]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*337*/ { "[7042]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*338*/ { "[7050]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*339*/ { "[7090]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*340*/ { "[7099]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*341*/ { "[71]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*342*/ { "[710]abcdefghijklmnopqrst", 0, "710abcdefghijklmnopqrst" }, - /*343*/ { "[710]abcdefghijklmnopqrstu", ZINT_ERROR_INVALID_DATA, "" }, - /*344*/ { "[711]abcdefghijklmnopqrst", 0, "711abcdefghijklmnopqrst" }, - /*345*/ { "[711]abcdefghijklmnopqrstu", ZINT_ERROR_INVALID_DATA, "" }, - /*346*/ { "[712]abcdefghijklmnopqrst", 0, "712abcdefghijklmnopqrst" }, - /*347*/ { "[712]abcdefghijklmnopqrstu", ZINT_ERROR_INVALID_DATA, "" }, - /*348*/ { "[713]abcdefghijklmnopqrst", 0, "713abcdefghijklmnopqrst" }, - /*349*/ { "[713]abcdefghijklmnopqrstu", ZINT_ERROR_INVALID_DATA, "" }, - /*350*/ { "[714]abcdefghijklmnopqrst", 0, "714abcdefghijklmnopqrst" }, - /*351*/ { "[714]abcdefghijklmnopqrstu", ZINT_ERROR_INVALID_DATA, "" }, - /*352*/ { "[715]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*353*/ { "[716]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*354*/ { "[719]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*355*/ { "[7100]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*356*/ { "[72]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*357*/ { "[7200]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*358*/ { "[7210]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*359*/ { "[7220]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*360*/ { "[7230]EMabcdefghijklmnopqrstuvwxyzab", 0, "7230EMabcdefghijklmnopqrstuvwxyzab" }, - /*361*/ { "[7230]EMabcdefghijklmnopqrstuvwxyzabc", ZINT_ERROR_INVALID_DATA, "" }, - /*362*/ { "[7230]EM", ZINT_ERROR_INVALID_DATA, "" }, - /*363*/ { "[7231]EMabcdefghijklmnopqrstuvwxyzab", 0, "7231EMabcdefghijklmnopqrstuvwxyzab" }, - /*364*/ { "[7232]EMabcdefghijklmnopqrstuvwxyzab", 0, "7232EMabcdefghijklmnopqrstuvwxyzab" }, - /*365*/ { "[7233]EMabcdefghijklmnopqrstuvwxyzab", 0, "7233EMabcdefghijklmnopqrstuvwxyzab" }, - /*366*/ { "[7234]EMabcdefghijklmnopqrstuvwxyzab", 0, "7234EMabcdefghijklmnopqrstuvwxyzab" }, - /*367*/ { "[7235]EMabcdefghijklmnopqrstuvwxyzab", 0, "7235EMabcdefghijklmnopqrstuvwxyzab" }, - /*368*/ { "[7236]EMabcdefghijklmnopqrstuvwxyzab", 0, "7236EMabcdefghijklmnopqrstuvwxyzab" }, - /*369*/ { "[7237]EMabcdefghijklmnopqrstuvwxyzab", 0, "7237EMabcdefghijklmnopqrstuvwxyzab" }, - /*370*/ { "[7238]EMabcdefghijklmnopqrstuvwxyzab", 0, "7238EMabcdefghijklmnopqrstuvwxyzab" }, - /*371*/ { "[7239]EMabcdefghijklmnopqrstuvwxyzab", 0, "7239EMabcdefghijklmnopqrstuvwxyzab" }, - /*372*/ { "[7239]E", ZINT_ERROR_INVALID_DATA, "" }, - /*373*/ { "[7240]abcdefghijklmnopqrst", 0, "7240abcdefghijklmnopqrst" }, - /*374*/ { "[7240]abcdefghijklmnopqrstu", ZINT_ERROR_INVALID_DATA, "" }, - /*375*/ { "[7241]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*376*/ { "[7249]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*377*/ { "[7250]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*378*/ { "[7299]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*379*/ { "[73]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*380*/ { "[7300]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*381*/ { "[74]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*382*/ { "[7400]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*383*/ { "[79]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*384*/ { "[7900]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*385*/ { "[7999]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*386*/ { "[80]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*387*/ { "[800]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*388*/ { "[8000]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*389*/ { "[8001]12345678901234", 0, "800112345678901234" }, - /*390*/ { "[8001]1234123456789012345", ZINT_ERROR_INVALID_DATA, "" }, - /*391*/ { "[8002]abcdefghijklmnopqrst", 0, "8002abcdefghijklmnopqrst" }, - /*392*/ { "[8002]abcdefghijklmnopqrstuv", ZINT_ERROR_INVALID_DATA, "" }, - /*393*/ { "[8003]01234567890123abcdefghijklmnop", 0, "800301234567890123abcdefghijklmnop" }, - /*394*/ { "[8004]abcdefghijklmnopqrstuvwxyz1234", 0, "8004abcdefghijklmnopqrstuvwxyz1234" }, - /*395*/ { "[8004]abcdefghijklmnopqrstuvwxyz12345", ZINT_ERROR_INVALID_DATA, "" }, - /*396*/ { "[8005]123456", 0, "8005123456" }, - /*397*/ { "[8005]12345", ZINT_ERROR_INVALID_DATA, "" }, - /*398*/ { "[8005]1234567", ZINT_ERROR_INVALID_DATA, "" }, - /*399*/ { "[8006]123456789012341212", 0, "8006123456789012341212" }, - /*400*/ { "[8006]12345678901234121", ZINT_ERROR_INVALID_DATA, "" }, - /*401*/ { "[8006]1234567890123412123", ZINT_ERROR_INVALID_DATA, "" }, - /*402*/ { "[8007]abcdefghijklmnopqrstuvwxyz12345678", 0, "8007abcdefghijklmnopqrstuvwxyz12345678" }, - /*403*/ { "[8007]abcdefghijklmnopqrstuvwxyz123456789", ZINT_ERROR_INVALID_DATA, "" }, - /*404*/ { "[8008]123456121212", 0, "8008123456121212" }, - /*405*/ { "[8008]1234561212", 0, "80081234561212" }, - /*406*/ { "[8008]12345612", 0, "800812345612" }, - /*407*/ { "[8008]1234561", ZINT_ERROR_INVALID_DATA, "" }, - /*408*/ { "[8008]123456121", ZINT_ERROR_INVALID_DATA, "" }, - /*409*/ { "[8008]12345612121", ZINT_ERROR_INVALID_DATA, "" }, - /*410*/ { "[8008]1234561212123", ZINT_ERROR_INVALID_DATA, "" }, - /*411*/ { "[8009]12345678901234567890123456789012345678901234567890", 0, "800912345678901234567890123456789012345678901234567890" }, - /*412*/ { "[8009]123456789012345678901234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" }, - /*413*/ { "[8010]1234abcdefghijklmnopqrstuvwxyz1", ZINT_ERROR_INVALID_DATA, "" }, - /*414*/ { "[8011]123456789012", 0, "8011123456789012" }, - /*415*/ { "[8011]1234567890123", ZINT_ERROR_INVALID_DATA, "" }, - /*416*/ { "[8012]abcdefghijklmnopqrst", 0, "8012abcdefghijklmnopqrst" }, - /*417*/ { "[8012]abcdefghijklmnopqrstuv", ZINT_ERROR_INVALID_DATA, "" }, - /*418*/ { "[8013]1234abcdefghijklmnopqrstuvwxyz", 0, "80131234abcdefghijklmnopqrstuvwxyz" }, - /*419*/ { "[8013]1234abcdefghijklmnopqrstuvwxyz1", ZINT_ERROR_INVALID_DATA, "" }, - /*420*/ { "[8014]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*421*/ { "[8016]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*422*/ { "[8017]313131313131313139", 0, "8017313131313131313139" }, - /*423*/ { "[8017]31313131313131313", ZINT_ERROR_INVALID_DATA, "" }, - /*424*/ { "[8017]3131313131313131390", ZINT_ERROR_INVALID_DATA, "" }, - /*425*/ { "[8018]313131313131313139", 0, "8018313131313131313139" }, - /*426*/ { "[8018]31313131313131313", ZINT_ERROR_INVALID_DATA, "" }, - /*427*/ { "[8018]3131313131313131390", ZINT_ERROR_INVALID_DATA, "" }, - /*428*/ { "[8019]1234567890", 0, "80191234567890" }, - /*429*/ { "[8019]12345678901", ZINT_ERROR_INVALID_DATA, "" }, - /*430*/ { "[8020]abcdefghijklmnopqrstuvwxy", 0, "8020abcdefghijklmnopqrstuvwxy" }, - /*431*/ { "[8020]abcdefghijklmnopqrstuvwxyz", ZINT_ERROR_INVALID_DATA, "" }, - /*432*/ { "[8021]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*433*/ { "[8025]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*434*/ { "[8026]123456789012341212", 0, "8026123456789012341212" }, - /*435*/ { "[8026]1234567890123451212", ZINT_ERROR_INVALID_DATA, "" }, - /*436*/ { "[8026]12345678901234512", ZINT_ERROR_INVALID_DATA, "" }, - /*437*/ { "[8027]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*438*/ { "[8030]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*439*/ { "[8040]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*440*/ { "[8090]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*441*/ { "[8099]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*442*/ { "[81]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*443*/ { "[8100]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*444*/ { "[8109]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*445*/ { "[8110]1234567890123456789012345678901234567890123456789012345678901234567890", 0, "81101234567890123456789012345678901234567890123456789012345678901234567890" }, - /*446*/ { "[8110]12345678901234567890123456789012345678901234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" }, - /*447*/ { "[8111]1234", 0, "81111234" }, - /*448*/ { "[8111]12345", ZINT_ERROR_INVALID_DATA, "" }, - /*449*/ { "[8111]123", ZINT_ERROR_INVALID_DATA, "" }, - /*450*/ { "[8112]1234567890123456789012345678901234567890123456789012345678901234567890", 0, "81121234567890123456789012345678901234567890123456789012345678901234567890" }, - /*451*/ { "[8112]12345678901234567890123456789012345678901234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" }, - /*452*/ { "[8113]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*453*/ { "[8120]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*454*/ { "[8190]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*455*/ { "[8199]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*456*/ { "[82]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*457*/ { "[8200]1234567890123456789012345678901234567890123456789012345678901234567890", 0, "82001234567890123456789012345678901234567890123456789012345678901234567890" }, - /*458*/ { "[8201]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*459*/ { "[8210]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*460*/ { "[8290]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*461*/ { "[8299]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*462*/ { "[83]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*463*/ { "[8300]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*464*/ { "[89]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*465*/ { "[8900]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*466*/ { "[90]abcdefghijklmnopqrstuvwxyz1234", 0, "90abcdefghijklmnopqrstuvwxyz1234" }, - /*467*/ { "[9000]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*468*/ { "[90]abcdefghijklmnopqrstuvwxyz12345", ZINT_ERROR_INVALID_DATA, "" }, - /*469*/ { "[91]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890", 0, "91123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" }, - /*470*/ { "[91]1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" }, - /*471*/ { "[92]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890", 0, "92123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" }, - /*472*/ { "[92]1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" }, - /*473*/ { "[93]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890", 0, "93123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" }, - /*474*/ { "[93]1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" }, - /*475*/ { "[94]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890", 0, "94123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" }, - /*476*/ { "[94]1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" }, - /*477*/ { "[98]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890", 0, "98123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" }, - /*478*/ { "[98]1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" }, - /*479*/ { "[99]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890", 0, "99123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" }, - /*480*/ { "[99]1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" }, - /*481*/ { "[9900]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*482*/ { "[9999]1234", ZINT_ERROR_INVALID_DATA, "" }, - /*483*/ { "[01]12345678901234[7006]200101", 0, "01123456789012347006200101" }, - /*484*/ { "[3900]1234567890[01]12345678901234", 0, "39001234567890[0112345678901234" }, - /*485*/ { "[253]12345678901234[3901]12345678901234[20]12", 0, "25312345678901234[390112345678901234[2012" }, - /*486*/ { "[253]12345678901234[01]12345678901234[3901]12345678901234[20]12", 0, "25312345678901234[0112345678901234390112345678901234[2012" }, + /* 9*/ { "[00]123456789012345678", ZINT_WARN_NONCOMPLIANT, "00123456789012345678" }, + /* 10*/ { "[00]123456789012345675", 0, "00123456789012345675" }, + /* 11*/ { "[00]12345678901234567", ZINT_ERROR_INVALID_DATA, "" }, + /* 12*/ { "[01]12345678901234", ZINT_WARN_NONCOMPLIANT, "0112345678901234" }, + /* 13*/ { "[01]12345678901231", 0, "0112345678901231" }, + /* 14*/ { "[01]123456789012345", ZINT_ERROR_INVALID_DATA, "" }, + /* 15*/ { "[02]12345678901234", ZINT_WARN_NONCOMPLIANT, "0212345678901234" }, + /* 16*/ { "[02]12345678901231", 0, "0212345678901231" }, + /* 17*/ { "[02]1234567890123", ZINT_ERROR_INVALID_DATA, "" }, + /* 18*/ { "[03]12345678901234", ZINT_ERROR_INVALID_DATA, "" }, + /* 19*/ { "[04]1234", ZINT_ERROR_INVALID_DATA, "" }, + /* 20*/ { "[05]1234", ZINT_ERROR_INVALID_DATA, "" }, + /* 21*/ { "[06]1234", ZINT_ERROR_INVALID_DATA, "" }, + /* 22*/ { "[07]1234", ZINT_ERROR_INVALID_DATA, "" }, + /* 23*/ { "[08]1234", ZINT_ERROR_INVALID_DATA, "" }, + /* 24*/ { "[09]1234", ZINT_ERROR_INVALID_DATA, "" }, + /* 25*/ { "[10]ABCD123456", 0, "10ABCD123456" }, + /* 26*/ { "[10]123456789012345678901", ZINT_ERROR_INVALID_DATA, "" }, + /* 27*/ { "[100]1234", ZINT_ERROR_INVALID_DATA, "" }, + /* 28*/ { "[1000]1234", ZINT_ERROR_INVALID_DATA, "" }, + /* 29*/ { "[11]990102", 0, "11990102" }, + /* 30*/ { "[11]9901023", ZINT_ERROR_INVALID_DATA, "" }, + /* 31*/ { "[110]990102", ZINT_ERROR_INVALID_DATA, "" }, + /* 32*/ { "[1100]990102", ZINT_ERROR_INVALID_DATA, "" }, + /* 33*/ { "[12]000100", 0, "12000100" }, + /* 34*/ { "[12]00010", ZINT_ERROR_INVALID_DATA, "" }, + /* 35*/ { "[120]000100", ZINT_ERROR_INVALID_DATA, "" }, + /* 36*/ { "[1200]000100", ZINT_ERROR_INVALID_DATA, "" }, + /* 37*/ { "[13]991301", ZINT_WARN_NONCOMPLIANT, "13991301" }, + /* 38*/ { "[13]991201", 0, "13991201" }, + /* 39*/ { "[13]9913011", ZINT_ERROR_INVALID_DATA, "" }, + /* 40*/ { "[130]991301", ZINT_ERROR_INVALID_DATA, "" }, + /* 41*/ { "[1300]991301", ZINT_ERROR_INVALID_DATA, "" }, + /* 42*/ { "[14]1234", ZINT_ERROR_INVALID_DATA, "" }, + /* 43*/ { "[140]1234", ZINT_ERROR_INVALID_DATA, "" }, + /* 44*/ { "[1400]1234", ZINT_ERROR_INVALID_DATA, "" }, + /* 45*/ { "[15]021231", 0, "15021231" }, + /* 46*/ { "[15]02123", ZINT_ERROR_INVALID_DATA, "" }, + /* 47*/ { "[150]021231", ZINT_ERROR_INVALID_DATA, "" }, + /* 48*/ { "[1500]021231", ZINT_ERROR_INVALID_DATA, "" }, + /* 49*/ { "[16]000000", ZINT_WARN_NONCOMPLIANT, "16000000" }, + /* 50*/ { "[16]000100", 0, "16000100" }, + /* 51*/ { "[16]00000", ZINT_ERROR_INVALID_DATA, "" }, + /* 52*/ { "[160]000000", ZINT_ERROR_INVALID_DATA, "" }, + /* 53*/ { "[1600]000000", ZINT_ERROR_INVALID_DATA, "" }, + /* 54*/ { "[17]010200", 0, "17010200" }, + /* 55*/ { "[17]0102000", ZINT_ERROR_INVALID_DATA, "" }, + /* 56*/ { "[170]010200", ZINT_ERROR_INVALID_DATA, "" }, + /* 57*/ { "[1700]010200", ZINT_ERROR_INVALID_DATA, "" }, + /* 58*/ { "[18]1234", ZINT_ERROR_INVALID_DATA, "" }, + /* 59*/ { "[180]1234", ZINT_ERROR_INVALID_DATA, "" }, + /* 60*/ { "[1800]1234", ZINT_ERROR_INVALID_DATA, "" }, + /* 61*/ { "[19]1234", ZINT_ERROR_INVALID_DATA, "" }, + /* 62*/ { "[190]1234", ZINT_ERROR_INVALID_DATA, "" }, + /* 63*/ { "[1900]1234", ZINT_ERROR_INVALID_DATA, "" }, + /* 64*/ { "[20]12", 0, "2012" }, + /* 65*/ { "[20]1", ZINT_ERROR_INVALID_DATA, "" }, + /* 66*/ { "[200]12", ZINT_ERROR_INVALID_DATA, "" }, + /* 67*/ { "[2000]12", ZINT_ERROR_INVALID_DATA, "" }, + /* 68*/ { "[21]A12345678", 0, "21A12345678" }, + /* 69*/ { "[21]123456789012345678901", ZINT_ERROR_INVALID_DATA, "" }, + /* 70*/ { "[210]A12345678", ZINT_ERROR_INVALID_DATA, "" }, + /* 71*/ { "[2100]1234", ZINT_ERROR_INVALID_DATA, "" }, + /* 72*/ { "[22]abcdefghijklmnopqrst", 0, "22abcdefghijklmnopqrst" }, + /* 73*/ { "[22]abcdefghijklmnopqrstu", ZINT_ERROR_INVALID_DATA, "" }, + /* 74*/ { "[220]1234", ZINT_ERROR_INVALID_DATA, "" }, + /* 75*/ { "[2200]1234", ZINT_ERROR_INVALID_DATA, "" }, + /* 76*/ { "[23]1234", ZINT_ERROR_INVALID_DATA, "" }, + /* 77*/ { "[230]1234", ZINT_ERROR_INVALID_DATA, "" }, + /* 78*/ { "[2300]1234", ZINT_ERROR_INVALID_DATA, "" }, + /* 79*/ { "[235]1abcdefghijklmnopqrstuvwxyz0", 0, "2351abcdefghijklmnopqrstuvwxyz0" }, + /* 80*/ { "[235]1abcdefghijklmnopqrstuvwxyz01", ZINT_ERROR_INVALID_DATA, "" }, + /* 81*/ { "[24]1234", ZINT_ERROR_INVALID_DATA, "" }, + /* 82*/ { "[240]abcdefghijklmnopqrstuvwxyz1234", 0, "240abcdefghijklmnopqrstuvwxyz1234" }, + /* 83*/ { "[240]abcdefghijklmnopqrstuvwxyz12345", ZINT_ERROR_INVALID_DATA, "" }, + /* 84*/ { "[2400]1234", ZINT_ERROR_INVALID_DATA, "" }, + /* 85*/ { "[241]abcdefghijklmnopqrstuvwxyz1234", 0, "241abcdefghijklmnopqrstuvwxyz1234" }, + /* 86*/ { "[241]abcdefghijklmnopqrstuvwxyz12345", ZINT_ERROR_INVALID_DATA, "" }, + /* 87*/ { "[2410]1234", ZINT_ERROR_INVALID_DATA, "" }, + /* 88*/ { "[242]12345", 0, "24212345" }, + /* 89*/ { "[242]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /* 90*/ { "[2420]1234", ZINT_ERROR_INVALID_DATA, "" }, + /* 91*/ { "[243]abcdefghijklmnopqrst", 0, "243abcdefghijklmnopqrst" }, + /* 92*/ { "[243]abcdefghijklmnopqrstu", ZINT_ERROR_INVALID_DATA, "" }, + /* 93*/ { "[2430]1234", ZINT_ERROR_INVALID_DATA, "" }, + /* 94*/ { "[244]1234", ZINT_ERROR_INVALID_DATA, "" }, + /* 95*/ { "[2440]1234", ZINT_ERROR_INVALID_DATA, "" }, + /* 96*/ { "[249]1234", ZINT_ERROR_INVALID_DATA, "" }, + /* 97*/ { "[2490]1234", ZINT_ERROR_INVALID_DATA, "" }, + /* 98*/ { "[25]1234", ZINT_ERROR_INVALID_DATA, "" }, + /* 99*/ { "[250]abcdefghijklmnopqrstuvwxyz1234", 0, "250abcdefghijklmnopqrstuvwxyz1234" }, + /*100*/ { "[250]abcdefghijklmnopqrstuvwxyz12345", ZINT_ERROR_INVALID_DATA, "" }, + /*101*/ { "[2500]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*102*/ { "[251]abcdefghijklmnopqrstuvwxyz1234", 0, "251abcdefghijklmnopqrstuvwxyz1234" }, + /*103*/ { "[251]abcdefghijklmnopqrstuvwxyz12345", ZINT_ERROR_INVALID_DATA, "" }, + /*104*/ { "[2510]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*105*/ { "[252]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*106*/ { "[2520]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*107*/ { "[253]131313131313", ZINT_ERROR_INVALID_DATA, "" }, + /*108*/ { "[253]1313131313134", ZINT_WARN_NONCOMPLIANT, "2531313131313134" }, + /*109*/ { "[253]1313131313130", 0, "2531313131313130" }, + /*110*/ { "[253]131313131313412345678901234567", ZINT_WARN_NONCOMPLIANT, "253131313131313412345678901234567" }, + /*111*/ { "[253]131313131313012345678901234567", 0, "253131313131313012345678901234567" }, + /*112*/ { "[253]1313131313134123456789012345678", ZINT_ERROR_INVALID_DATA, "" }, + /*113*/ { "[2530]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*114*/ { "[254]abcdefghijklmnopqrst", 0, "254abcdefghijklmnopqrst" }, + /*115*/ { "[254]abcdefghijklmnopqrstu", ZINT_ERROR_INVALID_DATA, "" }, + /*116*/ { "[2540]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*117*/ { "[255]131313131313", ZINT_ERROR_INVALID_DATA, "" }, + /*118*/ { "[255]1313131313134", ZINT_WARN_NONCOMPLIANT, "2551313131313134" }, + /*119*/ { "[255]1313131313130", 0, "2551313131313130" }, + /*120*/ { "[255]1313131313134123456789012", ZINT_WARN_NONCOMPLIANT, "2551313131313134123456789012" }, + /*121*/ { "[255]1313131313130123456789012", 0, "2551313131313130123456789012" }, + /*122*/ { "[255]13131313131341234567890123", ZINT_ERROR_INVALID_DATA, "" }, + /*123*/ { "[2550]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*124*/ { "[256]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*125*/ { "[2560]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*126*/ { "[259]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*127*/ { "[2590]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*128*/ { "[26]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*129*/ { "[260]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*130*/ { "[2600]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*131*/ { "[27]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*132*/ { "[270]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*133*/ { "[2700]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*134*/ { "[28]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*135*/ { "[280]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*136*/ { "[2800]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*137*/ { "[29]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*138*/ { "[290]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*139*/ { "[2900]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*140*/ { "[30]12345678", 0, "3012345678" }, + /*141*/ { "[30]123456789", ZINT_ERROR_INVALID_DATA, "" }, + /*142*/ { "[300]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*143*/ { "[3000]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*144*/ { "[31]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*145*/ { "[310]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*146*/ { "[3100]123456", 0, "3100123456" }, + /*147*/ { "[3100]12345", ZINT_ERROR_INVALID_DATA, "" }, + /*148*/ { "[3101]123456", 0, "3101123456" }, + /*149*/ { "[3101]12345", ZINT_ERROR_INVALID_DATA, "" }, + /*150*/ { "[3105]123456", 0, "3105123456" }, + /*151*/ { "[3105]12345", ZINT_ERROR_INVALID_DATA, "" }, + /*152*/ { "[3106]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*153*/ { "[3109]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*154*/ { "[3110]123456", 0, "3110123456" }, + /*155*/ { "[3110]12345", ZINT_ERROR_INVALID_DATA, "" }, + /*156*/ { "[3115]123456", 0, "3115123456" }, + /*157*/ { "[3115]12345", ZINT_ERROR_INVALID_DATA, "" }, + /*158*/ { "[3116]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*159*/ { "[3119]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*160*/ { "[3120]123456", 0, "3120123456" }, + /*161*/ { "[3120]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*162*/ { "[3125]123456", 0, "3125123456" }, + /*163*/ { "[3125]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*164*/ { "[3126]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*165*/ { "[3129]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*166*/ { "[3130]123456", 0, "3130123456" }, + /*167*/ { "[3130]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*168*/ { "[3135]123456", 0, "3135123456" }, + /*169*/ { "[3135]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*170*/ { "[3136]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*171*/ { "[3139]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*172*/ { "[3140]123456", 0, "3140123456" }, + /*173*/ { "[3140]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*174*/ { "[3145]123456", 0, "3145123456" }, + /*175*/ { "[3145]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*176*/ { "[3146]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*177*/ { "[3149]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*178*/ { "[3150]123456", 0, "3150123456" }, + /*179*/ { "[3150]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*180*/ { "[3155]123456", 0, "3155123456" }, + /*181*/ { "[3155]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*182*/ { "[3156]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*183*/ { "[3159]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*184*/ { "[3160]123456", 0, "3160123456" }, + /*185*/ { "[3160]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*186*/ { "[3165]123456", 0, "3165123456" }, + /*187*/ { "[3165]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*188*/ { "[3166]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*189*/ { "[3169]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*190*/ { "[3170]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*191*/ { "[3179]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*192*/ { "[3180]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*193*/ { "[3189]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*194*/ { "[3190]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*195*/ { "[3199]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*196*/ { "[32]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*197*/ { "[320]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*198*/ { "[3200]123456", 0, "3200123456" }, + /*199*/ { "[3200]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*200*/ { "[3205]123456", 0, "3205123456" }, + /*201*/ { "[3205]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*202*/ { "[3206]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*203*/ { "[3209]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*204*/ { "[3210]123456", 0, "3210123456" }, + /*205*/ { "[3210]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*206*/ { "[3215]123456", 0, "3215123456" }, + /*207*/ { "[3215]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*208*/ { "[3216]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*209*/ { "[3219]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*210*/ { "[3220]123456", 0, "3220123456" }, + /*211*/ { "[3220]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*212*/ { "[3225]123456", 0, "3225123456" }, + /*213*/ { "[3225]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*214*/ { "[3229]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*215*/ { "[3230]123456", 0, "3230123456" }, + /*216*/ { "[3230]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*217*/ { "[3235]123456", 0, "3235123456" }, + /*218*/ { "[3235]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*219*/ { "[3239]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*220*/ { "[3240]123456", 0, "3240123456" }, + /*221*/ { "[3240]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*222*/ { "[3245]123456", 0, "3245123456" }, + /*223*/ { "[3245]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*224*/ { "[3249]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*225*/ { "[3250]123456", 0, "3250123456" }, + /*226*/ { "[3250]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*227*/ { "[3255]123456", 0, "3255123456" }, + /*228*/ { "[3255]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*229*/ { "[3259]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*230*/ { "[3260]123456", 0, "3260123456" }, + /*231*/ { "[3260]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*232*/ { "[3265]123456", 0, "3265123456" }, + /*233*/ { "[3265]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*234*/ { "[3269]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*235*/ { "[3270]123456", 0, "3270123456" }, + /*236*/ { "[3270]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*237*/ { "[3275]123456", 0, "3275123456" }, + /*238*/ { "[3275]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*239*/ { "[3279]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*240*/ { "[3280]123456", 0, "3280123456" }, + /*241*/ { "[3280]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*242*/ { "[3285]123456", 0, "3285123456" }, + /*243*/ { "[3285]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*244*/ { "[3289]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*245*/ { "[3290]123456", 0, "3290123456" }, + /*246*/ { "[3290]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*247*/ { "[3295]123456", 0, "3295123456" }, + /*248*/ { "[3295]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*249*/ { "[3296]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*250*/ { "[3299]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*251*/ { "[33]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*252*/ { "[330]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*253*/ { "[3300]123456", 0, "3300123456" }, + /*254*/ { "[3300]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*255*/ { "[3305]123456", 0, "3305123456" }, + /*256*/ { "[3305]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*257*/ { "[3306]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*258*/ { "[3309]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*259*/ { "[3310]123456", 0, "3310123456" }, + /*260*/ { "[3310]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*261*/ { "[3319]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*262*/ { "[3320]123456", 0, "3320123456" }, + /*263*/ { "[3320]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*264*/ { "[3329]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*265*/ { "[3330]123456", 0, "3330123456" }, + /*266*/ { "[3330]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*267*/ { "[3339]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*268*/ { "[3340]123456", 0, "3340123456" }, + /*269*/ { "[3340]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*270*/ { "[3349]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*271*/ { "[3350]123456", 0, "3350123456" }, + /*272*/ { "[3350]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*273*/ { "[3359]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*274*/ { "[3360]123456", 0, "3360123456" }, + /*275*/ { "[3360]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*276*/ { "[3369]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*277*/ { "[3370]123456", 0, "3370123456" }, + /*278*/ { "[3370]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*279*/ { "[3375]123456", 0, "3375123456" }, + /*280*/ { "[3375]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*281*/ { "[3376]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*282*/ { "[3379]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*283*/ { "[3380]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*284*/ { "[3390]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*285*/ { "[3399]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*286*/ { "[34]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*287*/ { "[340]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*288*/ { "[3400]123456", 0, "3400123456" }, + /*289*/ { "[3400]12345", ZINT_ERROR_INVALID_DATA, "" }, + /*290*/ { "[3405]123456", 0, "3405123456" }, + /*291*/ { "[3405]12345", ZINT_ERROR_INVALID_DATA, "" }, + /*292*/ { "[3406]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*293*/ { "[3409]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*294*/ { "[3410]123456", 0, "3410123456" }, + /*295*/ { "[3410]12345", ZINT_ERROR_INVALID_DATA, "" }, + /*296*/ { "[3419]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*297*/ { "[3420]123456", 0, "3420123456" }, + /*298*/ { "[3420]12345", ZINT_ERROR_INVALID_DATA, "" }, + /*299*/ { "[3429]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*300*/ { "[3430]123456", 0, "3430123456" }, + /*301*/ { "[3430]12345", ZINT_ERROR_INVALID_DATA, "" }, + /*302*/ { "[3439]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*303*/ { "[3440]123456", 0, "3440123456" }, + /*304*/ { "[3440]12345", ZINT_ERROR_INVALID_DATA, "" }, + /*305*/ { "[3449]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*306*/ { "[3450]123456", 0, "3450123456" }, + /*307*/ { "[3450]12345", ZINT_ERROR_INVALID_DATA, "" }, + /*308*/ { "[3459]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*309*/ { "[3460]123456", 0, "3460123456" }, + /*310*/ { "[3460]12345", ZINT_ERROR_INVALID_DATA, "" }, + /*311*/ { "[3469]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*312*/ { "[3470]123456", 0, "3470123456" }, + /*313*/ { "[3470]12345", ZINT_ERROR_INVALID_DATA, "" }, + /*314*/ { "[3479]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*315*/ { "[3480]123456", 0, "3480123456" }, + /*316*/ { "[3480]12345", ZINT_ERROR_INVALID_DATA, "" }, + /*317*/ { "[3489]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*318*/ { "[3490]123456", 0, "3490123456" }, + /*319*/ { "[3490]12345", ZINT_ERROR_INVALID_DATA, "" }, + /*320*/ { "[3495]123456", 0, "3495123456" }, + /*321*/ { "[3495]12345", ZINT_ERROR_INVALID_DATA, "" }, + /*322*/ { "[3496]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*323*/ { "[3499]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*324*/ { "[35]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*325*/ { "[350]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*326*/ { "[3500]123456", 0, "3500123456" }, + /*327*/ { "[3500]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*328*/ { "[3505]123456", 0, "3505123456" }, + /*329*/ { "[3505]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*330*/ { "[3506]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*331*/ { "[3509]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*332*/ { "[3510]123456", 0, "3510123456", }, + /*333*/ { "[3510]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*334*/ { "[3519]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*335*/ { "[3520]123456", 0, "3520123456", }, + /*336*/ { "[3520]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*337*/ { "[3529]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*338*/ { "[3530]123456", 0, "3530123456", }, + /*339*/ { "[3530]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*340*/ { "[3539]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*341*/ { "[3540]123456", 0, "3540123456", }, + /*342*/ { "[3540]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*343*/ { "[3549]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*344*/ { "[3550]123456", 0, "3550123456", }, + /*345*/ { "[3550]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*346*/ { "[3559]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*347*/ { "[3560]123456", 0, "3560123456", }, + /*348*/ { "[3560]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*349*/ { "[3569]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*350*/ { "[3570]123456", 0, "3570123456", }, + /*351*/ { "[3570]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*352*/ { "[3575]123456", 0, "3575123456" }, + /*353*/ { "[3376]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*354*/ { "[3579]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*355*/ { "[3580]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*356*/ { "[3590]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*357*/ { "[3599]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*358*/ { "[36]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*359*/ { "[360]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*360*/ { "[3600]123456", 0, "3600123456" }, + /*361*/ { "[3600]12345", ZINT_ERROR_INVALID_DATA, "" }, + /*362*/ { "[3605]123456", 0, "3605123456" }, + /*363*/ { "[3605]12345", ZINT_ERROR_INVALID_DATA, "" }, + /*364*/ { "[3606]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*365*/ { "[3609]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*366*/ { "[3610]123456", 0, "3610123456" }, + /*367*/ { "[3610]12345", ZINT_ERROR_INVALID_DATA, "" }, + /*368*/ { "[3619]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*369*/ { "[3620]123456", 0, "3620123456", }, + /*370*/ { "[3620]12345", ZINT_ERROR_INVALID_DATA, "" }, + /*371*/ { "[3629]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*372*/ { "[3630]123456", 0, "3630123456", }, + /*373*/ { "[3630]12345", ZINT_ERROR_INVALID_DATA, "" }, + /*374*/ { "[3639]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*375*/ { "[3640]123456", 0, "3640123456", }, + /*376*/ { "[3640]12345", ZINT_ERROR_INVALID_DATA, "" }, + /*377*/ { "[3649]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*378*/ { "[3650]123456", 0, "3650123456", }, + /*379*/ { "[3650]12345", ZINT_ERROR_INVALID_DATA, "" }, + /*380*/ { "[3659]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*381*/ { "[3660]123456", 0, "3660123456", }, + /*382*/ { "[3660]12345", ZINT_ERROR_INVALID_DATA, "" }, + /*383*/ { "[3669]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*384*/ { "[3670]123456", 0, "3670123456", }, + /*385*/ { "[3670]12345", ZINT_ERROR_INVALID_DATA, "" }, + /*386*/ { "[3679]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*387*/ { "[3680]123456", 0, "3680123456", }, + /*388*/ { "[3680]12345", ZINT_ERROR_INVALID_DATA, "" }, + /*389*/ { "[3689]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*390*/ { "[3690]123456", 0, "3690123456" }, + /*391*/ { "[3690]12345", ZINT_ERROR_INVALID_DATA, "" }, + /*392*/ { "[3695]123456", 0, "3695123456" }, + /*393*/ { "[3695]12345", ZINT_ERROR_INVALID_DATA, "" }, + /*394*/ { "[3696]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*395*/ { "[3699]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*396*/ { "[37]12345678", 0, "3712345678" }, + /*397*/ { "[37]123456789", ZINT_ERROR_INVALID_DATA, "" }, + /*398*/ { "[370]12345678", ZINT_ERROR_INVALID_DATA, "" }, + /*399*/ { "[3700]12345678", ZINT_ERROR_INVALID_DATA, "" }, + /*400*/ { "[38]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*401*/ { "[380]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*402*/ { "[3800]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*403*/ { "[39]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*404*/ { "[390]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*405*/ { "[3900]123456789012345", 0, "3900123456789012345" }, + /*406*/ { "[3900]1234567890123456", ZINT_ERROR_INVALID_DATA, "" }, + /*407*/ { "[3900]12345678901234", 0, "390012345678901234" }, + /*408*/ { "[3901]123456789012345", 0, "3901123456789012345" }, + /*409*/ { "[3901]1234567890123456", ZINT_ERROR_INVALID_DATA, "" }, + /*410*/ { "[3905]123456789012345", 0, "3905123456789012345" }, + /*411*/ { "[3909]123456789012345", 0, "3909123456789012345" }, + /*412*/ { "[3909]1234567890123456", ZINT_ERROR_INVALID_DATA, "" }, + /*413*/ { "[3910]123123456789012345", ZINT_WARN_NONCOMPLIANT, "3910123123456789012345" }, + /*414*/ { "[3910]997123456789012345", 0, "3910997123456789012345" }, + /*415*/ { "[3910]1231234567890123456", ZINT_ERROR_INVALID_DATA, "" }, + /*416*/ { "[3910]123", ZINT_ERROR_INVALID_DATA, "" }, + /*417*/ { "[3915]123123456789012345", ZINT_WARN_NONCOMPLIANT, "3915123123456789012345" }, + /*418*/ { "[3915]997123456789012345", 0, "3915997123456789012345" }, + /*419*/ { "[3915]1231234567890123456", ZINT_ERROR_INVALID_DATA, "" }, + /*420*/ { "[3919]123123456789012345", ZINT_WARN_NONCOMPLIANT, "3919123123456789012345" }, + /*421*/ { "[3919]997123456789012345", 0, "3919997123456789012345" }, + /*422*/ { "[3919]1231234567890123456", ZINT_ERROR_INVALID_DATA, "" }, + /*423*/ { "[3920]123456789012345", 0, "3920123456789012345" }, + /*424*/ { "[3920]1234567890123456", ZINT_ERROR_INVALID_DATA, "" }, + /*425*/ { "[3925]123456789012345", 0, "3925123456789012345" }, + /*426*/ { "[3925]1234567890123456", ZINT_ERROR_INVALID_DATA, "" }, + /*427*/ { "[3929]123456789012345", 0, "3929123456789012345" }, + /*428*/ { "[3929]1234567890123456", ZINT_ERROR_INVALID_DATA, "" }, + /*429*/ { "[3930]123123456789012345", ZINT_WARN_NONCOMPLIANT, "3930123123456789012345" }, + /*430*/ { "[3930]997123456789012345", 0, "3930997123456789012345" }, + /*431*/ { "[3930]1231234567890123456", ZINT_ERROR_INVALID_DATA, "" }, + /*432*/ { "[3930]123", ZINT_ERROR_INVALID_DATA, "" }, + /*433*/ { "[3935]123123456789012345", ZINT_WARN_NONCOMPLIANT, "3935123123456789012345" }, + /*434*/ { "[3935]997123456789012345", 0, "3935997123456789012345" }, + /*435*/ { "[3935]1231234567890123456", ZINT_ERROR_INVALID_DATA, "" }, + /*436*/ { "[3939]123123456789012345", ZINT_WARN_NONCOMPLIANT, "3939123123456789012345" }, + /*437*/ { "[3939]997123456789012345", 0, "3939997123456789012345" }, + /*438*/ { "[3939]1231234567890123456", ZINT_ERROR_INVALID_DATA, "" }, + /*439*/ { "[3940]1234", 0, "39401234" }, + /*440*/ { "[3940]12345", ZINT_ERROR_INVALID_DATA, "" }, + /*441*/ { "[3940]123", ZINT_ERROR_INVALID_DATA, "" }, + /*442*/ { "[3941]1234", 0, "39411234" }, + /*443*/ { "[3941]12345", ZINT_ERROR_INVALID_DATA, "" }, + /*444*/ { "[3941]123", ZINT_ERROR_INVALID_DATA, "" }, + /*445*/ { "[3942]1234", 0, "39421234" }, + /*446*/ { "[3942]12345", ZINT_ERROR_INVALID_DATA, "" }, + /*447*/ { "[3943]1234", 0, "39431234" }, + /*448*/ { "[3943]123", ZINT_ERROR_INVALID_DATA, "" }, + /*449*/ { "[3944]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*450*/ { "[3945]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*451*/ { "[3949]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*452*/ { "[3950]123456", 0, "3950123456" }, + /*453*/ { "[3950]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*454*/ { "[3950]12345", ZINT_ERROR_INVALID_DATA, "" }, + /*455*/ { "[3951]123456", 0, "3951123456" }, + /*456*/ { "[3951]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*457*/ { "[3952]123456", 0, "3952123456" }, + /*458*/ { "[3952]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*459*/ { "[3953]123456", 0, "3953123456" }, + /*460*/ { "[3953]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*461*/ { "[3954]123456", 0, "3954123456" }, + /*462*/ { "[3954]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*463*/ { "[3955]123456", 0, "3955123456" }, + /*464*/ { "[3955]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*465*/ { "[3956]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*466*/ { "[3959]123456", ZINT_ERROR_INVALID_DATA, "" }, + /*467*/ { "[3960]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*468*/ { "[3970]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*469*/ { "[3980]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*470*/ { "[3999]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*471*/ { "[40]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*472*/ { "[400]123456789012345678901234567890", 0, "400123456789012345678901234567890" }, + /*473*/ { "[400]1234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" }, + /*474*/ { "[4000]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*475*/ { "[401]1234abcdefghijklmnopqrstuvwxyz", 0, "4011234abcdefghijklmnopqrstuvwxyz" }, + /*476*/ { "[401]1234abcdefghijklmnopqrstuvwxyz1", ZINT_ERROR_INVALID_DATA, "" }, + /*477*/ { "[4010]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*478*/ { "[402]13131313131313132", ZINT_WARN_NONCOMPLIANT, "40213131313131313132" }, + /*479*/ { "[402]13131313131313130", 0, "40213131313131313130" }, + /*480*/ { "[402]1313131313131313", ZINT_ERROR_INVALID_DATA, "" }, + /*481*/ { "[4020]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*482*/ { "[403]abcdefghijklmnopqrstuvwxyz1234", 0, "403abcdefghijklmnopqrstuvwxyz1234" }, + /*483*/ { "[403]abcdefghijklmnopqrstuvwxyz12345", ZINT_ERROR_INVALID_DATA, "" }, + /*484*/ { "[4030]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*485*/ { "[404]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*486*/ { "[4040]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*487*/ { "[409]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*488*/ { "[4090]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*489*/ { "[41]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*490*/ { "[410]3898765432108", 0, "4103898765432108" }, + /*491*/ { "[410]12345678901234", ZINT_ERROR_INVALID_DATA, "" }, + /*492*/ { "[4100]12345678901234", ZINT_ERROR_INVALID_DATA, "" }, + /*493*/ { "[411]1313131313134", ZINT_WARN_NONCOMPLIANT, "4111313131313134" }, + /*494*/ { "[411]1313131313130", 0, "4111313131313130" }, + /*495*/ { "[411]13131313131", ZINT_ERROR_INVALID_DATA, "" }, + /*496*/ { "[4110]1313131313134", ZINT_ERROR_INVALID_DATA, "" }, + /*497*/ { "[412]1313131313130", 0, "4121313131313130" }, + /*498*/ { "[412]13131313131", ZINT_ERROR_INVALID_DATA, "" }, + /*499*/ { "[4120]1313131313134", ZINT_ERROR_INVALID_DATA, "" }, + /*500*/ { "[413]1313131313130", 0, "4131313131313130" }, + /*501*/ { "[413]13131313131", ZINT_ERROR_INVALID_DATA, "" }, + /*502*/ { "[4130]1313131313134", ZINT_ERROR_INVALID_DATA, "" }, + /*503*/ { "[414]1313131313130", 0, "4141313131313130" }, + /*504*/ { "[414]13131313131", ZINT_ERROR_INVALID_DATA, "" }, + /*505*/ { "[4140]1313131313134", ZINT_ERROR_INVALID_DATA, "" }, + /*506*/ { "[415]1313131313130", 0, "4151313131313130" }, + /*507*/ { "[415]13131313131", ZINT_ERROR_INVALID_DATA, "" }, + /*508*/ { "[4150]1313131313134", ZINT_ERROR_INVALID_DATA, "" }, + /*509*/ { "[416]1313131313130", 0, "4161313131313130" }, + /*510*/ { "[416]13131313131", ZINT_ERROR_INVALID_DATA, "" }, + /*511*/ { "[4160]1313131313134", ZINT_ERROR_INVALID_DATA, "" }, + /*512*/ { "[417]1313131313130", 0, "4171313131313130" }, + /*513*/ { "[417]13131313131", ZINT_ERROR_INVALID_DATA, "" }, + /*514*/ { "[4170]1313131313134", ZINT_ERROR_INVALID_DATA, "" }, + /*515*/ { "[418]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*516*/ { "[4180]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*517*/ { "[419]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*518*/ { "[4190]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*519*/ { "[42]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*520*/ { "[420]abcdefghijklmnopqrst", 0, "420abcdefghijklmnopqrst" }, + /*521*/ { "[420]abcdefghijklmnopqrstu", ZINT_ERROR_INVALID_DATA, "" }, + /*522*/ { "[4200]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*523*/ { "[421]123abcdefghi", ZINT_WARN_NONCOMPLIANT, "421123abcdefghi" }, + /*524*/ { "[421]434abcdefghi", 0, "421434abcdefghi" }, + /*525*/ { "[421]123abcdefghij", ZINT_ERROR_INVALID_DATA, "" }, + /*526*/ { "[421]1231", ZINT_WARN_NONCOMPLIANT, "4211231" }, + /*527*/ { "[421]4341", 0, "4214341" }, + /*528*/ { "[421]123", ZINT_ERROR_INVALID_DATA, "" }, + /*529*/ { "[4210]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*530*/ { "[422]123", ZINT_WARN_NONCOMPLIANT, "422123" }, + /*531*/ { "[422]004", 0, "422004" }, + /*532*/ { "[422]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*533*/ { "[422]12", ZINT_ERROR_INVALID_DATA, "" }, + /*534*/ { "[4220]123", ZINT_ERROR_INVALID_DATA, "" }, + /*535*/ { "[423]123123123123123", ZINT_WARN_NONCOMPLIANT, "423123123123123123" }, + /*536*/ { "[423]470004012887123", ZINT_WARN_NONCOMPLIANT, "423470004012887123" }, + /*537*/ { "[423]470004012887438", 0, "423470004012887438" }, + /*538*/ { "[423]1231231231231231", ZINT_ERROR_INVALID_DATA, "4231231231231231231" }, + /*539*/ { "[423]12312312312312", ZINT_WARN_NONCOMPLIANT, "42312312312312312" }, + /*540*/ { "[423]1231231231231", ZINT_WARN_NONCOMPLIANT, "4231231231231231" }, + /*541*/ { "[423]12312312312", ZINT_WARN_NONCOMPLIANT, "42312312312312" }, + /*542*/ { "[423]1231231231", ZINT_WARN_NONCOMPLIANT, "4231231231231" }, + /*543*/ { "[423]123", ZINT_WARN_NONCOMPLIANT, "423123" }, + /*544*/ { "[423]004", 0, "423004" }, + /*545*/ { "[423]12", ZINT_ERROR_INVALID_DATA, "" }, + /*546*/ { "[4230]123123123123123", ZINT_ERROR_INVALID_DATA, "" }, + /*547*/ { "[424]123", ZINT_WARN_NONCOMPLIANT, "424123" }, + /*548*/ { "[424]004", 0, "424004" }, + /*549*/ { "[424]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*550*/ { "[424]12", ZINT_ERROR_INVALID_DATA, "" }, + /*551*/ { "[4240]123", ZINT_ERROR_INVALID_DATA, "" }, + /*552*/ { "[425]123123123123123", ZINT_WARN_NONCOMPLIANT, "425123123123123123" }, + /*553*/ { "[425]010500276634894", 0, "425010500276634894" }, + /*554*/ { "[425]010500276123894", ZINT_WARN_NONCOMPLIANT, "425010500276123894" }, + /*555*/ { "[425]1231231231231231", ZINT_ERROR_INVALID_DATA, "" }, + /*556*/ { "[425]12", ZINT_ERROR_INVALID_DATA, "" }, + /*557*/ { "[4250]123123123123123", ZINT_ERROR_INVALID_DATA, "" }, + /*558*/ { "[426]123", ZINT_WARN_NONCOMPLIANT, "426123" }, + /*559*/ { "[426]426", 0, "426426" }, + /*560*/ { "[426]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*561*/ { "[426]12", ZINT_ERROR_INVALID_DATA, "" }, + /*562*/ { "[4260]123", ZINT_ERROR_INVALID_DATA, "" }, + /*563*/ { "[427]abc", 0, "427abc" }, + /*564*/ { "[427]abcd", ZINT_ERROR_INVALID_DATA, "" }, + /*565*/ { "[4270]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*566*/ { "[428]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*567*/ { "[4280]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*568*/ { "[429]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*569*/ { "[4290]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*570*/ { "[43]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*571*/ { "[430]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*572*/ { "[4300]1", 0, "43001" }, + /*573*/ { "[4300]12345678901234567890123456789012345", 0, "430012345678901234567890123456789012345" }, + /*574*/ { "[4300]123456789012345678901234567890123456", ZINT_ERROR_INVALID_DATA, "" }, + /*575*/ { "[4301]1", 0, "43011" }, + /*576*/ { "[4301]12345678901234567890123456789012345", 0, "430112345678901234567890123456789012345" }, + /*577*/ { "[4301]123456789012345678901234567890123456", ZINT_ERROR_INVALID_DATA, "" }, + /*578*/ { "[4302]1", 0, "43021" }, + /*579*/ { "[4302]1234567890123456789012345678901234567890123456789012345678901234567890", 0, "43021234567890123456789012345678901234567890123456789012345678901234567890" }, + /*580*/ { "[4302]12345678901234567890123456789012345678901234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" }, + /*581*/ { "[4303]1", 0, "43031" }, + /*582*/ { "[4303]1234567890123456789012345678901234567890123456789012345678901234567890", 0, "43031234567890123456789012345678901234567890123456789012345678901234567890" }, + /*583*/ { "[4303]12345678901234567890123456789012345678901234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" }, + /*584*/ { "[4304]1", 0, "43041" }, + /*585*/ { "[4304]1234567890123456789012345678901234567890123456789012345678901234567890", 0, "43041234567890123456789012345678901234567890123456789012345678901234567890" }, + /*586*/ { "[4304]12345678901234567890123456789012345678901234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" }, + /*587*/ { "[4305]1", 0, "43051" }, + /*588*/ { "[4305]1234567890123456789012345678901234567890123456789012345678901234567890", 0, "43051234567890123456789012345678901234567890123456789012345678901234567890" }, + /*589*/ { "[4305]12345678901234567890123456789012345678901234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" }, + /*590*/ { "[4306]1", 0, "43061" }, + /*591*/ { "[4306]1234567890123456789012345678901234567890123456789012345678901234567890", 0, "43061234567890123456789012345678901234567890123456789012345678901234567890" }, + /*592*/ { "[4306]12345678901234567890123456789012345678901234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" }, + /*593*/ { "[4307]FR", 0, "4307FR" }, + /*594*/ { "[4307]F", ZINT_ERROR_INVALID_DATA, "" }, + /*595*/ { "[4307]FRR", ZINT_ERROR_INVALID_DATA, "" }, + /*596*/ { "[4308]1", 0, "43081" }, + /*597*/ { "[4308]123456789012345678901234567890", 0, "4308123456789012345678901234567890" }, + /*598*/ { "[4308]1234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" }, + /*599*/ { "[4309]1", ZINT_ERROR_INVALID_DATA, "" }, + /*600*/ { "[431]1", ZINT_ERROR_INVALID_DATA, "" }, + /*601*/ { "[4310]1", 0, "43101" }, + /*602*/ { "[4310]12345678901234567890123456789012345", 0, "431012345678901234567890123456789012345" }, + /*603*/ { "[4310]123456789012345678901234567890123456", ZINT_ERROR_INVALID_DATA, "" }, + /*604*/ { "[4311]1", 0, "43111" }, + /*605*/ { "[4311]12345678901234567890123456789012345", 0, "431112345678901234567890123456789012345" }, + /*606*/ { "[4311]123456789012345678901234567890123456", ZINT_ERROR_INVALID_DATA, "" }, + /*607*/ { "[4312]1", 0, "43121" }, + /*608*/ { "[4312]1234567890123456789012345678901234567890123456789012345678901234567890", 0, "43121234567890123456789012345678901234567890123456789012345678901234567890" }, + /*609*/ { "[4312]12345678901234567890123456789012345678901234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" }, + /*610*/ { "[4313]1", 0, "43131" }, + /*611*/ { "[4313]1234567890123456789012345678901234567890123456789012345678901234567890", 0, "43131234567890123456789012345678901234567890123456789012345678901234567890" }, + /*612*/ { "[4313]12345678901234567890123456789012345678901234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" }, + /*613*/ { "[4314]1", 0, "43141" }, + /*614*/ { "[4314]1234567890123456789012345678901234567890123456789012345678901234567890", 0, "43141234567890123456789012345678901234567890123456789012345678901234567890" }, + /*615*/ { "[4314]12345678901234567890123456789012345678901234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" }, + /*616*/ { "[4315]1", 0, "43151" }, + /*617*/ { "[4315]1234567890123456789012345678901234567890123456789012345678901234567890", 0, "43151234567890123456789012345678901234567890123456789012345678901234567890" }, + /*618*/ { "[4315]12345678901234567890123456789012345678901234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" }, + /*619*/ { "[4316]1", 0, "43161" }, + /*620*/ { "[4316]1234567890123456789012345678901234567890123456789012345678901234567890", 0, "43161234567890123456789012345678901234567890123456789012345678901234567890" }, + /*621*/ { "[4316]12345678901234567890123456789012345678901234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" }, + /*622*/ { "[4317]FR", 0, "4317FR" }, + /*623*/ { "[4317]F", ZINT_ERROR_INVALID_DATA, "" }, + /*624*/ { "[4317]FRF", ZINT_ERROR_INVALID_DATA, "" }, + /*625*/ { "[4318]1", 0, "43181" }, + /*626*/ { "[4318]12345678901234567890", 0, "431812345678901234567890" }, + /*627*/ { "[4318]123456789012345678901", ZINT_ERROR_INVALID_DATA, "" }, + /*628*/ { "[4319]1", 0, "43191" }, + /*629*/ { "[4319]123456789012345678901234567890", 0, "4319123456789012345678901234567890" }, + /*630*/ { "[4319]1234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" }, + /*631*/ { "[432]1", ZINT_ERROR_INVALID_DATA, "" }, + /*632*/ { "[4320]1", 0, "43201" }, + /*633*/ { "[4320]12345678901234567890123456789012345", 0, "432012345678901234567890123456789012345" }, + /*634*/ { "[4320]123456789012345678901234567890123456", ZINT_ERROR_INVALID_DATA, "" }, + /*635*/ { "[4321]1", 0, "43211" }, + /*636*/ { "[4321]10", ZINT_ERROR_INVALID_DATA, "" }, + /*637*/ { "[4322]1", 0, "43221" }, + /*638*/ { "[4322]10", ZINT_ERROR_INVALID_DATA, "" }, + /*639*/ { "[4323]1", 0, "43231" }, + /*640*/ { "[4323]10", ZINT_ERROR_INVALID_DATA, "" }, + /*641*/ { "[4324]1212120000", 0, "43241212120000" }, + /*642*/ { "[4324]121212000", ZINT_ERROR_INVALID_DATA, "" }, + /*643*/ { "[4324]12121200000", ZINT_ERROR_INVALID_DATA, "" }, + /*644*/ { "[4325]1212120000", 0, "43251212120000" }, + /*645*/ { "[4325]121212000", ZINT_ERROR_INVALID_DATA, "" }, + /*646*/ { "[4325]12121200000", ZINT_ERROR_INVALID_DATA, "" }, + /*647*/ { "[4326]121212", 0, "4326121212" }, + /*648*/ { "[4326]12121", ZINT_ERROR_INVALID_DATA, "" }, + /*649*/ { "[4326]1212120", ZINT_ERROR_INVALID_DATA, "" }, + /*650*/ { "[4327]121212", ZINT_ERROR_INVALID_DATA, "" }, + /*651*/ { "[4328]121212", ZINT_ERROR_INVALID_DATA, "" }, + /*652*/ { "[4329]121212", ZINT_ERROR_INVALID_DATA, "" }, + /*653*/ { "[433]121212", ZINT_ERROR_INVALID_DATA, "" }, + /*654*/ { "[4330]121212", ZINT_ERROR_INVALID_DATA, "" }, + /*655*/ { "[44]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*656*/ { "[440]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*657*/ { "[4400]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*658*/ { "[49]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*659*/ { "[490]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*660*/ { "[4900]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*661*/ { "[499]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*662*/ { "[4990]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*663*/ { "[50]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*664*/ { "[500]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*665*/ { "[5000]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*666*/ { "[51]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*667*/ { "[510]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*668*/ { "[5100]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*669*/ { "[59]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*670*/ { "[590]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*671*/ { "[5900]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*672*/ { "[60]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*673*/ { "[600]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*674*/ { "[6000]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*675*/ { "[61]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*676*/ { "[610]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*677*/ { "[6100]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*678*/ { "[69]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*679*/ { "[690]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*680*/ { "[6900]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*681*/ { "[70]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*682*/ { "[700]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*683*/ { "[7000]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*684*/ { "[7001]1234567890123", 0, "70011234567890123" }, + /*685*/ { "[7001]123456789012", ZINT_ERROR_INVALID_DATA, "" }, + /*686*/ { "[7002]abcdefghijklmnopqrstuvwxyz1234", 0, "7002abcdefghijklmnopqrstuvwxyz1234" }, + /*687*/ { "[7002]abcdefghijklmnopqrstuvwxyz12345", ZINT_ERROR_INVALID_DATA, "" }, + /*688*/ { "[7003]1212121212", 0, "70031212121212" }, + /*689*/ { "[7003]121212121", ZINT_ERROR_INVALID_DATA, "" }, + /*690*/ { "[7004]1234", 0, "70041234" }, + /*691*/ { "[7004]12345", ZINT_ERROR_INVALID_DATA, "" }, + /*692*/ { "[7005]abcdefghijkl", 0, "7005abcdefghijkl" }, + /*693*/ { "[7005]abcdefghijklm", ZINT_ERROR_INVALID_DATA, "" }, + /*694*/ { "[7006]200132", ZINT_WARN_NONCOMPLIANT, "7006200132" }, + /*695*/ { "[7006]200100", ZINT_WARN_NONCOMPLIANT, "7006200100" }, + /*696*/ { "[7006]200120", 0, "7006200120" }, + /*697*/ { "[7006]2001320", ZINT_ERROR_INVALID_DATA, "" }, + /*698*/ { "[7007]010101121212", 0, "7007010101121212" }, + /*699*/ { "[7007]01010112121", ZINT_ERROR_INVALID_DATA, "" }, + /*700*/ { "[7007]A1010112121", ZINT_ERROR_INVALID_DATA, "" }, + /*701*/ { "[7007]121212", 0, "7007121212" }, + /*702*/ { "[7007]12121", ZINT_ERROR_INVALID_DATA, "" }, + /*703*/ { "[7007]1212121", ZINT_ERROR_INVALID_DATA, "" }, + /*704*/ { "[7008]abc", 0, "7008abc" }, + /*705*/ { "[7008]abcd", ZINT_ERROR_INVALID_DATA, "" }, + /*706*/ { "[7009]abcdefghij", 0, "7009abcdefghij" }, + /*707*/ { "[7009]abcdefghijk", ZINT_ERROR_INVALID_DATA, "" }, + /*708*/ { "[7010]01", 0, "701001" }, + /*709*/ { "[7010]1", 0, "70101" }, + /*710*/ { "[7010]012", ZINT_ERROR_INVALID_DATA, "" }, + /*711*/ { "[7011]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*712*/ { "[7012]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*713*/ { "[7019]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*714*/ { "[7020]abcdefghijklmnopqrst", 0, "7020abcdefghijklmnopqrst" }, + /*715*/ { "[7020]abcdefghijklmnopqrstu", ZINT_ERROR_INVALID_DATA, "" }, + /*716*/ { "[7021]abcdefghijklmnopqrst", 0, "7021abcdefghijklmnopqrst" }, + /*717*/ { "[7021]abcdefghijklmnopqrstu", ZINT_ERROR_INVALID_DATA, "" }, + /*718*/ { "[7022]abcdefghijklmnopqrst", 0, "7022abcdefghijklmnopqrst" }, + /*719*/ { "[7022]abcdefghijklmnopqrstu", ZINT_ERROR_INVALID_DATA, "" }, + /*720*/ { "[7023]1234abcdefghijklmnopqrstuvwxyz", 0, "70231234abcdefghijklmnopqrstuvwxyz" }, + /*721*/ { "[7023]1234abcdefghijklmnopqrstuvwxyza", ZINT_ERROR_INVALID_DATA, "" }, + /*722*/ { "[7024]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*723*/ { "[7025]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*724*/ { "[7029]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*725*/ { "[7030]123abcdefghijklmnopqrstuvwxyza", ZINT_WARN_NONCOMPLIANT, "7030123abcdefghijklmnopqrstuvwxyza" }, + /*726*/ { "[7030]004abcdefghijklmnopqrstuvwxyza", 0, "7030004abcdefghijklmnopqrstuvwxyza" }, + /*727*/ { "[7030]123abcdefghijklmnopqrstuvwxyzab", ZINT_ERROR_INVALID_DATA, "" }, + /*728*/ { "[7031]123abcdefghijklmnopqrstuvwxyza", ZINT_WARN_NONCOMPLIANT, "7031123abcdefghijklmnopqrstuvwxyza" }, + /*729*/ { "[7031]004abcdefghijklmnopqrstuvwxyza", 0, "7031004abcdefghijklmnopqrstuvwxyza" }, + /*730*/ { "[7031]123abcdefghijklmnopqrstuvwxyzab", ZINT_ERROR_INVALID_DATA, "" }, + /*731*/ { "[7032]004abcdefghijklmnopqrstuvwxyza", 0, "7032004abcdefghijklmnopqrstuvwxyza" }, + /*732*/ { "[7032]004abcdefghijklmnopqrstuvwxyzab", ZINT_ERROR_INVALID_DATA, "" }, + /*733*/ { "[7033]004abcdefghijklmnopqrstuvwxyza", 0, "7033004abcdefghijklmnopqrstuvwxyza" }, + /*734*/ { "[7033]004abcdefghijklmnopqrstuvwxyzab", ZINT_ERROR_INVALID_DATA, "" }, + /*735*/ { "[7034]004abcdefghijklmnopqrstuvwxyza", 0, "7034004abcdefghijklmnopqrstuvwxyza" }, + /*736*/ { "[7034]004abcdefghijklmnopqrstuvwxyzab", ZINT_ERROR_INVALID_DATA, "" }, + /*737*/ { "[7035]004abcdefghijklmnopqrstuvwxyza", 0, "7035004abcdefghijklmnopqrstuvwxyza" }, + /*738*/ { "[7035]004abcdefghijklmnopqrstuvwxyzab", ZINT_ERROR_INVALID_DATA, "" }, + /*739*/ { "[7036]004abcdefghijklmnopqrstuvwxyza", 0, "7036004abcdefghijklmnopqrstuvwxyza" }, + /*740*/ { "[7036]004abcdefghijklmnopqrstuvwxyzab", ZINT_ERROR_INVALID_DATA, "" }, + /*741*/ { "[7037]004abcdefghijklmnopqrstuvwxyza", 0, "7037004abcdefghijklmnopqrstuvwxyza" }, + /*742*/ { "[7037]004abcdefghijklmnopqrstuvwxyzab", ZINT_ERROR_INVALID_DATA, "" }, + /*743*/ { "[7038]004abcdefghijklmnopqrstuvwxyza", 0, "7038004abcdefghijklmnopqrstuvwxyza" }, + /*744*/ { "[7038]004abcdefghijklmnopqrstuvwxyzab", ZINT_ERROR_INVALID_DATA, "" }, + /*745*/ { "[7039]004abcdefghijklmnopqrstuvwxyza", 0, "7039004abcdefghijklmnopqrstuvwxyza" }, + /*746*/ { "[7039]123abcdefghijklmnopqrstuvwxyzab", ZINT_ERROR_INVALID_DATA, "" }, + /*747*/ { "[7040]1abc", 0, "70401abc" }, + /*748*/ { "[7040]1ab", ZINT_ERROR_INVALID_DATA, "" }, + /*749*/ { "[7040]1abcd", ZINT_ERROR_INVALID_DATA, "" }, + /*750*/ { "[7041]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*751*/ { "[7042]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*752*/ { "[7050]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*753*/ { "[7090]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*754*/ { "[7099]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*755*/ { "[71]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*756*/ { "[710]abcdefghijklmnopqrst", 0, "710abcdefghijklmnopqrst" }, + /*757*/ { "[710]abcdefghijklmnopqrstu", ZINT_ERROR_INVALID_DATA, "" }, + /*758*/ { "[7100]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*759*/ { "[711]abcdefghijklmnopqrst", 0, "711abcdefghijklmnopqrst" }, + /*760*/ { "[711]abcdefghijklmnopqrstu", ZINT_ERROR_INVALID_DATA, "" }, + /*761*/ { "[712]abcdefghijklmnopqrst", 0, "712abcdefghijklmnopqrst" }, + /*762*/ { "[712]abcdefghijklmnopqrstu", ZINT_ERROR_INVALID_DATA, "" }, + /*763*/ { "[713]abcdefghijklmnopqrst", 0, "713abcdefghijklmnopqrst" }, + /*764*/ { "[713]abcdefghijklmnopqrstu", ZINT_ERROR_INVALID_DATA, "" }, + /*765*/ { "[714]abcdefghijklmnopqrst", 0, "714abcdefghijklmnopqrst" }, + /*766*/ { "[714]abcdefghijklmnopqrstu", ZINT_ERROR_INVALID_DATA, "" }, + /*767*/ { "[715]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*768*/ { "[716]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*769*/ { "[719]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*770*/ { "[72]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*771*/ { "[720]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*772*/ { "[7200]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*773*/ { "[721]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*774*/ { "[7210]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*775*/ { "[7220]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*776*/ { "[7230]EMabcdefghijklmnopqrstuvwxyzab", 0, "7230EMabcdefghijklmnopqrstuvwxyzab" }, + /*777*/ { "[7230]EMabcdefghijklmnopqrstuvwxyzabc", ZINT_ERROR_INVALID_DATA, "" }, + /*778*/ { "[7230]EM", ZINT_ERROR_INVALID_DATA, "" }, + /*779*/ { "[7231]EMabcdefghijklmnopqrstuvwxyzab", 0, "7231EMabcdefghijklmnopqrstuvwxyzab" }, + /*780*/ { "[7231]EMabcdefghijklmnopqrstuvwxyzabc", ZINT_ERROR_INVALID_DATA, "" }, + /*781*/ { "[7232]EMabcdefghijklmnopqrstuvwxyzab", 0, "7232EMabcdefghijklmnopqrstuvwxyzab" }, + /*782*/ { "[7232]EMabcdefghijklmnopqrstuvwxyzabc", ZINT_ERROR_INVALID_DATA, "" }, + /*783*/ { "[7233]EMabcdefghijklmnopqrstuvwxyzab", 0, "7233EMabcdefghijklmnopqrstuvwxyzab" }, + /*784*/ { "[7233]EMabcdefghijklmnopqrstuvwxyzabc", ZINT_ERROR_INVALID_DATA, "" }, + /*785*/ { "[7234]EMabcdefghijklmnopqrstuvwxyzab", 0, "7234EMabcdefghijklmnopqrstuvwxyzab" }, + /*786*/ { "[7234]EMabcdefghijklmnopqrstuvwxyzabc", ZINT_ERROR_INVALID_DATA, "" }, + /*787*/ { "[7235]EMabcdefghijklmnopqrstuvwxyzab", 0, "7235EMabcdefghijklmnopqrstuvwxyzab" }, + /*788*/ { "[7235]EMabcdefghijklmnopqrstuvwxyzabc", ZINT_ERROR_INVALID_DATA, "" }, + /*789*/ { "[7236]EMabcdefghijklmnopqrstuvwxyzab", 0, "7236EMabcdefghijklmnopqrstuvwxyzab" }, + /*790*/ { "[7236]EMabcdefghijklmnopqrstuvwxyzabc", ZINT_ERROR_INVALID_DATA, "" }, + /*791*/ { "[7237]EMabcdefghijklmnopqrstuvwxyzab", 0, "7237EMabcdefghijklmnopqrstuvwxyzab" }, + /*792*/ { "[7237]EMabcdefghijklmnopqrstuvwxyzabc", ZINT_ERROR_INVALID_DATA, "" }, + /*793*/ { "[7238]EMabcdefghijklmnopqrstuvwxyzab", 0, "7238EMabcdefghijklmnopqrstuvwxyzab" }, + /*794*/ { "[7238]EMabcdefghijklmnopqrstuvwxyzabc", ZINT_ERROR_INVALID_DATA, "" }, + /*795*/ { "[7239]EMabcdefghijklmnopqrstuvwxyzab", 0, "7239EMabcdefghijklmnopqrstuvwxyzab" }, + /*796*/ { "[7239]EMabcdefghijklmnopqrstuvwxyzabc", ZINT_ERROR_INVALID_DATA, "" }, + /*797*/ { "[7239]E", ZINT_ERROR_INVALID_DATA, "" }, + /*798*/ { "[7240]abcdefghijklmnopqrst", 0, "7240abcdefghijklmnopqrst" }, + /*799*/ { "[7240]abcdefghijklmnopqrstu", ZINT_ERROR_INVALID_DATA, "" }, + /*800*/ { "[7241]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*801*/ { "[7249]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*802*/ { "[7250]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*803*/ { "[7299]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*804*/ { "[73]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*805*/ { "[7300]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*806*/ { "[74]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*807*/ { "[7400]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*808*/ { "[79]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*809*/ { "[7900]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*810*/ { "[7999]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*811*/ { "[80]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*812*/ { "[800]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*813*/ { "[8000]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*814*/ { "[8001]12345678901234", ZINT_WARN_NONCOMPLIANT, "800112345678901234" }, + /*815*/ { "[8001]12345678901204", 0, "800112345678901204" }, + /*816*/ { "[8001]1234123456789012345", ZINT_ERROR_INVALID_DATA, "" }, + /*817*/ { "[8002]abcdefghijklmnopqrst", 0, "8002abcdefghijklmnopqrst" }, + /*818*/ { "[8002]abcdefghijklmnopqrstu", ZINT_ERROR_INVALID_DATA, "" }, + /*819*/ { "[8003]01234567890123abcdefghijklmnop", ZINT_WARN_NONCOMPLIANT, "800301234567890123abcdefghijklmnop" }, + /*820*/ { "[8003]01234567890128abcdefghijklmnop", 0, "800301234567890128abcdefghijklmnop" }, + /*821*/ { "[8003]01234567890128abcdefghijklmnopq", ZINT_ERROR_INVALID_DATA, "" }, + /*822*/ { "[8004]abcdefghijklmnopqrstuvwxyz1234", ZINT_WARN_NONCOMPLIANT, "8004abcdefghijklmnopqrstuvwxyz1234" }, + /*823*/ { "[8004]12cdefghijklmnopqrstuvwxyz1234", 0, "800412cdefghijklmnopqrstuvwxyz1234" }, + /*824*/ { "[8004]abcdefghijklmnopqrstuvwxyz12345", ZINT_ERROR_INVALID_DATA, "" }, + /*825*/ { "[8005]123456", 0, "8005123456" }, + /*826*/ { "[8005]12345", ZINT_ERROR_INVALID_DATA, "" }, + /*827*/ { "[8005]1234567", ZINT_ERROR_INVALID_DATA, "" }, + /*828*/ { "[8006]123456789012341212", ZINT_WARN_NONCOMPLIANT, "8006123456789012341212" }, + /*829*/ { "[8006]123456789012311212", 0, "8006123456789012311212" }, + /*830*/ { "[8006]12345678901234121", ZINT_ERROR_INVALID_DATA, "" }, + /*831*/ { "[8006]1234567890123412123", ZINT_ERROR_INVALID_DATA, "" }, + /*832*/ { "[8007]abcdefghijklmnopqrstuvwxyz12345678", ZINT_WARN_NONCOMPLIANT, "8007abcdefghijklmnopqrstuvwxyz12345678" }, + /*833*/ { "[8007]AD95EFGHIJKLMNOPQRSTUVWXYZ12345678", 0, "8007AD95EFGHIJKLMNOPQRSTUVWXYZ12345678" }, + /*834*/ { "[8007]AD95EFGHIJKLMNOPQRSTUVWXYZ123456789", ZINT_ERROR_INVALID_DATA, "" }, + /*835*/ { "[8008]123456121212", ZINT_WARN_NONCOMPLIANT, "8008123456121212" }, + /*836*/ { "[8008]121256121212", ZINT_WARN_NONCOMPLIANT, "8008121256121212" }, + /*837*/ { "[8008]121231121212", 0, "8008121231121212" }, + /*838*/ { "[8008]1234561212", ZINT_WARN_NONCOMPLIANT, "80081234561212" }, + /*839*/ { "[8008]1212311212", 0, "80081212311212" }, + /*840*/ { "[8008]12345612", ZINT_WARN_NONCOMPLIANT, "800812345612" }, + /*841*/ { "[8008]12010112", 0, "800812010112" }, + /*842*/ { "[8008]1234561", ZINT_ERROR_INVALID_DATA, "" }, + /*843*/ { "[8008]123456121", ZINT_ERROR_INVALID_DATA, "" }, + /*844*/ { "[8008]12345612121", ZINT_ERROR_INVALID_DATA, "" }, + /*845*/ { "[8008]1234561212123", ZINT_ERROR_INVALID_DATA, "" }, + /*846*/ { "[8009]12345678901234567890123456789012345678901234567890", 0, "800912345678901234567890123456789012345678901234567890" }, + /*847*/ { "[8009]123456789012345678901234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" }, + /*848*/ { "[8010]1234abcdefghijklmnopqrstuvwxyz1", ZINT_ERROR_INVALID_DATA, "" }, + /*849*/ { "[8011]123456789012", 0, "8011123456789012" }, + /*850*/ { "[8011]1234567890123", ZINT_ERROR_INVALID_DATA, "" }, + /*851*/ { "[8012]abcdefghijklmnopqrst", 0, "8012abcdefghijklmnopqrst" }, + /*852*/ { "[8012]abcdefghijklmnopqrstuv", ZINT_ERROR_INVALID_DATA, "" }, + /*853*/ { "[8013]1234abcdefghijklmnopqrstuvwxyz", 0, "80131234abcdefghijklmnopqrstuvwxyz" }, + /*854*/ { "[8013]1234abcdefghijklmnopqrstuvwxyz1", ZINT_ERROR_INVALID_DATA, "" }, + /*855*/ { "[8014]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*856*/ { "[8016]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*857*/ { "[8017]313131313131313139", ZINT_WARN_NONCOMPLIANT, "8017313131313131313139" }, + /*858*/ { "[8017]313131313131313131", 0, "8017313131313131313131" }, + /*859*/ { "[8017]31313131313131313", ZINT_ERROR_INVALID_DATA, "" }, + /*860*/ { "[8017]3131313131313131390", ZINT_ERROR_INVALID_DATA, "" }, + /*861*/ { "[8018]313131313131313139", ZINT_WARN_NONCOMPLIANT, "8018313131313131313139" }, + /*862*/ { "[8018]313131313131313131", 0, "8018313131313131313131" }, + /*863*/ { "[8018]31313131313131313", ZINT_ERROR_INVALID_DATA, "" }, + /*864*/ { "[8018]3131313131313131390", ZINT_ERROR_INVALID_DATA, "" }, + /*865*/ { "[8019]1234567890", 0, "80191234567890" }, + /*866*/ { "[8019]12345678901", ZINT_ERROR_INVALID_DATA, "" }, + /*867*/ { "[8020]abcdefghijklmnopqrstuvwxy", 0, "8020abcdefghijklmnopqrstuvwxy" }, + /*868*/ { "[8020]abcdefghijklmnopqrstuvwxyz", ZINT_ERROR_INVALID_DATA, "" }, + /*869*/ { "[8021]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*870*/ { "[8025]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*871*/ { "[8026]123456789012341212", ZINT_WARN_NONCOMPLIANT, "8026123456789012341212" }, + /*872*/ { "[8026]123456789012311212", 0, "8026123456789012311212" }, + /*873*/ { "[8026]1234567890123451212", ZINT_ERROR_INVALID_DATA, "" }, + /*874*/ { "[8026]12345678901234512", ZINT_ERROR_INVALID_DATA, "" }, + /*875*/ { "[8027]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*876*/ { "[8030]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*877*/ { "[8040]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*878*/ { "[8050]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*879*/ { "[8060]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*880*/ { "[8070]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*881*/ { "[8080]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*882*/ { "[8090]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*883*/ { "[8099]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*884*/ { "[81]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*885*/ { "[8100]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*886*/ { "[8109]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*887*/ { "[8110]5123456789011234565123455123450123105123450123512345678901320123190000", 0, "81105123456789011234565123455123450123105123450123512345678901320123190000" }, + /*888*/ { "[8110]51234567890112345651234551234501231051234501235123456789013201231900001", ZINT_ERROR_INVALID_DATA, "" }, + /*889*/ { "[8111]1234", 0, "81111234" }, + /*890*/ { "[8111]12345", ZINT_ERROR_INVALID_DATA, "" }, + /*891*/ { "[8111]123", ZINT_ERROR_INVALID_DATA, "" }, + /*892*/ { "[8112]1234567890123456789012345678901234567890123456789012345678901234567890", ZINT_WARN_NONCOMPLIANT, "81121234567890123456789012345678901234567890123456789012345678901234567890" }, + /*893*/ { "[8112]12345678901234567890123456789012345678901234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" }, + /*894*/ { "[8112]061234567890121234569123456789012345", 0, "8112061234567890121234569123456789012345" }, + /*895*/ { "[8113]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*896*/ { "[8120]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*897*/ { "[8130]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*898*/ { "[8140]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*899*/ { "[8150]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*900*/ { "[8190]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*901*/ { "[8199]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*902*/ { "[82]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*903*/ { "[8200]1234567890123456789012345678901234567890123456789012345678901234567890", 0, "82001234567890123456789012345678901234567890123456789012345678901234567890" }, + /*904*/ { "[8201]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*905*/ { "[8210]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*906*/ { "[8220]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*907*/ { "[8230]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*908*/ { "[8240]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*909*/ { "[8250]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*910*/ { "[8290]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*911*/ { "[8299]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*912*/ { "[83]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*913*/ { "[830]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*914*/ { "[8300]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*915*/ { "[84]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*916*/ { "[840]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*917*/ { "[8400]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*918*/ { "[85]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*919*/ { "[850]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*920*/ { "[8500]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*921*/ { "[89]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*922*/ { "[890]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*923*/ { "[8900]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*924*/ { "[90]abcdefghijklmnopqrstuvwxyz1234", 0, "90abcdefghijklmnopqrstuvwxyz1234" }, + /*925*/ { "[90]abcdefghijklmnopqrstuvwxyz12345", ZINT_ERROR_INVALID_DATA, "" }, + /*926*/ { "[900]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*927*/ { "[9000]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*928*/ { "[91]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890", 0, "91123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" }, + /*929*/ { "[91]1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" }, + /*930*/ { "[910]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*931*/ { "[9100]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*932*/ { "[92]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890", 0, "92123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" }, + /*933*/ { "[92]1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" }, + /*934*/ { "[920]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*935*/ { "[9200]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*936*/ { "[93]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890", 0, "93123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" }, + /*937*/ { "[93]1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" }, + /*938*/ { "[930]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*939*/ { "[9300]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*940*/ { "[94]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890", 0, "94123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" }, + /*941*/ { "[94]1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" }, + /*942*/ { "[940]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*943*/ { "[9400]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*944*/ { "[95]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890", 0, "95123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" }, + /*945*/ { "[95]1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" }, + /*946*/ { "[950]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*947*/ { "[9500]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*948*/ { "[96]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890", 0, "96123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" }, + /*949*/ { "[96]1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" }, + /*950*/ { "[960]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*951*/ { "[9600]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*952*/ { "[97]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890", 0, "97123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" }, + /*953*/ { "[97]1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" }, + /*954*/ { "[970]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*955*/ { "[9700]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*956*/ { "[98]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890", 0, "98123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" }, + /*957*/ { "[98]1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" }, + /*958*/ { "[980]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*959*/ { "[9800]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*960*/ { "[99]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890", 0, "99123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" }, + /*961*/ { "[99]1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" }, + /*962*/ { "[990]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*963*/ { "[9900]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*964*/ { "[9999]1234", ZINT_ERROR_INVALID_DATA, "" }, + /*965*/ { "[01]12345678901234[7006]200101", ZINT_WARN_NONCOMPLIANT, "01123456789012347006200101" }, + /*966*/ { "[01]12345678901231[7006]200101", 0, "01123456789012317006200101" }, + /*967*/ { "[3900]1234567890[01]12345678901234", ZINT_WARN_NONCOMPLIANT, "39001234567890[0112345678901234" }, + /*968*/ { "[3900]1234567890[01]12345678901231", 0, "39001234567890[0112345678901231" }, + /*969*/ { "[253]12345678901234[3901]12345678901234[20]12", ZINT_WARN_NONCOMPLIANT, "25312345678901234[390112345678901234[2012" }, + /*970*/ { "[253]12345678901284[3901]12345678901234[20]12", 0, "25312345678901284[390112345678901234[2012" }, + /*971*/ { "[253]12345678901234[01]12345678901234[3901]12345678901234[20]12", ZINT_WARN_NONCOMPLIANT, "25312345678901234[0112345678901234390112345678901234[2012" }, + /*972*/ { "[253]12345678901284[01]12345678901231[3901]12345678901234[20]12", 0, "25312345678901284[0112345678901231390112345678901234[2012" }, }; - int data_size = sizeof(data) / sizeof(struct item); + int data_size = ARRAY_SIZE(data); char reduced[1024]; for (int i = 0; i < data_size; i++) { if (index != -1 && i != index) continue; + if ((debug & ZINT_DEBUG_TEST_PRINT) && !(debug & ZINT_DEBUG_TEST_LESS_NOISY)) printf("i:%d\n", i); struct zint_symbol *symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); @@ -804,7 +1298,7 @@ static void test_gs1_verify(int index) { ret = gs1_verify(symbol, (unsigned char *) data[i].data, length, (unsigned char *) reduced); assert_equal(ret, data[i].ret, "i:%d ret %d != %d (length %d \"%s\") %s\n", i, ret, data[i].ret, length, data[i].data, symbol->errtxt); - if (ret == 0) { + if (ret < ZINT_ERROR) { assert_zero(strcmp(reduced, data[i].expected), "i:%d strcmp(%s, %s) != 0\n", i, reduced, data[i].expected); } @@ -814,6 +1308,367 @@ static void test_gs1_verify(int index) { testFinish(); } +static void test_gs1_lint(int index, int debug) { + + testStart(""); + + int ret; + struct item { + char *data; + int ret; + char *expected; + char *expected_errtxt; + }; + // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<")) + struct item data[] = { + /* 0*/ { "[00]123456789012345675", 0, "00123456789012345675", "" }, // numeric + /* 1*/ { "[00]12345678901234567.", ZINT_WARN_NONCOMPLIANT, "0012345678901234567.", "261: AI (00) position 18: Non-numeric character '.'" }, // numeric + /* 2*/ { "[00]123456789012345678", ZINT_WARN_NONCOMPLIANT, "00123456789012345678", "261: AI (00) position 18: Bad checksum '8', expected '5'" }, // csum + /* 3*/ { "[91]!\"%&'()*+,-./0123456789:;<=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz", 0, "91!\"%&'()*+,-./0123456789:;<=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz", "" }, // cset82 + /* 4*/ { "[91] ", ZINT_WARN_NONCOMPLIANT, "91 ", "261: AI (91) position 1: Invalid CSET 82 character ' '" }, // cset82 + /* 5*/ { "[91]#", ZINT_WARN_NONCOMPLIANT, "91#", "261: AI (91) position 1: Invalid CSET 82 character '#'" }, // cset82 + /* 6*/ { "[91]a^", ZINT_WARN_NONCOMPLIANT, "91a^", "261: AI (91) position 2: Invalid CSET 82 character '^'" }, // cset82 + /* 7*/ { "[91]!\"%&'()*+,-./0123456789:;<=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxy{", ZINT_WARN_NONCOMPLIANT, "91!\"%&'()*+,-./0123456789:;<=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxy{", "261: AI (91) position 82: Invalid CSET 82 character '{'" }, // cset82 + /* 8*/ { "[8010]01#-/23456789ABCDEFGHIJKLMNOPQ", 0, "801001#-/23456789ABCDEFGHIJKLMNOPQ", "" }, // cset39 + /* 9*/ { "[8010]6789ABCDEFGHIJKLMNOPQRSTUVWXYZ", 0, "80106789ABCDEFGHIJKLMNOPQRSTUVWXYZ", "" }, // cset39 + /* 10*/ { "[8010]01!", ZINT_WARN_NONCOMPLIANT, "801001!", "261: AI (8010) position 3: Invalid CSET 39 character '!'" }, // cset39 + /* 11*/ { "[8010]01a", ZINT_WARN_NONCOMPLIANT, "801001a", "261: AI (8010) position 3: Invalid CSET 39 character 'a'" }, // cset39 + /* 12*/ { "[8010]6789ABCDEFGHIJKLMNOPQRSTUVWXY}", ZINT_WARN_NONCOMPLIANT, "80106789ABCDEFGHIJKLMNOPQRSTUVWXY}", "261: AI (8010) position 30: Invalid CSET 39 character '}'" }, // cset39 + /* 13*/ { "[8010]#-/0123456789ABCDEFGHIJKLMNOPQ", ZINT_WARN_NONCOMPLIANT, "8010#-/0123456789ABCDEFGHIJKLMNOPQ", "261: AI (8010) position 1: Non-numeric company prefix '#'" }, // key + /* 14*/ { "[8010]0#-/123456789ABCDEFGHIJKLMNOPQ", ZINT_WARN_NONCOMPLIANT, "80100#-/123456789ABCDEFGHIJKLMNOPQ", "261: AI (8010) position 2: Non-numeric company prefix '#'" }, // key + /* 15*/ { "[11]120100", 0, "11120100", "" }, // yymmd0 + /* 16*/ { "[11]120131", 0, "11120131", "" }, // yymmd0 + /* 17*/ { "[11]120132", ZINT_WARN_NONCOMPLIANT, "11120132", "261: AI (11) position 5: Invalid day '32'" }, // yymmd0 + /* 18*/ { "[11]120229", 0, "11120229", "" }, // yymmd0 + /* 19*/ { "[11]110229", ZINT_WARN_NONCOMPLIANT, "11110229", "261: AI (11) position 5: Invalid day '29'" }, // yymmd0 + /* 20*/ { "[11]000229", 0, "11000229", "" }, // yymmd0 NOTE: will be false in 2050 + /* 21*/ { "[11]480229", 0, "11480229", "" }, // yymmd0 + /* 22*/ { "[11]500229", ZINT_WARN_NONCOMPLIANT, "11500229", "261: AI (11) position 5: Invalid day '29'" }, // yymmd0 + /* 23*/ { "[11]980229", ZINT_WARN_NONCOMPLIANT, "11980229", "261: AI (11) position 5: Invalid day '29'" }, // yymmd0 + /* 24*/ { "[11]110228", 0, "11110228", "" }, // yymmd0 + /* 25*/ { "[11]120230", ZINT_WARN_NONCOMPLIANT, "11120230", "261: AI (11) position 5: Invalid day '30'" }, // yymmd0 + /* 26*/ { "[11]120331", 0, "11120331", "" }, // yymmd0 + /* 27*/ { "[11]120332", ZINT_WARN_NONCOMPLIANT, "11120332", "261: AI (11) position 5: Invalid day '32'" }, // yymmd0 + /* 28*/ { "[11]120430", 0, "11120430", "" }, // yymmd0 + /* 29*/ { "[11]120431", ZINT_WARN_NONCOMPLIANT, "11120431", "261: AI (11) position 5: Invalid day '31'" }, // yymmd0 + /* 30*/ { "[11]120531", 0, "11120531", "" }, // yymmd0 + /* 31*/ { "[11]120532", ZINT_WARN_NONCOMPLIANT, "11120532", "261: AI (11) position 5: Invalid day '32'" }, // yymmd0 + /* 32*/ { "[11]120630", 0, "11120630", "" }, // yymmd0 + /* 33*/ { "[11]120631", ZINT_WARN_NONCOMPLIANT, "11120631", "261: AI (11) position 5: Invalid day '31'" }, // yymmd0 + /* 34*/ { "[11]120731", 0, "11120731", "" }, // yymmd0 + /* 35*/ { "[11]120732", ZINT_WARN_NONCOMPLIANT, "11120732", "261: AI (11) position 5: Invalid day '32'" }, // yymmd0 + /* 36*/ { "[11]120831", 0, "11120831", "" }, // yymmd0 + /* 37*/ { "[11]120832", ZINT_WARN_NONCOMPLIANT, "11120832", "261: AI (11) position 5: Invalid day '32'" }, // yymmd0 + /* 38*/ { "[11]120930", 0, "11120930", "" }, // yymmd0 + /* 39*/ { "[11]120931", ZINT_WARN_NONCOMPLIANT, "11120931", "261: AI (11) position 5: Invalid day '31'" }, // yymmd0 + /* 40*/ { "[11]121031", 0, "11121031", "" }, // yymmd0 + /* 41*/ { "[11]121032", ZINT_WARN_NONCOMPLIANT, "11121032", "261: AI (11) position 5: Invalid day '32'" }, // yymmd0 + /* 42*/ { "[11]121130", 0, "11121130", "" }, // yymmd0 + /* 43*/ { "[11]121131", ZINT_WARN_NONCOMPLIANT, "11121131", "261: AI (11) position 5: Invalid day '31'" }, // yymmd0 + /* 44*/ { "[11]121200", 0, "11121200", "" }, // yymmd0 + /* 45*/ { "[11]121231", 0, "11121231", "" }, // yymmd0 + /* 46*/ { "[11]121232", ZINT_WARN_NONCOMPLIANT, "11121232", "261: AI (11) position 5: Invalid day '32'" }, // yymmd0 + /* 47*/ { "[11]120031", ZINT_WARN_NONCOMPLIANT, "11120031", "261: AI (11) position 3: Invalid month '00'" }, // yymmd0 + /* 48*/ { "[11]121331", ZINT_WARN_NONCOMPLIANT, "11121331", "261: AI (11) position 3: Invalid month '13'" }, // yymmd0 + /* 49*/ { "[4326]121231", 0, "4326121231", "" }, // yymmdd + /* 50*/ { "[4326]121200", ZINT_WARN_NONCOMPLIANT, "4326121200", "261: AI (4326) position 5: Invalid day '00'" }, // yymmdd + /* 51*/ { "[4326]120031", ZINT_WARN_NONCOMPLIANT, "4326120031", "261: AI (4326) position 3: Invalid month '00'" }, // yymmdd + /* 52*/ { "[4326]129931", ZINT_WARN_NONCOMPLIANT, "4326129931", "261: AI (4326) position 3: Invalid month '99'" }, // yymmdd + /* 53*/ { "[4326]121299", ZINT_WARN_NONCOMPLIANT, "4326121299", "261: AI (4326) position 5: Invalid day '99'" }, // yymmdd + /* 54*/ { "[4326]120230", ZINT_WARN_NONCOMPLIANT, "4326120230", "261: AI (4326) position 5: Invalid day '30'" }, // yymmdd + /* 55*/ { "[4326]110229", ZINT_WARN_NONCOMPLIANT, "4326110229", "261: AI (4326) position 5: Invalid day '29'" }, // yymmdd + /* 56*/ { "[4326]000229", 0, "4326000229", "" }, // yymmdd NOTE: will be false in 2050 + /* 57*/ { "[4326]940229", ZINT_WARN_NONCOMPLIANT, "4326940229", "261: AI (4326) position 5: Invalid day '29'" }, // yymmdd + /* 58*/ { "[4324]1212310000", 0, "43241212310000", "" }, // hhmm + /* 59*/ { "[4324]1212312359", 0, "43241212312359", "" }, // hhmm + /* 60*/ { "[4324]1212312400", ZINT_WARN_NONCOMPLIANT, "43241212312400", "261: AI (4324) position 7: Invalid hour of day '24'" }, // hhmm + /* 61*/ { "[4324]1212312360", ZINT_WARN_NONCOMPLIANT, "43241212312360", "261: AI (4324) position 9: Invalid minutes in the hour '60'" }, // hhmm + /* 62*/ { "[8008]121231000000", 0, "8008121231000000", "" }, // hhoptmmss + /* 63*/ { "[8008]1212310000", 0, "80081212310000", "" }, // hhoptmmss + /* 64*/ { "[8008]12123100", 0, "800812123100", "" }, // hhoptmmss + /* 65*/ { "[8008]12123123", 0, "800812123123", "" }, // hhoptmmss + /* 66*/ { "[8008]12123124", ZINT_WARN_NONCOMPLIANT, "800812123124", "261: AI (8008) position 7: Invalid hour of day '24'" }, // hhoptmmss + /* 67*/ { "[8008]1212312359", 0, "80081212312359", "" }, // hhoptmmss + /* 68*/ { "[8008]1212312360", ZINT_WARN_NONCOMPLIANT, "80081212312360", "261: AI (8008) position 9: Invalid minutes in the hour '60'" }, // hhoptmmss + /* 69*/ { "[8008]121231235959", 0, "8008121231235959", "" }, // hhoptmmss + /* 70*/ { "[8008]121231235960", ZINT_WARN_NONCOMPLIANT, "8008121231235960", "261: AI (8008) position 11: Invalid seconds in the minute '60'" }, // hhoptmmss + /* 71*/ { "[422]004", 0, "422004", "" }, // iso3166 + /* 72*/ { "[422]894", 0, "422894", "" }, // iso3166 + /* 73*/ { "[422]00", ZINT_ERROR_INVALID_DATA, "", "259: Invalid data length for AI (422)" }, // iso3166 + /* 74*/ { "[422]0A", ZINT_ERROR_INVALID_DATA, "", "259: Invalid data length for AI (422)" }, // iso3166 + /* 75*/ { "[422]003", ZINT_WARN_NONCOMPLIANT, "422003", "261: AI (422) position 1: Unknown country code '003'" }, // iso3166 + /* 76*/ { "[422]895", ZINT_WARN_NONCOMPLIANT, "422895", "261: AI (422) position 1: Unknown country code '895'" }, // iso3166 + /* 77*/ { "[422]999", ZINT_WARN_NONCOMPLIANT, "422999", "261: AI (422) position 1: Unknown country code '999'" }, // iso3166 + /* 78*/ { "[423]004", 0, "423004", "" }, // iso3166list + /* 79*/ { "[423]004894", 0, "423004894", "" }, // iso3166list + /* 80*/ { "[423]004894004", 0, "423004894004", "" }, // iso3166list + /* 81*/ { "[423]004894004894", 0, "423004894004894", "" }, // iso3166list + /* 82*/ { "[423]004894004894004", 0, "423004894004894004", "" }, // iso3166list + /* 83*/ { "[423]004894004894004894", ZINT_ERROR_INVALID_DATA, "", "259: Invalid data length for AI (423)" }, // iso3166list + /* 84*/ { "[423]123894004894004894", ZINT_ERROR_INVALID_DATA, "", "259: Invalid data length for AI (423)" }, // iso3166list + /* 85*/ { "[423]A04894004894004894", ZINT_ERROR_INVALID_DATA, "", "259: Invalid data length for AI (423)" }, // iso3166list + /* 86*/ { "[423]00489400489400489", ZINT_ERROR_INVALID_DATA, "", "259: Invalid data length for AI (423)" }, // iso3166list + /* 87*/ { "[423]0048940048940048", ZINT_ERROR_INVALID_DATA, "", "259: Invalid data length for AI (423)" }, // iso3166list + /* 88*/ { "[423]00489400489400", ZINT_WARN_NONCOMPLIANT, "42300489400489400", "259: Invalid data length for AI (423)" }, // iso3166list + /* 89*/ { "[423]0048940048940", ZINT_WARN_NONCOMPLIANT, "4230048940048940", "259: Invalid data length for AI (423)" }, // iso3166list + /* 90*/ { "[423]00489400489", ZINT_WARN_NONCOMPLIANT, "42300489400489", "259: Invalid data length for AI (423)" }, // iso3166list + /* 91*/ { "[423]0048940048", ZINT_WARN_NONCOMPLIANT, "4230048940048", "259: Invalid data length for AI (423)" }, // iso3166list + /* 92*/ { "[423]00489400", ZINT_WARN_NONCOMPLIANT, "42300489400", "259: Invalid data length for AI (423)" }, // iso3166list + /* 93*/ { "[423]0048940", ZINT_WARN_NONCOMPLIANT, "4230048940", "259: Invalid data length for AI (423)" }, // iso3166list + /* 94*/ { "[423]00489", ZINT_WARN_NONCOMPLIANT, "42300489", "259: Invalid data length for AI (423)" }, // iso3166list + /* 95*/ { "[423]0048", ZINT_WARN_NONCOMPLIANT, "4230048", "259: Invalid data length for AI (423)" }, // iso3166list + /* 96*/ { "[423]00", ZINT_ERROR_INVALID_DATA, "", "259: Invalid data length for AI (423)" }, // iso3166list + /* 97*/ { "[423]0", ZINT_ERROR_INVALID_DATA, "", "259: Invalid data length for AI (423)" }, // iso3166list + /* 98*/ { "[423]004894004894003", ZINT_WARN_NONCOMPLIANT, "423004894004894003", "261: AI (423) position 13: Unknown country code '003'" }, // iso3166list + /* 99*/ { "[423]004894004895004", ZINT_WARN_NONCOMPLIANT, "423004894004895004", "261: AI (423) position 10: Unknown country code '895'" }, // iso3166list + /*100*/ { "[423]004894004999004", ZINT_WARN_NONCOMPLIANT, "423004894004999004", "261: AI (423) position 10: Unknown country code '999'" }, // iso3166list + /*101*/ { "[423]004894005894004", ZINT_WARN_NONCOMPLIANT, "423004894005894004", "261: AI (423) position 7: Unknown country code '005'" }, // iso3166list + /*102*/ { "[423]004893004894004", ZINT_WARN_NONCOMPLIANT, "423004893004894004", "261: AI (423) position 4: Unknown country code '893'" }, // iso3166list + /*103*/ { "[423]004999004894004", ZINT_WARN_NONCOMPLIANT, "423004999004894004", "261: AI (423) position 4: Unknown country code '999'" }, // iso3166list + /*104*/ { "[423]003894004894004", ZINT_WARN_NONCOMPLIANT, "423003894004894004", "261: AI (423) position 1: Unknown country code '003'" }, // iso3166list + /*105*/ { "[423]004894004433", ZINT_WARN_NONCOMPLIANT, "423004894004433", "261: AI (423) position 10: Unknown country code '433'" }, // iso3166list + /*106*/ { "[423]004894435894", ZINT_WARN_NONCOMPLIANT, "423004894435894", "261: AI (423) position 7: Unknown country code '435'" }, // iso3166list + /*107*/ { "[423]004433004894", ZINT_WARN_NONCOMPLIANT, "423004433004894", "261: AI (423) position 4: Unknown country code '433'" }, // iso3166list + /*108*/ { "[423]432894004894", ZINT_WARN_NONCOMPLIANT, "423432894004894", "261: AI (423) position 1: Unknown country code '432'" }, // iso3166list + /*109*/ { "[423]004894003", ZINT_WARN_NONCOMPLIANT, "423004894003", "261: AI (423) position 7: Unknown country code '003'" }, // iso3166list + /*110*/ { "[423]004895004", ZINT_WARN_NONCOMPLIANT, "423004895004", "261: AI (423) position 4: Unknown country code '895'" }, // iso3166list + /*111*/ { "[423]004999004", ZINT_WARN_NONCOMPLIANT, "423004999004", "261: AI (423) position 4: Unknown country code '999'" }, // iso3166list + /*112*/ { "[423]003894004", ZINT_WARN_NONCOMPLIANT, "423003894004", "261: AI (423) position 1: Unknown country code '003'" }, // iso3166list + /*113*/ { "[423]004999", ZINT_WARN_NONCOMPLIANT, "423004999", "261: AI (423) position 4: Unknown country code '999'" }, // iso3166list + /*114*/ { "[423]000894", ZINT_WARN_NONCOMPLIANT, "423000894", "261: AI (423) position 1: Unknown country code '000'" }, // iso3166list + /*115*/ { "[423]003", ZINT_WARN_NONCOMPLIANT, "423003", "261: AI (423) position 1: Unknown country code '003'" }, // iso3166list + /*116*/ { "[7030]999A", 0, "7030999A", "" }, // iso3166999 + /*117*/ { "[7030]894A", 0, "7030894A", "" }, // iso3166999 + /*118*/ { "[7030]004A", 0, "7030004A", "" }, // iso3166999 + /*119*/ { "[7030]004", ZINT_ERROR_INVALID_DATA, "", "259: Invalid data length for AI (7030)" }, // iso3166999 + /*120*/ { "[7030]04", ZINT_ERROR_INVALID_DATA, "", "259: Invalid data length for AI (7030)" }, // iso3166999 + /*121*/ { "[7030]001A", ZINT_WARN_NONCOMPLIANT, "7030001A", "261: AI (7030) position 1: Unknown country code '001'" }, // iso3166999 + /*122*/ { "[7030]998A", ZINT_WARN_NONCOMPLIANT, "7030998A", "261: AI (7030) position 1: Unknown country code '998'" }, // iso3166999 + /*123*/ { "[3910]0081", 0, "39100081", "" }, // iso4217 + /*124*/ { "[3910]9991", 0, "39109991", "" }, // iso4217 + /*125*/ { "[3910]9971", 0, "39109971", "" }, // iso4217 + /*126*/ { "[3910]01", ZINT_ERROR_INVALID_DATA, "", "259: Invalid data length for AI (3910)" }, // iso4217 + /*127*/ { "[3910]001", ZINT_ERROR_INVALID_DATA, "", "259: Invalid data length for AI (3910)" }, // iso4217 + /*128*/ { "[3910]9981", ZINT_WARN_NONCOMPLIANT, "39109981", "261: AI (3910) position 1: Unknown currency code '998'" }, // iso4217 + /*129*/ { "[3910]0041", ZINT_WARN_NONCOMPLIANT, "39100041", "261: AI (3910) position 1: Unknown currency code '004'" }, // iso4217 + /*130*/ { "[3910]8941", ZINT_WARN_NONCOMPLIANT, "39108941", "261: AI (3910) position 1: Unknown currency code '894'" }, // iso4217 + /*131*/ { "[4300]%12", 0, "4300%12", "" }, // pcenc + /*132*/ { "[4300]%1", ZINT_WARN_NONCOMPLIANT, "4300%1", "261: AI (4300) position 1: Invalid % escape" }, // pcenc + /*133*/ { "[4300]%", ZINT_WARN_NONCOMPLIANT, "4300%", "261: AI (4300) position 1: Invalid % escape" }, // pcenc + /*134*/ { "[4300]12%1212", 0, "430012%1212", "" }, // pcenc + /*135*/ { "[4300]12%1G12", ZINT_WARN_NONCOMPLIANT, "430012%1G12", "261: AI (4300) position 5: Invalid characters for percent encoding" }, // pcenc + /*136*/ { "[4321]1", 0, "43211", "" }, // yesno + /*137*/ { "[4321]0", 0, "43210", "" }, // yesno + /*138*/ { "[4321]2", ZINT_WARN_NONCOMPLIANT, "43212", "261: AI (4321) position 1: Neither 0 nor 1 for yes or no" }, // yesno + /*139*/ { "[4321]9", ZINT_WARN_NONCOMPLIANT, "43219", "261: AI (4321) position 1: Neither 0 nor 1 for yes or no" }, // yesno + /*140*/ { "[7040]1234", 0, "70401234", "" }, // importeridx + /*141*/ { "[7040]123A", 0, "7040123A", "" }, // importeridx + /*142*/ { "[7040]123Z", 0, "7040123Z", "" }, // importeridx + /*143*/ { "[7040]123a", 0, "7040123a", "" }, // importeridx + /*144*/ { "[7040]123z", 0, "7040123z", "" }, // importeridx + /*145*/ { "[7040]123-", 0, "7040123-", "" }, // importeridx + /*146*/ { "[7040]123_", 0, "7040123_", "" }, // importeridx + /*147*/ { "[7040]123!", ZINT_WARN_NONCOMPLIANT, "7040123!", "261: AI (7040) position 4: Invalid importer index '!'" }, // importeridx + /*148*/ { "[7040]123/", ZINT_WARN_NONCOMPLIANT, "7040123/", "261: AI (7040) position 4: Invalid importer index '/'" }, // importeridx + /*149*/ { "[7040]123:", ZINT_WARN_NONCOMPLIANT, "7040123:", "261: AI (7040) position 4: Invalid importer index ':'" }, // importeridx + /*150*/ { "[7040]123?", ZINT_WARN_NONCOMPLIANT, "7040123?", "261: AI (7040) position 4: Invalid importer index '?'" }, // importeridx + /*151*/ { "[8001]12341234512311", 0, "800112341234512311", "" }, // nonzero + /*152*/ { "[8001]00010000100100", 0, "800100010000100100", "" }, // nonzero + /*153*/ { "[8001]00001234512311", ZINT_WARN_NONCOMPLIANT, "800100001234512311", "261: AI (8001) position 1: Zero not permitted" }, // nonzero + /*154*/ { "[8001]12340000012311", ZINT_WARN_NONCOMPLIANT, "800112340000012311", "261: AI (8001) position 5: Zero not permitted" }, // nonzero + /*155*/ { "[8001]00010000100011", ZINT_WARN_NONCOMPLIANT, "800100010000100011", "261: AI (8001) position 10: Zero not permitted" }, // nonzero + /*156*/ { "[8001]00010000100101", 0, "800100010000100101", "" }, // winding + /*157*/ { "[8001]00010000100111", 0, "800100010000100111", "" }, // winding + /*158*/ { "[8001]00010000100191", 0, "800100010000100191", "" }, // winding + /*159*/ { "[8001]00010000100121", ZINT_WARN_NONCOMPLIANT, "800100010000100121", "261: AI (8001) position 13: Invalid winding direction '2'" }, // winding + /*160*/ { "[8001]00010000100131", ZINT_WARN_NONCOMPLIANT, "800100010000100131", "261: AI (8001) position 13: Invalid winding direction '3'" }, // winding + /*161*/ { "[8001]00010000100171", ZINT_WARN_NONCOMPLIANT, "800100010000100171", "261: AI (8001) position 13: Invalid winding direction '7'" }, // winding + /*162*/ { "[8001]00010000100181", ZINT_WARN_NONCOMPLIANT, "800100010000100181", "261: AI (8001) position 13: Invalid winding direction '8'" }, // winding + /*163*/ { "[8003]01234567890128", 0, "800301234567890128", "" }, // zero + /*164*/ { "[8003]11234567890128", ZINT_WARN_NONCOMPLIANT, "800311234567890128", "261: AI (8003) position 1: Zero is required" }, // zero + /*165*/ { "[8003]91234567890128", ZINT_WARN_NONCOMPLIANT, "800391234567890128", "261: AI (8003) position 1: Zero is required" }, // zero + /*166*/ { "[8006]123456789012310101", 0, "8006123456789012310101", "" }, // pieceoftotal + /*167*/ { "[8006]123456789012310199", 0, "8006123456789012310199", "" }, // pieceoftotal + /*168*/ { "[8006]123456789012319999", 0, "8006123456789012319999", "" }, // pieceoftotal + /*169*/ { "[8006]123456789012310001", ZINT_WARN_NONCOMPLIANT, "8006123456789012310001", "261: AI (8006) position 15: Piece number cannot be zero" }, // pieceoftotal + /*170*/ { "[8006]123456789012310100", ZINT_WARN_NONCOMPLIANT, "8006123456789012310100", "261: AI (8006) position 15: Total number cannot be zero" }, // pieceoftotal + /*171*/ { "[8006]123456789012310201", ZINT_WARN_NONCOMPLIANT, "8006123456789012310201", "261: AI (8006) position 15: Piece number '02' exceeds total '01'" }, // pieceoftotal + /*172*/ { "[8006]123456789012319998", ZINT_WARN_NONCOMPLIANT, "8006123456789012319998", "261: AI (8006) position 15: Piece number '99' exceeds total '98'" }, // pieceoftotal + /*173*/ { "[8007]GB82WEST12345698765432", 0, "8007GB82WEST12345698765432", "" }, // iban + /*174*/ { "[8007]GB83WEST12345698765432", ZINT_WARN_NONCOMPLIANT, "8007GB83WEST12345698765432", "261: AI (8007) position 3: Bad IBAN checksum '83', expected '82'" }, // iban + /*175*/ { "[8007]BE71096123456769", 0, "8007BE71096123456769", "" }, // iban + /*176*/ { "[8007]BE71096123456760", ZINT_WARN_NONCOMPLIANT, "8007BE71096123456760", "261: AI (8007) position 3: Bad IBAN checksum '71', expected '23'" }, // iban + /*177*/ { "[8007]BE01096123456760", ZINT_WARN_NONCOMPLIANT, "8007BE01096123456760", "261: AI (8007) position 3: Bad IBAN checksum '01', expected '23'" }, // iban + /*178*/ { "[8007]BE00096123456760", ZINT_WARN_NONCOMPLIANT, "8007BE00096123456760", "261: AI (8007) position 3: Bad IBAN checksum '00', expected '23'" }, // iban + /*179*/ { "[8007]LC14BOSL123456789012345678901234", 0, "8007LC14BOSL123456789012345678901234", "" }, // iban + /*180*/ { "[8007]LC14BOSL123456789012345678901230", ZINT_WARN_NONCOMPLIANT, "8007LC14BOSL123456789012345678901230", "261: AI (8007) position 3: Bad IBAN checksum '14', expected '25'" }, // iban + /*181*/ { "[8007]A114BOSL123456789012345678901230", ZINT_WARN_NONCOMPLIANT, "8007A114BOSL123456789012345678901230", "261: AI (8007) position 1: Non-alphabetic IBAN country code 'A1'" }, // iban + /*182*/ { "[8007]1A14BOSL123456789012345678901230", ZINT_WARN_NONCOMPLIANT, "80071A14BOSL123456789012345678901230", "261: AI (8007) position 1: Non-alphabetic IBAN country code '1A'" }, // iban + /*183*/ { "[8007]AA14BOSL123456789012345678901230", ZINT_WARN_NONCOMPLIANT, "8007AA14BOSL123456789012345678901230", "261: AI (8007) position 1: Invalid IBAN country code 'AA'" }, // iban + /*184*/ { "[8007]ZZ14BOSL123456789012345678901230", ZINT_WARN_NONCOMPLIANT, "8007ZZ14BOSL123456789012345678901230", "261: AI (8007) position 1: Invalid IBAN country code 'ZZ'" }, // iban + /*185*/ { "[8007]ZW33BOSL123456789012345678901230", 0, "8007ZW33BOSL123456789012345678901230", "" }, // iban + /*186*/ { "[8007]ZWA3BOSL123456789012345678901230", ZINT_WARN_NONCOMPLIANT, "8007ZWA3BOSL123456789012345678901230", "261: AI (8007) position 3: Non-numeric IBAN checksum 'A3'" }, // iban + /*187*/ { "[8007]ZW3ABOSL123456789012345678901230", ZINT_WARN_NONCOMPLIANT, "8007ZW3ABOSL123456789012345678901230", "261: AI (8007) position 3: Non-numeric IBAN checksum '3A'" }, // iban + /*188*/ { "[8007]ZW33bOSL123456789012345678901230", ZINT_WARN_NONCOMPLIANT, "8007ZW33bOSL123456789012345678901230", "261: AI (8007) position 5: Invalid IBAN character 'b'" }, // iban + /*189*/ { "[8007]FR7630006000011234567890189", 0, "8007FR7630006000011234567890189", "" }, // iban + /*190*/ { "[8007]DE91100000000123456789", 0, "8007DE91100000000123456789", "" }, // iban + /*191*/ { "[8007]GR9608100010000001234567890", 0, "8007GR9608100010000001234567890", "" }, // iban + /*192*/ { "[8007]MU43BOMM0101123456789101000MUR", 0, "8007MU43BOMM0101123456789101000MUR", "" }, // iban + /*193*/ { "[8007]PL10105000997603123456789123", 0, "8007PL10105000997603123456789123", "" }, // iban + /*194*/ { "[8007]RO09BCYP0000001234567890", 0, "8007RO09BCYP0000001234567890", "" }, // iban + /*195*/ { "[8007]SA4420000001234567891234", 0, "8007SA4420000001234567891234", "" }, // iban + /*196*/ { "[8007]ES7921000813610123456789", 0, "8007ES7921000813610123456789", "" }, // iban + /*197*/ { "[8007]CH5604835012345678009", 0, "8007CH5604835012345678009", "" }, // iban + /*198*/ { "[8007]GB98MIDL07009312345678", 0, "8007GB98MIDL07009312345678", "" }, // iban + /*199*/ { "[8011]1", 0, "80111", "" }, // nozeroprefix + /*200*/ { "[8011]11", 0, "801111", "" }, // nozeroprefix + /*201*/ { "[8011]0", 0, "80110", "" }, // nozeroprefix + /*202*/ { "[8011]01", ZINT_WARN_NONCOMPLIANT, "801101", "261: AI (8011) position 1: Zero prefix is not permitted" }, // nozeroprefix + /*203*/ { "[8110]106141416543213150110120", 0, "8110106141416543213150110120", "" }, // couponcode (first part of NACAG Appendix C: Example 1 - see test_rss.c test_examples) + /*204*/ { "[8110]012345612345610104123", 0, "8110012345612345610104123", "" }, // couponcode + /*205*/ { "[8110]01234561234561010412", ZINT_WARN_NONCOMPLIANT, "811001234561234561010412", "259: Invalid data length for AI (8110)" }, // couponcode + /*206*/ { "[8110]12345678901234567890", ZINT_WARN_NONCOMPLIANT, "811012345678901234567890", "259: Invalid data length for AI (8110)" }, // couponcode + /*207*/ { "[8110]712345612345610104123", ZINT_WARN_NONCOMPLIANT, "8110712345612345610104123", "261: AI (8110) position 1: Invalid Primary GS1 Co. Prefix VLI '7'" }, // couponcode + /*208*/ { "[8110]A12345612345610104123", ZINT_WARN_NONCOMPLIANT, "8110A12345612345610104123", "261: AI (8110) position 1: Non-numeric Primary GS1 Co. Prefix VLI 'A'" }, // couponcode + /*209*/ { "[8110]012345A12345610104123", ZINT_WARN_NONCOMPLIANT, "8110012345A12345610104123", "261: AI (8110) position 7: Non-numeric Primary GS1 Co. Prefix 'A'" }, // couponcode + /*210*/ { "[8110]012345612345A10104123", ZINT_WARN_NONCOMPLIANT, "8110012345612345A10104123", "261: AI (8110) position 8: Non-numeric Offer Code" }, // couponcode + /*211*/ { "[8110]012345612345600104123", ZINT_WARN_NONCOMPLIANT, "8110012345612345600104123", "261: AI (8110) position 14: Invalid Save Value VLI '0'" }, // couponcode + /*212*/ { "[8110]012345612345660104123", ZINT_WARN_NONCOMPLIANT, "8110012345612345660104123", "261: AI (8110) position 14: Invalid Save Value VLI '6'" }, // couponcode + /*213*/ { "[8110]01234561234561A104123", ZINT_WARN_NONCOMPLIANT, "811001234561234561A104123", "261: AI (8110) position 15: Non-numeric Save Value 'A'" }, // couponcode + /*214*/ { "[8110]012345612345610004123", ZINT_WARN_NONCOMPLIANT, "8110012345612345610004123", "261: AI (8110) position 16: Invalid Primary Purch. Req. VLI '0'" }, // couponcode + /*215*/ { "[8110]012345612345610604123", ZINT_WARN_NONCOMPLIANT, "8110012345612345610604123", "261: AI (8110) position 16: Invalid Primary Purch. Req. VLI '6'" }, // couponcode + /*216*/ { "[8110]0123456123456101A4123", ZINT_WARN_NONCOMPLIANT, "81100123456123456101A4123", "261: AI (8110) position 17: Non-numeric Primary Purch. Req. 'A'" }, // couponcode + /*217*/ { "[8110]012345612345621251234", ZINT_WARN_NONCOMPLIANT, "8110012345612345621251234", "261: AI (8110) position 18: Primary Purch. Req. incomplete" }, // couponcode + /*218*/ { "[8110]012345612345610106123", ZINT_WARN_NONCOMPLIANT, "8110012345612345610106123", "261: AI (8110) position 18: Invalid Primary Purch. Req. Code '6'" }, // couponcode + /*219*/ { "[8110]012345612345610212412", ZINT_WARN_NONCOMPLIANT, "8110012345612345610212412", "261: AI (8110) position 20: Primary Purch. Family Code incomplete" }, // couponcode + /*220*/ { "[8110]0123456123456103123412", ZINT_WARN_NONCOMPLIANT, "81100123456123456103123412", "261: AI (8110) position 21: Primary Purch. Family Code incomplete" }, // couponcode + /*221*/ { "[8110]0123456123456103123412A", ZINT_WARN_NONCOMPLIANT, "81100123456123456103123412A", "261: AI (8110) position 21: Non-numeric Primary Purch. Family Code" }, // couponcode + /*222*/ { "[8110]01234561234561031234123", 0, "811001234561234561031234123", "" }, // couponcode + /*223*/ { "[8110]612345678901212345651", ZINT_WARN_NONCOMPLIANT, "8110612345678901212345651", "261: AI (8110) position 21: Save Value incomplete" }, // couponcode + /*224*/ { "[8110]6123456789012123456512345", ZINT_WARN_NONCOMPLIANT, "81106123456789012123456512345", "261: AI (8110) position 26: Primary Purch. Req. VLI missing" }, // couponcode + /*225*/ { "[8110]61234567890121234565123455123454123", 0, "811061234567890121234565123455123454123", "" }, // couponcode + /*226*/ { "[8110]61234567890121234565123455123454123A", ZINT_WARN_NONCOMPLIANT, "811061234567890121234565123455123454123A", "261: AI (8110) position 36: Non-numeric Data Field 'A'" }, // couponcode + /*227*/ { "[8110]612345678901212345651234551234541237", ZINT_WARN_NONCOMPLIANT, "8110612345678901212345651234551234541237", "261: AI (8110) position 36: Invalid Data Field '7'" }, // couponcode + /*228*/ { "[8110]612345678901212345651234551234541238", ZINT_WARN_NONCOMPLIANT, "8110612345678901212345651234551234541238", "261: AI (8110) position 36: Invalid Data Field '8'" }, // couponcode + /*229*/ { "[8110]0123456123456101041231", ZINT_WARN_NONCOMPLIANT, "81100123456123456101041231", "261: AI (8110) position 23: Add. Purch. Rules Code incomplete" }, // couponcode + /*230*/ { "[8110]0123456123456101041231A", ZINT_WARN_NONCOMPLIANT, "81100123456123456101041231A", "261: AI (8110) position 23: Non-numeric Add. Purch. Rules Code" }, // couponcode + /*231*/ { "[8110]01234561234561010412314", ZINT_WARN_NONCOMPLIANT, "811001234561234561010412314", "261: AI (8110) position 23: Invalid Add. Purch. Rules Code '4'" }, // couponcode + /*232*/ { "[8110]01234561234561010412313", ZINT_WARN_NONCOMPLIANT, "811001234561234561010412313", "261: AI (8110) position 24: 2nd Purch. Req. VLI missing" }, // couponcode + /*233*/ { "[8110]01234561234561010412313A", ZINT_WARN_NONCOMPLIANT, "811001234561234561010412313A", "261: AI (8110) position 24: Non-numeric 2nd Purch. Req. VLI 'A'" }, // couponcode + /*234*/ { "[8110]012345612345610104123130", ZINT_WARN_NONCOMPLIANT, "8110012345612345610104123130", "261: AI (8110) position 24: Invalid 2nd Purch. Req. VLI '0'" }, // couponcode + /*235*/ { "[8110]012345612345610104123131", ZINT_WARN_NONCOMPLIANT, "8110012345612345610104123131", "261: AI (8110) position 25: 2nd Purch. Req. incomplete" }, // couponcode + /*236*/ { "[8110]012345612345610104123131A", ZINT_WARN_NONCOMPLIANT, "8110012345612345610104123131A", "261: AI (8110) position 25: Non-numeric 2nd Purch. Req. 'A'" }, // couponcode + /*237*/ { "[8110]0123456123456101041231310", ZINT_WARN_NONCOMPLIANT, "81100123456123456101041231310", "261: AI (8110) position 26: 2nd Purch. Req. Code incomplete" }, // couponcode + /*238*/ { "[8110]0123456123456101041231310A", ZINT_WARN_NONCOMPLIANT, "81100123456123456101041231310A", "261: AI (8110) position 26: Non-numeric 2nd Purch. Req. Code" }, // couponcode + /*239*/ { "[8110]01234561234561010412313108", ZINT_WARN_NONCOMPLIANT, "811001234561234561010412313108", "261: AI (8110) position 26: Invalid 2nd Purch. Req. Code '8'" }, // couponcode + /*240*/ { "[8110]01234561234561010412313100", ZINT_WARN_NONCOMPLIANT, "811001234561234561010412313100", "261: AI (8110) position 27: 2nd Purch. Family Code incomplete" }, // couponcode + /*241*/ { "[8110]01234561234561010412313100123", ZINT_WARN_NONCOMPLIANT, "811001234561234561010412313100123", "261: AI (8110) position 30: 2nd Purch. GS1 Co. Prefix VLI missing" }, // couponcode + /*242*/ { "[8110]01234561234561010412313100123A", ZINT_WARN_NONCOMPLIANT, "811001234561234561010412313100123A", "261: AI (8110) position 30: Non-numeric 2nd Purch. GS1 Co. Prefix VLI 'A'" }, // couponcode + /*243*/ { "[8110]012345612345610104123131001239", 0, "8110012345612345610104123131001239", "" }, // couponcode + /*244*/ { "[8110]01234561234561010412313100123012345", ZINT_WARN_NONCOMPLIANT, "811001234561234561010412313100123012345", "261: AI (8110) position 31: 2nd Purch. GS1 Co. Prefix incomplete" }, // couponcode + /*245*/ { "[8110]0123456123456101041231310012311234567", 0, "81100123456123456101041231310012311234567", "" }, // couponcode + /*246*/ { "[8110]0123456123456101041232", ZINT_WARN_NONCOMPLIANT, "81100123456123456101041232", "261: AI (8110) position 23: 3rd Purch. Req. VLI missing" }, // couponcode + /*247*/ { "[8110]0123456123456101041232A", ZINT_WARN_NONCOMPLIANT, "81100123456123456101041232A", "261: AI (8110) position 23: Non-numeric 3rd Purch. Req. VLI 'A'" }, // couponcode + /*248*/ { "[8110]01234561234561010412326", ZINT_WARN_NONCOMPLIANT, "811001234561234561010412326", "261: AI (8110) position 23: Invalid 3rd Purch. Req. VLI '6'" }, // couponcode + /*249*/ { "[8110]01234561234561010412321", ZINT_WARN_NONCOMPLIANT, "811001234561234561010412321", "261: AI (8110) position 24: 3rd Purch. Req. incomplete" }, // couponcode + /*250*/ { "[8110]012345612345610104123210", ZINT_WARN_NONCOMPLIANT, "8110012345612345610104123210", "261: AI (8110) position 25: 3rd Purch. Req. Code incomplete" }, // couponcode + /*251*/ { "[8110]0123456123456101041232105", ZINT_WARN_NONCOMPLIANT, "81100123456123456101041232105", "261: AI (8110) position 25: Invalid 3rd Purch. Req. Code '5'" }, // couponcode + /*252*/ { "[8110]0123456123456101041232104", ZINT_WARN_NONCOMPLIANT, "81100123456123456101041232104", "261: AI (8110) position 26: 3rd Purch. Family Code incomplete" }, // couponcode + /*253*/ { "[8110]012345612345610104123210412A", ZINT_WARN_NONCOMPLIANT, "8110012345612345610104123210412A", "261: AI (8110) position 26: Non-numeric 3rd Purch. Family Code" }, // couponcode + /*254*/ { "[8110]0123456123456101041232104123", ZINT_WARN_NONCOMPLIANT, "81100123456123456101041232104123", "261: AI (8110) position 29: 3rd Purch. GS1 Co. Prefix VLI missing" }, // couponcode + /*255*/ { "[8110]01234561234561010412321041230", ZINT_WARN_NONCOMPLIANT, "811001234561234561010412321041230", "261: AI (8110) position 30: 3rd Purch. GS1 Co. Prefix incomplete" }, // couponcode + /*256*/ { "[8110]0123456123456101041232104123A", ZINT_WARN_NONCOMPLIANT, "81100123456123456101041232104123A", "261: AI (8110) position 29: Non-numeric 3rd Purch. GS1 Co. Prefix VLI 'A'" }, // couponcode + /*257*/ { "[8110]0123456123456101041232104123012345", ZINT_WARN_NONCOMPLIANT, "81100123456123456101041232104123012345", "261: AI (8110) position 30: 3rd Purch. GS1 Co. Prefix incomplete" }, // couponcode + /*258*/ { "[8110]0123456123456101041232104123012345A", ZINT_WARN_NONCOMPLIANT, "81100123456123456101041232104123012345A", "261: AI (8110) position 35: Non-numeric 3rd Purch. GS1 Co. Prefix 'A'" }, // couponcode + /*259*/ { "[8110]01234561234561010412321041230123456", 0, "811001234561234561010412321041230123456", "" }, // couponcode + /*260*/ { "[8110]0123456123456101041233", ZINT_WARN_NONCOMPLIANT, "81100123456123456101041233", "261: AI (8110) position 23: Expiration Date incomplete" }, // couponcode + /*261*/ { "[8110]01234561234561010412332012", ZINT_WARN_NONCOMPLIANT, "811001234561234561010412332012", "261: AI (8110) position 23: Expiration Date incomplete" }, // couponcode + /*262*/ { "[8110]012345612345610104123320123A", ZINT_WARN_NONCOMPLIANT, "8110012345612345610104123320123A", "261: AI (8110) position 23: Non-numeric Expiration Date" }, // couponcode + /*263*/ { "[8110]0123456123456101041233201232", ZINT_WARN_NONCOMPLIANT, "81100123456123456101041233201232", "261: AI (8110) position 27: Invalid day '32'" }, // couponcode + /*264*/ { "[8110]0123456123456101041233200031", ZINT_WARN_NONCOMPLIANT, "81100123456123456101041233200031", "261: AI (8110) position 25: Invalid month '00'" }, // couponcode + /*265*/ { "[8110]0123456123456101041233201231", 0, "81100123456123456101041233201231", "" }, // couponcode + /*266*/ { "[8110]0123456123456101041234", ZINT_WARN_NONCOMPLIANT, "81100123456123456101041234", "261: AI (8110) position 23: Start Date incomplete" }, // couponcode + /*267*/ { "[8110]01234561234561010412342012", ZINT_WARN_NONCOMPLIANT, "811001234561234561010412342012", "261: AI (8110) position 23: Start Date incomplete" }, // couponcode + /*268*/ { "[8110]012345612345610104123420123A", ZINT_WARN_NONCOMPLIANT, "8110012345612345610104123420123A", "261: AI (8110) position 23: Non-numeric Start Date" }, // couponcode + /*269*/ { "[8110]0123456123456101041234200230", ZINT_WARN_NONCOMPLIANT, "81100123456123456101041234200230", "261: AI (8110) position 27: Invalid day '30'" }, // couponcode + /*270*/ { "[8110]0123456123456101041234201329", ZINT_WARN_NONCOMPLIANT, "81100123456123456101041234201329", "261: AI (8110) position 25: Invalid month '13'" }, // couponcode + /*271*/ { "[8110]0123456123456101041234200229", 0, "81100123456123456101041234200229", "" }, // couponcode + /*272*/ { "[8110]0123456123456101041235", ZINT_WARN_NONCOMPLIANT, "81100123456123456101041235", "261: AI (8110) position 23: Serial Number VLI missing" }, // couponcode + /*273*/ { "[8110]0123456123456101041235A", ZINT_WARN_NONCOMPLIANT, "81100123456123456101041235A", "261: AI (8110) position 23: Non-numeric Serial Number VLI 'A'" }, // couponcode + /*274*/ { "[8110]01234561234561010412350", ZINT_WARN_NONCOMPLIANT, "811001234561234561010412350", "261: AI (8110) position 24: Serial Number incomplete" }, // couponcode + /*275*/ { "[8110]0123456123456101041235012345", ZINT_WARN_NONCOMPLIANT, "81100123456123456101041235012345", "261: AI (8110) position 24: Serial Number incomplete" }, // couponcode + /*276*/ { "[8110]0123456123456101041235912345678901234", ZINT_WARN_NONCOMPLIANT, "81100123456123456101041235912345678901234", "261: AI (8110) position 24: Serial Number incomplete" }, // couponcode + /*277*/ { "[8110]0123456123456101041235912345678901234A", ZINT_WARN_NONCOMPLIANT, "81100123456123456101041235912345678901234A", "261: AI (8110) position 38: Non-numeric Serial Number 'A'" }, // couponcode + /*278*/ { "[8110]01234561234561010412359123456789012345", 0, "811001234561234561010412359123456789012345", "" }, // couponcode + /*279*/ { "[8110]0123456123456101041236", ZINT_WARN_NONCOMPLIANT, "81100123456123456101041236", "261: AI (8110) position 23: Retailer ID VLI missing" }, // couponcode + /*280*/ { "[8110]0123456123456101041236A", ZINT_WARN_NONCOMPLIANT, "81100123456123456101041236A", "261: AI (8110) position 23: Non-numeric Retailer ID VLI 'A'" }, // couponcode + /*281*/ { "[8110]01234561234561010412360", ZINT_WARN_NONCOMPLIANT, "811001234561234561010412360", "261: AI (8110) position 23: Invalid Retailer ID VLI '0'" }, // couponcode + /*282*/ { "[8110]01234561234561010412368", ZINT_WARN_NONCOMPLIANT, "811001234561234561010412368", "261: AI (8110) position 23: Invalid Retailer ID VLI '8'" }, // couponcode + /*283*/ { "[8110]01234561234561010412361", ZINT_WARN_NONCOMPLIANT, "811001234561234561010412361", "261: AI (8110) position 24: Retailer ID incomplete" }, // couponcode + /*284*/ { "[8110]01234561234561010412361123456", ZINT_WARN_NONCOMPLIANT, "811001234561234561010412361123456", "261: AI (8110) position 24: Retailer ID incomplete" }, // couponcode + /*285*/ { "[8110]01234561234561010412361123456A", ZINT_WARN_NONCOMPLIANT, "811001234561234561010412361123456A", "261: AI (8110) position 30: Non-numeric Retailer ID 'A'" }, // couponcode + /*286*/ { "[8110]012345612345610104123671234567890123", 0, "8110012345612345610104123671234567890123", "" }, // couponcode + /*287*/ { "[8110]0123456123456101041239", ZINT_WARN_NONCOMPLIANT, "81100123456123456101041239", "261: AI (8110) position 23: Save Value Code incomplete" }, // couponcode + /*288*/ { "[8110]0123456123456101041239A", ZINT_WARN_NONCOMPLIANT, "81100123456123456101041239A", "261: AI (8110) position 23: Non-numeric Save Value Code" }, // couponcode + /*289*/ { "[8110]01234561234561010412393", ZINT_WARN_NONCOMPLIANT, "811001234561234561010412393", "261: AI (8110) position 23: Invalid Save Value Code '3'" }, // couponcode + /*290*/ { "[8110]01234561234561010412394", ZINT_WARN_NONCOMPLIANT, "811001234561234561010412394", "261: AI (8110) position 23: Invalid Save Value Code '4'" }, // couponcode + /*291*/ { "[8110]01234561234561010412397", ZINT_WARN_NONCOMPLIANT, "811001234561234561010412397", "261: AI (8110) position 23: Invalid Save Value Code '7'" }, // couponcode + /*292*/ { "[8110]01234561234561010412390", ZINT_WARN_NONCOMPLIANT, "811001234561234561010412390", "261: AI (8110) position 24: Save Value Applies To incomplete" }, // couponcode + /*293*/ { "[8110]01234561234561010412390A", ZINT_WARN_NONCOMPLIANT, "811001234561234561010412390A", "261: AI (8110) position 24: Non-numeric Save Value Applies To" }, // couponcode + /*294*/ { "[8110]012345612345610104123903", ZINT_WARN_NONCOMPLIANT, "8110012345612345610104123903", "261: AI (8110) position 24: Invalid Save Value Applies To '3'" }, // couponcode + /*295*/ { "[8110]012345612345610104123902", ZINT_WARN_NONCOMPLIANT, "8110012345612345610104123902", "261: AI (8110) position 25: Store Coupon Flag incomplete" }, // couponcode + /*296*/ { "[8110]012345612345610104123902A", ZINT_WARN_NONCOMPLIANT, "8110012345612345610104123902A", "261: AI (8110) position 25: Non-numeric Store Coupon Flag" }, // couponcode + /*297*/ { "[8110]0123456123456101041239029", ZINT_WARN_NONCOMPLIANT, "81100123456123456101041239029", "261: AI (8110) position 26: Don't Multiply Flag incomplete" }, // couponcode + /*298*/ { "[8110]0123456123456101041239029A", ZINT_WARN_NONCOMPLIANT, "81100123456123456101041239029A", "261: AI (8110) position 26: Non-numeric Don't Multiply Flag" }, // couponcode + /*299*/ { "[8110]01234561234561010412390292", ZINT_WARN_NONCOMPLIANT, "811001234561234561010412390292", "261: AI (8110) position 26: Invalid Don't Multiply Flag '2'" }, // couponcode + /*300*/ { "[8110]01234561234561010412390291", 0, "811001234561234561010412390291", "" }, // couponcode + /*301*/ { "[8110]177777776666663100120444101105551888888821109991222222232012314200601522345678961345678990000", ZINT_ERROR_INVALID_DATA, "", "259: Invalid data length for AI (8110)" }, // couponcode (example from GS1 AI (8112) Coupon Data Specifications Appendix A: AI (8110) vs AI (8112)) + /*302*/ { "[8110]177777776666663100120444101105551888888821109991222222232012314200601", 0, "8110177777776666663100120444101105551888888821109991222222232012314200601", "" }, // couponcode + /*303*/ { "[8112]017777777666666223456789", 0, "8112017777777666666223456789", "" }, // couponposoffer (example from GS1 AI (8112) Coupon Data Specifications Appendix A: AI (8110) vs AI (8112)) + /*304*/ { "[8112]001234561234560123456", 0, "8112001234561234560123456", "" }, // couponposoffer + /*305*/ { "[8112]00123456123456012345", ZINT_WARN_NONCOMPLIANT, "811200123456123456012345", "259: Invalid data length for AI (8112)" }, // couponposoffer + /*306*/ { "[8112]0012345612345601234561", ZINT_WARN_NONCOMPLIANT, "81120012345612345601234561", "261: AI (8112) position 22: Reserved trailing characters" }, // couponposoffer + /*307*/ { "[8112]061234567890121234569123456789012345", 0, "8112061234567890121234569123456789012345", "" }, // couponposoffer + /*308*/ { "[8112]0612345678901212345691234567890123456", ZINT_WARN_NONCOMPLIANT, "81120612345678901212345691234567890123456", "259: Invalid data length for AI (8112)" }, // couponposoffer + /*309*/ { "[8112]06123456789012123456912345678901234A", ZINT_WARN_NONCOMPLIANT, "811206123456789012123456912345678901234A", "261: AI (8112) position 36: Non-numeric Serial Number 'A'" }, // couponposoffer + /*310*/ { "[8112]06123456789012123456912345678901234", ZINT_WARN_NONCOMPLIANT, "811206123456789012123456912345678901234", "261: AI (8112) position 22: Serial Number incomplete" }, // couponposoffer + /*311*/ { "[8112]06123456789012123456812345678901234", 0, "811206123456789012123456812345678901234", "" }, // couponposoffer + /*312*/ { "[8112]0612345678901212345681234567890123", ZINT_WARN_NONCOMPLIANT, "81120612345678901212345681234567890123", "261: AI (8112) position 22: Serial Number incomplete" }, // couponposoffer + /*313*/ { "[8112]0612345678901212345A0123456", ZINT_WARN_NONCOMPLIANT, "81120612345678901212345A0123456", "261: AI (8112) position 15: Non-numeric Offer Code" }, // couponposoffer + /*314*/ { "[8112]0612345678901A1234560123456", ZINT_WARN_NONCOMPLIANT, "81120612345678901A1234560123456", "261: AI (8112) position 14: Non-numeric Coupon Funder ID 'A'" }, // couponposoffer + /*315*/ { "[8112]071234567890121234560123456", ZINT_WARN_NONCOMPLIANT, "8112071234567890121234560123456", "261: AI (8112) position 2: Invalid Coupon Funder ID VLI '7'" }, // couponposoffer + /*316*/ { "[8112]0A1234567890121234560123456", ZINT_WARN_NONCOMPLIANT, "81120A1234567890121234560123456", "261: AI (8112) position 2: Non-numeric Coupon Funder ID VLI 'A'" }, // couponposoffer + /*317*/ { "[8112]261234567890121234560123456", ZINT_WARN_NONCOMPLIANT, "8112261234567890121234560123456", "261: AI (8112) position 1: Coupon Format must be 0 or 1" }, // couponposoffer + /*318*/ { "[8112]A61234567890121234560123456", ZINT_WARN_NONCOMPLIANT, "8112A61234567890121234560123456", "261: AI (8112) position 1: Non-numeric Coupon Format" }, // couponposoffer + }; + int data_size = ARRAY_SIZE(data); + + char reduced[1024]; + + for (int i = 0; i < data_size; i++) { + + if (index != -1 && i != index) continue; + if ((debug & ZINT_DEBUG_TEST_PRINT) && !(debug & ZINT_DEBUG_TEST_LESS_NOISY)) printf("i:%d\n", i); + + struct zint_symbol *symbol = ZBarcode_Create(); + assert_nonnull(symbol, "Symbol not created\n"); + + int length = strlen(data[i].data); + + ret = gs1_verify(symbol, (unsigned char *) data[i].data, length, (unsigned char *) reduced); + assert_equal(ret, data[i].ret, "i:%d ret %d != %d (length %d \"%s\") %s\n", i, ret, data[i].ret, length, data[i].data, symbol->errtxt); + + if (ret < ZINT_ERROR) { + assert_zero(strcmp(reduced, data[i].expected), "i:%d strcmp(%s, %s) != 0\n", i, reduced, data[i].expected); + } + assert_zero(strcmp(symbol->errtxt, data[i].expected_errtxt), "i:%d strcmp(%s, %s) != 0\n", i, symbol->errtxt, data[i].expected_errtxt); + + ZBarcode_Delete(symbol); + } + + testFinish(); +} + static void test_input_mode(int index, int debug) { testStart(""); @@ -867,7 +1722,7 @@ static void test_input_mode(int index, int debug) { /* 34*/ { BARCODE_QRCODE, "1234", "", GS1_MODE, -1, ZINT_ERROR_INVALID_DATA, 0 }, /* 35*/ { BARCODE_QRCODE, "1234", "", GS1_MODE | ESCAPE_MODE, -1, ZINT_ERROR_INVALID_DATA, 0 }, }; - int data_size = sizeof(data) / sizeof(struct item); + int data_size = ARRAY_SIZE(data); char *text; struct zint_symbol previous_symbol; @@ -913,7 +1768,8 @@ int main(int argc, char *argv[]) { testFunction funcs[] = { /* name, func, has_index, has_generate, has_debug */ { "test_gs1_reduce", test_gs1_reduce, 1, 1, 1 }, { "test_hrt", test_hrt, 1, 0, 1 }, - { "test_gs1_verify", test_gs1_verify, 1, 0, 0 }, + { "test_gs1_verify", test_gs1_verify, 1, 0, 1 }, + { "test_gs1_lint", test_gs1_lint, 1, 0, 1 }, { "test_input_mode", test_input_mode, 1, 0, 1 }, }; diff --git a/backend/tests/test_iso3166.c b/backend/tests/test_iso3166.c new file mode 100644 index 00000000..1e1ff829 --- /dev/null +++ b/backend/tests/test_iso3166.c @@ -0,0 +1,776 @@ +/* + libzint - the open source barcode library + Copyright (C) 2021 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ +/* vim: set ts=4 sw=4 et : */ + +#include "testcommon.h" +#include "../iso3166.h" + +static void test_numeric(int index) { + + testStart(""); + + int ret; + struct item { + int data; + int ret; + }; + // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<")) + struct item data[] = { + /* 0*/ { -1, 0 }, + /* 1*/ { 0, 0 }, + /* 2*/ { 1, 0 }, + /* 3*/ { 2, 0 }, + /* 4*/ { 3, 0 }, + /* 5*/ { 4, 1 }, + /* 6*/ { 5, 0 }, + /* 7*/ { 6, 0 }, + /* 8*/ { 7, 0 }, + /* 9*/ { 8, 1 }, + /* 10*/ { 9, 0 }, + /* 11*/ { 10, 1 }, + /* 12*/ { 11, 0 }, + /* 13*/ { 12, 1 }, + /* 14*/ { 13, 0 }, + /* 15*/ { 14, 0 }, + /* 16*/ { 15, 0 }, + /* 17*/ { 16, 1 }, + /* 18*/ { 17, 0 }, + /* 19*/ { 18, 0 }, + /* 20*/ { 19, 0 }, + /* 21*/ { 20, 1 }, + /* 22*/ { 21, 0 }, + /* 23*/ { 22, 0 }, + /* 24*/ { 23, 0 }, + /* 25*/ { 24, 1 }, + /* 26*/ { 25, 0 }, + /* 27*/ { 26, 0 }, + /* 28*/ { 27, 0 }, + /* 29*/ { 28, 1 }, + /* 30*/ { 29, 0 }, + /* 31*/ { 30, 0 }, + /* 32*/ { 31, 1 }, + /* 33*/ { 32, 1 }, + /* 34*/ { 33, 0 }, + /* 35*/ { 34, 0 }, + /* 36*/ { 35, 0 }, + /* 37*/ { 36, 1 }, + /* 38*/ { 37, 0 }, + /* 39*/ { 38, 0 }, + /* 40*/ { 39, 0 }, + /* 41*/ { 40, 1 }, + /* 42*/ { 41, 0 }, + /* 43*/ { 47, 0 }, + /* 44*/ { 48, 1 }, + /* 45*/ { 49, 0 }, + /* 46*/ { 50, 1 }, + /* 47*/ { 51, 1 }, + /* 48*/ { 52, 1 }, + /* 49*/ { 53, 0 }, + /* 50*/ { 67, 0 }, + /* 51*/ { 68, 1 }, + /* 52*/ { 69, 0 }, + /* 53*/ { 70, 1 }, + /* 54*/ { 71, 0 }, + /* 55*/ { 72, 1 }, + /* 56*/ { 73, 0 }, + /* 57*/ { 74, 1 }, + /* 58*/ { 75, 0 }, + /* 59*/ { 76, 1 }, + /* 60*/ { 77, 0 }, + /* 61*/ { 83, 0 }, + /* 62*/ { 84, 1 }, + /* 63*/ { 85, 0 }, + /* 64*/ { 86, 1 }, + /* 65*/ { 87, 0 }, + /* 66*/ { 99, 0 }, + /* 67*/ { 100, 1 }, + /* 68*/ { 101, 0 }, + /* 69*/ { 110, 0 }, + /* 70*/ { 119, 0 }, + /* 71*/ { 120, 1 }, + /* 72*/ { 121, 0 }, + /* 73*/ { 130, 0 }, + /* 74*/ { 131, 0 }, + /* 75*/ { 132, 1 }, + /* 76*/ { 133, 0 }, + /* 77*/ { 147, 0 }, + /* 78*/ { 148, 1 }, + /* 79*/ { 149, 0 }, + /* 80*/ { 150, 0 }, + /* 81*/ { 151, 0 }, + /* 82*/ { 152, 1 }, + /* 83*/ { 153, 0 }, + /* 84*/ { 154, 0 }, + /* 85*/ { 155, 0 }, + /* 86*/ { 156, 1 }, + /* 87*/ { 157, 0 }, + /* 88*/ { 158, 1 }, + /* 89*/ { 159, 0 }, + /* 90*/ { 160, 0 }, + /* 91*/ { 161, 0 }, + /* 92*/ { 162, 1 }, + /* 93*/ { 163, 0 }, + /* 94*/ { 169, 0 }, + /* 95*/ { 170, 1 }, + /* 96*/ { 171, 0 }, + /* 97*/ { 177, 0 }, + /* 98*/ { 178, 1 }, + /* 99*/ { 179, 0 }, + /*100*/ { 180, 1 }, + /*101*/ { 181, 0 }, + /*102*/ { 190, 0 }, + /*103*/ { 191, 1 }, + /*104*/ { 192, 1 }, + /*105*/ { 193, 0 }, + /*106*/ { 200, 0 }, + /*107*/ { 210, 0 }, + /*108*/ { 220, 0 }, + /*109*/ { 230, 0 }, + /*110*/ { 231, 1 }, + /*111*/ { 232, 1 }, + /*112*/ { 233, 1 }, + /*113*/ { 234, 1 }, + /*114*/ { 235, 0 }, + /*115*/ { 236, 0 }, + /*116*/ { 237, 0 }, + /*117*/ { 238, 1 }, + /*118*/ { 239, 1 }, + /*119*/ { 240, 0 }, + /*120*/ { 241, 0 }, + /*121*/ { 242, 1 }, + /*122*/ { 243, 0 }, + /*123*/ { 244, 0 }, + /*124*/ { 245, 0 }, + /*125*/ { 246, 1 }, + /*126*/ { 247, 0 }, + /*127*/ { 248, 1 }, + /*128*/ { 249, 0 }, + /*129*/ { 250, 1 }, + /*130*/ { 251, 0 }, + /*131*/ { 259, 0 }, + /*132*/ { 260, 1 }, + /*133*/ { 261, 0 }, + /*134*/ { 269, 0 }, + /*135*/ { 270, 1 }, + /*136*/ { 271, 0 }, + /*137*/ { 280, 0 }, + /*138*/ { 287, 0 }, + /*139*/ { 288, 1 }, + /*140*/ { 289, 0 }, + /*141*/ { 290, 0 }, + /*142*/ { 291, 0 }, + /*143*/ { 292, 1 }, + /*144*/ { 293, 0 }, + /*145*/ { 299, 0 }, + /*146*/ { 300, 1 }, + /*147*/ { 301, 0 }, + /*148*/ { 310, 0 }, + /*149*/ { 319, 0 }, + /*150*/ { 320, 1 }, + /*151*/ { 321, 0 }, + /*152*/ { 322, 0 }, + /*153*/ { 323, 0 }, + /*154*/ { 324, 1 }, + /*155*/ { 325, 0 }, + /*156*/ { 330, 0 }, + /*157*/ { 339, 0 }, + /*158*/ { 340, 1 }, + /*159*/ { 341, 0 }, + /*160*/ { 350, 0 }, + /*161*/ { 367, 0 }, + /*162*/ { 368, 1 }, + /*163*/ { 369, 0 }, + /*164*/ { 370, 0 }, + /*165*/ { 379, 0 }, + /*166*/ { 380, 1 }, + /*167*/ { 381, 0 }, + /*168*/ { 397, 0 }, + /*169*/ { 398, 1 }, + /*170*/ { 399, 0 }, + /*171*/ { 400, 1 }, + /*172*/ { 401, 0 }, + /*173*/ { 409, 0 }, + /*174*/ { 410, 1 }, + /*175*/ { 411, 0 }, + /*176*/ { 426, 1 }, + /*177*/ { 427, 0 }, + /*178*/ { 428, 1 }, + /*179*/ { 429, 0 }, + /*180*/ { 430, 1 }, + /*181*/ { 431, 0 }, + /*182*/ { 432, 0 }, + /*183*/ { 433, 0 }, + /*184*/ { 434, 1 }, + /*185*/ { 435, 0 }, + /*186*/ { 436, 0 }, + /*187*/ { 437, 0 }, + /*188*/ { 438, 1 }, + /*189*/ { 439, 0 }, + /*190*/ { 440, 1 }, + /*191*/ { 441, 0 }, + /*192*/ { 442, 1 }, + /*193*/ { 443, 0 }, + /*194*/ { 449, 0 }, + /*195*/ { 450, 1 }, + /*196*/ { 451, 0 }, + /*197*/ { 460, 0 }, + /*198*/ { 469, 0 }, + /*199*/ { 470, 1 }, + /*200*/ { 471, 0 }, + /*201*/ { 479, 0 }, + /*202*/ { 480, 1 }, + /*203*/ { 481, 0 }, + /*204*/ { 490, 0 }, + /*205*/ { 497, 0 }, + /*206*/ { 498, 1 }, + /*207*/ { 499, 1 }, + /*208*/ { 500, 1 }, + /*209*/ { 501, 0 }, + /*210*/ { 502, 0 }, + /*211*/ { 503, 0 }, + /*212*/ { 504, 1 }, + /*213*/ { 505, 0 }, + /*214*/ { 510, 0 }, + /*215*/ { 519, 0 }, + /*216*/ { 520, 1 }, + /*217*/ { 521, 0 }, + /*218*/ { 530, 0 }, + /*219*/ { 531, 1 }, + /*220*/ { 532, 0 }, + /*221*/ { 539, 0 }, + /*222*/ { 540, 1 }, + /*223*/ { 541, 0 }, + /*224*/ { 550, 0 }, + /*225*/ { 561, 0 }, + /*226*/ { 562, 1 }, + /*227*/ { 563, 0 }, + /*228*/ { 564, 0 }, + /*229*/ { 565, 0 }, + /*230*/ { 566, 1 }, + /*231*/ { 567, 0 }, + /*232*/ { 568, 0 }, + /*233*/ { 569, 0 }, + /*234*/ { 570, 1 }, + /*235*/ { 571, 0 }, + /*236*/ { 579, 0 }, + /*237*/ { 580, 1 }, + /*238*/ { 581, 1 }, + /*239*/ { 582, 0 }, + /*240*/ { 590, 0 }, + /*241*/ { 599, 0 }, + /*242*/ { 600, 1 }, + /*243*/ { 601, 0 }, + /*244*/ { 611, 0 }, + /*245*/ { 612, 1 }, + /*246*/ { 613, 0 }, + /*247*/ { 614, 0 }, + /*248*/ { 615, 0 }, + /*249*/ { 616, 1 }, + /*250*/ { 617, 0 }, + /*251*/ { 618, 0 }, + /*252*/ { 619, 0 }, + /*253*/ { 620, 1 }, + /*254*/ { 621, 0 }, + /*255*/ { 630, 1 }, + /*256*/ { 640, 0 }, + /*257*/ { 650, 0 }, + /*258*/ { 658, 0 }, + /*259*/ { 659, 1 }, + /*260*/ { 660, 1 }, + /*261*/ { 661, 0 }, + /*262*/ { 677, 0 }, + /*263*/ { 678, 1 }, + /*264*/ { 679, 0 }, + /*265*/ { 680, 0 }, + /*266*/ { 690, 1 }, + /*267*/ { 700, 0 }, + /*268*/ { 701, 0 }, + /*269*/ { 702, 1 }, + /*270*/ { 703, 1 }, + /*271*/ { 704, 1 }, + /*272*/ { 705, 1 }, + /*273*/ { 706, 1 }, + /*274*/ { 707, 0 }, + /*275*/ { 708, 0 }, + /*276*/ { 709, 0 }, + /*277*/ { 710, 1 }, + /*278*/ { 711, 0 }, + /*279*/ { 747, 0 }, + /*280*/ { 748, 1 }, + /*281*/ { 749, 0 }, + /*282*/ { 750, 0 }, + /*283*/ { 751, 0 }, + /*284*/ { 752, 1 }, + /*285*/ { 753, 0 }, + /*286*/ { 791, 0 }, + /*287*/ { 792, 1 }, + /*288*/ { 793, 0 }, + /*289*/ { 794, 0 }, + /*290*/ { 795, 1 }, + /*291*/ { 796, 1 }, + /*292*/ { 797, 0 }, + /*293*/ { 798, 1 }, + /*294*/ { 799, 0 }, + /*295*/ { 800, 1 }, + /*296*/ { 801, 0 }, + /*297*/ { 802, 0 }, + /*298*/ { 803, 0 }, + /*299*/ { 804, 1 }, + /*300*/ { 805, 0 }, + /*301*/ { 806, 0 }, + /*302*/ { 807, 1 }, + /*303*/ { 808, 0 }, + /*304*/ { 830, 0 }, + /*305*/ { 831, 1 }, + /*306*/ { 832, 1 }, + /*307*/ { 833, 1 }, + /*308*/ { 834, 1 }, + /*309*/ { 835, 0 }, + /*310*/ { 880, 0 }, + /*311*/ { 881, 0 }, + /*312*/ { 882, 1 }, + /*313*/ { 883, 0 }, + /*314*/ { 884, 0 }, + /*315*/ { 885, 0 }, + /*316*/ { 886, 0 }, + /*317*/ { 887, 1 }, + /*318*/ { 888, 0 }, + /*319*/ { 889, 0 }, + /*320*/ { 890, 0 }, + /*321*/ { 891, 0 }, + /*322*/ { 892, 0 }, + /*323*/ { 893, 0 }, + /*324*/ { 894, 1 }, + /*325*/ { 895, 0 }, + /*326*/ { 896, 0 }, + /*327*/ { 897, 0 }, + /*328*/ { 898, 0 }, + /*329*/ { 899, 0 }, + /*330*/ { 900, 0 }, + /*331*/ { 999, 0 }, + /*332*/ { 2000, 0 }, + }; + int data_size = ARRAY_SIZE(data); + + for (int i = 0; i < data_size; i++) { + + if (index != -1 && i != index) continue; + + ret = iso3166_numeric(data[i].data); + assert_equal(ret, data[i].ret, "i:%d ret %d != %d\n", i, ret, data[i].ret); + } + + testFinish(); +} + +/* Binary chop version: Whether ISO 3166-1 numeric */ +static int bc_iso3166_numeric(int cc) { + static const short codes[249] = { + /*AFG*/ 4, /*ALB*/ 8, /*ATA*/ 10, /*DZA*/ 12, /*ASM*/ 16, /*AND*/ 20, /*AGO*/ 24, /*ATG*/ 28, /*AZE*/ 31, /*ARG*/ 32, + /*AUS*/ 36, /*AUT*/ 40, /*BHS*/ 44, /*BHR*/ 48, /*BGD*/ 50, /*ARM*/ 51, /*BRB*/ 52, /*BEL*/ 56, /*BMU*/ 60, /*BTN*/ 64, + /*BOL*/ 68, /*BIH*/ 70, /*BWA*/ 72, /*BVT*/ 74, /*BRA*/ 76, /*BLZ*/ 84, /*IOT*/ 86, /*SLB*/ 90, /*VGB*/ 92, /*BRN*/ 96, + /*BGR*/ 100, /*MMR*/ 104, /*BDI*/ 108, /*BLR*/ 112, /*KHM*/ 116, /*CMR*/ 120, /*CAN*/ 124, /*CPV*/ 132, /*CYM*/ 136, /*CAF*/ 140, + /*LKA*/ 144, /*TCD*/ 148, /*CHL*/ 152, /*CHN*/ 156, /*TWN*/ 158, /*CXR*/ 162, /*CCK*/ 166, /*COL*/ 170, /*COM*/ 174, /*MYT*/ 175, + /*COG*/ 178, /*COD*/ 180, /*COK*/ 184, /*CRI*/ 188, /*HRV*/ 191, /*CUB*/ 192, /*CYP*/ 196, /*CZE*/ 203, /*BEN*/ 204, /*DNK*/ 208, + /*DMA*/ 212, /*DOM*/ 214, /*ECU*/ 218, /*SLV*/ 222, /*GNQ*/ 226, /*ETH*/ 231, /*ERI*/ 232, /*EST*/ 233, /*FRO*/ 234, /*FLK*/ 238, + /*SGS*/ 239, /*FJI*/ 242, /*FIN*/ 246, /*ALA*/ 248, /*FRA*/ 250, /*GUF*/ 254, /*PYF*/ 258, /*ATF*/ 260, /*DJI*/ 262, /*GAB*/ 266, + /*GEO*/ 268, /*GMB*/ 270, /*PSE*/ 275, /*DEU*/ 276, /*GHA*/ 288, /*GIB*/ 292, /*KIR*/ 296, /*GRC*/ 300, /*GRL*/ 304, /*GRD*/ 308, + /*GLP*/ 312, /*GUM*/ 316, /*GTM*/ 320, /*GIN*/ 324, /*GUY*/ 328, /*HTI*/ 332, /*HMD*/ 334, /*VAT*/ 336, /*HND*/ 340, /*HKG*/ 344, + /*HUN*/ 348, /*ISL*/ 352, /*IND*/ 356, /*IDN*/ 360, /*IRN*/ 364, /*IRQ*/ 368, /*IRL*/ 372, /*ISR*/ 376, /*ITA*/ 380, /*CIV*/ 384, + /*JAM*/ 388, /*JPN*/ 392, /*KAZ*/ 398, /*JOR*/ 400, /*KEN*/ 404, /*PRK*/ 408, /*KOR*/ 410, /*KWT*/ 414, /*KGZ*/ 417, /*LAO*/ 418, + /*LBN*/ 422, /*LSO*/ 426, /*LVA*/ 428, /*LBR*/ 430, /*LBY*/ 434, /*LIE*/ 438, /*LTU*/ 440, /*LUX*/ 442, /*MAC*/ 446, /*MDG*/ 450, + /*MWI*/ 454, /*MYS*/ 458, /*MDV*/ 462, /*MLI*/ 466, /*MLT*/ 470, /*MTQ*/ 474, /*MRT*/ 478, /*MUS*/ 480, /*MEX*/ 484, /*MCO*/ 492, + /*MNG*/ 496, /*MDA*/ 498, /*MNE*/ 499, /*MSR*/ 500, /*MAR*/ 504, /*MOZ*/ 508, /*OMN*/ 512, /*NAM*/ 516, /*NRU*/ 520, /*NPL*/ 524, + /*NLD*/ 528, /*CUW*/ 531, /*ABW*/ 533, /*SXM*/ 534, /*BES*/ 535, /*NCL*/ 540, /*VUT*/ 548, /*NZL*/ 554, /*NIC*/ 558, /*NER*/ 562, + /*NGA*/ 566, /*NIU*/ 570, /*NFK*/ 574, /*NOR*/ 578, /*MNP*/ 580, /*UMI*/ 581, /*FSM*/ 583, /*MHL*/ 584, /*PLW*/ 585, /*PAK*/ 586, + /*PAN*/ 591, /*PNG*/ 598, /*PRY*/ 600, /*PER*/ 604, /*PHL*/ 608, /*PCN*/ 612, /*POL*/ 616, /*PRT*/ 620, /*GNB*/ 624, /*TLS*/ 626, + /*PRI*/ 630, /*QAT*/ 634, /*REU*/ 638, /*ROU*/ 642, /*RUS*/ 643, /*RWA*/ 646, /*BLM*/ 652, /*SHN*/ 654, /*KNA*/ 659, /*AIA*/ 660, + /*LCA*/ 662, /*MAF*/ 663, /*SPM*/ 666, /*VCT*/ 670, /*SMR*/ 674, /*STP*/ 678, /*SAU*/ 682, /*SEN*/ 686, /*SRB*/ 688, /*SYC*/ 690, + /*SLE*/ 694, /*SGP*/ 702, /*SVK*/ 703, /*VNM*/ 704, /*SVN*/ 705, /*SOM*/ 706, /*ZAF*/ 710, /*ZWE*/ 716, /*ESP*/ 724, /*SSD*/ 728, + /*SDN*/ 729, /*ESH*/ 732, /*SUR*/ 740, /*SJM*/ 744, /*SWZ*/ 748, /*SWE*/ 752, /*CHE*/ 756, /*SYR*/ 760, /*TJK*/ 762, /*THA*/ 764, + /*TGO*/ 768, /*TKL*/ 772, /*TON*/ 776, /*TTO*/ 780, /*ARE*/ 784, /*TUN*/ 788, /*TUR*/ 792, /*TKM*/ 795, /*TCA*/ 796, /*TUV*/ 798, + /*UGA*/ 800, /*UKR*/ 804, /*MKD*/ 807, /*EGY*/ 818, /*GBR*/ 826, /*GGY*/ 831, /*JEY*/ 832, /*IMN*/ 833, /*TZA*/ 834, /*USA*/ 840, + /*VIR*/ 850, /*BFA*/ 854, /*URY*/ 858, /*UZB*/ 860, /*VEN*/ 862, /*WLF*/ 876, /*WSM*/ 882, /*YEM*/ 887, /*ZMB*/ 894, + }; + + int s = 0, e = sizeof(codes) / sizeof(codes[0]) - 1; + + while (s <= e) { + int m = (s + e) / 2; + if (codes[m] == cc) { + return 1; + } + if (codes[m] < cc) { + s = m + 1; + } else { + e = m - 1; + } + } + + return 0; +} + +static void test_numeric_bc(void) { + + testStart(""); + + int ret, bc_ret; + + for (int i = 0; i < 1001; i++) { + ret = iso3166_numeric(i); + bc_ret = bc_iso3166_numeric(i); + assert_equal(ret, bc_ret, "i:%d ret %d != bc_ret %d\n", i, ret, bc_ret); + } + + testFinish(); +} + +static void test_alpha2(int index) { + + testStart(""); + + int ret; + struct item { + const char *data; + int ret; + }; + // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<")) + struct item data[] = { + /* 0*/ { "", 0 }, + /* 1*/ { "A", 0 }, + /* 2*/ { "aa", 0 }, + /* 3*/ { "AA", 0 }, + /* 4*/ { "AB", 0 }, + /* 5*/ { "AC", 0 }, + /* 6*/ { "AD", 1 }, + /* 7*/ { "ad", 0 }, + /* 8*/ { "AE", 1 }, + /* 9*/ { "AF", 1 }, + /* 10*/ { "AG", 1 }, + /* 11*/ { "AH", 0 }, + /* 12*/ { "AI", 1 }, + /* 13*/ { "AJ", 0 }, + /* 14*/ { "AP", 0 }, + /* 15*/ { "AQ", 1 }, + /* 16*/ { "AR", 1 }, + /* 17*/ { "AS", 1 }, + /* 18*/ { "AT", 1 }, + /* 19*/ { "AU", 1 }, + /* 20*/ { "AV", 0 }, + /* 21*/ { "AW", 1 }, + /* 22*/ { "AX", 1 }, + /* 23*/ { "AY", 0 }, + /* 24*/ { "AZ", 1 }, + /* 25*/ { "BA", 1 }, + /* 26*/ { "BB", 1 }, + /* 27*/ { "BC", 0 }, + /* 28*/ { "BD", 1 }, + /* 29*/ { "BX", 0 }, + /* 30*/ { "BY", 1 }, + /* 31*/ { "BZ", 1 }, + /* 32*/ { "CA", 1 }, + /* 33*/ { "CB", 0 }, + /* 34*/ { "CC", 1 }, + /* 35*/ { "CD", 1 }, + /* 36*/ { "CE", 0 }, + /* 37*/ { "CT", 0 }, + /* 38*/ { "CU", 1 }, + /* 39*/ { "CV", 1 }, + /* 40*/ { "CW", 1 }, + /* 41*/ { "CX", 1 }, + /* 42*/ { "CY", 1 }, + /* 43*/ { "CZ", 1 }, + /* 44*/ { "DA", 0 }, + /* 45*/ { "DD", 0 }, + /* 46*/ { "DE", 1 }, + /* 47*/ { "DF", 0 }, + /* 48*/ { "DY", 0 }, + /* 49*/ { "DZ", 1 }, + /* 50*/ { "EA", 0 }, + /* 51*/ { "EB", 0 }, + /* 52*/ { "EC", 1 }, + /* 53*/ { "ED", 0 }, + /* 54*/ { "EZ", 0 }, + /* 55*/ { "FA", 0 }, + /* 56*/ { "FQ", 0 }, + /* 57*/ { "FR", 1 }, + /* 58*/ { "FS", 0 }, + /* 59*/ { "FZ", 0 }, + /* 60*/ { "GA", 1 }, + /* 61*/ { "GB", 1 }, + /* 62*/ { "GC", 0 }, + /* 63*/ { "GX", 0 }, + /* 64*/ { "GY", 1 }, + /* 65*/ { "GZ", 0 }, + /* 66*/ { "HA", 0 }, + /* 67*/ { "HI", 0 }, + /* 68*/ { "HJ", 0 }, + /* 69*/ { "HK", 1 }, + /* 70*/ { "HL", 0 }, + /* 71*/ { "HZ", 0 }, + /* 72*/ { "IA", 0 }, + /* 73*/ { "IC", 0 }, + /* 74*/ { "ID", 1 }, + /* 75*/ { "IE", 1 }, + /* 76*/ { "IF", 0 }, + /* 77*/ { "IZ", 0 }, + /* 78*/ { "JA", 0 }, + /* 79*/ { "JD", 0 }, + /* 80*/ { "JE", 1 }, + /* 81*/ { "JF", 0 }, + /* 82*/ { "JZ", 0 }, + /* 83*/ { "KA", 0 }, + /* 84*/ { "KD", 0 }, + /* 85*/ { "KE", 1 }, + /* 86*/ { "KF", 0 }, + /* 87*/ { "KG", 1 }, + /* 88*/ { "KH", 1 }, + /* 89*/ { "KI", 1 }, + /* 90*/ { "KJ", 0 }, + /* 91*/ { "KX", 0 }, + /* 92*/ { "KY", 1 }, + /* 93*/ { "KZ", 1 }, + /* 94*/ { "LA", 1 }, + /* 95*/ { "LB", 1 }, + /* 96*/ { "LC", 1 }, + /* 97*/ { "LD", 0 }, + /* 98*/ { "LE", 0 }, + /* 99*/ { "LX", 0 }, + /*100*/ { "LY", 1 }, + /*101*/ { "LZ", 0 }, + /*102*/ { "MA", 1 }, + /*103*/ { "MB", 0 }, + /*104*/ { "MI", 0 }, + /*105*/ { "MJ", 0 }, + /*106*/ { "MK", 1 }, + /*107*/ { "ML", 1 }, + /*108*/ { "MM", 1 }, + /*109*/ { "MN", 1 }, + /*110*/ { "MO", 1 }, + /*111*/ { "MP", 1 }, + /*112*/ { "MQ", 1 }, + /*113*/ { "MR", 1 }, + /*114*/ { "MS", 1 }, + /*115*/ { "MT", 1 }, + /*116*/ { "MU", 1 }, + /*117*/ { "MV", 1 }, + /*118*/ { "MW", 1 }, + /*119*/ { "MX", 1 }, + /*120*/ { "MY", 1 }, + /*121*/ { "MZ", 1 }, + /*122*/ { "NA", 1 }, + /*123*/ { "NB", 0 }, + /*124*/ { "NC", 1 }, + /*125*/ { "NY", 0 }, + /*126*/ { "NZ", 1 }, + /*127*/ { "OA", 0 }, + /*128*/ { "OL", 0 }, + /*129*/ { "OM", 1 }, + /*130*/ { "ON", 0 }, + /*131*/ { "OZ", 0 }, + /*132*/ { "PA", 1 }, + /*133*/ { "PB", 0 }, + /*134*/ { "PQ", 0 }, + /*135*/ { "PR", 1 }, + /*136*/ { "PS", 1 }, + /*137*/ { "PT", 1 }, + /*138*/ { "PU", 0 }, + /*139*/ { "PV", 0 }, + /*140*/ { "PW", 1 }, + /*141*/ { "PX", 0 }, + /*142*/ { "PY", 1 }, + /*143*/ { "PZ", 0 }, + /*144*/ { "QA", 1 }, + /*145*/ { "QB", 0 }, + /*146*/ { "QZ", 0 }, + /*147*/ { "RA", 0 }, + /*148*/ { "RC", 0 }, + /*149*/ { "RD", 0 }, + /*150*/ { "RE", 1 }, + /*151*/ { "RF", 0 }, + /*152*/ { "RZ", 0 }, + /*153*/ { "SA", 1 }, + /*154*/ { "SB", 1 }, + /*155*/ { "SC", 1 }, + /*156*/ { "SD", 1 }, + /*157*/ { "SE", 1 }, + /*158*/ { "SF", 0 }, + /*159*/ { "SW", 0 }, + /*160*/ { "SX", 1 }, + /*161*/ { "SY", 1 }, + /*162*/ { "SZ", 1 }, + /*163*/ { "TA", 0 }, + /*164*/ { "TB", 0 }, + /*165*/ { "TC", 1 }, + /*166*/ { "TD", 1 }, + /*167*/ { "TE", 0 }, + /*168*/ { "TU", 0 }, + /*169*/ { "TV", 1 }, + /*170*/ { "TW", 1 }, + /*171*/ { "TX", 0 }, + /*172*/ { "TY", 0 }, + /*173*/ { "TZ", 1 }, + /*174*/ { "UA", 1 }, + /*175*/ { "UB", 0 }, + /*176*/ { "UX", 0 }, + /*177*/ { "UY", 1 }, + /*178*/ { "UZ", 1 }, + /*179*/ { "VA", 1 }, + /*180*/ { "VB", 0 }, + /*181*/ { "VC", 1 }, + /*182*/ { "VD", 0 }, + /*183*/ { "VZ", 0 }, + /*184*/ { "WA", 0 }, + /*185*/ { "WE", 0 }, + /*186*/ { "WF", 1 }, + /*187*/ { "WG", 0 }, + /*188*/ { "WZ", 0 }, + /*189*/ { "XA", 0 }, + /*190*/ { "XZ", 0 }, + /*191*/ { "YA", 0 }, + /*192*/ { "YC", 0 }, + /*193*/ { "YD", 0 }, + /*194*/ { "YE", 1 }, + /*195*/ { "YF", 0 }, + /*196*/ { "YZ", 0 }, + /*197*/ { "ZA", 1 }, + /*198*/ { "ZB", 0 }, + /*199*/ { "ZL", 0 }, + /*200*/ { "ZM", 1 }, + /*201*/ { "ZN", 0 }, + /*202*/ { "ZV", 0 }, + /*203*/ { "ZW", 1 }, + /*204*/ { "ZX", 0 }, + /*205*/ { "ZY", 0 }, + /*206*/ { "ZZ", 0 }, + /*207*/ { "Z", 0 }, + /*208*/ { "zz", 0 }, + /*209*/ { "0", 0 }, + /*210*/ { "\001", 0 }, + /*211*/ { "\177", 0 }, + /*212*/ { "\200", 0 }, + /*213*/ { "\377", 0 }, + }; + int data_size = ARRAY_SIZE(data); + + for (int i = 0; i < data_size; i++) { + + if (index != -1 && i != index) continue; + + ret = iso3166_alpha2(data[i].data); + assert_equal(ret, data[i].ret, "i:%d ret %d != %d\n", i, ret, data[i].ret); + } + + testFinish(); +} + +/* Binary chop version: Whether ISO 3166-1 alpha2 */ +static int bc_iso3166_alpha2(const char *cc) { + static const char codes[249][2] = { + {'A','D'}, {'A','E'}, {'A','F'}, {'A','G'}, {'A','I'}, {'A','L'}, {'A','M'}, {'A','O'}, {'A','Q'}, {'A','R'}, + {'A','S'}, {'A','T'}, {'A','U'}, {'A','W'}, {'A','X'}, {'A','Z'}, {'B','A'}, {'B','B'}, {'B','D'}, {'B','E'}, + {'B','F'}, {'B','G'}, {'B','H'}, {'B','I'}, {'B','J'}, {'B','L'}, {'B','M'}, {'B','N'}, {'B','O'}, {'B','Q'}, + {'B','R'}, {'B','S'}, {'B','T'}, {'B','V'}, {'B','W'}, {'B','Y'}, {'B','Z'}, {'C','A'}, {'C','C'}, {'C','D'}, + {'C','F'}, {'C','G'}, {'C','H'}, {'C','I'}, {'C','K'}, {'C','L'}, {'C','M'}, {'C','N'}, {'C','O'}, {'C','R'}, + {'C','U'}, {'C','V'}, {'C','W'}, {'C','X'}, {'C','Y'}, {'C','Z'}, {'D','E'}, {'D','J'}, {'D','K'}, {'D','M'}, + {'D','O'}, {'D','Z'}, {'E','C'}, {'E','E'}, {'E','G'}, {'E','H'}, {'E','R'}, {'E','S'}, {'E','T'}, {'F','I'}, + {'F','J'}, {'F','K'}, {'F','M'}, {'F','O'}, {'F','R'}, {'G','A'}, {'G','B'}, {'G','D'}, {'G','E'}, {'G','F'}, + {'G','G'}, {'G','H'}, {'G','I'}, {'G','L'}, {'G','M'}, {'G','N'}, {'G','P'}, {'G','Q'}, {'G','R'}, {'G','S'}, + {'G','T'}, {'G','U'}, {'G','W'}, {'G','Y'}, {'H','K'}, {'H','M'}, {'H','N'}, {'H','R'}, {'H','T'}, {'H','U'}, + {'I','D'}, {'I','E'}, {'I','L'}, {'I','M'}, {'I','N'}, {'I','O'}, {'I','Q'}, {'I','R'}, {'I','S'}, {'I','T'}, + {'J','E'}, {'J','M'}, {'J','O'}, {'J','P'}, {'K','E'}, {'K','G'}, {'K','H'}, {'K','I'}, {'K','M'}, {'K','N'}, + {'K','P'}, {'K','R'}, {'K','W'}, {'K','Y'}, {'K','Z'}, {'L','A'}, {'L','B'}, {'L','C'}, {'L','I'}, {'L','K'}, + {'L','R'}, {'L','S'}, {'L','T'}, {'L','U'}, {'L','V'}, {'L','Y'}, {'M','A'}, {'M','C'}, {'M','D'}, {'M','E'}, + {'M','F'}, {'M','G'}, {'M','H'}, {'M','K'}, {'M','L'}, {'M','M'}, {'M','N'}, {'M','O'}, {'M','P'}, {'M','Q'}, + {'M','R'}, {'M','S'}, {'M','T'}, {'M','U'}, {'M','V'}, {'M','W'}, {'M','X'}, {'M','Y'}, {'M','Z'}, {'N','A'}, + {'N','C'}, {'N','E'}, {'N','F'}, {'N','G'}, {'N','I'}, {'N','L'}, {'N','O'}, {'N','P'}, {'N','R'}, {'N','U'}, + {'N','Z'}, {'O','M'}, {'P','A'}, {'P','E'}, {'P','F'}, {'P','G'}, {'P','H'}, {'P','K'}, {'P','L'}, {'P','M'}, + {'P','N'}, {'P','R'}, {'P','S'}, {'P','T'}, {'P','W'}, {'P','Y'}, {'Q','A'}, {'R','E'}, {'R','O'}, {'R','S'}, + {'R','U'}, {'R','W'}, {'S','A'}, {'S','B'}, {'S','C'}, {'S','D'}, {'S','E'}, {'S','G'}, {'S','H'}, {'S','I'}, + {'S','J'}, {'S','K'}, {'S','L'}, {'S','M'}, {'S','N'}, {'S','O'}, {'S','R'}, {'S','S'}, {'S','T'}, {'S','V'}, + {'S','X'}, {'S','Y'}, {'S','Z'}, {'T','C'}, {'T','D'}, {'T','F'}, {'T','G'}, {'T','H'}, {'T','J'}, {'T','K'}, + {'T','L'}, {'T','M'}, {'T','N'}, {'T','O'}, {'T','R'}, {'T','T'}, {'T','V'}, {'T','W'}, {'T','Z'}, {'U','A'}, + {'U','G'}, {'U','M'}, {'U','S'}, {'U','Y'}, {'U','Z'}, {'V','A'}, {'V','C'}, {'V','E'}, {'V','G'}, {'V','I'}, + {'V','N'}, {'V','U'}, {'W','F'}, {'W','S'}, {'Y','E'}, {'Y','T'}, {'Z','A'}, {'Z','M'}, {'Z','W'}, + }; + + int s = 0, e = sizeof(codes) / sizeof(codes[0]) - 1; + + while (s <= e) { + int m = (s + e) / 2; + int cmp = strncmp(codes[m], cc, 2); + if (cmp == 0) { + return 1; + } + if (cmp < 0) { + s = m + 1; + } else { + e = m - 1; + } + } + + return 0; +} + +static void test_alpha2_bc(void) { + + testStart(""); + + int ret, bc_ret; + char data[2]; + + for (int i = 0; i < 128; i++) { + for (int j = 0; j < 128; j++) { + data[0] = i; + data[1] = j; + ret = iso3166_alpha2(data); + bc_ret = bc_iso3166_alpha2(data); + assert_equal(ret, bc_ret, "i:%d ret %d != bc_ret %d\n", i, ret, bc_ret); + } + } + + testFinish(); +} + +int main(int argc, char *argv[]) { + + testFunction funcs[] = { /* name, func, has_index, has_generate, has_debug */ + { "test_numeric", test_numeric, 1, 0, 0 }, + { "test_alpha2", test_alpha2, 1, 0, 0 }, + { "test_numeric_bc", test_numeric_bc, 0, 0, 0 }, + { "test_alpha2_bc", test_alpha2_bc, 0, 0, 0 }, + }; + + testRun(argc, argv, funcs, ARRAY_SIZE(funcs)); + + testReport(); + + return 0; +} diff --git a/backend/tests/test_iso4217.c b/backend/tests/test_iso4217.c new file mode 100644 index 00000000..422c9ef7 --- /dev/null +++ b/backend/tests/test_iso4217.c @@ -0,0 +1,513 @@ +/* + libzint - the open source barcode library + Copyright (C) 2021 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ +/* vim: set ts=4 sw=4 et : */ + +#include "testcommon.h" +#include "../iso4217.h" + +static void test_numeric(int index) { + + testStart(""); + + int ret; + struct item { + int data; + int ret; + }; + // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<")) + struct item data[] = { + /* 0*/ { -1, 0 }, + /* 1*/ { 0, 0 }, + /* 2*/ { 1, 0 }, + /* 3*/ { 2, 0 }, + /* 4*/ { 3, 0 }, + /* 5*/ { 4, 0 }, + /* 6*/ { 5, 0 }, + /* 7*/ { 6, 0 }, + /* 8*/ { 7, 0 }, + /* 9*/ { 8, 1 }, + /* 10*/ { 9, 0 }, + /* 11*/ { 10, 0 }, + /* 12*/ { 11, 0 }, + /* 13*/ { 12, 1 }, + /* 14*/ { 13, 0 }, + /* 15*/ { 14, 0 }, + /* 16*/ { 15, 0 }, + /* 17*/ { 16, 0 }, + /* 18*/ { 17, 0 }, + /* 19*/ { 18, 0 }, + /* 20*/ { 19, 0 }, + /* 21*/ { 20, 0 }, + /* 22*/ { 21, 0 }, + /* 23*/ { 31, 0 }, + /* 24*/ { 32, 1 }, + /* 25*/ { 33, 0 }, + /* 26*/ { 34, 0 }, + /* 27*/ { 35, 0 }, + /* 28*/ { 36, 1 }, + /* 29*/ { 37, 0 }, + /* 30*/ { 43, 0 }, + /* 31*/ { 44, 1 }, + /* 32*/ { 45, 0 }, + /* 33*/ { 49, 0 }, + /* 34*/ { 50, 1 }, + /* 35*/ { 51, 1 }, + /* 36*/ { 52, 1 }, + /* 37*/ { 53, 0 }, + /* 38*/ { 59, 0 }, + /* 39*/ { 60, 1 }, + /* 40*/ { 61, 0 }, + /* 41*/ { 62, 0 }, + /* 42*/ { 63, 0 }, + /* 43*/ { 64, 1 }, + /* 44*/ { 65, 0 }, + /* 45*/ { 66, 0 }, + /* 46*/ { 67, 0 }, + /* 47*/ { 68, 1 }, + /* 48*/ { 69, 0 }, + /* 49*/ { 70, 0 }, + /* 50*/ { 71, 0 }, + /* 51*/ { 72, 1 }, + /* 52*/ { 73, 0 }, + /* 53*/ { 80, 0 }, + /* 54*/ { 81, 0 }, + /* 55*/ { 82, 0 }, + /* 56*/ { 83, 0 }, + /* 57*/ { 84, 1 }, + /* 58*/ { 85, 0 }, + /* 59*/ { 89, 0 }, + /* 60*/ { 90, 1 }, + /* 61*/ { 91, 0 }, + /* 62*/ { 99, 0 }, + /* 63*/ { 100, 0 }, + /* 64*/ { 101, 0 }, + /* 65*/ { 102, 0 }, + /* 66*/ { 103, 0 }, + /* 67*/ { 104, 1 }, + /* 68*/ { 105, 0 }, + /* 69*/ { 110, 0 }, + /* 70*/ { 120, 0 }, + /* 71*/ { 130, 0 }, + /* 72*/ { 131, 0 }, + /* 73*/ { 132, 1 }, + /* 74*/ { 133, 0 }, + /* 75*/ { 143, 0 }, + /* 76*/ { 144, 1 }, + /* 77*/ { 145, 0 }, + /* 78*/ { 146, 0 }, + /* 79*/ { 147, 0 }, + /* 80*/ { 148, 0 }, + /* 81*/ { 149, 0 }, + /* 82*/ { 150, 0 }, + /* 83*/ { 160, 0 }, + /* 84*/ { 169, 0 }, + /* 85*/ { 170, 1 }, + /* 86*/ { 171, 0 }, + /* 87*/ { 180, 0 }, + /* 88*/ { 190, 0 }, + /* 89*/ { 191, 1 }, + /* 90*/ { 192, 1 }, + /* 91*/ { 193, 0 }, + /* 92*/ { 200, 0 }, + /* 93*/ { 210, 0 }, + /* 94*/ { 220, 0 }, + /* 95*/ { 221, 0 }, + /* 96*/ { 222, 1 }, + /* 97*/ { 223, 0 }, + /* 98*/ { 229, 0 }, + /* 99*/ { 230, 1 }, + /*100*/ { 231, 0 }, + /*101*/ { 232, 1 }, + /*102*/ { 233, 0 }, + /*103*/ { 234, 0 }, + /*104*/ { 235, 0 }, + /*105*/ { 236, 0 }, + /*106*/ { 237, 0 }, + /*107*/ { 238, 1 }, + /*108*/ { 239, 0 }, + /*109*/ { 240, 0 }, + /*110*/ { 241, 0 }, + /*111*/ { 242, 1 }, + /*112*/ { 243, 0 }, + /*113*/ { 250, 0 }, + /*114*/ { 260, 0 }, + /*115*/ { 269, 0 }, + /*116*/ { 270, 1 }, + /*117*/ { 271, 0 }, + /*118*/ { 280, 0 }, + /*119*/ { 290, 0 }, + /*120*/ { 291, 0 }, + /*121*/ { 292, 1 }, + /*122*/ { 293, 0 }, + /*123*/ { 300, 0 }, + /*124*/ { 310, 0 }, + /*125*/ { 319, 0 }, + /*126*/ { 320, 1 }, + /*127*/ { 321, 0 }, + /*128*/ { 322, 0 }, + /*129*/ { 323, 0 }, + /*130*/ { 324, 1 }, + /*131*/ { 325, 0 }, + /*132*/ { 330, 0 }, + /*133*/ { 331, 0 }, + /*134*/ { 332, 1 }, + /*135*/ { 333, 0 }, + /*136*/ { 339, 0 }, + /*137*/ { 340, 1 }, + /*138*/ { 341, 0 }, + /*139*/ { 350, 0 }, + /*140*/ { 351, 0 }, + /*141*/ { 352, 1 }, + /*142*/ { 353, 0 }, + /*143*/ { 359, 0 }, + /*144*/ { 360, 1 }, + /*145*/ { 361, 0 }, + /*146*/ { 367, 0 }, + /*147*/ { 368, 1 }, + /*148*/ { 369, 0 }, + /*149*/ { 370, 0 }, + /*150*/ { 380, 0 }, + /*151*/ { 390, 0 }, + /*152*/ { 391, 0 }, + /*153*/ { 392, 1 }, + /*154*/ { 393, 0 }, + /*155*/ { 397, 0 }, + /*156*/ { 398, 1 }, + /*157*/ { 399, 0 }, + /*158*/ { 400, 1 }, + /*159*/ { 401, 0 }, + /*160*/ { 409, 0 }, + /*161*/ { 410, 1 }, + /*162*/ { 411, 0 }, + /*163*/ { 425, 0 }, + /*164*/ { 426, 1 }, + /*165*/ { 427, 0 }, + /*166*/ { 428, 0 }, + /*167*/ { 429, 0 }, + /*168*/ { 430, 1 }, + /*169*/ { 431, 0 }, + /*170*/ { 432, 0 }, + /*171*/ { 433, 0 }, + /*172*/ { 434, 1 }, + /*173*/ { 435, 0 }, + /*174*/ { 436, 0 }, + /*175*/ { 437, 0 }, + /*176*/ { 438, 0 }, + /*177*/ { 439, 0 }, + /*178*/ { 440, 0 }, + /*179*/ { 441, 0 }, + /*180*/ { 442, 0 }, + /*181*/ { 443, 0 }, + /*182*/ { 450, 0 }, + /*183*/ { 460, 0 }, + /*184*/ { 470, 0 }, + /*185*/ { 479, 0 }, + /*186*/ { 480, 1 }, + /*187*/ { 481, 0 }, + /*188*/ { 495, 0 }, + /*189*/ { 496, 1 }, + /*190*/ { 497, 0 }, + /*191*/ { 498, 1 }, + /*192*/ { 499, 0 }, + /*193*/ { 500, 0 }, + /*194*/ { 501, 0 }, + /*195*/ { 502, 0 }, + /*196*/ { 503, 0 }, + /*197*/ { 504, 1 }, + /*198*/ { 505, 0 }, + /*199*/ { 510, 0 }, + /*200*/ { 520, 0 }, + /*201*/ { 530, 0 }, + /*202*/ { 540, 0 }, + /*203*/ { 550, 0 }, + /*204*/ { 557, 0 }, + /*205*/ { 558, 1 }, + /*206*/ { 559, 0 }, + /*207*/ { 560, 0 }, + /*208*/ { 561, 0 }, + /*209*/ { 562, 0 }, + /*210*/ { 563, 0 }, + /*211*/ { 564, 0 }, + /*212*/ { 565, 0 }, + /*213*/ { 566, 1 }, + /*214*/ { 567, 0 }, + /*215*/ { 570, 0 }, + /*216*/ { 580, 0 }, + /*217*/ { 589, 0 }, + /*218*/ { 590, 1 }, + /*219*/ { 591, 0 }, + /*220*/ { 597, 0 }, + /*221*/ { 598, 1 }, + /*222*/ { 599, 0 }, + /*223*/ { 600, 1 }, + /*224*/ { 601, 0 }, + /*225*/ { 610, 0 }, + /*226*/ { 611, 0 }, + /*227*/ { 612, 0 }, + /*228*/ { 613, 0 }, + /*229*/ { 620, 0 }, + /*230*/ { 630, 0 }, + /*231*/ { 640, 0 }, + /*232*/ { 650, 0 }, + /*233*/ { 660, 0 }, + /*234*/ { 670, 0 }, + /*235*/ { 677, 0 }, + /*236*/ { 678, 0 }, + /*237*/ { 679, 0 }, + /*238*/ { 680, 0 }, + /*239*/ { 681, 0 }, + /*240*/ { 682, 1 }, + /*241*/ { 683, 0 }, + /*242*/ { 689, 0 }, + /*243*/ { 690, 1 }, + /*244*/ { 691, 0 }, + /*245*/ { 700, 0 }, + /*246*/ { 701, 0 }, + /*247*/ { 702, 1 }, + /*248*/ { 703, 0 }, + /*249*/ { 704, 1 }, + /*250*/ { 705, 0 }, + /*251*/ { 706, 1 }, + /*252*/ { 707, 0 }, + /*253*/ { 708, 0 }, + /*254*/ { 709, 0 }, + /*255*/ { 710, 1 }, + /*256*/ { 711, 0 }, + /*257*/ { 720, 0 }, + /*258*/ { 730, 0 }, + /*259*/ { 740, 0 }, + /*260*/ { 750, 0 }, + /*261*/ { 751, 0 }, + /*262*/ { 752, 1 }, + /*263*/ { 753, 0 }, + /*264*/ { 759, 0 }, + /*265*/ { 760, 1 }, + /*266*/ { 761, 0 }, + /*267*/ { 770, 0 }, + /*268*/ { 779, 0 }, + /*269*/ { 780, 1 }, + /*270*/ { 781, 0 }, + /*271*/ { 790, 0 }, + /*272*/ { 799, 0 }, + /*273*/ { 800, 1 }, + /*274*/ { 801, 0 }, + /*275*/ { 810, 0 }, + /*276*/ { 820, 0 }, + /*277*/ { 830, 0 }, + /*278*/ { 839, 0 }, + /*279*/ { 840, 1 }, + /*280*/ { 841, 0 }, + /*281*/ { 857, 0 }, + /*282*/ { 858, 1 }, + /*283*/ { 859, 0 }, + /*284*/ { 860, 1 }, + /*285*/ { 861, 0 }, + /*286*/ { 870, 0 }, + /*287*/ { 880, 0 }, + /*288*/ { 881, 0 }, + /*289*/ { 882, 1 }, + /*290*/ { 883, 0 }, + /*291*/ { 884, 0 }, + /*292*/ { 885, 0 }, + /*293*/ { 886, 1 }, + /*294*/ { 887, 0 }, + /*295*/ { 888, 0 }, + /*296*/ { 889, 0 }, + /*297*/ { 890, 0 }, + /*298*/ { 891, 0 }, + /*299*/ { 892, 0 }, + /*300*/ { 893, 0 }, + /*301*/ { 894, 0 }, + /*302*/ { 895, 0 }, + /*303*/ { 896, 0 }, + /*304*/ { 897, 0 }, + /*305*/ { 898, 0 }, + /*306*/ { 899, 0 }, + /*307*/ { 900, 0 }, + /*308*/ { 901, 1 }, + /*309*/ { 902, 0 }, + /*310*/ { 926, 0 }, + /*311*/ { 927, 1 }, + /*312*/ { 928, 1 }, + /*313*/ { 929, 1 }, + /*314*/ { 930, 1 }, + /*315*/ { 931, 1 }, + /*316*/ { 932, 1 }, + /*317*/ { 933, 1 }, + /*318*/ { 934, 1 }, + /*319*/ { 935, 0 }, + /*320*/ { 936, 1 }, + /*321*/ { 937, 0 }, + /*322*/ { 938, 1 }, + /*323*/ { 939, 0 }, + /*324*/ { 940, 1 }, + /*325*/ { 941, 1 }, + /*326*/ { 942, 0 }, + /*327*/ { 943, 1 }, + /*328*/ { 944, 1 }, + /*329*/ { 945, 0 }, + /*330*/ { 946, 1 }, + /*331*/ { 947, 1 }, + /*332*/ { 948, 1 }, + /*333*/ { 949, 1 }, + /*334*/ { 950, 1 }, + /*335*/ { 951, 1 }, + /*336*/ { 952, 1 }, + /*337*/ { 953, 1 }, + /*338*/ { 954, 0 }, + /*339*/ { 955, 1 }, + /*340*/ { 956, 1 }, + /*341*/ { 957, 1 }, + /*342*/ { 958, 1 }, + /*343*/ { 959, 1 }, + /*344*/ { 960, 1 }, + /*345*/ { 961, 1 }, + /*346*/ { 962, 1 }, + /*347*/ { 963, 1 }, + /*348*/ { 964, 1 }, + /*349*/ { 965, 1 }, + /*350*/ { 966, 0 }, + /*351*/ { 967, 1 }, + /*352*/ { 968, 1 }, + /*353*/ { 969, 1 }, + /*354*/ { 970, 1 }, + /*355*/ { 971, 1 }, + /*356*/ { 972, 1 }, + /*357*/ { 973, 1 }, + /*358*/ { 974, 0 }, + /*359*/ { 975, 1 }, + /*360*/ { 976, 1 }, + /*361*/ { 977, 1 }, + /*362*/ { 978, 1 }, + /*363*/ { 979, 1 }, + /*364*/ { 980, 1 }, + /*365*/ { 981, 1 }, + /*366*/ { 982, 0 }, + /*367*/ { 983, 0 }, + /*368*/ { 984, 1 }, + /*369*/ { 985, 1 }, + /*370*/ { 986, 1 }, + /*371*/ { 987, 0 }, + /*372*/ { 988, 0 }, + /*373*/ { 989, 0 }, + /*374*/ { 990, 1 }, + /*375*/ { 991, 0 }, + /*376*/ { 992, 0 }, + /*377*/ { 993, 0 }, + /*378*/ { 994, 1 }, + /*379*/ { 995, 0 }, + /*380*/ { 996, 0 }, + /*381*/ { 997, 1 }, + /*382*/ { 998, 0 }, + /*383*/ { 999, 1 }, + /*384*/ { 1000, 0 }, + /*385*/ { 2000, 0 }, + }; + int data_size = ARRAY_SIZE(data); + + for (int i = 0; i < data_size; i++) { + + if (index != -1 && i != index) continue; + + ret = iso4217_numeric(data[i].data); + assert_equal(ret, data[i].ret, "i:%d ret %d != %d\n", i, ret, data[i].ret); + } + + testFinish(); +} + +/* Binary chop version: Whether ISO 4217 numeric */ +static int bc_iso4217_numeric(int cc) { + static const short codes[179] = { + /*ALL*/ 8, /*DZD*/ 12, /*ARS*/ 32, /*AUD*/ 36, /*BSD*/ 44, /*BHD*/ 48, /*BDT*/ 50, /*AMD*/ 51, /*BBD*/ 52, /*BMD*/ 60, + /*BTN*/ 64, /*BOB*/ 68, /*BWP*/ 72, /*BZD*/ 84, /*SBD*/ 90, /*BND*/ 96, /*MMK*/ 104, /*BIF*/ 108, /*KHR*/ 116, /*CAD*/ 124, + /*CVE*/ 132, /*KYD*/ 136, /*LKR*/ 144, /*CLP*/ 152, /*CNY*/ 156, /*COP*/ 170, /*KMF*/ 174, /*CRC*/ 188, /*HRK*/ 191, /*CUP*/ 192, + /*CZK*/ 203, /*DKK*/ 208, /*DOP*/ 214, /*SVC*/ 222, /*ETB*/ 230, /*ERN*/ 232, /*FKP*/ 238, /*FJD*/ 242, /*DJF*/ 262, /*GMD*/ 270, + /*GIP*/ 292, /*GTQ*/ 320, /*GNF*/ 324, /*GYD*/ 328, /*HTG*/ 332, /*HNL*/ 340, /*HKD*/ 344, /*HUF*/ 348, /*ISK*/ 352, /*INR*/ 356, + /*IDR*/ 360, /*IRR*/ 364, /*IQD*/ 368, /*ILS*/ 376, /*JMD*/ 388, /*JPY*/ 392, /*KZT*/ 398, /*JOD*/ 400, /*KES*/ 404, /*KPW*/ 408, + /*KRW*/ 410, /*KWD*/ 414, /*KGS*/ 417, /*LAK*/ 418, /*LBP*/ 422, /*LSL*/ 426, /*LRD*/ 430, /*LYD*/ 434, /*MOP*/ 446, /*MWK*/ 454, + /*MYR*/ 458, /*MVR*/ 462, /*MUR*/ 480, /*MXN*/ 484, /*MNT*/ 496, /*MDL*/ 498, /*MAD*/ 504, /*OMR*/ 512, /*NAD*/ 516, /*NPR*/ 524, + /*ANG*/ 532, /*AWG*/ 533, /*VUV*/ 548, /*NZD*/ 554, /*NIO*/ 558, /*NGN*/ 566, /*NOK*/ 578, /*PKR*/ 586, /*PAB*/ 590, /*PGK*/ 598, + /*PYG*/ 600, /*PEN*/ 604, /*PHP*/ 608, /*QAR*/ 634, /*RUB*/ 643, /*RWF*/ 646, /*SHP*/ 654, /*SAR*/ 682, /*SCR*/ 690, /*SLL*/ 694, + /*SGD*/ 702, /*VND*/ 704, /*SOS*/ 706, /*ZAR*/ 710, /*SSP*/ 728, /*SZL*/ 748, /*SEK*/ 752, /*CHF*/ 756, /*SYP*/ 760, /*THB*/ 764, + /*TOP*/ 776, /*TTD*/ 780, /*AED*/ 784, /*TND*/ 788, /*UGX*/ 800, /*MKD*/ 807, /*EGP*/ 818, /*GBP*/ 826, /*TZS*/ 834, /*USD*/ 840, + /*UYU*/ 858, /*UZS*/ 860, /*WST*/ 882, /*YER*/ 886, /*TWD*/ 901, /*UYW*/ 927, /*VES*/ 928, /*MRU*/ 929, /*STN*/ 930, /*CUC*/ 931, + /*ZWL*/ 932, /*BYN*/ 933, /*TMT*/ 934, /*GHS*/ 936, /*SDG*/ 938, /*UYI*/ 940, /*RSD*/ 941, /*MZN*/ 943, /*AZN*/ 944, /*RON*/ 946, + /*CHE*/ 947, /*CHW*/ 948, /*TRY*/ 949, /*XAF*/ 950, /*XCD*/ 951, /*XOF*/ 952, /*XPF*/ 953, /*XBA*/ 955, /*XBB*/ 956, /*XBC*/ 957, + /*XBD*/ 958, /*XAU*/ 959, /*XDR*/ 960, /*XAG*/ 961, /*XPT*/ 962, /*XTS*/ 963, /*XPD*/ 964, /*XUA*/ 965, /*ZMW*/ 967, /*SRD*/ 968, + /*MGA*/ 969, /*COU*/ 970, /*AFN*/ 971, /*TJS*/ 972, /*AOA*/ 973, /*BGN*/ 975, /*CDF*/ 976, /*BAM*/ 977, /*EUR*/ 978, /*MXV*/ 979, + /*UAH*/ 980, /*GEL*/ 981, /*BOV*/ 984, /*PLN*/ 985, /*BRL*/ 986, /*CLF*/ 990, /*XSU*/ 994, /*USN*/ 997, /*XXX*/ 999, + }; + + int s = 0, e = sizeof(codes) / sizeof(codes[0]) - 1; + + while (s <= e) { + int m = (s + e) / 2; + if (codes[m] == cc) { + return 1; + } + if (codes[m] < cc) { + s = m + 1; + } else { + e = m - 1; + } + } + + return 0; +} + +static void test_numeric_bc(void) { + + testStart(""); + + int ret, bc_ret; + + for (int i = 0; i < 1001; i++) { + ret = iso4217_numeric(i); + bc_ret = bc_iso4217_numeric(i); + assert_equal(ret, bc_ret, "i:%d ret %d != bc_ret %d\n", i, ret, bc_ret); + } + + testFinish(); +} + +int main(int argc, char *argv[]) { + + testFunction funcs[] = { /* name, func, has_index, has_generate, has_debug */ + { "test_numeric", test_numeric, 1, 0, 0 }, + { "test_numeric_bc", test_numeric_bc, 0, 0, 0 }, + }; + + testRun(argc, argv, funcs, ARRAY_SIZE(funcs)); + + testReport(); + + return 0; +} diff --git a/backend/tests/test_library.c b/backend/tests/test_library.c index fc3e133c..7b516a54 100644 --- a/backend/tests/test_library.c +++ b/backend/tests/test_library.c @@ -158,7 +158,7 @@ static void test_input_mode(int index, int debug) { /* 7*/ { "1234", -1, 0, DATA_MODE }, /* 8*/ { "1234", DATA_MODE | 0x10, 0, DATA_MODE | 0x10 }, // Unknown flags kept (but ignored) /* 9*/ { "1234", UNICODE_MODE | 0x10, 0, UNICODE_MODE | 0x10 }, - /* 10*/ { "[01]12345678901234", GS1_MODE | 0x20, 0, GS1_MODE | 0x20 }, + /* 10*/ { "[01]12345678901231", GS1_MODE | 0x20, 0, GS1_MODE | 0x20 }, }; int data_size = ARRAY_SIZE(data); diff --git a/backend/tests/test_raster.c b/backend/tests/test_raster.c index ebebb53f..781f6d1f 100644 --- a/backend/tests/test_raster.c +++ b/backend/tests/test_raster.c @@ -1,6 +1,6 @@ /* libzint - the open source barcode library - Copyright (C) 2019 - 2020 Robin Stuart + Copyright (C) 2019 - 2021 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -145,7 +145,7 @@ static void test_buffer(int index, int generate, int debug) { /* 21*/ { BARCODE_EANX_CHK, "1234", "", 50, 1, 47, 118, 116 }, /* 22*/ { BARCODE_EANX, "12", "", 50, 1, 20, 64, 116 }, /* 23*/ { BARCODE_EANX_CHK, "12", "", 50, 1, 20, 64, 116 }, - /* 24*/ { BARCODE_GS1_128, "[01]12345678901234", "", 50, 1, 134, 268, 116 }, + /* 24*/ { BARCODE_GS1_128, "[01]12345678901231", "", 50, 1, 134, 268, 116 }, /* 25*/ { BARCODE_CODABAR, "A00000000B", "", 50, 1, 102, 204, 116 }, /* 26*/ { BARCODE_CODE128, "1234567890", "", 50, 1, 90, 180, 116 }, /* 27*/ { BARCODE_DPLEIT, "1234567890123", "", 50, 1, 135, 270, 116 }, @@ -156,7 +156,7 @@ static void test_buffer(int index, int generate, int debug) { /* 32*/ { BARCODE_FLAT, "1234567890", "", 50, 1, 90, 180, 100 }, /* 33*/ { BARCODE_DBAR_OMN, "1234567890123", "", 50, 1, 96, 192, 116 }, /* 34*/ { BARCODE_DBAR_LTD, "1234567890123", "", 50, 1, 79, 158, 116 }, - /* 35*/ { BARCODE_DBAR_EXP, "[01]12345678901234", "", 34, 1, 134, 268, 84 }, + /* 35*/ { BARCODE_DBAR_EXP, "[01]12345678901231", "", 34, 1, 134, 268, 84 }, /* 36*/ { BARCODE_TELEPEN, "1234567890", "", 50, 1, 208, 416, 116 }, /* 37*/ { BARCODE_UPCA, "12345678901", "", 50, 1, 95, 226, 116 }, /* 38*/ { BARCODE_UPCA_CHK, "123456789012", "", 50, 1, 95, 226, 116 }, @@ -199,7 +199,7 @@ static void test_buffer(int index, int generate, int debug) { /* 75*/ { BARCODE_KOREAPOST, "123456", "", 50, 1, 167, 334, 116 }, /* 76*/ { BARCODE_DBAR_STK, "1234567890123", "", 13, 3, 50, 100, 26 }, /* 77*/ { BARCODE_DBAR_OMNSTK, "1234567890123", "", 69, 5, 50, 100, 138 }, - /* 78*/ { BARCODE_DBAR_EXPSTK, "[01]12345678901234", "", 71, 5, 102, 204, 142 }, + /* 78*/ { BARCODE_DBAR_EXPSTK, "[01]12345678901231", "", 71, 5, 102, 204, 142 }, /* 79*/ { BARCODE_PLANET, "12345678901", "", 12, 2, 123, 246, 24 }, /* 80*/ { BARCODE_MICROPDF417, "1234567890", "", 12, 6, 82, 164, 24 }, /* 81*/ { BARCODE_USPS_IMAIL, "12345678901234567890", "", 8, 3, 129, 258, 16 }, @@ -230,10 +230,10 @@ static void test_buffer(int index, int generate, int debug) { /*106*/ { BARCODE_EANX_CC, "1234567", "[20]01", 50, 8, 72, 172, 116 }, /*107*/ { BARCODE_EANX_CC, "1234567+12", "[20]01", 50, 8, 99, 226, 116 }, /*108*/ { BARCODE_EANX_CC, "1234567+12345", "[20]01", 50, 8, 126, 280, 116 }, - /*109*/ { BARCODE_GS1_128_CC, "[01]12345678901234", "[20]01", 50, 5, 145, 290, 116 }, + /*109*/ { BARCODE_GS1_128_CC, "[01]12345678901231", "[20]01", 50, 5, 145, 290, 116 }, /*110*/ { BARCODE_DBAR_OMN_CC, "1234567890123", "[20]01", 21, 5, 100, 200, 58 }, /*111*/ { BARCODE_DBAR_LTD_CC, "1234567890123", "[20]01", 19, 6, 79, 158, 54 }, - /*112*/ { BARCODE_DBAR_EXP_CC, "[01]12345678901234", "[20]01", 41, 5, 134, 268, 98 }, + /*112*/ { BARCODE_DBAR_EXP_CC, "[01]12345678901231", "[20]01", 41, 5, 134, 268, 98 }, /*113*/ { BARCODE_UPCA_CC, "12345678901", "[20]01", 50, 7, 99, 234, 116 }, /*114*/ { BARCODE_UPCA_CC, "12345678901+12", "[20]01", 50, 7, 128, 284, 116 }, /*115*/ { BARCODE_UPCA_CC, "12345678901+12345", "[20]01", 50, 7, 155, 338, 116 }, @@ -242,7 +242,7 @@ static void test_buffer(int index, int generate, int debug) { /*118*/ { BARCODE_UPCE_CC, "1234567+12345", "[20]01", 50, 9, 109, 246, 116 }, /*119*/ { BARCODE_DBAR_STK_CC, "1234567890123", "[20]01", 24, 9, 56, 112, 48 }, /*120*/ { BARCODE_DBAR_OMNSTK_CC, "1234567890123", "[20]01", 80, 11, 56, 112, 160 }, - /*121*/ { BARCODE_DBAR_EXPSTK_CC, "[01]12345678901234", "[20]01", 78, 9, 102, 204, 156 }, + /*121*/ { BARCODE_DBAR_EXPSTK_CC, "[01]12345678901231", "[20]01", 78, 9, 102, 204, 156 }, /*122*/ { BARCODE_CHANNEL, "01", "", 50, 1, 19, 38, 116 }, /*123*/ { BARCODE_CODEONE, "12345678901234567890", "", 22, 22, 22, 44, 44 }, /*124*/ { BARCODE_GRIDMATRIX, "ABC", "", 18, 18, 18, 36, 36 }, diff --git a/backend/tests/test_rss.c b/backend/tests/test_rss.c index bb392409..da687df8 100644 --- a/backend/tests/test_rss.c +++ b/backend/tests/test_rss.c @@ -1,6 +1,6 @@ /* libzint - the open source barcode library - Copyright (C) 2019 - 2020 Robin Stuart + Copyright (C) 2019 - 2021 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -193,6 +193,7 @@ static void test_examples(int index, int generate, int debug) { int option_2; char *data; + int ret; int expected_rows; int expected_width; int bwipp_cmp; @@ -201,109 +202,109 @@ static void test_examples(int index, int generate, int debug) { }; // Verified manually against GS1 General Specifications 20.0 (GGS) and ISO/IEC 24724:2011, and verified via bwipp_dump.ps against BWIPP struct item data[] = { - /* 0*/ { BARCODE_DBAR_OMN, -1, "0950110153001", 1, 96, 1, "GGS Figure 5.5.2.1.1-1. GS1 DataBar Omnidirectional", + /* 0*/ { BARCODE_DBAR_OMN, -1, "0950110153001", 0, 1, 96, 1, "GGS Figure 5.5.2.1.1-1. GS1 DataBar Omnidirectional", "010000010100000101000111110000010111101101011100100011011101000101100000000111001110110111001101" }, - /* 1*/ { BARCODE_DBAR_EXP, -1, "[01]90614141000015[3202]000150", 1, 151, 1, "GGS Figure 5.5.2.3.1-1. GS1 DataBar Expanded", + /* 1*/ { BARCODE_DBAR_EXP, -1, "[01]90614141000015[3202]000150", 0, 1, 151, 1, "GGS Figure 5.5.2.3.1-1. GS1 DataBar Expanded", "0101100011001100001011111111000010100100010000111101110011100010100010111100000011100111010111111011010100000100000110001111110000101000000100011010010" }, - /* 2*/ { BARCODE_DBAR_EXPSTK, -1, "[01]90614141000015[3202]000150", 5, 102, 1, "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", 0, 5, 102, 1, "GGS Figure 5.5.2.3.2-1. GS1 DataBar Expanded Stacked, same (tec-it separator differs)", "010110001100110000101111111100001010010001000011110111001110001010001011110000001110011101011111101101" "000001110011001111010000000010100101101110111100001000110001110101110100001010100001100010100000010000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "000001011111011111001010000001010010111111011100100000000000000000000000000000000000000000000000000000" "001010100000100000110001111110000101000000100011010010000000000000000000000000000000000000000000000000" }, - /* 3*/ { BARCODE_DBAR_OMN, -1, "2001234567890", 1, 96, 1, "24724:2011 Figure 1 — GS1 DataBar Omnidirectional", + /* 3*/ { BARCODE_DBAR_OMN, -1, "2001234567890", 0, 1, 96, 1, "24724:2011 Figure 1 — GS1 DataBar Omnidirectional", "010100011101000001001111111000010100110110111110110000010010100101100000000111000110110110001101" }, - /* 4*/ { BARCODE_DBAR_OMN, -1, "0441234567890", 1, 96, 1, "24724:2011 Figure 2 — GS1 DataBar Omnidirectional", + /* 4*/ { BARCODE_DBAR_OMN, -1, "0441234567890", 0, 1, 96, 1, "24724:2011 Figure 2 — GS1 DataBar Omnidirectional", "010010001000010001000111000000010101000001100110101100100100000101111110000011000010100011100101" }, - /* 5*/ { BARCODE_DBAR_OMN, -1, "0001234567890", 1, 96, 1, "24724:2011 Figure 4 — GS1 DataBar Truncated", + /* 5*/ { BARCODE_DBAR_OMN, -1, "0001234567890", 0, 1, 96, 1, "24724:2011 Figure 4 — GS1 DataBar Truncated", "010101001000000001001111111000010111001011011110111001010110000101111111000111001100111101110101" }, - /* 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", + /* 6*/ { BARCODE_DBAR_STK, -1, "0001234567890", 0, 3, 50, 1, "24724:2011 Figure 5 — GS1 DataBar Stacked NOTE: Figure 5 separator differs from GGS Figure 5.5.2.1.3-1. which has ends set", "01010100100000000100111111100001011100101101111010" "00001010101011111010000000111010100011010010000000" "10111001010110000101111111000111001100111101110101" }, - /* 7*/ { BARCODE_DBAR_OMNSTK, -1, "0003456789012", 5, 50, 1, "24724:2011 Figure 6 — GS1 DataBar Stacked Omnidirectional", + /* 7*/ { BARCODE_DBAR_OMNSTK, -1, "0003456789012", 0, 5, 50, 1, "24724:2011 Figure 6 — GS1 DataBar Stacked Omnidirectional", "01010100100000000100111110000001010011100110011010" "00001011011111111010000001010100101100011001100000" "00000101010101010101010101010101010101010101010000" "00001000100010111010010101010000111101001101110000" "10110111011101000101100000000111000010110010001101" }, - /* 8*/ { BARCODE_DBAR_LTD, -1, "1501234567890", 1, 79, 1, "24724:2011 Figure 7 — GS1 DataBar Limited", + /* 8*/ { BARCODE_DBAR_LTD, -1, "1501234567890", 0, 1, 79, 1, "24724:2011 Figure 7 — GS1 DataBar Limited", "0100011001100011011010100111010010101101001101001001011000110111001100110100000" }, - /* 9*/ { BARCODE_DBAR_LTD, -1, "0031234567890", 1, 79, 1, "24724:2011 Figure 8 — (a) GS1 DataBar Limited", + /* 9*/ { BARCODE_DBAR_LTD, -1, "0031234567890", 0, 1, 79, 1, "24724:2011 Figure 8 — (a) GS1 DataBar Limited", "0101010000010010001000010111001010110110100101011000001010010010110000010100000" }, - /* 10*/ { BARCODE_DBAR_EXP, -1, "[01]98898765432106[3202]012345[15]991231", 1, 200, 1, "24724:2011 Figure 10 — GS1 DataBar Expanded", + /* 10*/ { BARCODE_DBAR_EXP, -1, "[01]98898765432106[3202]012345[15]991231", 0, 1, 200, 1, "24724:2011 Figure 10 — GS1 DataBar Expanded", "01001000011000110110111111110000101110000110010100011010000001100010101111110000111010011100000010010100111110111001100011111100001011101100000100100100011110010110001011111111001110001101111010000101" }, - /* 11*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3103]001750", 1, 151, 1, "24724:2011 Figure 11 — GS1 DataBar Expanded", + /* 11*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3103]001750", 0, 1, 151, 1, "24724:2011 Figure 11 — GS1 DataBar Expanded", "0101110010000010011011111111000010111000010011000101011110111001100010111100000011100101110001110111011110101111000110001111110000101011000010011111010" }, - /* 12*/ { BARCODE_DBAR_EXPSTK, -1, "[01]98898765432106[3202]012345[15]991231", 5, 102, 1, "24724:2011 Figure 12 — GS1 DataBar Expanded Stacked symbol", + /* 12*/ { BARCODE_DBAR_EXPSTK, -1, "[01]98898765432106[3202]012345[15]991231", 0, 5, 102, 1, "24724:2011 Figure 12 — GS1 DataBar Expanded Stacked symbol", "010010000110001101101111111100001011100001100101000110100000011000101011111100001110100111000000100101" "000001111001110010010000000010100100011110011010111001011111100111010100000010100001011000111111010000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "000011101000010011100001000000001011100101100001110110110111110010001001010000001010011000100000110000" "101000010111101100011100111111110100011010011110001001001000001101110100001111110001100111011111001010" }, - /* 13*/ { BARCODE_DBAR_EXPSTK, -1, "[01]95012345678903[3103]000123", 5, 102, 1, "24724:2011 Figure 13 — GS1 DataBar Expanded Stacked", + /* 13*/ { BARCODE_DBAR_EXPSTK, -1, "[01]95012345678903[3103]000123", 0, 5, 102, 1, "24724:2011 Figure 13 — GS1 DataBar Expanded Stacked", "010100010001111000101111111100001010111000001100010111000110001001101011110000001110010111000111011101" "000011101110000111010000000010100101000111110011101000111001110110010100001010100001101000111000100000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "000000001010000111001010000001010010111011011111100000000000000000000000000000000000000000000000000000" "001011110101111000110001111110000101000100100000011010000000000000000000000000000000000000000000000000" }, - /* 14*/ { BARCODE_DBAR_LTD, -1, "0009876543210", 1, 79, 1, "24724:2011 Figure F.2 — GS1 DataBar Limited", + /* 14*/ { BARCODE_DBAR_LTD, -1, "0009876543210", 0, 1, 79, 1, "24724:2011 Figure F.2 — GS1 DataBar Limited", "0101010010010011000011000001010110100101100101000100010100010000010010010100000" }, - /* 15*/ { BARCODE_DBAR_EXP, -1, "[10]12A", 1, 102, 1, "24724:2011 Figure F.3 — GS1 DataBar Expanded", + /* 15*/ { BARCODE_DBAR_EXP, -1, "[10]12A", 0, 1, 102, 1, "24724:2011 Figure F.3 — GS1 DataBar Expanded", "010100000110100000101111111100001010001000000010110101111100100111001011110000000010011101111111010101" }, - /* 16*/ { BARCODE_DBAR_STK, -1, "0000000000000", 3, 50, 1, "#183 GS1 DataBar Stacked separator alternation; verified manually against tec-it.com", + /* 16*/ { BARCODE_DBAR_STK, -1, "0000000000000", 0, 3, 50, 1, "#183 GS1 DataBar Stacked separator alternation; verified manually against tec-it.com", "01010100100000000100011111111001011111110010101010" "00000101011111111010100000001010100000001101010000" "10101010110000000101111111110111011111111011010101" }, - /* 17*/ { BARCODE_DBAR_EXP, -1, "[255]95011015340010123456789", 1, 232, 1, "GGS 2.6.2.1 Example 1", + /* 17*/ { BARCODE_DBAR_EXP, -1, "[255]95011015340010123456789", 0, 1, 232, 1, "GGS 2.6.2.1 Example 1", "0100011000110001011011111111000010100000010101100001100001100111001010111110000001100100001110100001001000011011111010001111110000101001011111100111011001000111100100101111111100111011111001100100110010011100010111100011110000001010" }, - /* 18*/ { BARCODE_DBAR_EXP, -1, "[255]95011015340010123456789[3900]000", 1, 298, 1, "GGS 2.6.2.1 Example 2", + /* 18*/ { BARCODE_DBAR_EXP, -1, "[255]95011015340010123456789[3900]000", 0, 1, 298, 1, "GGS 2.6.2.1 Example 2", "0101100011111010001011111111000010100001000001001101100001100111001010111110000001100100001110100001001000011011111010001111110000101001011111100111011001000111100100101111111100111011111001100100110010011100010111100011000000001010111111011101000100001000110001101011111111100110011110010010001101" }, - /* 19*/ { BARCODE_DBAR_EXP, -1, "[255]9501101534001[17]160531[3902]050", 1, 281, 1, "GGS 2.6.2.1 Example 3", + /* 19*/ { BARCODE_DBAR_EXP, -1, "[255]9501101534001[17]160531[3902]050", 0, 1, 281, 1, "GGS 2.6.2.1 Example 3", "01011001000110011110111111110000101000000101011000011000011001110010101111100000011001000011101000010010000110111110100011111100001010010111111001110111000010010100001011111111001110000100001100110100010000001101001000110000000010111010011110011101110010110001100010111111111001101" }, - /* 20*/ { BARCODE_DBAR_EXPSTK, 3, "[255]9501101534001012345[8111]0500", 5, 151, 1, "GGS 2.6.2.1 Example 4, same (tec-it separator differs)", + /* 20*/ { BARCODE_DBAR_EXPSTK, 3, "[255]9501101534001012345[8111]0500", 0, 5, 151, 1, "GGS 2.6.2.1 Example 4, same (tec-it separator differs)", "0101100111100011001011111111000010100000010101100001100001100111001010111110000001100100001110100001001000011011111010001111110000101001011111100111010" "0000011000011100110100000000101001011111101010011110011110011000110101000001010100011011110001011110110111100100000101010000001010010110100000011000000" "0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" "0000110111000011011010000000010000100000100111011001100001100100010010100101010100101110110001111001011101100011101110100000000010000000000000000000000" "1011001000111100100101111111100111011111011000100110011110011011101100011000000001010001001110000110100010011100010001011111111100110100000000000000000" }, - /* 21*/ { BARCODE_DBAR_EXPSTK, 3, "[255]9501101534001[3941]0035", 5, 151, 1, "GGS 2.6.2.1 Example 5, same (tec-it separator differs)", + /* 21*/ { BARCODE_DBAR_EXPSTK, 3, "[255]9501101534001[3941]0035", 0, 5, 151, 1, "GGS 2.6.2.1 Example 5, same (tec-it separator differs)", "0100001101011000011011111111000010100000010101100001100001100111001010111110000001100100001110100001001000011011111010001111110000101001011111100111010" "0000110010100111100100000000101001011111101010011110011110011000110101000001010100011011110001011110110111100100000101010000001010010110100000011000000" "0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" "0000011011111011111010000000010000111100101011111001000100011100111010100001010100000000000000000000000000000000000000000000000000000000000000000000000" "1010100100000100000101111111100111000011010100000110111011100011000100011110000001010000000000000000000000000000000000000000000000000000000000000000000" }, - /* 22*/ { BARCODE_DBAR_OMN, -1, "0950110153000", 1, 96, 1, "https://www.gs1.org/standards/barcodes/databar, same, verified manually against tec-it", + /* 22*/ { BARCODE_DBAR_OMN, -1, "0950110153000", 0, 1, 96, 1, "https://www.gs1.org/standards/barcodes/databar, same, verified manually against tec-it", "010000010100000101000111111110010111101101011100100011011011000101111110000011001110110111001101" }, - /* 23*/ { BARCODE_DBAR_STK, -1, "0950110153000", 3, 50, 1, "https://www.gs1.org/standards/barcodes/databar, same, verified manually against tec-it", + /* 23*/ { BARCODE_DBAR_STK, -1, "0950110153000", 0, 3, 50, 1, "https://www.gs1.org/standards/barcodes/databar, same, verified manually against tec-it", "01000001010000010100011111111001011110110101110010" "00001100101101101010100001010100100001001010100000" "10100011011011000101111110000011001110110111001101" }, - /* 24*/ { BARCODE_DBAR_EXPSTK, -1, "[01]09501101530003[17]140704[10]AB-123", 9, 102, 1, "https://www.gs1.org/standards/barcodes/databar, same (tec-it separator differs)", + /* 24*/ { BARCODE_DBAR_EXPSTK, -1, "[01]09501101530003[17]140704[10]AB-123", 0, 9, 102, 1, "https://www.gs1.org/standards/barcodes/databar, same (tec-it separator differs)", "010101111100001001101111111100001011100001110110010100000011011010001011111000000110011010000001001101" "000010000011110110010000000010100100011110001001101011111100100101110100000101010001100101111110110000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" @@ -314,64 +315,64 @@ static void test_examples(int index, int generate, int debug) { "000010111101011110010100101010100100111100110010111001001100011111010100000000010000000000000000000000" "010001000010100001100011000000001011000011001101000110110011100000101011111111100110100000000000000000" }, - /* 25*/ { BARCODE_DBAR_EXP, -1, "[01]09501101530003[17]140704[10]AB-123", 1, 281, 1, "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", 0, 1, 281, 1, "https://www.gs1.org/standards/barcodes/databar, same, verified manually against tec-it", "01010111110000100110111111110000101110000111011001010000001101101000101111100000011001101000000100110001110100010001100011111100001010100000111100100100100111000001001011111111001110000011011001000100010000101000011000110000000010110000110011010001101100111000001010111111111001101" }, - /* 26*/ { BARCODE_DBAR_STK, -1, "07010001234567", 3, 50, 1, "https://www.gs1.no/support/standardbibliotek/datafangst/gs1-databar, same, verified manually against tec-it", + /* 26*/ { BARCODE_DBAR_STK, -1, "07010001234567", 0, 3, 50, 1, "https://www.gs1.no/support/standardbibliotek/datafangst/gs1-databar, same, verified manually against tec-it", "01000100001010000100011100000001011000100110001010" "00000011010101011010101011111010100111010101010000" "10111100101110100101100000000111011000001000110101" }, - /* 27*/ { BARCODE_DBAR_OMNSTK, -1, "12380000000008", 5, 50, 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))", + /* 27*/ { BARCODE_DBAR_OMNSTK, -1, "12380000000008", 0, 5, 50, 1, "Example with finder values 3 & 3; for bottom row see 5.3.2.2, same as BWIPP (tec-it and IDAutomation differ (ie no shift))", "01011101001000000100010000000001010000001101011010" "00000010110111111010101010101010101111110010100000" "00000101010101010101010101010101010101010101010000" "00001101100011001010000000000100101100111011110000" "10100010011100110101111111110111010011000100001101" }, - /* 28*/ { BARCODE_DBAR_OMNSTK, -1, "99991234912372", 5, 50, 1, "Example with finder values 8 & 6, same as BWIPP, verified manually against tec-it and IDAutomation", + /* 28*/ { BARCODE_DBAR_OMNSTK, -1, "99991234912372", 0, 5, 50, 1, "Example with finder values 8 & 6, same as BWIPP, verified manually against tec-it and IDAutomation", "01001011101110000101110000000001011111011100101010" "00000100010001111010001010101010100000100011010000" "00000101010101010101010101010101010101010101010000" "00001000100011001010000000010100100001000100100000" "10100111011100110101111111100011011110111011011101" }, - /* 29*/ { BARCODE_DBAR_OMNSTK, -1, "32219876543217", 5, 50, 1, "Example with finder values 6 & 1, same as BWIPP, verified manually against tec-it and IDAutomation", + /* 29*/ { BARCODE_DBAR_OMNSTK, -1, "32219876543217", 0, 5, 50, 1, "Example with finder values 6 & 1, same as BWIPP, verified manually against tec-it and IDAutomation", "01001011000010001100111000000001011100010101000010" "00000100111101110010000101010100100011101010110000" "00000101010101010101010101010101010101010101010000" "00001110011100101010000010101000110100001000010000" "10110001100011010101111100000111001011110111100101" }, - /* 30*/ { BARCODE_DBAR_OMNSTK, -1, "32219876543255", 5, 50, 1, "Example with finder values 7 & 7, same as BWIPP, verified manually against tec-it and IDAutomation", + /* 30*/ { BARCODE_DBAR_OMNSTK, -1, "32219876543255", 0, 5, 50, 1, "Example with finder values 7 & 7, same as BWIPP, verified manually against tec-it and IDAutomation", "01001011000010001101111100000001011100010101000010" "00000100111101110010000010101010100011101010110000" "00000101010101010101010101010101010101010101010000" "00000111001110101010000000101010110100001000010000" "10111000110001010101111111000001001011110111100101" }, - /* 31*/ { BARCODE_DBAR_OMNSTK, -1, "04072912296211", 5, 50, 1, "Example with finder values 7 & 8, same as BWIPP, verified manually against tec-it and IDAutomation", + /* 31*/ { BARCODE_DBAR_OMNSTK, -1, "04072912296211", 0, 5, 50, 1, "Example with finder values 7 & 8, same as BWIPP, verified manually against tec-it and IDAutomation", "01001001000000010101111100000001011111000100101010" "00000110111111101010000010101010100000111011010000" "00000101010101010101010101010101010101010101010000" "00001110100010111010000000001010111010000111010000" "10110001011101000101111111110001000101111000101101" }, - /* 32*/ { BARCODE_DBAR_OMNSTK, -1, "06666666666666", 5, 50, 1, "Example with finder values 6 & 4, same as BWIPP, verified manually against tec-it and IDAutomation", + /* 32*/ { BARCODE_DBAR_OMNSTK, -1, "06666666666666", 0, 5, 50, 1, "Example with finder values 6 & 4, same as BWIPP, verified manually against tec-it and IDAutomation", "01000100010010000100111000000001011110111100101010" "00001011101101111010000101010100100001000011010000" "00000101010101010101010101010101010101010101010000" "00000100011111001010000101010100101001100001110000" "10101011100000110101111000000011010110011110000101" }, - /* 33*/ { BARCODE_DBAR_EXPSTK, -1, "[90]12345678901234567", 5, 102, 1, "Example with 7 chars, 1 full row, bottom 3 chars", + /* 33*/ { BARCODE_DBAR_EXPSTK, -1, "[90]12345678901234567", 0, 5, 102, 1, "Example with 7 chars, 1 full row, bottom 3 chars", "010010100001111000101111111100001010000010001110110100111110001011101011111100001110001111010011000101" "000001011110000111010000000010100101111101110001001011000001110100010100000010100001110000101100110000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "000000100000000101111110110001101011110001110011010100101000000101000010010111000000000000000000000000" "101110011111111010000001001110010100001110001100101010000111111000111101101000111101000000000000000000" }, - /* 34*/ { BARCODE_DBAR_EXPSTK, -1, "[90]123456789012345678901234567", 9, 102, 1, "Example with 10 chars, 2 full rows, bottom 2 chars", + /* 34*/ { BARCODE_DBAR_EXPSTK, -1, "[90]123456789012345678901234567", 0, 9, 102, 1, "Example with 10 chars, 2 full rows, bottom 2 chars", "010000111100100010101111111100001010001000100000110100111110001011101011111000000110001111010011000101" "000011000011011101010000000010100101110111011111001011000001110100010100000101010001110000101100110000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" @@ -382,7 +383,7 @@ static void test_examples(int index, int generate, int debug) { "000010000110110001010100001010100100000111010011000000000000000000000000000000000000000000000000000000" "010001111001001110100011110000001011111000101100100100000000000000000000000000000000000000000000000000" }, - /* 35*/ { BARCODE_DBAR_EXPSTK, -1, "[90]123456789012345678901234567890", 9, 102, 1, "Example with 11 chars, 2 full rows, bottom 3 chars", + /* 35*/ { BARCODE_DBAR_EXPSTK, -1, "[90]123456789012345678901234567890", 0, 9, 102, 1, "Example with 11 chars, 2 full rows, bottom 3 chars", "010111011100010001101111111100001010000010001110110100111110001011101011111000000110001111010011000101" "000000100011101110010000000010100101111101110001001011000001110100010100000101010001110000101100110000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" @@ -393,7 +394,7 @@ static void test_examples(int index, int generate, int debug) { "000010000110110001010100101010100100111000100011011011000110001101110100000000010000000000000000000000" "010001111001001110100011000000001011000111011100100100111001110010001011111111100110100000000000000000" }, - /* 36*/ { BARCODE_DBAR_EXPSTK, -1, "[91]1234567890123456789012345678901234", 9, 102, 1, "Example with 12 chars, 3 full rows", + /* 36*/ { BARCODE_DBAR_EXPSTK, -1, "[91]1234567890123456789012345678901234", 0, 9, 102, 1, "Example with 12 chars, 3 full rows", "010100010011111001101111111100001011001000010000010100111110001011101011111000000110001111010011000101" "000011101100000110010000000010100100110111101111101011000001110100010100000101010001110000101100110000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" @@ -404,7 +405,7 @@ static void test_examples(int index, int generate, int debug) { "000010000110110001010100101010100100111000100011011011000110001110110100000000010001101110100001000000" "010001111001001110100011000000001011000111011100100100111001110001001011111111100110010001011110111101" }, - /* 37*/ { BARCODE_DBAR_EXPSTK, -1, "[91]123456789012345678901234567890123456789012", 13, 102, 1, "Example with 15 chars, 3 full rows, bottom 7 chars", + /* 37*/ { BARCODE_DBAR_EXPSTK, -1, "[91]123456789012345678901234567890123456789012", 0, 13, 102, 1, "Example with 15 chars, 3 full rows, bottom 7 chars", "010010000111101011101111111100001011100000101100010100111110001011101011110000000010001111010011000101" "000001111000010100010000000010100100011111010011101011000001110100010100001010101001110000101100110000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" @@ -419,7 +420,7 @@ static void test_examples(int index, int generate, int debug) { "000000100000000101001001111101100011000010000110010100101010100101011111011100100000000000000000000000" "101110011111111010110110000010011100111101111001101010000000011000100000100011011101000000000000000000" }, - /* 38*/ { BARCODE_DBAR_EXPSTK, 3, "[91]123456789012345678901234567890123456789012", 9, 151, 1, "Example with 15 chars, 2 full rows, bottom 3 chars", + /* 38*/ { BARCODE_DBAR_EXPSTK, 3, "[91]123456789012345678901234567890123456789012", 0, 9, 151, 1, "Example with 15 chars, 2 full rows, bottom 3 chars", "0100100001111010111011111111000010111000001011000101001111100010111010111100000000100011110100110001011110001011011110001111110000101010011000111000010" "0000011110000101000100000000101001000111110100111010110000011101000101000010101010011100001011001110100001110100100001010000001010010101100111000110000" "0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" @@ -430,7 +431,7 @@ static void test_examples(int index, int generate, int debug) { "0000001001110111110101001010101001010011000010000110001101111100100101000000001000000000000000000000000000000000000000000000000000000000000000000000000" "0101110110001000001000110000000010101100111101111001110010000011011010111111110011101000000000000000000000000000000000000000000000000000000000000000000" }, - /* 39*/ { BARCODE_DBAR_EXPSTK, -1, "[91]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFG", 17, 102, 1, "Example with 19 chars, 4 full rows, bottom 3 chars", + /* 39*/ { BARCODE_DBAR_EXPSTK, -1, "[91]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFG", 0, 17, 102, 1, "Example with 19 chars, 4 full rows, bottom 3 chars", "010101111100011101101111111100001011100000101100010101111110011110101011110000000010111000111110010101" "000010000011100010010000000010100100011111010011101010000001100001010100001010101001000111000001100000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" @@ -449,7 +450,7 @@ static void test_examples(int index, int generate, int debug) { "000010011111000111010001010101010101000111001111011011110100110000110100000000010000000000000000000000" "010101100000111000100110000000001010111000110000100100001011001111001011111111100110100000000000000000" }, - /* 40*/ { BARCODE_DBAR_EXPSTK, -1, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 21, 102, 1, "Example with 22 chars, 5 full rows, bottom 2 chars", + /* 40*/ { BARCODE_DBAR_EXPSTK, -1, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 0, 21, 102, 1, "Example with 22 chars, 5 full rows, bottom 2 chars", "010101011110111111101111111100001011001000000101000100111110001011101011110000000010001111010011000101" "000010100001000000010000000010100100110111111010111011000001110100010100001010101001110000101100110000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" @@ -472,7 +473,7 @@ static void test_examples(int index, int generate, int debug) { "000001000111010000101000101010101010100001011000110000000000000000000000000000000000000000000000000000" "001000111000101111010011000000000101011110100111000010000000000000000000000000000000000000000000000000" }, - /* 41*/ { BARCODE_DBAR_EXPSTK, 3, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 13, 151, 1, "Example with 22 chars, 3 full rows, bottom 4 chars", + /* 41*/ { BARCODE_DBAR_EXPSTK, 3, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 0, 13, 151, 1, "Example with 22 chars, 3 full rows, bottom 4 chars", "0101010111101111111011111111000010110010000001010001001111100010111010111100000000100011110100110001011110001011011110001111110000101010011000111000010" "0000101000010000000100000000101001001101111110101110110000011101000101000010101010011100001011001110100001110100100001010000001010010101100111000110000" "0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" @@ -487,7 +488,7 @@ static void test_examples(int index, int generate, int debug) { "0000101110001000111010000000001000101111101000110001110001110100001010001010101010101000010110001100000000000000000000000000000000000000000000000000000" "1010010001110111000101111111110011010000010111001110001110001011110100110000000001010111101001110000100000000000000000000000000000000000000000000000000" }, - /* 42*/ { BARCODE_DBAR_EXPSTK, 4, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 9, 200, 1, "Example with 22 chars, 2 full rows, bottom 6 chars", + /* 42*/ { BARCODE_DBAR_EXPSTK, 4, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 0, 9, 200, 1, "Example with 22 chars, 2 full rows, bottom 6 chars", "01010101111011111110111111110000101100100000010100010011111000101110101111000000001000111101001100010111100010110111100011111100001010100110001110000101001110000010001011110000001110001110001000100101" "00001010000100000001000000001010010011011111101011101100000111010001010000101010100111000010110011101000011101001000010100000010100101011001110001111010110001111101110100001010100001110001110111010000" "00000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" @@ -498,7 +499,7 @@ static void test_examples(int index, int generate, int debug) { "00000011000110001001000000010101010000011110011010101101110001000111010000000001000101111101000110001110001110100001010001010101010101000010110001100000000000000000000000000000000000000000000000000000" "01011100111001110110011111100000101111100001100101010010001110111000101111111110011010000010111001110001110001011110100110000000001010111101001110000100000000000000000000000000000000000000000000000000" }, - /* 43*/ { BARCODE_DBAR_EXPSTK, 5, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 9, 249, 1, "Example with 22 chars, 2 full rows, bottom 2 chars", + /* 43*/ { BARCODE_DBAR_EXPSTK, 5, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 0, 9, 249, 1, "Example with 22 chars, 2 full rows, bottom 2 chars", "010101011110111111101111111100001011001000000101000100111110001011101011110000000010001111010011000101111000101101111000111111000010101001100011100001010011100000100010111100000011100011100010001001000111100100111010001111000000101100011101110010010" "000010100001000000010000000010100100110111111010111011000001110100010100001010101001110000101100111010000111010010000101000000101001010110011100011110101100011111011101000010101000011100011101110110111000011011000101010000101010010011100010001100000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" @@ -509,45 +510,45 @@ static void test_examples(int index, int generate, int debug) { "000010001110100001010001010101010101000010110001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "010001110001011110100110000000001010111101001110000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" }, - /* 44*/ { BARCODE_DBAR_EXPSTK, 6, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 5, 298, 1, "Example with 22 chars, 1 full row, bottom 10 chars", + /* 44*/ { BARCODE_DBAR_EXPSTK, 6, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 0, 5, 298, 1, "Example with 22 chars, 1 full row, bottom 10 chars", "0101010111101111111011111111000010110010000001010001001111100010111010111100000000100011110100110001011110001011011110001111110000101010011000111000010100111000001000101111000000111000111000100010010001111001001110100011110000001011000111011100100100111001110001001011111111001110100001011110111101" "0000101000010000000100000000101001001101111110101110110000011101000101000010101010011100001011001110100001110100100001010000001010010101100111000111101011000111110111010000101010000111000111011101101110000110110001010100001010100100111000100011011011000110001110110100000000100001011110100001000000" "0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "0000000100111011111010100101010100101001100001000011000100010111101110100000101010001100000110011010010001100011000100100000001010101000001111001101010110111000100011101000000000100010111110100011000111000111010000101000101010101010100001011000110000000000000000000000000000000000000000000000000000" "0010111011000100000100011000000001010110011110111100111011101000010001011111000000110011111001100101101110011100111011001111110000010111110000110010101001000111011100010111111111001101000001011100111000111000101111010011000000000101011110100111000010000000000000000000000000000000000000000000000000" }, - /* 45*/ { BARCODE_DBAR_EXPSTK, 7, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 5, 347, 1, "Example with 22 chars, 1 full row, bottom 8 chars", + /* 45*/ { BARCODE_DBAR_EXPSTK, 7, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 0, 5, 347, 1, "Example with 22 chars, 1 full row, bottom 8 chars", "01010101111011111110111111110000101100100000010100010011111000101110101111000000001000111101001100010111100010110111100011111100001010100110001110000101001110000010001011110000001110001110001000100100011110010011101000111100000010110001110111001001001110011100010010111111110011101000010111101111011101100010000010001100000000101011001111011110010" "00001010000100000001000000001010010011011111101011101100000111010001010000101010100111000010110011101000011101001000010100000010100101011001110001111010110001111101110100001010100001110001110111011011100001101100010101000010101001001110001000110110110001100011101101000000001000010111101000010000100010011101111101010010101010010100110000100000000" "00000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" "00000100010111101110100000101010001100000110011010010001100011000100100000001010101000001111001101010110111000100011101000000000100010111110100011000111000111010000101000101010101010100001011000110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "10111011101000010001011111000000110011111001100101101110011100111011001111110000010111110000110010101001000111011100010111111111001101000001011100111000111000101111010011000000000101011110100111000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" }, - /* 46*/ { BARCODE_DBAR_EXPSTK, 8, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 5, 396, 1, "Example with 22 chars, 1 full row, bottom 6 chars", + /* 46*/ { BARCODE_DBAR_EXPSTK, 8, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 0, 5, 396, 1, "Example with 22 chars, 1 full row, bottom 6 chars", "010101011110111111101111111100001011001000000101000100111110001011101011110000000010001111010011000101111000101101111000111111000010101001100011100001010011100000100010111100000011100011100010001001000111100100111010001111000000101100011101110010010011100111000100101111111100111010000101111011110111011000100000100011000000001010110011110111100111011101000010001011111000000110011111001100101101" "000010100001000000010000000010100100110111111010111011000001110100010100001010101001110000101100111010000111010010000101000000101001010110011100011110101100011111011101000010101000011100011101110110111000011011000101010000101010010011100010001101101100011000111011010000000010000101111010000100001000100111011111010100101010100101001100001000011000100010111101110100000101010001100000110011010000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "000000011000110001001000000010101010000011110011010101101110001000111010000000001000101111101000110001110001110100001010001010101010101000010110001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "001011100111001110110011111100000101111100001100101010010001110111000101111111110011010000010111001110001110001011110100110000000001010111101001110000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" }, - /* 47*/ { BARCODE_DBAR_EXPSTK, 9, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 5, 445, 1, "Example with 22 chars, 1 full row, bottom 4 chars", + /* 47*/ { BARCODE_DBAR_EXPSTK, 9, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 0, 5, 445, 1, "Example with 22 chars, 1 full row, bottom 4 chars", "0101010111101111111011111111000010110010000001010001001111100010111010111100000000100011110100110001011110001011011110001111110000101010011000111000010100111000001000101111000000111000111000100010010001111001001110100011110000001011000111011100100100111001110001001011111111001110100001011110111101110110001000001000110000000010101100111101111001110111010000100010111110000001100111110011001011011100111001110110011111100000101111100001100101010" "0000101000010000000100000000101001001101111110101110110000011101000101000010101010011100001011001110100001110100100001010000001010010101100111000111101011000111110111010000101010000111000111011101101110000110110001010100001010100100111000100011011011000110001110110100000000100001011110100001000010001001110111110101001010101001010011000010000110001000101111011101000001010100011000001100110100100011000110001001000000010101010000011110011010000" "0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" "0000101110001000111010000000001000101111101000110001110001110100001010001010101010101000010110001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "1010010001110111000101111111110011010000010111001110001110001011110100110000000001010111101001110000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" }, - /* 48*/ { BARCODE_DBAR_EXPSTK, 10, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 5, 494, 1, "Example with 22 chars, 1 full row, bottom 2 chars", + /* 48*/ { BARCODE_DBAR_EXPSTK, 10, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 0, 5, 494, 1, "Example with 22 chars, 1 full row, bottom 2 chars", "01010101111011111110111111110000101100100000010100010011111000101110101111000000001000111101001100010111100010110111100011111100001010100110001110000101001110000010001011110000001110001110001000100100011110010011101000111100000010110001110111001001001110011100010010111111110011101000010111101111011101100010000010001100000000101011001111011110011101110100001000101111100000011001111100110010110111001110011101100111111000001011111000011001010100100011101110001011111111100110100000101110011101" "00001010000100000001000000001010010011011111101011101100000111010001010000101010100111000010110011101000011101001000010100000010100101011001110001111010110001111101110100001010100001110001110111011011100001101100010101000010101001001110001000110110110001100011101101000000001000010111101000010000100010011101111101010010101010010100110000100001100010001011110111010000010101000110000011001101001000110001100010010000000101010100000111100110101011011100010001110100000000010001011111010001100000" "00000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "00000100011101000010100010101010101010000101100011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "00100011100010111101001100000000010101111010011100001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" }, - /* 49*/ { BARCODE_DBAR_EXPSTK, 11, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 1, 543, 1, "Example with 22 chars, 1 row", + /* 49*/ { BARCODE_DBAR_EXPSTK, 11, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 0, 1, 543, 1, "Example with 22 chars, 1 row", "010101011110111111101111111100001011001000000101000100111110001011101011110000000010001111010011000101111000101101111000111111000010101001100011100001010011100000100010111100000011100011100010001001000111100100111010001111000000101100011101110010010011100111000100101111111100111010000101111011110111011000100000100011000000001010110011110111100111011101000010001011111000000110011111001100101101110011100111011001111110000010111110000110010101001000111011100010111111111001101000001011100111000111000101111010011000000000101011110100111000010" }, - /* 50*/ { BARCODE_DBAR_EXPSTK, 1, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 41, 53, 1, "Example with 22 chars, 11 rows", + /* 50*/ { BARCODE_DBAR_EXPSTK, 1, "[91]12345678901234567890123456789012345678901234567890123456789012345678", 0, 41, 53, 1, "Example with 22 chars, 11 rows", "01010101111011111110111111110000101100100000010100010" "00001010000100000001000000001010010011011111101010000" "00000101010101010101010101010101010101010101010100000" @@ -590,14 +591,14 @@ static void test_examples(int index, int generate, int debug) { "00001000111010000101000101010101010100001011000110000" "01000111000101111010011000000000101011110100111000010" }, - /* 51*/ { BARCODE_DBAR_EXPSTK, 6, "[01]98898765432106[3202]012345[15]991231[3203]001234[17]010203", 5, 298, 1, "#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", 0, 5, 298, 1, "#200 Daniel Gredler mostly empty last row, 16 chars, 2 rows, bottom row 4 chars", "0100011101110001011011111111000010110000100101111101101000000110001010111100000000101001110000001001010011111011100110001111110000101110101000011000011010011100011000101111000000111001111000111101010111110010110000100011110000001010110010000010000111011111000100101011111100001110011110011000100101" "0000100010001110100100000000101001001111011010000010010111111001110101000010101010010110001111110110101100000100011001010000001010010001010111100111100101100011100111010000101010000110000111000010101000001101001111010100001010100101001101111101111000100000111011010100000010100001100001100111010000" "0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "0000110000010010011000010000000010111110011010001001111010011011100010010101010010101110100011111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "1010001111101101100111001111111101000001100101110110000101100100011101000000001100010001011100000110100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" }, - /* 52*/ { BARCODE_DBAR_EXPSTK, 3, "[01]98898765432106[3202]012345[15]991231[3203]001234[17]010203", 9, 151, 1, "#200 16 chars, 3 rows, bottom row 4 chars", + /* 52*/ { BARCODE_DBAR_EXPSTK, 3, "[01]98898765432106[3202]012345[15]991231[3203]001234[17]010203", 0, 9, 151, 1, "#200 16 chars, 3 rows, bottom row 4 chars", "0100011101110001011011111111000010110000100101111101101000000110001010111100000000101001110000001001010011111011100110001111110000101110101000011000010" "0000100010001110100100000000101001001111011010000010010111111001110101000010101010010110001111110110101100000100011001010000001010010001010111100110000" "0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" @@ -608,114 +609,170 @@ static void test_examples(int index, int generate, int debug) { "0000011111000101110101001010101001000111011001011110010001011001111101000000001000011001001000001100000000000000000000000000000000000000000000000000000" "0101100000111010001000110000000010111000100110100001101110100110000010111111110011100110110111110001010000000000000000000000000000000000000000000000000" }, - /* 53*/ { BARCODE_DBAR_EXPSTK, 4, "[01]98898765432106[3202]012345[15]991231[3203]001234[17]010203", 5, 200, 1, "#200 16 chars, 2 full rows", + /* 53*/ { BARCODE_DBAR_EXPSTK, 4, "[01]98898765432106[3202]012345[15]991231[3203]001234[17]010203", 0, 5, 200, 1, "#200 16 chars, 2 full rows", "01000111011100010110111111110000101100001001011111011010000001100010101111000000001010011100000010010100111110111001100011111100001011101010000110000110100111000110001011110000001110011110001111010101" "00001000100011101001000000001010010011110110100000100101111110011101010000101010100101100011111101101011000001000110010100000010100100010101111001111001011000111001110100001010100001100001110000100000" "00000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" "00001100000100100110000100000000101111100110100010011110100110111000100101010100101011101000111110010110111001100001100001010000001010110111000001000111101111101100101001010100001010111100101100000000" "10100011111011011001110011111111010000011001011101100001011001000111010000000011000100010111000001101001000110011110011100001111110101001000111110111000010000010011010100000011110001000011010011111010" }, - /* 54*/ { BARCODE_DBAR_EXPSTK, 5, "[01]98898765432106[3202]012345[15]991231[3203]001234[17]010203", 5, 249, 1, "#200 16 chars, 2 rows, bottom row 6 chars", + /* 54*/ { BARCODE_DBAR_EXPSTK, 5, "[01]98898765432106[3202]012345[15]991231[3203]001234[17]010203", 0, 5, 249, 1, "#200 16 chars, 2 rows, bottom row 6 chars", "010001110111000101101111111100001011000010010111110110100000011000101011110000000010100111000000100101001111101110011000111111000010111010100001100001101001110001100010111100000011100111100011110101011111001011000010001111000000101011001000001000010" "000010001000111010010000000010100100111101101000001001011111100111010100001010101001011000111111011010110000010001100101000000101001000101011110011110010110001110011101000010101000011000011100001010100000110100111101010000101010010100110111110110000" "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" "000001000001110110101000000101000011000011001110110100111110001011101010010101010010001110110010111100100010110011111010000000010000110010010000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "101110111110001001010111111000011100111100110001001011000001110100010001100000000101110001001101000011011101001100000101111111100111001101101111100010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" }, - /* 55*/ { BARCODE_DBAR_EXPSTK, 7, "[01]98898765432106[3202]012345[15]991231[3203]001234[17]010203", 5, 347, 1, "#200 16 chars, 2 rows, bottom row 2 chars", + /* 55*/ { BARCODE_DBAR_EXPSTK, 7, "[01]98898765432106[3202]012345[15]991231[3203]001234[17]010203", 0, 5, 347, 1, "#200 16 chars, 2 rows, bottom row 2 chars", "01000111011100010110111111110000101100001001011111011010000001100010101111000000001010011100000010010100111110111001100011111100001011101010000110000110100111000110001011110000001110011110001111010101111100101100001000111100000010101100100000100001110111110001001010111111000011100111100110001001011000001110100010001100000000101110001001101000010" "00001000100011101001000000001010010011110110100000100101111110011101010000101010100101100011111101101011000001000110010100000010100100010101111001111001011000111001110100001010100001100001110000101010000011010011110101000010101001010011011111011110001000001110110101000000101000011000011001110110100111110001011101010010101010010001110110010110000" "00000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" "00001000101100111110100000000100001100100100000110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "10110111010011000001011111111001110011011011111000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" }, - /* 56*/ { BARCODE_DBAR_EXPSTK, 8, "[01]98898765432106[3202]012345[15]991231[3203]001234[17]010203", 1, 396, 1, "#200 16 chars, 1 row", + /* 56*/ { BARCODE_DBAR_EXPSTK, 8, "[01]98898765432106[3202]012345[15]991231[3203]001234[17]010203", 0, 1, 396, 1, "#200 16 chars, 1 row", "010001110111000101101111111100001011000010010111110110100000011000101011110000000010100111000000100101001111101110011000111111000010111010100001100001101001110001100010111100000011100111100011110101011111001011000010001111000000101011001000001000011101111100010010101111110000111001111001100010010110000011101000100011000000001011100010011010000110111010011000001011111111001110011011011111000101" }, - /* 57*/ { BARCODE_DBAR_EXP, -1, "[01]00012345678905[10]ABC123", 1, 232, 1, "24724:2011 7.2.5.4.1, encoding method 1 '1'", + /* 57*/ { BARCODE_DBAR_EXP, -1, "[01]00012345678905[10]ABC123", 0, 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'", + /* 58*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3103]001750", 0, 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", + /* 59*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3103]032767", 0, 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", + /* 60*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3103]032768", 0, 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'", + /* 61*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3202]000156", 0, 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", + /* 62*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3202]009999", 0, 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", + /* 63*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3202]010000", 0, 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", + /* 64*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3203]022767", 0, 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", + /* 65*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3203]022768", 0, 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", + /* 66*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3922]795", 0, 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", + /* 67*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3922]795[20]01", 0, 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" + /* 68*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3932]0081234", 0, 1, 200, 1, "24724:2011 7.2.5.4.6, encoding method 6 '01101XX', no following AIs", + "01001110000101100010111111110000101110100000110010010111100110111110101111110000111000101100001101110001111011010111100011111100001011000011010111100100111110001011101011111111001110001101111001011101" }, - /* 69*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3932]0401234[20]01", 1, 232, 1, "Encoding method 6 '01101XX' with following AI", - "0100010001000110111011111111000010110000101000111001011110011011111010111110000001100010110000110111000111101101011110001111110000101110001100110110010011111000101110101111111100111000100110011110010011101111001000100011110000001010" + /* 69*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3932]0081234[20]01", 0, 1, 232, 1, "Encoding method 6 '01101XX' with following AI", + "0100001101000100111011111111000010110000101000111001011110011011111010111110000001100010110000110111000111101101011110001111110000101100001101011110010011111000101110101111111100111000100110011110010011101111001000100011110000001010" }, - /* 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", + /* 70*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3932]A401234", ZINT_WARN_NONCOMPLIANT, 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", + /* 71*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3102]099999[11]201209", 0, 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", + /* 72*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3102]099999", 0, 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", + /* 73*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3102]100000[11]201209", 0, 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", + /* 74*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3102]099999[11]200000", ZINT_WARN_NONCOMPLIANT, 1, 281, 0, "Possible encoding method 7 '0111000' with weight <= 99999 but date invalid so encoding method 1; BWIPP need method to pass `dontlint` option", "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", + /* 75*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3201]099999[11]201209", 0, 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", + /* 76*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3201]099999", 0, 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", + /* 77*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3201]100000[11]201209", 0, 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", + /* 78*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3201]099999[11]000000", ZINT_WARN_NONCOMPLIANT, 1, 281, 0, "Possible encoding method 8 '0111001' but date invalid so encoding method 1; BWIPP need method to pass `dontlint` option", "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", + /* 79*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3100]099999[13]201209", 0, 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", + /* 80*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3204]099999[13]201209", 0, 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", + /* 81*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3103]012233[15]991231", 0, 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", + /* 82*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3205]099999[15]201209", 0, 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" + /* 83*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3105]099999[17]201209", 0, 1, 200, 1, "Encoding method 13 '0111110' with weight <= 99999 and valid date", + "01000111010000110010111111110000101110000100110100010111100110111110101111110000111000101100001101110001111011010111100011111100001011110011010001100101001100011000001011111111001110010000100100011101" }, - /* 84*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3200]099999[17]201209", 1, 200, 1, "Encoding method 14 '0111111' with weight <= 99999 and valid date", + /* 84*/ { BARCODE_DBAR_EXP, -1, "[01]90012345678908[3200]099999[17]201209", 0, 1, 200, 1, "Encoding method 14 '0111111' with weight <= 99999 and valid date", "01001110000010100110111111110000101111000100010100010111100110111110101111110000111000101100001101110001111011010111100011111100001011000111000001010111010000110110001011111111001110010000100100011101" }, + /* 85*/ { BARCODE_DBAR_EXPSTK, 4, "[8110]106141416543213500110000310123196000", 0, 5, 200, 1, "North American Coupon Application Guideline (NACAG) Figure 1 (& Appendix C: Example 6)", + "01001100101110001110111111110000101000001101000001010111100110111000101111100000011011010001000000110000111100001010100011111100001010000010101111000111010000011001101011111111001110000001101101000101" + "00000011010001110001000000001010010111110010111110101000011001000111010000010101000100101110111111001111000011110101010100000010100101111101010000111000101111100110010100000000100001111110010010110000" + "00000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" + "00000100010110000110100000001010101010111100111101110010110001110011101000000000100010000011010010000100011110111011001000101010101010011101111111010000000000000000000000000000000000000000000000000000" + "00100011101001111001001111110000010101000011000010001101001110001100010111111111001101111100101101111011100001000100110011000000000101100010000000101010000000000000000000000000000000000000000000000000" + }, + /* 86*/ { BARCODE_DBAR_EXPSTK, 3, "[8110]10614141011111275110111", 0, 5, 151, 1, "NACAG Figure 3", + "0101011110011100001011111111000010100000110100000101011110011011100010111110000001101101000100000011000011100001101010001111110000101010000011000111010" + "0000100001100011110100000000101001011111001011111010100001100100011101000001010100010010111011111100111100011110010101010000001010010101111100111000000" + "0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" + "0000001000100001011010000000010000111001101101100001100111100100100010100001010100100001101011111000000000000000000000000000000000000000000000000000000" + "1011110111011110100101111111100111000110010010011110011000011011011100011110000001011110010100000100100000000000000000000000000000000000000000000000000" + }, + /* 87*/ { BARCODE_DBAR_EXPSTK, 6, "[8110]106141410222223100110222111101231023456721104561045678991201", 0, 5, 298, 1, "NACAG Figure 4", + "0100101111101001111011111111000010110010000011001101011110011011100010111100000000101101000100000011000011100001101010001111110000101011000011100001010111000011011110101111000000111010011111000101110001110110011001100011110000001011100110000101000110101111110111001011111111001110011010011100001101" + "0000010000010110000100000000101001001101111100110010100001100100011101000010101010010010111011111100111100011110010101010000001010010100111100011110101000111100100001010000101010000101100000111010001110001001100110010100001010100100011001111010111001010000001000110100000000100001100101100011110000" + "0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" + "0000011010011011100010100101010100100111000100000101010000111000110010100000101010001111000101110100011001110001101000100000001010101011011110000111010111110001101011101000000000100011110100100010000110101100111000001000101010101000000000000000000000000000000000000000000000000000000000000000000000" + "0010000101100100011100011000000001011000111011111010101111000111001101011111000000110000111010001011100110001110010111001111110000010100100001111000101000001110010100010111111111001100001011011101111001010011000111110011000000000101000000000000000000000000000000000000000000000000000000000000000000" + }, + /* 88*/ { BARCODE_DBAR_EXPSTK, 5, "[8110]1061414165432131501101201211014092110256100126663101231", 0, 5, 249, 1, "NACAG Appendix C: Example 1", + "010111101100011011101111111100001011001000001100110101111001101110001011110000000010110100010000001100001111000010101000111111000010100000101011110001110100000110011010111100000011101001111000101111000111011001001110001111000000101011001000001110010" + "000000010011100100010000000010100100110111110011001010000110010001110100001010101001001011101111110011110000111101010101000000101001011111010100001110001011111001100101000010101000010110000111010000111000100110110001010000101010010100110111110000000" + "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" + "000001110000100101101000000101000011110100100011100111100001001101001010010101010010011111110101101100010010110011111010000010101000111101010000010001110001001100110010001010101010100011000111001011000010011010000010100000000010000000000000000000000" + "101110001111011010010111111000011100001011011100011000011110110010110001100000000101100000001010010011101101001100000101111100000011000010101111101110001110110011001100110000000001011100111000110100111101100101111101011111111100110100000000000000000" + }, + /* 89*/ { BARCODE_DBAR_EXPSTK, 4, "[8110]106141410012342501106501013085093101231", 0, 5, 200, 1, "NACAG Appendix C: Example 2", + "01001100101110001110111111110000101000001101000001010111100110111000101111100000011011010001000000110000111000011010100011111100001010000110011000110111001110000010101011111111001110011110010001100101" + "00000011010001110001000000001010010111110010111110101000011001000111010000010101000100101110111111001111000111100101010100000010100101111001100111001000110001111101010100000000100001100001101110010000" + "00000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" + "00000100100001001110100000001010101011111101001011110000110001001011101000000000100010111000110010000111011001101000001000101010101010011011001000010000000000000000000000000000000000000000000000000000" + "00100011011110110001001111110000010100000010110100001111001110110100010111111111001101000111001101111000100110010111110011000000000101100100110111100010000000000000000000000000000000000000000000000000" + }, + /* 90*/ { BARCODE_DBAR_EXPSTK, 5, "[8110]106141410012471011076011110850921108609310123191000", 0, 5, 249, 1, "NACAG Appendix C: Example 3", + "010101111101111000101111111100001010000011000101000101111001101110001011110000000010110100010000001100001110000110101000111111000010100001100110001101001000010000111010111100000011100011100011011001011100001001101110001111000000101001100010000111010" + "000010000010000111010000000010100101111100111010111010000110010001110100001010101001001011101111110011110001111001010101000000101001011110011001110010110111101111000101000010101000011100011100100110100011110110010001010000101010010110011101111000000" + "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" + "000010000001000010101000000101000011110111011110110111101101011100001010010101010010101000011111011101111101110011001010000010101000101001111001110001000001100110001010000000101010100111111101101000000000000000000000000000000000000000000000000000000" + "101001111110111101010111111000011100001000100001001000010010100011110001100000000101010111100000100010000010001100110101111100000011010110000110001110111110011001110100111111000001011000000010010100100000000000000000000000000000000000000000000000000" + }, + /* 91*/ { BARCODE_DBAR_EXPSTK, 6, "[8110]106141411234562891101201212085010048000214025610048000310123191000", 0, 5, 298, 1, "NACAG Appendix C: Example 4", + "0100111111001110101011111111000010100000110001010001011110011011100010111100000000101101000100000011000011100001101010001111110000101010011000111000010101110001000000101111000000111001000001001110010011000011011101100011110000001010000010010110000100011001011000001011111111001110001110101100111101" + "0000000000110001010100000000101001011111001110101110100001100100011101000010101010010010111011111100111100011110010101010000001010010101100111000111101010001110111111010000101010000110111110110001101100111100100010010100001010100101111101101001111011100110100111110100000000100001110001010011000000" + "0000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000" + "0000001110011100111010100101010100101001111011111101000100011101100010100000101010001110110010001000010111101100001110100000001010101000011101111010110010111110001001101000000000100011100001011000010111001010111000001000101010101010001111001001100000000000000000000000000000000000000000000000000000" + "0010110001100011000100011000000001010110000100000010111011100010011101011111000000110001001101110111101000010011110001001111110000010111100010000101001101000001110110010111111111001100011110100111101000110101000111110011000000000101110000110110011010000000000000000000000000000000000000000000000000" + }, + /* 92*/ { BARCODE_DBAR_EXPSTK, 5, "[8110]1061414154321031501101201211014092110256100126663101231", 0, 5, 249, 1, "NACAG Appendix C: Example 5", + "010100111111010011101111111100001011001000001100110101111001101110001011110000000010110100010000001100001111000010101000111111000010101100100000001001100011101011000010111100000011101001111000101111000111011001001110001111000000101011001000001110010" + "000011000000101100010000000010100100110111110011001010000110010001110100001010101001001011101111110011110000111101010101000000101001010011011111110110011100010100111101000010101000010110000111010000111000100110110001010000101010010100110111110000000" + "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000" + "000001110000100101101000000101000011110100100011100111100001001101001010010101010010011111110101101100010010110011111010000010101000111101010000010001110001001100110010001010101010100011000111001011000010011010000010100000000010000000000000000000000" + "101110001111011010010111111000011100001011011100011000011110110010110001100000000101100000001010010011101101001100000101111100000011000010101111101110001110110011001100110000000001011100111000110100111101100101111101011111111100110100000000000000000" + }, }; int data_size = sizeof(data) / sizeof(struct item); @@ -733,11 +790,11 @@ static void test_examples(int index, int generate, int debug) { int length = testUtilSetSymbol(symbol, data[i].symbology, -1 /*input_mode*/, -1 /*eci*/, -1 /*option_1*/, data[i].option_2, -1, -1 /*output_options*/, data[i].data, -1, debug); ret = ZBarcode_Encode(symbol, (const unsigned char *) data[i].data, length); - assert_zero(ret, "i:%d ZBarcode_Encode ret %d != 0 (%s)\n", i, ret, symbol->errtxt); + assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt); if (generate) { - printf(" /*%3d*/ { %s, %d, \"%s\", %d, %d, %d, \"%s\",\n", - i, testUtilBarcodeName(symbol->symbology), data[i].option_2, data[i].data, symbol->rows, symbol->width, data[i].bwipp_cmp, data[i].comment); + printf(" /*%3d*/ { %s, %d, \"%s\", %d, %d, %d, %d, \"%s\",\n", + i, testUtilBarcodeName(symbol->symbology), data[i].option_2, data[i].data, data[i].ret, symbol->rows, symbol->width, data[i].bwipp_cmp, data[i].comment); testUtilModulesDump(symbol, " ", "\n"); printf(" },\n"); } else { @@ -1085,12 +1142,12 @@ static void test_binary_buffer_size(int index, int generate, int debug) { struct item data[] = { /* 0*/ { "[91]1", 0, 1, 102, "Minimum digit" }, /* 1*/ { "[91]+", 0, 1, 102, "Minimum ISO-646" }, - /* 2*/ { "[00]123456789012345678[00]123456789012345678[00]123456789012345678[91]12345678", 0, 1, 543, "70 == any AIs max" }, - /* 3*/ { "[00]123456789012345678[00]123456789012345678[00]123456789012345678[91]123456789", ZINT_ERROR_TOO_LONG, 0, 0, "71 > any AIs max" }, - /* 4*/ { "[01]12345678901234[00]123456789012345678[00]123456789012345678[91]1234567890123456", 0, 1, 543, "74 == 01 + other AIs max" }, - /* 5*/ { "[01]12345678901234[00]123456789012345678[00]123456789012345678[91]12345678901234567", ZINT_ERROR_TOO_LONG, 0, 0, "75 > 01 + other AIs max" }, - /* 6*/ { "[01]92345678901234[3920]123456789012345[00]123456789012345678[91]1234567890123456789", 0, 1, 543, "77 (incl. FNC1 after 3920) == 01 + 392x + other AIs max" }, - /* 7*/ { "[01]92345678901234[3920]123456789012345[00]123456789012345678[91]12345678901234567890", ZINT_ERROR_TOO_LONG, 0, 0, "78 > 01 + 392x + other AIs max" }, + /* 2*/ { "[00]123456789012345675[00]123456789012345675[00]123456789012345675[91]12345678", 0, 1, 543, "70 == any AIs max" }, + /* 3*/ { "[00]123456789012345675[00]123456789012345675[00]123456789012345675[91]123456789", ZINT_ERROR_TOO_LONG, 0, 0, "71 > any AIs max" }, + /* 4*/ { "[01]12345678901231[00]123456789012345675[00]123456789012345675[91]1234567890123456", 0, 1, 543, "74 == 01 + other AIs max" }, + /* 5*/ { "[01]12345678901231[00]123456789012345675[00]123456789012345675[91]12345678901234567", ZINT_ERROR_TOO_LONG, 0, 0, "75 > 01 + other AIs max" }, + /* 6*/ { "[01]92345678901237[3920]123456789012345[00]123456789012345675[91]1234567890123456789", 0, 1, 543, "77 (incl. FNC1 after 3920) == 01 + 392x + other AIs max" }, + /* 7*/ { "[01]92345678901237[3920]123456789012345[00]123456789012345675[91]12345678901234567890", ZINT_ERROR_TOO_LONG, 0, 0, "78 > 01 + 392x + other AIs max" }, }; int data_size = sizeof(data) / sizeof(struct item); @@ -1141,10 +1198,10 @@ static void test_hrt(int index, int debug) { /* 2*/ { BARCODE_DBAR_OMN, "1000000000009", "(01)10000000000090" }, /* 3*/ { BARCODE_DBAR_LTD, "1341056790138", "(01)13410567901384" }, /* 4*/ { BARCODE_DBAR_LTD, "13410567901384", "(01)13410567901384" }, - /* 5*/ { BARCODE_DBAR_EXP, "[01]12345678901234", "(01)12345678901234" }, + /* 5*/ { BARCODE_DBAR_EXP, "[01]12345678901231", "(01)12345678901231" }, /* 6*/ { BARCODE_DBAR_STK, "12345678901231", "" }, /* 7*/ { BARCODE_DBAR_OMNSTK, "10000000000090", "" }, - /* 8*/ { BARCODE_DBAR_EXPSTK, "[01]12345678901234", "" }, + /* 8*/ { BARCODE_DBAR_EXPSTK, "[01]12345678901231", "" }, }; int data_size = ARRAY_SIZE(data); @@ -1192,20 +1249,22 @@ static void test_input(int index, int debug) { /* 7*/ { BARCODE_DBAR_LTD, "123456789012315", ZINT_ERROR_TOO_LONG, -1, -1 }, /* 8*/ { BARCODE_DBAR_LTD, "2234567890123", ZINT_ERROR_INVALID_DATA, -1, -1 }, /* 9*/ { BARCODE_DBAR_LTD, "22345678901238", ZINT_ERROR_INVALID_DATA, -1, -1 }, - /* 10*/ { BARCODE_DBAR_EXP, "[01]12345678901234", 0, 1, 134 }, - /* 11*/ { BARCODE_DBAR_EXP, "[01]1234567890123A", ZINT_ERROR_INVALID_DATA, -1, -1 }, - /* 12*/ { BARCODE_DBAR_EXP, "[01]123456789012315", ZINT_ERROR_INVALID_DATA, -1, -1 }, - /* 13*/ { BARCODE_DBAR_STK, "1234567890123", 0, 3, 50 }, - /* 14*/ { BARCODE_DBAR_STK, "123456789012A", ZINT_ERROR_INVALID_DATA, -1, -1 }, - /* 15*/ { BARCODE_DBAR_STK, "12345678901235", ZINT_ERROR_INVALID_CHECK, -1, -1 }, - /* 16*/ { BARCODE_DBAR_STK, "123456789012315", ZINT_ERROR_TOO_LONG, -1, -1 }, - /* 17*/ { BARCODE_DBAR_OMNSTK, "1234567890123", 0, 5, 50 }, - /* 18*/ { BARCODE_DBAR_OMNSTK, "123456789012A", ZINT_ERROR_INVALID_DATA, -1, -1 }, - /* 19*/ { BARCODE_DBAR_OMNSTK, "12345678901236", ZINT_ERROR_INVALID_CHECK, -1, -1 }, - /* 20*/ { BARCODE_DBAR_OMNSTK, "123456789012315", ZINT_ERROR_TOO_LONG, -1, -1 }, - /* 21*/ { BARCODE_DBAR_EXPSTK, "[01]12345678901234", 0, 5, 102 }, - /* 22*/ { BARCODE_DBAR_EXPSTK, "[01]123456789012A", ZINT_ERROR_INVALID_DATA, -1, -1 }, - /* 23*/ { BARCODE_DBAR_EXPSTK, "[01]123456789012315", ZINT_ERROR_INVALID_DATA, -1, -1 }, + /* 10*/ { BARCODE_DBAR_EXP, "[01]12345678901234", ZINT_WARN_NONCOMPLIANT, 1, 134 }, + /* 11*/ { BARCODE_DBAR_EXP, "[01]12345678901231", 0, 1, 134 }, + /* 12*/ { BARCODE_DBAR_EXP, "[01]1234567890123A", ZINT_ERROR_INVALID_DATA, -1, -1 }, + /* 13*/ { BARCODE_DBAR_EXP, "[01]123456789012315", ZINT_ERROR_INVALID_DATA, -1, -1 }, + /* 14*/ { BARCODE_DBAR_STK, "1234567890123", 0, 3, 50 }, + /* 15*/ { BARCODE_DBAR_STK, "123456789012A", ZINT_ERROR_INVALID_DATA, -1, -1 }, + /* 16*/ { BARCODE_DBAR_STK, "12345678901235", ZINT_ERROR_INVALID_CHECK, -1, -1 }, + /* 17*/ { BARCODE_DBAR_STK, "123456789012315", ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 18*/ { BARCODE_DBAR_OMNSTK, "1234567890123", 0, 5, 50 }, + /* 19*/ { BARCODE_DBAR_OMNSTK, "123456789012A", ZINT_ERROR_INVALID_DATA, -1, -1 }, + /* 20*/ { BARCODE_DBAR_OMNSTK, "12345678901236", ZINT_ERROR_INVALID_CHECK, -1, -1 }, + /* 21*/ { BARCODE_DBAR_OMNSTK, "123456789012315", ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 22*/ { BARCODE_DBAR_EXPSTK, "[01]12345678901234", ZINT_WARN_NONCOMPLIANT, 5, 102 }, + /* 22*/ { BARCODE_DBAR_EXPSTK, "[01]12345678901231", 0, 5, 102 }, + /* 23*/ { BARCODE_DBAR_EXPSTK, "[01]123456789012A", ZINT_ERROR_INVALID_DATA, -1, -1 }, + /* 24*/ { BARCODE_DBAR_EXPSTK, "[01]123456789012315", ZINT_ERROR_INVALID_DATA, -1, -1 }, }; int data_size = ARRAY_SIZE(data); diff --git a/backend/tests/test_vector.c b/backend/tests/test_vector.c index f22dc707..7f9aaacd 100644 --- a/backend/tests/test_vector.c +++ b/backend/tests/test_vector.c @@ -1,6 +1,6 @@ /* libzint - the open source barcode library - Copyright (C) 2019 - 2020 Robin Stuart + Copyright (C) 2019 - 2021 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -162,7 +162,7 @@ static void test_buffer_vector(int index, int generate, int debug) { /* 21*/ { BARCODE_EANX_CHK, "1234", "", 50, 1, 47, 118, 116.4 }, /* 22*/ { BARCODE_EANX, "12", "", 50, 1, 20, 64, 116.4 }, /* 23*/ { BARCODE_EANX_CHK, "12", "", 50, 1, 20, 64, 116.4 }, - /* 24*/ { BARCODE_GS1_128, "[01]12345678901234", "", 50, 1, 134, 268, 118.9 }, + /* 24*/ { BARCODE_GS1_128, "[01]12345678901231", "", 50, 1, 134, 268, 118.9 }, /* 25*/ { BARCODE_CODABAR, "A00000000B", "", 50, 1, 102, 204, 118.9 }, /* 26*/ { BARCODE_CODE128, "1234567890", "", 50, 1, 90, 180, 118.9 }, /* 27*/ { BARCODE_DPLEIT, "1234567890123", "", 50, 1, 135, 270, 118.9 }, @@ -173,7 +173,7 @@ static void test_buffer_vector(int index, int generate, int debug) { /* 32*/ { BARCODE_FLAT, "1234567890", "", 50, 1, 90, 180, 100 }, /* 33*/ { BARCODE_DBAR_OMN, "1234567890123", "", 50, 1, 96, 192, 118.9 }, /* 34*/ { BARCODE_DBAR_LTD, "1234567890123", "", 50, 1, 79, 158, 118.9 }, - /* 35*/ { BARCODE_DBAR_EXP, "[01]12345678901234", "", 34, 1, 134, 268, 86.900002 }, + /* 35*/ { BARCODE_DBAR_EXP, "[01]12345678901231", "", 34, 1, 134, 268, 86.900002 }, /* 36*/ { BARCODE_TELEPEN, "1234567890", "", 50, 1, 208, 416, 118.9 }, /* 37*/ { BARCODE_UPCA, "12345678901", "", 50, 1, 95, 226, 116.4 }, /* 38*/ { BARCODE_UPCA_CHK, "123456789012", "", 50, 1, 95, 226, 116.4 }, @@ -216,7 +216,7 @@ static void test_buffer_vector(int index, int generate, int debug) { /* 75*/ { BARCODE_KOREAPOST, "123456", "", 50, 1, 167, 334, 118.9 }, /* 76*/ { BARCODE_DBAR_STK, "1234567890123", "", 13, 3, 50, 100, 26 }, /* 77*/ { BARCODE_DBAR_OMNSTK, "1234567890123", "", 69, 5, 50, 100, 138 }, - /* 78*/ { BARCODE_DBAR_EXPSTK, "[01]12345678901234", "", 71, 5, 102, 204, 142 }, + /* 78*/ { BARCODE_DBAR_EXPSTK, "[01]12345678901231", "", 71, 5, 102, 204, 142 }, /* 79*/ { BARCODE_PLANET, "12345678901", "", 12, 2, 123, 246, 24 }, /* 80*/ { BARCODE_MICROPDF417, "1234567890", "", 12, 6, 82, 164, 24 }, /* 81*/ { BARCODE_USPS_IMAIL, "12345678901234567890", "", 8, 3, 129, 258, 16 }, @@ -246,10 +246,10 @@ static void test_buffer_vector(int index, int generate, int debug) { /*105*/ { BARCODE_EANX_CC, "1234567", "[20]01", 50, 8, 72, 172, 116.4 }, /*106*/ { BARCODE_EANX_CC, "1234567+12", "[20]01", 50, 8, 99, 226, 116.4 }, /*107*/ { BARCODE_EANX_CC, "1234567+12345", "[20]01", 50, 8, 126, 280, 116.4 }, - /*108*/ { BARCODE_GS1_128_CC, "[01]12345678901234", "[20]01", 50, 5, 145, 290, 118.9 }, + /*108*/ { BARCODE_GS1_128_CC, "[01]12345678901231", "[20]01", 50, 5, 145, 290, 118.9 }, /*109*/ { BARCODE_DBAR_OMN_CC, "1234567890123", "[20]01", 21, 5, 100, 200, 60.900002 }, /*110*/ { BARCODE_DBAR_LTD_CC, "1234567890123", "[20]01", 19, 6, 79, 158, 56.900002 }, - /*111*/ { BARCODE_DBAR_EXP_CC, "[01]12345678901234", "[20]01", 41, 5, 134, 268, 100.9 }, + /*111*/ { BARCODE_DBAR_EXP_CC, "[01]12345678901231", "[20]01", 41, 5, 134, 268, 100.9 }, /*112*/ { BARCODE_UPCA_CC, "12345678901", "[20]01", 50, 7, 99, 234, 116.4 }, /*113*/ { BARCODE_UPCA_CC, "12345678901+12", "[20]01", 50, 7, 128, 284, 116.4 }, /*114*/ { BARCODE_UPCA_CC, "12345678901+12345", "[20]01", 50, 7, 155, 338, 116.4 }, @@ -258,7 +258,7 @@ static void test_buffer_vector(int index, int generate, int debug) { /*117*/ { BARCODE_UPCE_CC, "1234567+12345", "[20]01", 50, 9, 109, 246, 116.4 }, /*118*/ { BARCODE_DBAR_STK_CC, "1234567890123", "[20]01", 24, 9, 56, 112, 48 }, /*119*/ { BARCODE_DBAR_OMNSTK_CC, "1234567890123", "[20]01", 80, 11, 56, 112, 160 }, - /*120*/ { BARCODE_DBAR_EXPSTK_CC, "[01]12345678901234", "[20]01", 78, 9, 102, 204, 156 }, + /*120*/ { BARCODE_DBAR_EXPSTK_CC, "[01]12345678901231", "[20]01", 78, 9, 102, 204, 156 }, /*121*/ { BARCODE_CHANNEL, "01", "", 50, 1, 19, 38, 118.9 }, /*122*/ { BARCODE_CODEONE, "12345678901234567890", "", 22, 22, 22, 44, 44 }, /*123*/ { BARCODE_GRIDMATRIX, "ABC", "", 18, 18, 18, 36, 36 }, @@ -722,7 +722,7 @@ static void test_noncomposite_string_x(int index, int debug) { struct item data[] = { /* 0*/ { BARCODE_DBAR_OMN, "1234567890123", 96, 96 }, /* 1*/ { BARCODE_DBAR_LTD, "1234567890123", 79, 79 }, - /* 2*/ { BARCODE_DBAR_EXP, "[01]12345678901234", 134, 134 }, + /* 2*/ { BARCODE_DBAR_EXP, "[01]12345678901231", 134, 134 }, }; int data_size = sizeof(data) / sizeof(struct item); diff --git a/backend/tests/tools/bwipp_dump-barcode.ps.diff b/backend/tests/tools/bwipp_dump-barcode.ps.diff index 0a4941b3..9893408f 100644 --- a/backend/tests/tools/bwipp_dump-barcode.ps.diff +++ b/backend/tests/tools/bwipp_dump-barcode.ps.diff @@ -1,15 +1,6 @@ ---- ../../../../postscriptbarcode/build/monolithic/barcode.ps 2020-12-19 06:21:55.358036729 +0000 -+++ ../tools/bwipp_dump.ps 2020-12-21 14:41:10.265502623 +0000 -@@ -29,6 +29,8 @@ - % CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - % IN THE SOFTWARE. - -+% vim: set ts=4 sw=4 et : -+ - % --BEGIN TEMPLATE-- - - % --BEGIN RESOURCE preamble-- -@@ -24471,34 +24473,80 @@ +--- ../../../../postscriptbarcode/build/monolithic/barcode.ps 2021-01-16 23:24:06.598867470 +0000 ++++ ../tools/bwipp_dump.ps 2021-01-16 23:39:53.854722084 +0000 +@@ -26135,34 +26135,80 @@ pop } ifelse @@ -25,21 +16,7 @@ + linear options //ean13 exec + dontdraw not { + //renlinear exec - -- % Plot the separator -- -1 72 rmoveto << -- /ren //renmatrix -- /pixs [ -- 0 1 93 {0} repeat 1 0 -- 1 0 93 {0} repeat 0 1 -- 0 1 93 {0} repeat 1 0 -- ] -- /pixx 97 -- /pixy 3 -- /height 6 72 div -- /width 97 72 div -- /opt options -- >> //renmatrix exec ++ + % Plot the separator + -1 72 rmoveto << + /ren //renmatrix @@ -55,12 +32,25 @@ + /opt options + >> //renmatrix exec -- % Plot the 2D part -- -2 6 rmoveto comp options //gs1-cc exec //renmatrix exec +- % Plot the separator +- -1 72 rmoveto << +- /ren //renmatrix +- /pixs [ +- 0 1 93 {0} repeat 1 0 +- 1 0 93 {0} repeat 0 1 +- 0 1 93 {0} repeat 1 0 +- ] +- /pixx 97 +- /pixy 3 +- /height 6 72 div +- /width 97 72 div +- /opt options +- >> //renmatrix exec + % Plot the 2D part + -2 6 rmoveto comp options //gs1-cc exec //renmatrix exec -- grestore +- % Plot the 2D part +- -2 6 rmoveto comp options //gs1-cc exec //renmatrix exec + grestore + } { + /linsym exch def @@ -83,7 +73,8 @@ + /ccrpad 0 array def + /pixx ccpixx def + } ifelse -+ + +- grestore + /pixs [ + 0 ccpixx ccpixs length 1 sub { + /i exch def @@ -109,7 +100,7 @@ end -@@ -24557,7 +24605,7 @@ +@@ -26221,7 +26267,7 @@ pop } ifelse @@ -118,7 +109,7 @@ % Get the result of encoding with ean8 and gs1-cc options (lintype) (ean8) put -@@ -24565,29 +24613,75 @@ +@@ -26229,29 +26275,75 @@ options (dontdraw) true put % Plot the linear part @@ -126,21 +117,7 @@ + linear options //ean8 exec + dontdraw not { + //renlinear exec - -- % Plot the separator -- -1 72 rmoveto << -- /ren //renmatrix -- /pixs [ -- 0 1 65 {0} repeat 1 0 -- 1 0 65 {0} repeat 0 1 -- 0 1 65 {0} repeat 1 0 -- ] -- /pixx 69 -- /pixy 3 -- /height 6 72 div -- /width 69 72 div -- /opt options -- >> //renmatrix exec ++ + % Plot the separator + -1 72 rmoveto << + /ren //renmatrix @@ -161,10 +138,20 @@ + dup (pixx) get 69 exch sub 6 rmoveto + //renmatrix exec -- % Plot the 2D part -- comp options //gs1-cc exec -- dup (pixx) get 69 exch sub 6 rmoveto -- //renmatrix exec +- % Plot the separator +- -1 72 rmoveto << +- /ren //renmatrix +- /pixs [ +- 0 1 65 {0} repeat 1 0 +- 1 0 65 {0} repeat 0 1 +- 0 1 65 {0} repeat 1 0 +- ] +- /pixx 69 +- /pixy 3 +- /height 6 72 div +- /width 69 72 div +- /opt options +- >> //renmatrix exec + grestore + } { + /linsym exch def @@ -172,8 +159,7 @@ + linsym /sbs get { cvi 1 index 1 eq {{0}} {{1}} ifelse repeat } forall % Alternates x 1/0's + ] def + /linheight linsym /bhs get 0 get 72 mul cvi def - -- grestore ++ + /compsym comp options //gs1-cc exec def + /ccpixs compsym /pixs get def + /ccpixx compsym /pixx get def @@ -188,7 +174,11 @@ + /ccrpad 0 array def + /pixx ccpixx def + } ifelse -+ + +- % Plot the 2D part +- comp options //gs1-cc exec +- dup (pixx) get 69 exch sub 6 rmoveto +- //renmatrix exec + /pixs [ + 0 ccpixx ccpixs length 1 sub { + /i exch def @@ -199,7 +189,8 @@ + 2 { linpad aload pop 0 1 65 {0} repeat 1 0 ccrpad aload pop } repeat + linheight { linpad aload pop 0 linpixs aload pop 0 } repeat + ] def -+ + +- grestore + /pixy pixs length pixx idiv def + << + /ren //renmatrix @@ -214,7 +205,7 @@ end -@@ -24646,34 +24740,80 @@ +@@ -26310,34 +26402,80 @@ pop } ifelse @@ -230,21 +221,7 @@ + linear options //upca exec + dontdraw not { + //renlinear exec - -- % Plot the separator -- -1 72 rmoveto << -- /ren //renmatrix -- /pixs [ -- 0 1 93 {0} repeat 1 0 -- 1 0 93 {0} repeat 0 1 -- 0 1 93 {0} repeat 1 0 -- ] -- /pixx 97 -- /pixy 3 -- /height 6 72 div -- /width 97 72 div -- /opt options -- >> //renmatrix exec ++ + % Plot the separator + -1 72 rmoveto << + /ren //renmatrix @@ -260,12 +237,25 @@ + /opt options + >> //renmatrix exec -- % Plot the 2D part -- -2 6 rmoveto comp options //gs1-cc exec //renmatrix exec +- % Plot the separator +- -1 72 rmoveto << +- /ren //renmatrix +- /pixs [ +- 0 1 93 {0} repeat 1 0 +- 1 0 93 {0} repeat 0 1 +- 0 1 93 {0} repeat 1 0 +- ] +- /pixx 97 +- /pixy 3 +- /height 6 72 div +- /width 97 72 div +- /opt options +- >> //renmatrix exec + % Plot the 2D part + -2 6 rmoveto comp options //gs1-cc exec //renmatrix exec -- grestore +- % Plot the 2D part +- -2 6 rmoveto comp options //gs1-cc exec //renmatrix exec + grestore + } { + /linsym exch def @@ -288,7 +278,8 @@ + /ccrpad 0 array def + /pixx ccpixx def + } ifelse -+ + +- grestore + /pixs [ + 0 ccpixx ccpixs length 1 sub { + /i exch def @@ -314,7 +305,7 @@ end -@@ -24747,34 +24887,80 @@ +@@ -26411,34 +26549,80 @@ /opt options >> def @@ -330,21 +321,7 @@ + linear options //upce exec + dontdraw not { + //renlinear exec - -- % Plot the separator -- -1 72 rmoveto << -- /ren //renmatrix -- /pixs [ -- 0 1 49 {0} repeat 1 0 -- 1 0 49 {0} repeat 0 1 -- 0 1 49 {0} repeat 1 0 -- ] -- /pixx 53 -- /pixy 3 -- /height 6 72 div -- /width 53 72 div -- /opt options -- >> //renmatrix exec ++ + % Plot the separator + -1 72 rmoveto << + /ren //renmatrix @@ -360,12 +337,25 @@ + /opt options + >> //renmatrix exec -- % Plot the 2D part -- -2 6 rmoveto comp options //gs1-cc exec //renmatrix exec +- % Plot the separator +- -1 72 rmoveto << +- /ren //renmatrix +- /pixs [ +- 0 1 49 {0} repeat 1 0 +- 1 0 49 {0} repeat 0 1 +- 0 1 49 {0} repeat 1 0 +- ] +- /pixx 53 +- /pixy 3 +- /height 6 72 div +- /width 53 72 div +- /opt options +- >> //renmatrix exec + % Plot the 2D part + -2 6 rmoveto comp options //gs1-cc exec //renmatrix exec -- grestore +- % Plot the 2D part +- -2 6 rmoveto comp options //gs1-cc exec //renmatrix exec + grestore + } { + /linsym exch def @@ -388,7 +378,8 @@ + /ccrpad 0 array def + /pixx ccpixx def + } ifelse -+ + +- grestore + /pixs [ + 0 ccpixx ccpixs length 1 sub { + /i exch def @@ -414,7 +405,7 @@ end -@@ -24833,7 +25019,7 @@ +@@ -26497,7 +26681,7 @@ pop } ifelse @@ -423,7 +414,7 @@ options (lintype) (databaromni) put options (linkage) true put -@@ -24844,7 +25030,7 @@ +@@ -26508,7 +26692,7 @@ linear options //databaromni exec dup (sbs) get /linsbs exch def dup (bhs) get 0 get 72 mul /linheight exch def @@ -432,7 +423,7 @@ % Plot the separator /sepfinder { -@@ -24875,20 +25061,66 @@ +@@ -26539,20 +26723,66 @@ sep 0 [0 0 0] putinterval sep sep length 4 sub [0 0 0 0] putinterval 18 sepfinder 64 sepfinder @@ -511,7 +502,7 @@ end -@@ -24946,7 +25178,7 @@ +@@ -26610,7 +26840,7 @@ pop } ifelse @@ -520,7 +511,7 @@ options (lintype) (databarstacked) put options (linkage) true put -@@ -24957,7 +25189,7 @@ +@@ -26621,7 +26851,7 @@ linear options //databarstacked exec dup (pixs) get 0 2 index (pixx) get getinterval /bot exch def dup (pixy) get /linheight exch def @@ -529,7 +520,7 @@ % Plot the separator /sepfinder { -@@ -24985,20 +25217,52 @@ +@@ -26649,20 +26879,52 @@ sep 0 [ 0 0 0 0 ] putinterval sep sep length 4 sub [ 0 0 0 0 ] putinterval 18 sepfinder @@ -594,7 +585,7 @@ end -@@ -25056,7 +25320,7 @@ +@@ -26720,7 +26982,7 @@ pop } ifelse @@ -603,7 +594,7 @@ options (lintype) (databarstackedomni) put options (linkage) true put -@@ -25067,7 +25331,7 @@ +@@ -26731,7 +26993,7 @@ linear options //databarstackedomni exec dup (pixs) get 0 2 index (pixx) get getinterval /bot exch def dup (pixy) get /linheight exch def @@ -612,7 +603,7 @@ % Plot the separator /sepfinder { -@@ -25095,20 +25359,52 @@ +@@ -26759,20 +27021,52 @@ sep 0 [ 0 0 0 0 ] putinterval sep sep length 4 sub [ 0 0 0 0 ] putinterval 18 sepfinder @@ -677,7 +668,7 @@ end -@@ -25281,7 +25577,7 @@ +@@ -26945,7 +27239,7 @@ pop } ifelse @@ -686,7 +677,7 @@ options (lintype) (databarlimited) put options (linkage) true put -@@ -25292,7 +25588,7 @@ +@@ -26956,7 +27250,7 @@ linear options //databarlimited exec dup (sbs) get /linsbs exch def dup (bhs) get 0 get 72 mul /linheight exch def @@ -695,7 +686,7 @@ % Plot the separator mark -@@ -25300,22 +25596,68 @@ +@@ -26964,22 +27258,68 @@ counttomark 1 sub array astore /sep exch def pop pop sep 0 [0 0 0] putinterval sep sep length 9 sub [0 0 0 0 0 0 0 0 0] putinterval % 4 + 5 right guard spaces @@ -733,8 +724,7 @@ + /compsym comp options //gs1-cc exec def + /ccpixs compsym /pixs get def + /ccpixx compsym /pixx get def - -- grestore ++ + /linpixs [ 0 % Begin with left guard space + linsbs { cvi 1 index 0 eq {{1}} {{0}} ifelse repeat } forall % Alternates x 1/0's + ] def @@ -763,7 +753,8 @@ + ] def + /pixx ccpixx 1 add def + } ifelse -+ + +- grestore + /pixy pixs length pixx idiv def + << + /ren //renmatrix @@ -778,7 +769,7 @@ end -@@ -25374,7 +25716,7 @@ +@@ -27038,7 +27378,7 @@ pop } ifelse @@ -787,7 +778,7 @@ options (lintype) (databarexpanded) put options (linkage) true put -@@ -25385,7 +25727,7 @@ +@@ -27049,7 +27389,7 @@ linear options //databarexpanded exec dup (sbs) get /linsbs exch def dup (bhs) get 0 get 72 mul /linheight exch def @@ -796,7 +787,7 @@ % Plot the separator /sepfinder { -@@ -25414,20 +25756,60 @@ +@@ -27078,20 +27418,60 @@ 18 98 bot length 13 sub {} for 69 98 bot length 13 sub {} for ] {sepfinder} forall @@ -869,7 +860,7 @@ end -@@ -25485,7 +25867,7 @@ +@@ -27149,7 +27529,7 @@ pop } ifelse @@ -878,7 +869,7 @@ options (lintype) (databarexpandedstacked) put options (linkage) true put -@@ -25496,7 +25878,7 @@ +@@ -27160,7 +27540,7 @@ linear options //databarexpandedstacked exec dup (pixs) get 0 2 index (pixx) get getinterval /bot exch def dup (pixy) get /linheight exch def @@ -887,7 +878,7 @@ % Plot the separator /sepfinder { -@@ -25522,21 +25904,49 @@ +@@ -27186,21 +27566,49 @@ 19 98 bot length 13 sub {} for 70 98 bot length 13 sub {} for ] {sepfinder} forall @@ -950,7 +941,7 @@ end -@@ -25595,7 +26005,7 @@ +@@ -27259,7 +27667,7 @@ pop } ifelse @@ -959,7 +950,7 @@ options (inkspread) (0) put options (dontdraw) true put -@@ -25622,35 +26032,87 @@ +@@ -27286,35 +27694,87 @@ linear << options {} forall >> //gs1-128 exec dup (sbs) get /linsbs exch def dup (bhs) get 0 get 72 mul /linheight exch def @@ -1061,7 +1052,7 @@ end -@@ -26924,3 +27386,181 @@ +@@ -28745,3 +29205,183 @@ % --END ENCODER hibcazteccode-- % --END TEMPLATE-- @@ -1243,3 +1234,5 @@ + % If not -dNODISPLAY then render for debugging + currentpagedevice /Name get (nullpage) ne { s s scale 10 10 moveto ret ret /ren get exec } if +} if ++ ++% vim: set ts=4 sw=4 et : diff --git a/backend/tests/tools/bwipp_dump.ps.tar.xz b/backend/tests/tools/bwipp_dump.ps.tar.xz index 9ebe33c0e8d85bc67b03ab24caac7b9b49e63cae..7498777f617a42a6369e9bc8bf5d034cc56a966d 100644 GIT binary patch literal 122272 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

tsPe_odj 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

+kO+kh5cfADkA5cIemKs! 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 +*/ +/* To create "backend/gs1_lint.h" (from project directory): + * + * php backend/tools/gen_gs1_lint.php > backend/gs1_lint.h + * + * or to use local copy of "gs1-format_spec.txt": + * + * php backend/tools/gen_gs1_lint.php -f /gs1-format-spec.txt backend/gs1_lint.h + * + */ +/* vim: set ts=4 sw=4 et : */ + +$basename = basename(__FILE__); +$dirname = dirname(__FILE__); +$dirdirname = basename(dirname($dirname)) . '/' . basename($dirname); + +$opts = getopt('c:f:h:l:t:'); + +$print_copyright = isset($opts['c']) ? (bool) $opts['c'] : true; +$file = isset($opts['f']) ? $opts['f'] : + 'https://raw.githubusercontent.com/bwipp/postscriptbarcode/master/contrib/development/gs1-format-spec.txt'; +$print_h_guard = isset($opts['h']) ? (bool) $opts['h'] : true; +$use_length_only = isset($opts['l']) ? (bool) $opts['l'] : true; +$tab = isset($opts['t']) ? $opts['t'] : ' '; + +if (($get = file_get_contents($file)) === false) { + exit("$basename: ERROR: Could not read file \"$file\"" . PHP_EOL); +} + +$lines = explode("\n", $get); + +$spec_ais = $spec_parts = $spec_funcs = array(); +$batches = array_fill(0, 100, array()); + +// Parse the lines into AIs and specs +$line_no = 0; +foreach ($lines as $line) { + $line_no++; + if ($line === '' || $line[0] === '#') { + continue; + } + if (!preg_match('/^([0-9]+(?:-[0-9]+)?) +([NXC][0-9.][ NXC0-9.,a-z]*)$/', $line, $matches)) { + exit("$basename: ERROR: Could not parse line $line_no" . PHP_EOL); + } + $ai = $matches[1]; + $spec = trim($matches[2]); + + if (isset($spec_ais[$spec])) { + $ais = $spec_ais[$spec]; + } else { + $ais = array(); + } + + if (($hyphen = strpos($ai, '-')) !== false) { + $ai_s = (int) substr($ai, 0, $hyphen); + $ai_e = (int) substr($ai, $hyphen + 1); + $ais[] = array($ai_s, $ai_e); + + $batch_s_idx = (int) ($ai_s / 100); + $batch_e_idx = (int) ($ai_e / 100); + if ($batch_s_idx !== $batch_e_idx) { + if (!in_array($spec, $batches[$batch_s_idx])) { + $batches[$batch_s_idx][] = $spec; + } + if (!in_array($spec, $batches[$batch_e_idx])) { + $batches[$batch_e_idx][] = $spec; + } + } else { + if (!in_array($spec, $batches[$batch_s_idx])) { + $batches[$batch_s_idx][] = $spec; + } + } + } else { + $ai = (int) $ai; + $ais[] = $ai; + $batch_idx = (int) ($ai / 100); + if (!in_array($spec, $batches[$batch_idx])) { + $batches[$batch_idx][] = $spec; + } + } + + $spec_ais[$spec] = $ais; + + $spec_parts[$spec] = array(); + $parts = explode(' ', $spec); + foreach ($parts as $part) { + $checkers = explode(',', $part); + $validator = array_shift($checkers); + if (!preg_match('/^([NXC])([0-9]+)?(\.\.[0-9|]+)?$/', $validator, $matches)) { + exit("$basename: ERROR: Could not parse validator \"$validator\" line $line_no" . PHP_EOL); + } + if (count($matches) === 3) { + $min = $max = (int) $matches[2]; + } else { + $min = $matches[2] === '' ? 1 : (int) $matches[2]; + $max = (int) substr($matches[3], 2); + } + if ($matches[1] === 'N') { + $validator = "numeric"; + } elseif ($matches[1] === 'X') { + $validator = "cset82"; + } else { + $validator = "cset39"; + } + $spec_parts[$spec][] = array($min, $max, $validator, $checkers); + } +} + +// Calculate total min/maxs and convert the AIs into ranges + +foreach ($spec_ais as $spec => $ais) { + // Total min/maxs + $total_min = $total_max = 0; + foreach ($spec_parts[$spec] as list($min, $max)) { + $total_min += $min; + $total_max += $max; + } + + // Sort the AIs + $sort_ais = array(); + foreach ($ais as $ai) { + if (is_array($ai)) { + $sort_ais[] = $ai[0]; + } else { + $sort_ais[] = $ai; + } + } + array_multisort($sort_ais, $ais); + + // Consolidate contiguous AIs into ranges + $tmp_ais = array(); + foreach ($ais as $ai) { + $cnt = count($tmp_ais); + if ($cnt === 0) { + $tmp_ais[] = $ai; + } else { + $prev_ai = $tmp_ais[$cnt - 1]; + if (is_array($prev_ai)) { + $prev_s = $prev_ai[0]; + $prev_e = $prev_ai[1]; + } else { + $prev_e = $prev_s = $prev_ai; + } + if (is_array($ai)) { + $this_s = $ai[0]; + $this_e = $ai[0]; + } else { + $this_s = $this_e = $ai; + } + if ($this_s === $prev_e + 1) { + $tmp_ais[$cnt - 1] = array($prev_s, $this_e); + } else { + $tmp_ais[] = $ai; + } + } + } + + // Unconsolidate ranges of 1 into separate entries + $ais = array(); + foreach ($tmp_ais as $ai) { + if (is_array($ai) && $ai[1] === $ai[0] + 1) { + $ais[] = $ai[0]; + $ais[] = $ai[1]; + } else { + $ais[] = $ai; + } + } + + $spec_ais[$spec] = array($total_min, $total_max, $ais); +} + +// Print output + +print << + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + + +EOD; +} + +if ($print_h_guard) { +print <<<'EOD' +#ifndef GS1_LINT_H +#define GS1_LINT_H + + +EOD; +} + +// Print the spec validator/checkers functions + +foreach ($spec_parts as $spec => $spec_part) { + $spec_funcs[$spec] = $spec_func = str_replace(array(' ', '.', ','), '_', strtolower($spec)); + print <<= $total_min && data_len <= $total_max"; + } + + if ($use_length_only) { + // Call checkers checking for length only first + $length_only_arg = ", 1 /*length_only*/"; + $offset = 0; + foreach ($spec_part as list($min, $max, $validator, $checkers)) { + foreach ($checkers as $checker) { + print << $batch_specs) { + if (empty($batch_specs)) { + continue; + } + $batch_s = $batch * 100; + $batch_e = $batch_s + 100; + if ($not_first_batch) { + print "\n$tab} else if (ai < $batch_e) {\n\n"; + } else { + print "\n{$tab}if (ai < $batch_e) {\n\n"; + $not_first_batch = true; + } + foreach ($batch_specs as $spec) { + $total_min = $spec_ais[$spec][0]; + $total_max = $spec_ais[$spec][1]; + $ais = $spec_ais[$spec][2]; + + $str = "$tab{$tab}if ("; + print $str; + $width = strlen($str); + + // Count the applicable AIs + $ais_cnt = 0; + foreach ($ais as $ai) { + if (is_array($ai)) { + if ($ai[1] < $batch_s || $ai[0] >= $batch_e) { + continue; + } + } else { + if ($ai < $batch_s || $ai >= $batch_e) { + continue; + } + } + $ais_cnt++; + } + + // Output + $not_first_ai = false; + foreach ($ais as $ai) { + if (is_array($ai)) { + if ($ai[1] < $batch_s || $ai[0] >= $batch_e) { + continue; + } + } else { + if ($ai < $batch_s || $ai >= $batch_e) { + continue; + } + } + + $str = ''; + if ($not_first_ai) { + $str .= " || "; + } else { + $not_first_ai = true; + } + if (is_array($ai)) { + if ($ai[0] === $last_batch_e) { // Don't need 1st element of range if excluded by previous batch + $str .= "ai <= " . $ai[1]; + } else if ($ai[1] + 1 == $batch_e) { // Don't need 2nd element of range if excluded by this batch + $str .= "ai >= " . $ai[0]; + } else { + if ($ais_cnt > 1) { + $str .= "(ai >= " . $ai[0] . " && ai <= " . $ai[1] . ")"; + } else { + $str .= "ai >= " . $ai[0] . " && ai <= " . $ai[1]; + } + } + } else { + $str .= "ai == " . $ai; + } + if ($width + strlen($str) > 118) { + print "\n"; + $str2 = "$tab$tab$tab "; + print $str2; + $width = strlen($str2); + } + print $str; + $width += strlen($str); + } + $spec_func = $spec_funcs[$spec]; + print << +*/ +/* To create "backend/iso3166.h" (from project directory): + * + * php backend/tools/gen_iso3166_h.php > backend/iso3166.h + */ +/* vim: set ts=4 sw=4 et : */ + +$basename = basename(__FILE__); +$dirname = dirname(__FILE__); +$dirdirname = basename(dirname($dirname)) . '/' . basename($dirname); + +$opts = getopt('c:h:t:'); + +$print_copyright = isset($opts['c']) ? (bool) $opts['c'] : true; +$print_h_guard = isset($opts['h']) ? (bool) $opts['h'] : true; +$tab = isset($opts['t']) ? $opts['t'] : ' '; + +$numeric = array( + /*AFG*/ 4, /*ALB*/ 8, /*ATA*/ 10, /*DZA*/ 12, /*ASM*/ 16, /*AND*/ 20, /*AGO*/ 24, /*ATG*/ 28, /*AZE*/ 31, /*ARG*/ 32, + /*AUS*/ 36, /*AUT*/ 40, /*BHS*/ 44, /*BHR*/ 48, /*BGD*/ 50, /*ARM*/ 51, /*BRB*/ 52, /*BEL*/ 56, /*BMU*/ 60, /*BTN*/ 64, + /*BOL*/ 68, /*BIH*/ 70, /*BWA*/ 72, /*BVT*/ 74, /*BRA*/ 76, /*BLZ*/ 84, /*IOT*/ 86, /*SLB*/ 90, /*VGB*/ 92, /*BRN*/ 96, + /*BGR*/ 100, /*MMR*/ 104, /*BDI*/ 108, /*BLR*/ 112, /*KHM*/ 116, /*CMR*/ 120, /*CAN*/ 124, /*CPV*/ 132, /*CYM*/ 136, /*CAF*/ 140, + /*LKA*/ 144, /*TCD*/ 148, /*CHL*/ 152, /*CHN*/ 156, /*TWN*/ 158, /*CXR*/ 162, /*CCK*/ 166, /*COL*/ 170, /*COM*/ 174, /*MYT*/ 175, + /*COG*/ 178, /*COD*/ 180, /*COK*/ 184, /*CRI*/ 188, /*HRV*/ 191, /*CUB*/ 192, /*CYP*/ 196, /*CZE*/ 203, /*BEN*/ 204, /*DNK*/ 208, + /*DMA*/ 212, /*DOM*/ 214, /*ECU*/ 218, /*SLV*/ 222, /*GNQ*/ 226, /*ETH*/ 231, /*ERI*/ 232, /*EST*/ 233, /*FRO*/ 234, /*FLK*/ 238, + /*SGS*/ 239, /*FJI*/ 242, /*FIN*/ 246, /*ALA*/ 248, /*FRA*/ 250, /*GUF*/ 254, /*PYF*/ 258, /*ATF*/ 260, /*DJI*/ 262, /*GAB*/ 266, + /*GEO*/ 268, /*GMB*/ 270, /*PSE*/ 275, /*DEU*/ 276, /*GHA*/ 288, /*GIB*/ 292, /*KIR*/ 296, /*GRC*/ 300, /*GRL*/ 304, /*GRD*/ 308, + /*GLP*/ 312, /*GUM*/ 316, /*GTM*/ 320, /*GIN*/ 324, /*GUY*/ 328, /*HTI*/ 332, /*HMD*/ 334, /*VAT*/ 336, /*HND*/ 340, /*HKG*/ 344, + /*HUN*/ 348, /*ISL*/ 352, /*IND*/ 356, /*IDN*/ 360, /*IRN*/ 364, /*IRQ*/ 368, /*IRL*/ 372, /*ISR*/ 376, /*ITA*/ 380, /*CIV*/ 384, + /*JAM*/ 388, /*JPN*/ 392, /*KAZ*/ 398, /*JOR*/ 400, /*KEN*/ 404, /*PRK*/ 408, /*KOR*/ 410, /*KWT*/ 414, /*KGZ*/ 417, /*LAO*/ 418, + /*LBN*/ 422, /*LSO*/ 426, /*LVA*/ 428, /*LBR*/ 430, /*LBY*/ 434, /*LIE*/ 438, /*LTU*/ 440, /*LUX*/ 442, /*MAC*/ 446, /*MDG*/ 450, + /*MWI*/ 454, /*MYS*/ 458, /*MDV*/ 462, /*MLI*/ 466, /*MLT*/ 470, /*MTQ*/ 474, /*MRT*/ 478, /*MUS*/ 480, /*MEX*/ 484, /*MCO*/ 492, + /*MNG*/ 496, /*MDA*/ 498, /*MNE*/ 499, /*MSR*/ 500, /*MAR*/ 504, /*MOZ*/ 508, /*OMN*/ 512, /*NAM*/ 516, /*NRU*/ 520, /*NPL*/ 524, + /*NLD*/ 528, /*CUW*/ 531, /*ABW*/ 533, /*SXM*/ 534, /*BES*/ 535, /*NCL*/ 540, /*VUT*/ 548, /*NZL*/ 554, /*NIC*/ 558, /*NER*/ 562, + /*NGA*/ 566, /*NIU*/ 570, /*NFK*/ 574, /*NOR*/ 578, /*MNP*/ 580, /*UMI*/ 581, /*FSM*/ 583, /*MHL*/ 584, /*PLW*/ 585, /*PAK*/ 586, + /*PAN*/ 591, /*PNG*/ 598, /*PRY*/ 600, /*PER*/ 604, /*PHL*/ 608, /*PCN*/ 612, /*POL*/ 616, /*PRT*/ 620, /*GNB*/ 624, /*TLS*/ 626, + /*PRI*/ 630, /*QAT*/ 634, /*REU*/ 638, /*ROU*/ 642, /*RUS*/ 643, /*RWA*/ 646, /*BLM*/ 652, /*SHN*/ 654, /*KNA*/ 659, /*AIA*/ 660, + /*LCA*/ 662, /*MAF*/ 663, /*SPM*/ 666, /*VCT*/ 670, /*SMR*/ 674, /*STP*/ 678, /*SAU*/ 682, /*SEN*/ 686, /*SRB*/ 688, /*SYC*/ 690, + /*SLE*/ 694, /*SGP*/ 702, /*SVK*/ 703, /*VNM*/ 704, /*SVN*/ 705, /*SOM*/ 706, /*ZAF*/ 710, /*ZWE*/ 716, /*ESP*/ 724, /*SSD*/ 728, + /*SDN*/ 729, /*ESH*/ 732, /*SUR*/ 740, /*SJM*/ 744, /*SWZ*/ 748, /*SWE*/ 752, /*CHE*/ 756, /*SYR*/ 760, /*TJK*/ 762, /*THA*/ 764, + /*TGO*/ 768, /*TKL*/ 772, /*TON*/ 776, /*TTO*/ 780, /*ARE*/ 784, /*TUN*/ 788, /*TUR*/ 792, /*TKM*/ 795, /*TCA*/ 796, /*TUV*/ 798, + /*UGA*/ 800, /*UKR*/ 804, /*MKD*/ 807, /*EGY*/ 818, /*GBR*/ 826, /*GGY*/ 831, /*JEY*/ 832, /*IMN*/ 833, /*TZA*/ 834, /*USA*/ 840, + /*VIR*/ 850, /*BFA*/ 854, /*URY*/ 858, /*UZB*/ 860, /*VEN*/ 862, /*WLF*/ 876, /*WSM*/ 882, /*YEM*/ 887, /*ZMB*/ 894, +); + +$numeric_tab = array(); +$val = 0; +$byte = 0; +$max = $numeric[count($numeric) - 1]; +for ($i = 0; $i <= $max; $i++) { + if ($i && $i % 8 == 0) { + $numeric_tab[$byte++] = $val; + $val = 0; + } + if (in_array($i, $numeric)) { + $val |= 1 << ($i & 0x7); + } +} +$numeric_tab[$byte++] = $val; +$numeric_cnt = count($numeric_tab); + +$alpha2 = array( + "AD", "AE", "AF", "AG", "AI", "AL", "AM", "AO", "AQ", "AR", + "AS", "AT", "AU", "AW", "AX", "AZ", "BA", "BB", "BD", "BE", + "BF", "BG", "BH", "BI", "BJ", "BL", "BM", "BN", "BO", "BQ", + "BR", "BS", "BT", "BV", "BW", "BY", "BZ", "CA", "CC", "CD", + "CF", "CG", "CH", "CI", "CK", "CL", "CM", "CN", "CO", "CR", + "CU", "CV", "CW", "CX", "CY", "CZ", "DE", "DJ", "DK", "DM", + "DO", "DZ", "EC", "EE", "EG", "EH", "ER", "ES", "ET", "FI", + "FJ", "FK", "FM", "FO", "FR", "GA", "GB", "GD", "GE", "GF", + "GG", "GH", "GI", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", + "GT", "GU", "GW", "GY", "HK", "HM", "HN", "HR", "HT", "HU", + "ID", "IE", "IL", "IM", "IN", "IO", "IQ", "IR", "IS", "IT", + "JE", "JM", "JO", "JP", "KE", "KG", "KH", "KI", "KM", "KN", + "KP", "KR", "KW", "KY", "KZ", "LA", "LB", "LC", "LI", "LK", + "LR", "LS", "LT", "LU", "LV", "LY", "MA", "MC", "MD", "ME", + "MF", "MG", "MH", "MK", "ML", "MM", "MN", "MO", "MP", "MQ", + "MR", "MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "NA", + "NC", "NE", "NF", "NG", "NI", "NL", "NO", "NP", "NR", "NU", + "NZ", "OM", "PA", "PE", "PF", "PG", "PH", "PK", "PL", "PM", + "PN", "PR", "PS", "PT", "PW", "PY", "QA", "RE", "RO", "RS", + "RU", "RW", "SA", "SB", "SC", "SD", "SE", "SG", "SH", "SI", + "SJ", "SK", "SL", "SM", "SN", "SO", "SR", "SS", "ST", "SV", + "SX", "SY", "SZ", "TC", "TD", "TF", "TG", "TH", "TJ", "TK", + "TL", "TM", "TN", "TO", "TR", "TT", "TV", "TW", "TZ", "UA", + "UG", "UM", "US", "UY", "UZ", "VA", "VC", "VE", "VG", "VI", + "VN", "VU", "WF", "WS", "YE", "YT", "ZA", "ZM", "ZW", +); + +$alpha2_tab = array(); +$val = 0; +$byte = 0; +for ($i = 0; $i < 26; $i++) { + for ($j = 0; $j < 26; $j++) { + $ij = $i * 26 + $j; + if ($ij && $ij % 8 == 0) { + $alpha2_tab[$byte++] = $val; + $val = 0; + } + $cc = chr(65 + $i) . chr(65 + $j); + if (in_array($cc, $alpha2)) { + $val |= 1 << ($ij & 0x7); + } + } +} +$alpha2_tab[$byte++] = $val; +$alpha2_cnt = count($alpha2_tab); + +print << + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + + +EOD; +} + +if ($print_h_guard) { +print <<<'EOD' +#ifndef ISO3166_H +#define ISO3166_H + +EOD; +} + +print <<> 3; + +{$tab}if (b < 0 || b >= $numeric_cnt) { +{$tab}{$tab}return 0; +{$tab}} +{$tab}return codes[b] & (1 << (cc & 0x7)) ? 1 : 0; +} + +/* Whether ISO 3166-1 alpha2 */ +static int iso3166_alpha2(const char *cc) { +{$tab}static const unsigned char codes[$alpha2_cnt] = { +EOD; + +for ($i = 0; $i < $alpha2_cnt; $i++) { + if ($i % 8 == 0) { + print "\n$tab$tab"; + } else { + print " "; + } + printf("0x%02X,", $alpha2_tab[$i]); +} +print << 'Z' || cc[1] < 'A' || cc[1] > 'Z') { +{$tab}{$tab}return 0; +{$tab}} +{$tab}cc_int = (cc[0] - 'A') * 26 + (cc[1] - 'A'); + +{$tab}return codes[cc_int >> 3] & (1 << (cc_int & 0x7)) ? 1 : 0; +} + +EOD; + +if ($print_h_guard) { +print <<<'EOD' + +#endif /* ISO3166_H */ + +EOD; +} diff --git a/backend/tools/gen_iso4217_h.php b/backend/tools/gen_iso4217_h.php new file mode 100644 index 00000000..277e01eb --- /dev/null +++ b/backend/tools/gen_iso4217_h.php @@ -0,0 +1,145 @@ + +*/ +/* To create "backend/iso4217.h" (from project directory): + * + * php backend/tools/gen_iso4217_h.php > backend/iso4217.h + */ +/* vim: set ts=4 sw=4 et : */ + +$basename = basename(__FILE__); +$dirname = dirname(__FILE__); +$dirdirname = basename(dirname($dirname)) . '/' . basename($dirname); + +$opts = getopt('c:h:t:'); + +$print_copyright = isset($opts['c']) ? (bool) $opts['c'] : true; +$print_h_guard = isset($opts['h']) ? (bool) $opts['h'] : true; +$tab = isset($opts['t']) ? $opts['t'] : ' '; + +$numeric = array( + /*ALL*/ 8, /*DZD*/ 12, /*ARS*/ 32, /*AUD*/ 36, /*BSD*/ 44, /*BHD*/ 48, /*BDT*/ 50, /*AMD*/ 51, /*BBD*/ 52, /*BMD*/ 60, + /*BTN*/ 64, /*BOB*/ 68, /*BWP*/ 72, /*BZD*/ 84, /*SBD*/ 90, /*BND*/ 96, /*MMK*/ 104, /*BIF*/ 108, /*KHR*/ 116, /*CAD*/ 124, + /*CVE*/ 132, /*KYD*/ 136, /*LKR*/ 144, /*CLP*/ 152, /*CNY*/ 156, /*COP*/ 170, /*KMF*/ 174, /*CRC*/ 188, /*HRK*/ 191, /*CUP*/ 192, + /*CZK*/ 203, /*DKK*/ 208, /*DOP*/ 214, /*SVC*/ 222, /*ETB*/ 230, /*ERN*/ 232, /*FKP*/ 238, /*FJD*/ 242, /*DJF*/ 262, /*GMD*/ 270, + /*GIP*/ 292, /*GTQ*/ 320, /*GNF*/ 324, /*GYD*/ 328, /*HTG*/ 332, /*HNL*/ 340, /*HKD*/ 344, /*HUF*/ 348, /*ISK*/ 352, /*INR*/ 356, + /*IDR*/ 360, /*IRR*/ 364, /*IQD*/ 368, /*ILS*/ 376, /*JMD*/ 388, /*JPY*/ 392, /*KZT*/ 398, /*JOD*/ 400, /*KES*/ 404, /*KPW*/ 408, + /*KRW*/ 410, /*KWD*/ 414, /*KGS*/ 417, /*LAK*/ 418, /*LBP*/ 422, /*LSL*/ 426, /*LRD*/ 430, /*LYD*/ 434, /*MOP*/ 446, /*MWK*/ 454, + /*MYR*/ 458, /*MVR*/ 462, /*MUR*/ 480, /*MXN*/ 484, /*MNT*/ 496, /*MDL*/ 498, /*MAD*/ 504, /*OMR*/ 512, /*NAD*/ 516, /*NPR*/ 524, + /*ANG*/ 532, /*AWG*/ 533, /*VUV*/ 548, /*NZD*/ 554, /*NIO*/ 558, /*NGN*/ 566, /*NOK*/ 578, /*PKR*/ 586, /*PAB*/ 590, /*PGK*/ 598, + /*PYG*/ 600, /*PEN*/ 604, /*PHP*/ 608, /*QAR*/ 634, /*RUB*/ 643, /*RWF*/ 646, /*SHP*/ 654, /*SAR*/ 682, /*SCR*/ 690, /*SLL*/ 694, + /*SGD*/ 702, /*VND*/ 704, /*SOS*/ 706, /*ZAR*/ 710, /*SSP*/ 728, /*SZL*/ 748, /*SEK*/ 752, /*CHF*/ 756, /*SYP*/ 760, /*THB*/ 764, + /*TOP*/ 776, /*TTD*/ 780, /*AED*/ 784, /*TND*/ 788, /*UGX*/ 800, /*MKD*/ 807, /*EGP*/ 818, /*GBP*/ 826, /*TZS*/ 834, /*USD*/ 840, + /*UYU*/ 858, /*UZS*/ 860, /*WST*/ 882, /*YER*/ 886, /*TWD*/ 901, /*UYW*/ 927, /*VES*/ 928, /*MRU*/ 929, /*STN*/ 930, /*CUC*/ 931, + /*ZWL*/ 932, /*BYN*/ 933, /*TMT*/ 934, /*GHS*/ 936, /*SDG*/ 938, /*UYI*/ 940, /*RSD*/ 941, /*MZN*/ 943, /*AZN*/ 944, /*RON*/ 946, + /*CHE*/ 947, /*CHW*/ 948, /*TRY*/ 949, /*XAF*/ 950, /*XCD*/ 951, /*XOF*/ 952, /*XPF*/ 953, /*XBA*/ 955, /*XBB*/ 956, /*XBC*/ 957, + /*XBD*/ 958, /*XAU*/ 959, /*XDR*/ 960, /*XAG*/ 961, /*XPT*/ 962, /*XTS*/ 963, /*XPD*/ 964, /*XUA*/ 965, /*ZMW*/ 967, /*SRD*/ 968, + /*MGA*/ 969, /*COU*/ 970, /*AFN*/ 971, /*TJS*/ 972, /*AOA*/ 973, /*BGN*/ 975, /*CDF*/ 976, /*BAM*/ 977, /*EUR*/ 978, /*MXV*/ 979, + /*UAH*/ 980, /*GEL*/ 981, /*BOV*/ 984, /*PLN*/ 985, /*BRL*/ 986, /*CLF*/ 990, /*XSU*/ 994, /*USN*/ 997, /*XXX*/ 999, +); + +$numeric_tab = array(); +$val = 0; +$byte = 0; +$max = $numeric[count($numeric) - 1]; +for ($i = 0; $i <= $max; $i++) { + if ($i && $i % 8 == 0) { + $numeric_tab[$byte++] = $val; + $val = 0; + } + if (in_array($i, $numeric)) { + $val |= 1 << ($i & 0x7); + } +} +$numeric_tab[$byte++] = $val; +$numeric_cnt = count($numeric_tab); + +print << + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + + +EOD; +} + +if ($print_h_guard) { +print <<<'EOD' +#ifndef ISO4217_H +#define ISO4217_H + +EOD; +} + +print <<> 3; + +{$tab}if (b < 0 || b >= $numeric_cnt) { +{$tab}{$tab}return 0; +{$tab}} +{$tab}return codes[b] & (1 << (cc & 0x7)) ? 1 : 0; +} + +EOD; + +if ($print_h_guard) { +print <<<'EOD' + +#endif /* ISO4217_H */ + +EOD; +} diff --git a/win32/libzint.vcxproj b/win32/libzint.vcxproj index 15b0677e..651519bf 100644 --- a/win32/libzint.vcxproj +++ b/win32/libzint.vcxproj @@ -192,7 +192,10 @@ + + + diff --git a/win32/vs2008/libzint.vcproj b/win32/vs2008/libzint.vcproj index fc63037a..4af9e7cb 100644 --- a/win32/vs2008/libzint.vcproj +++ b/win32/vs2008/libzint.vcproj @@ -545,10 +545,22 @@ RelativePath="..\backend\gs1.h" > + + + + + + diff --git a/win32/vs2015/libzint.vcxproj b/win32/vs2015/libzint.vcxproj index 0bbc7fec..f08100cd 100644 --- a/win32/vs2015/libzint.vcxproj +++ b/win32/vs2015/libzint.vcxproj @@ -371,7 +371,10 @@ + + + diff --git a/win32/vs2015/vsx/libzintMD.vcxproj b/win32/vs2015/vsx/libzintMD.vcxproj index 1ecc1ff0..aa6a7ab2 100644 --- a/win32/vs2015/vsx/libzintMD.vcxproj +++ b/win32/vs2015/vsx/libzintMD.vcxproj @@ -139,7 +139,10 @@ + + + diff --git a/win32/vs2019/libzint.vcxproj b/win32/vs2019/libzint.vcxproj index 8bf21072..8baece13 100644 --- a/win32/vs2019/libzint.vcxproj +++ b/win32/vs2019/libzint.vcxproj @@ -192,7 +192,10 @@ + + +