![]() ![]() |
![]() |
File: [Development] / JSOC / proj / globalhs / apps / durcon.c
(download)
Revision: 1.1, Fri Apr 23 04:20:06 2010 UTC (12 years, 11 months ago) by tplarson Branch: MAIN CVS Tags: Ver_8-0, Ver_7-1, Ver_7-0, Ver_6-4, Ver_6-3, Ver_6-2, Ver_6-1, Ver_6-0, Ver_5-9, Ver_5-14, Ver_5-13, Ver_5-12, Ver_5-11, Ver_5-10 stand-alone program for converting durations to numbers of seconds |
/* self-contained source code for durcon, converts commandline arguments given as a duration to a number of seconds. compile it like this: 'cc -o durcon durcon.c' or similar */ #include <stdlib.h> #include <time.h> #include <errno.h> #include <stdio.h> #include <math.h> static int parse_duration(char **, double *); int drms_names_parseduration(char **, double *); int main(int argc, char **argv) { int status=0; double dval; while (--argc > 0) { status+=drms_names_parseduration(++argv,&dval); printf("%.3f ",dval); } printf("\n"); return status; } static inline int IsZero(double d) { return d == (double)0.0; } static inline int IsPosHugeVal(double d) { return d == HUGE_VAL; } static inline int IsNegHugeVal(double d) { return d == -HUGE_VAL; } /* Parse time duration constant */ static int parse_duration(char **in, double *duration) { char *end, *p = *in; double dval; dval = strtod(p,&end); if ( (IsZero(dval) && end==p) || ((IsPosHugeVal(dval) || IsNegHugeVal(dval)) && errno==ERANGE)) { fprintf(stderr,"Syntax Error: Expected finite floating point value at " "beginning of time duration, found '%s'.\n", p); goto error; } else p = end; switch(*p++) { case 's': *duration = 1.0*dval; break; case 'm': *duration = 60.0*dval; break; case 'h': *duration = 3600.0*dval; break; case 'd': *duration = 86400.0*dval; break; case 'u': /* Means 'unit' - for SLOT type slotted keys, can have a query of the form * [392.3/100u]. This just means [392.3 - 492.3). */ *duration = 1.0*dval; break; default: fprintf(stderr,"Syntax Error: Time duration unit must be one of 's', " "'m', 'h', 'd', 'u', found '%c', '%s'.\n", *(p-1), p); goto error; } *in = p; return 0; error: return 1; } int drms_names_parseduration(char **in, double *duration) { char *tmp = strdup(*in); int ret = 1; if (tmp) { char *tmp2 = tmp; ret = parse_duration(&tmp2, duration); free(tmp); } return ret; }
Karen Tian |
Powered by ViewCVS 0.9.4 |