Used to ensure that the AI component has a valid alphanumeric check character pair.
68{
69
70
71
72
73
74
75
76
77
78 static const unsigned int primes[] = {
79 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37,
80 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89,
81 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151,
82 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223,
83 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281,
84 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359,
85 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433,
86 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503,
87 509
88 };
89
90
91
92
93 static const char* const cset32 = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ";
94
95
96
97
98 static const unsigned char cset82_weights[256] = {
99 ['!'] = 1, ['"'] = 2, ['%'] = 3, ['&'] = 4, ['\''] = 5, ['('] = 6,
100 [')'] = 7, ['*'] = 8, ['+'] = 9, [','] = 10, ['-'] = 11, ['.'] = 12,
101 ['/'] = 13, ['0'] = 14, ['1'] = 15, ['2'] = 16, ['3'] = 17, ['4'] = 18,
102 ['5'] = 19, ['6'] = 20, ['7'] = 21, ['8'] = 22, ['9'] = 23, [':'] = 24,
103 [';'] = 25, ['<'] = 26, ['='] = 27, ['>'] = 28, ['?'] = 29, ['A'] = 30,
104 ['B'] = 31, ['C'] = 32, ['D'] = 33, ['E'] = 34, ['F'] = 35, ['G'] = 36,
105 ['H'] = 37, ['I'] = 38, ['J'] = 39, ['K'] = 40, ['L'] = 41, ['M'] = 42,
106 ['N'] = 43, ['O'] = 44, ['P'] = 45, ['Q'] = 46, ['R'] = 47, ['S'] = 48,
107 ['T'] = 49, ['U'] = 50, ['V'] = 51, ['W'] = 52, ['X'] = 53, ['Y'] = 54,
108 ['Z'] = 55, ['_'] = 56, ['a'] = 57, ['b'] = 58, ['c'] = 59, ['d'] = 60,
109 ['e'] = 61, ['f'] = 62, ['g'] = 63, ['h'] = 64, ['i'] = 65, ['j'] = 66,
110 ['k'] = 67, ['l'] = 68, ['m'] = 69, ['n'] = 70, ['o'] = 71, ['p'] = 72,
111 ['q'] = 73, ['r'] = 74, ['s'] = 75, ['t'] = 76, ['u'] = 77, ['v'] = 78,
112 ['w'] = 79, ['x'] = 80, ['y'] = 81, ['z'] = 82
113 };
114
115 size_t pos, len;
116 uint32_t sum = 0;
117
118 assert(data);
119
120
121
122
123
124 for (len = 0; data[len] != '\0'; len++) {
128 0,
129 len + 1
130 );
131 }
132
133
134
135
136
140 0,
141 len
142 );
143
144
145
146
147
148 if (len == 2) {
152 len - 2,
153 2
154 );
156 }
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173 for (pos = 0; pos < len - 2; pos++) {
177 pos,
178 1
179 );
180 sum += (unsigned int)(cset82_weights[(unsigned char)data[pos]] - 1) * primes[len - 3 - pos];
181 }
182 sum %= 1021;
183
184 if (
GS1_LINTER_UNLIKELY(data[len-2] != cset32[sum >> 5] || data[len-1] != cset32[sum & 31]))
187 len - 2,
188 2
189 );
190
192
193}
#define GS1_LINTER_UNLIKELY(x)
Implemention may provide hint to the compiler that the expression is likely to be false.
Definition gs1syntaxdictionary-utils.h:76
#define GS1_LINTER_RETURN_ERROR(error, position, length)
Return from a linter indicating that a problem was detected with the given data.
Definition gs1syntaxdictionary-utils.h:103
#define GS1_LINTER_RETURN_OK
Return from a linter indicating that no problem was detected with the given data.
Definition gs1syntaxdictionary-utils.h:88
@ GS1_LINTER_TOO_LONG_FOR_CHECK_PAIR_IMPLEMENTATION
The component is too long to perform an alphanumeric check character pair calculation.
Definition gs1syntaxdictionary.h:86
@ GS1_LINTER_INCORRECT_CHECK_PAIR
The alphanumeric check-character pair are incorrect.
Definition gs1syntaxdictionary.h:84
@ GS1_LINTER_INVALID_CSET82_CHARACTER
A non-CSET 82 character was found where a CSET 82 character is expected.
Definition gs1syntaxdictionary.h:79
@ GS1_LINTER_TOO_SHORT_FOR_CHECK_PAIR
The component is too short to perform an alphanumeric check character pair calculation.
Definition gs1syntaxdictionary.h:85