2009-11-22 15:38:15 +00:00
/* library.c - external functions of libzint
libzint - the open source barcode library
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
Copyright ( C ) 2009 - 2022 Robin Stuart < rstuart114 @ gmail . com >
2009-11-22 15:38:15 +00:00
2013-05-16 19:26:38 +02:00
Redistribution and use in source and binary forms , with or without
modification , are permitted provided that the following conditions
are met :
2017-10-23 21:37:52 +02:00
1. Redistributions of source code must retain the above copyright
notice , this list of conditions and the following disclaimer .
2013-05-16 19:26:38 +02:00
2. Redistributions in binary form must reproduce the above copyright
notice , this list of conditions and the following disclaimer in the
2017-10-23 21:37:52 +02:00
documentation and / or other materials provided with the distribution .
2013-05-16 19:26:38 +02:00
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
2017-10-23 21:37:52 +02:00
without specific prior written permission .
2013-05-16 19:26:38 +02:00
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
2017-10-23 21:37:52 +02:00
OUT OF THE USE OF THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF
2013-05-16 19:26:38 +02:00
SUCH DAMAGE .
2016-02-20 10:50:15 +00:00
*/
2009-11-22 15:38:15 +00:00
2021-11-23 19:12:48 +00:00
# include <assert.h>
2009-11-22 15:38:15 +00:00
# include <errno.h>
2020-11-01 18:32:55 +00:00
# include <limits.h>
2009-11-22 15:38:15 +00:00
# ifdef _MSC_VER
2017-10-23 21:37:52 +02:00
# include <malloc.h>
2009-11-22 15:38:15 +00:00
# endif
2021-11-23 19:12:48 +00:00
# include <stdio.h>
2009-11-22 15:38:15 +00:00
# include "common.h"
2021-01-11 18:11:41 +00:00
# include "eci.h"
2009-11-22 15:38:15 +00:00
# include "gs1.h"
2021-05-15 12:23:46 +01:00
# include "zfiletypes.h"
2009-11-22 15:38:15 +00:00
2020-12-21 19:30:07 +00:00
/* It's assumed that int is at least 32 bits, the following will compile-time fail if not
Add Structured Append support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, MAXICODE, MICROPDF417, PDF417, QRCODE, ULTRA
DOTCODE: use pre-calculated generator poly coeffs in Reed-Solomon for
performance improvement
PDF417/MICROPDF417: use common routine pdf417_initial()
GUI: code lines <= 118, shorthand widget_obj(),
shorten calling upcean_addon_gap(), upcean_guard_descent()
various backend: var name debug -> debug_print
2021-09-28 21:42:44 +01:00
* https : //stackoverflow.com/a/1980056 */
2020-12-21 19:30:07 +00:00
typedef int static_assert_int_at_least_32bits [ CHAR_BIT ! = 8 | | sizeof ( int ) < 4 ? - 1 : 1 ] ;
2021-07-06 19:53:31 +01:00
/* Create and initialize a symbol structure */
2021-11-25 15:28:20 +08:00
struct zint_symbol * ZBarcode_Create ( void ) {
2016-02-20 10:50:15 +00:00
struct zint_symbol * symbol ;
2021-10-20 23:05:30 +01:00
symbol = ( struct zint_symbol * ) calloc ( 1 , sizeof ( * symbol ) ) ;
2016-02-20 10:50:15 +00:00
if ( ! symbol ) return NULL ;
symbol - > symbology = BARCODE_CODE128 ;
2021-09-22 00:04:15 +01:00
symbol - > scale = 1.0f ;
2016-02-20 10:50:15 +00:00
strcpy ( symbol - > fgcolour , " 000000 " ) ;
2020-08-02 22:26:39 +01:00
symbol - > fgcolor = & symbol - > fgcolour [ 0 ] ;
2016-02-20 10:50:15 +00:00
strcpy ( symbol - > bgcolour , " ffffff " ) ;
2020-08-02 22:26:39 +01:00
symbol - > bgcolor = & symbol - > bgcolour [ 0 ] ;
2020-12-21 19:30:07 +00:00
# ifdef NO_PNG
strcpy ( symbol - > outfile , " out.gif " ) ;
# else
2017-10-21 12:45:50 +01:00
strcpy ( symbol - > outfile , " out.png " ) ;
2020-12-21 19:30:07 +00:00
# endif
2016-02-20 10:50:15 +00:00
symbol - > option_1 = - 1 ;
symbol - > show_hrt = 1 ; // Show human readable text
2018-02-11 09:55:28 +00:00
symbol - > fontsize = 8 ;
2016-02-20 10:50:15 +00:00
symbol - > input_mode = DATA_MODE ;
2019-10-06 17:39:54 +01:00
symbol - > eci = 0 ; // Default 0 uses ECI 3
2020-09-30 12:19:12 +01:00
symbol - > dot_size = 4.0f / 5.0f ;
2021-09-22 00:04:15 +01:00
symbol - > guard_descent = 5.0f ;
2020-08-22 11:09:57 +01:00
symbol - > warn_level = WARN_DEFAULT ;
2021-09-22 00:04:15 +01:00
symbol - > bitmap = NULL ;
symbol - > alphamap = NULL ;
symbol - > vector = NULL ;
2020-11-01 18:32:55 +00:00
2016-02-20 10:50:15 +00:00
return symbol ;
2009-11-22 15:38:15 +00:00
}
2019-12-19 00:37:55 +00:00
INTERNAL void vector_free ( struct zint_symbol * symbol ) ; /* Free vector structures */
2017-10-16 09:49:44 +02:00
2021-07-06 19:53:31 +01:00
/* Free any output buffers that may have been created and initialize output fields */
2016-02-20 10:50:15 +00:00
void ZBarcode_Clear ( struct zint_symbol * symbol ) {
2021-10-20 23:05:30 +01:00
int i ;
2016-02-20 10:50:15 +00:00
2020-09-30 12:19:12 +01:00
if ( ! symbol ) return ;
2016-02-20 10:50:15 +00:00
for ( i = 0 ; i < symbol - > rows ; i + + ) {
2021-10-20 23:05:30 +01:00
memset ( symbol - > encoded_data [ i ] , 0 , sizeof ( symbol - > encoded_data [ 0 ] ) ) ;
2016-02-20 10:50:15 +00:00
}
symbol - > rows = 0 ;
symbol - > width = 0 ;
2021-07-06 19:53:31 +01:00
memset ( symbol - > row_height , 0 , sizeof ( symbol - > row_height ) ) ;
2016-10-27 21:55:26 +02:00
memset ( symbol - > text , 0 , sizeof ( symbol - > text ) ) ;
2016-02-20 10:50:15 +00:00
symbol - > errtxt [ 0 ] = ' \0 ' ;
if ( symbol - > bitmap ! = NULL ) {
free ( symbol - > bitmap ) ;
symbol - > bitmap = NULL ;
}
2020-08-03 12:13:05 +01:00
if ( symbol - > alphamap ! = NULL ) {
free ( symbol - > alphamap ) ;
symbol - > alphamap = NULL ;
}
2016-02-20 10:50:15 +00:00
symbol - > bitmap_width = 0 ;
symbol - > bitmap_height = 0 ;
2021-07-06 19:53:31 +01:00
symbol - > bitmap_byte_length = 0 ;
2017-10-16 09:49:44 +02:00
// If there is a rendered version, ensure its memory is released
2018-06-10 09:16:18 +01:00
vector_free ( symbol ) ;
2009-12-02 09:09:45 +00:00
}
2009-11-22 15:38:15 +00:00
2021-07-06 19:53:31 +01:00
/* Free a symbol structure, including any output buffers */
2016-02-20 10:50:15 +00:00
void ZBarcode_Delete ( struct zint_symbol * symbol ) {
2020-09-30 12:19:12 +01:00
if ( ! symbol ) return ;
2016-02-20 10:50:15 +00:00
if ( symbol - > bitmap ! = NULL )
free ( symbol - > bitmap ) ;
2020-08-03 12:13:05 +01:00
if ( symbol - > alphamap ! = NULL )
free ( symbol - > alphamap ) ;
2016-02-20 10:50:15 +00:00
// If there is a rendered version, ensure its memory is released
2018-06-10 09:16:18 +01:00
vector_free ( symbol ) ;
2016-09-05 22:06:50 +01:00
2016-02-20 10:50:15 +00:00
free ( symbol ) ;
2009-11-22 15:38:15 +00:00
}
2019-12-19 00:37:55 +00:00
INTERNAL int eanx ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* EAN system barcodes */
Add compliant height, using ZINT_COMPLIANT_HEIGHT flag for back-compatibility
Rename barcode funcs to same as BARCODE_XXX name
library: barcode funcs array for dispatch, used for ZBarcode_ValidID() also
general: change is_sane() comparison to nonzero from ZINT_ERROR_INVALID_OPTION
MAILMARK: fuller error messages
CODABAR: add option to show check character in HRT
zint.h: use 0xNNNN for OR-able defines
GUI: add guard descent height reset button, add Zint version to window title,
static get_zint_version() method, use QStringLiteral (QSL shorthand),
use SIGNAL(toggled()), add errtxt "popup" and status bar, add icons,
add saveAs shortcut, add main menu, context menus and actions, add help,
reset_view() -> reset_colours(), add copy to clipboard as EMF/GIF/PNG/TIF,
lessen triggering of update_preview(), shorten names of getters/setters,
simplify/shorten some update_preview() logic in switch,
CODEONE disable structapp for Version S
qzint.cpp: add on_errored signal, add missing getters, add test
2021-10-09 00:13:39 +01:00
INTERNAL int code39 ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* Code 3 from 9 (or Code 39) */
INTERNAL int pzn ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* Pharmazentral Nummer (PZN) */
2021-06-19 13:11:23 +01:00
/* Extended Code 3 from 9 (or Code 39+) */
Add compliant height, using ZINT_COMPLIANT_HEIGHT flag for back-compatibility
Rename barcode funcs to same as BARCODE_XXX name
library: barcode funcs array for dispatch, used for ZBarcode_ValidID() also
general: change is_sane() comparison to nonzero from ZINT_ERROR_INVALID_OPTION
MAILMARK: fuller error messages
CODABAR: add option to show check character in HRT
zint.h: use 0xNNNN for OR-able defines
GUI: add guard descent height reset button, add Zint version to window title,
static get_zint_version() method, use QStringLiteral (QSL shorthand),
use SIGNAL(toggled()), add errtxt "popup" and status bar, add icons,
add saveAs shortcut, add main menu, context menus and actions, add help,
reset_view() -> reset_colours(), add copy to clipboard as EMF/GIF/PNG/TIF,
lessen triggering of update_preview(), shorten names of getters/setters,
simplify/shorten some update_preview() logic in switch,
CODEONE disable structapp for Version S
qzint.cpp: add on_errored signal, add missing getters, add test
2021-10-09 00:13:39 +01:00
INTERNAL int excode39 ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ;
2021-06-19 13:11:23 +01:00
/* Codabar - a simple substitution cipher */
INTERNAL int codabar ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ;
/* Code 2 of 5 Standard (& Matrix) */
Add compliant height, using ZINT_COMPLIANT_HEIGHT flag for back-compatibility
Rename barcode funcs to same as BARCODE_XXX name
library: barcode funcs array for dispatch, used for ZBarcode_ValidID() also
general: change is_sane() comparison to nonzero from ZINT_ERROR_INVALID_OPTION
MAILMARK: fuller error messages
CODABAR: add option to show check character in HRT
zint.h: use 0xNNNN for OR-able defines
GUI: add guard descent height reset button, add Zint version to window title,
static get_zint_version() method, use QStringLiteral (QSL shorthand),
use SIGNAL(toggled()), add errtxt "popup" and status bar, add icons,
add saveAs shortcut, add main menu, context menus and actions, add help,
reset_view() -> reset_colours(), add copy to clipboard as EMF/GIF/PNG/TIF,
lessen triggering of update_preview(), shorten names of getters/setters,
simplify/shorten some update_preview() logic in switch,
CODEONE disable structapp for Version S
qzint.cpp: add on_errored signal, add missing getters, add test
2021-10-09 00:13:39 +01:00
INTERNAL int c25standard ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ;
INTERNAL int c25ind ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* Code 2 of 5 Industrial */
INTERNAL int c25iata ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* Code 2 of 5 IATA */
INTERNAL int c25inter ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* Code 2 of 5 Interleaved */
INTERNAL int c25logic ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* Code 2 of 5 Data Logic */
2019-12-19 00:37:55 +00:00
INTERNAL int itf14 ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* ITF-14 */
INTERNAL int dpleit ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* Deutsche Post Leitcode */
INTERNAL int dpident ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* Deutsche Post Identcode */
2021-06-19 13:11:23 +01:00
/* Code 93 - a re-working of Code 39+, generates 2 check digits */
Add compliant height, using ZINT_COMPLIANT_HEIGHT flag for back-compatibility
Rename barcode funcs to same as BARCODE_XXX name
library: barcode funcs array for dispatch, used for ZBarcode_ValidID() also
general: change is_sane() comparison to nonzero from ZINT_ERROR_INVALID_OPTION
MAILMARK: fuller error messages
CODABAR: add option to show check character in HRT
zint.h: use 0xNNNN for OR-able defines
GUI: add guard descent height reset button, add Zint version to window title,
static get_zint_version() method, use QStringLiteral (QSL shorthand),
use SIGNAL(toggled()), add errtxt "popup" and status bar, add icons,
add saveAs shortcut, add main menu, context menus and actions, add help,
reset_view() -> reset_colours(), add copy to clipboard as EMF/GIF/PNG/TIF,
lessen triggering of update_preview(), shorten names of getters/setters,
simplify/shorten some update_preview() logic in switch,
CODEONE disable structapp for Version S
qzint.cpp: add on_errored signal, add missing getters, add test
2021-10-09 00:13:39 +01:00
INTERNAL int code93 ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ;
INTERNAL int code128 ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* Code 128 and NVE-18 */
INTERNAL int gs1_128 ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* EAN-128 (GS1-128) */
INTERNAL int code11 ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* Code 11 */
INTERNAL int msi_plessey ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* MSI Plessey */
2020-12-23 10:57:24 +00:00
INTERNAL int telepen ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* Telepen ASCII */
INTERNAL int telepen_num ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* Telepen Numeric */
INTERNAL int plessey ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* Plessey Code */
Add compliant height, using ZINT_COMPLIANT_HEIGHT flag for back-compatibility
Rename barcode funcs to same as BARCODE_XXX name
library: barcode funcs array for dispatch, used for ZBarcode_ValidID() also
general: change is_sane() comparison to nonzero from ZINT_ERROR_INVALID_OPTION
MAILMARK: fuller error messages
CODABAR: add option to show check character in HRT
zint.h: use 0xNNNN for OR-able defines
GUI: add guard descent height reset button, add Zint version to window title,
static get_zint_version() method, use QStringLiteral (QSL shorthand),
use SIGNAL(toggled()), add errtxt "popup" and status bar, add icons,
add saveAs shortcut, add main menu, context menus and actions, add help,
reset_view() -> reset_colours(), add copy to clipboard as EMF/GIF/PNG/TIF,
lessen triggering of update_preview(), shorten names of getters/setters,
simplify/shorten some update_preview() logic in switch,
CODEONE disable structapp for Version S
qzint.cpp: add on_errored signal, add missing getters, add test
2021-10-09 00:13:39 +01:00
INTERNAL int pharma ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* Pharmacode One Track */
INTERNAL int flat ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* Flattermarken */
2019-12-19 00:37:55 +00:00
INTERNAL int fim ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* Facing Identification Mark */
INTERNAL int pharma_two ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* Pharmacode Two Track */
Add compliant height, using ZINT_COMPLIANT_HEIGHT flag for back-compatibility
Rename barcode funcs to same as BARCODE_XXX name
library: barcode funcs array for dispatch, used for ZBarcode_ValidID() also
general: change is_sane() comparison to nonzero from ZINT_ERROR_INVALID_OPTION
MAILMARK: fuller error messages
CODABAR: add option to show check character in HRT
zint.h: use 0xNNNN for OR-able defines
GUI: add guard descent height reset button, add Zint version to window title,
static get_zint_version() method, use QStringLiteral (QSL shorthand),
use SIGNAL(toggled()), add errtxt "popup" and status bar, add icons,
add saveAs shortcut, add main menu, context menus and actions, add help,
reset_view() -> reset_colours(), add copy to clipboard as EMF/GIF/PNG/TIF,
lessen triggering of update_preview(), shorten names of getters/setters,
simplify/shorten some update_preview() logic in switch,
CODEONE disable structapp for Version S
qzint.cpp: add on_errored signal, add missing getters, add test
2021-10-09 00:13:39 +01:00
INTERNAL int postnet ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* Postnet */
INTERNAL int planet ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* PLANET */
2021-06-19 13:11:23 +01:00
/* Intelligent Mail (aka USPS OneCode) */
Add compliant height, using ZINT_COMPLIANT_HEIGHT flag for back-compatibility
Rename barcode funcs to same as BARCODE_XXX name
library: barcode funcs array for dispatch, used for ZBarcode_ValidID() also
general: change is_sane() comparison to nonzero from ZINT_ERROR_INVALID_OPTION
MAILMARK: fuller error messages
CODABAR: add option to show check character in HRT
zint.h: use 0xNNNN for OR-able defines
GUI: add guard descent height reset button, add Zint version to window title,
static get_zint_version() method, use QStringLiteral (QSL shorthand),
use SIGNAL(toggled()), add errtxt "popup" and status bar, add icons,
add saveAs shortcut, add main menu, context menus and actions, add help,
reset_view() -> reset_colours(), add copy to clipboard as EMF/GIF/PNG/TIF,
lessen triggering of update_preview(), shorten names of getters/setters,
simplify/shorten some update_preview() logic in switch,
CODEONE disable structapp for Version S
qzint.cpp: add on_errored signal, add missing getters, add test
2021-10-09 00:13:39 +01:00
INTERNAL int usps_imail ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ;
INTERNAL int rm4scc ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* RM4SCC */
INTERNAL int auspost ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* Australia Post 4-state */
2020-12-23 10:57:24 +00:00
INTERNAL int code16k ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* Code 16k */
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
INTERNAL int pdf417 ( struct zint_symbol * symbol , struct zint_seg segs [ ] , const int seg_count ) ; /* PDF417 */
INTERNAL int micropdf417 ( struct zint_symbol * symbol , struct zint_seg segs [ ] , const int seg_count ) ; /* Micro PDF417 */
INTERNAL int maxicode ( struct zint_symbol * symbol , struct zint_seg segs [ ] , const int seg_count ) ; /* Maxicode */
INTERNAL int dbar_omn ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* DataBar Omnidirectional */
INTERNAL int dbar_ltd ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* DataBar Limited */
INTERNAL int dbar_exp ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* DataBar Expanded */
2019-12-19 00:37:55 +00:00
INTERNAL int composite ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* Composite Symbology */
Add compliant height, using ZINT_COMPLIANT_HEIGHT flag for back-compatibility
Rename barcode funcs to same as BARCODE_XXX name
library: barcode funcs array for dispatch, used for ZBarcode_ValidID() also
general: change is_sane() comparison to nonzero from ZINT_ERROR_INVALID_OPTION
MAILMARK: fuller error messages
CODABAR: add option to show check character in HRT
zint.h: use 0xNNNN for OR-able defines
GUI: add guard descent height reset button, add Zint version to window title,
static get_zint_version() method, use QStringLiteral (QSL shorthand),
use SIGNAL(toggled()), add errtxt "popup" and status bar, add icons,
add saveAs shortcut, add main menu, context menus and actions, add help,
reset_view() -> reset_colours(), add copy to clipboard as EMF/GIF/PNG/TIF,
lessen triggering of update_preview(), shorten names of getters/setters,
simplify/shorten some update_preview() logic in switch,
CODEONE disable structapp for Version S
qzint.cpp: add on_errored signal, add missing getters, add test
2021-10-09 00:13:39 +01:00
INTERNAL int kix ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* TNT KIX Code */
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
INTERNAL int aztec ( struct zint_symbol * symbol , struct zint_seg segs [ ] , const int seg_count ) ; /* Aztec Code */
2019-12-19 00:37:55 +00:00
INTERNAL int code32 ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* Italian Pharmacode */
Add compliant height, using ZINT_COMPLIANT_HEIGHT flag for back-compatibility
Rename barcode funcs to same as BARCODE_XXX name
library: barcode funcs array for dispatch, used for ZBarcode_ValidID() also
general: change is_sane() comparison to nonzero from ZINT_ERROR_INVALID_OPTION
MAILMARK: fuller error messages
CODABAR: add option to show check character in HRT
zint.h: use 0xNNNN for OR-able defines
GUI: add guard descent height reset button, add Zint version to window title,
static get_zint_version() method, use QStringLiteral (QSL shorthand),
use SIGNAL(toggled()), add errtxt "popup" and status bar, add icons,
add saveAs shortcut, add main menu, context menus and actions, add help,
reset_view() -> reset_colours(), add copy to clipboard as EMF/GIF/PNG/TIF,
lessen triggering of update_preview(), shorten names of getters/setters,
simplify/shorten some update_preview() logic in switch,
CODEONE disable structapp for Version S
qzint.cpp: add on_errored signal, add missing getters, add test
2021-10-09 00:13:39 +01:00
INTERNAL int daft ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* DAFT Code */
INTERNAL int ean14 ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* EAN-14 */
INTERNAL int nve18 ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* NVE-18 */
2020-11-27 12:54:44 +00:00
INTERNAL int microqr ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* Micro QR Code */
Add compliant height, using ZINT_COMPLIANT_HEIGHT flag for back-compatibility
Rename barcode funcs to same as BARCODE_XXX name
library: barcode funcs array for dispatch, used for ZBarcode_ValidID() also
general: change is_sane() comparison to nonzero from ZINT_ERROR_INVALID_OPTION
MAILMARK: fuller error messages
CODABAR: add option to show check character in HRT
zint.h: use 0xNNNN for OR-able defines
GUI: add guard descent height reset button, add Zint version to window title,
static get_zint_version() method, use QStringLiteral (QSL shorthand),
use SIGNAL(toggled()), add errtxt "popup" and status bar, add icons,
add saveAs shortcut, add main menu, context menus and actions, add help,
reset_view() -> reset_colours(), add copy to clipboard as EMF/GIF/PNG/TIF,
lessen triggering of update_preview(), shorten names of getters/setters,
simplify/shorten some update_preview() logic in switch,
CODEONE disable structapp for Version S
qzint.cpp: add on_errored signal, add missing getters, add test
2021-10-09 00:13:39 +01:00
INTERNAL int azrune ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* Aztec Runes */
INTERNAL int koreapost ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* Korea Post */
INTERNAL int japanpost ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* Japanese Post */
INTERNAL int code49 ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* Code 49 */
INTERNAL int channel ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* Channel Code */
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
INTERNAL int codeone ( struct zint_symbol * symbol , struct zint_seg segs [ ] , const int seg_count ) ; /* Code One */
INTERNAL int gridmatrix ( struct zint_symbol * symbol , struct zint_seg segs [ ] , const int seg_count ) ; /* Grid Matrix */
INTERNAL int hanxin ( struct zint_symbol * symbol , struct zint_seg segs [ ] , const int seg_count ) ; /* Han Xin */
INTERNAL int dotcode ( struct zint_symbol * symbol , struct zint_seg segs [ ] , const int seg_count ) ; /* DotCode */
Add compliant height, using ZINT_COMPLIANT_HEIGHT flag for back-compatibility
Rename barcode funcs to same as BARCODE_XXX name
library: barcode funcs array for dispatch, used for ZBarcode_ValidID() also
general: change is_sane() comparison to nonzero from ZINT_ERROR_INVALID_OPTION
MAILMARK: fuller error messages
CODABAR: add option to show check character in HRT
zint.h: use 0xNNNN for OR-able defines
GUI: add guard descent height reset button, add Zint version to window title,
static get_zint_version() method, use QStringLiteral (QSL shorthand),
use SIGNAL(toggled()), add errtxt "popup" and status bar, add icons,
add saveAs shortcut, add main menu, context menus and actions, add help,
reset_view() -> reset_colours(), add copy to clipboard as EMF/GIF/PNG/TIF,
lessen triggering of update_preview(), shorten names of getters/setters,
simplify/shorten some update_preview() logic in switch,
CODEONE disable structapp for Version S
qzint.cpp: add on_errored signal, add missing getters, add test
2021-10-09 00:13:39 +01:00
INTERNAL int codablockf ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* Codablock */
2020-11-27 12:54:44 +00:00
INTERNAL int upnqr ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* UPNQR */
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
INTERNAL int qrcode ( struct zint_symbol * symbol , struct zint_seg segs [ ] , const int seg_count ) ; /* QR Code */
/* Data Matrix (IEC16022) */
INTERNAL int datamatrix ( struct zint_symbol * symbol , struct zint_seg segs [ ] , const int seg_count ) ;
2021-06-19 13:11:23 +01:00
/* VIN Code (Vehicle Identification Number) */
INTERNAL int vin ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ;
/* Royal Mail 4-state Mailmark */
INTERNAL int mailmark ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ;
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
INTERNAL int ultra ( struct zint_symbol * symbol , struct zint_seg segs [ ] , const int seg_count ) ; /* Ultracode */
INTERNAL int rmqr ( struct zint_symbol * symbol , struct zint_seg segs [ ] , const int seg_count ) ; /* rMQR */
Add compliant height, using ZINT_COMPLIANT_HEIGHT flag for back-compatibility
Rename barcode funcs to same as BARCODE_XXX name
library: barcode funcs array for dispatch, used for ZBarcode_ValidID() also
general: change is_sane() comparison to nonzero from ZINT_ERROR_INVALID_OPTION
MAILMARK: fuller error messages
CODABAR: add option to show check character in HRT
zint.h: use 0xNNNN for OR-able defines
GUI: add guard descent height reset button, add Zint version to window title,
static get_zint_version() method, use QStringLiteral (QSL shorthand),
use SIGNAL(toggled()), add errtxt "popup" and status bar, add icons,
add saveAs shortcut, add main menu, context menus and actions, add help,
reset_view() -> reset_colours(), add copy to clipboard as EMF/GIF/PNG/TIF,
lessen triggering of update_preview(), shorten names of getters/setters,
simplify/shorten some update_preview() logic in switch,
CODEONE disable structapp for Version S
qzint.cpp: add on_errored signal, add missing getters, add test
2021-10-09 00:13:39 +01:00
INTERNAL int dpd ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) ; /* DPD Code */
2019-12-19 00:37:55 +00:00
INTERNAL int plot_raster ( struct zint_symbol * symbol , int rotate_angle , int file_type ) ; /* Plot to PNG/BMP/PCX */
INTERNAL int plot_vector ( struct zint_symbol * symbol , int rotate_angle , int file_type ) ; /* Plot to EPS/EMF/SVG */
2021-06-19 13:11:23 +01:00
/* Prefix error message with Error/Warning */
2021-07-06 19:53:31 +01:00
STATIC_UNLESS_ZINT_TEST int error_tag ( struct zint_symbol * symbol , int error_number , const char * error_string ) {
2012-12-31 14:41:59 +01:00
2016-02-20 10:50:15 +00:00
if ( error_number ! = 0 ) {
2021-10-20 23:05:30 +01:00
static const char error_fmt [ ] = " Error %.93s " ; /* Truncate if too long */
static const char warn_fmt [ ] = " Warning %.91s " ; /* Truncate if too long */
2021-07-06 19:53:31 +01:00
const char * fmt = error_number > = ZINT_ERROR ? error_fmt : warn_fmt ;
2017-09-10 12:03:09 -03:00
char error_buffer [ 100 ] ;
2021-07-06 19:53:31 +01:00
2021-08-31 18:34:29 +01:00
if ( error_number < ZINT_ERROR & & symbol - > warn_level = = WARN_FAIL_ALL ) {
2021-07-06 19:53:31 +01:00
/* Convert to error equivalent */
if ( error_number = = ZINT_WARN_NONCOMPLIANT ) {
error_number = ZINT_ERROR_NONCOMPLIANT ;
} else if ( error_number = = ZINT_WARN_USES_ECI ) {
error_number = ZINT_ERROR_USES_ECI ;
} else { /* ZINT_WARN_INVALID_OPTION */
error_number = ZINT_ERROR_INVALID_OPTION ;
}
fmt = error_fmt ;
}
sprintf ( error_buffer , fmt , error_string ? error_string : symbol - > errtxt ) ;
strcpy ( symbol - > errtxt , error_buffer ) ;
2016-02-20 10:50:15 +00:00
}
2021-01-12 19:51:54 +00:00
return error_number ;
2009-11-22 15:38:15 +00:00
}
2016-02-20 10:50:15 +00:00
/* Output a hexadecimal representation of the rendered symbol */
2019-12-19 00:37:55 +00:00
static int dump_plot ( struct zint_symbol * symbol ) {
2016-02-20 10:50:15 +00:00
FILE * f ;
int i , r ;
char hex [ ] = { ' 0 ' , ' 1 ' , ' 2 ' , ' 3 ' , ' 4 ' , ' 5 ' , ' 6 ' , ' 7 ' , ' 8 ' ,
' 9 ' , ' A ' , ' B ' , ' C ' , ' D ' , ' E ' , ' F ' } ;
int space = 0 ;
2016-09-05 22:06:50 +01:00
2016-02-20 10:50:15 +00:00
if ( symbol - > output_options & BARCODE_STDOUT ) {
f = stdout ;
} else {
f = fopen ( symbol - > outfile , " w " ) ;
if ( ! f ) {
2017-07-27 16:01:53 +01:00
strcpy ( symbol - > errtxt , " 201: Could not open output file " ) ;
2016-02-20 10:50:15 +00:00
return ZINT_ERROR_FILE_ACCESS ;
}
}
for ( r = 0 ; r < symbol - > rows ; r + + ) {
2017-09-10 12:03:09 -03:00
int byt = 0 ;
2016-02-20 10:50:15 +00:00
for ( i = 0 ; i < symbol - > width ; i + + ) {
byt = byt < < 1 ;
2020-11-01 18:32:55 +00:00
if ( symbol - > symbology = = BARCODE_ULTRA ) {
if ( module_colour_is_set ( symbol , r , i ) ) {
byt + = 1 ;
}
} else {
if ( module_is_set ( symbol , r , i ) ) {
byt + = 1 ;
}
2016-02-20 10:50:15 +00:00
}
if ( ( ( i + 1 ) % 4 ) = = 0 ) {
fputc ( hex [ byt ] , f ) ;
space + + ;
2016-02-18 23:23:31 +00:00
byt = 0 ;
2016-02-20 10:50:15 +00:00
}
2020-08-04 22:22:26 +01:00
if ( space = = 2 & & i + 1 < symbol - > width ) {
2016-02-20 10:50:15 +00:00
fputc ( ' ' , f ) ;
2016-02-18 23:23:31 +00:00
space = 0 ;
2016-02-20 10:50:15 +00:00
}
}
2010-09-12 14:52:44 +01:00
2016-02-20 10:50:15 +00:00
if ( ( symbol - > width % 4 ) ! = 0 ) {
byt = byt < < ( 4 - ( symbol - > width % 4 ) ) ;
fputc ( hex [ byt ] , f ) ;
}
fputs ( " \n " , f ) ;
space = 0 ;
}
2010-09-12 14:52:44 +01:00
2016-02-20 10:50:15 +00:00
if ( symbol - > output_options & BARCODE_STDOUT ) {
fflush ( f ) ;
} else {
fclose ( f ) ;
}
return 0 ;
2010-09-12 14:52:44 +01:00
}
2021-10-20 23:05:30 +01:00
static const char TECHNETIUM [ ] = " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+% " ; /* Same as SILVER (CODE39) */
2016-02-20 10:50:15 +00:00
/* Process health industry bar code data */
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
static int hibc ( struct zint_symbol * symbol , struct zint_seg segs [ ] , const int seg_count ) {
unsigned char * source = segs [ 0 ] . source ;
int length = segs [ 0 ] . length ;
2020-11-27 12:54:44 +00:00
int i ;
Add compliant height, using ZINT_COMPLIANT_HEIGHT flag for back-compatibility
Rename barcode funcs to same as BARCODE_XXX name
library: barcode funcs array for dispatch, used for ZBarcode_ValidID() also
general: change is_sane() comparison to nonzero from ZINT_ERROR_INVALID_OPTION
MAILMARK: fuller error messages
CODABAR: add option to show check character in HRT
zint.h: use 0xNNNN for OR-able defines
GUI: add guard descent height reset button, add Zint version to window title,
static get_zint_version() method, use QStringLiteral (QSL shorthand),
use SIGNAL(toggled()), add errtxt "popup" and status bar, add icons,
add saveAs shortcut, add main menu, context menus and actions, add help,
reset_view() -> reset_colours(), add copy to clipboard as EMF/GIF/PNG/TIF,
lessen triggering of update_preview(), shorten names of getters/setters,
simplify/shorten some update_preview() logic in switch,
CODEONE disable structapp for Version S
qzint.cpp: add on_errored signal, add missing getters, add test
2021-10-09 00:13:39 +01:00
int counter , error_number = 0 ;
2021-10-20 23:05:30 +01:00
char to_process [ 110 + 2 + 1 ] ;
int posns [ 110 ] ;
2016-02-20 10:50:15 +00:00
2016-10-26 19:34:21 +02:00
/* without "+" and check: max 110 characters in HIBC 2.6 */
if ( length > 110 ) {
2021-07-06 19:53:31 +01:00
strcpy ( symbol - > errtxt , " 202: Data too long for HIBC LIC (110 character maximum) " ) ;
2016-02-20 10:50:15 +00:00
return ZINT_ERROR_TOO_LONG ;
}
2021-10-20 23:05:30 +01:00
to_upper ( source , length ) ;
if ( ! is_sane_lookup ( TECHNETIUM , sizeof ( TECHNETIUM ) - 1 , source , length , posns ) ) {
2021-07-06 19:53:31 +01:00
strcpy ( symbol - > errtxt , " 203: Invalid character in data (alphanumerics, space and \" -.$/+% \" only) " ) ;
Add compliant height, using ZINT_COMPLIANT_HEIGHT flag for back-compatibility
Rename barcode funcs to same as BARCODE_XXX name
library: barcode funcs array for dispatch, used for ZBarcode_ValidID() also
general: change is_sane() comparison to nonzero from ZINT_ERROR_INVALID_OPTION
MAILMARK: fuller error messages
CODABAR: add option to show check character in HRT
zint.h: use 0xNNNN for OR-able defines
GUI: add guard descent height reset button, add Zint version to window title,
static get_zint_version() method, use QStringLiteral (QSL shorthand),
use SIGNAL(toggled()), add errtxt "popup" and status bar, add icons,
add saveAs shortcut, add main menu, context menus and actions, add help,
reset_view() -> reset_colours(), add copy to clipboard as EMF/GIF/PNG/TIF,
lessen triggering of update_preview(), shorten names of getters/setters,
simplify/shorten some update_preview() logic in switch,
CODEONE disable structapp for Version S
qzint.cpp: add on_errored signal, add missing getters, add test
2021-10-09 00:13:39 +01:00
return ZINT_ERROR_INVALID_DATA ;
2016-02-20 10:50:15 +00:00
}
counter = 41 ;
for ( i = 0 ; i < length ; i + + ) {
2021-10-20 23:05:30 +01:00
counter + = posns [ i ] ;
2016-02-20 10:50:15 +00:00
}
counter = counter % 43 ;
2020-11-01 18:32:55 +00:00
to_process [ 0 ] = ' + ' ;
memcpy ( to_process + 1 , source , length ) ;
2021-10-20 23:05:30 +01:00
to_process [ + + length ] = TECHNETIUM [ counter ] ;
to_process [ + + length ] = ' \0 ' ;
2016-02-20 10:50:15 +00:00
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
segs [ 0 ] . source = ( unsigned char * ) to_process ;
segs [ 0 ] . length = length ;
2016-02-20 10:50:15 +00:00
switch ( symbol - > symbology ) {
case BARCODE_HIBC_128 :
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
error_number = code128 ( symbol , segs [ 0 ] . source , segs [ 0 ] . length ) ;
2020-11-01 18:32:55 +00:00
ustrcpy ( symbol - > text , " * " ) ;
ustrcat ( symbol - > text , to_process ) ;
ustrcat ( symbol - > text , " * " ) ;
2016-02-20 10:50:15 +00:00
break ;
case BARCODE_HIBC_39 :
symbol - > option_2 = 0 ;
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
error_number = code39 ( symbol , segs [ 0 ] . source , segs [ 0 ] . length ) ;
2020-11-01 18:32:55 +00:00
ustrcpy ( symbol - > text , " * " ) ;
ustrcat ( symbol - > text , to_process ) ;
ustrcat ( symbol - > text , " * " ) ;
2016-02-20 10:50:15 +00:00
break ;
case BARCODE_HIBC_DM :
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
error_number = datamatrix ( symbol , segs , seg_count ) ;
2016-02-20 10:50:15 +00:00
break ;
case BARCODE_HIBC_QR :
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
error_number = qrcode ( symbol , segs , seg_count ) ;
2016-02-20 10:50:15 +00:00
break ;
case BARCODE_HIBC_PDF :
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
error_number = pdf417 ( symbol , segs , seg_count ) ;
2016-02-20 10:50:15 +00:00
break ;
case BARCODE_HIBC_MICPDF :
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
error_number = micropdf417 ( symbol , segs , seg_count ) ;
2016-02-20 10:50:15 +00:00
break ;
case BARCODE_HIBC_AZTEC :
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
error_number = aztec ( symbol , segs , seg_count ) ;
2016-02-20 10:50:15 +00:00
break ;
2016-08-24 19:37:49 +01:00
case BARCODE_HIBC_BLOCKF :
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
error_number = codablockf ( symbol , segs [ 0 ] . source , segs [ 0 ] . length ) ;
2016-08-24 19:37:49 +01:00
break ;
2016-02-20 10:50:15 +00:00
}
return error_number ;
2009-11-22 15:38:15 +00:00
}
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
/* Returns 1 if symbology MUST have GS1 data */
2019-10-06 11:30:21 +01:00
static int check_force_gs1 ( const int symbology ) {
2019-12-01 14:09:46 +00:00
2016-02-20 10:50:15 +00:00
switch ( symbology ) {
2020-07-29 20:43:08 +01:00
case BARCODE_GS1_128 :
2019-10-17 10:06:21 +01:00
case BARCODE_EAN14 :
case BARCODE_NVE18 :
2020-07-29 20:43:08 +01:00
case BARCODE_DBAR_EXP :
case BARCODE_DBAR_EXPSTK :
2021-07-06 19:53:31 +01:00
return 1 ;
2019-10-06 11:30:21 +01:00
break ;
}
2019-12-01 14:09:46 +00:00
2021-07-06 19:53:31 +01:00
return is_composite ( symbology ) ;
2019-10-06 11:30:21 +01:00
}
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
/* Returns 1 if symbology supports GS1 data */
2019-10-06 11:30:21 +01:00
static int gs1_compliant ( const int symbology ) {
switch ( symbology ) {
2016-02-20 10:50:15 +00:00
case BARCODE_CODE16K :
case BARCODE_AZTEC :
case BARCODE_DATAMATRIX :
case BARCODE_CODE49 :
case BARCODE_QRCODE :
2016-07-25 22:52:29 +01:00
case BARCODE_DOTCODE :
Add Structured Append support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, MAXICODE, MICROPDF417, PDF417, QRCODE, ULTRA
DOTCODE: use pre-calculated generator poly coeffs in Reed-Solomon for
performance improvement
PDF417/MICROPDF417: use common routine pdf417_initial()
GUI: code lines <= 118, shorthand widget_obj(),
shorten calling upcean_addon_gap(), upcean_guard_descent()
various backend: var name debug -> debug_print
2021-09-28 21:42:44 +01:00
case BARCODE_CODEONE :
2020-04-07 17:41:21 +01:00
case BARCODE_ULTRA :
Add Structured Append support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, MAXICODE, MICROPDF417, PDF417, QRCODE, ULTRA
DOTCODE: use pre-calculated generator poly coeffs in Reed-Solomon for
performance improvement
PDF417/MICROPDF417: use common routine pdf417_initial()
GUI: code lines <= 118, shorthand widget_obj(),
shorten calling upcean_addon_gap(), upcean_guard_descent()
various backend: var name debug -> debug_print
2021-09-28 21:42:44 +01:00
case BARCODE_RMQR :
// TODO: case BARCODE_CODABLOCKF:
// TODO: case BARCODE_HANXIN:
// TODO: case BARCODE_GRIDMATRIX:
2021-07-06 19:53:31 +01:00
return 1 ;
2016-02-20 10:50:15 +00:00
break ;
}
2021-07-06 19:53:31 +01:00
return check_force_gs1 ( symbology ) ;
2009-11-22 15:38:15 +00:00
}
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
/* Returns 1 if symbology can encode the ECI character */
2016-08-16 12:43:41 +01:00
static int supports_eci ( const int symbology ) {
2016-09-05 22:06:50 +01:00
2016-08-16 12:43:41 +01:00
switch ( symbology ) {
case BARCODE_AZTEC :
case BARCODE_DATAMATRIX :
case BARCODE_MAXICODE :
case BARCODE_MICROPDF417 :
case BARCODE_PDF417 :
2020-07-29 22:35:31 +01:00
case BARCODE_PDF417COMP :
2016-08-16 12:43:41 +01:00
case BARCODE_QRCODE :
case BARCODE_DOTCODE :
2021-02-05 23:55:24 +00:00
case BARCODE_CODEONE :
2016-08-16 12:43:41 +01:00
case BARCODE_GRIDMATRIX :
case BARCODE_HANXIN :
2019-03-21 09:14:24 +00:00
case BARCODE_ULTRA :
2021-08-20 16:50:39 +01:00
case BARCODE_RMQR :
2021-07-06 19:53:31 +01:00
return 1 ;
2016-08-16 12:43:41 +01:00
break ;
}
2016-09-05 22:06:50 +01:00
2021-07-06 19:53:31 +01:00
return 0 ;
2016-08-16 12:43:41 +01:00
}
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
/* Returns 1 if symbology is Health Industry Bar Code */
static int is_hibc ( const int symbology ) {
switch ( symbology ) {
case BARCODE_HIBC_128 :
case BARCODE_HIBC_39 :
case BARCODE_HIBC_DM :
case BARCODE_HIBC_QR :
case BARCODE_HIBC_PDF :
case BARCODE_HIBC_MICPDF :
case BARCODE_HIBC_BLOCKF :
case BARCODE_HIBC_AZTEC :
return 1 ;
break ;
}
return 0 ;
}
/* Returns 1 if symbology supports HRT */
2020-09-30 12:19:12 +01:00
static int has_hrt ( const int symbology ) {
if ( is_fixed_ratio ( symbology ) ) {
return 0 ;
}
switch ( symbology ) { /* These don't support HRT */
case BARCODE_CODE16K :
case BARCODE_CODE49 :
case BARCODE_FLAT :
case BARCODE_POSTNET :
case BARCODE_FIM :
case BARCODE_PHARMA :
case BARCODE_PHARMA_TWO :
case BARCODE_PDF417 :
case BARCODE_PDF417COMP :
case BARCODE_AUSPOST :
case BARCODE_AUSREPLY :
case BARCODE_AUSROUTE :
case BARCODE_AUSREDIRECT :
case BARCODE_RM4SCC :
case BARCODE_CODABLOCKF :
case BARCODE_JAPANPOST :
case BARCODE_DBAR_STK :
case BARCODE_DBAR_OMNSTK :
case BARCODE_DBAR_EXPSTK :
case BARCODE_PLANET :
case BARCODE_MICROPDF417 :
case BARCODE_USPS_IMAIL :
case BARCODE_KIX :
case BARCODE_DAFT :
case BARCODE_HIBC_PDF :
case BARCODE_HIBC_MICPDF :
case BARCODE_HIBC_BLOCKF :
case BARCODE_MAILMARK :
case BARCODE_DBAR_STK_CC :
case BARCODE_DBAR_OMNSTK_CC :
case BARCODE_DBAR_EXPSTK_CC :
return 0 ;
break ;
}
return 1 ;
}
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
/* Suppress warning ISO C forbids initialization between function pointer and ‘ void *’ */
# if defined(__GNUC__) || defined(__clang__)
# pragma GCC diagnostic push
# pragma GCC diagnostic ignored "-Wpedantic"
# endif
Add compliant height, using ZINT_COMPLIANT_HEIGHT flag for back-compatibility
Rename barcode funcs to same as BARCODE_XXX name
library: barcode funcs array for dispatch, used for ZBarcode_ValidID() also
general: change is_sane() comparison to nonzero from ZINT_ERROR_INVALID_OPTION
MAILMARK: fuller error messages
CODABAR: add option to show check character in HRT
zint.h: use 0xNNNN for OR-able defines
GUI: add guard descent height reset button, add Zint version to window title,
static get_zint_version() method, use QStringLiteral (QSL shorthand),
use SIGNAL(toggled()), add errtxt "popup" and status bar, add icons,
add saveAs shortcut, add main menu, context menus and actions, add help,
reset_view() -> reset_colours(), add copy to clipboard as EMF/GIF/PNG/TIF,
lessen triggering of update_preview(), shorten names of getters/setters,
simplify/shorten some update_preview() logic in switch,
CODEONE disable structapp for Version S
qzint.cpp: add on_errored signal, add missing getters, add test
2021-10-09 00:13:39 +01:00
/* Used for dispatching barcodes and for whether symbol id valid */
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
typedef int ( * barcode_segs_func_t ) ( struct zint_symbol * , struct zint_seg [ ] , const int ) ;
typedef int ( * barcode_func_t ) ( struct zint_symbol * , unsigned char [ ] , int ) ;
static const void * barcode_funcs [ BARCODE_LAST + 1 ] = {
Add compliant height, using ZINT_COMPLIANT_HEIGHT flag for back-compatibility
Rename barcode funcs to same as BARCODE_XXX name
library: barcode funcs array for dispatch, used for ZBarcode_ValidID() also
general: change is_sane() comparison to nonzero from ZINT_ERROR_INVALID_OPTION
MAILMARK: fuller error messages
CODABAR: add option to show check character in HRT
zint.h: use 0xNNNN for OR-able defines
GUI: add guard descent height reset button, add Zint version to window title,
static get_zint_version() method, use QStringLiteral (QSL shorthand),
use SIGNAL(toggled()), add errtxt "popup" and status bar, add icons,
add saveAs shortcut, add main menu, context menus and actions, add help,
reset_view() -> reset_colours(), add copy to clipboard as EMF/GIF/PNG/TIF,
lessen triggering of update_preview(), shorten names of getters/setters,
simplify/shorten some update_preview() logic in switch,
CODEONE disable structapp for Version S
qzint.cpp: add on_errored signal, add missing getters, add test
2021-10-09 00:13:39 +01:00
NULL , code11 , c25standard , c25inter , c25iata , /*0-4*/
NULL , c25logic , c25ind , code39 , excode39 , /*5-9*/
NULL , NULL , NULL , eanx , eanx , /*10-14*/
NULL , gs1_128 , NULL , codabar , NULL , /*15-19*/
code128 , dpleit , dpident , code16k , code49 , /*20-24*/
code93 , NULL , NULL , flat , dbar_omn , /*25-29*/
dbar_ltd , dbar_exp , telepen , NULL , eanx , /*30-34*/
eanx , NULL , eanx , eanx , NULL , /*35-39*/
postnet , NULL , NULL , NULL , NULL , /*40-44*/
NULL , NULL , msi_plessey , NULL , fim , /*45-49*/
code39 , pharma , pzn , pharma_two , NULL , /*50-54*/
pdf417 , pdf417 , maxicode , qrcode , NULL , /*55-59*/
code128 , NULL , NULL , auspost , NULL , /*60-64*/
NULL , auspost , auspost , auspost , eanx , /*65-69*/
rm4scc , datamatrix , ean14 , vin , codablockf , /*70-74*/
nve18 , japanpost , koreapost , NULL , dbar_omn , /*75-79*/
dbar_omn , dbar_exp , planet , NULL , micropdf417 , /*80-84*/
usps_imail , plessey , telepen_num , NULL , itf14 , /*85-89*/
kix , NULL , aztec , daft , NULL , /*90-94*/
NULL , dpd , microqr , hibc , hibc , /*95-99*/
NULL , NULL , hibc , NULL , hibc , /*100-104*/
NULL , hibc , NULL , hibc , NULL , /*105-109*/
hibc , NULL , hibc , NULL , NULL , /*110-114*/
dotcode , hanxin , NULL , NULL , NULL , /*115-119*/
NULL , mailmark , NULL , NULL , NULL , /*120-124*/
NULL , NULL , NULL , azrune , code32 , /*125-129*/
composite , composite , composite , composite , composite , /*130-134*/
composite , composite , composite , composite , composite , /*135-139*/
channel , codeone , gridmatrix , upnqr , ultra , /*140-144*/
rmqr ,
} ;
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
static int reduced_charset ( struct zint_symbol * symbol , struct zint_seg segs [ ] , const int seg_count ) ;
2019-11-27 16:16:14 +00:00
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
static int extended_or_reduced_charset ( struct zint_symbol * symbol , struct zint_seg segs [ ] , const int seg_count ) {
2016-02-20 10:50:15 +00:00
int error_number = 0 ;
2019-11-27 16:16:14 +00:00
2016-02-20 10:50:15 +00:00
switch ( symbol - > symbology ) {
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
/* These are the "elite" standards which have support for specific character sets + ECI */
Add compliant height, using ZINT_COMPLIANT_HEIGHT flag for back-compatibility
Rename barcode funcs to same as BARCODE_XXX name
library: barcode funcs array for dispatch, used for ZBarcode_ValidID() also
general: change is_sane() comparison to nonzero from ZINT_ERROR_INVALID_OPTION
MAILMARK: fuller error messages
CODABAR: add option to show check character in HRT
zint.h: use 0xNNNN for OR-able defines
GUI: add guard descent height reset button, add Zint version to window title,
static get_zint_version() method, use QStringLiteral (QSL shorthand),
use SIGNAL(toggled()), add errtxt "popup" and status bar, add icons,
add saveAs shortcut, add main menu, context menus and actions, add help,
reset_view() -> reset_colours(), add copy to clipboard as EMF/GIF/PNG/TIF,
lessen triggering of update_preview(), shorten names of getters/setters,
simplify/shorten some update_preview() logic in switch,
CODEONE disable structapp for Version S
qzint.cpp: add on_errored signal, add missing getters, add test
2021-10-09 00:13:39 +01:00
case BARCODE_QRCODE :
case BARCODE_GRIDMATRIX :
case BARCODE_HANXIN :
case BARCODE_RMQR :
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
error_number = ( * ( barcode_segs_func_t ) barcode_funcs [ symbol - > symbology ] ) ( symbol , segs , seg_count ) ;
2019-11-25 19:08:25 +00:00
break ;
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
/* These are the standards which have support for specific character sets but not ECI */
case BARCODE_MICROQR :
case BARCODE_UPNQR :
error_number = ( * ( barcode_func_t ) barcode_funcs [ symbol - > symbology ] ) ( symbol , segs [ 0 ] . source ,
segs [ 0 ] . length ) ;
break ;
default : error_number = reduced_charset ( symbol , segs , seg_count ) ;
2019-11-27 16:16:14 +00:00
break ;
2016-02-20 10:50:15 +00:00
}
2009-11-22 15:38:15 +00:00
2016-02-20 10:50:15 +00:00
return error_number ;
2009-11-22 15:38:15 +00:00
}
Add compliant height, using ZINT_COMPLIANT_HEIGHT flag for back-compatibility
Rename barcode funcs to same as BARCODE_XXX name
library: barcode funcs array for dispatch, used for ZBarcode_ValidID() also
general: change is_sane() comparison to nonzero from ZINT_ERROR_INVALID_OPTION
MAILMARK: fuller error messages
CODABAR: add option to show check character in HRT
zint.h: use 0xNNNN for OR-able defines
GUI: add guard descent height reset button, add Zint version to window title,
static get_zint_version() method, use QStringLiteral (QSL shorthand),
use SIGNAL(toggled()), add errtxt "popup" and status bar, add icons,
add saveAs shortcut, add main menu, context menus and actions, add help,
reset_view() -> reset_colours(), add copy to clipboard as EMF/GIF/PNG/TIF,
lessen triggering of update_preview(), shorten names of getters/setters,
simplify/shorten some update_preview() logic in switch,
CODEONE disable structapp for Version S
qzint.cpp: add on_errored signal, add missing getters, add test
2021-10-09 00:13:39 +01:00
/* These are the "norm" standards which only support Latin-1 at most, though a few support ECI */
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
static int reduced_charset ( struct zint_symbol * symbol , struct zint_seg segs [ ] , const int seg_count ) {
2016-02-20 10:50:15 +00:00
int error_number = 0 ;
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
int i ;
2016-02-20 10:50:15 +00:00
2009-11-22 15:38:15 +00:00
# ifndef _MSC_VER
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
struct zint_seg local_segs [ seg_count ] ;
int convertible [ seg_count ] ;
2009-11-22 15:38:15 +00:00
# else
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
struct zint_seg * local_segs = ( struct zint_seg * ) _alloca ( sizeof ( struct zint_seg ) * seg_count ) ;
int * convertible = ( int * ) _alloca ( sizeof ( int ) * seg_count ) ;
# endif
if ( ( symbol - > input_mode & 0x07 ) = = UNICODE_MODE & & is_eci_convertible_segs ( segs , seg_count , convertible ) ) {
unsigned char * preprocessed ;
const int eci_length_segs = get_eci_length_segs ( segs , seg_count ) ;
# ifndef _MSC_VER
unsigned char preprocessed_buf [ eci_length_segs + seg_count ] ;
# else
unsigned char * preprocessed_buf = ( unsigned char * ) _alloca ( eci_length_segs + seg_count ) ;
2009-11-22 15:38:15 +00:00
# endif
2019-12-01 14:09:46 +00:00
2020-10-26 12:21:43 +00:00
/* Prior check ensures ECI only set for those that support it */
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
segs_cpy ( segs , seg_count , local_segs ) ; /* Shallow copy (needed to set default ECIs) */
2020-10-26 12:21:43 +00:00
preprocessed = preprocessed_buf ;
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
for ( i = 0 ; i < seg_count ; i + + ) {
if ( convertible [ i ] ) {
error_number = utf8_to_eci ( local_segs [ i ] . eci , local_segs [ i ] . source , preprocessed ,
& local_segs [ i ] . length ) ;
if ( error_number ! = 0 ) {
if ( local_segs [ i ] . eci ) {
sprintf ( symbol - > errtxt , " 244: Invalid character in input data for ECI %d " , local_segs [ i ] . eci ) ;
} else {
strcpy ( symbol - > errtxt , " 204: Invalid character in input data (ISO/IEC 8859-1 only) " ) ;
}
return error_number ;
}
local_segs [ i ] . source = preprocessed ;
preprocessed + = local_segs [ i ] . length + 1 ;
2021-07-06 19:53:31 +01:00
}
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
}
if ( supports_eci ( symbol - > symbology ) | | is_hibc ( symbol - > symbology ) ) {
error_number = ( * ( barcode_segs_func_t ) barcode_funcs [ symbol - > symbology ] ) ( symbol , local_segs , seg_count ) ;
} else {
error_number = ( * ( barcode_func_t ) barcode_funcs [ symbol - > symbology ] ) ( symbol , local_segs [ 0 ] . source ,
local_segs [ 0 ] . length ) ;
}
} else {
if ( supports_eci ( symbol - > symbology ) | | is_hibc ( symbol - > symbology ) ) {
segs_cpy ( segs , seg_count , local_segs ) ; /* Shallow copy (needed to set default ECIs) */
error_number = ( * ( barcode_segs_func_t ) barcode_funcs [ symbol - > symbology ] ) ( symbol , local_segs , seg_count ) ;
} else {
error_number = ( * ( barcode_func_t ) barcode_funcs [ symbol - > symbology ] ) ( symbol , segs [ 0 ] . source ,
segs [ 0 ] . length ) ;
2020-10-26 12:21:43 +00:00
}
2016-02-20 10:50:15 +00:00
}
2019-12-01 14:09:46 +00:00
2016-02-20 10:50:15 +00:00
return error_number ;
2009-11-22 15:38:15 +00:00
}
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
# if defined(__GNUC__) || defined(__clang__)
# pragma GCC diagnostic pop
# endif
2021-06-10 16:20:14 +01:00
STATIC_UNLESS_ZINT_TEST void strip_bom ( unsigned char * source , int * input_length ) {
2017-10-09 19:59:02 +01:00
int i ;
2017-10-23 21:37:52 +02:00
2021-01-12 19:51:54 +00:00
/* Note if BOM is only data then not stripped */
if ( * input_length > 3 & & ( source [ 0 ] = = 0xef ) & & ( source [ 1 ] = = 0xbb ) & & ( source [ 2 ] = = 0xbf ) ) {
/* BOM at start of input data, strip in accordance with RFC 3629 */
for ( i = 3 ; i < = * input_length ; i + + ) { /* Include terminating NUL */
source [ i - 3 ] = source [ i ] ;
2017-10-09 19:59:02 +01:00
}
2021-01-12 19:51:54 +00:00
* input_length - = 3 ;
2017-10-09 19:59:02 +01:00
}
}
2021-12-08 18:12:20 +00:00
STATIC_UNLESS_ZINT_TEST int escape_char_process ( struct zint_symbol * symbol , unsigned char * input_string ,
int * length ) {
2017-10-21 12:45:50 +01:00
int in_posn , out_posn ;
int hex1 , hex2 ;
2020-08-04 11:48:43 +01:00
int i , unicode ;
2017-10-21 12:45:50 +01:00
# ifndef _MSC_VER
unsigned char escaped_string [ * length + 1 ] ;
# else
2021-05-15 12:23:46 +01:00
unsigned char * escaped_string = ( unsigned char * ) _alloca ( * length + 1 ) ;
2017-10-21 12:45:50 +01:00
# endif
in_posn = 0 ;
out_posn = 0 ;
2019-12-01 14:09:46 +00:00
2017-10-21 12:45:50 +01:00
do {
if ( input_string [ in_posn ] = = ' \\ ' ) {
2020-05-16 10:22:33 +01:00
if ( in_posn + 1 > = * length ) {
strcpy ( symbol - > errtxt , " 236: Incomplete escape character in input data " ) ;
return ZINT_ERROR_INVALID_DATA ;
}
2017-10-21 12:45:50 +01:00
switch ( input_string [ in_posn + 1 ] ) {
case ' 0 ' : escaped_string [ out_posn ] = 0x00 ; /* Null */
in_posn + = 2 ;
break ;
case ' E ' : escaped_string [ out_posn ] = 0x04 ; /* End of Transmission */
in_posn + = 2 ;
break ;
case ' a ' : escaped_string [ out_posn ] = 0x07 ; /* Bell */
in_posn + = 2 ;
break ;
case ' b ' : escaped_string [ out_posn ] = 0x08 ; /* Backspace */
in_posn + = 2 ;
break ;
case ' t ' : escaped_string [ out_posn ] = 0x09 ; /* Horizontal tab */
in_posn + = 2 ;
break ;
case ' n ' : escaped_string [ out_posn ] = 0x0a ; /* Line feed */
in_posn + = 2 ;
break ;
case ' v ' : escaped_string [ out_posn ] = 0x0b ; /* Vertical tab */
in_posn + = 2 ;
break ;
case ' f ' : escaped_string [ out_posn ] = 0x0c ; /* Form feed */
in_posn + = 2 ;
break ;
case ' r ' : escaped_string [ out_posn ] = 0x0d ; /* Carriage return */
in_posn + = 2 ;
break ;
case ' e ' : escaped_string [ out_posn ] = 0x1b ; /* Escape */
in_posn + = 2 ;
break ;
case ' G ' : escaped_string [ out_posn ] = 0x1d ; /* Group Separator */
in_posn + = 2 ;
break ;
case ' R ' : escaped_string [ out_posn ] = 0x1e ; /* Record Separator */
in_posn + = 2 ;
break ;
case ' x ' : if ( in_posn + 4 > * length ) {
strcpy ( symbol - > errtxt , " 232: Incomplete escape character in input data " ) ;
return ZINT_ERROR_INVALID_DATA ;
}
hex1 = ctoi ( input_string [ in_posn + 2 ] ) ;
hex2 = ctoi ( input_string [ in_posn + 3 ] ) ;
if ( ( hex1 > = 0 ) & & ( hex2 > = 0 ) ) {
2021-01-15 14:22:32 +00:00
escaped_string [ out_posn ] = ( hex1 < < 4 ) + hex2 ;
2017-10-21 12:45:50 +01:00
in_posn + = 4 ;
} else {
strcpy ( symbol - > errtxt , " 233: Corrupt escape character in input data " ) ;
return ZINT_ERROR_INVALID_DATA ;
}
break ;
case ' \\ ' : escaped_string [ out_posn ] = ' \\ ' ;
in_posn + = 2 ;
break ;
2020-08-04 11:48:43 +01:00
case ' u ' :
if ( in_posn + 6 > * length ) {
2021-01-15 14:22:32 +00:00
strcpy ( symbol - > errtxt , " 209: Incomplete Unicode escape character in input data " ) ;
2020-08-04 11:48:43 +01:00
return ZINT_ERROR_INVALID_DATA ;
}
unicode = 0 ;
for ( i = 0 ; i < 4 ; i + + ) {
if ( ctoi ( input_string [ in_posn + i + 2 ] ) = = - 1 ) {
2021-01-15 14:22:32 +00:00
strcpy ( symbol - > errtxt , " 211: Corrupt Unicode escape character in input data " ) ;
2020-08-04 11:48:43 +01:00
return ZINT_ERROR_INVALID_DATA ;
}
unicode = unicode < < 4 ;
unicode + = ctoi ( input_string [ in_posn + i + 2 ] ) ;
}
2021-01-15 14:22:32 +00:00
/* Exclude reversed BOM and surrogates */
if ( unicode = = 0xfffe | | ( unicode > = 0xd800 & & unicode < 0xe000 ) ) {
strcpy ( symbol - > errtxt , " 246: Invalid Unicode BMP escape character in input data " ) ;
return ZINT_ERROR_INVALID_DATA ;
}
2020-08-04 11:48:43 +01:00
if ( unicode > = 0x800 ) {
escaped_string [ out_posn ] = 0xe0 + ( ( unicode & 0xf000 ) > > 12 ) ;
out_posn + + ;
escaped_string [ out_posn ] = 0x80 + ( ( unicode & 0x0fc0 ) > > 6 ) ;
out_posn + + ;
escaped_string [ out_posn ] = 0x80 + ( unicode & 0x003f ) ;
} else if ( unicode > = 0x80 ) {
escaped_string [ out_posn ] = 0xc0 + ( ( unicode & 0x07c0 ) > > 6 ) ;
out_posn + + ;
escaped_string [ out_posn ] = 0x80 + ( unicode & 0x003f ) ;
} else {
escaped_string [ out_posn ] = unicode & 0x7f ;
}
in_posn + = 6 ;
break ;
2017-10-21 12:45:50 +01:00
default : strcpy ( symbol - > errtxt , " 234: Unrecognised escape character in input data " ) ;
return ZINT_ERROR_INVALID_DATA ;
break ;
}
} else {
escaped_string [ out_posn ] = input_string [ in_posn ] ;
in_posn + + ;
}
out_posn + + ;
} while ( in_posn < * length ) ;
2019-12-01 14:09:46 +00:00
2017-10-21 12:45:50 +01:00
memcpy ( input_string , escaped_string , out_posn ) ;
2018-01-13 15:45:26 +00:00
input_string [ out_posn ] = ' \0 ' ;
2017-10-21 12:45:50 +01:00
* length = out_posn ;
2019-12-01 14:09:46 +00:00
2021-07-06 19:53:31 +01:00
return 0 ;
2017-10-21 12:45:50 +01:00
}
2021-07-06 19:53:31 +01:00
/* Encode a barcode. If `length` is 0, `source` must be NUL-terminated. */
int ZBarcode_Encode ( struct zint_symbol * symbol , const unsigned char * source , int length ) {
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
struct zint_seg segs [ 1 ] ;
if ( ! symbol ) return ZINT_ERROR_INVALID_DATA ;
segs [ 0 ] . eci = symbol - > eci ;
segs [ 0 ] . source = ( unsigned char * ) source ;
segs [ 0 ] . length = length ;
return ZBarcode_Encode_Segs ( symbol , segs , 1 ) ;
}
/* Encode a barcode with multiple ECI segments. */
int ZBarcode_Encode_Segs ( struct zint_symbol * symbol , const struct zint_seg segs [ ] , const int seg_count ) {
int error_number , warn_number = 0 ;
int total_len = 0 ;
int have_zero_eci = 0 ;
int i ;
2021-01-11 18:11:41 +00:00
unsigned char * local_source ;
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
# ifndef _MSC_VER
struct zint_seg local_segs [ seg_count > 0 ? seg_count : 1 ] ;
# else
struct zint_seg * local_segs ;
unsigned char * local_sources ;
local_segs = ( struct zint_seg * ) _alloca ( sizeof ( struct zint_seg ) * ( seg_count > 0 ? seg_count : 1 ) ) ;
2015-08-18 13:50:42 +02:00
# endif
2020-09-30 12:19:12 +01:00
if ( ! symbol ) return ZINT_ERROR_INVALID_DATA ;
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
if ( segs = = NULL ) {
return error_tag ( symbol , ZINT_ERROR_INVALID_DATA , " 200: Input segments NULL " ) ;
}
if ( seg_count < = 0 ) {
return error_tag ( symbol , ZINT_ERROR_INVALID_DATA , " 205: Input segment count 0 " ) ;
}
if ( seg_count > ZINT_MAX_SEG_COUNT ) {
return error_tag ( symbol , ZINT_ERROR_INVALID_DATA , " 771: Too many input segments (max 256) " ) ;
}
/* Check segment lengths */
for ( i = 0 ; i < seg_count ; i + + ) {
local_segs [ i ] = segs [ i ] ;
if ( local_segs [ i ] . source = = NULL ) {
sprintf ( symbol - > errtxt , " 772: Input segment %d source NULL " , i ) ;
return error_tag ( symbol , ZINT_ERROR_INVALID_DATA , NULL ) ;
}
if ( local_segs [ i ] . length < = 0 ) {
local_segs [ i ] . length = ( int ) ustrlen ( local_segs [ i ] . source ) ;
}
if ( local_segs [ i ] . length < = 0 ) {
sprintf ( symbol - > errtxt , " 773: Input segment %d length zero " , i ) ;
return error_tag ( symbol , ZINT_ERROR_INVALID_DATA , NULL ) ;
}
if ( local_segs [ i ] . length > ZINT_MAX_DATA_LEN ) {
return error_tag ( symbol , ZINT_ERROR_TOO_LONG , " 777: Input data too long " ) ;
}
total_len + = local_segs [ i ] . length ;
}
2020-12-21 19:30:07 +00:00
if ( symbol - > debug & ZINT_DEBUG_PRINT ) {
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
printf ( " ZBarcode_Encode_Segs: symbology: %d, input_mode: 0x%X, ECI: %d, option_1: %d, option_2: %d, "
2021-05-28 14:37:57 +01:00
" option_3: %d, scale: %g \n output_options: 0x%X, fg: %s, bg: %s, "
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
" seg_count: %d, length[0] %d, " " First 10 source[0] \" %.*s \" , First 10 primary: \" %.10s \" \n " ,
2020-12-21 19:30:07 +00:00
symbol - > symbology , symbol - > input_mode , symbol - > eci , symbol - > option_1 , symbol - > option_2 ,
2021-05-28 14:37:57 +01:00
symbol - > option_3 , symbol - > scale , symbol - > output_options , symbol - > fgcolour , symbol - > bgcolour ,
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
seg_count , local_segs [ 0 ] . length , local_segs [ 0 ] . length < 10 ? local_segs [ 0 ] . length : 10 ,
local_segs [ 0 ] . source , symbol - > primary ) ;
2020-12-21 19:30:07 +00:00
}
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
if ( total_len > ZINT_MAX_DATA_LEN ) {
2021-07-06 19:53:31 +01:00
return error_tag ( symbol , ZINT_ERROR_TOO_LONG , " 243: Input data too long " ) ;
2020-12-21 19:30:07 +00:00
}
2016-02-20 10:50:15 +00:00
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
/* Reconcile symbol ECI and first segment ECI if both set */
if ( symbol - > eci ! = local_segs [ 0 ] . eci ) {
if ( symbol - > eci & & local_segs [ 0 ] . eci ) {
sprintf ( symbol - > errtxt , " 774: Symbol ECI %d must match segment zero ECI %d " , symbol - > eci ,
local_segs [ 0 ] . eci ) ;
return error_tag ( symbol , ZINT_ERROR_INVALID_OPTION , NULL ) ;
}
if ( symbol - > eci ) {
local_segs [ 0 ] . eci = symbol - > eci ;
} else {
symbol - > eci = local_segs [ 0 ] . eci ;
}
}
/* Check the symbology field */
2020-11-01 18:32:55 +00:00
if ( ! ZBarcode_ValidID ( symbol - > symbology ) ) {
2021-07-06 19:53:31 +01:00
int orig_symbology = symbol - > symbology ; /* For self-check */
2020-11-01 18:32:55 +00:00
if ( symbol - > symbology < 1 ) {
2021-07-06 19:53:31 +01:00
warn_number = error_tag ( symbol , ZINT_WARN_INVALID_OPTION , " 206: Symbology out of range " ) ;
if ( warn_number > = ZINT_ERROR ) {
return warn_number ;
2020-11-01 18:32:55 +00:00
}
2021-01-12 19:51:54 +00:00
symbol - > symbology = BARCODE_CODE128 ;
2021-07-06 19:53:31 +01:00
/* symbol->symbologys 1 to 126 are defined by tbarcode */
2020-11-01 18:32:55 +00:00
} else if ( symbol - > symbology = = 5 ) {
symbol - > symbology = BARCODE_C25STANDARD ;
} else if ( ( symbol - > symbology > = 10 ) & & ( symbol - > symbology < = 12 ) ) {
symbol - > symbology = BARCODE_EANX ;
} else if ( symbol - > symbology = = 15 ) {
symbol - > symbology = BARCODE_EANX ;
} else if ( symbol - > symbology = = 17 ) {
symbol - > symbology = BARCODE_UPCA ;
} else if ( symbol - > symbology = = 19 ) {
2021-07-06 19:53:31 +01:00
warn_number = error_tag ( symbol , ZINT_WARN_INVALID_OPTION , " 207: Codabar 18 not supported " ) ;
if ( warn_number > = ZINT_ERROR ) {
return warn_number ;
2020-11-01 18:32:55 +00:00
}
2021-01-12 19:51:54 +00:00
symbol - > symbology = BARCODE_CODABAR ;
2021-07-06 19:53:31 +01:00
} else if ( symbol - > symbology = = 26 ) { /* UPC-A up to tbarcode 9, ISSN for tbarcode 10+ */
2020-11-01 18:32:55 +00:00
symbol - > symbology = BARCODE_UPCA ;
2021-07-06 19:53:31 +01:00
} else if ( symbol - > symbology = = 27 ) { /* UPCD1 up to tbarcode 9, ISSN + 2 digit add-on for tbarcode 10+ */
return error_tag ( symbol , ZINT_ERROR_INVALID_OPTION , " 208: UPCD1 not supported " ) ;
2020-11-01 18:32:55 +00:00
} else if ( symbol - > symbology = = 33 ) {
symbol - > symbology = BARCODE_GS1_128 ;
} else if ( symbol - > symbology = = 36 ) {
symbol - > symbology = BARCODE_UPCA ;
2021-07-06 19:53:31 +01:00
} else if ( symbol - > symbology = = 39 ) {
symbol - > symbology = BARCODE_UPCE ;
2020-11-01 18:32:55 +00:00
} else if ( ( symbol - > symbology > = 41 ) & & ( symbol - > symbology < = 45 ) ) {
symbol - > symbology = BARCODE_POSTNET ;
} else if ( symbol - > symbology = = 46 ) {
symbol - > symbology = BARCODE_PLESSEY ;
} else if ( symbol - > symbology = = 48 ) {
symbol - > symbology = BARCODE_NVE18 ;
Add Structured Append support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, MAXICODE, MICROPDF417, PDF417, QRCODE, ULTRA
DOTCODE: use pre-calculated generator poly coeffs in Reed-Solomon for
performance improvement
PDF417/MICROPDF417: use common routine pdf417_initial()
GUI: code lines <= 118, shorthand widget_obj(),
shorten calling upcean_addon_gap(), upcean_guard_descent()
various backend: var name debug -> debug_print
2021-09-28 21:42:44 +01:00
} else if ( symbol - > symbology = = 54 ) { /* General Parcel up to tbarcode 9, Brazilian CEPNet for tbarcode 10+ */
2021-07-06 19:53:31 +01:00
warn_number = error_tag ( symbol , ZINT_WARN_INVALID_OPTION , " 210: General Parcel Code not supported " ) ;
if ( warn_number > = ZINT_ERROR ) {
return warn_number ;
2020-11-01 18:32:55 +00:00
}
2021-01-12 19:51:54 +00:00
symbol - > symbology = BARCODE_CODE128 ;
2020-11-01 18:32:55 +00:00
} else if ( ( symbol - > symbology = = 59 ) | | ( symbol - > symbology = = 61 ) ) {
2020-08-22 11:09:57 +01:00
symbol - > symbology = BARCODE_CODE128 ;
2020-11-01 18:32:55 +00:00
} else if ( symbol - > symbology = = 62 ) {
symbol - > symbology = BARCODE_CODE93 ;
} else if ( ( symbol - > symbology = = 64 ) | | ( symbol - > symbology = = 65 ) ) {
symbol - > symbology = BARCODE_AUSPOST ;
} else if ( symbol - > symbology = = 78 ) {
symbol - > symbology = BARCODE_DBAR_OMN ;
} else if ( symbol - > symbology = = 83 ) {
symbol - > symbology = BARCODE_PLANET ;
} else if ( symbol - > symbology = = 88 ) {
symbol - > symbology = BARCODE_GS1_128 ;
2021-07-06 19:53:31 +01:00
} else if ( symbol - > symbology = = 91 ) { /* BC412 up to tbarcode 9, Code 32 for tbarcode 10+ */
warn_number = error_tag ( symbol , ZINT_WARN_INVALID_OPTION , " 212: Symbology out of range " ) ;
if ( warn_number > = ZINT_ERROR ) {
return warn_number ;
2020-11-01 18:32:55 +00:00
}
2021-01-12 19:51:54 +00:00
symbol - > symbology = BARCODE_CODE128 ;
2020-11-01 18:32:55 +00:00
} else if ( ( symbol - > symbology > = 94 ) & & ( symbol - > symbology < = 95 ) ) {
2021-07-06 19:53:31 +01:00
warn_number = error_tag ( symbol , ZINT_WARN_INVALID_OPTION , " 213: Symbology out of range " ) ;
if ( warn_number > = ZINT_ERROR ) {
return warn_number ;
2020-11-01 18:32:55 +00:00
}
2021-01-12 19:51:54 +00:00
symbol - > symbology = BARCODE_CODE128 ;
2020-11-01 18:32:55 +00:00
} else if ( symbol - > symbology = = 100 ) {
symbol - > symbology = BARCODE_HIBC_128 ;
} else if ( symbol - > symbology = = 101 ) {
symbol - > symbology = BARCODE_HIBC_39 ;
} else if ( symbol - > symbology = = 103 ) {
symbol - > symbology = BARCODE_HIBC_DM ;
} else if ( symbol - > symbology = = 105 ) {
symbol - > symbology = BARCODE_HIBC_QR ;
} else if ( symbol - > symbology = = 107 ) {
symbol - > symbology = BARCODE_HIBC_PDF ;
} else if ( symbol - > symbology = = 109 ) {
symbol - > symbology = BARCODE_HIBC_MICPDF ;
} else if ( symbol - > symbology = = 111 ) {
symbol - > symbology = BARCODE_HIBC_BLOCKF ;
} else if ( ( symbol - > symbology = = 113 ) | | ( symbol - > symbology = = 114 ) ) {
2021-07-06 19:53:31 +01:00
warn_number = error_tag ( symbol , ZINT_WARN_INVALID_OPTION , " 214: Symbology out of range " ) ;
if ( warn_number > = ZINT_ERROR ) {
return warn_number ;
2020-11-01 18:32:55 +00:00
}
2021-01-12 19:51:54 +00:00
symbol - > symbology = BARCODE_CODE128 ;
2020-11-01 18:32:55 +00:00
} else if ( ( symbol - > symbology > = 117 ) & & ( symbol - > symbology < = 127 ) ) {
2021-07-06 19:53:31 +01:00
if ( symbol - > symbology ! = 121 ) { /* BARCODE_MAILMARK */
warn_number = error_tag ( symbol , ZINT_WARN_INVALID_OPTION , " 215: Symbology out of range " ) ;
if ( warn_number > = ZINT_ERROR ) {
return warn_number ;
2020-11-01 18:32:55 +00:00
}
2021-01-12 19:51:54 +00:00
symbol - > symbology = BARCODE_CODE128 ;
2020-11-01 18:32:55 +00:00
}
/* Everything from 128 up is Zint-specific */
2021-10-20 23:05:30 +01:00
} else if ( symbol - > symbology > BARCODE_LAST ) {
2021-07-06 19:53:31 +01:00
warn_number = error_tag ( symbol , ZINT_WARN_INVALID_OPTION , " 216: Symbology out of range " ) ;
if ( warn_number > = ZINT_ERROR ) {
return warn_number ;
2020-08-22 11:09:57 +01:00
}
2021-01-12 19:51:54 +00:00
symbol - > symbology = BARCODE_CODE128 ;
2021-07-06 19:53:31 +01:00
}
if ( symbol - > symbology = = orig_symbology ) { /* Should never happen */
return error_tag ( symbol , ZINT_ERROR_ENCODING_PROBLEM , " 000: Internal error " ) ; /* Not reached */
2020-08-22 11:09:57 +01:00
}
2016-02-20 10:50:15 +00:00
}
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
if ( seg_count > 1 & & ! supports_eci ( symbol - > symbology ) ) {
return error_tag ( symbol , ZINT_ERROR_INVALID_OPTION , " 775: Symbology does not support multiple segments " ) ;
}
/* Check ECI(s) */
for ( i = 0 ; i < seg_count ; i + + ) {
if ( local_segs [ i ] . eci ) {
if ( ! supports_eci ( symbol - > symbology ) ) {
return error_tag ( symbol , ZINT_ERROR_INVALID_OPTION , " 217: Symbology does not support ECI switching " ) ;
}
if ( local_segs [ i ] . eci < 0 | | local_segs [ i ] . eci = = 1 | | local_segs [ i ] . eci = = 2 | | local_segs [ i ] . eci = = 14
| | local_segs [ i ] . eci = = 19 | | local_segs [ i ] . eci > 999999 ) {
sprintf ( symbol - > errtxt , " 218: Invalid ECI code %d " , local_segs [ i ] . eci ) ;
return error_tag ( symbol , ZINT_ERROR_INVALID_OPTION , NULL ) ;
}
} else {
have_zero_eci = 1 ;
2020-11-01 18:32:55 +00:00
}
2016-08-16 12:43:41 +01:00
}
2016-02-20 10:50:15 +00:00
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
/* Check other symbol fields */
2021-09-20 14:56:27 +01:00
if ( ( symbol - > scale < 0.01f ) | | ( symbol - > scale > 100.0f ) ) {
2021-09-22 00:04:15 +01:00
return error_tag ( symbol , ZINT_ERROR_INVALID_OPTION , " 227: Scale out of range (0.01 to 100) " ) ;
2021-09-20 14:56:27 +01:00
}
2020-09-30 12:19:12 +01:00
if ( ( symbol - > dot_size < 0.01f ) | | ( symbol - > dot_size > 20.0f ) ) {
2021-09-22 00:04:15 +01:00
return error_tag ( symbol , ZINT_ERROR_INVALID_OPTION , " 221: Dot size out of range (0.01 to 20) " ) ;
2021-09-20 14:56:27 +01:00
}
2021-10-18 14:05:51 +01:00
if ( ( symbol - > height < 0.0f ) | | ( symbol - > height > 2000.0f ) ) { /* Allow for 44 row CODABLOCKF at 45X each */
return error_tag ( symbol , ZINT_ERROR_INVALID_OPTION , " 765: Height out of range (0 to 2000) " ) ;
2021-09-22 00:04:15 +01:00
}
if ( ( symbol - > guard_descent < 0.0f ) | | ( symbol - > guard_descent > 50.0f ) ) {
return error_tag ( symbol , ZINT_ERROR_INVALID_OPTION , " 769: Guard bar descent out of range (0 to 50) " ) ;
2021-09-20 14:56:27 +01:00
}
if ( ( symbol - > whitespace_width < 0 ) | | ( symbol - > whitespace_width > 100 ) ) {
2021-09-22 00:04:15 +01:00
return error_tag ( symbol , ZINT_ERROR_INVALID_OPTION , " 766: Whitespace width out of range (0 to 100) " ) ;
2021-09-20 14:56:27 +01:00
}
if ( ( symbol - > whitespace_height < 0 ) | | ( symbol - > whitespace_height > 100 ) ) {
2021-09-22 00:04:15 +01:00
return error_tag ( symbol , ZINT_ERROR_INVALID_OPTION , " 767: Whitespace height out of range (0 to 100) " ) ;
2021-09-20 14:56:27 +01:00
}
if ( ( symbol - > border_width < 0 ) | | ( symbol - > border_width > 100 ) ) {
2021-09-22 00:04:15 +01:00
return error_tag ( symbol , ZINT_ERROR_INVALID_OPTION , " 768: Border width out of range (0 to 100) " ) ;
2019-10-17 10:06:21 +01:00
}
2021-11-07 00:21:02 +00:00
if ( symbol - > rows > = 200 ) { /* Check for stacking too many symbols */
return error_tag ( symbol , ZINT_ERROR_TOO_LONG , " 770: Too many stacked symbols " ) ;
}
2021-07-06 19:53:31 +01:00
if ( ( symbol - > input_mode & 0x07 ) > 2 ) {
symbol - > input_mode = DATA_MODE ; /* Reset completely TODO: in future, warn/error */
2021-01-11 18:11:41 +00:00
}
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
if ( ( symbol - > input_mode & 0x07 ) = = GS1_MODE & & ! gs1_compliant ( symbol - > symbology ) ) {
return error_tag ( symbol , ZINT_ERROR_INVALID_OPTION , " 220: Selected symbology does not support GS1 mode " ) ;
}
if ( seg_count > 1 ) {
/* Note: GS1_MODE not currently supported when using multiple segments */
if ( ( symbol - > input_mode & 0x07 ) = = GS1_MODE ) {
return error_tag ( symbol , ZINT_ERROR_INVALID_OPTION , " 776: GS1_MODE not supported for multiple segments " ) ;
}
}
if ( ( symbol - > input_mode & 0x07 ) = = UNICODE_MODE ) {
for ( i = 0 ; i < seg_count ; i + + ) {
if ( ! is_valid_utf8 ( local_segs [ i ] . source , local_segs [ i ] . length ) ) {
return error_tag ( symbol , ZINT_ERROR_INVALID_DATA , " 245: Invalid UTF-8 in input data " ) ;
}
}
2019-11-27 16:16:14 +00:00
}
2021-01-11 18:11:41 +00:00
# ifndef _MSC_VER
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
unsigned char local_sources [ total_len + seg_count ] ;
2021-01-11 18:11:41 +00:00
# else
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
local_sources = ( unsigned char * ) _alloca ( total_len + seg_count ) ;
2021-01-11 18:11:41 +00:00
# endif
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
for ( i = 0 , local_source = local_sources ; i < seg_count ; i + + ) {
local_segs [ i ] . source = local_source ;
memcpy ( local_segs [ i ] . source , segs [ i ] . source , local_segs [ i ] . length ) ;
local_segs [ i ] . source [ local_segs [ i ] . length ] = ' \0 ' ;
local_source + = local_segs [ i ] . length + 1 ;
}
2019-10-17 10:06:21 +01:00
/* Start acting on input mode */
2019-11-27 16:16:14 +00:00
if ( symbol - > input_mode & ESCAPE_MODE ) {
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
for ( i = 0 ; i < seg_count ; i + + ) {
error_number = escape_char_process ( symbol , local_segs [ i ] . source , & local_segs [ i ] . length ) ;
if ( error_number ! = 0 ) { /* Only returns errors, not warnings */
return error_tag ( symbol , error_number , NULL ) ;
}
2017-10-21 12:45:50 +01:00
}
}
2017-10-23 21:37:52 +02:00
2019-11-27 16:16:14 +00:00
if ( ( symbol - > input_mode & 0x07 ) = = UNICODE_MODE ) {
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
/* Only strip BOM on first segment */
strip_bom ( local_segs [ 0 ] . source , & local_segs [ 0 ] . length ) ;
2019-11-27 16:16:14 +00:00
}
if ( ( ( symbol - > input_mode & 0x07 ) = = GS1_MODE ) | | ( check_force_gs1 ( symbol - > symbology ) ) ) {
2019-10-17 10:06:21 +01:00
if ( gs1_compliant ( symbol - > symbology ) = = 1 ) {
2020-12-23 10:57:24 +00:00
// Reduce input for composite and non-forced symbologies, others (EAN128 and RSS_EXP based) will
// handle it themselves
2019-10-17 10:06:21 +01:00
if ( is_composite ( symbol - > symbology ) | | ! check_force_gs1 ( symbol - > symbology ) ) {
# ifndef _MSC_VER
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
unsigned char reduced [ local_segs [ 0 ] . length + 1 ] ;
2019-10-17 10:06:21 +01:00
# else
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
unsigned char * reduced = ( unsigned char * ) _alloca ( local_segs [ 0 ] . length + 1 ) ;
2019-10-17 10:06:21 +01:00
# endif
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
error_number = gs1_verify ( symbol , local_segs [ 0 ] . source , local_segs [ 0 ] . length , reduced ) ;
2021-07-06 19:53:31 +01:00
if ( error_number ) {
2021-07-12 22:27:16 +01:00
static const char in_2d_comp [ ] = " in 2D component " ;
if ( is_composite ( symbol - > symbology )
& & strlen ( symbol - > errtxt ) + strlen ( in_2d_comp ) < sizeof ( symbol - > errtxt ) ) {
2021-01-12 19:51:54 +00:00
strcat ( symbol - > errtxt , in_2d_comp ) ;
2020-09-30 12:19:12 +01:00
}
2021-07-06 19:53:31 +01:00
error_number = error_tag ( symbol , error_number , NULL ) ;
if ( error_number > = ZINT_ERROR ) {
return error_number ;
}
warn_number = error_number ; /* Override any previous warning (errtxt has been overwritten) */
2021-01-20 21:15:03 +00:00
}
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
ustrcpy ( local_segs [ 0 ] . source , reduced ) ; // Cannot contain NUL char
local_segs [ 0 ] . length = ( int ) ustrlen ( reduced ) ;
2019-10-17 10:06:21 +01:00
}
} else {
2021-07-06 19:53:31 +01:00
return error_tag ( symbol , ZINT_ERROR_INVALID_OPTION , " 220: Selected symbology does not support GS1 mode " ) ;
2019-10-17 10:06:21 +01:00
}
}
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
error_number = extended_or_reduced_charset ( symbol , local_segs , seg_count ) ;
2017-10-23 21:37:52 +02:00
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
if ( ( error_number = = ZINT_ERROR_INVALID_DATA ) & & have_zero_eci & & supports_eci ( symbol - > symbology )
2019-11-27 16:16:14 +00:00
& & ( symbol - > input_mode & 0x07 ) = = UNICODE_MODE ) {
2016-08-16 12:43:41 +01:00
/* Try another ECI mode */
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
const int first_eci_set = get_best_eci_segs ( symbol , local_segs , seg_count ) ;
if ( first_eci_set ! = 0 ) {
error_number = extended_or_reduced_charset ( symbol , local_segs , seg_count ) ;
2021-07-06 19:53:31 +01:00
/* Inclusion of ECI more noteworthy than other warnings, so overwrite (if any) */
if ( error_number < ZINT_ERROR ) {
2021-03-21 17:35:52 +00:00
error_number = ZINT_WARN_USES_ECI ;
if ( ! ( symbol - > debug & ZINT_DEBUG_TEST ) ) {
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
sprintf ( symbol - > errtxt , " 222: Encoded data includes ECI %d " , first_eci_set ) ;
2021-03-21 17:35:52 +00:00
}
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
if ( symbol - > debug & ZINT_DEBUG_PRINT ) printf ( " Added ECI %d \n " , first_eci_set ) ;
2019-11-27 16:16:14 +00:00
}
2018-01-21 14:33:54 +00:00
}
2016-08-16 12:43:41 +01:00
}
2016-02-20 10:50:15 +00:00
2017-07-26 11:44:47 +01:00
if ( error_number = = 0 ) {
2021-07-06 19:53:31 +01:00
error_number = warn_number ; /* Already tagged */
} else {
error_number = error_tag ( symbol , error_number , NULL ) ;
2016-02-20 10:50:15 +00:00
}
2017-10-23 21:37:52 +02:00
2020-09-30 12:19:12 +01:00
if ( error_number < ZINT_ERROR ) {
2021-06-19 13:11:23 +01:00
if ( symbol - > height < 0.5f ) { /* Absolute minimum */
( void ) set_height ( symbol , 0.0f , 50.0f , 0.0f , 1 /*no_errtxt*/ ) ;
}
2016-09-14 22:34:59 +01:00
}
2017-10-23 21:37:52 +02:00
2016-02-20 10:50:15 +00:00
return error_number ;
2009-11-22 15:38:15 +00:00
}
2021-10-20 23:05:30 +01:00
/* Helper for output routines to check `rotate_angle` and dottiness */
static int check_output_args ( struct zint_symbol * symbol , int rotate_angle ) {
2016-02-20 10:50:15 +00:00
2020-09-30 12:19:12 +01:00
if ( ! symbol ) return ZINT_ERROR_INVALID_DATA ;
2016-02-20 10:50:15 +00:00
switch ( rotate_angle ) {
case 0 :
case 90 :
case 180 :
case 270 :
break ;
default :
2021-07-06 19:53:31 +01:00
return error_tag ( symbol , ZINT_ERROR_INVALID_OPTION , " 223: Invalid rotation angle " ) ;
2021-01-12 19:51:54 +00:00
break ;
2016-02-20 10:50:15 +00:00
}
2021-10-20 23:05:30 +01:00
if ( ( symbol - > output_options & BARCODE_DOTTY_MODE ) & & ! ( is_dotty ( symbol - > symbology ) ) ) {
return error_tag ( symbol , ZINT_ERROR_INVALID_OPTION , " 224: Selected symbology cannot be rendered as dots " ) ;
}
return 0 ;
}
/* Output a previously encoded symbol to file `symbol->outfile` */
int ZBarcode_Print ( struct zint_symbol * symbol , int rotate_angle ) {
int error_number ;
int len ;
if ( ( error_number = check_output_args ( symbol , rotate_angle ) ) ) { /* >= ZINT_ERROR only */
return error_number ; /* Already tagged */
2016-08-12 19:30:46 +01:00
}
2016-09-05 22:06:50 +01:00
2021-07-06 19:53:31 +01:00
len = ( int ) strlen ( symbol - > outfile ) ;
if ( len > 3 ) {
2017-09-10 12:03:09 -03:00
char output [ 4 ] ;
2021-07-06 19:53:31 +01:00
output [ 0 ] = symbol - > outfile [ len - 3 ] ;
output [ 1 ] = symbol - > outfile [ len - 2 ] ;
output [ 2 ] = symbol - > outfile [ len - 1 ] ;
2016-02-20 10:50:15 +00:00
output [ 3 ] = ' \0 ' ;
2021-10-20 23:05:30 +01:00
to_upper ( ( unsigned char * ) output , 3 ) ;
2009-11-22 15:38:15 +00:00
2016-02-20 10:50:15 +00:00
if ( ! ( strcmp ( output , " PNG " ) ) ) {
2016-07-19 23:02:39 +01:00
error_number = plot_raster ( symbol , rotate_angle , OUT_PNG_FILE ) ;
2021-01-12 19:51:54 +00:00
} else if ( ! ( strcmp ( output , " BMP " ) ) ) {
2016-07-19 23:02:39 +01:00
error_number = plot_raster ( symbol , rotate_angle , OUT_BMP_FILE ) ;
2021-01-12 19:51:54 +00:00
} else if ( ! ( strcmp ( output , " PCX " ) ) ) {
2016-09-05 22:06:50 +01:00
error_number = plot_raster ( symbol , rotate_angle , OUT_PCX_FILE ) ;
2021-01-12 19:51:54 +00:00
} else if ( ! ( strcmp ( output , " GIF " ) ) ) {
2016-07-28 20:58:33 +02:00
error_number = plot_raster ( symbol , rotate_angle , OUT_GIF_FILE ) ;
2021-01-12 19:51:54 +00:00
} else if ( ! ( strcmp ( output , " TIF " ) ) ) {
2016-12-30 20:25:58 +00:00
error_number = plot_raster ( symbol , rotate_angle , OUT_TIF_FILE ) ;
2021-01-12 19:51:54 +00:00
} else if ( ! ( strcmp ( output , " TXT " ) ) ) {
2016-02-20 10:50:15 +00:00
error_number = dump_plot ( symbol ) ;
2021-01-12 19:51:54 +00:00
} else if ( ! ( strcmp ( output , " EPS " ) ) ) {
2019-12-01 14:09:46 +00:00
error_number = plot_vector ( symbol , rotate_angle , OUT_EPS_FILE ) ;
2021-01-12 19:51:54 +00:00
} else if ( ! ( strcmp ( output , " SVG " ) ) ) {
2018-06-18 02:36:40 +01:00
error_number = plot_vector ( symbol , rotate_angle , OUT_SVG_FILE ) ;
2021-01-12 19:51:54 +00:00
} else if ( ! ( strcmp ( output , " EMF " ) ) ) {
2018-06-18 02:36:40 +01:00
error_number = plot_vector ( symbol , rotate_angle , OUT_EMF_FILE ) ;
2021-01-12 19:51:54 +00:00
2016-02-20 10:50:15 +00:00
} else {
2021-07-06 19:53:31 +01:00
return error_tag ( symbol , ZINT_ERROR_INVALID_OPTION , " 225: Unknown output format " ) ;
2016-02-20 10:50:15 +00:00
}
} else {
2021-07-06 19:53:31 +01:00
return error_tag ( symbol , ZINT_ERROR_INVALID_OPTION , " 226: Unknown output format " ) ;
2016-02-20 10:50:15 +00:00
}
2021-07-06 19:53:31 +01:00
return error_tag ( symbol , error_number , NULL ) ;
2009-11-22 15:38:15 +00:00
}
2021-07-12 22:27:16 +01:00
/* Output a previously encoded symbol to memory as raster (`symbol->bitmap`) */
2016-02-20 10:50:15 +00:00
int ZBarcode_Buffer ( struct zint_symbol * symbol , int rotate_angle ) {
int error_number ;
2021-10-20 23:05:30 +01:00
if ( ( error_number = check_output_args ( symbol , rotate_angle ) ) ) { /* >= ZINT_ERROR only */
return error_number ; /* Already tagged */
2020-06-04 18:45:25 +01:00
}
2016-10-02 10:45:47 +01:00
error_number = plot_raster ( symbol , rotate_angle , OUT_BUFFER ) ;
2021-07-06 19:53:31 +01:00
return error_tag ( symbol , error_number , NULL ) ;
2009-11-22 15:38:15 +00:00
}
2021-07-12 22:27:16 +01:00
/* Output a previously encoded symbol to memory as vector (`symbol->vector`) */
2018-06-18 02:36:40 +01:00
int ZBarcode_Buffer_Vector ( struct zint_symbol * symbol , int rotate_angle ) {
int error_number ;
2021-10-20 23:05:30 +01:00
if ( ( error_number = check_output_args ( symbol , rotate_angle ) ) ) { /* >= ZINT_ERROR only */
return error_number ; /* Already tagged */
2020-06-04 18:45:25 +01:00
}
2018-06-18 02:36:40 +01:00
error_number = plot_vector ( symbol , rotate_angle , OUT_BUFFER ) ;
2021-07-06 19:53:31 +01:00
return error_tag ( symbol , error_number , NULL ) ;
2018-06-18 02:36:40 +01:00
}
2021-07-06 19:53:31 +01:00
/* Encode and output a symbol to file `symbol->outfile` */
2021-07-12 22:27:16 +01:00
int ZBarcode_Encode_and_Print ( struct zint_symbol * symbol , const unsigned char * source , int length , int rotate_angle ) {
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
struct zint_seg segs [ 1 ] ;
if ( ! symbol ) return ZINT_ERROR_INVALID_DATA ;
segs [ 0 ] . eci = symbol - > eci ;
segs [ 0 ] . source = ( unsigned char * ) source ;
segs [ 0 ] . length = length ;
return ZBarcode_Encode_Segs_and_Print ( symbol , segs , 1 , rotate_angle ) ;
}
/* Encode a symbol with multiple ECI segments and output to file `symbol->outfile` */
int ZBarcode_Encode_Segs_and_Print ( struct zint_symbol * symbol , const struct zint_seg segs [ ] , const int seg_count ,
int rotate_angle ) {
2016-02-20 10:50:15 +00:00
int error_number ;
2018-01-21 18:10:42 +00:00
int first_err ;
2012-12-31 14:41:59 +01:00
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
error_number = ZBarcode_Encode_Segs ( symbol , segs , seg_count ) ;
2020-09-30 12:19:12 +01:00
if ( error_number > = ZINT_ERROR ) {
2016-02-20 10:50:15 +00:00
return error_number ;
}
2009-11-22 15:38:15 +00:00
2018-01-21 18:10:42 +00:00
first_err = error_number ;
2016-02-20 10:50:15 +00:00
error_number = ZBarcode_Print ( symbol , rotate_angle ) ;
2018-01-21 18:10:42 +00:00
if ( error_number = = 0 ) {
error_number = first_err ;
}
2016-02-20 10:50:15 +00:00
return error_number ;
2009-11-22 15:38:15 +00:00
}
2021-07-12 22:27:16 +01:00
/* Encode and output a symbol to memory as raster (`symbol->bitmap`) */
int ZBarcode_Encode_and_Buffer ( struct zint_symbol * symbol , const unsigned char * source , int length ,
int rotate_angle ) {
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
struct zint_seg segs [ 1 ] ;
if ( ! symbol ) return ZINT_ERROR_INVALID_DATA ;
segs [ 0 ] . eci = symbol - > eci ;
segs [ 0 ] . source = ( unsigned char * ) source ;
segs [ 0 ] . length = length ;
return ZBarcode_Encode_Segs_and_Buffer ( symbol , segs , 1 , rotate_angle ) ;
}
/* Encode a symbol with multiple ECI segments and output to memory as raster (`symbol->bitmap`) */
int ZBarcode_Encode_Segs_and_Buffer ( struct zint_symbol * symbol , const struct zint_seg segs [ ] ,
const int seg_count , int rotate_angle ) {
2016-02-20 10:50:15 +00:00
int error_number ;
2018-01-21 18:10:42 +00:00
int first_err ;
2012-12-31 14:41:59 +01:00
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
error_number = ZBarcode_Encode_Segs ( symbol , segs , seg_count ) ;
2020-09-30 12:19:12 +01:00
if ( error_number > = ZINT_ERROR ) {
2016-02-20 10:50:15 +00:00
return error_number ;
}
2009-11-22 15:38:15 +00:00
2018-01-21 18:10:42 +00:00
first_err = error_number ;
2016-02-20 10:50:15 +00:00
error_number = ZBarcode_Buffer ( symbol , rotate_angle ) ;
2018-01-21 18:10:42 +00:00
if ( error_number = = 0 ) {
error_number = first_err ;
}
2019-12-01 14:09:46 +00:00
2016-02-20 10:50:15 +00:00
return error_number ;
2009-11-22 15:38:15 +00:00
}
2021-07-12 22:27:16 +01:00
/* Encode and output a symbol to memory as vector (`symbol->vector`) */
int ZBarcode_Encode_and_Buffer_Vector ( struct zint_symbol * symbol , const unsigned char * source , int length ,
2021-06-19 13:11:23 +01:00
int rotate_angle ) {
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
struct zint_seg segs [ 1 ] ;
if ( ! symbol ) return ZINT_ERROR_INVALID_DATA ;
segs [ 0 ] . eci = symbol - > eci ;
segs [ 0 ] . source = ( unsigned char * ) source ;
segs [ 0 ] . length = length ;
return ZBarcode_Encode_Segs_and_Buffer_Vector ( symbol , segs , 1 , rotate_angle ) ;
}
/* Encode a symbol with multiple ECI segments and output to memory as vector (`symbol->vector`) */
int ZBarcode_Encode_Segs_and_Buffer_Vector ( struct zint_symbol * symbol , const struct zint_seg segs [ ] ,
const int seg_count , int rotate_angle ) {
2018-06-18 02:36:40 +01:00
int error_number ;
int first_err ;
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
error_number = ZBarcode_Encode_Segs ( symbol , segs , seg_count ) ;
2020-09-30 12:19:12 +01:00
if ( error_number > = ZINT_ERROR ) {
2018-06-18 02:36:40 +01:00
return error_number ;
}
first_err = error_number ;
error_number = ZBarcode_Buffer_Vector ( symbol , rotate_angle ) ;
if ( error_number = = 0 ) {
error_number = first_err ;
}
2019-12-01 14:09:46 +00:00
2018-06-18 02:36:40 +01:00
return error_number ;
}
2021-07-06 19:53:31 +01:00
/* Encode a barcode using input data from file `filename` */
2021-07-12 22:27:16 +01:00
int ZBarcode_Encode_File ( struct zint_symbol * symbol , const char * filename ) {
2016-02-20 10:50:15 +00:00
FILE * file ;
2020-12-18 02:36:48 +00:00
int file_opened = 0 ;
2016-02-20 10:50:15 +00:00
unsigned char * buffer ;
2020-03-26 22:17:37 +00:00
long fileLen ;
size_t n ;
2021-06-10 11:15:39 +01:00
size_t nRead = 0 ;
2016-02-20 10:50:15 +00:00
int ret ;
2020-09-30 12:19:12 +01:00
if ( ! symbol ) return ZINT_ERROR_INVALID_DATA ;
if ( ! filename ) {
2021-07-06 19:53:31 +01:00
return error_tag ( symbol , ZINT_ERROR_INVALID_DATA , " 239: Filename NULL " ) ;
2020-09-30 12:19:12 +01:00
}
2016-02-20 10:50:15 +00:00
if ( ! strcmp ( filename , " - " ) ) {
file = stdin ;
2020-12-21 19:30:07 +00:00
fileLen = ZINT_MAX_DATA_LEN ;
2016-02-20 10:50:15 +00:00
} else {
file = fopen ( filename , " rb " ) ;
if ( ! file ) {
2021-06-10 11:15:39 +01:00
sprintf ( symbol - > errtxt , " 229: Unable to read input file (%d: %.30s) " , errno , strerror ( errno ) ) ;
2021-07-06 19:53:31 +01:00
return error_tag ( symbol , ZINT_ERROR_INVALID_DATA , NULL ) ;
2016-02-20 10:50:15 +00:00
}
2020-12-18 02:36:48 +00:00
file_opened = 1 ;
2016-02-20 10:50:15 +00:00
/* Get file length */
fseek ( file , 0 , SEEK_END ) ;
fileLen = ftell ( file ) ;
fseek ( file , 0 , SEEK_SET ) ;
2020-12-23 10:57:24 +00:00
/* On many Linux distros ftell() returns LONG_MAX not -1 on error */
if ( fileLen < = 0 | | fileLen = = LONG_MAX ) {
2016-02-20 10:50:15 +00:00
fclose ( file ) ;
2021-07-06 19:53:31 +01:00
return error_tag ( symbol , ZINT_ERROR_INVALID_DATA , " 235: Input file empty or unseekable " ) ;
2016-02-20 10:50:15 +00:00
}
2020-12-21 19:30:07 +00:00
if ( fileLen > ZINT_MAX_DATA_LEN ) {
2020-03-26 22:17:37 +00:00
fclose ( file ) ;
2021-07-06 19:53:31 +01:00
return error_tag ( symbol , ZINT_ERROR_TOO_LONG , " 230: Input file too long " ) ;
2020-03-26 22:17:37 +00:00
}
2016-02-20 10:50:15 +00:00
}
/* Allocate memory */
2021-01-11 18:11:41 +00:00
buffer = ( unsigned char * ) malloc ( fileLen ) ;
2016-02-20 10:50:15 +00:00
if ( ! buffer ) {
2020-12-18 02:36:48 +00:00
if ( file_opened ) {
2016-02-20 10:50:15 +00:00
fclose ( file ) ;
2020-03-26 22:17:37 +00:00
}
2021-07-06 19:53:31 +01:00
return error_tag ( symbol , ZINT_ERROR_MEMORY , " 231: Insufficient memory for file read buffer " ) ;
2016-02-20 10:50:15 +00:00
}
/* Read file contents into buffer */
do {
n = fread ( buffer + nRead , 1 , fileLen - nRead , file ) ;
if ( ferror ( file ) ) {
2021-06-10 11:15:39 +01:00
sprintf ( symbol - > errtxt , " 241: Input file read error (%d: %.30s) " , errno , strerror ( errno ) ) ;
2020-12-18 02:36:48 +00:00
if ( file_opened ) {
2020-03-26 22:17:37 +00:00
fclose ( file ) ;
}
free ( buffer ) ;
2021-07-06 19:53:31 +01:00
return error_tag ( symbol , ZINT_ERROR_INVALID_DATA , NULL ) ;
2016-02-20 10:50:15 +00:00
}
nRead + = n ;
2021-06-10 11:15:39 +01:00
} while ( ! feof ( file ) & & ( 0 < n ) & & ( ( long ) nRead < fileLen ) ) ;
2016-02-20 10:50:15 +00:00
2020-12-18 02:36:48 +00:00
if ( file_opened ) {
2020-03-26 22:17:37 +00:00
fclose ( file ) ;
}
2021-06-27 11:47:55 +01:00
ret = ZBarcode_Encode ( symbol , buffer , ( int ) nRead ) ;
2016-02-20 10:50:15 +00:00
free ( buffer ) ;
return ret ;
2009-11-22 15:38:15 +00:00
}
2021-07-06 19:53:31 +01:00
/* Encode a symbol using input data from file `filename` and output to file `symbol->outfile` */
2021-07-12 22:27:16 +01:00
int ZBarcode_Encode_File_and_Print ( struct zint_symbol * symbol , const char * filename , int rotate_angle ) {
2016-02-20 10:50:15 +00:00
int error_number ;
2018-01-21 18:10:42 +00:00
int first_err ;
2012-12-31 14:41:59 +01:00
2016-02-20 10:50:15 +00:00
error_number = ZBarcode_Encode_File ( symbol , filename ) ;
2020-09-30 12:19:12 +01:00
if ( error_number > = ZINT_ERROR ) {
2016-02-20 10:50:15 +00:00
return error_number ;
}
2019-12-01 14:09:46 +00:00
2018-01-21 18:10:42 +00:00
first_err = error_number ;
error_number = ZBarcode_Print ( symbol , rotate_angle ) ;
if ( error_number = = 0 ) {
error_number = first_err ;
}
2019-12-01 14:09:46 +00:00
2018-01-21 18:10:42 +00:00
return error_number ;
2009-11-22 15:38:15 +00:00
}
2021-07-06 19:53:31 +01:00
/* Encode a symbol using input data from file `filename` and output to memory as raster (`symbol->bitmap`) */
2021-07-12 22:27:16 +01:00
int ZBarcode_Encode_File_and_Buffer ( struct zint_symbol * symbol , char const * filename , int rotate_angle ) {
2016-02-20 10:50:15 +00:00
int error_number ;
2018-01-21 18:10:42 +00:00
int first_err ;
2012-12-31 14:41:59 +01:00
2016-02-20 10:50:15 +00:00
error_number = ZBarcode_Encode_File ( symbol , filename ) ;
2020-09-30 12:19:12 +01:00
if ( error_number > = ZINT_ERROR ) {
2016-02-20 10:50:15 +00:00
return error_number ;
}
2019-12-01 14:09:46 +00:00
2018-01-21 18:10:42 +00:00
first_err = error_number ;
error_number = ZBarcode_Buffer ( symbol , rotate_angle ) ;
if ( error_number = = 0 ) {
error_number = first_err ;
}
2012-12-31 14:41:59 +01:00
2018-01-21 18:10:42 +00:00
return error_number ;
2009-11-22 15:38:15 +00:00
}
2010-05-30 19:25:24 +02:00
2021-07-06 19:53:31 +01:00
/* Encode a symbol using input data from file `filename` and output to memory as vector (`symbol->vector`) */
2021-07-12 22:27:16 +01:00
int ZBarcode_Encode_File_and_Buffer_Vector ( struct zint_symbol * symbol , const char * filename , int rotate_angle ) {
2018-06-18 02:36:40 +01:00
int error_number ;
int first_err ;
error_number = ZBarcode_Encode_File ( symbol , filename ) ;
2020-09-30 12:19:12 +01:00
if ( error_number > = ZINT_ERROR ) {
2018-06-18 02:36:40 +01:00
return error_number ;
}
2019-12-01 14:09:46 +00:00
2018-06-18 02:36:40 +01:00
first_err = error_number ;
error_number = ZBarcode_Buffer_Vector ( symbol , rotate_angle ) ;
if ( error_number = = 0 ) {
error_number = first_err ;
}
return error_number ;
}
Add compliant height, using ZINT_COMPLIANT_HEIGHT flag for back-compatibility
Rename barcode funcs to same as BARCODE_XXX name
library: barcode funcs array for dispatch, used for ZBarcode_ValidID() also
general: change is_sane() comparison to nonzero from ZINT_ERROR_INVALID_OPTION
MAILMARK: fuller error messages
CODABAR: add option to show check character in HRT
zint.h: use 0xNNNN for OR-able defines
GUI: add guard descent height reset button, add Zint version to window title,
static get_zint_version() method, use QStringLiteral (QSL shorthand),
use SIGNAL(toggled()), add errtxt "popup" and status bar, add icons,
add saveAs shortcut, add main menu, context menus and actions, add help,
reset_view() -> reset_colours(), add copy to clipboard as EMF/GIF/PNG/TIF,
lessen triggering of update_preview(), shorten names of getters/setters,
simplify/shorten some update_preview() logic in switch,
CODEONE disable structapp for Version S
qzint.cpp: add on_errored signal, add missing getters, add test
2021-10-09 00:13:39 +01:00
/* Checks whether a symbology is supported */
2021-07-12 22:27:16 +01:00
int ZBarcode_ValidID ( int symbol_id ) {
2021-10-20 23:05:30 +01:00
if ( symbol_id < = 0 | | symbol_id > BARCODE_LAST ) {
2021-07-12 22:27:16 +01:00
return 0 ;
}
Add compliant height, using ZINT_COMPLIANT_HEIGHT flag for back-compatibility
Rename barcode funcs to same as BARCODE_XXX name
library: barcode funcs array for dispatch, used for ZBarcode_ValidID() also
general: change is_sane() comparison to nonzero from ZINT_ERROR_INVALID_OPTION
MAILMARK: fuller error messages
CODABAR: add option to show check character in HRT
zint.h: use 0xNNNN for OR-able defines
GUI: add guard descent height reset button, add Zint version to window title,
static get_zint_version() method, use QStringLiteral (QSL shorthand),
use SIGNAL(toggled()), add errtxt "popup" and status bar, add icons,
add saveAs shortcut, add main menu, context menus and actions, add help,
reset_view() -> reset_colours(), add copy to clipboard as EMF/GIF/PNG/TIF,
lessen triggering of update_preview(), shorten names of getters/setters,
simplify/shorten some update_preview() logic in switch,
CODEONE disable structapp for Version S
qzint.cpp: add on_errored signal, add missing getters, add test
2021-10-09 00:13:39 +01:00
return barcode_funcs [ symbol_id ] ! = NULL ;
2021-07-12 22:27:16 +01:00
}
2021-11-23 19:12:48 +00:00
/* Copy BARCODE_XXX name of `symbol_id` into `name` buffer, NUL-terminated.
Returns 0 if valid , non - zero ( 1 or - 1 ) if not valid */
int ZBarcode_BarcodeName ( int symbol_id , char name [ 32 ] ) {
struct item {
const char * name ;
int define ;
int val ;
} ;
static const struct item data [ ] = {
{ " " , - 1 , 0 } ,
{ " BARCODE_CODE11 " , BARCODE_CODE11 , 1 } ,
{ " BARCODE_C25STANDARD " , BARCODE_C25STANDARD , 2 } ,
{ " BARCODE_C25INTER " , BARCODE_C25INTER , 3 } ,
{ " BARCODE_C25IATA " , BARCODE_C25IATA , 4 } ,
{ " " , - 1 , 5 } ,
{ " BARCODE_C25LOGIC " , BARCODE_C25LOGIC , 6 } ,
{ " BARCODE_C25IND " , BARCODE_C25IND , 7 } ,
{ " BARCODE_CODE39 " , BARCODE_CODE39 , 8 } ,
{ " BARCODE_EXCODE39 " , BARCODE_EXCODE39 , 9 } ,
{ " " , - 1 , 10 } ,
{ " " , - 1 , 11 } ,
{ " " , - 1 , 12 } ,
{ " BARCODE_EANX " , BARCODE_EANX , 13 } ,
{ " BARCODE_EANX_CHK " , BARCODE_EANX_CHK , 14 } ,
{ " " , - 1 , 15 } ,
{ " BARCODE_GS1_128 " , BARCODE_GS1_128 , 16 } ,
{ " " , - 1 , 17 } ,
{ " BARCODE_CODABAR " , BARCODE_CODABAR , 18 } ,
{ " " , - 1 , 19 } ,
{ " BARCODE_CODE128 " , BARCODE_CODE128 , 20 } ,
{ " BARCODE_DPLEIT " , BARCODE_DPLEIT , 21 } ,
{ " BARCODE_DPIDENT " , BARCODE_DPIDENT , 22 } ,
{ " BARCODE_CODE16K " , BARCODE_CODE16K , 23 } ,
{ " BARCODE_CODE49 " , BARCODE_CODE49 , 24 } ,
{ " BARCODE_CODE93 " , BARCODE_CODE93 , 25 } ,
{ " " , - 1 , 26 } ,
{ " " , - 1 , 27 } ,
{ " BARCODE_FLAT " , BARCODE_FLAT , 28 } ,
{ " BARCODE_DBAR_OMN " , BARCODE_DBAR_OMN , 29 } ,
{ " BARCODE_DBAR_LTD " , BARCODE_DBAR_LTD , 30 } ,
{ " BARCODE_DBAR_EXP " , BARCODE_DBAR_EXP , 31 } ,
{ " BARCODE_TELEPEN " , BARCODE_TELEPEN , 32 } ,
{ " " , - 1 , 33 } ,
{ " BARCODE_UPCA " , BARCODE_UPCA , 34 } ,
{ " BARCODE_UPCA_CHK " , BARCODE_UPCA_CHK , 35 } ,
{ " " , - 1 , 36 } ,
{ " BARCODE_UPCE " , BARCODE_UPCE , 37 } ,
{ " BARCODE_UPCE_CHK " , BARCODE_UPCE_CHK , 38 } ,
{ " " , - 1 , 39 } ,
{ " BARCODE_POSTNET " , BARCODE_POSTNET , 40 } ,
{ " " , - 1 , 41 } ,
{ " " , - 1 , 42 } ,
{ " " , - 1 , 43 } ,
{ " " , - 1 , 44 } ,
{ " " , - 1 , 45 } ,
{ " " , - 1 , 46 } ,
{ " BARCODE_MSI_PLESSEY " , BARCODE_MSI_PLESSEY , 47 } ,
{ " " , - 1 , 48 } ,
{ " BARCODE_FIM " , BARCODE_FIM , 49 } ,
{ " BARCODE_LOGMARS " , BARCODE_LOGMARS , 50 } ,
{ " BARCODE_PHARMA " , BARCODE_PHARMA , 51 } ,
{ " BARCODE_PZN " , BARCODE_PZN , 52 } ,
{ " BARCODE_PHARMA_TWO " , BARCODE_PHARMA_TWO , 53 } ,
{ " " , - 1 , 54 } ,
{ " BARCODE_PDF417 " , BARCODE_PDF417 , 55 } ,
{ " BARCODE_PDF417COMP " , BARCODE_PDF417COMP , 56 } ,
{ " BARCODE_MAXICODE " , BARCODE_MAXICODE , 57 } ,
{ " BARCODE_QRCODE " , BARCODE_QRCODE , 58 } ,
{ " " , - 1 , 59 } ,
{ " BARCODE_CODE128B " , BARCODE_CODE128B , 60 } ,
{ " " , - 1 , 61 } ,
{ " " , - 1 , 62 } ,
{ " BARCODE_AUSPOST " , BARCODE_AUSPOST , 63 } ,
{ " " , - 1 , 64 } ,
{ " " , - 1 , 65 } ,
{ " BARCODE_AUSREPLY " , BARCODE_AUSREPLY , 66 } ,
{ " BARCODE_AUSROUTE " , BARCODE_AUSROUTE , 67 } ,
{ " BARCODE_AUSREDIRECT " , BARCODE_AUSREDIRECT , 68 } ,
{ " BARCODE_ISBNX " , BARCODE_ISBNX , 69 } ,
{ " BARCODE_RM4SCC " , BARCODE_RM4SCC , 70 } ,
{ " BARCODE_DATAMATRIX " , BARCODE_DATAMATRIX , 71 } ,
{ " BARCODE_EAN14 " , BARCODE_EAN14 , 72 } ,
{ " BARCODE_VIN " , BARCODE_VIN , 73 } ,
{ " BARCODE_CODABLOCKF " , BARCODE_CODABLOCKF , 74 } ,
{ " BARCODE_NVE18 " , BARCODE_NVE18 , 75 } ,
{ " BARCODE_JAPANPOST " , BARCODE_JAPANPOST , 76 } ,
{ " BARCODE_KOREAPOST " , BARCODE_KOREAPOST , 77 } ,
{ " " , - 1 , 78 } ,
{ " BARCODE_DBAR_STK " , BARCODE_DBAR_STK , 79 } ,
{ " BARCODE_DBAR_OMNSTK " , BARCODE_DBAR_OMNSTK , 80 } ,
{ " BARCODE_DBAR_EXPSTK " , BARCODE_DBAR_EXPSTK , 81 } ,
{ " BARCODE_PLANET " , BARCODE_PLANET , 82 } ,
{ " " , - 1 , 83 } ,
{ " BARCODE_MICROPDF417 " , BARCODE_MICROPDF417 , 84 } ,
{ " BARCODE_USPS_IMAIL " , BARCODE_USPS_IMAIL , 85 } ,
{ " BARCODE_PLESSEY " , BARCODE_PLESSEY , 86 } ,
{ " BARCODE_TELEPEN_NUM " , BARCODE_TELEPEN_NUM , 87 } ,
{ " " , - 1 , 88 } ,
{ " BARCODE_ITF14 " , BARCODE_ITF14 , 89 } ,
{ " BARCODE_KIX " , BARCODE_KIX , 90 } ,
{ " " , - 1 , 91 } ,
{ " BARCODE_AZTEC " , BARCODE_AZTEC , 92 } ,
{ " BARCODE_DAFT " , BARCODE_DAFT , 93 } ,
{ " " , - 1 , 94 } ,
{ " " , - 1 , 95 } ,
{ " BARCODE_DPD " , BARCODE_DPD , 96 } ,
{ " BARCODE_MICROQR " , BARCODE_MICROQR , 97 } ,
{ " BARCODE_HIBC_128 " , BARCODE_HIBC_128 , 98 } ,
{ " BARCODE_HIBC_39 " , BARCODE_HIBC_39 , 99 } ,
{ " " , - 1 , 100 } ,
{ " " , - 1 , 101 } ,
{ " BARCODE_HIBC_DM " , BARCODE_HIBC_DM , 102 } ,
{ " " , - 1 , 103 } ,
{ " BARCODE_HIBC_QR " , BARCODE_HIBC_QR , 104 } ,
{ " " , - 1 , 105 } ,
{ " BARCODE_HIBC_PDF " , BARCODE_HIBC_PDF , 106 } ,
{ " " , - 1 , 107 } ,
{ " BARCODE_HIBC_MICPDF " , BARCODE_HIBC_MICPDF , 108 } ,
{ " " , - 1 , 109 } ,
{ " BARCODE_HIBC_BLOCKF " , BARCODE_HIBC_BLOCKF , 110 } ,
{ " " , - 1 , 111 } ,
{ " BARCODE_HIBC_AZTEC " , BARCODE_HIBC_AZTEC , 112 } ,
{ " " , - 1 , 113 } ,
{ " " , - 1 , 114 } ,
{ " BARCODE_DOTCODE " , BARCODE_DOTCODE , 115 } ,
{ " BARCODE_HANXIN " , BARCODE_HANXIN , 116 } ,
{ " " , - 1 , 117 } ,
{ " " , - 1 , 118 } ,
{ " " , - 1 , 119 } ,
{ " " , - 1 , 120 } ,
{ " BARCODE_MAILMARK " , BARCODE_MAILMARK , 121 } ,
{ " " , - 1 , 122 } ,
{ " " , - 1 , 123 } ,
{ " " , - 1 , 124 } ,
{ " " , - 1 , 125 } ,
{ " " , - 1 , 126 } ,
{ " " , - 1 , 127 } ,
{ " BARCODE_AZRUNE " , BARCODE_AZRUNE , 128 } ,
{ " BARCODE_CODE32 " , BARCODE_CODE32 , 129 } ,
{ " BARCODE_EANX_CC " , BARCODE_EANX_CC , 130 } ,
{ " BARCODE_GS1_128_CC " , BARCODE_GS1_128_CC , 131 } ,
{ " BARCODE_DBAR_OMN_CC " , BARCODE_DBAR_OMN_CC , 132 } ,
{ " BARCODE_DBAR_LTD_CC " , BARCODE_DBAR_LTD_CC , 133 } ,
{ " BARCODE_DBAR_EXP_CC " , BARCODE_DBAR_EXP_CC , 134 } ,
{ " BARCODE_UPCA_CC " , BARCODE_UPCA_CC , 135 } ,
{ " BARCODE_UPCE_CC " , BARCODE_UPCE_CC , 136 } ,
{ " BARCODE_DBAR_STK_CC " , BARCODE_DBAR_STK_CC , 137 } ,
{ " BARCODE_DBAR_OMNSTK_CC " , BARCODE_DBAR_OMNSTK_CC , 138 } ,
{ " BARCODE_DBAR_EXPSTK_CC " , BARCODE_DBAR_EXPSTK_CC , 139 } ,
{ " BARCODE_CHANNEL " , BARCODE_CHANNEL , 140 } ,
{ " BARCODE_CODEONE " , BARCODE_CODEONE , 141 } ,
{ " BARCODE_GRIDMATRIX " , BARCODE_GRIDMATRIX , 142 } ,
{ " BARCODE_UPNQR " , BARCODE_UPNQR , 143 } ,
{ " BARCODE_ULTRA " , BARCODE_ULTRA , 144 } ,
{ " BARCODE_RMQR " , BARCODE_RMQR , 145 } ,
} ;
name [ 0 ] = ' \0 ' ;
if ( ! ZBarcode_ValidID ( symbol_id ) ) {
return 1 ;
}
assert ( symbol_id > = 0 & & symbol_id < ARRAY_SIZE ( data ) & & data [ symbol_id ] . name [ 0 ] ) ;
/* Self-check, shouldn't happen */
if ( data [ symbol_id ] . val ! = symbol_id | | ( data [ symbol_id ] . define ! = - 1 & & data [ symbol_id ] . define ! = symbol_id ) ) {
assert ( 0 ) ; /* Not reached */
return - 1 ;
}
strcpy ( name , data [ symbol_id ] . name ) ;
return 0 ;
}
2021-07-12 22:27:16 +01:00
/* Return the capability flags for symbology `symbol_id` that match `cap_flag` */
unsigned int ZBarcode_Cap ( int symbol_id , unsigned int cap_flag ) {
unsigned int result = 0 ;
if ( ! ZBarcode_ValidID ( symbol_id ) ) {
return 0 ;
}
if ( ( cap_flag & ZINT_CAP_HRT ) & & has_hrt ( symbol_id ) ) {
result | = ZINT_CAP_HRT ;
}
if ( ( cap_flag & ZINT_CAP_STACKABLE ) & & is_stackable ( symbol_id ) ) {
result | = ZINT_CAP_STACKABLE ;
}
if ( ( cap_flag & ZINT_CAP_EXTENDABLE ) & & is_extendable ( symbol_id ) ) {
result | = ZINT_CAP_EXTENDABLE ;
}
if ( ( cap_flag & ZINT_CAP_COMPOSITE ) & & is_composite ( symbol_id ) ) {
result | = ZINT_CAP_COMPOSITE ;
}
if ( ( cap_flag & ZINT_CAP_ECI ) & & supports_eci ( symbol_id ) ) {
result | = ZINT_CAP_ECI ;
}
if ( ( cap_flag & ZINT_CAP_GS1 ) & & gs1_compliant ( symbol_id ) ) {
result | = ZINT_CAP_GS1 ;
}
if ( ( cap_flag & ZINT_CAP_DOTTY ) & & is_dotty ( symbol_id ) ) {
result | = ZINT_CAP_DOTTY ;
}
2021-09-24 13:21:24 +01:00
if ( cap_flag & ZINT_CAP_QUIET_ZONES ) {
2021-10-20 23:05:30 +01:00
switch ( symbol_id ) { /* See `out_quiet_zones()` in "output.c" */
2021-09-24 13:21:24 +01:00
case BARCODE_CODE16K :
case BARCODE_CODE49 :
case BARCODE_CODABLOCKF :
case BARCODE_HIBC_BLOCKF :
case BARCODE_ITF14 :
case BARCODE_EANX :
case BARCODE_EANX_CHK :
case BARCODE_EANX_CC :
case BARCODE_ISBNX :
case BARCODE_UPCA :
case BARCODE_UPCA_CHK :
case BARCODE_UPCA_CC :
case BARCODE_UPCE :
case BARCODE_UPCE_CHK :
case BARCODE_UPCE_CC :
result | = ZINT_CAP_QUIET_ZONES ;
break ;
}
}
2021-07-12 22:27:16 +01:00
if ( ( cap_flag & ZINT_CAP_FIXED_RATIO ) & & is_fixed_ratio ( symbol_id ) ) {
result | = ZINT_CAP_FIXED_RATIO ;
}
if ( cap_flag & ZINT_CAP_READER_INIT ) {
/* Note does not include HIBC versions */
switch ( symbol_id ) {
case BARCODE_CODE128 : /* Note does not include GS1_128 or NVE18 */
case BARCODE_CODE128B :
case BARCODE_CODE16K :
case BARCODE_CODABLOCKF :
case BARCODE_PDF417 :
case BARCODE_PDF417COMP :
case BARCODE_DATAMATRIX :
case BARCODE_MICROPDF417 :
case BARCODE_AZTEC :
case BARCODE_DOTCODE :
case BARCODE_GRIDMATRIX :
case BARCODE_ULTRA :
result | = ZINT_CAP_READER_INIT ;
break ;
}
}
if ( cap_flag & ZINT_CAP_FULL_MULTIBYTE ) {
switch ( symbol_id ) {
case BARCODE_QRCODE :
case BARCODE_MICROQR :
//case BARCODE_HIBC_QR: Note character set restricted to ASCII subset
//case BARCODE_UPNQR: Note does not use Kanji mode
case BARCODE_RMQR :
case BARCODE_HANXIN :
case BARCODE_GRIDMATRIX :
result | = ZINT_CAP_FULL_MULTIBYTE ;
break ;
}
}
if ( cap_flag & ZINT_CAP_MASK ) {
switch ( symbol_id ) {
case BARCODE_QRCODE :
case BARCODE_MICROQR :
case BARCODE_HANXIN :
case BARCODE_DOTCODE :
result | = ZINT_CAP_MASK ;
break ;
}
}
Add Structured Append support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, MAXICODE, MICROPDF417, PDF417, QRCODE, ULTRA
DOTCODE: use pre-calculated generator poly coeffs in Reed-Solomon for
performance improvement
PDF417/MICROPDF417: use common routine pdf417_initial()
GUI: code lines <= 118, shorthand widget_obj(),
shorten calling upcean_addon_gap(), upcean_guard_descent()
various backend: var name debug -> debug_print
2021-09-28 21:42:44 +01:00
if ( cap_flag & ZINT_CAP_STRUCTAPP ) {
switch ( symbol_id ) {
case BARCODE_PDF417 :
case BARCODE_PDF417COMP :
case BARCODE_MAXICODE :
case BARCODE_QRCODE : /* Note does not include MICROQR, UPNQR or rMQR */
case BARCODE_DATAMATRIX :
case BARCODE_MICROPDF417 :
case BARCODE_AZTEC :
case BARCODE_HIBC_DM :
case BARCODE_HIBC_QR :
case BARCODE_HIBC_PDF :
case BARCODE_HIBC_MICPDF :
case BARCODE_HIBC_AZTEC :
case BARCODE_DOTCODE :
case BARCODE_CODEONE :
case BARCODE_GRIDMATRIX :
case BARCODE_ULTRA :
result | = ZINT_CAP_STRUCTAPP ;
break ;
}
}
Add compliant height, using ZINT_COMPLIANT_HEIGHT flag for back-compatibility
Rename barcode funcs to same as BARCODE_XXX name
library: barcode funcs array for dispatch, used for ZBarcode_ValidID() also
general: change is_sane() comparison to nonzero from ZINT_ERROR_INVALID_OPTION
MAILMARK: fuller error messages
CODABAR: add option to show check character in HRT
zint.h: use 0xNNNN for OR-able defines
GUI: add guard descent height reset button, add Zint version to window title,
static get_zint_version() method, use QStringLiteral (QSL shorthand),
use SIGNAL(toggled()), add errtxt "popup" and status bar, add icons,
add saveAs shortcut, add main menu, context menus and actions, add help,
reset_view() -> reset_colours(), add copy to clipboard as EMF/GIF/PNG/TIF,
lessen triggering of update_preview(), shorten names of getters/setters,
simplify/shorten some update_preview() logic in switch,
CODEONE disable structapp for Version S
qzint.cpp: add on_errored signal, add missing getters, add test
2021-10-09 00:13:39 +01:00
if ( ( cap_flag & ZINT_CAP_COMPLIANT_HEIGHT ) & & ! is_fixed_ratio ( symbol_id ) ) {
switch ( symbol_id ) {
/* These don't have a compliant height defined */
case BARCODE_CODE11 : /* TODO: Find doc */
case BARCODE_C25STANDARD : /* For C25 only have doc for C25INTER */
case BARCODE_C25IATA :
case BARCODE_C25LOGIC :
case BARCODE_C25IND :
case BARCODE_CODE128 : /* Left to application */
case BARCODE_CODE128B :
case BARCODE_DPLEIT : /* TODO: Find doc */
case BARCODE_DPIDENT : /* TODO: Find doc */
case BARCODE_FLAT : /* TODO: Find doc */
case BARCODE_MSI_PLESSEY : /* TODO: Find doc */
case BARCODE_PDF417 : /* Has compliant height but already warns & uses for default */
case BARCODE_PDF417COMP :
case BARCODE_VIN : /* Spec unlikely */
case BARCODE_KOREAPOST : /* TODO: Find doc */
case BARCODE_MICROPDF417 : /* See PDF417 */
case BARCODE_PLESSEY : /* TODO: Find doc */
case BARCODE_DAFT : /* Generic */
case BARCODE_HIBC_128 : /* See CODE128 */
case BARCODE_HIBC_PDF : /* See PDF417 */
case BARCODE_HIBC_MICPDF : /* See PDF417 */
break ;
default :
result | = ZINT_CAP_COMPLIANT_HEIGHT ;
break ;
}
}
2021-07-12 22:27:16 +01:00
return result ;
}
2021-07-06 19:53:31 +01:00
/* Return the version of Zint linked to */
2021-10-27 19:05:57 +01:00
int ZBarcode_Version ( void ) {
2020-09-04 16:38:11 +01:00
if ( ZINT_VERSION_BUILD ) {
2020-12-21 19:30:07 +00:00
return ( ZINT_VERSION_MAJOR * 10000 ) + ( ZINT_VERSION_MINOR * 100 ) + ZINT_VERSION_RELEASE * 10
+ ZINT_VERSION_BUILD ;
2020-09-04 16:38:11 +01:00
}
2017-07-01 09:06:47 +01:00
return ( ZINT_VERSION_MAJOR * 10000 ) + ( ZINT_VERSION_MINOR * 100 ) + ZINT_VERSION_RELEASE ;
2017-06-13 21:05:35 +02:00
}
Add multiple segments support for AZTEC, CODEONE, DATAMATRIX, DOTCODE,
GRIDMATRIX, HANXIN, MAXICODE, MICROPDF417, PDF417, QRCODE, RMQR, ULTRA
RMQR: fix ECI encoding (wrong bit length for indicator)
MICROQR: check versions M1 and M2 for allowed characters so as to give
better error messages
DOTCODE: some small optimizations
common.c: add is_chr(), segs_length(), segs_cpy()
CODEONE/CODE128/DOTCODE/GRIDMATRIX/HANXIN/MAXICODE/QRCODE/ULTRA: add
namespace prefixes to static funcs/data
includes: use Z_ prefix, unuse double underscore prefixes (guard defines)
manual.txt: compress some tables using double/treble column sets
2022-05-09 19:50:50 +01:00
/* vim: set ts=4 sw=4 et : */