2008-07-14 01:15:55 +04:00
/* plessey.c - Handles Plessey and MSI Plessey */
/*
libzint - the open source barcode library
2021-06-10 13:15:39 +03:00
Copyright ( C ) 2008 - 2021 Robin Stuart < rstuart114 @ gmail . com >
2008-07-14 01:15:55 +04:00
2013-05-16 21:26:38 +04: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 22:37:52 +03:00
1. Redistributions of source code must retain the above copyright
notice , this list of conditions and the following disclaimer .
2013-05-16 21:26:38 +04: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 22:37:52 +03:00
documentation and / or other materials provided with the distribution .
2013-05-16 21:26:38 +04: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 22:37:52 +03:00
without specific prior written permission .
2013-05-16 21:26:38 +04: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 22:37:52 +03:00
OUT OF THE USE OF THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF
2013-05-16 21:26:38 +04:00
SUCH DAMAGE .
2016-02-20 13:50:15 +03:00
*/
2019-12-19 03:37:55 +03:00
/* vim: set ts=4 sw=4 et : */
2008-07-14 01:15:55 +04:00
# include <stdio.h>
# include "common.h"
2021-10-21 01:05:30 +03:00
# define SSET_F (IS_NUM_F | IS_UHX_F) /* SSET "0123456789ABCDEF" */
static const char PlessTable [ 16 ] [ 8 ] = {
{ ' 1 ' , ' 3 ' , ' 1 ' , ' 3 ' , ' 1 ' , ' 3 ' , ' 1 ' , ' 3 ' } , { ' 3 ' , ' 1 ' , ' 1 ' , ' 3 ' , ' 1 ' , ' 3 ' , ' 1 ' , ' 3 ' } , { ' 1 ' , ' 3 ' , ' 3 ' , ' 1 ' , ' 1 ' , ' 3 ' , ' 1 ' , ' 3 ' } ,
{ ' 3 ' , ' 1 ' , ' 3 ' , ' 1 ' , ' 1 ' , ' 3 ' , ' 1 ' , ' 3 ' } , { ' 1 ' , ' 3 ' , ' 1 ' , ' 3 ' , ' 3 ' , ' 1 ' , ' 1 ' , ' 3 ' } , { ' 3 ' , ' 1 ' , ' 1 ' , ' 3 ' , ' 3 ' , ' 1 ' , ' 1 ' , ' 3 ' } ,
{ ' 1 ' , ' 3 ' , ' 3 ' , ' 1 ' , ' 3 ' , ' 1 ' , ' 1 ' , ' 3 ' } , { ' 3 ' , ' 1 ' , ' 3 ' , ' 1 ' , ' 3 ' , ' 1 ' , ' 1 ' , ' 3 ' } , { ' 1 ' , ' 3 ' , ' 1 ' , ' 3 ' , ' 1 ' , ' 3 ' , ' 3 ' , ' 1 ' } ,
{ ' 3 ' , ' 1 ' , ' 1 ' , ' 3 ' , ' 1 ' , ' 3 ' , ' 3 ' , ' 1 ' } , { ' 1 ' , ' 3 ' , ' 3 ' , ' 1 ' , ' 1 ' , ' 3 ' , ' 3 ' , ' 1 ' } , { ' 3 ' , ' 1 ' , ' 3 ' , ' 1 ' , ' 1 ' , ' 3 ' , ' 3 ' , ' 1 ' } ,
{ ' 1 ' , ' 3 ' , ' 1 ' , ' 3 ' , ' 3 ' , ' 1 ' , ' 3 ' , ' 1 ' } , { ' 3 ' , ' 1 ' , ' 1 ' , ' 3 ' , ' 3 ' , ' 1 ' , ' 3 ' , ' 1 ' } , { ' 1 ' , ' 3 ' , ' 3 ' , ' 1 ' , ' 3 ' , ' 1 ' , ' 3 ' , ' 1 ' } ,
{ ' 3 ' , ' 1 ' , ' 3 ' , ' 1 ' , ' 3 ' , ' 1 ' , ' 3 ' , ' 1 ' }
2016-02-20 13:50:15 +03:00
} ;
2021-10-21 01:05:30 +03:00
static const char MSITable [ 10 ] [ 8 ] = {
{ ' 1 ' , ' 2 ' , ' 1 ' , ' 2 ' , ' 1 ' , ' 2 ' , ' 1 ' , ' 2 ' } , { ' 1 ' , ' 2 ' , ' 1 ' , ' 2 ' , ' 1 ' , ' 2 ' , ' 2 ' , ' 1 ' } , { ' 1 ' , ' 2 ' , ' 1 ' , ' 2 ' , ' 2 ' , ' 1 ' , ' 1 ' , ' 2 ' } ,
{ ' 1 ' , ' 2 ' , ' 1 ' , ' 2 ' , ' 2 ' , ' 1 ' , ' 2 ' , ' 1 ' } , { ' 1 ' , ' 2 ' , ' 2 ' , ' 1 ' , ' 1 ' , ' 2 ' , ' 1 ' , ' 2 ' } , { ' 1 ' , ' 2 ' , ' 2 ' , ' 1 ' , ' 1 ' , ' 2 ' , ' 2 ' , ' 1 ' } ,
{ ' 1 ' , ' 2 ' , ' 2 ' , ' 1 ' , ' 2 ' , ' 1 ' , ' 1 ' , ' 2 ' } , { ' 1 ' , ' 2 ' , ' 2 ' , ' 1 ' , ' 2 ' , ' 1 ' , ' 2 ' , ' 1 ' } , { ' 2 ' , ' 1 ' , ' 1 ' , ' 2 ' , ' 1 ' , ' 2 ' , ' 1 ' , ' 2 ' } ,
{ ' 2 ' , ' 1 ' , ' 1 ' , ' 2 ' , ' 1 ' , ' 2 ' , ' 2 ' , ' 1 ' }
2016-02-20 13:50:15 +03:00
} ;
/* Not MSI/Plessey but the older Plessey standard */
2020-12-23 13:57:24 +03:00
INTERNAL int plessey ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) {
2016-02-20 13:50:15 +03:00
2020-12-23 13:57:24 +03:00
int i ;
2021-10-21 01:05:30 +03:00
unsigned char checkptr [ 65 * 4 + 8 ] = { 0 } ;
2016-02-20 13:50:15 +03:00
static const char grid [ 9 ] = { 1 , 1 , 1 , 1 , 0 , 1 , 0 , 0 , 1 } ;
2021-06-10 13:15:39 +03:00
char dest [ 554 ] ; /* 8 + 65 * 8 + 8 * 2 + 9 + 1 = 554 */
2021-10-21 01:05:30 +03:00
char * d = dest ;
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 02:13:39 +03:00
int error_number = 0 ;
2016-02-20 13:50:15 +03:00
if ( length > 65 ) {
2021-07-06 21:53:31 +03:00
strcpy ( symbol - > errtxt , " 370: Input too long (65 character maximum) " ) ;
2016-02-20 13:50:15 +03:00
return ZINT_ERROR_TOO_LONG ;
}
2021-10-21 01:05:30 +03:00
if ( ! is_sane ( SSET_F , source , length ) ) {
2021-07-06 21:53:31 +03:00
strcpy ( symbol - > errtxt , " 371: Invalid character in data (digits and \" ABCDEF \" 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 02:13:39 +03:00
return ZINT_ERROR_INVALID_DATA ;
2016-02-20 13:50:15 +03:00
}
2021-08-10 14:04:25 +03:00
2016-02-20 13:50:15 +03:00
/* Start character */
2021-10-21 01:05:30 +03:00
memcpy ( d , " 31311331 " , 8 ) ;
d + = 8 ;
2016-02-20 13:50:15 +03:00
/* Data area */
2021-10-21 01:05:30 +03:00
for ( i = 0 ; i < length ; i + + , d + = 8 ) {
unsigned int check = source [ i ] - ' 0 ' - ( source [ i ] > > 6 ) * 7 ;
memcpy ( d , PlessTable [ check ] , 8 ) ;
2016-02-20 13:50:15 +03:00
checkptr [ 4 * i ] = check & 1 ;
checkptr [ 4 * i + 1 ] = ( check > > 1 ) & 1 ;
checkptr [ 4 * i + 2 ] = ( check > > 2 ) & 1 ;
checkptr [ 4 * i + 3 ] = ( check > > 3 ) & 1 ;
}
/* CRC check digit code adapted from code by Leonid A. Broukhis
used in GNU Barcode */
for ( i = 0 ; i < ( 4 * length ) ; i + + ) {
2017-09-10 18:03:09 +03:00
if ( checkptr [ i ] ) {
int j ;
2016-02-20 13:50:15 +03:00
for ( j = 0 ; j < 9 ; j + + )
checkptr [ i + j ] ^ = grid [ j ] ;
2017-09-10 18:03:09 +03:00
}
2016-02-20 13:50:15 +03:00
}
for ( i = 0 ; i < 8 ; i + + ) {
switch ( checkptr [ length * 4 + i ] ) {
2021-10-21 01:05:30 +03:00
case 0 : memcpy ( d , " 13 " , 2 ) ;
d + = 2 ;
2016-02-20 13:50:15 +03:00
break ;
2021-10-21 01:05:30 +03:00
case 1 : memcpy ( d , " 31 " , 2 ) ;
d + = 2 ;
2016-02-20 13:50:15 +03:00
break ;
}
}
/* Stop character */
2021-10-21 01:05:30 +03:00
memcpy ( d , " 331311313 " , 9 ) ;
d + = 9 ;
2016-02-20 13:50:15 +03:00
2021-10-21 01:05:30 +03:00
expand ( symbol , dest , d - dest ) ;
2021-06-10 13:15:39 +03:00
2021-06-19 15:11:23 +03:00
// TODO: Find documentation on BARCODE_PLESSEY dimensions/height
2021-06-10 13:15:39 +03:00
symbol - > text [ 0 ] = ' \0 ' ;
ustrncat ( symbol - > text , source , length ) ;
2016-02-20 13:50:15 +03:00
return error_number ;
2008-07-14 01:15:55 +04:00
}
2021-06-10 13:15:39 +03:00
/* Modulo 10 check digit - Luhn algorithm
See https : //en.wikipedia.org/wiki/Luhn_algorithm */
static char msi_check_digit_mod10 ( const unsigned char source [ ] , const int length ) {
static const int vals [ 2 ] [ 10 ] = {
{ 0 , 2 , 4 , 6 , 8 , 1 , 3 , 5 , 7 , 9 } , /* Doubled and digits summed */
{ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 } , /* Single */
} ;
int i , x = 0 , undoubled = 0 ;
for ( i = length - 1 ; i > = 0 ; i - - ) {
2021-08-10 14:04:25 +03:00
/* Note overflow impossible for max length 65 * max weight 9 * max val 15 == 8775 */
2021-06-10 13:15:39 +03:00
x + = vals [ undoubled ] [ ctoi ( source [ i ] ) ] ;
undoubled = ! undoubled ;
2016-02-20 13:50:15 +03:00
}
2008-07-14 01:15:55 +04:00
2021-06-10 13:15:39 +03:00
return itoc ( ( 10 - x % 10 ) % 10 ) ;
2008-07-14 01:15:55 +04:00
}
2021-06-10 13:15:39 +03:00
/* Modulo 11 check digit - IBM weight system wrap = 7, NCR system wrap = 9
See https : //en.wikipedia.org/wiki/MSI_Barcode */
static char msi_check_digit_mod11 ( const unsigned char source [ ] , const int length , const int wrap ) {
int i , x = 0 , weight = 2 ;
2016-03-03 00:12:38 +03:00
2021-06-10 13:15:39 +03:00
for ( i = length - 1 ; i > = 0 ; i - - ) {
2021-08-10 14:04:25 +03:00
/* Note overflow impossible for max length 65 * max weight 9 * max val 15 == 8775 */
2021-06-10 13:15:39 +03:00
x + = weight * ctoi ( source [ i ] ) ;
weight + + ;
if ( weight > wrap ) {
weight = 2 ;
}
}
2016-02-20 13:50:15 +03:00
2021-06-10 13:15:39 +03:00
return itoc ( ( 11 - x % 11 ) % 11 ) ; /* Will return 'A' for 10 */
}
2016-02-20 13:50:15 +03:00
2021-06-10 13:15:39 +03:00
/* Plain MSI Plessey - does not calculate any check character */
2021-10-21 01:05:30 +03:00
static char * msi_plessey_nomod ( struct zint_symbol * symbol , const unsigned char source [ ] , const int length ,
char * d ) {
2016-02-20 13:50:15 +03:00
2021-06-10 13:15:39 +03:00
int i ;
2016-02-20 13:50:15 +03:00
2021-10-21 01:05:30 +03:00
for ( i = 0 ; i < length ; i + + , d + = 8 ) {
memcpy ( d , MSITable [ source [ i ] - ' 0 ' ] , 8 ) ;
2016-02-20 13:50:15 +03:00
}
2021-06-10 13:15:39 +03:00
symbol - > text [ 0 ] = ' \0 ' ;
ustrncat ( symbol - > text , source , length ) ;
2021-10-21 01:05:30 +03:00
return d ;
2008-07-14 01:15:55 +04:00
}
2021-06-10 13:15:39 +03:00
/* MSI Plessey with Modulo 10 check digit */
2021-10-21 01:05:30 +03:00
static char * msi_plessey_mod10 ( struct zint_symbol * symbol , const unsigned char source [ ] , const int length ,
const int no_checktext , char * d ) {
2021-06-10 13:15:39 +03:00
int i ;
char check_digit ;
2016-02-20 13:50:15 +03:00
/* draw data section */
2021-10-21 01:05:30 +03:00
for ( i = 0 ; i < length ; i + + , d + = 8 ) {
memcpy ( d , MSITable [ source [ i ] - ' 0 ' ] , 8 ) ;
2016-02-20 13:50:15 +03:00
}
2021-06-10 13:15:39 +03:00
/* calculate check digit */
check_digit = msi_check_digit_mod10 ( source , length ) ;
2016-02-20 13:50:15 +03:00
2021-06-10 13:15:39 +03:00
/* draw check digit */
2021-10-21 01:05:30 +03:00
memcpy ( d , MSITable [ check_digit - ' 0 ' ] , 8 ) ;
d + = 8 ;
2016-02-20 13:50:15 +03:00
2021-06-10 13:15:39 +03:00
symbol - > text [ 0 ] = ' \0 ' ;
ustrncat ( symbol - > text , source , length ) ;
if ( ! no_checktext ) {
symbol - > text [ length ] = check_digit ;
symbol - > text [ length + 1 ] = ' \0 ' ;
2016-02-20 13:50:15 +03:00
}
2021-10-21 01:05:30 +03:00
return d ;
2021-06-10 13:15:39 +03:00
}
2012-12-31 17:41:59 +04:00
2021-06-10 13:15:39 +03:00
/* MSI Plessey with two Modulo 10 check digits */
2021-10-21 01:05:30 +03:00
static char * msi_plessey_mod1010 ( struct zint_symbol * symbol , const unsigned char source [ ] , const int length ,
const int no_checktext , char * d ) {
2009-10-06 23:03:00 +04:00
2021-06-10 13:15:39 +03:00
int i ;
unsigned char temp [ 65 + 2 + 1 ] ;
2008-09-16 11:44:01 +04:00
2021-06-10 13:15:39 +03:00
/* Append check digits */
temp [ 0 ] = ' \0 ' ;
ustrncat ( temp , source , length ) ;
temp [ length ] = msi_check_digit_mod10 ( source , length ) ;
temp [ length + 1 ] = msi_check_digit_mod10 ( temp , length + 1 ) ;
temp [ length + 2 ] = ' \0 ' ;
2012-12-31 17:41:59 +04:00
2021-06-10 13:15:39 +03:00
/* draw data section */
2021-10-21 01:05:30 +03:00
for ( i = 0 ; i < length + 2 ; i + + , d + = 8 ) {
memcpy ( d , MSITable [ temp [ i ] - ' 0 ' ] , 8 ) ;
2016-02-20 13:50:15 +03:00
}
2021-06-10 13:15:39 +03:00
if ( no_checktext ) {
symbol - > text [ 0 ] = ' \0 ' ;
ustrncat ( symbol - > text , source , length ) ;
} else {
ustrcpy ( symbol - > text , temp ) ;
2016-02-20 13:50:15 +03:00
}
2021-10-21 01:05:30 +03:00
return d ;
2016-02-20 13:50:15 +03:00
}
2021-06-10 13:15:39 +03:00
/* MSI Plessey with Modulo 11 check digit */
2021-10-21 01:05:30 +03:00
static char * msi_plessey_mod11 ( struct zint_symbol * symbol , const unsigned char source [ ] , const int length ,
const int no_checktext , const int wrap , char * d ) {
2021-06-10 13:15:39 +03:00
/* Uses the IBM weight system if wrap = 7, and the NCR system if wrap = 9 */
int i ;
char check_digit ;
2016-02-20 13:50:15 +03:00
/* draw data section */
2021-10-21 01:05:30 +03:00
for ( i = 0 ; i < length ; i + + , d + = 8 ) {
memcpy ( d , MSITable [ source [ i ] - ' 0 ' ] , 8 ) ;
2016-02-20 13:50:15 +03:00
}
2021-06-10 13:15:39 +03:00
/* Append check digit */
check_digit = msi_check_digit_mod11 ( source , length , wrap ) ;
if ( check_digit = = ' A ' ) {
2021-10-21 01:05:30 +03:00
memcpy ( d , MSITable [ 1 ] , 8 ) ;
d + = 8 ;
memcpy ( d , MSITable [ 0 ] , 8 ) ;
d + = 8 ;
2016-02-20 13:50:15 +03:00
} else {
2021-10-21 01:05:30 +03:00
memcpy ( d , MSITable [ check_digit - ' 0 ' ] , 8 ) ;
d + = 8 ;
2016-02-20 13:50:15 +03:00
}
2021-06-10 13:15:39 +03:00
symbol - > text [ 0 ] = ' \0 ' ;
ustrncat ( symbol - > text , source , length ) ;
if ( ! no_checktext ) {
if ( check_digit = = ' A ' ) {
ustrcat ( symbol - > text , " 10 " ) ;
} else {
symbol - > text [ length ] = check_digit ;
symbol - > text [ length + 1 ] = ' \0 ' ;
}
2016-02-20 13:50:15 +03:00
}
2021-10-21 01:05:30 +03:00
return d ;
2016-02-20 13:50:15 +03:00
}
2021-06-10 13:15:39 +03:00
/* MSI Plessey with Modulo 11 check digit and Modulo 10 check digit */
2021-10-21 01:05:30 +03:00
static char * msi_plessey_mod1110 ( struct zint_symbol * symbol , const unsigned char source [ ] , const int length ,
const int no_checktext , const int wrap , char * d ) {
2021-06-10 13:15:39 +03:00
/* Uses the IBM weight system if wrap = 7, and the NCR system if wrap = 9 */
int i ;
char check_digit ;
unsigned char temp [ 65 + 3 + 1 ] ;
int temp_len = length ;
temp [ 0 ] = ' \0 ' ;
ustrncat ( temp , source , length ) ;
/* Append first (mod 11) digit */
check_digit = msi_check_digit_mod11 ( source , length , wrap ) ;
if ( check_digit = = ' A ' ) {
temp [ temp_len + + ] = ' 1 ' ;
temp [ temp_len + + ] = ' 0 ' ;
} else {
temp [ temp_len + + ] = check_digit ;
2016-02-20 13:50:15 +03:00
}
2021-06-10 13:15:39 +03:00
/* Append second (mod 10) check digit */
temp [ temp_len ] = msi_check_digit_mod10 ( temp , temp_len ) ;
temp [ + + temp_len ] = ' \0 ' ;
2016-02-20 13:50:15 +03:00
/* draw data section */
2021-10-21 01:05:30 +03:00
for ( i = 0 ; i < temp_len ; i + + , d + = 8 ) {
memcpy ( d , MSITable [ temp [ i ] - ' 0 ' ] , 8 ) ;
2016-02-20 13:50:15 +03:00
}
2021-06-10 13:15:39 +03:00
if ( no_checktext ) {
symbol - > text [ 0 ] = ' \0 ' ;
ustrncat ( symbol - > text , source , length ) ;
2016-02-20 13:50:15 +03:00
} else {
2021-06-10 13:15:39 +03:00
ustrcpy ( symbol - > text , temp ) ;
2016-02-20 13:50:15 +03:00
}
2021-10-21 01:05:30 +03:00
return d ;
2016-02-20 13:50:15 +03: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 02:13:39 +03:00
INTERNAL int msi_plessey ( struct zint_symbol * symbol , unsigned char source [ ] , int length ) {
int error_number = 0 ;
2021-06-10 13:15:39 +03:00
char dest [ 550 ] ; /* 2 + 65 * 8 + 3 * 8 + 3 + 1 = 550 */
2021-10-21 01:05:30 +03:00
char * d = dest ;
2021-06-10 13:15:39 +03:00
int check_option = symbol - > option_2 ;
int no_checktext = 0 ;
2016-02-20 13:50:15 +03:00
2021-08-10 14:04:25 +03:00
if ( length > 65 ) {
strcpy ( symbol - > errtxt , " 372: Input too long (65 character maximum) " ) ;
return ZINT_ERROR_TOO_LONG ;
}
2021-10-21 01:05:30 +03:00
if ( ! is_sane ( NEON_F , source , length ) ) {
2021-07-06 21:53:31 +03:00
strcpy ( symbol - > errtxt , " 377: Invalid character in data (digits only) " ) ;
2016-02-20 13:50:15 +03:00
return ZINT_ERROR_INVALID_DATA ;
}
2021-06-10 13:15:39 +03:00
if ( check_option > = 11 & & check_option < = 16 ) { /* +10 means don't print check digits in HRT */
check_option - = 10 ;
no_checktext = 1 ;
}
if ( ( check_option < 0 ) | | ( check_option > 6 ) ) {
check_option = 0 ;
2016-02-20 13:50:15 +03:00
}
2021-06-10 13:15:39 +03:00
/* Start character */
2021-10-21 01:05:30 +03:00
memcpy ( d , " 21 " , 2 ) ;
d + = 2 ;
2021-06-10 13:15:39 +03:00
switch ( check_option ) {
2021-10-21 01:05:30 +03:00
case 0 : d = msi_plessey_nomod ( symbol , source , length , d ) ;
2021-06-10 13:15:39 +03:00
break ;
2021-10-21 01:05:30 +03:00
case 1 : d = msi_plessey_mod10 ( symbol , source , length , no_checktext , d ) ;
2016-02-20 13:50:15 +03:00
break ;
2021-10-21 01:05:30 +03:00
case 2 : d = msi_plessey_mod1010 ( symbol , source , length , no_checktext , d ) ;
2016-02-20 13:50:15 +03:00
break ;
2021-10-21 01:05:30 +03:00
case 3 : d = msi_plessey_mod11 ( symbol , source , length , no_checktext , 7 /*IBM wrap*/ , d ) ;
2016-02-20 13:50:15 +03:00
break ;
2021-10-21 01:05:30 +03:00
case 4 : d = msi_plessey_mod1110 ( symbol , source , length , no_checktext , 7 /*IBM wrap*/ , d ) ;
2016-02-20 13:50:15 +03:00
break ;
2021-10-21 01:05:30 +03:00
case 5 : d = msi_plessey_mod11 ( symbol , source , length , no_checktext , 9 /*NCR wrap*/ , d ) ;
2021-06-10 13:15:39 +03:00
break ;
2021-10-21 01:05:30 +03:00
case 6 : d = msi_plessey_mod1110 ( symbol , source , length , no_checktext , 9 /*NCR wrap*/ , d ) ;
2016-02-20 13:50:15 +03:00
break ;
}
2021-06-10 13:15:39 +03:00
/* Stop character */
2021-10-21 01:05:30 +03:00
memcpy ( d , " 121 " , 3 ) ;
d + = 3 ;
2021-06-10 13:15:39 +03:00
2021-10-21 01:05:30 +03:00
expand ( symbol , dest , d - dest ) ;
2021-06-10 13:15:39 +03:00
2021-06-19 15:11:23 +03:00
// TODO: Find documentation on BARCODE_MSI_PLESSEY dimensions/height
2016-02-20 13:50:15 +03:00
return error_number ;
2008-07-14 01:15:55 +04:00
}