mirror of
https://github.com/zint/zint
synced 2024-11-16 20:57:25 +13:00
C25/DBAR: use new func gs1_check_digit() for common GS1 check digit calc
CODE11/CODE39/EXCODE39/CODE93/PZN/CHANNEL/VIN/DBAR/UPCEAN: fuller error messages DATAMATRIX: look_ahead_test debug counts DBAR: consolidate option_2 cols_per_row CMakeLists.txt: restore -fno-var-tracking-assignments for gcc no DEBUG overall: suppress various warnings on various configs testcommon.c: clean-up
This commit is contained in:
parent
33ebcea30c
commit
52c00e59ba
@ -74,12 +74,16 @@ if(ZINT_SANITIZE AND NOT MSVC)
|
||||
COMPILE_DEFINITIONS ${sanitizer_flag}
|
||||
LINK_OPTIONS ${sanitizer_flag}
|
||||
)
|
||||
message (STATUS "Support for ${sanitizer_flag} available ... ${RESULT_VAR}")
|
||||
message(STATUS "Support for ${sanitizer_flag} available ... ${RESULT_VAR}")
|
||||
if(RESULT_VAR)
|
||||
set(SANITIZER_FLAGS ${SANITIZER_FLAGS} ${sanitizer_flag})
|
||||
endif()
|
||||
endforeach()
|
||||
message(STATUS "Sanitizer flags: ${SANITIZER_FLAGS}")
|
||||
if(NOT ZINT_DEBUG AND CMAKE_CXX_COMPILER_ID MATCHES "GNU")
|
||||
# Gives warning on MainWindow::setupUI() and retries (& takes forever) if var-tracking-assignments enabled
|
||||
add_compile_options(-fno-var-tracking-assignments)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(APPLE)
|
||||
|
@ -33,6 +33,8 @@
|
||||
|
||||
#include <stdio.h>
|
||||
#include "common.h"
|
||||
#include "gs1.h"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#define inline _inline
|
||||
#endif
|
||||
@ -62,18 +64,6 @@ static inline char check_digit(const unsigned int count) {
|
||||
return itoc((10 - (count % 10)) % 10);
|
||||
}
|
||||
|
||||
/* Calculate the check digit - the same method used for EAN-13 (GS1 General Specifications 7.9.1) */
|
||||
static unsigned int gs1_checksum(const unsigned char source[], const int length) {
|
||||
int i;
|
||||
unsigned int count = 0;
|
||||
int factor = length & 1 ? 3 : 1;
|
||||
for (i = 0; i < length; i++) {
|
||||
count += factor * ctoi(source[i]);
|
||||
factor = factor == 1 ? 3 : 1;
|
||||
}
|
||||
return 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 char *table[10], const char *start_stop[2], const int error_base) {
|
||||
@ -97,7 +87,7 @@ static int c25_common(struct zint_symbol *symbol, const unsigned char source[],
|
||||
|
||||
if (have_checkdigit) {
|
||||
/* Add standard GS1 check digit */
|
||||
temp[length] = check_digit(gs1_checksum(source, length));
|
||||
temp[length] = gs1_check_digit(source, length);
|
||||
temp[++length] = '\0';
|
||||
}
|
||||
|
||||
@ -173,7 +163,7 @@ static int c25inter_common(struct zint_symbol *symbol, unsigned char source[], i
|
||||
|
||||
if (have_checkdigit) {
|
||||
/* Add standard GS1 check digit */
|
||||
temp[length] = check_digit(gs1_checksum(temp, length));
|
||||
temp[length] = gs1_check_digit(temp, length);
|
||||
temp[++length] = '\0';
|
||||
}
|
||||
|
||||
@ -258,7 +248,7 @@ INTERNAL int itf14(struct zint_symbol *symbol, unsigned char source[], int lengt
|
||||
ustrcpy(localstr + zeroes, source);
|
||||
|
||||
/* Calculate the check digit - the same method used for EAN-13 */
|
||||
localstr[13] = check_digit(gs1_checksum(localstr, 13));
|
||||
localstr[13] = gs1_check_digit(localstr, 13);
|
||||
localstr[14] = '\0';
|
||||
error_number = c25inter_common(symbol, localstr, 14, 1 /*dont_set_height*/);
|
||||
ustrcpy(symbol->text, localstr);
|
||||
|
@ -111,17 +111,17 @@ INTERNAL int code_11(struct zint_symbol *symbol, unsigned char source[], int len
|
||||
assert(length > 0);
|
||||
|
||||
if (length > 121) {
|
||||
strcpy(symbol->errtxt, "320: Input too long");
|
||||
strcpy(symbol->errtxt, "320: Input too long (121 character maximum)");
|
||||
return ZINT_ERROR_TOO_LONG;
|
||||
}
|
||||
error_number = is_sane(SODIUM, source, length);
|
||||
if (error_number == ZINT_ERROR_INVALID_DATA) {
|
||||
strcpy(symbol->errtxt, "321: Invalid characters in data");
|
||||
sprintf(symbol->errtxt, "321: Invalid characters in data (\"%s\" only)", SODIUM);
|
||||
return error_number;
|
||||
}
|
||||
|
||||
if (symbol->option_2 < 0 || symbol->option_2 > 2) {
|
||||
strcpy(symbol->errtxt, "339: Invalid check digit version");
|
||||
strcpy(symbol->errtxt, "339: Invalid check digit version (1, 2 only)");
|
||||
return ZINT_ERROR_INVALID_OPTION;
|
||||
}
|
||||
if (symbol->option_2 == 2) {
|
||||
@ -230,20 +230,21 @@ INTERNAL int c39(struct zint_symbol *symbol, unsigned char source[], int length)
|
||||
}
|
||||
|
||||
if ((symbol->symbology == BARCODE_LOGMARS) && (length > 30)) { /* MIL-STD-1189 Rev. B Section 5.2.6.2 */
|
||||
strcpy(symbol->errtxt, "322: Input too long");
|
||||
strcpy(symbol->errtxt, "322: Input too long (30 character maximum)");
|
||||
return ZINT_ERROR_TOO_LONG;
|
||||
/* Prevent encoded_data out-of-bounds >= 143 for BARCODE_HIBC_39 due to wider 'wide' bars */
|
||||
} else if ((symbol->symbology == BARCODE_HIBC_39) && (length > 68)) {
|
||||
strcpy(symbol->errtxt, "319: Input too long"); /* Note use 319 (2of5 range) as 340 taken by CODE128 */
|
||||
/* Note use 319 (2of5 range) as 340 taken by CODE128 */
|
||||
strcpy(symbol->errtxt, "319: Input too long (68 character maximum)");
|
||||
return ZINT_ERROR_TOO_LONG;
|
||||
} else if (length > 85) {
|
||||
strcpy(symbol->errtxt, "323: Input too long");
|
||||
strcpy(symbol->errtxt, "323: Input too long (85 character maximum)");
|
||||
return ZINT_ERROR_TOO_LONG;
|
||||
}
|
||||
to_upper(source);
|
||||
error_number = is_sane(SILVER, source, length);
|
||||
if (error_number == ZINT_ERROR_INVALID_DATA) {
|
||||
strcpy(symbol->errtxt, "324: Invalid characters in data");
|
||||
strcpy(symbol->errtxt, "324: Invalid characters in data (alphanumerics and \"-. $/+%\" only)");
|
||||
return error_number;
|
||||
}
|
||||
|
||||
@ -356,12 +357,12 @@ INTERNAL int pharmazentral(struct zint_symbol *symbol, unsigned char source[], i
|
||||
char localstr[11];
|
||||
|
||||
if (length > 7) {
|
||||
strcpy(symbol->errtxt, "325: Input wrong length");
|
||||
strcpy(symbol->errtxt, "325: Input wrong length (7 character maximum)");
|
||||
return ZINT_ERROR_TOO_LONG;
|
||||
}
|
||||
error_number = is_sane(NEON, source, length);
|
||||
if (error_number == ZINT_ERROR_INVALID_DATA) {
|
||||
strcpy(symbol->errtxt, "326: Invalid characters in data");
|
||||
strcpy(symbol->errtxt, "326: Invalid characters in data (digits only)");
|
||||
return error_number;
|
||||
}
|
||||
|
||||
@ -383,7 +384,7 @@ INTERNAL int pharmazentral(struct zint_symbol *symbol, unsigned char source[], i
|
||||
}
|
||||
|
||||
if (check_digit == 10) {
|
||||
strcpy(symbol->errtxt, "327: Invalid PZN Data");
|
||||
strcpy(symbol->errtxt, "327: Invalid PZN, check digit is '10'");
|
||||
return ZINT_ERROR_INVALID_DATA;
|
||||
}
|
||||
localstr[8] = itoc(check_digit);
|
||||
@ -417,7 +418,7 @@ INTERNAL int ec39(struct zint_symbol *symbol, unsigned char source[], int length
|
||||
int error_number;
|
||||
|
||||
if (length > 85) {
|
||||
strcpy(symbol->errtxt, "328: Input too long");
|
||||
strcpy(symbol->errtxt, "328: Input too long (85 character maximum)");
|
||||
return ZINT_ERROR_TOO_LONG;
|
||||
}
|
||||
|
||||
@ -425,7 +426,7 @@ INTERNAL int ec39(struct zint_symbol *symbol, unsigned char source[], int length
|
||||
for (i = 0; i < length; i++) {
|
||||
if (source[i] > 127) {
|
||||
/* Cannot encode extended ASCII */
|
||||
strcpy(symbol->errtxt, "329: Invalid characters in input data");
|
||||
strcpy(symbol->errtxt, "329: Invalid characters in data, extended ASCII not allowed");
|
||||
return ZINT_ERROR_INVALID_DATA;
|
||||
}
|
||||
ustrcat(buffer, EC39Ctrl[source[i]]);
|
||||
@ -458,7 +459,7 @@ INTERNAL int c93(struct zint_symbol *symbol, unsigned char source[], int length)
|
||||
strcpy(buffer, "");
|
||||
|
||||
if (length > 107) {
|
||||
strcpy(symbol->errtxt, "330: Input too long");
|
||||
strcpy(symbol->errtxt, "330: Input too long (107 character maximum)");
|
||||
return ZINT_ERROR_TOO_LONG;
|
||||
}
|
||||
|
||||
@ -466,7 +467,7 @@ INTERNAL int c93(struct zint_symbol *symbol, unsigned char source[], int length)
|
||||
for (i = 0; i < length; i++) {
|
||||
if (source[i] > 127) {
|
||||
/* Cannot encode extended ASCII */
|
||||
strcpy(symbol->errtxt, "331: Invalid characters in input data");
|
||||
strcpy(symbol->errtxt, "331: Invalid characters in data, extended ASCII not allowed");
|
||||
return ZINT_ERROR_INVALID_DATA;
|
||||
}
|
||||
strcat(buffer, C93Ctrl[source[i]]);
|
||||
@ -476,7 +477,7 @@ INTERNAL int c93(struct zint_symbol *symbol, unsigned char source[], int length)
|
||||
/* Now we can check the true length of the barcode */
|
||||
h = (int) strlen(buffer);
|
||||
if (h > 107) {
|
||||
strcpy(symbol->errtxt, "332: Input too long");
|
||||
strcpy(symbol->errtxt, "332: Input too long"); // TODO: Better error message
|
||||
return ZINT_ERROR_TOO_LONG;
|
||||
}
|
||||
|
||||
@ -674,21 +675,22 @@ nb0: if (++B[0] <= bmax[0]) goto lb0;
|
||||
|
||||
/* Channel Code - According to ANSI/AIM BC12-1998 */
|
||||
INTERNAL int channel_code(struct zint_symbol *symbol, unsigned char source[], int length) {
|
||||
static int max_ranges[] = { -1, -1, -1, 26, 292, 3493, 44072, 576688, 7742862 };
|
||||
int S[8] = {0}, B[8] = {0};
|
||||
long target_value = 0;
|
||||
char pattern[30];
|
||||
int channels, i;
|
||||
int error_number, range = 0, zeroes;
|
||||
int error_number, zeroes;
|
||||
char hrt[9];
|
||||
float height;
|
||||
|
||||
if (length > 7) {
|
||||
strcpy(symbol->errtxt, "333: Input too long");
|
||||
strcpy(symbol->errtxt, "333: Input too long (7 character maximum)");
|
||||
return ZINT_ERROR_TOO_LONG;
|
||||
}
|
||||
error_number = is_sane(NEON, source, length);
|
||||
if (error_number == ZINT_ERROR_INVALID_DATA) {
|
||||
strcpy(symbol->errtxt, "334: Invalid characters in data");
|
||||
strcpy(symbol->errtxt, "334: Invalid characters in data (digits only)");
|
||||
return error_number;
|
||||
}
|
||||
|
||||
@ -721,34 +723,8 @@ INTERNAL int channel_code(struct zint_symbol *symbol, unsigned char source[], in
|
||||
channels = 3;
|
||||
}
|
||||
|
||||
switch (channels) {
|
||||
case 3: if (target_value > 26) {
|
||||
range = 1;
|
||||
}
|
||||
break;
|
||||
case 4: if (target_value > 292) {
|
||||
range = 1;
|
||||
}
|
||||
break;
|
||||
case 5: if (target_value > 3493) {
|
||||
range = 1;
|
||||
}
|
||||
break;
|
||||
case 6: if (target_value > 44072) {
|
||||
range = 1;
|
||||
}
|
||||
break;
|
||||
case 7: if (target_value > 576688) {
|
||||
range = 1;
|
||||
}
|
||||
break;
|
||||
case 8: if (target_value > 7742862) {
|
||||
range = 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (range) {
|
||||
strcpy(symbol->errtxt, "335: Value out of range");
|
||||
if (target_value > max_ranges[channels]) {
|
||||
sprintf(symbol->errtxt, "335: Value out of range (0 to %d) for %d channels", max_ranges[channels], channels);
|
||||
return ZINT_ERROR_INVALID_DATA;
|
||||
}
|
||||
|
||||
@ -804,13 +780,13 @@ INTERNAL int vin(struct zint_symbol *symbol, unsigned char source[], int length)
|
||||
|
||||
// Check length
|
||||
if (length != 17) {
|
||||
strcpy(symbol->errtxt, "336: Input wrong length, 17 characters required");
|
||||
strcpy(symbol->errtxt, "336: Input wrong length (17 characters required)");
|
||||
return ZINT_ERROR_TOO_LONG;
|
||||
}
|
||||
|
||||
// Check input characters, I, O and Q are not allowed
|
||||
if (is_sane(ARSENIC, source, length) == ZINT_ERROR_INVALID_DATA) {
|
||||
strcpy(symbol->errtxt, "337: Invalid characters in input data");
|
||||
sprintf(symbol->errtxt, "337: Invalid characters in data (\"%s\" only)", ARSENIC);
|
||||
return ZINT_ERROR_INVALID_DATA;
|
||||
}
|
||||
|
||||
@ -852,8 +828,8 @@ INTERNAL int vin(struct zint_symbol *symbol, unsigned char source[], int length)
|
||||
}
|
||||
|
||||
if (input_check != output_check) {
|
||||
strcpy(symbol->errtxt, "338: Invalid check digit in input data");
|
||||
return ZINT_ERROR_INVALID_DATA;
|
||||
sprintf(symbol->errtxt, "338: Invalid check digit '%c', expecting '%c'", input_check, output_check);
|
||||
return ZINT_ERROR_INVALID_CHECK;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -269,7 +269,7 @@ static int p_r_6_2_1(const unsigned char inputData[], const int position, const
|
||||
|
||||
/* 'look ahead test' from Annex P */
|
||||
static int look_ahead_test(const unsigned char inputData[], const int sourcelen, const int position,
|
||||
const int current_mode, const int gs1) {
|
||||
const int current_mode, const int gs1, const int debug) {
|
||||
float ascii_count, c40_count, text_count, x12_count, edf_count, b256_count;
|
||||
int ascii_rnded, c40_rnded, text_rnded, x12_rnded, edf_rnded, b256_rnded;
|
||||
float cnt_1;
|
||||
@ -379,6 +379,12 @@ static int look_ahead_test(const unsigned char inputData[], const int sourcelen,
|
||||
text_count = stripf(text_count);
|
||||
x12_count = stripf(x12_count);
|
||||
c40_count = stripf(c40_count);
|
||||
if (debug) {
|
||||
printf("\n(%d, %d, %d): ascii_count %.8g, b256_count %.8g, edf_count %.8g, text_count %.8g"
|
||||
", x12_count %.8g, c40_count %.8g",
|
||||
current_mode, position, sp, ascii_count, b256_count, edf_count, text_count,
|
||||
x12_count, c40_count);
|
||||
}
|
||||
|
||||
cnt_1 = ascii_count + 1.0f;
|
||||
if (cnt_1 <= b256_count && cnt_1 <= edf_count && cnt_1 <= text_count && cnt_1 <= x12_count
|
||||
@ -428,6 +434,12 @@ static int look_ahead_test(const unsigned char inputData[], const int sourcelen,
|
||||
text_rnded = (int) ceilf(stripf(text_count));
|
||||
x12_rnded = (int) ceilf(stripf(x12_count));
|
||||
c40_rnded = (int) ceilf(stripf(c40_count));
|
||||
if (debug) {
|
||||
printf("\nEOD(%d, %d): ascii_rnded %d, b256_rnded %d, edf_rnded %d, text_rnded %d, x12_rnded %d (%g)"
|
||||
", c40_rnded %d (%g)\n",
|
||||
current_mode, position, ascii_rnded, b256_rnded, edf_rnded, text_rnded, x12_rnded, x12_count,
|
||||
c40_rnded, c40_count);
|
||||
}
|
||||
|
||||
if (ascii_rnded <= b256_rnded && ascii_rnded <= edf_rnded && ascii_rnded <= text_rnded && ascii_rnded <= x12_rnded
|
||||
&& ascii_rnded <= c40_rnded) {
|
||||
@ -695,7 +707,7 @@ static int dm200encode(struct zint_symbol *symbol, const unsigned char source[],
|
||||
tp++;
|
||||
sp += 2;
|
||||
} else {
|
||||
next_mode = look_ahead_test(source, inputlen, sp, current_mode, gs1);
|
||||
next_mode = look_ahead_test(source, inputlen, sp, current_mode, gs1, debug);
|
||||
|
||||
if (next_mode != DM_ASCII) {
|
||||
switch (next_mode) {
|
||||
@ -753,7 +765,7 @@ static int dm200encode(struct zint_symbol *symbol, const unsigned char source[],
|
||||
|
||||
next_mode = current_mode;
|
||||
if (process_p == 0) {
|
||||
next_mode = look_ahead_test(source, inputlen, sp, current_mode, gs1);
|
||||
next_mode = look_ahead_test(source, inputlen, sp, current_mode, gs1, debug);
|
||||
}
|
||||
|
||||
if (next_mode != current_mode) {
|
||||
@ -809,7 +821,7 @@ static int dm200encode(struct zint_symbol *symbol, const unsigned char source[],
|
||||
|
||||
next_mode = DM_X12;
|
||||
if (process_p == 0) {
|
||||
next_mode = look_ahead_test(source, inputlen, sp, current_mode, gs1);
|
||||
next_mode = look_ahead_test(source, inputlen, sp, current_mode, gs1, debug);
|
||||
}
|
||||
|
||||
if (next_mode != DM_X12) {
|
||||
@ -844,7 +856,7 @@ static int dm200encode(struct zint_symbol *symbol, const unsigned char source[],
|
||||
if (process_p == 3) {
|
||||
/* Note different then spec Step (f)(1), which suggests checking when 0, but this seems to work
|
||||
better in many cases. */
|
||||
next_mode = look_ahead_test(source, inputlen, sp, current_mode, gs1);
|
||||
next_mode = look_ahead_test(source, inputlen, sp, current_mode, gs1, debug);
|
||||
}
|
||||
|
||||
if (next_mode != DM_EDIFACT) {
|
||||
@ -868,7 +880,7 @@ static int dm200encode(struct zint_symbol *symbol, const unsigned char source[],
|
||||
|
||||
/* step (g) Base 256 encodation */
|
||||
} else if (current_mode == DM_BASE256) {
|
||||
next_mode = look_ahead_test(source, inputlen, sp, current_mode, gs1);
|
||||
next_mode = look_ahead_test(source, inputlen, sp, current_mode, gs1, debug);
|
||||
|
||||
if (next_mode == DM_BASE256) {
|
||||
target[tp] = source[sp];
|
||||
|
@ -1386,3 +1386,17 @@ INTERNAL int gs1_verify(struct zint_symbol *symbol, const unsigned char source[]
|
||||
/* the character '[' in the reduced string refers to the FNC1 character */
|
||||
return error_value;
|
||||
}
|
||||
|
||||
/* Helper to return standard GS1 check digit (GS1 General Specifications 7.9.1) */
|
||||
INTERNAL char gs1_check_digit(const unsigned char source[], const int length) {
|
||||
int i;
|
||||
int count = 0;
|
||||
int factor = length & 1 ? 3 : 1;
|
||||
|
||||
for (i = 0; i < length; i++) {
|
||||
count += factor * ctoi(source[i]);
|
||||
factor = factor == 1 ? 3 : 1;
|
||||
}
|
||||
|
||||
return itoc((10 - (count % 10)) % 10);
|
||||
}
|
||||
|
@ -39,6 +39,7 @@ extern "C" {
|
||||
|
||||
INTERNAL int gs1_verify(struct zint_symbol *symbol, const unsigned char source[], const int src_len,
|
||||
unsigned char reduced[]);
|
||||
INTERNAL char gs1_check_digit(const unsigned char source[], const int src_len);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
@ -1286,33 +1286,18 @@ int ZBarcode_Print(struct zint_symbol *symbol, int rotate_angle) {
|
||||
to_upper((unsigned char *) output);
|
||||
|
||||
if (!(strcmp(output, "PNG"))) {
|
||||
if (symbol->scale < 1.0f) {
|
||||
symbol->text[0] = '\0';
|
||||
}
|
||||
error_number = plot_raster(symbol, rotate_angle, OUT_PNG_FILE);
|
||||
|
||||
} else if (!(strcmp(output, "BMP"))) {
|
||||
if (symbol->scale < 1.0f) {
|
||||
symbol->text[0] = '\0';
|
||||
}
|
||||
error_number = plot_raster(symbol, rotate_angle, OUT_BMP_FILE);
|
||||
|
||||
} else if (!(strcmp(output, "PCX"))) {
|
||||
if (symbol->scale < 1.0f) {
|
||||
symbol->text[0] = '\0';
|
||||
}
|
||||
error_number = plot_raster(symbol, rotate_angle, OUT_PCX_FILE);
|
||||
|
||||
} else if (!(strcmp(output, "GIF"))) {
|
||||
if (symbol->scale < 1.0f) {
|
||||
symbol->text[0] = '\0';
|
||||
}
|
||||
error_number = plot_raster(symbol, rotate_angle, OUT_GIF_FILE);
|
||||
|
||||
} else if (!(strcmp(output, "TIF"))) {
|
||||
if (symbol->scale < 1.0f) {
|
||||
symbol->text[0] = '\0';
|
||||
}
|
||||
error_number = plot_raster(symbol, rotate_angle, OUT_TIF_FILE);
|
||||
|
||||
} else if (!(strcmp(output, "TXT"))) {
|
||||
@ -1522,7 +1507,7 @@ int ZBarcode_Encode_File(struct zint_symbol *symbol, char *filename) {
|
||||
if (file_opened) {
|
||||
fclose(file);
|
||||
}
|
||||
ret = ZBarcode_Encode(symbol, buffer, nRead);
|
||||
ret = ZBarcode_Encode(symbol, buffer, (int) nRead);
|
||||
free(buffer);
|
||||
return ret;
|
||||
}
|
||||
|
@ -44,8 +44,8 @@ INTERNAL int output_process_upcean(struct zint_symbol *symbol, int *p_main_width
|
||||
unsigned char addon[6], int *p_addon_gap);
|
||||
INTERNAL float output_large_bar_height(struct zint_symbol *symbol, int si);
|
||||
INTERNAL void output_upcean_split_text(int upceanflag, unsigned char text[],
|
||||
unsigned char textpart1[], unsigned char textpart2[], unsigned char textpart3[],
|
||||
unsigned char textpart4[]);
|
||||
unsigned char textpart1[5], unsigned char textpart2[7], unsigned char textpart3[7],
|
||||
unsigned char textpart4[2]);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
165
backend/rss.c
165
backend/rss.c
@ -31,7 +31,7 @@
|
||||
*/
|
||||
/* vim: set ts=4 sw=4 et : */
|
||||
|
||||
/* The functions "combins" and "getRSSwidths" are copyright BSI and are
|
||||
/* The functions "rss_combins" and "getRSSwidths" are copyright BSI and are
|
||||
released with permission under the following terms:
|
||||
|
||||
"Copyright subsists in all BSI publications. BSI also holds the copyright, in the
|
||||
@ -73,11 +73,11 @@
|
||||
#include "gs1.h"
|
||||
#include "general_field.h"
|
||||
|
||||
/**********************************************************************
|
||||
* combins(n,r): returns the number of Combinations of r selected from n:
|
||||
/****************************************************************************
|
||||
* rss_combins(n,r): returns the number of Combinations of r selected from n:
|
||||
* Combinations = n! / ((n - r)! * r!)
|
||||
**********************************************************************/
|
||||
static int combins(const int n, const int r) {
|
||||
****************************************************************************/
|
||||
static int rss_combins(const int n, const int r) {
|
||||
int i, j;
|
||||
int maxDenom, minDenom;
|
||||
int val;
|
||||
@ -128,11 +128,11 @@ static void getRSSwidths(int widths[], int val, int n, const int elements, const
|
||||
;
|
||||
elmWidth++, narrowMask &= ~(1 << bar)) {
|
||||
/* get all combinations */
|
||||
subVal = combins(n - elmWidth - 1, elements - bar - 2);
|
||||
subVal = rss_combins(n - elmWidth - 1, elements - bar - 2);
|
||||
/* less combinations with no single-module element */
|
||||
if ((!noNarrow) && (!narrowMask) &&
|
||||
(n - elmWidth - (elements - bar - 1) >= elements - bar - 1)) {
|
||||
subVal -= combins(n - elmWidth - (elements - bar), elements - bar - 2);
|
||||
if ((!noNarrow) && (!narrowMask)
|
||||
&& (n - elmWidth - (elements - bar - 1) >= elements - bar - 1)) {
|
||||
subVal -= rss_combins(n - elmWidth - (elements - bar), elements - bar - 2);
|
||||
}
|
||||
/* less combinations with elements > maxVal */
|
||||
if (elements - bar - 1 > 1) {
|
||||
@ -140,7 +140,7 @@ static void getRSSwidths(int widths[], int val, int n, const int elements, const
|
||||
for (mxwElement = n - elmWidth - (elements - bar - 2);
|
||||
mxwElement > maxWidth;
|
||||
mxwElement--) {
|
||||
lessVal += combins(n - elmWidth - mxwElement - 1, elements - bar - 3);
|
||||
lessVal += rss_combins(n - elmWidth - mxwElement - 1, elements - bar - 3);
|
||||
}
|
||||
subVal -= lessVal * (elements - 1 - bar);
|
||||
} else if (n - elmWidth > maxWidth) {
|
||||
@ -157,24 +157,8 @@ static void getRSSwidths(int widths[], int val, int n, const int elements, const
|
||||
return;
|
||||
}
|
||||
|
||||
/* Calculate check digit from Annex A */
|
||||
static int calc_check_digit(const unsigned char *src) {
|
||||
int i, check_digit;
|
||||
int count = 0;
|
||||
|
||||
for (i = 0; i < 13; i++) {
|
||||
count += (i & 1) ? ctoi(src[i]) : 3 * ctoi(src[i]);
|
||||
}
|
||||
check_digit = 10 - (count % 10);
|
||||
if (check_digit == 10) {
|
||||
check_digit = 0;
|
||||
}
|
||||
|
||||
return check_digit;
|
||||
}
|
||||
|
||||
/* Set GTIN-14 human readable text */
|
||||
static void set_gtin14_hrt(struct zint_symbol *symbol, const unsigned char *source, const int src_len) {
|
||||
static void rss_set_gtin14_hrt(struct zint_symbol *symbol, const unsigned char *source, const int src_len) {
|
||||
int i;
|
||||
unsigned char hrt[15];
|
||||
|
||||
@ -186,7 +170,7 @@ static void set_gtin14_hrt(struct zint_symbol *symbol, const unsigned char *sour
|
||||
hrt[12 - i] = source[src_len - i - 1];
|
||||
}
|
||||
|
||||
hrt[13] = itoc(calc_check_digit(hrt));
|
||||
hrt[13] = gs1_check_digit(hrt, 13);
|
||||
hrt[14] = '\0';
|
||||
|
||||
ustrcat(symbol->text, hrt);
|
||||
@ -319,18 +303,19 @@ INTERNAL int rss14_cc(struct zint_symbol *symbol, unsigned char source[], int sr
|
||||
separator_row = 0;
|
||||
|
||||
if (src_len > 14) { /* Allow check digit to be specified (will be verified and ignored) */
|
||||
strcpy(symbol->errtxt, "380: Input too long");
|
||||
strcpy(symbol->errtxt, "380: Input too long (14 character maximum)");
|
||||
return ZINT_ERROR_TOO_LONG;
|
||||
}
|
||||
error_number = is_sane(NEON, source, src_len);
|
||||
if (error_number == ZINT_ERROR_INVALID_DATA) {
|
||||
strcpy(symbol->errtxt, "381: Invalid characters in data");
|
||||
strcpy(symbol->errtxt, "381: Invalid characters in data (digits only)");
|
||||
return error_number;
|
||||
}
|
||||
|
||||
if (src_len == 14) { /* Verify check digit */
|
||||
if (calc_check_digit(source) != ctoi(source[13])) {
|
||||
strcpy(symbol->errtxt, "388: Invalid check digit");
|
||||
if (gs1_check_digit(source, 13) != source[13]) {
|
||||
sprintf(symbol->errtxt, "388: Invalid check digit '%c', expecting '%c'",
|
||||
source[13], gs1_check_digit(source, 13));
|
||||
return ZINT_ERROR_INVALID_CHECK;
|
||||
}
|
||||
src_len--; /* Ignore */
|
||||
@ -422,7 +407,6 @@ INTERNAL int rss14_cc(struct zint_symbol *symbol, unsigned char source[], int sr
|
||||
v_odd[2] = (data_character[2] - g_sum_table[data_group[2]]) / t_table[data_group[2]];
|
||||
v_even[2] = (data_character[2] - g_sum_table[data_group[2]]) % t_table[data_group[2]];
|
||||
|
||||
|
||||
/* Use RSS subset width algorithm */
|
||||
for (i = 0; i < 4; i++) {
|
||||
if ((i == 0) || (i == 2)) {
|
||||
@ -450,7 +434,6 @@ INTERNAL int rss14_cc(struct zint_symbol *symbol, unsigned char source[], int sr
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
checksum = 0;
|
||||
/* Calculate the checksum */
|
||||
for (i = 0; i < 8; i++) {
|
||||
@ -508,7 +491,7 @@ INTERNAL int rss14_cc(struct zint_symbol *symbol, unsigned char source[], int sr
|
||||
symbol->rows = symbol->rows + 1;
|
||||
|
||||
/* Set human readable text */
|
||||
set_gtin14_hrt(symbol, source, src_len);
|
||||
rss_set_gtin14_hrt(symbol, source, src_len);
|
||||
|
||||
#ifdef COMPLIANT_HEIGHTS
|
||||
/* Minimum height is 13X for truncated symbol ISO/IEC 24724:2011 5.3.1
|
||||
@ -658,18 +641,19 @@ INTERNAL int rsslimited_cc(struct zint_symbol *symbol, unsigned char source[], i
|
||||
separator_row = 0;
|
||||
|
||||
if (src_len > 14) { /* Allow check digit to be specified (will be verified and ignored) */
|
||||
strcpy(symbol->errtxt, "382: Input too long");
|
||||
strcpy(symbol->errtxt, "382: Input too long (14 character maximum)");
|
||||
return ZINT_ERROR_TOO_LONG;
|
||||
}
|
||||
error_number = is_sane(NEON, source, src_len);
|
||||
if (error_number == ZINT_ERROR_INVALID_DATA) {
|
||||
strcpy(symbol->errtxt, "383: Invalid characters in data");
|
||||
strcpy(symbol->errtxt, "383: Invalid characters in data (digits only)");
|
||||
return error_number;
|
||||
}
|
||||
|
||||
if (src_len == 14) { /* Verify check digit */
|
||||
if (calc_check_digit(source) != ctoi(source[13])) {
|
||||
strcpy(symbol->errtxt, "389: Invalid check digit");
|
||||
if (gs1_check_digit(source, 13) != source[13]) {
|
||||
sprintf(symbol->errtxt, "389: Invalid check digit '%c', expecting '%c'",
|
||||
source[13], gs1_check_digit(source, 13));
|
||||
return ZINT_ERROR_INVALID_CHECK;
|
||||
}
|
||||
src_len--; /* Ignore */
|
||||
@ -677,7 +661,7 @@ INTERNAL int rsslimited_cc(struct zint_symbol *symbol, unsigned char source[], i
|
||||
|
||||
if (src_len == 13) {
|
||||
if ((source[0] != '0') && (source[0] != '1')) {
|
||||
strcpy(symbol->errtxt, "384: Input out of range");
|
||||
strcpy(symbol->errtxt, "384: Input out of range (0 to 1999999999999)");
|
||||
return ZINT_ERROR_INVALID_DATA;
|
||||
}
|
||||
}
|
||||
@ -810,7 +794,7 @@ INTERNAL int rsslimited_cc(struct zint_symbol *symbol, unsigned char source[], i
|
||||
}
|
||||
|
||||
/* Set human readable text */
|
||||
set_gtin14_hrt(symbol, source, src_len);
|
||||
rss_set_gtin14_hrt(symbol, source, src_len);
|
||||
|
||||
/* ISO/IEC 24724:2011 6.2 10X minimum height, use as default also */
|
||||
if (symbol->symbology == BARCODE_DBAR_LTD_CC) {
|
||||
@ -846,11 +830,11 @@ INTERNAL int rss_date(const unsigned char source[], const int src_posn) {
|
||||
}
|
||||
|
||||
/* Handles all data encodation from section 7.2.5 of ISO/IEC 24724 */
|
||||
static int rss_binary_string(struct zint_symbol *symbol, const unsigned char source[], char binary_string[],
|
||||
int *p_bp) {
|
||||
static int rssexp_binary_string(struct zint_symbol *symbol, const unsigned char source[], char binary_string[],
|
||||
int cols_per_row, int *p_bp) {
|
||||
int encoding_method, i, j, read_posn, debug = (symbol->debug & ZINT_DEBUG_PRINT), mode = NUMERIC;
|
||||
char last_digit = '\0';
|
||||
int symbol_characters, characters_per_row;
|
||||
int symbol_characters, characters_per_row = cols_per_row * 2;
|
||||
int length = (int) ustrlen(source);
|
||||
#ifndef _MSC_VER
|
||||
char general_field[length + 1];
|
||||
@ -897,9 +881,9 @@ static int rss_binary_string(struct zint_symbol *symbol, const unsigned char sou
|
||||
encoding_method = 7;
|
||||
}
|
||||
|
||||
} else if ((length == 34) && (source[26] == '1') &&
|
||||
(source[27] == '1' || source[27] == '3' || source[27] == '5' || source[27] == '7') &&
|
||||
rss_date(source, 28) >= 0) {
|
||||
} else if ((length == 34) && (source[26] == '1')
|
||||
&& (source[27] == '1' || source[27] == '3' || source[27] == '5' || source[27] == '7')
|
||||
&& rss_date(source, 28) >= 0) {
|
||||
|
||||
/* (01), (310x) and (11) - metric weight and production date */
|
||||
/* (01), (310x) and (13) - metric weight and packaging date */
|
||||
@ -928,9 +912,9 @@ static int rss_binary_string(struct zint_symbol *symbol, const unsigned char sou
|
||||
encoding_method = 8;
|
||||
}
|
||||
|
||||
} else if ((length == 34) && (source[26] == '1') &&
|
||||
(source[27] == '1' || source[27] == '3' || source[27] == '5' || source[27] == '7') &&
|
||||
rss_date(source, 28) >= 0) {
|
||||
} else if ((length == 34) && (source[26] == '1')
|
||||
&& (source[27] == '1' || source[27] == '3' || source[27] == '5' || source[27] == '7')
|
||||
&& rss_date(source, 28) >= 0) {
|
||||
|
||||
/* (01), (320x) and (11) - English weight and production date */
|
||||
/* (01), (320x) and (13) - English weight and packaging date */
|
||||
@ -988,7 +972,7 @@ static int rss_binary_string(struct zint_symbol *symbol, const unsigned char sou
|
||||
if ((source[i] < '0') || (source[i] > '9')) {
|
||||
if (source[i] != '[') {
|
||||
/* Something is wrong */
|
||||
strcpy(symbol->errtxt, "385: Invalid characters in input data");
|
||||
strcpy(symbol->errtxt, "385: Invalid characters in input data"); // TODO: Better error message
|
||||
return ZINT_ERROR_INVALID_DATA;
|
||||
}
|
||||
}
|
||||
@ -1089,7 +1073,7 @@ static int rss_binary_string(struct zint_symbol *symbol, const unsigned char sou
|
||||
|
||||
if (!general_field_encode(general_field, j, &mode, &last_digit, binary_string, &bp)) {
|
||||
/* Invalid characters in input data */
|
||||
strcpy(symbol->errtxt, "386: Invalid characters in input data");
|
||||
strcpy(symbol->errtxt, "386: Invalid characters in input data"); // TODO: Better error message
|
||||
return ZINT_ERROR_INVALID_DATA;
|
||||
}
|
||||
}
|
||||
@ -1102,17 +1086,9 @@ static int rss_binary_string(struct zint_symbol *symbol, const unsigned char sou
|
||||
}
|
||||
symbol_characters = ((bp + remainder) / 12) + 1;
|
||||
|
||||
if ((symbol->symbology == BARCODE_DBAR_EXPSTK) || (symbol->symbology == BARCODE_DBAR_EXPSTK_CC)) {
|
||||
characters_per_row = symbol->option_2 * 2;
|
||||
|
||||
if ((characters_per_row < 2) || (characters_per_row > 20)) {
|
||||
characters_per_row = 4;
|
||||
}
|
||||
|
||||
if ((symbol_characters % characters_per_row) == 1) {
|
||||
if (characters_per_row && (symbol_characters % characters_per_row) == 1) { // DBAR_EXPSTK
|
||||
symbol_characters++;
|
||||
}
|
||||
}
|
||||
|
||||
if (symbol_characters < 4) {
|
||||
symbol_characters = 4;
|
||||
@ -1139,17 +1115,9 @@ static int rss_binary_string(struct zint_symbol *symbol, const unsigned char sou
|
||||
}
|
||||
symbol_characters = ((bp + remainder) / 12) + 1;
|
||||
|
||||
if ((symbol->symbology == BARCODE_DBAR_EXPSTK) || (symbol->symbology == BARCODE_DBAR_EXPSTK_CC)) {
|
||||
characters_per_row = symbol->option_2 * 2;
|
||||
|
||||
if ((characters_per_row < 2) || (characters_per_row > 20)) {
|
||||
characters_per_row = 4;
|
||||
}
|
||||
|
||||
if ((symbol_characters % characters_per_row) == 1) {
|
||||
if (characters_per_row && (symbol_characters % characters_per_row) == 1) { // DBAR_EXPSTK
|
||||
symbol_characters++;
|
||||
}
|
||||
}
|
||||
|
||||
if (symbol_characters < 4) {
|
||||
symbol_characters = 4;
|
||||
@ -1161,7 +1129,7 @@ static int rss_binary_string(struct zint_symbol *symbol, const unsigned char sou
|
||||
}
|
||||
|
||||
if (bp > 252) { /* 252 = (21 * 12) */
|
||||
strcpy(symbol->errtxt, "387: Input too long");
|
||||
strcpy(symbol->errtxt, "387: Input too long"); // TODO: Better error message
|
||||
return ZINT_ERROR_TOO_LONG;
|
||||
}
|
||||
|
||||
@ -1282,6 +1250,7 @@ INTERNAL int rssexpanded_cc(struct zint_symbol *symbol, unsigned char source[],
|
||||
unsigned int bin_len = 13 * src_len + 200 + 1;
|
||||
int widths[4];
|
||||
int bp = 0;
|
||||
int cols_per_row = 0;
|
||||
int stack_rows = 1;
|
||||
#ifndef _MSC_VER
|
||||
unsigned char reduced[src_len + 1];
|
||||
@ -1297,6 +1266,7 @@ INTERNAL int rssexpanded_cc(struct zint_symbol *symbol, unsigned char source[],
|
||||
if (error_number >= ZINT_ERROR) {
|
||||
return error_number;
|
||||
}
|
||||
warn_number = error_number;
|
||||
|
||||
if (symbol->debug & ZINT_DEBUG_PRINT) {
|
||||
printf("Reduced (%d): %s\n", (int) ustrlen(reduced), reduced);
|
||||
@ -1315,9 +1285,22 @@ INTERNAL int rssexpanded_cc(struct zint_symbol *symbol, unsigned char source[],
|
||||
binary_string[bp++] = '0';
|
||||
}
|
||||
|
||||
i = rss_binary_string(symbol, reduced, binary_string, &bp);
|
||||
if (i != 0) {
|
||||
return i;
|
||||
if ((symbol->symbology == BARCODE_DBAR_EXPSTK) || (symbol->symbology == BARCODE_DBAR_EXPSTK_CC)) {
|
||||
cols_per_row = 2; /* Default */
|
||||
if (symbol->option_2 >= 1 && symbol->option_2 <= 11) {
|
||||
cols_per_row = symbol->option_2;
|
||||
if (cc_rows && (cols_per_row == 1)) {
|
||||
/* "There shall be a minimum of four symbol characters in the
|
||||
first row of an RSS Expanded Stacked symbol when it is the linear
|
||||
component of an EAN.UCC Composite symbol." */
|
||||
cols_per_row = 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
error_number = rssexp_binary_string(symbol, reduced, binary_string, cols_per_row, &bp);
|
||||
if (error_number != 0) {
|
||||
return error_number;
|
||||
}
|
||||
|
||||
data_chars = bp / 12;
|
||||
@ -1479,18 +1462,8 @@ INTERNAL int rssexpanded_cc(struct zint_symbol *symbol, unsigned char source[],
|
||||
* Patch by Daniel Frede
|
||||
*/
|
||||
|
||||
if ((symbol->option_2 < 1) || (symbol->option_2 > 11)) {
|
||||
symbol->option_2 = 2;
|
||||
}
|
||||
if (cc_rows && (symbol->option_2 == 1)) {
|
||||
/* "There shall be a minimum of four symbol characters in the
|
||||
first row of an RSS Expanded Stacked symbol when it is the linear
|
||||
component of an EAN.UCC Composite symbol." */
|
||||
symbol->option_2 = 2;
|
||||
}
|
||||
|
||||
stack_rows = codeblocks / symbol->option_2;
|
||||
if (codeblocks % symbol->option_2 > 0) {
|
||||
stack_rows = codeblocks / cols_per_row;
|
||||
if (codeblocks % cols_per_row > 0) {
|
||||
stack_rows++;
|
||||
}
|
||||
|
||||
@ -1502,10 +1475,10 @@ INTERNAL int rssexpanded_cc(struct zint_symbol *symbol, unsigned char source[],
|
||||
int num_columns;
|
||||
|
||||
/* Number of columns in current row */
|
||||
if (current_row * symbol->option_2 > codeblocks) {
|
||||
if (current_row * cols_per_row > codeblocks) {
|
||||
num_columns = codeblocks - current_block;
|
||||
} else {
|
||||
num_columns = symbol->option_2;
|
||||
num_columns = cols_per_row;
|
||||
}
|
||||
|
||||
/* Row Start */
|
||||
@ -1515,8 +1488,8 @@ INTERNAL int rssexpanded_cc(struct zint_symbol *symbol, unsigned char source[],
|
||||
|
||||
/* If last row and is partial and even-numbered, and have even columns (segment pairs),
|
||||
* and odd number of finders (== odd number of columns) */
|
||||
if ((current_row == stack_rows) && (num_columns != symbol->option_2) &&
|
||||
!(current_row & 1) && !(symbol->option_2 & 1) && (num_columns & 1)) {
|
||||
if ((current_row == stack_rows) && (num_columns != cols_per_row) && !(current_row & 1)
|
||||
&& !(cols_per_row & 1) && (num_columns & 1)) {
|
||||
/* Special case bottom row */
|
||||
special_case_row = 1;
|
||||
sub_elements[0] = 2; /* Extra space (latch set below) */
|
||||
@ -1524,7 +1497,7 @@ INTERNAL int rssexpanded_cc(struct zint_symbol *symbol, unsigned char source[],
|
||||
|
||||
/* If odd number of columns or current row odd-numbered or special case last row then left-to-right,
|
||||
* else right-to-left */
|
||||
if ((symbol->option_2 & 1) || (current_row & 1) || special_case_row) {
|
||||
if ((cols_per_row & 1) || (current_row & 1) || special_case_row) {
|
||||
left_to_right = 1;
|
||||
} else {
|
||||
left_to_right = 0;
|
||||
@ -1533,7 +1506,7 @@ INTERNAL int rssexpanded_cc(struct zint_symbol *symbol, unsigned char source[],
|
||||
if (symbol->debug & ZINT_DEBUG_PRINT) {
|
||||
if (current_row == stack_rows) {
|
||||
printf("Last row: number of columns: %d / %d, left to right: %d, special case: %d\n",
|
||||
num_columns, symbol->option_2, left_to_right, special_case_row);
|
||||
num_columns, cols_per_row, left_to_right, special_case_row);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1553,7 +1526,7 @@ INTERNAL int rssexpanded_cc(struct zint_symbol *symbol, unsigned char source[],
|
||||
}
|
||||
reader++;
|
||||
current_block++;
|
||||
} while ((reader < symbol->option_2) && (current_block < codeblocks));
|
||||
} while ((reader < cols_per_row) && (current_block < codeblocks));
|
||||
|
||||
/* Row Stop */
|
||||
sub_elements[elements_in_sub] = 1; // right guard
|
||||
@ -1574,7 +1547,7 @@ INTERNAL int rssexpanded_cc(struct zint_symbol *symbol, unsigned char source[],
|
||||
int odd_last_row = (current_row == stack_rows) && (data_chars % 2 == 0);
|
||||
|
||||
/* middle separator pattern (above current row) */
|
||||
for (j = 5; j < (49 * symbol->option_2); j += 2) {
|
||||
for (j = 5; j < (49 * cols_per_row); j += 2) {
|
||||
set_module(symbol, symbol->rows - 2, j);
|
||||
}
|
||||
symbol->row_height[symbol->rows - 2] = 1;
|
||||
@ -1609,7 +1582,11 @@ INTERNAL int rssexpanded_cc(struct zint_symbol *symbol, unsigned char source[],
|
||||
symbol->height = symbol->height ? 34.0f : 34.0f * stack_rows; /* Pass back min row or default height */
|
||||
} else {
|
||||
#ifdef COMPLIANT_HEIGHTS
|
||||
if (warn_number) {
|
||||
(void) set_height(symbol, 34.0f, 34.0f * stack_rows, 0.0f, 0 /*no_errtxt*/);
|
||||
} else {
|
||||
warn_number = set_height(symbol, 34.0f, 34.0f * stack_rows, 0.0f, 0 /*no_errtxt*/);
|
||||
}
|
||||
#else
|
||||
(void) set_height(symbol, 0.0f, 34.0f * stack_rows, 0.0f, 1 /*no_errtxt*/);
|
||||
#endif
|
||||
|
@ -205,11 +205,12 @@ static void test_input(int index, int debug) {
|
||||
/* 20*/ { BARCODE_PZN, -1, "A", -1, ZINT_ERROR_INVALID_DATA, -1, -1 },
|
||||
/* 21*/ { BARCODE_PZN, -1, "1000006", -1, ZINT_ERROR_INVALID_DATA, -1, -1 }, // Check digit == 10 so can't be used
|
||||
/* 22*/ { BARCODE_VIN, -1, "5GZCZ43D13S812715", -1, 0, 1, 246 },
|
||||
/* 23*/ { BARCODE_VIN, -1, "5GZCZ43D23S812715", -1, ZINT_ERROR_INVALID_DATA, -1, -1 }, // North American with invalid check character
|
||||
/* 23*/ { BARCODE_VIN, -1, "5GZCZ43D23S812715", -1, ZINT_ERROR_INVALID_CHECK, -1, -1 }, // North American with invalid check character
|
||||
/* 24*/ { BARCODE_VIN, -1, "WP0ZZZ99ZTS392124", -1, 0, 1, 246 }, // Not North American so no check
|
||||
/* 25*/ { BARCODE_HIBC_39, -1, "a", -1, 0, 1, 79 }, // Converts to upper
|
||||
/* 26*/ { BARCODE_HIBC_39, -1, ",", -1, ZINT_ERROR_INVALID_DATA, -1, -1 },
|
||||
/* 27*/ { BARCODE_HIBC_39, -1, "\000", 1, ZINT_ERROR_INVALID_DATA, -1, -1 },
|
||||
/* 25*/ { BARCODE_VIN, -1, "WPOZZZ99ZTS392124", -1, ZINT_ERROR_INVALID_DATA, -1, -1 }, // O not allowed
|
||||
/* 26*/ { BARCODE_HIBC_39, -1, "a", -1, 0, 1, 79 }, // Converts to upper
|
||||
/* 27*/ { BARCODE_HIBC_39, -1, ",", -1, ZINT_ERROR_INVALID_DATA, -1, -1 },
|
||||
/* 28*/ { BARCODE_HIBC_39, -1, "\000", 1, ZINT_ERROR_INVALID_DATA, -1, -1 },
|
||||
};
|
||||
int data_size = ARRAY_SIZE(data);
|
||||
int i, length, ret;
|
||||
|
@ -153,7 +153,7 @@ static void test_hrt_cpy_iso8859_1(int index, int debug) {
|
||||
}
|
||||
assert_equal(ret, data[i].ret, "i:%d ret %d != %d\n", i, ret, data[i].ret);
|
||||
assert_equal(ret, (int) ustrlen(symbol.text), "i:%d ret %d != strlen %d\n", i, ret, (int) ustrlen(symbol.text));
|
||||
assert_nonzero(testUtilIsValidUTF8(symbol.text, ustrlen(symbol.text)), "i:%d testUtilIsValidUTF8(%s) != 1\n", i, symbol.text);
|
||||
assert_nonzero(testUtilIsValidUTF8(symbol.text, (int) ustrlen(symbol.text)), "i:%d testUtilIsValidUTF8(%s) != 1\n", i, symbol.text);
|
||||
assert_zero(strcmp((char *) symbol.text, data[i].expected), "i:%d symbol.text (%s) != expected (%s)\n", i, symbol.text, data[i].expected);
|
||||
}
|
||||
|
||||
|
@ -89,7 +89,7 @@ static void test_eanx_leading_zeroes(int index, int debug) {
|
||||
assert_zero(length >= 128, "i:%d length %d >= 128\n", i, length);
|
||||
strcpy(symbol->primary, data[i].data);
|
||||
|
||||
composite_length = strlen(data[i].composite);
|
||||
composite_length = (int) strlen(data[i].composite);
|
||||
|
||||
ret = ZBarcode_Encode(symbol, (const unsigned char *) data[i].composite, composite_length);
|
||||
assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt);
|
||||
@ -109,8 +109,8 @@ static void test_helper_generate(const struct zint_symbol *symbol, int ret, int
|
||||
char esc_data[1024];
|
||||
char esc_composite[4096];
|
||||
|
||||
testUtilEscape(data, strlen(data), esc_data, sizeof(esc_data));
|
||||
testUtilEscape(composite, strlen(composite), esc_composite, sizeof(esc_composite));
|
||||
testUtilEscape(data, (int) strlen(data), esc_data, sizeof(esc_data));
|
||||
testUtilEscape(composite, (int) strlen(composite), esc_composite, sizeof(esc_composite));
|
||||
|
||||
if (ret == 0) {
|
||||
if (bwipp_cmp == -1) {
|
||||
@ -1245,7 +1245,7 @@ static void test_examples(int index, int generate, int debug) {
|
||||
assert_zero(length >= 128, "i:%d length %d >= 128\n", i, length);
|
||||
strcpy(symbol->primary, data[i].data);
|
||||
|
||||
composite_length = strlen(data[i].composite);
|
||||
composite_length = (int) strlen(data[i].composite);
|
||||
|
||||
ret = ZBarcode_Encode(symbol, (const unsigned char *) data[i].composite, composite_length);
|
||||
assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt);
|
||||
@ -1409,7 +1409,7 @@ static void test_odd_numbered_numeric(int index, int generate, int debug) {
|
||||
assert_zero(length >= 128, "i:%d length %d >= 128\n", i, length);
|
||||
strcpy(symbol->primary, data[i].data);
|
||||
|
||||
composite_length = strlen(data[i].composite);
|
||||
composite_length = (int) strlen(data[i].composite);
|
||||
|
||||
ret = ZBarcode_Encode(symbol, (const unsigned char *) data[i].composite, composite_length);
|
||||
assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt);
|
||||
@ -1537,7 +1537,7 @@ static void test_ean128_cc_shift(int index, int generate, int debug) {
|
||||
assert_zero(length >= 128, "i:%d length %d >= 128\n", i, length);
|
||||
strcpy(symbol->primary, data[i].data);
|
||||
|
||||
composite_length = strlen(data[i].composite);
|
||||
composite_length = (int) strlen(data[i].composite);
|
||||
|
||||
ret = ZBarcode_Encode(symbol, (const unsigned char *) data[i].composite, composite_length);
|
||||
assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt);
|
||||
@ -1617,7 +1617,7 @@ static void test_ean128_cc_width(int index, int generate, int debug) {
|
||||
assert_zero(length >= 128, "i:%d length %d >= 128\n", i, length);
|
||||
strcpy(symbol->primary, data[i].data);
|
||||
|
||||
composite_length = strlen(data[i].composite);
|
||||
composite_length = (int) strlen(data[i].composite);
|
||||
|
||||
ret = ZBarcode_Encode(symbol, (const unsigned char *) data[i].composite, composite_length);
|
||||
assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt);
|
||||
@ -2083,7 +2083,7 @@ static void test_encodation_0(int index, int generate, int debug) {
|
||||
assert_zero(length >= 128, "i:%d length %d >= 128\n", i, length);
|
||||
strcpy(symbol->primary, data[i].data);
|
||||
|
||||
composite_length = strlen(data[i].composite);
|
||||
composite_length = (int) strlen(data[i].composite);
|
||||
|
||||
ret = ZBarcode_Encode(symbol, (const unsigned char *) data[i].composite, composite_length);
|
||||
assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt);
|
||||
@ -2220,7 +2220,7 @@ static void test_encodation_10(int index, int generate, int debug) {
|
||||
assert_zero(length >= 128, "i:%d length %d >= 128\n", i, length);
|
||||
strcpy(symbol->primary, data[i].data);
|
||||
|
||||
composite_length = strlen(data[i].composite);
|
||||
composite_length = (int) strlen(data[i].composite);
|
||||
|
||||
ret = ZBarcode_Encode(symbol, (const unsigned char *) data[i].composite, composite_length);
|
||||
assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt);
|
||||
@ -2601,7 +2601,7 @@ static void test_encodation_11(int index, int generate, int debug) {
|
||||
assert_zero(length >= 128, "i:%d length %d >= 128\n", i, length);
|
||||
strcpy(symbol->primary, data[i].data);
|
||||
|
||||
composite_length = strlen(data[i].composite);
|
||||
composite_length = (int) strlen(data[i].composite);
|
||||
|
||||
ret = ZBarcode_Encode(symbol, (const unsigned char *) data[i].composite, composite_length);
|
||||
assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt);
|
||||
@ -2753,7 +2753,7 @@ static void test_addongap(int index, int generate, int debug) {
|
||||
assert_zero(length >= 128, "i:%d length %d >= 128\n", i, length);
|
||||
strcpy(symbol->primary, data[i].data);
|
||||
|
||||
composite_length = strlen(composite);
|
||||
composite_length = (int) strlen(composite);
|
||||
|
||||
ret = ZBarcode_Encode(symbol, (const unsigned char *) composite, composite_length);
|
||||
assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt);
|
||||
@ -2843,7 +2843,7 @@ static void test_gs1parens(int index, int debug) {
|
||||
assert_zero(length >= 128, "i:%d length %d >= 128\n", i, length);
|
||||
strcpy(symbol->primary, data[i].data);
|
||||
|
||||
composite_length = strlen(data[i].composite);
|
||||
composite_length = (int) strlen(data[i].composite);
|
||||
|
||||
ret = ZBarcode_Encode(symbol, (const unsigned char *) data[i].composite, composite_length);
|
||||
assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt);
|
||||
@ -2894,7 +2894,7 @@ static void test_fuzz(int index, int debug) {
|
||||
assert_zero(length >= 128, "i:%d length %d >= 128\n", i, length);
|
||||
strcpy(symbol->primary, data[i].data);
|
||||
|
||||
composite_length = strlen(data[i].composite);
|
||||
composite_length = (int) strlen(data[i].composite);
|
||||
|
||||
ret = ZBarcode_Encode(symbol, (const unsigned char *) data[i].composite, composite_length);
|
||||
assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt);
|
||||
@ -2966,7 +2966,7 @@ static void test_perf(int index, int debug) {
|
||||
assert_zero(length >= 128, "i:%d length %d >= 128\n", i, length);
|
||||
strcpy(symbol->primary, data[i].data);
|
||||
|
||||
composite_length = strlen(data[i].composite);
|
||||
composite_length = (int) strlen(data[i].composite);
|
||||
|
||||
start = clock();
|
||||
ret = ZBarcode_Encode(symbol, (const unsigned char *) data[i].composite, composite_length);
|
||||
|
@ -1325,7 +1325,7 @@ static void test_gs1_verify(int index, int debug) {
|
||||
symbol = ZBarcode_Create();
|
||||
assert_nonnull(symbol, "Symbol not created\n");
|
||||
|
||||
length = strlen(data[i].data);
|
||||
length = (int) strlen(data[i].data);
|
||||
|
||||
ret = gs1_verify(symbol, (unsigned char *) data[i].data, length, (unsigned char *) reduced);
|
||||
assert_equal(ret, data[i].ret, "i:%d ret %d != %d (length %d \"%s\") %s\n", i, ret, data[i].ret, length, data[i].data, symbol->errtxt);
|
||||
@ -1730,7 +1730,7 @@ static void test_gs1_lint(int index, int debug) {
|
||||
symbol = ZBarcode_Create();
|
||||
assert_nonnull(symbol, "Symbol not created\n");
|
||||
|
||||
length = strlen(data[i].data);
|
||||
length = (int) strlen(data[i].data);
|
||||
|
||||
ret = gs1_verify(symbol, (unsigned char *) data[i].data, length, (unsigned char *) reduced);
|
||||
assert_equal(ret, data[i].ret, "i:%d ret %d != %d (length %d \"%s\") %s\n", i, ret, data[i].ret, length, data[i].data, symbol->errtxt);
|
||||
|
@ -109,7 +109,7 @@ static void test_csv(int index, int debug) {
|
||||
symbol->symbology = BARCODE_USPS_IMAIL;
|
||||
symbol->debug |= debug;
|
||||
|
||||
ret = ZBarcode_Encode(symbol, (unsigned char *) data, strlen(data));
|
||||
ret = ZBarcode_Encode(symbol, (unsigned char *) data, (int) strlen(data));
|
||||
|
||||
if (strcmp(return_code, "00") == 0) {
|
||||
|
||||
|
@ -33,13 +33,17 @@
|
||||
#include "../large.h"
|
||||
|
||||
#if defined(__MINGW32__)
|
||||
# if __WORDSIZE == 32
|
||||
# define LX_FMT "I32"
|
||||
# else
|
||||
# define LX_FMT "I64"
|
||||
# endif
|
||||
# if defined(__clang__)
|
||||
# pragma GCC diagnostic ignored "-Wformat-non-iso"
|
||||
# elif defined(__GNUC__)
|
||||
# pragma GCC diagnostic ignored "-Wformat" /* Unfortunately doesn't seem to be way to only avoid non-ISO warnings */
|
||||
# endif
|
||||
#elif defined(_MSC_VER)
|
||||
#elif defined(_MSC_VER) || __WORDSIZE == 32
|
||||
# define LX_FMT "ll"
|
||||
#else
|
||||
# define LX_FMT "l"
|
||||
|
@ -379,7 +379,7 @@ static void test_encode_file_too_large(void) {
|
||||
|
||||
fstream = fopen(filename, "w+");
|
||||
assert_nonnull(fstream, "fopen(%s) failed (%d)\n", filename, ferror(fstream));
|
||||
ret = fwrite(buf, 1, sizeof(buf), fstream);
|
||||
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);
|
||||
assert_zero(ret, "fclose(%s) %d != 0\n", filename, ret);
|
||||
|
@ -93,7 +93,7 @@ static void test_pcx(int index, int debug) {
|
||||
}
|
||||
symbol->debug |= debug;
|
||||
|
||||
length = strlen(data[i].data);
|
||||
length = (int) strlen(data[i].data);
|
||||
|
||||
ret = ZBarcode_Encode(symbol, (unsigned char *) data[i].data, length);
|
||||
assert_zero(ret, "i:%d %s ZBarcode_Encode ret %d != 0 %s\n", i, testUtilBarcodeName(data[i].symbology), ret, symbol->errtxt);
|
||||
|
@ -1074,7 +1074,7 @@ static void test_fuzz(int index, int debug) {
|
||||
|
||||
length = data[i].length;
|
||||
if (length == -1) {
|
||||
length = strlen(data[i].data);
|
||||
length = (int) strlen(data[i].data);
|
||||
}
|
||||
|
||||
ret = ZBarcode_Encode(symbol, (unsigned char *) data[i].data, length);
|
||||
|
@ -1656,7 +1656,7 @@ static void test_microqr_padding(int index, int generate, int debug) {
|
||||
symbol->debug = ZINT_DEBUG_TEST; // Needed to get codeword dump in errtxt
|
||||
symbol->debug |= debug;
|
||||
|
||||
length = strlen(data[i].data);
|
||||
length = (int) strlen(data[i].data);
|
||||
|
||||
ret = ZBarcode_Encode(symbol, (unsigned char *) 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);
|
||||
|
@ -274,7 +274,7 @@ static void test_buffer(int index, int generate, int debug) {
|
||||
} else {
|
||||
text = data[i].data;
|
||||
}
|
||||
length = strlen(text);
|
||||
length = (int) strlen(text);
|
||||
|
||||
ret = ZBarcode_Encode(symbol, (unsigned char *) text, length);
|
||||
assert_zero(ret, "i:%d ZBarcode_Encode(%s) ret %d != 0 (%s)\n", i, testUtilBarcodeName(data[i].symbology), ret, symbol->errtxt);
|
||||
@ -380,7 +380,7 @@ static void test_upcean_hrt(int index, int debug) {
|
||||
}
|
||||
symbol->debug |= debug;
|
||||
|
||||
length = strlen(data[i].data);
|
||||
length = (int) strlen(data[i].data);
|
||||
|
||||
ret = ZBarcode_Encode_and_Buffer(symbol, (unsigned char *) data[i].data, length, 0);
|
||||
assert_equal(ret, data[i].ret, "i:%d ret %d != %d\n", i, ret, data[i].ret);
|
||||
@ -574,7 +574,7 @@ static void test_stacking(int index, int debug) {
|
||||
ret = ZBarcode_Encode(symbol, (unsigned char *) data[i].data, length);
|
||||
assert_zero(ret, "i:%d ret %d != zero\n", i, ret);
|
||||
|
||||
length2 = strlen(data[i].data2);
|
||||
length2 = (int) strlen(data[i].data2);
|
||||
ret = ZBarcode_Encode(symbol, (unsigned char *) data[i].data2, length2);
|
||||
assert_zero(ret, "i:%d ret %d != zero\n", i, ret);
|
||||
|
||||
@ -995,7 +995,7 @@ static void test_scale(int index, int debug) {
|
||||
} else {
|
||||
text = data[i].data;
|
||||
}
|
||||
length = strlen(text);
|
||||
length = (int) strlen(text);
|
||||
|
||||
ret = ZBarcode_Encode(symbol, (unsigned char *) text, length);
|
||||
assert_zero(ret, "i:%d ZBarcode_Encode(%d) ret %d != 0 %s\n", i, data[i].symbology, ret, symbol->errtxt);
|
||||
@ -1207,8 +1207,8 @@ static void test_buffer_plot(int index, int generate, int debug) {
|
||||
ret = testUtilBitmapCmp(symbol, data[i].expected_bitmap, &row, &column);
|
||||
assert_zero(ret, "i:%d (%s) testUtilBitmapCmp ret %d != 0 column %d row %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), ret, column, row, data[i].data);
|
||||
|
||||
fg_len = strlen(data[i].fgcolour);
|
||||
bg_len = strlen(data[i].bgcolour);
|
||||
fg_len = (int) strlen(data[i].fgcolour);
|
||||
bg_len = (int) strlen(data[i].bgcolour);
|
||||
if (fg_len > 6 || bg_len > 6) {
|
||||
assert_nonnull(symbol->alphamap, "i:%d ZBarcode_Buffer(%s) alphamap NULL\n", i, testUtilBarcodeName(data[i].symbology));
|
||||
// TODO: check alphamap
|
||||
@ -1674,7 +1674,7 @@ static void test_height(int index, int generate, int debug) {
|
||||
} else {
|
||||
text = data[i].data;
|
||||
}
|
||||
length = strlen(text);
|
||||
length = (int) strlen(text);
|
||||
|
||||
ret = ZBarcode_Encode(symbol, (unsigned char *) text, length);
|
||||
assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode(%s) ret %d != %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), ret, data[i].ret, symbol->errtxt);
|
||||
|
@ -794,7 +794,8 @@ static void test_examples(int index, int generate, int debug) {
|
||||
|
||||
if (generate) {
|
||||
printf(" /*%3d*/ { %s, %d, \"%s\", %d, %d, %d, %d, \"%s\",\n",
|
||||
i, testUtilBarcodeName(symbol->symbology), data[i].option_2, data[i].data, data[i].ret, symbol->rows, symbol->width, data[i].bwipp_cmp, data[i].comment);
|
||||
i, testUtilBarcodeName(symbol->symbology), data[i].option_2,
|
||||
data[i].data, data[i].ret, symbol->rows, symbol->width, data[i].bwipp_cmp, data[i].comment);
|
||||
testUtilModulesPrint(symbol, " ", "\n");
|
||||
printf(" },\n");
|
||||
} else {
|
||||
@ -1228,6 +1229,7 @@ static void test_input(int index, int debug) {
|
||||
|
||||
struct item {
|
||||
int symbology;
|
||||
int option_2;
|
||||
char *data;
|
||||
int ret;
|
||||
int expected_rows;
|
||||
@ -1235,32 +1237,33 @@ static void test_input(int index, int debug) {
|
||||
};
|
||||
// s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<"))
|
||||
struct item data[] = {
|
||||
/* 0*/ { BARCODE_DBAR_OMN, "1234567890123", 0, 1, 96 },
|
||||
/* 1*/ { BARCODE_DBAR_OMN, "123456789012A", ZINT_ERROR_INVALID_DATA, -1, -1 },
|
||||
/* 2*/ { BARCODE_DBAR_OMN, "12345678901234", ZINT_ERROR_INVALID_CHECK, -1, -1 },
|
||||
/* 3*/ { BARCODE_DBAR_OMN, "123456789012315", ZINT_ERROR_TOO_LONG, -1, -1 },
|
||||
/* 4*/ { BARCODE_DBAR_LTD, "1234567890123", 0, 1, 79 },
|
||||
/* 5*/ { BARCODE_DBAR_LTD, "123456789012A", ZINT_ERROR_INVALID_DATA, -1, -1 },
|
||||
/* 6*/ { BARCODE_DBAR_LTD, "12345678901235", ZINT_ERROR_INVALID_CHECK, -1, -1 },
|
||||
/* 7*/ { BARCODE_DBAR_LTD, "123456789012315", ZINT_ERROR_TOO_LONG, -1, -1 },
|
||||
/* 8*/ { BARCODE_DBAR_LTD, "2234567890123", ZINT_ERROR_INVALID_DATA, -1, -1 },
|
||||
/* 9*/ { BARCODE_DBAR_LTD, "22345678901238", ZINT_ERROR_INVALID_DATA, -1, -1 },
|
||||
/* 10*/ { BARCODE_DBAR_EXP, "[01]12345678901234", ZINT_WARN_NONCOMPLIANT, 1, 134 },
|
||||
/* 11*/ { BARCODE_DBAR_EXP, "[01]12345678901231", 0, 1, 134 },
|
||||
/* 12*/ { BARCODE_DBAR_EXP, "[01]1234567890123A", ZINT_ERROR_INVALID_DATA, -1, -1 },
|
||||
/* 13*/ { BARCODE_DBAR_EXP, "[01]123456789012315", ZINT_ERROR_INVALID_DATA, -1, -1 },
|
||||
/* 14*/ { BARCODE_DBAR_STK, "1234567890123", 0, 3, 50 },
|
||||
/* 15*/ { BARCODE_DBAR_STK, "123456789012A", ZINT_ERROR_INVALID_DATA, -1, -1 },
|
||||
/* 16*/ { BARCODE_DBAR_STK, "12345678901235", ZINT_ERROR_INVALID_CHECK, -1, -1 },
|
||||
/* 17*/ { BARCODE_DBAR_STK, "123456789012315", ZINT_ERROR_TOO_LONG, -1, -1 },
|
||||
/* 18*/ { BARCODE_DBAR_OMNSTK, "1234567890123", 0, 5, 50 },
|
||||
/* 19*/ { BARCODE_DBAR_OMNSTK, "123456789012A", ZINT_ERROR_INVALID_DATA, -1, -1 },
|
||||
/* 20*/ { BARCODE_DBAR_OMNSTK, "12345678901236", ZINT_ERROR_INVALID_CHECK, -1, -1 },
|
||||
/* 21*/ { BARCODE_DBAR_OMNSTK, "123456789012315", ZINT_ERROR_TOO_LONG, -1, -1 },
|
||||
/* 22*/ { BARCODE_DBAR_EXPSTK, "[01]12345678901234", ZINT_WARN_NONCOMPLIANT, 5, 102 },
|
||||
/* 22*/ { BARCODE_DBAR_EXPSTK, "[01]12345678901231", 0, 5, 102 },
|
||||
/* 23*/ { BARCODE_DBAR_EXPSTK, "[01]123456789012A", ZINT_ERROR_INVALID_DATA, -1, -1 },
|
||||
/* 24*/ { BARCODE_DBAR_EXPSTK, "[01]123456789012315", ZINT_ERROR_INVALID_DATA, -1, -1 },
|
||||
/* 0*/ { BARCODE_DBAR_OMN, -1, "1234567890123", 0, 1, 96 },
|
||||
/* 1*/ { BARCODE_DBAR_OMN, -1, "123456789012A", ZINT_ERROR_INVALID_DATA, -1, -1 },
|
||||
/* 2*/ { BARCODE_DBAR_OMN, -1, "12345678901234", ZINT_ERROR_INVALID_CHECK, -1, -1 },
|
||||
/* 3*/ { BARCODE_DBAR_OMN, -1, "123456789012315", ZINT_ERROR_TOO_LONG, -1, -1 },
|
||||
/* 4*/ { BARCODE_DBAR_LTD, -1, "1234567890123", 0, 1, 79 },
|
||||
/* 5*/ { BARCODE_DBAR_LTD, -1, "123456789012A", ZINT_ERROR_INVALID_DATA, -1, -1 },
|
||||
/* 6*/ { BARCODE_DBAR_LTD, -1, "12345678901235", ZINT_ERROR_INVALID_CHECK, -1, -1 },
|
||||
/* 7*/ { BARCODE_DBAR_LTD, -1, "123456789012315", ZINT_ERROR_TOO_LONG, -1, -1 },
|
||||
/* 8*/ { BARCODE_DBAR_LTD, -1, "2234567890123", ZINT_ERROR_INVALID_DATA, -1, -1 },
|
||||
/* 9*/ { BARCODE_DBAR_LTD, -1, "22345678901238", ZINT_ERROR_INVALID_DATA, -1, -1 },
|
||||
/* 10*/ { BARCODE_DBAR_EXP, -1, "[01]12345678901234", ZINT_WARN_NONCOMPLIANT, 1, 134 },
|
||||
/* 11*/ { BARCODE_DBAR_EXP, -1, "[01]12345678901231", 0, 1, 134 },
|
||||
/* 12*/ { BARCODE_DBAR_EXP, -1, "[01]1234567890123A", ZINT_ERROR_INVALID_DATA, -1, -1 },
|
||||
/* 13*/ { BARCODE_DBAR_EXP, -1, "[01]123456789012315", ZINT_ERROR_INVALID_DATA, -1, -1 },
|
||||
/* 14*/ { BARCODE_DBAR_STK, -1, "1234567890123", 0, 3, 50 },
|
||||
/* 15*/ { BARCODE_DBAR_STK, -1, "123456789012A", ZINT_ERROR_INVALID_DATA, -1, -1 },
|
||||
/* 16*/ { BARCODE_DBAR_STK, -1, "12345678901235", ZINT_ERROR_INVALID_CHECK, -1, -1 },
|
||||
/* 17*/ { BARCODE_DBAR_STK, -1, "123456789012315", ZINT_ERROR_TOO_LONG, -1, -1 },
|
||||
/* 18*/ { BARCODE_DBAR_OMNSTK, -1, "1234567890123", 0, 5, 50 },
|
||||
/* 19*/ { BARCODE_DBAR_OMNSTK, -1, "123456789012A", ZINT_ERROR_INVALID_DATA, -1, -1 },
|
||||
/* 20*/ { BARCODE_DBAR_OMNSTK, -1, "12345678901236", ZINT_ERROR_INVALID_CHECK, -1, -1 },
|
||||
/* 21*/ { BARCODE_DBAR_OMNSTK, -1, "123456789012315", ZINT_ERROR_TOO_LONG, -1, -1 },
|
||||
/* 22*/ { BARCODE_DBAR_EXPSTK, -1, "[01]12345678901234", ZINT_WARN_NONCOMPLIANT, 5, 102 },
|
||||
/* 23*/ { BARCODE_DBAR_EXPSTK, -1, "[01]12345678901231", 0, 5, 102 },
|
||||
/* 24*/ { BARCODE_DBAR_EXPSTK, -1, "[01]123456789012A", ZINT_ERROR_INVALID_DATA, -1, -1 },
|
||||
/* 25*/ { BARCODE_DBAR_EXPSTK, -1, "[01]123456789012315", ZINT_ERROR_INVALID_DATA, -1, -1 },
|
||||
/* 26*/ { BARCODE_DBAR_EXPSTK, 1, "[01]12345678901231", 0, 9, 53 },
|
||||
};
|
||||
int data_size = ARRAY_SIZE(data);
|
||||
int i, length, ret;
|
||||
@ -1275,7 +1278,7 @@ static void test_input(int index, int debug) {
|
||||
symbol = ZBarcode_Create();
|
||||
assert_nonnull(symbol, "Symbol not created\n");
|
||||
|
||||
length = testUtilSetSymbol(symbol, data[i].symbology, -1 /*input_mode*/, -1 /*eci*/, -1 /*option_1*/, -1, -1, -1 /*output_options*/, data[i].data, -1, debug);
|
||||
length = testUtilSetSymbol(symbol, data[i].symbology, -1 /*input_mode*/, -1 /*eci*/, -1 /*option_1*/, data[i].option_2, -1, -1 /*output_options*/, data[i].data, -1, debug);
|
||||
|
||||
ret = ZBarcode_Encode(symbol, (const unsigned char *) data[i].data, length);
|
||||
assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt);
|
||||
|
@ -155,7 +155,7 @@ static void test_print(int index, int generate, int debug) {
|
||||
} else {
|
||||
text = data[i].data;
|
||||
}
|
||||
text_length = strlen(text);
|
||||
text_length = (int) strlen(text);
|
||||
|
||||
ret = ZBarcode_Encode(symbol, (unsigned char *) text, text_length);
|
||||
assert_equal(ret, data[i].ret, "i:%d %s ZBarcode_Encode ret %d != %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), ret, data[i].ret, symbol->errtxt);
|
||||
|
@ -238,7 +238,7 @@ static void test_print(int index, int generate, int debug) {
|
||||
} else {
|
||||
text = data[i].data;
|
||||
}
|
||||
text_length = strlen(text);
|
||||
text_length = (int) strlen(text);
|
||||
|
||||
ret = ZBarcode_Encode(symbol, (unsigned char *) text, text_length);
|
||||
assert_zero(ret, "i:%d %s ZBarcode_Encode ret %d != 0 %s\n", i, testUtilBarcodeName(data[i].symbology), ret, symbol->errtxt);
|
||||
|
@ -290,7 +290,7 @@ static void test_buffer_vector(int index, int generate, int debug) {
|
||||
} else {
|
||||
text = data[i].data;
|
||||
}
|
||||
length = strlen(text);
|
||||
length = (int) strlen(text);
|
||||
|
||||
ret = ZBarcode_Encode(symbol, (unsigned char *) text, length);
|
||||
assert_zero(ret, "i:%d ZBarcode_Encode(%d) ret %d != 0 %s\n", i, data[i].symbology, ret, symbol->errtxt);
|
||||
@ -397,7 +397,7 @@ static void test_upcean_hrt(int index, int debug) {
|
||||
}
|
||||
symbol->debug |= debug;
|
||||
|
||||
length = strlen(data[i].data);
|
||||
length = (int) strlen(data[i].data);
|
||||
|
||||
ret = ZBarcode_Encode(symbol, (unsigned char *) data[i].data, length);
|
||||
assert_zero(ret, "i:%d ZBarcode_Encode(%d) ret %d != 0 %s\n", i, data[i].symbology, ret, symbol->errtxt);
|
||||
@ -554,7 +554,7 @@ static void test_stacking(int index, int debug) {
|
||||
ret = ZBarcode_Encode(symbol, (unsigned char *) data[i].data, length);
|
||||
assert_zero(ret, "i:%d ret %d != zero\n", i, ret);
|
||||
|
||||
length2 = strlen(data[i].data2);
|
||||
length2 = (int) strlen(data[i].data2);
|
||||
ret = ZBarcode_Encode(symbol, (unsigned char *) data[i].data2, length2);
|
||||
assert_zero(ret, "i:%d ret %d != zero\n", i, ret);
|
||||
|
||||
@ -754,7 +754,7 @@ static void test_noncomposite_string_x(int index, int debug) {
|
||||
symbol->input_mode = UNICODE_MODE;
|
||||
symbol->debug |= debug;
|
||||
|
||||
length = strlen(data[i].data);
|
||||
length = (int) strlen(data[i].data);
|
||||
|
||||
ret = ZBarcode_Encode(symbol, (unsigned char *) data[i].data, length);
|
||||
assert_zero(ret, "i:%d ZBarcode_Encode(%d) ret %d != 0 %s\n", i, data[i].symbology, ret, symbol->errtxt);
|
||||
@ -815,7 +815,7 @@ static void test_upcean_whitespace_width(int index, int debug) {
|
||||
symbol->whitespace_width = data[i].whitespace_width;
|
||||
symbol->debug |= debug;
|
||||
|
||||
length = strlen(data[i].data);
|
||||
length = (int) strlen(data[i].data);
|
||||
|
||||
ret = ZBarcode_Encode(symbol, (unsigned char *) data[i].data, length);
|
||||
assert_zero(ret, "i:%d ZBarcode_Encode(%d) ret %d != 0 %s\n", i, data[i].symbology, ret, symbol->errtxt);
|
||||
@ -1298,7 +1298,7 @@ static void test_height(int index, int generate, int debug) {
|
||||
} else {
|
||||
text = data[i].data;
|
||||
}
|
||||
length = strlen(text);
|
||||
length = (int) strlen(text);
|
||||
|
||||
ret = ZBarcode_Encode(symbol, (unsigned char *) text, length);
|
||||
assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode(%s) ret %d != %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), ret, data[i].ret, symbol->errtxt);
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -70,20 +70,19 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
#ifndef ARRAY_SIZE
|
||||
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
|
||||
#define ARRAY_SIZE(x) ((int) (sizeof(x) / sizeof((x)[0])))
|
||||
#endif
|
||||
|
||||
extern int assertionFailed;
|
||||
extern int assertionNum;
|
||||
extern const char *assertionFilename;
|
||||
|
||||
#if _MSC_VER == 1200 /* VC6 */
|
||||
#define testStart(__arg__) (testStartReal("", __arg__))
|
||||
#else
|
||||
#define testStart(__arg__) (testStartReal(__func__, __arg__))
|
||||
#endif
|
||||
#define testEndExp(__arg__) (testEnd(!(__arg__)))
|
||||
void testStartReal(const char *func, const char *name);
|
||||
void testEnd(int result);
|
||||
void testFinish(void);
|
||||
void testSkip(const char *msg);
|
||||
void testReport();
|
||||
@ -104,7 +103,8 @@ void assert_equalu64(uint64_t e1, uint64_t e2, const char *fmt, ...);
|
||||
void assert_notequal(int e1, int e2, ...);
|
||||
#else
|
||||
#define assert_exp(__exp__, ...) \
|
||||
{assertionNum++; if (!(__exp__)) {assertionFailed++; printf(__VA_ARGS__); testFinish(); return;}}
|
||||
{ assertionNum++; if (!(__exp__)) { assertionFailed++; printf("%s:%d ", assertionFilename, __LINE__); \
|
||||
printf(__VA_ARGS__); testFinish(); return; } }
|
||||
|
||||
#define assert_zero(__exp__, ...) assert_exp((__exp__) == 0, __VA_ARGS__)
|
||||
#define assert_nonzero(__exp__, ...) assert_exp((__exp__) != 0, __VA_ARGS__)
|
||||
@ -119,40 +119,47 @@ INTERNAL void vector_free(struct zint_symbol *symbol); /* Free vector structures
|
||||
|
||||
int testUtilSetSymbol(struct zint_symbol *symbol, int symbology, int input_mode, int eci,
|
||||
int option_1, int option_2, int option_3, int output_options, char *data, int length, int debug);
|
||||
|
||||
const char *testUtilBarcodeName(int symbology);
|
||||
const char *testUtilErrorName(int error_number);
|
||||
const char *testUtilInputModeName(int input_mode);
|
||||
const char *testUtilOption3Name(int option_3);
|
||||
const char *testUtilOutputOptionsName(int output_options);
|
||||
|
||||
int testUtilDAFTConvert(const struct zint_symbol *symbol, char *buffer, int buffer_size);
|
||||
int testUtilIsValidUTF8(const unsigned char str[], const int length);
|
||||
char *testUtilEscape(char *buffer, int length, char *escaped, int escaped_size);
|
||||
char *testUtilReadCSVField(char *buffer, char *field, int field_size);
|
||||
void testUtilStrCpyRepeat(char *buffer, char *repeat, int size);
|
||||
|
||||
int testUtilSymbolCmp(const struct zint_symbol *a, const struct zint_symbol *b);
|
||||
struct zint_vector *testUtilVectorCpy(const struct zint_vector *in);
|
||||
int testUtilVectorCmp(const struct zint_vector *a, const struct zint_vector *b);
|
||||
|
||||
int testUtilModulesDump(const struct zint_symbol *symbol, char dump[], int dump_size);
|
||||
void testUtilModulesPrint(const struct zint_symbol *symbol, const char *prefix, const char *postfix);
|
||||
void testUtilModulesPrintRow(const struct zint_symbol *symbol, int row, const char *prefix, const char *postfix);
|
||||
int testUtilModulesCmp(const struct zint_symbol *symbol, const char *expected, int *width, int *row);
|
||||
int testUtilModulesCmpRow(const struct zint_symbol *symbol, int row, const char *expected, int *width);
|
||||
int testUtilModulesDumpHex(const struct zint_symbol *symbol, char dump[], int dump_size);
|
||||
char *testUtilUIntArrayDump(unsigned int *array, int size, char *dump, int dump_size);
|
||||
char *testUtilUCharArrayDump(unsigned char *array, int size, char *dump, int dump_size);
|
||||
int testUtilDataPath(char *buffer, int buffer_size, const char *subdir, const char *filename);
|
||||
|
||||
void testUtilBitmapPrint(const struct zint_symbol *symbol, const char *prefix, const char *postfix);
|
||||
int testUtilBitmapCmp(const struct zint_symbol *symbol, const char *expected, int *row, int *column);
|
||||
|
||||
int testUtilDataPath(char *buffer, int buffer_size, const char *subdir, const char *filename);
|
||||
int testUtilExists(const char *filename);
|
||||
int testUtilDirExists(const char *dirname);
|
||||
int testUtilMkDir(const char *dirname);
|
||||
int testUtilRmDir(const char *dirname);
|
||||
int testUtilRename(const char *oldpath, const char *newpath);
|
||||
|
||||
int testUtilCmpPngs(const char *file1, const char *file2);
|
||||
int testUtilCmpTxts(const char *txt1, const char *txt2);
|
||||
int testUtilCmpBins(const char *bin1, const char *bin2);
|
||||
int testUtilCmpSvgs(const char *svg1, const char *svg2);
|
||||
int testUtilCmpEpss(const char *eps1, const char *eps2);
|
||||
|
||||
int testUtilHaveIdentify();
|
||||
int testUtilVerifyIdentify(const char *filename, int debug);
|
||||
int testUtilHaveLibreOffice();
|
||||
@ -163,6 +170,7 @@ int testUtilHaveVnu();
|
||||
int testUtilVerifyVnu(const char *filename, int debug);
|
||||
int testUtilHaveTiffInfo();
|
||||
int testUtilVerifyTiffInfo(const char *filename, int debug);
|
||||
|
||||
int testUtilCanBwipp(int index, const struct zint_symbol *symbol, int option_1, int option_2, int option_3,
|
||||
int debug);
|
||||
int testUtilBwipp(int index, const struct zint_symbol *symbol, int option_1, int option_2, int option_3,
|
||||
|
220
backend/upcean.c
220
backend/upcean.c
@ -31,11 +31,15 @@
|
||||
/* vim: set ts=4 sw=4 et : */
|
||||
|
||||
#define SODIUM "0123456789+"
|
||||
#define ISBN_SANE "0123456789X"
|
||||
#define ISBN_CC_SANE "0123456789Xx+"
|
||||
|
||||
#define EAN2 102
|
||||
#define EAN5 105
|
||||
|
||||
#include <stdio.h>
|
||||
#include "common.h"
|
||||
#include "gs1.h"
|
||||
|
||||
/* UPC and EAN tables checked against EN 797:1996 */
|
||||
|
||||
@ -78,65 +82,44 @@ static const char *EANsetB[10] = {
|
||||
"1123", "1222", "2212", "1141", "2311", "1321", "4111", "2131", "3121", "2113"
|
||||
};
|
||||
|
||||
/* Calculate the correct check digit for a UPC barcode */
|
||||
static char upc_check(const char source[], const int length) {
|
||||
int i, count, check_digit;
|
||||
|
||||
count = 0;
|
||||
|
||||
for (i = 0; i < length; i++) {
|
||||
count += (i & 1) ? ctoi(source[i]) : 3 * ctoi(source[i]);
|
||||
}
|
||||
|
||||
check_digit = 10 - (count % 10);
|
||||
if (check_digit == 10) {
|
||||
check_digit = 0;
|
||||
}
|
||||
return itoc(check_digit);
|
||||
}
|
||||
|
||||
/* UPC A is usually used for 12 digit numbers, but this function takes a source of any length */
|
||||
static void upca_draw(const char source[], const int length, unsigned char dest[]) {
|
||||
static void upca_draw(const unsigned char source[], const int length, char dest[]) {
|
||||
int i, half_way;
|
||||
|
||||
half_way = length / 2;
|
||||
|
||||
/* start character */
|
||||
ustrcat(dest, "111");
|
||||
strcat(dest, "111");
|
||||
|
||||
for (i = 0; i < length; i++) {
|
||||
if (i == half_way) {
|
||||
/* middle character - separates manufacturer no. from product no. */
|
||||
/* also inverts right hand characters */
|
||||
ustrcat(dest, "11111");
|
||||
strcat(dest, "11111");
|
||||
}
|
||||
|
||||
lookup(NEON, EANsetA, source[i], (char *) dest);
|
||||
lookup(NEON, EANsetA, source[i], dest);
|
||||
}
|
||||
|
||||
/* stop character */
|
||||
ustrcat(dest, "111");
|
||||
strcat(dest, "111");
|
||||
}
|
||||
|
||||
/* Make a UPC-A barcode, allowing for composite if `cc_rows` set */
|
||||
static int upca_cc(struct zint_symbol *symbol, const unsigned char source[], int length, unsigned char dest[],
|
||||
int cc_rows) {
|
||||
char gtin[13];
|
||||
static int upca_cc(struct zint_symbol *symbol, const unsigned char source[], int length, char dest[], int cc_rows) {
|
||||
unsigned char gtin[13];
|
||||
float height;
|
||||
int error_number = 0;
|
||||
|
||||
ustrcpy(gtin, source);
|
||||
|
||||
if (length == 11) {
|
||||
gtin[length++] = upc_check(gtin, 11);
|
||||
gtin[length++] = gs1_check_digit(gtin, 11);
|
||||
gtin[length] = '\0';
|
||||
} else {
|
||||
if (source[length - 1] != upc_check(gtin, 11)) {
|
||||
if (symbol->debug & ZINT_DEBUG_PRINT) {
|
||||
printf("UPC-A: Invalid check digit %s, gtin: %s, Check digit: %c\n", source, gtin,
|
||||
upc_check(gtin, 11));
|
||||
}
|
||||
strcpy(symbol->errtxt, "270: Invalid check digit");
|
||||
if (source[length - 1] != gs1_check_digit(gtin, 11)) {
|
||||
sprintf(symbol->errtxt, "270: Invalid check digit '%c', expecting '%c'",
|
||||
source[length - 1], gs1_check_digit(gtin, 11));
|
||||
return ZINT_ERROR_INVALID_CHECK;
|
||||
}
|
||||
}
|
||||
@ -170,15 +153,15 @@ static int upca_cc(struct zint_symbol *symbol, const unsigned char source[], int
|
||||
}
|
||||
|
||||
/* UPC-A */
|
||||
static int upca(struct zint_symbol *symbol, const unsigned char source[], int length, unsigned char dest[]) {
|
||||
static int upca(struct zint_symbol *symbol, const unsigned char source[], int length, char dest[]) {
|
||||
return upca_cc(symbol, source, length, dest, 0 /*cc_rows*/);
|
||||
}
|
||||
|
||||
/* UPC-E, allowing for composite if `cc_rows` set */
|
||||
static int upce_cc(struct zint_symbol *symbol, unsigned char source[], int length, unsigned char dest[],
|
||||
int cc_rows) {
|
||||
static int upce_cc(struct zint_symbol *symbol, unsigned char source[], int length, char dest[], int cc_rows) {
|
||||
int i, num_system;
|
||||
char emode, equivalent[12], check_digit, parity[8];
|
||||
char emode, check_digit, parity[8];
|
||||
unsigned char equivalent[12];
|
||||
char hrt[9];
|
||||
float height;
|
||||
int error_number = 0;
|
||||
@ -234,7 +217,7 @@ static int upce_cc(struct zint_symbol *symbol, unsigned char source[], int lengt
|
||||
equivalent[10] = source[4];
|
||||
if (((source[2] == '0') || (source[2] == '1')) || (source[2] == '2')) {
|
||||
/* Note 1 - "X3 shall not be equal to 0, 1 or 2" */
|
||||
strcpy(symbol->errtxt, "271: Invalid UPC-E data");
|
||||
strcpy(symbol->errtxt, "271: Invalid UPC-E data"); // TODO: Better error message
|
||||
return ZINT_ERROR_INVALID_DATA;
|
||||
}
|
||||
break;
|
||||
@ -244,7 +227,7 @@ static int upce_cc(struct zint_symbol *symbol, unsigned char source[], int lengt
|
||||
equivalent[10] = source[4];
|
||||
if (source[3] == '0') {
|
||||
/* Note 2 - "X4 shall not be equal to 0" */
|
||||
strcpy(symbol->errtxt, "272: Invalid UPC-E data");
|
||||
strcpy(symbol->errtxt, "272: Invalid UPC-E data"); // TODO: Better error message
|
||||
return ZINT_ERROR_INVALID_DATA;
|
||||
}
|
||||
break;
|
||||
@ -259,7 +242,7 @@ static int upce_cc(struct zint_symbol *symbol, unsigned char source[], int lengt
|
||||
equivalent[10] = emode;
|
||||
if (source[4] == '0') {
|
||||
/* Note 3 - "X5 shall not be equal to 0" */
|
||||
strcpy(symbol->errtxt, "273: Invalid UPC-E data");
|
||||
strcpy(symbol->errtxt, "273: Invalid UPC-E data"); // TODO: Better error message
|
||||
return ZINT_ERROR_INVALID_DATA;
|
||||
}
|
||||
break;
|
||||
@ -267,7 +250,7 @@ static int upce_cc(struct zint_symbol *symbol, unsigned char source[], int lengt
|
||||
|
||||
/* Get the check digit from the expanded UPCA code */
|
||||
|
||||
check_digit = upc_check(equivalent, 11);
|
||||
check_digit = gs1_check_digit(equivalent, 11);
|
||||
|
||||
/* Use the number system and check digit information to choose a parity scheme */
|
||||
if (num_system == 1) {
|
||||
@ -279,30 +262,26 @@ static int upce_cc(struct zint_symbol *symbol, unsigned char source[], int lengt
|
||||
/* Take all this information and make the barcode pattern */
|
||||
|
||||
/* start character */
|
||||
ustrcat(dest, "111");
|
||||
strcat(dest, "111");
|
||||
|
||||
for (i = 0; i < length; i++) {
|
||||
switch (parity[i]) {
|
||||
case 'A': lookup(NEON, EANsetA, source[i], (char *) dest);
|
||||
case 'A': lookup(NEON, EANsetA, source[i], dest);
|
||||
break;
|
||||
case 'B': lookup(NEON, EANsetB, source[i], (char *) dest);
|
||||
case 'B': lookup(NEON, EANsetB, source[i], dest);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* stop character */
|
||||
ustrcat(dest, "111111");
|
||||
strcat(dest, "111111");
|
||||
|
||||
if (symbol->symbology != BARCODE_UPCE_CHK) {
|
||||
hrt[7] = check_digit;
|
||||
hrt[8] = '\0';
|
||||
} else {
|
||||
if (hrt[7] != check_digit) {
|
||||
if (symbol->debug & ZINT_DEBUG_PRINT) {
|
||||
printf("UPC-E: Invalid check digit %s, equivalent: %s, hrt: %s, Check digit: %c\n", source,
|
||||
equivalent, hrt, check_digit);
|
||||
}
|
||||
strcpy(symbol->errtxt, "274: Invalid check digit");
|
||||
sprintf(symbol->errtxt, "274: Invalid check digit '%c', expecting '%c'", hrt[7], check_digit);
|
||||
return ZINT_ERROR_INVALID_CHECK;
|
||||
}
|
||||
}
|
||||
@ -334,24 +313,24 @@ static int upce_cc(struct zint_symbol *symbol, unsigned char source[], int lengt
|
||||
}
|
||||
|
||||
/* UPC-E is a zero-compressed version of UPC-A */
|
||||
static int upce(struct zint_symbol *symbol, unsigned char source[], int length, unsigned char dest[]) {
|
||||
static int upce(struct zint_symbol *symbol, unsigned char source[], int length, char dest[]) {
|
||||
return upce_cc(symbol, source, length, dest, 0 /*cc_rows*/);
|
||||
}
|
||||
|
||||
/* EAN-2 and EAN-5 add-on codes */
|
||||
static void add_on(const unsigned char source[], const int length, unsigned char dest[], const int addon_gap) {
|
||||
static void ean_add_on(const unsigned char source[], const int length, char dest[], const int addon_gap) {
|
||||
char parity[6];
|
||||
int i, code_type;
|
||||
|
||||
/* If an add-on then append with space */
|
||||
if (addon_gap != 0) {
|
||||
i = (int) ustrlen(dest);
|
||||
i = (int) strlen(dest);
|
||||
dest[i] = itoc(addon_gap);
|
||||
dest[i + 1] = '\0';
|
||||
}
|
||||
|
||||
/* Start character */
|
||||
ustrcat(dest, "112");
|
||||
strcat(dest, "112");
|
||||
|
||||
/* Determine EAN2 or EAN5 add-on */
|
||||
if (length == 2) {
|
||||
@ -385,43 +364,26 @@ static void add_on(const unsigned char source[], const int length, unsigned char
|
||||
|
||||
for (i = 0; i < length; i++) {
|
||||
switch (parity[i]) {
|
||||
case 'A': lookup(NEON, EANsetA, source[i], (char *) dest);
|
||||
case 'A': lookup(NEON, EANsetA, source[i], dest);
|
||||
break;
|
||||
case 'B': lookup(NEON, EANsetB, source[i], (char *) dest);
|
||||
case 'B': lookup(NEON, EANsetB, source[i], dest);
|
||||
break;
|
||||
}
|
||||
|
||||
/* Glyph separator */
|
||||
if (i != (length - 1)) {
|
||||
ustrcat(dest, "11");
|
||||
strcat(dest, "11");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* ************************ EAN-13 ****************** */
|
||||
|
||||
/* Calculate the correct check digit for a EAN-13 barcode (including ISBN(13)) */
|
||||
static char ean_check(const char source[], const int length) {
|
||||
int i;
|
||||
int count, check_digit;
|
||||
|
||||
count = 0;
|
||||
|
||||
for (i = 0; i < length; i++) {
|
||||
count += (i & 1) ? 3 * ctoi(source[i]) : ctoi(source[i]);
|
||||
}
|
||||
check_digit = 10 - (count % 10);
|
||||
if (check_digit == 10) {
|
||||
check_digit = 0;
|
||||
}
|
||||
return itoc(check_digit);
|
||||
}
|
||||
|
||||
static int ean13_cc(struct zint_symbol *symbol, const unsigned char source[], int length, unsigned char dest[],
|
||||
static int ean13_cc(struct zint_symbol *symbol, const unsigned char source[], int length, char dest[],
|
||||
int cc_rows) {
|
||||
int i, half_way;
|
||||
char parity[6];
|
||||
char gtin[14];
|
||||
unsigned char gtin[14];
|
||||
float height;
|
||||
int error_number = 0;
|
||||
|
||||
@ -431,15 +393,12 @@ static int ean13_cc(struct zint_symbol *symbol, const unsigned char source[], in
|
||||
/* Add the appropriate check digit */
|
||||
|
||||
if (length == 12) {
|
||||
gtin[length++] = ean_check(gtin, 12);
|
||||
gtin[length++] = gs1_check_digit(gtin, 12);
|
||||
gtin[length] = '\0';
|
||||
} else {
|
||||
if (source[length - 1] != ean_check(gtin, 12)) {
|
||||
if (symbol->debug & ZINT_DEBUG_PRINT) {
|
||||
printf("EAN-13 Invalid check digit: %s, gtin: %s, Check digit: %c\n", source, gtin,
|
||||
ean_check(gtin, 12));
|
||||
}
|
||||
strcpy(symbol->errtxt, "275: Invalid check digit");
|
||||
if (source[length - 1] != gs1_check_digit(gtin, 12)) {
|
||||
sprintf(symbol->errtxt, "275: Invalid check digit '%c', expecting '%c'",
|
||||
source[length - 1], gs1_check_digit(gtin, 12));
|
||||
return ZINT_ERROR_INVALID_CHECK;
|
||||
}
|
||||
}
|
||||
@ -454,23 +413,23 @@ static int ean13_cc(struct zint_symbol *symbol, const unsigned char source[], in
|
||||
half_way = 7;
|
||||
|
||||
/* start character */
|
||||
ustrcat(dest, "111");
|
||||
strcat(dest, "111");
|
||||
for (i = 1; i < length; i++) {
|
||||
if (i == half_way) {
|
||||
/* middle character - separates manufacturer no. from product no. */
|
||||
/* also inverses right hand characters */
|
||||
ustrcat(dest, "11111");
|
||||
strcat(dest, "11111");
|
||||
}
|
||||
|
||||
if (((i > 1) && (i < 7)) && (parity[i - 2] == 'B')) {
|
||||
lookup(NEON, EANsetB, gtin[i], (char *) dest);
|
||||
lookup(NEON, EANsetB, gtin[i], dest);
|
||||
} else {
|
||||
lookup(NEON, EANsetA, gtin[i], (char *) dest);
|
||||
lookup(NEON, EANsetA, gtin[i], dest);
|
||||
}
|
||||
}
|
||||
|
||||
/* stop character */
|
||||
ustrcat(dest, "111");
|
||||
strcat(dest, "111");
|
||||
ustrcpy(symbol->text, gtin);
|
||||
|
||||
#ifdef COMPLIANT_HEIGHTS
|
||||
@ -494,29 +453,25 @@ static int ean13_cc(struct zint_symbol *symbol, const unsigned char source[], in
|
||||
return error_number;
|
||||
}
|
||||
|
||||
static int ean13(struct zint_symbol *symbol, const unsigned char source[], int length, unsigned char dest[]) {
|
||||
static int ean13(struct zint_symbol *symbol, const unsigned char source[], int length, char dest[]) {
|
||||
return ean13_cc(symbol, source, length, dest, 0 /*cc_rows*/);
|
||||
}
|
||||
|
||||
static int ean8_cc(struct zint_symbol *symbol, const unsigned char source[], int length, unsigned char dest[],
|
||||
int cc_rows) {
|
||||
static int ean8_cc(struct zint_symbol *symbol, const unsigned char source[], int length, char dest[], int cc_rows) {
|
||||
/* EAN-8 is basically the same as UPC-A but with fewer digits */
|
||||
char gtin[10];
|
||||
unsigned char gtin[10];
|
||||
float height;
|
||||
int error_number = 0;
|
||||
|
||||
ustrcpy(gtin, source);
|
||||
|
||||
if (length == 7) {
|
||||
gtin[length++] = upc_check(gtin, 7);
|
||||
gtin[length++] = gs1_check_digit(gtin, 7);
|
||||
gtin[length] = '\0';
|
||||
} else {
|
||||
if (source[length - 1] != upc_check(gtin, 7)) {
|
||||
if (symbol->debug & ZINT_DEBUG_PRINT) {
|
||||
printf("EAN-8: Invalid check digit %s, gtin: %s, Check digit: %c\n", source, gtin,
|
||||
upc_check(gtin, 7));
|
||||
}
|
||||
strcpy(symbol->errtxt, "276: Invalid check digit");
|
||||
if (source[length - 1] != gs1_check_digit(gtin, 7)) {
|
||||
sprintf(symbol->errtxt, "276: Invalid check digit '%c', expecting '%c'",
|
||||
source[length - 1], gs1_check_digit(gtin, 7));
|
||||
return ZINT_ERROR_INVALID_CHECK;
|
||||
}
|
||||
}
|
||||
@ -550,7 +505,7 @@ static int ean8_cc(struct zint_symbol *symbol, const unsigned char source[], int
|
||||
}
|
||||
|
||||
/* Make an EAN-8 barcode when we haven't been given the check digit */
|
||||
static int ean8(struct zint_symbol *symbol, const unsigned char source[], int length, unsigned char dest[]) {
|
||||
static int ean8(struct zint_symbol *symbol, const unsigned char source[], int length, char dest[]) {
|
||||
return ean8_cc(symbol, source, length, dest, 0 /*cc_rows*/);
|
||||
}
|
||||
|
||||
@ -576,36 +531,34 @@ static char isbn_check(const unsigned char source[], const int length) {
|
||||
}
|
||||
|
||||
/* Make an EAN-13 barcode from an SBN or ISBN */
|
||||
static int isbn(struct zint_symbol *symbol, unsigned char source[], const int src_len, unsigned char dest[]) {
|
||||
static int isbn(struct zint_symbol *symbol, unsigned char source[], const int src_len, char dest[]) {
|
||||
int i, error_number;
|
||||
char check_digit;
|
||||
|
||||
to_upper(source);
|
||||
error_number = is_sane("0123456789X", source, src_len);
|
||||
error_number = is_sane(ISBN_SANE, source, src_len);
|
||||
if (error_number == ZINT_ERROR_INVALID_DATA) {
|
||||
strcpy(symbol->errtxt, "277: Invalid characters in input");
|
||||
sprintf(symbol->errtxt, "277: Invalid characters in data (\"%s\" only)", ISBN_SANE);
|
||||
return error_number;
|
||||
}
|
||||
|
||||
/* Input must be 9, 10 or 13 characters */
|
||||
if (src_len != 9 && src_len != 10 && src_len != 13) {
|
||||
strcpy(symbol->errtxt, "278: Input wrong length");
|
||||
strcpy(symbol->errtxt, "278: Input wrong length (9, 10, or 13 characters only)");
|
||||
return ZINT_ERROR_TOO_LONG;
|
||||
}
|
||||
|
||||
if (src_len == 13) /* Using 13 character ISBN */ {
|
||||
if (!(((source[0] == '9') && (source[1] == '7')) &&
|
||||
((source[2] == '8') || (source[2] == '9')))) {
|
||||
strcpy(symbol->errtxt, "279: Invalid ISBN");
|
||||
strcpy(symbol->errtxt, "279: Invalid ISBN (must begin with \"978\" or \"979\")");
|
||||
return ZINT_ERROR_INVALID_DATA;
|
||||
}
|
||||
|
||||
check_digit = ean_check((const char *) source, 12);
|
||||
check_digit = gs1_check_digit(source, 12);
|
||||
if (source[src_len - 1] != check_digit) {
|
||||
if (symbol->debug & ZINT_DEBUG_PRINT) {
|
||||
printf("ISBN: Invalid check digit %s, Check digit: %c\n", source, check_digit);
|
||||
}
|
||||
strcpy(symbol->errtxt, "280: Incorrect ISBN check");
|
||||
sprintf(symbol->errtxt, "280: Incorrect ISBN check '%c', expecting '%c'",
|
||||
source[src_len - 1], check_digit);
|
||||
return ZINT_ERROR_INVALID_CHECK;
|
||||
}
|
||||
source[12] = '\0';
|
||||
@ -622,10 +575,8 @@ static int isbn(struct zint_symbol *symbol, unsigned char source[], const int sr
|
||||
if (src_len == 9 || src_len == 10) /* Using 10 digit ISBN or 9 digit SBN padded with leading zero */ {
|
||||
check_digit = isbn_check(source, 9);
|
||||
if (check_digit != source[9]) {
|
||||
if (symbol->debug & ZINT_DEBUG_PRINT) {
|
||||
printf("ISBN(10)/SBN: Invalid check digit %s, Check digit: %c\n", source, check_digit);
|
||||
}
|
||||
strcpy(symbol->errtxt, src_len == 9 ? "281: Incorrect SBN check" : "281: Incorrect ISBN check");
|
||||
sprintf(symbol->errtxt, "281: Incorrect %s check '%c', expecting '%c'", src_len == 9 ? "SBN" : "ISBN",
|
||||
source[9], check_digit);
|
||||
return ZINT_ERROR_INVALID_CHECK;
|
||||
}
|
||||
for (i = 11; i > 2; i--) {
|
||||
@ -782,8 +733,9 @@ INTERNAL int ean_leading_zeroes(struct zint_symbol *symbol, const unsigned char
|
||||
}
|
||||
|
||||
INTERNAL int eanx_cc(struct zint_symbol *symbol, unsigned char source[], int src_len, int cc_rows) {
|
||||
unsigned char first_part[14] = {0}, second_part[6] = {0}, dest[1000] = {0};
|
||||
unsigned char first_part[14] = {0}, second_part[6] = {0};
|
||||
unsigned char local_source[20] = {0}; /* Allow 13 + "+" + 5 + 1 */
|
||||
char dest[1000] = {0};
|
||||
int latch, reader, writer;
|
||||
int with_addon;
|
||||
int error_number, i, plus_count;
|
||||
@ -795,20 +747,20 @@ INTERNAL int eanx_cc(struct zint_symbol *symbol, unsigned char source[], int src
|
||||
writer = 0;
|
||||
|
||||
if (src_len > 19) {
|
||||
strcpy(symbol->errtxt, "283: Input too long");
|
||||
strcpy(symbol->errtxt, "283: Input too long"); // TODO: Better error message
|
||||
return ZINT_ERROR_TOO_LONG;
|
||||
}
|
||||
if (symbol->symbology != BARCODE_ISBNX) {
|
||||
/* ISBN has its own checking routine */
|
||||
error_number = is_sane("0123456789+", source, src_len);
|
||||
error_number = is_sane(SODIUM, source, src_len);
|
||||
if (error_number == ZINT_ERROR_INVALID_DATA) {
|
||||
strcpy(symbol->errtxt, "284: Invalid characters in data");
|
||||
sprintf(symbol->errtxt, "284: Invalid characters in data (\"%s\" only)", SODIUM);
|
||||
return error_number;
|
||||
}
|
||||
} else {
|
||||
error_number = is_sane("0123456789Xx+", source, src_len);
|
||||
error_number = is_sane(ISBN_CC_SANE, source, src_len);
|
||||
if (error_number == ZINT_ERROR_INVALID_DATA) {
|
||||
strcpy(symbol->errtxt, "285: Invalid characters in input");
|
||||
sprintf(symbol->errtxt, "285: Invalid characters in data (\"%s\" only)", ISBN_CC_SANE);
|
||||
return error_number;
|
||||
}
|
||||
}
|
||||
@ -818,16 +770,16 @@ INTERNAL int eanx_cc(struct zint_symbol *symbol, unsigned char source[], int src
|
||||
for (i = 0; i < src_len; i++) {
|
||||
if (source[i] == '+') {
|
||||
plus_count++;
|
||||
}
|
||||
}
|
||||
if (plus_count > 1) {
|
||||
strcpy(symbol->errtxt, "293: Invalid add-on data");
|
||||
strcpy(symbol->errtxt, "293: Invalid add-on data (one \"+\" only)");
|
||||
return ZINT_ERROR_INVALID_DATA;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Add leading zeroes, checking max lengths of parts */
|
||||
if (!ean_leading_zeroes(symbol, source, local_source, &with_addon)) {
|
||||
strcpy(symbol->errtxt, "294: Input too long");
|
||||
strcpy(symbol->errtxt, "294: Input too long"); // TODO: Better error message
|
||||
return ZINT_ERROR_TOO_LONG;
|
||||
}
|
||||
|
||||
@ -869,7 +821,7 @@ INTERNAL int eanx_cc(struct zint_symbol *symbol, unsigned char source[], int src
|
||||
case BARCODE_EANX:
|
||||
case BARCODE_EANX_CHK:
|
||||
switch (first_part_len) {
|
||||
case 2: add_on(first_part, first_part_len, dest, 0);
|
||||
case 2: ean_add_on(first_part, first_part_len, dest, 0);
|
||||
ustrcpy(symbol->text, first_part);
|
||||
#ifdef COMPLIANT_HEIGHTS
|
||||
/* 21.9mm from GS1 General Specifications 5.2.6.6, Figure 5.2.6.6-5 */
|
||||
@ -880,7 +832,7 @@ INTERNAL int eanx_cc(struct zint_symbol *symbol, unsigned char source[], int src
|
||||
(void) set_height(symbol, 0.0f, height, 0.0f, 1 /*no_errtxt*/);
|
||||
#endif
|
||||
break;
|
||||
case 5: add_on(first_part, first_part_len, dest, 0);
|
||||
case 5: ean_add_on(first_part, first_part_len, dest, 0);
|
||||
ustrcpy(symbol->text, first_part);
|
||||
#ifdef COMPLIANT_HEIGHTS
|
||||
/* 21.9mm from GS1 General Specifications 5.2.6.6, Figure 5.2.6.6-6 */
|
||||
@ -897,7 +849,7 @@ INTERNAL int eanx_cc(struct zint_symbol *symbol, unsigned char source[], int src
|
||||
case 12:
|
||||
case 13: error_number = ean13(symbol, first_part, first_part_len, dest);
|
||||
break;
|
||||
default: strcpy(symbol->errtxt, "286: Input wrong length");
|
||||
default: strcpy(symbol->errtxt, "286: Input wrong length"); // TODO: Better error message
|
||||
return ZINT_ERROR_TOO_LONG;
|
||||
}
|
||||
break;
|
||||
@ -928,7 +880,7 @@ INTERNAL int eanx_cc(struct zint_symbol *symbol, unsigned char source[], int src
|
||||
symbol->rows += 3;
|
||||
error_number = ean13_cc(symbol, first_part, first_part_len, dest, cc_rows);
|
||||
break;
|
||||
default: strcpy(symbol->errtxt, "287: Input wrong length");
|
||||
default: strcpy(symbol->errtxt, "287: Input wrong length"); // TODO: Better error message
|
||||
return ZINT_ERROR_TOO_LONG;
|
||||
}
|
||||
break;
|
||||
@ -937,7 +889,7 @@ INTERNAL int eanx_cc(struct zint_symbol *symbol, unsigned char source[], int src
|
||||
if ((first_part_len == 11) || (first_part_len == 12)) {
|
||||
error_number = upca(symbol, first_part, first_part_len, dest);
|
||||
} else {
|
||||
strcpy(symbol->errtxt, "288: Input wrong length");
|
||||
strcpy(symbol->errtxt, "288: Input wrong length"); // TODO: Better error message
|
||||
return ZINT_ERROR_TOO_LONG;
|
||||
}
|
||||
break;
|
||||
@ -955,7 +907,7 @@ INTERNAL int eanx_cc(struct zint_symbol *symbol, unsigned char source[], int src
|
||||
symbol->rows += 3;
|
||||
error_number = upca_cc(symbol, first_part, first_part_len, dest, cc_rows);
|
||||
} else {
|
||||
strcpy(symbol->errtxt, "289: Input wrong length");
|
||||
strcpy(symbol->errtxt, "289: Input wrong length"); // TODO: Better error message
|
||||
return ZINT_ERROR_TOO_LONG;
|
||||
}
|
||||
break;
|
||||
@ -964,7 +916,7 @@ INTERNAL int eanx_cc(struct zint_symbol *symbol, unsigned char source[], int src
|
||||
if ((first_part_len >= 6) && (first_part_len <= (symbol->symbology == BARCODE_UPCE ? 7 : 8))) {
|
||||
error_number = upce(symbol, first_part, first_part_len, dest);
|
||||
} else {
|
||||
strcpy(symbol->errtxt, "290: Input wrong length");
|
||||
strcpy(symbol->errtxt, "290: Input wrong length"); // TODO: Better error message
|
||||
return ZINT_ERROR_TOO_LONG;
|
||||
}
|
||||
break;
|
||||
@ -982,7 +934,7 @@ INTERNAL int eanx_cc(struct zint_symbol *symbol, unsigned char source[], int src
|
||||
symbol->rows += 3;
|
||||
error_number = upce_cc(symbol, first_part, first_part_len, dest, cc_rows);
|
||||
} else {
|
||||
strcpy(symbol->errtxt, "291: Input wrong length");
|
||||
strcpy(symbol->errtxt, "291: Input wrong length"); // TODO: Better error message
|
||||
return ZINT_ERROR_TOO_LONG;
|
||||
}
|
||||
break;
|
||||
@ -1000,17 +952,17 @@ INTERNAL int eanx_cc(struct zint_symbol *symbol, unsigned char source[], int src
|
||||
switch (second_part_len) {
|
||||
case 0: break;
|
||||
case 2:
|
||||
add_on(second_part, second_part_len, dest, addon_gap);
|
||||
ean_add_on(second_part, second_part_len, dest, addon_gap);
|
||||
ustrcat(symbol->text, "+");
|
||||
ustrcat(symbol->text, second_part);
|
||||
break;
|
||||
case 5:
|
||||
add_on(second_part, second_part_len, dest, addon_gap);
|
||||
ean_add_on(second_part, second_part_len, dest, addon_gap);
|
||||
ustrcat(symbol->text, "+");
|
||||
ustrcat(symbol->text, second_part);
|
||||
break;
|
||||
default:
|
||||
strcpy(symbol->errtxt, "292: Add-on input wrong length");
|
||||
strcpy(symbol->errtxt, "292: Add-on input wrong length"); // TODO: Better error message
|
||||
return ZINT_ERROR_TOO_LONG;
|
||||
}
|
||||
|
||||
|
@ -1114,7 +1114,7 @@ ZINT_ERROR_INVALID_DATA | The data to be encoded includes characters which
|
||||
| are not permitted by the selected symbology
|
||||
| (e.g. alphabetic characters in an EAN
|
||||
| symbol). No symbol has been generated.
|
||||
ZINT_ERROR_INVALID_CHECK | An ISBN with an incorrect check digit has been
|
||||
ZINT_ERROR_INVALID_CHECK | Data with an incorrect check digit has been
|
||||
| entered. No symbol has been generated.
|
||||
ZINT_ERROR_INVALID_OPTION | One of the values in zint_struct was set
|
||||
| incorrectly and Zint was unable to guess what
|
||||
@ -1131,7 +1131,7 @@ ZINT_ERROR_MEMORY | Zint ran out of memory. This should only be a
|
||||
| problem with legacy systems.
|
||||
ZINT_ERROR_FILE_WRITE | Zint failed to write all contents to the
|
||||
| requested output file. This should only occur
|
||||
| if the output disk becomes full.
|
||||
| if the output device becomes full.
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
To catch errors use an integer variable as shown in the code below:
|
||||
|
@ -41,7 +41,7 @@
|
||||
typedef int static_assert_int_at_least_32bits[CHAR_BIT != 8 || sizeof(int) < 4 ? -1 : 1];
|
||||
|
||||
#ifndef ARRAY_SIZE
|
||||
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
|
||||
#define ARRAY_SIZE(x) ((int) (sizeof(x) / sizeof((x)[0])))
|
||||
#endif
|
||||
|
||||
/* Print list of supported symbologies */
|
||||
@ -140,7 +140,7 @@ static void usage(void) {
|
||||
" --filetype=TYPE Set output file type BMP/EMF/EPS/GIF/PCX/PNG/SVG/TIF/TXT\n"
|
||||
" --fullmultibyte Use multibyte for binary/Latin (QR/Han Xin/Grid Matrix)\n"
|
||||
" --gs1 Treat input as GS1 compatible data\n"
|
||||
" --gs1parens GS1 AIs in parentheses instead of square brackets\n"
|
||||
" --gs1parens Process parentheses \"()\" as GS1 AI delimiters, not \"[]\"\n"
|
||||
" --gssep Use separator GS for GS1 (Data Matrix)\n"
|
||||
" -h, --help Display help message\n"
|
||||
" --height=NUMBER Set height of symbol in multiples of X-dimension\n"
|
||||
@ -157,7 +157,7 @@ static void usage(void) {
|
||||
" --rotate=NUMBER Rotate symbol by NUMBER degrees\n"
|
||||
" --rows=NUMBER Set number of rows (Codablock-F)\n"
|
||||
" --scale=NUMBER Adjust size of X-dimension\n"
|
||||
" --scmvv=NUMBER Prefix SCM with [)>\\R01\\Gvv (vv is NUMBER) (MaxiCode)\n"
|
||||
" --scmvv=NUMBER Prefix SCM with \"[)>\\R01\\Gvv\" (vv is NUMBER) (MaxiCode)\n"
|
||||
" --secure=NUMBER Set error correction level (ECC)\n"
|
||||
" --separator=NUMBER Set height of row separator bars (stacked symbologies)\n"
|
||||
" --small Use small text\n"
|
||||
@ -423,7 +423,7 @@ static int supported_filetype(const char *filetype, const int no_png, int *png_r
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < (int) ARRAY_SIZE(filetypes); i++) {
|
||||
for (i = 0; i < ARRAY_SIZE(filetypes); i++) {
|
||||
if (strcmp(lc_filetype, filetypes[i]) == 0) {
|
||||
return 1;
|
||||
}
|
||||
@ -486,7 +486,7 @@ static int is_raster(const char *filetype, const int no_png) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < (int) ARRAY_SIZE(raster_filetypes); i++) {
|
||||
for (i = 0; i < ARRAY_SIZE(raster_filetypes); i++) {
|
||||
if (strcmp(lc_filetype, raster_filetypes[i]) == 0) {
|
||||
return 1;
|
||||
}
|
||||
|
@ -107,7 +107,7 @@ static char *exec(const char *cmd, char *buf, int buf_size, int debug, int index
|
||||
fprintf(stderr, "exec: failed to run '%s'\n", cmd);
|
||||
return NULL;
|
||||
}
|
||||
cnt = fread(buf, 1, buf_size, fp);
|
||||
cnt = (int) fread(buf, 1, buf_size, fp);
|
||||
if (fgetc(fp) != EOF) {
|
||||
fprintf(stderr, "exec: failed to read full stream (%s)\n", cmd);
|
||||
testutil_pclose(fp);
|
||||
@ -161,7 +161,7 @@ static int arg_input(char *cmd, const char *filename, const char *input) {
|
||||
fprintf(stderr, "arg_input: failed to open '%s' for writing\n", filename);
|
||||
return 0;
|
||||
}
|
||||
cnt = fwrite(input, 1, strlen(input), fp);
|
||||
cnt = (int) fwrite(input, 1, strlen(input), fp);
|
||||
if (cnt != (int) strlen(input)) {
|
||||
fprintf(stderr, "arg_input: failed to write %d bytes, cnt %d written (%s)\n", (int) strlen(input), cnt, filename);
|
||||
fclose(fp);
|
||||
|
Loading…
Reference in New Issue
Block a user