2008-07-14 09:15:55 +12:00
/* telepen.c - Handles Telepen and Telepen numeric */
/*
libzint - the open source barcode library
2017-08-27 20:31:02 +12:00
Copyright ( C ) 2008 - 2017 Robin Stuart < rstuart114 @ gmail . com >
2008-07-14 09:15:55 +12:00
2013-05-17 05:26:38 +12:00
Redistribution and use in source and binary forms , with or without
modification , are permitted provided that the following conditions
are met :
2008-07-14 09:15:55 +12:00
2017-10-24 08:37:52 +13:00
1. Redistributions of source code must retain the above copyright
notice , this list of conditions and the following disclaimer .
2013-05-17 05:26:38 +12:00
2. Redistributions in binary form must reproduce the above copyright
notice , this list of conditions and the following disclaimer in the
2017-10-24 08:37:52 +13:00
documentation and / or other materials provided with the distribution .
2013-05-17 05:26:38 +12: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-24 08:37:52 +13:00
without specific prior written permission .
2008-07-14 09:15:55 +12:00
2013-05-17 05:26:38 +12: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-24 08:37:52 +13:00
OUT OF THE USE OF THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF
2013-05-17 05:26:38 +12:00
SUCH DAMAGE .
2016-02-21 00:29:19 +13:00
*/
2019-12-19 13:37:55 +13:00
/* vim: set ts=4 sw=4 et : */
2008-07-14 09:15:55 +12:00
2020-06-05 05:45:25 +12:00
/* Telepen Barcode Symbology information and History (BSiH) https://telepen.co.uk/wp-content/uploads/2018/10/Barcode-Symbology-information-and-History.pdf */
# define SODIUM "0123456789X"
2008-09-19 21:16:19 +12:00
2008-07-14 09:15:55 +12:00
# include <stdio.h>
# include "common.h"
2016-03-03 10:12:38 +13:00
static char * TeleTable [ ] = {
2020-06-05 05:45:25 +12:00
" 31313131 " , " 1131313111 " , " 33313111 " , " 1111313131 " , " 3111313111 " , " 11333131 " , " 13133131 " , " 111111313111 " ,
2016-02-21 00:29:19 +13:00
" 31333111 " , " 1131113131 " , " 33113131 " , " 1111333111 " , " 3111113131 " , " 1113133111 " , " 1311133111 " , " 111111113131 " ,
" 3131113111 " , " 11313331 " , " 333331 " , " 111131113111 " , " 31113331 " , " 1133113111 " , " 1313113111 " , " 1111113331 " ,
" 31131331 " , " 113111113111 " , " 3311113111 " , " 1111131331 " , " 311111113111 " , " 1113111331 " , " 1311111331 " , " 11111111113111 " ,
" 31313311 " , " 1131311131 " , " 33311131 " , " 1111313311 " , " 3111311131 " , " 11333311 " , " 13133311 " , " 111111311131 " ,
" 31331131 " , " 1131113311 " , " 33113311 " , " 1111331131 " , " 3111113311 " , " 1113131131 " , " 1311131131 " , " 111111113311 " ,
" 3131111131 " , " 1131131311 " , " 33131311 " , " 111131111131 " , " 3111131311 " , " 1133111131 " , " 1313111131 " , " 111111131311 " ,
" 3113111311 " , " 113111111131 " , " 3311111131 " , " 111113111311 " , " 311111111131 " , " 111311111311 " , " 131111111311 " , " 11111111111131 " ,
" 3131311111 " , " 11313133 " , " 333133 " , " 111131311111 " , " 31113133 " , " 1133311111 " , " 1313311111 " , " 1111113133 " ,
" 313333 " , " 113111311111 " , " 3311311111 " , " 11113333 " , " 311111311111 " , " 11131333 " , " 13111333 " , " 11111111311111 " ,
2020-06-05 05:45:25 +12:00
" 31311133 " , " 1131331111 " , " 33331111 " , " 1111311133 " , " 3111331111 " , " 11331133 " , " 13131133 " , " 111111331111 " ,
2016-02-21 00:29:19 +13:00
" 3113131111 " , " 1131111133 " , " 33111133 " , " 111113131111 " , " 3111111133 " , " 111311131111 " , " 131111131111 " , " 111111111133 " ,
" 31311313 " , " 113131111111 " , " 3331111111 " , " 1111311313 " , " 311131111111 " , " 11331313 " , " 13131313 " , " 11111131111111 " ,
" 3133111111 " , " 1131111313 " , " 33111313 " , " 111133111111 " , " 3111111313 " , " 111313111111 " , " 131113111111 " , " 111111111313 " ,
" 313111111111 " , " 1131131113 " , " 33131113 " , " 11113111111111 " , " 3111131113 " , " 113311111111 " , " 131311111111 " , " 111111131113 " ,
2020-06-05 05:45:25 +12:00
" 3113111113 " , " 11311111111111 " , " 331111111111 " , " 111113111113 " , " 31111111111111 " , " 111311111113 " , " 131111111113 " , " 1111111111111111 " ,
2016-02-21 00:29:19 +13:00
} ;
2019-12-19 13:37:55 +13:00
INTERNAL int telepen ( struct zint_symbol * symbol , unsigned char source [ ] , const size_t src_len ) {
2016-02-21 00:29:19 +13:00
unsigned int i , count , check_digit ;
int error_number ;
2020-06-05 05:45:25 +12:00
char dest [ 521 ] ; /* 12 (start) + 30 * 16 (max for DELs) + 16 (check digit) + 12 (stop) + 1 = 521 */
2016-02-21 00:29:19 +13:00
error_number = 0 ;
count = 0 ;
if ( src_len > 30 ) {
2017-07-28 03:01:53 +12:00
strcpy ( symbol - > errtxt , " 390: Input too long " ) ;
2016-02-21 00:29:19 +13:00
return ZINT_ERROR_TOO_LONG ;
}
/* Start character */
strcpy ( dest , TeleTable [ ' _ ' ] ) ;
for ( i = 0 ; i < src_len ; i + + ) {
2020-06-05 05:45:25 +12:00
if ( source [ i ] > 127 ) {
2016-02-21 00:29:19 +13:00
/* Cannot encode extended ASCII */
2017-07-28 03:01:53 +12:00
strcpy ( symbol - > errtxt , " 391: Invalid characters in input data " ) ;
2016-02-21 00:29:19 +13:00
return ZINT_ERROR_INVALID_DATA ;
}
2016-03-03 10:12:38 +13:00
strcat ( dest , TeleTable [ source [ i ] ] ) ;
2016-02-21 00:29:19 +13:00
count + = source [ i ] ;
}
check_digit = 127 - ( count % 127 ) ;
if ( check_digit = = 127 ) {
check_digit = 0 ;
}
2016-03-03 10:12:38 +13:00
strcat ( dest , TeleTable [ check_digit ] ) ;
2016-02-21 00:29:19 +13:00
/* Stop character */
2016-03-03 10:12:38 +13:00
strcat ( dest , TeleTable [ ' z ' ] ) ;
2016-02-21 00:29:19 +13:00
expand ( symbol , dest ) ;
for ( i = 0 ; i < src_len ; i + + ) {
if ( source [ i ] = = ' \0 ' ) {
symbol - > text [ i ] = ' ' ;
} else {
symbol - > text [ i ] = source [ i ] ;
}
}
symbol - > text [ src_len ] = ' \0 ' ;
return error_number ;
2008-07-14 09:15:55 +12:00
}
2019-12-19 13:37:55 +13:00
INTERNAL int telepen_num ( struct zint_symbol * symbol , unsigned char source [ ] , const size_t src_len ) {
2017-05-29 21:43:47 +12:00
unsigned int count , check_digit , glyph ;
int error_number ;
2020-06-05 05:45:25 +12:00
size_t i , temp_length = src_len ;
char dest [ 521 ] ; /* 12 (start) + 30 * 16 (max for DELs) + 16 (check digit) + 12 (stop) + 1 = 521 */
2016-02-21 00:29:19 +13:00
unsigned char temp [ 64 ] ;
count = 0 ;
if ( temp_length > 60 ) {
2017-07-28 03:01:53 +12:00
strcpy ( symbol - > errtxt , " 392: Input too long " ) ;
2016-02-21 00:29:19 +13:00
return ZINT_ERROR_TOO_LONG ;
}
ustrcpy ( temp , source ) ;
to_upper ( temp ) ;
2017-03-04 23:00:03 +13:00
error_number = is_sane ( SODIUM , temp , temp_length ) ;
2016-02-21 00:29:19 +13:00
if ( error_number = = ZINT_ERROR_INVALID_DATA ) {
2017-07-28 03:01:53 +12:00
strcpy ( symbol - > errtxt , " 393: Invalid characters in data " ) ;
2016-02-21 00:29:19 +13:00
return error_number ;
}
/* Add a leading zero if required */
if ( temp_length & 1 ) {
memmove ( temp + 1 , temp , temp_length ) ;
temp [ 0 ] = ' 0 ' ;
temp [ + + temp_length ] = ' \0 ' ;
}
/* Start character */
strcpy ( dest , TeleTable [ ' _ ' ] ) ;
for ( i = 0 ; i < temp_length ; i + = 2 ) {
if ( temp [ i ] = = ' X ' ) {
2017-07-28 03:01:53 +12:00
strcpy ( symbol - > errtxt , " 394: Invalid position of X in Telepen data " ) ;
2016-02-21 00:29:19 +13:00
return ZINT_ERROR_INVALID_DATA ;
}
if ( temp [ i + 1 ] = = ' X ' ) {
glyph = ctoi ( temp [ i ] ) + 17 ;
count + = glyph ;
} else {
glyph = ( 10 * ctoi ( temp [ i ] ) ) + ctoi ( temp [ i + 1 ] ) ;
glyph + = 27 ;
count + = glyph ;
}
2016-03-03 10:12:38 +13:00
strcat ( dest , TeleTable [ glyph ] ) ;
2016-02-21 00:29:19 +13:00
}
check_digit = 127 - ( count % 127 ) ;
if ( check_digit = = 127 ) {
check_digit = 0 ;
}
2016-03-03 10:12:38 +13:00
strcat ( dest , TeleTable [ check_digit ] ) ;
2016-02-21 00:29:19 +13:00
/* Stop character */
2016-03-03 10:12:38 +13:00
strcat ( dest , TeleTable [ ' z ' ] ) ;
2016-02-21 00:29:19 +13:00
expand ( symbol , dest ) ;
ustrcpy ( symbol - > text , temp ) ;
return error_number ;
2008-07-14 09:15:55 +12:00
}