mirror of
https://git.code.sf.net/p/zint/code
synced 2025-05-28 05:54:19 -04:00
DATAMATRIX: new algorithm for (near-)minimal encoding, props Alex Geller
Add FAST_MODE input_mode flag and --fast CLI/Tcl option that selects older faster ISO algorithm (may be used by other symbologies in the future) and "Fast Encoding" checkbox to Data Matrix GUI GUI: adds Zint version numbers to DATAMATRIX sizes.
This commit is contained in:
parent
caadc87f7e
commit
b36fba8ba6
28 changed files with 4578 additions and 2298 deletions
1147
backend/dmatrix.c
1147
backend/dmatrix.c
File diff suppressed because it is too large
Load diff
|
@ -2,7 +2,7 @@
|
|||
|
||||
/*
|
||||
libzint - the open source barcode library
|
||||
Copyright (C) 2009 - 2020 Robin Stuart <rstuart114@gmail.com>
|
||||
Copyright (C) 2009 - 2021 Robin Stuart <rstuart114@gmail.com>
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
|
@ -32,7 +32,7 @@
|
|||
/* vim: set ts=4 sw=4 et : */
|
||||
|
||||
/*
|
||||
Containes Extended Rectangular Data Matrix (DMRE)
|
||||
Contains Extended Rectangular Data Matrix (DMRE)
|
||||
See http://www.dmre.info for information
|
||||
Contact: harald.oehlmann@eurodatacouncil.org
|
||||
*/
|
||||
|
|
|
@ -49,7 +49,6 @@
|
|||
#ifndef _MSC_VER
|
||||
#include <stdint.h>
|
||||
#else
|
||||
#include <malloc.h>
|
||||
#include "ms_stdint.h"
|
||||
#endif
|
||||
#include <assert.h>
|
||||
|
|
|
@ -22,126 +22,147 @@
|
|||
<circle cx="39.00" cy="5.00" r="0.80" />
|
||||
<circle cx="3.00" cy="7.00" r="0.80" />
|
||||
<circle cx="7.00" cy="7.00" r="0.80" />
|
||||
<circle cx="13.00" cy="7.00" r="0.80" />
|
||||
<circle cx="9.00" cy="7.00" r="0.80" />
|
||||
<circle cx="11.00" cy="7.00" r="0.80" />
|
||||
<circle cx="15.00" cy="7.00" r="0.80" />
|
||||
<circle cx="19.00" cy="7.00" r="0.80" />
|
||||
<circle cx="21.00" cy="7.00" r="0.80" />
|
||||
<circle cx="25.00" cy="7.00" r="0.80" />
|
||||
<circle cx="29.00" cy="7.00" r="0.80" />
|
||||
<circle cx="35.00" cy="7.00" r="0.80" />
|
||||
<circle cx="37.00" cy="7.00" r="0.80" />
|
||||
<circle cx="27.00" cy="7.00" r="0.80" />
|
||||
<circle cx="31.00" cy="7.00" r="0.80" />
|
||||
<circle cx="39.00" cy="7.00" r="0.80" />
|
||||
<circle cx="41.00" cy="7.00" r="0.80" />
|
||||
<circle cx="3.00" cy="9.00" r="0.80" />
|
||||
<circle cx="7.00" cy="9.00" r="0.80" />
|
||||
<circle cx="9.00" cy="9.00" r="0.80" />
|
||||
<circle cx="11.00" cy="9.00" r="0.80" />
|
||||
<circle cx="15.00" cy="9.00" r="0.80" />
|
||||
<circle cx="19.00" cy="9.00" r="0.80" />
|
||||
<circle cx="23.00" cy="9.00" r="0.80" />
|
||||
<circle cx="17.00" cy="9.00" r="0.80" />
|
||||
<circle cx="21.00" cy="9.00" r="0.80" />
|
||||
<circle cx="27.00" cy="9.00" r="0.80" />
|
||||
<circle cx="29.00" cy="9.00" r="0.80" />
|
||||
<circle cx="33.00" cy="9.00" r="0.80" />
|
||||
<circle cx="35.00" cy="9.00" r="0.80" />
|
||||
<circle cx="37.00" cy="9.00" r="0.80" />
|
||||
<circle cx="3.00" cy="11.00" r="0.80" />
|
||||
<circle cx="7.00" cy="11.00" r="0.80" />
|
||||
<circle cx="9.00" cy="11.00" r="0.80" />
|
||||
<circle cx="11.00" cy="11.00" r="0.80" />
|
||||
<circle cx="13.00" cy="11.00" r="0.80" />
|
||||
<circle cx="15.00" cy="11.00" r="0.80" />
|
||||
<circle cx="17.00" cy="11.00" r="0.80" />
|
||||
<circle cx="27.00" cy="11.00" r="0.80" />
|
||||
<circle cx="21.00" cy="11.00" r="0.80" />
|
||||
<circle cx="23.00" cy="11.00" r="0.80" />
|
||||
<circle cx="25.00" cy="11.00" r="0.80" />
|
||||
<circle cx="29.00" cy="11.00" r="0.80" />
|
||||
<circle cx="31.00" cy="11.00" r="0.80" />
|
||||
<circle cx="33.00" cy="11.00" r="0.80" />
|
||||
<circle cx="37.00" cy="11.00" r="0.80" />
|
||||
<circle cx="35.00" cy="11.00" r="0.80" />
|
||||
<circle cx="39.00" cy="11.00" r="0.80" />
|
||||
<circle cx="41.00" cy="11.00" r="0.80" />
|
||||
<circle cx="3.00" cy="13.00" r="0.80" />
|
||||
<circle cx="7.00" cy="13.00" r="0.80" />
|
||||
<circle cx="11.00" cy="13.00" r="0.80" />
|
||||
<circle cx="9.00" cy="13.00" r="0.80" />
|
||||
<circle cx="13.00" cy="13.00" r="0.80" />
|
||||
<circle cx="15.00" cy="13.00" r="0.80" />
|
||||
<circle cx="17.00" cy="13.00" r="0.80" />
|
||||
<circle cx="19.00" cy="13.00" r="0.80" />
|
||||
<circle cx="21.00" cy="13.00" r="0.80" />
|
||||
<circle cx="23.00" cy="13.00" r="0.80" />
|
||||
<circle cx="29.00" cy="13.00" r="0.80" />
|
||||
<circle cx="33.00" cy="13.00" r="0.80" />
|
||||
<circle cx="35.00" cy="13.00" r="0.80" />
|
||||
<circle cx="39.00" cy="13.00" r="0.80" />
|
||||
<circle cx="3.00" cy="15.00" r="0.80" />
|
||||
<circle cx="13.00" cy="15.00" r="0.80" />
|
||||
<circle cx="7.00" cy="15.00" r="0.80" />
|
||||
<circle cx="9.00" cy="15.00" r="0.80" />
|
||||
<circle cx="11.00" cy="15.00" r="0.80" />
|
||||
<circle cx="15.00" cy="15.00" r="0.80" />
|
||||
<circle cx="19.00" cy="15.00" r="0.80" />
|
||||
<circle cx="21.00" cy="15.00" r="0.80" />
|
||||
<circle cx="25.00" cy="15.00" r="0.80" />
|
||||
<circle cx="27.00" cy="15.00" r="0.80" />
|
||||
<circle cx="29.00" cy="15.00" r="0.80" />
|
||||
<circle cx="31.00" cy="15.00" r="0.80" />
|
||||
<circle cx="35.00" cy="15.00" r="0.80" />
|
||||
<circle cx="39.00" cy="15.00" r="0.80" />
|
||||
<circle cx="41.00" cy="15.00" r="0.80" />
|
||||
<circle cx="3.00" cy="17.00" r="0.80" />
|
||||
<circle cx="5.00" cy="17.00" r="0.80" />
|
||||
<circle cx="15.00" cy="17.00" r="0.80" />
|
||||
<circle cx="11.00" cy="17.00" r="0.80" />
|
||||
<circle cx="13.00" cy="17.00" r="0.80" />
|
||||
<circle cx="17.00" cy="17.00" r="0.80" />
|
||||
<circle cx="19.00" cy="17.00" r="0.80" />
|
||||
<circle cx="21.00" cy="17.00" r="0.80" />
|
||||
<circle cx="23.00" cy="17.00" r="0.80" />
|
||||
<circle cx="25.00" cy="17.00" r="0.80" />
|
||||
<circle cx="27.00" cy="17.00" r="0.80" />
|
||||
<circle cx="29.00" cy="17.00" r="0.80" />
|
||||
<circle cx="31.00" cy="17.00" r="0.80" />
|
||||
<circle cx="33.00" cy="17.00" r="0.80" />
|
||||
<circle cx="35.00" cy="17.00" r="0.80" />
|
||||
<circle cx="37.00" cy="17.00" r="0.80" />
|
||||
<circle cx="39.00" cy="17.00" r="0.80" />
|
||||
<circle cx="3.00" cy="19.00" r="0.80" />
|
||||
<circle cx="5.00" cy="19.00" r="0.80" />
|
||||
<circle cx="7.00" cy="19.00" r="0.80" />
|
||||
<circle cx="9.00" cy="19.00" r="0.80" />
|
||||
<circle cx="13.00" cy="19.00" r="0.80" />
|
||||
<circle cx="17.00" cy="19.00" r="0.80" />
|
||||
<circle cx="19.00" cy="19.00" r="0.80" />
|
||||
<circle cx="21.00" cy="19.00" r="0.80" />
|
||||
<circle cx="23.00" cy="19.00" r="0.80" />
|
||||
<circle cx="25.00" cy="19.00" r="0.80" />
|
||||
<circle cx="27.00" cy="19.00" r="0.80" />
|
||||
<circle cx="29.00" cy="19.00" r="0.80" />
|
||||
<circle cx="31.00" cy="19.00" r="0.80" />
|
||||
<circle cx="33.00" cy="19.00" r="0.80" />
|
||||
<circle cx="37.00" cy="19.00" r="0.80" />
|
||||
<circle cx="39.00" cy="19.00" r="0.80" />
|
||||
<circle cx="41.00" cy="19.00" r="0.80" />
|
||||
<circle cx="3.00" cy="21.00" r="0.80" />
|
||||
<circle cx="5.00" cy="21.00" r="0.80" />
|
||||
<circle cx="7.00" cy="21.00" r="0.80" />
|
||||
<circle cx="9.00" cy="21.00" r="0.80" />
|
||||
<circle cx="17.00" cy="21.00" r="0.80" />
|
||||
<circle cx="19.00" cy="21.00" r="0.80" />
|
||||
<circle cx="21.00" cy="21.00" r="0.80" />
|
||||
<circle cx="27.00" cy="21.00" r="0.80" />
|
||||
<circle cx="23.00" cy="21.00" r="0.80" />
|
||||
<circle cx="25.00" cy="21.00" r="0.80" />
|
||||
<circle cx="35.00" cy="21.00" r="0.80" />
|
||||
<circle cx="37.00" cy="21.00" r="0.80" />
|
||||
<circle cx="3.00" cy="23.00" r="0.80" />
|
||||
<circle cx="5.00" cy="23.00" r="0.80" />
|
||||
<circle cx="9.00" cy="23.00" r="0.80" />
|
||||
<circle cx="11.00" cy="23.00" r="0.80" />
|
||||
<circle cx="17.00" cy="23.00" r="0.80" />
|
||||
<circle cx="19.00" cy="23.00" r="0.80" />
|
||||
<circle cx="35.00" cy="23.00" r="0.80" />
|
||||
<circle cx="21.00" cy="23.00" r="0.80" />
|
||||
<circle cx="23.00" cy="23.00" r="0.80" />
|
||||
<circle cx="29.00" cy="23.00" r="0.80" />
|
||||
<circle cx="37.00" cy="23.00" r="0.80" />
|
||||
<circle cx="41.00" cy="23.00" r="0.80" />
|
||||
<circle cx="3.00" cy="25.00" r="0.80" />
|
||||
<circle cx="5.00" cy="25.00" r="0.80" />
|
||||
<circle cx="7.00" cy="25.00" r="0.80" />
|
||||
<circle cx="9.00" cy="25.00" r="0.80" />
|
||||
<circle cx="11.00" cy="25.00" r="0.80" />
|
||||
<circle cx="13.00" cy="25.00" r="0.80" />
|
||||
<circle cx="17.00" cy="25.00" r="0.80" />
|
||||
<circle cx="21.00" cy="25.00" r="0.80" />
|
||||
<circle cx="23.00" cy="25.00" r="0.80" />
|
||||
<circle cx="25.00" cy="25.00" r="0.80" />
|
||||
<circle cx="29.00" cy="25.00" r="0.80" />
|
||||
<circle cx="27.00" cy="25.00" r="0.80" />
|
||||
<circle cx="31.00" cy="25.00" r="0.80" />
|
||||
<circle cx="35.00" cy="25.00" r="0.80" />
|
||||
<circle cx="39.00" cy="25.00" r="0.80" />
|
||||
<circle cx="3.00" cy="27.00" r="0.80" />
|
||||
<circle cx="7.00" cy="27.00" r="0.80" />
|
||||
<circle cx="9.00" cy="27.00" r="0.80" />
|
||||
<circle cx="11.00" cy="27.00" r="0.80" />
|
||||
<circle cx="13.00" cy="27.00" r="0.80" />
|
||||
<circle cx="15.00" cy="27.00" r="0.80" />
|
||||
<circle cx="19.00" cy="27.00" r="0.80" />
|
||||
<circle cx="17.00" cy="27.00" r="0.80" />
|
||||
<circle cx="21.00" cy="27.00" r="0.80" />
|
||||
<circle cx="33.00" cy="27.00" r="0.80" />
|
||||
<circle cx="39.00" cy="27.00" r="0.80" />
|
||||
<circle cx="29.00" cy="27.00" r="0.80" />
|
||||
<circle cx="37.00" cy="27.00" r="0.80" />
|
||||
<circle cx="41.00" cy="27.00" r="0.80" />
|
||||
<circle cx="3.00" cy="29.00" r="0.80" />
|
||||
<circle cx="5.00" cy="29.00" r="0.80" />
|
||||
<circle cx="7.00" cy="29.00" r="0.80" />
|
||||
<circle cx="11.00" cy="29.00" r="0.80" />
|
||||
<circle cx="13.00" cy="29.00" r="0.80" />
|
||||
<circle cx="15.00" cy="29.00" r="0.80" />
|
||||
<circle cx="17.00" cy="29.00" r="0.80" />
|
||||
<circle cx="19.00" cy="29.00" r="0.80" />
|
||||
<circle cx="27.00" cy="29.00" r="0.80" />
|
||||
<circle cx="29.00" cy="29.00" r="0.80" />
|
||||
<circle cx="33.00" cy="29.00" r="0.80" />
|
||||
<circle cx="31.00" cy="29.00" r="0.80" />
|
||||
<circle cx="3.00" cy="31.00" r="0.80" />
|
||||
<circle cx="5.00" cy="31.00" r="0.80" />
|
||||
<circle cx="13.00" cy="31.00" r="0.80" />
|
||||
<circle cx="15.00" cy="31.00" r="0.80" />
|
||||
<circle cx="17.00" cy="31.00" r="0.80" />
|
||||
<circle cx="19.00" cy="31.00" r="0.80" />
|
||||
<circle cx="25.00" cy="31.00" r="0.80" />
|
||||
<circle cx="27.00" cy="31.00" r="0.80" />
|
||||
<circle cx="37.00" cy="31.00" r="0.80" />
|
||||
<circle cx="29.00" cy="31.00" r="0.80" />
|
||||
<circle cx="31.00" cy="31.00" r="0.80" />
|
||||
<circle cx="33.00" cy="31.00" r="0.80" />
|
||||
<circle cx="35.00" cy="31.00" r="0.80" />
|
||||
<circle cx="39.00" cy="31.00" r="0.80" />
|
||||
<circle cx="41.00" cy="31.00" r="0.80" />
|
||||
<circle cx="3.00" cy="33.00" r="0.80" />
|
||||
|
@ -150,50 +171,61 @@
|
|||
<circle cx="13.00" cy="33.00" r="0.80" />
|
||||
<circle cx="17.00" cy="33.00" r="0.80" />
|
||||
<circle cx="19.00" cy="33.00" r="0.80" />
|
||||
<circle cx="27.00" cy="33.00" r="0.80" />
|
||||
<circle cx="23.00" cy="33.00" r="0.80" />
|
||||
<circle cx="25.00" cy="33.00" r="0.80" />
|
||||
<circle cx="29.00" cy="33.00" r="0.80" />
|
||||
<circle cx="31.00" cy="33.00" r="0.80" />
|
||||
<circle cx="37.00" cy="33.00" r="0.80" />
|
||||
<circle cx="39.00" cy="33.00" r="0.80" />
|
||||
<circle cx="3.00" cy="35.00" r="0.80" />
|
||||
<circle cx="5.00" cy="35.00" r="0.80" />
|
||||
<circle cx="13.00" cy="35.00" r="0.80" />
|
||||
<circle cx="15.00" cy="35.00" r="0.80" />
|
||||
<circle cx="17.00" cy="35.00" r="0.80" />
|
||||
<circle cx="19.00" cy="35.00" r="0.80" />
|
||||
<circle cx="21.00" cy="35.00" r="0.80" />
|
||||
<circle cx="23.00" cy="35.00" r="0.80" />
|
||||
<circle cx="25.00" cy="35.00" r="0.80" />
|
||||
<circle cx="27.00" cy="35.00" r="0.80" />
|
||||
<circle cx="29.00" cy="35.00" r="0.80" />
|
||||
<circle cx="37.00" cy="35.00" r="0.80" />
|
||||
<circle cx="31.00" cy="35.00" r="0.80" />
|
||||
<circle cx="33.00" cy="35.00" r="0.80" />
|
||||
<circle cx="39.00" cy="35.00" r="0.80" />
|
||||
<circle cx="41.00" cy="35.00" r="0.80" />
|
||||
<circle cx="3.00" cy="37.00" r="0.80" />
|
||||
<circle cx="5.00" cy="37.00" r="0.80" />
|
||||
<circle cx="13.00" cy="37.00" r="0.80" />
|
||||
<circle cx="17.00" cy="37.00" r="0.80" />
|
||||
<circle cx="9.00" cy="37.00" r="0.80" />
|
||||
<circle cx="11.00" cy="37.00" r="0.80" />
|
||||
<circle cx="21.00" cy="37.00" r="0.80" />
|
||||
<circle cx="23.00" cy="37.00" r="0.80" />
|
||||
<circle cx="25.00" cy="37.00" r="0.80" />
|
||||
<circle cx="27.00" cy="37.00" r="0.80" />
|
||||
<circle cx="29.00" cy="37.00" r="0.80" />
|
||||
<circle cx="31.00" cy="37.00" r="0.80" />
|
||||
<circle cx="33.00" cy="37.00" r="0.80" />
|
||||
<circle cx="35.00" cy="37.00" r="0.80" />
|
||||
<circle cx="37.00" cy="37.00" r="0.80" />
|
||||
<circle cx="3.00" cy="39.00" r="0.80" />
|
||||
<circle cx="5.00" cy="39.00" r="0.80" />
|
||||
<circle cx="7.00" cy="39.00" r="0.80" />
|
||||
<circle cx="9.00" cy="39.00" r="0.80" />
|
||||
<circle cx="11.00" cy="39.00" r="0.80" />
|
||||
<circle cx="15.00" cy="39.00" r="0.80" />
|
||||
<circle cx="21.00" cy="39.00" r="0.80" />
|
||||
<circle cx="23.00" cy="39.00" r="0.80" />
|
||||
<circle cx="25.00" cy="39.00" r="0.80" />
|
||||
<circle cx="27.00" cy="39.00" r="0.80" />
|
||||
<circle cx="29.00" cy="39.00" r="0.80" />
|
||||
<circle cx="31.00" cy="39.00" r="0.80" />
|
||||
<circle cx="33.00" cy="39.00" r="0.80" />
|
||||
<circle cx="35.00" cy="39.00" r="0.80" />
|
||||
<circle cx="37.00" cy="39.00" r="0.80" />
|
||||
<circle cx="41.00" cy="39.00" r="0.80" />
|
||||
<circle cx="3.00" cy="41.00" r="0.80" />
|
||||
<circle cx="5.00" cy="41.00" r="0.80" />
|
||||
<circle cx="9.00" cy="41.00" r="0.80" />
|
||||
<circle cx="13.00" cy="41.00" r="0.80" />
|
||||
<circle cx="15.00" cy="41.00" r="0.80" />
|
||||
<circle cx="17.00" cy="41.00" r="0.80" />
|
||||
<circle cx="25.00" cy="41.00" r="0.80" />
|
||||
<circle cx="19.00" cy="41.00" r="0.80" />
|
||||
<circle cx="27.00" cy="41.00" r="0.80" />
|
||||
<circle cx="29.00" cy="41.00" r="0.80" />
|
||||
<circle cx="33.00" cy="41.00" r="0.80" />
|
||||
<circle cx="31.00" cy="41.00" r="0.80" />
|
||||
<circle cx="35.00" cy="41.00" r="0.80" />
|
||||
<circle cx="39.00" cy="41.00" r="0.80" />
|
||||
<circle cx="3.00" cy="43.00" r="0.80" />
|
||||
<circle cx="5.00" cy="43.00" r="0.80" />
|
||||
|
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 12 KiB |
|
@ -22,126 +22,147 @@
|
|||
<circle cx="37.00" cy="5.00" r="0.80" />
|
||||
<circle cx="1.00" cy="7.00" r="0.80" />
|
||||
<circle cx="5.00" cy="7.00" r="0.80" />
|
||||
<circle cx="11.00" cy="7.00" r="0.80" />
|
||||
<circle cx="7.00" cy="7.00" r="0.80" />
|
||||
<circle cx="9.00" cy="7.00" r="0.80" />
|
||||
<circle cx="13.00" cy="7.00" r="0.80" />
|
||||
<circle cx="17.00" cy="7.00" r="0.80" />
|
||||
<circle cx="19.00" cy="7.00" r="0.80" />
|
||||
<circle cx="23.00" cy="7.00" r="0.80" />
|
||||
<circle cx="27.00" cy="7.00" r="0.80" />
|
||||
<circle cx="33.00" cy="7.00" r="0.80" />
|
||||
<circle cx="35.00" cy="7.00" r="0.80" />
|
||||
<circle cx="25.00" cy="7.00" r="0.80" />
|
||||
<circle cx="29.00" cy="7.00" r="0.80" />
|
||||
<circle cx="37.00" cy="7.00" r="0.80" />
|
||||
<circle cx="39.00" cy="7.00" r="0.80" />
|
||||
<circle cx="1.00" cy="9.00" r="0.80" />
|
||||
<circle cx="5.00" cy="9.00" r="0.80" />
|
||||
<circle cx="7.00" cy="9.00" r="0.80" />
|
||||
<circle cx="9.00" cy="9.00" r="0.80" />
|
||||
<circle cx="13.00" cy="9.00" r="0.80" />
|
||||
<circle cx="17.00" cy="9.00" r="0.80" />
|
||||
<circle cx="21.00" cy="9.00" r="0.80" />
|
||||
<circle cx="15.00" cy="9.00" r="0.80" />
|
||||
<circle cx="19.00" cy="9.00" r="0.80" />
|
||||
<circle cx="25.00" cy="9.00" r="0.80" />
|
||||
<circle cx="27.00" cy="9.00" r="0.80" />
|
||||
<circle cx="31.00" cy="9.00" r="0.80" />
|
||||
<circle cx="33.00" cy="9.00" r="0.80" />
|
||||
<circle cx="35.00" cy="9.00" r="0.80" />
|
||||
<circle cx="1.00" cy="11.00" r="0.80" />
|
||||
<circle cx="5.00" cy="11.00" r="0.80" />
|
||||
<circle cx="7.00" cy="11.00" r="0.80" />
|
||||
<circle cx="9.00" cy="11.00" r="0.80" />
|
||||
<circle cx="11.00" cy="11.00" r="0.80" />
|
||||
<circle cx="13.00" cy="11.00" r="0.80" />
|
||||
<circle cx="15.00" cy="11.00" r="0.80" />
|
||||
<circle cx="25.00" cy="11.00" r="0.80" />
|
||||
<circle cx="19.00" cy="11.00" r="0.80" />
|
||||
<circle cx="21.00" cy="11.00" r="0.80" />
|
||||
<circle cx="23.00" cy="11.00" r="0.80" />
|
||||
<circle cx="27.00" cy="11.00" r="0.80" />
|
||||
<circle cx="29.00" cy="11.00" r="0.80" />
|
||||
<circle cx="31.00" cy="11.00" r="0.80" />
|
||||
<circle cx="35.00" cy="11.00" r="0.80" />
|
||||
<circle cx="33.00" cy="11.00" r="0.80" />
|
||||
<circle cx="37.00" cy="11.00" r="0.80" />
|
||||
<circle cx="39.00" cy="11.00" r="0.80" />
|
||||
<circle cx="1.00" cy="13.00" r="0.80" />
|
||||
<circle cx="5.00" cy="13.00" r="0.80" />
|
||||
<circle cx="9.00" cy="13.00" r="0.80" />
|
||||
<circle cx="7.00" cy="13.00" r="0.80" />
|
||||
<circle cx="11.00" cy="13.00" r="0.80" />
|
||||
<circle cx="13.00" cy="13.00" r="0.80" />
|
||||
<circle cx="15.00" cy="13.00" r="0.80" />
|
||||
<circle cx="17.00" cy="13.00" r="0.80" />
|
||||
<circle cx="19.00" cy="13.00" r="0.80" />
|
||||
<circle cx="21.00" cy="13.00" r="0.80" />
|
||||
<circle cx="27.00" cy="13.00" r="0.80" />
|
||||
<circle cx="31.00" cy="13.00" r="0.80" />
|
||||
<circle cx="33.00" cy="13.00" r="0.80" />
|
||||
<circle cx="37.00" cy="13.00" r="0.80" />
|
||||
<circle cx="1.00" cy="15.00" r="0.80" />
|
||||
<circle cx="11.00" cy="15.00" r="0.80" />
|
||||
<circle cx="5.00" cy="15.00" r="0.80" />
|
||||
<circle cx="7.00" cy="15.00" r="0.80" />
|
||||
<circle cx="9.00" cy="15.00" r="0.80" />
|
||||
<circle cx="13.00" cy="15.00" r="0.80" />
|
||||
<circle cx="17.00" cy="15.00" r="0.80" />
|
||||
<circle cx="19.00" cy="15.00" r="0.80" />
|
||||
<circle cx="23.00" cy="15.00" r="0.80" />
|
||||
<circle cx="25.00" cy="15.00" r="0.80" />
|
||||
<circle cx="27.00" cy="15.00" r="0.80" />
|
||||
<circle cx="29.00" cy="15.00" r="0.80" />
|
||||
<circle cx="33.00" cy="15.00" r="0.80" />
|
||||
<circle cx="37.00" cy="15.00" r="0.80" />
|
||||
<circle cx="39.00" cy="15.00" r="0.80" />
|
||||
<circle cx="1.00" cy="17.00" r="0.80" />
|
||||
<circle cx="3.00" cy="17.00" r="0.80" />
|
||||
<circle cx="13.00" cy="17.00" r="0.80" />
|
||||
<circle cx="9.00" cy="17.00" r="0.80" />
|
||||
<circle cx="11.00" cy="17.00" r="0.80" />
|
||||
<circle cx="15.00" cy="17.00" r="0.80" />
|
||||
<circle cx="17.00" cy="17.00" r="0.80" />
|
||||
<circle cx="19.00" cy="17.00" r="0.80" />
|
||||
<circle cx="21.00" cy="17.00" r="0.80" />
|
||||
<circle cx="23.00" cy="17.00" r="0.80" />
|
||||
<circle cx="25.00" cy="17.00" r="0.80" />
|
||||
<circle cx="27.00" cy="17.00" r="0.80" />
|
||||
<circle cx="29.00" cy="17.00" r="0.80" />
|
||||
<circle cx="31.00" cy="17.00" r="0.80" />
|
||||
<circle cx="33.00" cy="17.00" r="0.80" />
|
||||
<circle cx="35.00" cy="17.00" r="0.80" />
|
||||
<circle cx="37.00" cy="17.00" r="0.80" />
|
||||
<circle cx="1.00" cy="19.00" r="0.80" />
|
||||
<circle cx="3.00" cy="19.00" r="0.80" />
|
||||
<circle cx="5.00" cy="19.00" r="0.80" />
|
||||
<circle cx="7.00" cy="19.00" r="0.80" />
|
||||
<circle cx="11.00" cy="19.00" r="0.80" />
|
||||
<circle cx="15.00" cy="19.00" r="0.80" />
|
||||
<circle cx="17.00" cy="19.00" r="0.80" />
|
||||
<circle cx="19.00" cy="19.00" r="0.80" />
|
||||
<circle cx="21.00" cy="19.00" r="0.80" />
|
||||
<circle cx="23.00" cy="19.00" r="0.80" />
|
||||
<circle cx="25.00" cy="19.00" r="0.80" />
|
||||
<circle cx="27.00" cy="19.00" r="0.80" />
|
||||
<circle cx="29.00" cy="19.00" r="0.80" />
|
||||
<circle cx="31.00" cy="19.00" r="0.80" />
|
||||
<circle cx="35.00" cy="19.00" r="0.80" />
|
||||
<circle cx="37.00" cy="19.00" r="0.80" />
|
||||
<circle cx="39.00" cy="19.00" r="0.80" />
|
||||
<circle cx="1.00" cy="21.00" r="0.80" />
|
||||
<circle cx="3.00" cy="21.00" r="0.80" />
|
||||
<circle cx="5.00" cy="21.00" r="0.80" />
|
||||
<circle cx="7.00" cy="21.00" r="0.80" />
|
||||
<circle cx="15.00" cy="21.00" r="0.80" />
|
||||
<circle cx="17.00" cy="21.00" r="0.80" />
|
||||
<circle cx="19.00" cy="21.00" r="0.80" />
|
||||
<circle cx="25.00" cy="21.00" r="0.80" />
|
||||
<circle cx="21.00" cy="21.00" r="0.80" />
|
||||
<circle cx="23.00" cy="21.00" r="0.80" />
|
||||
<circle cx="33.00" cy="21.00" r="0.80" />
|
||||
<circle cx="35.00" cy="21.00" r="0.80" />
|
||||
<circle cx="1.00" cy="23.00" r="0.80" />
|
||||
<circle cx="3.00" cy="23.00" r="0.80" />
|
||||
<circle cx="7.00" cy="23.00" r="0.80" />
|
||||
<circle cx="9.00" cy="23.00" r="0.80" />
|
||||
<circle cx="15.00" cy="23.00" r="0.80" />
|
||||
<circle cx="17.00" cy="23.00" r="0.80" />
|
||||
<circle cx="33.00" cy="23.00" r="0.80" />
|
||||
<circle cx="19.00" cy="23.00" r="0.80" />
|
||||
<circle cx="21.00" cy="23.00" r="0.80" />
|
||||
<circle cx="27.00" cy="23.00" r="0.80" />
|
||||
<circle cx="35.00" cy="23.00" r="0.80" />
|
||||
<circle cx="39.00" cy="23.00" r="0.80" />
|
||||
<circle cx="1.00" cy="25.00" r="0.80" />
|
||||
<circle cx="3.00" cy="25.00" r="0.80" />
|
||||
<circle cx="5.00" cy="25.00" r="0.80" />
|
||||
<circle cx="7.00" cy="25.00" r="0.80" />
|
||||
<circle cx="9.00" cy="25.00" r="0.80" />
|
||||
<circle cx="11.00" cy="25.00" r="0.80" />
|
||||
<circle cx="15.00" cy="25.00" r="0.80" />
|
||||
<circle cx="19.00" cy="25.00" r="0.80" />
|
||||
<circle cx="21.00" cy="25.00" r="0.80" />
|
||||
<circle cx="23.00" cy="25.00" r="0.80" />
|
||||
<circle cx="27.00" cy="25.00" r="0.80" />
|
||||
<circle cx="25.00" cy="25.00" r="0.80" />
|
||||
<circle cx="29.00" cy="25.00" r="0.80" />
|
||||
<circle cx="33.00" cy="25.00" r="0.80" />
|
||||
<circle cx="37.00" cy="25.00" r="0.80" />
|
||||
<circle cx="1.00" cy="27.00" r="0.80" />
|
||||
<circle cx="5.00" cy="27.00" r="0.80" />
|
||||
<circle cx="7.00" cy="27.00" r="0.80" />
|
||||
<circle cx="9.00" cy="27.00" r="0.80" />
|
||||
<circle cx="11.00" cy="27.00" r="0.80" />
|
||||
<circle cx="13.00" cy="27.00" r="0.80" />
|
||||
<circle cx="17.00" cy="27.00" r="0.80" />
|
||||
<circle cx="15.00" cy="27.00" r="0.80" />
|
||||
<circle cx="19.00" cy="27.00" r="0.80" />
|
||||
<circle cx="31.00" cy="27.00" r="0.80" />
|
||||
<circle cx="37.00" cy="27.00" r="0.80" />
|
||||
<circle cx="27.00" cy="27.00" r="0.80" />
|
||||
<circle cx="35.00" cy="27.00" r="0.80" />
|
||||
<circle cx="39.00" cy="27.00" r="0.80" />
|
||||
<circle cx="1.00" cy="29.00" r="0.80" />
|
||||
<circle cx="3.00" cy="29.00" r="0.80" />
|
||||
<circle cx="5.00" cy="29.00" r="0.80" />
|
||||
<circle cx="9.00" cy="29.00" r="0.80" />
|
||||
<circle cx="11.00" cy="29.00" r="0.80" />
|
||||
<circle cx="13.00" cy="29.00" r="0.80" />
|
||||
<circle cx="15.00" cy="29.00" r="0.80" />
|
||||
<circle cx="17.00" cy="29.00" r="0.80" />
|
||||
<circle cx="25.00" cy="29.00" r="0.80" />
|
||||
<circle cx="27.00" cy="29.00" r="0.80" />
|
||||
<circle cx="31.00" cy="29.00" r="0.80" />
|
||||
<circle cx="29.00" cy="29.00" r="0.80" />
|
||||
<circle cx="1.00" cy="31.00" r="0.80" />
|
||||
<circle cx="3.00" cy="31.00" r="0.80" />
|
||||
<circle cx="11.00" cy="31.00" r="0.80" />
|
||||
<circle cx="13.00" cy="31.00" r="0.80" />
|
||||
<circle cx="15.00" cy="31.00" r="0.80" />
|
||||
<circle cx="17.00" cy="31.00" r="0.80" />
|
||||
<circle cx="23.00" cy="31.00" r="0.80" />
|
||||
<circle cx="25.00" cy="31.00" r="0.80" />
|
||||
<circle cx="35.00" cy="31.00" r="0.80" />
|
||||
<circle cx="27.00" cy="31.00" r="0.80" />
|
||||
<circle cx="29.00" cy="31.00" r="0.80" />
|
||||
<circle cx="31.00" cy="31.00" r="0.80" />
|
||||
<circle cx="33.00" cy="31.00" r="0.80" />
|
||||
<circle cx="37.00" cy="31.00" r="0.80" />
|
||||
<circle cx="39.00" cy="31.00" r="0.80" />
|
||||
<circle cx="1.00" cy="33.00" r="0.80" />
|
||||
|
@ -150,50 +171,61 @@
|
|||
<circle cx="11.00" cy="33.00" r="0.80" />
|
||||
<circle cx="15.00" cy="33.00" r="0.80" />
|
||||
<circle cx="17.00" cy="33.00" r="0.80" />
|
||||
<circle cx="25.00" cy="33.00" r="0.80" />
|
||||
<circle cx="21.00" cy="33.00" r="0.80" />
|
||||
<circle cx="23.00" cy="33.00" r="0.80" />
|
||||
<circle cx="27.00" cy="33.00" r="0.80" />
|
||||
<circle cx="29.00" cy="33.00" r="0.80" />
|
||||
<circle cx="35.00" cy="33.00" r="0.80" />
|
||||
<circle cx="37.00" cy="33.00" r="0.80" />
|
||||
<circle cx="1.00" cy="35.00" r="0.80" />
|
||||
<circle cx="3.00" cy="35.00" r="0.80" />
|
||||
<circle cx="11.00" cy="35.00" r="0.80" />
|
||||
<circle cx="13.00" cy="35.00" r="0.80" />
|
||||
<circle cx="15.00" cy="35.00" r="0.80" />
|
||||
<circle cx="17.00" cy="35.00" r="0.80" />
|
||||
<circle cx="19.00" cy="35.00" r="0.80" />
|
||||
<circle cx="21.00" cy="35.00" r="0.80" />
|
||||
<circle cx="23.00" cy="35.00" r="0.80" />
|
||||
<circle cx="25.00" cy="35.00" r="0.80" />
|
||||
<circle cx="27.00" cy="35.00" r="0.80" />
|
||||
<circle cx="35.00" cy="35.00" r="0.80" />
|
||||
<circle cx="29.00" cy="35.00" r="0.80" />
|
||||
<circle cx="31.00" cy="35.00" r="0.80" />
|
||||
<circle cx="37.00" cy="35.00" r="0.80" />
|
||||
<circle cx="39.00" cy="35.00" r="0.80" />
|
||||
<circle cx="1.00" cy="37.00" r="0.80" />
|
||||
<circle cx="3.00" cy="37.00" r="0.80" />
|
||||
<circle cx="11.00" cy="37.00" r="0.80" />
|
||||
<circle cx="15.00" cy="37.00" r="0.80" />
|
||||
<circle cx="7.00" cy="37.00" r="0.80" />
|
||||
<circle cx="9.00" cy="37.00" r="0.80" />
|
||||
<circle cx="19.00" cy="37.00" r="0.80" />
|
||||
<circle cx="21.00" cy="37.00" r="0.80" />
|
||||
<circle cx="23.00" cy="37.00" r="0.80" />
|
||||
<circle cx="25.00" cy="37.00" r="0.80" />
|
||||
<circle cx="27.00" cy="37.00" r="0.80" />
|
||||
<circle cx="29.00" cy="37.00" r="0.80" />
|
||||
<circle cx="31.00" cy="37.00" r="0.80" />
|
||||
<circle cx="33.00" cy="37.00" r="0.80" />
|
||||
<circle cx="35.00" cy="37.00" r="0.80" />
|
||||
<circle cx="1.00" cy="39.00" r="0.80" />
|
||||
<circle cx="3.00" cy="39.00" r="0.80" />
|
||||
<circle cx="5.00" cy="39.00" r="0.80" />
|
||||
<circle cx="7.00" cy="39.00" r="0.80" />
|
||||
<circle cx="9.00" cy="39.00" r="0.80" />
|
||||
<circle cx="13.00" cy="39.00" r="0.80" />
|
||||
<circle cx="19.00" cy="39.00" r="0.80" />
|
||||
<circle cx="21.00" cy="39.00" r="0.80" />
|
||||
<circle cx="23.00" cy="39.00" r="0.80" />
|
||||
<circle cx="25.00" cy="39.00" r="0.80" />
|
||||
<circle cx="27.00" cy="39.00" r="0.80" />
|
||||
<circle cx="29.00" cy="39.00" r="0.80" />
|
||||
<circle cx="31.00" cy="39.00" r="0.80" />
|
||||
<circle cx="33.00" cy="39.00" r="0.80" />
|
||||
<circle cx="35.00" cy="39.00" r="0.80" />
|
||||
<circle cx="39.00" cy="39.00" r="0.80" />
|
||||
<circle cx="1.00" cy="41.00" r="0.80" />
|
||||
<circle cx="3.00" cy="41.00" r="0.80" />
|
||||
<circle cx="7.00" cy="41.00" r="0.80" />
|
||||
<circle cx="11.00" cy="41.00" r="0.80" />
|
||||
<circle cx="13.00" cy="41.00" r="0.80" />
|
||||
<circle cx="15.00" cy="41.00" r="0.80" />
|
||||
<circle cx="23.00" cy="41.00" r="0.80" />
|
||||
<circle cx="17.00" cy="41.00" r="0.80" />
|
||||
<circle cx="25.00" cy="41.00" r="0.80" />
|
||||
<circle cx="27.00" cy="41.00" r="0.80" />
|
||||
<circle cx="31.00" cy="41.00" r="0.80" />
|
||||
<circle cx="29.00" cy="41.00" r="0.80" />
|
||||
<circle cx="33.00" cy="41.00" r="0.80" />
|
||||
<circle cx="37.00" cy="41.00" r="0.80" />
|
||||
<circle cx="1.00" cy="43.00" r="0.80" />
|
||||
<circle cx="3.00" cy="43.00" r="0.80" />
|
||||
|
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 12 KiB |
File diff suppressed because it is too large
Load diff
|
@ -1,969 +0,0 @@
|
|||
/*
|
||||
libzint - the open source barcode library
|
||||
Copyright (C) 2021 Robin Stuart <rstuart114@gmail.com>
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
3. Neither the name of the project nor the names of its contributors
|
||||
may be used to endorse or promote products derived from this software
|
||||
without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGE.
|
||||
*/
|
||||
/* vim: set ts=4 sw=4 et : */
|
||||
|
||||
/* Used by test_matrix.c test_minimize() (TODO: remove in the not-too-distant future) */
|
||||
|
||||
#ifndef Z_DMATRIX_VARIANT_H
|
||||
#define Z_DMATRIX_VARIANT_H
|
||||
|
||||
#include "../dmatrix.h"
|
||||
|
||||
static int dm_isc40(const unsigned char input) {
|
||||
if (input <= '9') {
|
||||
return input >= '0' || input == ' ';
|
||||
}
|
||||
return input >= 'A' && input <= 'Z';
|
||||
}
|
||||
|
||||
/* Is basic (non-shifted) TEXT? */
|
||||
static int dm_istext(const unsigned char input) {
|
||||
if (input <= '9') {
|
||||
return input >= '0' || input == ' ';
|
||||
}
|
||||
return input >= 'a' && input <= 'z';
|
||||
}
|
||||
|
||||
/* Is basic (non-shifted) C40/TEXT? */
|
||||
static int dm_isc40text(const int current_mode, const unsigned char input) {
|
||||
return current_mode == DM_C40 ? dm_isc40(input) : dm_istext(input);
|
||||
}
|
||||
|
||||
/* Return true (1) if a character is valid in X12 set */
|
||||
static int dm_isX12(const unsigned char input) {
|
||||
return dm_isc40(input) || input == 13 || input == '*' || input == '>';
|
||||
}
|
||||
|
||||
/* Return true (1) if a character is valid in EDIFACT set */
|
||||
static int dm_isedifact(const unsigned char input, const int gs1) {
|
||||
return (input >= ' ' && input <= '^') && (!gs1 || input != '['); /* Can't encode GS1 FNC1/GS in EDIFACT */
|
||||
}
|
||||
|
||||
static int dm_p_r_6_2_1(const unsigned char source[], const int length, const int sp) {
|
||||
/* Annex P section (r)(6)(ii)(I)
|
||||
"If one of the three X12 terminator/separator characters first
|
||||
occurs in the yet to be processed data before a non-X12 character..."
|
||||
*/
|
||||
int i;
|
||||
|
||||
for (i = sp; i < length && dm_isX12(source[i]); i++) {
|
||||
if (source[i] == 13 || source[i] == '*' || source[i] == '>') {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Count number of TEXT characters around `sp` between `position` and `length`
|
||||
- helper to avoid exiting from Base 256 too early if have series of TEXT characters */
|
||||
static int dm_text_sp_cnt(const unsigned char source[], const int position, const int length, const int sp) {
|
||||
int i;
|
||||
int cnt = 0;
|
||||
|
||||
/* Count from `sp` forward */
|
||||
for (i = sp; i < length && dm_istext(source[i]); i++, cnt++);
|
||||
/* Count backwards from `sp` */
|
||||
for (i = sp - 1; i >= position && dm_istext(source[i]); i--, cnt++);
|
||||
|
||||
return cnt;
|
||||
}
|
||||
|
||||
#define DM_MULT 12
|
||||
|
||||
#define DM_MULT_1_DIV_2 6
|
||||
#define DM_MULT_2_DIV_3 8
|
||||
#define DM_MULT_3_DIV_4 9
|
||||
#define DM_MULT_1 12
|
||||
#define DM_MULT_5_DIV_4 15
|
||||
#define DM_MULT_4_DIV_3 16
|
||||
#define DM_MULT_2 24
|
||||
#define DM_MULT_9_DIV_4 27
|
||||
#define DM_MULT_8_DIV_3 32
|
||||
#define DM_MULT_3 26
|
||||
#define DM_MULT_13_DIV_4 39
|
||||
#define DM_MULT_10_DIV_3 40
|
||||
#define DM_MULT_4 48
|
||||
#define DM_MULT_17_DIV_4 51
|
||||
#define DM_MULT_13_DIV_3 52
|
||||
|
||||
#define DM_MULT_MINUS_1 11
|
||||
#define DM_MULT_CEIL(n) ((((n) + DM_MULT_MINUS_1) / DM_MULT) * DM_MULT)
|
||||
|
||||
static int dm_look_ahead_test_variant(const unsigned char source[], const int length, const int position,
|
||||
const int current_mode, const int mode_arg, const int gs1, const int debug_print, const int variant) {
|
||||
int 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;
|
||||
int cnt_1;
|
||||
int sp;
|
||||
|
||||
int ascii_init_test, loop_test, edf_eod_test, x12_eod_test;
|
||||
|
||||
/* step (j) */
|
||||
if (variant == 1) {
|
||||
ascii_init_test = (current_mode == DM_ASCII || current_mode == DM_BASE256);
|
||||
} else {
|
||||
ascii_init_test = (current_mode == DM_ASCII);
|
||||
}
|
||||
if (ascii_init_test) {
|
||||
ascii_count = 0;
|
||||
c40_count = DM_MULT_1;
|
||||
text_count = DM_MULT_1;
|
||||
x12_count = DM_MULT_1;
|
||||
edf_count = DM_MULT_1;
|
||||
if (variant == 1) {
|
||||
b256_count = DM_MULT_2;
|
||||
} else {
|
||||
b256_count = DM_MULT_5_DIV_4; // 1.25
|
||||
}
|
||||
} else {
|
||||
ascii_count = DM_MULT_1;
|
||||
c40_count = DM_MULT_2;
|
||||
text_count = DM_MULT_2;
|
||||
x12_count = DM_MULT_2;
|
||||
edf_count = DM_MULT_2;
|
||||
if (variant == 1) {
|
||||
b256_count = DM_MULT_3;
|
||||
} else {
|
||||
b256_count = DM_MULT_9_DIV_4; // 2.25
|
||||
}
|
||||
}
|
||||
|
||||
switch (current_mode) {
|
||||
case DM_C40: c40_count = 0;
|
||||
break;
|
||||
case DM_TEXT: text_count = 0;
|
||||
break;
|
||||
case DM_X12: x12_count = 0;
|
||||
break;
|
||||
case DM_EDIFACT: edf_count = 0;
|
||||
break;
|
||||
case DM_BASE256:
|
||||
if (variant == 1) {
|
||||
b256_count = mode_arg == 249 ? DM_MULT_1 : 0;
|
||||
} else {
|
||||
b256_count = 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
for (sp = position; sp < length; sp++) {
|
||||
unsigned char c = source[sp];
|
||||
int is_extended = c & 0x80;
|
||||
|
||||
/* ascii ... step (l) */
|
||||
if ((c >= '0') && (c <= '9')) {
|
||||
ascii_count += DM_MULT_1_DIV_2; // (l)(1)
|
||||
} else {
|
||||
if (is_extended) {
|
||||
ascii_count = DM_MULT_CEIL(ascii_count) + DM_MULT_2; // (l)(2)
|
||||
} else {
|
||||
ascii_count = DM_MULT_CEIL(ascii_count) + DM_MULT_1; // (l)(3)
|
||||
}
|
||||
}
|
||||
|
||||
/* c40 ... step (m) */
|
||||
if (dm_isc40(c)) {
|
||||
c40_count += DM_MULT_2_DIV_3; // (m)(1)
|
||||
} else {
|
||||
if (is_extended) {
|
||||
c40_count += DM_MULT_8_DIV_3; // (m)(2)
|
||||
} else {
|
||||
c40_count += DM_MULT_4_DIV_3; // (m)(3)
|
||||
}
|
||||
}
|
||||
|
||||
/* text ... step (n) */
|
||||
if (dm_istext(c)) {
|
||||
text_count += DM_MULT_2_DIV_3; // (n)(1)
|
||||
} else {
|
||||
if (is_extended) {
|
||||
text_count += DM_MULT_8_DIV_3; // (n)(2)
|
||||
} else {
|
||||
text_count += DM_MULT_4_DIV_3; // (n)(3)
|
||||
}
|
||||
}
|
||||
|
||||
/* x12 ... step (o) */
|
||||
if (dm_isX12(c)) {
|
||||
x12_count += DM_MULT_2_DIV_3; // (o)(1)
|
||||
} else {
|
||||
if (is_extended) {
|
||||
x12_count += DM_MULT_13_DIV_3; // (o)(2)
|
||||
} else {
|
||||
x12_count += DM_MULT_10_DIV_3; // (o)(3)
|
||||
}
|
||||
}
|
||||
|
||||
/* edifact ... step (p) */
|
||||
if (dm_isedifact(c, gs1)) {
|
||||
edf_count += DM_MULT_3_DIV_4; // (p)(1)
|
||||
} else {
|
||||
if (is_extended) {
|
||||
edf_count += DM_MULT_17_DIV_4; // (p)(2)
|
||||
} else {
|
||||
edf_count += DM_MULT_13_DIV_4; // (p)(3)
|
||||
}
|
||||
}
|
||||
|
||||
/* base 256 ... step (q) */
|
||||
if ((gs1 == 1) && (c == '[')) {
|
||||
/* FNC1 separator */
|
||||
b256_count += DM_MULT_4; // (q)(1)
|
||||
} else {
|
||||
b256_count += DM_MULT_1; // (q)(2)
|
||||
}
|
||||
|
||||
if (variant == 1) {
|
||||
loop_test = sp >= position + 3;
|
||||
} else {
|
||||
loop_test = sp >= position + 4;
|
||||
}
|
||||
if (loop_test) {
|
||||
int ascii_loop_test;
|
||||
|
||||
/* At least 5 data characters processed ... step (r) */
|
||||
/* NOTE: different than spec, where it's at least 4. Following previous behaviour here (and BWIPP) */
|
||||
|
||||
if (debug_print) {
|
||||
printf("\n(m:%d, p:%d, sp:%d, a:%d): ascii_count %d, b256_count %d, edf_count %d, text_count %d"
|
||||
", x12_count %d, c40_count %d ",
|
||||
current_mode, position, sp, mode_arg, ascii_count, b256_count, edf_count, text_count,
|
||||
x12_count, c40_count);
|
||||
}
|
||||
|
||||
cnt_1 = ascii_count + DM_MULT_1;
|
||||
if (variant == 1) {
|
||||
ascii_loop_test = (cnt_1 < b256_count && cnt_1 <= edf_count && cnt_1 <= text_count && cnt_1 <= x12_count && cnt_1 <= c40_count);
|
||||
} else {
|
||||
ascii_loop_test = (cnt_1 <= b256_count && cnt_1 <= edf_count && cnt_1 <= text_count && cnt_1 <= x12_count && cnt_1 <= c40_count);
|
||||
}
|
||||
if (ascii_loop_test) {
|
||||
if (debug_print) printf("ASC->");
|
||||
return DM_ASCII; /* step (r)(1) */
|
||||
}
|
||||
|
||||
cnt_1 = b256_count + DM_MULT_1;
|
||||
if (cnt_1 <= ascii_count || (cnt_1 < edf_count && cnt_1 < text_count && cnt_1 < x12_count
|
||||
&& cnt_1 < c40_count)) {
|
||||
if (debug_print) printf("BAS->");
|
||||
return DM_BASE256; /* step (r)(2) */
|
||||
}
|
||||
cnt_1 = edf_count + DM_MULT_1;
|
||||
if (cnt_1 < ascii_count && cnt_1 < b256_count && cnt_1 < text_count && cnt_1 < x12_count
|
||||
&& cnt_1 < c40_count) {
|
||||
if (debug_print) printf("EDI->");
|
||||
return DM_EDIFACT; /* step (r)(3) */
|
||||
}
|
||||
cnt_1 = text_count + DM_MULT_1;
|
||||
if (cnt_1 < ascii_count && cnt_1 < b256_count && cnt_1 < edf_count && cnt_1 < x12_count
|
||||
&& cnt_1 < c40_count) {
|
||||
if (variant == 1) {
|
||||
if (current_mode == DM_BASE256 && position + 6 < length) {
|
||||
int text_sp_cnt = dm_text_sp_cnt(source, position, length, sp);
|
||||
if (debug_print) printf("text_sp_cnt %d\n", text_sp_cnt);
|
||||
if (text_sp_cnt >= 12) {
|
||||
if (debug_print) printf("TEX->");
|
||||
return DM_TEXT; /* step (r)(4) */
|
||||
}
|
||||
} else {
|
||||
if (debug_print) printf("TEX->");
|
||||
return DM_TEXT; /* step (r)(4) */
|
||||
}
|
||||
} else {
|
||||
if (debug_print) printf("TEX->");
|
||||
return DM_TEXT; /* step (r)(4) */
|
||||
}
|
||||
}
|
||||
cnt_1 = x12_count + DM_MULT_1;
|
||||
if (cnt_1 < ascii_count && cnt_1 < b256_count && cnt_1 < edf_count && cnt_1 < text_count
|
||||
&& cnt_1 < c40_count) {
|
||||
if (debug_print) printf("X12->");
|
||||
return DM_X12; /* step (r)(5) */
|
||||
}
|
||||
cnt_1 = c40_count + DM_MULT_1;
|
||||
if (cnt_1 < ascii_count && cnt_1 < b256_count && cnt_1 < edf_count && cnt_1 < text_count) {
|
||||
if (c40_count < x12_count) {
|
||||
if (debug_print) printf("C40->");
|
||||
return DM_C40; /* step (r)(6)(i) */
|
||||
}
|
||||
if (c40_count == x12_count) {
|
||||
if (dm_p_r_6_2_1(source, length, sp) == 1) {
|
||||
if (debug_print) printf("X12->");
|
||||
return DM_X12; /* step (r)(6)(ii)(I) */
|
||||
}
|
||||
if (debug_print) printf("C40->");
|
||||
return DM_C40; /* step (r)(6)(ii)(II) */
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* At the end of data ... step (k) */
|
||||
/* step (k)(1) */
|
||||
ascii_rnded = DM_MULT_CEIL(ascii_count);
|
||||
b256_rnded = DM_MULT_CEIL(b256_count);
|
||||
edf_rnded = DM_MULT_CEIL(edf_count);
|
||||
text_rnded = DM_MULT_CEIL(text_count);
|
||||
x12_rnded = DM_MULT_CEIL(x12_count);
|
||||
c40_rnded = DM_MULT_CEIL(c40_count);
|
||||
if (debug_print) {
|
||||
printf("\nEOD(m:%d, p:%d, a:%d): ascii_rnded %d, b256_rnded %d, edf_rnded %d, text_rnded %d, x12_rnded %d (%d)"
|
||||
", c40_rnded %d (%d) ",
|
||||
current_mode, position, mode_arg, 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) {
|
||||
if (debug_print) printf("ASC->");
|
||||
return DM_ASCII; /* step (k)(2) */
|
||||
}
|
||||
if (b256_rnded < ascii_rnded && b256_rnded < edf_rnded && b256_rnded < text_rnded && b256_rnded < x12_rnded
|
||||
&& b256_rnded < c40_rnded) {
|
||||
if (debug_print) printf("BAS->");
|
||||
return DM_BASE256; /* step (k)(3) */
|
||||
}
|
||||
if (variant == 1) {
|
||||
edf_eod_test = (edf_rnded < ascii_rnded && edf_rnded < b256_rnded && edf_rnded < text_rnded && edf_rnded <= x12_rnded && edf_rnded < c40_rnded);
|
||||
} else {
|
||||
edf_eod_test = (edf_rnded < ascii_rnded && edf_rnded < b256_rnded && edf_rnded < text_rnded && edf_rnded < x12_rnded && edf_rnded < c40_rnded);
|
||||
}
|
||||
if (edf_eod_test) {
|
||||
if (debug_print) printf("EDI->");
|
||||
return DM_EDIFACT; /* step (k)(4) */
|
||||
}
|
||||
if (text_rnded < ascii_rnded && text_rnded < b256_rnded && text_rnded < edf_rnded && text_rnded < x12_rnded
|
||||
&& text_rnded < c40_rnded) {
|
||||
if (debug_print) printf("TEX->");
|
||||
return DM_TEXT; /* step (k)(5) */
|
||||
}
|
||||
if (variant == 1) {
|
||||
x12_eod_test = (x12_rnded < ascii_rnded && x12_rnded < b256_rnded && x12_rnded <= edf_rnded && x12_rnded < text_rnded && x12_rnded < c40_rnded);
|
||||
} else {
|
||||
x12_eod_test = (x12_rnded < ascii_rnded && x12_rnded < b256_rnded && x12_rnded < edf_rnded && x12_rnded < text_rnded && x12_rnded < c40_rnded);
|
||||
}
|
||||
if (x12_eod_test) {
|
||||
if (debug_print) printf("X12->");
|
||||
return DM_X12; /* step (k)(6) */
|
||||
}
|
||||
/* Note the algorithm is particularly sub-optimal here, returning C40 even if X12/EDIFACT (much) better, due to
|
||||
the < comparisons of rounded X12/EDIFACT values to each other above - comparisons would need to be <= or
|
||||
unrounded (cf. very similar Code One algorithm). Not changed to maintain compatibility with spec and BWIPP */
|
||||
if (debug_print) printf("C40->");
|
||||
return DM_C40; /* step (k)(7) */
|
||||
}
|
||||
|
||||
/* Copy C40/TEXT/X12 triplets from buffer to target. Returns elements left in buffer (< 3) */
|
||||
static int dm_ctx_buffer_xfer(int process_buffer[8], int process_p, unsigned char target[], int *p_tp,
|
||||
const int debug_print) {
|
||||
int i, process_e;
|
||||
int tp = *p_tp;
|
||||
|
||||
process_e = (process_p / 3) * 3;
|
||||
|
||||
for (i = 0; i < process_e; i += 3) {
|
||||
int iv = (1600 * process_buffer[i]) + (40 * process_buffer[i + 1]) + (process_buffer[i + 2]) + 1;
|
||||
target[tp++] = (unsigned char) (iv >> 8);
|
||||
target[tp++] = (unsigned char) (iv & 0xFF);
|
||||
if (debug_print) {
|
||||
printf("[%d %d %d (%d %d)] ", process_buffer[i], process_buffer[i + 1], process_buffer[i + 2],
|
||||
target[tp - 2], target[tp - 1]);
|
||||
}
|
||||
}
|
||||
|
||||
process_p -= process_e;
|
||||
|
||||
if (process_p) {
|
||||
memmove(process_buffer, process_buffer + process_e, sizeof(int) * process_p);
|
||||
}
|
||||
|
||||
*p_tp = tp;
|
||||
|
||||
return process_p;
|
||||
}
|
||||
|
||||
/* Copy EDIFACT quadruplets from buffer to target. Returns elements left in buffer (< 4) */
|
||||
static int dm_edi_buffer_xfer(int process_buffer[8], int process_p, unsigned char target[], int *p_tp,
|
||||
const int empty, const int debug_print) {
|
||||
int i, process_e;
|
||||
int tp = *p_tp;
|
||||
|
||||
process_e = (process_p / 4) * 4;
|
||||
|
||||
for (i = 0; i < process_e; i += 4) {
|
||||
target[tp++] = (unsigned char) (process_buffer[i] << 2 | (process_buffer[i + 1] & 0x30) >> 4);
|
||||
target[tp++] = (unsigned char) ((process_buffer[i + 1] & 0x0f) << 4 | (process_buffer[i + 2] & 0x3c) >> 2);
|
||||
target[tp++] = (unsigned char) ((process_buffer[i + 2] & 0x03) << 6 | process_buffer[i + 3]);
|
||||
if (debug_print) {
|
||||
printf("[%d %d %d %d (%d %d %d)] ", process_buffer[i], process_buffer[i + 1], process_buffer[i + 2],
|
||||
process_buffer[i + 3], target[tp - 3], target[tp - 2], target[tp - 1]);
|
||||
}
|
||||
}
|
||||
|
||||
process_p -= process_e;
|
||||
|
||||
if (process_p) {
|
||||
memmove(process_buffer, process_buffer + process_e, sizeof(int) * process_p);
|
||||
if (empty) {
|
||||
if (process_p == 3) {
|
||||
target[tp++] = (unsigned char) (process_buffer[i] << 2 | (process_buffer[i + 1] & 0x30) >> 4);
|
||||
target[tp++] = (unsigned char) ((process_buffer[i + 1] & 0x0f) << 4
|
||||
| (process_buffer[i + 2] & 0x3c) >> 2);
|
||||
target[tp++] = (unsigned char) ((process_buffer[i + 2] & 0x03) << 6);
|
||||
if (debug_print) {
|
||||
printf("[%d %d %d (%d %d %d)] ", process_buffer[i], process_buffer[i + 1], process_buffer[i + 2],
|
||||
target[tp - 3], target[tp - 2], target[tp - 1]);
|
||||
}
|
||||
} else if (process_p == 2) {
|
||||
target[tp++] = (unsigned char) (process_buffer[i] << 2 | (process_buffer[i + 1] & 0x30) >> 4);
|
||||
target[tp++] = (unsigned char) ((process_buffer[i + 1] & 0x0f) << 4);
|
||||
if (debug_print) {
|
||||
printf("[%d %d (%d %d)] ", process_buffer[i], process_buffer[i + 1], target[tp - 2],
|
||||
target[tp - 1]);
|
||||
}
|
||||
} else {
|
||||
target[tp++] = (unsigned char) (process_buffer[i] << 2);
|
||||
if (debug_print) printf("[%d (%d)] ", process_buffer[i], target[tp - 1]);
|
||||
}
|
||||
process_p = 0;
|
||||
}
|
||||
}
|
||||
|
||||
*p_tp = tp;
|
||||
|
||||
return process_p;
|
||||
}
|
||||
|
||||
STATIC_UNLESS_ZINT_TEST int dm_get_symbolsize(struct zint_symbol *symbol, const int minimum);
|
||||
STATIC_UNLESS_ZINT_TEST int dm_codewords_remaining(struct zint_symbol *symbol, const int tp, const int process_p);
|
||||
STATIC_UNLESS_ZINT_TEST int dm_c40text_cnt(const int current_mode, const int gs1, unsigned char input);
|
||||
STATIC_UNLESS_ZINT_TEST int dm_update_b256_field_length(unsigned char target[], int tp, int b256_start);
|
||||
STATIC_UNLESS_ZINT_TEST int dm_switch_mode(const int next_mode, unsigned char target[], int tp, int *b256_start,
|
||||
const int debug_print);
|
||||
|
||||
/* Version of dm200encode() to check variant look ahead parameters */
|
||||
static int dm200encode_variant(struct zint_symbol *symbol, const unsigned char source[], unsigned char target[],
|
||||
int *p_length, int *p_binlen, const int variant) {
|
||||
|
||||
int sp;
|
||||
int tp, i, gs1;
|
||||
int current_mode, next_mode;
|
||||
int not_first = 0;
|
||||
int inputlen = *p_length;
|
||||
int process_buffer[8]; /* holds remaining data to finalised */
|
||||
int process_p = 0; /* number of characters left to finalise */
|
||||
int b256_start = 0;
|
||||
int symbols_left;
|
||||
const int debug_print = symbol->debug & ZINT_DEBUG_PRINT;
|
||||
|
||||
sp = 0;
|
||||
tp = 0;
|
||||
|
||||
if (symbol->structapp.count) {
|
||||
int id1, id2;
|
||||
|
||||
if (symbol->structapp.count < 2 || symbol->structapp.count > 16) {
|
||||
strcpy(symbol->errtxt, "720: Structured Append count out of range (2-16)");
|
||||
return ZINT_ERROR_INVALID_OPTION;
|
||||
}
|
||||
if (symbol->structapp.index < 1 || symbol->structapp.index > symbol->structapp.count) {
|
||||
sprintf(symbol->errtxt, "721: Structured Append index out of range (1-%d)", symbol->structapp.count);
|
||||
return ZINT_ERROR_INVALID_OPTION;
|
||||
}
|
||||
if (symbol->structapp.id[0]) {
|
||||
int id, id_len, id1_err, id2_err;
|
||||
|
||||
for (id_len = 0; id_len < 32 && symbol->structapp.id[id_len]; id_len++);
|
||||
|
||||
if (id_len > 6) { /* ID1 * 1000 + ID2 */
|
||||
strcpy(symbol->errtxt, "722: Structured Append ID too long (6 digit maximum)");
|
||||
return ZINT_ERROR_INVALID_OPTION;
|
||||
}
|
||||
|
||||
id = to_int((const unsigned char *) symbol->structapp.id, id_len);
|
||||
if (id == -1) {
|
||||
strcpy(symbol->errtxt, "723: Invalid Structured Append ID (digits only)");
|
||||
return ZINT_ERROR_INVALID_OPTION;
|
||||
}
|
||||
id1 = id / 1000;
|
||||
id2 = id % 1000;
|
||||
id1_err = id1 < 1 || id1 > 254;
|
||||
id2_err = id2 < 1 || id2 > 254;
|
||||
if (id1_err || id2_err) {
|
||||
if (id1_err && id2_err) {
|
||||
sprintf(symbol->errtxt,
|
||||
"724: Structured Append ID1 '%03d' and ID2 '%03d' out of range (001-254) (ID '%03d%03d')",
|
||||
id1, id2, id1, id2);
|
||||
} else if (id1_err) {
|
||||
sprintf(symbol->errtxt,
|
||||
"725: Structured Append ID1 '%03d' out of range (001-254) (ID '%03d%03d')",
|
||||
id1, id1, id2);
|
||||
} else {
|
||||
sprintf(symbol->errtxt,
|
||||
"726: Structured Append ID2 '%03d' out of range (001-254) (ID '%03d%03d')",
|
||||
id2, id1, id2);
|
||||
}
|
||||
return ZINT_ERROR_INVALID_OPTION;
|
||||
}
|
||||
} else {
|
||||
id1 = id2 = 1;
|
||||
}
|
||||
|
||||
target[tp++] = 233;
|
||||
target[tp++] = (17 - symbol->structapp.count) | ((symbol->structapp.index - 1) << 4);
|
||||
target[tp++] = id1;
|
||||
target[tp++] = id2;
|
||||
}
|
||||
|
||||
/* gs1 flag values: 0: no gs1, 1: gs1 with FNC1 serparator, 2: GS separator */
|
||||
if ((symbol->input_mode & 0x07) == GS1_MODE) {
|
||||
if (symbol->output_options & GS1_GS_SEPARATOR) {
|
||||
gs1 = 2;
|
||||
} else {
|
||||
gs1 = 1;
|
||||
}
|
||||
} else {
|
||||
gs1 = 0;
|
||||
}
|
||||
|
||||
if (gs1) {
|
||||
target[tp++] = 232;
|
||||
if (debug_print) printf("FN1 ");
|
||||
} /* FNC1 */
|
||||
|
||||
if (symbol->output_options & READER_INIT) {
|
||||
if (gs1) {
|
||||
strcpy(symbol->errtxt, "521: Cannot encode in GS1 mode and Reader Initialisation at the same time");
|
||||
return ZINT_ERROR_INVALID_OPTION;
|
||||
}
|
||||
if (symbol->structapp.count) {
|
||||
strcpy(symbol->errtxt, "727: Cannot have Structured Append and Reader Initialisation at the same time");
|
||||
return ZINT_ERROR_INVALID_OPTION;
|
||||
}
|
||||
target[tp++] = 234; /* Reader Programming */
|
||||
if (debug_print) printf("RP ");
|
||||
}
|
||||
|
||||
if (symbol->eci > 0) {
|
||||
/* Encode ECI numbers according to Table 6 */
|
||||
target[tp++] = 241; /* ECI Character */
|
||||
if (symbol->eci <= 126) {
|
||||
target[tp++] = (unsigned char) (symbol->eci + 1);
|
||||
} else if (symbol->eci <= 16382) {
|
||||
target[tp++] = (unsigned char) ((symbol->eci - 127) / 254 + 128);
|
||||
target[tp++] = (unsigned char) ((symbol->eci - 127) % 254 + 1);
|
||||
} else {
|
||||
target[tp++] = (unsigned char) ((symbol->eci - 16383) / 64516 + 192);
|
||||
target[tp++] = (unsigned char) (((symbol->eci - 16383) / 254) % 254 + 1);
|
||||
target[tp++] = (unsigned char) ((symbol->eci - 16383) % 254 + 1);
|
||||
}
|
||||
if (debug_print) printf("ECI %d ", symbol->eci + 1);
|
||||
}
|
||||
|
||||
/* Check for Macro05/Macro06 */
|
||||
/* "[)>[RS]05[GS]...[RS][EOT]" -> CW 236 */
|
||||
/* "[)>[RS]06[GS]...[RS][EOT]" -> CW 237 */
|
||||
if (tp == 0 && sp == 0 && inputlen >= 9
|
||||
&& source[0] == '[' && source[1] == ')' && source[2] == '>'
|
||||
&& source[3] == '\x1e' && source[4] == '0'
|
||||
&& (source[5] == '5' || source[5] == '6')
|
||||
&& source[6] == '\x1d'
|
||||
&& source[inputlen - 2] == '\x1e' && source[inputlen - 1] == '\x04') {
|
||||
|
||||
/* Output macro Codeword */
|
||||
if (source[5] == '5') {
|
||||
target[tp++] = 236;
|
||||
if (debug_print) printf("Macro05 ");
|
||||
} else {
|
||||
target[tp++] = 237;
|
||||
if (debug_print) printf("Macro06 ");
|
||||
}
|
||||
/* Remove macro characters from input string */
|
||||
sp = 7;
|
||||
inputlen -= 2;
|
||||
*p_length -= 2;
|
||||
}
|
||||
|
||||
/* step (a) */
|
||||
current_mode = DM_ASCII;
|
||||
next_mode = DM_ASCII;
|
||||
|
||||
while (sp < inputlen) {
|
||||
|
||||
current_mode = next_mode;
|
||||
|
||||
/* step (b) - ASCII encodation */
|
||||
if (current_mode == DM_ASCII) {
|
||||
next_mode = DM_ASCII;
|
||||
|
||||
if (is_twodigits(source, inputlen, sp)) {
|
||||
target[tp++] = (unsigned char) ((10 * ctoi(source[sp])) + ctoi(source[sp + 1]) + 130);
|
||||
if (debug_print) printf("N%02d ", target[tp - 1] - 130);
|
||||
sp += 2;
|
||||
} else {
|
||||
next_mode = dm_look_ahead_test_variant(source, inputlen, sp, current_mode, 0, gs1, debug_print, variant);
|
||||
|
||||
if (next_mode != DM_ASCII) {
|
||||
tp = dm_switch_mode(next_mode, target, tp, &b256_start, debug_print);
|
||||
not_first = 0;
|
||||
} else {
|
||||
if (source[sp] & 0x80) {
|
||||
target[tp++] = 235; /* FNC4 */
|
||||
target[tp++] = (source[sp] - 128) + 1;
|
||||
if (debug_print) printf("FN4 A%02X ", target[tp - 1] - 1);
|
||||
} else {
|
||||
if (gs1 && (source[sp] == '[')) {
|
||||
if (gs1 == 2) {
|
||||
target[tp++] = 29 + 1; /* GS */
|
||||
if (debug_print) printf("GS ");
|
||||
} else {
|
||||
target[tp++] = 232; /* FNC1 */
|
||||
if (debug_print) printf("FN1 ");
|
||||
}
|
||||
} else {
|
||||
target[tp++] = source[sp] + 1;
|
||||
if (debug_print) printf("A%02X ", target[tp - 1] - 1);
|
||||
}
|
||||
}
|
||||
sp++;
|
||||
}
|
||||
}
|
||||
|
||||
/* step (c)/(d) C40/TEXT encodation */
|
||||
} else if (current_mode == DM_C40 || current_mode == DM_TEXT) {
|
||||
|
||||
next_mode = current_mode;
|
||||
if (process_p == 0 && not_first) {
|
||||
next_mode = dm_look_ahead_test_variant(source, inputlen, sp, current_mode, process_p, gs1, debug_print, variant);
|
||||
}
|
||||
|
||||
if (next_mode != current_mode) {
|
||||
target[tp++] = 254; /* Unlatch */
|
||||
next_mode = DM_ASCII;
|
||||
if (debug_print) printf("ASC ");
|
||||
} else {
|
||||
int shift_set, value;
|
||||
const char *ct_shift, *ct_value;
|
||||
|
||||
if (current_mode == DM_C40) {
|
||||
ct_shift = dm_c40_shift;
|
||||
ct_value = dm_c40_value;
|
||||
} else {
|
||||
ct_shift = dm_text_shift;
|
||||
ct_value = dm_text_value;
|
||||
}
|
||||
|
||||
if (source[sp] & 0x80) {
|
||||
process_buffer[process_p++] = 1;
|
||||
process_buffer[process_p++] = 30; /* Upper Shift */
|
||||
shift_set = ct_shift[source[sp] - 128];
|
||||
value = ct_value[source[sp] - 128];
|
||||
} else {
|
||||
if (gs1 && (source[sp] == '[')) {
|
||||
if (gs1 == 2) {
|
||||
shift_set = ct_shift[29];
|
||||
value = ct_value[29]; /* GS */
|
||||
} else {
|
||||
shift_set = 2;
|
||||
value = 27; /* FNC1 */
|
||||
}
|
||||
} else {
|
||||
shift_set = ct_shift[source[sp]];
|
||||
value = ct_value[source[sp]];
|
||||
}
|
||||
}
|
||||
|
||||
if (shift_set != 0) {
|
||||
process_buffer[process_p++] = shift_set - 1;
|
||||
}
|
||||
process_buffer[process_p++] = value;
|
||||
|
||||
if (process_p >= 3) {
|
||||
process_p = dm_ctx_buffer_xfer(process_buffer, process_p, target, &tp, debug_print);
|
||||
}
|
||||
sp++;
|
||||
not_first = 1;
|
||||
}
|
||||
|
||||
/* step (e) X12 encodation */
|
||||
} else if (current_mode == DM_X12) {
|
||||
|
||||
if (!dm_isX12(source[sp])) {
|
||||
next_mode = DM_ASCII;
|
||||
} else {
|
||||
next_mode = DM_X12;
|
||||
if (process_p == 0 && not_first) {
|
||||
next_mode = dm_look_ahead_test_variant(source, inputlen, sp, current_mode, process_p, gs1, debug_print, variant);
|
||||
}
|
||||
}
|
||||
|
||||
if (next_mode != DM_X12) {
|
||||
process_p = 0; /* Throw away buffer if any */
|
||||
target[tp++] = 254; /* Unlatch */
|
||||
next_mode = DM_ASCII;
|
||||
if (debug_print) printf("ASC ");
|
||||
} else {
|
||||
static const char x12_nonalphanum_chars[] = "\015*> ";
|
||||
int value = 0;
|
||||
|
||||
if ((source[sp] >= '0') && (source[sp] <= '9')) {
|
||||
value = (source[sp] - '0') + 4;
|
||||
} else if ((source[sp] >= 'A') && (source[sp] <= 'Z')) {
|
||||
value = (source[sp] - 'A') + 14;
|
||||
} else {
|
||||
value = posn(x12_nonalphanum_chars, source[sp]);
|
||||
}
|
||||
|
||||
process_buffer[process_p++] = value;
|
||||
|
||||
if (process_p >= 3) {
|
||||
process_p = dm_ctx_buffer_xfer(process_buffer, process_p, target, &tp, debug_print);
|
||||
}
|
||||
sp++;
|
||||
not_first = 1;
|
||||
}
|
||||
|
||||
/* step (f) EDIFACT encodation */
|
||||
} else if (current_mode == DM_EDIFACT) {
|
||||
|
||||
if (!dm_isedifact(source[sp], gs1)) {
|
||||
next_mode = DM_ASCII;
|
||||
} else {
|
||||
next_mode = DM_EDIFACT;
|
||||
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 as the switch to ASCII is "free" */
|
||||
next_mode = dm_look_ahead_test_variant(source, inputlen, sp, current_mode, process_p, gs1, debug_print, variant);
|
||||
}
|
||||
}
|
||||
|
||||
if (next_mode != DM_EDIFACT) {
|
||||
process_buffer[process_p++] = 31;
|
||||
process_p = dm_edi_buffer_xfer(process_buffer, process_p, target, &tp, 1 /*empty*/, debug_print);
|
||||
next_mode = DM_ASCII;
|
||||
if (debug_print) printf("ASC ");
|
||||
} else {
|
||||
int value = source[sp];
|
||||
|
||||
if (value >= 64) { // '@'
|
||||
value -= 64;
|
||||
}
|
||||
|
||||
process_buffer[process_p++] = value;
|
||||
sp++;
|
||||
not_first = 1;
|
||||
|
||||
if (process_p >= 4) {
|
||||
process_p = dm_edi_buffer_xfer(process_buffer, process_p, target, &tp, 0 /*empty*/, debug_print);
|
||||
}
|
||||
}
|
||||
|
||||
/* step (g) Base 256 encodation */
|
||||
} else if (current_mode == DM_BASE256) {
|
||||
|
||||
if (gs1 == 1 && source[sp] == '[') {
|
||||
next_mode = DM_ASCII;
|
||||
} else {
|
||||
next_mode = DM_BASE256;
|
||||
if (not_first) {
|
||||
next_mode = dm_look_ahead_test_variant(source, inputlen, sp, current_mode, tp - (b256_start + 1), gs1,
|
||||
debug_print, variant);
|
||||
}
|
||||
}
|
||||
|
||||
if (next_mode != DM_BASE256) {
|
||||
tp = dm_update_b256_field_length(target, tp, b256_start);
|
||||
/* B.2.1 255-state randomising algorithm */
|
||||
for (i = b256_start; i < tp; i++) {
|
||||
const int prn = ((149 * (i + 1)) % 255) + 1;
|
||||
target[i] = (unsigned char) ((target[i] + prn) & 0xFF);
|
||||
}
|
||||
if (variant == 1) {
|
||||
tp = dm_switch_mode(next_mode, target, tp, &b256_start, debug_print);
|
||||
not_first = 0;
|
||||
} else {
|
||||
next_mode = DM_ASCII;
|
||||
if (debug_print) printf("ASC ");
|
||||
}
|
||||
} else {
|
||||
if (gs1 == 2 && source[sp] == '[') {
|
||||
target[tp++] = 29; /* GS */
|
||||
} else {
|
||||
target[tp++] = source[sp];
|
||||
}
|
||||
sp++;
|
||||
not_first = 1;
|
||||
if (debug_print) printf("B%02X ", target[tp - 1]);
|
||||
}
|
||||
}
|
||||
|
||||
if (tp > 1558) {
|
||||
strcpy(symbol->errtxt, "520: Data too long to fit in symbol");
|
||||
return ZINT_ERROR_TOO_LONG;
|
||||
}
|
||||
|
||||
} /* while */
|
||||
|
||||
symbols_left = dm_codewords_remaining(symbol, tp, process_p);
|
||||
|
||||
if (debug_print) printf("\nsymbols_left %d, process_p %d ", symbols_left, process_p);
|
||||
|
||||
if (current_mode == DM_C40 || current_mode == DM_TEXT) {
|
||||
/* NOTE: changed to follow spec exactly here, only using Shift 1 padded triplets when 2 symbol chars remain.
|
||||
This matches the behaviour of BWIPP but not tec-it, nor figures 4.15.1-1 and 4.15-1-2 in GS1 General
|
||||
Specifications 21.0.1.
|
||||
*/
|
||||
if (debug_print) printf("%s ", current_mode == DM_C40 ? "C40" : "TEX");
|
||||
if (process_p == 0) {
|
||||
if (symbols_left > 0) {
|
||||
target[tp++] = 254; // Unlatch
|
||||
if (debug_print) printf("ASC ");
|
||||
}
|
||||
} else {
|
||||
if (process_p == 2 && symbols_left == 2) {
|
||||
/* 5.2.5.2 (b) */
|
||||
process_buffer[process_p++] = 0; // Shift 1
|
||||
(void) dm_ctx_buffer_xfer(process_buffer, process_p, target, &tp, debug_print);
|
||||
|
||||
} else if (process_p == 1 && symbols_left <= 2 && dm_isc40text(current_mode, source[inputlen - 1])) {
|
||||
/* 5.2.5.2 (c)/(d) */
|
||||
if (symbols_left > 1) {
|
||||
/* 5.2.5.2 (c) */
|
||||
target[tp++] = 254; // Unlatch and encode remaining data in ascii.
|
||||
if (debug_print) printf("ASC ");
|
||||
}
|
||||
target[tp++] = source[inputlen - 1] + 1;
|
||||
if (debug_print) printf("A%02X ", target[tp - 1] - 1);
|
||||
|
||||
} else {
|
||||
int cnt, total_cnt = 0;
|
||||
/* Backtrack to last complete triplet (same technique as BWIPP) */
|
||||
while (sp > 0 && process_p % 3) {
|
||||
sp--;
|
||||
cnt = dm_c40text_cnt(current_mode, gs1, source[sp]);
|
||||
total_cnt += cnt;
|
||||
process_p -= cnt;
|
||||
}
|
||||
tp -= (total_cnt / 3) * 2;
|
||||
|
||||
target[tp++] = 254; // Unlatch
|
||||
if (debug_print) printf("ASC ");
|
||||
for (; sp < inputlen; sp++) {
|
||||
if (is_twodigits(source, inputlen, sp)) {
|
||||
target[tp++] = (unsigned char) ((10 * ctoi(source[sp])) + ctoi(source[sp + 1]) + 130);
|
||||
if (debug_print) printf("N%02d ", target[tp - 1] - 130);
|
||||
sp++;
|
||||
} else if (source[sp] & 0x80) {
|
||||
target[tp++] = 235; /* FNC4 */
|
||||
target[tp++] = (source[sp] - 128) + 1;
|
||||
if (debug_print) printf("FN4 A%02X ", target[tp - 1] - 1);
|
||||
} else if (gs1 && source[sp] == '[') {
|
||||
if (gs1 == 2) {
|
||||
target[tp++] = 29 + 1; /* GS */
|
||||
if (debug_print) printf("GS ");
|
||||
} else {
|
||||
target[tp++] = 232; /* FNC1 */
|
||||
if (debug_print) printf("FN1 ");
|
||||
}
|
||||
} else {
|
||||
target[tp++] = source[sp] + 1;
|
||||
if (debug_print) printf("A%02X ", target[tp - 1] - 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} else if (current_mode == DM_X12) {
|
||||
if (debug_print) printf("X12 ");
|
||||
if ((symbols_left == 1) && (process_p == 1)) {
|
||||
// Unlatch not required!
|
||||
target[tp++] = source[inputlen - 1] + 1;
|
||||
if (debug_print) printf("A%02X ", target[tp - 1] - 1);
|
||||
} else {
|
||||
if (symbols_left > 0) {
|
||||
target[tp++] = (254); // Unlatch.
|
||||
if (debug_print) printf("ASC ");
|
||||
}
|
||||
|
||||
if (process_p == 1) {
|
||||
target[tp++] = source[inputlen - 1] + 1;
|
||||
if (debug_print) printf("A%02X ", target[tp - 1] - 1);
|
||||
} else if (process_p == 2) {
|
||||
target[tp++] = source[inputlen - 2] + 1;
|
||||
target[tp++] = source[inputlen - 1] + 1;
|
||||
if (debug_print) printf("A%02X A%02X ", target[tp - 2] - 1, target[tp - 1] - 1);
|
||||
}
|
||||
}
|
||||
|
||||
} else if (current_mode == DM_EDIFACT) {
|
||||
if (debug_print) printf("EDI ");
|
||||
if (symbols_left <= 2 && process_p <= symbols_left) { // Unlatch not required!
|
||||
if (process_p == 1) {
|
||||
target[tp++] = source[inputlen - 1] + 1;
|
||||
if (debug_print) printf("A%02X ", target[tp - 1] - 1);
|
||||
} else if (process_p == 2) {
|
||||
target[tp++] = source[inputlen - 2] + 1;
|
||||
target[tp++] = source[inputlen - 1] + 1;
|
||||
if (debug_print) printf("A%02X A%02X ", target[tp - 2] - 1, target[tp - 1] - 1);
|
||||
}
|
||||
} else {
|
||||
// Append edifact unlatch value (31) and empty buffer
|
||||
if (process_p <= 3) {
|
||||
process_buffer[process_p++] = 31;
|
||||
}
|
||||
(void) dm_edi_buffer_xfer(process_buffer, process_p, target, &tp, 1 /*empty*/, debug_print);
|
||||
}
|
||||
|
||||
} else if (current_mode == DM_BASE256) {
|
||||
if (symbols_left > 0) {
|
||||
tp = dm_update_b256_field_length(target, tp, b256_start);
|
||||
}
|
||||
/* B.2.1 255-state randomising algorithm */
|
||||
for (i = b256_start; i < tp; i++) {
|
||||
int prn = ((149 * (i + 1)) % 255) + 1;
|
||||
target[i] = (unsigned char) ((target[i] + prn) & 0xFF);
|
||||
}
|
||||
}
|
||||
|
||||
if (debug_print) {
|
||||
printf("\nData (%d): ", tp);
|
||||
for (i = 0; i < tp; i++)
|
||||
printf("%d ", target[i]);
|
||||
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
*p_binlen = tp;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* Z_DMATRIX_VARIANT_H */
|
|
@ -346,7 +346,7 @@ static void test_escape_char_process(int index, int generate, int debug) {
|
|||
char *comment;
|
||||
};
|
||||
struct item data[] = {
|
||||
/* 0*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\0\\E\\a\\b\\t\\n\\v\\f\\r\\e\\G\\R\\x81\\\\", 0, 26, "01 05 08 09 0A 0B 0C 0D 0E E7 72 1F B6 4D 45 5D 41 91 6B 29 2A E8 33 B4 2F 7A D2 AB C4 B1", 0, "" },
|
||||
/* 0*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\0\\E\\a\\b\\t\\n\\v\\f\\r\\e\\G\\R\\x81\\\\", 0, 26, "01 05 08 09 0A 0B 0C 0D 0E 1C 1E 1F EB 02 5D 81 21 0D 92 2E 3D FD B6 9A 37 2A CD 61 FB 95", 0, "" },
|
||||
/* 1*/ { BARCODE_CODABLOCKF, DATA_MODE, -1, "\\0\\E\\a\\b\\t\\n\\v\\f\\r\\e\\G\\R\\x81\\\\", 0, 101, "(45) 67 62 43 40 44 47 48 29 6A 67 62 0B 49 4A 4B 4C 18 6A 67 62 0C 4D 5B 5D 5E 62 6A 67", 0, "" },
|
||||
/* 2*/ { BARCODE_CODE16K, DATA_MODE, -1, "\\0\\E\\a\\b\\t\\n\\v\\f\\r\\e\\G\\R\\x81\\\\", 0, 70, "(20) 14 64 68 71 72 73 74 75 76 77 91 93 94 101 65 60 103 103 45 61", 0, "" },
|
||||
/* 3*/ { BARCODE_DOTCODE, DATA_MODE, -1, "\\0\\E\\a\\b\\t\\n\\v\\f\\r\\e\\G\\R\\x81\\\\", 0, 28, "65 40 44 47 48 49 4A 4B 4C 4D 5B 5D 5E 6E 41 3C", 0, "" },
|
||||
|
|
|
@ -1807,32 +1807,32 @@ static void test_microqr_input(int index, int generate, int debug) {
|
|||
/* 12*/ { UNICODE_MODE, -1, "‾", 0, "85 F8 00 EC 11 EC 11 EC 00", "B1 (Shift JIS) (same bytes as ~ ASCII above, so ambiguous)" },
|
||||
/* 13*/ { UNICODE_MODE, -1, "点", 0, "CB 67 C0 00 EC 11 EC 11 00", "K1 (Shift JIS)" },
|
||||
/* 14*/ { DATA_MODE, -1, "\223\137", 0, "8A 4D 7C 00 EC 11 EC 11 00", "B2 (Shift JIS)" },
|
||||
/* 15*/ { DATA_MODE, 200, "\223\137", 0, "CB 67 C0 00 EC 11 EC 11 00", "K1 (Shift JIS) (full multibyte)" },
|
||||
/* 15*/ { DATA_MODE, ZINT_FULL_MULTIBYTE, "\223\137", 0, "CB 67 C0 00 EC 11 EC 11 00", "K1 (Shift JIS) (full multibyte)" },
|
||||
/* 16*/ { DATA_MODE, -1, "点", 0, "8F 9E 0A E4 00 EC 11 EC 00", "B3 (UTF-8)" },
|
||||
/* 17*/ { UNICODE_MODE, -1, "茗", 0, "CE AA 80 00 EC 11 EC 11 00", "K1 (Shift JIS)" },
|
||||
/* 18*/ { DATA_MODE, -1, "\344\252", 0, "8B 92 A8 00 EC 11 EC 11 00", "B2 (Shift JIS)" },
|
||||
/* 19*/ { DATA_MODE, 200, "\344\252", 0, "CE AA 80 00 EC 11 EC 11 00", "K1 (Shift JIS) (full multibyte)" },
|
||||
/* 19*/ { DATA_MODE, ZINT_FULL_MULTIBYTE, "\344\252", 0, "CE AA 80 00 EC 11 EC 11 00", "K1 (Shift JIS) (full multibyte)" },
|
||||
/* 20*/ { DATA_MODE, -1, "茗", 0, "8F A2 32 5C 00 EC 11 EC 00", "B3 (UTF-8)" },
|
||||
/* 21*/ { UNICODE_MODE, -1, "¥点", 0, "8D 72 4D 7C 00 EC 11 EC 00", "B3 (Shift JIS) (optimized from B1 K1)" },
|
||||
/* 22*/ { DATA_MODE, -1, "\134\223\137", 0, "8D 72 4D 7C 00 EC 11 EC 00", "B3 (Shift JIS) (optimized from B1 K1)" },
|
||||
/* 23*/ { DATA_MODE, -1, "¥点", 0, "97 0A 97 9E 0A E4 00 EC 00", "B5 (UTF-8)" },
|
||||
/* 24*/ { UNICODE_MODE, -1, "点茗", 0, "D3 67 F5 54 00 EC 11 EC 00", "K2 (Shift JIS)" },
|
||||
/* 25*/ { DATA_MODE, -1, "\223\137\344\252", 0, "92 4D 7F 92 A8 00 EC 11 00", "B4 (Shift JIS)" },
|
||||
/* 26*/ { DATA_MODE, 200, "\223\137\344\252", 0, "D3 67 F5 54 00 EC 11 EC 00", "K2 (Shift JIS) (full multibyte)" },
|
||||
/* 26*/ { DATA_MODE, ZINT_FULL_MULTIBYTE, "\223\137\344\252", 0, "D3 67 F5 54 00 EC 11 EC 00", "K2 (Shift JIS) (full multibyte)" },
|
||||
/* 27*/ { DATA_MODE, -1, "点茗", 0, "9B 9E 0A E7 A2 32 5C 00 00", "B6 (UTF-8)" },
|
||||
/* 28*/ { DATA_MODE, 200, "点茗", 0, "9B 9E 0A E7 A2 32 5C 00 00", "B6 (UTF-8)" },
|
||||
/* 28*/ { DATA_MODE, ZINT_FULL_MULTIBYTE, "点茗", 0, "9B 9E 0A E7 A2 32 5C 00 00", "B6 (UTF-8)" },
|
||||
/* 29*/ { UNICODE_MODE, -1, "点茗・", 0, "D3 67 F5 55 0D 28 00 EC 00", "K2 B1 (Shift JIS)" },
|
||||
/* 30*/ { DATA_MODE, -1, "\223\137\344\252\245", 0, "96 4D 7F 92 AA 94 00 EC 00", "B5 (Shift JIS)" },
|
||||
/* 31*/ { DATA_MODE, 200, "\223\137\344\252\245", 0, "D3 67 F5 55 0D 28 00 EC 00", "K2 B1 (Shift JIS) (full multibyte)" },
|
||||
/* 31*/ { DATA_MODE, ZINT_FULL_MULTIBYTE, "\223\137\344\252\245", 0, "D3 67 F5 55 0D 28 00 EC 00", "K2 B1 (Shift JIS) (full multibyte)" },
|
||||
/* 32*/ { DATA_MODE, -1, "点茗・", 0, "A7 9E 0A E7 A2 32 5F BE F6 94 00", "B9 (UTF-8)" },
|
||||
/* 33*/ { UNICODE_MODE, -1, "¥点茗・", 0, "99 72 4D 7F 92 AA 94 00 00", "B6 (Shift JIS) (optimized from B1 K2 B1)" },
|
||||
/* 34*/ { DATA_MODE, -1, "\134\223\137\344\252\245", 0, "99 72 4D 7F 92 AA 94 00 00", "B6 (Shift JIS) (optimized from B1 K2 B1)" },
|
||||
/* 35*/ { DATA_MODE, -1, "¥点茗・", 0, "4B C2 A5 E7 82 B9 E8 8C 97 EF BD A5 00 00", "B11 (UTF-8)" },
|
||||
/* 36*/ { DATA_MODE, -1, "ÁȁȁȁȂ¢", 0, "4C C3 81 C8 81 C8 81 C8 81 C8 82 C2 A2 00", "B12 (UTF-8)" },
|
||||
/* 37*/ { DATA_MODE, -1, "ÁȁȁȁȁȂ¢", 0, "4E C3 81 C8 81 C8 81 C8 81 C8 81 C8 82 C2 A2 00", "B14 (UTF-8)" },
|
||||
/* 38*/ { DATA_MODE, 200, "ÁȁȁȁȁȂ¢", 0, "41 C3 6C 08 80 44 02 20 11 00 88 0A 12 0D 10 00", "B1 K6 B1 (UTF-8) (full multibyte)" },
|
||||
/* 38*/ { DATA_MODE, ZINT_FULL_MULTIBYTE, "ÁȁȁȁȁȂ¢", 0, "41 C3 6C 08 80 44 02 20 11 00 88 0A 12 0D 10 00", "B1 K6 B1 (UTF-8) (full multibyte)" },
|
||||
/* 39*/ { UNICODE_MODE, -1, "áA", 0, "8B 85 04 00 EC 11 EC 11 00", "B2 (ISO 8859-1)" },
|
||||
/* 40*/ { UNICODE_MODE, 200, "áA", 0, "CE 00 40 00 EC 11 EC 11 00", "K1 (ISO 8859-1) (full multibyte)" },
|
||||
/* 40*/ { UNICODE_MODE, ZINT_FULL_MULTIBYTE, "áA", 0, "CE 00 40 00 EC 11 EC 11 00", "K1 (ISO 8859-1) (full multibyte)" },
|
||||
};
|
||||
int data_size = ARRAY_SIZE(data);
|
||||
int i, length, ret;
|
||||
|
@ -1857,8 +1857,9 @@ static void test_microqr_input(int index, int generate, int debug) {
|
|||
assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt);
|
||||
|
||||
if (generate) {
|
||||
printf(" /*%3d*/ { %s, %d, \"%s\", %s, \"%s\", \"%s\" },\n",
|
||||
i, testUtilInputModeName(data[i].input_mode), data[i].option_3, testUtilEscape(data[i].data, length, escaped, sizeof(escaped)),
|
||||
printf(" /*%3d*/ { %s, %s, \"%s\", %s, \"%s\", \"%s\" },\n",
|
||||
i, testUtilInputModeName(data[i].input_mode), testUtilOption3Name(data[i].option_3),
|
||||
testUtilEscape(data[i].data, length, escaped, sizeof(escaped)),
|
||||
testUtilErrorName(data[i].ret), symbol->errtxt, data[i].comment);
|
||||
} else {
|
||||
assert_zero(strcmp(symbol->errtxt, data[i].expected), "i:%d strcmp(%s, %s) != 0\n", i, symbol->errtxt, data[i].expected);
|
||||
|
|
|
@ -388,6 +388,7 @@ const char *testUtilInputModeName(int input_mode) {
|
|||
{ "GS1PARENS_MODE", GS1PARENS_MODE, 0x0010 },
|
||||
{ "GS1NOCHECK_MODE", GS1NOCHECK_MODE, 0x0020 },
|
||||
{ "HEIGHTPERROW_MODE", HEIGHTPERROW_MODE, 0x0040 },
|
||||
{ "FAST_MODE", FAST_MODE, 0x0080 },
|
||||
};
|
||||
static const int data_size = ARRAY_SIZE(data);
|
||||
int set, i;
|
||||
|
@ -433,7 +434,7 @@ const char *testUtilOption3Name(int option_3) {
|
|||
static char buffer[64];
|
||||
|
||||
const char *name = NULL;
|
||||
unsigned int high_byte = option_3 == -1 ? 0 : (option_3 >> 8) & 0xFF;
|
||||
const unsigned int high_byte = option_3 == -1 ? 0 : (option_3 >> 8) & 0xFF;
|
||||
|
||||
switch (option_3 & 0xFF) {
|
||||
case DM_SQUARE:
|
||||
|
@ -2758,8 +2759,8 @@ int testUtilBwipp(int index, const struct zint_symbol *symbol, int option_1, int
|
|||
added_dmre = 1;
|
||||
}
|
||||
}
|
||||
if (option_3 != DM_SQUARE && symbol->width != symbol->height) {
|
||||
if (option_3 == DM_DMRE && !added_dmre) {
|
||||
if ((option_3 & 0x7F) != DM_SQUARE && symbol->width != symbol->height) {
|
||||
if ((option_3 & 0x7F) == DM_DMRE && !added_dmre) {
|
||||
sprintf(bwipp_opts_buf + strlen(bwipp_opts_buf), "%sdmre", strlen(bwipp_opts_buf) ? " " : "");
|
||||
//added_dmre = 1;
|
||||
}
|
||||
|
|
|
@ -41,8 +41,7 @@
|
|||
#define ZINT_DEBUG_TEST_KEEP_OUTFILE 64
|
||||
#define ZINT_DEBUG_TEST_BWIPP 128
|
||||
#define ZINT_DEBUG_TEST_PERFORMANCE 256
|
||||
#define ZINT_DEBUG_TEST_MINIMIZE 512
|
||||
#define ZINT_DEBUG_TEST_ZXINGCPP 1024
|
||||
#define ZINT_DEBUG_TEST_ZXINGCPP 512
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#define testutil_popen(command, mode) _popen(command, mode)
|
||||
|
|
|
@ -5,7 +5,7 @@ set -e
|
|||
|
||||
function run_zxingcpp_test() {
|
||||
echo -e "\n$1 -f $2"
|
||||
backend/tests/$1 -f "$2" -d $(expr 1024 + 16 + 32) || exit 1
|
||||
backend/tests/$1 -f "$2" -d $(expr 512 + 16 + 32) || exit 1
|
||||
}
|
||||
|
||||
run_zxingcpp_test "test_2of5" "encode"
|
||||
|
|
|
@ -274,24 +274,25 @@ extern "C" {
|
|||
#define COMPLIANT_HEIGHT 0x2000 /* Warn if height not compliant and use standard height (if any) as default */
|
||||
|
||||
/* Input data types (`symbol->input_mode`) */
|
||||
#define DATA_MODE 0 /* Binary */
|
||||
#define UNICODE_MODE 1 /* UTF-8 */
|
||||
#define GS1_MODE 2 /* GS1 */
|
||||
#define DATA_MODE 0 /* Binary */
|
||||
#define UNICODE_MODE 1 /* UTF-8 */
|
||||
#define GS1_MODE 2 /* GS1 */
|
||||
/* The following may be OR-ed with above */
|
||||
#define ESCAPE_MODE 0x0008 /* Process escape sequences */
|
||||
#define GS1PARENS_MODE 0x0010 /* Process parentheses as GS1 AI delimiters (instead of square brackets) */
|
||||
#define GS1NOCHECK_MODE 0x0020 /* Do not check validity of GS1 data (except that printable ASCII only) */
|
||||
#define HEIGHTPERROW_MODE 0x0040 /* Interpret `height` as per-row rather than as overall height */
|
||||
#define FAST_MODE 0x0080 /* Use faster if less optimal encodation for symbologies that support it */
|
||||
|
||||
/* Data Matrix specific options (`symbol->option_3`) */
|
||||
#define DM_SQUARE 100 /* Only consider square versions on automatic symbol size selection */
|
||||
#define DM_DMRE 101 /* Consider DMRE versions on automatic symbol size selection */
|
||||
#define DM_SQUARE 100 /* Only consider square versions on automatic symbol size selection */
|
||||
#define DM_DMRE 101 /* Consider DMRE versions on automatic symbol size selection */
|
||||
|
||||
/* QR, Han Xin, Grid Matrix specific options (`symbol->option_3`) */
|
||||
#define ZINT_FULL_MULTIBYTE 200 /* Enable Kanji/Hanzi compression for Latin-1 & binary data */
|
||||
#define ZINT_FULL_MULTIBYTE 200 /* Enable Kanji/Hanzi compression for Latin-1 & binary data */
|
||||
|
||||
/* Ultracode specific option (`symbol->option_3`) */
|
||||
#define ULTRA_COMPRESSION 128 /* Enable Ultracode compression (experimental) */
|
||||
#define ULTRA_COMPRESSION 128 /* Enable Ultracode compression (experimental) */
|
||||
|
||||
/* Warning and error conditions (API return values) */
|
||||
#define ZINT_WARN_INVALID_OPTION 2 /* Invalid option given but overridden by Zint */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue