Revision: | 1.2 |
Committed: | Sun Apr 28 08:05:54 2013 UTC (10 years, 4 months ago) by tplarson |
Content type: | text/plain |
Branch: | MAIN |
CVS Tags: | globalhs_version_5, Ver_8-7, Ver_8-5, globalhs_version_23, globalhs_version_22, globalhs_version_21, globalhs_version_20, Ver_LATEST, globalhs_version_24, Ver_8-3, globalhs_version_8, globalhs_version_9, globalhs_version_0, globalhs_version_1, globalhs_version_2, globalhs_version_3, globalhs_version_4, Ver_9-41, globalhs_version_6, globalhs_version_7, Ver_9-5, Ver_8-8, globalhs_version_19, Ver_8-2, Ver_8-10, Ver_8-1, Ver_8-6, Ver_9-1, Ver_8-4, Ver_9-2, globalhs_version_12, globalhs_version_13, globalhs_version_10, globalhs_version_11, globalhs_version_16, globalhs_version_17, globalhs_version_14, globalhs_version_15, globalhs_version_18, Ver_9-4, Ver_9-3, Ver_8-11, Ver_8-12, Ver_9-0, HEAD |
Changes since 1.1: | +2 -0 lines |
Log Message: | added string to track cvs versions |
# | User | Rev | Content |
---|---|---|---|
1 | tplarson | 1.1 | /* self-contained source code for durcon, |
2 | converts commandline arguments given as a duration to a number of seconds. | ||
3 | compile it like this: 'cc -o durcon durcon.c' or similar | ||
4 | */ | ||
5 | |||
6 | #include <stdlib.h> | ||
7 | #include <time.h> | ||
8 | #include <errno.h> | ||
9 | #include <stdio.h> | ||
10 | #include <math.h> | ||
11 | |||
12 | tplarson | 1.2 | char *cvsinfo_durcon = "cvsinfo: $Header: durcon.c,v tplarson Exp $"; |
13 | |||
14 | tplarson | 1.1 | static int parse_duration(char **, double *); |
15 | int drms_names_parseduration(char **, double *); | ||
16 | |||
17 | int main(int argc, char **argv) | ||
18 | { | ||
19 | int status=0; | ||
20 | double dval; | ||
21 | while (--argc > 0) | ||
22 | { | ||
23 | status+=drms_names_parseduration(++argv,&dval); | ||
24 | printf("%.3f ",dval); | ||
25 | } | ||
26 | printf("\n"); | ||
27 | return status; | ||
28 | } | ||
29 | |||
30 | |||
31 | static inline int IsZero(double d) | ||
32 | { | ||
33 | return d == (double)0.0; | ||
34 | } | ||
35 | |||
36 | static inline int IsPosHugeVal(double d) | ||
37 | { | ||
38 | return d == HUGE_VAL; | ||
39 | } | ||
40 | |||
41 | static inline int IsNegHugeVal(double d) | ||
42 | { | ||
43 | return d == -HUGE_VAL; | ||
44 | } | ||
45 | |||
46 | /* Parse time duration constant */ | ||
47 | static int parse_duration(char **in, double *duration) | ||
48 | { | ||
49 | char *end, *p = *in; | ||
50 | double dval; | ||
51 | |||
52 | dval = strtod(p,&end); | ||
53 | if ( (IsZero(dval) && end==p) || | ||
54 | ((IsPosHugeVal(dval) || IsNegHugeVal(dval)) && errno==ERANGE)) | ||
55 | { | ||
56 | fprintf(stderr,"Syntax Error: Expected finite floating point value at " | ||
57 | "beginning of time duration, found '%s'.\n", p); | ||
58 | goto error; | ||
59 | } | ||
60 | else | ||
61 | p = end; | ||
62 | switch(*p++) | ||
63 | { | ||
64 | case 's': | ||
65 | *duration = 1.0*dval; | ||
66 | break; | ||
67 | case 'm': | ||
68 | *duration = 60.0*dval; | ||
69 | break; | ||
70 | case 'h': | ||
71 | *duration = 3600.0*dval; | ||
72 | break; | ||
73 | case 'd': | ||
74 | *duration = 86400.0*dval; | ||
75 | break; | ||
76 | case 'u': | ||
77 | /* Means 'unit' - for SLOT type slotted keys, can have a query of the form | ||
78 | * [392.3/100u]. This just means [392.3 - 492.3). */ | ||
79 | *duration = 1.0*dval; | ||
80 | break; | ||
81 | default: | ||
82 | fprintf(stderr,"Syntax Error: Time duration unit must be one of 's', " | ||
83 | "'m', 'h', 'd', 'u', found '%c', '%s'.\n", *(p-1), p); | ||
84 | goto error; | ||
85 | } | ||
86 | *in = p; | ||
87 | return 0; | ||
88 | error: | ||
89 | return 1; | ||
90 | } | ||
91 | |||
92 | int drms_names_parseduration(char **in, double *duration) | ||
93 | { | ||
94 | char *tmp = strdup(*in); | ||
95 | int ret = 1; | ||
96 | |||
97 | if (tmp) | ||
98 | { | ||
99 | char *tmp2 = tmp; | ||
100 | ret = parse_duration(&tmp2, duration); | ||
101 | free(tmp); | ||
102 | } | ||
103 | |||
104 | return ret; | ||
105 | } |