ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/JSOC/proj/globalhs/apps/durcon.c
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

File Contents

# Content
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 char *cvsinfo_durcon = "cvsinfo: $Header: durcon.c,v tplarson Exp $";
13
14 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 }