/* 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 #include #include #include #include char *cvsinfo_durcon = "cvsinfo: $Header: /home/cvsuser/cvsroot/JSOC/proj/globalhs/apps/durcon.c,v 1.2 2013/04/28 08:05:54 tplarson Exp $"; 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; }