#if !defined(WIN32) #pragma member_alignment #endif #include "makecdf.h" /* 09/05/00 HKH In WARNING msg, added that record was not written to CDF. */ /* 03/00/02 H. Leckner made new Compute_Epoch8, for fractional day. /* 04/09/02 HKH made new Compute_Epoch9, for daycount since 1 Jan 1950.*/ /**********************************************************************/ /* GENERATE A NEW EPOCH VALUE */ /**********************************************************************/ char *MonthToken(LONG i); LONG Generate_Epoch(EpVAL, EpVAL2, option) double *EpVAL; long long *EpVAL2; int *option; { LONG lyear,lmonth,lday,lsince; double dhour,dmin,dsec,dmsec,depoch,dsince; long long llepoch; char epstring[EPOCH_STRING_LEN+1]; char tt2000string[TT2000_3_STRING_LEN+1]; int icnt, ccnt; LONG ierr=0; *option = 1; switch (EpALG.algorithm) { case 0 :ierr = Compute_Epoch(&depoch); if (ierr == 0) *EpVAL = depoch; EpALG.BaseEp = depoch; break; case 1 :ierr=epochParse2(VLIST[EpALG.operand[0]].buffer,&depoch); if (ierr == 0) *EpVAL = depoch; break; case 2 :ierr=epochParse3(VLIST[EpALG.operand[0]].buffer,&depoch); if (ierr == 0) *EpVAL = depoch; break; case 3 :ierr=epochParse4(VLIST[EpALG.operand[0]].buffer,&depoch); if (ierr == 0) *EpVAL = depoch; break; case 4: ierr=Get_Epoch(EpALG.operand[0],&depoch); *EpVAL = depoch; break; case 5: if (EpALG.BaseEp == 0.0) { /* Derive Base Epoch from operands */ ierr=Get_BaseEpoch(&depoch); if (ierr == 0) EpALG.BaseEp = depoch; } switch (EpALG.operand[8]) { /* units of offset variable */ case 0 : MSG_control(2,"ERROR: Years is not legal offset unit!",0); ierr=1; break; case 1 : MSG_control(2,"ERROR: Months is not legal offset unit!",0); ierr=1; break; case 2 : ierr=Get_Day(EpALG.operand[7],&lsince); depoch = EpALG.BaseEp + (lsince * 86400000); break; case 3 : ierr=Get_Hour(EpALG.operand[7],&dsince); depoch = EpALG.BaseEp + (dsince * 3600000.0); break; case 4 : ierr=Get_Minute(EpALG.operand[7],&dsince); depoch = EpALG.BaseEp + (dsince * 60000.0); break; case 5 : ierr=Get_Second(EpALG.operand[7],&dsince); depoch = EpALG.BaseEp + (dsince * 1000.0); break; case 6 : ierr=Get_MSecs(EpALG.operand[7],&dsince); depoch = EpALG.BaseEp + dsince; break; default: MSG_control(2,"ERROR: Offset variable units unknown.",0); ierr=1; break; } if (ierr == 0) *EpVAL = depoch; break; case 6: if (EpALG.BaseEp == 0.0) { /* Derive Base Epoch from operands */ ierr=Compute_Epoch(&depoch); if (ierr == 0) EpALG.BaseEp = depoch; } switch (EpALG.operand[8]) { /* units of offset variable */ case 0 : MSG_control(2,"ERROR: Years is not legal offset unit!",0); ierr=1; break; case 1 : MSG_control(2,"ERROR: Months is not legal offset unit!",0); ierr=1; break; case 2 : ierr=Get_Day(EpALG.operand[7],&lsince); depoch = EpALG.BaseEp + (lsince * 86400000); break; case 3 : ierr=Get_Hour(EpALG.operand[7],&dsince); depoch = EpALG.BaseEp + (dsince * 3600000.0); break; case 4 : ierr=Get_Minute(EpALG.operand[7],&dsince); depoch = EpALG.BaseEp + (dsince * 60000.0); break; case 5 : ierr=Get_Second(EpALG.operand[7],&dsince); depoch = EpALG.BaseEp + (dsince * 1000.0); break; case 6 : ierr=Get_MSecs(EpALG.operand[7],&dsince); depoch = EpALG.BaseEp + dsince; break; default: MSG_control(2,"ERROR: Offset variable units unknown.",0); ierr=1; break; } if (ierr == 0) *EpVAL = depoch; break; case 7: if (EpALG.BaseEp == 0.0) { /* Derive Base Epoch from filename */ ierr=Parse_Filename(RPARMS.infname); if (ierr != 0) return(ierr); } switch (EpALG.operand[8]) { /* units of offset variable */ case 0 : MSG_control(2,"ERROR: Years is not legal offset unit!",0); ierr=1; break; case 1 : MSG_control(2,"ERROR: Months is not legal offset unit!",0); ierr=1; break; case 2 : ierr=Get_Day(EpALG.operand[7],&lsince); depoch = EpALG.BaseEp + (lsince * 86400000); break; case 3 : ierr=Get_Hour(EpALG.operand[7],&dsince); depoch = EpALG.BaseEp + (dsince * 3600000.0); break; case 4 : ierr=Get_Minute(EpALG.operand[7],&dsince); depoch = EpALG.BaseEp + (dsince * 60000.0); break; case 5 : ierr=Get_Second(EpALG.operand[7],&dsince); depoch = EpALG.BaseEp + (dsince * 1000.0); break; case 6 : ierr=Get_MSecs(EpALG.operand[7],&dsince); depoch = EpALG.BaseEp + dsince; break; default: MSG_control(2,"ERROR: Offset variable units unknown.",0); ierr=1; break; } if (ierr == 0) *EpVAL = depoch; break; case 8 :ierr = Compute_Epoch8(&depoch); /* fractional day */ if (ierr == 0) *EpVAL = depoch; EpALG.BaseEp = depoch; break; case 9 :ierr = Compute_Epoch9(&depoch); /* daycount starts Jan 1, 1950 */ if (ierr == 0) *EpVAL = depoch; EpALG.BaseEp = depoch; break; case 10 :ierr = Compute_TT2000(&llepoch); if (ierr == 0) *EpVAL2 = llepoch; EpALG.BaseEp = llepoch; *option = 2; break; case 11 :ierr=Get_TT2000(EpALG.operand[0],&llepoch); *EpVAL2 = llepoch; *option = 2; break; case 12 :ierr=TT2000Parse2(VLIST[EpALG.operand[0]].buffer,&llepoch); if (ierr == 0) *EpVAL2 = llepoch; *option = 2; break; case 13 :ierr=TT2000Parse3(VLIST[EpALG.operand[0]].buffer,&llepoch); if (ierr == 0) *EpVAL2 = llepoch; *option = 2; break; case 14 :ierr=TT2000Parse4(VLIST[EpALG.operand[0]].buffer,&llepoch); if (ierr == 0) *EpVAL2 = llepoch; *option = 2; break; default:MSG_control(2,"ERROR: Unknown epoch algorithm",0); ierr=1; } if (ierr == 0) { if (*option == 1) { if (EpALG.FirstEp == 0.0) EpALG.FirstEp = depoch; } else { if (EpALG.FirstTT == 0) EpALG.FirstTT = llepoch; } if (RPARMS.debug == TRUE) { strcpy(LOGFILE.message,"New Epoch Generated="); if (*option == 1) { encodeEPOCH(depoch,epstring); strcat(LOGFILE.message,epstring); } else { encodeTT2000(llepoch,tt2000string,3); strcat(LOGFILE.message,tt2000string); } MSG_control(0,LOGFILE.message,0); } } else MSG_control(1,"WARNING: Invalid Epoch generated. Not written to CDF.",0); return(ierr); } /**********************************************************************/ /* DETERMINE EPOCH GENERATOR VARIABLES */ /**********************************************************************/ LONG Determine_EpGenerator() { LONG i; LONG ierr=0; switch (EpALG.algorithm) { case 0 : for (i=0;i<=9;i++) { if (EpALG.operand[i] != -1) EpALG.EpGenerator=EpALG.operand[i]; } break; case 1 : EpALG.EpGenerator = EpALG.operand[0]; break; case 2 : EpALG.EpGenerator = EpALG.operand[0]; break; case 3 : EpALG.EpGenerator = EpALG.operand[0]; break; case 4 : EpALG.EpGenerator = EpALG.operand[7]; break; case 5 : EpALG.EpGenerator = EpALG.operand[7]; break; case 6 : EpALG.EpGenerator = EpALG.operand[7]; break; case 7 : EpALG.EpGenerator = EpALG.operand[7]; break; case 8 : for (i=0;i<=9;i++) { if (EpALG.operand[i] != -1) EpALG.EpGenerator=EpALG.operand[i]; } case 9 : for (i=0;i<=9;i++) { if (EpALG.operand[i] != -1) EpALG.EpGenerator=EpALG.operand[i]; } break; case 10 : for (i=0;i<=9;i++) { if (EpALG.operand[i] != -1) EpALG.EpGenerator=EpALG.operand[i]; } break; case 11 : EpALG.EpGenerator = EpALG.operand[7]; break; case 12 : EpALG.EpGenerator = EpALG.operand[0]; break; case 13 : EpALG.EpGenerator = EpALG.operand[0]; break; case 14 : EpALG.EpGenerator = EpALG.operand[0]; break; default: MSG_control(2,"ERROR: Unknown Epoch algorithm!",0); MSG_control(2," Unable to continue.",0); ierr=1; } return(ierr); } /**********************************************************************/ /* MonthToken. */ /**********************************************************************/ char *MonthToken (month) LONG month; { switch (month) { case 1: return "Jan"; case 2: return "Feb"; case 3: return "Mar"; case 4: return "Apr"; case 5: return "May"; case 6: return "Jun"; case 7: return "Jul"; case 8: return "Aug"; case 9: return "Sep"; case 10: return "Oct"; case 11: return "Nov"; case 12: return "Dec"; } return "???"; } /****************************************************************************** * epochParse2. This function parses an input date/time string (inString) to * set the integer members of the EPOCH structure. * * This function performs the same function as the routine * epochParse, but requires a less rigid string format. It * allows the following: * a) The year field may be 2 or 4 digits. If only 2 * digits, the launch date of SPUTNIK ('57) will be * used to determine the century. * b) Any punctuation marks may exist between the fields. * You are not restricted to hyphens and colons. * c) Only the day,month and year fields are required. * Unless present the other fields are assumed to be 0. * * "dd-MON-yyyy hh:mm:ss.mmm" * 1-Apr-1990 03:05:02.002 * ******************************************************************************/ LONG epochParse2 (inString, Etime) char *inString; double *Etime; { char *Sptr; char moString[4]; char p; LONG j,year,month,day,hour,minute,second,msec; Sptr = inString; /* point to the input string */ if (sscanf(Sptr,"%ld%c",&day,&p)!=2) return (1); /* parse day out */ while (*Sptr != p) Sptr++; Sptr++; /* advance pointer to next field */ if (sscanf(Sptr,"%3s%c",moString,&p)!=2) return (1); /* parse month out */ while (*Sptr != p) Sptr++; Sptr++; /* advance pointer to next field */ if (sscanf(Sptr,"%ld",&year)!=1) return (1); /* parse year out */ while (isdigit(*Sptr)!= 0) Sptr++; /* advance pointer to next field */ /* correct the year if it is only 2 digits, assuming pre-post SPUTNIK */ if ((year >= 57)&&(year < 100)) year = year + 1900; else if ((year < 57)&&(year < 100)) year = year + 2000; /* day,month,year parsed. Initialize remaining fields */ hour = 0; minute = 0; second = 0; msec = 0; if (sscanf(Sptr,"%c",&p)==1) { Sptr++; /* intermediate punctuation found */ if (sscanf(Sptr,"%ld",&hour)==1) { Sptr++; Sptr++; /* hour found */ if (sscanf(Sptr,"%c",&p)==1) { Sptr++; /* punctuation */ if (sscanf(Sptr,"%ld",&minute)==1) { Sptr++; Sptr++; /* minute */ if (sscanf(Sptr,"%c",&p)==1) { Sptr++; /* punctuation */ if (sscanf(Sptr,"%ld",&second)==1) { Sptr++; Sptr++; /* sec */ if (sscanf(Sptr,"%c",&p)==1) { Sptr++; /* punctuation */ sscanf(Sptr,"%ld",&msec); /* parse milliseconds out */ } } } } } } } if ((day < 1 || day > 31) || (year < 0 || year > 9999) || (hour < 0 || hour > 23) || (minute < 0 || minute > 59) || (second < 0 || second > 59) || (msec < 0 || msec > 999)) { return (1); } for (j = 0; j < strlen(moString); j++) moString[j] = (islower(moString[j]) ? toupper(moString[j]) : moString[j]); if (islower(moString[0])) moString[0] = toupper(moString[0]); /* J */ if (isupper(moString[1])) moString[1] = tolower(moString[1]); /* a */ if (isupper(moString[2])) moString[2] = tolower(moString[2]); /* n */ month = 0; for (j = 1; j <= 12; j++) if (strcmp(moString, MonthToken(j)) == 0) { month = j; break; } if (month == 0) return (1); *Etime = computeEPOCH(year,month,day,hour,minute,second,msec); return (0); } LONG TT2000Parse2 (inString, Etime) char *inString; long long *Etime; { char *Sptr; char moString[4]; char p; LONG j,year,month,day,hour,minute,second,msec,usec,nsec; int items, ii; Sptr = inString; /* point to the input string */ if (sscanf(Sptr,"%ld%c",&day,&p)!=2) return (1); /* parse day out */ while (*Sptr != p) Sptr++; Sptr++; /* advance pointer to next field */ if (sscanf(Sptr,"%3s%c",moString,&p)!=2) return (1); /* parse month out */ while (*Sptr != p) Sptr++; Sptr++; /* advance pointer to next field */ if (sscanf(Sptr,"%ld",&year)!=1) return (1); /* parse year out */ while (isdigit(*Sptr)!= 0) Sptr++; /* advance pointer to next field */ /* correct the year if it is only 2 digits, assuming pre-post SPUTNIK */ if ((year >= 57)&&(year < 100)) year = year + 1900; else if ((year < 57)&&(year < 100)) year = year + 2000; /* day,month,year parsed. Initialize remaining fields */ items = 3; hour = minute = second = msec = usec = nsec = 0; if (sscanf(Sptr,"%c",&p)==1) { Sptr++; /* intermediate punctuation found */ if (sscanf(Sptr,"%ld",&hour)==1) { Sptr++; Sptr++; /* hour found */ ++items; if (sscanf(Sptr,"%c",&p)==1) { Sptr++; /* punctuation */ if (sscanf(Sptr,"%ld",&minute)==1) { Sptr++; Sptr++; /* minute */ ++items; if (sscanf(Sptr,"%c",&p)==1) { Sptr++; /* punctuation */ if (sscanf(Sptr,"%ld",&second)==1) { Sptr++; Sptr++; /* sec */ ++items; if (sscanf(Sptr,"%c",&p)==1) { Sptr++; /* punctuation */ ii=sscanf(Sptr,"%3ld%3ld%3ld",&msec,&usec,&nsec); /* parse millisecs, microsec and nanosec out */ items += ii; } } } } } } } for (j = 0; j < strlen(moString); j++) moString[j] = (islower(moString[j]) ? toupper(moString[j]) : moString[j]); if (islower(moString[0])) moString[0] = toupper(moString[0]); /* J */ if (isupper(moString[1])) moString[1] = tolower(moString[1]); /* a */ if (isupper(moString[2])) moString[2] = tolower(moString[2]); /* n */ month = 0; for (j = 1; j <= 12; j++) if (strcmp(moString, MonthToken(j)) == 0) { month = j; break; } if (month == 0) return (1); if (items == 9) *Etime = computeTT2000((double)year,(double)month,(double)day,(double)hour, (double)minute,(double)second,(double)msec, (double)usec,(double)nsec); else if (items == 8) *Etime = computeTT2000((double)year,(double)month,(double)day,(double)hour, (double)minute,(double)second,(double)msec, (double)usec,TT2000END); else if (items == 7) *Etime = computeTT2000((double)year,(double)month,(double)day,(double)hour, (double)minute,(double)second,(double)msec,TT2000END); else if (items == 6) *Etime = computeTT2000((double)year,(double)month,(double)day,(double)hour, (double)minute,(double)second,TT2000END); else if (items == 5) *Etime = computeTT2000((double)year,(double)month,(double)day,(double)hour, (double)minute,TT2000END); else if (items == 4) *Etime = computeTT2000((double)year,(double)month,(double)day,(double)hour, TT2000END); else if (items == 3) *Etime = computeTT2000((double)year,(double)month,(double)day,TT2000END); return (0); } /****************************************************************************** * epochParse3. This function parses an input date/time string (inString) to * set the integer members of the EPOCH structure. * This function performs the same function as the routine * epochParse2, but parses an ISO time string format. It * allows the following: * a) The year field may be 2 or 4 digits. If only 2 * digits, the launch date of SPUTNIK ('57) will be * used to determine the century. * b) Any punctuation marks may exist between the fields. * You are not restricted to hyphens and colons. * c) Only the day,month and year fields are required. * Unless present the other fields are assumed to be 0. * * "yyyy-mm-ddThh:mm:ss.mmmZ * 1994-04-01T13:01:02.000Z * ******************************************************************************/ LONG epochParse3 (inString, Etime) char *inString; double *Etime; { char *Sptr; char p; LONG year,month,day,hour,minute,second,msec; Sptr = inString; /* point to the input string */ if (sscanf(Sptr,"%ld%c",&year,&p) < 2) return (1); /* parse year out */ while (*Sptr != p) Sptr++; Sptr++; /* advance pointer to next field */ if (sscanf(Sptr,"%ld%c",&month,&p)!=2) return (1); /* parse month out */ while (*Sptr != p) Sptr++; Sptr++; /* advance pointer to next field */ if (sscanf(Sptr,"%ld%c",&day,&p)!=2) return (1); /* parse day out */ while (*Sptr != p) Sptr++; Sptr++; /* advance pointer to next field */ hour = 0; minute = 0; second = 0; msec = 0; /* Initialize remaining fields */ if (sscanf(Sptr,"%ld",&hour)==1) { Sptr++; Sptr++; /* hour found */ if (sscanf(Sptr,"%c",&p)==1) { Sptr++; /* punctuation */ if (sscanf(Sptr,"%ld",&minute)==1) { Sptr++; Sptr++; /* minute */ if (sscanf(Sptr,"%c",&p)==1) { Sptr++; /* punctuation */ if (sscanf(Sptr,"%ld",&second)==1) { Sptr++; Sptr++; /* sec */ if (sscanf(Sptr,"%c",&p)==1) { Sptr++; /* punctuation */ sscanf(Sptr,"%ld",&msec); /* parse milliseconds out */ } } } } } } /* correct the year if it is only 2 digits, assuming pre-post SPUTNIK */ if ((year >= 57)&&(year < 100)) year = year + 1900; else if ((year < 57)&&(year < 100)) year = year + 2000; if ((day < 1 || day > 31) || (year < 0 || year > 9999) || (month < 1 || month > 12) || (hour < 0 || hour > 23) || (minute < 0 || minute > 59) || (second < 0 || second > 59) || (msec < 0 || msec > 999)) return (1); *Etime = computeEPOCH(year,month,day,hour,minute,second,msec); return (0); } LONG TT2000Parse3 (inString, Etime) char *inString; long long *Etime; { char *Sptr; char p; LONG year,month,day,hour,minute,second,msec,usec,nsec; int items, ii; Sptr = inString; /* point to the input string */ if (sscanf(Sptr,"%ld%c",&year,&p) < 2) return (1); /* parse year out */ while (*Sptr != p) Sptr++; Sptr++; /* advance pointer to next field */ if (sscanf(Sptr,"%ld%c",&month,&p)!=2) return (1); /* parse month out */ while (*Sptr != p) Sptr++; Sptr++; /* advance pointer to next field */ if (sscanf(Sptr,"%ld%c",&day,&p)!=2) return (1); /* parse day out */ while (*Sptr != p) Sptr++; Sptr++; /* advance pointer to next field */ hour = minute = second = msec = usec = nsec = 0; /* Initialize remaining fields */ items = 3; if (sscanf(Sptr,"%ld",&hour)==1) { Sptr++; Sptr++; /* hour found */ ++items; if (sscanf(Sptr,"%c",&p)==1) { Sptr++; /* punctuation */ if (sscanf(Sptr,"%ld",&minute)==1) { Sptr++; Sptr++; /* minute */ ++items; if (sscanf(Sptr,"%c",&p)==1) { Sptr++; /* punctuation */ if (sscanf(Sptr,"%ld",&second)==1) { Sptr++; Sptr++; /* sec */ ++items; if (sscanf(Sptr,"%c",&p)==1) { Sptr++; /* punctuation */ ii = sscanf(Sptr,"%3ld%3ld%3ld",&msec,&usec,&nsec); /* parse millisecondsi, microseconds and nenoseconds */ items += ii; } } } } } } if (items == 9) *Etime = computeTT2000((double)year,(double)month,(double)day,(double)hour, (double)minute,(double)second,(double)msec, (double)usec,(double)nsec); else if (items == 8) *Etime = computeTT2000((double)year,(double)month,(double)day,(double)hour, (double)minute,(double)second,(double)msec, (double)usec,TT2000END); else if (items == 7) *Etime = computeTT2000((double)year,(double)month,(double)day,(double)hour, (double)minute,(double)second,(double)msec,TT2000END); else if (items == 6) *Etime = computeTT2000((double)year,(double)month,(double)day,(double)hour, (double)minute,(double)second,TT2000END); else if (items == 5) *Etime = computeTT2000((double)year,(double)month,(double)day,(double)hour, (double)minute,TT2000END); else if (items == 4) *Etime = computeTT2000((double)year,(double)month,(double)day,(double)hour, TT2000END); else if (items == 3) *Etime = computeTT2000((double)year,(double)month,(double)day,TT2000END); return (0); } /****************************************************************************** * epochParse4. This function parses an input date/time string (inString) to * set the integer members of the EPOCH structure. * This function performs the same function as the routine * epochParse2&3, but parses a different time string format. It * allows the following: * a) The year field may be 2 or 4 digits. If only 2 * digits, the launch date of SPUTNIK ('57) will be * used to determine the century. * b) Day is Day of Year, no Month is present * b) Any punctuation marks may exist between the fields. * You are not restricted to hyphens and colons. * c) Only the year and day fields are required. * Unless present the other fields are assumed to be 0. * * "yyyy-dd hh:mm:ss.mmmZ * 1994-01 13:01:02.000Z * ******************************************************************************/ LONG epochParse4 (inString, Etime) char *inString; double *Etime; { char *Sptr; char p; LONG year,month,day,hour,minute,second,msec,i; Sptr = inString; /* point to the input string */ if (sscanf(Sptr,"%ld%c",&year,&p) < 2) return (1); /* parse year out */ while (*Sptr != p) Sptr++; Sptr++; /* advance pointer to next field */ if (sscanf(Sptr,"%ld%c",&day,&p)!=2) return (1); /* parse day of year out */ while (*Sptr != p) Sptr++; Sptr++; /* advance pointer to next field */ hour = 0; minute = 0; second = 0; msec = 0; /* Initialize remaining fields */ if (sscanf(Sptr,"%ld",&hour)==1) { Sptr++; Sptr++; /* hour found */ if (sscanf(Sptr,"%c",&p)==1) { Sptr++; /* punctuation */ if (sscanf(Sptr,"%ld",&minute)==1) { Sptr++; Sptr++; /* minute */ if (sscanf(Sptr,"%c",&p)==1) { Sptr++; /* punctuation */ if (sscanf(Sptr,"%ld",&second)==1) { Sptr++; Sptr++; /* sec */ if (sscanf(Sptr,"%c",&p)==1) { Sptr++; /* punctuation */ sscanf(Sptr,"%ld",&msec); /* parse milliseconds out */ } } } } } } /* correct the year if it is only 2 digits, assuming pre-post SPUTNIK */ if ((year >= 57)&&(year < 100)) year = year + 1900; else if ((year < 57)&&(year < 100)) year = year + 2000; /* determine month given the day of year */ Convert_DOY(year,&month,&day); /* validate before computation */ if ((day < 1 || day > 31) || (year < 0 || year > 9999) || (month < 1 || month > 12) || (hour < 0 || hour > 23) || (minute < 0 || minute > 59) || (second < 0 || second > 59) || (msec < 0 || msec > 999)) return (1); *Etime = computeEPOCH(year,month,day,hour,minute,second,msec); return (0); } LONG TT2000Parse4 (inString, Etime) char *inString; long long *Etime; { char *Sptr; char p; LONG year,month,day,hour,minute,second,msec,usec,nsec,i; int items, ii; Sptr = inString; /* point to the input string */ if (sscanf(Sptr,"%ld%c",&year,&p) < 2) return (1); /* parse year out */ while (*Sptr != p) Sptr++; Sptr++; /* advance pointer to next field */ if (sscanf(Sptr,"%ld%c",&day,&p)!=2) return (1); /* parse day of year out */ while (*Sptr != p) Sptr++; Sptr++; /* advance pointer to next field */ hour = minute = second = msec = usec = nsec = 0; /* Initialize remaining fields */ items = 3; if (sscanf(Sptr,"%ld",&hour)==1) { Sptr++; Sptr++; /* hour found */ ++items; if (sscanf(Sptr,"%c",&p)==1) { Sptr++; /* punctuation */ if (sscanf(Sptr,"%ld",&minute)==1) { Sptr++; Sptr++; /* minute */ ++items; if (sscanf(Sptr,"%c",&p)==1) { Sptr++; /* punctuation */ if (sscanf(Sptr,"%ld",&second)==1) { Sptr++; Sptr++; /* sec */ ++items; if (sscanf(Sptr,"%c",&p)==1) { Sptr++; /* punctuation */ ii = sscanf(Sptr,"%3ld%3ld%3ld",&msec,&usec,&nsec); /* parse millisecondsi, microseconds and nanoseconds */ items += ii; } } } } } } /* determine month given the day of year */ Convert_DOY(year,&month,&day); if (items == 9) *Etime = computeTT2000((double)year,(double)month,(double)day,(double)hour, (double)minute,(double)second,(double)msec, (double)usec,(double)nsec); else if (items == 8) *Etime = computeTT2000((double)year,(double)month,(double)day,(double)hour, (double)minute,(double)second,(double)msec, (double)usec,TT2000END); else if (items == 7) *Etime = computeTT2000((double)year,(double)month,(double)day,(double)hour, (double)minute,(double)second,(double)msec,TT2000END); else if (items == 6) *Etime = computeTT2000((double)year,(double)month,(double)day,(double)hour, (double)minute,(double)second,TT2000END); else if (items == 5) *Etime = computeTT2000((double)year,(double)month,(double)day,(double)hour, (double)minute,TT2000END); else if (items == 4) *Etime = computeTT2000((double)year,(double)month,(double)day,(double)hour, TT2000END); else if (items == 3) *Etime = computeTT2000((double)year,(double)month,(double)day,TT2000END); return (0); } /************************************************************************** * COMPUTE JULIAN DATE * **************************************************************************/ /* The julian_date function is included directly here because its needed */ /* by the makeEpoch function. It computes the julian date given y,m,d */ LONG julian_date(y,m,d) LONG y,m,d; { LONG jd; jd = (LONG) (367*y-7*(y+(m+9)/12)/4-3*((y+(m-9)/7)/100+1)/4+275*m/9+d+1721029); return (jd); } /************************************************************************** * GET_YEAR * **************************************************************************/ LONG Get_Year(vnum, lval) LONG vnum; LONG *lval; { INT16 *iptr; UINT16 *iptru; long long *llptr; INT32 *lptr; UINT32 *lptru; LONG year; LONG ierr=0; if (vnum == -1) { ierr=1; return(ierr);} /* cannot compute without year */ switch (VLIST[vnum].cdfvartype) { case CDF_REAL4 : ierr=1; break; case CDF_FLOAT : ierr=1; break; case CDF_REAL8 : ierr=1; break; case CDF_DOUBLE: ierr=1; break; case CDF_EPOCH : ierr=1; break; case CDF_EPOCH16 : ierr=1; break; case CDF_INT8 : case CDF_TIME_TT2000 : llptr =(long long *)VLIST[vnum].dataptr; year = (LONG) *llptr; break; case CDF_INT4 : lptr =(INT32 *)VLIST[vnum].dataptr; year = *lptr; break; case CDF_UINT4 : lptru =(UINT32 *)VLIST[vnum].dataptr; year = *lptru; break; case CDF_INT2 : iptr =(INT16 *)VLIST[vnum].dataptr; year =(LONG)*iptr; break; case CDF_UINT2 : iptru =(UINT16 *)VLIST[vnum].dataptr; year =(LONG)*iptru; break; case CDF_BYTE : ierr=1; break; case CDF_CHAR : ierr=1; break; case CDF_UCHAR : ierr=1; break; default : ierr=1; break; } if (ierr == 0) { /* validate the year */ if ((year >= 57)&&(year < 100)) year = year + 1900; else if ((year < 57)&&(year < 100)) year = year + 2000; *lval=year; } return(ierr); } /************************************************************************** * GET_MONTH * **************************************************************************/ LONG Get_Month(vnum, lval) LONG vnum; LONG *lval; { INT16 *iptr; UINT16 *iptru; long long *llptr; INT32 *lptr; UINT32 *lptru; LONG month,i; char mstr[20]; static char cjan[] = "JANUARY"; static char cfeb[] = "FEBRUARY"; static char cmar[] = "MARCH"; static char capr[] = "APRIL"; static char cmay[] = "MAY"; static char cjun[] = "JUNE"; static char cjul[] = "JULY"; static char caug[] = "AUGUST"; static char csep[] = "SEPTEMBER"; static char coct[] = "OCTOBER"; static char cnov[] = "NOVEMBER"; static char cdec[] = "DECEMBER"; LONG ierr=0; if (vnum == -1) { *lval=0L; return(ierr); } switch (VLIST[vnum].cdfvartype) { case CDF_REAL4 : ierr=1; break; case CDF_FLOAT : ierr=1; break; case CDF_REAL8 : ierr=1; break; case CDF_DOUBLE: ierr=1; break; case CDF_EPOCH : ierr=1; break; case CDF_EPOCH16 : ierr=1; break; case CDF_INT8 : case CDF_TIME_TT2000 : llptr =(long long *)VLIST[vnum].dataptr; month = (LONG) *llptr; break; case CDF_INT4 : lptr =(INT32 *)VLIST[vnum].dataptr; month = *lptr; break; case CDF_UINT4 : lptru =(UINT32 *)VLIST[vnum].dataptr; month = *lptru; break; case CDF_INT2 : iptr =(INT16 *)VLIST[vnum].dataptr; month =(LONG)*iptr; break; case CDF_UINT2 : iptru =(UINT16 *)VLIST[vnum].dataptr; month =(LONG)*iptru; break; case CDF_BYTE : ierr=1; break; case CDF_CHAR : strcpy(mstr,VLIST[vnum].buffer); for (i=0;idaysinmonth[month];month++) { day = day - daysinmonth[month]; } month++; /* Julian January is 1 not 0 */ *lmonth = month; *lday = day; } /************************************************************************** * GET_HOUR * **************************************************************************/ LONG Get_Hour(vnum, dval) LONG vnum; double *dval; { INT16 *iptr; UINT16 *iptru; long long *llptr; INT32 *lptr; UINT32 *lptru; float *fptr; double *dptr; double hour; LONG ierr=0; if (vnum == -1) { *dval=0.0; return(ierr); } switch (VLIST[vnum].cdfvartype) { case CDF_REAL4 : fptr =(float *)VLIST[vnum].dataptr; hour =(double)*fptr; break; case CDF_FLOAT : fptr =(float *)VLIST[vnum].dataptr; hour =(double)*fptr; break; case CDF_REAL8 : dptr =(double *)VLIST[vnum].dataptr; hour = *dptr; break; case CDF_DOUBLE: dptr =(double *)VLIST[vnum].dataptr; hour = *dptr; break; case CDF_EPOCH : ierr=1; break; case CDF_EPOCH16 : ierr=1; break; case CDF_INT8 : case CDF_TIME_TT2000 : llptr =(long long *)VLIST[vnum].dataptr; hour =(double)*llptr; break; case CDF_INT4 : lptr =(INT32 *)VLIST[vnum].dataptr; hour =(double)*lptr; break; case CDF_UINT4 : lptru =(UINT32 *)VLIST[vnum].dataptr; hour =(double)*lptru; break; case CDF_INT2 : iptr =(INT16 *)VLIST[vnum].dataptr; hour =(double)*iptr; break; case CDF_UINT2 : iptru =(UINT16 *)VLIST[vnum].dataptr; hour =(double)*iptru; break; case CDF_BYTE : ierr=1; break; case CDF_CHAR : ierr=1; break; case CDF_UCHAR : ierr=1; break; default : ierr=1; break; } if (ierr == 0) *dval=hour; /* validate the hour value */ return(ierr); } /************************************************************************** * GET_FracDOY * **************************************************************************/ LONG Get_FracDOY(vnum, dval) LONG vnum; double *dval; { float *fptr; double *dptr; double fracDOY; LONG ierr=0; if (vnum == -1) { *dval=0.0; return(ierr); } switch (VLIST[vnum].cdfvartype) { case CDF_REAL4 : fptr =(float *)VLIST[vnum].dataptr; fracDOY =(double)*fptr; break; case CDF_FLOAT : fptr =(float *)VLIST[vnum].dataptr; fracDOY =(double)*fptr; break; case CDF_REAL8 : dptr =(double *)VLIST[vnum].dataptr; fracDOY = *dptr; break; case CDF_DOUBLE: dptr =(double *)VLIST[vnum].dataptr; fracDOY = *dptr; break; case CDF_EPOCH : ierr=1; break; case CDF_EPOCH16 : ierr=1; break; case CDF_TIME_TT2000 : ierr=1; break; case CDF_INT8 : ierr=1; break; case CDF_INT4 : ierr=1; break; case CDF_UINT4 : ierr=1; break; case CDF_INT2 : ierr=1; break; case CDF_UINT2 : ierr=1; break; case CDF_BYTE : ierr=1; break; case CDF_CHAR : ierr=1; break; case CDF_UCHAR : ierr=1; break; default : ierr=1; break; } if (ierr == 0) *dval=fracDOY; /* validate the fracDOY value */ return(ierr); } /************************************************************************** * GET_MINUTE * **************************************************************************/ LONG Get_Minute(vnum, dval) LONG vnum; double *dval; { INT16 *iptr; UINT16 *iptru; long long *llptr; INT32 *lptr; UINT32 *lptru; float *fptr; double *dptr; double min; LONG ierr=0; if (vnum == -1) { *dval=0.0; return(ierr); } switch (VLIST[vnum].cdfvartype) { case CDF_REAL4 : fptr=(float *)VLIST[vnum].dataptr; min =(double)*fptr; break; case CDF_FLOAT : fptr=(float *)VLIST[vnum].dataptr; min =(double)*fptr; break; case CDF_REAL8 : dptr=(double *)VLIST[vnum].dataptr; min = *dptr; break; case CDF_DOUBLE: dptr=(double *)VLIST[vnum].dataptr; min = *dptr; break; case CDF_EPOCH : ierr=1; break; case CDF_EPOCH16 : ierr=1; break; case CDF_INT8 : case CDF_TIME_TT2000 : llptr =(long long *)VLIST[vnum].dataptr; min =(double)*llptr; break; case CDF_INT4 : lptr=(INT32 *)VLIST[vnum].dataptr; min =(double)*lptr; break; case CDF_UINT4 : lptru=(UINT32 *)VLIST[vnum].dataptr; min =(double)*lptru; break; case CDF_INT2 : iptr=(INT16 *)VLIST[vnum].dataptr; min =(double)*iptr; break; case CDF_UINT2 : iptru=(UINT16 *)VLIST[vnum].dataptr; min=(double)*iptru; break; case CDF_BYTE : ierr=1; break; case CDF_CHAR : ierr=1; break; case CDF_UCHAR : ierr=1; break; default : ierr=1; break; } if (ierr == 0) *dval=min; /* validate the min value */ return(ierr); } /************************************************************************** * GET_SECOND * **************************************************************************/ LONG Get_Second(vnum, dval) LONG vnum; double *dval; { INT16 *iptr; UINT16 *iptru; long long *llptr; INT32 *lptr; UINT32 *lptru; float *fptr; double *dptr; double secs; LONG ierr=0; if (vnum == -1) { *dval=0.0; return(ierr); } switch (VLIST[vnum].cdfvartype) { case CDF_REAL4 : fptr=(float *)VLIST[vnum].dataptr; secs=(double)*fptr; break; case CDF_FLOAT : fptr=(float *)VLIST[vnum].dataptr; secs=(double)*fptr; break; case CDF_REAL8 : dptr=(double *)VLIST[vnum].dataptr; secs= *dptr; break; case CDF_DOUBLE: dptr=(double *)VLIST[vnum].dataptr; secs= *dptr; break; case CDF_EPOCH : ierr=1; break; case CDF_EPOCH16 : ierr=1; break; case CDF_INT8 : case CDF_TIME_TT2000 : llptr =(long long *)VLIST[vnum].dataptr; secs =(double)*llptr; break; case CDF_INT4 : lptr=(INT32 *)VLIST[vnum].dataptr; secs=(double)*lptr; break; case CDF_UINT4 : lptru=(UINT32 *)VLIST[vnum].dataptr; secs=(double)*lptru; break; case CDF_INT2 : iptr=(INT16 *)VLIST[vnum].dataptr; secs=(double)*iptr; break; case CDF_UINT2 : iptru=(UINT16 *)VLIST[vnum].dataptr; secs=(double)*iptru; break; case CDF_BYTE : ierr=1; break; case CDF_CHAR : ierr=1; break; case CDF_UCHAR : ierr=1; break; default : ierr=1; break; } if (ierr == 0) *dval=secs; /* validate the secs value */ return(ierr); } /************************************************************************** * GET_MSecs * **************************************************************************/ LONG Get_MSecs(vnum, dval) LONG vnum; double *dval; { INT16 *iptr; UINT16 *iptru; long long *llptr; INT32 *lptr; UINT32 *lptru; float *fptr; double *dptr; double msec; LONG ierr=0; if (vnum == -1) { *dval=0.0; return(ierr); } switch (VLIST[vnum].cdfvartype) { case CDF_REAL4 : fptr=(float *)VLIST[vnum].dataptr; msec=(double)*fptr; break; case CDF_FLOAT : fptr=(float *)VLIST[vnum].dataptr; msec=(double)*fptr; break; case CDF_REAL8 : dptr=(double *)VLIST[vnum].dataptr; msec= *dptr; break; case CDF_DOUBLE: dptr=(double *)VLIST[vnum].dataptr; msec= *dptr; break; case CDF_EPOCH : ierr=1; break; case CDF_EPOCH16 : ierr=1; break; case CDF_INT8 : case CDF_TIME_TT2000 : dptr =(double *)VLIST[vnum].dataptr; msec =*dptr; break; case CDF_INT4 : lptr=(INT32 *)VLIST[vnum].dataptr; msec=(double)*lptr; break; case CDF_UINT4 : lptru=(UINT32 *)VLIST[vnum].dataptr; msec=(double)*lptru; break; case CDF_INT2 : iptr=(INT16 *)VLIST[vnum].dataptr; msec=(double)*iptr; break; case CDF_UINT2 : iptru=(UINT16 *)VLIST[vnum].dataptr; msec=(double)*iptru; break; case CDF_BYTE : ierr=1; break; case CDF_CHAR : ierr=1; break; case CDF_UCHAR : ierr=1; break; default : ierr=1; break; } if (ierr == 0) *dval=msec; /* validate the msec value */ return(ierr); } /************************************************************************** * GET_USecs * **************************************************************************/ LONG Get_USecs(vnum, dval) LONG vnum; double *dval; { INT16 *iptr; UINT16 *iptru; INT32 *lptr; UINT32 *lptru; float *fptr; double *dptr; double usec; LONG ierr=0; if (vnum == -1) { *dval=0.0; return(ierr); } switch (VLIST[vnum].cdfvartype) { case CDF_REAL4 : fptr=(float *)VLIST[vnum].dataptr; usec=(double)*fptr; break; case CDF_FLOAT : fptr=(float *)VLIST[vnum].dataptr; usec=(double)*fptr; break; case CDF_REAL8 : dptr=(double *)VLIST[vnum].dataptr; usec= *dptr; break; case CDF_DOUBLE: dptr=(double *)VLIST[vnum].dataptr; usec= *dptr; break; case CDF_EPOCH : ierr=1; break; case CDF_EPOCH16 : ierr=1; break; case CDF_INT8 : case CDF_TIME_TT2000 : dptr =(double *)VLIST[vnum].dataptr; usec =*dptr; break; case CDF_INT4 : lptr=(INT32 *)VLIST[vnum].dataptr; usec=(double)*lptr; break; case CDF_UINT4 : lptru=(UINT32 *)VLIST[vnum].dataptr; usec=(double)*lptru; break; case CDF_INT2 : iptr=(INT16 *)VLIST[vnum].dataptr; usec=(double)*iptr; break; case CDF_UINT2 : iptru=(UINT16 *)VLIST[vnum].dataptr; usec=(double)*iptru; break; case CDF_BYTE : ierr=1; break; case CDF_CHAR : ierr=1; break; case CDF_UCHAR : ierr=1; break; default : ierr=1; break; } if (ierr == 0) *dval=usec; /* validate the nsec value */ return(ierr); } /************************************************************************** * GET_NSecs * **************************************************************************/ LONG Get_NSecs(vnum, dval) LONG vnum; double *dval; { INT16 *iptr; UINT16 *iptru; INT32 *lptr; UINT32 *lptru; float *fptr; double *dptr; double nsec; LONG ierr=0; if (vnum == -1) { *dval=0.0; return(ierr); } switch (VLIST[vnum].cdfvartype) { case CDF_REAL4 : fptr=(float *)VLIST[vnum].dataptr; nsec=(double)*fptr; break; case CDF_FLOAT : fptr=(float *)VLIST[vnum].dataptr; nsec=(double)*fptr; break; case CDF_REAL8 : dptr=(double *)VLIST[vnum].dataptr; nsec= *dptr; break; case CDF_DOUBLE: dptr=(double *)VLIST[vnum].dataptr; nsec= *dptr; break; case CDF_EPOCH : ierr=1; break; case CDF_EPOCH16 : ierr=1; break; case CDF_INT8 : case CDF_TIME_TT2000 : dptr =(double *)VLIST[vnum].dataptr; nsec =*dptr; break; case CDF_INT4 : lptr=(INT32 *)VLIST[vnum].dataptr; nsec=(double)*lptr; break; case CDF_UINT4 : lptru=(UINT32 *)VLIST[vnum].dataptr; nsec=(double)*lptru; break; case CDF_INT2 : iptr=(INT16 *)VLIST[vnum].dataptr; nsec=(double)*iptr; break; case CDF_UINT2 : iptru=(UINT16 *)VLIST[vnum].dataptr; nsec=(double)*iptru; break; case CDF_BYTE : ierr=1; break; case CDF_CHAR : ierr=1; break; case CDF_UCHAR : ierr=1; break; default : ierr=1; break; } if (ierr == 0) *dval=nsec; /* validate the nsec value */ return(ierr); } /************************************************************************** * GET_PSecs * **************************************************************************/ LONG Get_PSecs(vnum, dval) LONG vnum; double *dval; { INT16 *iptr; UINT16 *iptru; INT32 *lptr; UINT32 *lptru; float *fptr; double *dptr; double psec; long long *llptr; LONG ierr=0; if (vnum == -1) { *dval=0.0; return(ierr); } switch (VLIST[vnum].cdfvartype) { case CDF_REAL4 : fptr=(float *)VLIST[vnum].dataptr; psec=(double)*fptr; break; case CDF_FLOAT : fptr=(float *)VLIST[vnum].dataptr; psec=(double)*fptr; break; case CDF_REAL8 : dptr=(double *)VLIST[vnum].dataptr; psec= *dptr; break; case CDF_DOUBLE: dptr=(double *)VLIST[vnum].dataptr; psec= *dptr; break; case CDF_EPOCH : ierr=1; break; case CDF_EPOCH16 : ierr=1; break; case CDF_INT8 : case CDF_TIME_TT2000 : llptr =(long long *)VLIST[vnum].dataptr; psec =(double) *llptr; break; case CDF_INT4 : lptr=(INT32 *)VLIST[vnum].dataptr; psec=(double)*lptr; break; case CDF_UINT4 : lptru=(UINT32 *)VLIST[vnum].dataptr; psec=(double)*lptru; break; case CDF_INT2 : iptr=(INT16 *)VLIST[vnum].dataptr; psec=(double)*iptr; break; case CDF_UINT2 : iptru=(UINT16 *)VLIST[vnum].dataptr; psec=(double)*iptru; break; case CDF_BYTE : ierr=1; break; case CDF_CHAR : ierr=1; break; case CDF_UCHAR : ierr=1; break; default : ierr=1; break; } if (ierr == 0) *dval=psec; /* validate the psec value */ return(ierr); } /************************************************************************** * Get_Epoch * **************************************************************************/ LONG Get_Epoch(vnum, dval) LONG vnum; double *dval; { double *dptr; double msec; LONG ierr=0; if (vnum == -1) { *dval=0.0; return(ierr); } switch (VLIST[vnum].cdfvartype) { case CDF_REAL4 : ierr=1; break; case CDF_FLOAT : ierr=1; break; case CDF_REAL8 : dptr=(double *)VLIST[vnum].dataptr; msec= *dptr; break; case CDF_DOUBLE: dptr=(double *)VLIST[vnum].dataptr; msec= *dptr; break; case CDF_EPOCH : dptr=(double *)VLIST[vnum].dataptr; msec= *dptr; break; case CDF_EPOCH16 : dptr=(double *)VLIST[vnum].dataptr; msec= *dptr; break; case CDF_TIME_TT2000 : ierr=1; break; case CDF_INT8 : ierr=1; break; case CDF_INT4 : ierr=1; break; case CDF_UINT4 : ierr=1; break; case CDF_INT2 : ierr=1; break; case CDF_UINT2 : ierr=1; break; case CDF_BYTE : ierr=1; break; case CDF_CHAR : ierr=1; break; case CDF_UCHAR : ierr=1; break; default : ierr=1; break; } if (ierr == 0) *dval=msec; /* validate the msec value */ return(ierr); } /************************************************************************** * Get_BaseEpoch16 * **************************************************************************/ LONG Get_BaseEpoch16(dval) double *dval; { double dhour,dmin,dsec,dmsec,dasec,dnsec,dpsec,depoch; LONG lyear,lmonth,lday; LONG ierr = 0; /* Compute an Epoch time based of values contained in Epoch operands */ lyear = EpALG.operand[0]; lmonth = EpALG.operand[1]; lday = EpALG.operand[2]; dhour = (double)EpALG.operand[3]; dmin = (double)EpALG.operand[4]; dsec = (double)EpALG.operand[5]; dmsec = (double)EpALG.operand[6]; dasec = (double)EpALG.operand[7]; dnsec = (double)EpALG.operand[8]; dpsec = (double)EpALG.operand[9]; depoch = (double)julian_date(lyear,lmonth,lday) - 1721060; depoch = (depoch * 24.0) + dhour; depoch = (depoch * 60.0) + dmin; depoch = (depoch * 60.0) + dsec; *dval = depoch; *(dval+1) = dmsec * 1000000000.0 + dasec * 1000000.0 + dnsec * 1000.0 + dpsec; return(ierr); } /************************************************************************** * Compute_Epoch and/or Compute_BaseEpoch * **************************************************************************/ LONG Compute_Epoch(dval) double *dval; { double dhour,dmin,dsec,dmsec,depoch; LONG lyear,lmonth,lday; LONG ierr = 0; /* Compute an Epoch time based on variables contained in Epoch operands */ *dval = 0.0; /* initialize */ ierr = Get_Year(EpALG.operand[0],&lyear); if (ierr==0) ierr=Get_Month(EpALG.operand[1],&lmonth); if (ierr==0) ierr=Get_Day(EpALG.operand[2],&lday); if (ierr==0) { /* got y/m/d that work with juliandate */ if (lmonth == 0) Convert_DOY(lyear,&lmonth,&lday); ierr=Get_Hour(EpALG.operand[3],&dhour); if (ierr==0) ierr=Get_Minute(EpALG.operand[4],&dmin); if (ierr==0) ierr=Get_Second(EpALG.operand[5],&dsec); if (ierr==0) ierr=Get_MSecs(EpALG.operand[6],&dmsec); if (ierr==0) { /* got h/m/s/ms sans error */ depoch = (double)julian_date(lyear,lmonth,lday) - 1721060; depoch = (depoch * 24.0) + dhour; depoch = (depoch * 60.0) + dmin; depoch = (depoch * 60.0) + dsec; depoch = (depoch * 1000.0) + dmsec; *dval = depoch; /* set output value */ } } return(ierr); } /************************************************************************** * Compute_Epoch16 and/or Compute_BaseEpoch * **************************************************************************/ LONG Compute_Epoch16(dval) double *dval; { double dhour,dmin,dsec,dmsec,dasec,dnsec,dpsec,depoch; LONG lyear,lmonth,lday; LONG ierr = 0; /* Compute an Epoch time based on variables contained in Epoch operands */ *dval = 0.0; /* initialize */ ierr = Get_Year(EpALG.operand[0],&lyear); if (ierr==0) ierr=Get_Month(EpALG.operand[1],&lmonth); if (ierr==0) ierr=Get_Day(EpALG.operand[2],&lday); if (ierr==0) { /* got y/m/d that work with juliandate */ if (lmonth == 0) Convert_DOY(lyear,&lmonth,&lday); ierr=Get_Hour(EpALG.operand[3],&dhour); if (ierr==0) ierr=Get_Minute(EpALG.operand[4],&dmin); if (ierr==0) ierr=Get_Second(EpALG.operand[5],&dsec); if (ierr==0) ierr=Get_MSecs(EpALG.operand[6],&dmsec); if (ierr==0) ierr=Get_USecs(EpALG.operand[7],&dasec); if (ierr==0) ierr=Get_NSecs(EpALG.operand[8],&dnsec); if (ierr==0) ierr=Get_PSecs(EpALG.operand[9],&dpsec); if (ierr==0) { /* got h/m/s/ms sans error */ depoch = (double)julian_date(lyear,lmonth,lday) - 1721060; depoch = (depoch * 24.0) + dhour; depoch = (depoch * 60.0) + dmin; depoch = (depoch * 60.0) + dsec; depoch = (depoch * 1000.0) + dmsec; *dval = depoch; /* set output value */ *(dval+1) = dmsec * 1000000000.0 + dasec * 1000000.0 + dnsec * 1000.0 + dpsec; } } return(ierr); } /************************************************************************** * Compute_TT2000 and/or Compute_BaseEpoch * **************************************************************************/ LONG Compute_TT2000(dval) long long *dval; { double dhour,dmin,dsec,dmsec,dusec,dnsec; LONG lyear,lmonth,lday; LONG ierr = 0; int i, items; /* Compute an Epoch time based on variables contained in Epoch operands */ for (i = 8; i > 2; --i) if (EpALG.operand[i] > 0) { items = i + 1; break; } dhour = dmin = dsec = dmsec = dusec = dnsec = 0.0; *dval = 0.0; /* initialize */ ierr = Get_Year(EpALG.operand[0],&lyear); if (ierr==0) ierr=Get_Month(EpALG.operand[1],&lmonth); if (ierr==0) ierr=Get_Day(EpALG.operand[2],&lday); if (ierr==0) { /* got y/m/d that work with juliandate */ if (lmonth == 0) Convert_DOY(lyear,&lmonth,&lday); ierr=Get_Hour(EpALG.operand[3],&dhour); if (ierr==0) ierr=Get_Minute(EpALG.operand[4],&dmin); if (ierr==0) ierr=Get_Second(EpALG.operand[5],&dsec); if (ierr==0) ierr=Get_MSecs(EpALG.operand[6],&dmsec); if (ierr==0) ierr=Get_USecs(EpALG.operand[7],&dusec); if (ierr==0) ierr=Get_NSecs(EpALG.operand[8],&dnsec); if (ierr==0) { /* got h/m/s/ms/us/ns sans error */ if (items == 3) *dval = computeTT2000 (lyear, lmonth, lday, TT2000END); /* set output value */ else if (items == 4) *dval = computeTT2000 (lyear, lmonth, lday, dhour, TT2000END); /* set output value */ else if (items == 5) *dval = computeTT2000 (lyear, lmonth, lday, dhour, dmin, TT2000END); /* set output value */ else if (items == 6) *dval = computeTT2000 (lyear, lmonth, lday, dhour, dmin, dsec, TT2000END); /* set output value */ else if (items == 7) *dval = computeTT2000 (lyear, lmonth, lday, dhour, dmin, dsec, dmsec, TT2000END); /* set output value */ else if (items == 8) *dval = computeTT2000 (lyear, lmonth, lday, dhour, dmin, dsec, dmsec, dusec, TT2000END); /* set output value */ else if (items == 9) *dval = computeTT2000 (lyear, lmonth, lday, dhour, dmin, dsec, dmsec, dusec, dnsec); /* set output value */ } } return(ierr); } /************************************************************************** * Get_TT2000 * **************************************************************************/ LONG Get_TT2000(vnum, dval) LONG vnum; long long *dval; { LONG ierr=1; if (vnum == -1) { *dval=0LL; return(ierr); } switch (VLIST[vnum].cdfvartype) { case CDF_REAL4 : case CDF_FLOAT : case CDF_REAL8 : case CDF_DOUBLE: case CDF_EPOCH : case CDF_EPOCH16 : ierr=0; break; case CDF_TIME_TT2000 : *dval=*(long long *)VLIST[vnum].dataptr; ierr=0; break; case CDF_INT8 : case CDF_INT4 : case CDF_UINT4 : case CDF_INT2 : case CDF_UINT2 : case CDF_BYTE : case CDF_CHAR : case CDF_UCHAR : ierr=1; break; default : ierr=1; break; } return(ierr); } /************************************************************************** * Get_BaseEpoch * **************************************************************************/ LONG Get_BaseEpoch(dval) double *dval; { double dhour,dmin,dsec,dmsec,depoch; LONG lyear,lmonth,lday; LONG ierr = 0; /* Compute an Epoch time based of values contained in Epoch operands */ lyear = EpALG.operand[0]; lmonth = EpALG.operand[1]; lday = EpALG.operand[2]; dhour = (double)EpALG.operand[3]; dmin = (double)EpALG.operand[4]; dsec = (double)EpALG.operand[5]; dmsec = (double)EpALG.operand[6]; depoch = (double)julian_date(lyear,lmonth,lday) - 1721060; depoch = (depoch * 24.0) + dhour; depoch = (depoch * 60.0) + dmin; depoch = (depoch * 60.0) + dsec; depoch = (depoch * 1000.0) + dmsec; *dval = depoch; return(ierr); } /************************************************************************** * Compute_Epoch8 (Fractional day) * **************************************************************************/ LONG Compute_Epoch8(dval) double *dval; { double dhour,dmin,dsec,dmsec,depoch; LONG lyear,lmonth,lday; LONG year,month,day,hr,minute,sec,msec; double fracDOY,fod,fod_msecs; LONG ierr = 0; /* Compute an Epoch time based on variables contained in Epoch operands */ *dval = 0.0; /* initialize */ ierr = Get_Year(EpALG.operand[0],&lyear); lmonth = 0; if (ierr==0) ierr=Get_FracDOY(EpALG.operand[2],&fracDOY); lday = (int) fracDOY; fod = fracDOY - (double) lday; if (ierr==0) { /* got y/m/d that work with juliandate */ fod_msecs = fod * 86400000.; EPOCHbreakdown(fod_msecs,&year,&month,&day,&hr,&minute,&sec,&msec); if (lmonth == 0) Convert_DOY(lyear,&lmonth,&lday); if (ierr==0) { /* got h/m/s/ms sans error */ depoch = (double)julian_date(lyear,lmonth,lday) - 1721060; depoch = (depoch * 24.0) + (double) hr; depoch = (depoch * 60.0) + (double) minute; depoch = (depoch * 60.0) + (double) sec; depoch = (depoch * 1000.0) + (double) msec; *dval = depoch; /* set output value */ } } return(ierr); } /************************************************************************** * Compute_Epoch9 (Day count starts Jan. 1, 1950) * **************************************************************************/ LONG Compute_Epoch9(dval) double *dval; { double dhour,dmin,dsec,dmsec,depoch; LONG lyear,lmonth,lday; LONG ierr = 0; /* Compute an Epoch time based on variables contained in Epoch operands */ *dval = 0.0; /* initialize */ ierr=Get_Day(EpALG.operand[2],&lday); /*day 0 = Jan 1,1950*/ if (ierr==0) { /* got lday, which implies y and d that work with juliandate */ ierr=Get_Hour(EpALG.operand[3],&dhour); if (ierr==0) ierr=Get_Minute(EpALG.operand[4],&dmin); if (ierr==0) ierr=Get_Second(EpALG.operand[5],&dsec); if (ierr==0) ierr=Get_MSecs(EpALG.operand[6],&dmsec); if (ierr==0) { /* got h/m/s/ms sans error */ /* January 1, 1950 is Daycount 0 and Julian Day 2433283. */ depoch = 2433283 + lday - 1721060; /* depoch = (double)julian_date(1950,1,1) + lday - 1721060;*/ depoch = (depoch * 24.0) + dhour; depoch = (depoch * 60.0) + dmin; depoch = (depoch * 60.0) + dsec; depoch = (depoch * 1000.0) + dmsec; *dval = depoch; /* set output value */ } } return(ierr); } /************************************************************************** * Parse_Filename * **************************************************************************/ LONG Parse_Filename(fname) char *fname; { char ys[6],ms[6],ds[6],hs[6],mns[6],ss[6],mss[8],mas[8],nas[8],pis[8]; LONG i,lyear,lmonth,lday,lhour,lmin,lsec,lmsec,lasec, lnsec, lpsec, form[10]; double depoch; LONG ierr = 0; /* Compute Base Epoch from digit string embedded in input filename*/ /* initialize character substrings */ strcpy(ys,""); strcpy(ms,""); strcpy(ds,""); strcpy(hs,""); strcpy(mns,""); strcpy(ss,""); strcpy(mss,""); strcpy(mas,""); strcpy(nas,""); strcpy(pis,""); /* set format array based on format supplied by user */ /* July, 2000: Added operand[5] as # of digits in year, either 2 or 4 */ switch (EpALG.operand[9]) { case 0 : form[0]=EpALG.operand[5]; form[1]=2; form[2]=2; form[3]=0; form[4]=0; form[5]=0; form[6]=0; break; case 1 : form[0]=EpALG.operand[5]; form[1]=2; form[2]=2; form[3]=2; form[4]=0; form[5]=0; form[6]=0; break; case 2 : form[0]=EpALG.operand[5]; form[1]=2; form[2]=2; form[3]=2; form[4]=2; form[5]=0; form[6]=0; break; /* case 3 code didn't allow dd, but mm must be <=59. Replaced by case 11 */ case 4 : form[0]=EpALG.operand[5]; form[1]=0; form[2]=3; form[3]=0; form[4]=0; form[5]=0; form[6]=0; break; case 5 : form[0]=EpALG.operand[5]; form[1]=0; form[2]=3; form[3]=2; form[4]=0; form[5]=0; form[6]=0; break; case 6 : form[0]=EpALG.operand[5]; form[1]=0; form[2]=3; form[3]=2; form[4]=2; form[5]=0; form[6]=0; break; case 7 : form[0]=EpALG.operand[5]; form[1]=0; form[2]=3; form[3]=2; form[4]=2; form[5]=2; form[6]=0; break; /* case 8 code only allowed 4-digit msec of day. Replaced by case 9 */ case 9 : form[0]=EpALG.operand[5]; form[1]=0; form[2]=3; form[3]=0; form[4]=0; form[5]=0; form[6]=8; break; /* case 10 adds the format yy ddd sssss */ /* case 12 adds the format yy dd hh mm ss mss */ case 10 : form[0]=EpALG.operand[5]; form[1]=0; form[2]=3; form[3]=0; form[4]=0; form[5]=5; form[6]=0; break; case 11 : form[0]=EpALG.operand[5]; form[1]=2; form[2]=2; form[3]=2; form[4]=2; form[5]=2; form[6]=0; break; case 12 : form[0]=EpALG.operand[5]; form[1]=2; form[2]=2; form[3]=2; form[4]=2; form[5]=2; form[6]=3; break; case 13 : form[0]=EpALG.operand[5]; form[1]=2; form[2]=2; form[3]=2; form[4]=2; form[5]=2; form[6]=3; form[7]=3; form[8]=3; form[9]=3; break; case 14 : form[0]=EpALG.operand[5]; form[1]=2; form[2]=2; form[3]=2; form[4]=2; form[5]=2; form[6]=3; form[7]=3; form[8]=3; break; default: MSG_control(2,"ERROR: Unknown Filename Time format",0); MSG_control(2,"ERROR: Translation Aborted...",0); ierr=1; return(ierr); } /* Extract the substrings from the filename */ /* Skip over any leading non-time characters in filename */ for (i=0;i= 57) lyear = lyear + 1900; else lyear = lyear + 2000; } /* Calculate the epoch time from the time elements */ /* Allow yr, DOY, and seconds of day */ if((EpALG.operand[9] == 10)&&(lmsec == 0)) { lmsec = 1000 * lsec; lsec = 0; } depoch = computeEPOCH(lyear,lmonth,lday,lhour,lmin,lsec,lmsec); if (depoch == -1) { MSG_control(2,"ERROR: Illegal arguments sent to Compute Epoch",0); ierr = -1; } /* Set Base Epoch time */ EpALG.BaseEp = depoch; return(ierr); }