void test_verpat(void) { int version; unsigned int pattern; int err = 0; unsigned int data; unsigned int code; int i, c; unsigned int mask; for(version=7; version <= QRSPEC_VERSION_MAX; version++) { pattern = QRspec_getVersionPattern(version); if((pattern >> 12) != (unsigned int)version) { printf("Error in version %d.\n", version); err++; continue; } mask = 0x40; for(i=0; mask != 0; i++) { if(version & mask) break; mask = mask >> 1; } c = 6 - i; data = version << 12; code = 0x1f25 << c; mask = 0x40000 >> (6 - c); for(i=0; i<=c; i++) { if(mask & data) { data ^= code; } code = code >> 1; mask = mask >> 1; } data = (version << 12) | (data & 0xfff); if(data != pattern) { printf("Error in version %d\n", version); err++; } } }
static unsigned char *QRspec_createFrame(int version) { unsigned char *frame, *p, *q; int width; int x, y; unsigned int verinfo, v; width = qrspecCapacity[version].width; frame = (unsigned char *)malloc(width * width); if(frame == NULL) return NULL; memset(frame, 0, width * width); /* Finder pattern */ putFinderPattern(frame, width, 0, 0); putFinderPattern(frame, width, width - 7, 0); putFinderPattern(frame, width, 0, width - 7); /* Separator */ p = frame; q = frame + width * (width - 7); for(y=0; y<7; y++) { p[7] = 0xc0; p[width - 8] = 0xc0; q[7] = 0xc0; p += width; q += width; } memset(frame + width * 7, 0xc0, 8); memset(frame + width * 8 - 8, 0xc0, 8); memset(frame + width * (width - 8), 0xc0, 8); /* Mask format information area */ memset(frame + width * 8, 0x84, 9); memset(frame + width * 9 - 8, 0x84, 8); p = frame + 8; for(y=0; y<8; y++) { *p = 0x84; p += width; } p = frame + width * (width - 7) + 8; for(y=0; y<7; y++) { *p = 0x84; p += width; } /* Timing pattern */ p = frame + width * 6 + 8; q = frame + width * 8 + 6; for(x=1; x<width-15; x++) { *p = 0x90 | (x & 1); *q = 0x90 | (x & 1); p++; q += width; } /* Alignment pattern */ QRspec_putAlignmentPattern(version, frame, width); /* Version information */ if(version >= 7) { verinfo = QRspec_getVersionPattern(version); p = frame + width * (width - 11); v = verinfo; for(x=0; x<6; x++) { for(y=0; y<3; y++) { p[width * y + x] = 0x88 | (v & 1); v = v >> 1; } } p = frame + width - 11; v = verinfo; for(y=0; y<6; y++) { for(x=0; x<3; x++) { p[x] = 0x88 | (v & 1); v = v >> 1; } p += width; } }