CLI: return ZINT_ERROR_INVALID_OPTION instead of 1 on bad option and

ZINT_WARN_INVALID_OPTION instead of 0 on ignored option;
  more barcode synonyms
manual: append man page zint.1.pmd instead of CLI help;
  various tweaks and fiddlings;
  rMQR add ISO 23941 (released the other day but haven't got yet)
man page: expand and tweak
doc/Makefile: add HTML demo
This commit is contained in:
gitlost 2022-05-22 21:33:45 +01:00
parent 6537d4670f
commit 9ae4e347d7
14 changed files with 1533 additions and 593 deletions

View file

@ -159,7 +159,7 @@ static void usage(int no_png) {
" --height=NUMBER Set height of symbol in multiples of X-dimension\n"
" --heightperrow Treat height as per-row\n"
" -i, --input=FILE Read input data from FILE\n"
" --init Create reader initialisation/programming symbol\n"
" --init Create Reader Initialisation (Programming) symbol\n"
" --mask=NUMBER Set masking pattern to use (QR/Han Xin/DotCode)\n"
" --mirror Use batch data to determine filename\n"
" --mode=NUMBER Set encoding mode (MaxiCode/Composite)\n"
@ -274,33 +274,84 @@ static void to_lower(char source[]) {
static int get_barcode_name(const char *barcode_name) {
struct name { const int symbology; const char *n; };
static const struct name names[] = { /* Must be sorted for binary search to work */
{ BARCODE_C25LOGIC, "2of5datalogic" }, /* Synonym */
{ BARCODE_C25IATA, "2of5iata" }, /* Synonym */
{ BARCODE_C25IND, "2of5ind" }, /* Synonym */
{ BARCODE_C25IND, "2of5industrial" }, /* Synonym */
{ BARCODE_C25INTER, "2of5inter" }, /* Synonym */
{ BARCODE_C25INTER, "2of5interleaved" }, /* Synonym */
{ BARCODE_C25LOGIC, "2of5logic" }, /* Synonym */
{ BARCODE_C25STANDARD, "2of5matrix" }, /* Synonym */
{ BARCODE_C25STANDARD, "2of5standard" }, /* Synonym */
{ BARCODE_AUSPOST, "auspost" },
{ BARCODE_AUSREDIRECT, "ausredirect" },
{ BARCODE_AUSREPLY, "ausreply" },
{ BARCODE_AUSROUTE, "ausroute" },
{ BARCODE_AZRUNE, "azrune" },
{ BARCODE_AZTEC, "aztec" },
{ BARCODE_AZTEC, "azteccode" }, /* Synonym */
{ BARCODE_AZRUNE, "aztecrune" }, /* Synonym */
{ BARCODE_AZRUNE, "aztecrunes" }, /* Synonym */
{ BARCODE_C25LOGIC, "c25datalogic" }, /* Synonym */
{ BARCODE_C25IATA, "c25iata" },
{ BARCODE_C25IND, "c25ind" },
{ BARCODE_C25IND, "c25industrial" }, /* Synonym */
{ BARCODE_C25INTER, "c25inter" },
{ BARCODE_C25INTER, "c25interleaved" }, /* Synonym */
{ BARCODE_C25LOGIC, "c25logic" },
{ BARCODE_C25STANDARD, "c25matrix" },
{ BARCODE_C25STANDARD, "c25standard" },
{ BARCODE_CHANNEL, "channel" },
{ BARCODE_CHANNEL, "channelcode" }, /* Synonym */
{ BARCODE_CODABAR, "codabar" },
{ BARCODE_CODABLOCKF, "codablockf" },
{ BARCODE_CODE11, "code11" },
{ BARCODE_CODE128, "code128" },
{ BARCODE_CODE128B, "code128b" },
{ BARCODE_CODE16K, "code16k" },
{ BARCODE_C25LOGIC, "code2of5datalogic" }, /* Synonym */
{ BARCODE_C25IATA, "code2of5iata" }, /* Synonym */
{ BARCODE_C25IND, "code2of5ind" }, /* Synonym */
{ BARCODE_C25IND, "code2of5industrial" }, /* Synonym */
{ BARCODE_C25INTER, "code2of5inter" }, /* Synonym */
{ BARCODE_C25INTER, "code2of5interleaved" }, /* Synonym */
{ BARCODE_C25LOGIC, "code2of5logic" }, /* Synonym */
{ BARCODE_C25STANDARD, "code2of5matrix" }, /* Synonym */
{ BARCODE_C25STANDARD, "code2of5standard" }, /* Synonym */
{ BARCODE_CODE32, "code32" },
{ BARCODE_CODE39, "code39" },
{ BARCODE_CODE49, "code49" },
{ BARCODE_CODE93, "code93" },
{ BARCODE_CODEONE, "codeone" },
{ BARCODE_DAFT, "daft" },
{ BARCODE_DBAR_EXP, "databarexp" }, /* Synonym */
{ BARCODE_DBAR_EXP, "databarexpanded" }, /* Synonym */
{ BARCODE_DBAR_EXP_CC, "databarexpandedcc" }, /* Synonym */
{ BARCODE_DBAR_EXPSTK, "databarexpandedstacked" }, /* Synonym */
{ BARCODE_DBAR_EXPSTK_CC, "databarexpandedstackedcc" }, /* Synonym */
{ BARCODE_DBAR_EXPSTK, "databarexpandedstk" }, /* Synonym */
{ BARCODE_DBAR_EXPSTK_CC, "databarexpandedstkcc" }, /* Synonym */
{ BARCODE_DBAR_EXP_CC, "databarexpcc" }, /* Synonym */
{ BARCODE_DBAR_EXPSTK, "databarexpstk" }, /* Synonym */
{ BARCODE_DBAR_EXPSTK_CC, "databarexpstkcc" }, /* Synonym */
{ BARCODE_DBAR_LTD, "databarlimited" }, /* Synonym */
{ BARCODE_DBAR_LTD_CC, "databarlimitedcc" }, /* Synonym */
{ BARCODE_DBAR_LTD, "databarltd" }, /* Synonym */
{ BARCODE_DBAR_LTD_CC, "databarltdcc" }, /* Synonym */
{ BARCODE_DBAR_OMN, "databaromn" }, /* Synonym */
{ BARCODE_DBAR_OMN_CC, "databaromncc" }, /* Synonym */
{ BARCODE_DBAR_OMN, "databaromni" }, /* Synonym */
{ BARCODE_DBAR_OMN_CC, "databaromnicc" }, /* Synonym */
{ BARCODE_DBAR_OMNSTK, "databaromnstk" }, /* Synonym */
{ BARCODE_DBAR_OMNSTK_CC, "databaromnstkcc" }, /* Synonym */
{ BARCODE_DBAR_STK, "databarstacked" }, /* Synonym */
{ BARCODE_DBAR_STK_CC, "databarstackedcc" }, /* Synonym */
{ BARCODE_DBAR_OMNSTK, "databarstackedomn" }, /* Synonym */
{ BARCODE_DBAR_OMNSTK_CC, "databarstackedomncc" }, /* Synonym */
{ BARCODE_DBAR_OMNSTK, "databarstackedomni" }, /* Synonym */
{ BARCODE_DBAR_OMNSTK_CC, "databarstackedomnicc" }, /* Synonym */
{ BARCODE_DBAR_STK, "databarstk" }, /* Synonym */
{ BARCODE_DBAR_STK_CC, "databarstkcc" }, /* Synonym */
{ BARCODE_DATAMATRIX, "datamatrix" },
{ BARCODE_DBAR_EXP, "dbarexp" },
{ BARCODE_DBAR_EXP_CC, "dbarexpcc" },
@ -328,6 +379,7 @@ static int get_barcode_name(const char *barcode_name) {
{ BARCODE_EANX_CC, "eanxcc" },
{ BARCODE_EANX_CHK, "eanxchk" },
{ BARCODE_EXCODE39, "excode39" },
{ BARCODE_EXCODE39, "extendedcode39" }, /* Synonym */
{ BARCODE_FIM, "fim" },
{ BARCODE_FLAT, "flat" },
{ BARCODE_GRIDMATRIX, "gridmatrix" },
@ -350,6 +402,12 @@ static int get_barcode_name(const char *barcode_name) {
{ BARCODE_HIBC_PDF, "hibcpdf417" }, /* Synonym */
{ BARCODE_HIBC_QR, "hibcqr" },
{ BARCODE_HIBC_QR, "hibcqrcode" }, /* Synonym */
{ BARCODE_C25IATA, "iata2of5" }, /* Synonym */
{ BARCODE_C25IATA, "iatacode2of5" }, /* Synonym */
{ BARCODE_C25IND, "industrial2of5" }, /* Synonym */
{ BARCODE_C25IND, "industrialcode2of5" }, /* Synonym */
{ BARCODE_C25INTER, "interleaved2of5" }, /* Synonym */
{ BARCODE_C25INTER, "interleavedcode2of5" }, /* Synonym */
{ BARCODE_ISBNX, "isbnx" },
{ BARCODE_ITF14, "itf14" },
{ BARCODE_JAPANPOST, "japanpost" },
@ -360,6 +418,7 @@ static int get_barcode_name(const char *barcode_name) {
{ BARCODE_MAXICODE, "maxicode" },
{ BARCODE_MICROPDF417, "micropdf417" },
{ BARCODE_MICROQR, "microqr" },
{ BARCODE_MICROQR, "microqrcode" }, /* Synonym */
{ BARCODE_MSI_PLESSEY, "msi" }, /* Synonym */
{ BARCODE_MSI_PLESSEY, "msiplessey" },
{ BARCODE_NVE18, "nve18" },
@ -389,6 +448,7 @@ static int get_barcode_name(const char *barcode_name) {
{ BARCODE_DBAR_EXPSTK_CC, "rssexpstackcc" }, /* Synonym */
{ BARCODE_DBAR_LTD, "rssltd" }, /* Synonym */
{ BARCODE_DBAR_LTD_CC, "rssltdcc" }, /* Synonym */
{ BARCODE_C25STANDARD, "standardcode2of5" },
{ BARCODE_TELEPEN, "telepen" },
{ BARCODE_TELEPEN_NUM, "telepennum" },
{ BARCODE_ULTRA, "ultra" },
@ -619,7 +679,7 @@ static int batch_process(struct zint_symbol *symbol, const char *filename, const
FILE *file;
unsigned char buffer[ZINT_MAX_DATA_LEN] = {0}; // Maximum HanXin input
unsigned char character = 0;
int buf_posn = 0, error_number = 0, line_count = 1;
int buf_posn = 0, error_number = 0, warn_number = 0, line_count = 1;
char output_file[256];
char number[12], reverse_number[12];
int inpos, local_line_count;
@ -790,9 +850,13 @@ static int batch_process(struct zint_symbol *symbol, const char *filename, const
if (character != '\n') {
fprintf(stderr, "Warning 104: No newline at end of file\n");
fflush(stderr);
warn_number = ZINT_WARN_INVALID_OPTION; /* TODO: maybe new warning e.g. ZINT_WARN_INVALID_INPUT? */
}
fclose(file);
if (error_number == 0) {
error_number = warn_number;
}
return error_number;
}
@ -873,6 +937,7 @@ int main(int argc, char **argv) {
struct zint_symbol *my_symbol;
struct zint_seg segs[10] = {0};
int error_number = 0;
int warn_number = 0;
int rotate_angle = 0;
int help = 0;
int data_cnt = 0;
@ -1014,13 +1079,14 @@ int main(int argc, char **argv) {
case OPT_ADDONGAP:
if (!validate_int(optarg, &val)) {
fprintf(stderr, "Error 139: Invalid add-on gap value (digits only)\n");
return do_exit(1);
return do_exit(ZINT_ERROR_INVALID_OPTION);
}
if (val >= 7 && val <= 12) {
addon_gap = val;
} else {
fprintf(stderr, "Warning 140: Add-on gap out of range (7 to 12), ignoring\n");
fflush(stderr);
warn_number = ZINT_WARN_INVALID_OPTION;
}
break;
case OPT_BATCH:
@ -1030,6 +1096,7 @@ int main(int argc, char **argv) {
} else {
fprintf(stderr, "Warning 141: Can't use batch mode if data given, ignoring\n");
fflush(stderr);
warn_number = ZINT_WARN_INVALID_OPTION;
}
break;
case OPT_BG:
@ -1047,13 +1114,14 @@ int main(int argc, char **argv) {
case OPT_BORDER:
if (!validate_int(optarg, &val)) {
fprintf(stderr, "Error 107: Invalid border width value (digits only)\n");
return do_exit(1);
return do_exit(ZINT_ERROR_INVALID_OPTION);
}
if (val <= 1000) { /* `val` >= 0 always */
my_symbol->border_width = val;
} else {
fprintf(stderr, "Warning 108: Border width out of range (0 to 1000), ignoring\n");
fflush(stderr);
warn_number = ZINT_WARN_INVALID_OPTION;
}
break;
case OPT_BOX:
@ -1065,13 +1133,14 @@ int main(int argc, char **argv) {
case OPT_COLS:
if (!validate_int(optarg, &val)) {
fprintf(stderr, "Error 131: Invalid columns value (digits only)\n");
return do_exit(1);
return do_exit(ZINT_ERROR_INVALID_OPTION);
}
if ((val >= 1) && (val <= 200)) {
my_symbol->option_2 = val;
} else {
fprintf(stderr, "Warning 111: Number of columns out of range (1 to 200), ignoring\n");
fflush(stderr);
warn_number = ZINT_WARN_INVALID_OPTION;
}
break;
case OPT_COMPLIANTHEIGHT:
@ -1092,6 +1161,7 @@ int main(int argc, char **argv) {
/* Zero and negative values are not permitted */
fprintf(stderr, "Warning 106: Invalid dot radius value (less than 0.01), ignoring\n");
fflush(stderr);
warn_number = ZINT_WARN_INVALID_OPTION;
my_symbol->dot_size = 4.0f / 5.0f;
}
break;
@ -1105,13 +1175,14 @@ int main(int argc, char **argv) {
case OPT_ECI:
if (!validate_int(optarg, &val)) {
fprintf(stderr, "Error 138: Invalid ECI value (digits only)\n");
return do_exit(1);
return do_exit(ZINT_ERROR_INVALID_OPTION);
}
if (val <= 999999) { /* `val` >= 0 always */
my_symbol->eci = val;
} else {
fprintf(stderr, "Warning 118: ECI code out of range (0 to 999999), ignoring\n");
fflush(stderr);
warn_number = ZINT_WARN_INVALID_OPTION;
}
break;
case OPT_ESC:
@ -1132,6 +1203,7 @@ int main(int argc, char **argv) {
fprintf(stderr, "Warning 142: File type '%s' not supported, ignoring\n", optarg);
}
fflush(stderr);
warn_number = ZINT_WARN_INVALID_OPTION;
} else {
strncpy(filetype, optarg, (size_t) 3);
}
@ -1139,13 +1211,14 @@ int main(int argc, char **argv) {
case OPT_FONTSIZE:
if (!validate_int(optarg, &val)) {
fprintf(stderr, "Error 130: Invalid font size value (digits only)\n");
return do_exit(1);
return do_exit(ZINT_ERROR_INVALID_OPTION);
}
if (val <= 100) { /* `val` >= 0 always */
my_symbol->fontsize = val;
} else {
fprintf(stderr, "Warning 126: Font size out of range (0 to 100), ignoring\n");
fflush(stderr);
warn_number = ZINT_WARN_INVALID_OPTION;
}
break;
case OPT_FULLMULTIBYTE:
@ -1171,6 +1244,7 @@ int main(int argc, char **argv) {
fprintf(stderr, "Warning 155: Guard bar descent '%g' out of range (0 to 50), ignoring\n",
float_opt);
fflush(stderr);
warn_number = ZINT_WARN_INVALID_OPTION;
}
break;
case OPT_HEIGHT:
@ -1181,6 +1255,7 @@ int main(int argc, char **argv) {
fprintf(stderr, "Warning 110: Symbol height '%g' out of range (0.5 to 2000), ignoring\n",
float_opt);
fflush(stderr);
warn_number = ZINT_WARN_INVALID_OPTION;
}
break;
case OPT_HEIGHTPERROW:
@ -1196,12 +1271,13 @@ int main(int argc, char **argv) {
case OPT_MASK:
if (!validate_int(optarg, &val)) {
fprintf(stderr, "Error 148: Invalid mask value (digits only)\n");
return do_exit(1);
return do_exit(ZINT_ERROR_INVALID_OPTION);
}
if (val > 7) { /* `val` >= 0 always */
/* mask pattern >= 0 and <= 7 (i.e. values >= 1 and <= 8) only permitted */
fprintf(stderr, "Warning 147: Mask value out of range (0 to 7), ignoring\n");
fflush(stderr);
warn_number = ZINT_WARN_INVALID_OPTION;
} else {
mask = val + 1;
}
@ -1209,13 +1285,14 @@ int main(int argc, char **argv) {
case OPT_MODE:
if (!validate_int(optarg, &val)) {
fprintf(stderr, "Error 136: Invalid mode value (digits only)\n");
return do_exit(1);
return do_exit(ZINT_ERROR_INVALID_OPTION);
}
if (val <= 6) { /* `val` >= 0 always */
my_symbol->option_1 = val;
} else {
fprintf(stderr, "Warning 116: Mode value out of range (0 to 6), ignoring\n");
fflush(stderr);
warn_number = ZINT_WARN_INVALID_OPTION;
}
break;
case OPT_NOBACKGROUND:
@ -1233,6 +1310,7 @@ int main(int argc, char **argv) {
} else {
fprintf(stderr, "Warning 115: Primary data string too long (127 character maximum), ignoring\n");
fflush(stderr);
warn_number = ZINT_WARN_INVALID_OPTION;
}
break;
case OPT_QUIETZONES:
@ -1242,7 +1320,7 @@ int main(int argc, char **argv) {
/* Only certain inputs allowed */
if (!validate_int(optarg, &val)) {
fprintf(stderr, "Error 117: Invalid rotation value (digits only)\n");
return do_exit(1);
return do_exit(ZINT_ERROR_INVALID_OPTION);
}
switch (val) {
case 90: rotate_angle = 90;
@ -1257,19 +1335,21 @@ int main(int argc, char **argv) {
fprintf(stderr,
"Warning 137: Invalid rotation parameter (0, 90, 180 or 270 only), ignoring\n");
fflush(stderr);
warn_number = ZINT_WARN_INVALID_OPTION;
break;
}
break;
case OPT_ROWS:
if (!validate_int(optarg, &val)) {
fprintf(stderr, "Error 132: Invalid rows value (digits only)\n");
return do_exit(1);
return do_exit(ZINT_ERROR_INVALID_OPTION);
}
if ((val >= 1) && (val <= 90)) {
rows = val;
} else {
fprintf(stderr, "Warning 112: Number of rows out of range (1 to 90), ignoring\n");
fflush(stderr);
warn_number = ZINT_WARN_INVALID_OPTION;
}
break;
case OPT_SCALE:
@ -1278,13 +1358,14 @@ int main(int argc, char **argv) {
/* Zero and negative values are not permitted */
fprintf(stderr, "Warning 105: Invalid scale value (less than 0.01), ignoring\n");
fflush(stderr);
warn_number = ZINT_WARN_INVALID_OPTION;
my_symbol->scale = 1.0f;
}
break;
case OPT_SCMVV:
if (!validate_int(optarg, &val)) {
fprintf(stderr, "Error 149: Invalid Structured Carrier Message version value (digits only)\n");
return do_exit(1);
return do_exit(ZINT_ERROR_INVALID_OPTION);
}
if (val <= 99) { /* `val` >= 0 always */
my_symbol->option_2 = val + 1;
@ -1293,18 +1374,20 @@ int main(int argc, char **argv) {
fprintf(stderr,
"Warning 150: Structured Carrier Message version out of range (0 to 99), ignoring\n");
fflush(stderr);
warn_number = ZINT_WARN_INVALID_OPTION;
}
break;
case OPT_SECURE:
if (!validate_int(optarg, &val)) {
fprintf(stderr, "Error 134: Invalid ECC value (digits only)\n");
return do_exit(1);
return do_exit(ZINT_ERROR_INVALID_OPTION);
}
if (val <= 8) { /* `val` >= 0 always */
my_symbol->option_1 = val;
} else {
fprintf(stderr, "Warning 114: ECC level out of range (0 to 8), ignoring\n");
fflush(stderr);
warn_number = ZINT_WARN_INVALID_OPTION;
}
break;
case OPT_SEG1:
@ -1320,10 +1403,10 @@ int main(int argc, char **argv) {
val = c - OPT_SEG1 + 1; /* Segment number */
if (segs[val].source) {
fprintf(stderr, "Error 164: Duplicate segment %d\n", val);
return do_exit(1);
return do_exit(ZINT_ERROR_INVALID_OPTION);
}
if (!validate_seg(optarg, c - OPT_SEG1 + 1, segs)) {
return do_exit(1);
return do_exit(ZINT_ERROR_INVALID_OPTION);
}
if (val >= seg_count) {
seg_count = val + 1;
@ -1331,12 +1414,13 @@ int main(int argc, char **argv) {
} else {
fprintf(stderr, "Warning 165: Can't define segments in batch mode, ignoring '%s'\n", optarg);
fflush(stderr);
warn_number = ZINT_WARN_INVALID_OPTION;
}
break;
case OPT_SEPARATOR:
if (!validate_int(optarg, &val)) {
fprintf(stderr, "Error 128: Invalid separator value (digits only)\n");
return do_exit(1);
return do_exit(ZINT_ERROR_INVALID_OPTION);
}
if (val <= 4) { /* `val` >= 0 always */
separator = val;
@ -1344,6 +1428,7 @@ int main(int argc, char **argv) {
/* Greater than 4 values are not permitted */
fprintf(stderr, "Warning 127: Separator value out of range (0 to 4), ignoring\n");
fflush(stderr);
warn_number = ZINT_WARN_INVALID_OPTION;
}
break;
case OPT_SMALL:
@ -1355,7 +1440,7 @@ int main(int argc, char **argv) {
case OPT_STRUCTAPP:
memset(&my_symbol->structapp, 0, sizeof(my_symbol->structapp));
if (!validate_structapp(optarg, &my_symbol->structapp)) {
return do_exit(1);
return do_exit(ZINT_ERROR_INVALID_OPTION);
}
break;
case OPT_VERBOSE:
@ -1364,25 +1449,27 @@ int main(int argc, char **argv) {
case OPT_VERS:
if (!validate_int(optarg, &val)) {
fprintf(stderr, "Error 133: Invalid version value (digits only)\n");
return do_exit(1);
return do_exit(ZINT_ERROR_INVALID_OPTION);
}
if ((val >= 1) && (val <= 999)) {
my_symbol->option_2 = val;
} else {
fprintf(stderr, "Warning 113: Version value out of range (1 to 999), ignoring\n");
fflush(stderr);
warn_number = ZINT_WARN_INVALID_OPTION;
}
break;
case OPT_VWHITESP:
if (!validate_int(optarg, &val)) {
fprintf(stderr, "Error 153: Invalid vertical whitespace value '%s' (digits only)\n", optarg);
return do_exit(1);
return do_exit(ZINT_ERROR_INVALID_OPTION);
}
if (val <= 1000) { /* `val` >= 0 always */
my_symbol->whitespace_height = val;
} else {
fprintf(stderr, "Warning 154: Vertical whitespace value out of range (0 to 1000), ignoring\n");
fflush(stderr);
warn_number = ZINT_WARN_INVALID_OPTION;
}
break;
case OPT_WERROR:
@ -1412,7 +1499,7 @@ int main(int argc, char **argv) {
case 'b':
if (!validate_int(optarg, &val) && !(val = get_barcode_name(optarg))) {
fprintf(stderr, "Error 119: Invalid barcode type '%s'\n", optarg);
return do_exit(1);
return do_exit(ZINT_ERROR_INVALID_OPTION);
}
my_symbol->symbology = val;
break;
@ -1420,13 +1507,14 @@ int main(int argc, char **argv) {
case 'w':
if (!validate_int(optarg, &val)) {
fprintf(stderr, "Error 120: Invalid horizontal whitespace value '%s' (digits only)\n", optarg);
return do_exit(1);
return do_exit(ZINT_ERROR_INVALID_OPTION);
}
if (val <= 1000) { /* `val` >= 0 always */
my_symbol->whitespace_width = val;
} else {
fprintf(stderr, "Warning 121: Horizontal whitespace value out of range (0 to 1000), ignoring\n");
fflush(stderr);
warn_number = ZINT_WARN_INVALID_OPTION;
}
break;
@ -1439,6 +1527,7 @@ int main(int argc, char **argv) {
} else {
fprintf(stderr, "Warning 122: Can't define data in batch mode, ignoring '%s'\n", optarg);
fflush(stderr);
warn_number = ZINT_WARN_INVALID_OPTION;
}
break;
@ -1452,6 +1541,7 @@ int main(int argc, char **argv) {
fprintf(stderr, "Warning 143: Can only define one input file in batch mode, ignoring '%s'\n",
optarg);
fflush(stderr);
warn_number = ZINT_WARN_INVALID_OPTION;
}
break;
@ -1515,10 +1605,12 @@ int main(int argc, char **argv) {
if (data_arg_num > 1) {
fprintf(stderr, "Warning 144: Processing first input file '%s' only\n", arg_opts[0].arg);
fflush(stderr);
warn_number = ZINT_WARN_INVALID_OPTION;
}
if (seg_count) {
fprintf(stderr, "Warning 169: Ignoring segment arguments\n");
fflush(stderr);
warn_number = ZINT_WARN_INVALID_OPTION;
}
if (filetype[0] == '\0') {
outfile_extension = get_extension(my_symbol->outfile);
@ -1534,21 +1626,18 @@ int main(int argc, char **argv) {
fprintf(stderr, "Warning 145: Scaling less than 0.%d will be set to 0.%d for '%s' output\n", min, min,
filetype);
fflush(stderr);
warn_number = ZINT_WARN_INVALID_OPTION;
}
error_number = batch_process(my_symbol, arg_opts[0].arg, mirror_mode, filetype, rotate_angle);
if (error_number != 0) {
fprintf(stderr, "%s\n", my_symbol->errtxt);
fflush(stderr);
}
} else {
if (seg_count) {
if (data_arg_num > 1) {
fprintf(stderr, "Error 170: Cannot specify segments and multiple data arguments together\n");
return do_exit(1);
return do_exit(ZINT_ERROR_INVALID_OPTION);
}
if (arg_opts[0].opt != 'd') { /* For simplicity disallow input args for now */
fprintf(stderr, "Error 171: Cannot use input argument with segment arguments\n");
return do_exit(1);
return do_exit(ZINT_ERROR_INVALID_OPTION);
}
segs[0].eci = my_symbol->eci;
segs[0].source = (unsigned char *) arg_opts[0].arg;
@ -1556,7 +1645,7 @@ int main(int argc, char **argv) {
for (i = 0; i < seg_count; i++) {
if (segs[i].source == NULL) {
fprintf(stderr, "Error 172: Segments must be consecutive - segment %d missing\n", i);
return do_exit(1);
return do_exit(ZINT_ERROR_INVALID_OPTION);
}
}
}
@ -1569,6 +1658,7 @@ int main(int argc, char **argv) {
fprintf(stderr, "Warning 146: Scaling less than 0.%d will be set to 0.%d for '%s' output\n", min, min,
get_extension(my_symbol->outfile));
fflush(stderr);
warn_number = ZINT_WARN_INVALID_OPTION;
}
for (i = 0; i < data_arg_num; i++) {
if (arg_opts[i].opt == 'd') {
@ -1607,11 +1697,12 @@ int main(int argc, char **argv) {
} else if (help == 0) {
fprintf(stderr, "Warning 124: No data received, no symbol generated\n");
fflush(stderr);
warn_number = ZINT_WARN_INVALID_OPTION;
}
ZBarcode_Delete(my_symbol);
return do_exit(error_number);
return do_exit(error_number ? error_number : warn_number);
}
/* vim: set ts=4 sw=4 et : */

View file

@ -77,9 +77,10 @@ static int escape_cmd(const char *str, char *buf) {
}
#endif
static char *exec(const char *cmd, char *buf, int buf_size, int debug, int index) {
static char *exec(const char *cmd, char *buf, int buf_size, int debug, int index, int *p_exit_status) {
FILE *fp;
int cnt;
int exit_status;
#ifdef _WIN32
wchar_t wchar_cmd[8192];
char esc_cmd[16384];
@ -109,10 +110,22 @@ static char *exec(const char *cmd, char *buf, int buf_size, int debug, int index
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);
exit_status = testutil_pclose(fp);
if (p_exit_status) {
if (WIFEXITED(exit_status)) {
exit_status = WEXITSTATUS(exit_status);
}
*p_exit_status = exit_status;
}
return NULL;
}
testutil_pclose(fp);
exit_status = testutil_pclose(fp);
if (p_exit_status) {
if (WIFEXITED(exit_status)) {
exit_status = WEXITSTATUS(exit_status);
}
*p_exit_status = exit_status;
}
if (cnt) {
if (buf[cnt - 1] == '\r' || buf[cnt - 1] == '\n') {
@ -363,7 +376,7 @@ static void test_dump_args(int index, int debug) {
strcat(cmd, " 2>&1");
assert_nonnull(exec(cmd, buf, sizeof(buf) - 1, debug, i), "i:%d exec(%s) NULL\n", i, cmd);
assert_nonnull(exec(cmd, buf, sizeof(buf) - 1, debug, i, NULL), "i:%d exec(%s) NULL\n", i, cmd);
assert_zero(strcmp(buf, data[i].expected), "i:%d buf (%s) != expected (%s) (%s)\n", i, buf, data[i].expected, cmd);
if (have_input1) {
@ -441,7 +454,7 @@ static void test_dump_segs(int index, int debug) {
strcat(cmd, " 2>&1");
assert_nonnull(exec(cmd, buf, sizeof(buf) - 1, debug, i), "i:%d exec(%s) NULL\n", i, cmd);
assert_nonnull(exec(cmd, buf, sizeof(buf) - 1, debug, i, NULL), "i:%d exec(%s) NULL\n", i, cmd);
assert_zero(strcmp(buf, data[i].expected), "i:%d buf (%s) != expected (%s) (%s)\n", i, buf, data[i].expected, cmd);
}
@ -519,7 +532,7 @@ static void test_input(int index, int debug) {
arg_input(cmd, input_filename, data[i].input);
arg_data(cmd, "-o ", data[i].outfile);
assert_nonnull(exec(cmd, buf, sizeof(buf) - 1, debug, i), "i:%d exec(%s) NULL\n", i, cmd);
assert_nonnull(exec(cmd, buf, sizeof(buf) - 1, debug, i, NULL), "i:%d exec(%s) NULL\n", i, cmd);
outfile = data[i].expected;
for (j = 0; j < data[i].num_expected; j++) {
@ -569,7 +582,7 @@ static void test_stdin_input(int index, int debug) {
arg_input(cmd, input_filename, data[i].input);
arg_data(cmd, "-o ", data[i].outfile);
assert_nonnull(exec(cmd, buf, sizeof(buf) - 1, debug, i), "i:%d exec(%s) NULL\n", i, cmd);
assert_nonnull(exec(cmd, buf, sizeof(buf) - 1, debug, i, NULL), "i:%d exec(%s) NULL\n", i, cmd);
assert_nonzero(testUtilExists(data[i].outfile), "i:%d testUtilExists(%s) != 1\n", i, data[i].outfile);
assert_zero(remove(data[i].outfile), "i:%d remove(%s) != 0 (%d: %s)\n", i, data[i].outfile, errno, strerror(errno));
@ -624,7 +637,7 @@ static void test_batch_input(int index, int debug) {
strcat(cmd, " 2>&1");
assert_nonnull(exec(cmd, buf, sizeof(buf) - 1, debug, i), "i:%d exec(%s) NULL\n", i, cmd);
assert_nonnull(exec(cmd, buf, sizeof(buf) - 1, debug, i, NULL), "i:%d exec(%s) NULL\n", i, cmd);
assert_zero(strcmp(buf, data[i].expected), "i:%d buf (%s) != expected (%s)\n", i, buf, data[i].expected);
if (have_input1) {
@ -688,7 +701,7 @@ static void test_batch_large(int index, int debug) {
strcat(data_buf, "\n");
have_input = arg_input(cmd, input_filename, data_buf);
assert_nonnull(exec(cmd, buf, sizeof(buf) - 1, debug, i), "i:%d exec(%s) NULL\n", i, cmd);
assert_nonnull(exec(cmd, buf, sizeof(buf) - 1, debug, i, NULL), "i:%d exec(%s) NULL\n", i, cmd);
if (data[i].expected) {
assert_zero(remove(data[i].expected), "i:%d remove(%s) != 0 (%d: %s)\n", i, data[i].expected, errno, strerror(errno));
} else {
@ -808,7 +821,7 @@ static void test_checks(int index, int debug) {
strcat(cmd, " 2>&1");
assert_nonnull(exec(cmd, buf, sizeof(buf) - 1, debug, i), "i:%d exec(%s) NULL\n", i, cmd);
assert_nonnull(exec(cmd, buf, sizeof(buf) - 1, debug, i, NULL), "i:%d exec(%s) NULL\n", i, cmd);
assert_zero(strcmp(buf, data[i].expected), "i:%d buf (%s) != expected (%s)\n", i, buf, data[i].expected);
if (strncmp(data[i].expected, "Warning", 7) == 0) {
@ -838,136 +851,196 @@ static void test_barcode_symbology(int index, int debug) {
/* 5*/ { "BARCODE_CODE11", "1", NULL, 0, "symbology: 1," },
/* 6*/ { "C25 Standard", "1", NULL, 0, "symbology: 2," },
/* 7*/ { "c25matrix", "1", NULL, 0, "symbology: 2," }, // Legacy now supported
/* 8*/ { "C25INTER", "1", NULL, 0, "symbology: 3," },
/* 9*/ { "c25IATA", "1", NULL, 0, "symbology: 4," },
/* 10*/ { "c25 Logic", "1", NULL, 0, "symbology: 6," },
/* 11*/ { "c25 Ind", "1", NULL, 0, "symbology: 7," },
/* 12*/ { "code39", "1", NULL, 0, "symbology: 8," },
/* 13*/ { "excode 39", "1", NULL, 0, "symbology: 9," },
/* 14*/ { "eanx", "1", NULL, 0, "symbology: 13," },
/* 15*/ { "ean", "1", NULL, 0, "symbology: 13," },
/* 16*/ { "eanx chk", "1", NULL, 0, "symbology: 14," },
/* 17*/ { "eanxchk", "1", NULL, 0, "symbology: 14," },
/* 18*/ { "eanchk", "1", NULL, 0, "symbology: 14," },
/* 19*/ { "GS1128", "[01]12345678901231", NULL, 0, "symbology: 16," },
/* 20*/ { "ean 128", "[01]12345678901231", NULL, 0, "symbology: 16," },
/* 21*/ { "coda bar", "A1B", NULL, 0, "symbology: 18," },
/* 22*/ { "DPLEIT", "1", NULL, 0, "symbology: 21," },
/* 23*/ { "DPIDENT", "1", NULL, 0, "symbology: 22," },
/* 24*/ { "code16k", "1", NULL, 0, "symbology: 23," },
/* 25*/ { "CODE49", "1", NULL, 0, "symbology: 24," },
/* 26*/ { "CODE93", "1", NULL, 0, "symbology: 25," },
/* 27*/ { "flat", "1", NULL, 0, "symbology: 28," },
/* 28*/ { "dbar omn", "1", NULL, 0, "symbology: 29," },
/* 29*/ { "rss14", "1", NULL, 0, "symbology: 29," },
/* 30*/ { "dbar ltd", "1", NULL, 0, "symbology: 30," },
/* 31*/ { "rss ltd", "1", NULL, 0, "symbology: 30," },
/* 32*/ { "dbarexp", "[10]12", NULL, 0, "symbology: 31," },
/* 33*/ { "rss exp", "[10]12", NULL, 0, "symbology: 31," },
/* 34*/ { "telepen", "1", NULL, 0, "symbology: 32," },
/* 35*/ { "upc", "1", NULL, 1, "Error 119: Invalid barcode type 'upc'" },
/* 36*/ { "upca", "1", NULL, 0, "symbology: 34," },
/* 37*/ { "upca_chk", "123456789012", NULL, 0, "symbology: 35," },
/* 38*/ { "upce", "1", NULL, 0, "symbology: 37," },
/* 39*/ { "upce chk", "12345670", NULL, 0, "symbology: 38," },
/* 40*/ { "POSTNET ", "12345678901", NULL, 0, "symbology: 40," },
/* 41*/ { "msi", "1", NULL, 0, "symbology: 47," },
/* 42*/ { "MSI Plessey ", "1", NULL, 0, "symbology: 47," },
/* 43*/ { "fim ", "A", NULL, 0, "symbology: 49," },
/* 44*/ { "LOGMARS", "123456", NULL, 0, "symbology: 50," },
/* 45*/ { " pharma", "123456", NULL, 0, "symbology: 51," },
/* 46*/ { " pzn ", "1", NULL, 0, "symbology: 52," },
/* 47*/ { "pharma two", "4", NULL, 0, "symbology: 53," },
/* 48*/ { "BARCODE_PDF417", "1", NULL, 0, "symbology: 55," },
/* 49*/ { "pdf", "1", NULL, 1, "Error 119: Invalid barcode type 'pdf'" },
/* 50*/ { "barcodepdf417comp", "1", NULL, 0, "symbology: 56," },
/* 51*/ { "pdf417trunc", "1", NULL, 0, "symbology: 56," },
/* 52*/ { "MaxiCode", "1", NULL, 0, "symbology: 57," },
/* 53*/ { "QR CODE", "1", NULL, 0, "symbology: 58," },
/* 54*/ { "qr", "1", NULL, 0, "symbology: 58," }, // Synonym
/* 55*/ { "Code 128 B", "1", NULL, 0, "symbology: 60," },
/* 56*/ { "AUS POST", "12345678901234567890123", NULL, 0, "symbology: 63," },
/* 57*/ { "AusReply", "12345678", NULL, 0, "symbology: 66," },
/* 58*/ { "AUSROUTE", "12345678", NULL, 0, "symbology: 67," },
/* 59*/ { "AUS REDIRECT", "12345678", NULL, 0, "symbology: 68," },
/* 60*/ { "isbnx", "123456789", NULL, 0, "symbology: 69," },
/* 61*/ { "rm4scc", "1", NULL, 0, "symbology: 70," },
/* 62*/ { "DataMatrix", "1", NULL, 0, "symbology: 71," },
/* 63*/ { "EAN14", "1", NULL, 0, "symbology: 72," },
/* 64*/ { "vin", "12345678701234567", NULL, 0, "symbology: 73," },
/* 65*/ { "CodaBlock-F", "1", NULL, 0, "symbology: 74," },
/* 66*/ { "NVE18", "1", NULL, 0, "symbology: 75," },
/* 67*/ { "Japan Post", "1", NULL, 0, "symbology: 76," },
/* 68*/ { "Korea Post", "1", NULL, 0, "symbology: 77," },
/* 69*/ { "DBar Stk", "1", NULL, 0, "symbology: 79," },
/* 70*/ { "rss14stack", "1", NULL, 0, "symbology: 79," },
/* 71*/ { "DBar Omn Stk", "1", NULL, 0, "symbology: 80," },
/* 72*/ { "RSS14STACK OMNI", "1", NULL, 0, "symbology: 80," },
/* 73*/ { "DBar Exp Stk", "[20]01", NULL, 0, "symbology: 81," },
/* 74*/ { "rss_expstack", "[20]01", NULL, 0, "symbology: 81," },
/* 75*/ { "planet", "12345678901", NULL, 0, "symbology: 82," },
/* 76*/ { "MicroPDF417", "1", NULL, 0, "symbology: 84," },
/* 77*/ { "USPS IMail", "12345678901234567890", NULL, 0, "symbology: 85," },
/* 78*/ { "OneCode", "12345678901234567890", NULL, 0, "symbology: 85," },
/* 79*/ { "plessey", "1", NULL, 0, "symbology: 86," },
/* 80*/ { "telepen num", "1", NULL, 0, "symbology: 87," },
/* 81*/ { "ITF14", "1", NULL, 0, "symbology: 89," },
/* 82*/ { "KIX", "1", NULL, 0, "symbology: 90," },
/* 83*/ { "Aztec", "1", NULL, 0, "symbology: 92," },
/* 84*/ { "daft", "D", NULL, 0, "symbology: 93," },
/* 85*/ { "DPD", "0123456789012345678901234567", NULL, 0, "symbology: 96," },
/* 86*/ { "Micro QR", "1", NULL, 0, "symbology: 97," },
/* 87*/ { "hibc128", "1", NULL, 0, "symbology: 98," },
/* 88*/ { "hibccode128", "1", NULL, 0, "symbology: 98," }, // Synonym
/* 89*/ { "hibc39", "1", NULL, 0, "symbology: 99," },
/* 90*/ { "hibccode39", "1", NULL, 0, "symbology: 99," }, // Synonym
/* 91*/ { "hibcdatamatrix", "1", NULL, 0, "symbology: 102," }, // Synonym
/* 92*/ { "hibcdm", "1", NULL, 0, "symbology: 102," },
/* 93*/ { "HIBC qr", "1", NULL, 0, "symbology: 104," },
/* 94*/ { "HIBC QR Code", "1", NULL, 0, "symbology: 104," }, // Synonym
/* 95*/ { "HIBCPDF", "1", NULL, 0, "symbology: 106," },
/* 96*/ { "HIBCPDF417", "1", NULL, 0, "symbology: 106," }, // Synonym
/* 97*/ { "HIBCMICPDF", "1", NULL, 0, "symbology: 108," },
/* 98*/ { "HIBC Micro PDF", "1", NULL, 0, "symbology: 108," }, // Synonym
/* 99*/ { "HIBC Micro PDF417", "1", NULL, 0, "symbology: 108," }, // Synonym
/*100*/ { "HIBC BlockF", "1", NULL, 0, "symbology: 110," },
/*101*/ { "HIBC CodaBlock-F", "1", NULL, 0, "symbology: 110," }, // Synonym
/*102*/ { "HIBC Aztec", "1", NULL, 0, "symbology: 112," },
/*103*/ { "DotCode", "1", NULL, 0, "symbology: 115," },
/*104*/ { "Han Xin", "1", NULL, 0, "symbology: 116," },
/*105*/ { "Mailmark", "01000000000000000AA00AA0A", NULL, 0, "symbology: 121," },
/*106*/ { "azrune", "1", NULL, 0, "symbology: 128," },
/*107*/ { "aztecrune", "1", NULL, 0, "symbology: 128," }, // Synonym
/*108*/ { "aztecrunes", "1", NULL, 0, "symbology: 128," }, // Synonym
/*109*/ { "code32", "1", NULL, 0, "symbology: 129," },
/*110*/ { "eanx cc", "[20]01", "1234567890128", 0, "symbology: 130," },
/*111*/ { "eancc", "[20]01", "1234567890128", 0, "symbology: 130," },
/*112*/ { "GS1 128 CC", "[01]12345678901231", "[20]01", 0, "symbology: 131," },
/*113*/ { "EAN128 CC", "[01]12345678901231", "[20]01", 0, "symbology: 131," },
/*114*/ { "dbaromncc", "[20]01", "1234567890123", 0, "symbology: 132," },
/*115*/ { "rss14 cc", "[20]01", "1234567890123", 0, "symbology: 132," },
/*116*/ { "dbarltdcc", "[20]01", "1234567890123", 0, "symbology: 133," },
/*117*/ { "rss ltd cc", "[20]01", "1234567890123", 0, "symbology: 133," },
/*118*/ { "dbarexpcc", "[20]01", "[01]12345678901231", 0, "symbology: 134," },
/*119*/ { "rss exp cc", "[20]01", "[01]12345678901231", 0, "symbology: 134," },
/*120*/ { "upcacc", "[20]01", "12345678901", 0, "symbology: 135," },
/*121*/ { "upcecc", "[20]01", "1234567", 0, "symbology: 136," },
/*122*/ { "dbar stk cc", "[20]01", "1234567890123", 0, "symbology: 137," },
/*123*/ { "rss14stackcc", "[20]01", "1234567890123", 0, "symbology: 137," },
/*124*/ { "dbaromnstkcc", "[20]01", "1234567890123", 0, "symbology: 138," },
/*125*/ { "BARCODE_RSS14_OMNI_CC", "[20]01", "1234567890123", 0, "symbology: 138," },
/*126*/ { "dbarexpstkcc", "[20]01", "[01]12345678901231", 0, "symbology: 139," },
/*127*/ { "RSS EXPSTACK CC", "[20]01", "[01]12345678901231", 0, "symbology: 139," },
/*128*/ { "Channel", "1", NULL, 0, "symbology: 140," },
/*129*/ { "CodeOne", "1", NULL, 0, "symbology: 141," },
/*130*/ { "Grid Matrix", "1", NULL, 0, "symbology: 142," },
/*131*/ { "UPN QR", "1", NULL, 0, "symbology: 143," },
/*132*/ { "UPN QR Code", "1", NULL, 0, "symbology: 143," }, // Synonym
/*133*/ { "ultra", "1", NULL, 0, "symbology: 144," },
/*134*/ { "ultracode", "1", NULL, 0, "symbology: 144," }, // Synonym
/*135*/ { "rMQR", "1", NULL, 0, "symbology: 145," },
/*136*/ { "x", "1", NULL, 1, "Error 119: Invalid barcode type 'x'" },
/*137*/ { "\177", "1", NULL, 1, "Error 119: Invalid barcode type '\177'" },
/* 8*/ { "2 of 5 Standard", "1", NULL, 0, "symbology: 2," }, // Synonym
/* 9*/ { "2 of 5 Matrix", "1", NULL, 0, "symbology: 2," }, // Synonym
/* 10*/ { "Code 2 of 5 Standard", "1", NULL, 0, "symbology: 2," }, // Synonym
/* 11*/ { "Code 2 of 5 Matrix", "1", NULL, 0, "symbology: 2," }, // Synonym
/* 12*/ { "Standard Code 2 of 5", "1", NULL, 0, "symbology: 2," }, // Synonym
/* 13*/ { "C25INTER", "1", NULL, 0, "symbology: 3," },
/* 14*/ { "c25 interleaved", "1", NULL, 0, "symbology: 3," }, // Synonym
/* 15*/ { "code 2 of 5 inter", "1", NULL, 0, "symbology: 3," }, // Synonym
/* 16*/ { "code 2 of 5 interleaved", "1", NULL, 0, "symbology: 3," }, // Synonym
/* 17*/ { "2 of 5 inter", "1", NULL, 0, "symbology: 3," }, // Synonym
/* 18*/ { "2 of 5 interleaved", "1", NULL, 0, "symbology: 3," }, // Synonym
/* 19*/ { "interleaved 2 of 5", "1", NULL, 0, "symbology: 3," }, // Synonym
/* 20*/ { "interleaved code 2 of 5", "1", NULL, 0, "symbology: 3," }, // Synonym
/* 21*/ { "c25IATA", "1", NULL, 0, "symbology: 4," },
/* 22*/ { "2of5IATA", "1", NULL, 0, "symbology: 4," }, // Synonym
/* 23*/ { "code2of5IATA", "1", NULL, 0, "symbology: 4," }, // Synonym
/* 24*/ { "IATA2of5", "1", NULL, 0, "symbology: 4," }, // Synonym
/* 25*/ { "IATAcode2of5", "1", NULL, 0, "symbology: 4," }, // Synonym
/* 26*/ { "c25 Logic", "1", NULL, 0, "symbology: 6," },
/* 27*/ { "c25 Data Logic", "1", NULL, 0, "symbology: 6," }, // Synonym
/* 28*/ { "Code 2 of 5 Logic", "1", NULL, 0, "symbology: 6," }, // Synonym
/* 29*/ { "Code 2 of 5 Data Logic", "1", NULL, 0, "symbology: 6," }, // Synonym
/* 30*/ { "2 of 5 Logic", "1", NULL, 0, "symbology: 6," }, // Synonym
/* 31*/ { "2 of 5 Data Logic", "1", NULL, 0, "symbology: 6," }, // Synonym
/* 32*/ { "c25 Ind", "1", NULL, 0, "symbology: 7," },
/* 33*/ { "c25 Industrial", "1", NULL, 0, "symbology: 7," }, // Synonym
/* 34*/ { "code 2 of 5 Ind", "1", NULL, 0, "symbology: 7," }, // Synonym
/* 35*/ { "code 2 of 5 Industrial", "1", NULL, 0, "symbology: 7," }, // Synonym
/* 36*/ { "2 of 5 Ind", "1", NULL, 0, "symbology: 7," }, // Synonym
/* 37*/ { "2 of 5 Industrial", "1", NULL, 0, "symbology: 7," }, // Synonym
/* 38*/ { "Industrial 2 of 5", "1", NULL, 0, "symbology: 7," }, // Synonym
/* 39*/ { "Industrial code 2 of 5", "1", NULL, 0, "symbology: 7," }, // Synonym
/* 40*/ { "code39", "1", NULL, 0, "symbology: 8," },
/* 41*/ { "excode 39", "1", NULL, 0, "symbology: 9," },
/* 42*/ { "Extended Code 39", "1", NULL, 0, "symbology: 9," },
/* 43*/ { "eanx", "1", NULL, 0, "symbology: 13," },
/* 44*/ { "ean", "1", NULL, 0, "symbology: 13," },
/* 45*/ { "eanx chk", "1", NULL, 0, "symbology: 14," },
/* 46*/ { "eanxchk", "1", NULL, 0, "symbology: 14," },
/* 47*/ { "eanchk", "1", NULL, 0, "symbology: 14," },
/* 48*/ { "GS1128", "[01]12345678901231", NULL, 0, "symbology: 16," },
/* 49*/ { "ean 128", "[01]12345678901231", NULL, 0, "symbology: 16," },
/* 50*/ { "coda bar", "A1B", NULL, 0, "symbology: 18," },
/* 51*/ { "DPLEIT", "1", NULL, 0, "symbology: 21," },
/* 52*/ { "DPIDENT", "1", NULL, 0, "symbology: 22," },
/* 53*/ { "code16k", "1", NULL, 0, "symbology: 23," },
/* 54*/ { "CODE49", "1", NULL, 0, "symbology: 24," },
/* 55*/ { "CODE93", "1", NULL, 0, "symbology: 25," },
/* 56*/ { "flat", "1", NULL, 0, "symbology: 28," },
/* 57*/ { "dbar omn", "1", NULL, 0, "symbology: 29," },
/* 58*/ { "rss14", "1", NULL, 0, "symbology: 29," },
/* 59*/ { "databar omn", "1", NULL, 0, "symbology: 29," },
/* 60*/ { "databar omni", "1", NULL, 0, "symbology: 29," },
/* 61*/ { "dbar ltd", "1", NULL, 0, "symbology: 30," },
/* 62*/ { "rss ltd", "1", NULL, 0, "symbology: 30," },
/* 63*/ { "databar ltd", "1", NULL, 0, "symbology: 30," },
/* 64*/ { "databar limited", "1", NULL, 0, "symbology: 30," },
/* 65*/ { "dbarexp", "[10]12", NULL, 0, "symbology: 31," },
/* 66*/ { "rss exp", "[10]12", NULL, 0, "symbology: 31," },
/* 67*/ { "databarexp", "[10]12", NULL, 0, "symbology: 31," },
/* 68*/ { "databarexpanded", "[10]12", NULL, 0, "symbology: 31," },
/* 69*/ { "telepen", "1", NULL, 0, "symbology: 32," },
/* 70*/ { "upc", "1", NULL, 1, "Error 119: Invalid barcode type 'upc'" },
/* 71*/ { "upca", "1", NULL, 0, "symbology: 34," },
/* 72*/ { "upca_chk", "123456789012", NULL, 0, "symbology: 35," },
/* 73*/ { "upce", "1", NULL, 0, "symbology: 37," },
/* 74*/ { "upce chk", "12345670", NULL, 0, "symbology: 38," },
/* 75*/ { "POSTNET ", "12345678901", NULL, 0, "symbology: 40," },
/* 76*/ { "msi", "1", NULL, 0, "symbology: 47," },
/* 77*/ { "MSI Plessey ", "1", NULL, 0, "symbology: 47," },
/* 78*/ { "fim ", "A", NULL, 0, "symbology: 49," },
/* 79*/ { "LOGMARS", "123456", NULL, 0, "symbology: 50," },
/* 80*/ { " pharma", "123456", NULL, 0, "symbology: 51," },
/* 81*/ { " pzn ", "1", NULL, 0, "symbology: 52," },
/* 82*/ { "pharma two", "4", NULL, 0, "symbology: 53," },
/* 83*/ { "BARCODE_PDF417", "1", NULL, 0, "symbology: 55," },
/* 84*/ { "pdf", "1", NULL, 1, "Error 119: Invalid barcode type 'pdf'" },
/* 85*/ { "barcodepdf417comp", "1", NULL, 0, "symbology: 56," },
/* 86*/ { "pdf417trunc", "1", NULL, 0, "symbology: 56," },
/* 87*/ { "MaxiCode", "1", NULL, 0, "symbology: 57," },
/* 88*/ { "QR CODE", "1", NULL, 0, "symbology: 58," },
/* 89*/ { "qr", "1", NULL, 0, "symbology: 58," }, // Synonym
/* 90*/ { "Code 128 B", "1", NULL, 0, "symbology: 60," },
/* 91*/ { "AUS POST", "12345678901234567890123", NULL, 0, "symbology: 63," },
/* 92*/ { "AusReply", "12345678", NULL, 0, "symbology: 66," },
/* 93*/ { "AUSROUTE", "12345678", NULL, 0, "symbology: 67," },
/* 94*/ { "AUS REDIRECT", "12345678", NULL, 0, "symbology: 68," },
/* 95*/ { "isbnx", "123456789", NULL, 0, "symbology: 69," },
/* 96*/ { "rm4scc", "1", NULL, 0, "symbology: 70," },
/* 97*/ { "DataMatrix", "1", NULL, 0, "symbology: 71," },
/* 98*/ { "EAN14", "1", NULL, 0, "symbology: 72," },
/* 99*/ { "vin", "12345678701234567", NULL, 0, "symbology: 73," },
/*100*/ { "CodaBlock-F", "1", NULL, 0, "symbology: 74," },
/*101*/ { "NVE18", "1", NULL, 0, "symbology: 75," },
/*102*/ { "Japan Post", "1", NULL, 0, "symbology: 76," },
/*103*/ { "Korea Post", "1", NULL, 0, "symbology: 77," },
/*104*/ { "DBar Stk", "1", NULL, 0, "symbology: 79," },
/*105*/ { "rss14stack", "1", NULL, 0, "symbology: 79," },
/*106*/ { "DataBar Stk", "1", NULL, 0, "symbology: 79," },
/*107*/ { "DataBar Stacked", "1", NULL, 0, "symbology: 79," },
/*108*/ { "DBar Omn Stk", "1", NULL, 0, "symbology: 80," },
/*109*/ { "RSS14STACK OMNI", "1", NULL, 0, "symbology: 80," },
/*110*/ { "DataBar Omn Stk", "1", NULL, 0, "symbology: 80," },
/*111*/ { "DataBar Stacked Omn", "1", NULL, 0, "symbology: 80," },
/*112*/ { "DataBar Stacked Omni", "1", NULL, 0, "symbology: 80," },
/*113*/ { "DBar Exp Stk", "[20]01", NULL, 0, "symbology: 81," },
/*114*/ { "rss_expstack", "[20]01", NULL, 0, "symbology: 81," },
/*115*/ { "DataBar Exp Stk", "[20]01", NULL, 0, "symbology: 81," },
/*116*/ { "DataBar Expanded Stk", "[20]01", NULL, 0, "symbology: 81," },
/*117*/ { "DataBar Expanded Stacked", "[20]01", NULL, 0, "symbology: 81," },
/*118*/ { "planet", "12345678901", NULL, 0, "symbology: 82," },
/*119*/ { "MicroPDF417", "1", NULL, 0, "symbology: 84," },
/*120*/ { "USPS IMail", "12345678901234567890", NULL, 0, "symbology: 85," },
/*121*/ { "OneCode", "12345678901234567890", NULL, 0, "symbology: 85," },
/*122*/ { "plessey", "1", NULL, 0, "symbology: 86," },
/*123*/ { "telepen num", "1", NULL, 0, "symbology: 87," },
/*124*/ { "ITF14", "1", NULL, 0, "symbology: 89," },
/*125*/ { "KIX", "1", NULL, 0, "symbology: 90," },
/*126*/ { "Aztec", "1", NULL, 0, "symbology: 92," },
/*127*/ { "Aztec Code", "1", NULL, 0, "symbology: 92," }, // Synonym
/*128*/ { "daft", "D", NULL, 0, "symbology: 93," },
/*129*/ { "DPD", "0123456789012345678901234567", NULL, 0, "symbology: 96," },
/*130*/ { "Micro QR", "1", NULL, 0, "symbology: 97," },
/*131*/ { "Micro QR Code", "1", NULL, 0, "symbology: 97," },
/*132*/ { "hibc128", "1", NULL, 0, "symbology: 98," },
/*133*/ { "hibccode128", "1", NULL, 0, "symbology: 98," }, // Synonym
/*134*/ { "hibc39", "1", NULL, 0, "symbology: 99," },
/*135*/ { "hibccode39", "1", NULL, 0, "symbology: 99," }, // Synonym
/*136*/ { "hibcdatamatrix", "1", NULL, 0, "symbology: 102," }, // Synonym
/*137*/ { "hibcdm", "1", NULL, 0, "symbology: 102," },
/*138*/ { "HIBC qr", "1", NULL, 0, "symbology: 104," },
/*139*/ { "HIBC QR Code", "1", NULL, 0, "symbology: 104," }, // Synonym
/*140*/ { "HIBCPDF", "1", NULL, 0, "symbology: 106," },
/*141*/ { "HIBCPDF417", "1", NULL, 0, "symbology: 106," }, // Synonym
/*142*/ { "HIBCMICPDF", "1", NULL, 0, "symbology: 108," },
/*143*/ { "HIBC Micro PDF", "1", NULL, 0, "symbology: 108," }, // Synonym
/*144*/ { "HIBC Micro PDF417", "1", NULL, 0, "symbology: 108," }, // Synonym
/*145*/ { "HIBC BlockF", "1", NULL, 0, "symbology: 110," },
/*146*/ { "HIBC CodaBlock-F", "1", NULL, 0, "symbology: 110," }, // Synonym
/*147*/ { "HIBC Aztec", "1", NULL, 0, "symbology: 112," },
/*148*/ { "DotCode", "1", NULL, 0, "symbology: 115," },
/*149*/ { "Han Xin", "1", NULL, 0, "symbology: 116," },
/*150*/ { "Mailmark", "01000000000000000AA00AA0A", NULL, 0, "symbology: 121," },
/*151*/ { "azrune", "1", NULL, 0, "symbology: 128," },
/*152*/ { "aztecrune", "1", NULL, 0, "symbology: 128," }, // Synonym
/*153*/ { "aztecrunes", "1", NULL, 0, "symbology: 128," }, // Synonym
/*154*/ { "code32", "1", NULL, 0, "symbology: 129," },
/*155*/ { "eanx cc", "[20]01", "1234567890128", 0, "symbology: 130," },
/*156*/ { "eancc", "[20]01", "1234567890128", 0, "symbology: 130," },
/*157*/ { "GS1 128 CC", "[01]12345678901231", "[20]01", 0, "symbology: 131," },
/*158*/ { "EAN128 CC", "[01]12345678901231", "[20]01", 0, "symbology: 131," },
/*159*/ { "dbaromncc", "[20]01", "1234567890123", 0, "symbology: 132," },
/*160*/ { "rss14 cc", "[20]01", "1234567890123", 0, "symbology: 132," },
/*161*/ { "databaromncc", "[20]01", "1234567890123", 0, "symbology: 132," },
/*162*/ { "databaromnicc", "[20]01", "1234567890123", 0, "symbology: 132," },
/*163*/ { "dbarltdcc", "[20]01", "1234567890123", 0, "symbology: 133," },
/*164*/ { "rss ltd cc", "[20]01", "1234567890123", 0, "symbology: 133," },
/*165*/ { "databarltdcc", "[20]01", "1234567890123", 0, "symbology: 133," },
/*166*/ { "databarlimitedcc", "[20]01", "1234567890123", 0, "symbology: 133," },
/*167*/ { "dbarexpcc", "[20]01", "[01]12345678901231", 0, "symbology: 134," },
/*168*/ { "rss exp cc", "[20]01", "[01]12345678901231", 0, "symbology: 134," },
/*169*/ { "databarexpcc", "[20]01", "[01]12345678901231", 0, "symbology: 134," },
/*170*/ { "databar expanded cc", "[20]01", "[01]12345678901231", 0, "symbology: 134," },
/*171*/ { "upcacc", "[20]01", "12345678901", 0, "symbology: 135," },
/*172*/ { "upcecc", "[20]01", "1234567", 0, "symbology: 136," },
/*173*/ { "dbar stk cc", "[20]01", "1234567890123", 0, "symbology: 137," },
/*174*/ { "rss14stackcc", "[20]01", "1234567890123", 0, "symbology: 137," },
/*175*/ { "databar stk cc", "[20]01", "1234567890123", 0, "symbology: 137," },
/*176*/ { "databar stacked cc", "[20]01", "1234567890123", 0, "symbology: 137," },
/*177*/ { "dbaromnstkcc", "[20]01", "1234567890123", 0, "symbology: 138," },
/*178*/ { "BARCODE_RSS14_OMNI_CC", "[20]01", "1234567890123", 0, "symbology: 138," },
/*179*/ { "databaromnstkcc", "[20]01", "1234567890123", 0, "symbology: 138," },
/*180*/ { "databar stacked omncc", "[20]01", "1234567890123", 0, "symbology: 138," },
/*181*/ { "databar stacked omni cc", "[20]01", "1234567890123", 0, "symbology: 138," },
/*182*/ { "dbarexpstkcc", "[20]01", "[01]12345678901231", 0, "symbology: 139," },
/*183*/ { "RSS EXPSTACK CC", "[20]01", "[01]12345678901231", 0, "symbology: 139," },
/*184*/ { "databarexpstkcc", "[20]01", "[01]12345678901231", 0, "symbology: 139," },
/*185*/ { "databar expanded stkcc", "[20]01", "[01]12345678901231", 0, "symbology: 139," },
/*186*/ { "databar expanded stacked cc", "[20]01", "[01]12345678901231", 0, "symbology: 139," },
/*187*/ { "Channel", "1", NULL, 0, "symbology: 140," },
/*188*/ { "Channel Code", "1", NULL, 0, "symbology: 140," },
/*189*/ { "CodeOne", "1", NULL, 0, "symbology: 141," },
/*190*/ { "Grid Matrix", "1", NULL, 0, "symbology: 142," },
/*191*/ { "UPN QR", "1", NULL, 0, "symbology: 143," },
/*192*/ { "UPN QR Code", "1", NULL, 0, "symbology: 143," }, // Synonym
/*193*/ { "ultra", "1", NULL, 0, "symbology: 144," },
/*194*/ { "ultracode", "1", NULL, 0, "symbology: 144," }, // Synonym
/*195*/ { "rMQR", "1", NULL, 0, "symbology: 145," },
/*196*/ { "x", "1", NULL, 1, "Error 119: Invalid barcode type 'x'" },
/*197*/ { "\177", "1", NULL, 1, "Error 119: Invalid barcode type '\177'" },
};
int data_size = ARRAY_SIZE(data);
int i;
@ -991,7 +1064,7 @@ static void test_barcode_symbology(int index, int debug) {
strcat(cmd, " 2>&1");
assert_nonnull(exec(cmd, buf, sizeof(buf) - 1, debug, i), "i:%d exec(%s) NULL\n", i, cmd);
assert_nonnull(exec(cmd, buf, sizeof(buf) - 1, debug, i, NULL), "i:%d exec(%s) NULL\n", i, cmd);
assert_nonnull(strstr(buf, data[i].expected), "i:%d strstr(%s, %s) == NULL (%s)\n", i, buf, data[i].expected, cmd);
if (!data[i].fail) {
assert_zero(remove(outfilename), "i:%d remove(%s) != 0 (%d: %s) (%s)\n", i, outfilename, errno, strerror(errno), cmd);
@ -1088,7 +1161,7 @@ static void test_other_opts(int index, int debug) {
strcat(cmd, " 2>&1");
assert_nonnull(exec(cmd, buf, sizeof(buf) - 1, debug, i), "i:%d exec(%s) NULL\n", i, cmd);
assert_nonnull(exec(cmd, buf, sizeof(buf) - 1, debug, i, NULL), "i:%d exec(%s) NULL\n", i, cmd);
if (data[i].strstr_cmp) {
assert_nonnull(strstr(buf, data[i].expected), "i:%d strstr buf (%s) != expected (%s) (%s)\n", i, buf, data[i].expected, cmd);
} else {
@ -1099,6 +1172,59 @@ static void test_other_opts(int index, int debug) {
testFinish();
}
static void test_exit_status(int index, int debug) {
struct item {
int b;
char *data;
int input_mode;
char *opt;
char *opt_data;
int expected;
};
// s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<"))
struct item data[] = {
/* 0*/ { BARCODE_CODE128, "1", -1, " --bg=", "EF9900", 0 },
/* 1*/ { BARCODE_CODE128, "1", -1, " --bg=", "GF9900", ZINT_ERROR_INVALID_OPTION }, // Caught by libzint
/* 2*/ { BARCODE_CODE128, "1", -1, " --border=", "1001", ZINT_WARN_INVALID_OPTION }, // Caught by CLI
/* 3*/ { BARCODE_CODE128, "1", -1, " --data=", "\200", ZINT_ERROR_INVALID_DATA }, // Caught by libzint
/* 4*/ { BARCODE_CODE128, "1", -1, " --separator=", "-1", ZINT_ERROR_INVALID_OPTION }, // Caught by CLI
};
int data_size = ARRAY_SIZE(data);
int i;
int exit_status;
char cmd[4096];
char buf[8192];
testStart("test_exit_status");
for (i = 0; i < data_size; i++) {
if (index != -1 && i != index) continue;
strcpy(cmd, "zint");
*buf = '\0';
arg_int(cmd, "-b ", data[i].b);
arg_input_mode(cmd, data[i].input_mode);
arg_data(cmd, "-d ", data[i].data);
if (data[i].opt_data != NULL) {
arg_data(cmd, data[i].opt, data[i].opt_data);
} else {
strcat(cmd, data[i].opt);
}
strcat(cmd, " 2>&1");
assert_nonnull(exec(cmd, buf, sizeof(buf) - 1, debug, i, &exit_status), "i:%d exec(%s) NULL\n", i, cmd);
assert_equal(exit_status, data[i].expected, "i:%d exit_status %d != expected (%d) (%s), (cmd: %s)\n", i, exit_status, data[i].expected, buf, cmd);
}
testFinish();
}
int main(int argc, char *argv[]) {
testFunction funcs[] = { /* name, func, has_index, has_generate, has_debug */
@ -1111,6 +1237,7 @@ int main(int argc, char *argv[]) {
{ "test_checks", test_checks, 1, 0, 1 },
{ "test_barcode_symbology", test_barcode_symbology, 1, 0, 1 },
{ "test_other_opts", test_other_opts, 1, 0, 1 },
{ "test_exit_status", test_exit_status, 1, 0, 1 },
};
testRun(argc, argv, funcs, ARRAY_SIZE(funcs));