#include "makecdf.h" #define AT_LAST_SUBCYCLE 2 /* 09/2000 HKH Made numerous category changes (ERROR <--> WARNING) in messages, and in their numerical category. Condensed the messages sent at successful conclusion of CDF. Added version of SAMPEX source with "magnetospheric" instead of the incorrect "magnetic". */ /*********************************************************************/ /* STRIP 3CHARACTER SUFFIX FROM FILENAME */ /*********************************************************************/ void StripName (oldname,newname) char *oldname, *newname; { LONG length,i,j; char suffix[5] = ""; length=(LONG)strlen(oldname); if (length > 4) { for (i=0,j=length-4;i<4;i++,j++) suffix[i]=toupper(oldname[j]); suffix[4]='\0'; if ((strcmp(suffix,".CDF")==0)||(strcmp(suffix,".SKT")==0)) { for (i=0;i<(length-4);i++) newname[i] = oldname[i]; newname[i]='\0'; } else strcpy(newname,oldname); } else strcpy(newname,oldname); } /*********************************************************************/ /* Message Output */ /*********************************************************************/ /* 9/28/00 HKH Changed to call CDFerror with "cdfmessage", and add */ /* printing of "instring". */ void MSG_control(mtype,instring,status) LONG mtype; char *instring; CDFstatus status; { LONG nofeed=FALSE; LONG printit=FALSE; char cdfmessage[CDF_ERRTEXT_LEN+1]; char tempname[80]; if (strlen(instring) == 0) return; if ((mtype >= 0)&&(RPARMS.debug == TRUE)) printit=TRUE; else if ((mtype >= 1)&&(RPARMS.progress == TRUE)) printit=TRUE; else if ( mtype >= 2) printit=TRUE; if (printit == TRUE) { /* message passes output level test */ if (status != 0) { CDFerror (status,cdfmessage); if (cdfmessage[strlen(cdfmessage)-1] != 10) nofeed=TRUE; } if (RPARMS.sendtoterm == TRUE) { if (nofeed==TRUE) { if (status != 0) printf("%s\n",cdfmessage); printf("%s\n",instring); } else { if (status != 0) printf("%s",cdfmessage); printf("%s\n",instring); } } if ((RPARMS.sendtolog == TRUE)&&(LOGFILE.fptr == NULL)) { /* Construct new LOGFILE.fname from CDFname argument of makecdf command */ StripName(RPARMS.outcdfname,LOGFILE.fname); strcat(LOGFILE.fname,".log"); LOGFILE.fptr = fopen(LOGFILE.fname,"w"); if (LOGFILE.fptr == NULL) { RPARMS.sendtolog = FALSE; printf("ERROR: Unable to open log file for output. \n"); printf(" makeCDF execution continuing... \n"); } else { LOGFILE.nrecs = 0; if (LOGFILE.appendlog == 0) { fprintf(LOGFILE.fptr,"%s",IDENT.version); LOGFILE.nrecs++; } } } if ((RPARMS.sendtolog == TRUE)&&(LOGFILE.fptr != NULL)) { if (nofeed==TRUE) { if (status != 0) fprintf(LOGFILE.fptr,"%s\n",cdfmessage); fprintf(LOGFILE.fptr,"%s\n",instring); } else { if (status != 0) fprintf(LOGFILE.fptr,"%s",cdfmessage); fprintf(LOGFILE.fptr,"%s\n",instring); } LOGFILE.nrecs++; if (LOGFILE.nrecs > LOGFILE.maxrecs) { RPARMS.sendtolog = FALSE; /* fclose(LOGFILE.fptr); Now closed in main, at end of run. */ fprintf(LOGFILE.fptr,"%d %s\n", LOGFILE.maxrecs," rcrds max for this CDF's log."); LOGFILE.big = 1; /* Flag that we hit max lines. */ } } } } /**********************************************************************/ /* VALIDATE INPUT STRING AS ON OR OFF */ /**********************************************************************/ LONG Validate_BOOLEAN(instring) char *instring; { LONG i; LONG ival = -1; for (i=0;i<(LONG)strlen(instring);i++) instring[i]=toupper(instring[i]); if (strcmp(instring,"ON")==0) ival=1; else if (strcmp(instring,"TRUE")==0) ival=1; else if (strcmp(instring,"YES")==0) ival=1; else if (strcmp(instring,"T")==0) ival=1; else if (strcmp(instring,"Y")==0) ival=1; else if (strcmp(instring,"1")==0) ival=1; else if (strcmp(instring,"OFF")==0) ival=0; else if (strcmp(instring,"FALSE")==0) ival=0; else if (strcmp(instring,"NO")==0) ival=0; else if (strcmp(instring,"F")==0) ival=0; else if (strcmp(instring,"N")==0) ival=0; else if (strcmp(instring,"0")==0) ival=0; return(ival); } /**********************************************************************/ /* VALIDATE EOL FLAG */ /**********************************************************************/ LONG Validate_EOL(instring) char *instring; { LONG i; LONG ival = -1; for (i=0;i<(LONG)strlen(instring);i++) instring[i]=toupper(instring[i]); if (strcmp(instring,"ON")==0) ival=1; else if (strcmp(instring,"TRUE")==0) ival=1; else if (strcmp(instring,"YES")==0) ival=1; else if (strcmp(instring,"T")==0) ival=1; else if (strcmp(instring,"Y")==0) ival=1; else if (strcmp(instring,"1")==0) ival=1; else if (strcmp(instring,"OFF")==0) ival=0; else if (strcmp(instring,"FALSE")==0) ival=0; else if (strcmp(instring,"NO")==0) ival=0; else if (strcmp(instring,"F")==0) ival=0; else if (strcmp(instring,"N")==0) ival=0; else if (strcmp(instring,"0")==0) ival=0; /* Same as Validate boolean except add a test for the S type, which be used when the end-of-line which be at the last subcycle */ else if (strcmp(instring,"S")==0) ival=AT_LAST_SUBCYCLE; return(ival); } /**********************************************************************/ /* VALIDATE INPUT STRING AS POSITIVE INTEGER COULD BE MULTIPLE DIMENSIONS */ /**********************************************************************/ LONG Validate_SIZE(char *str, LONG *ndims, LONG *dim_sizes) { LONG i; LONG isize=0; LONG ierr = -1; char *savestart; char *savetmp; char *savestr; char tmp[20]; LONG index=0; int cnt; static char emes1[] = "ERROR: Validate_SIZE scan error in Size field in .ffd file, "; static char emes2a[] = "ERROR: non-numeric character ("; static char emes2b[] = ") detected in Size field in .ffd file, "; char mess[256]; savetmp = tmp; savestart = tmp; savestr = str; for (i=0; i<3; i++) dim_sizes[i]=0; /* Parse each character, until end-of-line or null-terminator found. comma is the expected delimeter and only non-numeric character to be allowed */ while (1) { if (*str == ',' || *str == '\n' || *str == '\0') { /* End-of line or field separator, null terminate that value */ *savetmp = '\0'; /* Make sure there is a value here */ if (strlen(savestart) > 0) { cnt=sscanf(savestart,"%d",&dim_sizes[index]); if (cnt == 0) { /* Something wrong with the field if cnt is 0 */ sprintf(mess,"%s\"%s\"",emes1,savestr); MSG_control(2,mess,0); *ndims = 0; return ierr; } /* This dimension complete, set the tmp buffer back to the beginning */ savetmp = savestart; index++; } /* If this was the end-of-line you're done or currently makecdf handles 3 dimensions you're done if more */ if ( *str != ',' || index > 2) break; } else if (*str != ' ') { /* If value is a digit, store it */ if(isdigit(*str)) *savetmp++ = *str; else { /* Non-numeric other that a comma, something wrong */ sprintf(mess,"%s%c%s\"%s\"",emes2a,*str,emes2b,savestr); MSG_control(2,mess,0); *ndims = 0; return ierr; } } str++; } /* index is a offset, set to proper dimensions, remember 3 is the max currently for makecdf */ if (index > 2) *ndims = 3; else *ndims = index; /* Calculate the total size of this variable in elements */ isize = 1; if (*ndims < 1 ) *ndims = 0; else for (i=0; i<*ndims; i++) isize *= dim_sizes[i]; /* Makecdf expects the total size to be returned */ return isize; } /**********************************************************************/ /* VALIDATE INPUT STRING AS POSITIVE INTEGER or zero */ /**********************************************************************/ LONG Validate_POSINT(instring) char *instring; { LONG i,ival; LONG ierr = -1; if (sscanf(instring,"%ld",&ival) == 0) return(ierr); else if (ival < 0) return(ierr); return(ival); } /**********************************************************************/ /* VALIDATE THAT FILLVAL MATCHES CDF TYPE */ /**********************************************************************/ double Validate_FILLVAL(instring, cdfvartype) char *instring; LONG cdfvartype; { double dval; LONG ierr = -1; if (sscanf(instring,"%lf",&dval) == 0) return(ierr); return(dval); } /**********************************************************************/ /* VALIDATE INPUT VARIABLE FORMAT STRING */ /**********************************************************************/ LONG Validate_FORMAT(instring, outstring, length, cdfvartype) char *instring; char *outstring; LONG *length; LONG *cdfvartype; { char ctype; char cwidth[10] = ""; LONG i,icount,iwidth,ival; LONG ierr = -1; ctype = *instring++; icount = sscanf(instring,"%ld",&iwidth); if (icount == 1) sprintf(cwidth,"%d",iwidth); if ((ctype=='l')||(ctype=='L')) { ctype='d'; *cdfvartype=CDF_INT8; } if ((ctype=='i')||(ctype=='I')) { ctype='d'; *cdfvartype=CDF_INT4; } else if ((ctype=='r')||(ctype=='R')) { ctype='f'; *cdfvartype=CDF_REAL4; } else if ((ctype=='f')||(ctype=='F')) { ctype='f'; *cdfvartype=CDF_REAL4; } else if ((ctype=='c')||(ctype=='C')) { ctype='c'; *cdfvartype=CDF_CHAR; } else if ((ctype=='s')||(ctype=='S')) { ctype='s'; *cdfvartype=CDF_CHAR; } else if (ctype =='0') { ctype='0'; *cdfvartype=CDF_CHAR; } /* check for double precision floating point */ if ((*cdfvartype == CDF_REAL4)&&(iwidth == 8)) *cdfvartype=CDF_REAL8; /* determine parsing format */ if (INFILE.format == 0) { /* freeform */ *outstring++ = ' '; *outstring++ = '%'; if (ctype=='c') { for (i=0;i= SRECSne+1) { MSG_control(0,"Adding new subrecord",0); SRECSne++; SRECS= realloc(SRECS,( sizeof(SRECSz)*SRECSne)); SRECS[SRECSne-1].nreps = inrep; SRECS[SRECSne-1].delta = (double)idelta; SRECS[SRECSne-1].countr = 0; } } } } } } else done=TRUE; } while (done == FALSE); /* >>>>>Commented out this line now handles GME data <<<<< */ /*VLIST[VLISTne-1].eol=1; last variable always has EOL flag */ return (ierr); } /**********************************************************************/ /* PREVIEW THE DESCRIPTION FILE */ /**********************************************************************/ LONG Preview_FFD() { FILE *file_ptr; LONG ierr=0; /* open file which contains the description of input data file */ file_ptr = fopen(RPARMS.ffdfname,"r"); if (file_ptr == NULL) { fclose(file_ptr); ierr=1; return(ierr); } ierr = Preview_RPARMS(file_ptr); fclose(file_ptr); return (ierr); } /**********************************************************************/ /* IMPORT THE DESCRIPTION FILE */ /**********************************************************************/ LONG Import_FFD() { FILE *file_ptr; LONG ierr=0; /* open file which contains the description of input data file */ file_ptr = fopen(RPARMS.ffdfname,"r"); if (file_ptr == NULL) { MSG_control(2,"ERROR: Unable to open input description file",0); MSG_control(2," Translation Aborted.",0); ierr=1; return(ierr); } ierr = Import_RPARMS(file_ptr); if (ierr == 0) { ierr = Import_INFILE(file_ptr); if (ierr == 0) { ierr = Import_EpALG(file_ptr); if (ierr == 0) { ierr = Import_Variables(file_ptr); } } } MSG_control(1,"Translation file input completed.",0); MSG_control(1," ",0); fclose(file_ptr); return (ierr); } /**********************************************************************/ /* DETERMINE SUBRECORD BOUNDARIES */ /**********************************************************************/ LONG SREC_Bounds(subrecno, firstvar, lastvar) LONG subrecno; LONG *firstvar; LONG *lastvar; { LONG i,j; LONG ierr=0; j= subrecno + 1; for (i=0;i 0) { /* elements still to be processed */ pflag = TRUE; /* process the element */ ecount[k] = ecount[k]-1; /* adjust the element counter */ } else { /* element count reached */ pflag = FALSE; /* no new element to process */ if (VLIST[k].eol != FALSE) rflag=FALSE; /* no element to read */ } if (VLIST[k].length == 0) rflag=FALSE; /* no element to read */ /* add new element to the ordered list */ OLISTne++; OLIST= realloc(OLIST,(sizeof(OLISTz)*OLISTne)); OLIST[OLISTne-1].vnum = k; OLIST[OLISTne-1].velem = rcount[k]-ecount[k]-1; OLIST[OLISTne-1].rflag = rflag; OLIST[OLISTne-1].pflag = pflag; } /* determine if eol should be added to olist */ addeol = FALSE; if (VLIST[k].eol == TRUE) addeol = TRUE; /* check rflag? */ if (VLIST[k].eol == AT_LAST_SUBCYCLE) { /* There should be eol but only at the last subcycle */ if (j == SRECS[i].nreps-1) addeol = TRUE; } else if ((k == (VLISTne-1))&&(ecount[k] == 0)) addeol = TRUE; if (addeol == TRUE) { /* add eol read to olist */ OLISTne++; OLIST = realloc(OLIST,(sizeof(OLISTz)*OLISTne)); OLIST[OLISTne-1].vnum = -1; OLIST[OLISTne-1].velem = 0; OLIST[OLISTne-1].rflag = TRUE; OLIST[OLISTne-1].pflag = FALSE; } if (ecount[k] > 0) done = FALSE; } } free(ecount); free(rcount); } } /* ordered list construction is complete.*/ if (RPARMS.progress == TRUE) { MSG_control(1,"Ordered List construction completed.",0); } if (RPARMS.debug == TRUE) { MSG_control(0,"------ ORDERED LIST -----",0); MSG_control(0," v# e# r p ",0); g=OLISTne-1; if (g > 200) { MSG_control(0,"WARNING: Only showing first 200 OLIST elements",0); g = 200; } for (i=0;i<=g;i++) { sprintf(LOGFILE.message,"%5d %5d %d %d \n", OLIST[i].vnum,OLIST[i].velem,OLIST[i].rflag,OLIST[i].pflag); MSG_control(0,LOGFILE.message,0); } } return(ierr); } /**********************************************************************/ /* DETERMINE IF INPUT CDF IS IN FORM OF CDF OR SKELETON TABLE */ /**********************************************************************/ LONG inCDFform (filename) char *filename; { char suffix[5] = ""; LONG length,i,j; LONG iform = 0; length=(LONG)strlen(filename); if (length >= 4) { for (i=0,j=length-4;i<4;i++,j++) suffix[i]=toupper(filename[j]); suffix[4]='\0'; if (strcmp(suffix,".CDF")==0) iform=1; else if (strcmp(suffix,".SKT")==0) iform=2; } if (iform==0) { MSG_control(2,"ERROR: Cannot determine if the input CDF is in the form",0); MSG_control(2," of a CDF or a skeleton table because of a missing",0); MSG_control(2," or unrecognized file extension. Recognized file ",0); MSG_control(2," extensions are .cdf and .skt.",0); } return(iform); } /**********************************************************************/ /* GENERATE CDF SKELETON TO BE POPULATED WITH INPUT DATA */ /**********************************************************************/ LONG Generate_CDFskeleton() { LONG iform,eNum,numrecs,allswell; LONG ierr=0; char tempname[80]; char command[120]; struct stat fs; CDFid id; CDFstatus status; iform = inCDFform(RPARMS.incdfname); if (iform == 2) { /* input cdf description is a skeleton table */ StripName(RPARMS.incdfname,tempname); StripName(RPARMS.outcdfname,RPARMS.outcdfname); #if defined (vms) if (fopen("auto.cdf","r") != NULL) { strcpy(command,"DELETE auto.cdf;*"); allswell = system(command); } strcpy(command," skeletoncdf /DELETE"); strcat(command,"/CDF="); #else #if defined (unix) if (fopen("auto.cdf","r") != NULL) { strcpy(command,"rm auto.cdf"); allswell = system(command); } strcpy(command,"$CDF_BIN/skeletoncdf "); strcat(command,"-cdf "); #else #if defined (WIN32) if (fopen("auto.cdf","r") != NULL) { strcpy(command,"rm auto.cdf"); allswell = system(command); } /* strcpy(command," %CDF_BASE%\\bin\\skeletoncdf "); */ /* strcat(command,"-cdf "); */ strcpy(command," skeletoncdf -cdf "); #endif #endif #endif strcat(command,RPARMS.outcdfname); strcat(command," "); strcat(command,tempname); strcat(command,""); MSG_control(1,"Creating empty CDF from skeleton table...",0); MSG_control(1,command,0); allswell=system(command); if (allswell != SYS_OK) { MSG_control(2,"ERROR: During creation of cdf from skeleton table",0); ierr=1; } } else if (iform == 1) { /* input cdf description is a CDF */ /* Determine the number of records in the CDF */ MSG_control(1,"Opening input CDF to determine empty or full...",0); allswell=FALSE; StripName(RPARMS.incdfname,tempname); StripName(RPARMS.outcdfname,RPARMS.outcdfname); status = CDFlib(OPEN_,CDF_,tempname,&id,NULL_); if (status < CDF_WARN) MSG_control(2,"CDFERROR:",status); /* "=" removed 9/00 */ else { MSG_control(0,"Getting the variable number of Epoch...",0); status = CDFlib(SELECT_, CDF_, id, GET_,zVAR_NUMBER_,"Epoch",&eNum,NULL_); if (status != CDF_OK) MSG_control(2,"CDFERROR:",status); else { MSG_control(0,"Getting the number of records for Epoch...",0); status = CDFlib(SELECT_, CDF_, id, zVAR_, eNum, GET_, zVARs_MAXREC_, &numrecs, NULL_); if (status != CDF_OK) MSG_control(2,"CDFERROR:",status); else { MSG_control(0,"Closing the input CDF...",0); status = CDFlib(CLOSE_, CDF_, NULL_); if (status != CDF_OK) MSG_control(2,"CDFERROR:",status); else allswell=TRUE; } } } if (allswell==TRUE) { if (numrecs == -1) { /* cdf is empty */ #if defined (vms) || defined (WIN32) strcpy(command,"copy "); #else #if defined (unix) strcpy(command,"cp "); #endif #endif /* was strcat(command,tempname) ;*/ /* Need to use the cdfname with extension to make copy */ strcat(command,RPARMS.incdfname); strcat(command," "); strcat(command,RPARMS.outcdfname); strcat (command,".cdf") ; /*HAL added need extension so later rename will work */ strcat(command,""); MSG_control(1,"Creating copy of empty cdf...",0); MSG_control(0,command,0); allswell=system(command); if (allswell != SYS_OK) { MSG_control(2,"ERROR: During creation of copy of empty cdf.",0); ierr=1; } } else { /* cdf is not empty */ #if defined (vms) strcpy(command,"skeletontable "); #else #if defined (unix) strcpy(command,"$CDF_BIN/skeletontable "); #else #if defined (WIN32) /* strcpy(command," %CDF_BASE%\\bin\\skeletontable "); */ strcpy(command," skeletontable "); #endif #endif #endif strcat(command,tempname); strcat(command," "); MSG_control(1,"Creating skeleton table from non-empty CDF...",0); MSG_control(1,command,0); allswell=system(command); if (allswell != SYS_OK) { MSG_control(2,"ERROR: During creation of skeleton table.",0); ierr=1; } else { #if defined (vms) strcpy(command,"skeletoncdf /CDF="); printf("***Only in VMS****\n"); #else #if defined (unix) strcpy(command, "$CDF_BIN/skeletoncdf -cdf "); #else #if defined (WIN32) /* strcpy(command, " %CDF_BASE%\\bin\\skeletoncdf -cdf "); */ strcpy(command, " skeletoncdf -cdf "); #endif #endif #endif strcat(command,RPARMS.outcdfname); strcat(command," "); strcat(command,tempname); strcat(command,""); MSG_control(1,"Creating cdf from skeleton table",0); MSG_control(0,command,0); allswell=system(command); if (allswell != SYS_OK) { MSG_control(2,"ERROR: During creation of cdf.",0); ierr=1; } } } } else ierr=1; } else { MSG_control(2,RPARMS.incdfname,0); MSG_control(2,"ERROR: Missing or unknown file extension.",0); MSG_control(2," Cannot determine form of input cdf description.",0); ierr=1; } return(ierr); } /**********************************************************************/ /* Determine CDF var#'s for input variables */ /**********************************************************************/ LONG Match_Variables() { CDFstatus status; char vname[40]; LONG i,itype,isize; LONG ierr=0; MSG_control(1,"Matching input variables to output CDF vars...",0); status = CDFlib(OPEN_,CDF_,RPARMS.outcdfname,&OUTCDF.outCDFid, SELECT_, CDF_zMODE_, zMODEon2, NULL_); if (status < CDF_WARN) { /* "=" removed 9/00 */ MSG_control(2,"CDFERROR:",status); ierr=1; return(ierr); } for (i=0;i 1 cdf variable */ VLIST[i].dataptr = VLIST[Last_True_Var].dataptr; } /* test allocation results */ if (VLIST[i].dataptr == NULL) { strcpy(LOGFILE.message,"ERROR: Unable to allocate data space for '"); strcat(LOGFILE.message,VLIST[i].vname); strcat(LOGFILE.message,"' variable. Unable to continue."); MSG_control(2,LOGFILE.message,0); ierr=1; return(ierr); } if (isize == 8) { Fix_Format(itype,VLIST[i].format,newform); strcpy(VLIST[i].format,newform); } } return(ierr); } /**********************************************************************/ /* Determine Size of Largest Input record in bytes */ /**********************************************************************/ LONG Determine_Bufsize() { LONG ibufsize=0; LONG imaxsize=0; LONG i,ilength,ipad; /* Determine the size of the input buffer by summing the lengths of */ /* all elements of the OLIST, which are bounded by EOL markers. */ for (i=0;i imaxsize) {imaxsize = ibufsize; ibufsize = 0;}*/ if (ibufsize > imaxsize) {imaxsize = ibufsize;} ibufsize = 0; } else { if (OLIST[i].rflag == TRUE) { /* only count bytes for readable data */ ilength = VLIST[(OLIST[i].vnum)].length; ipad=0; if (INFILE.format == 0) ipad=1; /* pad if freeform */ ibufsize= ibufsize + ilength + ipad; } } } if (INFILE.dtype == 0) ibufsize=ibufsize+2; /* bump up for text EOL */ if (ibufsize > imaxsize) imaxsize = ibufsize; return(imaxsize); } /**********************************************************************/ /* Read the next record from the input data file */ /**********************************************************************/ /* Return 0 = EOF found w/ no data in records Return 1 = Data record, EOF is possible */ int Read_Infile() { size_t nbytes; if (INFILE.dtype == 0) { /* input data file is text */ INFILE.bptr = INFILE.buffer; INFILE.buffer[0] = '\0'; INFILE.recnum = INFILE.recnum + 1; fgets(INFILE.buffer,INFILE.buflen,INFILE.fptr); sprintf(LOGFILE.message, "rec:%d length:%ld max:%d eof:%d ASCII\n", INFILE.recnum,(long)strlen(INFILE.buffer),INFILE.buflen,feof(INFILE.fptr)); MSG_control(0,LOGFILE.message,0); MSG_control(0,INFILE.buffer,0); if (feof(INFILE.fptr) && strlen(INFILE.buffer) == 0)return 0; } else { INFILE.buflen = Determine_Bufsize(); INFILE.bptr = INFILE.buffer; INFILE.recnum = INFILE.recnum + 1; nbytes=fread(INFILE.buffer,INFILE.buflen,1,INFILE.fptr); sprintf(LOGFILE.message, "rec:%d length:%ld max:%d eof:%d BINARY\n",INFILE.recnum,(long)nbytes, INFILE.buflen,feof(INFILE.fptr)); MSG_control(0,LOGFILE.message,0); if (feof(INFILE.fptr))return 0; } return 1; } /**********************************************************************/ /* Open the input file and allocate input buffer space */ /**********************************************************************/ LONG Open_Infile(ifile) LONG ifile; { LONG ierr=0; LONG ilength=0; LONG i; int status; INFILE.buflen = Determine_Bufsize(); INFILE.buffer = (char*)malloc(INFILE.buflen); INFILE.bptr = INFILE.buffer; if (INFILE.buffer == NULL) { MSG_control(2,"ERROR: Unable to allocate input buffer for reading file!",0); MSG_control(2," Unable to proceed with translation...",0); ierr=1; return(ierr); } /* construct name of next input data file from FLIST */ strcpy(RPARMS.infname,FLIST[ifile].Pathname); strcat(RPARMS.infname,FLIST[ifile].Filename); /* output a progress message */ strcpy(LOGFILE.message,"\nOpening Input File: "); strcat(LOGFILE.message,RPARMS.infname); MSG_control(2,LOGFILE.message,0); /* HKH 8/31/00 to make it always appear. */ /* open the file */ if (INFILE.dtype == 0) INFILE.fptr = fopen(RPARMS.infname,"r"); else INFILE.fptr = fopen(RPARMS.infname,"rb"); if (INFILE.fptr == NULL) { MSG_control(2,"ERROR: Unable to open input data file.",0); MSG_control(2," Unable to proceed with translation...",0); ierr=1; return(ierr); } else INFILE.recnum = 0; MSG_control(1,"Reading the input file...",0); status = Read_Infile(); if ( (LONG)*INFILE.buffer == 10) { MSG_control(1,"WARNING: Line Feed encountered at beginning of first",0); MSG_control(1," record of input file...Reading next record...",0); status = Read_Infile(); } return(ierr); } /**********************************************************************/ /* Freeform Scan the given variable from the input buffer */ /**********************************************************************/ LONG Parser1(vnum,velem) LONG vnum; LONG velem; { int icnt,ccnt,dcnt,icountr; INT16 *sptr; UINT16 *sptru; INT32 *lptr; UINT32 *lptru; float *fptr; double *dptr; long long *llptr; char *cptr,*bptr,tst[21]; char form[20],sval[20],tmpstr[40]; LONG idone=0; LONG icount=0; /* Count the number of delimiting characters at current point of inbuffer */ strncpy(tst,INFILE.bptr,20); for (bptr=INFILE.bptr,dcnt=0;*bptr==INFILE.delimiter;dcnt++,bptr++); INFILE.bptr = bptr; /* point to first character past delimiters */ /* set the format argument for the sscanf function */ strcpy(form,VLIST[vnum].format); strcat(form,"%n"); /* execute the sscanf function based on data type and update buffer ptr */ switch (VLIST[vnum].cdfvartype) { case CDF_REAL4 : fptr=(float *)VLIST[vnum].dataptr; fptr=fptr+velem; icnt=sscanf(INFILE.bptr,form,fptr,&ccnt); INFILE.bptr=INFILE.bptr+ccnt; break; case CDF_FLOAT : fptr=(float *)VLIST[vnum].dataptr; fptr=fptr+velem; icnt=sscanf(INFILE.bptr,form,fptr,&ccnt); INFILE.bptr=INFILE.bptr+ccnt; break; case CDF_REAL8 : dptr=(double *)VLIST[vnum].dataptr; dptr=dptr+velem; icnt=sscanf(INFILE.bptr,form,dptr,&ccnt); INFILE.bptr=INFILE.bptr+ccnt; break; case CDF_DOUBLE: dptr=(double *)VLIST[vnum].dataptr; dptr=dptr+velem; icnt=sscanf(INFILE.bptr,form,dptr,&ccnt); INFILE.bptr=INFILE.bptr+ccnt; break; case CDF_EPOCH : dptr=(double *)VLIST[vnum].dataptr; dptr=dptr+velem; icnt=sscanf(INFILE.bptr,form,VLIST[vnum].buffer,&ccnt); *dptr = *(double *) VLIST[vnum].buffer; INFILE.bptr=INFILE.bptr+ccnt; break; case CDF_EPOCH16 : dptr=(double *)VLIST[vnum].dataptr; dptr=dptr+2*velem; icnt=sscanf(INFILE.bptr,form,dptr,&ccnt); INFILE.bptr=INFILE.bptr+ccnt; break; case CDF_TIME_TT2000 : llptr=(long long *)VLIST[vnum].dataptr; llptr=llptr+velem; icnt=sscanf(INFILE.bptr,form,VLIST[vnum].buffer,&ccnt); *llptr = *(long long *) VLIST[vnum].buffer; INFILE.bptr=INFILE.bptr+ccnt; break; case CDF_INT8 : llptr=(long long *)VLIST[vnum].dataptr; llptr=llptr+velem; icnt=sscanf(INFILE.bptr,form,llptr,&ccnt); INFILE.bptr=INFILE.bptr+ccnt; break; case CDF_INT4 : lptr=(INT32 *)VLIST[vnum].dataptr; lptr=lptr+velem; icnt=sscanf(INFILE.bptr,form,lptr,&ccnt); INFILE.bptr=INFILE.bptr+ccnt; break; case CDF_UINT4 : lptru=(UINT32 *)VLIST[vnum].dataptr; lptru=lptru+velem; icnt=sscanf(INFILE.bptr,form,lptru,&ccnt); INFILE.bptr=INFILE.bptr+ccnt; break; case CDF_INT2 : sptr=(INT16 *)VLIST[vnum].dataptr; sptr=sptr+velem; strcpy(form,"%hd%n"); icnt=sscanf(INFILE.bptr,form,sptr,&ccnt); INFILE.bptr=INFILE.bptr+ccnt; break; case CDF_UINT2 : sptru=(UINT16 *)VLIST[vnum].dataptr; sptru=sptru+velem; strcpy(form,"%hd%n"); icnt=sscanf(INFILE.bptr,form,sptru,&ccnt); INFILE.bptr=INFILE.bptr+ccnt; break; case CDF_CHAR : if (VLIST[vnum].eol == FALSE) { icnt=sscanf(INFILE.bptr,form,VLIST[vnum].buffer,&ccnt); INFILE.bptr=INFILE.bptr+ccnt; } else { /* cannot just read using sscanf */ while (*INFILE.bptr == INFILE.delimiter) INFILE.bptr++; cptr=(char *)VLIST[vnum].buffer; while (idone == 0) { *cptr++ = *INFILE.bptr++; icount++; if (icount == VLIST[vnum].length) idone=1; if (*INFILE.bptr == '\n') idone=1; } strcat(VLIST[vnum].buffer,"\n"); icnt=1; /* success */ ccnt = icount; /* 7/25/00 added this line because no length was returned */ } break; case CDF_UCHAR : if (VLIST[vnum].eol == FALSE) { icnt=sscanf(INFILE.bptr,form,VLIST[vnum].buffer,&ccnt); INFILE.bptr=INFILE.bptr+ccnt; } else { /* cannot just read using sscanf */ while (*INFILE.bptr == INFILE.delimiter) INFILE.bptr++; cptr=(char *)VLIST[vnum].buffer; while (idone == 0) { *cptr++ = *INFILE.bptr++; icount++; if (icount == VLIST[vnum].length) idone=1; if (*INFILE.bptr == '\n') idone=1; } strcat(VLIST[vnum].buffer,"\n"); icnt=1; /* succcess */ ccnt = icount; /* 7/25/00 added this line because no length was returned */ } break; default : cptr=(char *)VLIST[vnum].dataptr; cptr=cptr+velem; icnt=sscanf(INFILE.bptr,form,cptr,&ccnt); INFILE.bptr=INFILE.bptr+ccnt; break; } if (icnt != 1) { icountr=0; sprintf(LOGFILE.message,"WARNING: Input record (%d) does not match expected format, skipping",INFILE.recnum); MSG_control(1,LOGFILE.message,0); strcpy(LOGFILE.message,"Parser1: Variable: "); strcat(LOGFILE.message,VLIST[vnum].vname); strcat(LOGFILE.message," Element#"); sprintf(sval,"%ld",(velem+1)); strcat(LOGFILE.message,sval); MSG_control(1,LOGFILE.message,0); } else { icountr = (LONG)ccnt; if (VLIST[vnum].ccount < icountr) VLIST[vnum].ccount=icountr; } return(icountr); } /**********************************************************************/ /* Fixedform ASCII Scan the given variable from the input buffer */ /**********************************************************************/ LONG Parser2(vnum,velem) LONG vnum; LONG velem; { int icnt,ccnt; INT16 *sptr; UINT16 *sptru; INT32 *lptr; UINT32 *lptru; float *fptr; double *dptr; char *cptr; long long *llptr; char form[20]; char sval[20]; char slen[10]; LONG icountr=0; /* construct format statement for move from infile buffer to var buffer */ icnt=sprintf(slen,"%ld",VLIST[vnum].length); strcpy(form,"%"); strcat(form,slen); strcat(form,"c%n"); /* move n-characters from input buffer into the variables buffer */ icnt=sscanf(INFILE.bptr,form,VLIST[vnum].buffer,&ccnt); INFILE.bptr=INFILE.bptr+ccnt; /* set the format argument for the sscanf function */ strcpy(form,VLIST[vnum].format); /* convert character data in the variable buffer */ switch (VLIST[vnum].cdfvartype) { case CDF_REAL4 : fptr=(float *)VLIST[vnum].dataptr; fptr=fptr+velem; icnt=sscanf(VLIST[vnum].buffer,form,fptr); break; case CDF_FLOAT : fptr=(float *)VLIST[vnum].dataptr; fptr=fptr+velem; icnt=sscanf(VLIST[vnum].buffer,form,fptr); break; case CDF_REAL8 : dptr=(double *)VLIST[vnum].dataptr; dptr=dptr+velem; icnt=sscanf(VLIST[vnum].buffer,form,dptr); break; case CDF_DOUBLE: dptr=(double *)VLIST[vnum].dataptr; dptr=dptr+velem; icnt=sscanf(VLIST[vnum].buffer,form,dptr); break; case CDF_EPOCH : dptr=(double *)VLIST[vnum].dataptr; dptr=dptr+velem; icnt=sscanf(VLIST[vnum].buffer,form,dptr); break; case CDF_EPOCH16 : dptr=(double *)VLIST[vnum].dataptr; dptr=dptr+2*velem; icnt=sscanf(VLIST[vnum].buffer,form,dptr); break; case CDF_INT8 : case CDF_TIME_TT2000: llptr=(long long *)VLIST[vnum].dataptr; llptr=llptr+velem; icnt=sscanf(VLIST[vnum].buffer,form,llptr); break; case CDF_INT4 : lptr=(INT32 *)VLIST[vnum].dataptr; lptr=lptr+velem; icnt=sscanf(VLIST[vnum].buffer,form,lptr); break; case CDF_UINT4 : lptru=(UINT32 *)VLIST[vnum].dataptr; lptru=lptru+velem; icnt=sscanf(VLIST[vnum].buffer,form,lptru); break; case CDF_INT2 : sptr=(INT16 *)VLIST[vnum].dataptr; sptr=sptr+velem; icnt=sscanf(VLIST[vnum].buffer,form,sptr); break; case CDF_UINT2 : sptru=(UINT16 *)VLIST[vnum].dataptr; sptru=sptru+velem; icnt=sscanf(VLIST[vnum].buffer,form,sptru); break; case CDF_CHAR : break; /* already moved */ case CDF_UCHAR : break; /* already moved */ default : cptr=(char *)VLIST[vnum].dataptr; cptr=cptr+velem; icnt=sscanf(VLIST[vnum].buffer,form,cptr); break; } if (icnt != 1) { icountr=0; sprintf(LOGFILE.message,"WARNING: Input record (%d) does not match expected format, skipping",INFILE.recnum); MSG_control(1,LOGFILE.message,0); strcpy(LOGFILE.message,"Parser2: Variable: "); strcat(LOGFILE.message,VLIST[vnum].vname); strcat(LOGFILE.message," Element#"); sprintf(sval,"%ld",(velem+1)); strcat(LOGFILE.message,sval); MSG_control(1,LOGFILE.message,0); } else if (VLIST[vnum].ccount < (LONG)ccnt) VLIST[vnum].ccount = (LONG) ccnt; return(icountr); } /**********************************************************************/ /* Fixedform BINARY Scan the given variable from the input buffer */ /**********************************************************************/ LONG Parser3(vnum,velem) LONG vnum; LONG velem; { CDFstatus status; LONG dpointer,offset; LONG One=1; LONG icnt=0; /* determine address for output of data conversion */ dpointer = (LONG)VLIST[vnum].dataptr; offset = VLIST[vnum].length * velem; dpointer = dpointer + offset; /* convert binary value in buffer to host format */ status = ConvertBuffer(INFILE.btype,HOST_ENCODING,NEGtoPOSfp0on, VLIST[vnum].cdfvartype,One, (void *)INFILE.bptr,(void *)dpointer); if (status != CDF_OK) { MSG_control(2,"ERROR:During binary data conversion to HOST=",status); } else icnt = VLIST[vnum].length; /* advance buffer pointer */ INFILE.bptr = INFILE.bptr + VLIST[vnum].length; return(icnt); } /************************************************************************/ /* Compare data values to existing min and max for the given variable */ /************************************************************************/ LONG AutoMinMax(vnum) LONG vnum; { INT16 *sptr,*sptr2,*sptr3; UINT16 *sptru,*sptr2u,*sptr3u; INT32 *lptr,*lptr2,*lptr3; UINT32 *lptru,*lptr2u,*lptr3u; float *fptr,*fptr2,*fptr3; double *dptr,*dptr2,*dptr3; long long *llptr,*llptr2,*llptr3; char *cptr; LONG velem,celem; LONG status=0; LONG ierr=0; /* Keep track of data min and max values */ switch (VLIST[vnum].cdfvartype) { case CDF_REAL4 : for (velem=0;velem < VLIST[vnum].nelems;velem++) { fptr=(float *)VLIST[vnum].dataptr; fptr=fptr+velem; celem=VLIST[vnum].clistnum; fptr2=(float *)CLIST[celem].vmin; fptr3=(float *)CLIST[celem].vmax; if ((CLIST[celem].flagone == 0)||(*fptr < *fptr2)) { *fptr2 = *fptr; CLIST[celem].flagone=1L; } if ((CLIST[celem].flagone == 0)||(*fptr > *fptr3)) { *fptr3 = *fptr; CLIST[celem].flagone=1L; } } break; case CDF_FLOAT : for (velem=0;velem < VLIST[vnum].nelems;velem++) { fptr=(float *)VLIST[vnum].dataptr; fptr=fptr+velem; celem=VLIST[vnum].clistnum; fptr2=(float *)CLIST[celem].vmin; fptr3=(float *)CLIST[celem].vmax; if ((CLIST[celem].flagone == 0)||(*fptr < *fptr2)) { *fptr2 = *fptr; CLIST[celem].flagone=1L; } if ((CLIST[celem].flagone == 0)||(*fptr > *fptr3)) { *fptr3 = *fptr; CLIST[celem].flagone=1L; } } break; case CDF_REAL8 : for (velem=0;velem < VLIST[vnum].nelems;velem++) { dptr=(double *)VLIST[vnum].dataptr; dptr=dptr+velem; celem=VLIST[vnum].clistnum; dptr2=(double *)CLIST[celem].vmin; dptr3=(double *)CLIST[celem].vmax; if ((CLIST[celem].flagone == 0)||(*dptr < *dptr2)) { *dptr2 = *dptr; CLIST[celem].flagone=1L; } if ((CLIST[celem].flagone == 0)||(*dptr > *dptr3)) { *dptr3 = *dptr; CLIST[celem].flagone=1L; } } break; case CDF_DOUBLE: for (velem=0;velem < VLIST[vnum].nelems;velem++) { dptr=(double *)VLIST[vnum].dataptr; dptr=dptr+velem; celem=VLIST[vnum].clistnum; dptr2=(double *)CLIST[celem].vmin; dptr3=(double *)CLIST[celem].vmax; if ((CLIST[celem].flagone == 0)||(*dptr < *dptr2)) { *dptr2 = *dptr; CLIST[celem].flagone=1L; } if ((CLIST[celem].flagone == 0)||(*dptr > *dptr3)) { *dptr3 = *dptr; CLIST[celem].flagone=1L; } } break; case CDF_EPOCH : for (velem=0;velem < VLIST[vnum].nelems;velem++) { dptr=(double *)VLIST[vnum].dataptr; dptr=dptr+velem; celem=VLIST[vnum].clistnum; dptr2=(double *)CLIST[celem].vmin; dptr3=(double *)CLIST[celem].vmax; if ((CLIST[celem].flagone == 0)||(*dptr < *dptr2)) { *dptr2 = *dptr; CLIST[celem].flagone=1L; } if ((CLIST[celem].flagone == 0)||(*dptr > *dptr3)) { *dptr3 = *dptr; CLIST[celem].flagone=1L; } } break; case CDF_EPOCH16 : for (velem=0;velem < VLIST[vnum].nelems;velem++) { dptr=(double *)VLIST[vnum].dataptr; dptr=dptr+2*velem; celem=VLIST[vnum].clistnum; dptr2=(double *)CLIST[celem].vmin; dptr3=(double *)CLIST[celem].vmax; if ((CLIST[celem].flagone == 0)||(*dptr < *dptr2)) { *dptr2 = *dptr; CLIST[celem].flagone=1L; } if ((CLIST[celem].flagone == 0)||(*dptr > *dptr3)) { *dptr3 = *dptr; CLIST[celem].flagone=1L; } } break; case CDF_INT8 : case CDF_TIME_TT2000 : for (velem=0;velem < VLIST[vnum].nelems;velem++) { llptr=(long long *)VLIST[vnum].dataptr; llptr=llptr+velem; celem=VLIST[vnum].clistnum; llptr2=(long long *)CLIST[celem].vmin; llptr3=(long long *)CLIST[celem].vmax; if ((CLIST[celem].flagone == 0)||(*llptr < *llptr2)) { *llptr2 = *llptr; CLIST[celem].flagone=1L; } if ((CLIST[celem].flagone == 0)||(*llptr > *llptr3)) { *llptr3 = *llptr; CLIST[celem].flagone=1L; } } break; case CDF_INT4 : for (velem=0;velem < VLIST[vnum].nelems;velem++) { lptr=(INT32 *)VLIST[vnum].dataptr; lptr=lptr+velem; celem=VLIST[vnum].clistnum; lptr2=(INT32 *)CLIST[celem].vmin; lptr3=(INT32 *)CLIST[celem].vmax; if ((CLIST[celem].flagone == 0)||(*lptr < *lptr2)) { *lptr2 = *lptr; CLIST[celem].flagone=1L; } if ((CLIST[celem].flagone == 0)||(*lptr > *lptr3)) { *lptr3 = *lptr; CLIST[celem].flagone=1L; } } break; case CDF_UINT4 : for (velem=0;velem < VLIST[vnum].nelems;velem++) { lptru=(UINT32 *)VLIST[vnum].dataptr; lptru=lptru+velem; celem=VLIST[vnum].clistnum; lptr2u=(UINT32 *)CLIST[celem].vmin; lptr3u=(UINT32 *)CLIST[celem].vmax; if ((CLIST[celem].flagone == 0)||(*lptru < *lptr2u)) { *lptr2u = *lptru; CLIST[celem].flagone=1L; } if ((CLIST[celem].flagone == 0)||(*lptru > *lptr3u)) { *lptr3u = *lptru; CLIST[celem].flagone=1L; } } break; case CDF_INT2 : for (velem=0;velem < VLIST[vnum].nelems;velem++) { sptr=(INT16 *)VLIST[vnum].dataptr; sptr=sptr+velem; celem=VLIST[vnum].clistnum; sptr2=(INT16 *)CLIST[celem].vmin; sptr3=(INT16 *)CLIST[celem].vmax; if ((CLIST[celem].flagone == 0)||(*sptr < *sptr2)) { *sptr2 = *sptr; CLIST[celem].flagone=1L; } if ((CLIST[celem].flagone == 0)||(*sptr > *sptr3)) { *sptr3 = *sptr; CLIST[celem].flagone=1L; } } break; case CDF_UINT2 : for (velem=0;velem < VLIST[vnum].nelems;velem++) { sptru=(UINT16 *)VLIST[vnum].dataptr; sptru=sptru+velem; celem=VLIST[vnum].clistnum; sptr2u=(UINT16 *)CLIST[celem].vmin; sptr3u=(UINT16 *)CLIST[celem].vmax; if ((CLIST[celem].flagone == 0)||(*sptru < *sptr2u)) { *sptr2u = *sptru; CLIST[celem].flagone=1L; } if ((CLIST[celem].flagone == 0)||(*sptru > *sptr3u)) { *sptr3u = *sptru; CLIST[celem].flagone=1L; } } break; case CDF_CHAR : MSG_control(1,"WARNING: char minmax checking TBD",status); break; case CDF_UCHAR : MSG_control(1,"WARNING: char minmax checking TBD",status); break; default : MSG_control(2,"ERROR: Unknown minmax vartype",status); } /* Keep track of the #characters in the LONGest valid string from INFILE */ celem = VLIST[vnum].clistnum; if (VLIST[vnum].ccount > CLIST[celem].ccount) { CLIST[celem].ccount=VLIST[vnum].ccount; } VLIST[vnum].ccount = 0; /* reset */ return(ierr); } /************************************************************************/ /* Replace all fill values identified by user with ISTP standard fill */ /************************************************************************/ LONG AutoFiller(vnum) LONG vnum; { INT16 *sptr; UINT16 *sptru; INT32 *lptr; UINT32 *lptru; float *fptr; double *dptr; long long *llptr; char *cptr; LONG velem; LONG status=0; LONG iflag=0; switch (VLIST[vnum].cdfvartype) { case CDF_REAL4 : for (velem=0;velem < VLIST[vnum].nelems;velem++) { fptr=(float *)VLIST[vnum].dataptr; fptr=fptr+velem; if (*fptr==(float)VLIST[vnum].fillval) { *fptr = -1.0e31; iflag=1L; } } break; case CDF_FLOAT : for (velem=0;velem < VLIST[vnum].nelems;velem++) { fptr=(float *)VLIST[vnum].dataptr; fptr=fptr+velem; if (*fptr==(float)VLIST[vnum].fillval) { *fptr = -1.0e31; iflag=1L; } } break; case CDF_REAL8 : for (velem=0;velem < VLIST[vnum].nelems;velem++) { dptr=(double *)VLIST[vnum].dataptr; dptr=dptr+velem; if (*dptr==VLIST[vnum].fillval) { *dptr = -1.0e31; iflag=1L; } } break; case CDF_DOUBLE: for (velem=0;velem < VLIST[vnum].nelems;velem++) { dptr=(double *)VLIST[vnum].dataptr; dptr=dptr+velem; if (*dptr==VLIST[vnum].fillval) { *dptr = -1.0e31; iflag=1L; } } break; case CDF_EPOCH : for (velem=0;velem < VLIST[vnum].nelems;velem++) { dptr=(double *)VLIST[vnum].dataptr; dptr=dptr+velem; if (*dptr==VLIST[vnum].fillval) { *dptr = -1.0e31; iflag=1L; } } break; case CDF_EPOCH16 : for (velem=0;velem < VLIST[vnum].nelems;velem++) { dptr=(double *)VLIST[vnum].dataptr; dptr=dptr+2*velem; if (*dptr==VLIST[vnum].fillval) { *dptr = -1.0e31; *(dptr+1) = -1.0e31; iflag=1L; } } break; case CDF_TIME_TT2000 : for (velem=0;velem < VLIST[vnum].nelems;velem++) { llptr=(long long *)VLIST[vnum].dataptr; llptr=llptr+velem; if (*llptr==(long long)VLIST[vnum].fillval) { *llptr = FILLED_TT2000_VALUE; iflag=1L; } } break; case CDF_INT8 : for (velem=0;velem < VLIST[vnum].nelems;velem++) { llptr=(long long *)VLIST[vnum].dataptr; llptr=llptr+velem; if (*llptr==(long long)VLIST[vnum].fillval) { *llptr = -9223372036854775807LL-1; iflag=1L; } } break; case CDF_INT4 : for (velem=0;velem < VLIST[vnum].nelems;velem++) { lptr=(INT32 *)VLIST[vnum].dataptr; lptr=lptr+velem; if (*lptr==(INT32)VLIST[vnum].fillval) { *lptr = -2147483648; iflag=1L; } } break; case CDF_UINT4 : for (velem=0;velem < VLIST[vnum].nelems;velem++) { lptru=(UINT32 *)VLIST[vnum].dataptr; lptru=lptru+velem; if (*lptru==(UINT32)VLIST[vnum].fillval) { *lptru = -2147483648; iflag=1L; } } break; case CDF_INT2 : for (velem=0;velem < VLIST[vnum].nelems;velem++) { sptr=(INT16 *)VLIST[vnum].dataptr; sptr=sptr+velem; if (*sptr==(INT16)VLIST[vnum].fillval) { *sptr = -32768; iflag=1L; } } break; case CDF_UINT2 : for (velem=0;velem < VLIST[vnum].nelems;velem++) { sptru=(UINT16 *)VLIST[vnum].dataptr; sptru=sptru+velem; if (*sptru==(UINT16)VLIST[vnum].fillval) { *sptru = -32768; iflag=1L; } } break; case CDF_CHAR : MSG_control(1,"WARNING: char fillval checking TBD",status); break; case CDF_UCHAR : MSG_control(1,"WARNING: char fillval checking TBD",status); break; default : MSG_control(2,"ERROR: Unknown fillval vartype",status); } /* If any data is filler, then reset the character counter, so that */ /* the max field size is not set by any fill data, only non-fill. */ if (iflag == 1L) VLIST[vnum].ccount = 0L; return(iflag); } /************************************************************************/ /* Determine the FORMAT of the identified variable */ /************************************************************************/ LONG AutoFormat(vnum,form) LONG vnum; char *form; { double dnum1,dnum2; double dnum11,dnum21; double *dptr1,*dptr2; long long llnum1,llnum2; long long *llptr1,*llptr2; float fnum1,fnum2; float *fptr1,*fptr2; LONG cnum,d,s; LONG ierr=0; char slen[10]=""; char flen[10]=""; cnum = VLIST[vnum].clistnum; switch (VLIST[vnum].cdfvartype) { case CDF_REAL4 : fptr1 = (float *)CLIST[cnum].vmax; fnum1 = *fptr1; fptr2 = (float *)CLIST[cnum].vmin; fnum2 = *fptr2; dnum1 = fabs((double)fnum1); dnum2 = fabs((double)fnum2); if (dnum2 > dnum1) { if (fnum2 < 0.0) s=1L; else s=0L; dnum1 = dnum2; } else if (fnum1 < 0.0) s=1L; else s=0L; for (d=0;dnum1 >= 1.0;d++) dnum1 = dnum1 / 10.0; sprintf(slen,"%ld",CLIST[cnum].ccount); sprintf(flen,"%ld",CLIST[cnum].ccount - 1 - d - s); strcpy(form,"F"); strcat(form,slen); strcat(form,"."); strcat(form,flen); break; case CDF_FLOAT : fptr1 = (float *)CLIST[cnum].vmax; fnum1 = *fptr1; fptr2 = (float *)CLIST[cnum].vmin; fnum2 = *fptr2; dnum1 = fabs((double)fnum1); dnum2 = fabs((double)fnum2); if (dnum2 > dnum1) { if (fnum2 < 0.0) s=1L; else s=0L; dnum1 = dnum2; } else if (fnum1 < 0.0) s=1L; else s=0L; for (d=0;dnum1 >= 1.0;d++) dnum1 = dnum1 / 10.0; sprintf(slen,"%ld",CLIST[cnum].ccount); sprintf(flen,"%ld",CLIST[cnum].ccount - 1 - d); strcpy(form,"F"); strcat(form,slen); strcat(form,"."); strcat(form,flen); break; case CDF_REAL8 : dptr1 = (double *)CLIST[cnum].vmax; dnum1 = *dptr1; dptr2 = (double *)CLIST[cnum].vmin; dnum2 = *dptr2; dnum1 = fabs(dnum1); dnum2 = fabs(dnum2); if (dnum2 > dnum1) { if (dnum2 < 0.0) s=1L; else s=0L; dnum1 = dnum2; } else if (dnum1 < 0.0) s=1L; else s=0L; for (d=0;dnum1 >= 1.0;d++) dnum1 = dnum1 / 10.0; sprintf(slen,"%ld",CLIST[cnum].ccount); sprintf(flen,"%ld",CLIST[cnum].ccount - 1 - d); strcpy(form,"F"); strcat(form,slen); strcat(form,"."); strcat(form,flen); break; case CDF_DOUBLE: dptr1 = (double *)CLIST[cnum].vmax; dnum1 = *dptr1; dptr2 = (double *)CLIST[cnum].vmin; dnum2 = *dptr2; dnum1 = fabs(dnum1); dnum2 = fabs(dnum2); if (dnum2 > dnum1) { if (dnum2 < 0.0) s=1L; else s=0L; dnum1 = dnum2; } else if (dnum1 < 0.0) s=1L; else s=0L; for (d=0;dnum1 >= 1.0;d++) dnum1 = dnum1 / 10.0; sprintf(slen,"%ld",CLIST[cnum].ccount); sprintf(flen,"%ld",CLIST[cnum].ccount - 1 - d); strcpy(form,"F"); strcat(form,slen); strcat(form,"."); strcat(form,flen); break; case CDF_EPOCH : dptr1 = (double *)CLIST[cnum].vmax; dnum1 = *dptr1; dptr2 = (double *)CLIST[cnum].vmin; dnum2 = *dptr2; dnum1 = fabs(dnum1); dnum2 = fabs(dnum2); if (dnum2 > dnum1) { if (dnum2 < 0.0) s=1L; else s=0L; dnum1 = dnum2; } else if (dnum1 < 0.0) s=1L; else s=0L; for (d=0;dnum1 >= 1.0;d++) dnum1 = dnum1 / 10.0; sprintf(slen,"%ld",CLIST[cnum].ccount); sprintf(flen,"%ld",CLIST[cnum].ccount - 1 - d); strcpy(form,"F"); strcat(form,slen); strcat(form,"."); strcat(form,flen); break; case CDF_EPOCH16 : dptr1 = (double *)CLIST[cnum].vmax; dnum1 = *dptr1; dnum11 = *(dptr1+1); dptr2 = (double *)CLIST[cnum].vmin; dnum2 = *dptr2; dnum21 = *(dptr2+1); dnum1 = fabs(dnum1); dnum2 = fabs(dnum2); if (dnum2 > dnum1) { if (dnum2 < 0.0) s=1L; else s=0L; dnum1 = dnum2; } else if (dnum1 < 0.0) s=1L; else s=0L; for (d=0;dnum1 >= 1.0;d++) dnum1 = dnum1 / 10.0; sprintf(slen,"%ld",CLIST[cnum].ccount); sprintf(flen,"%ld",CLIST[cnum].ccount - 1 - d); strcpy(form,"F"); strcat(form,slen); strcat(form,"."); strcat(form,flen); break; case CDF_TIME_TT2000 : sprintf(slen,"%ld",CLIST[cnum].ccount); strcpy(form,"L"); strcat(form,slen); break; case CDF_INT8 : sprintf(slen,"%ld",CLIST[cnum].ccount); strcpy(form,"L"); strcat(form,slen); break; case CDF_INT4 : sprintf(slen,"%ld",CLIST[cnum].ccount); strcpy(form,"I"); strcat(form,slen); break; case CDF_UINT4 : sprintf(slen,"%ld",CLIST[cnum].ccount); strcpy(form,"I"); strcat(form,slen); break; case CDF_INT2 : sprintf(slen,"%ld",CLIST[cnum].ccount); strcpy(form,"I"); strcat(form,slen); break; case CDF_UINT2 : sprintf(slen,"%ld",CLIST[cnum].ccount); strcpy(form,"I"); strcat(form,slen); break; case CDF_BYTE : sprintf(slen,"%ld",CLIST[cnum].ccount); strcpy(form,"I"); strcat(form,slen); break; case CDF_CHAR : MSG_control(2, "WARNING: No auto formatting of CHAR data\n",0); break; case CDF_UCHAR : MSG_control(2, "WARNING: No auto formatting of UCHAR data\n",0); break; default : MSG_control(2, "ERROR: Unknown data type in autoformatter\n",0); } return(ierr); } /**********************************************************************/ /* Close all open files and free all allocated buffer space */ /**********************************************************************/ LONG Cleanup_makeCDF(ifile) LONG ifile; { CDFid id; CDFstatus status; char scnt[20]=""; LONG i; LONG ierr=0; /* free data space used for the ordered variable list */ free(OLIST); OLISTne=0L; OLIST=NULL; /* close output cdf file */ if (OUTCDF.outCDFid != 0) { sprintf(scnt,"%ld",(OUTCDF.CDFrec+1)); strcpy(LOGFILE.message,"Wrote "); strcat(LOGFILE.message,scnt); strcat(LOGFILE.message," records out to "); strcat(LOGFILE.message,RPARMS.outcdfname); strcat(LOGFILE.message,".cdf."); /* Write the msg in main, after possible addition by Autonamer */ /* MSG_control(2,LOGFILE.message,0); HKH 8/31/00 Chng 1 to 2: always print*/ status=CDFlib(CLOSE_,CDF_,OUTCDF.outCDFid,NULL_); OUTCDF.outCDFid=0L; } /* reset first epoch value and Base time value to zero. */ EpALG.FirstEp = 0.0; EpALG.BaseEp = 0.0; EpALG.FirstTT = 0; EpALG.BaseTT = 0; if (ifile == FLISTne-1) { /* total termination */ /* close input file and free allocated buffer space */ free(INFILE.buffer); if (INFILE.fptr != NULL) fclose(INFILE.fptr); /* free data space allocated for variables */ for (i=0;i= CDF_WARN) { OUTCDF.outCDFid = id; OUTCDF.CDFrec = -1L; } else { MSG_control(2,"CDFERROR:",status); ierr = 1; } status = CDFlib(GET_,CDF_ENCODING_,&OUTCDF.encoding,NULL_); if (status != CDF_OK) { MSG_control(2,"ERROR: Unable to determine CDF encoding",status); ierr=1; } else { /* confirm NETWORK encoding format as ISTP guideline */ if (OUTCDF.encoding != NETWORK_ENCODING) { MSG_control(1,"WARNING:Output CDF encoding is not NETWORK ",0); MSG_control(1," ISTP guidelines require NETWORK encoding",0); MSG_control(1," Processing continuing ...",0); } } return(ierr); } /**********************************************************************/ /* Write Epoch value to output CDF */ /**********************************************************************/ LONG WriteEpochToCDF (depoch, CDFrec) void *depoch; LONG CDFrec; { CDFstatus status; LONG ierr=0; status = CDFlib(SELECT_,zVAR_,EpALG.Epvarnum, zVAR_RECNUMBER_,CDFrec, PUT_,zVAR_DATA_,depoch,NULL_); if (status != CDF_OK) { MSG_control(2,"ERROR: while writing epoch value to cdf.",status); ierr=1; } return(ierr); } /**********************************************************************/ /* Write data to output CDF */ /**********************************************************************/ LONG WriteToCDF (vnum, CDFrec) LONG vnum; LONG CDFrec; { CDFstatus status; char vstring[20]; LONG ierr=0; if (VLIST[vnum].cdfvartype != CDF_CHAR) { if (VLIST[vnum].Elem[0] == -1L) { status = CDFlib(SELECT_,zVARs_RECNUMBER_,CDFrec, PUT_,zVARs_RECDATA_,1,&VLIST[vnum].cdfvarnum, VLIST[vnum].dataptr,NULL_); } else { if (VLIST[vnum].Elem[1] == -1L) { /* only one index */ status = CDFlib(SELECT_,zVARs_RECNUMBER_,CDFrec, zVAR_,VLIST[vnum].cdfvarnum, zVAR_DIMINDICES_,&VLIST[vnum].Elem[0], PUT_, zVAR_DATA_,VLIST[vnum].dataptr,NULL_); } else { /* both element indices being used */ status = CDFlib(SELECT_,zVARs_RECNUMBER_,CDFrec, zVAR_,VLIST[vnum].cdfvarnum, zVAR_DIMINDICES_,VLIST[vnum].Elem, PUT_, zVAR_DATA_,VLIST[vnum].dataptr,NULL_); } } } else { /* character data */ if (VLIST[vnum].Elem[0] == -1L) { status = CDFlib(SELECT_,zVARs_RECNUMBER_,CDFrec, PUT_,zVARs_RECDATA_,1,&VLIST[vnum].cdfvarnum, VLIST[vnum].buffer,NULL_); } else { status = CDFlib(SELECT_,zVARs_RECNUMBER_,CDFrec, zVAR_,VLIST[vnum].cdfvarnum, zVAR_DIMINDICES_,VLIST[vnum].Elem, PUT_, zVAR_DATA_,VLIST[vnum].buffer,NULL_); } } if (status != CDF_OK) { strcpy(LOGFILE.message,"ERROR: while writing variable #"); sprintf(vstring,"%d",vnum); strcat(vstring," to the cdf"); strcat(LOGFILE.message,vstring); MSG_control(2,LOGFILE.message,status); ierr=1; } return(ierr); } /*********************************************************************** * GENERATE THE LFILEID VALUE * ***********************************************************************/ LONG Generate_LFILEID(lfileid) char *lfileid; /* Mod 10-00 HKH To use "Logical_file_id" from CDF if it is present. */ /* If not present, construct it if possible. */ { LONG i,scope,ne,lyear,lmon,lday,lhour,lmin,lsec,lmsec,ldoy,jd,yd; LONG lusc,lnsc; LONG logsrc=0; LONG logicid,k; CDFstatus status; time_t current_time; struct tm *ptrtime; double depoch; long long llepoch; char source[80]=""; char sabbr[10]=""; char type[80]=""; char desc[80]=""; char version[10]=""; char datestr[20]=""; char logsource[80]=""; char logicfileid[80]=""; char logfileid[80]=""; char logic_sn[80]=""; char logic_dt[80]=""; char logic_des[80]=""; char logic_time[80]=""; char logic_dv[80]=""; char newname[80]=""; char comp1[3]=""; char comp2[3]=""; char *start; LONG ierr=0; /* If "Logical_file_id" exists in CDF, retrieve it */ LONG log_id = 0; LONG versionflag=0; LONG log_sn=0; LONG log_dt=0; LONG log_des=0; LONG log_time=0; LONG log_dv=0; LONG nabbr; LONG ntype; LONG ndesc; start = lfileid; /* save argument (pointer) */ status=CDFlib(SELECT_,ATTR_NAME_,"Logical_file_id", SELECT_,gENTRY_,0, GET_,ATTR_SCOPE_,&scope, GET_,gENTRY_NUMELEMS_,&ne, GET_,gENTRY_DATA_,logfileid,NULL_); if ((status == CDF_OK)&&(scope == GLOBAL_SCOPE)) { logfileid[ne] = '\0'; /* insert string terminator */ log_id = 1; sprintf(LOGFILE.message,"Logical_file_id from gATTr: %s\n",logfileid); MSG_control(0,LOGFILE.message,0); /* Parse the string into elements separated by "_". Call these logic_sn, logic_dt, logic_des, logic_time, and logic_dv. If logic_time is absent, that's OK (it can be filled from timestring later). */ i=0; k=0; while ((logfileid[i]!='_')&&(i 0)&& (VLIST[vnum].cdfvarnum >= 0)&& (CLIST[cnum].flagone > 0 )) { /* Put the validmin and validmax values into the vattr */ status=CDFlib(SELECT_,ATTR_NAME_,"VALIDMIN", zENTRY_,VLIST[vnum].cdfvarnum, PUT_, zENTRY_DATA_,VLIST[vnum].cdfvartype,1, CLIST[cnum].vmin,NULL_); if (status != CDF_OK) { strcpy(LOGFILE.message, "ERROR: Can't write VALIDMIN to CDF; attr must first exist in skeleton."); MSG_control(2,LOGFILE.message,status); ierr=1; } status=CDFlib(SELECT_,ATTR_NAME_,"VALIDMAX", zENTRY_,VLIST[vnum].cdfvarnum, PUT_, zENTRY_DATA_,VLIST[vnum].cdfvartype,1, CLIST[cnum].vmax,NULL_); if (status != CDF_OK) { strcpy(LOGFILE.message, "ERROR: Can't write VALIDMAX to CDF; attr must first exist in skeleton."); MSG_control(2,LOGFILE.message,status); ierr=1; } } /* Determine if scalemin and scalemax vattrs should be set */ if ((VLIST[vnum].autoscales > 0)&& (VLIST[vnum].cdfvarnum >= 0)&& (CLIST[cnum].flagone > 0 )) { /* Put the scalemin and scalemax values into the vattr */ status=CDFlib(SELECT_,ATTR_NAME_,"SCALEMIN", zENTRY_,VLIST[vnum].cdfvarnum, PUT_, zENTRY_DATA_,VLIST[vnum].cdfvartype,1, CLIST[cnum].vmin,NULL_); if (status != CDF_OK) { strcpy(LOGFILE.message, "ERROR: Can't write SCALEMIN to CDF; attr must first exist in skeleton."); MSG_control(2,LOGFILE.message,status); ierr=1; } status=CDFlib(SELECT_,ATTR_NAME_,"SCALEMAX", zENTRY_,VLIST[vnum].cdfvarnum, PUT_, zENTRY_DATA_,VLIST[vnum].cdfvartype,1, CLIST[cnum].vmax,NULL_); if (status != CDF_OK) { strcpy(LOGFILE.message, "ERROR: Can't write SCALEMAX to CDF; attr must first exist in skeleton."); MSG_control(2,LOGFILE.message,status); ierr=1; } } /* Determine if FORMAT vattrs should be set */ if ((VLIST[vnum].autoformat > 0)&& (VLIST[vnum].cdfvarnum >= 0)&& (CLIST[cnum].ccount > 0 )) { strcpy(form,""); /* initialize the format */ ierr = AutoFormat(vnum,form); /* determine format */ if (ierr == 0) { status=CDFlib(SELECT_,ATTR_NAME_,"FORMAT", zENTRY_,VLIST[vnum].cdfvarnum, PUT_, zENTRY_DATA_,CDF_CHAR,strlen(form),form,NULL_); if (status != CDF_OK) { strcpy(LOGFILE.message, "ERROR: Can't write FORMAT to CDF; attr must first exist in skeleton."); MSG_control(2,LOGFILE.message,status); ierr=1; } } } } /* for each variable */ return(ierr); } /*********************************************************************** * ABBREVIATE THE SPACECRAFT NAME * ***********************************************************************/ LONG AbbrSCname (source, abbr) char *source, *abbr; { LONG ierr=0; memcpy(abbr,source,2); strcat(abbr,""); if (strcmp(source,"SAMPEX>Solar Anomalous Magnetic Particle Explorer")==0) strcpy(abbr,"SX>"); if (strcmp(source,"SAMPEX>Solar Anomalous Magnetospheric Particle Explorer")==0) strcpy(abbr,"SX>"); /*Added to catch both name versions. This one correct.*/ if (strcmp(source,"GEOTAIL>Geomagnetic Tail")==0) strcpy(abbr,"GE>"); if (strcmp(source,"WIND>Wind Interplanetary Plasma Laboratory")==0) strcpy(abbr,"WI>"); if (strcmp(source,"POLAR>Polar Plasma Laboratory")==0) strcpy(abbr,"PO>"); if (strcmp(source,"SOHO>Solar Heliospheric Observatory")==0) strcpy(abbr,"SO>"); if (strcmp(source,"DARN>Dual Auroral Radar Network")==0) strcpy(abbr,"DN>"); if (strcmp(source, "SESAME>Satellite Exploration Simultaneous with Antarctic Measurements") ==0) strcpy(abbr,"SE>"); if (strcmp(source,"SONDRESTROM>Sondrestrom Incoherent-Scatter Radar")==0) strcpy(abbr,"SN>"); if (strcmp(source, "CANOPUS>Canadian Auroral Network Open Program Unified Study")==0) strcpy(abbr,"CN>"); if (strcmp(source,"IMP-8>Interplanetary Monitoring Platform 8")==0) strcpy(abbr,"I8>"); if (strcmp(source,"INTERBALL-AURORAL>Interball Auroral Probe")==0) strcpy(abbr,"IA>"); if (strcmp(source,"INTERBALL-TAIL>Interball auroralprobe")==0) strcpy(abbr,"IA>"); /* Fixes erroneous early version */ if (strcmp(source,"INTERBALL-TAIL>Interball Tail Probe")==0) strcpy(abbr,"IT>"); if (strcmp(source,"LANL1989>")==0) strcpy(abbr,"L9>"); if (strcmp(source,"LANL1990>")==0) strcpy(abbr,"L0>"); if (strcmp(source,"LANL1991>")==0) strcpy(abbr,"L1>"); if (strcmp(source,"GOES6>Geostationary Operational Environment Satellite")==0) strcpy(abbr,"G6>"); if (strcmp(source,"GOES7>Geostationary Operational Environment Satellite")==0) strcpy(abbr,"G7>"); if (strcmp(source,"GOES8>Geostationary Operational Environment Satellite")==0) strcpy(abbr,"G8>"); if (strcmp(source,"GOES9>Geostationary Operational Environment Satellite")==0) strcpy(abbr,"G9>"); if (strcmp(source, "STELAB>Solar-Terrestrial Environment Laboratory, Nagoya U.")==0) strcpy(abbr,"SL>"); if (strcmp(source, "ISIS-1>International Satellite for Ionosphere Studies 1")==0) strcpy(abbr,"I1>"); if (strcmp(source, "ISIS-2>International Satellite for Ionosphere Studies 2")==0) strcpy(abbr,"I2>"); if (strcmp(source,"ALOUETTE-1")==0) strcpy(abbr,"A1"); if (strcmp(source,"ALOUETTE-2")==0) strcpy(abbr,"A2"); return(ierr); } /************************************************************************** * RENAME THE CDF USING ISTP CONVENTIONS * **************************************************************************/ LONG AutoNamer (oldname, newname) char *oldname; char *newname; { int i,j; LONG ierr=0; LONG icerr; LONG olength; char c; char *ptr=oldname; char direc[80+1]=""; char filen[80+1]=""; char otemp[80+1]=""; char ntemp[80+1]=""; char delim; #if defined (vms) delim = ']'; #else #if defined (unix) delim = '/'; #else #if defined (WIN32) delim = '\\'; #endif #endif #endif /* make the newname uppercase or lowercase depending on runtime param */ strcpy(ntemp,newname); olength=(LONG)strlen(newname); if (RPARMS.autocase == 1) { /* force to lowercase */ for (i=0;i 1) { /* verify auto naming option is on */ strcpy(newname,RPARMS.outcdfname); for (i=0,j=strlen(newname);i