aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Schmucker <ts@its1.de>2023-09-02 11:20:10 +0200
committerThomas Schmucker <ts@its1.de>2023-09-02 11:20:10 +0200
commit2ff8751874e7b3c1fc8480215d98cca3c48ea37b (patch)
tree17c0349382d48e7e7250c90c3b00b5771b9760f0
parent25eed0fcaca4c72bfddb71ded3930912c8e672fb (diff)
downloadlibcsv-2ff8751874e7b3c1fc8480215d98cca3c48ea37b.tar.gz
libcsv-2ff8751874e7b3c1fc8480215d98cca3c48ea37b.tar.bz2
libcsv-2ff8751874e7b3c1fc8480215d98cca3c48ea37b.zip
linter fehler/warnungen behoben und bessere Benamung verschiedener Variablen
-rw-r--r--csv-test.c204
-rw-r--r--csv.c27
2 files changed, 109 insertions, 122 deletions
diff --git a/csv-test.c b/csv-test.c
index ab996b4..854df7f 100644
--- a/csv-test.c
+++ b/csv-test.c
@@ -12,8 +12,8 @@
12 f = fmemopen(data, sizeof(data) - 1, "r"); \ 12 f = fmemopen(data, sizeof(data) - 1, "r"); \
13 assert(f != NULL) 13 assert(f != NULL)
14 14
15#define FMEMCLOSE(f) \ 15#define FMEMCLOSE(f) \
16 fclose(f); \ 16 (void) fclose(f); \
17 f = NULL 17 f = NULL
18 18
19#define UNUSED(x) (void) (sizeof((x), 0)) 19#define UNUSED(x) (void) (sizeof((x), 0))
@@ -36,64 +36,64 @@ test_empty_object(void)
36void 36void
37test_line_endings1(void) 37test_line_endings1(void)
38{ 38{
39 FILE *f; 39 FILE *file = NULL;
40 csv_t csv = { 0 }; 40 csv_t csv = { 0 };
41 41
42 char data[] = "A,B,C\r\n" 42 char data[] = "A,B,C\r\n"
43 "D,E,F\n"; 43 "D,E,F\n";
44 44
45 FMEMOPEN(f, data); 45 FMEMOPEN(file, data);
46 46
47 assert(csv_read(&csv, f) == 3); 47 assert(csv_read(&csv, file) == 3);
48 assert(csv_nfields(&csv) == 3); 48 assert(csv_nfields(&csv) == 3);
49 assert(strcmp(csv_field(&csv, 0), "A") == 0); 49 assert(strcmp(csv_field(&csv, 0), "A") == 0);
50 assert(strcmp(csv_field(&csv, 1), "B") == 0); 50 assert(strcmp(csv_field(&csv, 1), "B") == 0);
51 assert(strcmp(csv_field(&csv, 2), "C") == 0); 51 assert(strcmp(csv_field(&csv, 2), "C") == 0);
52 52
53 assert(csv_read(&csv, f) == 3); 53 assert(csv_read(&csv, file) == 3);
54 assert(csv_nfields(&csv) == 3); 54 assert(csv_nfields(&csv) == 3);
55 assert(strcmp(csv_field(&csv, 0), "D") == 0); 55 assert(strcmp(csv_field(&csv, 0), "D") == 0);
56 assert(strcmp(csv_field(&csv, 1), "E") == 0); 56 assert(strcmp(csv_field(&csv, 1), "E") == 0);
57 assert(strcmp(csv_field(&csv, 2), "F") == 0); 57 assert(strcmp(csv_field(&csv, 2), "F") == 0);
58 58
59 assert(csv_read(&csv, f) == 0); 59 assert(csv_read(&csv, file) == 0);
60 60
61 FMEMCLOSE(f); 61 FMEMCLOSE(file);
62} 62}
63 63
64void 64void
65test_line_endings2(void) 65test_line_endings2(void)
66{ 66{
67 FILE *f; 67 FILE *file = NULL;
68 csv_t csv = { 0 }; 68 csv_t csv = { 0 };
69 69
70 char data[] = "A,B,C\r\n" 70 char data[] = "A,B,C\r\n"
71 "D,E,F"; 71 "D,E,F";
72 72
73 FMEMOPEN(f, data); 73 FMEMOPEN(file, data);
74 74
75 assert(csv_read(&csv, f) == 3); 75 assert(csv_read(&csv, file) == 3);
76 assert(csv_nfields(&csv) == 3); 76 assert(csv_nfields(&csv) == 3);
77 assert(strcmp(csv_field(&csv, 0), "A") == 0); 77 assert(strcmp(csv_field(&csv, 0), "A") == 0);
78 assert(strcmp(csv_field(&csv, 1), "B") == 0); 78 assert(strcmp(csv_field(&csv, 1), "B") == 0);
79 assert(strcmp(csv_field(&csv, 2), "C") == 0); 79 assert(strcmp(csv_field(&csv, 2), "C") == 0);
80 80
81 assert(csv_read(&csv, f) == 3); 81 assert(csv_read(&csv, file) == 3);
82 assert(csv_nfields(&csv) == 3); 82 assert(csv_nfields(&csv) == 3);
83 assert(strcmp(csv_field(&csv, 0), "D") == 0); 83 assert(strcmp(csv_field(&csv, 0), "D") == 0);
84 assert(strcmp(csv_field(&csv, 1), "E") == 0); 84 assert(strcmp(csv_field(&csv, 1), "E") == 0);
85 assert(strcmp(csv_field(&csv, 2), "F") == 0); 85 assert(strcmp(csv_field(&csv, 2), "F") == 0);
86 86
87 assert(csv_read(&csv, f) == 0); 87 assert(csv_read(&csv, file) == 0);
88 88
89 FMEMCLOSE(f); 89 FMEMCLOSE(file);
90} 90}
91 91
92void 92void
93test_empty_fields(void) 93test_empty_fields(void)
94{ 94{
95 FILE *f; 95 FILE *file = NULL;
96 csv_t csv = { 0 }; 96 csv_t csv = { 0 };
97 97
98 char data[] = "\n" 98 char data[] = "\n"
99 "\r" 99 "\r"
@@ -115,134 +115,134 @@ test_empty_fields(void)
115 "\"\",\"\",\r\n" 115 "\"\",\"\",\r\n"
116 ",,"; 116 ",,";
117 117
118 FMEMOPEN(f, data); 118 FMEMOPEN(file, data);
119 119
120 // Line 1 120 // Line 1
121 assert(csv_read(&csv, f) == 1); 121 assert(csv_read(&csv, file) == 1);
122 assert(csv_nfields(&csv) == 1); 122 assert(csv_nfields(&csv) == 1);
123 assert(strcmp(csv_field(&csv, 0), "") == 0); 123 assert(strcmp(csv_field(&csv, 0), "") == 0);
124 124
125 // Line 2 125 // Line 2
126 assert(csv_read(&csv, f) == 1); 126 assert(csv_read(&csv, file) == 1);
127 assert(csv_nfields(&csv) == 1); 127 assert(csv_nfields(&csv) == 1);
128 assert(strcmp(csv_field(&csv, 0), "") == 0); 128 assert(strcmp(csv_field(&csv, 0), "") == 0);
129 129
130 // Line 3 130 // Line 3
131 assert(csv_read(&csv, f) == 1); 131 assert(csv_read(&csv, file) == 1);
132 assert(csv_nfields(&csv) == 1); 132 assert(csv_nfields(&csv) == 1);
133 assert(strcmp(csv_field(&csv, 0), "") == 0); 133 assert(strcmp(csv_field(&csv, 0), "") == 0);
134 134
135 // Line 4 135 // Line 4
136 assert(csv_read(&csv, f) == 1); 136 assert(csv_read(&csv, file) == 1);
137 assert(csv_nfields(&csv) == 1); 137 assert(csv_nfields(&csv) == 1);
138 assert(strcmp(csv_field(&csv, 0), "") == 0); 138 assert(strcmp(csv_field(&csv, 0), "") == 0);
139 139
140 // Line 5 140 // Line 5
141 assert(csv_read(&csv, f) == 1); 141 assert(csv_read(&csv, file) == 1);
142 assert(csv_nfields(&csv) == 1); 142 assert(csv_nfields(&csv) == 1);
143 assert(strcmp(csv_field(&csv, 0), "") == 0); 143 assert(strcmp(csv_field(&csv, 0), "") == 0);
144 144
145 // Line 6 145 // Line 6
146 assert(csv_read(&csv, f) == 1); 146 assert(csv_read(&csv, file) == 1);
147 assert(csv_nfields(&csv) == 1); 147 assert(csv_nfields(&csv) == 1);
148 assert(strcmp(csv_field(&csv, 0), "") == 0); 148 assert(strcmp(csv_field(&csv, 0), "") == 0);
149 149
150 // Line 7 150 // Line 7
151 assert(csv_read(&csv, f) == 2); 151 assert(csv_read(&csv, file) == 2);
152 assert(csv_nfields(&csv) == 2); 152 assert(csv_nfields(&csv) == 2);
153 assert(strcmp(csv_field(&csv, 0), "") == 0); 153 assert(strcmp(csv_field(&csv, 0), "") == 0);
154 assert(strcmp(csv_field(&csv, 1), "") == 0); 154 assert(strcmp(csv_field(&csv, 1), "") == 0);
155 155
156 // Line 8 156 // Line 8
157 assert(csv_read(&csv, f) == 2); 157 assert(csv_read(&csv, file) == 2);
158 assert(csv_nfields(&csv) == 2); 158 assert(csv_nfields(&csv) == 2);
159 assert(strcmp(csv_field(&csv, 0), "") == 0); 159 assert(strcmp(csv_field(&csv, 0), "") == 0);
160 assert(strcmp(csv_field(&csv, 1), "") == 0); 160 assert(strcmp(csv_field(&csv, 1), "") == 0);
161 161
162 // Line 9 162 // Line 9
163 assert(csv_read(&csv, f) == 2); 163 assert(csv_read(&csv, file) == 2);
164 assert(csv_nfields(&csv) == 2); 164 assert(csv_nfields(&csv) == 2);
165 assert(strcmp(csv_field(&csv, 0), "") == 0); 165 assert(strcmp(csv_field(&csv, 0), "") == 0);
166 assert(strcmp(csv_field(&csv, 1), "") == 0); 166 assert(strcmp(csv_field(&csv, 1), "") == 0);
167 167
168 // Line 10 168 // Line 10
169 assert(csv_read(&csv, f) == 2); 169 assert(csv_read(&csv, file) == 2);
170 assert(csv_nfields(&csv) == 2); 170 assert(csv_nfields(&csv) == 2);
171 assert(strcmp(csv_field(&csv, 0), "") == 0); 171 assert(strcmp(csv_field(&csv, 0), "") == 0);
172 assert(strcmp(csv_field(&csv, 1), "") == 0); 172 assert(strcmp(csv_field(&csv, 1), "") == 0);
173 173
174 // Line 11 174 // Line 11
175 assert(csv_read(&csv, f) == 2); 175 assert(csv_read(&csv, file) == 2);
176 assert(csv_nfields(&csv) == 2); 176 assert(csv_nfields(&csv) == 2);
177 assert(strcmp(csv_field(&csv, 0), "") == 0); 177 assert(strcmp(csv_field(&csv, 0), "") == 0);
178 assert(strcmp(csv_field(&csv, 1), "") == 0); 178 assert(strcmp(csv_field(&csv, 1), "") == 0);
179 179
180 // Line 12 180 // Line 12
181 assert(csv_read(&csv, f) == 2); 181 assert(csv_read(&csv, file) == 2);
182 assert(csv_nfields(&csv) == 2); 182 assert(csv_nfields(&csv) == 2);
183 assert(strcmp(csv_field(&csv, 0), "") == 0); 183 assert(strcmp(csv_field(&csv, 0), "") == 0);
184 assert(strcmp(csv_field(&csv, 1), "") == 0); 184 assert(strcmp(csv_field(&csv, 1), "") == 0);
185 185
186 // Line 13 186 // Line 13
187 assert(csv_read(&csv, f) == 3); 187 assert(csv_read(&csv, file) == 3);
188 assert(csv_nfields(&csv) == 3); 188 assert(csv_nfields(&csv) == 3);
189 assert(strcmp(csv_field(&csv, 0), "") == 0); 189 assert(strcmp(csv_field(&csv, 0), "") == 0);
190 assert(strcmp(csv_field(&csv, 1), "") == 0); 190 assert(strcmp(csv_field(&csv, 1), "") == 0);
191 assert(strcmp(csv_field(&csv, 2), "") == 0); 191 assert(strcmp(csv_field(&csv, 2), "") == 0);
192 192
193 // Line 14 193 // Line 14
194 assert(csv_read(&csv, f) == 3); 194 assert(csv_read(&csv, file) == 3);
195 assert(csv_nfields(&csv) == 3); 195 assert(csv_nfields(&csv) == 3);
196 assert(strcmp(csv_field(&csv, 0), "") == 0); 196 assert(strcmp(csv_field(&csv, 0), "") == 0);
197 assert(strcmp(csv_field(&csv, 1), "") == 0); 197 assert(strcmp(csv_field(&csv, 1), "") == 0);
198 assert(strcmp(csv_field(&csv, 2), "") == 0); 198 assert(strcmp(csv_field(&csv, 2), "") == 0);
199 199
200 // Line 15 200 // Line 15
201 assert(csv_read(&csv, f) == 3); 201 assert(csv_read(&csv, file) == 3);
202 assert(csv_nfields(&csv) == 3); 202 assert(csv_nfields(&csv) == 3);
203 assert(strcmp(csv_field(&csv, 0), "") == 0); 203 assert(strcmp(csv_field(&csv, 0), "") == 0);
204 assert(strcmp(csv_field(&csv, 1), "") == 0); 204 assert(strcmp(csv_field(&csv, 1), "") == 0);
205 assert(strcmp(csv_field(&csv, 2), "") == 0); 205 assert(strcmp(csv_field(&csv, 2), "") == 0);
206 206
207 // Line 16 207 // Line 16
208 assert(csv_read(&csv, f) == 3); 208 assert(csv_read(&csv, file) == 3);
209 assert(csv_nfields(&csv) == 3); 209 assert(csv_nfields(&csv) == 3);
210 assert(strcmp(csv_field(&csv, 0), "") == 0); 210 assert(strcmp(csv_field(&csv, 0), "") == 0);
211 assert(strcmp(csv_field(&csv, 1), "") == 0); 211 assert(strcmp(csv_field(&csv, 1), "") == 0);
212 assert(strcmp(csv_field(&csv, 2), "") == 0); 212 assert(strcmp(csv_field(&csv, 2), "") == 0);
213 213
214 // Line 17 214 // Line 17
215 assert(csv_read(&csv, f) == 3); 215 assert(csv_read(&csv, file) == 3);
216 assert(csv_nfields(&csv) == 3); 216 assert(csv_nfields(&csv) == 3);
217 assert(strcmp(csv_field(&csv, 0), "") == 0); 217 assert(strcmp(csv_field(&csv, 0), "") == 0);
218 assert(strcmp(csv_field(&csv, 1), "") == 0); 218 assert(strcmp(csv_field(&csv, 1), "") == 0);
219 assert(strcmp(csv_field(&csv, 2), "") == 0); 219 assert(strcmp(csv_field(&csv, 2), "") == 0);
220 220
221 // Line 18 221 // Line 18
222 assert(csv_read(&csv, f) == 3); 222 assert(csv_read(&csv, file) == 3);
223 assert(csv_nfields(&csv) == 3); 223 assert(csv_nfields(&csv) == 3);
224 assert(strcmp(csv_field(&csv, 0), "") == 0); 224 assert(strcmp(csv_field(&csv, 0), "") == 0);
225 assert(strcmp(csv_field(&csv, 1), "") == 0); 225 assert(strcmp(csv_field(&csv, 1), "") == 0);
226 assert(strcmp(csv_field(&csv, 2), "") == 0); 226 assert(strcmp(csv_field(&csv, 2), "") == 0);
227 227
228 // Line 19 228 // Line 19
229 assert(csv_read(&csv, f) == 3); 229 assert(csv_read(&csv, file) == 3);
230 assert(csv_nfields(&csv) == 3); 230 assert(csv_nfields(&csv) == 3);
231 assert(strcmp(csv_field(&csv, 0), "") == 0); 231 assert(strcmp(csv_field(&csv, 0), "") == 0);
232 assert(strcmp(csv_field(&csv, 1), "") == 0); 232 assert(strcmp(csv_field(&csv, 1), "") == 0);
233 assert(strcmp(csv_field(&csv, 2), "") == 0); 233 assert(strcmp(csv_field(&csv, 2), "") == 0);
234 234
235 // EOF 235 // EOF
236 assert(csv_read(&csv, f) == 0); 236 assert(csv_read(&csv, file) == 0);
237 237
238 FMEMCLOSE(f); 238 FMEMCLOSE(file);
239} 239}
240 240
241void 241void
242test_simple_fields(void) 242test_simple_fields(void)
243{ 243{
244 FILE *f; 244 FILE *file = NULL;
245 csv_t csv = { 0 }; 245 csv_t csv = { 0 };
246 246
247 char data[] = "A\n" 247 char data[] = "A\n"
248 "A\r" 248 "A\r"
@@ -264,140 +264,140 @@ test_simple_fields(void)
264 "\"A\",\"B\",C\r\n" 264 "\"A\",\"B\",C\r\n"
265 "A,B,C"; 265 "A,B,C";
266 266
267 FMEMOPEN(f, data); 267 FMEMOPEN(file, data);
268 268
269 // Line 1 269 // Line 1
270 assert(csv_read(&csv, f) == 1); 270 assert(csv_read(&csv, file) == 1);
271 assert(csv_nfields(&csv) == 1); 271 assert(csv_nfields(&csv) == 1);
272 assert(strcmp(csv_field(&csv, 0), "A") == 0); 272 assert(strcmp(csv_field(&csv, 0), "A") == 0);
273 273
274 // Line 2 274 // Line 2
275 assert(csv_read(&csv, f) == 1); 275 assert(csv_read(&csv, file) == 1);
276 assert(csv_nfields(&csv) == 1); 276 assert(csv_nfields(&csv) == 1);
277 assert(strcmp(csv_field(&csv, 0), "A") == 0); 277 assert(strcmp(csv_field(&csv, 0), "A") == 0);
278 278
279 // Line 3 279 // Line 3
280 assert(csv_read(&csv, f) == 1); 280 assert(csv_read(&csv, file) == 1);
281 assert(csv_nfields(&csv) == 1); 281 assert(csv_nfields(&csv) == 1);
282 assert(strcmp(csv_field(&csv, 0), "A") == 0); 282 assert(strcmp(csv_field(&csv, 0), "A") == 0);
283 283
284 // Line 4 284 // Line 4
285 assert(csv_read(&csv, f) == 1); 285 assert(csv_read(&csv, file) == 1);
286 assert(csv_nfields(&csv) == 1); 286 assert(csv_nfields(&csv) == 1);
287 assert(strcmp(csv_field(&csv, 0), "A") == 0); 287 assert(strcmp(csv_field(&csv, 0), "A") == 0);
288 288
289 // Line 5 289 // Line 5
290 assert(csv_read(&csv, f) == 1); 290 assert(csv_read(&csv, file) == 1);
291 assert(csv_nfields(&csv) == 1); 291 assert(csv_nfields(&csv) == 1);
292 assert(strcmp(csv_field(&csv, 0), "A") == 0); 292 assert(strcmp(csv_field(&csv, 0), "A") == 0);
293 293
294 // Line 6 294 // Line 6
295 assert(csv_read(&csv, f) == 1); 295 assert(csv_read(&csv, file) == 1);
296 assert(csv_nfields(&csv) == 1); 296 assert(csv_nfields(&csv) == 1);
297 assert(strcmp(csv_field(&csv, 0), "A") == 0); 297 assert(strcmp(csv_field(&csv, 0), "A") == 0);
298 298
299 // Line 7 299 // Line 7
300 assert(csv_read(&csv, f) == 2); 300 assert(csv_read(&csv, file) == 2);
301 assert(csv_nfields(&csv) == 2); 301 assert(csv_nfields(&csv) == 2);
302 assert(strcmp(csv_field(&csv, 0), "A") == 0); 302 assert(strcmp(csv_field(&csv, 0), "A") == 0);
303 assert(strcmp(csv_field(&csv, 1), "B") == 0); 303 assert(strcmp(csv_field(&csv, 1), "B") == 0);
304 304
305 // Line 8 305 // Line 8
306 assert(csv_read(&csv, f) == 2); 306 assert(csv_read(&csv, file) == 2);
307 assert(csv_nfields(&csv) == 2); 307 assert(csv_nfields(&csv) == 2);
308 assert(strcmp(csv_field(&csv, 0), "A") == 0); 308 assert(strcmp(csv_field(&csv, 0), "A") == 0);
309 assert(strcmp(csv_field(&csv, 1), "B") == 0); 309 assert(strcmp(csv_field(&csv, 1), "B") == 0);
310 310
311 // Line 9 311 // Line 9
312 assert(csv_read(&csv, f) == 2); 312 assert(csv_read(&csv, file) == 2);
313 assert(csv_nfields(&csv) == 2); 313 assert(csv_nfields(&csv) == 2);
314 assert(strcmp(csv_field(&csv, 0), "A") == 0); 314 assert(strcmp(csv_field(&csv, 0), "A") == 0);
315 assert(strcmp(csv_field(&csv, 1), "B") == 0); 315 assert(strcmp(csv_field(&csv, 1), "B") == 0);
316 316
317 // Line 10 317 // Line 10
318 assert(csv_read(&csv, f) == 2); 318 assert(csv_read(&csv, file) == 2);
319 assert(csv_nfields(&csv) == 2); 319 assert(csv_nfields(&csv) == 2);
320 assert(strcmp(csv_field(&csv, 0), "A") == 0); 320 assert(strcmp(csv_field(&csv, 0), "A") == 0);
321 assert(strcmp(csv_field(&csv, 1), "B") == 0); 321 assert(strcmp(csv_field(&csv, 1), "B") == 0);
322 322
323 // Line 11 323 // Line 11
324 assert(csv_read(&csv, f) == 2); 324 assert(csv_read(&csv, file) == 2);
325 assert(csv_nfields(&csv) == 2); 325 assert(csv_nfields(&csv) == 2);
326 assert(strcmp(csv_field(&csv, 0), "A") == 0); 326 assert(strcmp(csv_field(&csv, 0), "A") == 0);
327 assert(strcmp(csv_field(&csv, 1), "B") == 0); 327 assert(strcmp(csv_field(&csv, 1), "B") == 0);
328 328
329 // Line 12 329 // Line 12
330 assert(csv_read(&csv, f) == 2); 330 assert(csv_read(&csv, file) == 2);
331 assert(csv_nfields(&csv) == 2); 331 assert(csv_nfields(&csv) == 2);
332 assert(strcmp(csv_field(&csv, 0), "A") == 0); 332 assert(strcmp(csv_field(&csv, 0), "A") == 0);
333 assert(strcmp(csv_field(&csv, 1), "B") == 0); 333 assert(strcmp(csv_field(&csv, 1), "B") == 0);
334 334
335 // Line 13 335 // Line 13
336 assert(csv_read(&csv, f) == 3); 336 assert(csv_read(&csv, file) == 3);
337 assert(csv_nfields(&csv) == 3); 337 assert(csv_nfields(&csv) == 3);
338 assert(strcmp(csv_field(&csv, 0), "A") == 0); 338 assert(strcmp(csv_field(&csv, 0), "A") == 0);
339 assert(strcmp(csv_field(&csv, 1), "B") == 0); 339 assert(strcmp(csv_field(&csv, 1), "B") == 0);
340 assert(strcmp(csv_field(&csv, 2), "C") == 0); 340 assert(strcmp(csv_field(&csv, 2), "C") == 0);
341 341
342 // Line 14 342 // Line 14
343 assert(csv_read(&csv, f) == 3); 343 assert(csv_read(&csv, file) == 3);
344 assert(csv_nfields(&csv) == 3); 344 assert(csv_nfields(&csv) == 3);
345 assert(strcmp(csv_field(&csv, 0), "A") == 0); 345 assert(strcmp(csv_field(&csv, 0), "A") == 0);
346 assert(strcmp(csv_field(&csv, 1), "B") == 0); 346 assert(strcmp(csv_field(&csv, 1), "B") == 0);
347 assert(strcmp(csv_field(&csv, 2), "C") == 0); 347 assert(strcmp(csv_field(&csv, 2), "C") == 0);
348 348
349 // Line 15 349 // Line 15
350 assert(csv_read(&csv, f) == 3); 350 assert(csv_read(&csv, file) == 3);
351 assert(csv_nfields(&csv) == 3); 351 assert(csv_nfields(&csv) == 3);
352 assert(strcmp(csv_field(&csv, 0), "A") == 0); 352 assert(strcmp(csv_field(&csv, 0), "A") == 0);
353 assert(strcmp(csv_field(&csv, 1), "B") == 0); 353 assert(strcmp(csv_field(&csv, 1), "B") == 0);
354 assert(strcmp(csv_field(&csv, 2), "C") == 0); 354 assert(strcmp(csv_field(&csv, 2), "C") == 0);
355 355
356 // Line 16 356 // Line 16
357 assert(csv_read(&csv, f) == 3); 357 assert(csv_read(&csv, file) == 3);
358 assert(csv_nfields(&csv) == 3); 358 assert(csv_nfields(&csv) == 3);
359 assert(strcmp(csv_field(&csv, 0), "A") == 0); 359 assert(strcmp(csv_field(&csv, 0), "A") == 0);
360 assert(strcmp(csv_field(&csv, 1), "B") == 0); 360 assert(strcmp(csv_field(&csv, 1), "B") == 0);
361 assert(strcmp(csv_field(&csv, 2), "C") == 0); 361 assert(strcmp(csv_field(&csv, 2), "C") == 0);
362 362
363 // Line 17 363 // Line 17
364 assert(csv_read(&csv, f) == 3); 364 assert(csv_read(&csv, file) == 3);
365 assert(csv_nfields(&csv) == 3); 365 assert(csv_nfields(&csv) == 3);
366 assert(strcmp(csv_field(&csv, 0), "A") == 0); 366 assert(strcmp(csv_field(&csv, 0), "A") == 0);
367 assert(strcmp(csv_field(&csv, 1), "B") == 0); 367 assert(strcmp(csv_field(&csv, 1), "B") == 0);
368 assert(strcmp(csv_field(&csv, 2), "C") == 0); 368 assert(strcmp(csv_field(&csv, 2), "C") == 0);
369 369
370 // Line 18 370 // Line 18
371 assert(csv_read(&csv, f) == 3); 371 assert(csv_read(&csv, file) == 3);
372 assert(csv_nfields(&csv) == 3); 372 assert(csv_nfields(&csv) == 3);
373 assert(strcmp(csv_field(&csv, 0), "A") == 0); 373 assert(strcmp(csv_field(&csv, 0), "A") == 0);
374 assert(strcmp(csv_field(&csv, 1), "B") == 0); 374 assert(strcmp(csv_field(&csv, 1), "B") == 0);
375 assert(strcmp(csv_field(&csv, 2), "C") == 0); 375 assert(strcmp(csv_field(&csv, 2), "C") == 0);
376 376
377 // Line 19 377 // Line 19
378 assert(csv_read(&csv, f) == 3); 378 assert(csv_read(&csv, file) == 3);
379 assert(csv_nfields(&csv) == 3); 379 assert(csv_nfields(&csv) == 3);
380 assert(strcmp(csv_field(&csv, 0), "A") == 0); 380 assert(strcmp(csv_field(&csv, 0), "A") == 0);
381 assert(strcmp(csv_field(&csv, 1), "B") == 0); 381 assert(strcmp(csv_field(&csv, 1), "B") == 0);
382 assert(strcmp(csv_field(&csv, 2), "C") == 0); 382 assert(strcmp(csv_field(&csv, 2), "C") == 0);
383 383
384 // EOF 384 // EOF
385 assert(csv_read(&csv, f) == 0); 385 assert(csv_read(&csv, file) == 0);
386 386
387 FMEMCLOSE(f); 387 FMEMCLOSE(file);
388} 388}
389 389
390void 390void
391test_quoted_fields(void) 391test_quoted_fields(void)
392{ 392{
393 FILE *f; 393 FILE *file = NULL;
394 csv_t csv = { 0 }; 394 csv_t csv = { 0 };
395 395
396 char data[] = "foo \"baz\" bar,foo \"\"baz\"\" bar,\"foo \"\"baz\"\" bar\",\"foo \"baz\" bar\",\"foo \"\"baz\"\", bar\""; 396 char data[] = "foo \"baz\" bar,foo \"\"baz\"\" bar,\"foo \"\"baz\"\" bar\",\"foo \"baz\" bar\",\"foo \"\"baz\"\", bar\"";
397 397
398 FMEMOPEN(f, data); 398 FMEMOPEN(file, data);
399 399
400 assert(csv_read(&csv, f) == 5); 400 assert(csv_read(&csv, file) == 5);
401 assert(csv_nfields(&csv) == 5); 401 assert(csv_nfields(&csv) == 5);
402 assert(strcmp(csv_field(&csv, 0), "foo \"baz\" bar") == 0); 402 assert(strcmp(csv_field(&csv, 0), "foo \"baz\" bar") == 0);
403 assert(strcmp(csv_field(&csv, 1), "foo \"\"baz\"\" bar") == 0); 403 assert(strcmp(csv_field(&csv, 1), "foo \"\"baz\"\" bar") == 0);
@@ -405,28 +405,28 @@ test_quoted_fields(void)
405 assert(strcmp(csv_field(&csv, 3), "foo \"baz\" bar") == 0); 405 assert(strcmp(csv_field(&csv, 3), "foo \"baz\" bar") == 0);
406 assert(strcmp(csv_field(&csv, 4), "foo \"baz\", bar") == 0); 406 assert(strcmp(csv_field(&csv, 4), "foo \"baz\", bar") == 0);
407 407
408 assert(csv_read(&csv, f) == 0); 408 assert(csv_read(&csv, file) == 0);
409 409
410 FMEMCLOSE(f); 410 FMEMCLOSE(file);
411} 411}
412 412
413void 413void
414test_wrong_quoted_field(void) 414test_wrong_quoted_field(void)
415{ 415{
416 FILE *f; 416 FILE *file = NULL;
417 csv_t csv = { 0 }; 417 csv_t csv = { 0 };
418 418
419 char data[] = "\"foo"; 419 char data[] = "\"foo";
420 420
421 FMEMOPEN(f, data); 421 FMEMOPEN(file, data);
422 422
423 assert(csv_read(&csv, f) == 1); 423 assert(csv_read(&csv, file) == 1);
424 assert(csv_nfields(&csv) == 1); 424 assert(csv_nfields(&csv) == 1);
425 assert(strcmp(csv_field(&csv, 0), "foo") == 0); 425 assert(strcmp(csv_field(&csv, 0), "foo") == 0);
426 426
427 assert(csv_read(&csv, f) == 0); 427 assert(csv_read(&csv, file) == 0);
428 428
429 FMEMCLOSE(f); 429 FMEMCLOSE(file);
430} 430}
431 431
432static void 432static void
@@ -446,14 +446,14 @@ test_out_of_range_error(void)
446 csv_t csv; 446 csv_t csv;
447 csv_init_opt(&csv, &csv_options); 447 csv_init_opt(&csv, &csv_options);
448 448
449 FILE *f; 449 FILE *file = NULL;
450 char data[] = ","; 450 char data[] = ",";
451 451
452 FMEMOPEN(f, data); 452 FMEMOPEN(file, data);
453 453
454 switch ( setjmp(env) ) { 454 switch ( setjmp(env) ) {
455 case CSV_ERR_OK: 455 case CSV_ERR_OK:
456 assert(csv_read(&csv, f) == 2); 456 assert(csv_read(&csv, file) == 2);
457 assert(csv_nfields(&csv) == 2); 457 assert(csv_nfields(&csv) == 2);
458 458
459 // force an "out of range"-Exception! 459 // force an "out of range"-Exception!
@@ -468,7 +468,7 @@ test_out_of_range_error(void)
468 assert(!"this should not be happen!"); 468 assert(!"this should not be happen!");
469 } 469 }
470 470
471 FMEMCLOSE(f); 471 FMEMCLOSE(file);
472} 472}
473 473
474void 474void
@@ -482,13 +482,13 @@ test_read_error(void)
482 csv_t csv; 482 csv_t csv;
483 csv_init_opt(&csv, &csv_options); 483 csv_init_opt(&csv, &csv_options);
484 484
485 FILE *f = fopen("/dev/null", "r"); 485 FILE *file = fopen("/dev/null", "r");
486 assert(f != NULL); 486 assert(file != NULL);
487 fputc('T', f); // Set Error-Flag! 487 (void) fputc('T', file); // Set Error-Flag!
488 488
489 switch ( setjmp(env) ) { 489 switch ( setjmp(env) ) {
490 case CSV_ERR_OK: 490 case CSV_ERR_OK:
491 assert(csv_read(&csv, f) == 0); 491 assert(csv_read(&csv, file) == 0);
492 break; 492 break;
493 493
494 case CSV_ERR_IO_READ: 494 case CSV_ERR_IO_READ:
@@ -499,44 +499,44 @@ test_read_error(void)
499 assert(!"this should not be happen!"); 499 assert(!"this should not be happen!");
500 } 500 }
501 501
502 fclose(f); 502 (void) fclose(file);
503} 503}
504 504
505void * 505void *
506my_allocate(size_t n, size_t sz, void *cb_arg) 506my_allocate(size_t n, size_t size, void *cb_arg)
507{ 507{
508 UNUSED(cb_arg); 508 UNUSED(cb_arg);
509 509
510 void *ptr = calloc(n, sz); 510 void *ptr = calloc(n, size);
511 return ptr; 511 return ptr;
512} 512}
513 513
514void * 514void *
515my_allocate_null(size_t n, size_t sz, void *cb_arg) 515my_allocate_null(size_t n, size_t size, void *cb_arg)
516{ 516{
517 UNUSED(n); 517 UNUSED(n);
518 UNUSED(sz); 518 UNUSED(size);
519 UNUSED(cb_arg); 519 UNUSED(cb_arg);
520 520
521 return NULL; 521 return NULL;
522} 522}
523 523
524void * 524void *
525my_reallocate(void *ptr, size_t n, size_t sz, void *cb_arg) 525my_reallocate(void *ptr, size_t n, size_t size, void *cb_arg)
526{ 526{
527 UNUSED(ptr); 527 UNUSED(ptr);
528 UNUSED(n); 528 UNUSED(n);
529 UNUSED(sz); 529 UNUSED(size);
530 UNUSED(cb_arg); 530 UNUSED(cb_arg);
531 531
532 return NULL; 532 return NULL;
533} 533}
534 534
535void 535void
536my_free(void *ptr, size_t n, size_t sz, void *cb_arg) 536my_free(void *ptr, size_t n, size_t size, void *cb_arg)
537{ 537{
538 UNUSED(n); 538 UNUSED(n);
539 UNUSED(sz); 539 UNUSED(size);
540 UNUSED(cb_arg); 540 UNUSED(cb_arg);
541 541
542 free(ptr); 542 free(ptr);
@@ -559,13 +559,13 @@ test_allocation_error1(void)
559 559
560 char data[] = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T"; 560 char data[] = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T";
561 561
562 FILE *f; 562 FILE *file = NULL;
563 FMEMOPEN(f, data); 563 FMEMOPEN(file, data);
564 assert(f != NULL); 564 assert(file != NULL);
565 565
566 switch ( setjmp(env) ) { 566 switch ( setjmp(env) ) {
567 case CSV_ERR_OK: 567 case CSV_ERR_OK:
568 assert(csv_read(&csv, f) == 20); 568 assert(csv_read(&csv, file) == 20);
569 assert(!"this should not be happen!"); 569 assert(!"this should not be happen!");
570 break; 570 break;
571 571
@@ -577,7 +577,7 @@ test_allocation_error1(void)
577 assert(!"this should not be happen!"); 577 assert(!"this should not be happen!");
578 } 578 }
579 579
580 FMEMCLOSE(f); 580 FMEMCLOSE(file);
581} 581}
582 582
583void 583void
@@ -585,17 +585,17 @@ show_version(void)
585{ 585{
586 const char *version = csv_version; 586 const char *version = csv_version;
587 587
588 printf("Version: "); 588 printf("libcsv - version: ");
589 for ( ; *version; ++version ) { 589 for ( ; *version; ++version ) {
590 putchar(*version); 590 putchar(*version);
591 } 591 }
592 592
593 printf(", Build Date: "); 593 printf(", build date: ");
594 for ( ++version; *version; ++version ) { 594 for ( ++version; *version; ++version ) {
595 putchar(*version); 595 putchar(*version);
596 } 596 }
597 597
598 printf(", Build Time: "); 598 printf(", build time: ");
599 for ( ++version; *version; ++version ) { 599 for ( ++version; *version; ++version ) {
600 putchar(*version); 600 putchar(*version);
601 } 601 }
@@ -620,5 +620,7 @@ main(void)
620 620
621 test_allocation_error1(); 621 test_allocation_error1();
622 622
623 puts("all tests passed...");
624
623 return EXIT_SUCCESS; 625 return EXIT_SUCCESS;
624} 626}
diff --git a/csv.c b/csv.c
index b68189b..0915029 100644
--- a/csv.c
+++ b/csv.c
@@ -5,7 +5,7 @@
5#include <stdlib.h> 5#include <stdlib.h>
6#include <string.h> 6#include <string.h>
7 7
8// === Compiletime Options === 8// === Compile time options ===
9 9
10#ifndef CSV_DEFAULT_DELIMITER 10#ifndef CSV_DEFAULT_DELIMITER
11# define CSV_DEFAULT_DELIMITER '"' 11# define CSV_DEFAULT_DELIMITER '"'
@@ -15,7 +15,7 @@
15# define CSV_DEFAULT_SEPARATOR ',' 15# define CSV_DEFAULT_SEPARATOR ','
16#endif 16#endif
17 17
18// === some usefull Makros === 18// === some useful Makros ===
19 19
20#define UNUSED(x) (void) (x) // mark a parameter as 'unused' 20#define UNUSED(x) (void) (x) // mark a parameter as 'unused'
21#define STR(s) #s // Stringify a Makro 21#define STR(s) #s // Stringify a Makro
@@ -32,33 +32,18 @@ const char csv_version[] = XSTR(CSV_VER_MAJOR) "." XSTR(CSV_VER_MINOR) "." XSTR(
32 32
33// === CSV-MEMORY Interface === 33// === CSV-MEMORY Interface ===
34 34
35#if ( (defined(__GNUC__) && __GNUC__ >= 5) || (defined(__clang__) && (__clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 4))) )
36# define mul_overflow __builtin_mul_overflow
37#else
38static inline int
39mul_overflow(size_t a, size_t b, size_t *out)
40{
41 *out = a * b;
42 return (a != 0 && (*out / a) != b);
43}
44#endif
45
46static void * 35static void *
47csv_mem_reallocate(void *ptr, size_t number, size_t size, void *cb_arg) 36csv_mem_reallocate(void *ptr, size_t num, size_t size, void *cb_arg)
48{ 37{
49 UNUSED(cb_arg); 38 UNUSED(cb_arg);
50 39
51 size_t len = 0; 40 return reallocarray(ptr, num, size);
52 if ( number == 0 || size == 0 || mul_overflow(number, size, &len) ) {
53 return NULL;
54 }
55 return realloc(ptr, len);
56} 41}
57 42
58static void 43static void
59csv_mem_free(void *ptr, size_t number, size_t size, void *cb_arg) 44csv_mem_free(void *ptr, size_t num, size_t size, void *cb_arg)
60{ 45{
61 UNUSED(number); 46 UNUSED(num);
62 UNUSED(size); 47 UNUSED(size);
63 UNUSED(cb_arg); 48 UNUSED(cb_arg);
64 49