extern unsigned char *FrameFiller_testMQR(int version) { int width; unsigned char *frame, *p; FrameFiller *filler; int i, length; width = MQRspec_getWidth(version); frame = MQRspec_newFrame(version); if(frame == NULL) return NULL; filler = FrameFiller_new(width, frame, 1); if(filler == NULL) { free(frame); return NULL; } length = MQRspec_getDataLengthBit(version, QR_ECLEVEL_L) + MQRspec_getECCLength(version, QR_ECLEVEL_L) * 8; for(i=0; i<length; i++) { p = FrameFiller_next(filler); if(p == NULL) { fprintf(stderr, "Frame filler run over the frame!\n"); free(filler); return frame; } *p = (unsigned char)(i & 0x7f) | 0x80; } free(filler); return frame; }
void test_fillerMQR(void) { unsigned char *frame; int i, j, w, e, length; testStart("Micro QR Code Frame filler test"); for(i=1; i<=MQRSPEC_VERSION_MAX; i++) { length = MQRspec_getDataLengthBit(i, QR_ECLEVEL_L) + MQRspec_getECCLength(i, QR_ECLEVEL_L) * 8; frame = FrameFiller_testMQR(i); if(frame == NULL) { assert_nonnull(frame, "Something wrong in version %d\n", i); } else { w = MQRspec_getWidth(i); e = 0; for(j=0; j<w*w; j++) { if(frame[j] == 0) e++; } assert_zero(e, "Not filled bit is found. (%d,%d)\n", j%w,j/w); if(i & 1) { e = w * 9 + 1; } else { e = w * (w - 1) + 1; } assert_equal(frame[e], (unsigned char)((length - 1) & 127) | 0x80, "Number of cell does not match in version %d.\n", i); free(frame); } } testFinish(); }
__STATIC MQRRawCode *MQRraw_new(QRinput *input) { MQRRawCode *raw; raw = (MQRRawCode *)malloc(sizeof(MQRRawCode)); if(raw == NULL) return NULL; raw->version = input->version; raw->dataLength = MQRspec_getDataLength(input->version, input->level); raw->eccLength = MQRspec_getECCLength(input->version, input->level); raw->oddbits = raw->dataLength * 8 - MQRspec_getDataLengthBit(input->version, input->level); raw->datacode = QRinput_getByteStream(input); if(raw->datacode == NULL) { free(raw); return NULL; } raw->ecccode = (unsigned char *)malloc(raw->eccLength); if(raw->ecccode == NULL) { free(raw->datacode); free(raw); return NULL; } raw->rsblock = (RSblock *)calloc(1, sizeof(RSblock)); if(raw->rsblock == NULL) { MQRraw_free(raw); return NULL; } RSblock_initBlock(raw->rsblock, raw->dataLength, raw->datacode, raw->eccLength, raw->ecccode); raw->count = 0; return raw; }
static void compareRSMQR(unsigned char data[]) { int i, j; RS *rs; int dl, el; unsigned char ecc_expected[256], ecc_rscodec[256]; for(i = 1; i <= MQRSPEC_VERSION_MAX; i++) { for(j = QR_ECLEVEL_L; j <= QR_ECLEVEL_Q; j++) { dl = MQRspec_getDataLength(i, (QRecLevel)j); el = MQRspec_getECCLength(i, (QRecLevel)j); if(dl != 0) { rs = init_rs(8, 0x11d, 0, 1, el, 255 - dl - el); RSECC_encode(dl, el, data, ecc_rscodec); encode_rs_char(rs, data, ecc_expected); assert_zero(memcmp(ecc_expected, ecc_rscodec, el), "Invalid ECC found: length %d.\n", el); free_rs_char(rs); } } } }