Improved GS1 validation

This commit is contained in:
hooper114 2009-01-09 08:34:06 +00:00
parent d2d4e30e32
commit 38b8de26e4

View File

@ -26,36 +26,70 @@
int gs1_verify(struct zint_symbol *symbol, unsigned char source[], char reduced[]) int gs1_verify(struct zint_symbol *symbol, unsigned char source[], char reduced[])
{ {
int i, j, last_ai, ai_latch; int i, j, last_ai, ai_latch;
char ai_string[4]; char ai_string[6];
int bracket_level, max_bracket_level, ai_length, max_ai_length, min_ai_length;
/* Detect extended ASCII characters */ /* Detect extended ASCII characters */
for(i = 0; i < sourcelen; i++) { for(i = 0; i < ustrlen(source); i++) {
if(source[i] >=128) { if(source[i] >=128) {
strcpy(symbol->errtxt, "Extended ASCII characters are not supported by GS1"); strcpy(symbol->errtxt, "Extended ASCII characters are not supported by GS1");
return ERROR_INVALID_DATA; return ERROR_INVALID_DATA;
} }
} }
/* Start with basic tests */
if(source[0] != '[') { if(source[0] != '[') {
strcpy(symbol->errtxt, "Data does not start with an AI"); strcpy(symbol->errtxt, "Data does not start with an AI");
return ERROR_INVALID_DATA; return ERROR_INVALID_DATA;
} }
for(i = 0; i < ustrlen(source) - 1; i++) { /* Check the position of the brackets */
if((source[i] == '[') && (source[i + 1] == '[')) { bracket_level = 0;
/* Can't have nested brackets - Quit */ max_bracket_level = 0;
strcpy(symbol->errtxt, "Nested AI detected (two or more open brackets)"); ai_length = 0;
return ERROR_INVALID_DATA; max_ai_length = 0;
} min_ai_length = 5;
j = 0;
for(i = 0; i < ustrlen(source); i++) {
ai_length += j;
if(source[i] == '[') { bracket_level++; j = 1; }
if(source[i] == ']') {
bracket_level--;
if(ai_length < min_ai_length) { min_ai_length = ai_length; }
j = 0;
ai_length = 0; }
if(bracket_level > max_bracket_level) { max_bracket_level = bracket_level; }
if(ai_length > max_ai_length) { max_ai_length = ai_length; }
}
min_ai_length--;
if(bracket_level != 0) {
/* Not all brackets are closed */
strcpy(symbol->errtxt, "Malformed AI in input data (brackets don\'t match)");
return ERROR_INVALID_DATA;
} }
for(i = 0; i < ustrlen(source) - 1; i++) { if(max_bracket_level > 1) {
if((source[i] == ']') && (source[i + 1] == ']')) { /* Nested brackets */
/* Can't have nested brackets - Quit */ strcpy(symbol->errtxt, "Found nested brackets in input data");
strcpy(symbol->errtxt, "Nested AI detected (two or more close brackets)"); return ERROR_INVALID_DATA;
return ERROR_INVALID_DATA; }
}
if(max_ai_length > 4) {
/* AI is too long */
strcpy(symbol->errtxt, "Invalid AI in input data (AI too long)");
return ERROR_INVALID_DATA;
}
if(min_ai_length <= 1) {
/* AI is too short */
strcpy(symbol->errtxt, "Invalid AI in input data (AI too short)");
return ERROR_INVALID_DATA;
}
if(ai_latch == 1) {
/* Non-numeric data in AI */
strcpy(symbol->errtxt, "Invalid AI in input data (non-numeric characters in AI)");
return ERROR_INVALID_DATA;
} }
/* Resolve AI data - put resulting string in 'reduced' */ /* Resolve AI data - put resulting string in 'reduced' */