GS1 Barcode Syntax Tests reference
A reference to the AI component "linter" routines referred to by the GS1 Barcode Syntax Dictionary. Copyright (c) 2022-2024 GS1 AISBL.
lint_couponposoffer.c File Reference

Purpose

The couponposoffer linter ensures that the data conforms to the modernised North American positive offer file coupon code standard, as carried in AI (8112).

Remarks
Refer to the document "GS1 AI (8112) Coupon Data Specification" for a description of the positive offer file coupon code data contents.

Functional Description

◆ gs1_lint_couponposoffer()

GS1_SYNTAX_DICTIONARY_API gs1_lint_err_t gs1_lint_couponposoffer ( const char *const  data,
size_t *const  err_pos,
size_t *const  err_len 
)

Used to ensure that an AI component conforms to the modernised North American positive offer file coupon code standard, as carried in AI (8112).

Parameters
[in]dataPointer to the null-terminated data to be linted. Must not be NULL.
[out]err_posTo facilitate error highlighting, the start position of the bad data is written to this pointer, if not NULL.
[out]err_lenThe length of the bad data is written to this pointer, if not NULL.
Returns
GS1_LINTER_OK if okay.
GS1_LINTER_COUPON_MISSING_FORMAT_CODE if the data is missing a Format Code.
GS1_LINTER_COUPON_INVALID_FORMAT_CODE if the data contains an invalid Format Code, neither "0" or "1".
GS1_LINTER_COUPON_MISSING_FUNDER_VLI if the data is missing a Funder ID length indicator.
GS1_LINTER_COUPON_INVALID_FUNDER_LENGTH if the data contains a Funder ID length indicator that is not within the range "0" to "6".
GS1_LINTER_COUPON_TRUNCATED_FUNDER if the data contains a Funder ID is that is shorter than specified by its length indicator.
GS1_LINTER_COUPON_TRUNCATED_OFFER_CODE if the data contains an Offer Code that is shorter than six digits.
GS1_LINTER_COUPON_MISSING_SERIAL_NUMBER_VLI if the data is missing a Serial Number length indicator.
GS1_LINTER_COUPON_TRUNCATED_SERIAL_NUMBER if the data contains a Serial Number that is shorter than specified by its length indicator.
GS1_LINTER_COUPON_EXCESS_DATA if the data contains excess data following the Serial Number.
73{
74
75 size_t pos;
76 int vli;
77 const char *p, *q;
78
79 assert(data);
80
81
82 /*
83 * Data must consist of all digits.
84 *
85 */
86 if ((pos = strspn(data, "0123456789")) != strlen(data))
89 pos,
90 1
91 );
92
93 p = data;
94 q = data + strlen(data);
95
96
97 /*
98 * Validate the Format ID.
99 *
100 * Valid Format IDs are "0" and "1".
101 *
102 */
103 if (p == q)
106 0,
107 (size_t)(q - data)
108 );
109
110 if (*p != '0' && *p != '1')
113 (size_t)(p - data),
114 1
115 );
116
117
118 /*
119 * Validate the Funder VLI is in the range "0" to "6" and that the
120 * following Funder ID has the corresponding length (plus 6).
121 *
122 */
123 if (++p == q)
126 0,
127 (size_t)(q - data)
128 );
129 if (*p > '6')
132 (size_t)(p - data),
133 1
134 );
135 vli = *p - '0' + 6;
136
137 if (q - ++p < vli)
140 (p == q) ? 0 : (size_t)(p - data),
141 (p == q) ? (size_t)(q - data) : (size_t)(q - p)
142 );
143
144 p += vli;
145
146
147 /*
148 * Validate the existence of the six digit Offer Code.
149 *
150 */
151 if (q - p < 6)
154 (p == q) ? 0 : (size_t)(p - data),
155 (p == q) ? (size_t)(q - data) : (size_t)(q - p)
156 );
157
158 p += 6;
159
160
161 /*
162 * Validate that the Serial Number follows its VLI and has the
163 * corresponding length (plus 6).
164 *
165 */
166 if (p == q)
169 0,
170 (size_t)(q - data)
171 );
172 vli = *p - '0' + 6;
173
174 if (q - ++p < vli)
177 (p == q) ? 0 : (size_t)(p - data),
178 (p == q) ? (size_t)(q - data) : (size_t)(q - p)
179 );
180
181 p += vli;
182
183
184 /*
185 * Report any excess data that follows the Serial Number.
186 *
187 */
188 if (p != q)
191 (size_t)(p - data),
192 (size_t)(q - p)
193 );
194
196
197}
#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:77
#define GS1_LINTER_RETURN_OK
Return from a linter indicating that no problem was detected with the given data.
Definition gs1syntaxdictionary-utils.h:62
@ GS1_LINTER_COUPON_MISSING_FORMAT_CODE
The coupon's Format Code is missing.
Definition gs1syntaxdictionary.h:123
@ GS1_LINTER_COUPON_INVALID_FORMAT_CODE
The coupon's Format Code must be "0" or "1".
Definition gs1syntaxdictionary.h:124
@ GS1_LINTER_COUPON_MISSING_SERIAL_NUMBER_VLI
The coupon's Serial Number VLI is missing.
Definition gs1syntaxdictionary.h:129
@ GS1_LINTER_COUPON_TRUNCATED_SERIAL_NUMBER
The coupon's Serial Number is shorter than what is indicated by its VLI.
Definition gs1syntaxdictionary.h:130
@ GS1_LINTER_COUPON_MISSING_FUNDER_VLI
The coupon's Funder VLI is missing.
Definition gs1syntaxdictionary.h:125
@ GS1_LINTER_COUPON_TRUNCATED_OFFER_CODE
The coupon's Offer Code is shorter than the required six digits.
Definition gs1syntaxdictionary.h:128
@ GS1_LINTER_COUPON_EXCESS_DATA
The coupon contains excess data after the recognised optional fields.
Definition gs1syntaxdictionary.h:178
@ GS1_LINTER_COUPON_INVALID_FUNDER_LENGTH
The coupon's Funder VLI must be "0" to "6".
Definition gs1syntaxdictionary.h:126
@ GS1_LINTER_NON_DIGIT_CHARACTER
A non-digit character was found where a digit is expected.
Definition gs1syntaxdictionary.h:78
@ GS1_LINTER_COUPON_TRUNCATED_FUNDER
The coupon's Funder is shorter than what is indicated by its VLI.
Definition gs1syntaxdictionary.h:127