to.h - blind - suckless command-line video editing utility
(HTM) git clone git://git.suckless.org/blind
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
to.h (3669B)
---
1 /* See LICENSE file for copyright and license details. */
2 #include <errno.h>
3 #include <stdlib.h>
4
5 int tollu(const char *s, unsigned long long int min, unsigned long long int max, unsigned long long int *out);
6 int tolli(const char *s, long long int min, long long int max, long long int *out);
7 #define DEF_STR_TO_INT(FNAME, INTTYPE, INTER_FNAME, INTER_INTTYPE, PRI)\
8 static inline int\
9 FNAME(const char *s, INTTYPE min, INTTYPE max, INTTYPE *out)\
10 {\
11 INTER_INTTYPE inter;\
12 if (INTER_FNAME(s, (INTER_INTTYPE)min, (INTER_INTTYPE)max, &inter))\
13 return -1;\
14 *out = (INTTYPE)inter;\
15 return 0;\
16 }
17 DEF_STR_TO_INT(tolu, unsigned long int, tollu, unsigned long long int, "lu")
18 DEF_STR_TO_INT(tou, unsigned int, tollu, unsigned long long int, "u")
19 DEF_STR_TO_INT(toli, long int, tolli, long long int, "li")
20 DEF_STR_TO_INT(toi, int, tolli, long long int, "i")
21 #undef DEF_STR_TO_INT
22 #define tozu tolu
23 #define tozi toli
24 #define toju tollu
25 #define toji tolli
26
27 #define DEF_STR_TO_INT(FNAME, TYPE, PRI)\
28 static TYPE\
29 en##FNAME##_flag(int status, int flag, const char *s, TYPE min, TYPE max)\
30 {\
31 TYPE ret = 0;\
32 if (FNAME(s, min, max, &ret))\
33 enprintf(status,\
34 "argument of -%c must be an integer in [%"PRI", %"PRI"]\n",\
35 flag, min, max);\
36 return ret;\
37 }\
38 \
39 static inline TYPE\
40 e##FNAME##_flag(int flag, const char *s, TYPE min, TYPE max)\
41 {\
42 return en##FNAME##_flag(1, flag, s, min, max);\
43 }\
44 \
45 static TYPE\
46 en##FNAME##_arg(int status, const char *name, const char *s, TYPE min, TYPE max)\
47 {\
48 TYPE ret = 0;\
49 if (FNAME(s, min, max, &ret))\
50 enprintf(status,\
51 "%s must be an integer in [%"PRI", %"PRI"]\n",\
52 name, min, max);\
53 return ret;\
54 }\
55 \
56 static inline TYPE\
57 e##FNAME##_arg(const char *name, const char *s, TYPE min, TYPE max)\
58 {\
59 return en##FNAME##_arg(1, name, s, min, max);\
60 }
61 DEF_STR_TO_INT(tollu, unsigned long long int, "llu")
62 DEF_STR_TO_INT(tolu, unsigned long int, "lu")
63 DEF_STR_TO_INT(tou, unsigned int, "u")
64 DEF_STR_TO_INT(tolli, long long int, "lli")
65 DEF_STR_TO_INT(toli, long int, "li")
66 DEF_STR_TO_INT(toi, int, "i")
67 #undef DEF_STR_TO_INT
68
69 #define etozu_flag etolu_flag
70 #define etozi_flag etoli_flag
71 #define etoju_flag etollu_flag
72 #define etoji_flag etolli_flag
73 #define entozu_flag entolu_flag
74 #define entozi_flag entoli_flag
75 #define entoju_flag entollu_flag
76 #define entoji_flag entolli_flag
77
78 #define etozu_arg etolu_arg
79 #define etozi_arg etoli_arg
80 #define etoju_arg etollu_arg
81 #define etoji_arg etolli_arg
82 #define entozu_arg entolu_arg
83 #define entozi_arg entoli_arg
84 #define entoju_arg entollu_arg
85 #define entoji_arg entolli_arg
86
87 #define DEF_STR_TO_FLOAT(FNAME, TYPE, FUN)\
88 static inline int\
89 FNAME(const char *s, TYPE *out)\
90 {\
91 char *end;\
92 errno = 0;\
93 *out = FUN(s, &end);\
94 if (errno) {\
95 return -1;\
96 } else if (*end) {\
97 errno = EINVAL;\
98 return -1;\
99 }\
100 return 0;\
101 }\
102 \
103 static TYPE\
104 en##FNAME##_flag(int status, int flag, const char *s)\
105 {\
106 TYPE ret = 0;\
107 if (FNAME(s, &ret))\
108 enprintf(status, "argument of -%c must be floating-point value\n", flag);\
109 return ret;\
110 }\
111 \
112 static inline TYPE\
113 e##FNAME##_flag(int flag, const char *s)\
114 {\
115 return en##FNAME##_flag(1, flag, s);\
116 }\
117 \
118 static TYPE\
119 en##FNAME##_arg(int status, const char *name, const char *s)\
120 {\
121 TYPE ret = 0;\
122 if (FNAME(s, &ret))\
123 enprintf(status, "%s must be floating-point value\n", name);\
124 return ret;\
125 }\
126 \
127 static inline TYPE\
128 e##FNAME##_arg(const char *name, const char *s)\
129 {\
130 return en##FNAME##_arg(1, name, s);\
131 }
132 DEF_STR_TO_FLOAT(tof, float, strtof)
133 DEF_STR_TO_FLOAT(tolf, double, strtod)
134 DEF_STR_TO_FLOAT(tollf, long double, strtold)
135 #undef DEF_STR_TO_FLOAT