Bugfix: Data doesn't fit in currently selected size symbol

This commit is contained in:
hooper114 2009-05-14 22:23:01 +00:00
parent 76e51fc0ee
commit cd614f42f7

View File

@ -651,7 +651,7 @@ int aztec(struct zint_symbol *symbol, unsigned char source[])
unsigned int data_part[1500], ecc_part[840];
unsigned char desc_data[4], desc_ecc[6];
int err_code, ecc_level, compact, data_length, data_maxsize, codeword_size, adjusted_length;
int remainder, padbits, count, gs1;
int remainder, padbits, count, gs1, adjustment_size;
memset(binary_string,0,20000);
memset(adjusted_string,0,20000);
@ -660,12 +660,12 @@ int aztec(struct zint_symbol *symbol, unsigned char source[])
err_code = aztec_text_process(source, binary_string, gs1);
if(err_code != 0) {
strcpy(symbol->errtxt, "Input too long or too many extended ASCII characters [921]");
strcpy(symbol->errtxt, "Input too long or too many extended ASCII characters");
return err_code;
}
if(!((symbol->option_1 >= -1) && (symbol->option_1 <= 4))) {
strcpy(symbol->errtxt, "Invalid error correction level - using default instead [922]");
strcpy(symbol->errtxt, "Invalid error correction level - using default instead");
err_code = WARN_INVALID_OPTION;
symbol->option_1 = -1;
}
@ -680,6 +680,7 @@ int aztec(struct zint_symbol *symbol, unsigned char source[])
layers = 0; /* Keep compiler happy! */
data_maxsize = 0; /* Keep compiler happy! */
adjustment_size = 0;
if(symbol->option_2 == 0) { /* The size of the symbol can be determined by Zint */
do {
/* Decide what size symbol to use - the smallest that fits the data */
@ -690,14 +691,14 @@ int aztec(struct zint_symbol *symbol, unsigned char source[])
/* For each level of error correction work out the smallest symbol which
the data will fit in */
case 1: for(i = 32; i > 0; i--) {
if(data_length < Aztec10DataSizes[i - 1]) {
if((data_length + adjustment_size) < Aztec10DataSizes[i - 1]) {
layers = i;
compact = 0;
data_maxsize = Aztec10DataSizes[i - 1];
}
}
for(i = 4; i > 0; i--) {
if(data_length < AztecCompact10DataSizes[i - 1]) {
if((data_length + adjustment_size) < AztecCompact10DataSizes[i - 1]) {
layers = i;
compact = 1;
data_maxsize = AztecCompact10DataSizes[i - 1];
@ -705,14 +706,14 @@ int aztec(struct zint_symbol *symbol, unsigned char source[])
}
break;
case 2: for(i = 32; i > 0; i--) {
if(data_length < Aztec23DataSizes[i - 1]) {
if((data_length + adjustment_size) < Aztec23DataSizes[i - 1]) {
layers = i;
compact = 0;
data_maxsize = Aztec23DataSizes[i - 1];
}
}
for(i = 4; i > 0; i--) {
if(data_length < AztecCompact23DataSizes[i - 1]) {
if((data_length + adjustment_size) < AztecCompact23DataSizes[i - 1]) {
layers = i;
compact = 1;
data_maxsize = AztecCompact23DataSizes[i - 1];
@ -720,14 +721,14 @@ int aztec(struct zint_symbol *symbol, unsigned char source[])
}
break;
case 3: for(i = 32; i > 0; i--) {
if(data_length < Aztec36DataSizes[i - 1]) {
if((data_length + adjustment_size) < Aztec36DataSizes[i - 1]) {
layers = i;
compact = 0;
data_maxsize = Aztec36DataSizes[i - 1];
}
}
for(i = 4; i > 0; i--) {
if(data_length < AztecCompact36DataSizes[i - 1]) {
if((data_length + adjustment_size) < AztecCompact36DataSizes[i - 1]) {
layers = i;
compact = 1;
data_maxsize = AztecCompact36DataSizes[i - 1];
@ -735,14 +736,14 @@ int aztec(struct zint_symbol *symbol, unsigned char source[])
}
break;
case 4: for(i = 32; i > 0; i--) {
if(data_length < Aztec50DataSizes[i - 1]) {
if((data_length + adjustment_size) < Aztec50DataSizes[i - 1]) {
layers = i;
compact = 0;
data_maxsize = Aztec50DataSizes[i - 1];
}
}
for(i = 4; i > 0; i--) {
if(data_length < AztecCompact50DataSizes[i - 1]) {
if((data_length + adjustment_size) < AztecCompact50DataSizes[i - 1]) {
layers = i;
compact = 1;
data_maxsize = AztecCompact50DataSizes[i - 1];
@ -750,9 +751,9 @@ int aztec(struct zint_symbol *symbol, unsigned char source[])
}
break;
}
if(layers == 0) { /* Couldn't find a symbol which fits the data */
strcpy(symbol->errtxt, "Input too long (too many bits for selected ECC) [923]");
strcpy(symbol->errtxt, "Input too long (too many bits for selected ECC)");
return ERROR_TOO_LONG;
}
@ -786,6 +787,8 @@ int aztec(struct zint_symbol *symbol, unsigned char source[])
}
adjusted_string[j] = '\0';
adjusted_length = strlen(adjusted_string);
adjustment_size = adjusted_length - data_length;
/* Only important if this loop is repeated */
remainder = adjusted_length % codeword_size;
@ -809,7 +812,6 @@ int aztec(struct zint_symbol *symbol, unsigned char source[])
be encoded in a symbol of the selected size */
} else { /* The size of the symbol has been specified by the user */
if((symbol->option_2 >= 1) && (symbol->option_2 <= 4)) {
compact = 1;
layers = symbol->option_2;
@ -819,7 +821,7 @@ int aztec(struct zint_symbol *symbol, unsigned char source[])
layers = symbol->option_2 - 4;
}
if((symbol->option_2 < 0) || (symbol->option_2 > 36)) {
strcpy(symbol->errtxt, "Invalid Aztec Code size [924]");
strcpy(symbol->errtxt, "Invalid Aztec Code size");
return ERROR_INVALID_OPTION;
}
@ -863,7 +865,7 @@ int aztec(struct zint_symbol *symbol, unsigned char source[])
concat(adjusted_string, "1");
}
adjusted_length = strlen(adjusted_string);
count = 0;
for(i = (adjusted_length - codeword_size); i < adjusted_length; i++) {
if(adjusted_string[i] == '1') { count++; }
@ -878,7 +880,7 @@ int aztec(struct zint_symbol *symbol, unsigned char source[])
}
if(adjusted_length > data_maxsize) {
strcpy(symbol->errtxt, "Data too long for specified Aztec Code symbol size [925]");
strcpy(symbol->errtxt, "Data too long for specified Aztec Code symbol size");
return ERROR_TOO_LONG;
}
}
@ -890,7 +892,6 @@ int aztec(struct zint_symbol *symbol, unsigned char source[])
} else {
ecc_blocks = AztecSizes[layers - 1] - data_blocks;
}
/* Copy across data into separate integers */
memset(data_part,0,1500*sizeof(int));
memset(ecc_part,0,840*sizeof(int));
@ -1102,6 +1103,7 @@ int aztec(struct zint_symbol *symbol, unsigned char source[])
/* Plot all of the data into the symbol in pre-defined spiral pattern */
if(compact) {
for(y = AztecCompactOffset[layers - 1]; y < (27 - AztecCompactOffset[layers - 1]); y++) {
for(x = AztecCompactOffset[layers - 1]; x < (27 - AztecCompactOffset[layers - 1]); x++) {
if(CompactAztecMap[(y * 27) + x] == 1) {
@ -1118,6 +1120,7 @@ int aztec(struct zint_symbol *symbol, unsigned char source[])
symbol->rows = 27 - (2 * AztecCompactOffset[layers - 1]);
symbol->width = 27 - (2 * AztecCompactOffset[layers - 1]);
} else {
for(y = AztecOffset[layers - 1]; y < (151 - AztecOffset[layers - 1]); y++) {
for(x = AztecOffset[layers - 1]; x < (151 - AztecOffset[layers - 1]); x++) {
if(AztecMap[(y * 151) + x] == 1) {