diff --git a/ChangeLog b/ChangeLog
index cc3768b3..2ab27ae0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -5,6 +5,7 @@ Version 2.13.0.9 (dev) not released yet
------------------------
- New `memfile` & `memfile_size` fields in `symbol` for use with new output
option `BARCODE_MEMORY_FILE`
+- Invalid `input_mode` now returns warning
Changes
-------
@@ -14,6 +15,12 @@ Changes
in-memory buffer `symbol->memfile` instead of to file `symbol->outfile`,
ticket #301
- CODE128: improve encodation on A/B shifting, props Daniel Gredler (Okapi)
+- library: return warning on invalid `input_mode` reset
+- GS1: new AIs 7250-7259 (GSCN 22-246), new linters `yyyymmdd()`, `iso5218()`,
+ `posinseqslash()`; remove old linter `iso3166list`;
+ iso4217: new ISO 4217 currency code 924
+- AZTEC: workaround MSVC 2022 optimizer bug in `az_populate_map()` loops,
+ ticket #317, props Andre Maute
Bugs
----
@@ -26,6 +33,9 @@ Bugs
written as little-endian - simplifies testing)
- ITF14/DPLEIT/DPIDENT: ignore `option_2` (check digit options)
- GUI: scalewindow: fix cropping of initial resolution and bound X-dim <= 10
+- GUI: factory reset: reset preview background colour also
+- QZint: fix legacy width and security level getters/setters, MR #158, props
+ Philip Ye
Version 2.13.0 (2023-12-18)
diff --git a/backend/2of5.c b/backend/2of5.c
index 7879dd94..3f1429ed 100644
--- a/backend/2of5.c
+++ b/backend/2of5.c
@@ -49,9 +49,9 @@ static const char C25IndustTable[10][10] = {
};
/* Note `c25_common()` assumes Stop string length one less than Start */
-static const char *C25MatrixStartStop[2] = { "411111", "41111" };
-static const char *C25IndustStartStop[2] = { "313111", "31113" };
-static const char *C25IataLogicStartStop[2] = { "1111", "311" };
+static const char C25MatrixStartStop[2][6] = { {'4', '1', '1', '1', '1', '1'}, {'4', '1', '1', '1', '1'} };
+static const char C25IndustStartStop[2][6] = { {'3', '1', '3', '1', '1', '1'}, {'3', '1', '1', '1', '3'} };
+static const char C25IataLogicStartStop[2][6] = { {'1', '1', '1', '1'}, {'3', '1', '1'} };
static const char C25InterTable[10][5] = {
{'1','1','3','3','1'}, {'3','1','1','1','3'}, {'1','3','1','1','3'}, {'3','3','1','1','1'}, {'1','1','3','1','3'},
@@ -64,7 +64,7 @@ static char c25_check_digit(const unsigned int count) {
/* Common to Standard (Matrix), Industrial, IATA, and Data Logic */
static int c25_common(struct zint_symbol *symbol, const unsigned char source[], int length, const int max,
- const int is_matrix, const char *start_stop[2], const int start_length, const int error_base) {
+ const int is_matrix, const char start_stop[2][6], const int start_length, const int error_base) {
int i;
char dest[818]; /* Largest destination 4 + (80 + 1) * 10 + 3 + 1 = 818 */
diff --git a/backend/aztec.c b/backend/aztec.c
index 41073184..d98292bf 100644
--- a/backend/aztec.c
+++ b/backend/aztec.c
@@ -185,32 +185,25 @@ static int aztec_text_process(const unsigned char source[], int src_len, int bp,
i = 0;
j = 0;
while (i < src_len) {
+ reduced_encode_mode[j] = encode_mode[i];
if (i + 1 < src_len) {
if ((source[i] == 13) && (source[i + 1] == 10)) { /* CR LF */
reduced_source[j] = 'a';
- reduced_encode_mode[j] = encode_mode[i];
i += 2;
} else if ((source[i] == '.') && (source[i + 1] == ' ') && (encode_mode[i] == 'P')) {
reduced_source[j] = 'b';
- reduced_encode_mode[j] = encode_mode[i];
i += 2;
} else if ((source[i] == ',') && (source[i + 1] == ' ') && (encode_mode[i] == 'P')) {
reduced_source[j] = 'c';
- reduced_encode_mode[j] = encode_mode[i];
i += 2;
} else if ((source[i] == ':') && (source[i + 1] == ' ')) {
reduced_source[j] = 'd';
- reduced_encode_mode[j] = encode_mode[i];
i += 2;
} else {
- reduced_source[j] = source[i];
- reduced_encode_mode[j] = encode_mode[i];
- i++;
+ reduced_source[j] = source[i++];
}
} else {
- reduced_source[j] = source[i];
- reduced_encode_mode[j] = encode_mode[i];
- i++;
+ reduced_source[j] = source[i++];
}
j++;
}
@@ -950,10 +943,10 @@ INTERNAL int aztec(struct zint_symbol *symbol, struct zint_seg segs[], const int
data_maxsize = 0; /* Keep compiler happy! */
adjustment_size = 0;
if (symbol->option_2 == 0) { /* The size of the symbol can be determined by Zint */
- static const short *full_sizes[5] = {
+ static const short *const full_sizes[5] = {
NULL, Aztec10DataSizes, Aztec23DataSizes, Aztec36DataSizes, Aztec50DataSizes
};
- static const short *comp_sizes[5] = {
+ static const short *const comp_sizes[5] = {
NULL, AztecCompact10DataSizes, AztecCompact23DataSizes, AztecCompact36DataSizes, AztecCompact50DataSizes
};
int ecc_level = symbol->option_1;
@@ -1230,15 +1223,13 @@ INTERNAL int aztec(struct zint_symbol *symbol, struct zint_seg segs[], const int
/* Plot all of the data into the symbol in pre-defined spiral pattern */
if (compact) {
- int offset = AztecCompactOffset[layers - 1];
- int end_offset = 27 - offset;
+ const int offset = AztecCompactOffset[layers - 1];
+ const int end_offset = 27 - offset;
for (y = offset; y < end_offset; y++) {
- int y_map = y * 27;
+ const int y_map = y * 27;
for (x = offset; x < end_offset; x++) {
- int map = AztecCompactMap[y_map + x];
- if (map == 1) {
- set_module(symbol, y - offset, x - offset);
- } else if (map >= 2 && bit_pattern[map - 2] == '1') {
+ const int map = AztecCompactMap[y_map + x];
+ if (map == 1 || (map >= 2 && bit_pattern[map - 2] == '1')) {
set_module(symbol, y - offset, x - offset);
}
}
@@ -1248,16 +1239,14 @@ INTERNAL int aztec(struct zint_symbol *symbol, struct zint_seg segs[], const int
symbol->rows = 27 - (2 * offset);
symbol->width = 27 - (2 * offset);
} else {
- int offset = AztecOffset[layers - 1];
- int end_offset = 151 - offset;
+ const int offset = AztecOffset[layers - 1];
+ const int end_offset = 151 - offset;
az_populate_map(AztecMap, layers);
for (y = offset; y < end_offset; y++) {
- int y_map = y * 151;
+ const int y_map = y * 151;
for (x = offset; x < end_offset; x++) {
- int map = AztecMap[y_map + x];
- if (map == 1) {
- set_module(symbol, y - offset, x - offset);
- } else if (map >= 2 && bit_pattern[map - 2] == '1') {
+ const int map = AztecMap[y_map + x];
+ if (map == 1 || (map >= 2 && bit_pattern[map - 2] == '1')) {
set_module(symbol, y - offset, x - offset);
}
}
diff --git a/backend/bmp.h b/backend/bmp.h
index 6de4c911..4f1f3843 100644
--- a/backend/bmp.h
+++ b/backend/bmp.h
@@ -37,7 +37,7 @@
extern "C" {
#endif
-#ifdef _MSC_VER
+#ifdef OUT_USE_PRAGMA_PACK
#pragma pack(1)
#endif
@@ -69,7 +69,7 @@ extern "C" {
uint8_t reserved;
} OUT_PACK color_ref_t;
-#ifdef _MSC_VER
+#ifdef OUT_USE_PRAGMA_PACK
#pragma pack()
#endif
diff --git a/backend/common.c b/backend/common.c
index a0b87ab8..9267db49 100644
--- a/backend/common.c
+++ b/backend/common.c
@@ -204,12 +204,12 @@ INTERNAL int module_colour_is_set(const struct zint_symbol *symbol, const int y_
INTERNAL void set_module_colour(struct zint_symbol *symbol, const int y_coord, const int x_coord, const int colour) {
symbol->encoded_data[y_coord][x_coord] = colour;
}
-#endif
/* Sets a dark/black module to white (i.e. unsets) */
INTERNAL void unset_module(struct zint_symbol *symbol, const int y_coord, const int x_coord) {
symbol->encoded_data[y_coord][x_coord >> 3] &= ~(1 << (x_coord & 0x07));
}
+#endif
/* Expands from a width pattern to a bit pattern */
INTERNAL void expand(struct zint_symbol *symbol, const char data[], const int length) {
diff --git a/backend/common.h b/backend/common.h
index 3c0ad7c2..2225fa48 100644
--- a/backend/common.h
+++ b/backend/common.h
@@ -37,29 +37,68 @@
extern "C" {
#endif /* __cplusplus */
-#ifndef ARRAY_SIZE
-#define ARRAY_SIZE(x) ((int) (sizeof(x) / sizeof((x)[0])))
+#include "zint.h"
+#include "zintconfig.h"
+#include
+#include
+
+#ifdef _MSC_VER
+typedef unsigned __int8 uint8_t;
+typedef unsigned __int16 uint16_t;
+typedef __int32 int32_t;
+typedef unsigned __int32 uint32_t;
+typedef unsigned __int64 uint64_t;
+#else
+#include
#endif
-/* Determine if C89 or C99 (excluding MSVC, which doesn't define __STDC_VERSION__) */
-#ifndef _MSC_VER
-# if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199000L
-# define ZINT_IS_C89
-# elif __STDC_VERSION__ <= 199901L /* Actually includes pseudo-standards "C94/C95" as well */
-# define ZINT_IS_C99
-# endif
-#endif
+/* Note if change following must also change "frontend/main.c" copy */
+#define ARRAY_SIZE(x) ((int) (sizeof(x) / sizeof((x)[0])))
#ifdef _MSC_VER
# include
# define z_alloca(nmemb) _alloca(nmemb)
+#elif defined(__COMPCERT__)
+# define z_alloca(nmemb) malloc(nmemb) /* So links - leads to loads of leaks obs */
#else
-# if defined(ZINT_IS_C89) || defined(ZINT_IS_C99) || defined(__NuttX__) || defined(_AIX) \
+# if (defined(__GNUC__) && !defined(alloca) && !defined(__NetBSD__)) || defined(__NuttX__) || defined(_AIX) \
|| (defined(__sun) && defined(__SVR4) /*Solaris*/)
# include
# endif
# define z_alloca(nmemb) alloca(nmemb)
#endif
+/* End of "frontend/main.c" copy */
+
+#ifdef _MSC_VER
+# pragma warning(disable: 4125) /* decimal digit terminates octal escape sequence */
+# pragma warning(disable: 4244) /* conversion from int to float */
+# if _MSC_VER > 1200 /* VC6 */
+# pragma warning(disable: 4996) /* function or variable may be unsafe */
+# endif
+#endif
+
+#if defined(__GNUC__) && __GNUC__ >= 4 && !defined(ZINT_TEST) && !defined(__MINGW32__)
+# define INTERNAL __attribute__((__visibility__("hidden")))
+#elif defined(ZINT_TEST)
+# define INTERNAL ZINT_EXTERN /* The test suite references INTERNAL functions, so they need to be exported */
+#else
+# define INTERNAL
+#endif
+
+#if defined(__GNUC__) && __GNUC__ >= 4 && !defined(__MINGW32__)
+# define INTERNAL_DATA_EXTERN __attribute__((__visibility__("hidden"))) extern
+# define INTERNAL_DATA __attribute__((__visibility__("hidden")))
+#else
+# define INTERNAL_DATA_EXTERN extern
+# define INTERNAL_DATA
+#endif
+
+/* Determine if C89 (excluding MSVC, which doesn't define __STDC_VERSION__) */
+#ifndef _MSC_VER
+# if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199000L
+# define ZINT_IS_C89
+# endif
+#endif
#ifdef _MSC_VER
# if _MSC_VER >= 1400 /* MSVC 2005 (C++ 8.0) */
@@ -73,17 +112,47 @@ extern "C" {
# endif
#endif
-#ifdef _MSC_VER
-typedef unsigned __int8 uint8_t;
-typedef unsigned __int16 uint16_t;
-typedef __int32 int32_t;
-typedef unsigned __int32 uint32_t;
-typedef unsigned __int64 uint64_t;
-#else
-#include
+#if (defined(_MSC_VER) && _MSC_VER <= 1200) || defined(ZINT_IS_C89) /* VC6 or C89 */
+# define ceilf (float) ceil
+# define floorf (float) floor
+# define fmodf (float) fmod
+#endif
+/* `round()` (C99) not before MSVC 2013 (C++ 12.0) */
+#if (defined(_MSC_VER) && _MSC_VER < 1800) || defined(ZINT_IS_C89)
+# define round(arg) floor((arg) + 0.5)
+# define roundf(arg) floorf((arg) + 0.5f)
#endif
-/* `is_sane()` flags */
+/* Is float integral value? (https://stackoverflow.com/a/40404149) */
+#define isfintf(arg) (fmodf(arg, 1.0f) == 0.0f)
+
+/* Simple versions of functions with no dependence on locale */
+#define z_isdigit(c) ((c) <= '9' && (c) >= '0')
+#define z_isupper(c) ((c) >= 'A' && (c) <= 'Z')
+#define z_islower(c) ((c) >= 'a' && (c) <= 'z')
+
+/* Helpers to cast away char pointer signedness */
+#define ustrlen(source) strlen((const char *) (source))
+#define ustrcpy(target, source) strcpy((char *) (target), (const char *) (source))
+#define ustrcat(target, source) strcat((char *) (target), (const char *) (source))
+#define ustrncat(target, source, count) strncat((char *) (target), (const char *) (source), (count))
+
+/* Converts a character 0-9, A-F to its equivalent integer value */
+INTERNAL int ctoi(const char source);
+
+/* Converts an integer value to its hexadecimal character */
+INTERNAL char itoc(const int source);
+
+/* Converts decimal string of length <= 9 to integer value. Returns -1 if not numeric */
+INTERNAL int to_int(const unsigned char source[], const int length);
+
+/* Converts lower case characters to upper case in string `source` */
+INTERNAL void to_upper(unsigned char source[], const int length);
+
+/* Returns the number of times a character occurs in `source` */
+INTERNAL int chr_cnt(const unsigned char source[], const int length, const unsigned char c);
+
+/* `is_chr()` & `is_sane()` flags */
#define IS_SPC_F 0x0001 /* Space */
#define IS_HSH_F 0x0002 /* Hash sign # */
#define IS_AST_F 0x0004 /* Asterisk sign * */
@@ -107,91 +176,6 @@ typedef unsigned __int64 uint64_t;
/* The most commonly used set */
#define NEON_F IS_NUM_F /* NEON "0123456789" */
-/* Simple versions of functions with no dependence on locale */
-#define z_isdigit(c) ((c) <= '9' && (c) >= '0')
-#define z_isupper(c) ((c) >= 'A' && (c) <= 'Z')
-#define z_islower(c) ((c) >= 'a' && (c) <= 'z')
-
-#include "zint.h"
-#include "zintconfig.h"
-#include
-#include
-
-/* Helpers to cast away char pointer signedness */
-#define ustrlen(source) strlen((const char *) (source))
-#define ustrcpy(target, source) strcpy((char *) (target), (const char *) (source))
-#define ustrcat(target, source) strcat((char *) (target), (const char *) (source))
-#define ustrncat(target, source, count) strncat((char *) (target), (const char *) (source), (count))
-
-#if (defined(_MSC_VER) && _MSC_VER <= 1200) || defined(ZINT_IS_C89) /* VC6 or C89 */
-# define ceilf (float) ceil
-# define floorf (float) floor
-# define fmodf (float) fmod
-#endif
-/* `round()` (C99) not before MSVC 2013 (C++ 12.0) */
-#if (defined(_MSC_VER) && _MSC_VER < 1800) || defined(ZINT_IS_C89)
-# define round(arg) floor((arg) + 0.5)
-# define roundf(arg) floorf((arg) + 0.5f)
-#endif
-
-#ifdef _MSC_VER
-# pragma warning(disable: 4244) /* conversion from int to float */
-# if _MSC_VER > 1200 /* VC6 */
-# pragma warning(disable: 4996) /* function or variable may be unsafe */
-# endif
-#endif
-
-/* Is float integral value? (https://stackoverflow.com/a/40404149) */
-#define isfintf(arg) (fmodf(arg, 1.0f) == 0.0f)
-
-#if defined(__GNUC__) && __GNUC__ >= 4 && !defined(ZINT_TEST) && !defined(__MINGW32__)
-# define INTERNAL __attribute__((__visibility__("hidden")))
-#elif defined(ZINT_TEST)
-# define INTERNAL ZINT_EXTERN /* The test suite references INTERNAL functions, so they need to be exported */
-#else
-# define INTERNAL
-#endif
-
-#if defined(__GNUC__) && __GNUC__ >= 4 && !defined(__MINGW32__)
-# define INTERNAL_DATA_EXTERN __attribute__((__visibility__("hidden"))) extern
-# define INTERNAL_DATA __attribute__((__visibility__("hidden")))
-#else
-# define INTERNAL_DATA_EXTERN extern
-# define INTERNAL_DATA
-#endif
-
-#define Z_COMMON_INLINE 1
-
-#ifdef Z_COMMON_INLINE
-/* Returns true (1) if a module is dark/black, otherwise false (0) */
-# define module_is_set(s, y, x) (((s)->encoded_data[(y)][(x) >> 3] >> ((x) & 0x07)) & 1)
-
-/* Sets a module to dark/black */
-# define set_module(s, y, x) do { (s)->encoded_data[(y)][(x) >> 3] |= 1 << ((x) & 0x07); } while (0)
-
-/* Returns true (1-8) if a module is colour, otherwise false (0) */
-# define module_colour_is_set(s, y, x) ((s)->encoded_data[(y)][(x)])
-
-/* Sets a module to a colour */
-# define set_module_colour(s, y, x, c) do { (s)->encoded_data[(y)][(x)] = (c); } while (0)
-#endif
-
-/* Converts a character 0-9, A-F to its equivalent integer value */
-INTERNAL int ctoi(const char source);
-
-/* Converts an integer value to its hexadecimal character */
-INTERNAL char itoc(const int source);
-
-/* Converts decimal string of length <= 9 to integer value. Returns -1 if not numeric */
-INTERNAL int to_int(const unsigned char source[], const int length);
-
-/* Converts lower case characters to upper case in string `source` */
-INTERNAL void to_upper(unsigned char source[], const int length);
-
-/* Returns the number of times a character occurs in `source` */
-INTERNAL int chr_cnt(const unsigned char source[], const int length, const unsigned char c);
-
-
/* Whether a character matches `flg` */
INTERNAL int is_chr(const unsigned int flg, const unsigned int c);
@@ -211,7 +195,15 @@ INTERNAL int posn(const char set_string[], const char data);
INTERNAL int bin_append_posn(const int arg, const int length, char *binary, const int bin_posn);
-#ifndef Z_COMMON_INLINE
+#define Z_COMMON_INLINE 1
+
+#ifdef Z_COMMON_INLINE
+# define module_is_set(s, y, x) (((s)->encoded_data[y][(x) >> 3] >> ((x) & 0x07)) & 1)
+# define set_module(s, y, x) do { (s)->encoded_data[y][(x) >> 3] |= 1 << ((x) & 0x07); } while (0)
+# define module_colour_is_set(s, y, x) ((s)->encoded_data[y][x])
+# define set_module_colour(s, y, x, c) do { (s)->encoded_data[y][x] = (c); } while (0)
+# define unset_module(s, y, x) do { (s)->encoded_data[y][(x) >> 3] &= ~(1 << ((x) & 0x07)); } while (0)
+#else
/* Returns true (1) if a module is dark/black, otherwise false (0) */
INTERNAL int module_is_set(const struct zint_symbol *symbol, const int y_coord, const int x_coord);
@@ -224,9 +216,10 @@ INTERNAL int module_colour_is_set(const struct zint_symbol *symbol, const int y_
/* Sets a module to a colour */
INTERNAL void set_module_colour(struct zint_symbol *symbol, const int y_coord, const int x_coord,
const int colour);
-#endif
+
/* Sets a dark/black module to white (i.e. unsets) */
INTERNAL void unset_module(struct zint_symbol *symbol, const int y_coord, const int x_coord);
+#endif /* Z_COMMON_INLINE */
/* Expands from a width pattern to a bit pattern */
INTERNAL void expand(struct zint_symbol *symbol, const char data[], const int length);
diff --git a/backend/dmatrix.c b/backend/dmatrix.c
index ee80b8a3..ec942445 100644
--- a/backend/dmatrix.c
+++ b/backend/dmatrix.c
@@ -683,7 +683,7 @@ static int dm_switch_mode(const int next_mode, unsigned char target[], int tp, i
#define DM_NUM_MODES 6
-static const char *dm_smodes[] = { "?", "ASCII", "C40", "TEXT", "X12", "EDF", "B256" };
+static const char dm_smodes[DM_NUM_MODES + 1][6] = { "?", "ASCII", "C40", "TEXT", "X12", "EDF", "B256" };
/* The size of this structure could be significantly reduced using techniques pointed out by Alex Geller,
but not done currently to avoid the processing overhead */
diff --git a/backend/emf.h b/backend/emf.h
index 599cdb93..ca197e7c 100644
--- a/backend/emf.h
+++ b/backend/emf.h
@@ -37,7 +37,7 @@
extern "C" {
#endif
-#ifdef _MSC_VER
+#ifdef OUT_USE_PRAGMA_PACK
#pragma pack(1)
#endif
@@ -237,7 +237,7 @@ extern "C" {
emr_rectangle_t right;
} OUT_PACK box_t;
-#ifdef _MSC_VER
+#ifdef OUT_USE_PRAGMA_PACK
#pragma pack()
#endif
diff --git a/backend/gs1.c b/backend/gs1.c
index bfd053fe..29d25079 100644
--- a/backend/gs1.c
+++ b/backend/gs1.c
@@ -40,7 +40,7 @@
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]) {
- data_len -= offset;
+ data_len = data_len < offset ? 0 : data_len - offset;
if (data_len < min) {
return 0;
@@ -78,7 +78,7 @@ static const char c82[] = {
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]) {
- data_len -= offset;
+ data_len = data_len < offset ? 0 : data_len - offset;
if (data_len < min) {
return 0;
@@ -105,7 +105,7 @@ static int cset82(const unsigned char *data, int data_len, int offset, int min,
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;
+ data_len = data_len < offset ? 0 : data_len - offset;
if (data_len < min) {
return 0;
@@ -133,7 +133,7 @@ static int cset39(const unsigned char *data, int data_len, int offset, int min,
static int cset64(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;
+ data_len = data_len < offset ? 0 : data_len - offset;
if (data_len < min) {
return 0;
@@ -166,7 +166,7 @@ static int cset64(const unsigned char *data, int data_len, int offset, int min,
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;
+ data_len = data_len < offset ? 0 : data_len - offset;
if (data_len < min) {
return 0;
@@ -201,7 +201,7 @@ static int csum(const unsigned char *data, int data_len, int offset, int min, in
static int csumalpha(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;
+ data_len = data_len < offset ? 0 : data_len - offset;
if (data_len < min) {
return 0;
@@ -249,7 +249,7 @@ static int key(const unsigned char *data, int data_len, int offset, int min, int
int *p_err_posn, char err_msg[50], const int length_only) {
(void)max;
- data_len -= offset;
+ data_len = data_len < offset ? 0 : data_len - offset;
if (data_len < min) {
return 0;
@@ -284,7 +284,7 @@ static int yyyymmd0(const unsigned char *data, int data_len, int offset, int min
(void)max;
- data_len -= offset;
+ data_len = data_len < offset ? 0 : data_len - offset;
if (data_len < min || (data_len && data_len < 8)) {
return 0;
@@ -331,7 +331,7 @@ static int yyyymmdd(const unsigned char *data, int data_len, int offset, int min
return 0;
}
- data_len -= offset;
+ data_len = data_len < offset ? 0 : data_len - offset;
if (!length_only && data_len) {
const int day = to_int(data + offset + 6, 2);
@@ -350,7 +350,7 @@ static int yyyymmdd(const unsigned char *data, int data_len, int offset, int min
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) {
- data_len -= offset;
+ data_len = data_len < offset ? 0 : data_len - offset;
if (data_len < min || (data_len && data_len < 6)) {
return 0;
@@ -379,7 +379,7 @@ static int yymmdd(const unsigned char *data, int data_len, int offset, int min,
return 0;
}
- data_len -= offset;
+ data_len = data_len < offset ? 0 : data_len - offset;
if (!length_only && data_len) {
const int day = to_int(data + offset + 4, 2);
@@ -406,7 +406,7 @@ static int yymmddhh(const unsigned char *data, int data_len, int offset, int min
return 0;
}
- data_len -= offset;
+ data_len = data_len < offset ? 0 : data_len - offset;
if (!length_only && data_len) {
const int hour = to_int(data + offset + 6, 2);
@@ -426,7 +426,7 @@ static int hhmm(const unsigned char *data, int data_len, int offset, int min, in
int *p_err_posn, char err_msg[50], const int length_only) {
(void)max;
- data_len -= offset;
+ data_len = data_len < offset ? 0 : data_len - offset;
if (data_len < min || (data_len && data_len < 4)) {
return 0;
@@ -459,7 +459,7 @@ static int mmoptss(const unsigned char *data, int data_len, int offset, int min,
int *p_err_posn, char err_msg[50], const int length_only) {
(void)max;
- data_len -= offset;
+ data_len = data_len < offset ? 0 : data_len - offset;
if (data_len < min || (data_len && data_len < 2)
|| (data_len > 2 && data_len < 4)) {
@@ -496,9 +496,13 @@ static int iso3166(const unsigned char *data, int data_len, int offset, int min,
int *p_err_posn, char err_msg[50], const int length_only) {
(void)max;
- data_len -= offset;
+ data_len = data_len < offset ? 0 : data_len - offset;
if (data_len < min || (data_len && data_len < 3)) {
+ if (offset) {
+ /* For backward compatibility only warn if not first */
+ *p_err_no = 4;
+ }
return 0;
}
@@ -514,42 +518,12 @@ static int iso3166(const unsigned char *data, int data_len, int offset, int min,
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;
- }
- /* Do this check separately for backward compatibility */
- if (data_len && data_len_max % 3) {
- *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;
+ data_len = data_len < offset ? 0 : data_len - offset;
if (data_len < min || (data_len && data_len < 3)) {
return 0;
@@ -573,7 +547,7 @@ static int iso3166alpha2(const unsigned char *data, int data_len, int offset, in
int *p_err_posn, char err_msg[50], const int length_only) {
(void)max;
- data_len -= offset;
+ data_len = data_len < offset ? 0 : data_len - offset;
if (data_len < min || (data_len && data_len < 2)) {
return 0;
@@ -599,7 +573,7 @@ static int iso4217(const unsigned char *data, int data_len, int offset, int min,
int *p_err_posn, char err_msg[50], const int length_only) {
(void)max;
- data_len -= offset;
+ data_len = data_len < offset ? 0 : data_len - offset;
if (data_len < min || (data_len && data_len < 3)) {
return 0;
@@ -623,7 +597,7 @@ static int pcenc(const unsigned char *data, int data_len, int offset, int min, i
static const char hex_chars[] = "0123456789ABCDEFabcdef";
- data_len -= offset;
+ data_len = data_len < offset ? 0 : data_len - offset;
if (data_len < min) {
return 0;
@@ -659,7 +633,7 @@ static int yesno(const unsigned char *data, int data_len, int offset, int min, i
int *p_err_posn, char err_msg[50], const int length_only) {
(void)max;
- data_len -= offset;
+ data_len = data_len < offset ? 0 : data_len - offset;
if (data_len < min) {
return 0;
@@ -682,7 +656,7 @@ static int importeridx(const unsigned char *data, int data_len, int offset, int
int *p_err_posn, char err_msg[50], const int length_only) {
(void)max;
- data_len -= offset;
+ data_len = data_len < offset ? 0 : data_len - offset;
if (data_len < min) {
return 0;
@@ -707,7 +681,7 @@ static int importeridx(const unsigned char *data, int data_len, int offset, int
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;
+ data_len = data_len < offset ? 0 : data_len - offset;
if (data_len < min) {
return 0;
@@ -732,7 +706,7 @@ static int winding(const unsigned char *data, int data_len, int offset, int min,
int *p_err_posn, char err_msg[50], const int length_only) {
(void)max;
- data_len -= offset;
+ data_len = data_len < offset ? 0 : data_len - offset;
if (data_len < min) {
return 0;
@@ -755,7 +729,7 @@ static int zero(const unsigned char *data, int data_len, int offset, int min, in
int *p_err_posn, char err_msg[50], const int length_only) {
(void)max;
- data_len -= offset;
+ data_len = data_len < offset ? 0 : data_len - offset;
if (data_len < min) {
return 0;
@@ -778,7 +752,7 @@ static int pieceoftotal(const unsigned char *data, int data_len, int offset, int
int *p_err_posn, char err_msg[50], const int length_only) {
(void)max;
- data_len -= offset;
+ data_len = data_len < offset ? 0 : data_len - offset;
if (data_len < min || (data_len && data_len < 4)) {
return 0;
@@ -816,7 +790,7 @@ static int pieceoftotal(const unsigned char *data, int data_len, int offset, int
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;
+ data_len = data_len < offset ? 0 : data_len - offset;
if (data_len < min) {
return 0;
@@ -897,7 +871,7 @@ static int nozeroprefix(const unsigned char *data, int data_len, int offset, int
int *p_err_posn, char err_msg[50], const int length_only) {
(void)max;
- data_len -= offset;
+ data_len = data_len < offset ? 0 : data_len - offset;
if (data_len < min) {
return 0;
@@ -1004,7 +978,7 @@ static int couponcode(const unsigned char *data, int data_len, int offset, int m
(void)max;
- data_len -= offset;
+ data_len = data_len < offset ? 0 : data_len - offset;
if (data_len < min) {
return 0;
@@ -1222,7 +1196,7 @@ static int couponposoffer(const unsigned char *data, int data_len, int offset, i
(void)max;
- data_len -= offset;
+ data_len = data_len < offset ? 0 : data_len - offset;
if (data_len < min) {
return 0;
@@ -1274,7 +1248,7 @@ static int couponposoffer(const unsigned char *data, int data_len, int offset, i
static int latitude(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;
+ data_len = data_len < offset ? 0 : data_len - offset;
if (data_len < min || (data_len && data_len < 10)) {
return 0;
@@ -1304,7 +1278,7 @@ static int latitude(const unsigned char *data, int data_len, int offset, int min
static int longitude(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;
+ data_len = data_len < offset ? 0 : data_len - offset;
if (data_len < min || (data_len && data_len < 10)) {
return 0;
@@ -1334,7 +1308,7 @@ static int longitude(const unsigned char *data, int data_len, int offset, int mi
static int mediatype(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;
+ data_len = data_len < offset ? 0 : data_len - offset;
if (data_len < min || (data_len && data_len < 2)) {
return 0;
@@ -1364,7 +1338,7 @@ static int mediatype(const unsigned char *data, int data_len, int offset, int mi
static int hyphen(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;
+ data_len = data_len < offset ? 0 : data_len - offset;
if (data_len < min) {
return 0;
@@ -1392,7 +1366,7 @@ static int iso5218(const unsigned char *data, int data_len, int offset, int min,
int *p_err_posn, char err_msg[50], const int length_only) {
(void)max;
- data_len -= offset;
+ data_len = data_len < offset ? 0 : data_len - offset;
if (data_len < min) {
return 0;
@@ -1415,7 +1389,7 @@ static int iso5218(const unsigned char *data, int data_len, int offset, int min,
static int posinseqslash(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;
+ data_len = data_len < offset ? 0 : data_len - offset;
if (data_len < min) {
return 0;
diff --git a/backend/gs1_lint.h b/backend/gs1_lint.h
index e9b0d908..6bf59700 100644
--- a/backend/gs1_lint.h
+++ b/backend/gs1_lint.h
@@ -37,8 +37,8 @@
#define Z_GS1_LINT_H
/* N18,csum,key (Used by SSCC, GSRN - PROVIDER, GSRN - RECIPIENT) */
-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]) {
+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*/)
@@ -48,8 +48,8 @@ static int n18_csum_key(const unsigned char *data, const int data_len,
}
/* N14,csum,key (Used by GTIN, CONTENT) */
-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]) {
+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*/)
@@ -58,16 +58,16 @@ static int n14_csum_key(const unsigned char *data, const int data_len,
&& key(data, data_len, 0, 14, 14, p_err_no, p_err_posn, err_msg, 0);
}
-/* X..20 (Used by BATCH/LOT, SERIAL, CPV, PCN...) */
-static int x__20(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+/* X..20 (Used by BATCH/LOT, SERIAL, CPV, PCN, GLN EXTENSION COMPONENT, SHIP TO POST, RTN TO POST, REFURB LOT, ...) */
+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 (Used by PROD DATE, DUE DATE, PACK DATE, BEST BEFORE or BEST BY...) */
-static int n6_yymmd0(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+/* N6,yymmd0 (Used by PROD DATE, DUE DATE, PACK DATE, BEST BEFORE or BEST BY, SELL BY, USE BY or EXPIRY) */
+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)
@@ -75,36 +75,36 @@ static int n6_yymmd0(const unsigned char *data, const int data_len,
}
/* N2 (Used by VARIANT) */
-static int n2(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+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 (Used by TPX) */
-static int x__28(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+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 (Used by ADDITIONAL ID, CUST. PART No., SECONDARY SERIAL, REF. TO SOURCE...) */
-static int x__30(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+/* X..30 (Used by ADDITIONAL ID, CUST. PART No., SECONDARY SERIAL, REF. TO SOURCE, ORDER NUMBER, ROUTE, SHIP TO...) */
+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 (Used by MTO VARIANT) */
-static int n__6(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+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 [X..17] (Used by GDTI) */
-static int n13_csum_key__x__17_(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+static int n13_csum_key__x__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*/)
@@ -115,8 +115,8 @@ static int n13_csum_key__x__17_(const unsigned char *data, const int data_len,
}
/* N13,csum,key [N..12] (Used by GCN) */
-static int n13_csum_key__n__12_(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+static int n13_csum_key__n__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*/)
@@ -127,29 +127,29 @@ static int n13_csum_key__n__12_(const unsigned char *data, const int data_len,
}
/* N..8 (Used by VAR. COUNT, COUNT) */
-static int n__8(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+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 (Used by NET WEIGHT (kg), LENGTH (m), WIDTH (m), HEIGHT (m)...) */
-static int n6(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+/* N6 (Used by NET WEIGHT (kg), LENGTH (m), WIDTH (m), HEIGHT (m), AREA (m²), NET VOLUME (l), NET VOLUME (m³)...) */
+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 (Used by AMOUNT, PRICE) */
-static int n__15(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+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 (Used by AMOUNT, PRICE) */
-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]) {
+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)
@@ -158,15 +158,15 @@ static int n3_iso4217_n__15(const unsigned char *data, const int data_len,
}
/* N4 (Used by PRCNT OFF, POINTS) */
-static int n4(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+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 (Used by GINC, GIAI - ASSEMBLY, GIAI) */
-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]) {
+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)
@@ -174,8 +174,8 @@ static int x__30_key(const unsigned char *data, const int data_len,
}
/* N17,csum,key (Used by GSIN) */
-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]) {
+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*/)
@@ -184,9 +184,9 @@ static int n17_csum_key(const unsigned char *data, const int data_len,
&& key(data, data_len, 0, 17, 17, p_err_no, p_err_posn, err_msg, 0);
}
-/* N13,csum,key (Used by SHIP TO LOC, BILL TO, PURCHASE FROM, SHIP FOR LOC...) */
-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]) {
+/* N13,csum,key (Used by SHIP TO LOC, BILL TO, PURCHASE FROM, SHIP FOR LOC, LOC No., PAY TO, PROD/SERV LOC, PARTY) */
+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*/)
@@ -196,8 +196,8 @@ static int n13_csum_key(const unsigned char *data, const int data_len,
}
/* N3,iso3166 X..9 (Used by SHIP TO POST) */
-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]) {
+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)
@@ -206,42 +206,54 @@ static int n3_iso3166_x__9(const unsigned char *data, const int data_len,
}
/* N3,iso3166 (Used by ORIGIN, COUNTRY - PROCESS, COUNTRY - FULL PROCESS) */
-static int n3_iso3166(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+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 (Used by COUNTRY - INITIAL PROCESS, COUNTRY - DISASSEMBLY) */
-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);
+/* N3,iso3166 [N3],iso3166 [N3],iso3166 [N3],iso3166 [N3],iso3166 (Used by COUNTRY - INITIAL PROCESS, COUNTRY -...) */
+static int n3_iso3166__n3__iso3166__n3__iso3166__n3__iso3166__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 && data_len <= 15
+ && iso3166(data, data_len, 0, 3, 3, p_err_no, p_err_posn, err_msg, 1 /*length_only*/)
+ && iso3166(data, data_len, 3, 0, 3, p_err_no, p_err_posn, err_msg, 1 /*length_only*/)
+ && iso3166(data, data_len, 6, 0, 3, p_err_no, p_err_posn, err_msg, 1 /*length_only*/)
+ && iso3166(data, data_len, 9, 0, 3, p_err_no, p_err_posn, err_msg, 1 /*length_only*/)
+ && iso3166(data, data_len, 12, 0, 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)
+ && numeric(data, data_len, 3, 0, 3, p_err_no, p_err_posn, err_msg)
+ && iso3166(data, data_len, 3, 0, 3, p_err_no, p_err_posn, err_msg, 0)
+ && numeric(data, data_len, 6, 0, 3, p_err_no, p_err_posn, err_msg)
+ && iso3166(data, data_len, 6, 0, 3, p_err_no, p_err_posn, err_msg, 0)
+ && numeric(data, data_len, 9, 0, 3, p_err_no, p_err_posn, err_msg)
+ && iso3166(data, data_len, 9, 0, 3, p_err_no, p_err_posn, err_msg, 0)
+ && numeric(data, data_len, 12, 0, 3, p_err_no, p_err_posn, err_msg)
+ && iso3166(data, data_len, 12, 0, 3, p_err_no, p_err_posn, err_msg, 0);
}
/* X..3 (Used by ORIGIN SUBDIVISION, AQUATIC SPECIES) */
-static int x__3(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+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 (Used by SHIP TO COMP, SHIP TO NAME, RTN TO COMP, RTN TO NAME...) */
-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]) {
+/* X..35,pcenc (Used by SHIP TO COMP, SHIP TO NAME, RTN TO COMP, RTN TO NAME, SRV DESCRIPTION) */
+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 (Used by SHIP TO ADD1, SHIP TO ADD2, SHIP TO SUB, SHIP TO LOC...) */
-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]) {
+/* X..70,pcenc (Used by SHIP TO ADD1, SHIP TO ADD2, SHIP TO SUB, SHIP TO LOC, SHIP TO REG, RTN TO ADD1, RTN TO ...) */
+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)
@@ -249,8 +261,8 @@ static int x__70_pcenc(const unsigned char *data, const int data_len,
}
/* X2,iso3166alpha2 (Used by SHIP TO COUNTRY, RTN TO COUNTRY) */
-static int x2_iso3166alpha2(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+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)
@@ -258,8 +270,8 @@ static int x2_iso3166alpha2(const unsigned char *data, const int data_len,
}
/* N10,latitude N10,longitude (Used by SHIP TO GEO) */
-static int n10_latitude_n10_longitude(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+static int n10_latitude_n10_longitude(const unsigned char *data,
+ const int data_len, int *p_err_no, int *p_err_posn, char err_msg[50]) {
return data_len == 20
&& latitude(data, data_len, 0, 10, 10, p_err_no, p_err_posn, err_msg, 1 /*length_only*/)
&& longitude(data, data_len, 10, 10, 10, p_err_no, p_err_posn, err_msg, 1 /*length_only*/)
@@ -270,8 +282,8 @@ static int n10_latitude_n10_longitude(const unsigned char *data, const int data_
}
/* N1,yesno (Used by DANGEROUS GOODS, AUTH TO LEAVE, SIG REQUIRED) */
-static int n1_yesno(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+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)
@@ -279,8 +291,8 @@ static int n1_yesno(const unsigned char *data, const int data_len,
}
/* N6,yymmd0 N4,hhmm (Used by NOT BEF DEL DT, NOT AFT DEL DT) */
-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]) {
+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*/)
@@ -291,8 +303,8 @@ static int n6_yymmd0_n4_hhmm(const unsigned char *data, const int data_len,
}
/* N6,yymmdd (Used by REL DATE, FIRST FREEZE DATE) */
-static int n6_yymmdd(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+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)
@@ -300,8 +312,8 @@ static int n6_yymmdd(const unsigned char *data, const int data_len,
}
/* N6 [X1],hyphen (Used by MAX TEMP F., MAX TEMP C., MIN TEMP F., MIN TEMP C.) */
-static int n6__x1__hyphen(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+static int n6__x1__hyphen(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 <= 7
&& hyphen(data, data_len, 6, 0, 1, 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)
@@ -310,15 +322,15 @@ static int n6__x1__hyphen(const unsigned char *data, const int data_len,
}
/* N13 (Used by NSN) */
-static int n13(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+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 (Used by EXPIRY TIME) */
-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]) {
+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*/)
@@ -329,22 +341,22 @@ static int n6_yymmdd_n4_hhmm(const unsigned char *data, const int data_len,
}
/* N..4 (Used by ACTIVE POTENCY) */
-static int n__4(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+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 (Used by CATCH AREA) */
-static int x__12(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+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 [N6],yymmdd (Used by HARVEST DATE) */
-static int n6_yymmdd__n6__yymmdd(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+static int n6_yymmdd__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 && 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*/)
@@ -355,22 +367,22 @@ static int n6_yymmdd__n6__yymmdd(const unsigned char *data, const int data_len,
}
/* X..10 (Used by FISHING GEAR TYPE, SUFFIX) */
-static int x__10(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+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 (Used by PROD METHOD) */
-static int x__2(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+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);
}
/* N6,yymmdd [N4],hhmm (Used by TEST BY DATE) */
-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]) {
+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 >= 6 && 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, 0, 4, p_err_no, p_err_posn, err_msg, 1 /*length_only*/)
@@ -380,9 +392,9 @@ static int n6_yymmdd__n4__hhmm(const unsigned char *data, const int data_len,
&& hhmm(data, data_len, 6, 0, 4, p_err_no, p_err_posn, err_msg, 0);
}
-/* N3,iso3166999 X..27 (Used by PROCESSOR # 0, PROCESSOR # 1, PROCESSOR # 2, PROCESSOR # 3...) */
-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]) {
+/* N3,iso3166999 X..27 (Used by PROCESSOR # 0, PROCESSOR # 1, PROCESSOR # 2, PROCESSOR # 3, PROCESSOR # 4, PROC...) */
+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)
@@ -391,8 +403,8 @@ static int n3_iso3166999_x__27(const unsigned char *data, const int data_len,
}
/* N1 X1 X1 X1,importeridx (Used by UIC+EXT) */
-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]) {
+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)
@@ -402,17 +414,17 @@ static int n1_x1_x1_x1_importeridx(const unsigned char *data, const int data_len
&& importeridx(data, data_len, 3, 1, 1, p_err_no, p_err_posn, err_msg, 0);
}
-/* X2 X..28 (Used by CERT # 1, CERT # 2, CERT # 3, CERT # 4...) */
-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]) {
+/* X2 X..28 (Used by CERT # 1, CERT # 2, CERT # 3, CERT # 4, CERT # 5, CERT # 6, CERT # 7, CERT # 8, CERT # 9, ...) */
+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);
}
/* N2,mediatype (Used by AIDC MEDIA TYPE) */
-static int n2_mediatype(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+static int n2_mediatype(const unsigned char *data,
+ const int data_len, int *p_err_no, int *p_err_posn, char err_msg[50]) {
return data_len == 2
&& mediatype(data, data_len, 0, 2, 2, p_err_no, p_err_posn, err_msg, 1 /*length_only*/)
&& numeric(data, data_len, 0, 2, 2, p_err_no, p_err_posn, err_msg)
@@ -420,15 +432,15 @@ static int n2_mediatype(const unsigned char *data, const int data_len,
}
/* X..25 (Used by VCN, REF No.) */
-static int x__25(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+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);
}
/* N8,yyyymmdd (Used by DOB) */
-static int n8_yyyymmdd(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+static int n8_yyyymmdd(const unsigned char *data,
+ const int data_len, int *p_err_no, int *p_err_posn, char err_msg[50]) {
return data_len == 8
&& yyyymmdd(data, data_len, 0, 8, 8, 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)
@@ -436,8 +448,8 @@ static int n8_yyyymmdd(const unsigned char *data, const int data_len,
}
/* N8,yyyymmdd N4,hhmm (Used by DOB TIME) */
-static int n8_yyyymmdd_n4_hhmm(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+static int n8_yyyymmdd_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 == 12
&& yyyymmdd(data, data_len, 0, 8, 8, p_err_no, p_err_posn, err_msg, 1 /*length_only*/)
&& hhmm(data, data_len, 8, 4, 4, p_err_no, p_err_posn, err_msg, 1 /*length_only*/)
@@ -448,8 +460,8 @@ static int n8_yyyymmdd_n4_hhmm(const unsigned char *data, const int data_len,
}
/* N1,iso5218 (Used by BIO SEX) */
-static int n1_iso5218(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+static int n1_iso5218(const unsigned char *data,
+ const int data_len, int *p_err_no, int *p_err_posn, char err_msg[50]) {
return data_len == 1
&& iso5218(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)
@@ -457,8 +469,8 @@ static int n1_iso5218(const unsigned char *data, const int data_len,
}
/* X..40,pcenc (Used by FAMILY NAME, GIVEN NAME, BABY) */
-static int x__40_pcenc(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+static int x__40_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 <= 40
&& pcenc(data, data_len, 0, 1, 40, p_err_no, p_err_posn, err_msg, 1 /*length_only*/)
&& cset82(data, data_len, 0, 1, 40, p_err_no, p_err_posn, err_msg)
@@ -466,8 +478,8 @@ static int x__40_pcenc(const unsigned char *data, const int data_len,
}
/* X..90,pcenc (Used by FULL NAME) */
-static int x__90_pcenc(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+static int x__90_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 <= 90
&& pcenc(data, data_len, 0, 1, 90, p_err_no, p_err_posn, err_msg, 1 /*length_only*/)
&& cset82(data, data_len, 0, 1, 90, p_err_no, p_err_posn, err_msg)
@@ -475,8 +487,8 @@ static int x__90_pcenc(const unsigned char *data, const int data_len,
}
/* X3,posinseqslash (Used by BIRTH SEQUENCE) */
-static int x3_posinseqslash(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+static int x3_posinseqslash(const unsigned char *data,
+ const int data_len, int *p_err_no, int *p_err_posn, char err_msg[50]) {
return data_len == 3
&& posinseqslash(data, data_len, 0, 3, 3, p_err_no, p_err_posn, err_msg, 1 /*length_only*/)
&& cset82(data, data_len, 0, 3, 3, p_err_no, p_err_posn, err_msg)
@@ -484,8 +496,8 @@ static int x3_posinseqslash(const unsigned char *data, const int data_len,
}
/* N4,nonzero N5,nonzero N3,nonzero N1,winding N1 (Used by DIMENSIONS) */
-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]) {
+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*/)
@@ -503,8 +515,8 @@ static int n4_nonzero_n5_nonzero_n3_nonzero_n1_winding_n1(const unsigned char *d
}
/* N1,zero N13,csum,key [X..16] (Used by GRAI) */
-static int n1_zero_n13_csum_key__x__16_(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+static int n1_zero_n13_csum_key__x__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*/)
@@ -518,8 +530,8 @@ static int n1_zero_n13_csum_key__x__16_(const unsigned char *data, const int dat
}
/* N14,csum N4,pieceoftotal (Used by ITIP, ITIP CONTENT) */
-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]) {
+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*/)
@@ -530,8 +542,8 @@ static int n14_csum_n4_pieceoftotal(const unsigned char *data, const int data_le
}
/* X..34,iban (Used by 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]) {
+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)
@@ -539,8 +551,8 @@ static int x__34_iban(const unsigned char *data, const int data_len,
}
/* N8,yymmddhh [N..4],mmoptss (Used by PROD TIME) */
-static int n8_yymmddhh__n__4__mmoptss(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+static int n8_yymmddhh__n__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*/)
@@ -551,15 +563,15 @@ static int n8_yymmddhh__n__4__mmoptss(const unsigned char *data, const int data_
}
/* X..50 (Used by OPTSEN) */
-static int x__50(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[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);
}
/* Y..30,key (Used by CPID) */
-static int y__30_key(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+static int y__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)
@@ -567,8 +579,8 @@ static int y__30_key(const unsigned char *data, const int data_len,
}
/* N..12,nozeroprefix (Used by CPID SERIAL) */
-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]) {
+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)
@@ -576,8 +588,8 @@ static int n__12_nozeroprefix(const unsigned char *data, const int data_len,
}
/* X..25,csumalpha,key (Used by GMN) */
-static int x__25_csumalpha_key(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+static int x__25_csumalpha_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 <= 25
&& csumalpha(data, data_len, 0, 1, 25, p_err_no, p_err_posn, err_msg, 1 /*length_only*/)
&& key(data, data_len, 0, 1, 25, p_err_no, p_err_posn, err_msg, 1 /*length_only*/)
@@ -587,22 +599,22 @@ static int x__25_csumalpha_key(const unsigned char *data, const int data_len,
}
/* N..10 (Used by SRIN) */
-static int n__10(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+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);
}
/* Z..90 (Used by DIGSIG) */
-static int z__90(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+static int z__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
&& cset64(data, data_len, 0, 1, 90, 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]) {
+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)
@@ -610,8 +622,8 @@ static int x__70_couponcode(const unsigned char *data, const int data_len,
}
/* 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]) {
+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)
@@ -619,15 +631,15 @@ static int x__70_couponposoffer(const unsigned char *data, const int data_len,
}
/* X..70 (Used by PRODUCT URL) */
-static int x__70(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+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 (Used by INTERNAL) */
-static int x__90(const unsigned char *data, const int data_len,
- int *p_err_no, int *p_err_posn, char err_msg[50]) {
+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);
}
@@ -711,7 +723,7 @@ static int gs1_lint(const int ai, const unsigned char *data, const int data_len,
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);
+ return n3_iso3166__n3__iso3166__n3__iso3166__n3__iso3166__n3__iso3166(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);
diff --git a/backend/library.c b/backend/library.c
index 93298d9c..288cc8d8 100644
--- a/backend/library.c
+++ b/backend/library.c
@@ -498,25 +498,6 @@ static int supports_eci(const int symbology) {
return 0;
}
-/* Returns 1 if symbology is Health Industry Bar Code */
-static int is_hibc(const int symbology) {
-
- switch (symbology) {
- case BARCODE_HIBC_128:
- case BARCODE_HIBC_39:
- case BARCODE_HIBC_DM:
- case BARCODE_HIBC_QR:
- case BARCODE_HIBC_PDF:
- case BARCODE_HIBC_MICPDF:
- case BARCODE_HIBC_BLOCKF:
- case BARCODE_HIBC_AZTEC:
- return 1;
- break;
- }
-
- return 0;
-}
-
/* Returns 1 if symbology supports HRT */
static int has_hrt(const int symbology) {
@@ -565,15 +546,12 @@ static int has_hrt(const int symbology) {
return 1;
}
-/* Suppress clang warning: a function declaration without a prototype is deprecated in all versions of C
- (not included in gcc's "-wpedantic") */
-#if defined(__clang__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wstrict-prototypes"
-#endif
+typedef int (*barcode_src_func_t)(struct zint_symbol *, unsigned char[], int);
+typedef int (*barcode_seg_func_t)(struct zint_symbol *, struct zint_seg[], const int);
-/* Used for dispatching barcodes and for whether symbol id valid */
-static int (*const barcode_funcs[BARCODE_LAST + 1])() = {
+/* Used for dispatching `barcode_src_func_t` barcodes */
+/* Also used, with `barcode_seg_funcs` below, for testing whether symbol id valid in `ZBarcode_ValidID()` */
+static const barcode_src_func_t barcode_src_funcs[BARCODE_LAST + 1] = {
NULL, code11, c25standard, c25inter, c25iata, /*0-4*/
NULL, c25logic, c25ind, code39, excode39, /*5-9*/
NULL, NULL, NULL, eanx, eanx, /*10-14*/
@@ -585,33 +563,52 @@ static int (*const barcode_funcs[BARCODE_LAST + 1])() = {
postnet, NULL, NULL, NULL, NULL, /*40-44*/
NULL, NULL, msi_plessey, NULL, fim, /*45-49*/
code39, pharma, pzn, pharma_two, postnet, /*50-54*/
- pdf417, pdf417, maxicode, qrcode, NULL, /*55-59*/
+ NULL, NULL, NULL, NULL, NULL, /*55-59*/
code128, NULL, NULL, auspost, NULL, /*60-64*/
NULL, auspost, auspost, auspost, eanx, /*65-69*/
- rm4scc, datamatrix, ean14, vin, codablockf, /*70-74*/
+ rm4scc, NULL, ean14, vin, codablockf, /*70-74*/
nve18, japanpost, koreapost, NULL, dbar_omn, /*75-79*/
- dbar_omn, dbar_exp, planet, NULL, micropdf417, /*80-84*/
+ dbar_omn, dbar_exp, planet, NULL, NULL, /*80-84*/
usps_imail, plessey, telepen_num, NULL, itf14, /*85-89*/
- kix, NULL, aztec, daft, NULL, /*90-94*/
- NULL, dpd, microqr, hibc, hibc, /*95-99*/
- NULL, NULL, hibc, NULL, hibc, /*100-104*/
- NULL, hibc, NULL, hibc, NULL, /*105-109*/
- hibc, NULL, hibc, NULL, NULL, /*110-114*/
- dotcode, hanxin, NULL, NULL, mailmark_2d, /*115-119*/
+ kix, NULL, NULL, daft, NULL, /*90-94*/
+ NULL, dpd, microqr, NULL, NULL, /*95-99*/
+ NULL, NULL, NULL, NULL, NULL, /*100-104*/
+ NULL, NULL, NULL, NULL, NULL, /*105-109*/
+ NULL, NULL, NULL, NULL, NULL, /*110-114*/
+ NULL, NULL, NULL, NULL, mailmark_2d, /*115-119*/
upu_s10, mailmark_4s, NULL, NULL, NULL, /*120-124*/
NULL, NULL, NULL, azrune, code32, /*125-129*/
composite, composite, composite, composite, composite, /*130-134*/
composite, composite, composite, composite, composite, /*135-139*/
- channel, codeone, gridmatrix, upnqr, ultra, /*140-144*/
- rmqr, bc412,
+ channel, NULL, NULL, upnqr, NULL, /*140-144*/
+ NULL, bc412, /*145-146*/
};
-#if defined(__clang__)
-#pragma GCC diagnostic pop
-#endif
+#define LIB_SEG_FUNCS_START 55
+
+/* Used for dispatching `barcode_seg_func_t` barcodes */
+static const barcode_seg_func_t barcode_seg_funcs[BARCODE_LAST + 1 - LIB_SEG_FUNCS_START] = {
+ pdf417, pdf417, maxicode, qrcode, NULL, /*55-59*/
+ NULL, NULL, NULL, NULL, NULL, /*60-64*/
+ NULL, NULL, NULL, NULL, NULL, /*65-69*/
+ NULL, datamatrix, NULL, NULL, NULL, /*70-74*/
+ NULL, NULL, NULL, NULL, NULL, /*75-79*/
+ NULL, NULL, NULL, NULL, micropdf417, /*80-84*/
+ NULL, NULL, NULL, NULL, NULL, /*85-89*/
+ NULL, NULL, aztec, NULL, NULL, /*90-94*/
+ NULL, NULL, NULL, hibc, hibc, /*95-99*/
+ NULL, NULL, hibc, NULL, hibc, /*100-104*/
+ NULL, hibc, NULL, hibc, NULL, /*105-109*/
+ hibc, NULL, hibc, NULL, NULL, /*110-114*/
+ dotcode, hanxin, NULL, NULL, NULL, /*115-119*/
+ NULL, NULL, NULL, NULL, NULL, /*120-124*/
+ NULL, NULL, NULL, NULL, NULL, /*125-129*/
+ NULL, NULL, NULL, NULL, NULL, /*130-134*/
+ NULL, NULL, NULL, NULL, NULL, /*135-139*/
+ NULL, codeone, gridmatrix, NULL, ultra, /*140-144*/
+ rmqr, NULL, /*145-146*/
+};
-typedef int (*barcode_segs_func_t)(struct zint_symbol *, struct zint_seg[], const int);
-typedef int (*barcode_func_t)(struct zint_symbol *, unsigned char[], int);
static int reduced_charset(struct zint_symbol *symbol, struct zint_seg segs[], const int seg_count);
/* Main dispatch, checking for barcodes which handle ECIs/character sets themselves, otherwise calling
@@ -625,13 +622,12 @@ static int extended_or_reduced_charset(struct zint_symbol *symbol, struct zint_s
case BARCODE_GRIDMATRIX:
case BARCODE_HANXIN:
case BARCODE_RMQR:
- error_number = (*(barcode_segs_func_t)barcode_funcs[symbol->symbology])(symbol, segs, seg_count);
+ error_number = barcode_seg_funcs[symbol->symbology - LIB_SEG_FUNCS_START](symbol, segs, seg_count);
break;
/* These are the standards which have support for specific character sets but not ECI */
case BARCODE_MICROQR:
case BARCODE_UPNQR:
- error_number = (*(barcode_func_t)barcode_funcs[symbol->symbology])(symbol, segs[0].source,
- segs[0].length);
+ error_number = barcode_src_funcs[symbol->symbology](symbol, segs[0].source, segs[0].length);
break;
default: error_number = reduced_charset(symbol, segs, seg_count);
break;
@@ -671,19 +667,19 @@ static int reduced_charset(struct zint_symbol *symbol, struct zint_seg segs[], c
preprocessed += local_segs[i].length + 1;
}
}
- if (supports_eci(symbol->symbology) || is_hibc(symbol->symbology)) {
- error_number = (*(barcode_segs_func_t)barcode_funcs[symbol->symbology])(symbol, local_segs, seg_count);
+ if (barcode_src_funcs[symbol->symbology]) {
+ error_number = barcode_src_funcs[symbol->symbology](symbol, local_segs[0].source, local_segs[0].length);
} else {
- error_number = (*(barcode_func_t)barcode_funcs[symbol->symbology])(symbol, local_segs[0].source,
- local_segs[0].length);
+ error_number = barcode_seg_funcs[symbol->symbology - LIB_SEG_FUNCS_START](symbol, local_segs, seg_count);
}
} else {
- if (supports_eci(symbol->symbology) || is_hibc(symbol->symbology)) {
- segs_cpy(symbol, segs, seg_count, local_segs); /* Shallow copy (needed to set default ECIs) */
- error_number = (*(barcode_segs_func_t)barcode_funcs[symbol->symbology])(symbol, local_segs, seg_count);
+ if (barcode_src_funcs[symbol->symbology]) {
+ error_number = barcode_src_funcs[symbol->symbology](symbol, segs[0].source, segs[0].length);
} else {
- error_number = (*(barcode_func_t)barcode_funcs[symbol->symbology])(symbol, segs[0].source,
- segs[0].length);
+ assert(symbol->symbology >= LIB_SEG_FUNCS_START); /* Suppress clang-tidy-19 warning */
+ assert(barcode_seg_funcs[symbol->symbology - LIB_SEG_FUNCS_START]); /* Suppress clang-tidy-19 warning */
+ segs_cpy(symbol, segs, seg_count, local_segs); /* Shallow copy (needed to set default ECIs) */
+ error_number = barcode_seg_funcs[symbol->symbology - LIB_SEG_FUNCS_START](symbol, local_segs, seg_count);
}
}
@@ -893,6 +889,72 @@ INTERNAL int escape_char_process_test(struct zint_symbol *symbol, const unsigned
}
#endif
+/* For backward-compatibility, map certain invalid symbol ids to zint equivalents, some silently, some with warning */
+static int map_invalid_symbology(struct zint_symbol *symbol) {
+
+ /* Symbol ids 1 to 126 are defined by tbarcode */
+ /* 26 allowed: UPC-A up to tbarcode 9, ISSN for tbarcode 10+, mapped to UPC-A */
+ /* 27 error: UPCD1 up to tbarcode 9, ISSN + 2 digit add-on for tbarcode 10+ */
+ /* 91 warning: BC412 up to tbarcode 9, Code 32 for tbarcode 10+, mapped to Code 128 */
+ /* Note: non-zero table entries map silently, i.e. do not produce a warning */
+ #define LIB_ID_MAP_LAST 111
+ static const unsigned char id_map[LIB_ID_MAP_LAST + 1] = {
+ 0, 0, 0, 0, 0, /*0-4*/
+ BARCODE_C25STANDARD, 0, 0, 0, 0, /*5-9*/
+ BARCODE_EANX, BARCODE_EANX, BARCODE_EANX, 0, 0, /*10-14*/
+ BARCODE_EANX, 0, BARCODE_UPCA, 0, BARCODE_CODABAR, /*15-19*/
+ 0, 0, 0, 0, 0, /*20-24*/
+ 0, BARCODE_UPCA, 0, 0, 0, /*25-29*/
+ 0, 0, 0, BARCODE_GS1_128, 0, /*30-34*/
+ 0, BARCODE_UPCA, 0, 0, BARCODE_UPCE, /*35-39*/
+ 0, BARCODE_POSTNET, BARCODE_POSTNET, BARCODE_POSTNET, BARCODE_POSTNET, /*40-44*/
+ BARCODE_POSTNET, BARCODE_PLESSEY, 0, BARCODE_NVE18, 0, /*45-49*/
+ 0, 0, 0, 0, 0, /*50-54*/
+ 0, 0, 0, 0, BARCODE_CODE128, /*55-59*/
+ 0, BARCODE_CODE128, BARCODE_CODE93, 0, BARCODE_AUSPOST, /*60-64*/
+ BARCODE_AUSPOST, 0, 0, 0, 0, /*65-69*/
+ 0, 0, 0, 0, 0, /*70-74*/
+ 0, 0, 0, BARCODE_DBAR_OMN, 0, /*75-79*/
+ 0, 0, 0, BARCODE_PLANET, 0, /*80-84*/
+ 0, 0, 0, BARCODE_GS1_128, 0, /*85-89*/
+ 0, 0, 0, 0, 0, /*90-94*/
+ 0, 0, 0, 0, 0, /*95-99*/
+ BARCODE_HIBC_128, BARCODE_HIBC_39, 0, BARCODE_HIBC_DM, 0, /*100-104*/
+ BARCODE_HIBC_QR, 0, BARCODE_HIBC_PDF, 0, BARCODE_HIBC_MICPDF, /*105-109*/
+ 0, BARCODE_HIBC_BLOCKF, /*110-111*/
+ };
+ const int orig_symbology = symbol->symbology; /* For self-check */
+ int warn_number = 0;
+
+ if (symbol->symbology == 19) {
+ /* Has specific error message */
+ warn_number = error_tag(symbol, ZINT_WARN_INVALID_OPTION, "207: Codabar 18 not supported");
+ if (warn_number >= ZINT_ERROR) {
+ return warn_number;
+ }
+ symbol->symbology = BARCODE_CODABAR;
+ } else if (symbol->symbology == 27) {
+ /* Not mapped */
+ return error_tag(symbol, ZINT_ERROR_INVALID_OPTION, "208: UPCD1 not supported");
+
+ } else if (symbol->symbology <= 0 || symbol->symbology > LIB_ID_MAP_LAST || id_map[symbol->symbology] == 0) {
+ warn_number = error_tag(symbol, ZINT_WARN_INVALID_OPTION, "206: Symbology out of range");
+ if (warn_number >= ZINT_ERROR) {
+ return warn_number;
+ }
+ symbol->symbology = BARCODE_CODE128;
+ } else {
+ symbol->symbology = id_map[symbol->symbology];
+ }
+
+ if (symbol->symbology == orig_symbology) { /* Should never happen */
+ assert(0); /* Not reached */
+ return error_tag(symbol, ZINT_ERROR_ENCODING_PROBLEM, "000: Internal error");
+ }
+
+ return warn_number;
+}
+
/* Encode a barcode. If `length` is 0, `source` must be NUL-terminated */
int ZBarcode_Encode(struct zint_symbol *symbol, const unsigned char *source, int length) {
struct zint_seg segs[1];
@@ -925,12 +987,25 @@ int ZBarcode_Encode_Segs(struct zint_symbol *symbol, const struct zint_seg segs[
if (seg_count > ZINT_MAX_SEG_COUNT) {
return error_tag(symbol, ZINT_ERROR_INVALID_DATA, "771: Too many input segments (max 256)");
}
- local_segs = (struct zint_seg *) z_alloca(sizeof(struct zint_seg) * (seg_count > 0 ? seg_count : 1));
if ((symbol->input_mode & 0x07) > 2) {
- symbol->input_mode = DATA_MODE; /* Reset completely TODO: in future, warn/error */
+ symbol->input_mode = DATA_MODE; /* Reset completely */
+ warn_number = error_tag(symbol, ZINT_WARN_INVALID_OPTION, "212: Invalid input mode - reset to DATA_MODE");
+ if (warn_number >= ZINT_ERROR) {
+ return warn_number;
+ }
}
+ /* Check the symbology field */
+ if (!ZBarcode_ValidID(symbol->symbology)) {
+ warn_number = map_invalid_symbology(symbol);
+ if (warn_number >= ZINT_ERROR) {
+ return warn_number;
+ }
+ }
+
+ local_segs = (struct zint_seg *) z_alloca(sizeof(struct zint_seg) * (seg_count > 0 ? seg_count : 1));
+
/* Check segment lengths */
for (i = 0; i < seg_count; i++) {
local_segs[i] = segs[i];
@@ -943,9 +1018,8 @@ int ZBarcode_Encode_Segs(struct zint_symbol *symbol, const struct zint_seg segs[
}
if (local_segs[i].length <= 0) {
if (i == 0) {
- /* Note: should really be referencing the symbology only after the symbology check switch below */
- if (is_composite(symbol->symbology) &&
- ((symbol->input_mode & 0x07) == GS1_MODE || check_force_gs1(symbol->symbology))) {
+ if (is_composite(symbol->symbology)
+ && ((symbol->input_mode & 0x07) == GS1_MODE || check_force_gs1(symbol->symbology))) {
strcpy(symbol->errtxt, "779: No composite data in 2D component");
} else {
sprintf(symbol->errtxt, "778: No input data%s",
@@ -1015,111 +1089,6 @@ int ZBarcode_Encode_Segs(struct zint_symbol *symbol, const struct zint_seg segs[
}
}
- /* Check the symbology field */
- if (!ZBarcode_ValidID(symbol->symbology)) {
- int orig_symbology = symbol->symbology; /* For self-check */
- if (symbol->symbology < 1) {
- warn_number = error_tag(symbol, ZINT_WARN_INVALID_OPTION, "206: Symbology out of range");
- if (warn_number >= ZINT_ERROR) {
- return warn_number;
- }
- symbol->symbology = BARCODE_CODE128;
- /* symbol->symbologys 1 to 126 are defined by tbarcode */
- } else if (symbol->symbology == 5) {
- symbol->symbology = BARCODE_C25STANDARD;
- } else if ((symbol->symbology >= 10) && (symbol->symbology <= 12)) {
- symbol->symbology = BARCODE_EANX;
- } else if (symbol->symbology == 15) {
- symbol->symbology = BARCODE_EANX;
- } else if (symbol->symbology == 17) {
- symbol->symbology = BARCODE_UPCA;
- } else if (symbol->symbology == 19) {
- warn_number = error_tag(symbol, ZINT_WARN_INVALID_OPTION, "207: Codabar 18 not supported");
- if (warn_number >= ZINT_ERROR) {
- return warn_number;
- }
- symbol->symbology = BARCODE_CODABAR;
- } else if (symbol->symbology == 26) { /* UPC-A up to tbarcode 9, ISSN for tbarcode 10+ */
- symbol->symbology = BARCODE_UPCA;
- } else if (symbol->symbology == 27) { /* UPCD1 up to tbarcode 9, ISSN + 2 digit add-on for tbarcode 10+ */
- return error_tag(symbol, ZINT_ERROR_INVALID_OPTION, "208: UPCD1 not supported");
- } else if (symbol->symbology == 33) {
- symbol->symbology = BARCODE_GS1_128;
- } else if (symbol->symbology == 36) {
- symbol->symbology = BARCODE_UPCA;
- } else if (symbol->symbology == 39) {
- symbol->symbology = BARCODE_UPCE;
- } else if ((symbol->symbology >= 41) && (symbol->symbology <= 45)) {
- symbol->symbology = BARCODE_POSTNET;
- } else if (symbol->symbology == 46) {
- symbol->symbology = BARCODE_PLESSEY;
- } else if (symbol->symbology == 48) {
- symbol->symbology = BARCODE_NVE18;
- } else if ((symbol->symbology == 59) || (symbol->symbology == 61)) {
- symbol->symbology = BARCODE_CODE128;
- } else if (symbol->symbology == 62) {
- symbol->symbology = BARCODE_CODE93;
- } else if ((symbol->symbology == 64) || (symbol->symbology == 65)) {
- symbol->symbology = BARCODE_AUSPOST;
- } else if (symbol->symbology == 78) {
- symbol->symbology = BARCODE_DBAR_OMN;
- } else if (symbol->symbology == 83) {
- symbol->symbology = BARCODE_PLANET;
- } else if (symbol->symbology == 88) {
- symbol->symbology = BARCODE_GS1_128;
- } else if (symbol->symbology == 91) { /* BC412 up to tbarcode 9, Code 32 for tbarcode 10+ */
- warn_number = error_tag(symbol, ZINT_WARN_INVALID_OPTION, "212: Symbology out of range");
- if (warn_number >= ZINT_ERROR) {
- return warn_number;
- }
- symbol->symbology = BARCODE_CODE128;
- } else if ((symbol->symbology >= 94) && (symbol->symbology <= 95)) {
- warn_number = error_tag(symbol, ZINT_WARN_INVALID_OPTION, "213: Symbology out of range");
- if (warn_number >= ZINT_ERROR) {
- return warn_number;
- }
- symbol->symbology = BARCODE_CODE128;
- } else if (symbol->symbology == 100) {
- symbol->symbology = BARCODE_HIBC_128;
- } else if (symbol->symbology == 101) {
- symbol->symbology = BARCODE_HIBC_39;
- } else if (symbol->symbology == 103) {
- symbol->symbology = BARCODE_HIBC_DM;
- } else if (symbol->symbology == 105) {
- symbol->symbology = BARCODE_HIBC_QR;
- } else if (symbol->symbology == 107) {
- symbol->symbology = BARCODE_HIBC_PDF;
- } else if (symbol->symbology == 109) {
- symbol->symbology = BARCODE_HIBC_MICPDF;
- } else if (symbol->symbology == 111) {
- symbol->symbology = BARCODE_HIBC_BLOCKF;
- } else if ((symbol->symbology == 113) || (symbol->symbology == 114)) {
- warn_number = error_tag(symbol, ZINT_WARN_INVALID_OPTION, "214: Symbology out of range");
- if (warn_number >= ZINT_ERROR) {
- return warn_number;
- }
- symbol->symbology = BARCODE_CODE128;
- } else if ((symbol->symbology >= 117) && (symbol->symbology <= 127)) {
- if (symbol->symbology < 119 || symbol->symbology > 121) { /* BARCODE_MAILMARK_2D/4S/UPU_S10 */
- warn_number = error_tag(symbol, ZINT_WARN_INVALID_OPTION, "215: Symbology out of range");
- if (warn_number >= ZINT_ERROR) {
- return warn_number;
- }
- symbol->symbology = BARCODE_CODE128;
- }
- /* Everything from 128 up is Zint-specific */
- } else if (symbol->symbology > BARCODE_LAST) {
- warn_number = error_tag(symbol, ZINT_WARN_INVALID_OPTION, "216: Symbology out of range");
- if (warn_number >= ZINT_ERROR) {
- return warn_number;
- }
- symbol->symbology = BARCODE_CODE128;
- }
- if (symbol->symbology == orig_symbology) { /* Should never happen */
- return error_tag(symbol, ZINT_ERROR_ENCODING_PROBLEM, "000: Internal error"); /* Not reached */
- }
- }
-
if (seg_count > 1 && !supports_eci(symbol->symbology)) {
return error_tag(symbol, ZINT_ERROR_INVALID_OPTION, "775: Symbology does not support multiple segments");
}
@@ -1624,165 +1593,44 @@ int ZBarcode_ValidID(int symbol_id) {
return 0;
}
- return barcode_funcs[symbol_id] != NULL;
+ return barcode_src_funcs[symbol_id] != NULL
+ || (symbol_id >= LIB_SEG_FUNCS_START && barcode_seg_funcs[symbol_id - LIB_SEG_FUNCS_START] != NULL);
}
/* Copy BARCODE_XXX name of `symbol_id` into `name` buffer, NUL-terminated.
- Returns 0 if valid, non-zero (1 or -1) if not valid */
+ Returns 0 if valid, 1 if not valid */
int ZBarcode_BarcodeName(int symbol_id, char name[32]) {
- struct item {
- const char *name;
- int define;
- int val;
- };
- static const struct item data[] = {
- { "", -1, 0 },
- { "BARCODE_CODE11", BARCODE_CODE11, 1 },
- { "BARCODE_C25STANDARD", BARCODE_C25STANDARD, 2 },
- { "BARCODE_C25INTER", BARCODE_C25INTER, 3 },
- { "BARCODE_C25IATA", BARCODE_C25IATA, 4 },
- { "", -1, 5 },
- { "BARCODE_C25LOGIC", BARCODE_C25LOGIC, 6 },
- { "BARCODE_C25IND", BARCODE_C25IND, 7 },
- { "BARCODE_CODE39", BARCODE_CODE39, 8 },
- { "BARCODE_EXCODE39", BARCODE_EXCODE39, 9 },
- { "", -1, 10 },
- { "", -1, 11 },
- { "", -1, 12 },
- { "BARCODE_EANX", BARCODE_EANX, 13 },
- { "BARCODE_EANX_CHK", BARCODE_EANX_CHK, 14 },
- { "", -1, 15 },
- { "BARCODE_GS1_128", BARCODE_GS1_128, 16 },
- { "", -1, 17 },
- { "BARCODE_CODABAR", BARCODE_CODABAR, 18 },
- { "", -1, 19 },
- { "BARCODE_CODE128", BARCODE_CODE128, 20 },
- { "BARCODE_DPLEIT", BARCODE_DPLEIT, 21 },
- { "BARCODE_DPIDENT", BARCODE_DPIDENT, 22 },
- { "BARCODE_CODE16K", BARCODE_CODE16K, 23 },
- { "BARCODE_CODE49", BARCODE_CODE49, 24 },
- { "BARCODE_CODE93", BARCODE_CODE93, 25 },
- { "", -1, 26 },
- { "", -1, 27 },
- { "BARCODE_FLAT", BARCODE_FLAT, 28 },
- { "BARCODE_DBAR_OMN", BARCODE_DBAR_OMN, 29 },
- { "BARCODE_DBAR_LTD", BARCODE_DBAR_LTD, 30 },
- { "BARCODE_DBAR_EXP", BARCODE_DBAR_EXP, 31 },
- { "BARCODE_TELEPEN", BARCODE_TELEPEN, 32 },
- { "", -1, 33 },
- { "BARCODE_UPCA", BARCODE_UPCA, 34 },
- { "BARCODE_UPCA_CHK", BARCODE_UPCA_CHK, 35 },
- { "", -1, 36 },
- { "BARCODE_UPCE", BARCODE_UPCE, 37 },
- { "BARCODE_UPCE_CHK", BARCODE_UPCE_CHK, 38 },
- { "", -1, 39 },
- { "BARCODE_POSTNET", BARCODE_POSTNET, 40 },
- { "", -1, 41 },
- { "", -1, 42 },
- { "", -1, 43 },
- { "", -1, 44 },
- { "", -1, 45 },
- { "", -1, 46 },
- { "BARCODE_MSI_PLESSEY", BARCODE_MSI_PLESSEY, 47 },
- { "", -1, 48 },
- { "BARCODE_FIM", BARCODE_FIM, 49 },
- { "BARCODE_LOGMARS", BARCODE_LOGMARS, 50 },
- { "BARCODE_PHARMA", BARCODE_PHARMA, 51 },
- { "BARCODE_PZN", BARCODE_PZN, 52 },
- { "BARCODE_PHARMA_TWO", BARCODE_PHARMA_TWO, 53 },
- { "BARCODE_CEPNET", BARCODE_CEPNET, 54 },
- { "BARCODE_PDF417", BARCODE_PDF417, 55 },
- { "BARCODE_PDF417COMP", BARCODE_PDF417COMP, 56 },
- { "BARCODE_MAXICODE", BARCODE_MAXICODE, 57 },
- { "BARCODE_QRCODE", BARCODE_QRCODE, 58 },
- { "", -1, 59 },
- { "BARCODE_CODE128AB", BARCODE_CODE128AB, 60 },
- { "", -1, 61 },
- { "", -1, 62 },
- { "BARCODE_AUSPOST", BARCODE_AUSPOST, 63 },
- { "", -1, 64 },
- { "", -1, 65 },
- { "BARCODE_AUSREPLY", BARCODE_AUSREPLY, 66 },
- { "BARCODE_AUSROUTE", BARCODE_AUSROUTE, 67 },
- { "BARCODE_AUSREDIRECT", BARCODE_AUSREDIRECT, 68 },
- { "BARCODE_ISBNX", BARCODE_ISBNX, 69 },
- { "BARCODE_RM4SCC", BARCODE_RM4SCC, 70 },
- { "BARCODE_DATAMATRIX", BARCODE_DATAMATRIX, 71 },
- { "BARCODE_EAN14", BARCODE_EAN14, 72 },
- { "BARCODE_VIN", BARCODE_VIN, 73 },
- { "BARCODE_CODABLOCKF", BARCODE_CODABLOCKF, 74 },
- { "BARCODE_NVE18", BARCODE_NVE18, 75 },
- { "BARCODE_JAPANPOST", BARCODE_JAPANPOST, 76 },
- { "BARCODE_KOREAPOST", BARCODE_KOREAPOST, 77 },
- { "", -1, 78 },
- { "BARCODE_DBAR_STK", BARCODE_DBAR_STK, 79 },
- { "BARCODE_DBAR_OMNSTK", BARCODE_DBAR_OMNSTK, 80 },
- { "BARCODE_DBAR_EXPSTK", BARCODE_DBAR_EXPSTK, 81 },
- { "BARCODE_PLANET", BARCODE_PLANET, 82 },
- { "", -1, 83 },
- { "BARCODE_MICROPDF417", BARCODE_MICROPDF417, 84 },
- { "BARCODE_USPS_IMAIL", BARCODE_USPS_IMAIL, 85 },
- { "BARCODE_PLESSEY", BARCODE_PLESSEY, 86 },
- { "BARCODE_TELEPEN_NUM", BARCODE_TELEPEN_NUM, 87 },
- { "", -1, 88 },
- { "BARCODE_ITF14", BARCODE_ITF14, 89 },
- { "BARCODE_KIX", BARCODE_KIX, 90 },
- { "", -1, 91 },
- { "BARCODE_AZTEC", BARCODE_AZTEC, 92 },
- { "BARCODE_DAFT", BARCODE_DAFT, 93 },
- { "", -1, 94 },
- { "", -1, 95 },
- { "BARCODE_DPD", BARCODE_DPD, 96 },
- { "BARCODE_MICROQR", BARCODE_MICROQR, 97 },
- { "BARCODE_HIBC_128", BARCODE_HIBC_128, 98 },
- { "BARCODE_HIBC_39", BARCODE_HIBC_39, 99 },
- { "", -1, 100 },
- { "", -1, 101 },
- { "BARCODE_HIBC_DM", BARCODE_HIBC_DM, 102 },
- { "", -1, 103 },
- { "BARCODE_HIBC_QR", BARCODE_HIBC_QR, 104 },
- { "", -1, 105 },
- { "BARCODE_HIBC_PDF", BARCODE_HIBC_PDF, 106 },
- { "", -1, 107 },
- { "BARCODE_HIBC_MICPDF", BARCODE_HIBC_MICPDF, 108 },
- { "", -1, 109 },
- { "BARCODE_HIBC_BLOCKF", BARCODE_HIBC_BLOCKF, 110 },
- { "", -1, 111 },
- { "BARCODE_HIBC_AZTEC", BARCODE_HIBC_AZTEC, 112 },
- { "", -1, 113 },
- { "", -1, 114 },
- { "BARCODE_DOTCODE", BARCODE_DOTCODE, 115 },
- { "BARCODE_HANXIN", BARCODE_HANXIN, 116 },
- { "", -1, 117 },
- { "", -1, 118 },
- { "BARCODE_MAILMARK_2D", BARCODE_MAILMARK_2D, 119 },
- { "BARCODE_UPU_S10", BARCODE_UPU_S10, 120 },
- { "BARCODE_MAILMARK_4S", BARCODE_MAILMARK_4S, 121 },
- { "", -1, 122 },
- { "", -1, 123 },
- { "", -1, 124 },
- { "", -1, 125 },
- { "", -1, 126 },
- { "", -1, 127 },
- { "BARCODE_AZRUNE", BARCODE_AZRUNE, 128 },
- { "BARCODE_CODE32", BARCODE_CODE32, 129 },
- { "BARCODE_EANX_CC", BARCODE_EANX_CC, 130 },
- { "BARCODE_GS1_128_CC", BARCODE_GS1_128_CC, 131 },
- { "BARCODE_DBAR_OMN_CC", BARCODE_DBAR_OMN_CC, 132 },
- { "BARCODE_DBAR_LTD_CC", BARCODE_DBAR_LTD_CC, 133 },
- { "BARCODE_DBAR_EXP_CC", BARCODE_DBAR_EXP_CC, 134 },
- { "BARCODE_UPCA_CC", BARCODE_UPCA_CC, 135 },
- { "BARCODE_UPCE_CC", BARCODE_UPCE_CC, 136 },
- { "BARCODE_DBAR_STK_CC", BARCODE_DBAR_STK_CC, 137 },
- { "BARCODE_DBAR_OMNSTK_CC", BARCODE_DBAR_OMNSTK_CC, 138 },
- { "BARCODE_DBAR_EXPSTK_CC", BARCODE_DBAR_EXPSTK_CC, 139 },
- { "BARCODE_CHANNEL", BARCODE_CHANNEL, 140 },
- { "BARCODE_CODEONE", BARCODE_CODEONE, 141 },
- { "BARCODE_GRIDMATRIX", BARCODE_GRIDMATRIX, 142 },
- { "BARCODE_UPNQR", BARCODE_UPNQR, 143 },
- { "BARCODE_ULTRA", BARCODE_ULTRA, 144 },
- { "BARCODE_RMQR", BARCODE_RMQR, 145 },
- { "BARCODE_BC412", BARCODE_BC412, 146 },
+ static const char *const names[] = {
+ "", "CODE11", "C25STANDARD", "C25INTER", "C25IATA", /*0-4*/
+ "", "C25LOGIC", "C25IND", "CODE39", "EXCODE39", /*5-9*/
+ "", "", "", "EANX", "EANX_CHK", /*10-14*/
+ "", "GS1_128", "", "CODABAR", "", /*15-19*/
+ "CODE128", "DPLEIT", "DPIDENT", "CODE16K", "CODE49", /*20-24*/
+ "CODE93", "", "", "FLAT", "DBAR_OMN", /*25-29*/
+ "DBAR_LTD", "DBAR_EXP", "TELEPEN", "", "UPCA", /*30-34*/
+ "UPCA_CHK", "", "UPCE", "UPCE_CHK", "", /*35-39*/
+ "POSTNET", "", "", "", "", /*40-44*/
+ "", "", "MSI_PLESSEY", "", "FIM", /*45-49*/
+ "LOGMARS", "PHARMA", "PZN", "PHARMA_TWO", "CEPNET", /*50-54*/
+ "PDF417", "PDF417COMP", "MAXICODE", "QRCODE", "", /*55-59*/
+ "CODE128AB", "", "", "AUSPOST", "", /*60-64*/
+ "", "AUSREPLY", "AUSROUTE", "AUSREDIRECT", "ISBNX", /*65-69*/
+ "RM4SCC", "DATAMATRIX", "EAN14", "VIN", "CODABLOCKF", /*70-74*/
+ "NVE18", "JAPANPOST", "KOREAPOST", "", "DBAR_STK", /*75-79*/
+ "DBAR_OMNSTK", "DBAR_EXPSTK", "PLANET", "", "MICROPDF417", /*80-84*/
+ "USPS_IMAIL", "PLESSEY", "TELEPEN_NUM", "", "ITF14", /*85-89*/
+ "KIX", "", "AZTEC", "DAFT", "", /*90-94*/
+ "", "DPD", "MICROQR", "HIBC_128", "HIBC_39", /*95-99*/
+ "", "", "HIBC_DM", "", "HIBC_QR", /*100-104*/
+ "", "HIBC_PDF", "", "HIBC_MICPDF", "", /*105-109*/
+ "HIBC_BLOCKF", "", "HIBC_AZTEC", "", "", /*110-114*/
+ "DOTCODE", "HANXIN", "", "", "MAILMARK_2D", /*115-119*/
+ "UPU_S10", "MAILMARK_4S", "", "", "", /*120-124*/
+ "", "", "", "AZRUNE", "CODE32", /*125-129*/
+ "EANX_CC", "GS1_128_CC", "DBAR_OMN_CC", "DBAR_LTD_CC", "DBAR_EXP_CC", /*130-134*/
+ "UPCA_CC", "UPCE_CC", "DBAR_STK_CC", "DBAR_OMNSTK_CC", "DBAR_EXPSTK_CC", /*135-139*/
+ "CHANNEL", "CODEONE", "GRIDMATRIX", "UPNQR", "ULTRA", /*140-144*/
+ "RMQR", "BC412", /*145-146*/
};
name[0] = '\0';
@@ -1790,15 +1638,10 @@ int ZBarcode_BarcodeName(int symbol_id, char name[32]) {
if (!ZBarcode_ValidID(symbol_id)) {
return 1;
}
- assert(symbol_id >= 0 && symbol_id < ARRAY_SIZE(data) && data[symbol_id].name[0]);
+ assert(symbol_id >= 0 && symbol_id < ARRAY_SIZE(names) && names[symbol_id][0]);
- /* Self-check, shouldn't happen */
- if (data[symbol_id].val != symbol_id || (data[symbol_id].define != -1 && data[symbol_id].define != symbol_id)) {
- assert(0); /* Not reached */
- return -1;
- }
-
- strcpy(name, data[symbol_id].name);
+ memcpy(name, "BARCODE_", 8);
+ strcpy(name + 8, names[symbol_id]);
return 0;
}
@@ -2210,11 +2053,11 @@ int ZBarcode_NoPng(void) {
/* Return the version of Zint linked to */
int ZBarcode_Version(void) {
- if (ZINT_VERSION_BUILD) {
- return (ZINT_VERSION_MAJOR * 10000) + (ZINT_VERSION_MINOR * 100) + ZINT_VERSION_RELEASE * 10
- + ZINT_VERSION_BUILD;
- }
+#if ZINT_VERSION_BUILD
+ return (ZINT_VERSION_MAJOR * 10000) + (ZINT_VERSION_MINOR * 100) + ZINT_VERSION_RELEASE * 10 + ZINT_VERSION_BUILD;
+#else
return (ZINT_VERSION_MAJOR * 10000) + (ZINT_VERSION_MINOR * 100) + ZINT_VERSION_RELEASE;
+#endif
}
/* vim: set ts=4 sw=4 et : */
diff --git a/backend/output.h b/backend/output.h
index 3dc18f59..a995eb00 100644
--- a/backend/output.h
+++ b/backend/output.h
@@ -113,11 +113,13 @@ INTERNAL FILE *out_win_fopen(const char *filename, const char *mode);
bp[3] = (unsigned char) ((*p_u32 >> 24) & 0xFF); \
} while (0)
-/* For more portability, use `#pragma pack()` pair for MSCV, per-type packed attribute otherwise */
-#ifdef _MSC_VER
-# define OUT_PACK
+/* If `#pragma pack()` not supported, try per-type packed attribute */
+#ifdef __COMPCERT__
+/* Can't use `__attribute__` as may be defined to be no-op by libc if not GNU C or Clang (e.g. glibc does this) */
+# define OUT_PACK __attribute((__packed__)) /* CompCert C workaround extension `__attribute` */
#else
-# define OUT_PACK __attribute__((__packed__))
+# define OUT_USE_PRAGMA_PACK
+# define OUT_PACK
#endif
#ifdef __cplusplus
diff --git a/backend/pcx.h b/backend/pcx.h
index 3debb3db..39b001ce 100644
--- a/backend/pcx.h
+++ b/backend/pcx.h
@@ -1,7 +1,7 @@
/* pcx.h - header structure for ZSoft PCX files */
/*
libzint - the open source barcode library
- Copyright (C) 2016-2022 Robin Stuart
+ Copyright (C) 2016-2024 Robin Stuart
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
@@ -37,7 +37,7 @@
extern "C" {
#endif
-#ifdef _MSC_VER
+#ifdef OUT_USE_PRAGMA_PACK
#pragma pack(1)
#endif
@@ -62,7 +62,7 @@ extern "C" {
uint8_t filler[54];
} OUT_PACK pcx_header_t;
-#ifdef _MSC_VER
+#ifdef OUT_USE_PRAGMA_PACK
#pragma pack()
#endif
diff --git a/backend/pdf417.c b/backend/pdf417.c
index 285c4aa6..6742f6c0 100644
--- a/backend/pdf417.c
+++ b/backend/pdf417.c
@@ -68,7 +68,7 @@ static const char pdf_smodes[] = { '?', 'A', 'L', 'M', 'P', 'B', 'N' };
/* Return (real) mode text */
static const char *pdf_mode_str(const int mode) {
- static const char *modes[3] = { "Text", "Byte", "Number" };
+ static const char modes[3][7] = { "Text", "Byte", "Number" };
return mode >= PDF_TEX && mode <= PDF_NUM ? modes[mode - PDF_TEX] : "ERROR";
}
diff --git a/backend/ps.c b/backend/ps.c
index 21ffd71c..16ca75c7 100644
--- a/backend/ps.c
+++ b/backend/ps.c
@@ -1,7 +1,7 @@
/* ps.c - Post Script output */
/*
libzint - the open source barcode library
- Copyright (C) 2009-2023 Robin Stuart
+ Copyright (C) 2009-2024 Robin Stuart
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
@@ -265,12 +265,11 @@ INTERNAL int ps_plot(struct zint_symbol *symbol) {
/* Start writing the header */
fm_puts("%!PS-Adobe-3.0 EPSF-3.0\n"
"%%Creator: Zint ", fmp);
- if (ZINT_VERSION_BUILD) {
- fm_printf(fmp, "%d.%d.%d.%d\n",
- ZINT_VERSION_MAJOR, ZINT_VERSION_MINOR, ZINT_VERSION_RELEASE, ZINT_VERSION_BUILD);
- } else {
- fm_printf(fmp, "%d.%d.%d\n", ZINT_VERSION_MAJOR, ZINT_VERSION_MINOR, ZINT_VERSION_RELEASE);
- }
+#if ZINT_VERSION_BUILD
+ fm_printf(fmp, "%d.%d.%d.%d\n", ZINT_VERSION_MAJOR, ZINT_VERSION_MINOR, ZINT_VERSION_RELEASE, ZINT_VERSION_BUILD);
+#else
+ fm_printf(fmp, "%d.%d.%d\n", ZINT_VERSION_MAJOR, ZINT_VERSION_MINOR, ZINT_VERSION_RELEASE);
+#endif
fm_puts("%%Title: Zint Generated Symbol\n"
"%%Pages: 0\n"
"%%BoundingBox: 0 0 ", fmp);
diff --git a/backend/qr.c b/backend/qr.c
index e0ee8cc3..9c03ddea 100644
--- a/backend/qr.c
+++ b/backend/qr.c
@@ -383,7 +383,7 @@ static int qr_cci_bits(const int version, const int mode) {
{ 5, 4, 4, 3, },
{ 6, 5, 5, 4, }
};
- static const unsigned char *rmqr_ccis[QR_NUM_MODES] = {
+ static const unsigned char *const rmqr_ccis[QR_NUM_MODES] = {
rmqr_numeric_cci, rmqr_alphanum_cci, rmqr_byte_cci, rmqr_kanji_cci,
};
int mode_index = posn(qr_mode_types, (const char) mode);
diff --git a/backend/tests/test_aztec.c b/backend/tests/test_aztec.c
index dc3ffc6a..08ddabb0 100644
--- a/backend/tests/test_aztec.c
+++ b/backend/tests/test_aztec.c
@@ -257,7 +257,7 @@ static void test_options(const testCtx *const p_ctx) {
/* 15*/ { BARCODE_AZRUNE, -1, -1, -1, -1, { 0, 0, "" }, "A", ZINT_ERROR_INVALID_DATA, -1, -1, "Error 508: Invalid character in data (digits only)" },
/* 16*/ { BARCODE_AZRUNE, -1, -1, -1, -1, { 0, 0, "" }, "256", ZINT_ERROR_INVALID_DATA, -1, -1, "Error 509: Input out of range (0 to 255)" },
/* 17*/ { BARCODE_AZTEC, -1, -1, -1, -1, { 1, 2, "" }, "1234567890", 0, 15, 15, "" },
- /* 18*/ { BARCODE_AZTEC, -1, -1, -1, -1, { 1, 2, "12345678901234567890123456789012" }, "1234567890", 0, 23, 23, "" },
+ /* 18*/ { BARCODE_AZTEC, -1, -1, -1, -1, { 1, 2, {'1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2'} }, "1234567890", 0, 23, 23, "" },
/* 19*/ { BARCODE_AZTEC, -1, -1, -1, -1, { 1, 1, "" }, "1234567890", ZINT_ERROR_INVALID_OPTION, -1, -1, "Error 701: Structured Append count out of range (2-26)" },
/* 20*/ { BARCODE_AZTEC, -1, -1, -1, -1, { 0, 2, "" }, "1234567890", ZINT_ERROR_INVALID_OPTION, -1, -1, "Error 702: Structured Append index out of range (1-2)" },
/* 21*/ { BARCODE_AZTEC, -1, -1, -1, -1, { 3, 2, "" }, "1234567890", ZINT_ERROR_INVALID_OPTION, -1, -1, "Error 702: Structured Append index out of range (1-2)" },
diff --git a/backend/tests/test_library.c b/backend/tests/test_library.c
index 7a4fe08e..c8adf11b 100644
--- a/backend/tests/test_library.c
+++ b/backend/tests/test_library.c
@@ -151,12 +151,12 @@ static void test_checks(const testCtx *const p_ctx) {
/* 87*/ { 88, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, -1, ZINT_ERROR_INVALID_DATA, "Error 252: Data does not start with an AI", BARCODE_GS1_128 },
/* 88*/ { 88, -1, "[10]12", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, -1, 0, "", BARCODE_GS1_128 },
/* 89*/ { 88, -1, "[10]12", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, WARN_FAIL_ALL, 0, "", BARCODE_GS1_128 },
- /* 90*/ { 91, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, -1, ZINT_WARN_INVALID_OPTION, "Warning 212: Symbology out of range", BARCODE_CODE128 },
- /* 91*/ { 91, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, WARN_FAIL_ALL, ZINT_ERROR_INVALID_OPTION, "Error 212: Symbology out of range", -1 },
- /* 92*/ { 94, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, -1, ZINT_WARN_INVALID_OPTION, "Warning 213: Symbology out of range", BARCODE_CODE128 },
- /* 93*/ { 94, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, WARN_FAIL_ALL, ZINT_ERROR_INVALID_OPTION, "Error 213: Symbology out of range", -1 },
- /* 94*/ { 95, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, -1, ZINT_WARN_INVALID_OPTION, "Warning 213: Symbology out of range", BARCODE_CODE128 },
- /* 95*/ { 95, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, WARN_FAIL_ALL, ZINT_ERROR_INVALID_OPTION, "Error 213: Symbology out of range", -1 },
+ /* 90*/ { 91, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, -1, ZINT_WARN_INVALID_OPTION, "Warning 206: Symbology out of range", BARCODE_CODE128 },
+ /* 91*/ { 91, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, WARN_FAIL_ALL, ZINT_ERROR_INVALID_OPTION, "Error 206: Symbology out of range", -1 },
+ /* 92*/ { 94, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, -1, ZINT_WARN_INVALID_OPTION, "Warning 206: Symbology out of range", BARCODE_CODE128 },
+ /* 93*/ { 94, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, WARN_FAIL_ALL, ZINT_ERROR_INVALID_OPTION, "Error 206: Symbology out of range", -1 },
+ /* 94*/ { 95, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, -1, ZINT_WARN_INVALID_OPTION, "Warning 206: Symbology out of range", BARCODE_CODE128 },
+ /* 95*/ { 95, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, WARN_FAIL_ALL, ZINT_ERROR_INVALID_OPTION, "Error 206: Symbology out of range", -1 },
/* 96*/ { 100, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, -1, 0, "", BARCODE_HIBC_128 },
/* 97*/ { 100, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, WARN_FAIL_ALL, 0, "", BARCODE_HIBC_128 },
/* 98*/ { 101, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, -1, 0, "", BARCODE_HIBC_39 },
@@ -171,30 +171,30 @@ static void test_checks(const testCtx *const p_ctx) {
/*107*/ { 109, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, WARN_FAIL_ALL, 0, "", BARCODE_HIBC_MICPDF },
/*108*/ { 111, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, -1, 0, "", BARCODE_HIBC_BLOCKF },
/*109*/ { 111, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, WARN_FAIL_ALL, 0, "", BARCODE_HIBC_BLOCKF },
- /*110*/ { 113, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, -1, ZINT_WARN_INVALID_OPTION, "Warning 214: Symbology out of range", BARCODE_CODE128 },
- /*111*/ { 113, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, WARN_FAIL_ALL, ZINT_ERROR_INVALID_OPTION, "Error 214: Symbology out of range", -1 },
- /*112*/ { 114, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, -1, ZINT_WARN_INVALID_OPTION, "Warning 214: Symbology out of range", BARCODE_CODE128 },
- /*113*/ { 114, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, WARN_FAIL_ALL, ZINT_ERROR_INVALID_OPTION, "Error 214: Symbology out of range", -1 },
- /*114*/ { 117, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, -1, ZINT_WARN_INVALID_OPTION, "Warning 215: Symbology out of range", BARCODE_CODE128 },
- /*115*/ { 117, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, WARN_FAIL_ALL, ZINT_ERROR_INVALID_OPTION, "Error 215: Symbology out of range", -1 },
- /*116*/ { 118, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, -1, ZINT_WARN_INVALID_OPTION, "Warning 215: Symbology out of range", BARCODE_CODE128 },
- /*117*/ { 118, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, WARN_FAIL_ALL, ZINT_ERROR_INVALID_OPTION, "Error 215: Symbology out of range", -1 },
- /*118*/ { 122, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, -1, ZINT_WARN_INVALID_OPTION, "Warning 215: Symbology out of range", BARCODE_CODE128 },
- /*119*/ { 122, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, WARN_FAIL_ALL, ZINT_ERROR_INVALID_OPTION, "Error 215: Symbology out of range", -1 },
- /*120*/ { 123, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, -1, ZINT_WARN_INVALID_OPTION, "Warning 215: Symbology out of range", BARCODE_CODE128 },
- /*121*/ { 123, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, WARN_FAIL_ALL, ZINT_ERROR_INVALID_OPTION, "Error 215: Symbology out of range", -1 },
- /*122*/ { 124, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, -1, ZINT_WARN_INVALID_OPTION, "Warning 215: Symbology out of range", BARCODE_CODE128 },
- /*123*/ { 124, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, WARN_FAIL_ALL, ZINT_ERROR_INVALID_OPTION, "Error 215: Symbology out of range", -1 },
- /*124*/ { 125, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, -1, ZINT_WARN_INVALID_OPTION, "Warning 215: Symbology out of range", BARCODE_CODE128 },
- /*125*/ { 125, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, WARN_FAIL_ALL, ZINT_ERROR_INVALID_OPTION, "Error 215: Symbology out of range", -1 },
- /*126*/ { 126, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, -1, ZINT_WARN_INVALID_OPTION, "Warning 215: Symbology out of range", BARCODE_CODE128 },
- /*127*/ { 126, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, WARN_FAIL_ALL, ZINT_ERROR_INVALID_OPTION, "Error 215: Symbology out of range", -1 },
- /*128*/ { 127, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, -1, ZINT_WARN_INVALID_OPTION, "Warning 215: Symbology out of range", BARCODE_CODE128 },
- /*129*/ { 127, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, WARN_FAIL_ALL, ZINT_ERROR_INVALID_OPTION, "Error 215: Symbology out of range", -1 },
- /*130*/ { 147, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, -1, ZINT_WARN_INVALID_OPTION, "Warning 216: Symbology out of range", BARCODE_CODE128 },
- /*131*/ { 147, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, WARN_FAIL_ALL, ZINT_ERROR_INVALID_OPTION, "Error 216: Symbology out of range", -1 },
- /*132*/ { BARCODE_LAST + 1, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, -1, ZINT_WARN_INVALID_OPTION, "Warning 216: Symbology out of range", BARCODE_CODE128 },
- /*133*/ { BARCODE_LAST + 1, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, WARN_FAIL_ALL, ZINT_ERROR_INVALID_OPTION, "Error 216: Symbology out of range", -1 },
+ /*110*/ { 113, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, -1, ZINT_WARN_INVALID_OPTION, "Warning 206: Symbology out of range", BARCODE_CODE128 },
+ /*111*/ { 113, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, WARN_FAIL_ALL, ZINT_ERROR_INVALID_OPTION, "Error 206: Symbology out of range", -1 },
+ /*112*/ { 114, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, -1, ZINT_WARN_INVALID_OPTION, "Warning 206: Symbology out of range", BARCODE_CODE128 },
+ /*113*/ { 114, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, WARN_FAIL_ALL, ZINT_ERROR_INVALID_OPTION, "Error 206: Symbology out of range", -1 },
+ /*114*/ { 117, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, -1, ZINT_WARN_INVALID_OPTION, "Warning 206: Symbology out of range", BARCODE_CODE128 },
+ /*115*/ { 117, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, WARN_FAIL_ALL, ZINT_ERROR_INVALID_OPTION, "Error 206: Symbology out of range", -1 },
+ /*116*/ { 118, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, -1, ZINT_WARN_INVALID_OPTION, "Warning 206: Symbology out of range", BARCODE_CODE128 },
+ /*117*/ { 118, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, WARN_FAIL_ALL, ZINT_ERROR_INVALID_OPTION, "Error 206: Symbology out of range", -1 },
+ /*118*/ { 122, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, -1, ZINT_WARN_INVALID_OPTION, "Warning 206: Symbology out of range", BARCODE_CODE128 },
+ /*119*/ { 122, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, WARN_FAIL_ALL, ZINT_ERROR_INVALID_OPTION, "Error 206: Symbology out of range", -1 },
+ /*120*/ { 123, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, -1, ZINT_WARN_INVALID_OPTION, "Warning 206: Symbology out of range", BARCODE_CODE128 },
+ /*121*/ { 123, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, WARN_FAIL_ALL, ZINT_ERROR_INVALID_OPTION, "Error 206: Symbology out of range", -1 },
+ /*122*/ { 124, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, -1, ZINT_WARN_INVALID_OPTION, "Warning 206: Symbology out of range", BARCODE_CODE128 },
+ /*123*/ { 124, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, WARN_FAIL_ALL, ZINT_ERROR_INVALID_OPTION, "Error 206: Symbology out of range", -1 },
+ /*124*/ { 125, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, -1, ZINT_WARN_INVALID_OPTION, "Warning 206: Symbology out of range", BARCODE_CODE128 },
+ /*125*/ { 125, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, WARN_FAIL_ALL, ZINT_ERROR_INVALID_OPTION, "Error 206: Symbology out of range", -1 },
+ /*126*/ { 126, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, -1, ZINT_WARN_INVALID_OPTION, "Warning 206: Symbology out of range", BARCODE_CODE128 },
+ /*127*/ { 126, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, WARN_FAIL_ALL, ZINT_ERROR_INVALID_OPTION, "Error 206: Symbology out of range", -1 },
+ /*128*/ { 127, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, -1, ZINT_WARN_INVALID_OPTION, "Warning 206: Symbology out of range", BARCODE_CODE128 },
+ /*129*/ { 127, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, WARN_FAIL_ALL, ZINT_ERROR_INVALID_OPTION, "Error 206: Symbology out of range", -1 },
+ /*130*/ { 147, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, -1, ZINT_WARN_INVALID_OPTION, "Warning 206: Symbology out of range", BARCODE_CODE128 },
+ /*131*/ { 147, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, WARN_FAIL_ALL, ZINT_ERROR_INVALID_OPTION, "Error 206: Symbology out of range", -1 },
+ /*132*/ { BARCODE_LAST + 1, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, -1, ZINT_WARN_INVALID_OPTION, "Warning 206: Symbology out of range", BARCODE_CODE128 },
+ /*133*/ { BARCODE_LAST + 1, -1, "1", -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, -1, WARN_FAIL_ALL, ZINT_ERROR_INVALID_OPTION, "Error 206: Symbology out of range", -1 },
/*134*/ { BARCODE_CODE128, -1, "\200", -1, UNICODE_MODE, -1, 0, 0, 0, 0, -1, -1, 0, -1, -1, ZINT_ERROR_INVALID_DATA, "Error 245: Invalid UTF-8 in input data", -1 },
/*135*/ { BARCODE_GS1_128, -1, "[01]12345678901234", -1, GS1_MODE, -1, 0, 0, 0, 0, -1, -1, 0, -1, -1, ZINT_WARN_NONCOMPLIANT, "Warning 261: AI (01) position 14: Bad checksum '4', expected '1'", -1 },
/*136*/ { BARCODE_GS1_128, -1, "[01]12345678901234", -1, GS1_MODE, -1, 0, 0, 0, 0, -1, -1, 0, -1, WARN_FAIL_ALL, ZINT_ERROR_NONCOMPLIANT, "Error 261: AI (01) position 14: Bad checksum '4', expected '1'", -1 },
@@ -394,6 +394,95 @@ static void test_input_data(const testCtx *const p_ctx) {
testFinish();
}
+static int test_prev_map_invalid_symbology(int *p_symbology) {
+ int symbology = *p_symbology;
+ int warn_number = 0;
+
+ if (symbology < 1) {
+ warn_number = ZINT_WARN_INVALID_OPTION;
+ symbology = BARCODE_CODE128;
+ /* symbol->symbologys 1 to 126 are defined by tbarcode */
+ } else if (symbology == 5) {
+ symbology = BARCODE_C25STANDARD;
+ } else if ((symbology >= 10) && (symbology <= 12)) {
+ symbology = BARCODE_EANX;
+ } else if (symbology == 15) {
+ symbology = BARCODE_EANX;
+ } else if (symbology == 17) {
+ symbology = BARCODE_UPCA;
+ } else if (symbology == 19) {
+ warn_number = ZINT_WARN_INVALID_OPTION;
+ symbology = BARCODE_CODABAR;
+ } else if (symbology == 26) { /* UPC-A up to tbarcode 9, ISSN for tbarcode 10+ */
+ symbology = BARCODE_UPCA;
+ } else if (symbology == 27) { /* UPCD1 up to tbarcode 9, ISSN + 2 digit add-on for tbarcode 10+ */
+ return ZINT_ERROR_INVALID_OPTION;
+ } else if (symbology == 33) {
+ symbology = BARCODE_GS1_128;
+ } else if (symbology == 36) {
+ symbology = BARCODE_UPCA;
+ } else if (symbology == 39) {
+ symbology = BARCODE_UPCE;
+ } else if ((symbology >= 41) && (symbology <= 45)) {
+ symbology = BARCODE_POSTNET;
+ } else if (symbology == 46) {
+ symbology = BARCODE_PLESSEY;
+ } else if (symbology == 48) {
+ symbology = BARCODE_NVE18;
+ } else if ((symbology == 59) || (symbology == 61)) {
+ symbology = BARCODE_CODE128;
+ } else if (symbology == 62) {
+ symbology = BARCODE_CODE93;
+ } else if ((symbology == 64) || (symbology == 65)) {
+ symbology = BARCODE_AUSPOST;
+ } else if (symbology == 78) {
+ symbology = BARCODE_DBAR_OMN;
+ } else if (symbology == 83) {
+ symbology = BARCODE_PLANET;
+ } else if (symbology == 88) {
+ symbology = BARCODE_GS1_128;
+ } else if (symbology == 91) { /* BC412 up to tbarcode 9, Code 32 for tbarcode 10+ */
+ warn_number = ZINT_WARN_INVALID_OPTION;
+ symbology = BARCODE_CODE128;
+ } else if ((symbology >= 94) && (symbology <= 95)) {
+ warn_number = ZINT_WARN_INVALID_OPTION;
+ symbology = BARCODE_CODE128;
+ } else if (symbology == 100) {
+ symbology = BARCODE_HIBC_128;
+ } else if (symbology == 101) {
+ symbology = BARCODE_HIBC_39;
+ } else if (symbology == 103) {
+ symbology = BARCODE_HIBC_DM;
+ } else if (symbology == 105) {
+ symbology = BARCODE_HIBC_QR;
+ } else if (symbology == 107) {
+ symbology = BARCODE_HIBC_PDF;
+ } else if (symbology == 109) {
+ symbology = BARCODE_HIBC_MICPDF;
+ } else if (symbology == 111) {
+ symbology = BARCODE_HIBC_BLOCKF;
+ } else if ((symbology == 113) || (symbology == 114)) {
+ warn_number = ZINT_WARN_INVALID_OPTION;
+ symbology = BARCODE_CODE128;
+ } else if ((symbology >= 117) && (symbology <= 127)) {
+ if (symbology < 119 || symbology > 121) { /* BARCODE_MAILMARK_2D/4S/UPU_S10 */
+ warn_number = ZINT_WARN_INVALID_OPTION;
+ symbology = BARCODE_CODE128;
+ }
+ /* Everything from 128 up is Zint-specific */
+ } else if (symbology > BARCODE_LAST) {
+ warn_number = ZINT_WARN_INVALID_OPTION;
+ symbology = BARCODE_CODE128;
+ }
+ if (symbology == *p_symbology) { /* Should never happen */
+ return ZINT_ERROR_ENCODING_PROBLEM;
+ }
+
+ *p_symbology = symbology;
+
+ return warn_number;
+}
+
static void test_symbologies(const testCtx *const p_ctx) {
int i, ret;
struct zint_symbol symbol = {0};
@@ -404,8 +493,21 @@ static void test_symbologies(const testCtx *const p_ctx) {
if (testContinue(p_ctx, i)) continue;
symbol.symbology = i;
- ret = ZBarcode_Encode(&symbol, TU("1"), 0);
+ ret = ZBarcode_Encode(&symbol, TU(""), 0);
assert_notequal(ret, ZINT_ERROR_ENCODING_PROBLEM, "i:%d Encoding problem (%s)\n", i, symbol.errtxt);
+
+ if (!ZBarcode_ValidID(i)) {
+ int prev_symbology = i;
+ int prev_ret = test_prev_map_invalid_symbology(&prev_symbology);
+ if (ret != ZINT_ERROR_INVALID_DATA) {
+ assert_equal(prev_ret, ret, "i:%d prev_ret (%d) != ret (%d)\n", i, prev_ret, ret);
+ }
+ assert_equal(prev_symbology, symbol.symbology, "i:%d prev_symbology (%d) != symbol.symbology (%d)\n",
+ i, prev_symbology, symbol.symbology);
+ } else {
+ /* No input data */
+ assert_equal(ret, ZINT_ERROR_INVALID_DATA, "i:%d ret (%d) != ZINT_ERROR_INVALID_DATA\n", i, ret);
+ }
}
testFinish();
@@ -420,20 +522,21 @@ static void test_input_mode(const testCtx *const p_ctx) {
int ret;
int expected_input_mode;
+ char *expected_errtxt;
};
/* s/\/\*[ 0-9]*\*\//\=printf("\/\*%3d*\/", line(".") - line("'<")): */
struct item data[] = {
- /* 0*/ { "1234", DATA_MODE, 0, DATA_MODE },
- /* 1*/ { "1234", DATA_MODE | ESCAPE_MODE, 0, DATA_MODE | ESCAPE_MODE },
- /* 2*/ { "1234", UNICODE_MODE, 0, UNICODE_MODE },
- /* 3*/ { "1234", UNICODE_MODE | ESCAPE_MODE, 0, UNICODE_MODE | ESCAPE_MODE },
- /* 4*/ { "[01]12345678901231", GS1_MODE, 0, GS1_MODE },
- /* 5*/ { "[01]12345678901231", GS1_MODE | ESCAPE_MODE, 0, GS1_MODE | ESCAPE_MODE },
- /* 6*/ { "1234", 4 | ESCAPE_MODE, 0, DATA_MODE }, /* Unknown mode reset to bare DATA_MODE */
- /* 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]12345678901231", GS1_MODE | 0x20, 0, GS1_MODE | 0x20 },
+ /* 0*/ { "1234", DATA_MODE, 0, DATA_MODE, "" },
+ /* 1*/ { "1234", DATA_MODE | ESCAPE_MODE, 0, DATA_MODE | ESCAPE_MODE, "" },
+ /* 2*/ { "1234", UNICODE_MODE, 0, UNICODE_MODE, "" },
+ /* 3*/ { "1234", UNICODE_MODE | ESCAPE_MODE, 0, UNICODE_MODE | ESCAPE_MODE, "" },
+ /* 4*/ { "[01]12345678901231", GS1_MODE, 0, GS1_MODE, "" },
+ /* 5*/ { "[01]12345678901231", GS1_MODE | ESCAPE_MODE, 0, GS1_MODE | ESCAPE_MODE, "" },
+ /* 6*/ { "1234", 4 | ESCAPE_MODE, ZINT_WARN_INVALID_OPTION, DATA_MODE, "Warning 212: Invalid input mode - reset to DATA_MODE" }, /* Unknown mode reset to bare DATA_MODE. Note: now warns */
+ /* 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]12345678901231", GS1_MODE | 0x20, 0, GS1_MODE | 0x20, "" },
};
int data_size = ARRAY_SIZE(data);
int i, length, ret;
@@ -453,6 +556,7 @@ static void test_input_mode(const testCtx *const p_ctx) {
ret = ZBarcode_Encode(symbol, TU(data[i].data), length);
assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt);
assert_equal(symbol->input_mode, data[i].expected_input_mode, "i:%d symbol->input_mode %d != %d\n", i, symbol->input_mode, data[i].expected_input_mode);
+ assert_zero(strcmp(symbol->errtxt, data[i].expected_errtxt), "i:%d ZBarcode_Encode strcmp(%s, %s) != 0\n", i, symbol->errtxt, data[i].expected_errtxt);
ZBarcode_Delete(symbol);
}
@@ -725,7 +829,7 @@ static void test_cap(const testCtx *const p_ctx) {
};
int data_size = ARRAY_SIZE(data);
int i;
- unsigned int ret;
+ unsigned int uret;
testStart("test_cap");
@@ -733,8 +837,8 @@ static void test_cap(const testCtx *const p_ctx) {
if (testContinue(p_ctx, i)) continue;
- ret = ZBarcode_Cap(data[i].symbology, data[i].cap_flag);
- assert_equal(ret, data[i].expected, "i:%d ZBarcode_Cap(%s, 0x%X) 0x%X != 0x%X\n", i, testUtilBarcodeName(data[i].symbology), data[i].cap_flag, ret, data[i].expected);
+ uret = ZBarcode_Cap(data[i].symbology, data[i].cap_flag);
+ assert_equal(uret, data[i].expected, "i:%d ZBarcode_Cap(%s, 0x%X) 0x%X != 0x%X\n", i, testUtilBarcodeName(data[i].symbology), data[i].cap_flag, uret, data[i].expected);
}
testFinish();
@@ -742,7 +846,7 @@ static void test_cap(const testCtx *const p_ctx) {
static void test_cap_compliant_height(const testCtx *const p_ctx) {
int symbol_id;
- int ret;
+ unsigned int uret;
testStart("test_cap_compliant_height");
@@ -750,7 +854,7 @@ static void test_cap_compliant_height(const testCtx *const p_ctx) {
if (!ZBarcode_ValidID(symbol_id)) continue;
if (testContinue(p_ctx, symbol_id)) continue;
- ret = ZBarcode_Cap(symbol_id, ZINT_CAP_COMPLIANT_HEIGHT);
+ uret = ZBarcode_Cap(symbol_id, ZINT_CAP_COMPLIANT_HEIGHT);
switch (symbol_id) {
/*case BARCODE_CODE11: TODO: Find doc */
@@ -822,10 +926,10 @@ static void test_cap_compliant_height(const testCtx *const p_ctx) {
case BARCODE_DBAR_EXPSTK_CC:
case BARCODE_CHANNEL:
case BARCODE_BC412:
- assert_equal(ret, ZINT_CAP_COMPLIANT_HEIGHT, "symbol_id %d (%s) ret 0x%X != ZINT_CAP_COMPLIANT_HEIGHT\n", symbol_id, testUtilBarcodeName(symbol_id), ret);
+ assert_equal(uret, ZINT_CAP_COMPLIANT_HEIGHT, "symbol_id %d (%s) uret 0x%X != ZINT_CAP_COMPLIANT_HEIGHT\n", symbol_id, testUtilBarcodeName(symbol_id), uret);
break;
default:
- assert_zero(ret, "symbol_id %d (%s) ret 0x%X non-zero\n", symbol_id, testUtilBarcodeName(symbol_id), ret);
+ assert_zero(uret, "symbol_id %d (%s) uret 0x%X non-zero\n", symbol_id, testUtilBarcodeName(symbol_id), uret);
break;
}
}
@@ -849,7 +953,7 @@ static void test_encode_file_empty(const testCtx *const p_ctx) {
(void) testUtilRemove(filename); /* In case junk hanging around */
fstream = testUtilOpen(filename, "w+");
- assert_nonnull(fstream, "testUtilOpen(%s) failed (%d)\n", filename, ferror(fstream));
+ assert_nonnull(fstream, "testUtilOpen(%s) failed (%d)\n", filename, errno);
ret = fclose(fstream);
assert_zero(ret, "fclose(%s) %d != 0\n", filename, ret);
@@ -881,7 +985,7 @@ static void test_encode_file_too_large(const testCtx *const p_ctx) {
(void) testUtilRemove(filename); /* In case junk hanging around */
fstream = testUtilOpen(filename, "w+");
- assert_nonnull(fstream, "testUtilOpen(%s) failed (%d)\n", filename, ferror(fstream));
+ assert_nonnull(fstream, "testUtilOpen(%s) failed (%d)\n", filename, errno);
ret = (int) fwrite(buf, 1, sizeof(buf), fstream);
assert_equal(ret, sizeof(buf), "fwrite return value: %d != %d\n", ret, (int)sizeof(buf));
ret = fclose(fstream);
@@ -994,7 +1098,7 @@ static void test_encode_file(const testCtx *const p_ctx) {
(void) testUtilRemove(outfile); /* In case junk hanging around */
fp = testUtilOpen(filename, "w+");
- assert_nonnull(fp, "testUtilOpen(%s) failed (%d)\n", filename, ferror(fp));
+ assert_nonnull(fp, "testUtilOpen(%s) failed (%d)\n", filename, errno);
assert_notequal(fputs(data, fp), EOF, "fputs(%s) failed == EOF (%d)\n", data, ferror(fp));
ret = fclose(fp);
assert_zero(ret, "fclose(%s) %d != 0\n", filename, ret);
@@ -1073,6 +1177,7 @@ static void test_encode_print_outfile_directory(const testCtx *const p_ctx) {
static void test_bad_args(const testCtx *const p_ctx) {
int ret;
+ unsigned int uret;
struct zint_symbol *symbol;
char *data = "1";
char *filename = "1.png";
@@ -1096,10 +1201,10 @@ static void test_bad_args(const testCtx *const p_ctx) {
assert_zero(ZBarcode_ValidID(0), "ZBarcode_ValidID(0) non-zero\n");
assert_zero(ZBarcode_ValidID(10), "ZBarcode_ValidID(10) non-zero\n"); /* Note 10 remapped to BARCODE_EANX in ZBarcode_Encode() for tbarcode compat but not counted as valid */
- ret = ZBarcode_Cap(0, ~0);
- assert_zero(ret, "ZBarcode_Cap(0, ~0) ret 0x%X != 0\n", ret);
- ret = ZBarcode_Cap(10, ~0);
- assert_zero(ret, "ZBarcode_Cap(10, ~0) ret 0x%X != 0\n", ret);
+ uret = ZBarcode_Cap(0, ~0);
+ assert_zero(uret, "ZBarcode_Cap(0, ~0) uret 0x%X != 0\n", uret);
+ uret = ZBarcode_Cap(10, ~0);
+ assert_zero(uret, "ZBarcode_Cap(10, ~0) uret 0x%X != 0\n", uret);
/* NULL symbol */
assert_equal(ZBarcode_Encode(NULL, TU(data), 1), ZINT_ERROR_INVALID_DATA, "ZBarcode_Encode(NULL, data, 1) != ZINT_ERROR_INVALID_DATA\n");
@@ -1240,6 +1345,210 @@ static void test_valid_id(const testCtx *const p_ctx) {
testFinish();
}
+static int test_prev_ZBarcode_BarcodeName(int symbol_id, char name[32]) {
+ struct item {
+ const char *name;
+ int define;
+ int val;
+ };
+ static const struct item data[] = {
+ { "", -1, 0 },
+ { "BARCODE_CODE11", BARCODE_CODE11, 1 },
+ { "BARCODE_C25STANDARD", BARCODE_C25STANDARD, 2 },
+ { "BARCODE_C25INTER", BARCODE_C25INTER, 3 },
+ { "BARCODE_C25IATA", BARCODE_C25IATA, 4 },
+ { "", -1, 5 },
+ { "BARCODE_C25LOGIC", BARCODE_C25LOGIC, 6 },
+ { "BARCODE_C25IND", BARCODE_C25IND, 7 },
+ { "BARCODE_CODE39", BARCODE_CODE39, 8 },
+ { "BARCODE_EXCODE39", BARCODE_EXCODE39, 9 },
+ { "", -1, 10 },
+ { "", -1, 11 },
+ { "", -1, 12 },
+ { "BARCODE_EANX", BARCODE_EANX, 13 },
+ { "BARCODE_EANX_CHK", BARCODE_EANX_CHK, 14 },
+ { "", -1, 15 },
+ { "BARCODE_GS1_128", BARCODE_GS1_128, 16 },
+ { "", -1, 17 },
+ { "BARCODE_CODABAR", BARCODE_CODABAR, 18 },
+ { "", -1, 19 },
+ { "BARCODE_CODE128", BARCODE_CODE128, 20 },
+ { "BARCODE_DPLEIT", BARCODE_DPLEIT, 21 },
+ { "BARCODE_DPIDENT", BARCODE_DPIDENT, 22 },
+ { "BARCODE_CODE16K", BARCODE_CODE16K, 23 },
+ { "BARCODE_CODE49", BARCODE_CODE49, 24 },
+ { "BARCODE_CODE93", BARCODE_CODE93, 25 },
+ { "", -1, 26 },
+ { "", -1, 27 },
+ { "BARCODE_FLAT", BARCODE_FLAT, 28 },
+ { "BARCODE_DBAR_OMN", BARCODE_DBAR_OMN, 29 },
+ { "BARCODE_DBAR_LTD", BARCODE_DBAR_LTD, 30 },
+ { "BARCODE_DBAR_EXP", BARCODE_DBAR_EXP, 31 },
+ { "BARCODE_TELEPEN", BARCODE_TELEPEN, 32 },
+ { "", -1, 33 },
+ { "BARCODE_UPCA", BARCODE_UPCA, 34 },
+ { "BARCODE_UPCA_CHK", BARCODE_UPCA_CHK, 35 },
+ { "", -1, 36 },
+ { "BARCODE_UPCE", BARCODE_UPCE, 37 },
+ { "BARCODE_UPCE_CHK", BARCODE_UPCE_CHK, 38 },
+ { "", -1, 39 },
+ { "BARCODE_POSTNET", BARCODE_POSTNET, 40 },
+ { "", -1, 41 },
+ { "", -1, 42 },
+ { "", -1, 43 },
+ { "", -1, 44 },
+ { "", -1, 45 },
+ { "", -1, 46 },
+ { "BARCODE_MSI_PLESSEY", BARCODE_MSI_PLESSEY, 47 },
+ { "", -1, 48 },
+ { "BARCODE_FIM", BARCODE_FIM, 49 },
+ { "BARCODE_LOGMARS", BARCODE_LOGMARS, 50 },
+ { "BARCODE_PHARMA", BARCODE_PHARMA, 51 },
+ { "BARCODE_PZN", BARCODE_PZN, 52 },
+ { "BARCODE_PHARMA_TWO", BARCODE_PHARMA_TWO, 53 },
+ { "BARCODE_CEPNET", BARCODE_CEPNET, 54 },
+ { "BARCODE_PDF417", BARCODE_PDF417, 55 },
+ { "BARCODE_PDF417COMP", BARCODE_PDF417COMP, 56 },
+ { "BARCODE_MAXICODE", BARCODE_MAXICODE, 57 },
+ { "BARCODE_QRCODE", BARCODE_QRCODE, 58 },
+ { "", -1, 59 },
+ { "BARCODE_CODE128AB", BARCODE_CODE128AB, 60 },
+ { "", -1, 61 },
+ { "", -1, 62 },
+ { "BARCODE_AUSPOST", BARCODE_AUSPOST, 63 },
+ { "", -1, 64 },
+ { "", -1, 65 },
+ { "BARCODE_AUSREPLY", BARCODE_AUSREPLY, 66 },
+ { "BARCODE_AUSROUTE", BARCODE_AUSROUTE, 67 },
+ { "BARCODE_AUSREDIRECT", BARCODE_AUSREDIRECT, 68 },
+ { "BARCODE_ISBNX", BARCODE_ISBNX, 69 },
+ { "BARCODE_RM4SCC", BARCODE_RM4SCC, 70 },
+ { "BARCODE_DATAMATRIX", BARCODE_DATAMATRIX, 71 },
+ { "BARCODE_EAN14", BARCODE_EAN14, 72 },
+ { "BARCODE_VIN", BARCODE_VIN, 73 },
+ { "BARCODE_CODABLOCKF", BARCODE_CODABLOCKF, 74 },
+ { "BARCODE_NVE18", BARCODE_NVE18, 75 },
+ { "BARCODE_JAPANPOST", BARCODE_JAPANPOST, 76 },
+ { "BARCODE_KOREAPOST", BARCODE_KOREAPOST, 77 },
+ { "", -1, 78 },
+ { "BARCODE_DBAR_STK", BARCODE_DBAR_STK, 79 },
+ { "BARCODE_DBAR_OMNSTK", BARCODE_DBAR_OMNSTK, 80 },
+ { "BARCODE_DBAR_EXPSTK", BARCODE_DBAR_EXPSTK, 81 },
+ { "BARCODE_PLANET", BARCODE_PLANET, 82 },
+ { "", -1, 83 },
+ { "BARCODE_MICROPDF417", BARCODE_MICROPDF417, 84 },
+ { "BARCODE_USPS_IMAIL", BARCODE_USPS_IMAIL, 85 },
+ { "BARCODE_PLESSEY", BARCODE_PLESSEY, 86 },
+ { "BARCODE_TELEPEN_NUM", BARCODE_TELEPEN_NUM, 87 },
+ { "", -1, 88 },
+ { "BARCODE_ITF14", BARCODE_ITF14, 89 },
+ { "BARCODE_KIX", BARCODE_KIX, 90 },
+ { "", -1, 91 },
+ { "BARCODE_AZTEC", BARCODE_AZTEC, 92 },
+ { "BARCODE_DAFT", BARCODE_DAFT, 93 },
+ { "", -1, 94 },
+ { "", -1, 95 },
+ { "BARCODE_DPD", BARCODE_DPD, 96 },
+ { "BARCODE_MICROQR", BARCODE_MICROQR, 97 },
+ { "BARCODE_HIBC_128", BARCODE_HIBC_128, 98 },
+ { "BARCODE_HIBC_39", BARCODE_HIBC_39, 99 },
+ { "", -1, 100 },
+ { "", -1, 101 },
+ { "BARCODE_HIBC_DM", BARCODE_HIBC_DM, 102 },
+ { "", -1, 103 },
+ { "BARCODE_HIBC_QR", BARCODE_HIBC_QR, 104 },
+ { "", -1, 105 },
+ { "BARCODE_HIBC_PDF", BARCODE_HIBC_PDF, 106 },
+ { "", -1, 107 },
+ { "BARCODE_HIBC_MICPDF", BARCODE_HIBC_MICPDF, 108 },
+ { "", -1, 109 },
+ { "BARCODE_HIBC_BLOCKF", BARCODE_HIBC_BLOCKF, 110 },
+ { "", -1, 111 },
+ { "BARCODE_HIBC_AZTEC", BARCODE_HIBC_AZTEC, 112 },
+ { "", -1, 113 },
+ { "", -1, 114 },
+ { "BARCODE_DOTCODE", BARCODE_DOTCODE, 115 },
+ { "BARCODE_HANXIN", BARCODE_HANXIN, 116 },
+ { "", -1, 117 },
+ { "", -1, 118 },
+ { "BARCODE_MAILMARK_2D", BARCODE_MAILMARK_2D, 119 },
+ { "BARCODE_UPU_S10", BARCODE_UPU_S10, 120 },
+ { "BARCODE_MAILMARK_4S", BARCODE_MAILMARK_4S, 121 },
+ { "", -1, 122 },
+ { "", -1, 123 },
+ { "", -1, 124 },
+ { "", -1, 125 },
+ { "", -1, 126 },
+ { "", -1, 127 },
+ { "BARCODE_AZRUNE", BARCODE_AZRUNE, 128 },
+ { "BARCODE_CODE32", BARCODE_CODE32, 129 },
+ { "BARCODE_EANX_CC", BARCODE_EANX_CC, 130 },
+ { "BARCODE_GS1_128_CC", BARCODE_GS1_128_CC, 131 },
+ { "BARCODE_DBAR_OMN_CC", BARCODE_DBAR_OMN_CC, 132 },
+ { "BARCODE_DBAR_LTD_CC", BARCODE_DBAR_LTD_CC, 133 },
+ { "BARCODE_DBAR_EXP_CC", BARCODE_DBAR_EXP_CC, 134 },
+ { "BARCODE_UPCA_CC", BARCODE_UPCA_CC, 135 },
+ { "BARCODE_UPCE_CC", BARCODE_UPCE_CC, 136 },
+ { "BARCODE_DBAR_STK_CC", BARCODE_DBAR_STK_CC, 137 },
+ { "BARCODE_DBAR_OMNSTK_CC", BARCODE_DBAR_OMNSTK_CC, 138 },
+ { "BARCODE_DBAR_EXPSTK_CC", BARCODE_DBAR_EXPSTK_CC, 139 },
+ { "BARCODE_CHANNEL", BARCODE_CHANNEL, 140 },
+ { "BARCODE_CODEONE", BARCODE_CODEONE, 141 },
+ { "BARCODE_GRIDMATRIX", BARCODE_GRIDMATRIX, 142 },
+ { "BARCODE_UPNQR", BARCODE_UPNQR, 143 },
+ { "BARCODE_ULTRA", BARCODE_ULTRA, 144 },
+ { "BARCODE_RMQR", BARCODE_RMQR, 145 },
+ { "BARCODE_BC412", BARCODE_BC412, 146 },
+ };
+
+ name[0] = '\0';
+
+ if (!ZBarcode_ValidID(symbol_id)) {
+ return 1;
+ }
+ if (!(symbol_id >= 0 && symbol_id < ARRAY_SIZE(data) && data[symbol_id].name[0])) {
+ return -1; /* Shouldn't happen */
+ }
+
+ /* Self-check, shouldn't happen */
+ if (data[symbol_id].val != symbol_id || (data[symbol_id].define != -1 && data[symbol_id].define != symbol_id)) {
+ return -1;
+ }
+
+ strcpy(name, data[symbol_id].name);
+
+ return 0;
+}
+
+static void test_barcode_name(const testCtx *const p_ctx) {
+
+ int ret;
+ char name[32];
+ int symbol_id;
+
+ (void)p_ctx;
+
+ testStart("test_barcode_name");
+
+ for (symbol_id = -1; symbol_id < 160; symbol_id++) {
+ int prev_ret;
+ char prev_name[32];
+ ret = ZBarcode_BarcodeName(symbol_id, name);
+ if (ZBarcode_ValidID(symbol_id)) {
+ assert_equal(ret, 0, "ZBarcode_BarcodeName(%d) != 0\n", symbol_id);
+ assert_nonzero(*name != '\0', "ZBarcode_BarcodeName(%d) empty when ZBarcode_Valid() true\n", symbol_id);
+ } else {
+ assert_equal(ret, 1, "ZBarcode_BarcodeName(%d) != 1\n", symbol_id);
+ assert_zero(*name, "ZBarcode_BarcodeName(%d) non-empty when ZBarcode_Valid() false\n", symbol_id);
+ }
+ prev_ret = test_prev_ZBarcode_BarcodeName(symbol_id, prev_name);
+ assert_equal(ret, prev_ret, "ZBarcode_BarcodeName(%d) ret %d != prev_ret %d\n", symbol_id, ret, prev_ret);
+ assert_zero(strcmp(name, prev_name), "ZBarcode_BarcodeName(%d) strcmp(%s, %s) != 0\n", symbol_id, name, prev_name);
+ }
+
+ testFinish();
+}
+
INTERNAL int error_tag_test(struct zint_symbol *symbol, int error_number, const char *error_string);
static void test_error_tag(const testCtx *const p_ctx) {
@@ -1826,6 +2135,7 @@ int main(int argc, char *argv[]) {
{ "test_encode_print_outfile_directory", test_encode_print_outfile_directory },
{ "test_bad_args", test_bad_args },
{ "test_valid_id", test_valid_id },
+ { "test_barcode_name", test_barcode_name },
{ "test_error_tag", test_error_tag },
{ "test_strip_bom", test_strip_bom },
{ "test_zero_outfile", test_zero_outfile },
diff --git a/backend/tests/test_qr.c b/backend/tests/test_qr.c
index 9cb97360..dbeef22d 100644
--- a/backend/tests/test_qr.c
+++ b/backend/tests/test_qr.c
@@ -1,6 +1,6 @@
/*
libzint - the open source barcode library
- Copyright (C) 2019-2023 Robin Stuart
+ Copyright (C) 2019-2024 Robin Stuart
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
@@ -406,21 +406,21 @@ static void test_qr_input(const testCtx *const p_ctx) {
/*126*/ { UNICODE_MODE, 16384, 4, 8 << 8, "é", 0, 16384, "7C 04 00 04 02 C3 A9 00 EC", 1, 1, "ECI-16384 B2 (no conversion)" },
/*127*/ { UNICODE_MODE, 3, 4, -1, "product:Google Pixel 4a - 128 GB of Storage - Black;price:$439.97", 0, 3, "(86) 70 34 39 70 72 6F 64 75 63 74 3A 47 6F 6F 67 6C 65 20 50 69 78 65 6C 20 34 61 20 2D", 0, 1, "ECI-3 B57 A8; BWIPP different encodation (B65)" },
/*128*/ { DATA_MODE, 0, 4, ZINT_FULL_MULTIBYTE, "\201\176", 0, 0, "80 10 1F 00 EC 11 EC 11 EC", 1, 1, "K1 (Shift JIS 0x817E)" },
- /*129*/ { DATA_MODE, 0, 4, ZINT_FULL_MULTIBYTE, "\201\177", 0, 0, "40 28 17 F0 EC 11 EC 11 EC", 0, 1, "B2 (0x817F previously used Kanji mode, now excludes trailing 0x7F); BWIPP TODO: exclude also" },
+ /*129*/ { DATA_MODE, 0, 4, ZINT_FULL_MULTIBYTE, "\201\177", 0, 0, "40 28 17 F0 EC 11 EC 11 EC", 1, 1, "B2 (0x817F previously used Kanji mode, now excludes trailing 0x7F)" },
/*130*/ { DATA_MODE, 0, 4, ZINT_FULL_MULTIBYTE, "\201\200", 0, 0, "80 10 20 00 EC 11 EC 11 EC", 1, 1, "K1 (Shift JIS 0x8180)" },
/*131*/ { DATA_MODE, 0, 4, ZINT_FULL_MULTIBYTE, "\237\176", 0, 0, "80 1B 5F 00 EC 11 EC 11 EC", 1, 1, "K1 (Shift JIS 0x9F7E)" },
- /*132*/ { DATA_MODE, 0, 4, ZINT_FULL_MULTIBYTE, "\237\177", 0, 0, "40 29 F7 F0 EC 11 EC 11 EC", 0, 1, "B2 (0x9F7F previously used Kanji mode, now excludes trailing 0x7F); BWIPP TODO: exclude also" },
+ /*132*/ { DATA_MODE, 0, 4, ZINT_FULL_MULTIBYTE | (1 << 8), "\237\177", 0, 0, "40 29 F7 F0 EC 11 EC 11 EC", 1, 1, "B2 (0x9F7F previously used Kanji mode, now excludes trailing 0x7F)" },
/*133*/ { DATA_MODE, 0, 4, ZINT_FULL_MULTIBYTE | (5 << 8), "\340\176", 0, 0, "80 1B BF 00 EC 11 EC 11 EC", 1, 1, "K1 (Shift JIS 0xE07E)" },
- /*134*/ { DATA_MODE, 0, 4, ZINT_FULL_MULTIBYTE, "\340\177", 0, 0, "40 2E 07 F0 EC 11 EC 11 EC", 0, 1, "B2 (0xE07F previously used Kanji mode, now excludes trailing 0x7F); BWIPP TODO: exclude also" },
+ /*134*/ { DATA_MODE, 0, 4, ZINT_FULL_MULTIBYTE, "\340\177", 0, 0, "40 2E 07 F0 EC 11 EC 11 EC", 1, 1, "B2 (0xE07F previously used Kanji mode, now excludes trailing 0x7F)" },
/*135*/ { DATA_MODE, 0, 4, ZINT_FULL_MULTIBYTE | (4 << 8), "\352\244", 0, 0, "80 1F 92 00 EC 11 EC 11 EC", 1, 1, "K1 (Shift JIS 0xEAA4, last valid codepoint)" },
- /*136*/ { DATA_MODE, 0, 4, ZINT_FULL_MULTIBYTE, "\353\277", 0, 0, "80 1F FF 80 EC 11 EC 11 EC", 0, 1, "K1 (0xEBBF undefined in Shift JIS but not checked and uses Kanji mode); BWIPP TODO: exclude also" },
+ /*136*/ { DATA_MODE, 0, 4, ZINT_FULL_MULTIBYTE | (6 << 8), "\353\277", 0, 0, "80 1F FF 80 EC 11 EC 11 EC", 1, 1, "K1 (0xEBBF undefined in Shift JIS but not checked and uses Kanji mode)" },
/*137*/ { DATA_MODE, 0, 4, ZINT_FULL_MULTIBYTE, "\353\300", 0, 0, "40 2E BC 00 EC 11 EC 11 EC", 1, 1, "B2 (0xEBC0 was always excluded)" },
/*138*/ { DATA_MODE, 0, 4, ZINT_FULL_MULTIBYTE, "\201\300", 0, 0, "80 10 40 00 EC 11 EC 11 EC", 1, 1, "K1 (Shift JIS 0x81C0)" },
/*139*/ { DATA_MODE, 0, 4, ZINT_FULL_MULTIBYTE | (2 << 8), "\201\374", 0, 0, "80 10 5E 00 EC 11 EC 11 EC", 1, 1, "K1 (Shift JIS 0x81FC)" },
- /*140*/ { DATA_MODE, 0, 4, ZINT_FULL_MULTIBYTE, "\201\375", 0, 0, "40 28 1F D0 EC 11 EC 11 EC", 0, 1, "B2 (0x81FD previously used Kanji mode, now excludes trailing 0xFD); BWIPP TODO: exclude also" },
- /*141*/ { DATA_MODE, 0, 4, ZINT_FULL_MULTIBYTE, "\201\376", 0, 0, "40 28 1F E0 EC 11 EC 11 EC", 0, 1, "B2 (0x81FE previously used Kanji mode, now excludes trailing 0xFE); BWIPP TODO: exclude also" },
- /*142*/ { DATA_MODE, 0, 4, ZINT_FULL_MULTIBYTE, "\201\377", 0, 0, "40 28 1F F0 EC 11 EC 11 EC", 0, 1, "B2 (0x81FF previously used Kanji mode, now excludes trailing 0xFF); BWIPP TODO: exclude also" },
- /*143*/ { DATA_MODE, 0, 4, ZINT_FULL_MULTIBYTE, "\201\377", 0, 0, "40 28 1F F0 EC 11 EC 11 EC", 0, 1, "B2 (0x81FF previously used Kanji mode, now excludes trailing 0xFF); BWIPP TODO: exclude also" },
+ /*140*/ { DATA_MODE, 0, 4, ZINT_FULL_MULTIBYTE | (8 << 8), "\201\375", 0, 0, "40 28 1F D0 EC 11 EC 11 EC", 1, 1, "B2 (0x81FD previously used Kanji mode, now excludes trailing 0xFD)" },
+ /*141*/ { DATA_MODE, 0, 4, ZINT_FULL_MULTIBYTE | (4 << 8), "\201\376", 0, 0, "40 28 1F E0 EC 11 EC 11 EC", 1, 1, "B2 (0x81FE previously used Kanji mode, now excludes trailing 0xFE)" },
+ /*142*/ { DATA_MODE, 0, 4, ZINT_FULL_MULTIBYTE | (6 << 8), "\201\377", 0, 0, "40 28 1F F0 EC 11 EC 11 EC", 1, 1, "B2 (0x81FF previously used Kanji mode, now excludes trailing 0xFF)" },
+ /*143*/ { DATA_MODE, 0, 4, ZINT_FULL_MULTIBYTE | (6 << 8), "\201\377", 0, 0, "40 28 1F F0 EC 11 EC 11 EC", 1, 1, "B2 (0x81FF previously used Kanji mode, now excludes trailing 0xFF)" },
/*144*/ { DATA_MODE, 0, 4, ZINT_FULL_MULTIBYTE | (7 << 8), "\201\255", 0, 0, "80 10 36 80 EC 11 EC 11 EC", 1, 1, "K1 (0x81AD undefined in Shift JIS but not checked and uses Kanji mode)" },
};
int data_size = ARRAY_SIZE(data);
@@ -4251,6 +4251,29 @@ static void test_qr_encode(const testCtx *const p_ctx) {
"100000100100010011101"
"111111100011110001100"
},
+ /*128*/ { BARCODE_QRCODE, UNICODE_MODE, -1, 2, -1, 1 << 8, { 0, 0, "" }, "202404110011看看16", -1, ZINT_WARN_NONCOMPLIANT, 21, 21, 1, "Shift-JIS range (BWIPP via bwip-js issue #335)",
+ "111111100000101111111"
+ "100000101111101000001"
+ "101110100111001011101"
+ "101110100100001011101"
+ "101110101110101011101"
+ "100000100100101000001"
+ "111111101010101111111"
+ "000000000111100000000"
+ "101010100001000010010"
+ "110111010011011110011"
+ "000000111000101100000"
+ "010100000001011100010"
+ "111100101000100001110"
+ "000000001101000101010"
+ "111111100110010010101"
+ "100000100001000100001"
+ "101110101010001010001"
+ "101110100011000110110"
+ "101110101100111100001"
+ "100000100011010111000"
+ "111111101110111010101"
+ },
};
int data_size = ARRAY_SIZE(data);
int i, length, ret;
diff --git a/backend/tests/testcommon.c b/backend/tests/testcommon.c
index d2ba6b4f..a30e206a 100644
--- a/backend/tests/testcommon.c
+++ b/backend/tests/testcommon.c
@@ -3263,36 +3263,36 @@ int testUtilBwipp(int index, const struct zint_symbol *symbol, int option_1, int
/* Hack in various adjustments */
if (symbology == BARCODE_DBAR_OMN || symbology == BARCODE_DBAR_LTD || symbology == BARCODE_DBAR_EXP) {
/* Begin with space */
- char adj[5] = " -sbs";
- memmove(cmd + GS_INITIAL_LEN + sizeof(adj), cmd + GS_INITIAL_LEN, strlen(cmd) + 1 - GS_INITIAL_LEN);
- memcpy(cmd + GS_INITIAL_LEN, adj, sizeof(adj));
+ char adj[] = " -sbs";
+ memmove(cmd + GS_INITIAL_LEN + sizeof(adj) - 1, cmd + GS_INITIAL_LEN, strlen(cmd) + 1 - GS_INITIAL_LEN);
+ memcpy(cmd + GS_INITIAL_LEN, adj, sizeof(adj) - 1);
}
if (symbology == BARCODE_CODE11 || symbology == BARCODE_CODE39 || symbology == BARCODE_EXCODE39
|| symbology == BARCODE_CODABAR || symbology == BARCODE_PHARMA || symbology == BARCODE_PZN
|| symbology == BARCODE_CODE32 || symbology == BARCODE_VIN) {
/* Ratio 3 width bar/space -> 2 width */
- char adj[8] = " -sr=0.6";
- memmove(cmd + GS_INITIAL_LEN + sizeof(adj), cmd + GS_INITIAL_LEN, strlen(cmd) + 1 - GS_INITIAL_LEN);
- memcpy(cmd + GS_INITIAL_LEN, adj, sizeof(adj));
+ char adj[] = " -sr=0.6";
+ memmove(cmd + GS_INITIAL_LEN + sizeof(adj) - 1, cmd + GS_INITIAL_LEN, strlen(cmd) + 1 - GS_INITIAL_LEN);
+ memcpy(cmd + GS_INITIAL_LEN, adj, sizeof(adj) - 1);
}
if (symbology == BARCODE_C25INTER || symbology == BARCODE_DPLEIT || symbology == BARCODE_DPIDENT
|| symbology == BARCODE_ITF14) {
/* Ratio 2 width bar/space -> 3 width */
- char adj[8] = " -sr=1.3";
- memmove(cmd + GS_INITIAL_LEN + sizeof(adj), cmd + GS_INITIAL_LEN, strlen(cmd) + 1 - GS_INITIAL_LEN);
- memcpy(cmd + GS_INITIAL_LEN, adj, sizeof(adj));
+ char adj[] = " -sr=1.3";
+ memmove(cmd + GS_INITIAL_LEN + sizeof(adj) - 1, cmd + GS_INITIAL_LEN, strlen(cmd) + 1 - GS_INITIAL_LEN);
+ memcpy(cmd + GS_INITIAL_LEN, adj, sizeof(adj) - 1);
}
if (symbology == BARCODE_FIM) {
/* Ratio 2.25 width bar/space -> 1 width */
- char adj[10] = " -sr=0.444";
- memmove(cmd + GS_INITIAL_LEN + sizeof(adj), cmd + GS_INITIAL_LEN, strlen(cmd) + 1 - GS_INITIAL_LEN);
- memcpy(cmd + GS_INITIAL_LEN, adj, sizeof(adj));
+ char adj[] = " -sr=0.444";
+ memmove(cmd + GS_INITIAL_LEN + sizeof(adj) - 1, cmd + GS_INITIAL_LEN, strlen(cmd) + 1 - GS_INITIAL_LEN);
+ memcpy(cmd + GS_INITIAL_LEN, adj, sizeof(adj) - 1);
}
if (symbology == BARCODE_PLESSEY) {
/* Ceiling ratio 3/4/5 width bar/space -> 2 width then round ratio 2 width bar/space -> 3 width */
- char adj[16] = " -sc=0.4 -sr=1.3";
- memmove(cmd + GS_INITIAL_LEN + sizeof(adj), cmd + GS_INITIAL_LEN, strlen(cmd) + 1 - GS_INITIAL_LEN);
- memcpy(cmd + GS_INITIAL_LEN, adj, sizeof(adj));
+ char adj[] = " -sc=0.4 -sr=1.3";
+ memmove(cmd + GS_INITIAL_LEN + sizeof(adj) - 1, cmd + GS_INITIAL_LEN, strlen(cmd) + 1 - GS_INITIAL_LEN);
+ memcpy(cmd + GS_INITIAL_LEN, adj, sizeof(adj) - 1);
}
if (symbology == BARCODE_CODE11 || symbology == BARCODE_CODE39 || symbology == BARCODE_EXCODE39
|| symbology == BARCODE_HIBC_39 || symbology == BARCODE_LOGMARS || symbology == BARCODE_PHARMA
@@ -3300,28 +3300,28 @@ int testUtilBwipp(int index, const struct zint_symbol *symbol, int option_1, int
|| symbology == BARCODE_C25INTER || symbology == BARCODE_DPLEIT || symbology == BARCODE_DPIDENT
|| symbology == BARCODE_ITF14 || symbology == BARCODE_PHARMA_TWO) {
/* End sbs loop on bar */
- char adj[6] = " -selb";
- memmove(cmd + GS_INITIAL_LEN + sizeof(adj), cmd + GS_INITIAL_LEN, strlen(cmd) + 1 - GS_INITIAL_LEN);
- memcpy(cmd + GS_INITIAL_LEN, adj, sizeof(adj));
+ char adj[] = " -selb";
+ memmove(cmd + GS_INITIAL_LEN + sizeof(adj) - 1, cmd + GS_INITIAL_LEN, strlen(cmd) + 1 - GS_INITIAL_LEN);
+ memcpy(cmd + GS_INITIAL_LEN, adj, sizeof(adj) - 1);
}
if (symbology == BARCODE_C25STANDARD) {
/* Zint uses 4X start/stop wides while BWIPP uses 3X - convert */
- char adj[91] = " -sp='i 0 eq i limit 4 sub eq or sbs i get 3 eq and { (1111) print true } { false } ifelse'";
- memmove(cmd + GS_INITIAL_LEN + sizeof(adj), cmd + GS_INITIAL_LEN, strlen(cmd) + 1 - GS_INITIAL_LEN);
- memcpy(cmd + GS_INITIAL_LEN, adj, sizeof(adj));
+ char adj[] = " -sp='i 0 eq i limit 4 sub eq or sbs i get 3 eq and { (1111) print true } { false } ifelse'";
+ memmove(cmd + GS_INITIAL_LEN + sizeof(adj) - 1, cmd + GS_INITIAL_LEN, strlen(cmd) + 1 - GS_INITIAL_LEN);
+ memcpy(cmd + GS_INITIAL_LEN, adj, sizeof(adj) - 1);
}
if (symbology == BARCODE_POSTNET || symbology == BARCODE_PLANET || symbology == BARCODE_RM4SCC
|| symbology == BARCODE_JAPANPOST || symbology == BARCODE_KIX || symbology == BARCODE_DAFT
|| symbology == BARCODE_USPS_IMAIL || symbology == BARCODE_AUSPOST || symbology == BARCODE_PHARMA_TWO) {
/* Emulate rows with BWIPP heights. */
- char adj[5] = " -shs";
- memmove(cmd + GS_INITIAL_LEN + sizeof(adj), cmd + GS_INITIAL_LEN, strlen(cmd) + 1 - GS_INITIAL_LEN);
- memcpy(cmd + GS_INITIAL_LEN, adj, sizeof(adj));
+ char adj[] = " -shs";
+ memmove(cmd + GS_INITIAL_LEN + sizeof(adj) - 1, cmd + GS_INITIAL_LEN, strlen(cmd) + 1 - GS_INITIAL_LEN);
+ memcpy(cmd + GS_INITIAL_LEN, adj, sizeof(adj) - 1);
}
if (symbology == BARCODE_CODE16K || symbology == BARCODE_CODE49) {
- char adj[15] = " -sxs=10 -sxe=1"; /* Strip first 10 and last zero */
- memmove(cmd + GS_INITIAL_LEN + sizeof(adj), cmd + GS_INITIAL_LEN, strlen(cmd) + 1 - GS_INITIAL_LEN);
- memcpy(cmd + GS_INITIAL_LEN, adj, sizeof(adj));
+ char adj[] = " -sxs=10 -sxe=1"; /* Strip first 10 and last zero */
+ memmove(cmd + GS_INITIAL_LEN + sizeof(adj) - 1, cmd + GS_INITIAL_LEN, strlen(cmd) + 1 - GS_INITIAL_LEN);
+ memcpy(cmd + GS_INITIAL_LEN, adj, sizeof(adj) - 1);
}
if (symbol->debug & ZINT_DEBUG_TEST_PRINT) {
diff --git a/backend/tests/testcommon.h b/backend/tests/testcommon.h
index 81515080..59d6d97c 100644
--- a/backend/tests/testcommon.h
+++ b/backend/tests/testcommon.h
@@ -57,10 +57,8 @@ extern "C" {
#define testutil_pclose(stream) _pclose(stream)
#else
#include
-# if defined(ZINT_IS_C89) || defined(ZINT_IS_C99)
- extern FILE *popen(const char *command, const char *type);
- extern int pclose(FILE *stream);
-# endif
+extern FILE *popen(const char *command, const char *type);
+extern int pclose(FILE *stream);
#define testutil_popen(command, mode) popen(command, mode)
#define testutil_pclose(stream) pclose(stream)
#endif
@@ -70,6 +68,7 @@ extern "C" {
# pragma GCC diagnostic ignored "-Woverlength-strings"
#elif defined(_MSC_VER)
# pragma warning(disable: 4305) /* truncation from 'double' to 'float' */
+# pragma warning(disable: 4702) /* unreachable code */
#endif
extern int assertionFailed;
diff --git a/backend/tests/tools/bwipp_dump.ps.tar.xz b/backend/tests/tools/bwipp_dump.ps.tar.xz
index c5b0a300..2b6babb9 100644
Binary files a/backend/tests/tools/bwipp_dump.ps.tar.xz and b/backend/tests/tools/bwipp_dump.ps.tar.xz differ
diff --git a/backend/tif.h b/backend/tif.h
index a9c8ea01..6894b252 100644
--- a/backend/tif.h
+++ b/backend/tif.h
@@ -37,7 +37,7 @@
extern "C" {
#endif
-#ifdef _MSC_VER
+#ifdef OUT_USE_PRAGMA_PACK
#pragma pack(1)
#endif
@@ -60,7 +60,7 @@ extern "C" {
uint16_t blue;
} OUT_PACK tiff_color_t;
-#ifdef _MSC_VER
+#ifdef OUT_USE_PRAGMA_PACK
#pragma pack()
#endif
diff --git a/backend/tools/gen_gs1_lint.php b/backend/tools/gen_gs1_lint.php
index e23e382d..44690bfa 100644
--- a/backend/tools/gen_gs1_lint.php
+++ b/backend/tools/gen_gs1_lint.php
@@ -294,22 +294,21 @@ foreach ($spec_parts as $spec => $spec_part) {
$comment = ' (Used by';
foreach ($spec_comments[$spec] as $i => $spec_comment) {
if ($i) {
- if ($i > 3) {
- $comment .= '...';
- break;
- }
$comment .= ', ';
} else {
$comment .= ' ';
}
$comment .= $spec_comment;
}
+ if (strlen($comment) > 118 - 3 /*start comment*/ - 4 /*)end comment*/ - strlen($spec)) {
+ $comment = substr($comment, 0, 118 - 3 - 4 - strlen($spec) - 3) . '...';
+ }
$comment .= ')';
}
print << tr {
margin-bottom: 4em;
text-align: center;
}
@@ -332,7 +332,7 @@
Zint Barcode Generator and Zint Barcode Studio User
Manual
Version 2.13.0.9
-May 2024
+June 2024
@@ -1198,25 +1198,25 @@ as given below:
data-tag=": Sequence Format Characters">
Table : Sequence Format Characters
-
Character
Effect
-
+
$
Insert leading zeroes
-
+
#
Insert leading spaces
-
+
*
Insert leading asterisks
-
+
Any other character
Interpreted literally
@@ -1310,7 +1310,7 @@ table below.
-
Escape Sequence
ASCII Equivalent
Name
@@ -1318,106 +1318,106 @@ table below.
-
+
\0
0x00
NUL
Null character
-
+
\E
0x04
EOT
End of Transmission
-
+
\a
0x07
BEL
Bell
-
+
\b
0x08
BS
Backspace
-
+
\t
0x09
HT
Horizontal Tab
-
+
\n
0x0A
LF
Line Feed
-
+
\v
0x0B
VT
Vertical Tab
-
+
\f
0x0C
FF
Form Feed
-
+
\r
0x0D
CR
Carriage Return
-
+
\e
0x1B
ESC
Escape
-
+
\G
0x1D
GS
Group Separator
-
+
\R
0x1E
RS
Record Separator
-
+
\\
0x5C
\
Backslash
-
+
\dNNN
NNN
Any 8-bit character where NNN is decimal
(000-255)
-
+
\oNNN
0oNNN
Any 8-bit character where NNN is octal
(000-377)
-
+
\xNN
0xNN
Any 8-bit character where NN is
hexadecimal (00-FF)
-
+
\uNNNN
@@ -1425,7 +1425,7 @@ hexadecimal (00-FF)
class="footnote-ref" id="fnref2" role="doc-noteref">2
character where NNNN is hexadecimal (0000-FFFF)
-
+
\UNNNNNN
@@ -1468,45 +1468,45 @@ following table.