diff options
Diffstat (limited to 'genqrcode/tests/datachunk.c')
| -rw-r--r-- | genqrcode/tests/datachunk.c | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/genqrcode/tests/datachunk.c b/genqrcode/tests/datachunk.c new file mode 100644 index 0000000000..62bb2f964c --- /dev/null +++ b/genqrcode/tests/datachunk.c @@ -0,0 +1,178 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <iconv.h> +#include "datachunk.h" + +DataChunk *DataChunk_new(QRencodeMode mode) +{ + DataChunk *chunk; + + chunk = (DataChunk *)calloc(1, sizeof(DataChunk)); + if(chunk == NULL) return NULL; + + chunk->mode = mode; + + return chunk; +} + +void DataChunk_free(DataChunk *chunk) +{ + if(chunk) { + if(chunk->data) free(chunk->data); + free(chunk); + } +} + +void DataChunk_freeList(DataChunk *list) +{ + DataChunk *next; + + while(list != NULL) { + next = list->next; + DataChunk_free(list); + list = next; + } +} + +static void dumpNum(DataChunk *chunk) +{ + printf("%s\n", chunk->data); +} + +static void dumpAn(DataChunk *chunk) +{ + printf("%s\n", chunk->data); +} + +static void dump8(DataChunk *chunk) +{ + size_t i, j; + unsigned char c; + size_t count = 0; + unsigned char buf[16]; + + for(i=0; i<chunk->size; i++) { + buf[count] = chunk->data[i]; + c = chunk->data[i]; + if(c >= ' ' && c <= '~') { + putchar(c); + } else { + putchar('.'); + } + count++; + + if(count >= 16) { + putchar(' '); + for(j=0; j<16; j++) { + printf(" %02x", buf[j]); + } + count = 0; + putchar('\n'); + } + } + if(count > 0) { + for(i=0; i<16 - count; i++) { + putchar(' '); + } + putchar(' '); + for(j=0; j<count; j++) { + printf(" %02x", buf[j]); + } + count = 0; + putchar('\n'); + } +} + +static void dumpKanji(DataChunk *chunk) +{ + iconv_t conv; + char *inbuf, *outbuf, *outp; + size_t inbytes, outbytes, ret; + + conv = iconv_open("UTF-8", "SHIFT_JIS"); + inbytes = chunk->size; + inbuf = (char *)chunk->data; + outbytes = inbytes * 4 + 1; + outbuf = (char *)malloc(inbytes * 4 + 1); + outp = outbuf; + ret = iconv(conv, &inbuf, &inbytes, &outp, &outbytes); + if(ret == (size_t) -1) { perror(NULL); } + *outp = '\0'; + + printf("%s\n", outbuf); + + iconv_close(conv); + free(outbuf); +} + +static void dumpChunk(DataChunk *chunk) +{ + switch(chunk->mode) { + case QR_MODE_NUM: + printf("Numeric: %zu bytes\n", chunk->size); + dumpNum(chunk); + break; + case QR_MODE_AN: + printf("AlphaNumeric: %zu bytes\n", chunk->size); + dumpAn(chunk); + break; + case QR_MODE_8: + printf("8-bit data: %zu bytes\n", chunk->size); + dump8(chunk); + break; + case QR_MODE_KANJI: + printf("Kanji: %zu bytes\n", chunk->size); + dumpKanji(chunk); + break; + case QR_MODE_NUL: + case QR_MODE_STRUCTURE: + case QR_MODE_ECI: + case QR_MODE_FNC1FIRST: + case QR_MODE_FNC1SECOND: + printf("Invalid or reserved: %zu bytes\n", chunk->size); + dump8(chunk); + break; + } +} + +void DataChunk_dumpChunkList(DataChunk *list) +{ + while(list != NULL) { + dumpChunk(list); + list = list->next; + } +} + +int DataChunk_totalSize(DataChunk *list) +{ + int size = 0; + + while(list != NULL) { + size += list->size; + list = list->next; + } + + return size; +} + +unsigned char *DataChunk_concatChunkList(DataChunk *list, int *retsize) +{ + int size, idx; + unsigned char *data; + + size = DataChunk_totalSize(list); + if(size <= 0) return NULL; + + data = (unsigned char *)malloc((size_t)size + 1); + idx = 0; + while(list != NULL) { + memcpy(&data[idx], list->data, list->size); + idx += list->size; + list = list->next; + } + data[size] = '\0'; + + *retsize = size; + return data; +} |
