| 157 | } |
| 158 | |
| 159 | apr_status_t md_duration_parse(apr_interval_time_t *ptimeout, const char *value, |
| 160 | const char *def_unit) |
| 161 | { |
| 162 | char *endp; |
| 163 | apr_int64_t n; |
| 164 | |
| 165 | n = apr_strtoi64(value, &endp, 10); |
| 166 | if (errno) { |
| 167 | return errno; |
| 168 | } |
| 169 | if (!endp || !*endp) { |
| 170 | if (!def_unit) def_unit = "s"; |
| 171 | } |
| 172 | else if (endp == value) { |
| 173 | return APR_EINVAL; |
| 174 | } |
| 175 | else { |
| 176 | def_unit = endp; |
| 177 | } |
| 178 | |
| 179 | switch (*def_unit) { |
| 180 | case 'D': |
| 181 | case 'd': |
| 182 | *ptimeout = apr_time_from_sec(n * MD_SECS_PER_DAY); |
| 183 | break; |
| 184 | case 's': |
| 185 | case 'S': |
| 186 | *ptimeout = (apr_interval_time_t) apr_time_from_sec(n); |
| 187 | break; |
| 188 | case 'h': |
| 189 | case 'H': |
| 190 | /* Time is in hours */ |
| 191 | *ptimeout = (apr_interval_time_t) apr_time_from_sec(n * MD_SECS_PER_HOUR); |
| 192 | break; |
| 193 | case 'm': |
| 194 | case 'M': |
| 195 | switch (*(++def_unit)) { |
| 196 | /* Time is in milliseconds */ |
| 197 | case 's': |
| 198 | case 'S': |
| 199 | *ptimeout = (apr_interval_time_t) n * 1000; |
| 200 | break; |
| 201 | /* Time is in minutes */ |
| 202 | case 'i': |
| 203 | case 'I': |
| 204 | *ptimeout = (apr_interval_time_t) apr_time_from_sec(n * 60); |
| 205 | break; |
| 206 | default: |
| 207 | return APR_EGENERAL; |
| 208 | } |
| 209 | break; |
| 210 | default: |
| 211 | return APR_EGENERAL; |
| 212 | } |
| 213 | return APR_SUCCESS; |
| 214 | } |
| 215 | |
| 216 | static apr_status_t percentage_parse(const char *value, int *ppercent) |
no outgoing calls
no test coverage detected