1 /* ISC license. */
2 
3 #ifndef FMTSCAN_INTERNAL_H
4 #define FMTSCAN_INTERNAL_H
5 
6 #include <stdint.h>
7 #include <string.h>
8 #include <errno.h>
9 #include <limits.h>
10 
11 #include <skalibs/uint64.h>
12 #include <skalibs/fmtscan.h>
13 
14 #define SCANB0(bits) \
15 size_t uint##bits##0_scan_base (char const *s, uint##bits##_t *u, uint8_t base) \
16 { \
17   size_t pos = uint##bits##_scan_base(s, u, base) ; \
18   if (!pos) return (errno = EINVAL, 0) ; \
19   if (!s[pos]) return pos ; \
20   errno = fmtscan_num(s[pos], base) < base ? ERANGE : EINVAL ; \
21   return 0 ; \
22 } \
23 
24 #define SCANS0(bits) \
25 size_t int##bits##0_scan_base (char const *s, int##bits##_t *d, uint8_t base) \
26 { \
27   size_t pos = int##bits##_scan(s, d) ; \
28   if (!pos) return (errno = EINVAL, 0) ; \
29   if (!s[pos]) return pos ; \
30   errno = (fmtscan_num(s[pos], base) < base) ? ERANGE : EINVAL ; \
31   return 0 ; \
32 } \
33 
34 #define SCANL(bits) \
35 size_t uint##bits##_scanlist (uint##bits##_t *tab, size_t max, char const *s, size_t *num) \
36 { \
37   size_t i = 0, len = 0 ; \
38   for (; s[len] && (i < max) ; i++) \
39   { \
40     size_t w = uint##bits##_scan(s + len, tab + i) ; \
41     if (!w) break ; \
42     len += w ; \
43     while (memchr(",:; \t\r\n", s[len], 7)) len++ ; \
44   } \
45   *num = i ; \
46   return len ; \
47 } \
48 
49 #define SCANSL(bits) \
50 size_t int##bits##_scanlist (int##bits##_t *tab, size_t max, char const *s, size_t *num) \
51 { \
52   size_t i = 0, len = 0 ; \
53   for (; s[len] && (i < max) ; i++) \
54   { \
55     size_t w = int##bits##_scan(s + len, tab + i) ; \
56     if (!w) break ; \
57     len += w ; \
58     while (memchr(",:; \t\r\n", s[len], 7)) len++ ; \
59   } \
60   *num = i ; \
61   return len ; \
62 } \
63 
64 #define FMTL(bits) \
65 static uint64_t get (void const *tab, size_t i) \
66 { \
67   return ((uint##bits##_t const *)tab)[i] ; \
68 } \
69 size_t uint##bits##_fmtlist (char *s, uint##bits##_t const *tab, size_t n) \
70 { \
71   return uint64_fmtlist_generic(s, tab, n, 10, &get) ; \
72 } \
73 
74 #define FMTSL(bits) \
75 size_t int##bits##_fmtlist (char *s, int##bits##_t const *tab, size_t n) \
76 { \
77   size_t i = 0, len = 0 ; \
78   for (; i < n ; i++) \
79   { \
80     size_t w = int##bits##_fmt(s, tab[i]) ; \
81     len += w ; \
82     if (s) s += w ; \
83     if (i < n-1) { len++ ; if (s) *s++ = ',' ; } \
84   } \
85   return len ; \
86 } \
87 
88 #endif
89