From 14d1140d0968cfd7087f430c6746d01ea2d9b5a8 Mon Sep 17 00:00:00 2001 From: gitlost Date: Tue, 10 Aug 2021 12:04:25 +0100 Subject: [PATCH] CODABLOCKF: prevent cols > 62; fix pTestList buffer overflow RMQR: update to new draft ISO/IEC JTC1/SC31N000 (Draft 2019-6-24); allow for righthand vertical timing pattern in populate_grid() ULTRA: update max size and min cols based on BWIPP 2021-07-14 update backend_tcl/zint_tcl.dsp: use /MD instead of /MT for tcl lib compat; change include/lib path to more standard one manual.txt: highlight that rMQR is still in development GUI: use cross-platform smaller font func instead of explicit values for notes --- backend/aztec.c | 4 +- backend/codablock.c | 61 +- backend/code128.c | 7 +- backend/common.c | 6 +- backend/dotcode.c | 6 +- backend/emf.c | 2 +- backend/hanxin.c | 2 +- backend/mailmark.c | 6 +- backend/medical.c | 6 +- backend/pdf417.c | 18 +- backend/pdf417.h | 3 +- backend/plessey.c | 18 +- backend/png.c | 2 +- backend/postal.c | 20 +- backend/qr.c | 19 +- backend/qr.h | 6 +- backend/raster.c | 3 +- .../eps/maxicode_no_bg_hwsp3_rotate_180.eps | 379 ++++++++++ .../data/svg/telepen_height0.4_rotate_180.svg | 38 + backend/tests/test_codablock.c | 54 +- backend/tests/test_code16k.c | 30 +- backend/tests/test_common.c | 4 +- backend/tests/test_gridmtx.c | 242 ++++--- backend/tests/test_hanxin.c | 11 +- backend/tests/test_library.c | 4 +- backend/tests/test_mailmark.c | 1 + backend/tests/test_maxicode.c | 4 +- backend/tests/test_plessey.c | 6 +- backend/tests/test_ps.c | 1 + backend/tests/test_qr.c | 658 +++++++++++++----- backend/tests/test_raster.c | 59 +- backend/tests/test_svg.c | 1 + backend/tests/test_tif.c | 10 + backend/tests/test_ultra.c | 452 +++++++++--- backend/tests/testcommon.c | 73 +- backend/tests/testcommon.h | 2 +- .../tests/tools/bwipp_dump-barcode.ps.diff | 4 +- backend/tests/tools/bwipp_dump.ps.tar.xz | Bin 123640 -> 123516 bytes backend/tests/tools/run_bwipp_tests.sh | 3 + backend/ultra.c | 147 ++-- backend_tcl/zint_tcl.dsp | 9 +- docs/manual.txt | 18 +- frontend_qt/grpC128.ui | 5 - frontend_qt/grpDAFT.ui | 5 - frontend_qt/grpGrid.ui | 5 - frontend_qt/mainWindow.ui | 122 ++-- frontend_qt/mainwindow.cpp | 25 + frontend_qt/mainwindow.h | 1 + tools/update_version.php | 5 +- 49 files changed, 1828 insertions(+), 739 deletions(-) create mode 100644 backend/tests/data/eps/maxicode_no_bg_hwsp3_rotate_180.eps create mode 100644 backend/tests/data/svg/telepen_height0.4_rotate_180.svg diff --git a/backend/aztec.c b/backend/aztec.c index f59b6c04..75b449b5 100644 --- a/backend/aztec.c +++ b/backend/aztec.c @@ -839,8 +839,8 @@ INTERNAL int aztec(struct zint_symbol *symbol, unsigned char source[], int lengt rs_uint_t rs_uint; #ifdef _MSC_VER - unsigned int* data_part; - unsigned int* ecc_part; + unsigned int *data_part; + unsigned int *ecc_part; #endif if ((symbol->input_mode & 0x07) == GS1_MODE) { diff --git a/backend/codablock.c b/backend/codablock.c index a7a5bc4a..e31ad786 100644 --- a/backend/codablock.c +++ b/backend/codablock.c @@ -101,8 +101,8 @@ static int GetPossibleCharacterSet(unsigned char C) return CodeA; if (C>='0' && C<='9') return ZTNum; /* ZTNum=CodeA+CodeB+CodeC */ - if (C==aFNC1) - return ZTFNC1; /* ZTFNC1=CodeA+CodeB+CodeC+CodeFNC1 */ + if (C==aFNC1) /* FNC1s (GS1) not used */ + return ZTFNC1; /* ZTFNC1=CodeA+CodeB+CodeC+CodeFNC1 */ /* Not reached */ if (C==aFNC4) return (CodeA | CodeB | CodeFNC4); if (C>='\x60' && C<='\x7f') /* 60 to 127 */ @@ -152,9 +152,9 @@ static void CreateCharacterSetTable(CharacterSetTable T[], unsigned char *data, do{ /* Whether this is FNC1, whether next is */ /* numeric */ - if (T[runChar].CharacterSet==ZTFNC1) + if (T[runChar].CharacterSet==ZTFNC1) /* FNC1s (GS1) not used */ /* FNC1 */ - ++(T[charCur].CFollowing); + ++(T[charCur].CFollowing); /* Not reached */ else { ++runChar; @@ -251,9 +251,9 @@ static int Columns2Rows(struct zint_symbol *symbol, CharacterSetTable *T, const /* Test if numeric after one isn't better.*/ runChar=charCur; emptyColumns2=emptyColumns; - while (T[runChar].CharacterSet==ZTFNC1) + while (T[runChar].CharacterSet==ZTFNC1) /* FNC1s (GS1) not used */ { - ++runChar; + ++runChar; /* Not reached */ --emptyColumns2; } if (CPaires>=RemainingDigits(T,runChar+1,emptyColumns2-1)) @@ -437,15 +437,11 @@ static int Rows2Columns(struct zint_symbol *symbol, CharacterSetTable *T, const int rowsCur; int rowsRequested; /* Number of requested rows */ int columnsRequested; /* Number of requested columns (if any) */ - int backupRows = 0; int fillings; - int backupFillings = 0; int useColumns; int testColumns; /* To enter into Width2Rows */ - int backupColumns = 0; - int fBackupOk = 0; /* The memorised set is o.k. */ int testListSize = 0; - int pTestList[62]; + int pTestList[62 + 1]; #ifndef _MSC_VER int *pBackupSet[dataLength]; #else @@ -501,38 +497,15 @@ static int Rows2Columns(struct zint_symbol *symbol, CharacterSetTable *T, const return 0; } /* > Test more rows (shorter CDB) */ - fBackupOk=(rowsCur==rowsRequested); memcpy(pBackupSet,pSet,dataLength*sizeof(int)); - backupFillings=fillings; - backupColumns=useColumns; - backupRows=rowsCur; --testColumns; } else { /* > Too many rows */ - int fInTestList = fBackupOk; - int posCur; - for (posCur = 0; posCur < testListSize && ! fInTestList; posCur++) { - if ( pTestList[posCur] == testColumns+1 ) - fInTestList = 1; - } - if (fInTestList) { - /* The next less-rows (larger) code was - * already tested. So give the larger - * back. - */ - memcpy(pSet,pBackupSet,dataLength*sizeof(int)); - *pFillings=backupFillings; - *pRows=backupRows; - *pUseColumns=backupColumns; - return 0; - } /* > Test less rows (longer code) */ - backupRows=rowsCur; memcpy(pBackupSet,pSet,dataLength*sizeof(int)); - backupFillings=fillings; - backupColumns=useColumns; - fBackupOk=0; - ++testColumns; + if (++testColumns > 62) { + return ZINT_ERROR_TOO_LONG; + } } } } @@ -545,8 +518,8 @@ static void A2C128_A(uchar **ppOutPos,uchar c) switch(c){ case aCodeB: *pOutPos=100; break; case aFNC4: *pOutPos=101; break; - case aFNC1: *pOutPos=102; break; - case aFNC2: *pOutPos=97; break; + case aFNC1: *pOutPos=102; break; /* FNC1s (GS1) not used */ /* Not reached */ + case aFNC2: *pOutPos=97; break; /* FNC2s (Message Append) not used */ /* Not reached */ case aFNC3: *pOutPos=96; break; case aCodeC: *pOutPos=99; break; case aShift: *pOutPos=98; break; @@ -567,8 +540,8 @@ static void A2C128_B(uchar **ppOutPos,uchar c) { uchar * pOutPos = *ppOutPos; switch(c){ - case aFNC1: *pOutPos=102; break; - case aFNC2: *pOutPos=97; break; + case aFNC1: *pOutPos=102; break; /* FNC1s (GS1) not used */ /* Not reached */ + case aFNC2: *pOutPos=97; break; /* FNC2s (Message Append) not used */ /* Not reached */ case aFNC3: *pOutPos=96; break; case aFNC4: *pOutPos=100; break; case aCodeA: *pOutPos=101; break; @@ -585,7 +558,7 @@ static void A2C128_C(uchar **ppOutPos,uchar c1,uchar c2) { uchar * pOutPos = *ppOutPos; switch(c1){ - case aFNC1: *pOutPos=102; break; + case aFNC1: *pOutPos=102; break; /* FNC1s (GS1) not used */ /* Not reached */ case aCodeB: *pOutPos=100; break; case aCodeA: *pOutPos=101; break; default: *pOutPos=(char)(10 * (c1- '0') + (c2 - '0'));break; @@ -890,8 +863,8 @@ INTERNAL int codablock(struct zint_symbol *symbol, unsigned char source[], int l /* Normal Character */ if (characterSetCur==CodeC) { - if (data[charCur]==aFNC1) - A2C128_C(&pOutPos,aFNC1,'\0'); + if (data[charCur]==aFNC1) /* FNC1s (GS1) not used */ + A2C128_C(&pOutPos,aFNC1,'\0'); /* Not reached */ else { A2C128_C(&pOutPos, data[charCur], diff --git a/backend/code128.c b/backend/code128.c index f9fc5703..3e97d0d6 100644 --- a/backend/code128.c +++ b/backend/code128.c @@ -843,14 +843,13 @@ INTERNAL int ean_128_cc(struct zint_symbol *symbol, unsigned char source[], int last_set = set[0]; glyph_count = 0.0f; for (i = 0; i < reduced_length; i++) { - if ((set[i] == 'a') || (set[i] == 'b')) { - glyph_count = glyph_count + 1.0f; /* Not reached */ - } - if (((set[i] == 'A') || (set[i] == 'B')) || (set[i] == 'C')) { + if ((set[i] == 'A') || (set[i] == 'B') || (set[i] == 'C')) { if (set[i] != last_set) { last_set = set[i]; glyph_count = glyph_count + 1.0f; } + } else if ((set[i] == 'a') || (set[i] == 'b')) { + glyph_count = glyph_count + 1.0f; /* Not reached */ } if ((set[i] == 'C') && (reduced[i] != '[')) { diff --git a/backend/common.c b/backend/common.c index c0cdb51d..5bfb00e6 100644 --- a/backend/common.c +++ b/backend/common.c @@ -439,7 +439,7 @@ INTERNAL int set_height(struct zint_symbol *symbol, const float min_row_height, INTERNAL int colour_to_red(const int colour) { int return_val = 0; - switch(colour) { + switch (colour) { case 8: // White case 3: // Magenta case 4: // Red @@ -455,7 +455,7 @@ INTERNAL int colour_to_red(const int colour) { INTERNAL int colour_to_green(const int colour) { int return_val = 0; - switch(colour) { + switch (colour) { case 8: // White case 1: // Cyan case 5: // Yellow @@ -471,7 +471,7 @@ INTERNAL int colour_to_green(const int colour) { INTERNAL int colour_to_blue(const int colour) { int return_val = 0; - switch(colour) { + switch (colour) { case 8: // White case 1: // Cyan case 2: // Blue diff --git a/backend/dotcode.c b/backend/dotcode.c index f77a20f4..43af1576 100644 --- a/backend/dotcode.c +++ b/backend/dotcode.c @@ -729,7 +729,7 @@ static int dotcode_encode_message(struct zint_symbol *symbol, const unsigned cha codeword_array[array_length] = 96; input_position++; } else { - switch(source[input_position]) { + switch (source[input_position]) { case 9: codeword_array[array_length] = 97; break; // HT case 28: codeword_array[array_length] = 98; break; // FS case 29: codeword_array[array_length] = 99; break; // GS @@ -802,7 +802,7 @@ static int dotcode_encode_message(struct zint_symbol *symbol, const unsigned cha } else if (input_position != 0) { /* HT, FS, GS and RS in the first data position would be interpreted as a macro * (see table 2) */ - switch(source[input_position]) { + switch (source[input_position]) { case 9: // HT codeword_array[array_length] = 97; break; @@ -975,7 +975,7 @@ static int dotcode_encode_message(struct zint_symbol *symbol, const unsigned cha codeword_array[array_length] = 96; input_position++; } else { - switch(source[input_position]) { + switch (source[input_position]) { case 9: codeword_array[array_length] = 97; break; // HT case 28: codeword_array[array_length] = 98; break; // FS case 29: codeword_array[array_length] = 99; break; // GS diff --git a/backend/emf.c b/backend/emf.c index 3982e257..d3e4e31b 100644 --- a/backend/emf.c +++ b/backend/emf.c @@ -534,7 +534,7 @@ INTERNAL int emf_plot(struct zint_symbol *symbol, int rotate_angle) { emr_extcreatefontindirectw.elw.out_precision = 0x00; // OUT_DEFAULT_PRECIS emr_extcreatefontindirectw.elw.clip_precision = 0x00; // CLIP_DEFAULT_PRECIS emr_extcreatefontindirectw.elw.pitch_and_family = 0x02 | (0x02 << 6); // FF_SWISS | VARIABLE_PITCH - utfle_copy(emr_extcreatefontindirectw.elw.facename, (unsigned char*) "sans-serif", 10); + utfle_copy(emr_extcreatefontindirectw.elw.facename, (unsigned char *) "sans-serif", 10); bytecount += 104; recordcount++; diff --git a/backend/hanxin.c b/backend/hanxin.c index 90ed91f0..f7d9d1a6 100644 --- a/backend/hanxin.c +++ b/backend/hanxin.c @@ -1550,7 +1550,7 @@ INTERNAL int han_xin(struct zint_symbol *symbol, unsigned char source[], int len data_codewords = hx_data_codewords_L4[i - 1]; } break; - default: + default: /* Not reached */ assert(0); break; } diff --git a/backend/mailmark.c b/backend/mailmark.c index 91302db7..3821f212 100644 --- a/backend/mailmark.c +++ b/backend/mailmark.c @@ -105,7 +105,7 @@ static int verify_character(char input, char type) { } } -static int verify_postcode(char* postcode, int type) { +static int verify_postcode(char *postcode, int type) { int i; char pattern[11]; @@ -152,7 +152,7 @@ INTERNAL int mailmark(struct zint_symbol *symbol, unsigned char source[], int le return ZINT_ERROR_TOO_LONG; } - strcpy(local_source, (char*) source); + ustrcpy(local_source, source); if (length < 22) { for (i = length; i <= 22; i++) { @@ -168,7 +168,7 @@ INTERNAL int mailmark(struct zint_symbol *symbol, unsigned char source[], int le length = 26; } - to_upper((unsigned char*) local_source); + to_upper((unsigned char *) local_source); if (symbol->debug & ZINT_DEBUG_PRINT) { printf("Producing Mailmark %s\n", local_source); diff --git a/backend/medical.c b/backend/medical.c index a69f5870..63b0c25a 100644 --- a/backend/medical.c +++ b/backend/medical.c @@ -76,7 +76,7 @@ INTERNAL int pharma_one(struct zint_symbol *symbol, unsigned char source[], int return error_number; } - tester = atoi((char*) source); + tester = atoi((char *) source); if ((tester < 3) || (tester > 131070)) { strcpy(symbol->errtxt, "352: Data out of range (3 to 131070)"); @@ -126,7 +126,7 @@ static int pharma_two_calc(struct zint_symbol *symbol, unsigned char source[], c char inter[17]; int error_number; - tester = atoi((char*) source); + tester = atoi((char *) source); if ((tester < 4) || (tester > 64570080)) { strcpy(symbol->errtxt, "353: Data out of range (4 to 64570080)"); @@ -361,7 +361,7 @@ INTERNAL int code32(struct zint_symbol *symbol, unsigned char source[], int leng } risultante[6] = '\0'; /* Plot the barcode using Code 39 */ - error_number = c39(symbol, (unsigned char*) risultante, (int) strlen(risultante)); + error_number = c39(symbol, (unsigned char *) risultante, (int) strlen(risultante)); if (error_number != 0) { /* Should never happen */ return error_number; /* Not reached */ } diff --git a/backend/pdf417.c b/backend/pdf417.c index 2cae1fc4..5bea1954 100644 --- a/backend/pdf417.c +++ b/backend/pdf417.c @@ -97,7 +97,7 @@ static const char MicroAutosize[56] = { /* 866 */ -static int quelmode(unsigned char codeascii) { +static int quelmode(const unsigned char codeascii) { if ((codeascii <= '9') && (codeascii >= '0')) { return NUM; } @@ -234,7 +234,8 @@ static void pdfsmooth(int liste[2][PDF417_MAX_LEN], int *indexliste) { } /* 547 */ -static void textprocess(int *chainemc, int *mclength, char chaine[], int start, int length, int is_micro) { +static void textprocess(int *chainemc, int *mclength, const unsigned char chaine[], int start, const int length, + const int is_micro) { int j, indexlistet, curtable, listet[2][PDF417_MAX_LEN] = {{0}}, chainet[PDF417_MAX_LEN], wnet; wnet = 0; @@ -396,7 +397,8 @@ static void textprocess(int *chainemc, int *mclength, char chaine[], int start, } /* 671 */ -INTERNAL void byteprocess(int *chainemc, int *mclength, unsigned char chaine[], int start, int length, int debug) { +INTERNAL void byteprocess(int *chainemc, int *mclength, const unsigned char chaine[], int start, const int length, + const int debug) { if (debug) printf("\nEntering byte mode at position %d\n", start); @@ -453,7 +455,7 @@ INTERNAL void byteprocess(int *chainemc, int *mclength, unsigned char chaine[], } /* 712 */ -static void numbprocess(int *chainemc, int *mclength, char chaine[], int start, int length) { +static void numbprocess(int *chainemc, int *mclength, const unsigned char chaine[], int start, const int length) { int j, loop, dummy[50] = {0}, diviseur, nombre; char chainemod[46], chainemult[46]; @@ -596,13 +598,13 @@ static int pdf417(struct zint_symbol *symbol, unsigned char chaine[], const int for (i = 0; i < indexliste; i++) { switch (liste[1][i]) { case TEX: /* 547 - text mode */ - textprocess(chainemc, &mclength, (char*) chaine, indexchaine, liste[0][i], 0 /*is_micro*/); + textprocess(chainemc, &mclength, chaine, indexchaine, liste[0][i], 0 /*is_micro*/); break; case BYT: /* 670 - octet stream mode */ byteprocess(chainemc, &mclength, chaine, indexchaine, liste[0][i], debug); break; case NUM: /* 712 - numeric mode */ - numbprocess(chainemc, &mclength, (char*) chaine, indexchaine, liste[0][i]); + numbprocess(chainemc, &mclength, chaine, indexchaine, liste[0][i]); break; } indexchaine = indexchaine + liste[0][i]; @@ -920,13 +922,13 @@ INTERNAL int micro_pdf417(struct zint_symbol *symbol, unsigned char chaine[], in for (i = 0; i < indexliste; i++) { switch (liste[1][i]) { case TEX: /* 547 - text mode */ - textprocess(chainemc, &mclength, (char*) chaine, indexchaine, liste[0][i], 1 /*is_micro*/); + textprocess(chainemc, &mclength, chaine, indexchaine, liste[0][i], 1 /*is_micro*/); break; case BYT: /* 670 - octet stream mode */ byteprocess(chainemc, &mclength, chaine, indexchaine, liste[0][i], debug); break; case NUM: /* 712 - numeric mode */ - numbprocess(chainemc, &mclength, (char*) chaine, indexchaine, liste[0][i]); + numbprocess(chainemc, &mclength, chaine, indexchaine, liste[0][i]); break; } indexchaine = indexchaine + liste[0][i]; diff --git a/backend/pdf417.h b/backend/pdf417.h index 29ad5a41..854e4a51 100644 --- a/backend/pdf417.h +++ b/backend/pdf417.h @@ -508,6 +508,7 @@ static const unsigned short int rap_centre[52] = { 0x2DC, 0x2DE }; -INTERNAL void byteprocess(int *chainemc, int *mclength, unsigned char chaine[], int start, int length, int debug); +INTERNAL void byteprocess(int *chainemc, int *mclength, const unsigned char chaine[], int start, const int length, + const int debug); #endif /* __PDF417_H */ diff --git a/backend/plessey.c b/backend/plessey.c index ae33bee1..f904d60a 100644 --- a/backend/plessey.c +++ b/backend/plessey.c @@ -66,6 +66,7 @@ INTERNAL int plessey(struct zint_symbol *symbol, unsigned char source[], int len strcpy(symbol->errtxt, "371: Invalid character in data (digits and \"ABCDEF\" only)"); return error_number; } + if (!(checkptr = (unsigned char *) calloc(1, length * 4 + 8))) { strcpy(symbol->errtxt, "373: Insufficient memory for check digit CRC buffer"); return ZINT_ERROR_MEMORY; @@ -128,10 +129,8 @@ static char msi_check_digit_mod10(const unsigned char source[], const int length int i, x = 0, undoubled = 0; for (i = length - 1; i >= 0; i--) { + /* Note overflow impossible for max length 65 * max weight 9 * max val 15 == 8775 */ x += vals[undoubled][ctoi(source[i])]; - if (x > 32767 - 20) { - x %= 10; /* Prevent overflow */ - } undoubled = !undoubled; } @@ -144,10 +143,8 @@ static char msi_check_digit_mod11(const unsigned char source[], const int length int i, x = 0, weight = 2; for (i = length - 1; i >= 0; i--) { + /* Note overflow impossible for max length 65 * max weight 9 * max val 15 == 8775 */ x += weight * ctoi(source[i]); - if (x > 32767 - 200) { - x %= 11; /* Prevent overflow */ - } weight++; if (weight > wrap) { weight = 2; @@ -299,17 +296,16 @@ INTERNAL int msi_handle(struct zint_symbol *symbol, unsigned char source[], int int check_option = symbol->option_2; int no_checktext = 0; + if (length > 65) { + strcpy(symbol->errtxt, "372: Input too long (65 character maximum)"); + return ZINT_ERROR_TOO_LONG; + } error_number = is_sane(NEON, source, length); if (error_number != 0) { strcpy(symbol->errtxt, "377: Invalid character in data (digits only)"); return ZINT_ERROR_INVALID_DATA; } - if (length > 65) { - strcpy(symbol->errtxt, "372: Input too long (65 character maximum)"); - return ZINT_ERROR_TOO_LONG; - } - if (check_option >= 11 && check_option <= 16) { /* +10 means don't print check digits in HRT */ check_option -= 10; no_checktext = 1; diff --git a/backend/png.c b/backend/png.c index 58556682..431ed2fe 100644 --- a/backend/png.c +++ b/backend/png.c @@ -111,7 +111,7 @@ INTERNAL int png_pixel_plot(struct zint_symbol *symbol, unsigned char *pixelbuf) #ifndef _MSC_VER unsigned char outdata[symbol->bitmap_width]; #else - unsigned char* outdata = (unsigned char*) _alloca(symbol->bitmap_width); + unsigned char *outdata = (unsigned char *) _alloca(symbol->bitmap_width); #endif wpng_error.symbol = symbol; diff --git a/backend/postal.c b/backend/postal.c index 351b040d..d6b59b14 100644 --- a/backend/postal.c +++ b/backend/postal.c @@ -272,7 +272,7 @@ INTERNAL int korea_post(struct zint_symbol *symbol, unsigned char source[], int } zeroes = 6 - length; memset(localstr, '0', zeroes); - strcpy(localstr + zeroes, (char *) source); + ustrcpy(localstr + zeroes, source); total = 0; for (loop = 0; loop < 6; loop++) { @@ -290,7 +290,7 @@ INTERNAL int korea_post(struct zint_symbol *symbol, unsigned char source[], int } lookup(NEON, KoreaTable, localstr[6], dest); expand(symbol, dest); - ustrcpy(symbol->text, (unsigned char*) localstr); + ustrcpy(symbol->text, localstr); // TODO: Find documentation on BARCODE_KOREAPOST dimensions/height @@ -492,7 +492,7 @@ INTERNAL int kix_code(struct zint_symbol *symbol, unsigned char source[], int le return error_number; } - strcpy(localstr, (char *) source); + ustrcpy(localstr, source); /* Encode data */ for (i = 0; i < length; i++) { @@ -540,8 +540,8 @@ INTERNAL int daft_code(struct zint_symbol *symbol, unsigned char source[], int l strcpy(symbol->errtxt, "492: Input too long (50 character maximum)"); return ZINT_ERROR_TOO_LONG; } - to_upper((unsigned char*) source); - error_number = is_sane(DAFTSET, (unsigned char*) source, length); + to_upper(source); + error_number = is_sane(DAFTSET, source, length); if (error_number == ZINT_ERROR_INVALID_DATA) { strcpy(symbol->errtxt, "493: Invalid character in data (\"D\", \"A\", \"F\" and \"T\" only)"); @@ -632,9 +632,9 @@ INTERNAL int japan_post(struct zint_symbol *symbol, unsigned char source[], int char inter[23]; #ifndef _MSC_VER - char local_source[length + 1]; + unsigned char local_source[length + 1]; #else - char* local_source = (char*) _alloca(length + 1); + unsigned char *local_source = (unsigned char *) _alloca(length + 1); #endif if (length > 20) { @@ -642,10 +642,10 @@ INTERNAL int japan_post(struct zint_symbol *symbol, unsigned char source[], int return ZINT_ERROR_TOO_LONG; } - strcpy(local_source, (char*) source); - to_upper((unsigned char*) local_source); + ustrcpy(local_source, source); + to_upper(local_source); - if (is_sane(SHKASUTSET, (unsigned char*) local_source, length) == ZINT_ERROR_INVALID_DATA) { + if (is_sane(SHKASUTSET, local_source, length) == ZINT_ERROR_INVALID_DATA) { strcpy(symbol->errtxt, "497: Invalid character in data (alphanumerics and \"-\" only)"); return ZINT_ERROR_INVALID_DATA; } diff --git a/backend/qr.c b/backend/qr.c index 11371984..2a427973 100644 --- a/backend/qr.c +++ b/backend/qr.c @@ -962,6 +962,8 @@ static int cwbit(const unsigned char *fullstream, const int i) { static void populate_grid(unsigned char *grid, const int h_size, const int v_size, const unsigned char *fullstream, const int cw) { + const int not_rmqr = v_size == h_size; + const int x_start = h_size - (not_rmqr ? 2 : 3); /* For rMQR allow for righthand vertical timing pattern */ int direction = 1; /* up */ int row = 0; /* right hand side */ @@ -971,10 +973,10 @@ static void populate_grid(unsigned char *grid, const int h_size, const int v_siz y = v_size - 1; i = 0; while (i < n) { - int x = (h_size - 2) - (row * 2); + int x = x_start - (row * 2); int r = y * h_size; - if ((x < 6) && (v_size == h_size)) + if ((x < 6) && (not_rmqr)) x--; /* skip over vertical timing pattern */ if (!(grid[r + (x + 1)] & 0xf0)) { @@ -2601,6 +2603,10 @@ INTERNAL int microqr(struct zint_symbol *symbol, unsigned char source[], int len break; } + if (debug_print) { + printf("Version: M%d, Size: %dx%d, ECC: %d, Format %d\n", version + 1, size, size, ecc_level, format); + } + format_full = qr_annex_c1[(format << 2) + bitmask]; if (format_full & 0x4000) { @@ -2837,7 +2843,7 @@ static void setup_rmqr_grid(unsigned char *grid, const int h_size, const int v_s } if (v_size > 7) { // Note for v_size = 9 this overrides the bottom right corner finder pattern - for(i = 0; i < 8; i++) { + for (i = 0; i < 8; i++) { grid[(7 * h_size) + i] = 0x20; } } @@ -2845,14 +2851,14 @@ static void setup_rmqr_grid(unsigned char *grid, const int h_size, const int v_s /* Add alignment patterns */ if (h_size > 27) { h_version = 0; // Suppress compiler warning [-Wmaybe-uninitialized] - for(i = 0; i < 5; i++) { + for (i = 0; i < 5; i++) { if (h_size == rmqr_width[i]) { h_version = i; break; } } - for(i = 0; i < 4; i++) { + for (i = 0; i < 4; i++) { finder_position = rmqr_table_d1[(h_version * 4) + i]; if (finder_position != 0) { @@ -3000,7 +3006,7 @@ INTERNAL int rmqr(struct zint_symbol *symbol, unsigned char source[], int length if (symbol->option_2 >= 33) { // User has specified symbol height only version = rmqr_fixed_height_upper_bound[symbol->option_2 - 32]; - for(i = version - 1; i > rmqr_fixed_height_upper_bound[symbol->option_2 - 33]; i--) { + for (i = version - 1; i > rmqr_fixed_height_upper_bound[symbol->option_2 - 33]; i--) { est_binlen = getBinaryLength(RMQR_VERSION + i, mode, jisdata, length, gs1, 0 /*eci*/, debug_print); if (ecc_level == LEVEL_M) { if (8 * rmqr_data_codewords_M[i] >= est_binlen) { @@ -3117,7 +3123,6 @@ INTERNAL int rmqr(struct zint_symbol *symbol, unsigned char source[], int length grid[(h_size * (v_size - 6)) + (h_size - 4)] = (right_format_info >> 16) & 0x01; grid[(h_size * (v_size - 6)) + (h_size - 3)] = (right_format_info >> 17) & 0x01; - symbol->width = h_size; symbol->rows = v_size; diff --git a/backend/qr.h b/backend/qr.h index 81004c65..21fd42f7 100644 --- a/backend/qr.h +++ b/backend/qr.h @@ -123,14 +123,14 @@ static const unsigned short int rmqr_total_codewords[] = { static const unsigned short int rmqr_numeric_cci[] = { 4, 5, 6, 7, 7, 5, 6, 7, 7, 8, - 5, 6, 7, 7, 8, 8, - 5, 7, 7, 8, 8, 8, + 4, 6, 7, 7, 8, 8, + 5, 6, 7, 8, 8, 8, // Note R13x77 (4th) 8 bits but max numerics 124 (7 bits) 7, 7, 8, 8, 9, 7, 8, 8, 8, 9 }; static const unsigned short int rmqr_alphanum_cci[] = { - 4, 5, 5, 6, 6, + 3, 5, 5, 6, 6, 5, 5, 6, 6, 7, 4, 5, 6, 6, 7, 7, 5, 6, 6, 7, 7, 8, diff --git a/backend/raster.c b/backend/raster.c index c718d672..06a8fc0c 100644 --- a/backend/raster.c +++ b/backend/raster.c @@ -299,8 +299,9 @@ static void draw_letter(unsigned char *pixelbuf, const unsigned char letter, int skip = 1; } + /* Following should never happen (ISBN check digit "X" not printed) */ if ((textflags & UPCEAN_TEXT) && (letter < '0' || letter > '9')) { - skip = 1; + skip = 1; /* Not reached */ } if (yposn < 0) { /* Allow xposn < 0, dealt with below */ diff --git a/backend/tests/data/eps/maxicode_no_bg_hwsp3_rotate_180.eps b/backend/tests/data/eps/maxicode_no_bg_hwsp3_rotate_180.eps new file mode 100644 index 00000000..2dad2ac6 --- /dev/null +++ b/backend/tests/data/eps/maxicode_no_bg_hwsp3_rotate_180.eps @@ -0,0 +1,379 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: Zint 2.9.1.9 +%%Title: Zint Generated Symbol +%%Pages: 0 +%%BoundingBox: 0 0 72 58 +%%EndComments +/TL { setlinewidth moveto lineto stroke } bind def +/TD { newpath 0 360 arc fill } bind def +/TH { 0 setlinewidth moveto lineto lineto lineto lineto lineto closepath fill } bind def +/TB { 2 copy } bind def +/TR { newpath 4 1 roll exch moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto closepath fill } bind def +/TE { pop pop } bind def +newpath +0.00 0.00 0.00 setrgbcolor +63.00 2.15 63.87 1.65 63.87 0.65 63.00 0.15 62.13 0.65 62.13 1.65 TH +59.00 2.15 59.87 1.65 59.87 0.65 59.00 0.15 58.13 0.65 58.13 1.65 TH +55.00 2.15 55.87 1.65 55.87 0.65 55.00 0.15 54.13 0.65 54.13 1.65 TH +51.00 2.15 51.87 1.65 51.87 0.65 51.00 0.15 50.13 0.65 50.13 1.65 TH +47.00 2.15 47.87 1.65 47.87 0.65 47.00 0.15 46.13 0.65 46.13 1.65 TH +43.00 2.15 43.87 1.65 43.87 0.65 43.00 0.15 42.13 0.65 42.13 1.65 TH +39.00 2.15 39.87 1.65 39.87 0.65 39.00 0.15 38.13 0.65 38.13 1.65 TH +35.00 2.15 35.87 1.65 35.87 0.65 35.00 0.15 34.13 0.65 34.13 1.65 TH +31.00 2.15 31.87 1.65 31.87 0.65 31.00 0.15 30.13 0.65 30.13 1.65 TH +27.00 2.15 27.87 1.65 27.87 0.65 27.00 0.15 26.13 0.65 26.13 1.65 TH +23.00 2.15 23.87 1.65 23.87 0.65 23.00 0.15 22.13 0.65 22.13 1.65 TH +19.00 2.15 19.87 1.65 19.87 0.65 19.00 0.15 18.13 0.65 18.13 1.65 TH +15.00 2.15 15.87 1.65 15.87 0.65 15.00 0.15 14.13 0.65 14.13 1.65 TH +11.00 2.15 11.87 1.65 11.87 0.65 11.00 0.15 10.13 0.65 10.13 1.65 TH +9.00 2.15 9.87 1.65 9.87 0.65 9.00 0.15 8.13 0.65 8.13 1.65 TH +7.00 2.15 7.87 1.65 7.87 0.65 7.00 0.15 6.13 0.65 6.13 1.65 TH +65.00 5.62 65.87 5.12 65.87 4.12 65.00 3.62 64.13 4.12 64.13 5.12 TH +61.00 5.62 61.87 5.12 61.87 4.12 61.00 3.62 60.13 4.12 60.13 5.12 TH +57.00 5.62 57.87 5.12 57.87 4.12 57.00 3.62 56.13 4.12 56.13 5.12 TH +53.00 5.62 53.87 5.12 53.87 4.12 53.00 3.62 52.13 4.12 52.13 5.12 TH +49.00 5.62 49.87 5.12 49.87 4.12 49.00 3.62 48.13 4.12 48.13 5.12 TH +45.00 5.62 45.87 5.12 45.87 4.12 45.00 3.62 44.13 4.12 44.13 5.12 TH +41.00 5.62 41.87 5.12 41.87 4.12 41.00 3.62 40.13 4.12 40.13 5.12 TH +37.00 5.62 37.87 5.12 37.87 4.12 37.00 3.62 36.13 4.12 36.13 5.12 TH +33.00 5.62 33.87 5.12 33.87 4.12 33.00 3.62 32.13 4.12 32.13 5.12 TH +29.00 5.62 29.87 5.12 29.87 4.12 29.00 3.62 28.13 4.12 28.13 5.12 TH +25.00 5.62 25.87 5.12 25.87 4.12 25.00 3.62 24.13 4.12 24.13 5.12 TH +21.00 5.62 21.87 5.12 21.87 4.12 21.00 3.62 20.13 4.12 20.13 5.12 TH +17.00 5.62 17.87 5.12 17.87 4.12 17.00 3.62 16.13 4.12 16.13 5.12 TH +13.00 5.62 13.87 5.12 13.87 4.12 13.00 3.62 12.13 4.12 12.13 5.12 TH +9.00 5.62 9.87 5.12 9.87 4.12 9.00 3.62 8.13 4.12 8.13 5.12 TH +62.00 7.35 62.87 6.85 62.87 5.85 62.00 5.35 61.13 5.85 61.13 6.85 TH +58.00 7.35 58.87 6.85 58.87 5.85 58.00 5.35 57.13 5.85 57.13 6.85 TH +54.00 7.35 54.87 6.85 54.87 5.85 54.00 5.35 53.13 5.85 53.13 6.85 TH +50.00 7.35 50.87 6.85 50.87 5.85 50.00 5.35 49.13 5.85 49.13 6.85 TH +46.00 7.35 46.87 6.85 46.87 5.85 46.00 5.35 45.13 5.85 45.13 6.85 TH +42.00 7.35 42.87 6.85 42.87 5.85 42.00 5.35 41.13 5.85 41.13 6.85 TH +38.00 7.35 38.87 6.85 38.87 5.85 38.00 5.35 37.13 5.85 37.13 6.85 TH +34.00 7.35 34.87 6.85 34.87 5.85 34.00 5.35 33.13 5.85 33.13 6.85 TH +30.00 7.35 30.87 6.85 30.87 5.85 30.00 5.35 29.13 5.85 29.13 6.85 TH +26.00 7.35 26.87 6.85 26.87 5.85 26.00 5.35 25.13 5.85 25.13 6.85 TH +22.00 7.35 22.87 6.85 22.87 5.85 22.00 5.35 21.13 5.85 21.13 6.85 TH +18.00 7.35 18.87 6.85 18.87 5.85 18.00 5.35 17.13 5.85 17.13 6.85 TH +14.00 7.35 14.87 6.85 14.87 5.85 14.00 5.35 13.13 5.85 13.13 6.85 TH +10.00 7.35 10.87 6.85 10.87 5.85 10.00 5.35 9.13 5.85 9.13 6.85 TH +8.00 7.35 8.87 6.85 8.87 5.85 8.00 5.35 7.13 5.85 7.13 6.85 TH +7.00 9.08 7.87 8.58 7.87 7.58 7.00 7.08 6.13 7.58 6.13 8.58 TH +64.00 10.81 64.87 10.31 64.87 9.31 64.00 8.81 63.13 9.31 63.13 10.31 TH +60.00 10.81 60.87 10.31 60.87 9.31 60.00 8.81 59.13 9.31 59.13 10.31 TH +56.00 10.81 56.87 10.31 56.87 9.31 56.00 8.81 55.13 9.31 55.13 10.31 TH +52.00 10.81 52.87 10.31 52.87 9.31 52.00 8.81 51.13 9.31 51.13 10.31 TH +48.00 10.81 48.87 10.31 48.87 9.31 48.00 8.81 47.13 9.31 47.13 10.31 TH +44.00 10.81 44.87 10.31 44.87 9.31 44.00 8.81 43.13 9.31 43.13 10.31 TH +40.00 10.81 40.87 10.31 40.87 9.31 40.00 8.81 39.13 9.31 39.13 10.31 TH +36.00 10.81 36.87 10.31 36.87 9.31 36.00 8.81 35.13 9.31 35.13 10.31 TH +32.00 10.81 32.87 10.31 32.87 9.31 32.00 8.81 31.13 9.31 31.13 10.31 TH +28.00 10.81 28.87 10.31 28.87 9.31 28.00 8.81 27.13 9.31 27.13 10.31 TH +24.00 10.81 24.87 10.31 24.87 9.31 24.00 8.81 23.13 9.31 23.13 10.31 TH +20.00 10.81 20.87 10.31 20.87 9.31 20.00 8.81 19.13 9.31 19.13 10.31 TH +16.00 10.81 16.87 10.31 16.87 9.31 16.00 8.81 15.13 9.31 15.13 10.31 TH +12.00 10.81 12.87 10.31 12.87 9.31 12.00 8.81 11.13 9.31 11.13 10.31 TH +63.00 12.55 63.87 12.05 63.87 11.05 63.00 10.55 62.13 11.05 62.13 12.05 TH +59.00 12.55 59.87 12.05 59.87 11.05 59.00 10.55 58.13 11.05 58.13 12.05 TH +55.00 12.55 55.87 12.05 55.87 11.05 55.00 10.55 54.13 11.05 54.13 12.05 TH +51.00 12.55 51.87 12.05 51.87 11.05 51.00 10.55 50.13 11.05 50.13 12.05 TH +47.00 12.55 47.87 12.05 47.87 11.05 47.00 10.55 46.13 11.05 46.13 12.05 TH +43.00 12.55 43.87 12.05 43.87 11.05 43.00 10.55 42.13 11.05 42.13 12.05 TH +39.00 12.55 39.87 12.05 39.87 11.05 39.00 10.55 38.13 11.05 38.13 12.05 TH +35.00 12.55 35.87 12.05 35.87 11.05 35.00 10.55 34.13 11.05 34.13 12.05 TH +31.00 12.55 31.87 12.05 31.87 11.05 31.00 10.55 30.13 11.05 30.13 12.05 TH +27.00 12.55 27.87 12.05 27.87 11.05 27.00 10.55 26.13 11.05 26.13 12.05 TH +23.00 12.55 23.87 12.05 23.87 11.05 23.00 10.55 22.13 11.05 22.13 12.05 TH +19.00 12.55 19.87 12.05 19.87 11.05 19.00 10.55 18.13 11.05 18.13 12.05 TH +15.00 12.55 15.87 12.05 15.87 11.05 15.00 10.55 14.13 11.05 14.13 12.05 TH +11.00 12.55 11.87 12.05 11.87 11.05 11.00 10.55 10.13 11.05 10.13 12.05 TH +9.00 12.55 9.87 12.05 9.87 11.05 9.00 10.55 8.13 11.05 8.13 12.05 TH +8.00 14.28 8.87 13.78 8.87 12.78 8.00 12.28 7.13 12.78 7.13 13.78 TH +65.00 16.01 65.87 15.51 65.87 14.51 65.00 14.01 64.13 14.51 64.13 15.51 TH +61.00 16.01 61.87 15.51 61.87 14.51 61.00 14.01 60.13 14.51 60.13 15.51 TH +57.00 16.01 57.87 15.51 57.87 14.51 57.00 14.01 56.13 14.51 56.13 15.51 TH +53.00 16.01 53.87 15.51 53.87 14.51 53.00 14.01 52.13 14.51 52.13 15.51 TH +49.00 16.01 49.87 15.51 49.87 14.51 49.00 14.01 48.13 14.51 48.13 15.51 TH +45.00 16.01 45.87 15.51 45.87 14.51 45.00 14.01 44.13 14.51 44.13 15.51 TH +41.00 16.01 41.87 15.51 41.87 14.51 41.00 14.01 40.13 14.51 40.13 15.51 TH +37.00 16.01 37.87 15.51 37.87 14.51 37.00 14.01 36.13 14.51 36.13 15.51 TH +33.00 16.01 33.87 15.51 33.87 14.51 33.00 14.01 32.13 14.51 32.13 15.51 TH +29.00 16.01 29.87 15.51 29.87 14.51 29.00 14.01 28.13 14.51 28.13 15.51 TH +25.00 16.01 25.87 15.51 25.87 14.51 25.00 14.01 24.13 14.51 24.13 15.51 TH +21.00 16.01 21.87 15.51 21.87 14.51 21.00 14.01 20.13 14.51 20.13 15.51 TH +17.00 16.01 17.87 15.51 17.87 14.51 17.00 14.01 16.13 14.51 16.13 15.51 TH +13.00 16.01 13.87 15.51 13.87 14.51 13.00 14.01 12.13 14.51 12.13 15.51 TH +7.00 16.01 7.87 15.51 7.87 14.51 7.00 14.01 6.13 14.51 6.13 15.51 TH +62.00 17.74 62.87 17.24 62.87 16.24 62.00 15.74 61.13 16.24 61.13 17.24 TH +58.00 17.74 58.87 17.24 58.87 16.24 58.00 15.74 57.13 16.24 57.13 17.24 TH +54.00 17.74 54.87 17.24 54.87 16.24 54.00 15.74 53.13 16.24 53.13 17.24 TH +50.00 17.74 50.87 17.24 50.87 16.24 50.00 15.74 49.13 16.24 49.13 17.24 TH +46.00 17.74 46.87 17.24 46.87 16.24 46.00 15.74 45.13 16.24 45.13 17.24 TH +44.00 17.74 44.87 17.24 44.87 16.24 44.00 15.74 43.13 16.24 43.13 17.24 TH +42.00 17.74 42.87 17.24 42.87 16.24 42.00 15.74 41.13 16.24 41.13 17.24 TH +40.00 17.74 40.87 17.24 40.87 16.24 40.00 15.74 39.13 16.24 39.13 17.24 TH +38.00 17.74 38.87 17.24 38.87 16.24 38.00 15.74 37.13 16.24 37.13 17.24 TH +34.00 17.74 34.87 17.24 34.87 16.24 34.00 15.74 33.13 16.24 33.13 17.24 TH +24.00 17.74 24.87 17.24 24.87 16.24 24.00 15.74 23.13 16.24 23.13 17.24 TH +18.00 17.74 18.87 17.24 18.87 16.24 18.00 15.74 17.13 16.24 17.13 17.24 TH +14.00 17.74 14.87 17.24 14.87 16.24 14.00 15.74 13.13 16.24 13.13 17.24 TH +10.00 17.74 10.87 17.24 10.87 16.24 10.00 15.74 9.13 16.24 9.13 17.24 TH +43.00 19.47 43.87 18.97 43.87 17.97 43.00 17.47 42.13 17.97 42.13 18.97 TH +33.00 19.47 33.87 18.97 33.87 17.97 33.00 17.47 32.13 17.97 32.13 18.97 TH +23.00 19.47 23.87 18.97 23.87 17.97 23.00 17.47 22.13 17.97 22.13 18.97 TH +64.00 21.21 64.87 20.71 64.87 19.71 64.00 19.21 63.13 19.71 63.13 20.71 TH +60.00 21.21 60.87 20.71 60.87 19.71 60.00 19.21 59.13 19.71 59.13 20.71 TH +56.00 21.21 56.87 20.71 56.87 19.71 56.00 19.21 55.13 19.71 55.13 20.71 TH +52.00 21.21 52.87 20.71 52.87 19.71 52.00 19.21 51.13 19.71 51.13 20.71 TH +46.00 21.21 46.87 20.71 46.87 19.71 46.00 19.21 45.13 19.71 45.13 20.71 TH +44.00 21.21 44.87 20.71 44.87 19.71 44.00 19.21 43.13 19.71 43.13 20.71 TH +28.00 21.21 28.87 20.71 28.87 19.71 28.00 19.21 27.13 19.71 27.13 20.71 TH +22.00 21.21 22.87 20.71 22.87 19.71 22.00 19.21 21.13 19.71 21.13 20.71 TH +20.00 21.21 20.87 20.71 20.87 19.71 20.00 19.21 19.13 19.71 19.13 20.71 TH +16.00 21.21 16.87 20.71 16.87 19.71 16.00 19.21 15.13 19.71 15.13 20.71 TH +12.00 21.21 12.87 20.71 12.87 19.71 12.00 19.21 11.13 19.71 11.13 20.71 TH +8.00 21.21 8.87 20.71 8.87 19.71 8.00 19.21 7.13 19.71 7.13 20.71 TH +63.00 22.94 63.87 22.44 63.87 21.44 63.00 20.94 62.13 21.44 62.13 22.44 TH +59.00 22.94 59.87 22.44 59.87 21.44 59.00 20.94 58.13 21.44 58.13 22.44 TH +55.00 22.94 55.87 22.44 55.87 21.44 55.00 20.94 54.13 21.44 54.13 22.44 TH +51.00 22.94 51.87 22.44 51.87 21.44 51.00 20.94 50.13 21.44 50.13 22.44 TH +47.00 22.94 47.87 22.44 47.87 21.44 47.00 20.94 46.13 21.44 46.13 22.44 TH +45.00 22.94 45.87 22.44 45.87 21.44 45.00 20.94 44.13 21.44 44.13 22.44 TH +23.00 22.94 23.87 22.44 23.87 21.44 23.00 20.94 22.13 21.44 22.13 22.44 TH +19.00 22.94 19.87 22.44 19.87 21.44 19.00 20.94 18.13 21.44 18.13 22.44 TH +15.00 22.94 15.87 22.44 15.87 21.44 15.00 20.94 14.13 21.44 14.13 22.44 TH +11.00 22.94 11.87 22.44 11.87 21.44 11.00 20.94 10.13 21.44 10.13 22.44 TH +9.00 22.94 9.87 22.44 9.87 21.44 9.00 20.94 8.13 21.44 8.13 22.44 TH +50.00 24.67 50.87 24.17 50.87 23.17 50.00 22.67 49.13 23.17 49.13 24.17 TH +22.00 24.67 22.87 24.17 22.87 23.17 22.00 22.67 21.13 23.17 21.13 24.17 TH +65.00 26.40 65.87 25.90 65.87 24.90 65.00 24.40 64.13 24.90 64.13 25.90 TH +61.00 26.40 61.87 25.90 61.87 24.90 61.00 24.40 60.13 24.90 60.13 25.90 TH +57.00 26.40 57.87 25.90 57.87 24.90 57.00 24.40 56.13 24.90 56.13 25.90 TH +49.00 26.40 49.87 25.90 49.87 24.90 49.00 24.40 48.13 24.90 48.13 25.90 TH +27.00 26.40 27.87 25.90 27.87 24.90 27.00 24.40 26.13 24.90 26.13 25.90 TH +25.00 26.40 25.87 25.90 25.87 24.90 25.00 24.40 24.13 24.90 24.13 25.90 TH +21.00 26.40 21.87 25.90 21.87 24.90 21.00 24.40 20.13 24.90 20.13 25.90 TH +17.00 26.40 17.87 25.90 17.87 24.90 17.00 24.40 16.13 24.90 16.13 25.90 TH +13.00 26.40 13.87 25.90 13.87 24.90 13.00 24.40 12.13 24.90 12.13 25.90 TH +62.00 28.13 62.87 27.63 62.87 26.63 62.00 26.13 61.13 26.63 61.13 27.63 TH +58.00 28.13 58.87 27.63 58.87 26.63 58.00 26.13 57.13 26.63 57.13 27.63 TH +54.00 28.13 54.87 27.63 54.87 26.63 54.00 26.13 53.13 26.63 53.13 27.63 TH +52.00 28.13 52.87 27.63 52.87 26.63 52.00 26.13 51.13 26.63 51.13 27.63 TH +50.00 28.13 50.87 27.63 50.87 26.63 50.00 26.13 49.13 26.63 49.13 27.63 TH +48.00 28.13 48.87 27.63 48.87 26.63 48.00 26.13 47.13 26.63 47.13 27.63 TH +24.00 28.13 24.87 27.63 24.87 26.63 24.00 26.13 23.13 26.63 23.13 27.63 TH +18.00 28.13 18.87 27.63 18.87 26.63 18.00 26.13 17.13 26.63 17.13 27.63 TH +14.00 28.13 14.87 27.63 14.87 26.63 14.00 26.13 13.13 26.63 13.13 27.63 TH +10.00 28.13 10.87 27.63 10.87 26.63 10.00 26.13 9.13 26.63 9.13 27.63 TH +8.00 28.13 8.87 27.63 8.87 26.63 8.00 26.13 7.13 26.63 7.13 27.63 TH +49.00 29.87 49.87 29.37 49.87 28.37 49.00 27.87 48.13 28.37 48.13 29.37 TH +25.00 29.87 25.87 29.37 25.87 28.37 25.00 27.87 24.13 28.37 24.13 29.37 TH +9.00 29.87 9.87 29.37 9.87 28.37 9.00 27.87 8.13 28.37 8.13 29.37 TH +64.00 31.60 64.87 31.10 64.87 30.10 64.00 29.60 63.13 30.10 63.13 31.10 TH +60.00 31.60 60.87 31.10 60.87 30.10 60.00 29.60 59.13 30.10 59.13 31.10 TH +56.00 31.60 56.87 31.10 56.87 30.10 56.00 29.60 55.13 30.10 55.13 31.10 TH +24.00 31.60 24.87 31.10 24.87 30.10 24.00 29.60 23.13 30.10 23.13 31.10 TH +22.00 31.60 22.87 31.10 22.87 30.10 22.00 29.60 21.13 30.10 21.13 31.10 TH +20.00 31.60 20.87 31.10 20.87 30.10 20.00 29.60 19.13 30.10 19.13 31.10 TH +16.00 31.60 16.87 31.10 16.87 30.10 16.00 29.60 15.13 30.10 15.13 31.10 TH +12.00 31.60 12.87 31.10 12.87 30.10 12.00 29.60 11.13 30.10 11.13 31.10 TH +63.00 33.33 63.87 32.83 63.87 31.83 63.00 31.33 62.13 31.83 62.13 32.83 TH +59.00 33.33 59.87 32.83 59.87 31.83 59.00 31.33 58.13 31.83 58.13 32.83 TH +55.00 33.33 55.87 32.83 55.87 31.83 55.00 31.33 54.13 31.83 54.13 32.83 TH +51.00 33.33 51.87 32.83 51.87 31.83 51.00 31.33 50.13 31.83 50.13 32.83 TH +49.00 33.33 49.87 32.83 49.87 31.83 49.00 31.33 48.13 31.83 48.13 32.83 TH +47.00 33.33 47.87 32.83 47.87 31.83 47.00 31.33 46.13 31.83 46.13 32.83 TH +23.00 33.33 23.87 32.83 23.87 31.83 23.00 31.33 22.13 31.83 22.13 32.83 TH +19.00 33.33 19.87 32.83 19.87 31.83 19.00 31.33 18.13 31.83 18.13 32.83 TH +15.00 33.33 15.87 32.83 15.87 31.83 15.00 31.33 14.13 31.83 14.13 32.83 TH +11.00 33.33 11.87 32.83 11.87 31.83 11.00 31.33 10.13 31.83 10.13 32.83 TH +9.00 33.33 9.87 32.83 9.87 31.83 9.00 31.33 8.13 31.83 8.13 32.83 TH +7.00 33.33 7.87 32.83 7.87 31.83 7.00 31.33 6.13 31.83 6.13 32.83 TH +48.00 35.06 48.87 34.56 48.87 33.56 48.00 33.06 47.13 33.56 47.13 34.56 TH +8.00 35.06 8.87 34.56 8.87 33.56 8.00 33.06 7.13 33.56 7.13 34.56 TH +65.00 36.79 65.87 36.29 65.87 35.29 65.00 34.79 64.13 35.29 64.13 36.29 TH +61.00 36.79 61.87 36.29 61.87 35.29 61.00 34.79 60.13 35.29 60.13 36.29 TH +57.00 36.79 57.87 36.29 57.87 35.29 57.00 34.79 56.13 35.29 56.13 36.29 TH +53.00 36.79 53.87 36.29 53.87 35.29 53.00 34.79 52.13 35.29 52.13 36.29 TH +51.00 36.79 51.87 36.29 51.87 35.29 51.00 34.79 50.13 35.29 50.13 36.29 TH +29.00 36.79 29.87 36.29 29.87 35.29 29.00 34.79 28.13 35.29 28.13 36.29 TH +27.00 36.79 27.87 36.29 27.87 35.29 27.00 34.79 26.13 35.29 26.13 36.29 TH +25.00 36.79 25.87 36.29 25.87 35.29 25.00 34.79 24.13 35.29 24.13 36.29 TH +23.00 36.79 23.87 36.29 23.87 35.29 23.00 34.79 22.13 35.29 22.13 36.29 TH +21.00 36.79 21.87 36.29 21.87 35.29 21.00 34.79 20.13 35.29 20.13 36.29 TH +17.00 36.79 17.87 36.29 17.87 35.29 17.00 34.79 16.13 35.29 16.13 36.29 TH +13.00 36.79 13.87 36.29 13.87 35.29 13.00 34.79 12.13 35.29 12.13 36.29 TH +9.00 36.79 9.87 36.29 9.87 35.29 9.00 34.79 8.13 35.29 8.13 36.29 TH +7.00 36.79 7.87 36.29 7.87 35.29 7.00 34.79 6.13 35.29 6.13 36.29 TH +62.00 38.53 62.87 38.03 62.87 37.03 62.00 36.53 61.13 37.03 61.13 38.03 TH +58.00 38.53 58.87 38.03 58.87 37.03 58.00 36.53 57.13 37.03 57.13 38.03 TH +54.00 38.53 54.87 38.03 54.87 37.03 54.00 36.53 53.13 37.03 53.13 38.03 TH +50.00 38.53 50.87 38.03 50.87 37.03 50.00 36.53 49.13 37.03 49.13 38.03 TH +46.00 38.53 46.87 38.03 46.87 37.03 46.00 36.53 45.13 37.03 45.13 38.03 TH +26.00 38.53 26.87 38.03 26.87 37.03 26.00 36.53 25.13 37.03 25.13 38.03 TH +24.00 38.53 24.87 38.03 24.87 37.03 24.00 36.53 23.13 37.03 23.13 38.03 TH +22.00 38.53 22.87 38.03 22.87 37.03 22.00 36.53 21.13 37.03 21.13 38.03 TH +18.00 38.53 18.87 38.03 18.87 37.03 18.00 36.53 17.13 37.03 17.13 38.03 TH +14.00 38.53 14.87 38.03 14.87 37.03 14.00 36.53 13.13 37.03 13.13 38.03 TH +10.00 38.53 10.87 38.03 10.87 37.03 10.00 36.53 9.13 37.03 9.13 38.03 TH +47.00 40.26 47.87 39.76 47.87 38.76 47.00 38.26 46.13 38.76 46.13 39.76 TH +45.00 40.26 45.87 39.76 45.87 38.76 45.00 38.26 44.13 38.76 44.13 39.76 TH +41.00 40.26 41.87 39.76 41.87 38.76 41.00 38.26 40.13 38.76 40.13 39.76 TH +39.00 40.26 39.87 39.76 39.87 38.76 39.00 38.26 38.13 38.76 38.13 39.76 TH +37.00 40.26 37.87 39.76 37.87 38.76 37.00 38.26 36.13 38.76 36.13 39.76 TH +33.00 40.26 33.87 39.76 33.87 38.76 33.00 38.26 32.13 38.76 32.13 39.76 TH +31.00 40.26 31.87 39.76 31.87 38.76 31.00 38.26 30.13 38.76 30.13 39.76 TH +29.00 40.26 29.87 39.76 29.87 38.76 29.00 38.26 28.13 38.76 28.13 39.76 TH +25.00 40.26 25.87 39.76 25.87 38.76 25.00 38.26 24.13 38.76 24.13 39.76 TH +9.00 40.26 9.87 39.76 9.87 38.76 9.00 38.26 8.13 38.76 8.13 39.76 TH +7.00 40.26 7.87 39.76 7.87 38.76 7.00 38.26 6.13 38.76 6.13 39.76 TH +64.00 41.99 64.87 41.49 64.87 40.49 64.00 39.99 63.13 40.49 63.13 41.49 TH +60.00 41.99 60.87 41.49 60.87 40.49 60.00 39.99 59.13 40.49 59.13 41.49 TH +56.00 41.99 56.87 41.49 56.87 40.49 56.00 39.99 55.13 40.49 55.13 41.49 TH +52.00 41.99 52.87 41.49 52.87 40.49 52.00 39.99 51.13 40.49 51.13 41.49 TH +46.00 41.99 46.87 41.49 46.87 40.49 46.00 39.99 45.13 40.49 45.13 41.49 TH +44.00 41.99 44.87 41.49 44.87 40.49 44.00 39.99 43.13 40.49 43.13 41.49 TH +34.00 41.99 34.87 41.49 34.87 40.49 34.00 39.99 33.13 40.49 33.13 41.49 TH +30.00 41.99 30.87 41.49 30.87 40.49 30.00 39.99 29.13 40.49 29.13 41.49 TH +28.00 41.99 28.87 41.49 28.87 40.49 28.00 39.99 27.13 40.49 27.13 41.49 TH +20.00 41.99 20.87 41.49 20.87 40.49 20.00 39.99 19.13 40.49 19.13 41.49 TH +16.00 41.99 16.87 41.49 16.87 40.49 16.00 39.99 15.13 40.49 15.13 41.49 TH +12.00 41.99 12.87 41.49 12.87 40.49 12.00 39.99 11.13 40.49 11.13 41.49 TH +8.00 41.99 8.87 41.49 8.87 40.49 8.00 39.99 7.13 40.49 7.13 41.49 TH +63.00 43.72 63.87 43.22 63.87 42.22 63.00 41.72 62.13 42.22 62.13 43.22 TH +59.00 43.72 59.87 43.22 59.87 42.22 59.00 41.72 58.13 42.22 58.13 43.22 TH +55.00 43.72 55.87 43.22 55.87 42.22 55.00 41.72 54.13 42.22 54.13 43.22 TH +51.00 43.72 51.87 43.22 51.87 42.22 51.00 41.72 50.13 42.22 50.13 43.22 TH +47.00 43.72 47.87 43.22 47.87 42.22 47.00 41.72 46.13 42.22 46.13 43.22 TH +43.00 43.72 43.87 43.22 43.87 42.22 43.00 41.72 42.13 42.22 42.13 43.22 TH +39.00 43.72 39.87 43.22 39.87 42.22 39.00 41.72 38.13 42.22 38.13 43.22 TH +35.00 43.72 35.87 43.22 35.87 42.22 35.00 41.72 34.13 42.22 34.13 43.22 TH +31.00 43.72 31.87 43.22 31.87 42.22 31.00 41.72 30.13 42.22 30.13 43.22 TH +27.00 43.72 27.87 43.22 27.87 42.22 27.00 41.72 26.13 42.22 26.13 43.22 TH +25.00 43.72 25.87 43.22 25.87 42.22 25.00 41.72 24.13 42.22 24.13 43.22 TH +23.00 43.72 23.87 43.22 23.87 42.22 23.00 41.72 22.13 42.22 22.13 43.22 TH +21.00 43.72 21.87 43.22 21.87 42.22 21.00 41.72 20.13 42.22 20.13 43.22 TH +19.00 43.72 19.87 43.22 19.87 42.22 19.00 41.72 18.13 42.22 18.13 43.22 TH +15.00 43.72 15.87 43.22 15.87 42.22 15.00 41.72 14.13 42.22 14.13 43.22 TH +11.00 43.72 11.87 43.22 11.87 42.22 11.00 41.72 10.13 42.22 10.13 43.22 TH +9.00 43.72 9.87 43.22 9.87 42.22 9.00 41.72 8.13 42.22 8.13 43.22 TH +7.00 43.72 7.87 43.22 7.87 42.22 7.00 41.72 6.13 42.22 6.13 43.22 TH +24.00 45.45 24.87 44.95 24.87 43.95 24.00 43.45 23.13 43.95 23.13 44.95 TH +22.00 45.45 22.87 44.95 22.87 43.95 22.00 43.45 21.13 43.95 21.13 44.95 TH +20.00 45.45 20.87 44.95 20.87 43.95 20.00 43.45 19.13 43.95 19.13 44.95 TH +18.00 45.45 18.87 44.95 18.87 43.95 18.00 43.45 17.13 43.95 17.13 44.95 TH +14.00 45.45 14.87 44.95 14.87 43.95 14.00 43.45 13.13 43.95 13.13 44.95 TH +10.00 45.45 10.87 44.95 10.87 43.95 10.00 43.45 9.13 43.95 9.13 44.95 TH +8.00 45.45 8.87 44.95 8.87 43.95 8.00 43.45 7.13 43.95 7.13 44.95 TH +65.00 47.19 65.87 46.69 65.87 45.69 65.00 45.19 64.13 45.69 64.13 46.69 TH +61.00 47.19 61.87 46.69 61.87 45.69 61.00 45.19 60.13 45.69 60.13 46.69 TH +57.00 47.19 57.87 46.69 57.87 45.69 57.00 45.19 56.13 45.69 56.13 46.69 TH +53.00 47.19 53.87 46.69 53.87 45.69 53.00 45.19 52.13 45.69 52.13 46.69 TH +49.00 47.19 49.87 46.69 49.87 45.69 49.00 45.19 48.13 45.69 48.13 46.69 TH +45.00 47.19 45.87 46.69 45.87 45.69 45.00 45.19 44.13 45.69 44.13 46.69 TH +41.00 47.19 41.87 46.69 41.87 45.69 41.00 45.19 40.13 45.69 40.13 46.69 TH +37.00 47.19 37.87 46.69 37.87 45.69 37.00 45.19 36.13 45.69 36.13 46.69 TH +33.00 47.19 33.87 46.69 33.87 45.69 33.00 45.19 32.13 45.69 32.13 46.69 TH +29.00 47.19 29.87 46.69 29.87 45.69 29.00 45.19 28.13 45.69 28.13 46.69 TH +9.00 47.19 9.87 46.69 9.87 45.69 9.00 45.19 8.13 45.69 8.13 46.69 TH +64.00 48.92 64.87 48.42 64.87 47.42 64.00 46.92 63.13 47.42 63.13 48.42 TH +62.00 48.92 62.87 48.42 62.87 47.42 62.00 46.92 61.13 47.42 61.13 48.42 TH +60.00 48.92 60.87 48.42 60.87 47.42 60.00 46.92 59.13 47.42 59.13 48.42 TH +58.00 48.92 58.87 48.42 58.87 47.42 58.00 46.92 57.13 47.42 57.13 48.42 TH +56.00 48.92 56.87 48.42 56.87 47.42 56.00 46.92 55.13 47.42 55.13 48.42 TH +54.00 48.92 54.87 48.42 54.87 47.42 54.00 46.92 53.13 47.42 53.13 48.42 TH +52.00 48.92 52.87 48.42 52.87 47.42 52.00 46.92 51.13 47.42 51.13 48.42 TH +50.00 48.92 50.87 48.42 50.87 47.42 50.00 46.92 49.13 47.42 49.13 48.42 TH +40.00 48.92 40.87 48.42 40.87 47.42 40.00 46.92 39.13 47.42 39.13 48.42 TH +38.00 48.92 38.87 48.42 38.87 47.42 38.00 46.92 37.13 47.42 37.13 48.42 TH +36.00 48.92 36.87 48.42 36.87 47.42 36.00 46.92 35.13 47.42 35.13 48.42 TH +34.00 48.92 34.87 48.42 34.87 47.42 34.00 46.92 33.13 47.42 33.13 48.42 TH +22.00 48.92 22.87 48.42 22.87 47.42 22.00 46.92 21.13 47.42 21.13 48.42 TH +18.00 48.92 18.87 48.42 18.87 47.42 18.00 46.92 17.13 47.42 17.13 48.42 TH +63.00 50.65 63.87 50.15 63.87 49.15 63.00 48.65 62.13 49.15 62.13 50.15 TH +59.00 50.65 59.87 50.15 59.87 49.15 59.00 48.65 58.13 49.15 58.13 50.15 TH +57.00 50.65 57.87 50.15 57.87 49.15 57.00 48.65 56.13 49.15 56.13 50.15 TH +53.00 50.65 53.87 50.15 53.87 49.15 53.00 48.65 52.13 49.15 52.13 50.15 TH +49.00 50.65 49.87 50.15 49.87 49.15 49.00 48.65 48.13 49.15 48.13 50.15 TH +47.00 50.65 47.87 50.15 47.87 49.15 47.00 48.65 46.13 49.15 46.13 50.15 TH +45.00 50.65 45.87 50.15 45.87 49.15 45.00 48.65 44.13 49.15 44.13 50.15 TH +43.00 50.65 43.87 50.15 43.87 49.15 43.00 48.65 42.13 49.15 42.13 50.15 TH +33.00 50.65 33.87 50.15 33.87 49.15 33.00 48.65 32.13 49.15 32.13 50.15 TH +31.00 50.65 31.87 50.15 31.87 49.15 31.00 48.65 30.13 49.15 30.13 50.15 TH +29.00 50.65 29.87 50.15 29.87 49.15 29.00 48.65 28.13 49.15 28.13 50.15 TH +27.00 50.65 27.87 50.15 27.87 49.15 27.00 48.65 26.13 49.15 26.13 50.15 TH +23.00 50.65 23.87 50.15 23.87 49.15 23.00 48.65 22.13 49.15 22.13 50.15 TH +19.00 50.65 19.87 50.15 19.87 49.15 19.00 48.65 18.13 49.15 18.13 50.15 TH +15.00 50.65 15.87 50.15 15.87 49.15 15.00 48.65 14.13 49.15 14.13 50.15 TH +11.00 50.65 11.87 50.15 11.87 49.15 11.00 48.65 10.13 49.15 10.13 50.15 TH +64.00 52.38 64.87 51.88 64.87 50.88 64.00 50.38 63.13 50.88 63.13 51.88 TH +60.00 52.38 60.87 51.88 60.87 50.88 60.00 50.38 59.13 50.88 59.13 51.88 TH +56.00 52.38 56.87 51.88 56.87 50.88 56.00 50.38 55.13 50.88 55.13 51.88 TH +52.00 52.38 52.87 51.88 52.87 50.88 52.00 50.38 51.13 50.88 51.13 51.88 TH +38.00 52.38 38.87 51.88 38.87 50.88 38.00 50.38 37.13 50.88 37.13 51.88 TH +34.00 52.38 34.87 51.88 34.87 50.88 34.00 50.38 33.13 50.88 33.13 51.88 TH +30.00 52.38 30.87 51.88 30.87 50.88 30.00 50.38 29.13 50.88 29.13 51.88 TH +26.00 52.38 26.87 51.88 26.87 50.88 26.00 50.38 25.13 50.88 25.13 51.88 TH +24.00 52.38 24.87 51.88 24.87 50.88 24.00 50.38 23.13 50.88 23.13 51.88 TH +22.00 52.38 22.87 51.88 22.87 50.88 22.00 50.38 21.13 50.88 21.13 51.88 TH +20.00 52.38 20.87 51.88 20.87 50.88 20.00 50.38 19.13 50.88 19.13 51.88 TH +18.00 52.38 18.87 51.88 18.87 50.88 18.00 50.38 17.13 50.88 17.13 51.88 TH +16.00 52.38 16.87 51.88 16.87 50.88 16.00 50.38 15.13 50.88 15.13 51.88 TH +12.00 52.38 12.87 51.88 12.87 50.88 12.00 50.38 11.13 50.88 11.13 51.88 TH +8.00 52.38 8.87 51.88 8.87 50.88 8.00 50.38 7.13 50.88 7.13 51.88 TH +65.00 54.11 65.87 53.61 65.87 52.61 65.00 52.11 64.13 52.61 64.13 53.61 TH +63.00 54.11 63.87 53.61 63.87 52.61 63.00 52.11 62.13 52.61 62.13 53.61 TH +61.00 54.11 61.87 53.61 61.87 52.61 61.00 52.11 60.13 52.61 60.13 53.61 TH +59.00 54.11 59.87 53.61 59.87 52.61 59.00 52.11 58.13 52.61 58.13 53.61 TH +55.00 54.11 55.87 53.61 55.87 52.61 55.00 52.11 54.13 52.61 54.13 53.61 TH +51.00 54.11 51.87 53.61 51.87 52.61 51.00 52.11 50.13 52.61 50.13 53.61 TH +49.00 54.11 49.87 53.61 49.87 52.61 49.00 52.11 48.13 52.61 48.13 53.61 TH +45.00 54.11 45.87 53.61 45.87 52.61 45.00 52.11 44.13 52.61 44.13 53.61 TH +33.00 54.11 33.87 53.61 33.87 52.61 33.00 52.11 32.13 52.61 32.13 53.61 TH +31.00 54.11 31.87 53.61 31.87 52.61 31.00 52.11 30.13 52.61 30.13 53.61 TH +29.00 54.11 29.87 53.61 29.87 52.61 29.00 52.11 28.13 52.61 28.13 53.61 TH +27.00 54.11 27.87 53.61 27.87 52.61 27.00 52.11 26.13 52.61 26.13 53.61 TH +23.00 54.11 23.87 53.61 23.87 52.61 23.00 52.11 22.13 52.61 22.13 53.61 TH +19.00 54.11 19.87 53.61 19.87 52.61 19.00 52.11 18.13 52.61 18.13 53.61 TH +17.00 54.11 17.87 53.61 17.87 52.61 17.00 52.11 16.13 52.61 16.13 53.61 TH +13.00 54.11 13.87 53.61 13.87 52.61 13.00 52.11 12.13 52.61 12.13 53.61 TH +9.00 54.11 9.87 53.61 9.87 52.61 9.00 52.11 8.13 52.61 8.13 53.61 TH +62.00 55.85 62.87 55.35 62.87 54.35 62.00 53.85 61.13 54.35 61.13 55.35 TH +58.00 55.85 58.87 55.35 58.87 54.35 58.00 53.85 57.13 54.35 57.13 55.35 TH +56.00 55.85 56.87 55.35 56.87 54.35 56.00 53.85 55.13 54.35 55.13 55.35 TH +52.00 55.85 52.87 55.35 52.87 54.35 52.00 53.85 51.13 54.35 51.13 55.35 TH +48.00 55.85 48.87 55.35 48.87 54.35 48.00 53.85 47.13 54.35 47.13 55.35 TH +46.00 55.85 46.87 55.35 46.87 54.35 46.00 53.85 45.13 54.35 45.13 55.35 TH +44.00 55.85 44.87 55.35 44.87 54.35 44.00 53.85 43.13 54.35 43.13 55.35 TH +42.00 55.85 42.87 55.35 42.87 54.35 42.00 53.85 41.13 54.35 41.13 55.35 TH +38.00 55.85 38.87 55.35 38.87 54.35 38.00 53.85 37.13 54.35 37.13 55.35 TH +34.00 55.85 34.87 55.35 34.87 54.35 34.00 53.85 33.13 54.35 33.13 55.35 TH +32.00 55.85 32.87 55.35 32.87 54.35 32.00 53.85 31.13 54.35 31.13 55.35 TH +28.00 55.85 28.87 55.35 28.87 54.35 28.00 53.85 27.13 54.35 27.13 55.35 TH +24.00 55.85 24.87 55.35 24.87 54.35 24.00 53.85 23.13 54.35 23.13 55.35 TH +20.00 55.85 20.87 55.35 20.87 54.35 20.00 53.85 19.13 54.35 19.13 55.35 TH +16.00 55.85 16.87 55.35 16.87 54.35 16.00 53.85 15.13 54.35 15.13 55.35 TH +14.00 55.85 14.87 55.35 14.87 54.35 14.00 53.85 13.13 54.35 13.13 55.35 TH +12.00 55.85 12.87 55.35 12.87 54.35 12.00 53.85 11.13 54.35 11.13 55.35 TH +10.00 55.85 10.87 55.35 10.87 54.35 10.00 53.85 9.13 54.35 9.13 55.35 TH +63.00 57.58 63.87 57.08 63.87 56.08 63.00 55.58 62.13 56.08 62.13 57.08 TH +59.00 57.58 59.87 57.08 59.87 56.08 59.00 55.58 58.13 56.08 58.13 57.08 TH +39.00 57.58 39.87 57.08 39.87 56.08 39.00 55.58 38.13 56.08 38.13 57.08 TH +35.00 57.58 35.87 57.08 35.87 56.08 35.00 55.58 34.13 56.08 34.13 57.08 TH +33.00 57.58 33.87 57.08 33.87 56.08 33.00 55.58 32.13 56.08 32.13 57.08 TH +29.00 57.58 29.87 57.08 29.87 56.08 29.00 55.58 28.13 56.08 28.13 57.08 TH +25.00 57.58 25.87 57.08 25.87 56.08 25.00 55.58 24.13 56.08 24.13 57.08 TH +21.00 57.58 21.87 57.08 21.87 56.08 21.00 55.58 20.13 56.08 20.13 57.08 TH +15.00 57.58 15.87 57.08 15.87 56.08 15.00 55.58 14.13 56.08 14.13 57.08 TH +11.00 57.58 11.87 57.08 11.87 56.08 11.00 55.58 10.13 56.08 10.13 57.08 TH +37.00 28.87 9.00 TD +0.00 0.00 1.00 setrgbcolor +37.00 28.87 7.43 TD +0.00 0.00 0.00 setrgbcolor +37.00 28.87 5.86 TD +0.00 0.00 1.00 setrgbcolor +37.00 28.87 4.29 TD +0.00 0.00 0.00 setrgbcolor +37.00 28.87 2.72 TD +0.00 0.00 1.00 setrgbcolor +37.00 28.87 1.15 TD diff --git a/backend/tests/data/svg/telepen_height0.4_rotate_180.svg b/backend/tests/data/svg/telepen_height0.4_rotate_180.svg new file mode 100644 index 00000000..ad2687ea --- /dev/null +++ b/backend/tests/data/svg/telepen_height0.4_rotate_180.svg @@ -0,0 +1,38 @@ + + + + Zint Generated Symbol + + + + + + + + + + + + + + + + + + + + + + + + + + + + A + + + diff --git a/backend/tests/test_codablock.c b/backend/tests/test_codablock.c index 5b1c84d8..5ee3b65e 100644 --- a/backend/tests/test_codablock.c +++ b/backend/tests/test_codablock.c @@ -34,6 +34,8 @@ static void test_large(int index, int debug) { struct item { + int option_1; + int option_2; char *pattern; int length; int ret; @@ -43,20 +45,46 @@ static void test_large(int index, int debug) { // é U+00E9 (\351, 233), UTF-8 C3A9, CodeB-only extended ASCII // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<")) struct item data[] = { - /* 0*/ { "A", 2666, 0, 44, 728 }, - /* 1*/ { "A", 2725, 0, 44, 739 }, - /* 2*/ { "A", 2726, 0, 44, 739 }, // 4.2.1 c.3 says max 2725 but actually 44 * 62 - 2 == 2726 as mentioned later in 4.8.1 - /* 3*/ { "A", 2727, ZINT_ERROR_TOO_LONG, -1, -1 }, - /* 4*/ { "12", 2726 * 2, 0, 44, 739 }, - /* 5*/ { "12", 2726 * 2 + 1, ZINT_ERROR_TOO_LONG, -1, -1 }, - /* 6*/ { "\351", 2726 / 2, 0, 44, 739 }, - /* 7*/ { "\351", 2726 / 2 + 1, ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 0*/ { -1, -1, "A", 2666, 0, 44, 728 }, + /* 1*/ { -1, -1, "A", 2725, 0, 44, 739 }, + /* 2*/ { -1, -1, "A", 2726, 0, 44, 739 }, // 4.2.1 c.3 says max 2725 but actually 44 * 62 - 2 == 2726 as mentioned later in 4.8.1 + /* 3*/ { -1, -1, "A", 2727, ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 4*/ { -1, -1, "A", ZINT_MAX_DATA_LEN, ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 5*/ { -1, -1, "12", 2726 * 2, 0, 44, 739 }, + /* 6*/ { -1, -1, "12", 2726 * 2 + 1, ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 7*/ { -1, -1, "\351", 2726 / 2, 0, 44, 739 }, + /* 8*/ { -1, -1, "\351", 2726 / 2 + 1, ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 9*/ { 1, -1, "A", 60, 0, 1, 695 }, // CODE128 60 max + /* 10*/ { 1, -1, "A", 61, ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 11*/ { 2, -1, "A", 122, 0, 2, 739 }, + /* 12*/ { 2, 10, "A", 122, 0, 2, 739 }, // Cols 10 -> 67 + /* 13*/ { 2, 67, "A", 122, 0, 2, 739 }, + /* 14*/ { 2, -1, "A", 123, ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 15*/ { 2, -1, "A", 63 * 2, ZINT_ERROR_TOO_LONG, -1, -1 }, // Triggers initial testColumns > 62 + /* 16*/ { 2, -1, "A", 2726 * 2 + 1, ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 17*/ { 2, 9, "A", 2726 * 2 + 1, ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 18*/ { 3, -1, "A", 184, 0, 3, 739 }, + /* 19*/ { 3, -1, "A", 185, ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 20*/ { 10, -1, "A", 618, 0, 10, 739 }, + /* 21*/ { 10, -1, "A", 619, ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 22*/ { 20, -1, "A", 1238, 0, 20, 739 }, + /* 23*/ { 20, -1, "A", 1239, ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 24*/ { 30, -1, "A", 1858, 0, 30, 739 }, + /* 25*/ { 30, -1, "A", 1859, ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 26*/ { 40, -1, "A", 2478, 0, 40, 739 }, + /* 27*/ { 40, -1, "A", 2479, ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 28*/ { 43, -1, "A", 2664, 0, 43, 739 }, + /* 29*/ { 43, -1, "A", 2665, ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 30*/ { 44, -1, "A", 2726, 0, 44, 739 }, + /* 31*/ { 44, -1, "A", 2727, ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 32*/ { 44, 60, "A", 2726, 0, 44, 739 }, // Cols 60 -> 67 + /* 33*/ { 44, 67, "A", 2726, 0, 44, 739 }, }; int data_size = ARRAY_SIZE(data); int i, length, ret; struct zint_symbol *symbol; - char data_buf[2726 * 2 + 2]; + char data_buf[ZINT_MAX_DATA_LEN + 2]; testStart("test_large"); @@ -70,7 +98,7 @@ static void test_large(int index, int debug) { testUtilStrCpyRepeat(data_buf, data[i].pattern, data[i].length); assert_equal(data[i].length, (int) strlen(data_buf), "i:%d length %d != strlen(data_buf) %d\n", i, data[i].length, (int) strlen(data_buf)); - length = testUtilSetSymbol(symbol, BARCODE_CODABLOCKF, -1 /*input_mode*/, -1 /*eci*/, -1 /*option_1*/, -1, -1, -1 /*output_options*/, data_buf, data[i].length, debug); + length = testUtilSetSymbol(symbol, BARCODE_CODABLOCKF, -1 /*input_mode*/, -1 /*eci*/, data[i].option_1, data[i].option_2, -1, -1 /*output_options*/, data_buf, data[i].length, debug); ret = ZBarcode_Encode(symbol, (unsigned char *) data_buf, length); assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt); @@ -169,7 +197,8 @@ static void test_reader_init(int index, int generate, int debug) { }; struct item data[] = { /* 0*/ { BARCODE_CODABLOCKF, UNICODE_MODE, READER_INIT, "1234", 0, 2, 101, "67 64 40 60 63 0C 22 2B 6A 67 64 0B 63 64 3A 1C 29 6A", "CodeB FNC3 CodeC 12 34 / CodeB Pads" }, - /* 1*/ { BARCODE_HIBC_BLOCKF, UNICODE_MODE, READER_INIT, "123456", 0, 3, 101, "67 64 41 60 0B 11 12 22 6A 67 63 2B 22 38 64 2A 1B 6A 67 64 0C 63 64 2B 2F 52 6A", "CodeB FNC3 + 1 2 / CodeC 34 56 CodeB J" }, + /* 1*/ { BARCODE_CODABLOCKF, UNICODE_MODE, READER_INIT, "\001\002", 0, 2, 101, "67 62 40 60 41 42 63 32 6A 67 64 0B 63 64 45 42 0F 6A", "FNC3 SOH STX / CodeB Pads" }, + /* 2*/ { BARCODE_HIBC_BLOCKF, UNICODE_MODE, READER_INIT, "123456", 0, 3, 101, "67 64 41 60 0B 11 12 22 6A 67 63 2B 22 38 64 2A 1B 6A 67 64 0C 63 64 2B 2F 52 6A", "CodeB FNC3 + 1 2 / CodeC 34 56 CodeB J" }, }; int data_size = ARRAY_SIZE(data); int i, length, ret; @@ -277,7 +306,8 @@ static void test_input(int index, int generate, int debug) { /* 34*/ { BARCODE_CODABLOCKF, UNICODE_MODE, -1, "\000a\037\177}12", 7, 0, 3, 101, "67 62 41 40 62 41 5F 3B 6A 67 64 0B 5F 5D 11 12 2D 6A 67 64 0C 63 64 40 05 26 6A", "" }, /* 35*/ { BARCODE_CODABLOCKF, UNICODE_MODE, -1, "abcdéf", -1, 0, 3, 101, "67 64 41 41 42 43 44 5D 6A 67 64 0B 64 49 46 63 0A 6A 67 64 0C 63 64 4F 26 02 6A", "" }, /* 36*/ { BARCODE_CODABLOCKF, UNICODE_MODE, -1, "a12é\000", 6, 0, 3, 101, "67 64 41 41 11 12 63 2C 6A 67 64 0B 64 49 62 40 2B 6A 67 64 0C 63 64 33 34 31 6A", "" }, - /* 37*/ { BARCODE_HIBC_BLOCKF, UNICODE_MODE, -1, "A99912345/$$52001510X3", -1, 0, 6, 101, "(54) 67 64 44 0B 21 19 19 3A 6A 67 63 2B 5B 17 2D 64 24 6A 67 64 0C 0F 04 04 15 16 6A 67", "" }, + /* 37*/ { BARCODE_CODABLOCKF, UNICODE_MODE, 11, "1234\001", -1, 0, 2, 123, "67 63 00 0C 22 65 41 63 64 54 6A 67 64 0B 63 64 63 64 3F 20 24 6A", "" }, + /* 38*/ { BARCODE_HIBC_BLOCKF, UNICODE_MODE, -1, "A99912345/$$52001510X3", -1, 0, 6, 101, "(54) 67 64 44 0B 21 19 19 3A 6A 67 63 2B 5B 17 2D 64 24 6A 67 64 0C 0F 04 04 15 16 6A 67", "" }, }; int data_size = ARRAY_SIZE(data); int i, length, ret; diff --git a/backend/tests/test_code16k.c b/backend/tests/test_code16k.c index d09af678..a787e17e 100644 --- a/backend/tests/test_code16k.c +++ b/backend/tests/test_code16k.c @@ -168,20 +168,22 @@ static void test_input(int index, int generate, int debug) { /* 4*/ { GS1_MODE, "[90]12", -1, 0, 2, 70, "(10) 4 90 12 103 103 103 103 103 79 62", "ModeCFNC1 90 12 Pad (5)" }, /* 5*/ { GS1_MODE, "[90]12[20]12", -1, 0, 2, 70, "(10) 4 90 12 102 20 12 103 103 9 72", "ModeCFNC1 90 12 FNC1 20 12 Pad (2)" }, /* 6*/ { GS1_MODE, "[90]123[20]12", -1, 0, 2, 70, "(15) 4 90 12 100 19 99 102 20 12 103 103 103 103 88 22", "ModeCFNC1 90 CodeB 3 CodeC FNC1 20 12 Pad (4)" }, - /* 7*/ { GS1_MODE | GS1PARENS_MODE, "(90)12", -1, 0, 2, 70, "(10) 4 90 12 103 103 103 103 103 79 62", "ModeCFNC1 90 12 Pad (5)" }, - /* 8*/ { UNICODE_MODE, "a0123456789", -1, 0, 2, 70, "(10) 5 65 1 23 45 67 89 103 27 86", "ModeC1SB a 01 23 45 67 89 Pad" }, - /* 9*/ { UNICODE_MODE, "ab0123456789", -1, 0, 2, 70, "(10) 6 65 66 1 23 45 67 89 19 42", "ModeC2SB a b 01 23 45 67 89" }, - /* 10*/ { UNICODE_MODE, "1234\037a", -1, 0, 2, 70, "(10) 2 12 34 101 95 98 65 103 67 53", "ModeC 12 34 CodeA US 1SB a Pad" }, - /* 11*/ { UNICODE_MODE, "\000\037ß", 4, 0, 2, 70, "(10) 0 64 95 101 63 103 103 103 75 11", "ModeA NUL US FNC4 ß Pad (3)" }, - /* 12*/ { UNICODE_MODE, "\000\037é", 4, 0, 2, 70, "(10) 0 64 95 101 98 73 103 103 75 6", "ModeA NUL US FNC4 1SB é Pad (2)" }, - /* 13*/ { UNICODE_MODE, "\000\037éa", 5, 0, 2, 70, "(10) 0 64 95 100 100 73 65 103 99 69", "ModeA NUL US CodeB FNC4 é a Pad" }, - /* 14*/ { UNICODE_MODE, "abß", -1, 0, 2, 70, "(10) 1 65 66 100 63 103 103 103 66 56", "ModeB a b FNC4 ß Pad (3)" }, - /* 15*/ { DATA_MODE, "\141\142\237", -1, 0, 2, 70, "(10) 1 65 66 100 98 95 103 103 6 71", "ModeB a b FNC4 1SA APC Pad (2)" }, - /* 16*/ { DATA_MODE, "\141\142\237\037", -1, 0, 2, 70, "(10) 1 65 66 101 101 95 95 103 72 93", "ModeB a b CodeA FNC4 APC US Pad" }, - /* 17*/ { UNICODE_MODE, "ééé", -1, 0, 2, 70, "(10) 1 100 73 100 73 100 73 103 105 106", "ModeB FNC4 é FNC4 é FNC4 é Pad" }, - /* 18*/ { UNICODE_MODE, "aééééb", -1, 0, 3, 70, "(15) 8 65 100 73 100 73 100 73 100 73 66 103 103 39 83", "ModeB a FNC4 é (4) b Pad (2)" }, - /* 19*/ { UNICODE_MODE, "aéééééb", -1, 0, 3, 70, "(15) 8 65 100 73 100 73 100 73 100 73 100 73 66 74 106", "ModeB a FNC4 é (5) b" }, - /* 20*/ { UNICODE_MODE, "aééééébcdeé", -1, 0, 4, 70, "(20) 15 65 100 73 100 73 100 73 100 73 100 73 66 67 68 69 100 73 14 69", "ModeB a FNC4 é (5) b c d e FNC4 é" }, + /* 7*/ { GS1_MODE, "[90]123[91]1A3[20]12", -1, 0, 4, 70, "(20) 18 90 12 100 19 102 25 99 11 100 33 19 99 102 20 12 103 103 0 3", "ModeCFNC1 90 12 CodeB 3 FNC1 9 CodeC 11 CodeB A 3 CodeC FNC1 20 12 Pad (2)" }, + /* 8*/ { GS1_MODE, "[90]123A[91]123", -1, 0, 3, 70, "(15) 11 90 12 100 19 33 102 25 99 11 23 103 103 81 56", "ModeCFNC1 90 12 CodeB 3 A FNC1 9 CodeC 11 23 Pad (2)" }, + /* 9*/ { GS1_MODE | GS1PARENS_MODE, "(90)12", -1, 0, 2, 70, "(10) 4 90 12 103 103 103 103 103 79 62", "ModeCFNC1 90 12 Pad (5)" }, + /* 10*/ { UNICODE_MODE, "a0123456789", -1, 0, 2, 70, "(10) 5 65 1 23 45 67 89 103 27 86", "ModeC1SB a 01 23 45 67 89 Pad" }, + /* 11*/ { UNICODE_MODE, "ab0123456789", -1, 0, 2, 70, "(10) 6 65 66 1 23 45 67 89 19 42", "ModeC2SB a b 01 23 45 67 89" }, + /* 12*/ { UNICODE_MODE, "1234\037a", -1, 0, 2, 70, "(10) 2 12 34 101 95 98 65 103 67 53", "ModeC 12 34 CodeA US 1SB a Pad" }, + /* 13*/ { UNICODE_MODE, "\000\037ß", 4, 0, 2, 70, "(10) 0 64 95 101 63 103 103 103 75 11", "ModeA NUL US FNC4 ß Pad (3)" }, + /* 14*/ { UNICODE_MODE, "\000\037é", 4, 0, 2, 70, "(10) 0 64 95 101 98 73 103 103 75 6", "ModeA NUL US FNC4 1SB é Pad (2)" }, + /* 15*/ { UNICODE_MODE, "\000\037éa", 5, 0, 2, 70, "(10) 0 64 95 100 100 73 65 103 99 69", "ModeA NUL US CodeB FNC4 é a Pad" }, + /* 16*/ { UNICODE_MODE, "abß", -1, 0, 2, 70, "(10) 1 65 66 100 63 103 103 103 66 56", "ModeB a b FNC4 ß Pad (3)" }, + /* 17*/ { DATA_MODE, "\141\142\237", -1, 0, 2, 70, "(10) 1 65 66 100 98 95 103 103 6 71", "ModeB a b FNC4 1SA APC Pad (2)" }, + /* 18*/ { DATA_MODE, "\141\142\237\037", -1, 0, 2, 70, "(10) 1 65 66 101 101 95 95 103 72 93", "ModeB a b CodeA FNC4 APC US Pad" }, + /* 19*/ { UNICODE_MODE, "ééé", -1, 0, 2, 70, "(10) 1 100 73 100 73 100 73 103 105 106", "ModeB FNC4 é FNC4 é FNC4 é Pad" }, + /* 20*/ { UNICODE_MODE, "aééééb", -1, 0, 3, 70, "(15) 8 65 100 73 100 73 100 73 100 73 66 103 103 39 83", "ModeB a FNC4 é (4) b Pad (2)" }, + /* 21*/ { UNICODE_MODE, "aéééééb", -1, 0, 3, 70, "(15) 8 65 100 73 100 73 100 73 100 73 100 73 66 74 106", "ModeB a FNC4 é (5) b" }, + /* 22*/ { UNICODE_MODE, "aééééébcdeé", -1, 0, 4, 70, "(20) 15 65 100 73 100 73 100 73 100 73 100 73 66 67 68 69 100 73 14 69", "ModeB a FNC4 é (5) b c d e FNC4 é" }, }; int data_size = ARRAY_SIZE(data); int i, length, ret; diff --git a/backend/tests/test_common.c b/backend/tests/test_common.c index 03de3863..f23ec65f 100644 --- a/backend/tests/test_common.c +++ b/backend/tests/test_common.c @@ -145,10 +145,10 @@ static void test_set_height(int index, int debug) { static void test_is_valid_utf8(int index) { struct item { - char* data; + char *data; int length; int ret; - char* comment; + char *comment; }; // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<")) struct item data[] = { diff --git a/backend/tests/test_gridmtx.c b/backend/tests/test_gridmtx.c index 0c0356d6..1fb2d914 100644 --- a/backend/tests/test_gridmtx.c +++ b/backend/tests/test_gridmtx.c @@ -45,22 +45,25 @@ static void test_large(int index, int debug) { struct item data[] = { /* 0*/ { -1, "1", 2751, 0, 162, 162 }, /* 1*/ { -1, "1", 2752, ZINT_ERROR_TOO_LONG, -1, -1 }, - /* 2*/ { -1, "A", 1836, 0, 162, 162 }, - /* 3*/ { -1, "A", 1837, ZINT_ERROR_TOO_LONG, -1, -1 }, - /* 4*/ { -1, "\200", 1143, 0, 162, 162 }, - /* 5*/ { -1, "\200", 1144, ZINT_ERROR_TOO_LONG, -1, -1 }, - /* 6*/ { 1, "1", 18, 0, 18, 18 }, - /* 7*/ { 1, "1", 19, ZINT_ERROR_TOO_LONG, -1, -1 }, - /* 8*/ { 1, "A", 13, 0, 18, 18 }, - /* 9*/ { 1, "A", 14, ZINT_ERROR_TOO_LONG, -1, -1 }, - /* 10*/ { 1, "\200", 7, 0, 18, 18 }, - /* 11*/ { 1, "\200", 8, ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 2*/ { -1, "1", 2755, ZINT_ERROR_TOO_LONG, -1, -1 }, // Triggers buffer > 9191 + /* 3*/ { -1, "A", 1836, 0, 162, 162 }, + /* 4*/ { -1, "A", 1837, ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 5*/ { -1, "\200", 1143, 0, 162, 162 }, + /* 6*/ { -1, "\200", 1144, ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 7*/ { 1, "1", 18, 0, 18, 18 }, + /* 8*/ { 1, "1", 19, ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 9*/ { 1, "A", 13, 0, 18, 18 }, + /* 10*/ { 1, "A", 14, ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 11*/ { 1, "\200", 7, 0, 18, 18 }, + /* 12*/ { 1, "\200", 8, ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 13*/ { 11, "1", 1995, 0, 138, 138 }, + /* 14*/ { 11, "1", 1996, ZINT_ERROR_TOO_LONG, -1, -1 }, }; int data_size = ARRAY_SIZE(data); int i, length, ret; struct zint_symbol *symbol; - char data_buf[2753]; + char data_buf[2755 + 1]; testStart("test_large"); @@ -114,6 +117,8 @@ static void test_options(int index, int debug) { /* 9*/ { "123456789012345678", 5, 1, 0, 0, 18 }, // Version specified so overrides ECC level which gets reduced to 4 /* 10*/ { "123456789012345678", 5, 0, 0, 0, 30 }, // Version not specified so increased to allow for ECC level /* 11*/ { "123456789012345678", 6, 0, 0, 0, 30 }, // ECC > max ECC 5 so ignored and auto-settings version 2, ECC 4 used + /* 12*/ { "123456789012345678", 1, 0, 0, 0, 30 }, // ECC < min ECC 2, ECC 2 used + /* 13*/ { "123456789012345678", 4, 1, 0, 0, 18 }, }; int data_size = ARRAY_SIZE(data); int i, length, ret; @@ -151,6 +156,7 @@ static void test_input(int index, int generate, int debug) { struct item { int input_mode; int eci; + int output_options; int option_3; char *data; int ret; @@ -164,95 +170,117 @@ static void test_input(int index, int generate, int debug) { // ㈩ U+3229 in GB 2312 0x226E // 一 U+4E00 in GB 2312 0x523B struct item data[] = { - /* 0*/ { UNICODE_MODE, 0, -1, "é", 0, 0, "30 01 69 00", "B1 (ISO 8859-1)" }, - /* 1*/ { UNICODE_MODE, 3, -1, "é", 0, 3, "60 01 58 00 74 40", "ECI-3 B1 (ISO 8859-1)" }, - /* 2*/ { UNICODE_MODE, 29, -1, "é", 0, 29, "60 0E 44 2A 37 7C 00", "ECI-29 H1 (GB 2312)" }, - /* 3*/ { UNICODE_MODE, 26, -1, "é", 0, 26, "60 0D 18 01 61 6A 20", "ECI-26 B2 (UTF-8)" }, - /* 4*/ { UNICODE_MODE, 26, ZINT_FULL_MULTIBYTE, "é", 0, 26, "60 0D 05 28 4F 7C 00", "ECI-26 H1 (UTF-8) (full multibyte)" }, - /* 5*/ { DATA_MODE, 0, -1, "é", 0, 0, "30 03 43 54 40", "B2 (UTF-8)" }, - /* 6*/ { DATA_MODE, 0, ZINT_FULL_MULTIBYTE, "é", 0, 0, "0A 51 1F 78 00", "H1 (UTF-8) (full multibyte)" }, - /* 7*/ { DATA_MODE, 0, -1, "\351", 0, 0, "30 01 69 00", "B1 (ISO 8859-1) (0xE9)" }, - /* 8*/ { UNICODE_MODE, 0, -1, "β", 0, 0, "08 40 2F 78 00", "H1 (GB 2312)" }, - /* 9*/ { UNICODE_MODE, 9, -1, "β", 0, 9, "60 04 58 00 71 00", "ECI-9 B1 (ISO 8859-7)" }, - /* 10*/ { UNICODE_MODE, 29, -1, "β", 0, 29, "60 0E 44 20 17 7C 00", "ECI-29 H1 (GB 2312)" }, - /* 11*/ { UNICODE_MODE, 26, -1, "β", 0, 26, "60 0D 18 01 67 2C 40", "ECI-26 H1 (UTF-8)" }, - /* 12*/ { UNICODE_MODE, 26, ZINT_FULL_MULTIBYTE, "β", 0, 26, "60 0D 05 6B 17 7C 00", "ECI-26 H1 (UTF-8) (full multibyte)" }, - /* 13*/ { DATA_MODE, 0, -1, "β", 0, 0, "30 03 4E 59 00", "B2 (UTF-8)" }, - /* 14*/ { DATA_MODE, 0, ZINT_FULL_MULTIBYTE, "β", 0, 0, "0B 56 2F 78 00", "H1 (UTF-8) (full multibyte)" }, - /* 15*/ { UNICODE_MODE, 0, -1, "ÿ", 0, 0, "30 01 7F 00", "B1 (ISO 8859-1)" }, - /* 16*/ { UNICODE_MODE, 0, -1, "ÿÿÿ", 0, 0, "30 05 7F 7F 7F 60", "B3 (ISO 8859-1)" }, - /* 17*/ { UNICODE_MODE, 0, -1, "㈩一", 0, 0, "08 15 68 0E 7F 70 00", "H2 (GB 2312)" }, - /* 18*/ { UNICODE_MODE, 29, -1, "㈩一", 0, 29, "60 0E 44 0A 74 07 3F 78 00", "ECI-29 H2 (GB 2312)" }, - /* 19*/ { DATA_MODE, 0, -1, "\177\177", 0, 0, "30 02 7F 3F 40", "B2 (ASCII)" }, - /* 20*/ { DATA_MODE, 0, -1, "\177\177\177", 0, 0, "30 04 7F 3F 5F 60", "B3 (ASCII)" }, - /* 21*/ { UNICODE_MODE, 0, -1, "123", 0, 0, "10 1E 7F 68", "N3 (ASCII)" }, - /* 22*/ { UNICODE_MODE, 0, -1, " 123", 0, 0, "11 7A 03 6F 7D 00", "N4 (ASCII)" }, - /* 23*/ { UNICODE_MODE, 0, -1, "1+23", 0, 0, "11 7B 03 6F 7D 00", "N4 (ASCII)" }, - /* 24*/ { UNICODE_MODE, 0, -1, "12.3", 0, 0, "11 7C 63 6F 7D 00", "N4 (ASCII)" }, - /* 25*/ { UNICODE_MODE, 0, -1, "123,", 0, 0, "10 1E 7F 73 76 5E 60", "N3 L1 (ASCII)" }, - /* 26*/ { UNICODE_MODE, 0, -1, "123,4", 0, 0, "14 1E 7F 51 48 3F 50", "N5 (ASCII)" }, - /* 27*/ { UNICODE_MODE, 0, -1, "\015\012123", 0, 0, "11 7D 63 6F 7D 00", "N4 (ASCII) (EOL)" }, - /* 28*/ { UNICODE_MODE, 0, -1, "1\015\01223", 0, 0, "11 7E 03 6F 7D 00", "N4 (ASCII) (EOL)" }, - /* 29*/ { UNICODE_MODE, 0, -1, "12\015\0123", 0, 0, "11 7E 23 6F 7D 00", "N4 (ASCII) (EOL)" }, - /* 30*/ { UNICODE_MODE, 0, -1, "123\015\012", 0, 0, "10 1E 7F 7C 01 06 42 40", "N3 B2 (ASCII) (EOL)" }, - /* 31*/ { UNICODE_MODE, 0, -1, "123\015\0124", 0, 0, "14 1E 7F 5D 48 3F 50", "N5 (ASCII) (EOL)" }, - /* 32*/ { UNICODE_MODE, 0, -1, "2.2.0", 0, 0, "15 7C 46 73 78 40 07 7A", "N5 (ASCII)" }, - /* 33*/ { UNICODE_MODE, 0, -1, "2.2.0.5", 0, 0, "30 0C 32 17 0C 45 63 01 38 6A 00", "B7 (ASCII)" }, - /* 34*/ { UNICODE_MODE, 0, -1, "2.2.0.56", 0, 0, "13 7C 46 73 78 40 07 71 46 0F 74", "N8 (ASCII)" }, - /* 35*/ { UNICODE_MODE, 0, -1, "1 1234ABCD12.2abcd-12", 0, 0, "13 7A 23 41 2A 3F 68 01 08 3E 4F 66 1E 5F 70 00 44 1F 2F 6E 0F 0F 74", "N6 U4 N4 L4 N3 (ASCII)" }, - /* 36*/ { UNICODE_MODE, 0, -1, "1 123ABCDE12.2abcd-12", 0, 0, "28 1F 40 42 06 28 59 43 27 01 05 7D 56 42 49 16 34 7F 6D 30 08 2F 60", "M21 (ASCII)" }, - /* 37*/ { UNICODE_MODE, 0, -1, "国外通信教材 Matlab6.5", 0, 0, "09 63 27 20 4E 24 1F 05 21 58 22 13 7E 1E 4C 78 09 56 00 3D 3F 4A 45 3F 50", "H6 U2 L5 N3 (GB 2312) (Same as D.2 example)" }, - /* 38*/ { UNICODE_MODE, 0, -1, "AAT", 0, 0, "20 00 4F 30", "U3 (ASCII)" }, - /* 39*/ { UNICODE_MODE, 0, -1, "aat", 0, 0, "18 00 4F 30", "L3 (ASCII)" }, - /* 40*/ { UNICODE_MODE, 0, -1, "AAT2556", 0, 0, "20 00 4F 58 7F 65 47 7A", "U3 N4 (ASCII) (note same bit count as M7)" }, - /* 41*/ { UNICODE_MODE, 0, -1, "AAT2556 ", 0, 0, "29 22 4E 42 0A 14 37 6F 60", "M8 (ASCII)" }, - /* 42*/ { UNICODE_MODE, 0, -1, "AAT2556 电", 0, 0, "29 22 4E 42 0A 14 37 6F 62 2C 1F 7E 00", "M8 H1 (GB 2312)" }, - /* 43*/ { UNICODE_MODE, 0, -1, " 200", 0, 0, "11 7A 06 23 7D 00", "N4 (ASCII)" }, - /* 44*/ { UNICODE_MODE, 0, -1, " 200mA至", 0, 0, "2F 60 40 00 60 2B 78 63 41 7F 40", "M6 H1 (GB 2312)" }, - /* 45*/ { UNICODE_MODE, 0, -1, "2A tel:86 019 82512738", 0, 0, "28 22 5F 4F 29 48 5F 6D 7E 6F 55 57 1F 28 63 0F 5A 11 64 0F 74", "M2 L5(with control) N15 (ASCII)" }, - /* 46*/ { UNICODE_MODE, 0, -1, "至2A tel:86 019 82512738", 0, 0, "30 07 56 60 4C 48 13 6A 32 17 7B 3F 5B 75 35 67 6A 18 63 76 44 39 03 7D 00", "B4 L5(with control) N15 (GB 2312)" }, - /* 47*/ { UNICODE_MODE, 0, -1, "AAT2556 电池充电器+降压转换器 200mA至2A tel:86 019 82512738", 0, 0, "(62) 29 22 22 1C 4E 41 42 7E 0A 40 14 00 37 7E 6F 00 62 7E 2C 00 1C 7E 4B 00 41 7E 18 00", "M8 H11 M6 B4 L5(with control) N15 (GB 2312) (*NOT SAME* as D3 example Figure D.1, M8 H11 M6 H1 M3 L4(with control) N15, which uses a few more bits)" }, - /* 48*/ { UNICODE_MODE, 0, -1, "::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::", 0, 0, "(588) 37 68 68 68 68 68 74 7E 74 74 74 74 74 3A 3A 3A 3A 3A 3A 3A 1D 1D 1D 1D 1D 1D 1D 0E", "B512 (ASCII)" }, - /* 49*/ { UNICODE_MODE, 0, -1, "::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\177", 0, 0, "(591) 37 68 68 68 68 68 74 7E 74 74 74 74 74 3A 3A 3A 3A 3A 3A 3A 1D 1D 1D 1D 1D 1D 1D 0E", "B513 (ASCII)" }, - /* 50*/ { UNICODE_MODE, 0, -1, ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::至", 0, 0, "(591) 37 68 68 68 68 68 74 7C 74 74 74 74 74 3A 3A 3A 3A 3A 3A 3A 1D 1D 1D 1D 1D 1D 1D 0E", "B511 H1 (GB 2312)" }, - /* 51*/ { UNICODE_MODE, 0, -1, ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::至:", 0, 0, "(592) 37 68 68 68 68 68 74 7E 74 74 74 74 74 3A 3A 3A 3A 3A 3A 3A 1D 1D 1D 1D 1D 1D 1D 0E", "B513 (GB 2312)" }, - /* 52*/ { UNICODE_MODE, 0, -1, "˘", ZINT_WARN_USES_ECI, 4, "Warning 60 02 18 00 51 00", "ECI-4 B1 (ISO 8859-2)" }, - /* 53*/ { UNICODE_MODE, 4, -1, "˘", 0, 4, "60 02 18 00 51 00", "ECI-4 B1 (ISO 8859-2)" }, - /* 54*/ { UNICODE_MODE, 0, -1, "Ħ", ZINT_WARN_USES_ECI, 5, "Warning 60 02 58 00 50 40", "ECI-5 B1 (ISO 8859-3)" }, - /* 55*/ { UNICODE_MODE, 5, -1, "Ħ", 0, 5, "60 02 58 00 50 40", "ECI-5 B1 (ISO 8859-3)" }, - /* 56*/ { UNICODE_MODE, 6, -1, "ĸ", 0, 6, "60 03 18 00 51 00", "ECI-6 B1 (ISO 8859-4)" }, - /* 57*/ { UNICODE_MODE, 7, -1, "Ж", 0, 7, "60 03 58 00 5B 00", "ECI-7 B1 (ISO 8859-5)" }, - /* 58*/ { UNICODE_MODE, 0, -1, "Ș", ZINT_WARN_USES_ECI, 18, "Warning 60 09 18 00 55 00", "ECI-18 B1 (ISO 8859-16)" }, - /* 59*/ { UNICODE_MODE, 18, -1, "Ș", 0, 18, "60 09 18 00 55 00", "ECI-18 B1 (ISO 8859-16)" }, - /* 60*/ { UNICODE_MODE, 0, -1, "テ", 0, 0, "08 34 6F 78 00", "H1 (GB 2312)" }, - /* 61*/ { UNICODE_MODE, 20, -1, "テ", 0, 20, "60 0A 18 01 41 59 20", "ECI-20 B2 (SHIFT JIS)" }, - /* 62*/ { UNICODE_MODE, 20, -1, "テテ", 0, 20, "60 0A 18 03 41 59 30 36 28 00", "ECI-20 B4 (SHIFT JIS)" }, - /* 63*/ { UNICODE_MODE, 20, -1, "\\\\", 0, 20, "60 0A 18 03 40 57 70 15 78 00", "ECI-20 B4 (SHIFT JIS)" }, - /* 64*/ { UNICODE_MODE, 0, -1, "…", 0, 0, "08 01 5F 78 00", "H1 (GB 2312)" }, - /* 65*/ { UNICODE_MODE, 21, -1, "…", 0, 21, "60 0A 58 00 42 40", "ECI-21 B1 (Win 1250)" }, - /* 66*/ { UNICODE_MODE, 0, -1, "Ґ", ZINT_WARN_USES_ECI, 22, "Warning 60 0B 18 00 52 40", "ECI-22 B1 (Win 1251)" }, - /* 67*/ { UNICODE_MODE, 22, -1, "Ґ", 0, 22, "60 0B 18 00 52 40", "ECI-22 B1 (Win 1251)" }, - /* 68*/ { UNICODE_MODE, 0, -1, "˜", ZINT_WARN_USES_ECI, 23, "Warning 60 0B 58 00 4C 00", "ECI-23 B1 (Win 1252)" }, - /* 69*/ { UNICODE_MODE, 23, -1, "˜", 0, 23, "60 0B 58 00 4C 00", "ECI-23 B1 (Win 1252)" }, - /* 70*/ { UNICODE_MODE, 24, -1, "پ", 0, 24, "60 0C 18 00 40 40", "ECI-24 B1 (Win 1256)" }, - /* 71*/ { UNICODE_MODE, 0, -1, "က", ZINT_WARN_USES_ECI, 26, "Warning 60 0D 18 02 70 60 10 00", "ECI-26 B3 (UTF-8)" }, - /* 72*/ { UNICODE_MODE, 25, -1, "က", 0, 25, "60 0C 58 01 08 00 00", "ECI-25 B2 (UCS-2BE)" }, - /* 73*/ { UNICODE_MODE, 25, -1, "ကက", 0, 25, "60 0C 58 03 08 00 02 00 00 00", "ECI-25 B4 (UCS-2BE)" }, - /* 74*/ { UNICODE_MODE, 25, -1, "12", 0, 25, "60 0C 58 03 00 0C 20 03 10 00", "ECI-25 B4 (UCS-2BE ASCII)" }, - /* 75*/ { UNICODE_MODE, 27, -1, "@", 0, 27, "60 0D 4F 77 2E 60", "ECI-27 L1 (ASCII)" }, - /* 76*/ { UNICODE_MODE, 0, -1, "龘", ZINT_WARN_USES_ECI, 26, "Warning 60 0D 18 02 74 6F 53 00", "ECI-26 B3 (UTF-8)" }, - /* 77*/ { UNICODE_MODE, 28, -1, "龘", 0, 28, "60 0E 18 01 7C 75 20", "ECI-28 B2 (Big5)" }, - /* 78*/ { UNICODE_MODE, 28, -1, "龘龘", 0, 28, "60 0E 18 03 7C 75 3F 1D 28 00", "ECI-28 B4 (Big5)" }, - /* 79*/ { UNICODE_MODE, 0, -1, "齄", 0, 0, "0F 4B 6F 78 00", "H1 (GB 2312)" }, - /* 80*/ { UNICODE_MODE, 29, -1, "齄", 0, 29, "60 0E 47 65 77 7C 00", "ECI-29 H1 (GB 2312)" }, - /* 81*/ { UNICODE_MODE, 29, -1, "齄齄", 0, 29, "60 0E 47 65 77 4B 6F 78 00", "ECI-29 H2 (GB 2312)" }, - /* 82*/ { UNICODE_MODE, 0, -1, "가", ZINT_WARN_USES_ECI, 26, "Warning 60 0D 18 02 75 2C 10 00", "ECI-26 B3 (UTF-8)" }, - /* 83*/ { UNICODE_MODE, 30, -1, "가", 0, 30, "60 0F 18 01 58 28 20", "ECI-30 B2 (EUC-KR)" }, - /* 84*/ { UNICODE_MODE, 30, -1, "가가", 0, 30, "60 0F 18 03 58 28 36 0A 08 00", "ECI-30 B4 (EUC-KR)" }, - /* 85*/ { UNICODE_MODE, 170, -1, "?", 0, 170, "60 55 0F 77 26 60", "ECI-170 L1 (ASCII invariant)" }, - /* 86*/ { DATA_MODE, 899, -1, "\200", 0, 899, "63 41 58 00 40 00", "ECI-899 B1 (8-bit binary)" }, - /* 87*/ { UNICODE_MODE, 900, -1, "é", 0, 900, "63 42 18 01 61 6A 20", "ECI-900 B2 (no conversion)" }, - /* 88*/ { UNICODE_MODE, 3, -1, "β", ZINT_ERROR_INVALID_DATA, 3, "Error 535: Invalid character in input data for ECI 3", "" }, + /* 0*/ { UNICODE_MODE, 0, -1, -1, "é", 0, 0, "30 01 69 00", "B1 (ISO 8859-1)" }, + /* 1*/ { UNICODE_MODE, 3, -1, -1, "é", 0, 3, "60 01 58 00 74 40", "ECI-3 B1 (ISO 8859-1)" }, + /* 2*/ { UNICODE_MODE, 29, -1, -1, "é", 0, 29, "60 0E 44 2A 37 7C 00", "ECI-29 H1 (GB 2312)" }, + /* 3*/ { UNICODE_MODE, 26, -1, -1, "é", 0, 26, "60 0D 18 01 61 6A 20", "ECI-26 B2 (UTF-8)" }, + /* 4*/ { UNICODE_MODE, 26, -1, ZINT_FULL_MULTIBYTE, "é", 0, 26, "60 0D 05 28 4F 7C 00", "ECI-26 H1 (UTF-8) (full multibyte)" }, + /* 5*/ { DATA_MODE, 0, -1, -1, "é", 0, 0, "30 03 43 54 40", "B2 (UTF-8)" }, + /* 6*/ { DATA_MODE, 0, -1, ZINT_FULL_MULTIBYTE, "é", 0, 0, "0A 51 1F 78 00", "H1 (UTF-8) (full multibyte)" }, + /* 7*/ { DATA_MODE, 0, -1, -1, "\351", 0, 0, "30 01 69 00", "B1 (ISO 8859-1) (0xE9)" }, + /* 8*/ { UNICODE_MODE, 0, -1, -1, "β", 0, 0, "08 40 2F 78 00", "H1 (GB 2312)" }, + /* 9*/ { UNICODE_MODE, 9, -1, -1, "β", 0, 9, "60 04 58 00 71 00", "ECI-9 B1 (ISO 8859-7)" }, + /* 10*/ { UNICODE_MODE, 29, -1, -1, "β", 0, 29, "60 0E 44 20 17 7C 00", "ECI-29 H1 (GB 2312)" }, + /* 11*/ { UNICODE_MODE, 26, -1, -1, "β", 0, 26, "60 0D 18 01 67 2C 40", "ECI-26 H1 (UTF-8)" }, + /* 12*/ { UNICODE_MODE, 26, -1, ZINT_FULL_MULTIBYTE, "β", 0, 26, "60 0D 05 6B 17 7C 00", "ECI-26 H1 (UTF-8) (full multibyte)" }, + /* 13*/ { DATA_MODE, 0, -1, -1, "β", 0, 0, "30 03 4E 59 00", "B2 (UTF-8)" }, + /* 14*/ { DATA_MODE, 0, -1, ZINT_FULL_MULTIBYTE, "β", 0, 0, "0B 56 2F 78 00", "H1 (UTF-8) (full multibyte)" }, + /* 15*/ { UNICODE_MODE, 0, -1, -1, "ÿ", 0, 0, "30 01 7F 00", "B1 (ISO 8859-1)" }, + /* 16*/ { UNICODE_MODE, 0, -1, -1, "ÿÿÿ", 0, 0, "30 05 7F 7F 7F 60", "B3 (ISO 8859-1)" }, + /* 17*/ { UNICODE_MODE, 0, -1, -1, "㈩一", 0, 0, "08 15 68 0E 7F 70 00", "H2 (GB 2312)" }, + /* 18*/ { UNICODE_MODE, 29, -1, -1, "㈩一", 0, 29, "60 0E 44 0A 74 07 3F 78 00", "ECI-29 H2 (GB 2312)" }, + /* 19*/ { DATA_MODE, 0, -1, -1, "\177\177", 0, 0, "30 02 7F 3F 40", "B2 (ASCII)" }, + /* 20*/ { DATA_MODE, 0, -1, -1, "\177\177\177", 0, 0, "30 04 7F 3F 5F 60", "B3 (ASCII)" }, + /* 21*/ { UNICODE_MODE, 0, -1, -1, "123", 0, 0, "10 1E 7F 68", "N3 (ASCII)" }, + /* 22*/ { UNICODE_MODE, 0, -1, -1, " 123", 0, 0, "11 7A 03 6F 7D 00", "N4 (ASCII)" }, + /* 23*/ { UNICODE_MODE, 0, -1, -1, "1+23", 0, 0, "11 7B 03 6F 7D 00", "N4 (ASCII)" }, + /* 24*/ { UNICODE_MODE, 0, -1, -1, "12.3", 0, 0, "11 7C 63 6F 7D 00", "N4 (ASCII)" }, + /* 25*/ { UNICODE_MODE, 0, -1, -1, "123,", 0, 0, "10 1E 7F 73 76 5E 60", "N3 L1 (ASCII)" }, + /* 26*/ { UNICODE_MODE, 0, -1, -1, "123,4", 0, 0, "14 1E 7F 51 48 3F 50", "N5 (ASCII)" }, + /* 27*/ { UNICODE_MODE, 0, -1, -1, "\015\012123", 0, 0, "11 7D 63 6F 7D 00", "N4 (ASCII) (EOL)" }, + /* 28*/ { UNICODE_MODE, 0, -1, -1, "1\015\01223", 0, 0, "11 7E 03 6F 7D 00", "N4 (ASCII) (EOL)" }, + /* 29*/ { UNICODE_MODE, 0, -1, -1, "12\015\0123", 0, 0, "11 7E 23 6F 7D 00", "N4 (ASCII) (EOL)" }, + /* 30*/ { UNICODE_MODE, 0, -1, -1, "123\015\012", 0, 0, "10 1E 7F 7C 01 06 42 40", "N3 B2 (ASCII) (EOL)" }, + /* 31*/ { UNICODE_MODE, 0, -1, -1, "123\015\0124", 0, 0, "14 1E 7F 5D 48 3F 50", "N5 (ASCII) (EOL)" }, + /* 32*/ { UNICODE_MODE, 0, -1, -1, "2.2.0", 0, 0, "15 7C 46 73 78 40 07 7A", "N5 (ASCII)" }, + /* 33*/ { UNICODE_MODE, 0, -1, -1, "2.2.0.5", 0, 0, "30 0C 32 17 0C 45 63 01 38 6A 00", "B7 (ASCII)" }, + /* 34*/ { UNICODE_MODE, 0, -1, -1, "2.2.0.56", 0, 0, "13 7C 46 73 78 40 07 71 46 0F 74", "N8 (ASCII)" }, + /* 35*/ { UNICODE_MODE, 0, -1, -1, "20.12.13.\015\012", 0, 0, "11 7C 66 27 79 0D 2F 7F 00 45 60 68 28 00", "N8 B3 (ASCII)" }, + /* 36*/ { UNICODE_MODE, 0, -1, -1, "ABCDE\011F", 0, 0, "20 01 08 32 3E 49 17 30", "U7 (ASCII)" }, + /* 37*/ { UNICODE_MODE, 0, -1, -1, "1 1234ABCD12.2abcd-12", 0, 0, "13 7A 23 41 2A 3F 68 01 08 3E 4F 66 1E 5F 70 00 44 1F 2F 6E 0F 0F 74", "N6 U4 N4 L4 N3 (ASCII)" }, + /* 38*/ { UNICODE_MODE, 0, -1, -1, "1 123ABCDE12.2abcd-12", 0, 0, "28 1F 40 42 06 28 59 43 27 01 05 7D 56 42 49 16 34 7F 6D 30 08 2F 60", "M21 (ASCII)" }, + /* 39*/ { UNICODE_MODE, 0, -1, -1, "国外通信教材 Matlab6.5", 0, 0, "09 63 27 20 4E 24 1F 05 21 58 22 13 7E 1E 4C 78 09 56 00 3D 3F 4A 45 3F 50", "H6 U2 L5 N3 (GB 2312) (Same as D.2 example)" }, + /* 40*/ { UNICODE_MODE, 0, -1, -1, "AAT", 0, 0, "20 00 4F 30", "U3 (ASCII)" }, + /* 41*/ { UNICODE_MODE, 0, -1, -1, "aat", 0, 0, "18 00 4F 30", "L3 (ASCII)" }, + /* 42*/ { UNICODE_MODE, 0, -1, -1, "AAT2556", 0, 0, "20 00 4F 58 7F 65 47 7A", "U3 N4 (ASCII) (note same bit count as M7)" }, + /* 43*/ { UNICODE_MODE, 0, -1, -1, "AAT2556 ", 0, 0, "29 22 4E 42 0A 14 37 6F 60", "M8 (ASCII)" }, + /* 44*/ { UNICODE_MODE, 0, -1, -1, "AAT2556 电", 0, 0, "29 22 4E 42 0A 14 37 6F 62 2C 1F 7E 00", "M8 H1 (GB 2312)" }, + /* 45*/ { UNICODE_MODE, 0, -1, -1, " 200", 0, 0, "11 7A 06 23 7D 00", "N4 (ASCII)" }, + /* 46*/ { UNICODE_MODE, 0, -1, -1, " 200mA至", 0, 0, "2F 60 40 00 60 2B 78 63 41 7F 40", "M6 H1 (GB 2312)" }, + /* 47*/ { UNICODE_MODE, 0, -1, -1, "2A tel:86 019 82512738", 0, 0, "28 22 5F 4F 29 48 5F 6D 7E 6F 55 57 1F 28 63 0F 5A 11 64 0F 74", "M2 L5(with control) N15 (ASCII)" }, + /* 48*/ { UNICODE_MODE, 0, -1, -1, "至2A tel:86 019 82512738", 0, 0, "30 07 56 60 4C 48 13 6A 32 17 7B 3F 5B 75 35 67 6A 18 63 76 44 39 03 7D 00", "B4 L5(with control) N15 (GB 2312)" }, + /* 49*/ { UNICODE_MODE, 0, -1, -1, "AAT2556 电池充电器+降压转换器 200mA至2A tel:86 019 82512738", 0, 0, "(62) 29 22 22 1C 4E 41 42 7E 0A 40 14 00 37 7E 6F 00 62 7E 2C 00 1C 7E 4B 00 41 7E 18 00", "M8 H11 M6 B4 L5(with control) N15 (GB 2312) (*NOT SAME* as D3 example Figure D.1, M8 H11 M6 H1 M3 L4(with control) N15, which uses a few more bits)" }, + /* 50*/ { UNICODE_MODE, 0, -1, -1, "::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::", 0, 0, "(588) 37 68 68 68 68 68 74 7E 74 74 74 74 74 3A 3A 3A 3A 3A 3A 3A 1D 1D 1D 1D 1D 1D 1D 0E", "B512 (ASCII)" }, + /* 51*/ { UNICODE_MODE, 0, -1, -1, "::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\177", 0, 0, "(591) 37 68 68 68 68 68 74 7E 74 74 74 74 74 3A 3A 3A 3A 3A 3A 3A 1D 1D 1D 1D 1D 1D 1D 0E", "B513 (ASCII)" }, + /* 52*/ { UNICODE_MODE, 0, -1, -1, ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::至", 0, 0, "(591) 37 68 68 68 68 68 74 7C 74 74 74 74 74 3A 3A 3A 3A 3A 3A 3A 1D 1D 1D 1D 1D 1D 1D 0E", "B511 H1 (GB 2312)" }, + /* 53*/ { UNICODE_MODE, 0, -1, -1, ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::至:", 0, 0, "(592) 37 68 68 68 68 68 74 7E 74 74 74 74 74 3A 3A 3A 3A 3A 3A 3A 1D 1D 1D 1D 1D 1D 1D 0E", "B513 (GB 2312)" }, + /* 54*/ { UNICODE_MODE, 0, -1, -1, "电电123456", 0, 0, "09 30 72 61 7F 70 41 76 72 1F 68", "H2 (GB 2312) N6" }, + /* 55*/ { UNICODE_MODE, 0, -1, -1, "电电abcdef", 0, 0, "09 30 72 61 7F 71 00 08 43 10 5D 40", "H2 (GB 2312) L6" }, + /* 56*/ { UNICODE_MODE, 0, -1, -1, "电电电电电\011\011\011", 0, 0, "09 30 72 61 65 43 4B 07 16 0F 7F 14 02 04 42 21 10", "H5 (GB 2312) B3" }, + /* 57*/ { UNICODE_MODE, 0, -1, -1, "1234567电电", 0, 0, "14 1E 6E 22 5E 3F 59 30 72 61 7F 70 00", "N7 H2 (GB 2312)" }, + /* 58*/ { UNICODE_MODE, 0, -1, -1, "12345678mA 2", 0, 0, "12 1E 6E 23 06 3F 76 02 5F 02 7E 00", "N8 M4" }, + /* 59*/ { UNICODE_MODE, 0, -1, -1, "ABCDEFG电电", 0, 0, "20 01 08 32 0A 37 05 43 4B 07 7F 40", "U7 H2 (GB 2312)" }, + /* 60*/ { UNICODE_MODE, 0, -1, -1, "ABCDEFGHIJ8mA 2", 0, 0, "20 01 08 32 0A 31 68 27 70 46 02 5F 02 7E 00", "U10 M5" }, + /* 61*/ { UNICODE_MODE, 0, -1, -1, "ABCDEFGHIJ\011\011\011\011", 0, 0, "20 01 08 32 0A 31 68 27 78 03 04 42 21 10 48 00", "U10 B4" }, + /* 62*/ { UNICODE_MODE, 0, -1, -1, "8mA B123456789", 0, 0, "29 0C 05 3E 17 7C 40 7B 39 0C 2B 7E 40", "M5 N9" }, + /* 63*/ { UNICODE_MODE, 0, -1, -1, "8mA aABCDEFGH", 0, 0, "29 0C 05 3E 49 7D 00 04 21 48 29 47 6C", "M5 U8" }, + /* 64*/ { UNICODE_MODE, 0, -1, -1, "\011\011\011\011123456", 0, 0, "30 06 09 04 42 21 12 03 6D 64 3F 50", "B4 N6" }, + /* 65*/ { UNICODE_MODE, 0, -1, -1, "\011\011\011\011ABCDEF", 0, 0, "30 06 09 04 42 21 14 00 11 06 21 3B", "B4 U6" }, + /* 66*/ { UNICODE_MODE, 0, -1, -1, "\011\011\011\0118mA 2", 0, 0, "30 06 09 04 42 21 15 11 40 57 60 5F 40", "B4 M5" }, + /* 67*/ { UNICODE_MODE, 0, -1, -1, "电电电电电\015\012", 0, 0, "09 30 72 61 65 43 4B 07 16 0F 73 03 7E 00", "H7 (GB 2312)" }, + /* 68*/ { UNICODE_MODE, 0, -1, -1, "电电电电电12", 0, 0, "09 30 72 61 65 43 4B 07 16 0F 7B 37 7E 00", "H7 (GB 2312)" }, + /* 69*/ { UNICODE_MODE, 0, -1, -1, "1234567.8\015\012123456", 0, 0, "10 1E 6E 23 79 30 67 77 0F 37 11 7E 40", "N17" }, + /* 70*/ { UNICODE_MODE, 0, -1, -1, "˘", ZINT_WARN_USES_ECI, 4, "Warning 60 02 18 00 51 00", "ECI-4 B1 (ISO 8859-2)" }, + /* 71*/ { UNICODE_MODE, 4, -1, -1, "˘", 0, 4, "60 02 18 00 51 00", "ECI-4 B1 (ISO 8859-2)" }, + /* 72*/ { UNICODE_MODE, 0, -1, -1, "Ħ", ZINT_WARN_USES_ECI, 5, "Warning 60 02 58 00 50 40", "ECI-5 B1 (ISO 8859-3)" }, + /* 73*/ { UNICODE_MODE, 5, -1, -1, "Ħ", 0, 5, "60 02 58 00 50 40", "ECI-5 B1 (ISO 8859-3)" }, + /* 74*/ { UNICODE_MODE, 6, -1, -1, "ĸ", 0, 6, "60 03 18 00 51 00", "ECI-6 B1 (ISO 8859-4)" }, + /* 75*/ { UNICODE_MODE, 7, -1, -1, "Ж", 0, 7, "60 03 58 00 5B 00", "ECI-7 B1 (ISO 8859-5)" }, + /* 76*/ { UNICODE_MODE, 0, -1, -1, "Ș", ZINT_WARN_USES_ECI, 18, "Warning 60 09 18 00 55 00", "ECI-18 B1 (ISO 8859-16)" }, + /* 77*/ { UNICODE_MODE, 18, -1, -1, "Ș", 0, 18, "60 09 18 00 55 00", "ECI-18 B1 (ISO 8859-16)" }, + /* 78*/ { UNICODE_MODE, 0, -1, -1, "テ", 0, 0, "08 34 6F 78 00", "H1 (GB 2312)" }, + /* 79*/ { UNICODE_MODE, 20, -1, -1, "テ", 0, 20, "60 0A 18 01 41 59 20", "ECI-20 B2 (SHIFT JIS)" }, + /* 80*/ { UNICODE_MODE, 20, -1, -1, "テテ", 0, 20, "60 0A 18 03 41 59 30 36 28 00", "ECI-20 B4 (SHIFT JIS)" }, + /* 81*/ { UNICODE_MODE, 20, -1, -1, "\\\\", 0, 20, "60 0A 18 03 40 57 70 15 78 00", "ECI-20 B4 (SHIFT JIS)" }, + /* 82*/ { UNICODE_MODE, 0, -1, -1, "…", 0, 0, "08 01 5F 78 00", "H1 (GB 2312)" }, + /* 83*/ { UNICODE_MODE, 21, -1, -1, "…", 0, 21, "60 0A 58 00 42 40", "ECI-21 B1 (Win 1250)" }, + /* 84*/ { UNICODE_MODE, 0, -1, -1, "Ґ", ZINT_WARN_USES_ECI, 22, "Warning 60 0B 18 00 52 40", "ECI-22 B1 (Win 1251)" }, + /* 85*/ { UNICODE_MODE, 22, -1, -1, "Ґ", 0, 22, "60 0B 18 00 52 40", "ECI-22 B1 (Win 1251)" }, + /* 86*/ { UNICODE_MODE, 0, -1, -1, "˜", ZINT_WARN_USES_ECI, 23, "Warning 60 0B 58 00 4C 00", "ECI-23 B1 (Win 1252)" }, + /* 87*/ { UNICODE_MODE, 23, -1, -1, "˜", 0, 23, "60 0B 58 00 4C 00", "ECI-23 B1 (Win 1252)" }, + /* 88*/ { UNICODE_MODE, 24, -1, -1, "پ", 0, 24, "60 0C 18 00 40 40", "ECI-24 B1 (Win 1256)" }, + /* 89*/ { UNICODE_MODE, 0, -1, -1, "က", ZINT_WARN_USES_ECI, 26, "Warning 60 0D 18 02 70 60 10 00", "ECI-26 B3 (UTF-8)" }, + /* 90*/ { UNICODE_MODE, 25, -1, -1, "က", 0, 25, "60 0C 58 01 08 00 00", "ECI-25 B2 (UCS-2BE)" }, + /* 91*/ { UNICODE_MODE, 25, -1, -1, "ကက", 0, 25, "60 0C 58 03 08 00 02 00 00 00", "ECI-25 B4 (UCS-2BE)" }, + /* 92*/ { UNICODE_MODE, 25, -1, -1, "12", 0, 25, "60 0C 58 03 00 0C 20 03 10 00", "ECI-25 B4 (UCS-2BE ASCII)" }, + /* 93*/ { UNICODE_MODE, 27, -1, -1, "@", 0, 27, "60 0D 4F 77 2E 60", "ECI-27 L1 (ASCII)" }, + /* 94*/ { UNICODE_MODE, 0, -1, -1, "龘", ZINT_WARN_USES_ECI, 26, "Warning 60 0D 18 02 74 6F 53 00", "ECI-26 B3 (UTF-8)" }, + /* 95*/ { UNICODE_MODE, 28, -1, -1, "龘", 0, 28, "60 0E 18 01 7C 75 20", "ECI-28 B2 (Big5)" }, + /* 96*/ { UNICODE_MODE, 28, -1, -1, "龘龘", 0, 28, "60 0E 18 03 7C 75 3F 1D 28 00", "ECI-28 B4 (Big5)" }, + /* 97*/ { UNICODE_MODE, 0, -1, -1, "齄", 0, 0, "0F 4B 6F 78 00", "H1 (GB 2312)" }, + /* 98*/ { UNICODE_MODE, 29, -1, -1, "齄", 0, 29, "60 0E 47 65 77 7C 00", "ECI-29 H1 (GB 2312)" }, + /* 99*/ { UNICODE_MODE, 29, -1, -1, "齄齄", 0, 29, "60 0E 47 65 77 4B 6F 78 00", "ECI-29 H2 (GB 2312)" }, + /*100*/ { UNICODE_MODE, 0, -1, -1, "가", ZINT_WARN_USES_ECI, 26, "Warning 60 0D 18 02 75 2C 10 00", "ECI-26 B3 (UTF-8)" }, + /*101*/ { UNICODE_MODE, 30, -1, -1, "가", 0, 30, "60 0F 18 01 58 28 20", "ECI-30 B2 (EUC-KR)" }, + /*102*/ { UNICODE_MODE, 30, -1, -1, "가가", 0, 30, "60 0F 18 03 58 28 36 0A 08 00", "ECI-30 B4 (EUC-KR)" }, + /*103*/ { UNICODE_MODE, 170, -1, -1, "?", 0, 170, "60 55 0F 77 26 60", "ECI-170 L1 (ASCII invariant)" }, + /*104*/ { DATA_MODE, 899, -1, -1, "\200", 0, 899, "63 41 58 00 40 00", "ECI-899 B1 (8-bit binary)" }, + /*105*/ { UNICODE_MODE, 900, -1, -1, "é", 0, 900, "63 42 18 01 61 6A 20", "ECI-900 B2 (no conversion)" }, + /*106*/ { UNICODE_MODE, 1024, -1, -1, "é", 0, 1024, "64 08 00 30 03 43 54 40", "ECI-1024 B2 (no conversion)" }, + /*107*/ { UNICODE_MODE, 32768, -1, -1, "é", 0, 32768, "66 08 00 01 40 0E 0E 52 00", "ECI-32768 B2 (no conversion)" }, + /*108*/ { UNICODE_MODE, 811800, -1, -1, "é", ZINT_ERROR_INVALID_OPTION, 811800, "Error 533: Invalid ECI", "" }, + /*109*/ { UNICODE_MODE, 3, -1, -1, "β", ZINT_ERROR_INVALID_DATA, 3, "Error 535: Invalid character in input data for ECI 3", "" }, + /*110*/ { UNICODE_MODE, 0, READER_INIT, -1, "12", 0, 0, "51 11 71 7E 40", "" }, }; int data_size = ARRAY_SIZE(data); int i, length, ret; @@ -271,14 +299,14 @@ static void test_input(int index, int generate, int debug) { debug |= ZINT_DEBUG_TEST; // Needed to get codeword dump in errtxt - length = testUtilSetSymbol(symbol, BARCODE_GRIDMATRIX, data[i].input_mode, data[i].eci, -1 /*option_1*/, -1, data[i].option_3, -1 /*output_options*/, data[i].data, -1, debug); + length = testUtilSetSymbol(symbol, BARCODE_GRIDMATRIX, data[i].input_mode, data[i].eci, -1 /*option_1*/, -1, data[i].option_3, data[i].output_options, data[i].data, -1, debug); ret = ZBarcode_Encode(symbol, (unsigned char *) data[i].data, length); assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d\n", i, ret, data[i].ret); if (generate) { - printf(" /*%3d*/ { %s, %d, %s, \"%s\", %s, %d, \"%s\", \"%s\" },\n", - i, testUtilInputModeName(data[i].input_mode), data[i].eci, testUtilOption3Name(data[i].option_3), + printf(" /*%3d*/ { %s, %d, %s, %s, \"%s\", %s, %d, \"%s\", \"%s\" },\n", + i, testUtilInputModeName(data[i].input_mode), data[i].eci, testUtilOutputOptionsName(data[i].output_options), testUtilOption3Name(data[i].option_3), testUtilEscape(data[i].data, length, escaped, sizeof(escaped)), testUtilErrorName(data[i].ret), ret < ZINT_ERROR ? symbol->eci : -1, symbol->errtxt, data[i].comment); } else { @@ -432,14 +460,12 @@ static void test_encode(int index, int generate, int debug) { printf(" },\n"); } else { if (ret < ZINT_ERROR) { + int width, row; assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d (%s)\n", i, symbol->rows, data[i].expected_rows, data[i].data); assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d (%s)\n", i, symbol->width, data[i].expected_width, data[i].data); - if (ret == 0) { - int width, row; - ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); - assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data); - } + ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); + assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data); } } diff --git a/backend/tests/test_hanxin.c b/backend/tests/test_hanxin.c index 72f69c17..571addb5 100644 --- a/backend/tests/test_hanxin.c +++ b/backend/tests/test_hanxin.c @@ -255,7 +255,8 @@ static void test_input(int index, int generate, int debug) { /* 76*/ { UNICODE_MODE, 170, -1, "?", -1, 0, 170, "88 0A A2 FB 1F C0 00 00 00", "ECI-170 L1 (ASCII invariant)" }, /* 77*/ { DATA_MODE, 899, -1, "\200", -1, 0, 899, "88 38 33 00 0C 00 00 00 00", "ECI-899 B1 (8-bit binary)" }, /* 78*/ { UNICODE_MODE, 900, -1, "é", -1, 0, 900, "88 38 43 00 16 1D 48 00 00", "ECI-900 B2 (no conversion)" }, - /* 79*/ { UNICODE_MODE, 3, -1, "β", -1, ZINT_ERROR_INVALID_DATA, 3, "Error 545: Invalid character in input data for ECI 3", "" }, + /* 79*/ { UNICODE_MODE, 16384, -1, "é", -1, 0, 16384, "8C 04 00 03 00 16 1D 48 00", "ECI-16384 B2 (no conversion)" }, + /* 80*/ { UNICODE_MODE, 3, -1, "β", -1, ZINT_ERROR_INVALID_DATA, 3, "Error 545: Invalid character in input data for ECI 3", "" }, }; int data_size = ARRAY_SIZE(data); int i, length, ret; @@ -1490,14 +1491,12 @@ static void test_encode(int index, int generate, int debug) { printf(" },\n"); } else { if (ret < ZINT_ERROR) { + int width, row; assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d (%s)\n", i, symbol->rows, data[i].expected_rows, data[i].data); assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d (%s)\n", i, symbol->width, data[i].expected_width, data[i].data); - if (ret == 0) { - int width, row; - ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); - assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data); - } + ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); + assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data); } } diff --git a/backend/tests/test_library.c b/backend/tests/test_library.c index 5d187580..f5891c19 100644 --- a/backend/tests/test_library.c +++ b/backend/tests/test_library.c @@ -704,9 +704,9 @@ static void test_error_tag(int index) { struct item { int error_number; int warn_level; - char* data; + char *data; int ret; - char* expected; + char *expected; }; // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<")) struct item data[] = { diff --git a/backend/tests/test_mailmark.c b/backend/tests/test_mailmark.c index ec949991..a4c01677 100644 --- a/backend/tests/test_mailmark.c +++ b/backend/tests/test_mailmark.c @@ -95,6 +95,7 @@ static void test_input(int index, int debug) { /* 51*/ { "01000000000000000C12JQ3U A", ZINT_ERROR_INVALID_DATA, -1, -1 }, // F N N L L N L S S bad 2nd S /* 52*/ { "01000000000000000C123JQ4U ", 0, 3, 155, }, // F N N N L L N L S /* 53*/ { "01000000000000000C 23JQ4U ", ZINT_ERROR_INVALID_DATA, -1, -1 }, // F N N N L L N L S bad 1st N (non-alpha otherwise matches 2nd pattern) + /* 54*/ { "41038422416563762XY1", ZINT_ERROR_INVALID_DATA, -1, -1 }, }; int data_size = ARRAY_SIZE(data); int i, length, ret; diff --git a/backend/tests/test_maxicode.c b/backend/tests/test_maxicode.c index 32f259a6..5096b9fa 100644 --- a/backend/tests/test_maxicode.c +++ b/backend/tests/test_maxicode.c @@ -38,7 +38,7 @@ static void test_large(int index, int debug) { int option_2; char *pattern; int length; - char* primary; + char *primary; int ret; int expected_rows; int expected_width; @@ -225,7 +225,7 @@ static void test_encode(int index, int generate, int debug) { int option_2; char *data; int length; - char* primary; + char *primary; int ret; int expected_rows; diff --git a/backend/tests/test_plessey.c b/backend/tests/test_plessey.c index b48991d7..264e49e4 100644 --- a/backend/tests/test_plessey.c +++ b/backend/tests/test_plessey.c @@ -180,8 +180,10 @@ static void test_input(int index, int debug) { struct item data[] = { /* 0*/ { BARCODE_MSI_PLESSEY, -1, "1", 0, 1, 19 }, /* 1*/ { BARCODE_MSI_PLESSEY, -1, "A", ZINT_ERROR_INVALID_DATA, -1, -1 }, - /* 2*/ { BARCODE_PLESSEY, -1, "A", 0, 1, 83 }, - /* 3*/ { BARCODE_PLESSEY, -1, "G", ZINT_ERROR_INVALID_DATA, -1, -1 }, + /* 2*/ { BARCODE_MSI_PLESSEY, -2, "1", 0, 1, 19 }, // < 0 ignored + /* 3*/ { BARCODE_MSI_PLESSEY, 7, "1", 0, 1, 19 }, // > 6 ignored + /* 4*/ { BARCODE_PLESSEY, -1, "A", 0, 1, 83 }, + /* 5*/ { BARCODE_PLESSEY, -1, "G", ZINT_ERROR_INVALID_DATA, -1, -1 }, }; int data_size = ARRAY_SIZE(data); int i, length, ret; diff --git a/backend/tests/test_ps.c b/backend/tests/test_ps.c index fd8992e8..0b3a788a 100644 --- a/backend/tests/test_ps.c +++ b/backend/tests/test_ps.c @@ -87,6 +87,7 @@ static void test_print(int index, int generate, int debug) { /* 32*/ { BARCODE_DOTCODE, -1, -1, -1, -1, -1, -1, -1, 5, 1.7, "", "", 0, "12", "dotcode_5.0_ds1.7.eps" }, /* 33*/ { BARCODE_DOTCODE, -1, -1, -1, -1, -1, -1, -1, 0, 0, "FF0000", "0000FF00", 0, "12", "dotcode_no_bg.eps" }, /* 34*/ { BARCODE_MAXICODE, -1, -1, CMYK_COLOUR, -1, -1, -1, -1, 0, 0, "", "", 270, "12", "maxicode_rotate_270_cmyk.eps" }, + /* 35*/ { BARCODE_MAXICODE, -1, -1, -1, 3, -1, -1, -1, 0, 0, "", "0000FF00", 180, "12", "maxicode_no_bg_hwsp3_rotate_180.eps" }, }; int data_size = ARRAY_SIZE(data); int i, length, ret; diff --git a/backend/tests/test_qr.c b/backend/tests/test_qr.c index 91cdfeb8..b2d6c4e7 100644 --- a/backend/tests/test_qr.c +++ b/backend/tests/test_qr.c @@ -76,6 +76,8 @@ static void test_qr_options(int index, int debug) { /* 29*/ { 4, 34, "貫やぐ識禁ぱい再2間変字全ノレ没無8裁花ほゃ過法ひなご札17能つーびれ投覧マ勝動エヨ額界よみ作皇ナヲニ打題ヌルヲ掲布益フが。入35能ト権話しこを断兆モヘ細情おじ名4減エヘイハ側機はょが意見想ハ業独案ユヲウ患職ヲ平美さ毎放どぽたけ家没べお化富べ町大シ情魚ッでれ一冬すぼめり。社ト可化モマ試音ばじご育青康演ぴぎ権型固スで能麩ぜらもほ河都しちほラ収90作の年要とだむ部動ま者断チ第41一1米索焦茂げむしれ。測フ物使だて目月国スリカハ夏検にいへ児72告物ゆは載核ロアメヱ登輸どべゃ催行アフエハ議歌ワ河倫剖だ。記タケウ因載ヒイホヤ禁3輩彦関トえび肝区勝ワリロ成禁ぼよ界白ウヒキレ中島べせぜい各安うしぽリ覧生テ基一でむしゃ中新トヒキソ声碁スしび起田ア信大未ゅもばち。", 0, 0, 153, 0 }, /* 30*/ { 4, -1, "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 0, 0, 177, -1 }, // 1852 alphanumerics max for ECC 4 (H) /* 31*/ { 1, -1, "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 0, 0, 177, -1 }, // 4296 alphanumerics max for ECC 1 (L) + /* 32*/ { 4, -1, "貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫", 0, -1, 0, -1 }, // 424 Kanji, ECC 4 (Q), version 1 + /* 33*/ { 4, -1, "貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫貫", ZINT_ERROR_TOO_LONG, -1, 0, -1 }, // 425 Kanji, ECC 4 (Q), version 1 }; int data_size = ARRAY_SIZE(data); int i, length, ret; @@ -88,7 +90,7 @@ static void test_qr_options(int index, int debug) { for (i = 0; i < data_size; i++) { if (index != -1 && i != index) continue; - if (debug & ZINT_DEBUG_TEST_PRINT) printf("i:%d\n", i); + if ((debug & ZINT_DEBUG_TEST_PRINT) && !(debug & ZINT_DEBUG_TEST_LESS_NOISY)) printf("i:%d\n", i); symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); @@ -282,7 +284,7 @@ static void test_qr_input(int index, int generate, int debug) { for (i = 0; i < data_size; i++) { if (index != -1 && i != index) continue; - if (debug & ZINT_DEBUG_TEST_PRINT) printf("i:%d\n", i); + if ((debug & ZINT_DEBUG_TEST_PRINT) && !(debug & ZINT_DEBUG_TEST_LESS_NOISY)) printf("i:%d\n", i); symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); @@ -347,7 +349,7 @@ static void test_qr_gs1(int index, int generate, int debug) { for (i = 0; i < data_size; i++) { if (index != -1 && i != index) continue; - if (debug & ZINT_DEBUG_TEST_PRINT) printf("i:%d\n", i); + if ((debug & ZINT_DEBUG_TEST_PRINT) && !(debug & ZINT_DEBUG_TEST_LESS_NOISY)) printf("i:%d\n", i); symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); @@ -425,7 +427,7 @@ static void test_qr_optimize(int index, int generate, int debug) { for (i = 0; i < data_size; i++) { if (index != -1 && i != index) continue; - if (debug & ZINT_DEBUG_TEST_PRINT) printf("i:%d\n", i); + if ((debug & ZINT_DEBUG_TEST_PRINT) && !(debug & ZINT_DEBUG_TEST_LESS_NOISY)) printf("i:%d\n", i); symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); @@ -1271,7 +1273,7 @@ static void test_qr_encode(int index, int generate, int debug) { for (i = 0; i < data_size; i++) { if (index != -1 && i != index) continue; - if (debug & ZINT_DEBUG_TEST_PRINT) printf("i:%d\n", i); + if ((debug & ZINT_DEBUG_TEST_PRINT) && !(debug & ZINT_DEBUG_TEST_LESS_NOISY)) printf("i:%d\n", i); symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); @@ -1290,14 +1292,12 @@ static void test_qr_encode(int index, int generate, int debug) { printf(" },\n"); } else { if (ret < ZINT_ERROR) { + int width, row; assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d (%s)\n", i, symbol->rows, data[i].expected_rows, data[i].data); assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d (%s)\n", i, symbol->width, data[i].expected_width, data[i].data); - if (ret == 0) { - int width, row; - ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); - assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data); - } + ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); + assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data); } } @@ -1453,6 +1453,8 @@ static void test_microqr_options(int index, int debug) { /* 47*/ { "ABCDEFGHIJABCDEFGH", 3, 4, ZINT_ERROR_TOO_LONG, -1, 0, -1 }, /* 48*/ { "ABCDEFGHIJABC", 3, 4, 0, 0, 17, -1 }, // 13 alphanumerics, ECC 3 (Q), version 4 /* 49*/ { "123456789012345678901234567890123456", -1, -1, ZINT_ERROR_TOO_LONG, -1, 0, -1 }, // 35 absolute max + /* 50*/ { "貫貫貫貫貫", -1, -1, 0, 0, 17, -1 }, // 5 Kanji max + /* 51*/ { "貫貫貫貫貫貫", -1, -1, ZINT_ERROR_TOO_LONG, -1, 0, -1 }, }; int data_size = ARRAY_SIZE(data); int i, length, ret; @@ -1610,26 +1612,36 @@ static void test_microqr_padding(int index, int generate, int debug) { /* 2*/ { "123", -1, 0, "63 D8 00", "M1, bits left 7" }, /* 3*/ { "1234", -1, 0, "83 DA 00", "M1, bits left 3" }, /* 4*/ { "12345", -1, 0, "A3 DA D0", "M1, bits left 0" }, - /* 5*/ { "12345678", 1, 0, "40 F6 E4 4E 00", "M2-L, bits left 8" }, - /* 6*/ { "123456789", 1, 0, "48 F6 E4 62 A0", "M2-L, bits left 5" }, - /* 7*/ { "1234567890", 1, 0, "50 F6 E4 62 A0", "M2-L, bits left 1" }, - /* 8*/ { "12345678", 2, 0, "40 F6 E4 4E", "M2-M, bits left 0" }, - /* 9*/ { "ABCDEF", 1, 0, "E3 9A 8A 54 28", "M2-L, bits left 3" }, - /* 10*/ { "ABCDE", 2, 0, "D3 9A 8A 4E", "M2-M, bits left 0" }, - /* 11*/ { "123456789012345678901", 1, 0, "2A 3D B9 18 A8 18 AC D4 DC 28 00", "M3-L, bits left 7" }, - /* 12*/ { "1234567890123456789012", 1, 0, "2C 3D B9 18 A8 18 AC D4 DC 29 00", "M3-L, bits left 3" }, - /* 13*/ { "12345678901234567890123", 1, 0, "2E 3D B9 18 A8 18 AC D4 DC 29 70", "M3-L, bits left 0" }, - /* 14*/ { "123456789012345678", 2, 0, "24 3D B9 18 A8 18 AC D4 C0", "M3-M, bits left 1" }, - /* 15*/ { "ABCDEFGHIJKLMN", 1, 0, "78 E6 A2 95 0A B8 59 EB 99 7E A0", "M3-L, bits left 1" }, - /* 16*/ { "ABCDEFGHIJK", 2, 0, "6C E6 A2 95 0A B8 59 EA 80", "M3-M, bits left 1" }, - /* 17*/ { "1234567890123456789012345678901234", 1, 0, "11 0F 6E 46 2A 06 2B 35 37 0A 75 46 FB D0 F6 80", "M4-L, bits left 5" }, - /* 18*/ { "12345678901234567890123456789012345", 1, 0, "11 8F 6E 46 2A 06 2B 35 37 0A 75 46 FB D0 F6 B4", "M4-L, bits left 1" }, - /* 19*/ { "123456789012345ABCDEFGHIJK", 1, 0, "07 8F 6E 46 2A 06 2B 25 67 35 14 A8 55 C2 CF 54", "M4-L, bits left 0" }, - /* 20*/ { "123456789012345678901234567890", 2, 0, "0F 0F 6E 46 2A 06 2B 35 37 0A 75 46 FB D0", "M4-M, bits left 3" }, - /* 21*/ { "123456789012345678901", 3, 0, "0A 8F 6E 46 2A 06 2B 35 37 0A", "M4-Q, bits left 1" }, - /* 22*/ { "ABCDEFGHIJKLMNOPQRSTU", 1, 0, "35 39 A8 A5 42 AE 16 7A E6 5F AC 51 95 B4 25 E0", "M4-L, bits left 4" }, - /* 23*/ { "ABCDEFGHIJKLMNOPQR", 2, 0, "32 39 A8 A5 42 AE 16 7A E6 5F AC 51 95 A0", "M4-M, bits left 5" }, - /* 24*/ { "ABCDEFGHIJKLM", 3, 0, "2D 39 A8 A5 42 AE 16 7A E6 56", "M4-Q, bits left 0" }, + /* 5*/ { "123456", 1, 0, "30 F6 E4 00 EC", "M2-L, bits left 15" }, + /* 6*/ { "1234567", 1, 0, "38 F6 E4 38 00", "M2-L, bits left 11" }, + /* 7*/ { "12345678", 1, 0, "40 F6 E4 4E 00", "M2-L, bits left 8" }, + /* 8*/ { "123456789", 1, 0, "48 F6 E4 62 A0", "M2-L, bits left 5" }, + /* 9*/ { "1234567890", 1, 0, "50 F6 E4 62 A0", "M2-L, bits left 1" }, + /* 10*/ { "1234", 2, 0, "20 F6 80 EC", "M2-M, bits left 13" }, + /* 11*/ { "123456", 2, 0, "30 F6 E4 00", "M2-M, bits left 7" }, + /* 12*/ { "1234567", 2, 0, "38 F6 E4 38", "M2-M, bits left 3" }, + /* 13*/ { "12345678", 2, 0, "40 F6 E4 4E", "M2-M, bits left 0" }, + /* 14*/ { "ABCDEF", 1, 0, "E3 9A 8A 54 28", "M2-L, bits left 3" }, + /* 15*/ { "ABCDE", 2, 0, "D3 9A 8A 4E", "M2-M, bits left 0" }, + /* 16*/ { "1234567890123456789", 1, 0, "26 3D B9 18 A8 18 AC D4 D2 00 00", "M3-L, bits left 13" }, + /* 17*/ { "12345678901234567890", 1, 0, "28 3D B9 18 A8 18 AC D4 D6 80 00", "M3-L, bits left 10" }, + /* 18*/ { "123456789012345678901", 1, 0, "2A 3D B9 18 A8 18 AC D4 DC 28 00", "M3-L, bits left 7" }, + /* 19*/ { "1234567890123456789012", 1, 0, "2C 3D B9 18 A8 18 AC D4 DC 29 00", "M3-L, bits left 3" }, + /* 20*/ { "12345678901234567890123", 1, 0, "2E 3D B9 18 A8 18 AC D4 DC 29 70", "M3-L, bits left 0" }, + /* 21*/ { "1234567890", 2, 0, "14 3D B9 18 A8 00 EC 11 00", "M3-M, bits left 27" }, + /* 22*/ { "123456789012345678", 2, 0, "24 3D B9 18 A8 18 AC D4 C0", "M3-M, bits left 1" }, + /* 23*/ { "ABCDEFGHIJKLMN", 1, 0, "78 E6 A2 95 0A B8 59 EB 99 7E A0", "M3-L, bits left 1" }, + /* 24*/ { "ABCDEFGHIJK", 2, 0, "6C E6 A2 95 0A B8 59 EA 80", "M3-M, bits left 1" }, + /* 25*/ { "1234567890123456789012345678", 1, 0, "0E 0F 6E 46 2A 06 2B 35 37 0A 75 46 F0 00 EC 11", "M4-L, bits left 25" }, + /* 26*/ { "123456789012345678901234567890", 1, 0, "0F 0F 6E 46 2A 06 2B 35 37 0A 75 46 FB D0 00 EC", "M4-L, bits left 19" }, + /* 27*/ { "1234567890123456789012345678901234", 1, 0, "11 0F 6E 46 2A 06 2B 35 37 0A 75 46 FB D0 F6 80", "M4-L, bits left 5" }, + /* 28*/ { "12345678901234567890123456789012345", 1, 0, "11 8F 6E 46 2A 06 2B 35 37 0A 75 46 FB D0 F6 B4", "M4-L, bits left 1" }, + /* 29*/ { "123456789012345ABCDEFGHIJK", 1, 0, "07 8F 6E 46 2A 06 2B 25 67 35 14 A8 55 C2 CF 54", "M4-L, bits left 0" }, + /* 30*/ { "123456789012345678901234567890", 2, 0, "0F 0F 6E 46 2A 06 2B 35 37 0A 75 46 FB D0", "M4-M, bits left 3" }, + /* 31*/ { "123456789012345678901", 3, 0, "0A 8F 6E 46 2A 06 2B 35 37 0A", "M4-Q, bits left 1" }, + /* 32*/ { "ABCDEFGHIJKLMNOPQRSTU", 1, 0, "35 39 A8 A5 42 AE 16 7A E6 5F AC 51 95 B4 25 E0", "M4-L, bits left 4" }, + /* 33*/ { "ABCDEFGHIJKLMNOPQR", 2, 0, "32 39 A8 A5 42 AE 16 7A E6 5F AC 51 95 A0", "M4-M, bits left 5" }, + /* 34*/ { "ABCDEFGHIJKLM", 3, 0, "2D 39 A8 A5 42 AE 16 7A E6 56", "M4-Q, bits left 0" }, }; int data_size = ARRAY_SIZE(data); int i, length, ret; @@ -1642,6 +1654,7 @@ static void test_microqr_padding(int index, int generate, int debug) { for (i = 0; i < data_size; i++) { if (index != -1 && i != index) continue; + if ((debug & ZINT_DEBUG_TEST_PRINT) && !(debug & ZINT_DEBUG_TEST_LESS_NOISY)) printf("i:%d\n", i); symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); @@ -1749,11 +1762,12 @@ static void test_microqr_encode(int index, int generate, int debug) { int expected_rows; int expected_width; + int bwipp_cmp; char *comment; char *expected; }; struct item data[] = { - /* 0*/ { UNICODE_MODE, 1, -1, -1, "01234567", 0, 13, 13, "ISO 18004 Figure 2 (and I.2) (mask 01)", + /* 0*/ { UNICODE_MODE, 1, -1, -1, "01234567", 0, 13, 13, 1, "ISO 18004 Figure 2 (and I.2) (mask 01)", "1111111010101" "1000001011101" "1011101001101" @@ -1768,7 +1782,7 @@ static void test_microqr_encode(int index, int generate, int debug) { "0001010000110" "1110100110111" }, - /* 1*/ { UNICODE_MODE, 2, -1, -1, "12345", 0, 13, 13, "ISO 18004 Figure 38 (mask 00)", + /* 1*/ { UNICODE_MODE, 2, -1, -1, "12345", 0, 13, 13, 1, "ISO 18004 Figure 38 (mask 00)", "1111111010101" "1000001010000" "1011101011101" @@ -1783,7 +1797,7 @@ static void test_microqr_encode(int index, int generate, int debug) { "0100100010101" "1111111010011" }, - /* 2*/ { UNICODE_MODE, 2, -1, 1 << 8, "12345", 0, 13, 13, "ISO 18004 Figure 38, explicit mask 00", + /* 2*/ { UNICODE_MODE, 2, -1, 1 << 8, "12345", 0, 13, 13, 1, "ISO 18004 Figure 38, explicit mask 00", "1111111010101" "1000001010000" "1011101011101" @@ -1798,7 +1812,7 @@ static void test_microqr_encode(int index, int generate, int debug) { "0100100010101" "1111111010011" }, - /* 3*/ { UNICODE_MODE, 2, -1, ZINT_FULL_MULTIBYTE | 2 << 8, "12345", 0, 13, 13, "Explicit mask 01", + /* 3*/ { UNICODE_MODE, 2, -1, ZINT_FULL_MULTIBYTE | 2 << 8, "12345", 0, 13, 13, 1, "Explicit mask 01", "1111111010101" "1000001000001" "1011101001100" @@ -1813,7 +1827,7 @@ static void test_microqr_encode(int index, int generate, int debug) { "0101010011011" "1110001011101" }, - /* 4*/ { UNICODE_MODE, 2, -1, 3 << 8, "12345", 0, 13, 13, "Explicit mask 10", + /* 4*/ { UNICODE_MODE, 2, -1, 3 << 8, "12345", 0, 13, 13, 1, "Explicit mask 10", "1111111010101" "1000001010001" "1011101001111" @@ -1828,7 +1842,7 @@ static void test_microqr_encode(int index, int generate, int debug) { "0100011010010" "1111111010011" }, - /* 5*/ { UNICODE_MODE, 2, -1, ZINT_FULL_MULTIBYTE | 4 << 8, "12345", 0, 13, 13, "Explicit mask 11", + /* 5*/ { UNICODE_MODE, 2, -1, ZINT_FULL_MULTIBYTE | 4 << 8, "12345", 0, 13, 13, 1, "Explicit mask 11", "1111111010101" "1000001001110" "1011101010101" @@ -1843,7 +1857,7 @@ static void test_microqr_encode(int index, int generate, int debug) { "0011100101101" "1010101111001" }, - /* 6*/ { UNICODE_MODE, 2, -1, 5 << 8, "12345", 0, 13, 13, "Mask > 4 ignored", + /* 6*/ { UNICODE_MODE, 2, -1, 5 << 8, "12345", 0, 13, 13, 1, "Mask > 4 ignored", "1111111010101" "1000001010000" "1011101011101" @@ -1858,7 +1872,7 @@ static void test_microqr_encode(int index, int generate, int debug) { "0100100010101" "1111111010011" }, - /* 7*/ { UNICODE_MODE, -1, -1, -1, "12345", 0, 11, 11, "Max capacity M1 5 numbers", + /* 7*/ { UNICODE_MODE, -1, -1, -1, "12345", 0, 11, 11, 1, "Max capacity M1 5 numbers", "11111110101" "10000010110" "10111010100" @@ -1871,7 +1885,7 @@ static void test_microqr_encode(int index, int generate, int debug) { "01010001100" "11110000011" }, - /* 8*/ { UNICODE_MODE, -1, -1, -1, "1234567890", 0, 13, 13, "Max capacity M2-L 10 numbers", + /* 8*/ { UNICODE_MODE, -1, -1, -1, "1234567890", 0, 13, 13, 1, "Max capacity M2-L 10 numbers", "1111111010101" "1000001010110" "1011101010001" @@ -1886,7 +1900,7 @@ static void test_microqr_encode(int index, int generate, int debug) { "0110010100110" "1001101111111" }, - /* 9*/ { UNICODE_MODE, 2, -1, -1, "12345678", 0, 13, 13, "Max capacity M2-M 8 numbers", + /* 9*/ { UNICODE_MODE, 2, -1, -1, "12345678", 0, 13, 13, 1, "Max capacity M2-M 8 numbers", "1111111010101" "1000001011000" "1011101011101" @@ -1901,7 +1915,7 @@ static void test_microqr_encode(int index, int generate, int debug) { "0101011001100" "1100110101001" }, - /* 10*/ { UNICODE_MODE, -1, -1, -1, "12345678901234567890123", 0, 15, 15, "Max capacity M3-L 23 numbers", + /* 10*/ { UNICODE_MODE, -1, -1, -1, "12345678901234567890123", 0, 15, 15, 1, "Max capacity M3-L 23 numbers", "111111101010101" "100000100110110" "101110100011111" @@ -1918,7 +1932,7 @@ static void test_microqr_encode(int index, int generate, int debug) { "010011000101101" "100111010001111" }, - /* 11*/ { UNICODE_MODE, 2, -1, -1, "123456789012345678", 0, 15, 15, "Max capacity M3-L 18 numbers", + /* 11*/ { UNICODE_MODE, 2, -1, -1, "123456789012345678", 0, 15, 15, 1, "Max capacity M3-L 18 numbers", "111111101010101" "100000100010110" "101110101101111" @@ -1935,7 +1949,7 @@ static void test_microqr_encode(int index, int generate, int debug) { "001110000101101" "110011111001111" }, - /* 12*/ { UNICODE_MODE, -1, -1, -1, "12345678901234567890123456789012345", 0, 17, 17, "Max capacity M4-L 35 numbers", + /* 12*/ { UNICODE_MODE, -1, -1, -1, "12345678901234567890123456789012345", 0, 17, 17, 1, "Max capacity M4-L 35 numbers", "11111110101010101" "10000010111010001" "10111010000011001" @@ -1954,7 +1968,7 @@ static void test_microqr_encode(int index, int generate, int debug) { "01110010010111010" "11001001111110111" }, - /* 13*/ { UNICODE_MODE, 2, -1, -1, "123456789012345678901234567890", 0, 17, 17, "Max capacity M4-M 30 numbers", + /* 13*/ { UNICODE_MODE, 2, -1, -1, "123456789012345678901234567890", 0, 17, 17, 1, "Max capacity M4-M 30 numbers", "11111110101010101" "10000010011010001" "10111010000011001" @@ -1973,7 +1987,7 @@ static void test_microqr_encode(int index, int generate, int debug) { "00001111000111000" "11100110111110111" }, - /* 14*/ { UNICODE_MODE, 3, -1, -1, "123456789012345678901", 0, 17, 17, "Max capacity M4-Q 21 numbers", + /* 14*/ { UNICODE_MODE, 3, -1, -1, "123456789012345678901", 0, 17, 17, 1, "Max capacity M4-Q 21 numbers", "11111110101010101" "10000010010101101" "10111010010010101" @@ -1992,7 +2006,7 @@ static void test_microqr_encode(int index, int generate, int debug) { "00000001110011011" "11011110011010100" }, - /* 15*/ { UNICODE_MODE, -1, -1, -1, "点茗テ点茗テ点茗テ", 0, 17, 17, "Max capacity M4-L 9 Kanji", + /* 15*/ { UNICODE_MODE, -1, -1, -1, "点茗テ点茗テ点茗テ", 0, 17, 17, 0, "Max capacity M4-L 9 Kanji; BWIPP doesn't seem to deal with Kanji correctly", "11111110101010101" "10000010111110010" "10111010000011101" @@ -2016,6 +2030,12 @@ static void test_microqr_encode(int index, int generate, int debug) { int i, length, ret; struct zint_symbol *symbol; + char escaped[1024]; + char bwipp_buf[32768]; + char bwipp_msg[1024]; + + int do_bwipp = (debug & ZINT_DEBUG_TEST_BWIPP) && testUtilHaveGhostscript(); // Only do BWIPP test if asked, too slow otherwise + testStart("test_microqr_encode"); for (i = 0; i < data_size; i++) { @@ -2031,21 +2051,32 @@ static void test_microqr_encode(int index, int generate, int debug) { assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt); if (generate) { - printf(" /*%3d*/ { %s, %d, %d, %s, \"%s\", %s, %d, %d, \"%s\",\n", + printf(" /*%3d*/ { %s, %d, %d, %s, \"%s\", %s, %d, %d, %d, \"%s\",\n", i, testUtilInputModeName(data[i].input_mode), data[i].option_1, data[i].option_2, testUtilOption3Name(data[i].option_3), - data[i].data, testUtilErrorName(data[i].ret), - symbol->rows, symbol->width, data[i].comment); + testUtilEscape(data[i].data, length, escaped, sizeof(escaped)), testUtilErrorName(data[i].ret), + symbol->rows, symbol->width, data[i].bwipp_cmp, data[i].comment); testUtilModulesPrint(symbol, " ", "\n"); printf(" },\n"); } else { if (ret < ZINT_ERROR) { + int width, row; assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d (%s)\n", i, symbol->rows, data[i].expected_rows, data[i].data); assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d (%s)\n", i, symbol->width, data[i].expected_width, data[i].data); - if (ret == 0) { - int width, row; - ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); - assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data); + ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); + assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data); + + if (do_bwipp && testUtilCanBwipp(i, symbol, data[i].option_1, data[i].option_2, data[i].option_3, debug)) { + if (!data[i].bwipp_cmp) { + if (debug & ZINT_DEBUG_TEST_PRINT) printf("i:%d %s not BWIPP compatible (%s)\n", i, testUtilBarcodeName(symbol->symbology), data[i].comment); + } else { + ret = testUtilBwipp(i, symbol, data[i].option_1, data[i].option_2, data[i].option_3, data[i].data, length, NULL, bwipp_buf, sizeof(bwipp_buf)); + assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(symbol->symbology), ret); + + ret = testUtilBwippCmp(symbol, bwipp_msg, bwipp_buf, data[i].expected); + assert_zero(ret, "i:%d %s testUtilBwippCmp %d != 0 %s\n actual: %s\nexpected: %s\n", + i, testUtilBarcodeName(symbol->symbology), ret, bwipp_msg, bwipp_buf, data[i].expected); + } } } } @@ -2144,6 +2175,8 @@ static void test_upnqr_input(int index, int generate, int debug) { /* 2*/ { UNICODE_MODE, "β", ZINT_ERROR_INVALID_DATA, "Error 572: Invalid character in input data for ECI 4", "β not in ISO 8859-2" }, /* 3*/ { DATA_MODE, "\300\241", 0, "(415) 70 44 00 02 C0 A1 00 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC", "ŔĄ" }, /* 4*/ { GS1_MODE, "[20]12", ZINT_ERROR_INVALID_OPTION, "Error 220: Selected symbology does not support GS1 mode", "" }, + /* 5*/ { UNICODE_MODE, "ĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄ", 0, "(415) 70 44 01 9B A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1", "" }, + /* 6*/ { UNICODE_MODE, "ĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄ", ZINT_ERROR_TOO_LONG, "Error 573: Input too long for selected symbol", "" }, }; int data_size = ARRAY_SIZE(data); int i, length, ret; @@ -2306,14 +2339,12 @@ static void test_upnqr_encode(int index, int generate, int debug) { printf(" },\n"); } else { if (ret < ZINT_ERROR) { + int width, row; assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d (%s)\n", i, symbol->rows, data[i].expected_rows, data[i].data); assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d (%s)\n", i, symbol->width, data[i].expected_width, data[i].data); - if (ret == 0) { - int width, row; - ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); - assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data); - } + ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); + assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data); } } @@ -2382,26 +2413,29 @@ static void test_rmqr_options(int index, int debug) { /* 43*/ { "点茗点茗点茗点茗点", 4, 13, ZINT_ERROR_TOO_LONG, -1, 0, 0 }, /* 44*/ { "点茗点茗点茗点茗点茗点茗点茗点茗点", 4, 20, 0, 0, 13, 77 }, // Max capacity ECC H, version 20 (R13x77), 17 kanji /* 45*/ { "点茗点茗点茗点茗点茗点茗点茗点茗点茗", 4, 20, ZINT_ERROR_TOO_LONG, -1, 0, 0 }, - /* 46*/ { "点茗点茗点茗点茗点茗点茗点茗点茗点点茗点茗点茗点", 4, 26, 0, 0, 15, 99 }, // Max capacity ECC H, version 26 (R15x99), 24 kanji - /* 47*/ { "点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点点茗", 4, 26, ZINT_ERROR_TOO_LONG, -1, 0, 0 }, + /* 46*/ { "点茗点茗点茗点茗点茗点茗点茗点茗点点茗点茗点茗点点茗点茗", 4, 26, 0, 0, 15, 99 }, // Max capacity ECC H, version 26 (R15x99), 28 kanji + /* 47*/ { "点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点", 4, 26, ZINT_ERROR_TOO_LONG, -1, 0, 0 }, /* 48*/ { "点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗", 4, 32, 0, 0, 17, 139 }, // Max capacity ECC H, version 32 (R17x139), 46 kanji /* 49*/ { "点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点", 4, 32, ZINT_ERROR_TOO_LONG, -1, 0, 0 }, - /* 50*/ { "点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗", -1, 32, 0, 0, 17, 139 }, // ECC auto-set to M, version 32 - /* 51*/ { "点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗", -1, 32, 0, 0, 17, 139 }, // Max capacity ECC M, version 32, 92 kanji - /* 52*/ { "点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点", 4, 32, ZINT_ERROR_TOO_LONG, -1, 0, 0 }, - /* 53*/ { "点茗点", -1, 33, 0, 0, 7, 43 }, // ECC auto-set to M, version 33 (R7xAuto-width) auto-sets R7x43 - /* 54*/ { "点茗点", 4, 33, 0, 0, 7, 59 }, // ECC set to H, version 33 (R7xAuto-width) auto-sets R7x59 - /* 55*/ { "点茗点", -1, 34, 0, 0, 9, 43 }, // ECC auto-set to H, version 34 (R9xAuto-width) auto-sets R9x43 - /* 56*/ { "点茗点", -1, 35, 0, 0, 11, 27 }, // ECC auto-set to M, version 35 (R11xAuto-width) auto-sets R11x27 - /* 57*/ { "点茗点茗点茗点", 4, 35, 0, 0, 11, 59 }, // ECC set to H, version 35 (R11xAuto-width) auto-sets R11x59 - /* 58*/ { "点茗点茗点茗点", -1, 35, 0, 0, 11, 43 }, // ECC auto-set to M, version 35 (R11xAuto-width) auto-sets R11x43 - /* 59*/ { "点茗点茗点茗点茗", -1, 36, 0, 0, 13, 43 }, // ECC auto-set to M, version 36 (R13xAuto-width) auto-sets R13x43 - /* 60*/ { "点茗点茗点茗点茗", 4, 36, 0, 0, 13, 59 }, // ECC set to H, version 36 (R13xAuto-width) auto-sets R13x59 - /* 61*/ { "点茗点茗点茗点茗点", -1, 37, 0, 0, 15, 43 }, // ECC auto-set to M, version 37 (R15xAuto-width) auto-sets R15x43 - /* 62*/ { "点茗点茗点茗点茗点", 4, 37, 0, 0, 15, 59 }, // ECC set to H, version 37 (R15xAuto-width) auto-sets R15x59 - /* 63*/ { "点茗点茗点茗点茗点茗点茗点茗点茗点茗", -1, 38, 0, 0, 17, 43 }, // ECC auto-set to M, version 38 (R17xAuto-width) auto-sets R17x43 - /* 64*/ { "点茗点茗点茗点茗点茗点茗点茗点茗点茗", 4, 38, 0, 0, 17, 77 }, // ECC set to H, version 38 (R17xAuto-width) auto-sets R17x77 - /* 65*/ { "点茗点", -1, 39, ZINT_ERROR_INVALID_OPTION, -1, 0, 0 }, + /* 50*/ { "点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗", -1, 32, 0, 0, 17, 139 }, // Max capacity ECC M, version 32, 92 kanji + /* 51*/ { "点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点", 4, 32, ZINT_ERROR_TOO_LONG, -1, 0, 0 }, + /* 52*/ { "点茗点", -1, 33, 0, 0, 7, 43 }, // ECC auto-set to M, version 33 (R7xAuto-width) auto-sets R7x43 + /* 53*/ { "点茗点", 4, 33, 0, 0, 7, 59 }, // ECC set to H, version 33 (R7xAuto-width) auto-sets R7x59 + /* 54*/ { "点茗点", -1, 34, 0, 0, 9, 43 }, // ECC auto-set to H, version 34 (R9xAuto-width) auto-sets R9x43 + /* 55*/ { "点茗点", -1, 35, 0, 0, 11, 27 }, // ECC auto-set to M, version 35 (R11xAuto-width) auto-sets R11x27 + /* 56*/ { "点茗点茗点茗点", 4, 35, 0, 0, 11, 59 }, // ECC set to H, version 35 (R11xAuto-width) auto-sets R11x59 + /* 57*/ { "点茗点茗点茗点", -1, 35, 0, 0, 11, 43 }, // ECC auto-set to M, version 35 (R11xAuto-width) auto-sets R11x43 + /* 58*/ { "点茗点茗点茗点茗", -1, 36, 0, 0, 13, 43 }, // ECC auto-set to M, version 36 (R13xAuto-width) auto-sets R13x43 + /* 59*/ { "点茗点茗点茗点茗", 4, 36, 0, 0, 13, 59 }, // ECC set to H, version 36 (R13xAuto-width) auto-sets R13x59 + /* 60*/ { "点茗点茗点茗点茗点", -1, 37, 0, 0, 15, 43 }, // ECC auto-set to M, version 37 (R15xAuto-width) auto-sets R15x43 + /* 61*/ { "点茗点茗点茗点茗点", 4, 37, 0, 0, 15, 59 }, // ECC set to H, version 37 (R15xAuto-width) auto-sets R15x59 + /* 62*/ { "点茗点茗点茗点茗点茗点茗点茗点茗点茗", -1, 38, 0, 0, 17, 43 }, // ECC auto-set to M, version 38 (R17xAuto-width) auto-sets R17x43 + /* 63*/ { "点茗点茗点茗点茗点茗点茗点茗点茗点茗", 4, 38, 0, 0, 17, 77 }, // ECC set to H, version 38 (R17xAuto-width) auto-sets R17x77 + /* 64*/ { "点茗点", -1, 39, ZINT_ERROR_INVALID_OPTION, -1, 0, 0 }, + /* 65*/ { "点茗点", 4, -1, 0, 0, 13, 27 }, // ECC set to H, auto-sets R13x27 + /* 66*/ { "点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗", 4, -1, 0, 0, 15, 99 }, // ECC set to H, auto-sets R15x99 (max capacity) + /* 67*/ { "点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点", 4, -1, 0, 0, 17, 99 }, // ECC set to H, auto-sets R17x99 + /* 68*/ { "点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗", 4, -1, 0, 0, 17, 139 }, // ECC set to H, auto-sets R17x139 (max capacity) }; int data_size = ARRAY_SIZE(data); int i, length, ret; @@ -2573,16 +2607,16 @@ static void test_rmqr_optimize(int index, int generate, int debug) { char *comment; }; struct item data[] = { - /* 0*/ { UNICODE_MODE, "1", -1, 0, "21 10 EC 11 EC", "N1" }, + /* 0*/ { UNICODE_MODE, "1", -1, 0, "22 20 EC 11 EC", "N1" }, /* 1*/ { UNICODE_MODE, "AAA", -1, 0, "46 73 0A 00 EC", "A3" }, - /* 2*/ { UNICODE_MODE, "0123456789", -1, 0, "2A 03 15 9A 9A 40 EC", " N10 (nayuki.io - pure numeric)" }, + /* 2*/ { UNICODE_MODE, "0123456789", -1, 0, "34 06 2B 35 34 80 EC", "N10 (nayuki.io - pure numeric)" }, /* 3*/ { UNICODE_MODE, "ABCDEF", -1, 0, "4C 73 51 4A 85 00 EC", "A6 (nayuki.io - pure alphanumeric)" }, /* 4*/ { UNICODE_MODE, "wxyz", -1, 0, "71 DD E1 E5 E8", "B4 (nayuki.io - pure byte)" }, /* 5*/ { UNICODE_MODE, "「魔法少女まどか☆マギカ」って、 ИАИ desu κα?", -1, 0, "(53) 8E 80 D6 00 4F C0 57 6A B5 C2 B8 14 70 94 81 64 37 A1 8D 0C 50 0D 82 82 14 40 00 80", "K29 (nayuki.io - pure kanji)" }, /* 6*/ { UNICODE_MODE, "012A", -1, 0, "48 00 43 20 EC", "A4" }, - /* 7*/ { UNICODE_MODE, "0123A", -1, 0, "24 03 0D 09 40", "N4 A1 (nayuki.io - alpha/numeric)" }, + /* 7*/ { UNICODE_MODE, "0123A", -1, 0, "28 06 1A 12 80", "N4 A1 (nayuki.io - alpha/numeric)" }, /* 8*/ { UNICODE_MODE, "0a", -1, 0, "68 C1 84 00 EC", "B2 (nayuki.io - numeric/byte)" }, - /* 9*/ { UNICODE_MODE, "01a", -1, 0, "22 02 CB 08 EC", "N2 B1 (nayuki.io - numeric/byte)" }, + /* 9*/ { UNICODE_MODE, "01a", -1, 0, "24 05 96 10 EC", "N2 B1 (nayuki.io - numeric/byte)" }, /* 10*/ { UNICODE_MODE, "ABCa", -1, 0, "71 05 09 0D 84", "B4 (nayuki.io - alphanumeric/byte)" }, /* 11*/ { UNICODE_MODE, "ABCDa", -1, 0, "48 73 51 4B 2C 20 EC", "A4 B1 (same bits as B5)" }, /* 12*/ { UNICODE_MODE, "THE SQUARE ROOT OF 2 IS 1.41421356237309504880168872420969807856967187537694807317667973799", -1, 0, "(48) 46 A9 52 9A A0 D5 42 66 E6 F8 A1 4F 62 3E 56 CC D4 40 2B 98 2C F1 AB 19 2E A2 F8 61", " A26 N65 (nayuki.io - alpha/numeric)" }, @@ -2636,113 +2670,383 @@ static void test_rmqr_encode(int index, int generate, int debug) { struct item { int input_mode; - char *data; int option_1; int option_2; + char *data; int ret; int expected_rows; int expected_width; + int bwipp_cmp; char *comment; char *expected; }; - // Note very little available to compare these to (BWIPP gives very different results TODO: investigate) so should be considered "unproven" + // ISO/IEC JTC1/SC31N000 (Draft 2019-6-24) struct item data[] = { - /* 0*/ { UNICODE_MODE, "0123456", 4, 11, 0, 11, 27, "Draft ISO 2018-6-8 Annex H I.2, currently no image to compare to", + /* 0*/ { UNICODE_MODE, 4, 11, "0123456", 0, 11, 27, 1, "Draft ISO 2019-6-24 Annex I Figure I.2, R11x27-H, same", "111111101010101010101010111" - "100000100110111010101101101" - "101110100001100000010110101" - "101110101111100000001001010" - "101110100100011000101000111" - "100000101110011000111110010" - "111111100110100101001011111" - "000000001101001111010010001" - "111000011011111000011110101" - "100100100010000011111010001" + "100000100110100001110100101" + "101110100001001111010011111" + "101110101111011011110001100" + "101110100101110111111001011" + "100000101110000100111110010" + "111111101111111110001011111" + "000000001111101011010010001" + "111100000010010100111110101" + "101010100110010100111010001" "111010101010101010101011111" - }, - /* 1*/ { UNICODE_MODE, "1234567890123456", 2, 17, 0, 13, 27, "Draft ISO 2018-6-8 6.2 Figure 1 **NOT SAME**", + }, + /* 1*/ { UNICODE_MODE, 2, 17, "12345678901234567890123456", 0, 13, 27, 1, "Draft ISO 2019-6-24 6.2 Figure 1, R13x27-M, same (note data as here not as given in draft)", "111111101010101010101010111" - "100000100001111000111110101" - "101110101100010111110111001" - "101110100110001110010100000" - "101110101111001001101001001" - "100000100010001110011110000" - "111111100000001100000010101" - "000000001111100000010001100" - "111001101110000001110011111" - "011111011101010000100010001" - "100000101000011010101010101" - "101101101100110111000010001" + "100000100001001100010011001" + "101110101100000011001110001" + "101110100110101100000100000" + "101110101110100110110110011" + "100000100011100011001011000" + "111111100100111111000011101" + "000000001010010101010001100" + "110101101011010110010011111" + "011001101010101111100010001" + "100000100111000111101010101" + "100011010010010100000010001" "111010101010101010101011111" - }, - /* 2*/ { UNICODE_MODE, "123456789012", -1, 1, 0, 7, 43, "R7x34 M max numeric 12 digits", + }, + /* 2*/ { UNICODE_MODE, 2, 2, "0123456789012345", 0, 7, 59, 1, "Draft ISO 2019-6-24 7.4.2 Numeric mode Example, R7x59-M, same codewords", + "11111110101010101011101010101010101010111010101010101010111" + "10000010101111011110100001100001100001101100100101100100101" + "10111010100100001011110010110000011110111110111100011011111" + "10111010110001100010010100111010101101101011111000110110001" + "10111010011001000011100111100000110010111011010111011010101" + "10000010101010110110100010111110010010101111101111110010001" + "11111110101010101011101010101010101010111010101010101011111" + }, + /* 3*/ { UNICODE_MODE, 2, 2, "AC-42", 0, 7, 59, 0, "Draft ISO 2019-6-24 7.4.3 Alphanumeric mode Example, R7x59-M, same codewords; BWIPP different encodation", + "11111110101010101011101010101010101010111010101010101010111" + "10000010101111010010110011010101100000101011001111100100101" + "10111010100100100011100100111100011101111100011011111011111" + "10111010110001110110100001101110100111101110000010010110001" + "10111010011000110111111101110000110001111000100110111010101" + "10000010101010111110100011101110011011101101011010110010001" + "11111110101010101011101010101010101010111010101010101011111" + }, + /* 4*/ { UNICODE_MODE, -1, 1, "123456789012", 0, 7, 43, 1, "R7x34-M max numeric 12 digits", "1111111010101010101011101010101010101010111" - "1000001001011011001110111100000000011000101" - "1011101010110010101111101001000111111111111" - "1011101001101000000100111011010101000010001" - "1011101000111001001111110010111101110010101" - "1000001011111101000110100110000000011010001" + "1000001001010111111010100000100011011000101" + "1011101010111000100111101101011010111111111" + "1011101001100110111000000001111111000010001" + "1011101000101100011111100110111110110010101" + "1000001011110111111110101101001010111010001" "1111111010101010101011101010101010101011111" }, - /* 3*/ { UNICODE_MODE, "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678", 4, 32, 0, 17, 139, "R17x139 H max numeric 178 digits", + /* 5*/ { UNICODE_MODE, 4, 32, "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678", 0, 17, 139, 1, "R17x139-H max numeric 178 digits", "1111111010101010101010101011101010101010101010101010101110101010101010101010101010111010101010101010101010101011101010101010101010101010111" - "1000001011001000110010100110111110011010111100010111001010001011000101011111010101101010110111011011111110010110100110010111101000100111001" - "1011101010000000000011101111110000111110100010101011001111101110111000000101100010111111010110100111111010000011100001110011001100010010001" - "1011101010010001001011011110110110001011110111000001111000011010111010001110100001001101110010000101111110100110111111101000000001000010000" - "1011101001001111000111101011001111001111010001011011011110111000111001000100111001110111001001011000101011111111111111001101010011111000111" - "1000001010001010101111010110110110101110111110111100010001000011101011101010001111001001100101001010001001011000111000011111101001010010010" - "1111111010000101010101110011100101000111101010101110100111101111100000110100110101110101010011100011001100010001100000100110111011111110011" - "0000000000011101001101111000100110010011011001110000111000111101011000111111101010000101001011110001000101101110100100100000010010111100100" - "1111010111011011000110010101111110011000010100000011011110010011100001111101000010010101001111111010000111101101111011011000010100010001101" - "0111101110101010001010101110000111000110011011010110100001111100111100101100100001000010101101100010101000010100001111011111101110110001010" - "1111111110011100100100000111000011110101110100011000110100011110000100111000110110111001101100001110111000100011001000110011101101000110011" - "0110110101110001110100000110101010100000011001011000000001001111111001010101001110000111101100000100011110100010110111100101000001001011010" - "1010010110011001000100010001000111111110101001001111001101010001000111010101001101011111111000111111001011001111110111101010010010111011111" - "0011110011110100101011001000001010100011101111100100001000011000111100011011110010001101000111101011100001010100101010001110111001111110001" - "1011101000011100110000101111100101100011010011000110011110101101000101011010001011111010000101000100110100010111110000110111101010111110101" - "1000101001111010100011010110111110101000110110000000101011110010110010010000110110101111110010110100110111101010110000100000011110010110001" + "1000001011001111001111010110101111111110001100100101011011010101100000011101000010101101000110111100000111101010111011011000011100010001001" + "1011101010001001010100111011111010110101010101000101101110001111010001011001101110111001010011010101010100101011100001100100000011101011111" + "1011101010010100010101100110101001110011110111011110111001011000100100110010111101000101000111100010011000100100101000110111100110001010000" + "1011101001010110110010110101011110011101110111001011011100110010101111101110000011010000110001011011001001011001011000011110111101111100111" + "1000001010001101001110011100001111111000001001101011001011011101110100010001111100001111001000011001100011101000001111001000010010101001110" + "1111111011110001000111011111010111111010101011110111110111001111100011001110111101110110110010110100110111100101000111111001011100000010101" + "0000000010010000011010101010101101001101111011101100000001101001101101110100101011101100011111100100101111010100110001110111001000010110000" + "1110101110111001111110100101000010011011111000110111001110001001001101101111011001111000111111001011111010010111111110010111100000111001101" + "0101000110010110111000000000001111011000011111111100101011001010101111111000110100100001101111111011001111101000001110011100010101010000100" + "1001000000100010100001101111110100011001110001011010001111101010010110110101101110010011111100011100011010101001000001101000000111101010011" + "0011010010110011011010100010101010011000100010100101100010111110001110111010100110100101110010000100010000100110101000010001101110001011010" + "1000110001111011101101101101110110011110110110111110111110110001000111110010000110110000000011100010000101010111011010010111101001011011111" + "0010000000111010001110110110011000011010011101100010000011101001011101001011001011001011100010111101010111011000010111001001000010111110001" + "1100101100110100100101000011111110111000010001101001001111001110110100000111101011111001100101001000000011101011110100101001010100111110101" + "1010111110110100011001111010100011101111001101100101111011100101011100011011011000101010010000000100111000011010100000100111101001110110001" "1110101010101010101010101011101010101010101010101010101110101010101010101010101010111010101010101010101010101011101010101010101010101011111" }, - /* 4*/ { UNICODE_MODE, "123456789012345678901234567890123456789012345678901234", 4, 33, 0, 7, 139, "R7xauto H max numeric 54 digits", + /* 6*/ { UNICODE_MODE, 4, 33, "123456789012345678901234567890123456789012345678901234", 0, 7, 139, 1, "R7xauto-H max numeric 54 digits", "1111111010101010101010101011101010101010101010101010101110101010101010101010101010111010101010101010101010101011101010101010101010101010111" - "1000001011011110100001110010100100001111000111011101011011001100000111111010011111101110111011101001010011101110111011000110000001001000001" - "1011101000010001001110011111100000100110110101101011101110101000100001001100001110111010100000110100100001111011101000110111011110101011111" - "1011101001111010110000111110101111100001011110010111010010111110100110011111111111101101010101000111101010011000110111101010001100000010001" - "1011101011110100001010000011101111100111101100000011011110100010111101101100100111111011101000110101101000000111101110111001010100101010101" - "1000001010001000001011100010101001100011000011000010011011011011011111110010010011101000011010011110010110111010101010010011111110010110001" + "1000001011010011001111100110101000111000110001101010101011100001010000000000011001101000110010111100010100100110101000010111100011001000001" + "1011101000011001010110011111111001010000100001011100101110111001110001011101010011111000110100100000100100111011100000000010010010101011111" + "1011101001110011010110011110000111010000111100110001101000100000110000000101101100000011000100100101101000000010100100101000110010000010001" + "1011101011101101111101010011101111111011101110010111101110110111111000111001010000111011011001100000111000001111111111101001100011001010101" + "1000001010001100101101000010110110010110000111100001011011001001011001111000100111101011001110101000010111101110101110000101110011110110001" "1111111010101010101010101011101010101010101010101010101110101010101010101010101010111010101010101010101010101011101010101010101010101011111" }, - /* 5*/ { UNICODE_MODE, "123456789012345678901234567890123", 4, 35, 0, 11, 59, "R11xauto H with max numeric 33 digits for width 59", + /* 7*/ { UNICODE_MODE, 4, 35, "123456789012345678901234567890123", 0, 11, 59, 1, "R11xauto-H with max numeric 33 digits for width 59", "11111110101010101011101010101010101010111010101010101010111" - "10000010101010010010100111111011011110101001100110110011001" - "10111010000110110111101001001010100001111010000100000000011" - "10111010101111011100110000010110100101100001111110110110100" - "10111010001110111011111110110011010100011010101010010000101" - "10000010000110100110000001000110110100100000001100100110000" - "11111110111000101111111010001011010011111111101101101011111" - "00000000010001110000100101111101101110100011001010111010001" - "11010101101011100011100001110011000010111111110000010010101" - "10011110000011110010101110111110000100101110100001000110001" + "10000010101001100110111000100110101100101100010101111110101" + "10111010000110100111101001001111110010111101000100110110011" + "10111010101110011100110101010011111101101001110010001101110" + "10111010001000101111000010010101001010011011101010011010001" + "10000010000110110010111111111010010110001110100010000110000" + "11111110011110011111011101001001101111010001001100001011111" + "00000000001111111110100100110100101111101111111000111010001" + "11011000100010010111110110111001011100111000100100010010101" + "10011101110110100010100011000110110010101001001100100110001" "11101010101010101011101010101010101010111010101010101011111" }, - /* 6*/ { UNICODE_MODE, "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901", -1, 38, 0, 17, 139, "R17xauto M max numeric 361 digits", + /* 8*/ { UNICODE_MODE, -1, 38, "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901", 0, 17, 139, 1, "R17xauto-M max numeric 361 digits", "1111111010101010101010101011101010101010101010101010101110101010101010101010101010111010101010101010101010101011101010101010101010101010111" - "1000001001000101001111000010110100001000101100110001101010100000111110001000100011101011111000001110011001110010100111000101001100000001101" - "1011101011100100000111001011101001110010101001100000001111010010111111101001111110111000101000010010110101111111111101111101101000001011001" - "1011101001000111010101101000100010100110111111000010001010000111000001110010101101101100011111010001000111001110011101000011110011100111010" - "1011101000011011001010110111000101101000011001111111100110101100100010000110011000110010001110111101000010010001000111100010001111110010101" - "1000001000010011010111011100110011101001111000011100111001111010111111001101001001101010001000000100111100000100000000111100001000011110110" - "1111111011000011001100001011100101010100001110100100010101100010100001111000000110011101001100000011111010101111101010011101110001001101101" - "0000000010101010011100011110100011110101111000010000000010110101000000110111010110100101100101111001001000101010011001000010010111110000110" - "1111000101000101010110010101111001011001110001111100101110110101011111010111100011110000110011101111100001010011010011000010011110110010011" - "0111110010111110100111011100100110100111011110110111111000100100111111001000100001001010111010000110011001110110001110100011101010000101010" - "1000110110001000011011011001101111100101110100110000000101010010110110101100011100011111101000011010110100011101100100111101100100001010011" - "0010111001011000101010100000011101100011011000111100001000000111001000110110111111100101010111010001000111001000011101011100100101111011110" - "1000000110001011100000011101011000110101100001100011100110101100100000011011110100110101010110111101000010000011100110100011011011110111111" - "0010111110101011111010111110000101111100111101001010111001111010111111111001011100001111101000100100111100010010000010111111011011000110001" - "1101011001000100011101010111100001001010100010010110011111100011000101100010001111111011100101000011111110101111101000011110100000010110101" - "1001100101010101001010100010100011011100111001110111011010110101000100100111100110101011100101111011001010100110111111000010110110100110001" + "1000001001000101011111010110101000111111101000111100111011110101001110010101100011101100101011101111100000110010101010100000011111110110001" + "1011101011100111011000001111111010110000100000100110001111110101001001010011000110111101110100011101010101001111100001010000010111111111011" + "1011101001001100001001111100010100100011000110010110010001110110110101101000001110000111011000110010111111011010010110011101110100001001010" + "1011101000010101010111011001110010111100100101101001111100011100100111001101000001011010001000000010111001110001001000101111001000010000101" + "1000001000010001001011010010000000011001010001001001111000001000101010010111010101001001010111111101000011100010101111000011001010111001110" + "1111111001101010000100101101010011000001101011110111001111100011000000100110111000110100000111110001001010001011110100000000110111011100001" + "0000000010110010001111111010101001000000110001110110001011100011110111101000111110001101100100000011111100101100011001111000101001000100110" + "1110101100000110000111010011111100101011100100000000101100000010111010011000101011011100111000001100010101010001100011110101001000100000111" + "0111101111100011010010111110111010100101011100100101110001010101001010010101100000001000011011101100000000010010100110100000011111110110010" + "1000000010110100110011010001111100011111010101100000011111011101000101010011000101110101010111011011100001101101011101000000010111110011011" + "0001011000101100111101110000000000001111001110001000000010001010111101101000001110000111011011010011111111111000011010011101110100011011110" + "1110010100011011010101000111110001000000010100011111000100100000110111001101000001111010001000100110111110100001110100101111001000110111111" + "0111111000011110110011110000010100000010011111010011011011111101011010010111010101001001010111100100001011100110101101000011001010000110001" + "1010111000111001011010111011111111010100010000000001111111011111100000100110111000111000000111101001000000001111100111000000110111110110101" + "1010100110101011001011101010100000110111001110010011101011010011100100101000111010101110101100010001011100100010101010111100100001000110001" + "1110101010101010101010101011101010101010101010101010101110101010101010101010101010111010101010101010101010101011101010101010101010101011111" + }, + /* 9*/ { UNICODE_MODE, 2, 1, "\001\002\003\004\005", 0, 7, 43, 1, "R7x43-M with max 5 binary", + "1111111010101010101011101010101010101010111" + "1000001001010001101010101011001111011000101" + "1011101010111101100111100101110001011111111" + "1011101001101111011110011001101001000010001" + "1011101000100000100111110110101110110010101" + "1000001011110000000010101011001111011010001" + "1111111010101010101011101010101010101011111" + }, + /* 10*/ { UNICODE_MODE, 4, 1, "\001\002", 0, 7, 43, 1, "R7x43-H with max 2 binary", + "1111111010101010101011101010101010101010111" + "1000001011010010110010111001001111001000001" + "1011101011010011101011110001000001010011111" + "1011101010111101110110001010001001011010001" + "1011101001111011011011111111001110011010101" + "1000001001111110100010111110110110101010001" + "1111111010101010101011101010101010101011111" + }, + /* 11*/ { UNICODE_MODE, 2, 1, "ABCDEFG", 0, 7, 43, 1, "R7x43-M with max 7 alphanumerics", + "1111111010101010101011101010101010101010111" + "1000001001011100111110111000000101011000101" + "1011101010111010101011110111101001011111111" + "1011101001100001111100011111100010100010001" + "1011101000110011100011111110010100110010101" + "1000001011111011101110111110000111111010001" + "1111111010101010101011101010101010101011111" + }, + /* 12*/ { UNICODE_MODE, 2, 1, "点茗点", 0, 7, 43, 0, "R7x43-M with max 3 Kanji; BWIPP different encodation", + "1111111010101010101011101010101010101010111" + "1000001001011000100010101001010001111000101" + "1011101010110101110111111001011101111111111" + "1011101001100001101010100110100110100010001" + "1011101000100010000011101101011011110010101" + "1000001011111100010110101111011000111010001" + "1111111010101010101011101010101010101011111" + }, + /* 13*/ { UNICODE_MODE, 2, 4, "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLM", 0, 7, 99, 1, "R7x99-M with max 39 alphanumerics", + "111111101010101010101011101010101010101010101010111010101010101010101010101110101010101010101010111" + "100000100111110010010010101010100110101001000011101100101101000010101110001011100000010001111100101" + "101110100101000000101011100100010000001000001111111111011111000000110101111111101111100000100011111" + "101110100100011111000100010111001001100101111011100001000001001111101010111010110110100011000110001" + "101110101000101011110111101110010000110011110101111110100111100010101000101111101101101111000110101" + "100000101010111010111010111110101001111001101011101010101010001100101101111011100101101010110010001" + "111111101010101010101011101010101010101010101010111010101010101010101010101110101010101010101011111" + }, + /* 14*/ { UNICODE_MODE, 4, 5, "\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026", 0, 7, 139, 1, "R7x139-H with max 22 binary", + "1111111010101010101010101011101010101010101010101010101110101010101010101010101010111010101010101010101010101011101010101010101010101010111" + "1000001011010100100110110110100110111000001010100110101010111101000011111010001000101100000100001011011110111110100110011110001101001000001" + "1011101000010011101011000111111011101001111011110101011110111001000010011111001110111001100001010101110110100011110011110001010001001011111" + "1011101001111010000010110010111010001000101110001010101000101110001111011000010111001101000001010101101001110100110011110010000001000010001" + "1011101011110101001101101111100101000110001011010111101111110111111011101010001110111100001101011100001010011111111110111010001101001010101" + "1000001010000100011110111110111000111001100010111001111011001011011111000110010101101111111111001110101110101010101110110010001100110110001" + "1111111010101010101010101011101010101010101010101010101110101010101010101010101010111010101010101010101010101011101010101010101010101011111" + }, + /* 15*/ { UNICODE_MODE, 2, 7, "\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024", 0, 9, 59, 1, "R9x59-M with max 20 binary", + "11111110101010101011101010101010101010111010101010101010111" + "10000010100110111010110111101111000011101110010011100001001" + "10111010101100001011111100111100011111111100011001111100101" + "10111010001011110100100111110100100000000110011110000000110" + "10111010010001101101111101100001011011110011100011111111111" + "10000010000100101110010110010111100000100111010011101010001" + "11111110010100010111110011111110011101111100011000011110101" + "00000000000011111010111011010100000000101110011010000110001" + "11101010101010101011101010101010101010111010101010101011111" + }, + /* 16*/ { UNICODE_MODE, 2, 9, "12345678901234567890123456789012345678901234567", 0, 9, 99, 1, "R9x99-M with max 47 numerics", + "111111101010101010101011101010101010101010101010111010101010101010101010101110101010101010101010111" + "100000100010000101001110111001101000101110111000101110001100111010100000001011110010011100011001101" + "101110101011011101000011110000001000010010010000111011001001111111000001001110101111110010111000101" + "101110101010111000000000001110110110111110001100000001001111011011101101011011011100000001110110100" + "101110101111101010100111111010001100011000000110010100011010001111100010110100000110001000111111111" + "100000100110100000000110100110010010111001000101101000110011010101110000001010000011101010011010001" + "111111100100110111110011110010000010111111100111111100100110000100000111101110010011011110101010101" + "000000000111000111011010100110011010111011010011101110110100100111001011111010110011000000001010001" + "111010101010101010101011101010101010101010101010111010101010101010101010101110101010101010101011111" + }, + /* 17*/ { UNICODE_MODE, 2, 11, "\001\002\003\004\005\006", 0, 11, 27, 1, "R11x27-M with max 6 binary", + "111111101010101010101010111" + "100000101110010000111000101" + "101110100111010000000011001" + "101110100010000111110101110" + "101110100001011100111000001" + "100000100110111001101110110" + "111111100100001110000111111" + "000000000101011011001010001" + "111100001110011000010110101" + "101001111010101000101010001" + "111010101010101010101011111" + }, + /* 18*/ { UNICODE_MODE, 4, 11, "\001\002\003\004", 0, 11, 27, 1, "R11x27-H with max 4 binary", + "111111101010101010101010111" + "100000100110100100111000101" + "101110100001011000000011001" + "101110101111011111110101010" + "101110100100000010111000001" + "100000101110011001111110010" + "111111101101110100001011111" + "000000001011111100010010001" + "111011000110110000011110101" + "101000000010100100111010001" + "111010101010101010101011111" + }, + /* 19*/ { UNICODE_MODE, 2, 13, "12345678901234567890123456789012345678901234567890123456789012345678901", 0, 11, 59, 1, "R11x59-M with max 71 numerics", + "11111110101010101011101010101010101010111010101010101010111" + "10000010001010111110110110010100101111101111001110101100001" + "10111010011100010011110111110001111100111010111101000100011" + "10111010011001001000001110100101110100101001110000010010000" + "10111010011011101111111010100010101001111000011010010100001" + "10000010100111001000111011110110111001101100001001110110100" + "11111110010111010111001000011000101010110001001100000111111" + "00000000011100100100100000100011000100001111000000000010001" + "11111100110000101111110101101001000100111000101010011010101" + "10011100001011001110100101001100110111101001101110110110001" + "11101010101010101011101010101010101010111010101010101011111" + }, + /* 20*/ { UNICODE_MODE, 2, 18, "1234567890123456789012345678901234567890123456789012345678901", 0, 13, 43, 1, "R13x43-M with max 61 numerics", + "1111111010101010101011101010101010101010111" + "1000001011111001100110111000110110011001001" + "1011101011100001110011110110101000100010111" + "1011101011000100101010011001000010110111010" + "1011101010100100111011011011100011000111111" + "1000001001101001000000110110001000101101110" + "1111111010011101101101101010100100101000011" + "0000000011110010100110111001100100101101110" + "1111100101001011000001101100111011010111111" + "0011110001100101000000100000101100110110001" + "1011101111000010101011110011001100100010101" + "1000110000010111110010110001001011001010001" + "1110101010101010101011101010101010101011111" + }, + /* 21*/ { UNICODE_MODE, 4, 20, "\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033", 0, 13, 77, 1, "R13x77-H with max 27 binary", + "11111110101010101010101011101010101010101010101010111010101010101010101010111" + "10000010101100000001000010111011001111101101111101101110100010001011100001101" + "10111010010010101011110111100110000111101101101101111110000000011110111011011" + "10111010100101111101110100000000010011011010000000001100100110011010000001100" + "10111010000111001111011101001110010010110101111000110001101001100011101011111" + "10000010111010000011101000001111101111001010101001101100000001000011110011000" + "11111110110111111101110011101010100110011011111111011100001100110110011100101" + "00000000110110101010001000000000010111001011110110001100011000011100000101010" + "11111101010111111111100011100111100011111001111110111001100010010001100011111" + "01000111110100101000101100110111101100000100100001100110100001001011111110001" + "10001110011100111011101011110000110011101000011011111010001000011101010110101" + "10001001000010011011101110100010010001101111111101101000000110010000011010001" + "11101010101010101010101011101010101010101010101010111010101010101010101011111" + }, + /* 22*/ { UNICODE_MODE, 2, 20, "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123", 0, 13, 77, 1, "R13x77-M with max 123 numerics (note 8 bit cci in draft 2019-6-24 when 7 suffices)", + "11111110101010101010101011101010101010101010101010111010101010101010101010111" + "10000010001111011110000010110000001101001111110110101010010010110011111011101" + "10111010001010000001000011100001010010100110011011111001000001111110100011001" + "10111010010011101110100110011001011011110110011101100011001010000010000010000" + "10111010010010111110100011010101011101110000000101110101111110010001000110011" + "10000010011110000011110100011001011101111111110110000100110010110011101011000" + "11111110111010011010000011010010110010010111011011111111010101111110110011111" + "00000000111011110111001110010000001000110001011101100110000110000010110101110" + "11111111010011101000010001110101101101110010000101011101110010000001101111111" + "01101010101001000000100000100000111110111111111011100100110100001011100110001" + "10110000001110100010011011100001011011010111011110111011010101110111111110101" + "10101101110110111100111010111111000100010001001101101110100100010100001010001" + "11101010101010101010101011101010101010101010101010111010101010101010101011111" + }, + /* 23*/ { UNICODE_MODE, 2, 23, "\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037", 0, 15, 43, 1, "R15x43-M with max 31 binary", + "1111111010101010101011101010101010101010111" + "1000001011010010111010101000000011011011001" + "1011101011000000000011111001010001110001111" + "1011101000101100100010110000110001110001110" + "1011101010001110100001100010100011111100001" + "1000001011000001101010010100001111001010110" + "1111111011100000010101011001110001110001001" + "0000000010010111110000110010110001110001010" + "1100111001111100110001101010100000111000111" + "0100100011111110010000010100000111101001100" + "1010101010110000110001101011000001110011111" + "0110000110000110110010110001000001101010001" + "1100010010011100000011100110000010000110101" + "1001011111001000010010110100001011011110001" + "1110101010101010101011101010101010101011111" + }, + /* 24*/ { UNICODE_MODE, 4, 27, "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRST", 0, 15, 139, 1, "R15x139-H with max 98 alphanumerics", + "1111111010101010101010101011101010101010101010101010101110101010101010101010101010111010101010101010101010101011101010101010101010101010111" + "1000001000101010110111000110101110111011110000110111111011010110110101010100010000101101000101101000000110101010110111000011111101010011001" + "1011101001100101001100010011101100000011101101100110011111100111110110101101110101111001000011000100010000110111111101101011100000111011001" + "1011101011111100000110000100011011111010011111100001000000110111001010010001011010000100100101100001011110110010011011101000100100010011100" + "1011101010000010010111110001010010000101111011010110100110011101001100001111010101110001110100100011101010101111100110010011001001000101101" + "1000001000100000010010001000110011100110010001011011101011111000000010111001010010101101011110101111011010110000100111110010111111110100100" + "1111111010100000110011001001111101001101011011110010001100000100000101011011001110110110000000111000011101001011000111111011101000100111101" + "0000000011000010100010110000111000010011101010111100100010001001010011000110010101000000001100101001010001011010100010111011011111101111010" + "1100110111000001101100101011110001111111000010100000110110101001010011100001110100111010001100000100000000011001110111111000111010111101011" + "0100110000100000100100010000001011001010001000111001000001101101100100100011011110100111001111001000110000010100100110011000010010010111000" + "1100011110010111111010011001011101100001001001001111100101111011111011111110011000110100101110000110011010010101100001111001111011100111111" + "0001111000000010100011001000110111101111101111101010001010001000101100101101000001000010100000101111101000011100010010011111100011110010001" + "1100111110100000010000111011110010011100101001110010101110011110110110001100001101111001001110011000111010111011110011001010011001000110101" + "1011010110101111010001000110110100010001001001100010101011001000110010111101000000101111001000110110011001111010100011110110001000100010001" + "1110101010101010101010101011101010101010101010101010101110101010101010101010101010111010101010101010101010101011101010101010101010101011111" + }, + /* 25*/ { UNICODE_MODE, 2, 28, "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890", 0, 17, 43, 1, "R17x43-M with max 90 numerics", + "1111111010101010101011101010101010101010111" + "1000001001000101001010111110000001010100101" + "1011101000101110110011110100001001100110011" + "1011101010001111111010101000010101101001000" + "1011101010001001010101011100110000100111111" + "1000001011111110111110000101001001010110000" + "1111111001111100101111110111011010000010111" + "0000000010011101100110011111010000101101010" + "1100111101010110111011011000110101001100111" + "0111000100100100011010000110001001101100010" + "1110110010011101000111101111000000010011011" + "0011001001011100110000101100100111111011110" + "1110111010101010010001111101011010001111111" + "0011110000011011010110001101001000111110001" + "1010000001001101001111101000100011000110101" + "1010110110101010011110101110010011011010001" + "1110101010101010101011101010101010101011111" + }, + /* 26*/ { UNICODE_MODE, 4, 29, "\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032", 0, 17, 59, 1, "R17x59-H with max 26 binary", + "11111110101010101011101010101010101010111010101010101010111" + "10000010111010100010101100011001100000101011110011110011101" + "10111010011000111011101011101011010010111000110100011100011" + "10111010101100010010101010011000101000000100011010000100000" + "10111010111100100101101000101000101000110110010001100011011" + "10000010110011101100010010111000101111100010111011100001100" + "11111110111111001101001001000101011110111100010111001111011" + "00000000100101101110101100000000101101101110010110001101100" + "11111011001011101111100001011101011101110010010011100111111" + "01111100111111000000111000001001010100000001000011110011000" + "11000001111111001011000010001010001011010000111011111010101" + "01100000111110100010100111100111001101101100010100001111010" + "11100011100001100111001001110100011101110000100001100111111" + "00111000001010001100000100010100100101100101111011111010001" + "11001011110100101111111000101000111011111100010100001010101" + "10001000111011111010100011010111101101101010011010011110001" + "11101010101010101011101010101010101010111010101010101011111" + }, + /* 27*/ { UNICODE_MODE, 2, 32, "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCD", 0, 17, 139, 1, "R17x139-M with max 108 alphanumerics", + "1111111010101010101010101011101010101010101010101010101110101010101010101010101010111010101010101010101010101011101010101010101010101010111" + "1000001001001010010000011110111001001010110101010100011010100010100111011001101000101010101100000100100110001010101000100111011010000101001" + "1011101011101001000100010111100111100100100101100010111110100010110000000011101010111111111001010011110000010011101011000101000000010001001" + "1011101001001010011011111000100110001100100000001101000001000100101101001100011111001001100011101000011011111100011000101100010110111010010" + "1011101000010011111100010001011011011101010000111000011111011101000101100100100101010000110110001101001010111101111100000110011111111111011" + "1000001000010100010000011000101101000110011001100110110010101011010011010101111010101010010100100110100000110110101111011011011011100101010" + "1111111010110001111001010111010110101110100000000000110100000011111001011111111010110111100111000011110101100001100011111001100001010001101" + "0000000011111011001111110010100100001100101010101101000011010110100100001100000010100111010100101010011111001000010110100100101100100100000" + "1100110101110001011110010111111000100011110010001010011111101100000110101100100011011100011011011000001010001101111100000110000111011110011" + "0101010100000101010000011010101100001001010100000000110001111111010011011010110010000010010111010001010000110110101011010001010110000100100" + "1001011101000001111001110101010101001100110111010001010100010111111001110000110001010101110010110000000001100011010011111000010001011010101" + "0011011000000111000111000100101000100110010001010111110010101110110100110110100110101101110001001110111111001000010110100101000000011011110" + "1110111001100101010110010111110100010000101110101010101110101100101110011111000010011100111000011110001011001101011100010100101100110111111" + "0100010111111011011100011000111100111111001001111000101010111111010010011011010011000000010010111101010000011000110001110010010101100110001" + "1001111110101110110000100111110101011101100010011001101111010111011000010000110101111000000110110100010011000111111100101110011011110110101" + "1011101011001101111111100110101100110110111011010111001011101011000100010101100000101110111100000010011100011010100100011000001100000110001" "1110101010101010101010101011101010101010101010101010101110101010101010101010101010111010101010101010101010101011101010101010101010101011111" }, }; @@ -2750,6 +3054,12 @@ static void test_rmqr_encode(int index, int generate, int debug) { int i, length, ret; struct zint_symbol *symbol; + char escaped[1024]; + char bwipp_buf[32768]; + char bwipp_msg[1024]; + + int do_bwipp = (debug & ZINT_DEBUG_TEST_BWIPP) && testUtilHaveGhostscript(); // Only do BWIPP test if asked, too slow otherwise + testStart("test_rmqr_encode"); for (i = 0; i < data_size; i++) { @@ -2759,26 +3069,38 @@ static void test_rmqr_encode(int index, int generate, int debug) { symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); - length = testUtilSetSymbol(symbol, BARCODE_RMQR, data[i].input_mode, -1 /*eci*/, data[i].option_1, data[i].option_2, -1, -1 /*output_options*/, data[i].data, -1, debug); + length = testUtilSetSymbol(symbol, BARCODE_RMQR, data[i].input_mode, -1 /*eci*/, data[i].option_1, data[i].option_2, ZINT_FULL_MULTIBYTE, -1 /*output_options*/, data[i].data, -1, debug); ret = ZBarcode_Encode(symbol, (unsigned char *) data[i].data, length); assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt); if (generate) { - printf(" /*%3d*/ { %s, \"%s\", %d, %d, %s, %d, %d, \"%s\",\n", - i, testUtilInputModeName(data[i].input_mode), data[i].data, data[i].option_1, data[i].option_2, testUtilErrorName(data[i].ret), - symbol->rows, symbol->width, data[i].comment); + printf(" /*%3d*/ { %s, %d, %d, \"%s\", %s, %d, %d, %d, \"%s\",\n", + i, testUtilInputModeName(data[i].input_mode), data[i].option_1, data[i].option_2, + testUtilEscape(data[i].data, length, escaped, sizeof(escaped)), testUtilErrorName(data[i].ret), + symbol->rows, symbol->width, data[i].bwipp_cmp, data[i].comment); testUtilModulesPrint(symbol, " ", "\n"); printf(" },\n"); } else { if (ret < ZINT_ERROR) { + int width, row; assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d (%s)\n", i, symbol->rows, data[i].expected_rows, data[i].data); assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d (%s)\n", i, symbol->width, data[i].expected_width, data[i].data); - if (ret == 0) { - int width, row; - ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); - assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data); + ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); + assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data); + + if (do_bwipp && testUtilCanBwipp(i, symbol, data[i].option_1, data[i].option_2, -1, debug)) { + if (!data[i].bwipp_cmp) { + if (debug & ZINT_DEBUG_TEST_PRINT) printf("i:%d %s not BWIPP compatible (%s)\n", i, testUtilBarcodeName(symbol->symbology), data[i].comment); + } else { + ret = testUtilBwipp(i, symbol, data[i].option_1, data[i].option_2, -1, data[i].data, length, NULL, bwipp_buf, sizeof(bwipp_buf)); + assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(symbol->symbology), ret); + + ret = testUtilBwippCmp(symbol, bwipp_msg, bwipp_buf, data[i].expected); + assert_zero(ret, "i:%d %s testUtilBwippCmp %d != 0 %s\n actual: %s\nexpected: %s\n", + i, testUtilBarcodeName(symbol->symbology), ret, bwipp_msg, bwipp_buf, data[i].expected); + } } } } diff --git a/backend/tests/test_raster.c b/backend/tests/test_raster.c index e2853d50..2430dfb7 100644 --- a/backend/tests/test_raster.c +++ b/backend/tests/test_raster.c @@ -782,7 +782,7 @@ static void test_draw_string_wrap(int index, int debug) { int symbology; int output_options; char *data; - char* text; + char *text; float expected_height; int expected_rows; @@ -931,6 +931,7 @@ static void test_scale(int index, int debug) { char *data; char *composite; + int ret_raster; float expected_height; int expected_rows; int expected_width; @@ -943,30 +944,32 @@ static void test_scale(int index, int debug) { }; // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<")) struct item data[] = { - /* 0*/ { BARCODE_PDF417, -1, -1, -1, 0, "1", "", 18, 6, 103, 206, 36, 0, 36, 170, 14 }, // With no scaling - /* 1*/ { BARCODE_PDF417, -1, -1, -1, 0.6, "1", "", 18, 6, 103, 206 * 0.6, 36 * 0.6, 0 /*set_row*/, 36 * 0.6, 170 * 0.6 + 1, 14 * 0.6 }, // +1 set_col due to some scaling inversion difference - /* 2*/ { BARCODE_PDF417, -1, -1, -1, 1.2, "1", "", 18, 6, 103, 206 * 1.2, 36 * 1.2, 0 /*set_row*/, 36 * 1.2, 170 * 1.2 + 1, 14 * 1.2 }, // +1 set_col due to some scaling inversion difference - /* 3*/ { BARCODE_PDF417, -1, -1, -1, 0.5, "1", "", 18, 6, 103, 206 * 0.5, 36 * 0.5, 0 /*set_row*/, 36 * 0.5, 170 * 0.5, 14 * 0.5 }, - /* 4*/ { BARCODE_PDF417, -1, -1, -1, 1.0, "1", "", 18, 6, 103, 206 * 1.0, 36 * 1.0, 0 /*set_row*/, 36 * 1.0, 170 * 1.0, 14 * 1.0 }, - /* 5*/ { BARCODE_PDF417, -1, -1, -1, 1.5, "1", "", 18, 6, 103, 206 * 1.5, 36 * 1.5, 0 /*set_row*/, 36 * 1.5, 170 * 1.5, 14 * 1.5 }, - /* 6*/ { BARCODE_PDF417, -1, -1, -1, 2.0, "1", "", 18, 6, 103, 206 * 2.0, 36 * 2.0, 0 /*set_row*/, 36 * 2.0, 170 * 2.0, 14 * 2.0 }, - /* 7*/ { BARCODE_PDF417, -1, -1, -1, 2.5, "1", "", 18, 6, 103, 206 * 2.5, 36 * 2.5, 0 /*set_row*/, 36 * 2.5, 170 * 2.5, 14 * 2.5 }, - /* 8*/ { BARCODE_PDF417, -1, -1, -1, 3.0, "1", "", 18, 6, 103, 206 * 3.0, 36 * 3.0, 0 /*set_row*/, 36 * 3.0, 170 * 3.0, 14 * 3.0 }, - /* 9*/ { BARCODE_PDF417, -1, 3, BARCODE_BOX, 0, "1", "", 18, 6, 103, 218, 48, 0 /*set_row*/, 48, 176, 14 }, // With no scaling - /* 10*/ { BARCODE_PDF417, -1, 3, BARCODE_BOX, 0.6, "1", "", 18, 6, 103, 218 * 0.6, 48 * 0.6, 0 /*set_row*/, 48 * 0.6, 176 * 0.6 + 1, 14 * 0.6 }, // +1 set_col due to some scaling inversion difference - /* 11*/ { BARCODE_PDF417, -1, 3, BARCODE_BOX, 1.6, "1", "", 18, 6, 103, 218 * 1.6, 48 * 1.6, 0 /*set_row*/, 48 * 1.6, 176 * 1.6 + 1, 14 * 1.6 }, // +1 set_col due to some scaling inversion difference - /* 12*/ { BARCODE_PDF417, -1, 3, BARCODE_BOX, 1.5, "1", "", 18, 6, 103, 218 * 1.5, 48 * 1.5, 0 /*set_row*/, 48 * 1.5, 176 * 1.5, 14 * 1.5 }, - /* 13*/ { BARCODE_PDF417, -1, 3, BARCODE_BOX, 2.5, "1", "", 18, 6, 103, 218 * 2.5, 48 * 2.5, 0 /*set_row*/, 48 * 2.5, 176 * 2.5, 14 * 2.5 }, - /* 14*/ { BARCODE_PDF417, -1, 3, OUT_BUFFER_INTERMEDIATE, 1.3, "1", "", 18, 6, 103, 206 * 1.3, 36 * 1.3, 0 /*set_row*/, 36 * 1.3, 170 * 1.3 + 1, 14 * 1.3 }, // +1 set_col due to some scaling inversion difference - /* 15*/ { BARCODE_DBAR_LTD, -1, -1, BOLD_TEXT, 0, "123456789012", "", 50, 1, 79, 158, 116, 104 /*set_row*/, 114, 20, 2 }, // With no scaling - /* 16*/ { BARCODE_DBAR_LTD, -1, -1, BOLD_TEXT, 1.5, "123456789012", "", 50, 1, 79, 158 * 1.5, 116 * 1.5, 104 * 1.5 /*set_row*/, 114 * 1.5, 20 * 1.5, 1 * 1.5 }, - /* 17*/ { BARCODE_DBAR_LTD, -1, -1, BOLD_TEXT, 2.0, "123456789012", "", 50, 1, 79, 158 * 2.0, 116 * 2.0, 104 * 2.0 /*set_row*/, 114 * 2.0, 20 * 2.0, 1 * 2.0 }, - /* 18*/ { BARCODE_DBAR_LTD, -1, -1, BOLD_TEXT, 3.5, "123456789012", "", 50, 1, 79, 158 * 3.5, 116 * 3.5, 104 * 3.5 /*set_row*/, 114 * 3.5, 20 * 3.5, 1 * 3.5 }, - /* 19*/ { BARCODE_UPCA, -1, -1, -1, 0, "12345678904", "", 50, 1, 95, 226, 116, 104 /*set_row*/, 114, 5, 2 }, // With no scaling - /* 20*/ { BARCODE_UPCA, -1, -1, -1, 2.5, "12345678904", "", 50, 1, 95, 226 * 2.5, 116 * 2.5, 104 * 2.5 /*set_row*/, 114 * 2.5, 5 * 2.5, 2 * 2.5 }, - /* 21*/ { BARCODE_UPCA, -1, -1, -1, 4.5, "12345678904", "", 50, 1, 95, 226 * 4.5, 116 * 4.5, 104 * 4.5 /*set_row*/, 114 * 4.5, 5 * 4.5, 2 * 4.5 }, - /* 22*/ { BARCODE_UPCE_CC, -1, -1, -1, 0, "1234567", "[17]010615[10]A123456\"", 50, 10, 55, 142, 116, 104 /*set_row*/, 115, 11, 2 }, // With no scaling - /* 23*/ { BARCODE_UPCE_CC, -1, -1, -1, 2.0, "1234567", "[17]010615[10]A123456\"", 50, 10, 55, 142 * 2, 116 * 2, 104 * 2 + 1 /*set_row*/, 115 * 2, 11 * 2, 2 * 2 }, // +1 set_row + /* 0*/ { BARCODE_PDF417, -1, -1, -1, 0, "1", "", 0, 18, 6, 103, 206, 36, 0, 36, 170, 14 }, // With no scaling + /* 1*/ { BARCODE_PDF417, -1, -1, -1, 0.6, "1", "", 0, 18, 6, 103, 206 * 0.6, 36 * 0.6, 0 /*set_row*/, 36 * 0.6, 170 * 0.6 + 1, 14 * 0.6 }, // +1 set_col due to some scaling inversion difference + /* 2*/ { BARCODE_PDF417, -1, -1, -1, 1.2, "1", "", 0, 18, 6, 103, 206 * 1.2, 36 * 1.2, 0 /*set_row*/, 36 * 1.2, 170 * 1.2 + 1, 14 * 1.2 }, // +1 set_col due to some scaling inversion difference + /* 3*/ { BARCODE_PDF417, -1, -1, -1, 0.5, "1", "", 0, 18, 6, 103, 206 * 0.5, 36 * 0.5, 0 /*set_row*/, 36 * 0.5, 170 * 0.5, 14 * 0.5 }, + /* 4*/ { BARCODE_PDF417, -1, -1, -1, 1.0, "1", "", 0, 18, 6, 103, 206 * 1.0, 36 * 1.0, 0 /*set_row*/, 36 * 1.0, 170 * 1.0, 14 * 1.0 }, + /* 5*/ { BARCODE_PDF417, -1, -1, -1, 1.5, "1", "", 0, 18, 6, 103, 206 * 1.5, 36 * 1.5, 0 /*set_row*/, 36 * 1.5, 170 * 1.5, 14 * 1.5 }, + /* 6*/ { BARCODE_PDF417, -1, -1, -1, 2.0, "1", "", 0, 18, 6, 103, 206 * 2.0, 36 * 2.0, 0 /*set_row*/, 36 * 2.0, 170 * 2.0, 14 * 2.0 }, + /* 7*/ { BARCODE_PDF417, -1, -1, -1, 2.5, "1", "", 0, 18, 6, 103, 206 * 2.5, 36 * 2.5, 0 /*set_row*/, 36 * 2.5, 170 * 2.5, 14 * 2.5 }, + /* 8*/ { BARCODE_PDF417, -1, -1, -1, 3.0, "1", "", 0, 18, 6, 103, 206 * 3.0, 36 * 3.0, 0 /*set_row*/, 36 * 3.0, 170 * 3.0, 14 * 3.0 }, + /* 9*/ { BARCODE_PDF417, -1, 3, BARCODE_BOX, 0, "1", "", 0, 18, 6, 103, 218, 48, 0 /*set_row*/, 48, 176, 14 }, // With no scaling + /* 10*/ { BARCODE_PDF417, -1, 3, BARCODE_BOX, 0.6, "1", "", 0, 18, 6, 103, 218 * 0.6, 48 * 0.6, 0 /*set_row*/, 48 * 0.6, 176 * 0.6 + 1, 14 * 0.6 }, // +1 set_col due to some scaling inversion difference + /* 11*/ { BARCODE_PDF417, -1, 3, BARCODE_BOX, 1.6, "1", "", 0, 18, 6, 103, 218 * 1.6, 48 * 1.6, 0 /*set_row*/, 48 * 1.6, 176 * 1.6 + 1, 14 * 1.6 }, // +1 set_col due to some scaling inversion difference + /* 12*/ { BARCODE_PDF417, -1, 3, BARCODE_BOX, 1.5, "1", "", 0, 18, 6, 103, 218 * 1.5, 48 * 1.5, 0 /*set_row*/, 48 * 1.5, 176 * 1.5, 14 * 1.5 }, + /* 13*/ { BARCODE_PDF417, -1, 3, BARCODE_BOX, 2.5, "1", "", 0, 18, 6, 103, 218 * 2.5, 48 * 2.5, 0 /*set_row*/, 48 * 2.5, 176 * 2.5, 14 * 2.5 }, + /* 14*/ { BARCODE_PDF417, -1, 3, OUT_BUFFER_INTERMEDIATE, 1.3, "1", "", 0, 18, 6, 103, 206 * 1.3, 36 * 1.3, 0 /*set_row*/, 36 * 1.3, 170 * 1.3 + 1, 14 * 1.3 }, // +1 set_col due to some scaling inversion difference + /* 15*/ { BARCODE_DBAR_LTD, -1, -1, BOLD_TEXT, 0, "123456789012", "", 0, 50, 1, 79, 158, 116, 104 /*set_row*/, 114, 20, 2 }, // With no scaling + /* 16*/ { BARCODE_DBAR_LTD, -1, -1, BOLD_TEXT, 1.5, "123456789012", "", 0, 50, 1, 79, 158 * 1.5, 116 * 1.5, 104 * 1.5 /*set_row*/, 114 * 1.5, 20 * 1.5, 1 * 1.5 }, + /* 17*/ { BARCODE_DBAR_LTD, -1, -1, BOLD_TEXT, 2.0, "123456789012", "", 0, 50, 1, 79, 158 * 2.0, 116 * 2.0, 104 * 2.0 /*set_row*/, 114 * 2.0, 20 * 2.0, 1 * 2.0 }, + /* 18*/ { BARCODE_DBAR_LTD, -1, -1, BOLD_TEXT, 3.5, "123456789012", "", 0, 50, 1, 79, 158 * 3.5, 116 * 3.5, 104 * 3.5 /*set_row*/, 114 * 3.5, 20 * 3.5, 1 * 3.5 }, + /* 19*/ { BARCODE_UPCA, -1, -1, -1, 0, "12345678904", "", 0, 50, 1, 95, 226, 116, 104 /*set_row*/, 114, 5, 2 }, // With no scaling + /* 20*/ { BARCODE_UPCA, -1, -1, -1, 2.5, "12345678904", "", 0, 50, 1, 95, 226 * 2.5, 116 * 2.5, 104 * 2.5 /*set_row*/, 114 * 2.5, 5 * 2.5, 2 * 2.5 }, + /* 21*/ { BARCODE_UPCA, -1, -1, -1, 4.5, "12345678904", "", 0, 50, 1, 95, 226 * 4.5, 116 * 4.5, 104 * 4.5 /*set_row*/, 114 * 4.5, 5 * 4.5, 2 * 4.5 }, + /* 22*/ { BARCODE_UPCE_CC, -1, -1, -1, 0, "1234567", "[17]010615[10]A123456\"", 0, 50, 10, 55, 142, 116, 104 /*set_row*/, 115, 11, 2 }, // With no scaling + /* 23*/ { BARCODE_UPCE_CC, -1, -1, -1, 2.0, "1234567", "[17]010615[10]A123456\"", 0, 50, 10, 55, 142 * 2, 116 * 2, 104 * 2 + 1 /*set_row*/, 115 * 2, 11 * 2, 2 * 2 }, // +1 set_row + /* 24*/ { BARCODE_MAXICODE, -1, -1, -1, 0, "1234567890", "", 0, 165, 33, 30, 299, 298, 3 /*set_row*/, 7, 10, 9 }, // With no scaling + /* 25*/ { BARCODE_MAXICODE, -1, -1, -1, 0.1, "1234567890", "", ZINT_WARN_NONCOMPLIANT, 165, 33, 30, 60, 65, 0 /*set_row*/, 1, 3, 1 }, }; int data_size = ARRAY_SIZE(data); int i, length, ret; @@ -1000,10 +1003,10 @@ static void test_scale(int index, int debug) { length = (int) strlen(text); ret = ZBarcode_Encode(symbol, (unsigned char *) text, length); - assert_zero(ret, "i:%d ZBarcode_Encode(%d) ret %d != 0 %s\n", i, data[i].symbology, ret, symbol->errtxt); + assert_zero(ret, "i:%d ZBarcode_Encode(%d) ret %d != 0 (%s)\n", i, data[i].symbology, ret, symbol->errtxt); ret = ZBarcode_Buffer(symbol, 0); - assert_zero(ret, "i:%d ZBarcode_Buffer(%d) ret %d != 0\n", i, data[i].symbology, ret); + assert_equal(ret, data[i].ret_raster, "i:%d ZBarcode_Buffer(%d) ret %d != %d (%s)\n", i, data[i].symbology, ret, data[i].ret_raster, symbol->errtxt); assert_nonnull(symbol->bitmap, "i:%d (%d) symbol->bitmap NULL\n", i, data[i].symbology); if (index != -1 && (debug & ZINT_DEBUG_TEST_PRINT)) testUtilBitmapPrint(symbol, NULL, NULL); // ZINT_DEBUG_TEST_PRINT 16 @@ -1015,7 +1018,7 @@ static void test_scale(int index, int debug) { assert_equal(symbol->bitmap_height, data[i].expected_bitmap_height, "i:%d (%d) symbol->bitmap_height %d != %d\n", i, data[i].symbology, symbol->bitmap_height, data[i].expected_bitmap_height); ret = ZBarcode_Print(symbol, 0); - assert_zero(ret, "i:%d ZBarcode_Print(%d) ret %d != 0\n", i, data[i].symbology, ret); + assert_equal(ret, data[i].ret_raster, "i:%d ZBarcode_Print(%d) ret %d != %d (%s)\n", i, data[i].symbology, ret, data[i].ret_raster, symbol->errtxt); assert_zero(remove(symbol->outfile), "i:%d remove(%s) != 0\n", i, symbol->outfile); assert_nonzero(symbol->bitmap_height >= data[i].expected_set_rows, "i:%d (%d) symbol->bitmap_height %d < expected_set_rows %d\n", diff --git a/backend/tests/test_svg.c b/backend/tests/test_svg.c index 43a42850..506bcfe0 100644 --- a/backend/tests/test_svg.c +++ b/backend/tests/test_svg.c @@ -103,6 +103,7 @@ static void test_print(int index, int generate, int debug) { /* 46*/ { BARCODE_PDF417, -1, -1, -1, -1, -1, -1, -1, -1, 5, "", "", 0, "Your Data Here!", "", ZINT_WARN_NONCOMPLIANT, "pdf417_height5.svg" }, /* 47*/ { BARCODE_USPS_IMAIL, -1, -1, -1, -1, -1, -1, -1, -1, 7.75, "", "", 0, "12345678901234567890", "", 0, "imail_height7.75.svg" }, /* 48*/ { BARCODE_ULTRA, -1, 3, BARCODE_BOX, 2, 2, -1, -1, -1, 0, "FF0000", "0000FF", 0, "12345678901234567890", "", 0, "ultra_fgbg_hvwsp2_box3.svg" }, + /* 49*/ { BARCODE_TELEPEN, -1, -1, -1, -1, -1, -1, -1, -1, 0.4, "", "", 180, "A", "", 0, "telepen_height0.4_rotate_180.svg" }, }; int data_size = ARRAY_SIZE(data); int i, length, ret; diff --git a/backend/tests/test_tif.c b/backend/tests/test_tif.c index bcfdcd7d..4058e340 100644 --- a/backend/tests/test_tif.c +++ b/backend/tests/test_tif.c @@ -75,6 +75,16 @@ static void test_pixel_plot(int index, int debug) { /* 25*/ { 3, 2048, "10", 1, 0, 0 }, // Strip Count 4, Rows Per Strip 682 ((3 * 682 + 2) * 4 == 8192) /* 26*/ { 2049, 4, "10", 1, 1, 0 }, // Strip Count 4, Rows Per Strip 1 (2049 * 1 * 4 == 8196) - large rows in 1 strip, even if > 8192 /* 27*/ { 4, 2049, "10", 1, 0, 0 }, // Strip Count 5, Rows Per Strip 512 ((4 * 512 + 1) * 4 == 8196) + /* 28*/ { 4096, 1, "10", 1, 1, 0 }, // Strip Count 1, Rows Per Strip 1 + /* 29*/ { 1, 4096, "10", 1, 0, 0 }, // Strip Count 2, Rows Per Strip 2048 + /* 30*/ { 4096, 2, "10", 1, 1, 0 }, // Strip Count 2, Rows Per Strip 1 + /* 31*/ { 2, 4096, "10", 1, 0, 0 }, // Strip Count 4, Rows Per Strip 1024 + /* 32*/ { 8192, 2, "10", 1, 1, 0 }, // Strip Count 2, Rows Per Strip 1 + /* 33*/ { 2, 8192, "10", 1, 0, 0 }, // Strip Count 8, Rows Per Strip 1024 + /* 34*/ { ZINT_MAX_DATA_LEN, 1, "10", 1, 1, 0 }, // Strip Count 1, Rows Per Strip 1 + /* 35*/ { 1, ZINT_MAX_DATA_LEN, "10", 1, 0, 0 }, // Strip Count 9, Rows Per Strip 2048 + /* 36*/ { ZINT_MAX_DATA_LEN, 2, "10", 1, 1, 0 }, // Strip Count 2, Rows Per Strip 1 + /* 37*/ { 2, ZINT_MAX_DATA_LEN, "10", 1, 0, 0 }, // Strip Count 17, Rows Per Strip 1024 }; int data_size = ARRAY_SIZE(data); int i, ret; diff --git a/backend/tests/test_ultra.c b/backend/tests/test_ultra.c index 42f08f9b..6ddbec5a 100644 --- a/backend/tests/test_ultra.c +++ b/backend/tests/test_ultra.c @@ -31,6 +31,83 @@ #include "testcommon.h" +static void test_large(int index, int debug) { + + struct item { + int option_1; + int option_3; + char *pattern; + int length; + int ret; + int expected_rows; + int expected_width; + }; + // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<")) + struct item data[] = { + /* 0*/ { -1, -1, "1", 252, 0, 31, 66 }, // Default EC2 + /* 1*/ { -1, -1, "1", 253, ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 2*/ { -1, -1, "1", ZINT_MAX_DATA_LEN, ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 3*/ { -1, -1, "A", 252, 0, 31, 66 }, + /* 4*/ { -1, -1, "A", 253, ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 5*/ { -1, -1, "\200", 252, 0, 31, 66 }, + /* 6*/ { -1, -1, "\200", 253, ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 7*/ { -1, -1, "\001", 252, 0, 31, 66 }, + /* 8*/ { -1, -1, "\001", 253, ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 9*/ { -1, ULTRA_COMPRESSION, "1", 504, 0, 31, 66 }, + /* 10*/ { -1, ULTRA_COMPRESSION, "1", 505, ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 11*/ { -1, ULTRA_COMPRESSION, "A", 375, 0, 31, 66 }, + /* 12*/ { -1, ULTRA_COMPRESSION, "A", 376, ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 13*/ { -1, ULTRA_COMPRESSION, "\200", 252, 0, 31, 66 }, + /* 14*/ { -1, ULTRA_COMPRESSION, "\200", 253, ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 15*/ { -1, ULTRA_COMPRESSION, "\001", 252, 0, 31, 66 }, + /* 16*/ { -1, ULTRA_COMPRESSION, "\001", 253, ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 17*/ { 1, -1, "1", 276, 0, 31, 66 }, + /* 18*/ { 1, -1, "1", 277, ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 19*/ { 2, -1, "1", 263, 0, 31, 66 }, + /* 20*/ { 2, -1, "1", 264, ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 21*/ { 3, -1, "1", 252, 0, 31, 66 }, + /* 22*/ { 3, -1, "1", 253, ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 23*/ { 4, -1, "1", 234, 0, 31, 66 }, + /* 24*/ { 4, -1, "1", 235, ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 25*/ { 5, -1, "1", 220, 0, 31, 66 }, + /* 26*/ { 5, -1, "1", 221, ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 27*/ { 6, -1, "1", 202, 0, 31, 66 }, + /* 28*/ { 6, -1, "1", 203, ZINT_ERROR_TOO_LONG, -1, -1 }, + }; + int data_size = ARRAY_SIZE(data); + int i, length, ret; + struct zint_symbol *symbol; + + char data_buf[ZINT_MAX_DATA_LEN + 1]; + + testStart("test_large"); + + for (i = 0; i < data_size; i++) { + + if (index != -1 && i != index) continue; + + symbol = ZBarcode_Create(); + assert_nonnull(symbol, "Symbol not created\n"); + + testUtilStrCpyRepeat(data_buf, data[i].pattern, data[i].length); + assert_equal(data[i].length, (int) strlen(data_buf), "i:%d length %d != strlen(data_buf) %d\n", i, data[i].length, (int) strlen(data_buf)); + + length = testUtilSetSymbol(symbol, BARCODE_ULTRA, -1 /*input_mode*/, -1 /*eci*/, data[i].option_1, -1, data[i].option_3, -1 /*output_options*/, data_buf, data[i].length, debug); + + ret = ZBarcode_Encode(symbol, (unsigned char *) data_buf, length); + assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt); + + if (ret < ZINT_ERROR) { + assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d\n", i, symbol->rows, data[i].expected_rows); + assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d\n", i, symbol->width, data[i].expected_width); + } + + ZBarcode_Delete(symbol); + } + + testFinish(); +} + static void test_reader_init(int index, int generate, int debug) { struct item { @@ -59,6 +136,7 @@ static void test_reader_init(int index, int generate, int debug) { for (i = 0; i < data_size; i++) { if (index != -1 && i != index) continue; + if ((debug & ZINT_DEBUG_TEST_PRINT) && !(debug & ZINT_DEBUG_TEST_LESS_NOISY)) printf("i:%d\n", i); symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); @@ -111,14 +189,14 @@ static void test_input(int index, int generate, int debug) { /* 6*/ { UNICODE_MODE, 0, -1, -1, "ABC", 0, "(4) 257 65 66 67", "" }, /* 7*/ { UNICODE_MODE, 0, -1, ULTRA_COMPRESSION, "ABC", 0, "(4) 272 65 66 67", "" }, /* 8*/ { UNICODE_MODE, 0, -1, ULTRA_COMPRESSION, "ULTRACODE_123456789!", 0, "(17) 272 85 76 84 82 65 67 79 68 69 95 140 162 184 206 57 33", "" }, - /* 9*/ { UNICODE_MODE, 0, -1, -1, "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 0, "(250) 257 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65", "249 chars EC2" }, - /* 10*/ { UNICODE_MODE, 0, -1, -1, "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", ZINT_ERROR_TOO_LONG, "Error 591: Data too long for selected error correction capacity", "250 chars EC2" }, - /* 11*/ { UNICODE_MODE, 0, 1, -1, "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 0, "(274) 257 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65", "273 chars EC0" }, - /* 12*/ { UNICODE_MODE, 0, 1, -1, "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", ZINT_ERROR_TOO_LONG, "Error 591: Data too long for selected error correction capacity", "274 chars EC0" }, + /* 9*/ { UNICODE_MODE, 0, -1, -1, "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 0, "(253) 257 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65", "252 chars EC2" }, + /* 10*/ { UNICODE_MODE, 0, -1, -1, "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", ZINT_ERROR_TOO_LONG, "Error 591: Data too long for selected error correction capacity", "253 chars EC2" }, + /* 11*/ { UNICODE_MODE, 0, 1, -1, "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 0, "(277) 257 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65", "276 chars EC0" }, + /* 12*/ { UNICODE_MODE, 0, 1, -1, "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", ZINT_ERROR_TOO_LONG, "Error 591: Data too long for selected error correction capacity", "277 chars EC0" }, /* 13*/ { UNICODE_MODE, 0, -1, -1, "é", 0, "(2) 257 233", "" }, /* 14*/ { UNICODE_MODE, 0, -1, -1, "β", ZINT_WARN_USES_ECI, "Warning (2) 263 226", "" }, /* 15*/ { UNICODE_MODE, 9, -1, -1, "β", 0, "(2) 263 226", "" }, - /* 16*/ { UNICODE_MODE, 9, -1, -1, "βAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 0, "(250) 263 226 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65", "249 chars EC2" }, + /* 16*/ { UNICODE_MODE, 9, -1, -1, "βAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 0, "(253) 263 226 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65", "249 chars EC2" }, /* 17*/ { UNICODE_MODE, 9, -1, ULTRA_COMPRESSION, "A", 0, "(2) 272 65", "Note ECI ignored and not outputted if ULTRA_COMPRESSION and all ASCII" }, /* 18*/ { UNICODE_MODE, 15, -1, -1, "Ŗ", 0, "(2) 268 170", "" }, /* 19*/ { DATA_MODE, 898, -1, -1, "\001\002\003\004\377", 0, "(7) 278 130 1 2 3 4 255", "" }, @@ -148,6 +226,14 @@ static void test_input(int index, int generate, int debug) { /* 43*/ { UNICODE_MODE, 0, -1, ULTRA_COMPRESSION, "Atel:aAa", 0, "(8) 272 275 6 89 275 148 0 42", "Mode: c (8)" }, /* 44*/ { UNICODE_MODE, 0, -1, ULTRA_COMPRESSION, "tel:AAaa", 0, "(8) 272 275 271 161 6 28 262 118", "Mode: c (8)" }, /* 45*/ { UNICODE_MODE, 0, -1, ULTRA_COMPRESSION, "AAaatel:aA", 0, "(10) 272 276 0 42 0 41 118 46 6 156", "Mode: c (10)" }, + /* 46*/ { UNICODE_MODE, 0, -1, ULTRA_COMPRESSION, "émailto:étel:éfile:éhttp://éhttps://éftp://", 0, "(18) 257 233 276 282 233 277 282 233 278 282 233 279 282 233 280 282 233 281", "Mode: 8ccccccc8cccc8ccccc8ccccccc8cccccccc8cccccc (43)" }, + /* 47*/ { UNICODE_MODE, 0, -1, ULTRA_COMPRESSION, "éhttp://www.url.com", 0, "(9) 257 233 279 269 186 113 81 45 252", "Mode: 8cccccccccccccccccc (19)" }, + /* 48*/ { UNICODE_MODE, 0, -1, ULTRA_COMPRESSION, "éhttps://www.url.com", 0, "(9) 257 233 280 269 186 113 81 45 252", "Mode: 8ccccccccccccccccccc (20)" }, + /* 49*/ { UNICODE_MODE, 0, -1, -1, "http://url.com", 0, "(8) 281 117 114 108 46 99 111 109", "Mode: 8888888 (7)" }, + /* 50*/ { UNICODE_MODE, 0, -1, -1, "https://url.com", 0, "(8) 282 117 114 108 46 99 111 109", "Mode: 8888888 (7)" }, + /* 51*/ { UNICODE_MODE, 0, -1, ULTRA_COMPRESSION, "http://url.com", 0, "(6) 281 262 133 216 269 251", "Mode: ccccccc (7)" }, + /* 52*/ { UNICODE_MODE, 0, -1, ULTRA_COMPRESSION, "https://url.com", 0, "(6) 282 262 133 216 269 251", "Mode: ccccccc (7)" }, + /* 53*/ { UNICODE_MODE, 0, -1, ULTRA_COMPRESSION, "{", 0, "(2) 272 123", "Mode: a (1)" }, }; int data_size = ARRAY_SIZE(data); int i, length, ret; @@ -160,6 +246,7 @@ static void test_input(int index, int generate, int debug) { for (i = 0; i < data_size; i++) { if (index != -1 && i != index) continue; + if ((debug & ZINT_DEBUG_TEST_PRINT) && !(debug & ZINT_DEBUG_TEST_LESS_NOISY)) printf("i:%d\n", i); symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); @@ -197,11 +284,14 @@ static void test_encode(int index, int generate, int debug) { int expected_rows; int expected_width; + int bwipp_cmp; char *comment; char *expected; }; + // Based on AIMD/TSC15032-43 (v 0.99c), with values updated from BWIPP update 2021-07-14 + // https://github.com/bwipp/postscriptbarcode/commit/4255810845fa8d45c6192dd30aee1fdad1aaf0cc struct item data[] = { - /* 0*/ { UNICODE_MODE, 0, -1, ULTRA_COMPRESSION, "ULTRACODE_123456789!", 0, 13, 22, "AIMD/TSC15032-43 Figure G.1 **NOT SAME** different compression", + /* 0*/ { UNICODE_MODE, 0, -1, ULTRA_COMPRESSION, "ULTRACODE_123456789!", 0, 13, 22, 1, "AIMD/TSC15032-43 Figure G.1 **NOT SAME** different compression", "7777777777777777777777" "7857865353533131551857" "7767853515611616136717" @@ -216,7 +306,7 @@ static void test_encode(int index, int generate, int debug) { "7817851653331136333857" "7777777777777777777777" }, - /* 1*/ { UNICODE_MODE, 0, -1, -1, "ULTRACODE_123456789!", 0, 13, 24, "AIMD/TSC15032-43 Figure G.1 **NOT SAME** no compression; verified against bwipp", + /* 1*/ { UNICODE_MODE, 0, -1, -1, "ULTRACODE_123456789!", 0, 13, 24, 1, "AIMD/TSC15032-43 Figure G.1 **NOT SAME** no compression", "777777777777777777777777" "785786533153313111181157" "776783361661161666676617" @@ -231,7 +321,7 @@ static void test_encode(int index, int generate, int debug) { "781786166533113663683357" "777777777777777777777777" }, - /* 2*/ { UNICODE_MODE, 0, -1, ULTRA_COMPRESSION, "HEIMASÍÐA KENNARAHÁSKÓLA ÍSLANDS", 0, 19, 23, "AIMD/TSC15032-43 Figure G.2 **NOT SAME** different compression", + /* 2*/ { UNICODE_MODE, 0, -1, ULTRA_COMPRESSION, "HEIMASÍÐA KENNARAHÁSKÓLA ÍSLANDS", 0, 19, 23, 1, "AIMD/TSC15032-43 Figure G.2 **NOT SAME** different compression", "77777777777777777777777" "78878663151561555158557" "77878315565635366667617" @@ -252,7 +342,7 @@ static void test_encode(int index, int generate, int debug) { "78878333656153153368617" "77777777777777777777777" }, - /* 3*/ { DATA_MODE, 0, -1, -1, "\110\105\111\115\101\123\315\320\101\040\113\105\116\116\101\122\101\110\301\123\113\323\114\101\040\315\123\114\101\116\104\123", 0, 19, 23, "AIMD/TSC15032-43 Figure G.2 **NOT SAME** no compression; verified against bwipp", + /* 3*/ { DATA_MODE, 0, -1, -1, "\110\105\111\115\101\123\315\320\101\040\113\105\116\116\101\122\101\110\301\123\113\323\114\101\040\315\123\114\101\116\104\123", 0, 19, 23, 1, "AIMD/TSC15032-43 Figure G.2 **NOT SAME** no compression", "77777777777777777777777" "78878633151153313358137" "77878315666661161167617" @@ -273,7 +363,7 @@ static void test_encode(int index, int generate, int debug) { "78878361115516163138317" "77777777777777777777777" }, - /* 4*/ { UNICODE_MODE, 10, -1, ULTRA_COMPRESSION, "אולטרה-קוד1234", 0, 13, 19, "AIMD/TSC15032-43 Figure G.3 Same except DCC correct whereas DCC in Figure G.3 is incorrent", + /* 4*/ { UNICODE_MODE, 10, -1, ULTRA_COMPRESSION, "אולטרה-קוד1234", 0, 13, 19, 1, "AIMD/TSC15032-43 Figure G.3 Same except DCC correct whereas DCC in Figure G.3 is incorrent", "7777777777777777777" "7857865565566616657" "7737853333613351517" @@ -288,7 +378,7 @@ static void test_encode(int index, int generate, int debug) { "7817851316355311357" "7777777777777777777" }, - /* 5*/ { DATA_MODE, 0, -1, -1, "\340\345\354\350\370\344\055\367\345\343\061\062\063\064", 0, 13, 20, "AIMD/TSC15032-43 Figure G.3 **NOT SAME** no compression; verified against bwipp", + /* 5*/ { DATA_MODE, 0, -1, -1, "\340\345\354\350\370\344\055\367\345\343\061\062\063\064", 0, 13, 20, 1, "AIMD/TSC15032-43 Figure G.3 **NOT SAME** no compression", "77777777777777777777" "78578611115666161157" "77678333656133516617" @@ -303,7 +393,7 @@ static void test_encode(int index, int generate, int debug) { "78178613653553116357" "77777777777777777777" }, - /* 6*/ { UNICODE_MODE, 0, -1, ULTRA_COMPRESSION, "https://aimglobal.org/jcrv3tX", 0, 13, 20, "AIMD/TSC15032-43 Figure G.4a **NOT SAME** different compression; also DCC incorrect in figure", + /* 6*/ { UNICODE_MODE, 0, -1, ULTRA_COMPRESSION, "https://aimglobal.org/jcrv3tX", 0, 13, 20, 1, "AIMD/TSC15032-43 Figure G.4a **NOT SAME** different compression; also DCC incorrect in figure", "77777777777777777777" "78578655115631563137" "77678563356513315617" @@ -318,7 +408,7 @@ static void test_encode(int index, int generate, int debug) { "78178163363613633157" "77777777777777777777" }, - /* 7*/ { GS1_MODE, 0, -1, -1, "[01]03453120000011[17]121125[10]ABCD1234", 0, 13, 23, "AIMD/TSC15032-43 Figure G.6 **NOT SAME** different compression and ECC; also DCC incorrect in figure", + /* 7*/ { GS1_MODE, 0, -1, -1, "[01]03453120000011[17]121125[10]ABCD1234", 0, 13, 23, 1, "AIMD/TSC15032-43 Figure G.6 **NOT SAME** different compression and ECC; also DCC incorrect in figure", "77777777777777777777777" "78578616535355353318157" "77678553116631616667617" @@ -333,7 +423,7 @@ static void test_encode(int index, int generate, int debug) { "78178335533356531518357" "77777777777777777777777" }, - /* 8*/ { UNICODE_MODE, 0, -1, -1, "A", 0, 13, 13, "Verified against bwipp", + /* 8*/ { UNICODE_MODE, 0, -1, -1, "A", 0, 13, 13, 1, "", "7777777777777" "7857863335517" "7717835163667" @@ -348,7 +438,22 @@ static void test_encode(int index, int generate, int debug) { "7817833536357" "7777777777777" }, - /* 9*/ { UNICODE_MODE, 0, 2, -1, "12345678901234567890123", 0, 13, 25, "Length 23 == 26 MCC (C) with EC1 so 7 ECC by Table 12", + /* 9*/ { UNICODE_MODE, 0, 2, -1, "1234567890123456789012", 0, 13, 24, 1, "Length 22 == 25 MCC (C) with EC1 so 6 ECC by Table 12", + "777777777777777777777777" + "785786663111111111181117" + "776783555536666666676667" + "783786113311333113383117" + "776785365155115351175357" + "783781136666363663683667" + "778787878787878787878787" + "786781313511111111181117" + "775785135666666666676637" + "781781666511333113383157" + "776783531656155561575517" + "781786155535516355186337" + "777777777777777777777777" + }, + /* 10*/ { UNICODE_MODE, 0, 2, -1, "12345678901234567890123", 0, 13, 25, 1, "Length 23 == 26 MCC (C) with EC1 so 7 ECC by Table 12", "7777777777777777777777777" "7857863655511111111811117" "7767831563666666666766667" @@ -363,7 +468,7 @@ static void test_encode(int index, int generate, int debug) { "7817835653363636636836657" "7777777777777777777777777" }, - /* 10*/ { UNICODE_MODE, 0, 1, -1, "1", 0, 13, 11, "Figure 3a min 2-row, EC0; verified against bwipp", + /* 11*/ { UNICODE_MODE, 0, 1, -1, "1", 0, 13, 11, 1, "Figure 3a min 2-row, EC0", "77777777777" "78578661517" "77178355667" @@ -378,114 +483,230 @@ static void test_encode(int index, int generate, int debug) { "78178365567" "77777777777" }, - /* 11*/ { UNICODE_MODE, 0, 6, -1, "123456789012345678901", 0, 13, 27, "Figure 3a max 2-row, EC5", - "777777777777777777777777777" - "785786316551651111181111117" - "771783535313166666676666667" - "783786166556351133381133317" - "771785311313665615575615557" - "786781655165353551683551637" - "778787878787878787878787877" - "783781165561111111181111117" - "771785336136536666676666637" - "783781113655351333181333157" - "775783635331635115375115367" - "781785553563556363686363637" - "777777777777777777777777777" + /* 12*/ { UNICODE_MODE, 0, 6, -1, "1234567890123456789012", 0, 13, 28, 0, "Figure 3a max 2-row, EC5 **NOT SAME** extra col due to BWIPP update 2021-07-14; BWIPP chooses 3 rows instead", + "7777777777777777777777777777" + "7857863331131511111811111157" + "7717835613316666666766666617" + "7837866555153511333811333157" + "7757853333361656155756155517" + "7867816166656535516835516357" + "7787878787878787878787878787" + "7837816551551111111811111117" + "7717855165135366666766666637" + "7837813613616513331813331157" + "7767836165151351153751153567" + "7817863633563563636863636637" + "7777777777777777777777777777" }, - /* 12*/ { UNICODE_MODE, 0, 6, -1, "1234567890123456789012345678901234567890123456789012", 0, 19, 36, "Figure 3b max 3-row, EC5", - "777777777777777777777777777777777777" - "788786363653513111181111111111111117" - "778783511165156356676666666666666667" - "788786155316333511383133133113313317" - "775785516633156156175515515361551557" - "781781335356661335686653331656665337" - "773787878787878787878787878787878787" - "785781313116156311181111111111111117" - "776786665563633166676666666666666667" - "788783316155566513381133133133113317" - "773785165316651651573615515515361557" - "781781556535515533186566653331656667" - "773787878787878787878787878787878787" - "786781333331113511181111111111111117" - "771785161113336666676666666666666657" - "788783313565163513381331133133133137" - "778785661613551651575153615515515317" - "788783155555336565383316566653331637" - "777777777777777777777777777777777777" + /* 13*/ { UNICODE_MODE, 0, 1, -1, "12345678901234567890123456789012345", 0, 19, 22, 1, "Figure 3b min 3-row, EC0 **NOT SAME** Zint min not same as real min as chooses lower rows first (would need row option)", + "7777777777777777777777" + "7887866511111111111817" + "7787833666666666666767" + "7887861513313311331837" + "7757855651551536155717" + "7837811565333165666857" + "7717878787878787878787" + "7857811111111111111857" + "7737855366666666666717" + "7887863113313313311857" + "7767816361551551536717" + "7817831556665333165857" + "7757878787878787878787" + "7867811111111111111817" + "7717855666666666666737" + "7887816133113313313817" + "7787863515361551551757" + "7887831331656665333867" + "7777777777777777777777" }, - /* 13*/ { UNICODE_MODE, 0, 6, -1, "12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123", 0, 25, 49, "Figure 3c max 4-row, EC5", - "7777777777777777777777777777777777777777777777777" - "7887861565635135151811111111111111181111111111117" - "7787835151513316566766666666666666676666666666667" - "7887861536666531351831331313313133183133131331317" - "7787856653153315566755156551565515675515655156557" - "7887813366335656655813565135651356581356513565137" - "7787878787878787878787878787878787878787878787877" - "7857836636366363311811111111111111181111111111117" - "7737855565651635656766666666666666676666666666667" - "7817861653316513563831313313133131383131331313317" - "7757856561153165131755131551315513175513155131557" - "7867863135615536653836663366633666383666336663367" - "7787878787878787878787878787878787878787878787877" - "7837856156651155111811111111111111181111111111117" - "7717815565563561566766666666666666676666666666667" - "7867866631136356613831313313133131383131331313317" - "7737831365663161551756551565515655175655156551567" - "7817865156355516135865135651356513586513565135657" - "7787878787878787878787878787878787878787878787877" - "7887853555355533511811111111111111181111111111117" - "7787835616631351166766666666666666676666666666657" - "7887863363316563613813313133131331381331313313167" - "7787831111653311551731551315513155173155131551357" - "7887816565561165166863366633666336686336663366637" - "7777777777777777777777777777777777777777777777777" + /* 14*/ { UNICODE_MODE, 0, 6, -1, "1234567890123456789012345678901234567890123456789012345", 0, 19, 38, 0, "Figure 3b max 3-row, EC5 **NOT SAME** extra col due to BWIPP update 2021-07-14; BWIPP chooses 4 rows instead", + "77777777777777777777777777777777777777" + "78878611311563611118111111111111111817" + "77878366156351555667666666666666666767" + "78878633333136131138313313311331331837" + "77578551555353555617551551536155155717" + "78178136611516613568665333165666533837" + "77678787878787878787878787878787878787" + "78178111165636331118111111111111111817" + "77678663533553616667666666666666666767" + "78878336161116361338113313313311331837" + "77378611355661535157361551551536155717" + "78178166536313613318656665333165666857" + "77578787878787878787878787878787878787" + "78678313563533551118111111111111111817" + "77178535616651666667666666666666666757" + "78878153331316151338133113313313311837" + "77878611116665665157515361551551536717" + "78878166553313356538331656665333165837" + "77777777777777777777777777777777777777" }, - /* 14*/ { UNICODE_MODE, 0, 6, -1, "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789", 0, 31, 66, "Figure 3d max 5-row, EC5 **NOT SAME** Max columns due to 282 limit is 60 not 61 as shown", + /* 15*/ { UNICODE_MODE, 0, 1, -1, "1234567890123456789012345678901234567890123456789012345678901234567890123456789012", 0, 25, 30, 1, "Figure 3c min 4-row, EC0 **NOT SAME** Zint min not same as real min as chooses lower rows first (would need row option)", + "777777777777777777777777777777" + "788786511111111111181111111117" + "778783166666666666676666666667" + "788786513313133131383131331317" + "778785351565515655175655156557" + "788781135651356513586513565137" + "778787878787878787878787878787" + "785783311111111111181111111117" + "771781166666666666676666666667" + "786786613133131331381331313317" + "775781351315513155173155131557" + "783783566633666336686336663367" + "778787878787878787878787878787" + "786783511111111111181111111157" + "771786666666666666676666666617" + "785785513133131331381331313357" + "773781665515655156575156551517" + "781785551356513565183565135657" + "778787878787878787878787878787" + "788781111111111111181111111117" + "778785366666666666676666666637" + "788781133131331313381313313117" + "778786315513155131575131551357" + "788785533666336663386663366667" + "777777777777777777777777777777" + }, + /* 16*/ { UNICODE_MODE, 0, 6, -1, "12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456", 0, 25, 50, 0, "Figure 3c max 4-row **NOT SAME** extra col due to BWIPP update 2021-07-14; BWIPP chooses 5 rows instead", + "77777777777777777777777777777777777777777777777777" + "78878631533313135518111111111111111811111111111117" + "77878315116161313667666666666666666766666666666667" + "78878656365333166518313313133131331831331313313137" + "77878561133666533667551565515655156755156551565517" + "78878156661531351558135651356513565813565135651357" + "77878787878787878787878787878787878787878787878787" + "78578313331353336118111111111111111811111111111117" + "77378661116566653567666666666666666766666666666667" + "78578136563115335638313133131331313831313313133137" + "77378311656551166317551315513155131755131551315517" + "78678653535336613538366633666336663836663366633667" + "77878787878787878787878787878787878787878787878787" + "78378336656556111118111111111111111811111111111157" + "77578153161313353667666666666666666766666666666617" + "78178566535655535138313133131331313831313313133157" + "77378635316136611517565515655156551756551565515617" + "78178551133613153358651356513565135865135651356557" + "77878787878787878787878787878787878787878787878787" + "78878655635551355118111111111111111811111111111117" + "77878313113333563667666666666666666766666666666657" + "78878161551515631138133131331313313813313133131367" + "77878316165363313517315513155131551731551315513157" + "78878633351651561668633666336663366863366633666337" + "77777777777777777777777777777777777777777777777777" + }, + /* 17*/ { UNICODE_MODE, 0, 1, -1, "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789", 0, 31, 42, 1, "Figure 3d min 5-row, EC0 **NOT SAME** Zint min not same as real min as chooses lower rows first (would need row option)", + "777777777777777777777777777777777777777777" + "788786511111111111181111111111111118111117" + "778783366666666666676666666666666667666667" + "788786113131313131381313131313131318313137" + "778785365656565656576565656565656567565657" + "788781553535353535385353535353535358353537" + "778787878787878787878787878787878787878787" + "788785511111111111181111111111111118111117" + "778781666666666666676666666666666667666667" + "788786533333333333383333333333333338333337" + "775785615151515151571515151515151517515157" + "783783536363636363683636363636363638636367" + "776787878787878787878787878787878787878787" + "781781111111111111181111111111111118111157" + "773785366666666666676666666666666667666617" + "788783131313131313183131313131313138131357" + "776786313131313131371313131313131317313117" + "783785556565656565685656565656565658656557" + "771787878787878787878787878787878787878787" + "785781111111111111181111111111111118111157" + "771783666666666666676666666666666667666617" + "788785131313131313183131313131313138131357" + "778781515151515151571515151515151517515117" + "788786363636363636386363636363636368363657" + "778787878787878787878787878787878787878787" + "788781111111111111181111111111111118111117" + "778786666666666666676666666666666667666637" + "788783131313131313183131313131313138131317" + "778785555555555555575555555555555557555557" + "788783616161616161681616161616161618616167" + "777777777777777777777777777777777777777777" + }, + /* 18*/ { UNICODE_MODE, 0, 6, -1, "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012", 0, 31, 66, 1, "Figure 3d max 5-row, EC5 **NOT SAME** Max columns due to 282 limit is 60 not 61 as shown", "777777777777777777777777777777777777777777777777777777777777777777" - "788786655166656555386351111111111118111111111111111811111111111117" - "778783331611363336575566666666666667666666666666666766666666666667" - "788786555153116611183153333333333338333333333333333833333333333337" - "778785361635661566576361515151515157151515151515151751515151515157" - "788781513513555315383653636363636368363636363636363863636363636367" + "788786563656553165385551111111111118111111111111111811111111111117" + "778783136511335313673366666666666667666666666666666766666666666667" + "788786315633661531381153333333333338333333333333333833333333333337" + "778785666366116365673661515151515157151515151515151751515151515157" + "788781333151633111586553636363636368363636363636363863636363636367" "778787878787878787878787878787878787878787878787878787878787878787" - "788785316656355536686131111111111118111111111111111811111111111157" - "778786653365566155373316666666666667666666666666666766666666666617" - "788783361516133633685633131313131318313131313131313813131313131357" - "775785513161356156176361313131313137131313131313131731313131313117" - "786786166533165615383615656565656568565656565656565865656565656557" + "788785511663631513386131111111111118111111111111111811111111111117" + "778786665351353656571616666666666667666666666666666766666666666667" + "788783551116166363183533131313131318313131313131313813131313131317" + "775786313333613536571361313131313137131313131313131731313131313137" + "786785666615135615686615656565656568565656565656565865656565656567" "775787878787878787878787878787878787878787878787878787878787878787" - "781783651151633136586611111111111118111111111111111811111111111157" - "776786533613515615373566666666666667666666666666666766666666666617" - "788781365531653133181613131313131318313131313131313813131313131357" - "773783113156366615576151515151515157151515151515151751515151515117" - "786786351535111563385536363636363638636363636363636836363636363657" - "773787878787878787878787878787878787878787878787878787878787878787" - "785785611111515333685311111111111118111111111111111811111111111157" - "771783336366133651571166666666666667666666666666666766666666666617" - "788786513535351316183313131313131318313131313131313813131313131357" - "778783131151115535575555555555555557555555555555555755555555555517" - "788785665366536111386661616161616168161616161616161861616161616157" + "783785665636551563586511111111111118111111111111111811111111111117" + "776781516115365616671166666666666667666666666666666766666666666667" + "788785631666611363586313131313131318313131313131313813131313131317" + "773786116553355536673151515151515157151515151515151751515151515157" + "786783553131613115381536363636363638636363636363636836363636363637" + "775787878787878787878787878787878787878787878787878787878787878787" + "783786611351531316585111111111111118111111111111111811111111111117" + "771783536663313553371666666666666667666666666666666766666666666667" + "788785665115635111683313131313131318313131313131313813131313131317" + "778783133333563566376155555555555557555555555555555755555555555557" + "788785356111611131583661616161616168161616161616161861616161616167" "778787878787878787878787878787878787878787878787878787878787878787" - "788786355163151355683611111111111118111111111111111811111111111137" - "778783563615515136176566666666666667666666666666666766666666666617" - "788785655136333561585613131313131318313131313131313813131313131357" - "778781136561611613373365656565656567565656565656565765656565656517" - "788783663313553565586153535353535358353535353535353853535353535357" + "788785665536116356681611111111111118111111111111111811111111111137" + "778786511361333635576566666666666667666666666666666766666666666617" + "788783666116561361181613131313131318313131313131313813131313131357" + "778785533633353533375565656565656567565656565656565765656565656517" + "788786316551515665186353535353535358353535353535353853535353535357" "777777777777777777777777777777777777777777777777777777777777777777" }, + /* 19*/ { UNICODE_MODE | ESCAPE_MODE, 0, -1, -1, "[)>\\R06\\G17V12345\\G1P234TYU\\GS6789\\R\\E", 0, 13, 27, 0, "06 Macro; not supported by BWIPP", + "777777777777777777777777777" + "785786311655611111181311157" + "771783153516566666676156617" + "783786565165331131183633357" + "771785613316555615571311517" + "786781336155113553683636357" + "778787878787878787878787877" + "783781136511131113183331117" + "771785651653616651671116637" + "783781163535161335185653357" + "775786355661515113676165537" + "781783531133356335585331617" + "777777777777777777777777777" + }, + /* 20*/ { UNICODE_MODE | ESCAPE_MODE, 0, -1, ULTRA_COMPRESSION, "[)>\\R06\\G17V12345\\G1P234TYU\\GS6789\\R\\E", 0, 13, 23, 0, "06 Macro; not supported by BWIPP", + "77777777777777777777777" + "78578613335635131318557" + "77678536566511516157617" + "78378311615366353638157" + "77578533166515131317617" + "78378356655653353638357" + "77878787878787878787877" + "78678151311551153338617" + "77578333653116611117137" + "78178611511333155658357" + "77378555366511536167517" + "78178116153635315338657" + "77777777777777777777777" + }, }; int data_size = ARRAY_SIZE(data); int i, length, ret; struct zint_symbol *symbol; char escaped[1024]; + char bwipp_buf[32768]; + char bwipp_msg[1024]; + + int do_bwipp = (debug & ZINT_DEBUG_TEST_BWIPP) && testUtilHaveGhostscript(); // Only do BWIPP test if asked, too slow otherwise testStart("test_encode"); for (i = 0; i < data_size; i++) { if (index != -1 && i != index) continue; + if ((debug & ZINT_DEBUG_TEST_PRINT) && !(debug & ZINT_DEBUG_TEST_LESS_NOISY)) printf("i:%d\n", i); symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); @@ -496,20 +717,32 @@ static void test_encode(int index, int generate, int debug) { assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt); if (generate) { - printf(" /*%3d*/ { %s, %d, %d, %s, \"%s\", %s, %d, %d, \"%s\",\n", + printf(" /*%3d*/ { %s, %d, %d, %s, \"%s\", %s, %d, %d, %d, \"%s\",\n", i, testUtilInputModeName(data[i].input_mode), data[i].eci, data[i].option_1, testUtilOption3Name(data[i].option_3), - testUtilEscape(data[i].data, length, escaped, sizeof(escaped)), testUtilErrorName(data[i].ret), symbol->rows, symbol->width, data[i].comment); + testUtilEscape(data[i].data, length, escaped, sizeof(escaped)), testUtilErrorName(data[i].ret), + symbol->rows, symbol->width, data[i].bwipp_cmp, data[i].comment); testUtilModulesPrint(symbol, " ", "\n"); printf(" },\n"); } else { if (ret < ZINT_ERROR) { + int width, row; assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d (%s)\n", i, symbol->rows, data[i].expected_rows, data[i].data); assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d (%s)\n", i, symbol->width, data[i].expected_width, data[i].data); - if (ret == 0) { - int width, row; - ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); - assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data); + ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); + assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data); + + if (do_bwipp && testUtilCanBwipp(i, symbol, data[i].option_1, -1, data[i].option_3, debug)) { + if (!data[i].bwipp_cmp) { + if (debug & ZINT_DEBUG_TEST_PRINT) printf("i:%d %s not BWIPP compatible (%s)\n", i, testUtilBarcodeName(symbol->symbology), data[i].comment); + } else { + ret = testUtilBwipp(i, symbol, data[i].option_1, -1, data[i].option_3, data[i].data, length, NULL, bwipp_buf, sizeof(bwipp_buf)); + assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(symbol->symbology), ret); + + ret = testUtilBwippCmp(symbol, bwipp_msg, bwipp_buf, data[i].expected); + assert_zero(ret, "i:%d %s testUtilBwippCmp %d != 0 %s\n actual: %s\nexpected: %s\n", + i, testUtilBarcodeName(symbol->symbology), ret, bwipp_msg, bwipp_buf, data[i].expected); + } } } } @@ -523,6 +756,7 @@ static void test_encode(int index, int generate, int debug) { int main(int argc, char *argv[]) { testFunction funcs[] = { /* name, func, has_index, has_generate, has_debug */ + { "test_large", test_large, 1, 0, 1 }, { "test_reader_init", test_reader_init, 1, 1, 1 }, { "test_input", test_input, 1, 1, 1 }, { "test_encode", test_encode, 1, 1, 1 }, diff --git a/backend/tests/testcommon.c b/backend/tests/testcommon.c index d232da5f..0d673e72 100644 --- a/backend/tests/testcommon.c +++ b/backend/tests/testcommon.c @@ -2115,7 +2115,7 @@ static const char *testUtilBwippName(int index, const struct zint_symbol *symbol { "", -1, 94, 0, 0, 0, 0, 0, }, { "", -1, 95, 0, 0, 0, 0, 0, }, { "", BARCODE_DPD, 96, 0, 0, 0, 0, 0, }, - { "microqrcode", BARCODE_MICROQR, 97, 0, 0, 0, 0, 0, }, + { "microqrcode", BARCODE_MICROQR, 97, 1, 1, 1, 0, 0, }, { "hibccode128", BARCODE_HIBC_128, 98, 0, 0, 0, 0, 0, }, { "hibccode39", BARCODE_HIBC_39, 99, 0, 0, 0, 0, 0, }, { "", -1, 100, 0, 0, 0, 0, 0, }, @@ -2162,8 +2162,8 @@ static const char *testUtilBwippName(int index, const struct zint_symbol *symbol { "codeone", BARCODE_CODEONE, 141, 0, 1, 0, 0, 0, }, { "", BARCODE_GRIDMATRIX, 142, 0, 0, 0, 0, 0, }, { "", BARCODE_UPNQR, 143, 0, 0, 0, 0, 0, }, - { "ultracode", BARCODE_ULTRA, 144, 0, 0, 0, 0, 0, }, - { "rectangularmicroqrcode", BARCODE_RMQR, 145, 0, 0, 0, 0, 0, }, + { "ultracode", BARCODE_ULTRA, 144, 1, 0, 0, 0, 0, }, + { "rectangularmicroqrcode", BARCODE_RMQR, 145, 1, 1, 0, 0, 0, }, }; static const int data_size = ARRAY_SIZE(data); @@ -2218,6 +2218,21 @@ static const char *testUtilBwippName(int index, const struct zint_symbol *symbol } return NULL; } + } else if (symbology == BARCODE_RMQR) { + if (option_2 < 1) { + if (debug & ZINT_DEBUG_TEST_PRINT) { + printf("i:%d %s not BWIPP compatible, version (option_2) must be specified\n", + index, testUtilBarcodeName(symbology)); + } + return NULL; + } + if (option_2 > 32) { + if (debug & ZINT_DEBUG_TEST_PRINT) { + printf("i:%d %s not BWIPP compatible, auto width (option_2 > 32) not supported\n", + index, testUtilBarcodeName(symbology)); + } + return NULL; + } } if (linear_row_height) { @@ -2232,7 +2247,7 @@ static const char *testUtilBwippName(int index, const struct zint_symbol *symbol *gs1_cvt = 1; } return "gs1datamatrix"; - } else if (symbology == BARCODE_AZTEC) { + } else if (symbology == BARCODE_AZTEC || symbology == BARCODE_ULTRA) { if (debug & ZINT_DEBUG_TEST_PRINT) { printf("i:%d %s not BWIPP compatible, GS1_MODE not supported\n", index, testUtilBarcodeName(symbology)); @@ -2883,6 +2898,46 @@ int testUtilBwipp(int index, const struct zint_symbol *symbol, int option_1, int bwipp_opts = bwipp_opts_buf; } } + } else if (symbology == BARCODE_MICROQR || symbology == BARCODE_RMQR) { + if (option_1 >= 1 && option_1 <= 4) { + static const char eccs[4] = { 'L', 'M', 'Q', 'H' }; + sprintf(bwipp_opts_buf + strlen(bwipp_opts_buf), "%seclevel=%c", + strlen(bwipp_opts_buf) ? " " : "", eccs[option_1 - 1]); + bwipp_opts = bwipp_opts_buf; + } + if (symbology == BARCODE_MICROQR) { + if (option_2 >= 1 && option_2 <= 4) { + sprintf(bwipp_opts_buf + strlen(bwipp_opts_buf), "%sversion=M%d", + strlen(bwipp_opts_buf) ? " " : "", option_2); + bwipp_opts = bwipp_opts_buf; + } + if (option_3 != -1) { + int mask = (symbol->option_3 >> 8) & 0x0F; + if (mask >= 1 && mask <= 4) { + sprintf(bwipp_opts_buf + strlen(bwipp_opts_buf), "%smask=%d", + strlen(bwipp_opts_buf) ? " " : "", ((symbol->option_3 >> 8) & 0x0F)); + bwipp_opts = bwipp_opts_buf; + } + } + } else if (symbology == BARCODE_RMQR) { + if (option_2 >= 1 && option_2 <= 32) { + static const char *vers[] = { + "R7x43", "R7x59", "R7x77", "R7x99", "R7x139", "R9x43", "R9x59", "R9x77", "R9x99", "R9x139", + "R11x27", "R11x43", "R11x59", "R11x77", "R11x99", "R11x139", "R13x27", "R13x43", "R13x59", "R13x77", + "R13x99", "R13x139", "R15x43", "R15x59", "R15x77", "R15x99", "R15x139", "R17x43", "R17x59", "R17x77", + "R17x99", "R17x139", + }; + sprintf(bwipp_opts_buf + strlen(bwipp_opts_buf), "%sversion=%s", + strlen(bwipp_opts_buf) ? " " : "", vers[option_2 - 1]); + bwipp_opts = bwipp_opts_buf; + } + } + } else if (symbology == BARCODE_ULTRA) { + if (option_1 >= 1 && option_1 <= 6) { + sprintf(bwipp_opts_buf + strlen(bwipp_opts_buf), "%seclevel=EC%d", + strlen(bwipp_opts_buf) ? " " : "", option_1 - 1); + bwipp_opts = bwipp_opts_buf; + } } } @@ -3022,7 +3077,7 @@ int testUtilBwipp(int index, const struct zint_symbol *symbol, int option_1, int } /* Compare bwipp_dump.ps output to test suite module dump */ -int testUtilBwippCmp(const struct zint_symbol *symbol, char *msg, const char *bwipp_buf, const char *expected) { +int testUtilBwippCmp(const struct zint_symbol *symbol, char *msg, char *bwipp_buf, const char *expected) { int bwipp_len = (int) strlen(bwipp_buf); int expected_len = (int) strlen(expected); int ret_memcmp; @@ -3035,6 +3090,14 @@ int testUtilBwippCmp(const struct zint_symbol *symbol, char *msg, const char *bw return 2; } + if (symbol->symbology == BARCODE_ULTRA) { + static const char map[] = { '8', '1', '2', '3', '4', '5', '6', '7', '8', '7' }; + for (i = 0; i < bwipp_len; i++) { + if (bwipp_buf[i] >= '0' && bwipp_buf[i] <= '9') { + bwipp_buf[i] = map[bwipp_buf[i] - '0']; + } + } + } ret_memcmp = memcmp(bwipp_buf, expected, expected_len); if (ret_memcmp != 0) { for (i = 0; i < expected_len; i++) { diff --git a/backend/tests/testcommon.h b/backend/tests/testcommon.h index 9b292228..5ea4ac0a 100644 --- a/backend/tests/testcommon.h +++ b/backend/tests/testcommon.h @@ -175,7 +175,7 @@ int testUtilCanBwipp(int index, const struct zint_symbol *symbol, int option_1, int debug); int testUtilBwipp(int index, const struct zint_symbol *symbol, int option_1, int option_2, int option_3, const char *data, int length, const char *primary, char *buffer, int buffer_size); -int testUtilBwippCmp(const struct zint_symbol *symbol, char *msg, const char *bwipp_buf, const char *expected); +int testUtilBwippCmp(const struct zint_symbol *symbol, char *msg, char *bwipp_buf, const char *expected); int testUtilBwippCmpRow(const struct zint_symbol *symbol, int row, char *msg, const char *bwipp_buf, const char *expected); diff --git a/backend/tests/tools/bwipp_dump-barcode.ps.diff b/backend/tests/tools/bwipp_dump-barcode.ps.diff index 0b62606b..204ab145 100644 --- a/backend/tests/tools/bwipp_dump-barcode.ps.diff +++ b/backend/tests/tools/bwipp_dump-barcode.ps.diff @@ -1,5 +1,5 @@ ---- /home/mburke/code/bwipp/postscriptbarcode/build/monolithic/barcode.ps 2021-08-05 14:58:19.638816396 +0100 -+++ backend/tests/tools/bwipp_dump.ps 2021-08-05 14:59:04.030459474 +0100 +--- /home/mburke/code/bwipp/postscriptbarcode/build/monolithic/barcode.ps 2021-08-09 14:49:02.985470860 +0100 ++++ backend/tests/tools/bwipp_dump.ps 2021-08-09 14:50:05.624957661 +0100 @@ -26289,34 +26289,80 @@ pop } ifelse diff --git a/backend/tests/tools/bwipp_dump.ps.tar.xz b/backend/tests/tools/bwipp_dump.ps.tar.xz index 00132dff80444cfc38eb20a30c6a15d935553d62..f2994f85adfed32d252f63877026814d5b5fc22a 100644 GIT binary patch literal 123516 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%0DHi>8h$oD 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

jQ~lnrKP@RWQ_fB_80Yj_g^j`#b)0&xvIU# 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\\^*"; static const char ultra_digit[] = "0123456789,/"; static const char ultra_colour[] = "0CBMRYGKW"; -//static const int ultra_maxsize[] = {34, 78, 158, 282}; // According to Table 1 -// Adjusted to allow 79-81 codeword range in 3-row symbols (only 1 secondary vertical clock track, not 2, so 3 extra) -static const int ultra_maxsize[] = {34, 81, 158, 282}; +// Max size and min cols adjusted to BWIPP values as updated 2021-07-14 +// https://github.com/bwipp/postscriptbarcode/commit/4255810845fa8d45c6192dd30aee1fdad1aaf0cc +static const int ultra_maxsize[] = {37, 84, 161, 282}; -static const int ultra_mincols[] = {5, 13, 23, 30}; // # Total Tile Columns from Table 1 +static const int ultra_mincols[] = {5, 13, 22, 29}; static const int kec[] = {0, 1, 2, 4, 6, 8}; // Value K(EC) from Table 12 @@ -153,7 +153,7 @@ static void ultra_initLogTables(unsigned short gfPwr[], unsigned short gfLog[]) for (j = 0; j < 283; j++) gfLog[j] = 0; i = 1; for (j = 0; j < 282; j++) { - /* j + 282 indicies save doing the modulo operation in GFMUL */ + /* j + 282 indices save doing the modulo operation in GFMUL */ gfPwr[j + 282] = gfPwr[j] = (short) i; gfLog[i] = (short) j; i = (i * 3) % 283; @@ -230,7 +230,7 @@ static int ultra_find_fragment(const unsigned char source[], int source_length, /* Encode characters in 8-bit mode */ static float look_ahead_eightbit(unsigned char source[], int in_length, int in_locn, char current_mode, int end_char, - int cw[], int* cw_len, int gs1) { + int cw[], int *cw_len, int gs1) { int codeword_count = 0; int i; int letters_encoded = 0; @@ -257,14 +257,13 @@ static float look_ahead_eightbit(unsigned char source[], int in_length, int in_l if (codeword_count == 0) { return 0.0; - } else { - return (float)letters_encoded / (float)codeword_count; } + return (float) letters_encoded / (float) codeword_count; } /* Encode character in the ASCII mode/submode (including numeric compression) */ static float look_ahead_ascii(unsigned char source[], int in_length, int in_locn, char current_mode, int symbol_mode, - int end_char, int cw[], int* cw_len, int* encoded, int gs1) { + int end_char, int cw[], int *cw_len, int *encoded, int gs1) { int codeword_count = 0; int i; int first_digit, second_digit, done; @@ -347,9 +346,8 @@ static float look_ahead_ascii(unsigned char source[], int in_length, int in_locn if (codeword_count == 0) { return 0.0; - } else { - return (float)letters_encoded / (float)codeword_count; } + return (float) letters_encoded / (float) codeword_count; } /* Returns true if should latch to subset other than given `subset` */ @@ -357,8 +355,8 @@ static int c43_should_latch_other(const unsigned char data[], const int length, const int gs1) { int i, fraglen, predict_window; int cnt, alt_cnt, fragno; - const char* set = subset == 1 ? ultra_c43_set1 : ultra_c43_set2; - const char* alt_set = subset == 2 ? ultra_c43_set1 : ultra_c43_set2; + const char *set = subset == 1 ? ultra_c43_set1 : ultra_c43_set2; + const char *alt_set = subset == 2 ? ultra_c43_set1 : ultra_c43_set2; if (locn + 3 > length) { return 0; @@ -423,7 +421,7 @@ static int get_subset(unsigned char source[], int in_length, int in_locn, int cu /* Encode characters in the C43 compaction submode */ static float look_ahead_c43(unsigned char source[], int in_length, int in_locn, char current_mode, int end_char, - int subset, int cw[], int* cw_len, int* encoded, int gs1, int debug) { + int subset, int cw[], int *cw_len, int *encoded, int gs1, int debug) { int codeword_count = 0; int subcodeword_count = 0; int i; @@ -438,7 +436,7 @@ static float look_ahead_c43(unsigned char source[], int in_length, int in_locn, #ifndef _MSC_VER int subcw[(in_length + 3) * 2]; #else - int * subcw = (int *) _alloca((in_length + 3) * 2 * sizeof(int)); + int *subcw = (int *) _alloca((in_length + 3) * 2 * sizeof(int)); #endif /* _MSC_VER */ if (current_mode == EIGHTBIT_MODE) { @@ -451,7 +449,7 @@ static float look_ahead_c43(unsigned char source[], int in_length, int in_locn, fragno -= 2; } - switch(fragno) { + switch (fragno) { case 17: // mailto: cw[codeword_count] = 276; sublocn += (int) strlen(fragment[fragno]); @@ -486,23 +484,18 @@ static float look_ahead_c43(unsigned char source[], int in_length, int in_locn, if (subset == 1) { cw[codeword_count] = 260; // C43 Compaction Submode C1 codeword_count++; - } - - if ((subset == 2) || (subset == 3)) { + } else if ((subset == 2) || (subset == 3)) { cw[codeword_count] = 266; // C43 Compaction Submode C2 codeword_count++; } break; } - } - if (current_mode == ASCII_MODE) { + } else if (current_mode == ASCII_MODE) { if (subset == 1) { cw[codeword_count] = 278; // C43 Compaction Submode C1 codeword_count++; - } - - if ((subset == 2) || (subset == 3)) { + } else if ((subset == 2) || (subset == 3)) { cw[codeword_count] = 280; // C43 Compaction Submode C2 codeword_count++; } @@ -542,33 +535,26 @@ static float look_ahead_c43(unsigned char source[], int in_length, int in_locn, subcw[subcodeword_count] = posn(ultra_c43_set1, source[sublocn]); subcodeword_count++; sublocn++; - } - - if (subset == 2) { + } else if (subset == 2) { subcw[subcodeword_count] = posn(ultra_c43_set2, source[sublocn]); subcodeword_count++; sublocn++; - } - - if (subset == 3) { + } else if (subset == 3) { subcw[subcodeword_count] = 41; // Shift to set 3 subcodeword_count++; fragno = ultra_find_fragment(source, in_length, sublocn); - if (fragno == 26) { - fragno = -1; - } - if ((fragno >= 0) && (fragno <= 18)) { - subcw[subcodeword_count] = fragno; // C43 Set 3 codewords 0 to 18 - subcodeword_count++; - sublocn += (int) strlen(fragment[fragno]); - } - if ((fragno >= 19) && (fragno <= 25)) { - subcw[subcodeword_count] = fragno + 17; // C43 Set 3 codewords 36 to 42 - subcodeword_count++; - sublocn += (int) strlen(fragment[fragno]); - } - if (fragno == -1) { + if (fragno != -1 && fragno != 26) { + if (fragno <= 18) { + subcw[subcodeword_count] = fragno; // C43 Set 3 codewords 0 to 18 + subcodeword_count++; + sublocn += (int) strlen(fragment[fragno]); + } else { + subcw[subcodeword_count] = fragno + 17; // C43 Set 3 codewords 36 to 42 + subcodeword_count++; + sublocn += (int) strlen(fragment[fragno]); + } + } else { subcw[subcodeword_count] = posn(ultra_c43_set3, source[sublocn]) + 19; // C43 Set 3 codewords 19 to 35 subcodeword_count++; sublocn++; @@ -610,9 +596,8 @@ static float look_ahead_c43(unsigned char source[], int in_length, int in_locn, if (codeword_count == 0) { return 0.0; - } else { - return (float)letters_encoded / (float)codeword_count; } + return (float) letters_encoded / (float) codeword_count; } /* Produces a set of codewords which are "somewhat" optimised - this could be improved on */ @@ -640,9 +625,9 @@ static int ultra_generate_codewords(struct zint_symbol *symbol, const unsigned c char mode[in_length + 1]; int cw_fragment[in_length * 2 + 1]; #else - unsigned char * crop_source = (unsigned char *) _alloca(in_length + 1); - char * mode = (char *) _alloca(in_length + 1); - int * cw_fragment = (int *) _alloca((in_length * 2 + 1) * sizeof(int)); + unsigned char *crop_source = (unsigned char *) _alloca(in_length + 1); + char *mode = (char *) _alloca(in_length + 1); + int *cw_fragment = (int *) _alloca((in_length * 2 + 1) * sizeof(int)); #endif /* _MSC_VER */ if ((symbol->input_mode & 0x07) == GS1_MODE) { @@ -720,18 +705,16 @@ static int ultra_generate_codewords(struct zint_symbol *symbol, const unsigned c } if ((codewords[0] == 257) || (codewords[0] == 272)) { - fragno = ultra_find_fragment((unsigned char *)source, in_length, 0); + fragno = ultra_find_fragment(source, in_length, 0); // Check for http:// at start of input if ((fragno == 0) || (fragno == 2)) { codewords[0] = 281; input_locn = 7; symbol_mode = EIGHTBIT_MODE; - } - // Check for https:// at start of input - if ((fragno == 1) || (fragno == 3)) { + } else if ((fragno == 1) || (fragno == 3)) { codewords[0] = 282; input_locn = 8; symbol_mode = EIGHTBIT_MODE; @@ -745,18 +728,18 @@ static int ultra_generate_codewords(struct zint_symbol *symbol, const unsigned c && source[4] == '0' && source[5] == '6' && source[6] == '\x1d' && source[in_length - 2] == '\x1e' && source[in_length - 1] == '\x04') { - if (symbol_mode == EIGHTBIT_MODE) { - codewords[codeword_count] = 271; // 06 Macro - } else { - codewords[codeword_count] = 273; // 06 Macro - } - codeword_count++; + if (symbol_mode == EIGHTBIT_MODE) { + codewords[codeword_count] = 271; // 06 Macro + } else { + codewords[codeword_count] = 273; // 06 Macro + } + codeword_count++; - for (i = 7; i < (in_length - 2); i++) { - crop_source[i - 7] = source[i]; - } - crop_length = in_length - 9; - crop_source[crop_length] = '\0'; + for (i = 7; i < (in_length - 2); i++) { + crop_source[i - 7] = source[i]; + } + crop_length = in_length - 9; + crop_source[crop_length] = '\0'; } else { /* Make a cropped version of input data - removes http:// and https:// if needed */ for (i = input_locn; i < in_length; i++) { @@ -786,9 +769,7 @@ static int ultra_generate_codewords(struct zint_symbol *symbol, const unsigned c if ((c43_score > ascii_score) && (c43_score > eightbit_score)) { mode[input_locn] = 'c'; current_mode = C43_MODE; - } - - if ((eightbit_score > ascii_score) && (eightbit_score > c43_score)) { + } else if ((eightbit_score > ascii_score) && (eightbit_score > c43_score)) { mode[input_locn] = '8'; current_mode = EIGHTBIT_MODE; } @@ -828,7 +809,7 @@ static int ultra_generate_codewords(struct zint_symbol *symbol, const unsigned c block_length++; } - switch(mode[input_locn]) { + switch (mode[input_locn]) { case 'a': look_ahead_ascii(crop_source, crop_length, input_locn, current_mode, symbol_mode, input_locn + block_length, cw_fragment, &fragment_length, NULL, gs1); @@ -890,8 +871,8 @@ INTERNAL int ultracode(struct zint_symbol *symbol, unsigned char source[], int l int tilex, tiley; int dcc; #ifdef _MSC_VER - int* data_codewords; - char* pattern; + int *data_codewords; + char *pattern; #endif /* _MSC_VER */ cw_memalloc = length * 2; @@ -913,7 +894,11 @@ INTERNAL int ultracode(struct zint_symbol *symbol, unsigned char source[], int l data_cw_count = ultra_generate_codewords(symbol, source, length, data_codewords); if (symbol->debug & ZINT_DEBUG_PRINT) { - printf("Codewords returned = %d\n", data_cw_count); + printf("Codewords (%d):", data_cw_count); + for (i = 0; i < data_cw_count; i++) { + printf(" %d", data_codewords[i]); + } + printf("\n"); } #ifdef ZINT_TEST if (symbol->debug & ZINT_DEBUG_TEST) { @@ -944,12 +929,12 @@ INTERNAL int ultracode(struct zint_symbol *symbol, unsigned char source[], int l acc = qcc - 3; if (symbol->debug & ZINT_DEBUG_PRINT) { - printf("ECC codewords: %d\n", qcc); + printf("EC%d codewords: %d\n", ecc_level + 1, qcc); } /* Maximum capacity is 282 codewords */ total_cws = data_cw_count + qcc + 3; // 3 == TCC pattern + RSEC pattern + QCC pattern - if (total_cws > 282) { + if (total_cws - 3 > 282) { strcpy(symbol->errtxt, "591: Data too long for selected error correction capacity"); return ZINT_ERROR_TOO_LONG; } @@ -987,6 +972,14 @@ INTERNAL int ultracode(struct zint_symbol *symbol, unsigned char source[], int l ultra_gf283((short) data_cw_count, (short) qcc, data_codewords); + if (symbol->debug & ZINT_DEBUG_PRINT) { + printf("ECCs (%d):", qcc); + for (i = 0; i < qcc; i++) { + printf(" %d", data_codewords[(282 - qcc) + i]); + } + printf("\n"); + } + /* Rearrange to make final codeword sequence */ codeword[locn++] = data_codewords[282 - (data_cw_count + qcc)]; // Start Character codeword[locn++] = data_cw_count; // MCC @@ -1070,11 +1063,9 @@ INTERNAL int ultracode(struct zint_symbol *symbol, unsigned char source[], int l if (tilex == 14) { tilex++; - } - if (tilex == 30) { + } else if (tilex == 30) { tilex++; - } - if (tilex == 46) { + } else if (tilex == 46) { tilex++; } } @@ -1122,7 +1113,7 @@ INTERNAL int ultracode(struct zint_symbol *symbol, unsigned char source[], int l for (i = 0; i < total_height; i++) { symbol->row_height[i] = 1; - for(j = 0; j < total_width; j++) { + for (j = 0; j < total_width; j++) { set_module_colour(symbol, i, j, posn(ultra_colour, pattern[(i * total_width) + j])); } } diff --git a/backend_tcl/zint_tcl.dsp b/backend_tcl/zint_tcl.dsp index aac19eff..4f14b0c5 100644 --- a/backend_tcl/zint_tcl.dsp +++ b/backend_tcl/zint_tcl.dsp @@ -43,7 +43,7 @@ RSC=rc.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ZINT_TCL_EXPORTS" /YX /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\backend" /I "C:\myprograms\tcl8.5\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ZINT_TCL_EXPORTS" /D "NO_PNG" /FR /YX /FD /D ZINT_VERSION="\"2.7.1\"" /c +# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\backend" /I "C:\Tcl\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ZINT_TCL_EXPORTS" /D "NO_PNG" /FR /YX /FD /D ZINT_VERSION="\"2.9.1.9\"" /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x407 /d "NDEBUG" @@ -53,7 +53,8 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib tclstub85.lib tkstub85.lib /nologo /dll /machine:I386 /out:"zint.dll" /libpath:"C:\myprograms\tcl8.5\lib" +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib tclstub85.lib tkstub85.lib /nologo /dll /machine:I386 /out:"zint.dll" /libpath:"C:\Tcl\lib" +# SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "zint_tcl - Win32 Debug" @@ -69,7 +70,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ZINT_TCL_EXPORTS" /YX /FD /GZ /c -# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\backend" /I "C:\myprograms\tcl8.5\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ZINT_TCL_EXPORTS" /D "NO_PNG" /FR /YX /FD /GZ /D ZINT_VERSION="\"2.7.1\"" /c +# ADD CPP /nologo /MD /W3 /Gm /GX /ZI /Od /I "..\backend" /I "C:\Tcl\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ZINT_TCL_EXPORTS" /D "NO_PNG" /FR /YX /FD /GZ /D ZINT_VERSION="\"2.9.1.9\"" /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x407 /d "_DEBUG" @@ -79,7 +80,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib tclstub85.lib tkstub85.lib /nologo /dll /debug /machine:I386 /out:"Debug/zint.dll" /pdbtype:sept /libpath:"C:\myprograms\tcl8.5\lib" +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib tclstub85.lib tkstub85.lib /nologo /dll /debug /machine:I386 /out:"Debug/zint.dll" /pdbtype:sept /libpath:"C:\Tcl\lib" !ENDIF diff --git a/docs/manual.txt b/docs/manual.txt index 873ee682..926ac23b 100644 --- a/docs/manual.txt +++ b/docs/manual.txt @@ -2473,13 +2473,15 @@ ZINT_FULL_MULTIBYTE | (N + 1) << 8. 6.6.4 Rectangular Micro QR Code (rMQR) -------------------------------------- -A rectangular version of QR Code. Like QR Code, rMQR supports encoding of GS1 -data, and Latin-1 characters in the ISO/IEC 8859-1 set and Kanji characters in -the Shift JIS encoding scheme. It does not support other ISO/IEC 8859 character -sets or encodings. As with other symbologies data should be entered as UTF-8 -with the conversion to Latin-1 or Shift JIS being handled by Zint. The amount of -ECC codewords can be adjusted using the --secure= option (API option_1), however -only ECC levels M and H are valid for this type of symbol. +A rectangular version of QR Code, it is still under development, so it is +recommended it should not yet be used for a production environment. Like QR +Code, rMQR supports encoding of GS1 data, and Latin-1 characters in the ISO/IEC +8859-1 set and Kanji characters in the Shift JIS encoding scheme. It does not +support other ISO/IEC 8859 character sets or encodings. As with other +symbologies data should be entered as UTF-8 with the conversion to Latin-1 or +Shift JIS being handled by Zint. The amount of ECC codewords can be adjusted +using the --secure= option (API option_1), however only ECC levels M and H are +valid for this type of symbol. ------------------------------------------------------------------------- Input | ECC Level | Error Correction Capacity | Recovery Capacity @@ -3088,7 +3090,7 @@ international standards: capture techniques - MicroPDF417 bar code symbology specification > ISO/IEC 24778:2008 Information technology - Automatic identification and data capture techniques - Aztec Code bar code symbology specification -> ISO/IEC JTC1/SC31N000 (Draft 2018-6-8) Information technology - Automatic +> ISO/IEC JTC1/SC31N000 (Draft 2019-6-24) Information technology - Automatic identification and data capture techniques - Rectangular Micro QR Code (rMQR) bar code symbology specification > ISO/IEC 16390:2007 Information technology - Automatic identification and data diff --git a/frontend_qt/grpC128.ui b/frontend_qt/grpC128.ui index 1746b789..12bc1810 100644 --- a/frontend_qt/grpC128.ui +++ b/frontend_qt/grpC128.ui @@ -71,11 +71,6 @@ 0 - - - 9 - - Note: Composite symbols require a GS1-128 linear component. diff --git a/frontend_qt/grpDAFT.ui b/frontend_qt/grpDAFT.ui index a210fc89..ae4f7dc7 100644 --- a/frontend_qt/grpDAFT.ui +++ b/frontend_qt/grpDAFT.ui @@ -76,11 +76,6 @@ 0 - - - 9 - - Examples of tracker ratios:<table cellspacing="3"> <tr><td>Australia Post&nbsp;</td><td>26%</td></tr> diff --git a/frontend_qt/grpGrid.ui b/frontend_qt/grpGrid.ui index 6dbce5d5..ad615bf9 100644 --- a/frontend_qt/grpGrid.ui +++ b/frontend_qt/grpGrid.ui @@ -160,11 +160,6 @@ 0 - - - 9 - - Note: Error Correction is ignored if it is below the minimum available or is too high for a given size. diff --git a/frontend_qt/mainWindow.ui b/frontend_qt/mainWindow.ui index 722982ee..2446643a 100644 --- a/frontend_qt/mainWindow.ui +++ b/frontend_qt/mainWindow.ui @@ -22,7 +22,7 @@ 400 - 485 + 435 @@ -56,6 +56,9 @@ + + Type of barcode + S&ymbology: @@ -65,9 +68,6 @@ bstyle - - Type of barcode - @@ -247,28 +247,28 @@ or import from file false + + Type of 2D component + &Type: cmbCompType - - Type of 2D component - + + false + 60 - 16777215 + 0 - - false - Type of 2D component @@ -306,16 +306,16 @@ or import from file false + + Data to be encoded in 2D component +Remember to place [square brackets] around AI identifiers + 2D C&omponent Data: txtComposite - - Data to be encoded in 2D component -Remember to place [square brackets] around AI identifiers - @@ -339,16 +339,6 @@ Remember to place [square brackets] around AI identifiers Data to be encoded in 2D component Remember to place [square brackets] around AI identifiers - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Noto Sans'; font-size:10pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Your Data Here!</span></p></body></html> - - - false - @@ -366,6 +356,10 @@ p, li { white-space: pre-wrap; } 16777215 + + Set the ECI (Extended Channel Interpretation) code +(ignored if disabled) + EC&I: @@ -375,10 +369,6 @@ p, li { white-space: pre-wrap; } cmbECI - - Set the ECI (Extended Channel Interpretation) code -(ignored if disabled) - @@ -386,7 +376,7 @@ p, li { white-space: pre-wrap; } 64 - 16777215 + 0 @@ -562,7 +552,7 @@ p, li { white-space: pre-wrap; } - + @@ -625,7 +615,7 @@ p, li { white-space: pre-wrap; } - Process parentheses "()" instead of square brackets "[]" + Process parentheses "()" instead of square brackets "[]" as delimiters for GS1 Application Identifiers (ignored if disabled) @@ -687,6 +677,10 @@ as delimiters for GS1 Application Identifiers false + + Overall symbol height in X-dimensions +(ignored if disabled) + &Height: @@ -696,10 +690,6 @@ as delimiters for GS1 Application Identifiers heightb - - Overall symbol height in X-dimensions -(ignored if disabled) - @@ -736,6 +726,9 @@ as delimiters for GS1 Application Identifiers + + Width of boundary bars or border in X-dimensions + Border &Width: @@ -745,9 +738,6 @@ as delimiters for GS1 Application Identifiers bwidth - - Width of boundary bars or border in X-dimensions - @@ -771,6 +761,9 @@ as delimiters for GS1 Application Identifiers + + Add border or box + Border &Type: @@ -780,9 +773,6 @@ as delimiters for GS1 Application Identifiers btype - - Add border or box - @@ -812,6 +802,9 @@ as delimiters for GS1 Application Identifiers + + Horizontal whitespace, Vertical whitespace, in X-dimensions + &Whitespace: @@ -821,9 +814,6 @@ as delimiters for GS1 Application Identifiers spnWhitespace - - Horizontal whitespace, Vertical whitespace, in X-dimensions - @@ -854,6 +844,9 @@ in X-dimensions + + Image scale when output to file + Printing Sca&le: @@ -863,9 +856,6 @@ in X-dimensions spnScale - - Image scale when output to file - @@ -895,6 +885,10 @@ in X-dimensions + + Set font characteristics +(ignored if disabled) + Fo&nt Setting: @@ -904,10 +898,6 @@ in X-dimensions cmbFontSetting - - Set font characteristics -(ignored if disabled) - @@ -957,6 +947,9 @@ in X-dimensions true + + Change colour of ink or paper + Colour: @@ -966,9 +959,6 @@ in X-dimensions fgcolor - - Change colour of ink or paper - @@ -1026,6 +1016,9 @@ in X-dimensions + + Rotate symbol by degrees + R&otate: @@ -1035,9 +1028,6 @@ in X-dimensions cmbRotate - - Rotate symbol by degrees - @@ -1086,6 +1076,10 @@ in X-dimensions false + + Size of dots +(ignored if disabled) + Dot S&ize: @@ -1095,21 +1089,17 @@ in X-dimensions spnDotSize - - Size of dots -(ignored if disabled) - + + false + Size of dots (ignored if disabled) - - false - @@ -1191,7 +1181,7 @@ in X-dimensions Output image to file (BMP/EMF/EPS/GIF/PCX/PNG/SVG/TIF) - &Save As… + &Save As… diff --git a/frontend_qt/mainwindow.cpp b/frontend_qt/mainwindow.cpp index c5427975..9e4e303e 100644 --- a/frontend_qt/mainwindow.cpp +++ b/frontend_qt/mainwindow.cpp @@ -132,6 +132,7 @@ MainWindow::MainWindow(QWidget *parent, Qt::WindowFlags fl) scene = new QGraphicsScene(this); setupUi(this); + view->setMinimumHeight(20); view->setScene(scene); restoreGeometry(settings.value("studio/window_geometry").toByteArray()); @@ -635,6 +636,7 @@ void MainWindow::change_options() tabMain->insertTab(1, m_optionWidget, tr("Cod&e 128")); chkComposite->setText(tr("Add &2D Component (GS1-128 only)")); combobox_item_enabled(cmbCompType, 3, true); // CC-C + set_smaller_font(m_optionWidget->findChild("noteC128CompositeEAN")); connect(m_optionWidget->findChild("radC128EAN"), SIGNAL(toggled( bool )), SLOT(composite_ean_check())); connect(m_optionWidget->findChild("radC128Stand"), SIGNAL(clicked( bool )), SLOT(update_preview())); connect(m_optionWidget->findChild("radC128CSup"), SIGNAL(clicked( bool )), SLOT(update_preview())); @@ -799,6 +801,7 @@ void MainWindow::change_options() m_optionWidget = uiload.load(&file); file.close(); tabMain->insertTab(1, m_optionWidget, tr("DAFT")); + set_smaller_font(m_optionWidget->findChild("noteTrackerRatios")); connect(m_optionWidget->findChild("spnDAFTTrackerRatio"), SIGNAL(valueChanged( double )), SLOT(update_preview())); } @@ -880,6 +883,7 @@ void MainWindow::change_options() m_optionWidget = uiload.load(&file); file.close(); tabMain->insertTab(1, m_optionWidget, tr("Grid M&atrix")); + set_smaller_font(m_optionWidget->findChild("noteGridECC")); connect(m_optionWidget->findChild("cmbGridSize"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview())); connect(m_optionWidget->findChild("cmbGridECC"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview())); connect(m_optionWidget->findChild("chkGridFullMultibyte"), SIGNAL(stateChanged( int )), SLOT(update_preview())); @@ -1138,6 +1142,27 @@ void MainWindow::set_gs1_mode(bool gs1_mode) } } +void MainWindow::set_smaller_font(QLabel *label) +{ + if (label) { + const QFont &appFont = QApplication::font(); + qreal pointSize = appFont.pointSizeF(); + if (pointSize != -1.0) { + QFont font = label->font(); + pointSize *= 0.9; + font.setPointSizeF(pointSize); + label->setFont(font); + } else { + int pixelSize = appFont.pixelSize(); + if (pixelSize > 1) { + QFont font = label->font(); + font.setPixelSize(pixelSize - 1); + label->setFont(font); + } + } + } +} + void MainWindow::update_preview() { int symbology = bstyle_items[bstyle->currentIndex()].symbology; diff --git a/frontend_qt/mainwindow.h b/frontend_qt/mainwindow.h index 8f4747f7..4d65db05 100644 --- a/frontend_qt/mainwindow.h +++ b/frontend_qt/mainwindow.h @@ -57,6 +57,7 @@ protected: void combobox_item_enabled(QComboBox *comboBox, int index, bool enabled); void upcean_addon_gap(QComboBox *comboBox, QLabel *label, int base); void set_gs1_mode(bool gs1_mode); + void set_smaller_font(QLabel *note); const char *get_setting_name(int symbology); diff --git a/tools/update_version.php b/tools/update_version.php index cb8be72b..9e2a438a 100644 --- a/tools/update_version.php +++ b/tools/update_version.php @@ -262,7 +262,10 @@ version_replace(2, $data_dirname . 'win32/vs2019/libzint.vcxproj', '/ZINT_VERSIO version_replace(2, $data_dirname . 'win32/vs2019/zint.vcxproj', '/ZINT_VERSION="/', '/ZINT_VERSION="[0-9.]+"/', 'ZINT_VERSION="' . $v_str . '"'); +// backend_tcl/zint_tcl.dsp + +version_replace(2, $data_dirname . 'backend_tcl/zint_tcl.dsp', '/ZINT_VERSION="\\\\"/', '/ZINT_VERSION="\\\\"[0-9.]+\\\\""/', 'ZINT_VERSION="\\"' . $v_str . '\\""'); + // Leaving auto-generated files: // backend_tcl/configure (PACKAGE_VERSION and PACKAGE_STRING) - generated by autoconf from configure.in // frontend_qt/Inno_Setup_qtzint.iss (MyAppVersion) -// win32/zint_cmdline_vc6/zint_cmdline_vc6.dsp (2 ZINT_VERSION's)