long getFITSCards( FILE * FITSFile, long maxKeys, struct keyword * keys[]) /* * * * * * * * * * * * * * * * */ /* getFITSCards() reads file and table headers and returns an array of */ /* keyword structures */ /* * * * * * * * * * * * * * * * */ { long nCards = 0, nRead = 0, i = 0, cardType = FITSUNKNOWN; char aCard[90] = ""; for (i = 0; i < maxKeys; i++) { nRead = fread( aCard, 80, 1, FITSFile); if (nRead != 1) break; aCard[80] = EOS; cardType = parseCard( aCard, keys[i]); stripWhite( aCard); nCards++; if (cardType == FITSEND) break; } /* end of for all cards in header */ for (i = 0; (i + nCards) % 36 != 0; i++) nRead = fread( aCard, 80, 1, FITSFile); return( nCards); } /* end of getFITSCards */
char * addSlash( char * directoryName) { if (directoryName == NULL) { fprintf( stderr, "addSlash: NULL directory Name\n"); return("NULL directory Name"); } stripWhite( directoryName); if (directoryName[ strlen( directoryName)-1] != '/') strcat( directoryName, "/"); return(NULL); } /* end of addSlash() */
void GvFieldData::addEnumValue(const char *typeNameArg, const char *valNameArg, int val) { struct GvEnumEntry *e = NULL; GvName typeName = stripWhite(typeNameArg); GvName valName = stripWhite(valNameArg); for (int i=0; i<enums.getLength(); i++) { e = (struct GvEnumEntry *) enums[i]; if (e->typeName == typeName) break; else e = NULL; } if (e == NULL) { e = new GvEnumEntry(typeName); enums.append((void*) e); } if (e->num == e->arraySize) { e->arraySize += GvEnumEntry::growSize; int *ovals = e->vals; GvName *onames = e->names; e->vals = new int[e->arraySize]; e->names = new GvName[e->arraySize]; for (int i=0; i<e->num; i++) { e->vals[i] = ovals[i]; e->names[i] = onames[i]; } delete [] ovals; delete [] onames; } e->vals[e->num] = val; e->names[e->num] = valName; e->num++; }
void GvFieldData::getEnumData(const char *typeNameArg, int &num, const int *&vals, const GvName *&names) { GvName typeName = stripWhite(typeNameArg); for (int i=0; i<enums.getLength(); i++) { struct GvEnumEntry *e = (struct GvEnumEntry *) enums[i]; if (e->typeName == typeName) { num = e->num; vals = e->vals; names = e->names; return; } } num = 0; vals = NULL; names = NULL; }
long getFileName( char * inDir, char * inName, char * inType, char * outName) /* * * * * * * * * * * * * * * * */ /* makeFileName() make a file name from a directory and inName. If the */ /* the inName is blank, a file name based on the date is created */ /* * * * * * * * * * * * * * * * */ { long i, dummyMJD = 0, dirMade = 0; char dateStr[30] = "", mapStr[30] = "", tmpName[256] = ""; if ( inDir == NULL) /* if null make standard dir */ strcpy( tmpName, ""); /* default directory */ else if (strlen(inDir) == 0) /* if no chars in name */ strcpy( tmpName, ""); /* default directory is current*/ else strncpy( tmpName, inDir, 127); /* else use input */ i = strlen( tmpName); if (i > 0) if (tmpName[i-1] != '/') /* divide directory and file */ strcat( tmpName, "/"); if (inName == NULL) /* if in Name not given */ i = 0; else i = strlen( inName); /* get length of name */ if (i > 0 && i < 100) /* if input file name not null */ strcat( tmpName, inName); else { /* else must make file name */ mjd2AIPS( dummyMJD, dateStr, mapStr); /* get today and obs first dates*/ strncat( tmpName, &dateStr[4], 20); /* use month day part of date */ stripWhite(tmpName); } if (inType) /* if inType given */ if (strlen(inType) > 0) strncat( tmpName, inType, 20); /* append to output name */ if (outName) strncpy( outName, tmpName, 100); return(dirMade); } /* end of getFileName() */
long AIPS2mjd( char * dateStr) /* * * * * * * * * * * * * * * * */ /* AIPS2mjd() takes an AIPS data string and returns the MJD for that string */ /* * * * * * * * * * * * * * * * */ { int i = 0, year = 0, month = 0, day = 0; long todayMJD = 0, oldFormat=1; char dateTemp[30]; for (i = 0; i < 29 && dateStr[i] != '\0'; i ++)/* copy to scratch string */ dateTemp[i] = dateStr[i]; dateTemp[i] = '\0'; /* terminate string */ stripWhite( dateTemp); /* remove leading/trailing */ if (dateTemp[0] == '\'' || dateTemp[0] == '"') /* remove leading ' */ for (i = 1; i < 30 && dateTemp[i] != '\0'; i ++) dateTemp[i-1] = dateTemp[i]; if (strlen( dateTemp) < 8) /* has at least 8 chars *?*/ return(-1); /* not expected string */ for (i = 0; dateTemp[i] != '\0'; i ++) { /* replace / and - with blank */ if (dateTemp[i] == '/') /* old format */ dateTemp[i] = ' '; if (dateTemp[i] == '-') { /* new format */ dateTemp[i] = ' '; oldFormat=0; } /* end if new format */ } /* end for i */ if (oldFormat==1) sscanf(dateTemp,"%d %d %d", &day, &month, &year); else sscanf(dateTemp,"%d %d %d", &year, &month, &day); todayMJD = dayMonthYear2mjd( day, month, year); return( todayMJD); } /* end of AIPS2mjd() */
char * dateObs2DMjd( char * dateObs, double * dMjd) { int i = 0, day = 0, month = 0, year = 0; double utc = 0; long mjd = 0; char dateString[31] = "", timeString[31] = ""; static long printCount = 0; *dMjd = 0; /* init output */ if (dateObs) strncpy ( dateString, dateObs, 30); else return( "NULL date string"); dateString[30] = EOS; /* maximum time string len */ /* convert DATE_OBS= '2000-10-23T00:00:00' to '2000 10 23' */ for (i = 0; i < strlen(dateString); i++) if (dateString[i] == '-') dateString[i] = ' '; else if (dateString[i] == '_') dateString[i] = ' '; else if (dateString[i] == '\'') dateString[i] = ' '; else if (dateString[i] == 'T') { dateString[i] = EOS; strcpy( timeString, &dateString[i+1]); } stripWhite( dateString); if (strlen (dateString) < 3) return(NULL); sscanf( dateString, "%d %d %d", &year, &month, &day); mjd = dayMonthYear2mjd( day, month, year); for (i = 0; i < strlen(timeString); i++) { if (timeString[i] == '\'') timeString[i] = ' '; else if (isalpha(timeString[i])) { timeString[i] = EOS; break; } } /* find 12:34:56.78 and convert to 12h34m56.78 */ for (i = 0; i < strlen(timeString); i++) if (timeString[i] == ':') { timeString[i] = 'h'; timeString[i+3] = 'm'; timeString[i+9] = EOS; break; } for (i = 0; i < strlen(timeString); i++) if (timeString[i] == '\'') timeString[i] = EOS; stripWhite( timeString); str2rad( timeString, &utc); *dMjd = mjd + (utc/TWOPI); /* if out of range time and not many messages printed */ if ((utc < 0 || utc > TWOPI) && printCount < 2) { fprintf( stderr, "dateObs2DMjd: %s -> %s %s => %8.2f\n", dateObs, dateString, timeString, *dMjd); printCount++; } return(NULL); } /* end of dateObs2DMjd() */
char * fileName2DMjd( char * fileName, double * dMjd) { int i = 0, day = 0, month = 0, year = 0, j = 0, n = 0; double utc = 0; long mjd = 0; char dateString[50] = "", timeString[50] = ""; if (fileName) { /* convert /home/gbtdata/HIOH/GO/2001_09_20_09:55:30A.fits */ /* => 2001_09_20_09:55:30A.fits */ for (i = 0; i < strlen( fileName); i++) { if (fileName[i] == '/') j = 0; else { dateString[j] = fileName[i]; j++; } } } else return( "NULL date string"); dateString[j] = EOS; n = strlen(dateString); /*convert 2001_09_20_09:55:30A.fits => 2001_09_20_09:55:30A => */ for (i = 0; i < n; i++) { if (dateString[i] == '.') { dateString[i] = EOS; break; } } n = strlen(dateString); /*convert 2001_09_20_09:55:30A => 2001_09_20_09:55:30 */ if (n > 1) { if (isalpha( dateString[n-1])) dateString[n-1] = EOS; } stripWhite( dateString); n = strlen(dateString); /* convert 2001_09_20_09:55:30A => 2001 09 20 09:55:30 */ for (i = 0; i < n; i++) if (dateString[i] == '_' || dateString[i] == '-') dateString[i] = ' '; stripWhite( dateString); sscanf( dateString, "%d %d %d %s", &year, &month, &day, timeString); mjd = dayMonthYear2mjd( day, month, year); stripWhite( timeString); /* find 12:34:56.78 and convert to 12h34m56.78 */ for (i = 0; i < strlen(timeString); i++) if (timeString[i] == ':') { timeString[i] = 'h'; timeString[i+3] = 'm'; timeString[i+8] = EOS; break; } for (i = 0; i < strlen(timeString); i++) if (timeString[i] == '\'') timeString[i] = EOS; stripWhite( timeString); str2rad( timeString, &utc); *dMjd = mjd + (utc/TWOPI); if (utc <= 0 || utc > TWOPI) fprintf( stderr, "fileName2DMjd: %s %s => %8.2f\n", dateString, timeString, *dMjd); return(NULL); } /* end of fileName2DMjd() */
long card2Strs( char inCard[], char aKey[], char aStr[], char aCmt[]) /* * * * * * * * * * * * * * * * */ /* card2Strs() breaks up an input card into three fields, a keyword, a value */ /* and a comment. Division is based on relations of FITS fields and "=" */ /* * * * * * * * * * * * * * * * */ { long i, j, endI = 0, equalI = 0, dataIA = 0, dataIB = 0; char aCard[81] = ""; strncpy( aCard, inCard, 80); aCard[80] = EOS; aStr[0] = EOS; aCmt[0] = EOS; stripWhite( aCard); for (i = 0; i < 8 && aCard[i] != ' ' && aCard[i] != '=' && aCard[i] != EOS; i ++) aKey[i] = aCard[i]; aKey[i] = EOS; endI = i; if (strncmp( aKey, "COMMENT", 7) == 0) { if (aStr[8] == '=') /* if a COMMENT = card */ strncpy( aStr, &aCard[9], LENCOMMENT); else /* else COMMENT foo card */ strncpy( aStr, &aCard[8], LENCOMMENT); aStr[LENCOMMENT-1] = EOS; return(endI); } /* end if a comment card */ for (i = endI; aCard[i] != '=' && aCard[i] != EOS; i ++); /* find '=' */ if (aCard[i] != '=') { /* if no = may be END card */ strncpy( aCmt, &aCard[endI], LENCOMMENT); aCmt[LENCOMMENT-1] = EOS; return(endI); } else equalI = i; for (i = equalI + 1; i < equalI + 3; i++) /* find quote, after = */ if (aCard[i] == '\'') { dataIA = i; break; } if (dataIA > 0) { /* if a quoted string */ j = 0; for (i = dataIA; aCard[i] != EOS && i < 40; i++) { /* for all chars*/ aStr[j] = aCard[i]; j++; } aStr[j] = EOS; for (i = 1; aStr[i] != EOS; i++) { /* for all chars*/ if (aStr[i] == '\'' && aStr[i-1] != '\'') { /* if not 2 's */ dataIB = i + dataIA; /* record end of string */ aStr[i+1] = EOS; /* terminate after ' */ break; } } } else { /* not a quoted string, parsed by blanks */ /* find first non-blank */ for (i = equalI + 1; aCard[i] == ' '; i++); dataIA = i; /* found a non-blank or end of string */ for (i = dataIA; i < 81 && aCard[i] != '\0' && aCard[i] != ' '; i ++) aStr[i-dataIA] = aCard[i]; /* move data to begin of string */ aStr[i-dataIA] = EOS; /* terminate data */ dataIB = i; /* one char past end of data */ } j = 0; if (dataIB > 0 && dataIB < strlen(aCard)) { /* find / between data and comment */ for (i = dataIB; aCard[i] != EOS && aCard[i] != '/'; i ++); /* set past white space */ for (i = i+1; aCard[i] != EOS && aCard[i] == ' '; i ++); for (i = i; aCard[i] != EOS; i ++) { aCmt[j] = aCard[i]; j++; } } aCmt[j] = EOS; return (dataIB); } /* end of card2Strs() */
long parseCard( char aCard[], struct keyword * pKey) /* * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * */ { long i, lenStr = 0; card2Strs( aCard, pKey->key, pKey->str, pKey->cmt); pKey->dbl = 0.; /* int values to zero */ stripWhite( pKey->str); stripWhite( pKey->cmt); if (strcmp("END", pKey->key) == 0 && strlen(pKey->key) == 3) { pKey->type = FITSEND; } else if (strncmp("COMMENT", pKey->key, 7) == 0 || strncmp("HISTORY", pKey->key, 7) == 0) { pKey->type = FITSCOMMENT; strcpy(pKey->cmt, pKey->str); } else if (strncmp("SIMPLE", pKey->key, 6) == 0) { pKey->type = FITSLOGICAL; pKey->dbl = (pKey->str[1] == 'T') ? 1 : 0; pKey->str[0] = EOS; } else if (strncmp("EXTEND", pKey->key, 6) == 0) { pKey->type = FITSLOGICAL; pKey->dbl = (pKey->str[1] == 'T') ? 1 : 0; pKey->str[0] = EOS; } else if (aCard[8] != '=' ) pKey->type = FITSUNKNOWN; else if (pKey->str[0] == '\'') { /* if a quoted string */ pKey->type = FITSSTRING; /* remove leading and trailing \' */ for (i = 1; pKey->str[i] != EOS; i++) pKey->str[i-1] = pKey->str[i]; pKey->str[i-2] = EOS; } else { pKey->type = FITSINTEGER; stripWhite( pKey->str); /* look for decimal/exponential */ for (i = 0; i < strlen(pKey->str); i++) if (pKey->str[i] == '.' || pKey->str[i] == 'E' || pKey->str[i] == 'e') { sscanf(pKey->str, "%le", &(pKey->dbl)); pKey->type = FITSFLOAT; break; } /* if here, then not a float, is it a byte or integer */ lenStr = strlen(pKey->str); if ((lenStr < 80) && (lenStr > 2)) { /* if a plausible length */ if ((pKey->str[lenStr-1] == 'B') || /* if a byte type */ (pKey->str[lenStr-1] == 'b')) { pKey->type = FITSBYTE; pKey->str[lenStr-1] = EOS; /* this section checks for cards like TFORM17 = '33554432B' / NBIN*NCHAN*NPOL*NSBLK int, byte(B) or bit(X) */ pKey->dbl = atoi( pKey->str); /* is a byte type field */ } } /* end if a reasonable length */ if (pKey->type == FITSINTEGER) /* if an integer, convert string*/ pKey->dbl = atoi( pKey->str); } /* end default numeric type */ if (pKey->type == FITSSTRING) { /* look for string like '05/30/95' */ if (pKey->str[2] == '/' && pKey->str[5] == '/') { pKey->type = FITSDATE; pKey->dbl = AIPS2mjd( pKey->str); } } if (pKey->type == 100 && strncmp(pKey->key, "NAXIS", 5) == 0) printf( "%ld: %-8s = %s / %s\n", pKey->type, pKey->key, pKey->str, pKey->cmt); return (pKey->type); } /* end of parseCard() */