1
0
mirror of https://git.code.sf.net/p/zint/code synced 2026-06-10 15:43:40 +00:00

TELEPEN/TELEPEN_NUM: support AIM-defined Start/Stop characters

with option "--vers=1" (API `option_2 = 1`);
  define minimum height based on AIM USS Telepen
TELEPEN_NUM: support switching to Full ASCII mode with DLE;
  max digits 136 -> 138
TELEPEN: support switching to Compressed Numeric Mode with DLE
  if AIM-defined Start/Stop enabled
CLI: make args for  "--dmb256", "--dmc40", "--scalexdimdp" and
  "--scmvv" optional
library: new escape sequences `\L`, `\F`, `\N`, & refactor parsing
  to use `escs` table
ZBarcode_Scale_From_XdimDp: allow TXT filetype (so "--dump" test
  works)
output: Telepen default quiet zone confirmed as 10X
aztec/dmatrix: fix source line too long
man page: embolden options and emphasize args;
  add barcode names to standards; various other fixes
This commit is contained in:
gitlost
2026-05-26 20:32:51 +01:00
parent 07777d044a
commit 771a1b3cdd
34 changed files with 2167 additions and 1155 deletions
+20 -14
View File
@@ -184,8 +184,8 @@ static void usage(const int no_png, const int have_gs1syntaxengine) {
" --compliantheight Warn if height not compliant, and use standard default\n"
" -d, --data=DATA Set the symbol data content (segment 0)\n", stdout);
fputs( " --direct Send output to stdout\n"
" --dmb256=INTEGER Start Data Matrix in Base 256 for given length (0 all)\n"
" --dmc40=INTEGER Start Data Matrix in C40 mode for given length (0 all)\n"
" --dmb256[=INTEGER] Start Data Matrix in Base 256 for given length (0 all)\n"
" --dmc40[=INTEGER] Start Data Matrix in C40 mode for given length (0 all)\n"
" --dmiso144 Use ISO format for 144x144 Data Matrix symbols\n"
" --dmre Allow Data Matrix Rectangular Extended\n", stdout);
fputs( " --dotsize=NUMBER Set radius of dots in dotty mode\n"
@@ -228,8 +228,8 @@ if (have_gs1syntaxengine) {
" --rotate=INTEGER Rotate symbol by INTEGER (0, 90, 180, 270) degrees\n"
" --rows=INTEGER Set number of rows (Codablock F/PDF417)\n", stdout);
fputs( " --scale=NUMBER Adjust size of X-dimension\n"
" --scalexdimdp=X[,R] Adjust size to X-dimension X at resolution R\n"
" --scmvv=INTEGER Prefix SCM with \"[)>\\R01\\Gvv\" (vv is INTEGER) (MaxiCode)\n"
" --scalexdimdp[=X[,R]] Adjust size to X-dimension X at resolution R\n"
" --scmvv[=INTEGER] Prefix SCM with \"[)>\\R01\\Gvv\" (vv is INTEGER) (MaxiCode)\n"
" --secure=INTEGER Set error correction level (ECC)\n"
" --segN=ECI,DATA Set the ECI & data content for segment N, where N 1 to 9\n", stdout);
fputs( " --separator=INTEGER Set height of row separator bars (stacked symbologies)\n"
@@ -830,7 +830,7 @@ static int validate_scalexdimdp(const char *const arg, float *const p_x_dim_mm,
int units_i; /* For `validate_units()` */
char *units_err; /* For `validate_units()` */
char errbuf_float[ERRBUF_SIZE]; /* For `validate_float()` */
const char *comma = strchr(arg, ',');
const char *comma = arg ? strchr(arg, ',') : NULL;
if (comma) {
if (comma == arg || comma - arg >= ARRAY_SIZE(x_buf)) {
cpy_str(errbuf, ERRBUF_SIZE, comma == arg ? "scalexdimdp X-dim too short" : "scalexdimdp X-dim too long");
@@ -845,11 +845,11 @@ static int validate_scalexdimdp(const char *const arg, float *const p_x_dim_mm,
}
cpy_str(r_buf, ARRAY_SIZE(r_buf), comma);
} else {
if (!*arg || strlen(arg) >= ARRAY_SIZE(x_buf)) {
if (arg && (!*arg || strlen(arg) >= ARRAY_SIZE(x_buf))) {
cpy_str(errbuf, ERRBUF_SIZE, !*arg ? "scalexdimdp X-dim too short" : "scalexdimdp X-dim too long");
return 0;
}
cpy_str(x_buf, ARRAY_SIZE(x_buf), arg);
cpy_str(x_buf, ARRAY_SIZE(x_buf), arg ? arg : "0");
}
if ((units_i = validate_units(x_buf, x_units, ARRAY_SIZE(x_units), &units_err)) < 0) {
cpycat_str(errbuf, ERRBUF_SIZE, "scalexdimdp X-dim unknown units: ", units_err);
@@ -1583,8 +1583,8 @@ int main(int argc, char **argv) {
{"compliantheight", 0, NULL, OPT_COMPLIANTHEIGHT},
{"data", 1, NULL, 'd'},
{"direct", 0, NULL, OPT_DIRECT},
{"dmb256", 1, NULL, OPT_DMB256},
{"dmc40", 1, NULL, OPT_DMC40},
{"dmb256", 2, NULL, OPT_DMB256},
{"dmc40", 2, NULL, OPT_DMC40},
{"dmiso144", 0, NULL, OPT_DMISO144},
{"dmre", 0, NULL, OPT_DMRE},
{"dotsize", 1, NULL, OPT_DOTSIZE},
@@ -1627,8 +1627,8 @@ int main(int argc, char **argv) {
{"rotate", 1, NULL, OPT_ROTATE},
{"rows", 1, NULL, OPT_ROWS},
{"scale", 1, NULL, OPT_SCALE},
{"scalexdimdp", 1, NULL, OPT_SCALEXDIM},
{"scmvv", 1, NULL, OPT_SCMVV},
{"scalexdimdp", 2, NULL, OPT_SCALEXDIM},
{"scmvv", 2, NULL, OPT_SCMVV},
{"secure", 1, NULL, OPT_SECURE},
{"seg1", 1, NULL, OPT_SEG1},
{"seg2", 1, NULL, OPT_SEG2},
@@ -1741,7 +1741,9 @@ int main(int argc, char **argv) {
my_symbol->output_options |= BARCODE_STDOUT;
break;
case OPT_DMB256:
if (!validate_int(optarg, -1 /*len*/, &val)) {
if (!optarg) {
val = 0;
} else if (!validate_int(optarg, -1 /*len*/, &val)) {
fprintf(stderr, "Error 158: Invalid Data Matrix Base 256 mode length value (digits only)\n");
return do_exit(ZINT_ERROR_INVALID_OPTION);
}
@@ -1756,7 +1758,9 @@ int main(int argc, char **argv) {
}
break;
case OPT_DMC40:
if (!validate_int(optarg, -1 /*len*/, &val)) {
if (!optarg) {
val = 0;
} else if (!validate_int(optarg, -1 /*len*/, &val)) {
fprintf(stderr, "Error 160: Invalid Data Matrix C40 mode length value (digits only)\n");
return do_exit(ZINT_ERROR_INVALID_OPTION);
}
@@ -2026,7 +2030,9 @@ int main(int argc, char **argv) {
}
break;
case OPT_SCMVV:
if (!validate_int(optarg, -1 /*len*/, &val)) {
if (!optarg) {
val = 96; /* ASC MH10/SC 8 */
} else if (!validate_int(optarg, -1 /*len*/, &val)) {
fprintf(stderr, "Error 149: Invalid Structured Carrier Message version value (digits only)\n");
return do_exit(ZINT_ERROR_INVALID_OPTION);
}
+54
View File
@@ -361,6 +361,8 @@ static void test_dump_args(const testCtx *const p_ctx) {
/* 46*/ { BARCODE_HANXIN, "é", NULL, NULL, NULL, DATA_MODE, -1, 0, -1, -1, -1, 0, -1, 1, -1, -1, NULL, -1, -1, 0, -1, "FE 8A FE\n80 28 02\nBE E8 FA\nA0 94 0A\nAE 3E EA\nAE D2 EA\nAE 74 EA\n00 AA 00\n15 B4 80\n0B 48 74\nA2 4A A4\nB5 56 2C\nA8 5A A8\n9F 18 50\n02 07 50\n00 A6 00\nFE 20 EA\n02 C2 EA\nFA C4 EA\n0A 42 0A\nEA 52 FA\nEA 24 02\nEA AA FE" },
/* 47*/ { BARCODE_HANXIN, "é", NULL, NULL, NULL, DATA_MODE, -1, 0, -1, -1, -1, 0, -1, 1, 3, -1, NULL, -1, -1, 0, -1, "FE 16 FE\n80 E2 02\nBE C2 FA\nA0 A0 0A\nAE F6 EA\nAE 98 EA\nAE BA EA\n00 E0 00\n15 83 80\n44 7E AE\n92 9C 78\n25 BF 08\n47 4B 8C\n0D F9 74\n03 E7 50\n00 3A 00\nFE C2 EA\n02 22 EA\nFA DA EA\n0A 22 0A\nEA B2 FA\nEA 9A 02\nEA E8 FE" },
/* 48*/ { BARCODE_HANXIN, "é", NULL, NULL, NULL, DATA_MODE, -1, 0, -1, -1, -1, 0, -1, 1, 4, -1, NULL, -1, -1, 0, -1, "FE 8A FE\n80 28 02\nBE E8 FA\nA0 94 0A\nAE 3E EA\nAE D2 EA\nAE 74 EA\n00 AA 00\n15 B4 80\n0B 48 74\nA2 4A A4\nB5 56 2C\nA8 5A A8\n9F 18 50\n02 07 50\n00 A6 00\nFE 20 EA\n02 C2 EA\nFA C4 EA\n0A 42 0A\nEA 52 FA\nEA 24 02\nEA AA FE" },
/* 49*/ { BARCODE_TELEPEN, "ABC\020123", NULL, NULL, NULL, DATA_MODE, -1, 0, -1, -1, -1, 0, -1, -1, -1, -1, NULL, -1, -1, 0, 1, "AB A8 BB B8 E3 B8 AE EA EE BA EA BA E2 22 BA B8 EA 2A" },
/* 50*/ { BARCODE_TELEPEN_NUM, "123\020ABC", NULL, NULL, NULL, DATA_MODE, -1, 0, -1, -1, -1, 0, -1, -1, -1, -1, NULL, -1, -1, 0, 1, "AA E8 EA BA E2 22 EE BA BB B8 E3 B8 AE EA BA B8 E8 AA" },
};
int data_size = ARRAY_SIZE(data);
int i;
@@ -1362,6 +1364,57 @@ static void test_too_many_args(const testCtx *const p_ctx) {
testFinish();
}
static void test_optional_args(const testCtx *const p_ctx) {
int debug = p_ctx->debug;
struct item {
int b;
const char *data;
const char *primary;
const char *opt;
const char *expected;
};
/* s/\/\*[ 0-9]*\*\//\=printf("\/\*%3d*\/", line(".") - line("'<")): */
struct item data[] = {
/* 0*/ { BARCODE_DATAMATRIX, "123", NULL, " --dmb256", "AA A\n88 F\nD0 C\nC7 F\nAF A\nFF 3\nF5 4\nA1 B\nB5 0\nE1 D\nE9 A\nFF F" },
/* 1*/ { BARCODE_DATAMATRIX, "123", NULL, " --dmc40", "AA 8\n80 4\nC0 8\n81 C\nB7 0\nAB C\nE1 0\nE5 4\nBC 0\nFF C" },
/* 2*/ { BARCODE_EAN13, "123", NULL, " --scalexdimdp", "A3 46 8D 1A 34 6A B9 72 CD B2 15 0A" },
/* 3*/ { BARCODE_MAXICODE, "123", "1234567", " --scmvv", "D7 6F BF FC\n55 70 D8 08\nDB 12 A6 78\n55 55 55 50\n00 00 00 08\nAA AA AA A8\n55 55 55 54\n00 00 00 00\nAA AA AA AC\n55 B1 35 58\n00 90 08 0C\nAA C0 52 A8\n54 40 05 50\n01 00 08 00\nAA C0 0A AC\n55 00 01 58\n02 80 08 0C\nAB 80 1E A0\n54 00 05 5C\n03 80 0C 08\nA8 00 02 A4\n55 40 25 58\n00 60 40 08\nAA 60 66 A0\n55 55 5B FC\n00 00 02 30\nAA AA A1 E0\n5E CF C1 E8\nD0 62 E5 84\n20 1B 10 D8\nDB 8E B6 80\n21 96 26 C0\nC3 C9 89 F8" },
};
int data_size = ARRAY_SIZE(data);
int i;
char cmd[4096];
char buf[8192];
testStart("test_optional_args");
for (i = 0; i < data_size; i++) {
if (testContinue(p_ctx, i)) continue;
strcpy(cmd, "zint --dump");
if (debug & ZINT_DEBUG_PRINT) {
strcat(cmd, " --verbose");
}
arg_int(cmd, "-b ", data[i].b);
if (data[i].primary) {
arg_data(cmd, "--primary=", data[i].primary);
}
arg_data(cmd, "-d ", data[i].data);
strcat(cmd, data[i].opt);
strcat(cmd, " 2>&1");
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);
}
testFinish();
}
int main(int argc, char *argv[]) {
testFunction funcs[] = { /* name, func */
@@ -1378,6 +1431,7 @@ int main(int argc, char *argv[]) {
{ "test_exit_status", test_exit_status },
{ "test_bad_args", test_bad_args },
{ "test_too_many_args", test_too_many_args },
{ "test_optional_args", test_optional_args },
};
testRun(argc, argv, funcs, ARRAY_SIZE(funcs));