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; }
__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; }
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(); }
void test_dataLength(void) { int v, l; int bits; int err = 0; testStart("Test dataLength"); for(v=0; v<4; v++) { for(l=0; l<3; l++) { bits = MQRspec_getDataLengthBit(v+1, (QRecLevel)l); if(bits != datalen[v][l]) { printf("Error in version %d, level %d.\n", v, l); err++; } } } testEnd(err); }
int MQRspec_getDataLength(int version, QRecLevel level) { return (MQRspec_getDataLengthBit(version, level) + 4) / 8; }