static QRcode_List *QRcode_encodeInputToStructured(QRinput *input) { QRinput_Struct *s; QRcode_List *codes; s = QRinput_splitQRinputToStruct(input); if(s == NULL) return NULL; codes = QRcode_encodeInputStructured(s); QRinput_Struct_free(s); return codes; }
void draw_structuredQRcodeFromQRinput(QRinput *stream) { QRinput_Struct *s; QRinput_setVersion(stream, version); QRinput_setErrorCorrectionLevel(stream, level); s = QRinput_splitQRinputToStruct(stream); if(s != NULL) { draw_structuredQRcode(s); QRinput_Struct_free(s); } else { fprintf(stderr, "Input data is too large for this setting.\n"); } }
void test_struct_split_invalidVersion(void) { QRinput *input; QRinput_Struct *s; char *str; int errsv; testStart("Testing structured-append symbols. (invalid version 0)"); str = (char *)malloc(128); memset(str, 'a', 128); input = QRinput_new2(0, QR_ECLEVEL_H); QRinput_append(input, QR_MODE_8, 128, (unsigned char *)str); s = QRinput_splitQRinputToStruct(input); errsv = errno; assert_null(s, "returns non-null."); assert_equal(errsv, ERANGE, "did not return ERANGE."); testFinish(); if(s != NULL) QRinput_Struct_free(s); QRinput_free(input); free(str); }
void test_parity2(void) { QRinput *input; QRinput_Struct *s; const char *text = "an example of four Structured Append symbols,"; unsigned char p1, p2; int i, len; testStart("Testing parity calc.(split)"); input = QRinput_new2(1, QR_ECLEVEL_L); QRinput_append(input, QR_MODE_8, strlen(text), (unsigned char *)text); s = QRinput_splitQRinputToStruct(input); p1 = s->parity; p2 = 0; len = strlen(text); for(i=0; i<len; i++) { p2 ^= text[i]; } assert_equal(p1, p2, "Parity numbers didn't match. (%02x should be %02x).\n", p1, p2); testFinish(); QRinput_free(input); QRinput_Struct_free(s); }
void test_splitentry3(void) { QRinput *input; QRinput_Struct *s; QRinput_List *e00, *e01, *e10, *e11; QRinput_InputList *list; const char *str = "abcdefghijklmno"; testStart("Testing QRinput_splitEntry. (does not split an entry)"); /* version 1 symbol contains 152 bit (19 byte) data. * 20 bits for a structured-append header, so 132 bits can be used. * 15 bytes of 8-bit data is suitable for the symbol. * (mode(4) + length(8) + data(120) == 132.) */ input = QRinput_new2(1, QR_ECLEVEL_L); QRinput_append(input, QR_MODE_8, strlen(str), (unsigned char *)str); QRinput_append(input, QR_MODE_8, strlen(str), (unsigned char *)str); s = QRinput_splitQRinputToStruct(input); list = s->head; e00 = list->input->head; e01 = e00->next; list = list->next; e10 = list->input->head; e11 = e00->next; assert_equal(e00->mode, QR_MODE_STRUCTURE, "Structure header is missing?"); assert_equal(e01->mode, QR_MODE_8, "no data?!"); assert_null(e01->next, "Input list is not terminated!\n"); assert_equal(e10->mode, QR_MODE_STRUCTURE, "Structure header is missing?"); assert_equal(e11->mode, QR_MODE_8, "no data?!"); assert_null(e11->next, "Input list is not terminated!\n"); QRinput_free(input); QRinput_Struct_free(s); testFinish(); }
void test_split_structure(int num) { QRinput *input; QRinput_Struct *s; QRcode_List *codes, *list; QRinput_InputList *il; int version; QRecLevel level; int c, i, ret; version = (int)drand(40) + 1; level = (QRecLevel)drand(4); fill8bitString(); input = QRinput_new2(version, level); if(input == NULL) { perror("test_split_structure aborted at QRinput_new2():"); return; } ret = Split_splitStringToQRinput((char *)data, input, QR_MODE_KANJI, 1); if(ret < 0) { perror("test_split_structure aborted at Split_splitStringToQRinput():"); QRinput_free(input); return; } s = QRinput_splitQRinputToStruct(input); if(s == NULL) { if(errno != 0 && errno != ERANGE) { perror("test_split_structure aborted at QRinput_splitQRinputToStruct():"); } QRinput_free(input); return; } il = s->head; i = 0; while(il != NULL) { if(il->input->version != version) { printf("Test: version %d, level %c\n", version, levelChar[level]); printf("wrong version number.\n"); printQRinputInfo(il->input); exit(1); } i++; il = il->next; } codes = QRcode_encodeInputStructured(s); if(codes == NULL) { perror("test_split_structure aborted at QRcode_encodeInputStructured():"); QRinput_free(input); QRinput_Struct_free(s); return; } list = codes; il = s->head; c = 0; while(list != NULL) { if(list->code->version != version) { printf("#%d: data mismatched.\n", num); printf("Test: version %d, level %c\n", version, levelChar[level]); printf("code #%d\n", c); printf("Version mismatch: %d should be %d\n", list->code->version, version); printf("max bits: %d\n", QRspec_getDataLength(version, level) * 8 - 20); printQRinputInfo(il->input); printQRinput(input); exit(1); } list = list->next; il = il->next; c++; } QRinput_free(input); QRinput_Struct_free(s); QRcode_List_free(codes); }