Correct mode switching bug and add debug tool

This commit is contained in:
hooper114 2009-07-28 08:17:07 +00:00
parent 0a7b0c80e4
commit ab82dc6cfa

View File

@ -338,6 +338,7 @@ int dm200encode(struct zint_symbol *symbol, unsigned char source[], unsigned cha
int text_buffer[6], text_p; int text_buffer[6], text_p;
int x12_buffer[6], x12_p; int x12_buffer[6], x12_p;
int edifact_buffer[8], edifact_p; int edifact_buffer[8], edifact_p;
int debug = 0;
#ifndef _MSC_VER #ifndef _MSC_VER
char binary[2 * inputlen]; char binary[2 * inputlen];
#else #else
@ -369,7 +370,11 @@ int dm200encode(struct zint_symbol *symbol, unsigned char source[], unsigned cha
if(symbol->input_mode == GS1_MODE) { gs1 = 1; } else { gs1 = 0; } if(symbol->input_mode == GS1_MODE) { gs1 = 1; } else { gs1 = 0; }
if(gs1) { target[tp] = 232; tp++; concat(binary, " "); } /* FNC1 */ if(gs1) {
target[tp] = 232; tp++;
concat(binary, " ");
if(debug) printf("FN1 ");
} /* FNC1 */
while (sp < inputlen) { while (sp < inputlen) {
@ -381,6 +386,7 @@ int dm200encode(struct zint_symbol *symbol, unsigned char source[], unsigned cha
if(istwodigits(source, sp) && ((sp + 1) != inputlen)) { if(istwodigits(source, sp) && ((sp + 1) != inputlen)) {
target[tp] = (10 * ctoi(source[sp])) + ctoi(source[sp + 1]) + 130; target[tp] = (10 * ctoi(source[sp])) + ctoi(source[sp + 1]) + 130;
if(debug) printf("N%d ", target[tp] - 130);
tp++; concat(binary, " "); tp++; concat(binary, " ");
sp += 2; sp += 2;
} else { } else {
@ -388,23 +394,32 @@ int dm200encode(struct zint_symbol *symbol, unsigned char source[], unsigned cha
if(next_mode != DM_ASCII) { if(next_mode != DM_ASCII) {
switch(next_mode) { switch(next_mode) {
case DM_C40: target[tp] = 230; tp++; concat(binary, " "); break; case DM_C40: target[tp] = 230; tp++; concat(binary, " ");
case DM_TEXT: target[tp] = 239; tp++; concat(binary, " "); break; if(debug) printf("C40 "); break;
case DM_X12: target[tp] = 238; tp++; concat(binary, " "); break; case DM_TEXT: target[tp] = 239; tp++; concat(binary, " ");
case DM_EDIFACT: target[tp] = 240; tp++; concat(binary, " "); break; if(debug) printf("TEX "); break;
case DM_BASE256: target[tp] = 231; tp++; concat(binary, " "); break; case DM_X12: target[tp] = 238; tp++; concat(binary, " ");
if(debug) printf("X12 "); break;
case DM_EDIFACT: target[tp] = 240; tp++; concat(binary, " ");
if(debug) printf("EDI "); break;
case DM_BASE256: target[tp] = 231; tp++; concat(binary, " ");
if(debug) printf("BAS "); break;
} }
} else { } else {
if(source[sp] > 127) { if(source[sp] > 127) {
target[tp] = 235; /* FNC4 */ target[tp] = 235; /* FNC4 */
if(debug) printf("FN4 ");
tp++; tp++;
target[tp] = (source[sp] - 128) + 1; target[tp] = (source[sp] - 128) + 1;
if(debug) printf("A%02X ", target[tp] - 1);
tp++; concat(binary, " "); tp++; concat(binary, " ");
} else { } else {
if(gs1 && (source[sp] == '[')) { if(gs1 && (source[sp] == '[')) {
target[tp] = 232; /* FNC1 */ target[tp] = 232; /* FNC1 */
if(debug) printf("FN1 ");
} else { } else {
target[tp] = source[sp] + 1; target[tp] = source[sp] + 1;
if(debug) printf("A%02X ", target[tp] - 1);
} }
tp++; tp++;
concat(binary, " "); concat(binary, " ");
@ -426,6 +441,8 @@ int dm200encode(struct zint_symbol *symbol, unsigned char source[], unsigned cha
if(next_mode != DM_C40) { if(next_mode != DM_C40) {
target[tp] = 254; tp++; concat(binary, " ");/* Unlatch */ target[tp] = 254; tp++; concat(binary, " ");/* Unlatch */
next_mode = DM_ASCII;
if (debug) printf("ASC ");
} else { } else {
if(source[sp] > 127) { if(source[sp] > 127) {
c40_buffer[c40_p] = 1; c40_p++; c40_buffer[c40_p] = 1; c40_p++;
@ -454,6 +471,7 @@ int dm200encode(struct zint_symbol *symbol, unsigned char source[], unsigned cha
target[tp] = iv / 256; tp++; target[tp] = iv / 256; tp++;
target[tp] = iv % 256; tp++; target[tp] = iv % 256; tp++;
concat(binary, " "); concat(binary, " ");
if (debug) printf("[%d %d %d] ", c40_buffer[0], c40_buffer[1], c40_buffer[2]);
c40_buffer[0] = c40_buffer[3]; c40_buffer[0] = c40_buffer[3];
c40_buffer[1] = c40_buffer[4]; c40_buffer[1] = c40_buffer[4];
@ -478,6 +496,8 @@ int dm200encode(struct zint_symbol *symbol, unsigned char source[], unsigned cha
if(next_mode != DM_TEXT) { if(next_mode != DM_TEXT) {
target[tp] = 254; tp++; concat(binary, " ");/* Unlatch */ target[tp] = 254; tp++; concat(binary, " ");/* Unlatch */
next_mode = DM_ASCII;
if (debug) printf("ASC ");
} else { } else {
if(source[sp] > 127) { if(source[sp] > 127) {
text_buffer[text_p] = 1; text_p++; text_buffer[text_p] = 1; text_p++;
@ -506,6 +526,7 @@ int dm200encode(struct zint_symbol *symbol, unsigned char source[], unsigned cha
target[tp] = iv / 256; tp++; target[tp] = iv / 256; tp++;
target[tp] = iv % 256; tp++; target[tp] = iv % 256; tp++;
concat(binary, " "); concat(binary, " ");
if (debug) printf("[%d %d %d] ", text_buffer[0], text_buffer[1], text_buffer[2]);
text_buffer[0] = text_buffer[3]; text_buffer[0] = text_buffer[3];
text_buffer[1] = text_buffer[4]; text_buffer[1] = text_buffer[4];
@ -530,6 +551,8 @@ int dm200encode(struct zint_symbol *symbol, unsigned char source[], unsigned cha
if(next_mode != DM_X12) { if(next_mode != DM_X12) {
target[tp] = 254; tp++; concat(binary, " ");/* Unlatch */ target[tp] = 254; tp++; concat(binary, " ");/* Unlatch */
next_mode = DM_ASCII;
if (debug) printf("ASC ");
} else { } else {
if(source[sp] == 13) { value = 0; } if(source[sp] == 13) { value = 0; }
if(source[sp] == '*') { value = 1; } if(source[sp] == '*') { value = 1; }
@ -547,6 +570,7 @@ int dm200encode(struct zint_symbol *symbol, unsigned char source[], unsigned cha
target[tp] = iv / 256; tp++; target[tp] = iv / 256; tp++;
target[tp] = iv % 256; tp++; target[tp] = iv % 256; tp++;
concat(binary, " "); concat(binary, " ");
if (debug) printf("[%d %d %d] ", x12_buffer[0], x12_buffer[1], x12_buffer[2]);
x12_buffer[0] = x12_buffer[3]; x12_buffer[0] = x12_buffer[3];
x12_buffer[1] = x12_buffer[4]; x12_buffer[1] = x12_buffer[4];
@ -571,6 +595,7 @@ int dm200encode(struct zint_symbol *symbol, unsigned char source[], unsigned cha
if(next_mode != DM_EDIFACT) { if(next_mode != DM_EDIFACT) {
edifact_buffer[edifact_p] = 31; edifact_p++; edifact_buffer[edifact_p] = 31; edifact_p++;
next_mode = DM_ASCII;
} else { } else {
if((source[sp] >= '@') && (source[sp] <= '^')) { value = source[sp] - '@'; } if((source[sp] >= '@') && (source[sp] <= '^')) { value = source[sp] - '@'; }
if((source[sp] >= ' ') && (source[sp] <= '?')) { value = source[sp]; } if((source[sp] >= ' ') && (source[sp] <= '?')) { value = source[sp]; }
@ -584,6 +609,7 @@ int dm200encode(struct zint_symbol *symbol, unsigned char source[], unsigned cha
target[tp] = ((edifact_buffer[1] & 0x0f) << 4) + ((edifact_buffer[2] & 0x3c) >> 2); tp++; target[tp] = ((edifact_buffer[1] & 0x0f) << 4) + ((edifact_buffer[2] & 0x3c) >> 2); tp++;
target[tp] = ((edifact_buffer[2] & 0x03) << 6) + edifact_buffer[3]; tp++; target[tp] = ((edifact_buffer[2] & 0x03) << 6) + edifact_buffer[3]; tp++;
concat(binary, " "); concat(binary, " ");
if (debug) printf("[%d %d %d %d] ", edifact_buffer[0], edifact_buffer[1], edifact_buffer[2], edifact_buffer[3]);
edifact_buffer[0] = edifact_buffer[4]; edifact_buffer[0] = edifact_buffer[4];
edifact_buffer[1] = edifact_buffer[5]; edifact_buffer[1] = edifact_buffer[5];
@ -603,11 +629,13 @@ int dm200encode(struct zint_symbol *symbol, unsigned char source[], unsigned cha
if(next_mode == DM_BASE256) { if(next_mode == DM_BASE256) {
target[tp] = source[sp]; target[tp] = source[sp];
if(debug) printf("B%02X ", target[tp]);
tp++; tp++;
sp++; sp++;
concat(binary, "b"); concat(binary, "b");
} else { } else {
next_mode = DM_ASCII; next_mode = DM_ASCII;
if(debug) printf("ASC ");
} }
} }
@ -623,12 +651,14 @@ int dm200encode(struct zint_symbol *symbol, unsigned char source[], unsigned cha
target[tp] = source[inputlen - 2] + 1; tp++; target[tp] = source[inputlen - 2] + 1; tp++;
target[tp] = source[inputlen - 1] + 1; tp++; target[tp] = source[inputlen - 1] + 1; tp++;
concat(binary, " "); concat(binary, " ");
if(debug) printf("ASC A%02X A%02X ", target[tp - 2] - 1, target[tp - 1] - 1);
current_mode = DM_ASCII; current_mode = DM_ASCII;
} }
if(c40_p == 1) { if(c40_p == 1) {
target[tp] = 254; tp++; /* unlatch */ target[tp] = 254; tp++; /* unlatch */
target[tp] = source[inputlen - 1] + 1; tp++; target[tp] = source[inputlen - 1] + 1; tp++;
concat(binary, " "); concat(binary, " ");
if(debug) printf("ASC A%02X ", target[tp - 1] - 1);
current_mode = DM_ASCII; current_mode = DM_ASCII;
} }
@ -637,12 +667,14 @@ int dm200encode(struct zint_symbol *symbol, unsigned char source[], unsigned cha
target[tp] = source[inputlen - 2] + 1; tp++; target[tp] = source[inputlen - 2] + 1; tp++;
target[tp] = source[inputlen - 1] + 1; tp++; target[tp] = source[inputlen - 1] + 1; tp++;
concat(binary, " "); concat(binary, " ");
if(debug) printf("ASC A%02X A%02X ", target[tp - 2] - 1, target[tp - 1] - 1);
current_mode = DM_ASCII; current_mode = DM_ASCII;
} }
if(text_p == 1) { if(text_p == 1) {
target[tp] = 254; tp++; /* unlatch */ target[tp] = 254; tp++; /* unlatch */
target[tp] = source[inputlen - 1] + 1; tp++; target[tp] = source[inputlen - 1] + 1; tp++;
concat(binary, " "); concat(binary, " ");
if(debug) printf("ASC A%02X ", target[tp - 1] - 1);
current_mode = DM_ASCII; current_mode = DM_ASCII;
} }
@ -651,12 +683,14 @@ int dm200encode(struct zint_symbol *symbol, unsigned char source[], unsigned cha
target[tp] = source[inputlen - 2] + 1; tp++; target[tp] = source[inputlen - 2] + 1; tp++;
target[tp] = source[inputlen - 1] + 1; tp++; target[tp] = source[inputlen - 1] + 1; tp++;
concat(binary, " "); concat(binary, " ");
if(debug) printf("ASC A%02X A%02X ", target[tp - 2] - 1, target[tp - 1] - 1);
current_mode = DM_ASCII; current_mode = DM_ASCII;
} }
if(x12_p == 1) { if(x12_p == 1) {
target[tp] = 254; tp++; /* unlatch */ target[tp] = 254; tp++; /* unlatch */
target[tp] = source[inputlen - 1] + 1; tp++; target[tp] = source[inputlen - 1] + 1; tp++;
concat(binary, " "); concat(binary, " ");
if(debug) printf("ASC A%02X ", target[tp - 1] - 1);
current_mode = DM_ASCII; current_mode = DM_ASCII;
} }
@ -694,12 +728,13 @@ int dm200encode(struct zint_symbol *symbol, unsigned char source[], unsigned cha
} }
} }
/* if(debug) {
for(i = 0; i < tp; i++){ printf("\n\n");
printf("%02X ", target[i]); for(i = 0; i < tp; i++){
printf("%02X ", target[i]);
}
printf("\n");
} }
printf("\n");
*/
*(last_mode) = current_mode; *(last_mode) = current_mode;
return tp; return tp;