From 2dd4f31da4dc29c00fe6ba3304a4e94b7654561e Mon Sep 17 00:00:00 2001 From: hooper114 Date: Fri, 16 Jan 2009 05:50:22 +0000 Subject: [PATCH] Add GS1 support to Aztec Code --- backend/aztec.c | 42 ++++++++++++++++++++++++++++++++---------- backend/aztec.h | 2 ++ backend/gs1.c | 4 ++-- backend/library.c | 1 + 4 files changed, 37 insertions(+), 12 deletions(-) diff --git a/backend/aztec.c b/backend/aztec.c index 35494b55..a14a5004 100644 --- a/backend/aztec.c +++ b/backend/aztec.c @@ -47,25 +47,42 @@ void insert(char binary_string[], int posn, char newbit) binary_string[posn] = newbit; } -int aztec_text_process(unsigned char source[], char binary_string[]) +int aztec_text_process(unsigned char source[], char binary_string[], int gs1) { /* Encode input data into a binary string */ int i, j, k, bytes; int charmap[ustrlen(source)], typemap[ustrlen(source)], maplength; int curtable, newtable, lasttable, chartype; int blockmap[2][ustrlen(source)], blocks; - /* Lookup input string in encoding table */ + maplength = 0; + if((gs1) && (i == 0)) { + /* Add FNC1 to beginning of GS1 messages */ + charmap[maplength] = 0; + typemap[maplength] = 8; + maplength++; + charmap[maplength] = 400; + typemap[maplength] = 8; + maplength++; + } for(i = 0; i < ustrlen(source); i++) { if(source[i] > 127) { - charmap[i] = source[i]; - typemap[i] = BINARY; + charmap[maplength] = source[i]; + typemap[maplength] = BINARY; } else { - charmap[i] = AztecSymbolChar[source[i]]; - typemap[i] = AztecCodeSet[source[i]]; + charmap[maplength] = AztecSymbolChar[source[i]]; + typemap[maplength] = AztecCodeSet[source[i]]; } + if((gs1) && (source[i] == '[')) { + /* FNC1 represented by FLG(0) */ + charmap[maplength] = 0; + typemap[maplength] = 8; + maplength++; + charmap[maplength] = 400; + typemap[maplength] = 8; + } + maplength++; } - maplength = ustrlen(source); /* Look for double character encoding possibilities */ i = 0; @@ -522,7 +539,11 @@ int aztec_text_process(unsigned char source[], char binary_string[]) case LOWER: case MIXED: case PUNC: - concat(binary_string, hexbit[charmap[i]]); + if(charmap[i] >= 400) { + concat(binary_string, tribit[charmap[i] - 400]); + } else { + concat(binary_string, hexbit[charmap[i]]); + } break; case DIGIT: concat(binary_string, pentbit[charmap[i]]); @@ -556,12 +577,13 @@ int aztec(struct zint_symbol *symbol, unsigned char source[]) unsigned int data_part[1500], ecc_part[840]; unsigned char desc_data[4], desc_ecc[6]; int err_code, ecc_level, compact, data_length, data_maxsize, codeword_size, adjusted_length; - int remainder, padbits, count; + int remainder, padbits, count, gs1; memset(binary_string,0,20000); memset(adjusted_string,0,20000); - err_code = aztec_text_process(source, binary_string); + if(symbol->input_mode == GS1_MODE) { gs1 = 1; } else { gs1 = 0; } + err_code = aztec_text_process(source, binary_string, gs1); if(err_code != 0) { strcpy(symbol->errtxt, "Input too long or too many extended ASCII characters [921]"); diff --git a/backend/aztec.h b/backend/aztec.h index 27bcd5b7..f34814e8 100644 --- a/backend/aztec.h +++ b/backend/aztec.h @@ -245,6 +245,8 @@ static char *pentbit[32] = {"0000", "0001", "0010", "0011", "0100", "0101", "011 "1010", "1011", "1100", "1101", "1110", "1111" }; +static char *tribit[8] = {"000", "001", "010", "011", "100", "101", "110", "111"}; + static int AztecSizes[32] = { /* Codewords per symbol */ 21, 48, 60, 88, 120, 156, 196, 240, 230, 272, 316, 364, 416, 470, 528, 588, 652, 720, 790, 864, 940, 1020, 920, 992, 1066, 1144, 1224, 1306, 1392, 1480, 1570, 1664 diff --git a/backend/gs1.c b/backend/gs1.c index 338428fc..1df18138 100644 --- a/backend/gs1.c +++ b/backend/gs1.c @@ -59,7 +59,7 @@ int gs1_verify(struct zint_symbol *symbol, unsigned char source[], char reduced[ /* remove the following to make this code work */ read_this = NOW; - + /* BogDan... Happy New Year! I've been trying to contact you but can't get through! the message keeps bouncing back to me. I've put a message on the developers forum on SF instead */ @@ -90,7 +90,7 @@ int gs1_verify(struct zint_symbol *symbol, unsigned char source[], char reduced[ ai_latch = 0; for(i = 0; i < ustrlen(source); i++) { ai_length += j; - if((j == 1) && ((source[i] < '0') || (source[i] > '9'))) { ai_latch = 1; } + if(((j == 1) && (source[i] != ']')) && ((source[i] < '0') || (source[i] > '9'))) { ai_latch = 1; } if(source[i] == '[') { bracket_level++; j = 1; } if(source[i] == ']') { bracket_level--; diff --git a/backend/library.c b/backend/library.c index 5b8d2d8b..ae97a592 100644 --- a/backend/library.c +++ b/backend/library.c @@ -201,6 +201,7 @@ int gs1_compliant(int symbology) case BARCODE_RSS14_OMNI_CC: case BARCODE_RSS_EXPSTACK_CC: case BARCODE_CODE16K: + case BARCODE_AZTEC: result = 1; break; }