API overhaul part 1: removal of nullchar

This commit is contained in:
hooper114 2009-09-29 09:45:46 +00:00
parent 4455c6a893
commit 04b9a99241
42 changed files with 1458 additions and 1194 deletions

View File

@ -35,7 +35,7 @@ static char *C25InterTable[10] = {"11331", "31113", "13113", "33111", "11313", "
"31131", "13131"}; "31131", "13131"};
int matrix_two_of_five(struct zint_symbol *symbol, unsigned char source[]) int matrix_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length)
{ /* Code 2 of 5 Standard (Code 2 of 5 Matrix) */ { /* Code 2 of 5 Standard (Code 2 of 5 Matrix) */
int i, error_number; int i, error_number;
@ -44,11 +44,11 @@ int matrix_two_of_five(struct zint_symbol *symbol, unsigned char source[])
error_number = 0; error_number = 0;
strcpy(dest, ""); strcpy(dest, "");
if(ustrlen(source) > 80) { if(length > 80) {
strcpy(symbol->errtxt, "Input too long"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
error_number = is_sane(NESET, source); error_number = is_sane(NESET, source, length);
if(error_number == ERROR_INVALID_DATA) { if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in data"); strcpy(symbol->errtxt, "Invalid characters in data");
return error_number; return error_number;
@ -57,7 +57,7 @@ int matrix_two_of_five(struct zint_symbol *symbol, unsigned char source[])
/* start character */ /* start character */
concat (dest, "411111"); concat (dest, "411111");
for(i = 0; i <= ustrlen(source); i++) { for(i = 0; i <= length; i++) {
lookup(NESET, C25MatrixTable, source[i], dest); lookup(NESET, C25MatrixTable, source[i], dest);
} }
@ -69,7 +69,7 @@ int matrix_two_of_five(struct zint_symbol *symbol, unsigned char source[])
return error_number; return error_number;
} }
int industrial_two_of_five(struct zint_symbol *symbol, unsigned char source[]) int industrial_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length)
{ /* Code 2 of 5 Industrial */ { /* Code 2 of 5 Industrial */
int i, error_number; int i, error_number;
@ -78,11 +78,11 @@ int industrial_two_of_five(struct zint_symbol *symbol, unsigned char source[])
error_number = 0; error_number = 0;
strcpy(dest, ""); strcpy(dest, "");
if(ustrlen(source) > 45) { if(length > 45) {
strcpy(symbol->errtxt, "Input too long"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
error_number = is_sane(NESET, source); error_number = is_sane(NESET, source, length);
if(error_number == ERROR_INVALID_DATA) { if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid character in data"); strcpy(symbol->errtxt, "Invalid character in data");
return error_number; return error_number;
@ -91,7 +91,7 @@ int industrial_two_of_five(struct zint_symbol *symbol, unsigned char source[])
/* start character */ /* start character */
concat (dest, "313111"); concat (dest, "313111");
for(i = 0; i <= ustrlen(source); i++) { for(i = 0; i <= length; i++) {
lookup(NESET, C25IndustTable, source[i], dest); lookup(NESET, C25IndustTable, source[i], dest);
} }
@ -103,7 +103,7 @@ int industrial_two_of_five(struct zint_symbol *symbol, unsigned char source[])
return error_number; return error_number;
} }
int iata_two_of_five(struct zint_symbol *symbol, unsigned char source[]) int iata_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length)
{ /* Code 2 of 5 IATA */ { /* Code 2 of 5 IATA */
int i, error_number; int i, error_number;
char dest[1000]; char dest[1000];
@ -111,11 +111,11 @@ int iata_two_of_five(struct zint_symbol *symbol, unsigned char source[])
error_number = 0; error_number = 0;
strcpy(dest, ""); strcpy(dest, "");
if(ustrlen(source) > 45) { if(length > 45) {
strcpy(symbol->errtxt, "Input too long"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
error_number = is_sane(NESET, source); error_number = is_sane(NESET, source, length);
if(error_number == ERROR_INVALID_DATA) { if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in data"); strcpy(symbol->errtxt, "Invalid characters in data");
return error_number; return error_number;
@ -124,7 +124,7 @@ int iata_two_of_five(struct zint_symbol *symbol, unsigned char source[])
/* start */ /* start */
concat (dest, "1111"); concat (dest, "1111");
for(i = 0; i < ustrlen(source); i++) { for(i = 0; i < length; i++) {
lookup(NESET, C25IndustTable, source[i], dest); lookup(NESET, C25IndustTable, source[i], dest);
} }
@ -136,7 +136,7 @@ int iata_two_of_five(struct zint_symbol *symbol, unsigned char source[])
return error_number; return error_number;
} }
int logic_two_of_five(struct zint_symbol *symbol, unsigned char source[]) int logic_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length)
{ /* Code 2 of 5 Data Logic */ { /* Code 2 of 5 Data Logic */
int i, error_number; int i, error_number;
@ -145,11 +145,11 @@ int logic_two_of_five(struct zint_symbol *symbol, unsigned char source[])
error_number = 0; error_number = 0;
strcpy(dest, ""); strcpy(dest, "");
if(ustrlen(source) > 80) { if(length > 80) {
strcpy(symbol->errtxt, "Input too long"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
error_number = is_sane(NESET, source); error_number = is_sane(NESET, source, length);
if(error_number == ERROR_INVALID_DATA) { if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in data"); strcpy(symbol->errtxt, "Invalid characters in data");
return error_number; return error_number;
@ -158,7 +158,7 @@ int logic_two_of_five(struct zint_symbol *symbol, unsigned char source[])
/* start character */ /* start character */
concat (dest, "1111"); concat (dest, "1111");
for(i = 0; i <= ustrlen(source); i++) { for(i = 0; i <= length; i++) {
lookup(NESET, C25MatrixTable, source[i], dest); lookup(NESET, C25MatrixTable, source[i], dest);
} }
@ -170,7 +170,7 @@ int logic_two_of_five(struct zint_symbol *symbol, unsigned char source[])
return error_number; return error_number;
} }
int interleaved_two_of_five(struct zint_symbol *symbol, unsigned char source[]) int interleaved_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length)
{ /* Code 2 of 5 Interleaved */ { /* Code 2 of 5 Interleaved */
int i, j, k, error_number; int i, j, k, error_number;
@ -179,11 +179,11 @@ int interleaved_two_of_five(struct zint_symbol *symbol, unsigned char source[])
error_number = 0; error_number = 0;
strcpy(dest, ""); strcpy(dest, "");
if(ustrlen(source) > 90) { if(length > 90) {
strcpy(symbol->errtxt, "Input too long"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
error_number = is_sane(NESET, source); error_number = is_sane(NESET, source, length);
if (error_number == ERROR_INVALID_DATA) { if (error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in data"); strcpy(symbol->errtxt, "Invalid characters in data");
return error_number; return error_number;
@ -191,14 +191,11 @@ int interleaved_two_of_five(struct zint_symbol *symbol, unsigned char source[])
/* Input must be an even number of characters for Interlaced 2 of 5 to work: /* Input must be an even number of characters for Interlaced 2 of 5 to work:
if an odd number of characters has been entered then add a leading zero */ if an odd number of characters has been entered then add a leading zero */
if ((ustrlen(source)%2) != 0) if ((length%2) != 0)
{ {
/* there are an odd number of input characters */ /* there are an odd number of input characters */
unsigned int length;
char temp[100]; char temp[100];
length = ustrlen(source);
strcpy(temp, (char*)source); strcpy(temp, (char*)source);
source[0] = '0'; source[0] = '0';
@ -206,12 +203,13 @@ int interleaved_two_of_five(struct zint_symbol *symbol, unsigned char source[])
{ {
source[i + 1] = temp[i]; source[i + 1] = temp[i];
} }
length++;
} }
/* start character */ /* start character */
concat(dest, "1111"); concat(dest, "1111");
for(i = 0; i < ustrlen(source); i+=2 ) for(i = 0; i < length; i+=2 )
{ {
/* look up the bars and the spaces and put them in two strings */ /* look up the bars and the spaces and put them in two strings */
strcpy(bars, ""); strcpy(bars, "");
@ -239,9 +237,9 @@ int interleaved_two_of_five(struct zint_symbol *symbol, unsigned char source[])
} }
int itf14(struct zint_symbol *symbol, unsigned char source[]) int itf14(struct zint_symbol *symbol, unsigned char source[], int length)
{ {
int i, error_number, h, zeroes; int i, error_number, zeroes;
unsigned int count, check_digit; unsigned int count, check_digit;
char localstr[15]; char localstr[15];
char checkstr[3]; char checkstr[3];
@ -249,14 +247,13 @@ int itf14(struct zint_symbol *symbol, unsigned char source[])
error_number = 0; error_number = 0;
count = 0; count = 0;
h = ustrlen(source);
if(h > 13) { if(length > 13) {
strcpy(symbol->errtxt, "Input too long"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
error_number = is_sane(NESET, source); error_number = is_sane(NESET, source, length);
if(error_number == ERROR_INVALID_DATA) { if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid character in data"); strcpy(symbol->errtxt, "Invalid character in data");
return error_number; return error_number;
@ -264,7 +261,7 @@ int itf14(struct zint_symbol *symbol, unsigned char source[])
/* Add leading zeros as required */ /* Add leading zeros as required */
strcpy(localstr, ""); strcpy(localstr, "");
zeroes = 13 - ustrlen(source); zeroes = 13 - length;
for(i = 0; i < zeroes; i++) { for(i = 0; i < zeroes; i++) {
concat(localstr, "0"); concat(localstr, "0");
} }
@ -286,33 +283,32 @@ int itf14(struct zint_symbol *symbol, unsigned char source[])
checkstr[0] = itoc(check_digit); checkstr[0] = itoc(check_digit);
checkstr[1] = '\0'; checkstr[1] = '\0';
concat(localstr, checkstr); concat(localstr, checkstr);
error_number = interleaved_two_of_five(symbol, (unsigned char *)localstr); error_number = interleaved_two_of_five(symbol, (unsigned char *)localstr, strlen(localstr));
ustrcpy(symbol->text, (unsigned char*)localstr); ustrcpy(symbol->text, (unsigned char*)localstr);
return error_number; return error_number;
} }
int dpleit(struct zint_symbol *symbol, unsigned char source[]) int dpleit(struct zint_symbol *symbol, unsigned char source[], int length)
{ /* Deutshe Post Leitcode */ { /* Deutshe Post Leitcode */
int i, error_number; int i, error_number;
unsigned int h, count, check_digit; unsigned int count, check_digit;
char localstr[15], checkstr[3]; char localstr[15], checkstr[3];
int zeroes; int zeroes;
error_number = 0; error_number = 0;
count = 0; count = 0;
h = ustrlen(source); if(length > 13) {
if(h > 13) {
strcpy(symbol->errtxt, "Input wrong length"); strcpy(symbol->errtxt, "Input wrong length");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
error_number = is_sane(NESET, source); error_number = is_sane(NESET, source, length);
if(error_number == ERROR_INVALID_DATA) { if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in data"); strcpy(symbol->errtxt, "Invalid characters in data");
return error_number; return error_number;
} }
strcpy(localstr, ""); strcpy(localstr, "");
zeroes = 13 - h; zeroes = 13 - length;
for(i = 0; i < zeroes; i++) for(i = 0; i < zeroes; i++)
concat(localstr, "0"); concat(localstr, "0");
concat(localstr, (char *)source); concat(localstr, (char *)source);
@ -331,31 +327,31 @@ int dpleit(struct zint_symbol *symbol, unsigned char source[])
checkstr[0] = itoc(check_digit); checkstr[0] = itoc(check_digit);
checkstr[1] = '\0'; checkstr[1] = '\0';
concat(localstr, checkstr); concat(localstr, checkstr);
error_number = interleaved_two_of_five(symbol, (unsigned char *)localstr); length = strlen(localstr);
error_number = interleaved_two_of_five(symbol, (unsigned char *)localstr, length);
ustrcpy(symbol->text, (unsigned char*)localstr); ustrcpy(symbol->text, (unsigned char*)localstr);
return error_number; return error_number;
} }
int dpident(struct zint_symbol *symbol, unsigned char source[]) int dpident(struct zint_symbol *symbol, unsigned char source[], int length)
{ /* Deutsche Post Identcode */ { /* Deutsche Post Identcode */
int i, error_number, zeroes; int i, error_number, zeroes;
unsigned int h, count, check_digit; unsigned int count, check_digit;
char localstr[13], checkstr[3]; char localstr[13], checkstr[3];
count = 0; count = 0;
h = ustrlen(source); if(length > 11) {
if(h > 11) {
strcpy(symbol->errtxt, "Input wrong length"); strcpy(symbol->errtxt, "Input wrong length");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
error_number = is_sane(NESET, source); error_number = is_sane(NESET, source, length);
if(error_number == ERROR_INVALID_DATA) { if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in data"); strcpy(symbol->errtxt, "Invalid characters in data");
return error_number; return error_number;
} }
strcpy(localstr, ""); strcpy(localstr, "");
zeroes = 11 - h; zeroes = 11 - length;
for(i = 0; i < zeroes; i++) for(i = 0; i < zeroes; i++)
concat(localstr, "0"); concat(localstr, "0");
concat(localstr, (char *)source); concat(localstr, (char *)source);
@ -374,7 +370,8 @@ int dpident(struct zint_symbol *symbol, unsigned char source[])
checkstr[0] = itoc(check_digit); checkstr[0] = itoc(check_digit);
checkstr[1] = '\0'; checkstr[1] = '\0';
concat(localstr, checkstr); concat(localstr, checkstr);
error_number = interleaved_two_of_five(symbol, (unsigned char *)localstr); length = strlen(localstr);
error_number = interleaved_two_of_five(symbol, (unsigned char *)localstr, length);
ustrcpy(symbol->text, (unsigned char*)localstr); ustrcpy(symbol->text, (unsigned char*)localstr);
return error_number; return error_number;
} }

View File

@ -5,10 +5,10 @@ project(zint)
find_package(PNG) find_package(PNG)
find_package(Qr) find_package(Qr)
set(zint_COMMON_SRCS common.c library.c ps.c large.c reedsol.c gs1.c svg.c) set(zint_COMMON_SRCS common.c library.c ps.c large.c reedsol.c gs1.c svg.c shiftjis.c)
set(zint_ONEDIM_SRCS code.c code128.c 2of5.c upcean.c telepen.c medical.c plessey.c rss.c) set(zint_ONEDIM_SRCS code.c code128.c 2of5.c upcean.c telepen.c medical.c plessey.c rss.c)
set(zint_POSTAL_SRCS postal.c auspost.c imail.c) set(zint_POSTAL_SRCS postal.c auspost.c imail.c)
set(zint_TWODIM_SRCS code16k.c blockf.c dmatrix.c dm200.c pdf417.c qr.c micqr.c maxicode.c composite.c aztec.c code49.c code1.c) set(zint_TWODIM_SRCS code16k.c blockf.c dmatrix.c dm200.c pdf417.c qr.c micqr.c maxicode.c composite.c aztec.c code49.c code1.c gridmtx.c)
set(zint_SRCS ${zint_COMMON_SRCS} ${zint_ONEDIM_SRCS} ${zint_POSTAL_SRCS} ${zint_TWODIM_SRCS} ) set(zint_SRCS ${zint_COMMON_SRCS} ${zint_ONEDIM_SRCS} ${zint_POSTAL_SRCS} ${zint_TWODIM_SRCS} )
if(PNG_FOUND) if(PNG_FOUND)

View File

@ -19,14 +19,14 @@ includedir := $(prefix)/include
libdir := $(prefix)/lib libdir := $(prefix)/lib
DESTDIR := DESTDIR :=
COMMON:= common.c png.c library.c ps.c large.c reedsol.c gs1.c svg.c COMMON:= common.c png.c library.c ps.c large.c reedsol.c gs1.c svg.c shiftjis.c
COMMON_OBJ:= common.o png.o library.o ps.o large.o reedsol.o gs1.o svg.o COMMON_OBJ:= common.o png.o library.o ps.o large.o reedsol.o gs1.o svg.o shiftjis.o
ONEDIM:= code.c code128.c 2of5.c upcean.c telepen.c medical.c plessey.c rss.c ONEDIM:= code.c code128.c 2of5.c upcean.c telepen.c medical.c plessey.c rss.c
ONEDIM_OBJ:= code.o code128.o 2of5.o upcean.o telepen.o medical.o plessey.o rss.o ONEDIM_OBJ:= code.o code128.o 2of5.o upcean.o telepen.o medical.o plessey.o rss.o
POSTAL:= postal.c auspost.c imail.c POSTAL:= postal.c auspost.c imail.c
POSTAL_OBJ:= postal.o auspost.o imail.o POSTAL_OBJ:= postal.o auspost.o imail.o
TWODIM:= code16k.c blockf.c dmatrix.c dm200.c pdf417.c qr.c maxicode.c composite.c aztec.c micqr.c code49.c code1.c TWODIM:= code16k.c blockf.c dmatrix.c dm200.c pdf417.c qr.c maxicode.c composite.c aztec.c micqr.c code49.c code1.c gridmtx.c
TWODIM_OBJ:= code16k.o blockf.o dmatrix.o dm200.o pdf417.o qr.o maxicode.o composite.o aztec.o micqr.o code49.o code1.o TWODIM_OBJ:= code16k.o blockf.o dmatrix.o dm200.o pdf417.o qr.o maxicode.o composite.o aztec.o micqr.o code49.o code1.o gridmtx.o
LIBS:= `libpng12-config --I_opts --L_opts --ldflags` -lz -lm LIBS:= `libpng12-config --I_opts --L_opts --ldflags` -lz -lm
ifeq ($(NO_QR),true) ifeq ($(NO_QR),true)
@ -36,7 +36,7 @@ DEFINES:=
LIBS+= -lqrencode LIBS+= -lqrencode
endif endif
libzint: code.c code128.c 2of5.c upcean.c medical.c telepen.c plessey.c postal.c auspost.c imail.c code16k.c dmatrix.c dm200.c reedsol.c pdf417.c maxicode.c rss.c common.c png.c library.c ps.c qr.c large.c composite.c aztec.c blockf.c micqr.c gs1.c svg.c code49.c code1.c libzint: code.c code128.c 2of5.c upcean.c medical.c telepen.c plessey.c postal.c auspost.c imail.c code16k.c dmatrix.c dm200.c reedsol.c pdf417.c maxicode.c rss.c common.c png.c library.c ps.c qr.c large.c composite.c aztec.c blockf.c micqr.c gs1.c svg.c code49.c code1.c gridmtx.c
$(CC) -Wall -fPIC $(CFLAGS) $(ZINT_VERSION) -c $(ONEDIM) $(CC) -Wall -fPIC $(CFLAGS) $(ZINT_VERSION) -c $(ONEDIM)
$(CC) -Wall -fPIC $(CFLAGS) $(ZINT_VERSION) -c $(POSTAL) $(CC) -Wall -fPIC $(CFLAGS) $(ZINT_VERSION) -c $(POSTAL)
$(CC) -Wall -fPIC $(DEFINES) $(CFLAGS) $(ZINT_VERSION) -c $(TWODIM) $(CC) -Wall -fPIC $(DEFINES) $(CFLAGS) $(ZINT_VERSION) -c $(TWODIM)

View File

@ -25,10 +25,10 @@ APP:=zint
DLL:=$(APP).dll DLL:=$(APP).dll
STATLIB:=lib$(APP).a STATLIB:=lib$(APP).a
COMMON_OBJ:= common.o png.o library.o ps.o large.o reedsol.o gs1.o svg.o COMMON_OBJ:= common.o png.o library.o ps.o large.o reedsol.o gs1.o svg.o shiftjis.o
ONEDIM_OBJ:= code.o code128.o 2of5.o upcean.o telepen.o medical.o plessey.o rss.o ONEDIM_OBJ:= code.o code128.o 2of5.o upcean.o telepen.o medical.o plessey.o rss.o
POSTAL_OBJ:= postal.o auspost.o imail.o POSTAL_OBJ:= postal.o auspost.o imail.o
TWODIM_OBJ:= code16k.o blockf.o dmatrix.o dm200.o pdf417.o qr.o maxicode.o composite.o aztec.o micqr.o code49.o TWODIM_OBJ:= code16k.o blockf.o dmatrix.o dm200.o pdf417.o qr.o maxicode.o composite.o aztec.o micqr.o code49.o code1.o gridmtx.o
LIB_OBJ:= $(COMMON_OBJ) $(ONEDIM_OBJ) $(TWODIM_OBJ) $(POSTAL_OBJ) LIB_OBJ:= $(COMMON_OBJ) $(ONEDIM_OBJ) $(TWODIM_OBJ) $(POSTAL_OBJ)
DLL_OBJ:= $(LIB_OBJ:.o=.lo) dllversion.lo DLL_OBJ:= $(LIB_OBJ:.o=.lo) dllversion.lo

View File

@ -94,7 +94,7 @@ void rs_error(char data_pattern[])
rs_free(); rs_free();
} }
int australia_post(struct zint_symbol *symbol, unsigned char source[]) int australia_post(struct zint_symbol *symbol, unsigned char source[], int length)
{ {
/* Handles Australia Posts's 4 State Codes */ /* Handles Australia Posts's 4 State Codes */
/* Customer Standard Barcode, Barcode 2 or Barcode 3 system determined automatically /* Customer Standard Barcode, Barcode 2 or Barcode 3 system determined automatically
@ -121,13 +121,13 @@ int australia_post(struct zint_symbol *symbol, unsigned char source[])
/* Do all of the length checking first to avoid stack smashing */ /* Do all of the length checking first to avoid stack smashing */
if(symbol->symbology == BARCODE_AUSPOST) { if(symbol->symbology == BARCODE_AUSPOST) {
/* Format control code (FCC) */ /* Format control code (FCC) */
switch(ustrlen(source)) switch(length)
{ {
case 8: strcpy(fcc, "11"); break; case 8: strcpy(fcc, "11"); break;
case 13: strcpy(fcc, "59"); break; case 13: strcpy(fcc, "59"); break;
case 16: strcpy(fcc, "59"); error_number = is_sane(NESET, source); break; case 16: strcpy(fcc, "59"); error_number = is_sane(NESET, source, length); break;
case 18: strcpy(fcc, "62"); break; case 18: strcpy(fcc, "62"); break;
case 23: strcpy(fcc, "62"); error_number = is_sane(NESET, source); break; case 23: strcpy(fcc, "62"); error_number = is_sane(NESET, source, length); break;
default: strcpy(symbol->errtxt, "Auspost input is wrong length"); default: strcpy(symbol->errtxt, "Auspost input is wrong length");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
break; break;
@ -148,14 +148,14 @@ int australia_post(struct zint_symbol *symbol, unsigned char source[])
} }
/* Add leading zeros as required */ /* Add leading zeros as required */
zeroes = 8 - ustrlen(source); zeroes = 8 - length;
for(i = 0; i < zeroes; i++) { for(i = 0; i < zeroes; i++) {
concat(localstr, "0"); concat(localstr, "0");
} }
} }
concat(localstr, (char*)source); concat(localstr, (char*)source);
error_number = is_sane(GDSET, (unsigned char *)localstr); error_number = is_sane(GDSET, (unsigned char *)localstr, length);
if(error_number == ERROR_INVALID_DATA) { if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in data"); strcpy(symbol->errtxt, "Invalid characters in data");
return error_number; return error_number;
@ -166,7 +166,7 @@ int australia_post(struct zint_symbol *symbol, unsigned char source[])
dpid[loopey] = localstr[loopey]; dpid[loopey] = localstr[loopey];
} }
dpid[8] = '\0'; dpid[8] = '\0';
error_number = is_sane(NESET, (unsigned char *)dpid); error_number = is_sane(NESET, (unsigned char *)dpid, 8);
if(error_number == ERROR_INVALID_DATA) { if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in DPID"); strcpy(symbol->errtxt, "Invalid characters in DPID");
return error_number; return error_number;

View File

@ -655,7 +655,7 @@ int aztec_text_process(unsigned char source[], char binary_string[], int gs1)
return 0; return 0;
} }
int aztec(struct zint_symbol *symbol, unsigned char source[]) int aztec(struct zint_symbol *symbol, unsigned char source[], int length)
{ {
int x, y, i, j, data_blocks, ecc_blocks, layers, total_bits; int x, y, i, j, data_blocks, ecc_blocks, layers, total_bits;
char binary_string[20000], bit_pattern[20045], descriptor[42]; char binary_string[20000], bit_pattern[20045], descriptor[42];
@ -669,11 +669,39 @@ int aztec(struct zint_symbol *symbol, unsigned char source[])
unsigned int* ecc_part; unsigned int* ecc_part;
#endif #endif
#ifndef _MSC_VER
unsigned char local_source[length];
#else
unsigned char local_source = (unsigned char*)_alloca(length);
#endif
memset(binary_string,0,20000); memset(binary_string,0,20000);
memset(adjusted_string,0,20000); memset(adjusted_string,0,20000);
if(symbol->input_mode == GS1_MODE) { gs1 = 1; } else { gs1 = 0; } if(symbol->input_mode == GS1_MODE) { gs1 = 1; } else { gs1 = 0; }
err_code = aztec_text_process(source, binary_string, gs1); /* The following to be replaced by ECI handling */
switch(symbol->input_mode) {
case DATA_MODE:
for(i = 0; i < length; i++) {
local_source[i] = source[i];
}
local_source[length] = '\0';
break;
case UNICODE_MODE:
err_code = latin1_process(symbol, source, local_source, &length);
if(err_code != 0) { return err_code; }
break;
}
/* Aztec code can't handle NULL characters */
for(i = 0; i < length; i++) {
if(local_source[i] == '\0') {
strcpy(symbol->errtxt, "Invalid character (NULL) in input data");
return ERROR_INVALID_DATA;
}
}
err_code = aztec_text_process(local_source, binary_string, gs1);
if(err_code != 0) { if(err_code != 0) {
strcpy(symbol->errtxt, "Input too long or too many extended ASCII characters"); strcpy(symbol->errtxt, "Input too long or too many extended ASCII characters");
@ -1209,26 +1237,24 @@ int aztec(struct zint_symbol *symbol, unsigned char source[])
return err_code; return err_code;
} }
int aztec_runes(struct zint_symbol *symbol, unsigned char source[]) int aztec_runes(struct zint_symbol *symbol, unsigned char source[], int length)
{ {
int input_length, error_number, i, y, x; int input_value, error_number, i, y, x;
int input_value;
char binary_string[28]; char binary_string[28];
unsigned char data_codewords[3], ecc_codewords[6]; unsigned char data_codewords[3], ecc_codewords[6];
error_number = 0; error_number = 0;
input_value = 0; input_value = 0;
input_length = ustrlen(source); if(length > 3) {
if(input_length > 3) {
strcpy(symbol->errtxt, "Input too large"); strcpy(symbol->errtxt, "Input too large");
return ERROR_INVALID_DATA; return ERROR_INVALID_DATA;
} }
error_number = is_sane(NESET, source); error_number = is_sane(NESET, source, length);
if(error_number != 0) { if(error_number != 0) {
strcpy(symbol->errtxt, "Invalid characters in input"); strcpy(symbol->errtxt, "Invalid characters in input");
return ERROR_INVALID_DATA; return ERROR_INVALID_DATA;
} }
switch(input_length) { switch(length) {
case 3: input_value = 100 * ctoi(source[0]); case 3: input_value = 100 * ctoi(source[0]);
input_value += 10 * ctoi(source[1]); input_value += 10 * ctoi(source[1]);
input_value += ctoi(source[2]); input_value += ctoi(source[2]);

View File

@ -59,13 +59,12 @@ static char *C128Table[107] = {"212222", "222122", "222221", "121223", "121322",
"411113", "411311", "113141", "114131", "311141", "411131", "211412", "211214", "211232", "411113", "411311", "113141", "114131", "311141", "411131", "211412", "211214", "211232",
"2331112"}; "2331112"};
int parunmodd(unsigned char llyth, char nullchar); int parunmodd(unsigned char llyth);
void grwp(int *indexliste); void grwp(int *indexliste);
void dxsmooth(int *indexliste); void dxsmooth(int *indexliste);
int a3_convert(unsigned char source, char nullchar) { int a3_convert(unsigned char source) {
/* Annex A section 3 */ /* Annex A section 3 */
if(source == nullchar) { return 64; }
if(source < 32) { return source + 64; } if(source < 32) { return source + 64; }
if((source >= 32) && (source <= 127)) { return source - 32; } if((source >= 32) && (source <= 127)) { return source - 32; }
if((source >= 128) && (source <= 159)) { return (source - 128) + 64; } if((source >= 128) && (source <= 159)) { return (source - 128) + 64; }
@ -73,12 +72,8 @@ int a3_convert(unsigned char source, char nullchar) {
return (source - 128) - 32; return (source - 128) - 32;
} }
int character_subset_select(unsigned char source[], int input_position, char nullchar) { int character_subset_select(unsigned char source[], int input_position) {
/* Section 4.5.2 - Determining the Character Subset Selector in a Row */ /* Section 4.5.2 - Determining the Character Subset Selector in a Row */
if(source[input_position] == nullchar) {
/* NULL character */
return MODEA;
}
if((source[input_position] >= '0') && (source[input_position + 1] <= '9')) { if((source[input_position] >= '0') && (source[input_position + 1] <= '9')) {
/* Rule 1 */ /* Rule 1 */
@ -99,7 +94,7 @@ int character_subset_select(unsigned char source[], int input_position, char nul
return MODEB; return MODEB;
} }
int data_encode_blockf(unsigned char source[], int subset_selector[], int blockmatrix[][62], int *columns_needed, int *rows_needed, int *final_mode, char nullchar, int gs1) int data_encode_blockf(unsigned char source[], int subset_selector[], int blockmatrix[][62], int *columns_needed, int *rows_needed, int *final_mode, int gs1)
{ {
int i, j, input_position, input_length, current_mode, current_row, error_number; int i, j, input_position, input_length, current_mode, current_row, error_number;
int column_position, c, done, exit_status; int column_position, c, done, exit_status;
@ -120,7 +115,7 @@ int data_encode_blockf(unsigned char source[], int subset_selector[], int blockm
if(column_position == 0) { if(column_position == 0) {
/* The Beginning of a row */ /* The Beginning of a row */
c = (*columns_needed); c = (*columns_needed);
current_mode = character_subset_select(source, input_position, nullchar); current_mode = character_subset_select(source, input_position);
subset_selector[current_row] = current_mode; subset_selector[current_row] = current_mode;
if((current_row == 0) && gs1) { if((current_row == 0) && gs1) {
/* Section 4.4.7.1 */ /* Section 4.4.7.1 */
@ -144,15 +139,15 @@ int data_encode_blockf(unsigned char source[], int subset_selector[], int blockm
/* Ensure that there is sufficient encodation capacity to continue (using the rules of Annex B.2). */ /* Ensure that there is sufficient encodation capacity to continue (using the rules of Annex B.2). */
switch(current_mode) { switch(current_mode) {
case MODEA: /* Table B1 applies */ case MODEA: /* Table B1 applies */
if(parunmodd(source[input_position], nullchar) == ABORC) { if(parunmodd(source[input_position]) == ABORC) {
blockmatrix[current_row][column_position] = a3_convert(source[input_position], nullchar); blockmatrix[current_row][column_position] = a3_convert(source[input_position]);
column_position++; column_position++;
c--; c--;
input_position++; input_position++;
done = 1; done = 1;
} }
if((parunmodd(source[input_position], nullchar) == SHIFTB) && (c == 1)) { if((parunmodd(source[input_position]) == SHIFTB) && (c == 1)) {
/* Needs two symbols */ /* Needs two symbols */
blockmatrix[current_row][column_position] = 100; /* Code B */ blockmatrix[current_row][column_position] = 100; /* Code B */
column_position++; column_position++;
@ -184,15 +179,15 @@ int data_encode_blockf(unsigned char source[], int subset_selector[], int blockm
} }
break; break;
case MODEB: /* Table B2 applies */ case MODEB: /* Table B2 applies */
if(parunmodd(source[input_position], nullchar) == ABORC) { if(parunmodd(source[input_position]) == ABORC) {
blockmatrix[current_row][column_position] = a3_convert(source[input_position], nullchar); blockmatrix[current_row][column_position] = a3_convert(source[input_position]);
column_position++; column_position++;
c--; c--;
input_position++; input_position++;
done = 1; done = 1;
} }
if((parunmodd(source[input_position], nullchar) == SHIFTA) && (c == 1)) { if((parunmodd(source[input_position]) == SHIFTA) && (c == 1)) {
/* Needs two symbols */ /* Needs two symbols */
blockmatrix[current_row][column_position] = 101; /* Code A */ blockmatrix[current_row][column_position] = 101; /* Code A */
column_position++; column_position++;
@ -224,7 +219,7 @@ int data_encode_blockf(unsigned char source[], int subset_selector[], int blockm
} }
break; break;
case MODEC: /* Table B3 applies */ case MODEC: /* Table B3 applies */
if((parunmodd(source[input_position], nullchar) != ABORC) && (c == 1)) { if((parunmodd(source[input_position]) != ABORC) && (c == 1)) {
/* Needs two symbols */ /* Needs two symbols */
blockmatrix[current_row][column_position] = 101; /* Code A */ blockmatrix[current_row][column_position] = 101; /* Code A */
column_position++; column_position++;
@ -232,7 +227,7 @@ int data_encode_blockf(unsigned char source[], int subset_selector[], int blockm
done = 1; done = 1;
} }
if(((parunmodd(source[input_position], nullchar) == ABORC) && (parunmodd(source[input_position + 1], nullchar) != ABORC)) if(((parunmodd(source[input_position]) == ABORC) && (parunmodd(source[input_position + 1]) != ABORC))
&& (c == 1)) { && (c == 1)) {
/* Needs two symbols */ /* Needs two symbols */
blockmatrix[current_row][column_position] = 101; /* Code A */ blockmatrix[current_row][column_position] = 101; /* Code A */
@ -258,7 +253,7 @@ int data_encode_blockf(unsigned char source[], int subset_selector[], int blockm
} }
if(done == 0) { if(done == 0) {
if(((parunmodd(source[input_position], nullchar) == AORB) || (parunmodd(source[input_position], nullchar) == SHIFTA)) && (current_mode == MODEA)) { if(((parunmodd(source[input_position]) == AORB) || (parunmodd(source[input_position]) == SHIFTA)) && (current_mode == MODEA)) {
/* Annex B section 1 rule 2 */ /* Annex B section 1 rule 2 */
/* If in Code Subset A and the next data character can be encoded in Subset A encode the next /* If in Code Subset A and the next data character can be encoded in Subset A encode the next
character. */ character. */
@ -268,7 +263,7 @@ int data_encode_blockf(unsigned char source[], int subset_selector[], int blockm
column_position++; column_position++;
c--; c--;
} }
blockmatrix[current_row][column_position] = a3_convert(source[input_position], nullchar); blockmatrix[current_row][column_position] = a3_convert(source[input_position]);
column_position++; column_position++;
c--; c--;
input_position++; input_position++;
@ -277,7 +272,7 @@ int data_encode_blockf(unsigned char source[], int subset_selector[], int blockm
} }
if(done == 0) { if(done == 0) {
if(((parunmodd(source[input_position], nullchar) == AORB) || (parunmodd(source[input_position], nullchar) == SHIFTB)) && (current_mode == MODEB)) { if(((parunmodd(source[input_position]) == AORB) || (parunmodd(source[input_position]) == SHIFTB)) && (current_mode == MODEB)) {
/* Annex B section 1 rule 3 */ /* Annex B section 1 rule 3 */
/* If in Code Subset B and the next data character can be encoded in subset B, encode the next /* If in Code Subset B and the next data character can be encoded in subset B, encode the next
character. */ character. */
@ -287,7 +282,7 @@ int data_encode_blockf(unsigned char source[], int subset_selector[], int blockm
column_position++; column_position++;
c--; c--;
} }
blockmatrix[current_row][column_position] = a3_convert(source[input_position], nullchar); blockmatrix[current_row][column_position] = a3_convert(source[input_position]);
column_position++; column_position++;
c--; c--;
input_position++; input_position++;
@ -296,7 +291,7 @@ int data_encode_blockf(unsigned char source[], int subset_selector[], int blockm
} }
if(done == 0) { if(done == 0) {
if(((parunmodd(source[input_position], nullchar) == ABORC) && (parunmodd(source[input_position + 1], nullchar) == ABORC)) && (current_mode == MODEC)) { if(((parunmodd(source[input_position]) == ABORC) && (parunmodd(source[input_position + 1]) == ABORC)) && (current_mode == MODEC)) {
/* Annex B section 1 rule 4 */ /* Annex B section 1 rule 4 */
/* If in Code Subset C and the next data are 2 digits, encode them. */ /* If in Code Subset C and the next data are 2 digits, encode them. */
blockmatrix[current_row][column_position] = (ctoi(source[input_position]) * 10) + ctoi(source[input_position + 1]); blockmatrix[current_row][column_position] = (ctoi(source[input_position]) * 10) + ctoi(source[input_position + 1]);
@ -308,7 +303,7 @@ int data_encode_blockf(unsigned char source[], int subset_selector[], int blockm
} }
if(done == 0) { if(done == 0) {
if(((current_mode == MODEA) || (current_mode == MODEB)) && ((parunmodd(source[input_position], nullchar) == ABORC) || (gs1 && (source[input_position] == '[')))) { if(((current_mode == MODEA) || (current_mode == MODEB)) && ((parunmodd(source[input_position])== ABORC) || (gs1 && (source[input_position] == '[')))) {
/* Count the number of numeric digits */ /* Count the number of numeric digits */
/* If 4 or more numeric data characters occur together when in subsets A or B: /* If 4 or more numeric data characters occur together when in subsets A or B:
a. If there is an even number of numeric data characters, insert a Code C character before the a. If there is an even number of numeric data characters, insert a Code C character before the
@ -321,7 +316,7 @@ int data_encode_blockf(unsigned char source[], int subset_selector[], int blockm
i++; i++;
if(gs1 && (source[input_position + j] == '[')) { i++; } if(gs1 && (source[input_position + j] == '[')) { i++; }
j++; j++;
} while((parunmodd(source[input_position + j], nullchar) == ABORC) || (gs1 && (source[input_position + j] == '['))); } while((parunmodd(source[input_position + j]) == ABORC) || (gs1 && (source[input_position + j] == '[')));
i--; i--;
if(i >= 4) { if(i >= 4) {
@ -338,14 +333,14 @@ int data_encode_blockf(unsigned char source[], int subset_selector[], int blockm
current_mode = MODEC; current_mode = MODEC;
} else { } else {
/* Annex B section 1 rule 5b */ /* Annex B section 1 rule 5b */
blockmatrix[current_row][column_position] = a3_convert(source[input_position], nullchar); blockmatrix[current_row][column_position] = a3_convert(source[input_position]);
column_position++; column_position++;
c--; c--;
input_position++; input_position++;
} }
done = 1; done = 1;
} else { } else {
blockmatrix[current_row][column_position] = a3_convert(source[input_position], nullchar); blockmatrix[current_row][column_position] = a3_convert(source[input_position]);
column_position++; column_position++;
c--; c--;
input_position++; input_position++;
@ -355,7 +350,7 @@ int data_encode_blockf(unsigned char source[], int subset_selector[], int blockm
} }
if(done == 0) { if(done == 0) {
if((current_mode == MODEB) && (parunmodd(source[input_position], nullchar) == SHIFTA)) { if((current_mode == MODEB) && (parunmodd(source[input_position]) == SHIFTA)) {
/* Annex B section 1 rule 6 */ /* Annex B section 1 rule 6 */
/* When in subset B and an ASCII control character occurs in the data: /* When in subset B and an ASCII control character occurs in the data:
a. If there is a lower case character immediately following the control character, insert a Shift a. If there is a lower case character immediately following the control character, insert a Shift
@ -372,7 +367,7 @@ int data_encode_blockf(unsigned char source[], int subset_selector[], int blockm
column_position++; column_position++;
c--; c--;
} }
blockmatrix[current_row][column_position] = a3_convert(source[input_position], nullchar); blockmatrix[current_row][column_position] = a3_convert(source[input_position]);
column_position++; column_position++;
c--; c--;
input_position++; input_position++;
@ -387,7 +382,7 @@ int data_encode_blockf(unsigned char source[], int subset_selector[], int blockm
column_position++; column_position++;
c--; c--;
} }
blockmatrix[current_row][column_position] = a3_convert(source[input_position], nullchar); blockmatrix[current_row][column_position] = a3_convert(source[input_position]);
column_position++; column_position++;
c--; c--;
input_position++; input_position++;
@ -398,14 +393,14 @@ int data_encode_blockf(unsigned char source[], int subset_selector[], int blockm
} }
if(done == 0) { if(done == 0) {
if((current_mode == MODEA) && (parunmodd(source[input_position], nullchar) == SHIFTB)) { if((current_mode == MODEA) && (parunmodd(source[input_position]) == SHIFTB)) {
/* Annex B section 1 rule 7 */ /* Annex B section 1 rule 7 */
/* When in subset A and a lower case character occurs in the data: /* When in subset A and a lower case character occurs in the data:
a. If following that character, a control character occurs in the data before the occurrence of a. If following that character, a control character occurs in the data before the occurrence of
another lower case character, insert a Shift character before the lower case character. another lower case character, insert a Shift character before the lower case character.
b. Otherwise, insert a Code B character before the lower case character to change to subset B. */ b. Otherwise, insert a Code B character before the lower case character to change to subset B. */
if((parunmodd(source[input_position + 1], nullchar) == SHIFTA) && if((parunmodd(source[input_position + 1]) == SHIFTA) &&
(parunmodd(source[input_position + 2], nullchar) == SHIFTB)) { (parunmodd(source[input_position + 2]) == SHIFTB)) {
/* Annex B section 1 rule 7a */ /* Annex B section 1 rule 7a */
blockmatrix[current_row][column_position] = 98; /* Shift */ blockmatrix[current_row][column_position] = 98; /* Shift */
column_position++; column_position++;
@ -416,7 +411,7 @@ int data_encode_blockf(unsigned char source[], int subset_selector[], int blockm
column_position++; column_position++;
c--; c--;
} }
blockmatrix[current_row][column_position] = a3_convert(source[input_position], nullchar); blockmatrix[current_row][column_position] = a3_convert(source[input_position]);
column_position++; column_position++;
c--; c--;
input_position++; input_position++;
@ -431,7 +426,7 @@ int data_encode_blockf(unsigned char source[], int subset_selector[], int blockm
column_position++; column_position++;
c--; c--;
} }
blockmatrix[current_row][column_position] = a3_convert(source[input_position], nullchar); blockmatrix[current_row][column_position] = a3_convert(source[input_position]);
column_position++; column_position++;
c--; c--;
input_position++; input_position++;
@ -442,8 +437,8 @@ int data_encode_blockf(unsigned char source[], int subset_selector[], int blockm
} }
if(done == 0) { if(done == 0) {
if((current_mode == MODEC) && ((parunmodd(source[input_position], nullchar) != ABORC) || if((current_mode == MODEC) && ((parunmodd(source[input_position]) != ABORC) ||
(parunmodd(source[input_position + 1], nullchar) != ABORC))) { (parunmodd(source[input_position + 1]) != ABORC))) {
/* Annex B section 1 rule 8 */ /* Annex B section 1 rule 8 */
/* When in subset C and a non-numeric character (or a single digit) occurs in the data, insert a Code /* When in subset C and a non-numeric character (or a single digit) occurs in the data, insert a Code
A or Code B character before that character, following rules 8a and 8b to determine between code A or Code B character before that character, following rules 8a and 8b to determine between code
@ -451,7 +446,7 @@ int data_encode_blockf(unsigned char source[], int subset_selector[], int blockm
a. If an ASCII control character (eg NUL) occurs in the data before any lower case character, use a. If an ASCII control character (eg NUL) occurs in the data before any lower case character, use
Code A. Code A.
b. Otherwise use Code B. */ b. Otherwise use Code B. */
if(parunmodd(source[input_position], nullchar) == SHIFTA) { if(parunmodd(source[input_position]) == SHIFTA) {
/* Annex B section 1 rule 8a */ /* Annex B section 1 rule 8a */
blockmatrix[current_row][column_position] = 101; /* Code A */ blockmatrix[current_row][column_position] = 101; /* Code A */
column_position++; column_position++;
@ -462,7 +457,7 @@ int data_encode_blockf(unsigned char source[], int subset_selector[], int blockm
column_position++; column_position++;
c--; c--;
} }
blockmatrix[current_row][column_position] = a3_convert(source[input_position], nullchar); blockmatrix[current_row][column_position] = a3_convert(source[input_position]);
column_position++; column_position++;
c--; c--;
input_position++; input_position++;
@ -478,7 +473,7 @@ int data_encode_blockf(unsigned char source[], int subset_selector[], int blockm
column_position++; column_position++;
c--; c--;
} }
blockmatrix[current_row][column_position] = a3_convert(source[input_position], nullchar); blockmatrix[current_row][column_position] = a3_convert(source[input_position]);
column_position++; column_position++;
c--; c--;
input_position++; input_position++;
@ -573,7 +568,7 @@ int data_encode_blockf(unsigned char source[], int subset_selector[], int blockm
return error_number; return error_number;
} }
int codablock(struct zint_symbol *symbol, unsigned char source[]) int codablock(struct zint_symbol *symbol, unsigned char source[], int length)
{ {
int error_number, input_length, i, j, k; int error_number, input_length, i, j, k;
int rows_needed, columns_needed; int rows_needed, columns_needed;
@ -588,7 +583,7 @@ int codablock(struct zint_symbol *symbol, unsigned char source[])
int gs1; int gs1;
error_number = 0; error_number = 0;
input_length = ustrlen(source); input_length = length;
final_mode = MODEA; final_mode = MODEA;
if(input_length > 5450) { if(input_length > 5450) {
@ -602,7 +597,7 @@ int codablock(struct zint_symbol *symbol, unsigned char source[])
estimate_codelength = 0.0; estimate_codelength = 0.0;
last_mode = AORB; /* Codablock always starts with Code A */ last_mode = AORB; /* Codablock always starts with Code A */
for(i = 0; i < input_length; i++) { for(i = 0; i < input_length; i++) {
this_mode = parunmodd(source[i], symbol->nullchar); this_mode = parunmodd(source[i]);
if(this_mode != last_mode) { if(this_mode != last_mode) {
estimate_codelength += 1.0; estimate_codelength += 1.0;
} }
@ -629,7 +624,7 @@ int codablock(struct zint_symbol *symbol, unsigned char source[])
} }
/* Encode the data */ /* Encode the data */
error_number = data_encode_blockf(source, subset_selector, blockmatrix, &columns_needed, &rows_needed, &final_mode, symbol->nullchar, gs1); error_number = data_encode_blockf(source, subset_selector, blockmatrix, &columns_needed, &rows_needed, &final_mode, gs1);
if(error_number > 0) { if(error_number > 0) {
if(error_number == ERROR_TOO_LONG) { if(error_number == ERROR_TOO_LONG) {
strcpy(symbol->errtxt, "Input data too long"); strcpy(symbol->errtxt, "Input data too long");

View File

@ -85,7 +85,7 @@ void NextB(int Chan, int i, int MaxB, int MaxS);
/* *********************** CODE 11 ******************** */ /* *********************** CODE 11 ******************** */
int code_11(struct zint_symbol *symbol, unsigned char source[]) int code_11(struct zint_symbol *symbol, unsigned char source[], int length)
{ /* Code 11 */ { /* Code 11 */
unsigned int i; unsigned int i;
@ -97,11 +97,11 @@ int code_11(struct zint_symbol *symbol, unsigned char source[])
error_number = 0; error_number = 0;
strcpy(dest, ""); strcpy(dest, "");
if(ustrlen(source) > 121) { if(length > 121) {
strcpy(symbol->errtxt, "Input too long"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
error_number = is_sane(NASET, source); error_number = is_sane(NASET, source, length);
if(error_number == ERROR_INVALID_DATA) { if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in data"); strcpy(symbol->errtxt, "Invalid characters in data");
return error_number; return error_number;
@ -115,7 +115,7 @@ int code_11(struct zint_symbol *symbol, unsigned char source[])
concat (dest, "112211"); concat (dest, "112211");
/* Draw main body of barcode */ /* Draw main body of barcode */
for(i = 0; i < ustrlen(source); i++) { for(i = 0; i < length; i++) {
lookup(NASET, C11Table, source[i], dest); lookup(NASET, C11Table, source[i], dest);
if(source[i] == '-') if(source[i] == '-')
weight[i] = 10; weight[i] = 10;
@ -124,7 +124,7 @@ int code_11(struct zint_symbol *symbol, unsigned char source[])
} }
/* Calculate C checksum */ /* Calculate C checksum */
for(h = (ustrlen(source) - 1); h >= 0; h--) { for(h = (length - 1); h >= 0; h--) {
c_count += (c_weight * weight[h]); c_count += (c_weight * weight[h]);
c_weight++; c_weight++;
@ -134,10 +134,10 @@ int code_11(struct zint_symbol *symbol, unsigned char source[])
} }
c_digit = c_count%11; c_digit = c_count%11;
weight[ustrlen(source)] = c_digit; weight[length] = c_digit;
/* Calculate K checksum */ /* Calculate K checksum */
for(h = ustrlen(source); h >= 0; h--) { for(h = length; h >= 0; h--) {
k_count += (k_weight * weight[h]); k_count += (k_weight * weight[h]);
k_weight++; k_weight++;
@ -165,14 +165,15 @@ int code_11(struct zint_symbol *symbol, unsigned char source[])
return error_number; return error_number;
} }
int c39(struct zint_symbol *symbol, unsigned char source[]) int c39(struct zint_symbol *symbol, unsigned char source[], int length)
{ /* Code 39 */ { /* Code 39 */
unsigned int i; unsigned int i;
unsigned int counter; unsigned int counter;
char check_digit; char check_digit;
int h, error_number; int error_number;
char dest[775]; char dest[775];
char localstr[3]; char localstr[3];
unsigned char local_source[75];
error_number = 0; error_number = 0;
counter = 0; counter = 0;
@ -183,19 +184,22 @@ int c39(struct zint_symbol *symbol, unsigned char source[])
symbol->option_2 = 0; symbol->option_2 = 0;
} }
to_upper(source);
if(symbol->symbology == BARCODE_LOGMARS) { if(symbol->symbology == BARCODE_LOGMARS) {
if(ustrlen(source) > 59) { if(length > 59) {
strcpy(symbol->errtxt, "Input too long"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
} else { } else {
if(ustrlen(source) > 74) { if(length > 74) {
strcpy(symbol->errtxt, "Input too long"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
} }
error_number = is_sane(TCSET , source); for(i = 0; i < length; i++) {
local_source[i] = source[i];
}
to_upper(local_source);
error_number = is_sane(TCSET , local_source, length);
if(error_number == ERROR_INVALID_DATA) { if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in data"); strcpy(symbol->errtxt, "Invalid characters in data");
return error_number; return error_number;
@ -204,9 +208,9 @@ int c39(struct zint_symbol *symbol, unsigned char source[])
/* Start character */ /* Start character */
concat(dest, "1211212111"); concat(dest, "1211212111");
for(i = 0; i < ustrlen(source); i++) { for(i = 0; i < length; i++) {
lookup(TCSET, C39Table, source[i], dest); lookup(TCSET, C39Table, local_source[i], dest);
counter += posn(TCSET, source[i]); counter += posn(TCSET, local_source[i]);
} }
if((symbol->symbology == BARCODE_LOGMARS) || (symbol->option_2 == 1)) { if((symbol->symbology == BARCODE_LOGMARS) || (symbol->option_2 == 1)) {
@ -237,7 +241,6 @@ int c39(struct zint_symbol *symbol, unsigned char source[])
check_digit = '_'; check_digit = '_';
} }
h = ustrlen(source);
localstr[0] = check_digit; localstr[0] = check_digit;
localstr[1] = '\0'; localstr[1] = '\0';
} }
@ -258,40 +261,39 @@ int c39(struct zint_symbol *symbol, unsigned char source[])
if(symbol->symbology == BARCODE_CODE39) { if(symbol->symbology == BARCODE_CODE39) {
ustrcpy(symbol->text, (unsigned char*)"*"); ustrcpy(symbol->text, (unsigned char*)"*");
uconcat(symbol->text, source); uconcat(symbol->text, local_source);
uconcat(symbol->text, (unsigned char*)localstr); uconcat(symbol->text, (unsigned char*)localstr);
uconcat(symbol->text, (unsigned char*)"*"); uconcat(symbol->text, (unsigned char*)"*");
} else { } else {
ustrcpy(symbol->text, source); ustrcpy(symbol->text, local_source);
uconcat(symbol->text, (unsigned char*)localstr); uconcat(symbol->text, (unsigned char*)localstr);
} }
return error_number; return error_number;
} }
int pharmazentral(struct zint_symbol *symbol, unsigned char source[]) int pharmazentral(struct zint_symbol *symbol, unsigned char source[], int length)
{ /* Pharmazentral Nummer (PZN) */ { /* Pharmazentral Nummer (PZN) */
int i, error_number; int i, error_number;
unsigned int h, count, check_digit; unsigned int count, check_digit;
char localstr[10], checkstr[3]; char localstr[10], checkstr[3];
int zeroes; int zeroes;
error_number = 0; error_number = 0;
count = 0; count = 0;
h = ustrlen(source); if(length > 6) {
if(h > 6) {
strcpy(symbol->errtxt, "Input wrong length"); strcpy(symbol->errtxt, "Input wrong length");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
error_number = is_sane(NESET, source); error_number = is_sane(NESET, source, length);
if(error_number == ERROR_INVALID_DATA) { if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in data"); strcpy(symbol->errtxt, "Invalid characters in data");
return error_number; return error_number;
} }
strcpy(localstr, "-"); strcpy(localstr, "-");
zeroes = 6 - h; zeroes = 6 - length;
for(i = 0; i < zeroes; i++) for(i = 0; i < zeroes; i++)
concat(localstr, "0"); concat(localstr, "0");
concat(localstr, (char *)source); concat(localstr, (char *)source);
@ -310,7 +312,8 @@ int pharmazentral(struct zint_symbol *symbol, unsigned char source[])
return ERROR_INVALID_DATA; return ERROR_INVALID_DATA;
} }
concat(localstr, checkstr); concat(localstr, checkstr);
error_number = c39(symbol, (unsigned char *)localstr); length = strlen(localstr);
error_number = c39(symbol, (unsigned char *)localstr, length);
ustrcpy(symbol->text, (unsigned char *)"PZN"); ustrcpy(symbol->text, (unsigned char *)"PZN");
uconcat(symbol->text, (unsigned char *)localstr); uconcat(symbol->text, (unsigned char *)localstr);
return error_number; return error_number;
@ -319,24 +322,23 @@ int pharmazentral(struct zint_symbol *symbol, unsigned char source[])
/* ************** EXTENDED CODE 39 *************** */ /* ************** EXTENDED CODE 39 *************** */
int ec39(struct zint_symbol *symbol, unsigned char source[]) int ec39(struct zint_symbol *symbol, unsigned char source[], int length)
{ /* Extended Code 39 - ISO/IEC 16388:2007 Annex A */ { /* Extended Code 39 - ISO/IEC 16388:2007 Annex A */
unsigned char buffer[150]; unsigned char buffer[150];
unsigned int i; unsigned int i;
int ascii_value;
int error_number; int error_number;
memset(buffer,0,150); memset(buffer,0,150);
error_number = 0; error_number = 0;
if(ustrlen(source) > 74) { if(length > 74) {
strcpy(symbol->errtxt, "Input too long"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
for(i = 0; i < ustrlen(source); i++) { for(i = 0; i < length; i++) {
if(source[i] > 127) { if(source[i] > 127) {
/* Cannot encode extended ASCII */ /* Cannot encode extended ASCII */
strcpy(symbol->errtxt, "Invalid characters in input data"); strcpy(symbol->errtxt, "Invalid characters in input data");
@ -345,30 +347,27 @@ int ec39(struct zint_symbol *symbol, unsigned char source[])
} }
/* Creates a buffer string and places control characters into it */ /* Creates a buffer string and places control characters into it */
for(i = 0; i < ustrlen(source); i++) { for(i = 0; i < length; i++) {
ascii_value = source[i]; concat((char*)buffer, EC39Ctrl[source[i]]);
if(ascii_value == symbol->nullchar) {
concat((char*)buffer, EC39Ctrl[0]);
} else {
concat((char*)buffer, EC39Ctrl[ascii_value]);
}
} }
/* Then sends the buffer to the C39 function */ /* Then sends the buffer to the C39 function */
error_number = c39(symbol, buffer); error_number = c39(symbol, buffer, ustrlen(buffer));
ustrcpy(symbol->text, source); for(i = 0; i < length; i++) {
for(i = 0; i < ustrlen(symbol->text); i++) { if(source[i] == '\0') {
if(symbol->text[i] == symbol->nullchar) {
symbol->text[i] = ' '; symbol->text[i] = ' ';
} else {
symbol->text[i] = source[i];
} }
} }
symbol->text[length] = '\0';
return error_number; return error_number;
} }
/* ******************** CODE 93 ******************* */ /* ******************** CODE 93 ******************* */
int c93(struct zint_symbol *symbol, unsigned char source[]) int c93(struct zint_symbol *symbol, unsigned char source[], int length)
{ /* Code 93 is an advancement on Code 39 and the definition is a lot tighter */ { /* Code 93 is an advancement on Code 39 and the definition is a lot tighter */
/* TCSET includes the extra characters a, b, c and d to represent Code 93 specific /* TCSET includes the extra characters a, b, c and d to represent Code 93 specific
@ -379,7 +378,6 @@ int c93(struct zint_symbol *symbol, unsigned char source[])
int h, weight, c, k, values[100], error_number; int h, weight, c, k, values[100], error_number;
char buffer[220], temp[2]; char buffer[220], temp[2];
char set_copy[] = TCSET; char set_copy[] = TCSET;
int ascii_value;
char dest[670]; char dest[670];
unsigned char local_source[110]; unsigned char local_source[110];
@ -387,14 +385,16 @@ int c93(struct zint_symbol *symbol, unsigned char source[])
strcpy(buffer, ""); strcpy(buffer, "");
strcpy(dest, ""); strcpy(dest, "");
if(ustrlen(source) > 107) { if(length > 107) {
strcpy(symbol->errtxt, "Input too long"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
ustrcpy(local_source, source); for(i = 0; i < length; i++) {
local_source[i] = source[i];
}
for(i = 0; i < ustrlen(local_source); i++) { for(i = 0; i < length; i++) {
if(local_source[i] > 127) { if(local_source[i] > 127) {
/* Cannot encode extended ASCII */ /* Cannot encode extended ASCII */
strcpy(symbol->errtxt, "Invalid characters in input data"); strcpy(symbol->errtxt, "Invalid characters in input data");
@ -406,13 +406,8 @@ int c93(struct zint_symbol *symbol, unsigned char source[])
concat(dest, "111141"); concat(dest, "111141");
/* Message Content */ /* Message Content */
for(i = 0; i < ustrlen(local_source); i++) { for(i = 0; i < length; i++) {
ascii_value = local_source[i]; concat(buffer, C93Ctrl[local_source[i]]);
if(ascii_value == symbol->nullchar) {
concat(buffer, C93Ctrl[0]);
} else {
concat(buffer, C93Ctrl[ascii_value]);
}
} }
/* Now we can check the true length of the barcode */ /* Now we can check the true length of the barcode */
@ -475,17 +470,19 @@ int c93(struct zint_symbol *symbol, unsigned char source[])
/* Stop character */ /* Stop character */
concat(dest, "1111411"); concat(dest, "1111411");
h = ustrlen(local_source); local_source[length] = set_copy[c];
local_source[h] = set_copy[c]; local_source[length + 1] = set_copy[k];
local_source[h + 1] = set_copy[k]; local_source[length + 2] = '\0';
local_source[h + 2] = '\0'; length += 2;
expand(symbol, dest); expand(symbol, dest);
ustrcpy(symbol->text, local_source); for(i = 0; i < length; i++) {
for(i = 0; i < ustrlen(symbol->text); i++) { if(local_source[i] == '\0') {
if(symbol->text[i] == symbol->nullchar) {
symbol->text[i] = ' '; symbol->text[i] = ' ';
} else {
symbol->text[i] = local_source[i];
} }
} }
symbol->text[length] = '\0';
return error_number; return error_number;
} }
@ -540,31 +537,30 @@ void NextS(int Chan, int i, int MaxS, int MaxB) {
} }
} }
int channel_code(struct zint_symbol *symbol, unsigned char source[]) { int channel_code(struct zint_symbol *symbol, unsigned char source[], int length) {
/* Channel Code - According to ANSI/AIM BC12-1998 */ /* Channel Code - According to ANSI/AIM BC12-1998 */
int input_length, channels, i; int channels, i;
int error_number = 0, range = 0, zeroes; int error_number = 0, range = 0, zeroes;
char hrt[9]; char hrt[9];
input_length = ustrlen(source);
target_value = 0; target_value = 0;
if(input_length > 7) { if(length > 7) {
strcpy(symbol->errtxt, "Input too long"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
error_number = is_sane(NESET, source); error_number = is_sane(NESET, source, length);
if(error_number == ERROR_INVALID_DATA) { if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in data"); strcpy(symbol->errtxt, "Invalid characters in data");
return error_number; return error_number;
} }
if((symbol->option_2 < 3) || (symbol->option_2 > 8)) { channels = 0; } else { channels = symbol->option_2; } if((symbol->option_2 < 3) || (symbol->option_2 > 8)) { channels = 0; } else { channels = symbol->option_2; }
if(channels == 0) { channels = input_length + 1; } if(channels == 0) { channels = length + 1; }
if(channels == 2) { channels = 3; } if(channels == 2) { channels = 3; }
for(i = 0; i < input_length; i++) { for(i = 0; i < length; i++) {
target_value *= 10; target_value *= 10;
target_value += ctoi((char) source[i]); target_value += ctoi((char) source[i]);
} }
@ -589,7 +585,7 @@ int channel_code(struct zint_symbol *symbol, unsigned char source[]) {
NextS(channels,3,channels,channels); NextS(channels,3,channels,channels);
strcpy(hrt, ""); strcpy(hrt, "");
zeroes = channels - 1 - input_length; zeroes = channels - 1 - length;
for(i = 0; i < zeroes; i++) { for(i = 0; i < zeroes; i++) {
concat(hrt, "0"); concat(hrt, "0");
} }

View File

@ -273,9 +273,8 @@ int c1_look_ahead_test(unsigned char source[], int sourcelen, int position, int
return best_scheme; return best_scheme;
} }
int c1_encode(struct zint_symbol *symbol, unsigned char source[], unsigned int target[]) int c1_encode(struct zint_symbol *symbol, unsigned char source[], unsigned int target[], int length)
{ {
int inputlen = ustrlen(source);
int current_mode, next_mode; int current_mode, next_mode;
int sp, tp, gs1, i, j, latch; int sp, tp, gs1, i, j, latch;
int c40_buffer[6], c40_p; int c40_buffer[6], c40_p;
@ -284,14 +283,6 @@ int c1_encode(struct zint_symbol *symbol, unsigned char source[], unsigned int t
char decimal_binary[40]; char decimal_binary[40];
int byte_start = 0; int byte_start = 0;
if(symbol->nullchar != 0x00) {
for(i = 0; i < inputlen; i++) {
if(source[i] == symbol->nullchar) {
source[i] = 0x00;
}
}
}
sp = 0; sp = 0;
tp = 0; tp = 0;
latch = 0; latch = 0;
@ -327,7 +318,7 @@ int c1_encode(struct zint_symbol *symbol, unsigned char source[], unsigned int t
if(current_mode == C1_ASCII) { /* Step B - ASCII encodation */ if(current_mode == C1_ASCII) { /* Step B - ASCII encodation */
next_mode = C1_ASCII; next_mode = C1_ASCII;
if((inputlen - sp) >= 21) { /* Step B1 */ if((length - sp) >= 21) { /* Step B1 */
j = 0; j = 0;
for(i = 0; i < 21; i++) { for(i = 0; i < 21; i++) {
@ -340,7 +331,7 @@ int c1_encode(struct zint_symbol *symbol, unsigned char source[], unsigned int t
} }
} }
if((next_mode == C1_ASCII) && ((inputlen - sp) >= 13)) { /* Step B2 */ if((next_mode == C1_ASCII) && ((length - sp) >= 13)) { /* Step B2 */
j = 0; j = 0;
for(i = 0; i < 13; i++) { for(i = 0; i < 13; i++) {
@ -349,7 +340,7 @@ int c1_encode(struct zint_symbol *symbol, unsigned char source[], unsigned int t
if (j == 13) { if (j == 13) {
latch = 0; latch = 0;
for(i = sp + 13; i < inputlen; i++) { for(i = sp + 13; i < length; i++) {
if(!((source[sp + i] >= '0') && (source[sp + i] <= '9'))) { latch = 1; } if(!((source[sp + i] >= '0') && (source[sp + i] <= '9'))) { latch = 1; }
} }
@ -361,13 +352,13 @@ int c1_encode(struct zint_symbol *symbol, unsigned char source[], unsigned int t
} }
if(next_mode == C1_ASCII) { /* Step B3 */ if(next_mode == C1_ASCII) { /* Step B3 */
if(istwodigits(source, sp) && ((sp + 1) != inputlen)) { if(istwodigits(source, sp) && ((sp + 1) != length)) {
target[tp] = (10 * ctoi(source[sp])) + ctoi(source[sp + 1]) + 130; target[tp] = (10 * ctoi(source[sp])) + ctoi(source[sp + 1]) + 130;
tp++; tp++;
sp += 2; sp += 2;
} else { } else {
if((gs1) && (source[sp] == '[')) { if((gs1) && (source[sp] == '[')) {
if((inputlen - sp) >= 15) { /* Step B4 */ if((length - sp) >= 15) { /* Step B4 */
j = 0; j = 0;
for(i = 0; i < 15; i++) { for(i = 0; i < 15; i++) {
@ -381,7 +372,7 @@ int c1_encode(struct zint_symbol *symbol, unsigned char source[], unsigned int t
} }
} }
if((inputlen - sp) >= 7) { /* Step B5 */ if((length - sp) >= 7) { /* Step B5 */
j = 0; j = 0;
for(i = 0; i < 7; i++) { for(i = 0; i < 7; i++) {
@ -390,7 +381,7 @@ int c1_encode(struct zint_symbol *symbol, unsigned char source[], unsigned int t
if (j == 7) { if (j == 7) {
latch = 0; latch = 0;
for(i = sp + 7; i < inputlen; i++) { for(i = sp + 7; i < length; i++) {
if(!((source[sp + i] >= '0') && (source[sp + i] <= '9'))) { latch = 1; } if(!((source[sp + i] >= '0') && (source[sp + i] <= '9'))) { latch = 1; }
} }
@ -406,7 +397,7 @@ int c1_encode(struct zint_symbol *symbol, unsigned char source[], unsigned int t
if(next_mode == C1_ASCII) { if(next_mode == C1_ASCII) {
/* Step B6 */ /* Step B6 */
next_mode = c1_look_ahead_test(source, inputlen, sp, current_mode, gs1); next_mode = c1_look_ahead_test(source, length, sp, current_mode, gs1);
if(next_mode == C1_ASCII) { if(next_mode == C1_ASCII) {
if(source[sp] > 127) { if(source[sp] > 127) {
@ -432,7 +423,7 @@ int c1_encode(struct zint_symbol *symbol, unsigned char source[], unsigned int t
next_mode = C1_C40; next_mode = C1_C40;
if(c40_p == 0) { if(c40_p == 0) {
if((inputlen - sp) >= 12) { if((length - sp) >= 12) {
j = 0; j = 0;
for(i = 0; i < 12; i++) { for(i = 0; i < 12; i++) {
@ -444,18 +435,18 @@ int c1_encode(struct zint_symbol *symbol, unsigned char source[], unsigned int t
} }
} }
if((inputlen - sp) >= 8) { if((length - sp) >= 8) {
j = 0; j = 0;
for(i = 0; i < 8; i++) { for(i = 0; i < 8; i++) {
if((source[sp + i] >= '0') && (source[sp + i] <= '9')) { j++; } if((source[sp + i] >= '0') && (source[sp + i] <= '9')) { j++; }
} }
if((inputlen - sp) == 8) { if((length - sp) == 8) {
latch = 1; latch = 1;
} else { } else {
latch = 1; latch = 1;
for(j = sp + 8; j < inputlen; j++) { for(j = sp + 8; j < length; j++) {
if((source[j] <= '0') || (source[j] >= '9')) { latch = 0; } if((source[j] <= '0') || (source[j] >= '9')) { latch = 0; }
} }
} }
@ -466,7 +457,7 @@ int c1_encode(struct zint_symbol *symbol, unsigned char source[], unsigned int t
} }
if(!(done)) { if(!(done)) {
next_mode = c1_look_ahead_test(source, inputlen, sp, current_mode, gs1); next_mode = c1_look_ahead_test(source, length, sp, current_mode, gs1);
} }
} }
@ -517,7 +508,7 @@ int c1_encode(struct zint_symbol *symbol, unsigned char source[], unsigned int t
next_mode = C1_TEXT; next_mode = C1_TEXT;
if(text_p == 0) { if(text_p == 0) {
if((inputlen - sp) >= 12) { if((length - sp) >= 12) {
j = 0; j = 0;
for(i = 0; i < 12; i++) { for(i = 0; i < 12; i++) {
@ -529,18 +520,18 @@ int c1_encode(struct zint_symbol *symbol, unsigned char source[], unsigned int t
} }
} }
if((inputlen - sp) >= 8) { if((length - sp) >= 8) {
j = 0; j = 0;
for(i = 0; i < 8; i++) { for(i = 0; i < 8; i++) {
if((source[sp + i] >= '0') && (source[sp + i] <= '9')) { j++; } if((source[sp + i] >= '0') && (source[sp + i] <= '9')) { j++; }
} }
if((inputlen - sp) == 8) { if((length - sp) == 8) {
latch = 1; latch = 1;
} else { } else {
latch = 1; latch = 1;
for(j = sp + 8; j < inputlen; j++) { for(j = sp + 8; j < length; j++) {
if((source[j] <= '0') || (source[j] >= '9')) { latch = 0; } if((source[j] <= '0') || (source[j] >= '9')) { latch = 0; }
} }
} }
@ -551,7 +542,7 @@ int c1_encode(struct zint_symbol *symbol, unsigned char source[], unsigned int t
} }
if(!(done)) { if(!(done)) {
next_mode = c1_look_ahead_test(source, inputlen, sp, current_mode, gs1); next_mode = c1_look_ahead_test(source, length, sp, current_mode, gs1);
} }
} }
@ -602,7 +593,7 @@ int c1_encode(struct zint_symbol *symbol, unsigned char source[], unsigned int t
next_mode = C1_EDI; next_mode = C1_EDI;
if(edi_p == 0) { if(edi_p == 0) {
if((inputlen - sp) >= 12) { if((length - sp) >= 12) {
j = 0; j = 0;
for(i = 0; i < 12; i++) { for(i = 0; i < 12; i++) {
@ -614,18 +605,18 @@ int c1_encode(struct zint_symbol *symbol, unsigned char source[], unsigned int t
} }
} }
if((inputlen - sp) >= 8) { if((length - sp) >= 8) {
j = 0; j = 0;
for(i = 0; i < 8; i++) { for(i = 0; i < 8; i++) {
if((source[sp + i] >= '0') && (source[sp + i] <= '9')) { j++; } if((source[sp + i] >= '0') && (source[sp + i] <= '9')) { j++; }
} }
if((inputlen - sp) == 8) { if((length - sp) == 8) {
latch = 1; latch = 1;
} else { } else {
latch = 1; latch = 1;
for(j = sp + 8; j < inputlen; j++) { for(j = sp + 8; j < length; j++) {
if((source[j] <= '0') || (source[j] >= '9')) { latch = 0; } if((source[j] <= '0') || (source[j] >= '9')) { latch = 0; }
} }
} }
@ -676,7 +667,7 @@ int c1_encode(struct zint_symbol *symbol, unsigned char source[], unsigned int t
next_mode = C1_DECIMAL; next_mode = C1_DECIMAL;
data_left = inputlen - sp; data_left = length - sp;
decimal_count = 0; decimal_count = 0;
if(data_left >= 1) { if(data_left >= 1) {
@ -831,7 +822,7 @@ int c1_encode(struct zint_symbol *symbol, unsigned char source[], unsigned int t
next_mode = C1_ASCII; next_mode = C1_ASCII;
} else { } else {
if(source[sp] <= 127) { if(source[sp] <= 127) {
next_mode = c1_look_ahead_test(source, inputlen, sp, current_mode, gs1); next_mode = c1_look_ahead_test(source, length, sp, current_mode, gs1);
} }
} }
@ -863,7 +854,7 @@ int c1_encode(struct zint_symbol *symbol, unsigned char source[], unsigned int t
strcpy(symbol->errtxt, "Input data too long"); strcpy(symbol->errtxt, "Input data too long");
return 0; return 0;
} }
} while (sp < inputlen); } while (sp < length);
/* Empty buffers */ /* Empty buffers */
if(c40_p == 2) { if(c40_p == 2) {
@ -1015,7 +1006,7 @@ void block_copy(struct zint_symbol *symbol, char grid[][120], int start_row, int
} }
} }
int code_one(struct zint_symbol *symbol, unsigned char source[]) int code_one(struct zint_symbol *symbol, unsigned char source[], int length)
{ {
int size = 1, i, j, data_blocks; int size = 1, i, j, data_blocks;
@ -1036,18 +1027,18 @@ int code_one(struct zint_symbol *symbol, unsigned char source[])
int stream[30]; int stream[30];
int block_width; int block_width;
if(is_sane(NESET, source) == ERROR_INVALID_DATA) { if(is_sane(NESET, source, length) == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid input data (Version S encodes numeric input only)"); strcpy(symbol->errtxt, "Invalid input data (Version S encodes numeric input only)");
return ERROR_INVALID_DATA; return ERROR_INVALID_DATA;
} }
if(ustrlen(source) > 18) { if(length > 18) {
strcpy(symbol->errtxt, "Input data too long"); strcpy(symbol->errtxt, "Input data too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
sub_version = 3; codewords = 12; block_width = 6; /* Version S-30 */ sub_version = 3; codewords = 12; block_width = 6; /* Version S-30 */
if(ustrlen(source) <= 12) { sub_version = 2; codewords = 8; block_width = 4; } /* Version S-20 */ if(length <= 12) { sub_version = 2; codewords = 8; block_width = 4; } /* Version S-20 */
if(ustrlen(source) <= 6) { sub_version = 1; codewords = 4; block_width = 2; } /* Version S-10 */ if(length <= 6) { sub_version = 1; codewords = 4; block_width = 2; } /* Version S-10 */
binary_load(elreg, (char *)source); binary_load(elreg, (char *)source);
hex_dump(elreg); hex_dump(elreg);
@ -1111,7 +1102,7 @@ int code_one(struct zint_symbol *symbol, unsigned char source[])
int data_cw, ecc_cw, block_width; int data_cw, ecc_cw, block_width;
for(i = 0; i < 40; i++) { data[i] = 0; } for(i = 0; i < 40; i++) { data[i] = 0; }
data_length = c1_encode(symbol, source, data); data_length = c1_encode(symbol, source, data, length);
if(data_length == 0) { if(data_length == 0) {
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
@ -1178,7 +1169,7 @@ int code_one(struct zint_symbol *symbol, unsigned char source[])
int data_length; int data_length;
for(i = 0; i < 1500; i++) { data[i] = 0; } for(i = 0; i < 1500; i++) { data[i] = 0; }
data_length = c1_encode(symbol, source, data); data_length = c1_encode(symbol, source, data, length);
if(data_length == 0) { if(data_length == 0) {
return ERROR_TOO_LONG; return ERROR_TOO_LONG;

View File

@ -61,12 +61,11 @@ static char *C128Table[107] = {"212222", "222122", "222221", "121223", "121322",
"2331112"}; "2331112"};
/* Code 128 character encodation - Table 1 */ /* Code 128 character encodation - Table 1 */
int parunmodd(unsigned char llyth, char nullchar) int parunmodd(unsigned char llyth)
{ {
int modd; int modd;
modd = 0; modd = 0;
if(llyth == nullchar) { return SHIFTA; }
if(llyth <= 31) { modd = SHIFTA; } if(llyth <= 31) { modd = SHIFTA; }
if((llyth >= 32) && (llyth <= 95)) { modd = AORB; } if((llyth >= 32) && (llyth <= 95)) { modd = AORB; }
if((llyth >= 48) && (llyth <= 57)) { modd = ABORC; } if((llyth >= 48) && (llyth <= 57)) { modd = ABORC; }
@ -141,17 +140,10 @@ void dxsmooth(int *indexliste)
} }
void c128_set_a(unsigned char source, char dest[], int values[], int *bar_chars, char nullchr) void c128_set_a(unsigned char source, char dest[], int values[], int *bar_chars)
{ /* Translate Code 128 Set A characters into barcodes */ { /* Translate Code 128 Set A characters into barcodes */
/* This set handles all control characters NULL to US */ /* This set handles all control characters NULL to US */
if(source == nullchr) { /* Handle NULL character substitution */
concat(dest, C128Table[64]);
values[(*bar_chars)] = 64;
(*bar_chars)++;
return;
}
if(source > 127) { if(source > 127) {
if(source < 160) { if(source < 160) {
concat(dest, C128Table[(source - 128) + 64]); concat(dest, C128Table[(source - 128) + 64]);
@ -197,7 +189,7 @@ void c128_set_c(unsigned char source_a, unsigned char source_b, char dest[], int
(*bar_chars)++; (*bar_chars)++;
} }
int code_128(struct zint_symbol *symbol, unsigned char source[]) int code_128(struct zint_symbol *symbol, unsigned char source[], int length)
{ /* Handle Code 128 and NVE-18 */ { /* Handle Code 128 and NVE-18 */
int i, j, k, e_count, values[170], bar_characters, read, total_sum, nve_check; int i, j, k, e_count, values[170], bar_characters, read, total_sum, nve_check;
int error_number, indexchaine, indexliste, sourcelen, f_state; int error_number, indexchaine, indexliste, sourcelen, f_state;
@ -208,7 +200,7 @@ int code_128(struct zint_symbol *symbol, unsigned char source[])
error_number = 0; error_number = 0;
strcpy(dest, ""); strcpy(dest, "");
sourcelen = ustrlen(source); sourcelen = length;
j = 0; j = 0;
e_count = 0; e_count = 0;
@ -282,7 +274,7 @@ int code_128(struct zint_symbol *symbol, unsigned char source[])
indexliste = 0; indexliste = 0;
indexchaine = 0; indexchaine = 0;
mode = parunmodd(source[indexchaine], symbol->nullchar); mode = parunmodd(source[indexchaine]);
if((symbol->symbology == BARCODE_CODE128B) && (mode == ABORC)) { if((symbol->symbology == BARCODE_CODE128B) && (mode == ABORC)) {
mode = AORB; mode = AORB;
} }
@ -296,7 +288,7 @@ int code_128(struct zint_symbol *symbol, unsigned char source[])
while ((list[1][indexliste] == mode) && (indexchaine < sourcelen)) { while ((list[1][indexliste] == mode) && (indexchaine < sourcelen)) {
list[0][indexliste]++; list[0][indexliste]++;
indexchaine++; indexchaine++;
mode = parunmodd(source[indexchaine], symbol->nullchar); mode = parunmodd(source[indexchaine]);
if((symbol->symbology == BARCODE_CODE128B) && (mode == ABORC)) { if((symbol->symbology == BARCODE_CODE128B) && (mode == ABORC)) {
mode = AORB; mode = AORB;
} }
@ -539,7 +531,7 @@ int code_128(struct zint_symbol *symbol, unsigned char source[])
switch(set[read]) switch(set[read])
{ /* Encode data characters */ { /* Encode data characters */
case 'a': case 'a':
case 'A': c128_set_a(source[read], dest, values, &bar_characters, symbol->nullchar); case 'A': c128_set_a(source[read], dest, values, &bar_characters);
read++; read++;
break; break;
case 'b': case 'b':
@ -572,32 +564,33 @@ int code_128(struct zint_symbol *symbol, unsigned char source[])
/* Stop character */ /* Stop character */
concat(dest, C128Table[106]); concat(dest, C128Table[106]);
expand(symbol, dest); expand(symbol, dest);
ustrcpy(symbol->text, source); for(i = 0; i < length; i++) {
for(i = 0; i < ustrlen(symbol->text); i++) { if(source[i] == '\0') {
if(symbol->text[i] == symbol->nullchar) {
symbol->text[i] = ' '; symbol->text[i] = ' ';
} else {
symbol->text[i] = source[i];
} }
} }
symbol->text[length] = '\0';
return error_number; return error_number;
} }
int ean_128(struct zint_symbol *symbol, unsigned char source[]) int ean_128(struct zint_symbol *symbol, unsigned char source[], int length)
{ /* Handle EAN-128 (Now known as GS1-128) */ { /* Handle EAN-128 (Now known as GS1-128) */
int i, j, e_count, values[170], bar_characters, read, total_sum; int i, j, e_count, values[170], bar_characters, read, total_sum;
int error_number, indexchaine, indexliste, sourcelen; int error_number, indexchaine, indexliste;
char set[170], mode, last_set; char set[170], mode, last_set;
float glyph_count; float glyph_count;
char dest[1000]; char dest[1000];
int separator_row, linkage_flag, c_count; int separator_row, linkage_flag, c_count;
#ifndef _MSC_VER #ifndef _MSC_VER
char reduced[ustrlen(source)]; char reduced[length];
#else #else
char* reduced = (char*)_alloca(ustrlen(source)); char* reduced = (char*)_alloca(length);
#endif #endif
error_number = 0; error_number = 0;
strcpy(dest, ""); strcpy(dest, "");
linkage_flag = 0; linkage_flag = 0;
sourcelen = ustrlen(source);
j = 0; j = 0;
e_count = 0; e_count = 0;
@ -609,12 +602,19 @@ int ean_128(struct zint_symbol *symbol, unsigned char source[])
set[i] = ' '; set[i] = ' ';
} }
if(sourcelen > 160) { if(length > 160) {
/* This only blocks rediculously long input - the actual length of the /* This only blocks rediculously long input - the actual length of the
resulting barcode depends on the type of data, so this is trapped later */ resulting barcode depends on the type of data, so this is trapped later */
strcpy(symbol->errtxt, "Input too long"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
for(i = 0; i < length; i++) {
if(source[i] == '\0') {
/* Null characters not allowed! */
strcpy(symbol->errtxt, "NULL character in input data");
return ERROR_INVALID_DATA;
}
}
/* if part of a composite symbol make room for the separator pattern */ /* if part of a composite symbol make room for the separator pattern */
if(symbol->symbology == BARCODE_EAN128_CC) { if(symbol->symbology == BARCODE_EAN128_CC) {
@ -633,7 +633,7 @@ int ean_128(struct zint_symbol *symbol, unsigned char source[])
indexliste = 0; indexliste = 0;
indexchaine = 0; indexchaine = 0;
mode = parunmodd(reduced[indexchaine], 0x00); mode = parunmodd(reduced[indexchaine]);
if(reduced[indexchaine] == '[') { if(reduced[indexchaine] == '[') {
mode = ABORC; mode = ABORC;
} }
@ -647,7 +647,7 @@ int ean_128(struct zint_symbol *symbol, unsigned char source[])
while ((list[1][indexliste] == mode) && (indexchaine < strlen(reduced))) { while ((list[1][indexliste] == mode) && (indexchaine < strlen(reduced))) {
list[0][indexliste]++; list[0][indexliste]++;
indexchaine++; indexchaine++;
mode = parunmodd(reduced[indexchaine], 0x00); mode = parunmodd(reduced[indexchaine]);
if(reduced[indexchaine] == '[') { mode = ABORC; } if(reduced[indexchaine] == '[') { mode = ABORC; }
} }
indexliste++; indexliste++;
@ -797,7 +797,7 @@ int ean_128(struct zint_symbol *symbol, unsigned char source[])
{ /* Encode data characters */ { /* Encode data characters */
case 'A': case 'A':
case 'a': case 'a':
c128_set_a(reduced[read], dest, values, &bar_characters, 0x00); c128_set_a(reduced[read], dest, values, &bar_characters);
read++; read++;
break; break;
case 'B': case 'B':
@ -884,7 +884,7 @@ int ean_128(struct zint_symbol *symbol, unsigned char source[])
} }
} }
for(i = 0; i <= sourcelen; i++) { for(i = 0; i <= length; i++) {
if((source[i] != '[') && (source[i] != ']')) { if((source[i] != '[') && (source[i] != ']')) {
symbol->text[i] = source[i]; symbol->text[i] = source[i];
} }
@ -899,21 +899,21 @@ int ean_128(struct zint_symbol *symbol, unsigned char source[])
return error_number; return error_number;
} }
int nve_18(struct zint_symbol *symbol, unsigned char source[]) int nve_18(struct zint_symbol *symbol, unsigned char source[], int length)
{ {
/* Add check digit if encoding an NVE18 symbol */ /* Add check digit if encoding an NVE18 symbol */
int error_number, zeroes, i, j, nve_check, total_sum, sourcelen; int error_number, zeroes, i, j, nve_check, total_sum, sourcelen;
unsigned char ean128_equiv[25]; unsigned char ean128_equiv[25];
memset(ean128_equiv, 0, 25); memset(ean128_equiv, 0, 25);
sourcelen = ustrlen(source); sourcelen = length;
if(sourcelen > 17) { if(sourcelen > 17) {
strcpy(symbol->errtxt, "Input too long"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
error_number = is_sane(NESET, source); error_number = is_sane(NESET, source, length);
if(error_number == ERROR_INVALID_DATA) { if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in data"); strcpy(symbol->errtxt, "Invalid characters in data");
return error_number; return error_number;
@ -942,34 +942,33 @@ int nve_18(struct zint_symbol *symbol, unsigned char source[])
ean128_equiv[21] = itoc(nve_check); ean128_equiv[21] = itoc(nve_check);
ean128_equiv[22] = '\0'; ean128_equiv[22] = '\0';
error_number = ean_128(symbol, ean128_equiv); error_number = ean_128(symbol, ean128_equiv, ustrlen(ean128_equiv));
return error_number; return error_number;
} }
int ean_14(struct zint_symbol *symbol, unsigned char source[]) int ean_14(struct zint_symbol *symbol, unsigned char source[], int length)
{ {
/* EAN-14 - A version of EAN-128 */ /* EAN-14 - A version of EAN-128 */
int input_length, i, j, count, check_digit; int i, j, count, check_digit;
int error_number, zeroes; int error_number, zeroes;
unsigned char ean128_equiv[20]; unsigned char ean128_equiv[20];
memset(ean128_equiv, 0, 20); memset(ean128_equiv, 0, 20);
input_length = ustrlen(source);
if(input_length > 13) { if(length > 13) {
strcpy(symbol->errtxt, "Input wrong length"); strcpy(symbol->errtxt, "Input wrong length");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
error_number = is_sane(NESET, source); error_number = is_sane(NESET, source, length);
if(error_number == ERROR_INVALID_DATA) { if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid character in data"); strcpy(symbol->errtxt, "Invalid character in data");
return error_number; return error_number;
} }
concat((char*)ean128_equiv, "[01]"); concat((char*)ean128_equiv, "[01]");
zeroes = 13 - input_length; zeroes = 13 - length;
for(i = 0; i < zeroes; i++) { for(i = 0; i < zeroes; i++) {
j = ustrlen(ean128_equiv); j = ustrlen(ean128_equiv);
ean128_equiv[j] = '0'; ean128_equiv[j] = '0';
@ -978,7 +977,7 @@ int ean_14(struct zint_symbol *symbol, unsigned char source[])
concat((char*)ean128_equiv, (char*)source); concat((char*)ean128_equiv, (char*)source);
count = 0; count = 0;
for (i = input_length - 1; i >= 0; i--) for (i = length - 1; i >= 0; i--)
{ {
count += ctoi(source[i]); count += ctoi(source[i]);
@ -992,7 +991,7 @@ int ean_14(struct zint_symbol *symbol, unsigned char source[])
ean128_equiv[17] = itoc(check_digit); ean128_equiv[17] = itoc(check_digit);
ean128_equiv[18] = '\0'; ean128_equiv[18] = '\0';
error_number = ean_128(symbol, ean128_equiv); error_number = ean_128(symbol, ean128_equiv, ustrlen(ean128_equiv));
return error_number; return error_number;
} }

View File

@ -65,7 +65,7 @@ static char *C16KStartStop[8] = {"3211", "2221", "2122", "1411", "1132", "1231",
static int C16KStartValues[16] = {0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7}; static int C16KStartValues[16] = {0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7};
static int C16KStopValues[16] = {0, 1, 2, 3, 4, 5, 6, 7, 4, 5, 6, 7, 0, 1, 2, 3}; static int C16KStopValues[16] = {0, 1, 2, 3, 4, 5, 6, 7, 4, 5, 6, 7, 0, 1, 2, 3};
int parunmodd(unsigned char llyth, char nullchar); int parunmodd(unsigned char llyth);
void grwp16(int *indexliste) void grwp16(int *indexliste)
{ {
@ -130,14 +130,8 @@ void dxsmooth16(int *indexliste)
} }
void c16k_set_a(unsigned char source, unsigned int values[], unsigned int *bar_chars, char nullchar) void c16k_set_a(unsigned char source, unsigned int values[], unsigned int *bar_chars)
{ {
if(source == nullchar) {
values[(*bar_chars)] = 64;
(*bar_chars)++;
return;
}
if(source > 127) { if(source > 127) {
if(source < 160) { if(source < 160) {
values[(*bar_chars)] = source + 64 - 128; values[(*bar_chars)] = source + 64 - 128;
@ -173,7 +167,7 @@ void c16k_set_c(unsigned char source_a, unsigned char source_b, unsigned int val
(*bar_chars)++; (*bar_chars)++;
} }
int code16k(struct zint_symbol *symbol, unsigned char source[]) int code16k(struct zint_symbol *symbol, unsigned char source[], int length)
{ {
char width_pattern[100]; char width_pattern[100];
int current_row, rows_needed, flip_flop, looper, first_check, second_check; int current_row, rows_needed, flip_flop, looper, first_check, second_check;
@ -189,7 +183,7 @@ int code16k(struct zint_symbol *symbol, unsigned char source[])
errornum = 0; errornum = 0;
strcpy(width_pattern, ""); strcpy(width_pattern, "");
input_length = ustrlen(source); input_length = length;
if(symbol->input_mode == GS1_MODE) { gs1 = 1; } else { gs1 = 0; } if(symbol->input_mode == GS1_MODE) { gs1 = 1; } else { gs1 = 0; }
@ -249,7 +243,7 @@ int code16k(struct zint_symbol *symbol, unsigned char source[])
indexliste = 0; indexliste = 0;
indexchaine = 0; indexchaine = 0;
mode = parunmodd(source[indexchaine], symbol->nullchar); mode = parunmodd(source[indexchaine]);
if((gs1) && (source[indexchaine] == '[')) { mode = ABORC; } /* FNC1 */ if((gs1) && (source[indexchaine] == '[')) { mode = ABORC; } /* FNC1 */
for(i = 0; i < 160; i++) { for(i = 0; i < 160; i++) {
@ -261,7 +255,7 @@ int code16k(struct zint_symbol *symbol, unsigned char source[])
while ((list[1][indexliste] == mode) && (indexchaine < input_length)) { while ((list[1][indexliste] == mode) && (indexchaine < input_length)) {
list[0][indexliste]++; list[0][indexliste]++;
indexchaine++; indexchaine++;
mode = parunmodd(source[indexchaine], symbol->nullchar); mode = parunmodd(source[indexchaine]);
if((gs1) && (source[indexchaine] == '[')) { mode = ABORC; } /* FNC1 */ if((gs1) && (source[indexchaine] == '[')) { mode = ABORC; } /* FNC1 */
} }
indexliste++; indexliste++;
@ -537,7 +531,7 @@ int code16k(struct zint_symbol *symbol, unsigned char source[])
{ /* Encode data characters */ { /* Encode data characters */
case 'A': case 'A':
case 'a': case 'a':
c16k_set_a(source[read], values, &bar_characters, symbol->nullchar); c16k_set_a(source[read], values, &bar_characters);
read++; read++;
break; break;
case 'B': case 'B':

View File

@ -28,7 +28,7 @@
#define INSET "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%!&*" #define INSET "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%!&*"
/* "!" represents Shift 1 and "&" represents Shift 2, "*" represents FNC1 */ /* "!" represents Shift 1 and "&" represents Shift 2, "*" represents FNC1 */
int code_49(struct zint_symbol *symbol, unsigned char source[]) int code_49(struct zint_symbol *symbol, unsigned char source[], int length)
{ {
int i, j, rows, M, x_count, y_count, z_count, posn_val, local_value; int i, j, rows, M, x_count, y_count, z_count, posn_val, local_value;
char intermediate[170]; char intermediate[170];
@ -39,14 +39,14 @@ int code_49(struct zint_symbol *symbol, unsigned char source[])
char pattern[40]; char pattern[40];
int gs1; int gs1;
if(ustrlen(source) > 81) { if(length > 81) {
strcpy(symbol->errtxt, "Input too long"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
if(symbol->input_mode == GS1_MODE) { gs1 = 1; } else { gs1 = 0; } if(symbol->input_mode == GS1_MODE) { gs1 = 1; } else { gs1 = 0; }
strcpy(intermediate, ""); strcpy(intermediate, "");
for(i = 0; i < ustrlen(source); i++) { for(i = 0; i < length; i++) {
if(source[i] > 127) { if(source[i] > 127) {
strcpy(symbol->errtxt, "Invalid characters in input data"); strcpy(symbol->errtxt, "Invalid characters in input data");
return ERROR_INVALID_DATA; return ERROR_INVALID_DATA;
@ -54,14 +54,11 @@ int code_49(struct zint_symbol *symbol, unsigned char source[])
if(gs1 && (i == 0)) { if(gs1 && (i == 0)) {
concat(intermediate, "*"); /* FNC1 */ concat(intermediate, "*"); /* FNC1 */
} }
if(source[i] == symbol->nullchar) {
concat(intermediate, c49_table7[0]); if(gs1 && (source[i] == '[')) {
concat(intermediate, "*"); /* FNC1 */
} else { } else {
if(gs1 && (source[i] == '[')) { concat(intermediate, c49_table7[source[i]]);
concat(intermediate, "*"); /* FNC1 */
} else {
concat(intermediate, c49_table7[source[i]]);
}
} }
} }

View File

@ -88,11 +88,11 @@ void to_upper(unsigned char source[])
} }
} }
int is_sane(char test_string[], unsigned char source[]) int is_sane(char test_string[], unsigned char source[], int length)
{ /* Verifies that a string only uses valid characters */ { /* Verifies that a string only uses valid characters */
unsigned int i, j, latch; unsigned int i, j, latch;
for(i = 0; i < ustrlen(source); i++) { for(i = 0; i < length; i++) {
latch = FALSE; latch = FALSE;
for(j = 0; j < strlen(test_string); j++) { for(j = 0; j < strlen(test_string); j++) {
if (source[i] == test_string[j]) { latch = TRUE; } } if (source[i] == test_string[j]) { latch = TRUE; } }
@ -279,3 +279,41 @@ float froundup(float input)
return output; return output;
} }
int latin1_process(struct zint_symbol *symbol, unsigned char source[], unsigned char preprocessed[], int *length)
{
int j, i, next;
/* Convert Unicode to Latin-1 for those symbologies which only support Latin-1 */
j = 0;
i = 0;
do {
next = -1;
if(source[i] < 128) {
preprocessed[j] = source[i];
j++;
next = i + 1;
} else {
if(source[i] == 0xC2) {
preprocessed[j] = source[i + 1];
j++;
next = i + 2;
}
if(source[i] == 0xC3) {
preprocessed[j] = source[i + 1] + 64;
j++;
next = i + 2;
}
}
if(next == -1) {
strcpy(symbol->errtxt, "error: Invalid character in input string (only Latin-1 characters supported)");
return ERROR_INVALID_DATA;
}
i = next;
} while(i < *length);
preprocessed[j] = '\0';
*length = j;
return 0;
}

View File

@ -48,7 +48,7 @@ extern void uconcat(unsigned char dest[], unsigned char source[]);
extern int ctoi(char source); extern int ctoi(char source);
extern char itoc(int source); extern char itoc(int source);
extern void to_upper(unsigned char source[]); extern void to_upper(unsigned char source[]);
extern int is_sane(char test_string[], unsigned char source[]); extern int is_sane(char test_string[], unsigned char source[], int length);
extern void lookup(char set_string[], char *table[], char data, char dest[]); extern void lookup(char set_string[], char *table[], char data, char dest[]);
extern int posn(char set_string[], char data); extern int posn(char set_string[], char data);
extern void expand(struct zint_symbol *symbol, char data[]); extern void expand(struct zint_symbol *symbol, char data[]);
@ -60,6 +60,7 @@ extern void set_module(struct zint_symbol *symbol, int y_coord, int x_coord);
extern void unset_module(struct zint_symbol *symbol, int y_coord, int x_coord); extern void unset_module(struct zint_symbol *symbol, int y_coord, int x_coord);
extern int istwodigits(unsigned char source[], int position); extern int istwodigits(unsigned char source[], int position);
extern float froundup(float input); extern float froundup(float input);
extern int latin1_process(struct zint_symbol *symbol, unsigned char source[], unsigned char preprocessed[], int *length);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif /* __cplusplus */ #endif /* __cplusplus */

View File

@ -53,11 +53,11 @@
#define UINT unsigned short #define UINT unsigned short
int general_rules(char field[], char type[]); int general_rules(char field[], char type[]);
int eanx(struct zint_symbol *symbol, unsigned char source[]); int eanx(struct zint_symbol *symbol, unsigned char source[], int length);
int ean_128(struct zint_symbol *symbol, unsigned char source[]); int ean_128(struct zint_symbol *symbol, unsigned char source[], int length);
int rss14(struct zint_symbol *symbol, unsigned char source[]); int rss14(struct zint_symbol *symbol, unsigned char source[], int length);
int rsslimited(struct zint_symbol *symbol, unsigned char source[]); int rsslimited(struct zint_symbol *symbol, unsigned char source[], int length);
int rssexpanded(struct zint_symbol *symbol, unsigned char source[]); int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int length);
static UINT pwr928[69][7]; static UINT pwr928[69][7];
@ -368,7 +368,7 @@ int cc_b(struct zint_symbol *symbol, char source[], int cc_width)
chainemc[mclength] = 920; chainemc[mclength] = 920;
mclength++; mclength++;
byteprocess(chainemc, &mclength, data_string, 0, length, 0, 0x00); byteprocess(chainemc, &mclength, data_string, 0, length, 0);
/* Now figure out which variant of the symbol to use and load values accordingly */ /* Now figure out which variant of the symbol to use and load values accordingly */
@ -597,7 +597,7 @@ int cc_c(struct zint_symbol *symbol, char source[], int cc_width, int ecc_level)
chainemc[mclength] = 920; /* CC-C identifier */ chainemc[mclength] = 920; /* CC-C identifier */
mclength++; mclength++;
byteprocess(chainemc, &mclength, data_string, 0, length, 0, 0x00); byteprocess(chainemc, &mclength, data_string, 0, length, 0);
chainemc[0] = mclength; chainemc[0] = mclength;
@ -1752,16 +1752,16 @@ void add_leading_zeroes(struct zint_symbol *symbol)
} }
} }
int composite(struct zint_symbol *symbol, unsigned char source[]) int composite(struct zint_symbol *symbol, unsigned char source[], int length)
{ {
int error_number, cc_mode, cc_width, ecc_level; int error_number, cc_mode, cc_width, ecc_level;
int j, i, k, separator_row; int j, i, k, separator_row;
#ifndef _MSC_VER #ifndef _MSC_VER
char reduced[ustrlen(source)]; char reduced[ustrlen(source)];
char binary_string[10 * ustrlen(source)]; char binary_string[10 * length];
#else #else
char* reduced = (char*)_alloca(ustrlen(source) + 1); char* reduced = (char*)_alloca(length + 1);
char* binary_string = (char*)_alloca(20 * (ustrlen(source) + 1)); char* binary_string = (char*)_alloca(20 * (length + 1));
#endif #endif
struct zint_symbol *linear; struct zint_symbol *linear;
int top_shift, bottom_shift; int top_shift, bottom_shift;
@ -1778,7 +1778,7 @@ int composite(struct zint_symbol *symbol, unsigned char source[])
add_leading_zeroes(symbol); add_leading_zeroes(symbol);
} }
if(ustrlen(source) > 2990) { if(length > 2990) {
strcpy(symbol->errtxt, "2D component input data too long"); strcpy(symbol->errtxt, "2D component input data too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
@ -1807,16 +1807,16 @@ int composite(struct zint_symbol *symbol, unsigned char source[])
} }
switch(symbol->symbology) { switch(symbol->symbology) {
case BARCODE_EANX_CC: error_number = eanx(linear, (unsigned char *)symbol->primary); break; case BARCODE_EANX_CC: error_number = eanx(linear, (unsigned char *)symbol->primary, strlen(symbol->primary)); break;
case BARCODE_EAN128_CC: error_number = ean_128(linear, (unsigned char *)symbol->primary); break; case BARCODE_EAN128_CC: error_number = ean_128(linear, (unsigned char *)symbol->primary, strlen(symbol->primary)); break;
case BARCODE_RSS14_CC: error_number = rss14(linear, (unsigned char *)symbol->primary); break; case BARCODE_RSS14_CC: error_number = rss14(linear, (unsigned char *)symbol->primary, strlen(symbol->primary)); break;
case BARCODE_RSS_LTD_CC: error_number = rsslimited(linear, (unsigned char *)symbol->primary); break; case BARCODE_RSS_LTD_CC: error_number = rsslimited(linear, (unsigned char *)symbol->primary, strlen(symbol->primary)); break;
case BARCODE_RSS_EXP_CC: error_number = rssexpanded(linear, (unsigned char *)symbol->primary); break; case BARCODE_RSS_EXP_CC: error_number = rssexpanded(linear, (unsigned char *)symbol->primary, strlen(symbol->primary)); break;
case BARCODE_UPCA_CC: error_number = eanx(linear, (unsigned char *)symbol->primary); break; case BARCODE_UPCA_CC: error_number = eanx(linear, (unsigned char *)symbol->primary, strlen(symbol->primary)); break;
case BARCODE_UPCE_CC: error_number = eanx(linear, (unsigned char *)symbol->primary); break; case BARCODE_UPCE_CC: error_number = eanx(linear, (unsigned char *)symbol->primary, strlen(symbol->primary)); break;
case BARCODE_RSS14STACK_CC: error_number = rss14(linear, (unsigned char *)symbol->primary); break; case BARCODE_RSS14STACK_CC: error_number = rss14(linear, (unsigned char *)symbol->primary, strlen(symbol->primary)); break;
case BARCODE_RSS14_OMNI_CC: error_number = rss14(linear, (unsigned char *)symbol->primary); break; case BARCODE_RSS14_OMNI_CC: error_number = rss14(linear, (unsigned char *)symbol->primary, strlen(symbol->primary)); break;
case BARCODE_RSS_EXPSTACK_CC: error_number = rssexpanded(linear, (unsigned char *)symbol->primary); break; case BARCODE_RSS_EXPSTACK_CC: error_number = rssexpanded(linear, (unsigned char *)symbol->primary, strlen(symbol->primary)); break;
} }
if(error_number != 0) { if(error_number != 0) {

View File

@ -326,14 +326,14 @@ int look_ahead_test(unsigned char source[], int sourcelen, int position, int cur
return best_scheme; return best_scheme;
} }
int dm200encode(struct zint_symbol *symbol, unsigned char source[], unsigned char target[], int *last_mode) int dm200encode(struct zint_symbol *symbol, unsigned char source[], unsigned char target[], int *last_mode, int length)
{ {
/* Encodes data using ASCII, C40, Text, X12, EDIFACT or Base 256 modes as appropriate */ /* Encodes data using ASCII, C40, Text, X12, EDIFACT or Base 256 modes as appropriate */
/* Supports encoding FNC1 in supporting systems */ /* Supports encoding FNC1 in supporting systems */
int sp, tp, i, gs1; int sp, tp, i, gs1;
int current_mode, next_mode; int current_mode, next_mode;
int inputlen = ustrlen(source); int inputlen = length;
int c40_buffer[6], c40_p; int c40_buffer[6], c40_p;
int text_buffer[6], text_p; int text_buffer[6], text_p;
int x12_buffer[6], x12_p; int x12_buffer[6], x12_p;
@ -356,14 +356,6 @@ int dm200encode(struct zint_symbol *symbol, unsigned char source[], unsigned cha
edifact_p = 0; edifact_p = 0;
strcpy(binary, ""); strcpy(binary, "");
if(symbol->nullchar != 0x00) {
for(i = 0; i < inputlen; i++) {
if(source[i] == symbol->nullchar) {
source[i] = 0x00;
}
}
}
/* step (a) */ /* step (a) */
current_mode = DM_ASCII; current_mode = DM_ASCII;
next_mode = DM_ASCII; next_mode = DM_ASCII;
@ -768,7 +760,7 @@ void add_tail(unsigned char target[], int tp, int tail_length, int last_mode)
} }
} }
int data_matrix_200(struct zint_symbol *symbol, unsigned char source[]) int data_matrix_200(struct zint_symbol *symbol, unsigned char source[], int length)
{ {
int inputlen, i; int inputlen, i;
unsigned char binary[2000]; unsigned char binary[2000];
@ -778,9 +770,30 @@ int data_matrix_200(struct zint_symbol *symbol, unsigned char source[])
int H, W, FH, FW, datablock, bytes, rsblock; int H, W, FH, FW, datablock, bytes, rsblock;
int last_mode; int last_mode;
unsigned char *grid = 0; unsigned char *grid = 0;
inputlen = ustrlen(source); inputlen = length;
#ifndef _MSC_VER
unsigned char local_source[length];
#else
unsigned char local_source = (unsigned char*)_alloca(length);
#endif
/* The following to be replaced by ECI handling */
switch(symbol->input_mode) {
case DATA_MODE:
for(i = 0; i < length; i++) {
local_source[i] = source[i];
}
local_source[length] = '\0';
break;
case UNICODE_MODE:
error_number = latin1_process(symbol, source, local_source, &length);
if(error_number != 0) { return error_number; }
break;
}
binlen = dm200encode(symbol, source, binary, &last_mode, length);
binlen = dm200encode(symbol, source, binary, &last_mode);
if(binlen == 0) { if(binlen == 0) {
strcpy(symbol->errtxt, "Data too long to fit in symbol"); strcpy(symbol->errtxt, "Data too long to fit in symbol");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;

View File

@ -28,7 +28,7 @@ extern "C"
{ {
#endif /* __cplusplus */ #endif /* __cplusplus */
extern int data_matrix_200(struct zint_symbol *symbol, unsigned char source[]); extern int data_matrix_200(struct zint_symbol *symbol, unsigned char source[], int length);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -29,7 +29,7 @@
#ifdef _MSC_VER #ifdef _MSC_VER
#include "dm200.h" #include "dm200.h"
#else #else
extern int data_matrix_200(struct zint_symbol *symbol, unsigned char source[]); extern int data_matrix_200(struct zint_symbol *symbol, unsigned char source[], int length);
#endif #endif
#define B11SET " 0123456789" #define B11SET " 0123456789"
@ -37,7 +37,7 @@ extern int data_matrix_200(struct zint_symbol *symbol, unsigned char source[]);
#define B37SET " ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" #define B37SET " ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
#define B41SET " ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.,-/" #define B41SET " ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.,-/"
void crc_machine(char data_prefix_bitstream[], int scheme, unsigned char source[]) void crc_machine(char data_prefix_bitstream[], int scheme, unsigned char source[], int length)
{ {
int input_length, i; int input_length, i;
char xor_register[17]; char xor_register[17];
@ -48,7 +48,7 @@ void crc_machine(char data_prefix_bitstream[], int scheme, unsigned char source[
char* precrc_bitstream_reversed; char* precrc_bitstream_reversed;
#endif #endif
input_length = ustrlen(source); input_length = length;
#ifndef _MSC_VER #ifndef _MSC_VER
char precrc_bitstream[(input_length * 8) + 18]; char precrc_bitstream[(input_length * 8) + 18];
@ -131,14 +131,14 @@ void crc_machine(char data_prefix_bitstream[], int scheme, unsigned char source[
return; return;
} }
void i1_base11(char binary_string[], unsigned char source[]) void i1_base11(char binary_string[], unsigned char source[], int length)
{ {
int input_length, blocks, remainder, i, j; int input_length, blocks, remainder, i, j;
char block_binary[22]; char block_binary[22];
int block_value, c[6], weight[6]; int block_value, c[6], weight[6];
int binary_posn; int binary_posn;
input_length = ustrlen(source); input_length = length;
binary_posn = strlen(binary_string); binary_posn = strlen(binary_string);
blocks = input_length / 6; blocks = input_length / 6;
remainder = input_length % 6; remainder = input_length % 6;
@ -235,14 +235,14 @@ void i1_base11(char binary_string[], unsigned char source[])
return; return;
} }
void i2_base27(char binary_string[], unsigned char source[]) void i2_base27(char binary_string[], unsigned char source[], int length)
{ {
int input_length, blocks, remainder, i, j; int input_length, blocks, remainder, i, j;
char block_binary[25]; char block_binary[25];
int block_value, c[5], weight[5]; int block_value, c[5], weight[5];
int binary_posn; int binary_posn;
input_length = ustrlen(source); input_length = length;
blocks = input_length / 5; blocks = input_length / 5;
remainder = input_length % 5; remainder = input_length % 5;
binary_posn = strlen(binary_string); binary_posn = strlen(binary_string);
@ -340,14 +340,14 @@ void i2_base27(char binary_string[], unsigned char source[])
return; return;
} }
void i3_base37(char binary_string[], unsigned char source[]) void i3_base37(char binary_string[], unsigned char source[], int length)
{ {
int input_length, blocks, remainder, i, j; int input_length, blocks, remainder, i, j;
char block_binary[22]; char block_binary[22];
int block_value, c[6], weight[6]; int block_value, c[6], weight[6];
int binary_posn; int binary_posn;
input_length = ustrlen(source); input_length = length;
blocks = input_length / 4; blocks = input_length / 4;
remainder = input_length % 4; remainder = input_length % 4;
binary_posn = strlen(binary_string); binary_posn = strlen(binary_string);
@ -436,14 +436,14 @@ void i3_base37(char binary_string[], unsigned char source[])
return; return;
} }
void i4_base41(char binary_string[], unsigned char source[]) void i4_base41(char binary_string[], unsigned char source[], int length)
{ {
int input_length, blocks, remainder, i, j; int input_length, blocks, remainder, i, j;
char block_binary[23]; char block_binary[23];
int block_value, c[6], weight[6]; int block_value, c[6], weight[6];
int binary_posn; int binary_posn;
input_length = ustrlen(source); input_length = length;
blocks = input_length / 4; blocks = input_length / 4;
remainder = input_length % 4; remainder = input_length % 4;
binary_posn = strlen(binary_string); binary_posn = strlen(binary_string);
@ -534,13 +534,13 @@ void i4_base41(char binary_string[], unsigned char source[])
return; return;
} }
void base128(char binary_string[], unsigned char source[]) void base128(char binary_string[], unsigned char source[], int length)
{ {
int i, j, input_length; int i, j, input_length;
char block_binary[9]; char block_binary[9];
int binary_posn; int binary_posn;
input_length = ustrlen(source); input_length = length;
binary_posn = strlen(binary_string); binary_posn = strlen(binary_string);
for(i = 0; i < input_length; i++) { for(i = 0; i < input_length; i++) {
@ -1078,7 +1078,7 @@ void protect_ecc140(char protected_stream[], char unprotected_stream[])
} }
int matrix89(struct zint_symbol *symbol, unsigned char source[]) int matrix89(struct zint_symbol *symbol, unsigned char source[], int length)
{ {
int i, j, input_length, scheme; int i, j, input_length, scheme;
char unprotected_stream[2210]; char unprotected_stream[2210];
@ -1091,7 +1091,7 @@ int matrix89(struct zint_symbol *symbol, unsigned char source[])
int symbol_size, hex_segment, width; int symbol_size, hex_segment, width;
int error_number; int error_number;
input_length = ustrlen(source); input_length = length;
error_number = 0; error_number = 0;
symbol_size = 0; symbol_size = 0;
@ -1104,10 +1104,10 @@ int matrix89(struct zint_symbol *symbol, unsigned char source[])
/* Decide which encoding scheme to use */ /* Decide which encoding scheme to use */
scheme = 128; scheme = 128;
if(!(is_sane(B41SET, source))) { scheme = 41; } if(!(is_sane(B41SET, source, length))) { scheme = 41; }
if(!(is_sane(B37SET, source))) { scheme = 37; } if(!(is_sane(B37SET, source, length))) { scheme = 37; }
if(!(is_sane(B27SET, source))) { scheme = 27; } if(!(is_sane(B27SET, source, length))) { scheme = 27; }
if(!(is_sane(B11SET, source))) { scheme = 11; } if(!(is_sane(B11SET, source, length))) { scheme = 11; }
/* Data Prefix Bit Stream = Format ID + CRC + Data Length */ /* Data Prefix Bit Stream = Format ID + CRC + Data Length */
@ -1121,7 +1121,7 @@ int matrix89(struct zint_symbol *symbol, unsigned char source[])
} }
/* CRC Value (16 bit) */ /* CRC Value (16 bit) */
crc_machine(data_prefix_bitstream, scheme, source); crc_machine(data_prefix_bitstream, scheme, source, length);
/* Data length (9 bit) */ /* Data length (9 bit) */
if(input_length & 0x01) { concat(data_prefix_bitstream, "1"); } else { concat(data_prefix_bitstream, "0"); } if(input_length & 0x01) { concat(data_prefix_bitstream, "1"); } else { concat(data_prefix_bitstream, "0"); }
@ -1167,11 +1167,11 @@ int matrix89(struct zint_symbol *symbol, unsigned char source[])
} }
switch(scheme) { switch(scheme) {
case 11: i1_base11(unprotected_stream, source); break; case 11: i1_base11(unprotected_stream, source, length); break;
case 27: i2_base27(unprotected_stream, source); break; case 27: i2_base27(unprotected_stream, source, length); break;
case 37: i3_base37(unprotected_stream, source); break; case 37: i3_base37(unprotected_stream, source, length); break;
case 41: i4_base41(unprotected_stream, source); break; case 41: i4_base41(unprotected_stream, source, length); break;
default: base128(unprotected_stream, source); break; default: base128(unprotected_stream, source, length); break;
} }
/* Header (ECC Bit field) LSB first */ /* Header (ECC Bit field) LSB first */
@ -1307,16 +1307,16 @@ int matrix89(struct zint_symbol *symbol, unsigned char source[])
return error_number; return error_number;
} }
int dmatrix(struct zint_symbol *symbol, unsigned char source[]) int dmatrix(struct zint_symbol *symbol, unsigned char source[], int length)
{ {
int error_number; int error_number;
if(symbol->option_1 <= 1) { if(symbol->option_1 <= 1) {
/* ECC 200 */ /* ECC 200 */
error_number = data_matrix_200(symbol, source); error_number = data_matrix_200(symbol, source, length);
} else { } else {
/* ECC 000 - 140 */ /* ECC 000 - 140 */
error_number = matrix89(symbol, source); error_number = matrix89(symbol, source, length);
} }
return error_number; return error_number;

39
backend/gridmtx.c Normal file
View File

@ -0,0 +1,39 @@
/* gridmtx.c - Grid Matrix
libzint - the open source barcode library
Copyright (C) 2009 Robin Stuart <robin@zint.org.uk>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
/* This file impliments Grid Matrix as specified in
AIM Global Document Number AIMD014 Rev. 1.63 Revised 9 Dec 2008 */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#ifdef _MSC_VER
#include <malloc.h>
#endif
#include "common.h"
#include "reedsol.h"
#include "gridmtx.h"
int grid_matrix(struct zint_symbol *symbol, unsigned char source[])
{
strcpy(symbol->errtxt, "Grid Matrix not yet implemented");
return ERROR_INVALID_OPTION;
}

19
backend/gridmtx.h Normal file
View File

@ -0,0 +1,19 @@
/* gridmtx.h - definitions for Grid Matrix
libzint - the open source barcode library
Copyright (C) 2009 Robin Stuart <robin@zint.org.uk>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/

View File

@ -24,15 +24,16 @@
static short int BCD[40] = { static short int BCD[40] = {
0, 0, 0, 0, 0, 0, 0, 0,
1, 0, 0, 0, 1, 0, 0, 0,
0, 1, 0, 0, 0, 1, 0, 0,
1, 1, 0, 0, 1, 1, 0, 0,
0, 0, 1, 0, 0, 0, 1, 0,
1, 0, 1, 0, 1, 0, 1, 0,
0, 1, 1, 0, 0, 1, 1, 0,
1, 1, 1, 0, 1, 1, 1, 0,
0, 0, 0, 1, 0, 0, 0, 1,
1, 0, 0, 1 }; 1, 0, 0, 1
};
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
@ -305,7 +306,7 @@ void breakup(short int fcs_bit[], unsigned short usps_crc)
} }
} }
int imail(struct zint_symbol *symbol, unsigned char source[]) int imail(struct zint_symbol *symbol, unsigned char source[], int length)
{ {
char data_pattern[200]; char data_pattern[200];
int error_number; int error_number;
@ -320,11 +321,11 @@ int imail(struct zint_symbol *symbol, unsigned char source[])
error_number = 0; error_number = 0;
if(ustrlen(source) > 32) { if(length > 32) {
strcpy(symbol->errtxt, "Input too long"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
error_number = is_sane(NASET, source); error_number = is_sane(NASET, source, length);
if(error_number == ERROR_INVALID_DATA) { if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in data"); strcpy(symbol->errtxt, "Invalid characters in data");
return error_number; return error_number;
@ -337,7 +338,7 @@ int imail(struct zint_symbol *symbol, unsigned char source[])
read = 0; read = 0;
j = 0; j = 0;
for(i = 0; i < ustrlen(source); i++) { for(i = 0; i < length; i++) {
if(source[i] == '-') { if(source[i] == '-') {
tracker[read] = '\0'; tracker[read] = '\0';
j = 1; j = 1;

File diff suppressed because it is too large Load Diff

View File

@ -112,7 +112,7 @@ void maxi_bump(int set[], int character[], int bump_posn)
} }
} }
int maxi_text_process(int mode, unsigned char source[], char nullchar) int maxi_text_process(int mode, unsigned char source[], int length)
{ {
/* Format text according to Appendix A */ /* Format text according to Appendix A */
@ -120,9 +120,7 @@ int maxi_text_process(int mode, unsigned char source[], char nullchar)
and [Lock in E] and so is not always the most efficient at and [Lock in E] and so is not always the most efficient at
compressing data, but should suffice for most applications */ compressing data, but should suffice for most applications */
int set[144], character[144], i, j, done, count, length, current_set; int set[144], character[144], i, j, done, count, current_set;
length = ustrlen(source);
if(length > 138) { if(length > 138) {
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
@ -136,13 +134,8 @@ int maxi_text_process(int mode, unsigned char source[], char nullchar)
for (i = 0; i < length; i++) { for (i = 0; i < length; i++) {
/* Look up characters in table from Appendix A - this gives /* Look up characters in table from Appendix A - this gives
value and code set for most characters */ value and code set for most characters */
if(source[i] == nullchar) { set[i] = maxiCodeSet[source[i]];
set[i] = maxiCodeSet[0]; character[i] = maxiSymbolChar[source[i]];
character[i] = maxiSymbolChar[0];
} else {
set[i] = maxiCodeSet[source[i]];
character[i] = maxiSymbolChar[source[i]];
}
} }
/* If a character can be represented in more than one code set, /* If a character can be represented in more than one code set,
@ -551,16 +544,37 @@ void maxi_do_primary_3(char postcode[], int country, int service)
maxi_codeword[9] = ((service & 0x3f0) >> 4); maxi_codeword[9] = ((service & 0x3f0) >> 4);
} }
int maxicode(struct zint_symbol *symbol, unsigned char source[]) int maxicode(struct zint_symbol *symbol, unsigned char source[], int length)
{ {
int i, j, block, bit, mode, countrycode = 0, service = 0; int i, j, block, bit, mode, countrycode = 0, service = 0;
int bit_pattern[7], internal_error = 0, eclen; int bit_pattern[7], internal_error = 0, eclen, error_number;
char postcode[12], countrystr[4], servicestr[4]; char postcode[12], countrystr[4], servicestr[4];
#ifndef _MSC_VER
unsigned char local_source[length];
#else
unsigned char local_source = (unsigned char*)_alloca(length);
#endif
mode = symbol->option_1; mode = symbol->option_1;
strcpy(postcode, ""); strcpy(postcode, "");
strcpy(countrystr, ""); strcpy(countrystr, "");
strcpy(servicestr, ""); strcpy(servicestr, "");
/* The following to be replaced by ECI handling */
switch(symbol->input_mode) {
case DATA_MODE:
for(i = 0; i < length; i++) {
local_source[i] = source[i];
}
local_source[length] = '\0';
break;
case UNICODE_MODE:
error_number = latin1_process(symbol, source, local_source, &length);
if(error_number != 0) { return error_number; }
break;
}
for(i = 0; i < 145; i++) { for(i = 0; i < 145; i++) {
maxi_codeword[i] = 0; maxi_codeword[i] = 0;
} }
@ -628,7 +642,7 @@ int maxicode(struct zint_symbol *symbol, unsigned char source[])
maxi_codeword[0] = mode; maxi_codeword[0] = mode;
} }
i = maxi_text_process(mode, source, symbol->nullchar); i = maxi_text_process(mode, local_source, length);
if(i == ERROR_TOO_LONG ) { if(i == ERROR_TOO_LONG ) {
strcpy(symbol->errtxt, "Input data too long"); strcpy(symbol->errtxt, "Input data too long");
return i; return i;

View File

@ -32,9 +32,9 @@ static char *CodaTable[20] = {"11111221", "11112211", "11121121", "22111111", "1
"12111121", "12112111", "12211111", "21121111", "11122111", "11221111", "21112121", "21211121", "12111121", "12112111", "12211111", "21121111", "11122111", "11221111", "21112121", "21211121",
"21212111", "11212121", "11221211", "12121121", "11121221", "11122211"}; "21212111", "11212121", "11221211", "12121121", "11121221", "11122211"};
int c39(struct zint_symbol *symbol, unsigned char source[]); int c39(struct zint_symbol *symbol, unsigned char source[], int length);
int pharma_one(struct zint_symbol *symbol, unsigned char source[]) int pharma_one(struct zint_symbol *symbol, unsigned char source[], int length)
{ {
/* "Pharmacode can represent only a single integer from 3 to 131070. Unlike other /* "Pharmacode can represent only a single integer from 3 to 131070. Unlike other
commonly used one-dimensional barcode schemes, pharmacode does not store the data in a commonly used one-dimensional barcode schemes, pharmacode does not store the data in a
@ -57,11 +57,11 @@ int pharma_one(struct zint_symbol *symbol, unsigned char source[])
error_number = 0; error_number = 0;
strcpy(dest, ""); strcpy(dest, "");
if(ustrlen(source) > 6) { if(length > 6) {
strcpy(symbol->errtxt, "Input too long"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
error_number = is_sane(NESET, source); error_number = is_sane(NESET, source, length);
if(error_number == ERROR_INVALID_DATA) { if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in data"); strcpy(symbol->errtxt, "Invalid characters in data");
return error_number; return error_number;
@ -151,7 +151,7 @@ int pharma_two_calc(struct zint_symbol *symbol, unsigned char source[], char des
return error_number; return error_number;
} }
int pharma_two(struct zint_symbol *symbol, unsigned char source[]) int pharma_two(struct zint_symbol *symbol, unsigned char source[], int length)
{ {
/* Draws the patterns for two track pharmacode */ /* Draws the patterns for two track pharmacode */
char height_pattern[200]; char height_pattern[200];
@ -160,11 +160,11 @@ int pharma_two(struct zint_symbol *symbol, unsigned char source[])
int error_number = 0; int error_number = 0;
strcpy(height_pattern, ""); strcpy(height_pattern, "");
if(ustrlen(source) > 8) { if(length > 8) {
strcpy(symbol->errtxt, "Input too long"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
error_number = is_sane(NESET, source); error_number = is_sane(NESET, source, length);
if(error_number == ERROR_INVALID_DATA) { if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in data"); strcpy(symbol->errtxt, "Invalid characters in data");
return error_number; return error_number;
@ -194,52 +194,60 @@ int pharma_two(struct zint_symbol *symbol, unsigned char source[])
return error_number; return error_number;
} }
int codabar(struct zint_symbol *symbol, unsigned char source[]) int codabar(struct zint_symbol *symbol, unsigned char source[], int length)
{ /* The Codabar system consisting of simple substitution */ { /* The Codabar system consisting of simple substitution */
int i, error_number; int i, error_number;
char dest[1000]; char dest[1000];
#ifndef _MSC_VER
unsigned char local_source[length];
#else
unsigned char local_source = (unsigned char*)_alloca(length);
#endif
error_number = 0; error_number = 0;
strcpy(dest, ""); strcpy(dest, "");
if(ustrlen(source) > 60) { /* No stack smashing please */ if(length > 60) { /* No stack smashing please */
strcpy(symbol->errtxt, "Input too long"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
to_upper(source); for(i = 0; i < length; i++) {
error_number = is_sane(CASET, source); local_source[i] = source[i];
}
to_upper(local_source);
error_number = is_sane(CASET, local_source, length);
if(error_number == ERROR_INVALID_DATA) { if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in data"); strcpy(symbol->errtxt, "Invalid characters in data");
return error_number; return error_number;
} }
/* Codabar must begin and end with the characters A, B, C or D */ /* Codabar must begin and end with the characters A, B, C or D */
if(((source[0] != 'A') && (source[0] != 'B')) && if(((local_source[0] != 'A') && (local_source[0] != 'B')) &&
((source[0] != 'C') && (source[0] != 'D'))) ((local_source[0] != 'C') && (local_source[0] != 'D')))
{ {
strcpy(symbol->errtxt, "Invalid characters in data"); strcpy(symbol->errtxt, "Invalid characters in data");
return 6; return ERROR_INVALID_DATA;
} }
if(((source[ustrlen(source) - 1] != 'A') && (source[ustrlen(source) - 1] != 'B')) && if(((local_source[ustrlen(local_source) - 1] != 'A') && (local_source[ustrlen(local_source) - 1] != 'B')) &&
((source[ustrlen(source) - 1] != 'C') && (source[ustrlen(source) - 1] != 'D'))) ((local_source[ustrlen(local_source) - 1] != 'C') && (local_source[ustrlen(local_source) - 1] != 'D')))
{ {
strcpy(symbol->errtxt, "Invalid characters in data"); strcpy(symbol->errtxt, "Invalid characters in data");
return 6; return ERROR_INVALID_DATA;
} }
for(i = 0; i <= ustrlen(source); i++) for(i = 0; i < length; i++)
{ {
lookup(CASET, CodaTable, source[i], dest); lookup(CASET, CodaTable, local_source[i], dest);
} }
expand(symbol, dest); expand(symbol, dest);
ustrcpy(symbol->text, source); ustrcpy(symbol->text, local_source);
return error_number; return error_number;
} }
int code32(struct zint_symbol *symbol, unsigned char source[]) int code32(struct zint_symbol *symbol, unsigned char source[], int length)
{ /* Italian Pharmacode */ { /* Italian Pharmacode */
int i, zeroes, error_number, checksum, checkpart, checkdigit; int i, zeroes, error_number, checksum, checkpart, checkdigit;
char localstr[10], tempstr[2], risultante[7]; char localstr[10], tempstr[2], risultante[7];
@ -248,11 +256,11 @@ int code32(struct zint_symbol *symbol, unsigned char source[])
char tabella[34]; char tabella[34];
/* Validate the input */ /* Validate the input */
if(ustrlen(source) > 8) { if(length > 8) {
strcpy(symbol->errtxt, "Input too long"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
error_number = is_sane(NESET, source); error_number = is_sane(NESET, source, length);
if(error_number == ERROR_INVALID_DATA) { if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in data"); strcpy(symbol->errtxt, "Invalid characters in data");
return error_number; return error_number;
@ -260,7 +268,7 @@ int code32(struct zint_symbol *symbol, unsigned char source[])
/* Add leading zeros as required */ /* Add leading zeros as required */
strcpy(localstr, ""); strcpy(localstr, "");
zeroes = 8 - ustrlen(source); zeroes = 8 - length;
for(i = 0; i < zeroes; i++) { for(i = 0; i < zeroes; i++) {
concat(localstr, "0"); concat(localstr, "0");
} }
@ -311,7 +319,7 @@ int code32(struct zint_symbol *symbol, unsigned char source[])
} }
/* Plot the barcode using Code 39 */ /* Plot the barcode using Code 39 */
error_number = c39(symbol, (unsigned char*)risultante); error_number = c39(symbol, (unsigned char*)risultante, strlen(risultante));
if(error_number != 0) { return error_number; } if(error_number != 0) { return error_number; }
/* Override the normal text output with the Pharmacode number */ /* Override the normal text output with the Pharmacode number */

View File

@ -25,6 +25,7 @@
#include "common.h" #include "common.h"
#include "reedsol.h" #include "reedsol.h"
#include "micqr.h" #include "micqr.h"
#include "shiftjis.h"
#define NUMERIC 1 #define NUMERIC 1
#define ALPHANUM 2 #define ALPHANUM 2
@ -36,14 +37,14 @@
void qrnumeric_encode(char binary[], unsigned char source[]) void qrnumeric_encode(char binary[], unsigned char source[])
{ /* Encodes numeric data according to section 6.4.3 */ { /* Encodes numeric data according to section 6.4.3 */
int input_length, blocks, remainder, i; int length, blocks, remainder, i;
char block_binary[11]; char block_binary[11];
int block_value; int block_value;
block_value = 0; block_value = 0;
input_length = ustrlen(source); length = ustrlen(source);
blocks = input_length / 3; blocks = length / 3;
remainder = input_length % 3; remainder = length % 3;
for(i = 0; i < blocks; i++) { for(i = 0; i < blocks; i++) {
block_value = ctoi(source[(i * 3)]) * 100; block_value = ctoi(source[(i * 3)]) * 100;
@ -93,13 +94,13 @@ void qrnumeric_encode(char binary[], unsigned char source[])
void qralpha_encode(char binary[], unsigned char source[]) void qralpha_encode(char binary[], unsigned char source[])
{ /* Encodes alphanumeric data according to 6.4.4 */ { /* Encodes alphanumeric data according to 6.4.4 */
int input_length, blocks, remainder, i; int length, blocks, remainder, i;
char block_binary[12]; char block_binary[12];
int block_value; int block_value;
input_length = ustrlen(source); length = ustrlen(source);
blocks = input_length / 2; blocks = length / 2;
remainder = input_length % 2; remainder = length % 2;
for(i = 0; i < blocks; i++) { for(i = 0; i < blocks; i++) {
block_value = posn(QRSET, source[i * 2]) * 45; block_value = posn(QRSET, source[i * 2]) * 45;
@ -139,11 +140,11 @@ void qralpha_encode(char binary[], unsigned char source[])
void qrbyte_encode(char binary[], unsigned char source[]) void qrbyte_encode(char binary[], unsigned char source[])
{ /* Encodes byte mode data according to 6.4.5 */ { /* Encodes byte mode data according to 6.4.5 */
int input_length, i; int length, i;
input_length = ustrlen(source); length = ustrlen(source);
for(i = 0; i < input_length; i++) { for(i = 0; i < length; i++) {
if(source[i] & 0x80) { concat(binary, "1"); } else { concat(binary, "0"); } if(source[i] & 0x80) { concat(binary, "1"); } else { concat(binary, "0"); }
if(source[i] & 0x40) { concat(binary, "1"); } else { concat(binary, "0"); } if(source[i] & 0x40) { concat(binary, "1"); } else { concat(binary, "0"); }
if(source[i] & 0x20) { concat(binary, "1"); } else { concat(binary, "0"); } if(source[i] & 0x20) { concat(binary, "1"); } else { concat(binary, "0"); }
@ -195,19 +196,19 @@ int qrkanji_encode(char binary[], unsigned char source[])
void versionm1(char binary_data[], unsigned char source[]) void versionm1(char binary_data[], unsigned char source[])
{ {
int input_length, i, latch; int length, i, latch;
int bits_total, bits_left, remainder; int bits_total, bits_left, remainder;
int data_codewords, ecc_codewords; int data_codewords, ecc_codewords;
unsigned char data_blocks[4], ecc_blocks[3]; unsigned char data_blocks[4], ecc_blocks[3];
input_length = ustrlen(source); length = ustrlen(source);
bits_total = 20; bits_total = 20;
latch = 0; latch = 0;
/* Character count indicator */ /* Character count indicator */
if(input_length & 0x04) { concat(binary_data, "1"); } else { concat(binary_data, "0"); } if(length & 0x04) { concat(binary_data, "1"); } else { concat(binary_data, "0"); }
if(input_length & 0x02) { concat(binary_data, "1"); } else { concat(binary_data, "0"); } if(length & 0x02) { concat(binary_data, "1"); } else { concat(binary_data, "0"); }
if(input_length & 0x01) { concat(binary_data, "1"); } else { concat(binary_data, "0"); } if(length & 0x01) { concat(binary_data, "1"); } else { concat(binary_data, "0"); }
qrnumeric_encode(binary_data, source); qrnumeric_encode(binary_data, source);
@ -297,12 +298,12 @@ void versionm1(char binary_data[], unsigned char source[])
void versionm2(char binary_data[], unsigned char source[], int char_system, int ecc_mode) void versionm2(char binary_data[], unsigned char source[], int char_system, int ecc_mode)
{ {
int input_length, i, latch; int length, i, latch;
int bits_total, bits_left, remainder; int bits_total, bits_left, remainder;
int data_codewords, ecc_codewords; int data_codewords, ecc_codewords;
unsigned char data_blocks[6], ecc_blocks[7]; unsigned char data_blocks[6], ecc_blocks[7];
input_length = ustrlen(source); length = ustrlen(source);
latch = 0; latch = 0;
if(ecc_mode == 1) { bits_total = 40; } if(ecc_mode == 1) { bits_total = 40; }
@ -314,11 +315,11 @@ void versionm2(char binary_data[], unsigned char source[], int char_system, int
/* Character count indicator */ /* Character count indicator */
if(char_system == NUMERIC) { if(char_system == NUMERIC) {
if(input_length & 0x08) { concat(binary_data, "1"); } else { concat(binary_data, "0"); } if(length & 0x08) { concat(binary_data, "1"); } else { concat(binary_data, "0"); }
} }
if(input_length & 0x04) { concat(binary_data, "1"); } else { concat(binary_data, "0"); } if(length & 0x04) { concat(binary_data, "1"); } else { concat(binary_data, "0"); }
if(input_length & 0x02) { concat(binary_data, "1"); } else { concat(binary_data, "0"); } if(length & 0x02) { concat(binary_data, "1"); } else { concat(binary_data, "0"); }
if(input_length & 0x01) { concat(binary_data, "1"); } else { concat(binary_data, "0"); } if(length & 0x01) { concat(binary_data, "1"); } else { concat(binary_data, "0"); }
if(char_system == NUMERIC) { qrnumeric_encode(binary_data, source); } if(char_system == NUMERIC) { qrnumeric_encode(binary_data, source); }
if(char_system == ALPHANUM) { qralpha_encode(binary_data, source); } if(char_system == ALPHANUM) { qralpha_encode(binary_data, source); }
@ -390,13 +391,13 @@ void versionm2(char binary_data[], unsigned char source[], int char_system, int
void versionm3(char binary_data[], unsigned char source[], int char_system, int ecc_mode) void versionm3(char binary_data[], unsigned char source[], int char_system, int ecc_mode)
{ {
int input_length, i, latch; int length, i, latch;
int bits_total, bits_left, remainder; int bits_total, bits_left, remainder;
int data_codewords, ecc_codewords; int data_codewords, ecc_codewords;
unsigned char data_blocks[12], ecc_blocks[9]; unsigned char data_blocks[12], ecc_blocks[9];
int sjis_count; int sjis_count;
input_length = ustrlen(source); length = ustrlen(source);
latch = 0; latch = 0;
if(ecc_mode == 1) { bits_total = 84; } if(ecc_mode == 1) { bits_total = 84; }
@ -413,12 +414,12 @@ void versionm3(char binary_data[], unsigned char source[], int char_system, int
concat(binary_data, "XXX"); /* Place holder */ concat(binary_data, "XXX"); /* Place holder */
} else { } else {
if(char_system == NUMERIC) { if(char_system == NUMERIC) {
if(input_length & 0x10) { concat(binary_data, "1"); } else { concat(binary_data, "0"); } if(length & 0x10) { concat(binary_data, "1"); } else { concat(binary_data, "0"); }
} }
if(input_length & 0x08) { concat(binary_data, "1"); } else { concat(binary_data, "0"); } if(length & 0x08) { concat(binary_data, "1"); } else { concat(binary_data, "0"); }
if(input_length & 0x04) { concat(binary_data, "1"); } else { concat(binary_data, "0"); } if(length & 0x04) { concat(binary_data, "1"); } else { concat(binary_data, "0"); }
if(input_length & 0x02) { concat(binary_data, "1"); } else { concat(binary_data, "0"); } if(length & 0x02) { concat(binary_data, "1"); } else { concat(binary_data, "0"); }
if(input_length & 0x01) { concat(binary_data, "1"); } else { concat(binary_data, "0"); } if(length & 0x01) { concat(binary_data, "1"); } else { concat(binary_data, "0"); }
} }
if(char_system == NUMERIC) { qrnumeric_encode(binary_data, source); } if(char_system == NUMERIC) { qrnumeric_encode(binary_data, source); }
@ -529,13 +530,13 @@ void versionm3(char binary_data[], unsigned char source[], int char_system, int
void versionm4(char binary_data[], unsigned char source[], int char_system, int ecc_mode) void versionm4(char binary_data[], unsigned char source[], int char_system, int ecc_mode)
{ {
int input_length, i, latch; int length, i, latch;
int bits_total, bits_left, remainder; int bits_total, bits_left, remainder;
int data_codewords, ecc_codewords; int data_codewords, ecc_codewords;
unsigned char data_blocks[17], ecc_blocks[15]; unsigned char data_blocks[17], ecc_blocks[15];
int sjis_count; int sjis_count;
input_length = ustrlen(source); length = ustrlen(source);
latch = 0; latch = 0;
if(ecc_mode == 1) { bits_total = 128; } if(ecc_mode == 1) { bits_total = 128; }
@ -553,13 +554,13 @@ void versionm4(char binary_data[], unsigned char source[], int char_system, int
concat(binary_data, "XXXX"); /* Place holder */ concat(binary_data, "XXXX"); /* Place holder */
} else { } else {
if(char_system == NUMERIC) { if(char_system == NUMERIC) {
if(input_length & 0x20) { concat(binary_data, "1"); } else { concat(binary_data, "0"); } if(length & 0x20) { concat(binary_data, "1"); } else { concat(binary_data, "0"); }
} }
if(input_length & 0x10) { concat(binary_data, "1"); } else { concat(binary_data, "0"); } if(length & 0x10) { concat(binary_data, "1"); } else { concat(binary_data, "0"); }
if(input_length & 0x08) { concat(binary_data, "1"); } else { concat(binary_data, "0"); } if(length & 0x08) { concat(binary_data, "1"); } else { concat(binary_data, "0"); }
if(input_length & 0x04) { concat(binary_data, "1"); } else { concat(binary_data, "0"); } if(length & 0x04) { concat(binary_data, "1"); } else { concat(binary_data, "0"); }
if(input_length & 0x02) { concat(binary_data, "1"); } else { concat(binary_data, "0"); } if(length & 0x02) { concat(binary_data, "1"); } else { concat(binary_data, "0"); }
if(input_length & 0x01) { concat(binary_data, "1"); } else { concat(binary_data, "0"); } if(length & 0x01) { concat(binary_data, "1"); } else { concat(binary_data, "0"); }
} }
if(char_system == NUMERIC) { qrnumeric_encode(binary_data, source); } if(char_system == NUMERIC) { qrnumeric_encode(binary_data, source); }
@ -640,10 +641,10 @@ void versionm4(char binary_data[], unsigned char source[], int char_system, int
return; return;
} }
int microqr(struct zint_symbol *symbol, unsigned char source[]) int microqr(struct zint_symbol *symbol, unsigned char source[], int length)
{ {
int symbol_size; int symbol_size;
int char_system, input_length; int char_system;
char binary_data[200]; char binary_data[200];
int latch; int latch;
char bitmask[17][17]; char bitmask[17][17];
@ -651,19 +652,50 @@ int microqr(struct zint_symbol *symbol, unsigned char source[])
char candidate[17][17]; char candidate[17][17];
char pattern_bit; char pattern_bit;
int width, i, j, pattern_no; int width, i, j, pattern_no;
int sum1, sum2, evaluation[4], format, format_full; int sum1, sum2, evaluation[4], format, format_full, kanji;
int error_number;
char formatstr[16]; char formatstr[16];
#ifndef _MSC_VER
unsigned char local_source[length];
#else
unsigned char local_source = (unsigned char*)_alloca(length);
#endif
/* Analise input data and select encoding method - zint does not attempt to /* Analise input data and select encoding method - zint does not attempt to
optimise the symbol by switching encoding method part way through the symbol, optimise the symbol by switching encoding method part way through the symbol,
but merely chooses an encoding method for the whole symbol */ but merely chooses an encoding method for the whole symbol */
input_length = ustrlen(source);
char_system = BYTE; char_system = BYTE;
symbol_size = 0; symbol_size = 0;
if(is_sane(QRSET, source) == 0) { char_system = ALPHANUM; }
if(is_sane(NESET, source) == 0) { char_system = NUMERIC; } for(i = 0; i < length; i++) {
if(symbol->input_mode == KANJI_MODE) { char_system = KANJI; } if(source[i] == '\0') {
if(symbol->input_mode == SJIS_MODE) { char_system = KANJI; } strcpy(symbol->errtxt, "QR Code not yet able to handle NULL characters");
return ERROR_INVALID_DATA;
}
}
kanji = 0;
/* The following to be replaced by ECI handling */
switch(symbol->input_mode) {
case DATA_MODE:
for(i = 0; i < length; i++) {
local_source[i] = source[i];
}
local_source[length] = '\0';
break;
case UNICODE_MODE:
error_number = shiftJIS(symbol, source, local_source, &length, &kanji);
if(error_number != 0) { return error_number; }
break;
}
if(kanji) {
char_system = KANJI;
} else {
if(is_sane(QRSET, local_source, length) == 0) { char_system = ALPHANUM; }
if(is_sane(NESET, local_source, length) == 0) { char_system = NUMERIC; }
}
width = 0; width = 0;
format = 0; format = 0;
@ -683,27 +715,27 @@ int microqr(struct zint_symbol *symbol, unsigned char source[])
switch(symbol->option_1) { switch(symbol->option_1) {
case 1: /* ECC Level L */ case 1: /* ECC Level L */
switch(char_system) { switch(char_system) {
case NUMERIC: if(input_length > 35) latch = 1; break; case NUMERIC: if(length > 35) latch = 1; break;
case ALPHANUM: if(input_length > 21) latch = 1; break; case ALPHANUM: if(length > 21) latch = 1; break;
case BYTE: if(input_length > 15) latch = 1; break; case BYTE: if(length > 15) latch = 1; break;
case KANJI: if(input_length > 18) latch = 1; break; case KANJI: if(length > 18) latch = 1; break;
} }
break; break;
case 2: /* ECC Level M */ case 2: /* ECC Level M */
switch(char_system) { switch(char_system) {
case NUMERIC: if(input_length > 30) latch = 1; break; case NUMERIC: if(length > 30) latch = 1; break;
case ALPHANUM: if(input_length > 18) latch = 1; break; case ALPHANUM: if(length > 18) latch = 1; break;
case BYTE: if(input_length > 13) latch = 1; break; case BYTE: if(length > 13) latch = 1; break;
case KANJI: if(input_length > 16) latch = 1; break; case KANJI: if(length > 16) latch = 1; break;
} }
break; break;
case 3: /* ECC Level Q */ case 3: /* ECC Level Q */
symbol_size = 4; /* Only size M4 supports level Q */ symbol_size = 4; /* Only size M4 supports level Q */
switch(char_system) { switch(char_system) {
case NUMERIC: if(input_length > 21) latch = 1; break; case NUMERIC: if(length > 21) latch = 1; break;
case ALPHANUM: if(input_length > 13) latch = 1; break; case ALPHANUM: if(length > 13) latch = 1; break;
case BYTE: if(input_length > 9) latch = 1; break; case BYTE: if(length > 9) latch = 1; break;
case KANJI: if(input_length > 10) latch = 1; break; case KANJI: if(length > 10) latch = 1; break;
} }
break; break;
} }
@ -725,52 +757,52 @@ int microqr(struct zint_symbol *symbol, unsigned char source[])
switch(char_system) { switch(char_system) {
case NUMERIC: case NUMERIC:
symbol_size = 4; symbol_size = 4;
if(input_length <= 23) { symbol_size = 3; } if(length <= 23) { symbol_size = 3; }
if(input_length <= 10) { symbol_size = 2; } if(length <= 10) { symbol_size = 2; }
if(input_length <= 5) { symbol_size = 1; } if(length <= 5) { symbol_size = 1; }
break; break;
case ALPHANUM: case ALPHANUM:
symbol_size = 4; symbol_size = 4;
if(input_length <= 14) { symbol_size = 3; } if(length <= 14) { symbol_size = 3; }
if(input_length <= 6) { symbol_size = 2; } if(length <= 6) { symbol_size = 2; }
break; break;
case BYTE: case BYTE:
symbol_size = 4; symbol_size = 4;
if(input_length <= 9) { symbol_size = 3; } if(length <= 9) { symbol_size = 3; }
break; break;
case KANJI: case KANJI:
symbol_size = 4; symbol_size = 4;
if(input_length <= 12) { symbol_size = 3; } if(length <= 12) { symbol_size = 3; }
} }
} else { /* ECC Level M */ } else { /* ECC Level M */
switch(char_system) { switch(char_system) {
case NUMERIC: case NUMERIC:
symbol_size = 4; symbol_size = 4;
if(input_length <= 18) { symbol_size = 3; } if(length <= 18) { symbol_size = 3; }
if(input_length <= 8) { symbol_size = 2; } if(length <= 8) { symbol_size = 2; }
break; break;
case ALPHANUM: case ALPHANUM:
symbol_size = 4; symbol_size = 4;
if(input_length <= 11) { symbol_size = 3; } if(length <= 11) { symbol_size = 3; }
if(input_length <= 5) { symbol_size = 2; } if(length <= 5) { symbol_size = 2; }
break; break;
case BYTE: case BYTE:
symbol_size = 4; symbol_size = 4;
if(input_length <= 7) { symbol_size = 3; } if(length <= 7) { symbol_size = 3; }
break; break;
case KANJI: case KANJI:
symbol_size = 4; symbol_size = 4;
if(input_length <= 8) { symbol_size = 3; } if(length <= 8) { symbol_size = 3; }
} }
} }
} }
strcpy(binary_data, ""); strcpy(binary_data, "");
switch(symbol_size) { switch(symbol_size) {
case 1: versionm1(binary_data, source); break; case 1: versionm1(binary_data, local_source); break;
case 2: versionm2(binary_data, source, char_system, symbol->option_1); break; case 2: versionm2(binary_data, local_source, char_system, symbol->option_1); break;
case 3: versionm3(binary_data, source, char_system, symbol->option_1); break; case 3: versionm3(binary_data, local_source, char_system, symbol->option_1); break;
case 4: versionm4(binary_data, source, char_system, symbol->option_1); break; case 4: versionm4(binary_data, local_source, char_system, symbol->option_1); break;
} }
switch(symbol_size) { switch(symbol_size) {

View File

@ -30,7 +30,7 @@
symbol->option_2 is used to adjust the width of the resulting symbol (i.e. the symbol->option_2 is used to adjust the width of the resulting symbol (i.e. the
number of codeword columns not including row start and end data) */ number of codeword columns not including row start and end data) */
/* @(#) $Id: pdf417.c,v 1.12 2009/09/19 08:16:21 hooper114 Exp $ */ /* @(#) $Id: pdf417.c,v 1.13 2009/09/29 09:45:47 hooper114 Exp $ */
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
@ -70,15 +70,11 @@ static int MicroAutosize[56] =
int liste[2][1000]; /* global - okay, so I got _almost_ everything local! */ int liste[2][1000]; /* global - okay, so I got _almost_ everything local! */
/* 866 */ /* 866 */
int quelmode(char codeascii, char nullchar) int quelmode(char codeascii)
{ {
int mode; int mode;
mode = BYT; mode = BYT;
if(codeascii == nullchar) {
return BYT;
}
if((codeascii >= ' ') && (codeascii <= '~')) { mode = TEX; } if((codeascii >= ' ') && (codeascii <= '~')) { mode = TEX; }
if(codeascii == '\t') { mode = TEX; } if(codeascii == '\t') { mode = TEX; }
if(codeascii == '\n') { mode = TEX; } if(codeascii == '\n') { mode = TEX; }
@ -315,7 +311,7 @@ void textprocess(int *chainemc, int *mclength, char chaine[], int start, int len
} }
/* 671 */ /* 671 */
void byteprocess(int *chainemc, int *mclength, unsigned char chaine[], int start, int length, int block, char nullchar) void byteprocess(int *chainemc, int *mclength, unsigned char chaine[], int start, int length, int block)
{ {
int debug = 0; int debug = 0;
int len = 0; int len = 0;
@ -441,7 +437,7 @@ void numbprocess(int *chainemc, int *mclength, char chaine[], int start, int len
} }
/* 366 */ /* 366 */
int pdf417(struct zint_symbol *symbol, unsigned char chaine[]) int pdf417(struct zint_symbol *symbol, unsigned char chaine[], int length)
{ {
int i, k, j, indexchaine, indexliste, mode, longueur, loop, mccorrection[520], offset; int i, k, j, indexchaine, indexliste, mode, longueur, loop, mccorrection[520], offset;
int total, chainemc[2700], mclength, c1, c2, c3, dummy[35], codeerr; int total, chainemc[2700], mclength, c1, c2, c3, dummy[35], codeerr;
@ -454,7 +450,7 @@ int pdf417(struct zint_symbol *symbol, unsigned char chaine[])
indexliste = 0; indexliste = 0;
indexchaine = 0; indexchaine = 0;
mode = quelmode(chaine[indexchaine], symbol->nullchar); mode = quelmode(chaine[indexchaine]);
for(i = 0; i < 1000; i++) { for(i = 0; i < 1000; i++) {
liste[0][i] = 0; liste[0][i] = 0;
@ -463,13 +459,13 @@ int pdf417(struct zint_symbol *symbol, unsigned char chaine[])
/* 463 */ /* 463 */
do { do {
liste[1][indexliste] = mode; liste[1][indexliste] = mode;
while ((liste[1][indexliste] == mode) && (indexchaine < ustrlen(chaine))) { while ((liste[1][indexliste] == mode) && (indexchaine < length)) {
liste[0][indexliste]++; liste[0][indexliste]++;
indexchaine++; indexchaine++;
mode = quelmode(chaine[indexchaine], symbol->nullchar); mode = quelmode(chaine[indexchaine]);
} }
indexliste++; indexliste++;
} while (indexchaine < ustrlen(chaine)); } while (indexchaine < length);
/* 474 */ /* 474 */
pdfsmooth(&indexliste); pdfsmooth(&indexliste);
@ -496,7 +492,7 @@ int pdf417(struct zint_symbol *symbol, unsigned char chaine[])
textprocess(chainemc, &mclength, (char*)chaine, indexchaine, liste[0][i], i); textprocess(chainemc, &mclength, (char*)chaine, indexchaine, liste[0][i], i);
break; break;
case BYT: /* 670 - octet stream mode */ case BYT: /* 670 - octet stream mode */
byteprocess(chainemc, &mclength, chaine, indexchaine, liste[0][i], i, symbol->nullchar); byteprocess(chainemc, &mclength, chaine, indexchaine, liste[0][i], i);
break; break;
case NUM: /* 712 - numeric mode */ case NUM: /* 712 - numeric mode */
numbprocess(chainemc, &mclength, (char*)chaine, indexchaine, liste[0][i], i); numbprocess(chainemc, &mclength, (char*)chaine, indexchaine, liste[0][i], i);
@ -686,58 +682,78 @@ int pdf417(struct zint_symbol *symbol, unsigned char chaine[])
} }
/* 345 */ /* 345 */
int pdf417enc(struct zint_symbol *symbol, unsigned char source[]) int pdf417enc(struct zint_symbol *symbol, unsigned char source[], int length)
{ {
int codeerr, errno; int codeerr, error_number, i;
#ifndef _MSC_VER
unsigned char local_source[length];
#else
unsigned char local_source = (unsigned char*)_alloca(length);
#endif
errno = 0; error_number = 0;
if((symbol->option_1 < -1) || (symbol->option_1 > 8)) { if((symbol->option_1 < -1) || (symbol->option_1 > 8)) {
strcpy(symbol->errtxt, "Security value out of range"); strcpy(symbol->errtxt, "Security value out of range");
symbol->option_1 = -1; symbol->option_1 = -1;
errno = WARN_INVALID_OPTION; error_number = WARN_INVALID_OPTION;
} }
if((symbol->option_2 < 0) || (symbol->option_2 > 30)) { if((symbol->option_2 < 0) || (symbol->option_2 > 30)) {
strcpy(symbol->errtxt, "Number of columns out of range"); strcpy(symbol->errtxt, "Number of columns out of range");
symbol->option_2 = 0; symbol->option_2 = 0;
errno = WARN_INVALID_OPTION; error_number = WARN_INVALID_OPTION;
}
/* The following to be replaced by ECI handling */
switch(symbol->input_mode) {
case DATA_MODE:
for(i = 0; i < length; i++) {
local_source[i] = source[i];
}
local_source[length] = '\0';
break;
case UNICODE_MODE:
error_number = latin1_process(symbol, source, local_source, &length);
if(error_number != 0) { return error_number; }
break;
} }
/* 349 */ /* 349 */
codeerr = pdf417(symbol, source); codeerr = pdf417(symbol, local_source, length);
/* 352 */ /* 352 */
if(codeerr != 0) { if(codeerr != 0) {
switch(codeerr) { switch(codeerr) {
case 1: case 1:
strcpy(symbol->errtxt, "No such file or file unreadable"); strcpy(symbol->errtxt, "No such file or file unreadable");
errno = ERROR_INVALID_OPTION; error_number = ERROR_INVALID_OPTION;
break; break;
case 2: case 2:
strcpy(symbol->errtxt, "Input string too long"); strcpy(symbol->errtxt, "Input string too long");
errno = ERROR_TOO_LONG; error_number = ERROR_TOO_LONG;
break; break;
case 3: case 3:
strcpy(symbol->errtxt, "Number of codewords per row too small"); strcpy(symbol->errtxt, "Number of codewords per row too small");
errno = WARN_INVALID_OPTION; error_number = WARN_INVALID_OPTION;
break; break;
case 4: case 4:
strcpy(symbol->errtxt, "Data too long for specified number of columns"); strcpy(symbol->errtxt, "Data too long for specified number of columns");
errno = ERROR_TOO_LONG; error_number = ERROR_TOO_LONG;
break; break;
default: default:
strcpy(symbol->errtxt, "Something strange happened"); strcpy(symbol->errtxt, "Something strange happened");
errno = ERROR_ENCODING_PROBLEM; error_number = ERROR_ENCODING_PROBLEM;
break; break;
} }
} }
/* 364 */ /* 364 */
return errno; return error_number;
} }
int micro_pdf417(struct zint_symbol *symbol, unsigned char chaine[]) int micro_pdf417(struct zint_symbol *symbol, unsigned char source[], int length)
{ /* like PDF417 only much smaller! */ { /* like PDF417 only much smaller! */
int i, k, j, indexchaine, indexliste, mode, longueur, mccorrection[50], offset; int i, k, j, indexchaine, indexliste, mode, longueur, mccorrection[50], offset;
@ -747,6 +763,12 @@ int micro_pdf417(struct zint_symbol *symbol, unsigned char chaine[])
int LeftRAP, CentreRAP, RightRAP, Cluster, writer, flip, loop; int LeftRAP, CentreRAP, RightRAP, Cluster, writer, flip, loop;
int debug = 0; int debug = 0;
#ifndef _MSC_VER
unsigned char chaine[length];
#else
unsigned char chaine = (unsigned char*)_alloca(length);
#endif
/* Encoding starts out the same as PDF417, so use the same code */ /* Encoding starts out the same as PDF417, so use the same code */
codeerr = 0; codeerr = 0;
@ -754,7 +776,21 @@ int micro_pdf417(struct zint_symbol *symbol, unsigned char chaine[])
indexliste = 0; indexliste = 0;
indexchaine = 0; indexchaine = 0;
mode = quelmode(chaine[indexchaine], symbol->nullchar); /* The following to be replaced by ECI handling */
switch(symbol->input_mode) {
case DATA_MODE:
for(i = 0; i < length; i++) {
chaine[i] = source[i];
}
chaine[length] = '\0';
break;
case UNICODE_MODE:
codeerr = latin1_process(symbol, source, chaine, &length);
if(codeerr != 0) { return codeerr; }
break;
}
mode = quelmode(chaine[indexchaine]);
for(i = 0; i < 1000; i++) { for(i = 0; i < 1000; i++) {
liste[0][i] = 0; liste[0][i] = 0;
@ -763,13 +799,13 @@ int micro_pdf417(struct zint_symbol *symbol, unsigned char chaine[])
/* 463 */ /* 463 */
do { do {
liste[1][indexliste] = mode; liste[1][indexliste] = mode;
while ((liste[1][indexliste] == mode) && (indexchaine < ustrlen(chaine))) { while ((liste[1][indexliste] == mode) && (indexchaine < length)) {
liste[0][indexliste]++; liste[0][indexliste]++;
indexchaine++; indexchaine++;
mode = quelmode(chaine[indexchaine], symbol->nullchar); mode = quelmode(chaine[indexchaine]);
} }
indexliste++; indexliste++;
} while (indexchaine < ustrlen(chaine)); } while (indexchaine < length);
/* 474 */ /* 474 */
pdfsmooth(&indexliste); pdfsmooth(&indexliste);
@ -796,7 +832,7 @@ int micro_pdf417(struct zint_symbol *symbol, unsigned char chaine[])
textprocess(chainemc, &mclength, (char*)chaine, indexchaine, liste[0][i], i); textprocess(chainemc, &mclength, (char*)chaine, indexchaine, liste[0][i], i);
break; break;
case BYT: /* 670 - octet stream mode */ case BYT: /* 670 - octet stream mode */
byteprocess(chainemc, &mclength, chaine, indexchaine, liste[0][i], i, symbol->nullchar); byteprocess(chainemc, &mclength, chaine, indexchaine, liste[0][i], i);
break; break;
case NUM: /* 712 - numeric mode */ case NUM: /* 712 - numeric mode */
numbprocess(chainemc, &mclength, (char*)chaine, indexchaine, liste[0][i], i); numbprocess(chainemc, &mclength, (char*)chaine, indexchaine, liste[0][i], i);

View File

@ -435,4 +435,4 @@ static char *RAPC[53] = {"", "112231", "121231", "122131", "131131", "131221", "
"112213", "112222", "112312", "112321", "111421", "111331", "111322", "111232", "111223", "112213", "112222", "112312", "112321", "111421", "111331", "111322", "111232", "111223",
"111133", "111124", "111214", "112114", "121114", "121123", "121132", "112132", "112141" }; "111133", "111124", "111214", "112114", "121114", "121123", "121132", "112132", "112141" };
void byteprocess(int *chainemc, int *mclength, unsigned char chaine[], int start, int length, int block, char nullchar); void byteprocess(int *chainemc, int *mclength, unsigned char chaine[], int start, int length, int block);

View File

@ -34,7 +34,7 @@ static char *MSITable[10] = {"12121212", "12121221", "12122112", "12122121", "12
"12212112", "12212121", "21121212", "21121221"}; "12212112", "12212121", "21121212", "21121221"};
int plessey(struct zint_symbol *symbol, unsigned char source[]) int plessey(struct zint_symbol *symbol, unsigned char source[], int length)
{ /* Not MSI/Plessey but the older Plessey standard */ { /* Not MSI/Plessey but the older Plessey standard */
unsigned int i, check; unsigned int i, check;
@ -46,22 +46,22 @@ int plessey(struct zint_symbol *symbol, unsigned char source[])
error_number = 0; error_number = 0;
strcpy(dest, ""); strcpy(dest, "");
if(ustrlen(source) > 65) { if(length > 65) {
strcpy(symbol->errtxt, "Input too long"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
error_number = is_sane(SSET, source); error_number = is_sane(SSET, source, length);
if(error_number == ERROR_INVALID_DATA) { if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in data"); strcpy(symbol->errtxt, "Invalid characters in data");
return error_number; return error_number;
} }
checkptr = (unsigned char *)calloc (1, ustrlen(source) * 4 + 8); checkptr = (unsigned char *)calloc (1, length * 4 + 8);
/* Start character */ /* Start character */
concat(dest, "31311331"); concat(dest, "31311331");
/* Data area */ /* Data area */
for(i = 0; i <= ustrlen(source); i++) for(i = 0; i <= length; i++)
{ {
check = posn(SSET, source[i]); check = posn(SSET, source[i]);
lookup(SSET, PlessTable, source[i], dest); lookup(SSET, PlessTable, source[i], dest);
@ -74,7 +74,7 @@ int plessey(struct zint_symbol *symbol, unsigned char source[])
/* CRC check digit code adapted from code by Leonid A. Broukhis /* CRC check digit code adapted from code by Leonid A. Broukhis
used in GNU Barcode */ used in GNU Barcode */
for (i=0; i < 4*ustrlen(source); i++) { for (i = 0; i < (4 * length); i++) {
int j; int j;
if (checkptr[i]) if (checkptr[i])
for (j = 0; j < 9; j++) for (j = 0; j < 9; j++)
@ -82,7 +82,7 @@ int plessey(struct zint_symbol *symbol, unsigned char source[])
} }
for (i = 0; i < 8; i++) { for (i = 0; i < 8; i++) {
switch(checkptr[ustrlen(source) * 4 + i]) switch(checkptr[length * 4 + i])
{ {
case 0: concat(dest, "13"); break; case 0: concat(dest, "13"); break;
case 1: concat(dest, "31"); break; case 1: concat(dest, "31"); break;
@ -112,11 +112,6 @@ int msi_plessey(struct zint_symbol *symbol, unsigned char source[])
strcpy(symbol->errtxt, "Input too long"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
error_number = is_sane(NESET, source);
if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in data");
return error_number;
}
/* start character */ /* start character */
concat (dest, "21"); concat (dest, "21");
@ -150,11 +145,6 @@ int msi_plessey_mod10(struct zint_symbol *symbol, unsigned char source[])
strcpy(symbol->errtxt, "Input too long"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
error_number = is_sane(NESET, source);
if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in data");
return error_number;
}
/* start character */ /* start character */
concat (dest, "21"); concat (dest, "21");
@ -248,11 +238,6 @@ int msi_plessey_mod1010(struct zint_symbol *symbol, unsigned char source[])
strcpy(symbol->errtxt, "Input too long"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
error_number = is_sane(NESET, source);
if (error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in data");
return error_number;
}
/* start character */ /* start character */
concat (dest, "21"); concat (dest, "21");
@ -405,11 +390,6 @@ int msi_plessey_mod11(struct zint_symbol *symbol, unsigned char source[])
strcpy(symbol->errtxt, "Input too long"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
error_number = is_sane(NESET, source);
if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in data");
return error_number;
}
/* start character */ /* start character */
concat (dest, "21"); concat (dest, "21");
@ -475,11 +455,6 @@ int msi_plessey_mod1110(struct zint_symbol *symbol, unsigned char source[])
strcpy(symbol->errtxt, "Input too long"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
error_number = is_sane(NESET, source);
if (error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in data");
return error_number;
}
/* start character */ /* start character */
concat (dest, "21"); concat (dest, "21");
@ -583,11 +558,15 @@ int msi_plessey_mod1110(struct zint_symbol *symbol, unsigned char source[])
return error_number; return error_number;
} }
int msi_handle(struct zint_symbol *symbol, unsigned char source[]) { int msi_handle(struct zint_symbol *symbol, unsigned char source[], int length) {
int error_number; int error_number;
error_number=0; error_number = is_sane(NESET, source, length);
if(error_number != 0) {
strcpy(symbol->errtxt, "Invalid characters in input data");
return ERROR_INVALID_DATA;
}
if((symbol->option_2 < 0) || (symbol->option_2 > 4)) { if((symbol->option_2 < 0) || (symbol->option_2 > 4)) {
symbol->option_2 = 0; symbol->option_2 = 0;
} }

View File

@ -65,6 +65,7 @@ int png_to_file(struct zint_symbol *symbol, int image_height, int image_width, c
{ {
struct mainprog_info_type wpng_info; struct mainprog_info_type wpng_info;
struct mainprog_info_type *graphic; struct mainprog_info_type *graphic;
#ifndef _MSC_VER #ifndef _MSC_VER
unsigned char outdata[image_width * 3]; unsigned char outdata[image_width * 3];
#else #else
@ -103,12 +104,12 @@ int png_to_file(struct zint_symbol *symbol, int image_height, int image_width, c
strcpy(symbol->errtxt, "Malformed background colour target"); strcpy(symbol->errtxt, "Malformed background colour target");
return ERROR_INVALID_OPTION; return ERROR_INVALID_OPTION;
} }
errno = is_sane(SSET, (unsigned char*)symbol->fgcolour); errno = is_sane(SSET, (unsigned char*)symbol->fgcolour, 6);
if (errno == ERROR_INVALID_DATA) { if (errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Malformed foreground colour target"); strcpy(symbol->errtxt, "Malformed foreground colour target");
return ERROR_INVALID_OPTION; return ERROR_INVALID_OPTION;
} }
errno = is_sane(SSET, (unsigned char*)symbol->bgcolour); errno = is_sane(SSET, (unsigned char*)symbol->bgcolour, 6);
if (errno == ERROR_INVALID_DATA) { if (errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Malformed background colour target"); strcpy(symbol->errtxt, "Malformed background colour target");
return ERROR_INVALID_OPTION; return ERROR_INVALID_OPTION;
@ -533,10 +534,12 @@ int png_plot(struct zint_symbol *symbol, int rotate_angle)
large_bar_count++; large_bar_count++;
} }
} }
large_bar_height = (symbol->height - preset_height) / large_bar_count;
if (large_bar_count == 0) { if (large_bar_count == 0) {
symbol->height = preset_height; symbol->height = preset_height;
large_bar_height = 10;
} else {
large_bar_height = (symbol->height - preset_height) / large_bar_count;
} }
while(!(module_is_set(symbol, symbol->rows - 1, comp_offset))) { while(!(module_is_set(symbol, symbol->rows - 1, comp_offset))) {

View File

@ -27,7 +27,6 @@
#endif #endif
#include "common.h" #include "common.h"
#define BESET "ABCD"
#define DAFTSET "DAFT" #define DAFTSET "DAFT"
#define KRSET "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" #define KRSET "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
#define KASUTSET "1234567890-abcdefgh" #define KASUTSET "1234567890-abcdefgh"
@ -40,8 +39,6 @@ static char *PNTable[10] = {"LLSSS", "SSSLL", "SSLSL", "SSLLS", "SLSSL", "SLSLS"
static char *PLTable[10] = {"SSLLL", "LLLSS", "LLSLS", "LLSSL", "LSLLS", "LSLSL", "LSSLL", "SLLLS", static char *PLTable[10] = {"SSLLL", "LLLSS", "LLSLS", "LLSSL", "LSLLS", "LSLSL", "LSSLL", "SLLLS",
"SLLSL", "SLSLL"}; "SLLSL", "SLSLL"};
static char *FIMTable[4] = {"111515111", "13111311131", "11131313111", "1111131311111"};
static char *RoyalValues[36] = {"11", "12", "13", "14", "15", "10", "21", "22", "23", "24", "25", static char *RoyalValues[36] = {"11", "12", "13", "14", "15", "10", "21", "22", "23", "24", "25",
"20", "31", "32", "33", "34", "35", "30", "41", "42", "43", "44", "45", "40", "51", "52", "20", "31", "32", "33", "34", "35", "30", "41", "42", "43", "44", "45", "40", "51", "52",
"53", "54", "55", "50", "01", "02", "03", "04", "05", "00"}; "53", "54", "55", "50", "01", "02", "03", "04", "05", "00"};
@ -61,7 +58,7 @@ static char *KoreaTable[10] = {"1313150613", "0713131313", "0417131313", "150613
static char *JapanTable[19] = {"114", "132", "312", "123", "141", "321", "213", "231", "411", "144", static char *JapanTable[19] = {"114", "132", "312", "123", "141", "321", "213", "231", "411", "144",
"414", "324", "342", "234", "432", "243", "423", "441", "111"}; "414", "324", "342", "234", "432", "243", "423", "441", "111"};
int postnet(struct zint_symbol *symbol, unsigned char source[], char dest[]) int postnet(struct zint_symbol *symbol, unsigned char source[], char dest[], int length)
{ {
/* Handles the PostNet system used for Zip codes in the US */ /* Handles the PostNet system used for Zip codes in the US */
unsigned int i, sum, check_digit; unsigned int i, sum, check_digit;
@ -69,11 +66,11 @@ int postnet(struct zint_symbol *symbol, unsigned char source[], char dest[])
error_number = 0; error_number = 0;
if(ustrlen(source) > 38) { if(length > 38) {
strcpy(symbol->errtxt, "Input too long"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
error_number = is_sane(NESET, source); error_number = is_sane(NESET, source, length);
if(error_number == ERROR_INVALID_DATA) { if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in data"); strcpy(symbol->errtxt, "Invalid characters in data");
return error_number; return error_number;
@ -83,7 +80,7 @@ int postnet(struct zint_symbol *symbol, unsigned char source[], char dest[])
/* start character */ /* start character */
concat (dest, "L"); concat (dest, "L");
for (i=0; i < ustrlen(source); i++) for (i=0; i < length; i++)
{ {
lookup(NESET, PNTable, source[i], dest); lookup(NESET, PNTable, source[i], dest);
sum += ctoi(source[i]); sum += ctoi(source[i]);
@ -98,7 +95,7 @@ int postnet(struct zint_symbol *symbol, unsigned char source[], char dest[])
return error_number; return error_number;
} }
int post_plot(struct zint_symbol *symbol, unsigned char source[]) int post_plot(struct zint_symbol *symbol, unsigned char source[], int length)
{ {
/* Puts PostNet barcodes into the pattern matrix */ /* Puts PostNet barcodes into the pattern matrix */
char height_pattern[200]; char height_pattern[200];
@ -109,7 +106,7 @@ int post_plot(struct zint_symbol *symbol, unsigned char source[])
error_number = 0; error_number = 0;
error_number = postnet(symbol, source, height_pattern); error_number = postnet(symbol, source, height_pattern, length);
if(error_number != 0) { if(error_number != 0) {
return error_number; return error_number;
} }
@ -132,7 +129,7 @@ int post_plot(struct zint_symbol *symbol, unsigned char source[])
return error_number; return error_number;
} }
int planet(struct zint_symbol *symbol, unsigned char source[], char dest[]) int planet(struct zint_symbol *symbol, unsigned char source[], char dest[], int length)
{ {
/* Handles the PLANET system used for item tracking in the US */ /* Handles the PLANET system used for item tracking in the US */
unsigned int i, sum, check_digit; unsigned int i, sum, check_digit;
@ -140,11 +137,11 @@ int planet(struct zint_symbol *symbol, unsigned char source[], char dest[])
error_number = 0; error_number = 0;
if(ustrlen(source) > 38) { if(length > 38) {
strcpy(symbol->errtxt, "Input too long"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
error_number = is_sane(NESET, source); error_number = is_sane(NESET, source, length);
if(error_number == ERROR_INVALID_DATA) { if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in data"); strcpy(symbol->errtxt, "Invalid characters in data");
return error_number; return error_number;
@ -154,7 +151,7 @@ int planet(struct zint_symbol *symbol, unsigned char source[], char dest[])
/* start character */ /* start character */
concat (dest, "L"); concat (dest, "L");
for (i=0; i < ustrlen(source); i++) for (i=0; i < length; i++)
{ {
lookup(NESET, PLTable, source[i], dest); lookup(NESET, PLTable, source[i], dest);
sum += ctoi(source[i]); sum += ctoi(source[i]);
@ -169,7 +166,7 @@ int planet(struct zint_symbol *symbol, unsigned char source[], char dest[])
return error_number; return error_number;
} }
int planet_plot(struct zint_symbol *symbol, unsigned char source[]) int planet_plot(struct zint_symbol *symbol, unsigned char source[], int length)
{ {
/* Puts PLANET barcodes into the pattern matrix */ /* Puts PLANET barcodes into the pattern matrix */
char height_pattern[200]; char height_pattern[200];
@ -180,7 +177,7 @@ int planet_plot(struct zint_symbol *symbol, unsigned char source[])
error_number = 0; error_number = 0;
error_number = planet(symbol, source, height_pattern); error_number = planet(symbol, source, height_pattern, length);
if(error_number != 0) { if(error_number != 0) {
return error_number; return error_number;
} }
@ -202,25 +199,24 @@ int planet_plot(struct zint_symbol *symbol, unsigned char source[])
return error_number; return error_number;
} }
int korea_post(struct zint_symbol *symbol, unsigned char source[]) int korea_post(struct zint_symbol *symbol, unsigned char source[], int length)
{ /* Korean Postal Authority */ { /* Korean Postal Authority */
int total, h, loop, check, zeroes, error_number; int total, loop, check, zeroes, error_number;
char localstr[8], checkstr[3], dest[80]; char localstr[8], checkstr[3], dest[80];
error_number = 0; error_number = 0;
h = ustrlen(source); if(length > 6) {
if(h > 6) {
strcpy(symbol->errtxt, "Input too long"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
error_number = is_sane(NESET, source); error_number = is_sane(NESET, source, length);
if(error_number == ERROR_INVALID_DATA) { if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in data"); strcpy(symbol->errtxt, "Invalid characters in data");
return error_number; return error_number;
} }
strcpy(localstr, ""); strcpy(localstr, "");
zeroes = 6 - h; zeroes = 6 - length;
for(loop = 0; loop < zeroes; loop++) for(loop = 0; loop < zeroes; loop++)
concat(localstr, "0"); concat(localstr, "0");
concat(localstr, (char *)source); concat(localstr, (char *)source);
@ -245,31 +241,42 @@ int korea_post(struct zint_symbol *symbol, unsigned char source[])
return error_number; return error_number;
} }
int fim(struct zint_symbol *symbol, unsigned char source[]) int fim(struct zint_symbol *symbol, unsigned char source[], int length)
{ {
/* The simplest barcode symbology ever! Supported by MS Word, so here it is! */ /* The simplest barcode symbology ever! Supported by MS Word, so here it is! */
/* glyphs from http://en.wikipedia.org/wiki/Facing_Identification_Mark */ /* glyphs from http://en.wikipedia.org/wiki/Facing_Identification_Mark */
int error_number;
char dest[17]; char dest[17];
error_number = 0; if(length > 1) {
strcpy(dest, "");
to_upper(source);
if(ustrlen(source) > 1) {
strcpy(symbol->errtxt, "Input too long"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
error_number = is_sane(BESET, source);
if(error_number == ERROR_INVALID_DATA) { switch((char)source[0]) {
strcpy(symbol->errtxt, "Invalid characters in data"); case 'a':
return error_number; case 'A':
strcpy(dest, "111515111");
break;
case 'b':
case 'B':
strcpy(dest, "13111311131");
break;
case 'c':
case 'C':
strcpy(dest, "11131313111");
break;
case 'd':
case 'D':
strcpy(dest, "1111131311111");
break;
default:
strcpy(symbol->errtxt, "Invalid characters in data");
return ERROR_INVALID_DATA;
break;
} }
lookup(BESET, FIMTable, source[0], dest);
expand(symbol, dest); expand(symbol, dest);
return error_number; return 0;
} }
char rm4scc(char source[], unsigned char dest[]) char rm4scc(char source[], unsigned char dest[])
@ -307,28 +314,32 @@ char rm4scc(char source[], unsigned char dest[])
return set_copy[check_digit]; return set_copy[check_digit];
} }
int royal_plot(struct zint_symbol *symbol, unsigned char source[]) int royal_plot(struct zint_symbol *symbol, unsigned char source[], int length)
{ {
/* Puts RM4SCC into the data matrix */ /* Puts RM4SCC into the data matrix */
char height_pattern[200], check; char height_pattern[200], check;
unsigned int loopey; unsigned int loopey;
int writer; int writer, i;
int error_number; int error_number;
strcpy(height_pattern, ""); strcpy(height_pattern, "");
unsigned char local_source[120];
error_number = 0; error_number = 0;
to_upper(source); if(length > 120) {
if(ustrlen(source) > 120) {
strcpy(symbol->errtxt, "Input too long"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
error_number = is_sane(KRSET, source); for(i = 0; i < length; i++) {
local_source[i] = source[i];
}
to_upper(local_source);
error_number = is_sane(KRSET, local_source, length);
if(error_number == ERROR_INVALID_DATA) { if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in data"); strcpy(symbol->errtxt, "Invalid characters in data");
return error_number; return error_number;
} }
check = rm4scc((char*)source, (unsigned char*)height_pattern); check = rm4scc((char*)local_source, (unsigned char*)height_pattern);
writer = 0; writer = 0;
for(loopey = 0; loopey < strlen(height_pattern); loopey++) for(loopey = 0; loopey < strlen(height_pattern); loopey++)
@ -354,7 +365,7 @@ int royal_plot(struct zint_symbol *symbol, unsigned char source[])
return error_number; return error_number;
} }
int kix_code(struct zint_symbol *symbol, unsigned char source[]) int kix_code(struct zint_symbol *symbol, unsigned char source[], int length)
{ {
/* Handles Dutch Post TNT KIX symbols */ /* Handles Dutch Post TNT KIX symbols */
/* The same as RM4SCC but without check digit */ /* The same as RM4SCC but without check digit */
@ -364,15 +375,19 @@ int kix_code(struct zint_symbol *symbol, unsigned char source[])
int writer, i; int writer, i;
int error_number, zeroes; int error_number, zeroes;
strcpy(height_pattern, ""); strcpy(height_pattern, "");
unsigned char local_source[13];
error_number = 0; error_number = 0;
to_upper(source); if(length > 11) {
if(ustrlen(source) > 11) {
strcpy(symbol->errtxt, "Input too long"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
error_number = is_sane(KRSET, source); for(i = 0; i < length; i++) {
local_source[i] = source[i];
}
to_upper(local_source);
error_number = is_sane(KRSET, local_source, length);
if(error_number == ERROR_INVALID_DATA) { if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in data"); strcpy(symbol->errtxt, "Invalid characters in data");
return error_number; return error_number;
@ -380,10 +395,10 @@ int kix_code(struct zint_symbol *symbol, unsigned char source[])
/* Add leading zeroes */ /* Add leading zeroes */
strcpy(localstr, ""); strcpy(localstr, "");
zeroes = 11 - ustrlen(source); zeroes = 11 - length;
for(i = 0; i < zeroes; i++) for(i = 0; i < zeroes; i++)
concat(localstr, "0"); concat(localstr, "0");
concat(localstr, (char *)source); concat(localstr, (char *)local_source);
/* Encode data */ /* Encode data */
for (i = 0; i < 11; i++) { for (i = 0; i < 11; i++) {
@ -414,31 +429,31 @@ int kix_code(struct zint_symbol *symbol, unsigned char source[])
return error_number; return error_number;
} }
int daft_code(struct zint_symbol *symbol, unsigned char source[]) int daft_code(struct zint_symbol *symbol, unsigned char source[], int length)
{ {
/* Handles DAFT Code symbols */ /* Handles DAFT Code symbols */
/* Presumably 'daft' doesn't mean the same thing in Germany as it does in the UK! */ /* Presumably 'daft' doesn't mean the same thing in Germany as it does in the UK! */
int input_length;
char height_pattern[100], local_source[55]; char height_pattern[100], local_source[55];
unsigned int loopey; unsigned int loopey;
int writer, i, error_number; int writer, i, error_number;
strcpy(height_pattern, ""); strcpy(height_pattern, "");
error_number = 0; error_number = 0;
input_length = ustrlen(source); if(length > 50) {
strcpy(local_source, (char*)source);
if(input_length > 50) {
strcpy(symbol->errtxt, "Input too long"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
for(i = 0; i < length; i++) {
local_source[i] = source[i];
}
to_upper((unsigned char*)local_source); to_upper((unsigned char*)local_source);
error_number = is_sane(DAFTSET, (unsigned char*)local_source); error_number = is_sane(DAFTSET, (unsigned char*)local_source, length);
if(error_number == ERROR_INVALID_DATA) { if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in data"); strcpy(symbol->errtxt, "Invalid characters in data");
return error_number; return error_number;
} }
for (i = 0; i < input_length; i++) { for (i = 0; i < length; i++) {
if(local_source[i] == 'D') { concat(height_pattern, "2"); } if(local_source[i] == 'D') { concat(height_pattern, "2"); }
if(local_source[i] == 'A') { concat(height_pattern, "1"); } if(local_source[i] == 'A') { concat(height_pattern, "1"); }
if(local_source[i] == 'F') { concat(height_pattern, "0"); } if(local_source[i] == 'F') { concat(height_pattern, "0"); }
@ -469,7 +484,7 @@ int daft_code(struct zint_symbol *symbol, unsigned char source[])
return error_number; return error_number;
} }
int flattermarken(struct zint_symbol *symbol, unsigned char source[]) int flattermarken(struct zint_symbol *symbol, unsigned char source[], int length)
{ /* Flattermarken - Not really a barcode symbology and (in my opinion) probably not much use { /* Flattermarken - Not really a barcode symbology and (in my opinion) probably not much use
but it's supported by TBarCode so it's supported by Zint! */ but it's supported by TBarCode so it's supported by Zint! */
int loop, error_number; int loop, error_number;
@ -478,17 +493,17 @@ int flattermarken(struct zint_symbol *symbol, unsigned char source[])
error_number = 0; error_number = 0;
strcpy(dest, ""); strcpy(dest, "");
if(ustrlen(source) > 90) { if(length > 90) {
strcpy(symbol->errtxt, "Input too long"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
error_number = is_sane(NESET, source); error_number = is_sane(NESET, source, length);
if(error_number == ERROR_INVALID_DATA) { if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in data"); strcpy(symbol->errtxt, "Invalid characters in data");
return error_number; return error_number;
} }
for(loop = 0; loop < ustrlen(source); loop++) { for(loop = 0; loop < length; loop++) {
lookup(NESET, FlatTable, source[loop], dest); lookup(NESET, FlatTable, source[loop], dest);
} }
@ -496,9 +511,9 @@ int flattermarken(struct zint_symbol *symbol, unsigned char source[])
return error_number; return error_number;
} }
int japan_post(struct zint_symbol *symbol, unsigned char source[]) int japan_post(struct zint_symbol *symbol, unsigned char source[], int length)
{ /* Japanese Postal Code (Kasutama Barcode) */ { /* Japanese Postal Code (Kasutama Barcode) */
int input_length, error_number; int error_number;
char pattern[69]; char pattern[69];
int writer, loopey, inter_posn, i, sum, check; int writer, loopey, inter_posn, i, sum, check;
char check_char; char check_char;
@ -506,19 +521,22 @@ int japan_post(struct zint_symbol *symbol, unsigned char source[])
#ifdef _MSC_VER #ifdef _MSC_VER
char* local_source; char* local_source;
#endif #endif
input_length = ustrlen(source);
#ifndef _MSC_VER #ifndef _MSC_VER
char local_source[input_length + 1]; char local_source[length + 1];
#else #else
local_source = (char*)_alloca(input_length + 1); local_source = (char*)_alloca(length + 1);
#endif #endif
inter_posn = 0; inter_posn = 0;
error_number = 0; error_number = 0;
strcpy(local_source, (char*)source); strcpy(local_source, (char*)source);
for(i = 0; i < length; i++) {
local_source[i] = source[i];
}
to_upper((unsigned char*)local_source); to_upper((unsigned char*)local_source);
error_number = is_sane(SHKASUTSET, (unsigned char*)local_source); error_number = is_sane(SHKASUTSET, (unsigned char*)local_source, length);
if(error_number == ERROR_INVALID_DATA) { if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in data"); strcpy(symbol->errtxt, "Invalid characters in data");
@ -554,7 +572,7 @@ int japan_post(struct zint_symbol *symbol, unsigned char source[])
} }
} }
i++; i++;
}while((i < input_length) && (inter_posn < 20)); }while((i < length) && (inter_posn < 20));
inter[20] = '\0'; inter[20] = '\0';
strcpy(pattern, "13"); /* Start */ strcpy(pattern, "13"); /* Start */

View File

@ -74,12 +74,12 @@ int ps_plot(struct zint_symbol *symbol)
strcpy(symbol->errtxt, "Malformed background colour target"); strcpy(symbol->errtxt, "Malformed background colour target");
return ERROR_INVALID_OPTION; return ERROR_INVALID_OPTION;
} }
error_number = is_sane(SSET, (unsigned char*)symbol->fgcolour); error_number = is_sane(SSET, (unsigned char*)symbol->fgcolour, 6);
if (error_number == ERROR_INVALID_DATA) { if (error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Malformed foreground colour target"); strcpy(symbol->errtxt, "Malformed foreground colour target");
return ERROR_INVALID_OPTION; return ERROR_INVALID_OPTION;
} }
error_number = is_sane(SSET, (unsigned char*)symbol->bgcolour); error_number = is_sane(SSET, (unsigned char*)symbol->bgcolour, 6);
if (error_number == ERROR_INVALID_DATA) { if (error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Malformed background colour target"); strcpy(symbol->errtxt, "Malformed background colour target");
return ERROR_INVALID_OPTION; return ERROR_INVALID_OPTION;

View File

@ -26,8 +26,9 @@
#ifndef NO_QR #ifndef NO_QR
#include <qrencode.h> #include <qrencode.h>
#include <stdio.h> #include <stdio.h>
#include "shiftjis.h"
QRcode *encode(int security, int size, const unsigned char *intext, int kanji, int gs1, char nullchar, int input_length) QRcode *encode(int security, int size, const unsigned char *intext, int kanji, int gs1, int input_length)
{ {
int version; int version;
QRecLevel level; QRecLevel level;
@ -62,49 +63,54 @@ QRcode *encode(int security, int size, const unsigned char *intext, int kanji, i
version = 0; version = 0;
} }
if(nullchar == '\0') { code = QRcode_encodeString((char*)intext, version, level, hint, 1);
/* No NULL characters in data */
code = QRcode_encodeString((char*)intext, version, level, hint, 1);
} else {
/* NULL characters in data */
code = QRcode_encodeString8bit((char*)intext, version, level);
/* code = QRcode_encodeString8bit((char*)intext, version, level, input_length); */
}
return code; return code;
} }
int qr_code(struct zint_symbol *symbol, unsigned char source[]) int qr_code(struct zint_symbol *symbol, unsigned char source[], int length)
{ {
QRcode *code; QRcode *code;
/*int errno = 0;*/
int i, j; int i, j;
int kanji, gs1; int kanji, gs1;
int input_length; int error_number;
char nullify;
#ifndef _MSC_VER
unsigned char local_source[length];
#else
unsigned char local_source = (unsigned char*)_alloca(length);
#endif
input_length = ustrlen(source);
nullify = symbol->nullchar;
if((symbol->input_mode == KANJI_MODE) || (symbol->input_mode == SJIS_MODE)) { kanji = 1; } else { kanji = 0; }
if(symbol->input_mode == GS1_MODE) { gs1 = 1; } else { gs1 = 0; } if(symbol->input_mode == GS1_MODE) { gs1 = 1; } else { gs1 = 0; }
/* Null character handling */ if(gs1) {
j = 0; strcpy(symbol->errtxt, "GS1 mode not yet supported in QR Code");
if(nullify != '\0') { return ERROR_INVALID_OPTION;
for(i = 0; i < input_length; i++) { }
if(source[i] == nullify) {
source[i] = '\0'; for(i = 0; i < length; i++) {
j++; if(source[i] == '\0') {
} strcpy(symbol->errtxt, "QR Code not yet able to handle NULL characters");
return ERROR_INVALID_DATA;
} }
} }
if(j == 0) { /* The following to be replaced by ECI handling */
/* nullchar was set but there are no NULL characters in the input data */ switch(symbol->input_mode) {
nullify = '\0'; case DATA_MODE:
for(i = 0; i < length; i++) {
local_source[i] = source[i];
}
local_source[length] = '\0';
kanji = 0;
break;
case UNICODE_MODE:
error_number = shiftJIS(symbol, source, local_source, &length, &kanji);
if(error_number != 0) { return error_number; }
break;
} }
code = encode(symbol->option_1, symbol->option_2, source, kanji, gs1, nullify, input_length); code = encode(symbol->option_1, symbol->option_2, local_source, kanji, gs1, length);
if(code == NULL) { if(code == NULL) {
strcpy(symbol->errtxt, "libqrencode failed to encode the input data"); strcpy(symbol->errtxt, "libqrencode failed to encode the input data");
return ERROR_ENCODING_PROBLEM; return ERROR_ENCODING_PROBLEM;

View File

@ -142,7 +142,7 @@ void getRSSwidths(int val, int n, int elements, int maxWidth, int noNarrow)
return; return;
} }
int rss14(struct zint_symbol *symbol, unsigned char source[]) int rss14(struct zint_symbol *symbol, unsigned char source[], int length)
{ /* GS1 DataBar-14 */ { /* GS1 DataBar-14 */
int error_number = 0, i, j, mask; int error_number = 0, i, j, mask;
short int accum[112], left_reg[112], right_reg[112], x_reg[112], y_reg[112]; short int accum[112], left_reg[112], right_reg[112], x_reg[112], y_reg[112];
@ -153,11 +153,11 @@ int rss14(struct zint_symbol *symbol, unsigned char source[])
separator_row = 0; separator_row = 0;
if(ustrlen(source) > 13) { if(length > 13) {
strcpy(symbol->errtxt, "Input too long"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
error_number = is_sane(NESET, source); error_number = is_sane(NESET, source, length);
if(error_number == ERROR_INVALID_DATA) { if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in data"); strcpy(symbol->errtxt, "Invalid characters in data");
return error_number; return error_number;
@ -651,7 +651,7 @@ int rss14(struct zint_symbol *symbol, unsigned char source[])
return error_number; return error_number;
} }
int rsslimited(struct zint_symbol *symbol, unsigned char source[]) int rsslimited(struct zint_symbol *symbol, unsigned char source[], int length)
{ /* GS1 DataBar Limited */ { /* GS1 DataBar Limited */
int error_number = 0, i, mask; int error_number = 0, i, mask;
short int accum[112], left_reg[112], right_reg[112], x_reg[112], y_reg[112]; short int accum[112], left_reg[112], right_reg[112], x_reg[112], y_reg[112];
@ -663,16 +663,16 @@ int rsslimited(struct zint_symbol *symbol, unsigned char source[])
separator_row = 0; separator_row = 0;
if(ustrlen(source) > 13) { if(length > 13) {
strcpy(symbol->errtxt, "Input too long"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
error_number = is_sane(NESET, source); error_number = is_sane(NESET, source, length);
if(error_number == ERROR_INVALID_DATA) { if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in data"); strcpy(symbol->errtxt, "Invalid characters in data");
return error_number; return error_number;
} }
if(ustrlen(source) == 13) { if(length == 13) {
if((source[0] != '0') && (source[0] != '1')) { if((source[0] != '0') && (source[0] != '1')) {
strcpy(symbol->errtxt, "Input out of range"); strcpy(symbol->errtxt, "Input out of range");
return ERROR_INVALID_DATA; return ERROR_INVALID_DATA;
@ -1858,7 +1858,7 @@ int rss_binary_string(struct zint_symbol *symbol, char source[], char binary_str
return 0; return 0;
} }
int rssexpanded(struct zint_symbol *symbol, unsigned char source[]) int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int length)
{ /* GS1 DataBar Expanded */ { /* GS1 DataBar Expanded */
int i, j, k, l, data_chars, vs[21], group[21], v_odd[21], v_even[21]; int i, j, k, l, data_chars, vs[21], group[21], v_odd[21], v_even[21];
char substring[21][14], latch; char substring[21][14], latch;
@ -1868,10 +1868,10 @@ int rssexpanded(struct zint_symbol *symbol, unsigned char source[])
int codeblocks, sub_elements[235], stack_rows, current_row, current_block; int codeblocks, sub_elements[235], stack_rows, current_row, current_block;
int separator_row; int separator_row;
#ifndef _MSC_VER #ifndef _MSC_VER
char reduced[ustrlen(source)], binary_string[7 * ustrlen(source)]; char reduced[length], binary_string[7 * length];
#else #else
char* reduced = (char*)_alloca(ustrlen(source)); char* reduced = (char*)_alloca(length);
char* binary_string = (char*)_alloca(7 * ustrlen(source)); char* binary_string = (char*)_alloca(7 * length);
#endif #endif
separator_row = 0; separator_row = 0;

118
backend/shiftjis.c Normal file
View File

@ -0,0 +1,118 @@
/* shiftjis.c - Handle conversion to Shift-JIS */
/*
libzint - the open source barcode library
Copyright (C) 2009 Robin Stuart <robin@zint.org.uk>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include <string.h>
#include "common.h"
#include "sjis.h"
int shiftJIS(struct zint_symbol *symbol, unsigned char source[], unsigned char preprocessed[], int *length, int *kanji)
{ /* QR Code supports compression of Shift-JIS data using "Kanji" mode - this function
attempts to convert Unicode characters to Shift-JIS to allow this */
int bpos, jpos, error_number, i, done;
int next;
unsigned long int uval, jval;
bpos = 0;
jpos = 0;
error_number = 0;
next = 0;
do {
uval = 0;
jval = 0;
done = 0;
if(source[bpos] <= 0x7f) {
/* 1 byte mode (7-bit ASCII) */
uval = source[bpos];
next = bpos + 1;
preprocessed[jpos] = uval;
jpos++;
done = 1;
}
if(done == 0) {
if((source[bpos] >= 0x80) && (source[bpos] <= 0xbf)) {
strcpy(symbol->errtxt, "Corrupt Unicode data");
return ERROR_INVALID_DATA;
}
}
if(done == 0) {
if((source[bpos] >= 0xc0) && (source[bpos] <= 0xc1)) {
strcpy(symbol->errtxt, "Overlong encoding not supported");
return ERROR_INVALID_DATA;
}
}
if(done == 0) {
if((source[bpos] >= 0xc2) && (source[bpos] <= 0xdf)) {
/* 2 byte mode (Latin 1) */
uval = ((source[bpos] & 0x1f) << 6) + (source[bpos + 1] & 0x3f);
next = bpos + 2;
preprocessed[jpos] = uval;
jpos++;
done = 1;
}
}
if(done == 0) {
if((source[bpos] >= 0xe0) && (source[bpos] <= 0xef)) {
/* 3 byte mode (Japanese) */
uval = ((source[bpos] & 0x0f) << 12) + ((source[bpos + 1] & 0x3f) << 6) + (source[bpos + 2] & 0x3f);
next = bpos + 3;
*kanji = 1;
for(i = 0; i < 6843; i++) {
if(sjis_lookup[i * 2] == uval) {
jval = sjis_lookup[(i * 2) + 1];
}
}
if(jval == 0) {
strcpy(symbol->errtxt, "Invalid Shift JIS character");
return ERROR_INVALID_DATA;
}
preprocessed[jpos] = (jval & 0xff00) >> 8;
preprocessed[jpos + 1] = (jval & 0xff);
/* printf("Unicode value U+%04X = Shift JIS value 0x%04X\n", uval, jval); */
jpos += 2;
done = 1;
}
}
if(done == 0) {
if(source[bpos] >= 0xf0) {
strcpy(symbol->errtxt, "Unicode sequences of more than 3 bytes not supported");
return ERROR_INVALID_DATA;
}
}
bpos = next;
} while(bpos < *length);
*length = jpos;
return error_number;
}

27
backend/shiftjis.h Normal file
View File

@ -0,0 +1,27 @@
/* shiftjis.h - Handle conversion to Shift-JIS */
/*
libzint - the open source barcode library
Copyright (C) 2009 Robin Stuart <robin@zint.org.uk>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef __SHIFTJIS_H
#define __SHIFTJIS_H
int shiftJIS(struct zint_symbol *symbol, unsigned char source[], unsigned char preprocessed[], int *length, int *kanji);
#endif

View File

@ -70,12 +70,12 @@ int svg_plot(struct zint_symbol *symbol)
strcpy(symbol->errtxt, "Malformed background colour target"); strcpy(symbol->errtxt, "Malformed background colour target");
return ERROR_INVALID_OPTION; return ERROR_INVALID_OPTION;
} }
error_number = is_sane(SSET, (unsigned char*)symbol->fgcolour); error_number = is_sane(SSET, (unsigned char*)symbol->fgcolour, 6);
if (error_number == ERROR_INVALID_DATA) { if (error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Malformed foreground colour target"); strcpy(symbol->errtxt, "Malformed foreground colour target");
return ERROR_INVALID_OPTION; return ERROR_INVALID_OPTION;
} }
error_number = is_sane(SSET, (unsigned char*)symbol->bgcolour); error_number = is_sane(SSET, (unsigned char*)symbol->bgcolour, 6);
if (error_number == ERROR_INVALID_DATA) { if (error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Malformed background colour target"); strcpy(symbol->errtxt, "Malformed background colour target");
return ERROR_INVALID_OPTION; return ERROR_INVALID_OPTION;

View File

@ -49,10 +49,9 @@ static char *TeleTable[] = { "1111111111111111", "1131313111", "33313111", "1111
"11311111111111", "331111111111", "111113111113", "31111111111111", "111311111113", "11311111111111", "331111111111", "111113111113", "31111111111111", "111311111113",
"131111111113"}; "131111111113"};
int telepen(struct zint_symbol *symbol, unsigned char source[]) int telepen(struct zint_symbol *symbol, unsigned char source[], int length)
{ {
unsigned int i, count, check_digit; unsigned int i, count, check_digit;
int ascii_value;
int error_number; int error_number;
char dest[1000]; char dest[1000];
@ -61,12 +60,12 @@ int telepen(struct zint_symbol *symbol, unsigned char source[])
count = 0; count = 0;
if(ustrlen(source) > 30) { if(length > 30) {
strcpy(symbol->errtxt, "Input too long"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
for(i = 0; i < ustrlen(source); i++) { for(i = 0; i < length; i++) {
if(source[i] > 127) { if(source[i] > 127) {
/* Cannot encode extended ASCII */ /* Cannot encode extended ASCII */
strcpy(symbol->errtxt, "Invalid characters in input data"); strcpy(symbol->errtxt, "Invalid characters in input data");
@ -77,14 +76,9 @@ int telepen(struct zint_symbol *symbol, unsigned char source[])
/* Start character */ /* Start character */
concat(dest, TeleTable['_']); concat(dest, TeleTable['_']);
for (i=0; i < ustrlen(source); i++) for (i=0; i < length; i++)
{ {
ascii_value = source[i]; concat(dest, TeleTable[source[i]]);
if(ascii_value == symbol->nullchar) {
concat(dest, TeleTable[0]);
} else {
concat(dest, TeleTable[ascii_value]);
}
count += source[i]; count += source[i];
} }
@ -96,55 +90,63 @@ int telepen(struct zint_symbol *symbol, unsigned char source[])
concat(dest, TeleTable['z']); concat(dest, TeleTable['z']);
expand(symbol, dest); expand(symbol, dest);
ustrcpy(symbol->text, source); for(i = 0; i < length; i++) {
if(source[i] == '\0') {
symbol->text[i] = ' ';
} else {
symbol->text[i] = source[i];
}
}
symbol->text[length] = '\0';
return error_number; return error_number;
} }
int telepen_num(struct zint_symbol *symbol, unsigned char source[]) int telepen_num(struct zint_symbol *symbol, unsigned char source[], int length)
{ {
unsigned int i, count, check_digit, glyph; unsigned int i, count, check_digit, glyph;
int error_number, input_length; int error_number;
unsigned char dest[1000]; unsigned char dest[1000];
unsigned char local_source[100]; unsigned char local_source[100];
error_number = 0; error_number = 0;
memset(dest, 0, 1000); memset(dest, 0, 1000);
memset(local_source, 0, 100); memset(local_source, 0, 100);
strcpy((char*)local_source, (char*)source);
input_length = ustrlen(source);
count = 0; count = 0;
if(input_length > 60) { if(length > 60) {
strcpy(symbol->errtxt, "Input too long"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
for(i = 0; i < length; i++) {
local_source[i] = source[i];
}
to_upper(local_source); to_upper(local_source);
error_number = is_sane(NASET, local_source); error_number = is_sane(NASET, local_source, length);
if(error_number == ERROR_INVALID_DATA) { if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in data"); strcpy(symbol->errtxt, "Invalid characters in data");
return error_number; return error_number;
} }
/* Add a leading zero if required */ /* Add a leading zero if required */
if ((input_length % 2) != 0) if ((length % 2) != 0)
{ {
char temp[200]; char temp[200];
strcpy(temp, (char*)local_source); strcpy(temp, (char*)local_source);
local_source[0] = '0'; local_source[0] = '0';
for(i = 0; i <= input_length; i++) for(i = 0; i <= length; i++)
{ {
local_source[i + 1] = temp[i]; local_source[i + 1] = temp[i];
} }
input_length++; length++;
} }
/* Start character */ /* Start character */
concat((char*)dest, TeleTable['_']); concat((char*)dest, TeleTable['_']);
for (i=0; i < input_length; i+=2) for (i=0; i < length; i+=2)
{ {
if(local_source[i] == 'X') { if(local_source[i] == 'X') {
strcpy(symbol->errtxt, "Invalid position of X in Telepen data"); strcpy(symbol->errtxt, "Invalid position of X in Telepen data");

View File

@ -402,18 +402,9 @@ char isbn_check(unsigned char source[]) /* For ISBN(10) and SBN only */
int isbn(struct zint_symbol *symbol, unsigned char source[], char dest[]) /* Make an EAN-13 barcode from an SBN or ISBN */ int isbn(struct zint_symbol *symbol, unsigned char source[], char dest[]) /* Make an EAN-13 barcode from an SBN or ISBN */
{ {
int i, errno; int i;
char check_digit; char check_digit;
errno = 0;
to_upper(source);
errno = is_sane("0123456789X", source);
if(errno == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in input");
return errno;
}
/* Input must be 9, 10 or 13 characters */ /* Input must be 9, 10 or 13 characters */
if(((ustrlen(source) < 9) || (ustrlen(source) > 13)) || ((ustrlen(source) > 10) && (ustrlen(source) < 13))) if(((ustrlen(source) < 9) || (ustrlen(source) > 13)) || ((ustrlen(source) > 10) && (ustrlen(source) < 13)))
{ {
@ -491,7 +482,7 @@ int isbn(struct zint_symbol *symbol, unsigned char source[], char dest[]) /* Mak
ean13(symbol, source, dest); ean13(symbol, source, dest);
} }
return errno; return 0;
} }
void ean_leading_zeroes(struct zint_symbol *symbol, unsigned char source[], unsigned char local_source[]) { void ean_leading_zeroes(struct zint_symbol *symbol, unsigned char source[], unsigned char local_source[]) {
@ -575,15 +566,15 @@ void ean_leading_zeroes(struct zint_symbol *symbol, unsigned char source[], unsi
} }
} }
int eanx(struct zint_symbol *symbol, unsigned char source[]) int eanx(struct zint_symbol *symbol, unsigned char source[], int length)
{ {
/* splits string to parts before and after '+' parts */ /* splits string to parts before and after '+' parts */
unsigned char first_part[20], second_part[20], dest[1000]; unsigned char first_part[20], second_part[20], dest[1000];
unsigned char local_source[20]; unsigned char local_source[20];
unsigned int latch, reader, writer, with_addon; unsigned int latch, reader, writer, with_addon;
int errno, i; int error_number, i;
errno = 0; error_number = 0;
memset(dest,0,1000); memset(dest,0,1000);
memset(first_part,0,20); memset(first_part,0,20);
memset(second_part,0,20); memset(second_part,0,20);
@ -592,21 +583,32 @@ int eanx(struct zint_symbol *symbol, unsigned char source[])
latch = FALSE; latch = FALSE;
writer = 0; writer = 0;
if(ustrlen(source) > 19) { if(length > 19) {
strcpy(symbol->errtxt, "Input too long"); strcpy(symbol->errtxt, "Input too long");
return ERROR_TOO_LONG; return ERROR_TOO_LONG;
} }
if(symbol->symbology != BARCODE_ISBNX) { if(symbol->symbology != BARCODE_ISBNX) {
/* ISBN has it's own checking routine */ /* ISBN has it's own checking routine */
errno = is_sane(NASET, source); error_number = is_sane(NASET, source, length);
if(errno == ERROR_INVALID_DATA) { if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in data"); strcpy(symbol->errtxt, "Invalid characters in data");
return errno; return error_number;
}
} else {
error_number = is_sane("0123456789Xx", source, length);
if(error_number == ERROR_INVALID_DATA) {
strcpy(symbol->errtxt, "Invalid characters in input");
return error_number;
} }
} }
/* Add leading zeroes */ /* Add leading zeroes */
ustrcpy(local_source, (unsigned char *)""); ustrcpy(local_source, (unsigned char *)"");
if(symbol->symbology == BARCODE_ISBNX) {
to_upper(local_source);
}
ean_leading_zeroes(symbol, source, local_source); ean_leading_zeroes(symbol, source, local_source);
for(reader = 0; reader <= ustrlen(local_source); reader++) for(reader = 0; reader <= ustrlen(local_source); reader++)
@ -732,9 +734,9 @@ int eanx(struct zint_symbol *symbol, unsigned char source[])
} }
break; break;
case BARCODE_ISBNX: case BARCODE_ISBNX:
errno = isbn(symbol, first_part, (char*)dest); error_number = isbn(symbol, first_part, (char*)dest);
if(errno > 4) { if(error_number > 4) {
return errno; return error_number;
} }
break; break;
} }
@ -777,10 +779,10 @@ int eanx(struct zint_symbol *symbol, unsigned char source[])
} }
if((symbol->errtxt[0] == 'w') && (errno == 0)) { if((symbol->errtxt[0] == 'w') && (error_number == 0)) {
errno = 1; /* flag UPC-E warnings */ error_number = 1; /* flag UPC-E warnings */
} }
return errno; return error_number;
} }

View File

@ -139,6 +139,7 @@ struct zint_symbol {
#define BARCODE_RSS_EXPSTACK_CC 139 #define BARCODE_RSS_EXPSTACK_CC 139
#define BARCODE_CHANNEL 140 #define BARCODE_CHANNEL 140
#define BARCODE_CODEONE 141 #define BARCODE_CODEONE 141
#define BARCODE_GRIDMATRIX 142
#define BARCODE_NO_ASCII 1 #define BARCODE_NO_ASCII 1
#define BARCODE_BIND 2 #define BARCODE_BIND 2
@ -176,13 +177,18 @@ struct zint_symbol {
ZINT_EXTERN struct zint_symbol *ZBarcode_Create(void); ZINT_EXTERN struct zint_symbol *ZBarcode_Create(void);
ZINT_EXTERN int ZBarcode_Delete(struct zint_symbol *symbol); ZINT_EXTERN int ZBarcode_Delete(struct zint_symbol *symbol);
ZINT_EXTERN int ZBarcode_Encode(struct zint_symbol *symbol, unsigned char *input);
ZINT_EXTERN int ZBarcode_Encode_from_File(struct zint_symbol *symbol, char *filename); ZINT_EXTERN int ZBarcode_Encode(struct zint_symbol *symbol, unsigned char *input, int length);
ZINT_EXTERN int ZBarcode_Print(struct zint_symbol *symbol); ZINT_EXTERN int ZBarcode_Encode_File(struct zint_symbol *symbol, char *filename);
ZINT_EXTERN int ZBarcode_Encode_and_Print(struct zint_symbol *symbol, unsigned char *input); ZINT_EXTERN int ZBarcode_Print(struct zint_symbol *symbol, int rotate_angle);
ZINT_EXTERN int ZBarcode_Encode_and_Print(struct zint_symbol *symbol, unsigned char *input, int length, int rotate_angle);
ZINT_EXTERN int ZBarcode_Encode_File_and_Print(struct zint_symbol *symbol, char *filename, int rotate_angle);
ZINT_EXTERN int ZBarcode_ValidID(int symbol_id);
/* Depreciated */
ZINT_EXTERN int ZBarcode_Print_Rotated(struct zint_symbol *symbol, int rotate_angle);
ZINT_EXTERN int ZBarcode_Encode_and_Print_Rotated(struct zint_symbol *symbol, unsigned char *input, int rotate_angle); ZINT_EXTERN int ZBarcode_Encode_and_Print_Rotated(struct zint_symbol *symbol, unsigned char *input, int rotate_angle);
ZINT_EXTERN int ZBarcode_Encode_from_File_and_Print(struct zint_symbol *symbol, char *filename, int rotate_angle);
ZINT_EXTERN int ZBarcode_Check_Supported(int symbol_id);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -67,7 +67,7 @@ void QZint::encode()
QByteArray bstr=m_text.toAscii(); QByteArray bstr=m_text.toAscii();
QByteArray pstr=m_primaryMessage.left(99).toAscii(); QByteArray pstr=m_primaryMessage.left(99).toAscii();
strcpy(m_zintSymbol->primary,pstr.data()); strcpy(m_zintSymbol->primary,pstr.data());
int error = ZBarcode_Encode(m_zintSymbol, (unsigned char*)bstr.data()); int error = ZBarcode_Encode(m_zintSymbol, (unsigned char*)bstr.data(), bstr.length());
if (error > WARN_INVALID_OPTION) if (error > WARN_INVALID_OPTION)
m_lastError=m_zintSymbol->errtxt; m_lastError=m_zintSymbol->errtxt;
@ -251,7 +251,7 @@ bool QZint::save_to_file(QString filename)
QByteArray bgcol=bg_colour_hash.right(6).toAscii(); QByteArray bgcol=bg_colour_hash.right(6).toAscii();
strcpy(m_zintSymbol->fgcolour,fgcol.data()); strcpy(m_zintSymbol->fgcolour,fgcol.data());
strcpy(m_zintSymbol->bgcolour,bgcol.data()); strcpy(m_zintSymbol->bgcolour,bgcol.data());
int error = ZBarcode_Encode_and_Print(m_zintSymbol, (unsigned char*)bstr.data()); int error = ZBarcode_Encode_and_Print(m_zintSymbol, (unsigned char*)bstr.data(), bstr.length(), 0);
if (error > WARN_INVALID_OPTION) if (error > WARN_INVALID_OPTION)
m_lastError=m_zintSymbol->errtxt; m_lastError=m_zintSymbol->errtxt;
if(error == 0) { return true; } else { return false; } if(error == 0) { return true; } else { return false; }

View File

@ -338,11 +338,7 @@ int main(int argc, char **argv)
break; break;
case 'd': /* we have some data! */ case 'd': /* we have some data! */
if(rotate_angle == 0) { error_number = ZBarcode_Encode_and_Print(my_symbol, (unsigned char*)optarg, strlen(optarg), rotate_angle);
error_number = ZBarcode_Encode_and_Print(my_symbol, (unsigned char*)optarg);
} else {
error_number = ZBarcode_Encode_and_Print_Rotated(my_symbol, (unsigned char*)optarg, rotate_angle);
}
generated = 1; generated = 1;
if(error_number != 0) { if(error_number != 0) {
fprintf(stderr, "%s\n", my_symbol->errtxt); fprintf(stderr, "%s\n", my_symbol->errtxt);
@ -352,7 +348,7 @@ int main(int argc, char **argv)
break; break;
case 'i': /* Take data from file */ case 'i': /* Take data from file */
error_number = ZBarcode_Encode_from_File_and_Print(my_symbol, optarg, rotate_angle); error_number = ZBarcode_Encode_File_and_Print(my_symbol, optarg, rotate_angle);
generated = 1; generated = 1;
if(error_number != 0) { if(error_number != 0) {
fprintf(stderr, "%s\n", my_symbol->errtxt); fprintf(stderr, "%s\n", my_symbol->errtxt);

View File

@ -158,7 +158,7 @@ bool MainWindow::save()
QString fileName = QFileDialog::getSaveFileName(this, QString fileName = QFileDialog::getSaveFileName(this,
tr("Save Barcode Image"), ".", tr("Save Barcode Image"), ".",
tr("Barcode Images (*.png *.eps *.svg)")); tr("Portable Network Graphic (*.png);;Encapsulated Post Script (*.eps);;Scalable Vector Graphic (*.svg)"));
if (fileName.isEmpty()) if (fileName.isEmpty())
return false; return false;