diff --git a/backend/codablock.c b/backend/codablock.c index 416123c3..f6ce4716 100644 --- a/backend/codablock.c +++ b/backend/codablock.c @@ -31,15 +31,15 @@ */ #include -#include +#include #include #include #ifdef _MSC_VER #include #endif #include "common.h" -#include "gs1.h" - +#include "gs1.h" + #define uchar unsigned char /* FTab Flagzeichen - Addierbar */ @@ -50,18 +50,35 @@ #define CShift 16 #define CFill 32 #define CodeFNC1 64 -#define ZTNum (CodeA+CodeB+CodeC) -#define ZTFNC1 (CodeA+CodeB+CodeC+CodeFNC1) - -/* ASCII-Extension for Codablock-F */ -#define aFNC1 (uchar)(128) -#define aFNC2 (uchar)(129) -#define aFNC3 (uchar)(130) -#define aFNC4 (uchar)(131) -#define aCodeA (uchar)(132) -#define aCodeB (uchar)(133) -#define aCodeC (uchar)(134) -#define aShift (uchar)(135) +#define ZTNum (CodeA+CodeB+CodeC) +#define ZTFNC1 (CodeA+CodeB+CodeC+CodeFNC1) + +/* ASCII-Extension for Codablock-F */ +#define aFNC1 (uchar)(128) +#define aFNC2 (uchar)(129) +#define aFNC3 (uchar)(130) +#define aFNC4 (uchar)(131) +#define aCodeA (uchar)(132) +#define aCodeB (uchar)(133) +#define aCodeC (uchar)(134) +#define aShift (uchar)(135) + +static const char *C128Table[107] = { + /* Code 128 character encodation - Table 1 */ + "212222", "222122", "222221", "121223", "121322", "131222", "122213", + "122312", "132212", "221213", "221312", "231212", "112232", "122132", "122231", "113222", + "123122", "123221", "223211", "221132", "221231", "213212", "223112", "312131", "311222", + "321122", "321221", "312212", "322112", "322211", "212123", "212321", "232121", "111323", + "131123", "131321", "112313", "132113", "132311", "211313", "231113", "231311", "112133", + "112331", "132131", "113123", "113321", "133121", "313121", "211331", "231131", "213113", + "213311", "213131", "311123", "311321", "331121", "312113", "312311", "332111", "314111", + "221411", "431111", "111224", "111422", "121124", "121421", "141122", "141221", "112214", + "112412", "122114", "122411", "142112", "142211", "241211", "221114", "413111", "241112", + "134111", "111242", "121142", "121241", "114212", "124112", "124211", "411212", "421112", + "421211", "212141", "214121", "412121", "111143", "111341", "131141", "114113", "114311", + "411113", "411311", "113141", "114131", "311141", "411131", "211412", "211214", "211232", + "2331112" +}; /* Code F Analysing-Chart */ typedef struct sCharacterSetTable @@ -357,7 +374,7 @@ int Columns2Rows(CharacterSetTable *T, unsigned char *data, int dataLength, memset(pSet,0,dataLength*sizeof(int)); }else{ /* Calculate real Length of OneLiner */ - /* This is -2 BASED !!! */ + /* This is -2 BASED !!! */ useColumns-=emptyColumns; } } @@ -394,7 +411,7 @@ int Columns2Rows(CharacterSetTable *T, unsigned char *data, int dataLength, #ifdef _DEBUG printf(" -> out: rowsCur <%i>, useColumns <%i>, fillings <%i>\n",rowsCur,useColumns,fillings); #endif - *pUseColumns=useColumns; + *pUseColumns=useColumns; *pRows=rowsCur; *pFillings=fillings; return 0; @@ -411,7 +428,7 @@ int Columns2Rows(CharacterSetTable *T, unsigned char *data, int dataLength, int Rows2Columns(CharacterSetTable *T, unsigned char *data, int dataLength, int * pRows, int * pUseColumns, int * pSet, int * pFillings) { - int errorCur; + int errorCur; int rowsCur; int rowsRequested; /* Number of Lines Requested */ int backupRows; @@ -422,11 +439,11 @@ int Rows2Columns(CharacterSetTable *T, unsigned char *data, int dataLength, int backupColumns; int fBackupOk; /* The memorysed set is o.k. */ int testListSize = 0; - int pTestList[62]; -#ifndef _MSC_VER - int *pBackupSet[dataLength]; -#else - int *pBackupSet = (int *)_alloca(dataLength*sizeof(int)); + int pTestList[62]; +#ifndef _MSC_VER + int *pBackupSet[dataLength]; +#else + int *pBackupSet = (int *)_alloca(dataLength*sizeof(int)); #endif rowsRequested=*pRows; @@ -452,13 +469,13 @@ int Rows2Columns(CharacterSetTable *T, unsigned char *data, int dataLength, pTestList[testListSize] = testColumns; testListSize++; useColumns=testColumns; /* Make a copy because it may be modified */ - errorCur = Columns2Rows(T, data, dataLength, &rowsCur, &useColumns, pSet, &fillings); - if (errorCur != 0) + errorCur = Columns2Rows(T, data, dataLength, &rowsCur, &useColumns, pSet, &fillings); + if (errorCur != 0) return errorCur; if (rowsCur<=rowsRequested) { /* Less or exactly line number found */ /* check if column count below already tested or Count = 1*/ - int fInTestList = (rowsCur == 1); + int fInTestList = (rowsCur == 1); int posCur; for (posCur = 0; posCur < testListSize && ! fInTestList; posCur++) { if ( pTestList[posCur] == testColumns-1 ) @@ -491,7 +508,7 @@ int Rows2Columns(CharacterSetTable *T, unsigned char *data, int dataLength, --testColumns; } else { /* > To many lines */ - int fInTestList = fBackupOk; + int fInTestList = fBackupOk; int posCur; for (posCur = 0; posCur < testListSize && ! fInTestList; posCur++) { if ( pTestList[posCur] == testColumns+1 ) @@ -518,114 +535,116 @@ int Rows2Columns(CharacterSetTable *T, unsigned char *data, int dataLength, } } -/* Print a character in character set A - */ -void A2C128_A(uchar **ppOutPos,uchar c) -{ - uchar * pOutPos = *ppOutPos; - switch(c){ - case aCodeB: *pOutPos=100; break; - case aFNC4: *pOutPos=101; break; - case aFNC1: *pOutPos=102; break; - case aFNC2: *pOutPos=97; break; - case aFNC3: *pOutPos=96; break; - case aCodeC: *pOutPos=99; break; - case aShift: *pOutPos=98; break; - default: - /* +++ HaO 13.11.98 c>' ' && c < '\x1F' corrected */ - if(c>=' ' && c<='_') - *pOutPos=(uchar)(c-' '); - else - *pOutPos=(uchar)(c+64); - break; - } - (*ppOutPos)++; -} -/* Output c in Set B - */ -void A2C128_B(uchar **ppOutPos,uchar c) -{ - uchar * pOutPos = *ppOutPos; - switch(c){ - case aFNC1: *pOutPos=102; break; - case aFNC2: *pOutPos=97; break; - case aFNC3: *pOutPos=96; break; - case aFNC4: *pOutPos=100; break; - case aCodeA: *pOutPos=101; break; - case aCodeC: *pOutPos=99; break; - case aShift: *pOutPos=98; break; - default: *pOutPos=(uchar)(c-' '); break; - } - ++(*ppOutPos); -} -/* Output c1, c2 in Set C - */ -void A2C128_C(uchar **ppOutPos,uchar c1,uchar c2) -{ - uchar * pOutPos = *ppOutPos; - switch(c1){ - case aFNC1: *pOutPos=102; break; - case aCodeB: *pOutPos=100; break; - case aCodeA: *pOutPos=101; break; - default: *pOutPos=(char)(10 * (c1- '0') + (c2 - '0'));break; - } - (*ppOutPos)++; -} -/* Output a character in Characterset - */ -void ASCIIZ128(uchar **ppOutPos, int CharacterSet,uchar c1, uchar c2) -{ - if (CharacterSet==CodeA) - A2C128_A(ppOutPos,c1); - else if(CharacterSet==CodeB) - A2C128_B(ppOutPos,c1); - else - A2C128_C(ppOutPos,c1,c2); -} -/* XLate Table A of Codablock-F Specification and call output - */ -void SummeASCII(uchar **ppOutPos, int Sum, int CharacterSet) -{ - switch (CharacterSet){ - case CodeA: - A2C128_A(ppOutPos, (uchar)Sum); - break; - case CodeB: - if (Sum<=31) - A2C128_B(ppOutPos, (uchar)(Sum+96)); - else if(Sum<=47) - A2C128_B(ppOutPos, (uchar)Sum); - else - A2C128_B(ppOutPos, (uchar)(Sum+10)); - break; - case CodeC: - A2C128_C(ppOutPos - ,(char)(Sum/10+'0') ,(uchar)(Sum%10+'0')); - break; - } -} - +/* Print a character in character set A + */ +void A2C128_A(uchar **ppOutPos,uchar c) +{ + uchar * pOutPos = *ppOutPos; + switch(c){ + case aCodeB: *pOutPos=100; break; + case aFNC4: *pOutPos=101; break; + case aFNC1: *pOutPos=102; break; + case aFNC2: *pOutPos=97; break; + case aFNC3: *pOutPos=96; break; + case aCodeC: *pOutPos=99; break; + case aShift: *pOutPos=98; break; + default: + /* +++ HaO 13.11.98 c>' ' && c < '\x1F' corrected */ + if(c>=' ' && c<='_') + *pOutPos=(uchar)(c-' '); + else + *pOutPos=(uchar)(c+64); + break; + } + (*ppOutPos)++; +} +/* Output c in Set B + */ +void A2C128_B(uchar **ppOutPos,uchar c) +{ + uchar * pOutPos = *ppOutPos; + switch(c){ + case aFNC1: *pOutPos=102; break; + case aFNC2: *pOutPos=97; break; + case aFNC3: *pOutPos=96; break; + case aFNC4: *pOutPos=100; break; + case aCodeA: *pOutPos=101; break; + case aCodeC: *pOutPos=99; break; + case aShift: *pOutPos=98; break; + default: *pOutPos=(uchar)(c-' '); break; + } + ++(*ppOutPos); +} +/* Output c1, c2 in Set C + */ +void A2C128_C(uchar **ppOutPos,uchar c1,uchar c2) +{ + uchar * pOutPos = *ppOutPos; + switch(c1){ + case aFNC1: *pOutPos=102; break; + case aCodeB: *pOutPos=100; break; + case aCodeA: *pOutPos=101; break; + default: *pOutPos=(char)(10 * (c1- '0') + (c2 - '0'));break; + } + (*ppOutPos)++; +} +/* Output a character in Characterset + */ +void ASCIIZ128(uchar **ppOutPos, int CharacterSet,uchar c1, uchar c2) +{ + if (CharacterSet==CodeA) + A2C128_A(ppOutPos,c1); + else if(CharacterSet==CodeB) + A2C128_B(ppOutPos,c1); + else + A2C128_C(ppOutPos,c1,c2); +} +/* XLate Table A of Codablock-F Specification and call output + */ +void SummeASCII(uchar **ppOutPos, int Sum, int CharacterSet) +{ + switch (CharacterSet){ + case CodeA: + A2C128_A(ppOutPos, (uchar)Sum); + break; + case CodeB: + if (Sum<=31) + A2C128_B(ppOutPos, (uchar)(Sum+96)); + else if(Sum<=47) + A2C128_B(ppOutPos, (uchar)Sum); + else + A2C128_B(ppOutPos, (uchar)(Sum+10)); + break; + case CodeC: + A2C128_C(ppOutPos + ,(char)(Sum/10+'0') ,(uchar)(Sum%10+'0')); + break; + } +} + int codablock(struct zint_symbol *symbol, unsigned char source[], int length) { int charCur; int dataLength; int Error; int rows, columns, useColumns; - int fillings; - int Sum1,Sum2; - uchar * pOutPos; - int rowCur; - int characterSetCur; + int fillings; + int Sum1,Sum2; + uchar * pOutPos; + int rowCur; + int characterSetCur; int emptyColumns; -#ifdef _MSC_VER - CharacterSetTable *T; - unsigned char *data; - int *pSet; - uchar * pOutput; -#endif + char dest[1000]; + int r, c; +#ifdef _MSC_VER + CharacterSetTable *T; + unsigned char *data; + int *pSet; + uchar * pOutput; +#endif /* Parameter check */ /* option1: rows 0: automatic, 1..44 */ - rows = symbol->option_1; + rows = symbol->option_1; if (rows > 44) { strcpy(symbol->errtxt, "Row parameter not in 0..44"); return ZINT_ERROR_INVALID_OPTION; @@ -635,25 +654,25 @@ int codablock(struct zint_symbol *symbol, unsigned char source[], int length) { if ( ! (columns <= 0 || (columns >= 6 && columns <=66)) ) { strcpy(symbol->errtxt, "Columns parameter not in 0,6..66"); return ZINT_ERROR_INVALID_OPTION; - } - /* There are 5 Codewords for Organisation Start(2),row(1),CheckSum,Stop */ + } + /* There are 5 Codewords for Organisation Start(2),row(1),CheckSum,Stop */ useColumns = columns - 5; /* GS1 not implemented */ if (symbol->input_mode == GS1_MODE) { strcpy(symbol->errtxt, "GS1 mode not supported"); return ZINT_ERROR_INVALID_OPTION; } -#ifndef _MSC_VER - unsigned char data[length*2+1]; -#else - data = (unsigned char *) _alloca(length * 2+1); +#ifndef _MSC_VER + unsigned char data[length*2+1]; +#else + data = (unsigned char *) _alloca(length * 2+1); #endif - dataLength = 0; - if (symbol->output_options & READER_INIT) { - data[dataLength] = aFNC3; - dataLength++; - } + dataLength = 0; + if (symbol->output_options & READER_INIT) { + data[dataLength] = aFNC3; + dataLength++; + } /* Replace all Codes>127 with Code-128 */ for (charCur=0;charCur127) @@ -667,13 +686,13 @@ int codablock(struct zint_symbol *symbol, unsigned char source[], int length) { } /* Build character set table */ -#ifndef _MSC_VER - CharacterSetTable T[dataLength]; - int pSet[dataLength]; -#else - T=(CharacterSetTable *)_alloca(dataLength*sizeof(CharacterSetTable)); - pSet = (int *)_alloca(dataLength*sizeof(int)); -#endif +#ifndef _MSC_VER + CharacterSetTable T[dataLength]; + int pSet[dataLength]; +#else + T=(CharacterSetTable *)_alloca(dataLength*sizeof(CharacterSetTable)); + pSet = (int *)_alloca(dataLength*sizeof(int)); +#endif CreateCharacterSetTable(T,data,dataLength); /* Find final row and column count */ @@ -705,7 +724,7 @@ int codablock(struct zint_symbol *symbol, unsigned char source[], int length) { /* Checksum */ Sum1=Sum2=0; if (rows>1) - { + { int charCur; for (charCur=0 ; charCur>> Build C128 code numbers */ - /* The C128 column count contains Start (2CW), Row ID, Checksum, Stop */ -#ifndef _MSC_VER - uchar pOutput[columns * rows]; -#else - pOutput = (char *)_alloca(columns * rows * sizeof(char)); -#endif - pOutPos = pOutput; - charCur=0; - /* >> Loop over Lines */ - for (rowCur=0 ; rowCur=dataLength) - { - /* >> Empty line with StartCCodeBCodeC */ - characterSetCur=CodeC; - /* CDB Start C*/ - pOutPos+=sprintf(pOutPos,"\x67\x63"); - SummeASCII(&pOutPos,rowCur+42,CodeC); - emptyColumns=useColumns-2; - while (emptyColumns>0) - { - if(characterSetCur==CodeC) - { - A2C128_C(&pOutPos,aCodeB,'\0'); - characterSetCur=CodeB; - }else{ - A2C128_B(&pOutPos,aCodeC); - characterSetCur=CodeC; - } - --emptyColumns; - } - }else{ - /* >> Normal Line */ - /* > Startcode */ - switch (pSet[charCur] & (CodeA+CodeB+CodeC)){ - case CodeA: - if (rows==1) - pOutPos+=sprintf((char *)pOutPos,"\x67"); - else - pOutPos+=sprintf((char *)pOutPos,"\x67\x62"); - characterSetCur=CodeA; - break; - case CodeB: - if (rows==1) - pOutPos+=sprintf((char *)pOutPos,"\x68"); - else - pOutPos+=sprintf((char *)pOutPos,"\x67\x64"); - characterSetCur=CodeB; - break; - case CodeC: - if (rows==1) - pOutPos+=sprintf((char *)pOutPos,"\x69"); - else - pOutPos+=sprintf((char *)pOutPos,"\x67\x63"); - characterSetCur=CodeC; - break; - } - if (rows>1) - { - /* > Set F1 */ - /* In first line : # of Lines */ - /* In Case of CodeA we shifted to CodeB */ - SummeASCII(&pOutPos - ,(rowCur==0)?rows-2:rowCur+42 - ,(characterSetCur==CodeA)?CodeB:characterSetCur - ); - } - /* >>> Data */ - emptyColumns=useColumns; - /* +++ One liner don't have start/stop code */ - if (rows == 1) - emptyColumns +=2; - /* >> Character loop */ - while (emptyColumns>0) - { - /* ? Change character set */ - /* not at first possition (It was then the start set) */ - /* +++ special case for one-ligner */ - if (emptyColumns> Shift it and put out the shiftet character */ - ASCIIZ128(&pOutPos,characterSetCur,aShift,'\0'); - emptyColumns-=2; - characterSetCur=(characterSetCur==CodeB)?CodeA:CodeB; - ASCIIZ128(&pOutPos,characterSetCur,data[charCur],'\0'); - characterSetCur=(characterSetCur==CodeB)?CodeA:CodeB; - }else{ - /* Normal Character */ - if (characterSetCur==CodeC) - { - if (data[charCur]==aFNC1) - A2C128_C(&pOutPos,aFNC1,'\0'); - else - { - A2C128_C(&pOutPos,data[charCur],data[charCur+1]); - ++charCur; - /* We need this here to get the good index */ - /* for the termination flags in Set. */ - } - }else - ASCIIZ128(&pOutPos,characterSetCur,data[charCur],'\0'); - --emptyColumns; - } - /* >> End Criteria */ - if ((pSet[charCur] & CFill)!=0) - { - /* Fill Line but leave space for checks in last line */ - if(rowCur==rows-1 && emptyColumns>=2) - emptyColumns-=2; - while(emptyColumns>0) - { - switch(characterSetCur){ - case CodeC: - A2C128_C(&pOutPos,aCodeB,'\0'); - characterSetCur=CodeB; - break; - case CodeB: - A2C128_B(&pOutPos,aCodeC); - characterSetCur=CodeC; - break; - case CodeA: - A2C128_A(&pOutPos,aCodeC); - characterSetCur=CodeC; - break; - } - --emptyColumns; - } - } - if ((pSet[charCur] & CEnd)!=0) - emptyColumns=0; - ++charCur; - } /* Loop over characters */ - } /* if filling-Line / normal */ - - /* Add checksum in last line */ - if(rows>1 && rowCur==rows-1) - { - SummeASCII(&pOutPos,Sum1,characterSetCur); - SummeASCII(&pOutPos,Sum2,characterSetCur); - } - /* Add Code 128 checksum */ - { - int Sum=0; - int Pos=0; - for ( ; Pos < useColumns+2 ; Pos++) - { - Sum = (Sum + - ((Pos==0?1:Pos) * pOutput[columns*rowCur+Pos]) % 103 - ) % 103; - } - *pOutPos=(uchar)Sum; - pOutPos++; - } - /* Add end character */ - *pOutPos=106; - pOutPos++; - } /* End Lineloop */ - - #ifdef _DEBUG - /* Dump the output to the screen - */ - printf("\nCode 128 Code Numbers:\n"); - { /* start a new level of local variables */ - int DPos, DPos2; - for (DPos=0 ; DPos< rows ; DPos++) - { - for (DPos2=0 ; DPos2 < columns ; DPos2++) - { - printf("% 3i ",(int)(pOutput[DPos*columns+DPos2])); - } - printf("\n"); - } - } - printf("rows=%i columns=%i fillings=%i\n", rows, columns, fillings); - #endif - return ZINT_ERROR_INVALID_OPTION; -} + /* >>> Build C128 code numbers */ + /* The C128 column count contains Start (2CW), Row ID, Checksum, Stop */ +#ifndef _MSC_VER + uchar pOutput[columns * rows]; +#else + pOutput = (char *)_alloca(columns * rows * sizeof(char)); +#endif + pOutPos = pOutput; + charCur=0; + /* >> Loop over Lines */ + for (rowCur=0 ; rowCur=dataLength) + { + /* >> Empty line with StartCCodeBCodeC */ + characterSetCur=CodeC; + /* CDB Start C*/ + pOutPos+=sprintf(pOutPos,"\x67\x63"); + SummeASCII(&pOutPos,rowCur+42,CodeC); + emptyColumns=useColumns-2; + while (emptyColumns>0) + { + if(characterSetCur==CodeC) + { + A2C128_C(&pOutPos,aCodeB,'\0'); + characterSetCur=CodeB; + }else{ + A2C128_B(&pOutPos,aCodeC); + characterSetCur=CodeC; + } + --emptyColumns; + } + }else{ + /* >> Normal Line */ + /* > Startcode */ + switch (pSet[charCur] & (CodeA+CodeB+CodeC)){ + case CodeA: + if (rows==1) + pOutPos+=sprintf((char *)pOutPos,"\x67"); + else + pOutPos+=sprintf((char *)pOutPos,"\x67\x62"); + characterSetCur=CodeA; + break; + case CodeB: + if (rows==1) + pOutPos+=sprintf((char *)pOutPos,"\x68"); + else + pOutPos+=sprintf((char *)pOutPos,"\x67\x64"); + characterSetCur=CodeB; + break; + case CodeC: + if (rows==1) + pOutPos+=sprintf((char *)pOutPos,"\x69"); + else + pOutPos+=sprintf((char *)pOutPos,"\x67\x63"); + characterSetCur=CodeC; + break; + } + if (rows>1) + { + /* > Set F1 */ + /* In first line : # of Lines */ + /* In Case of CodeA we shifted to CodeB */ + SummeASCII(&pOutPos + ,(rowCur==0)?rows-2:rowCur+42 + ,(characterSetCur==CodeA)?CodeB:characterSetCur + ); + } + /* >>> Data */ + emptyColumns=useColumns; + /* +++ One liner don't have start/stop code */ + if (rows == 1) + emptyColumns +=2; + /* >> Character loop */ + while (emptyColumns>0) + { + /* ? Change character set */ + /* not at first possition (It was then the start set) */ + /* +++ special case for one-ligner */ + if (emptyColumns> Shift it and put out the shiftet character */ + ASCIIZ128(&pOutPos,characterSetCur,aShift,'\0'); + emptyColumns-=2; + characterSetCur=(characterSetCur==CodeB)?CodeA:CodeB; + ASCIIZ128(&pOutPos,characterSetCur,data[charCur],'\0'); + characterSetCur=(characterSetCur==CodeB)?CodeA:CodeB; + }else{ + /* Normal Character */ + if (characterSetCur==CodeC) + { + if (data[charCur]==aFNC1) + A2C128_C(&pOutPos,aFNC1,'\0'); + else + { + A2C128_C(&pOutPos,data[charCur],data[charCur+1]); + ++charCur; + /* We need this here to get the good index */ + /* for the termination flags in Set. */ + } + }else + ASCIIZ128(&pOutPos,characterSetCur,data[charCur],'\0'); + --emptyColumns; + } + /* >> End Criteria */ + if ((pSet[charCur] & CFill)!=0) + { + /* Fill Line but leave space for checks in last line */ + if(rowCur==rows-1 && emptyColumns>=2) + emptyColumns-=2; + while(emptyColumns>0) + { + switch(characterSetCur){ + case CodeC: + A2C128_C(&pOutPos,aCodeB,'\0'); + characterSetCur=CodeB; + break; + case CodeB: + A2C128_B(&pOutPos,aCodeC); + characterSetCur=CodeC; + break; + case CodeA: + A2C128_A(&pOutPos,aCodeC); + characterSetCur=CodeC; + break; + } + --emptyColumns; + } + } + if ((pSet[charCur] & CEnd)!=0) + emptyColumns=0; + ++charCur; + } /* Loop over characters */ + } /* if filling-Line / normal */ + + /* Add checksum in last line */ + if(rows>1 && rowCur==rows-1) + { + SummeASCII(&pOutPos,Sum1,characterSetCur); + SummeASCII(&pOutPos,Sum2,characterSetCur); + } + /* Add Code 128 checksum */ + { + int Sum=0; + int Pos=0; + for ( ; Pos < useColumns+2 ; Pos++) + { + Sum = (Sum + + ((Pos==0?1:Pos) * pOutput[columns*rowCur+Pos]) % 103 + ) % 103; + } + *pOutPos=(uchar)Sum; + pOutPos++; + } + /* Add end character */ + *pOutPos=106; + pOutPos++; + } /* End Lineloop */ + + #ifdef _DEBUG + /* Dump the output to the screen + */ + printf("\nCode 128 Code Numbers:\n"); + { /* start a new level of local variables */ + int DPos, DPos2; + for (DPos=0 ; DPos< rows ; DPos++) + { + for (DPos2=0 ; DPos2 < columns ; DPos2++) + { + printf("% 3i ",(int)(pOutput[DPos*columns+DPos2])); + } + printf("\n"); + } + } + printf("rows=%i columns=%i fillings=%i\n", rows, columns, fillings); + #endif + + + for (r = 0; r < rows; r++) { + strcpy(dest, ""); + for(c = 0; c < columns; c++) { + strcat(dest, C128Table[pOutput[r * columns + c]]); + } + expand(symbol, dest); + } + + if (!(symbol->output_options & BARCODE_BIND)) { + symbol->output_options += BARCODE_BIND; + } + return 0; +} diff --git a/backend/common.c b/backend/common.c index 78985c97..b593fcfe 100644 --- a/backend/common.c +++ b/backend/common.c @@ -167,38 +167,27 @@ void expand(struct zint_symbol *symbol, const char data[]) { /* Indicates which symbologies can have row binding */ int is_stackable(const int symbology) { + int retval = 0; + if (symbology < BARCODE_PDF417) { - return 1; + retval = 1; } - if (symbology == BARCODE_CODE128B) { - return 1; - } - if (symbology == BARCODE_ISBNX) { - return 1; - } - if (symbology == BARCODE_EAN14) { - return 1; - } - if (symbology == BARCODE_NVE18) { - return 1; - } - if (symbology == BARCODE_KOREAPOST) { - return 1; - } - if (symbology == BARCODE_PLESSEY) { - return 1; - } - if (symbology == BARCODE_TELEPEN_NUM) { - return 1; - } - if (symbology == BARCODE_ITF14) { - return 1; - } - if (symbology == BARCODE_CODE32) { - return 1; + + switch (symbology) { + case BARCODE_CODE128B: + case BARCODE_ISBNX: + case BARCODE_EAN14: + case BARCODE_NVE18: + case BARCODE_KOREAPOST: + case BARCODE_PLESSEY: + case BARCODE_TELEPEN_NUM: + case BARCODE_ITF14: + case BARCODE_CODE32: + case BARCODE_CODABLOCK: + retval = 1; } - return 0; + return retval; } /* Indicates which symbols can have addon (EAN-2 and EAN-5) */ diff --git a/backend_qt4/qzint.cpp b/backend_qt4/qzint.cpp index eb199fd9..38793ecd 100644 --- a/backend_qt4/qzint.cpp +++ b/backend_qt4/qzint.cpp @@ -515,7 +515,9 @@ namespace Zint { } } /* Add row binding */ - if (((m_zintSymbol->symbology == BARCODE_CODE16K) || (m_zintSymbol->symbology == BARCODE_CODE49)) && (row != 0)) { + if (((m_zintSymbol->symbology == BARCODE_CODE16K) + || (m_zintSymbol->symbology == BARCODE_CODE49) + || (m_zintSymbol->symbology == BARCODE_CODABLOCK)) && (row != 0)) { painter.fillRect(0, y - 1, m_zintSymbol->width, 2, QBrush(m_fgColor)); } y += m_zintSymbol->row_height[row];