/****************************************************************** SUBROUTINE FILEOPEN FILEOPEN OPENS FILES FOR ACCESS FROM C SUBROUTINES. IF FILEOPEN CANNOT OPEN A FILE WITH THE TYPE SPECIFIED, IT WILL TRY TO OPEN IT AS A REGULAR FILE, FAILING THIS IT WILL OPEN A NEW FILE. FAILING THIS IT WILL WRITE TO SCREEN THAT THE FILE CANNOT BE OPENED. IF A NEW FILE IS OPENED WHEN THIS WAS NOT THE INPUT FILETYPE, A MESSAGE WILL ALSO BE SENT TO SCREEN. WHEN A FILE IS OPENED NORMALLY A MESSAGE CONTAINING FILENUMBER AND NAME IS SENT TO SCREEN. SUBROUTINE STEPS: 1. OPEN FILE ACCORDING TO SPECIFICATIONS, SEND MESSAGE TO SCREEN IF SUCCESSFUL. 2. FAILING THIS, TRY TO OPEN A REGULAR ACCESS FILE, ASSUMING THAT A BAD FILETYPE HAS BEEN SENT. 3. FAILING THIS OPEN A NEW FILE, SEND APPROPRIATE MESSAGE. 4. FAILING THIS SEND APPROPRIATE MESSAGE. 5. IF A NEW FILE IS OPENED, BY DESIGN OR OTHERWISE, THE FILE IS IMMEDIATELY CLOSED AND REOPENED. THIS WAY THERE IS AN END OF FILE MARKER PLACED IN THE FILE. *******************************************************************/ /***************************************************************** *fp is a C FILE structure array which can hold a maximum of MAXFILE files ftrack is set to one or zero for each file identification number associated with *fp. one means file identification number is associated with an open file, zero means file identification number is not in use at present ******************************************************************/ FILE *fp[MAXFILE]; int ftrack[MAXFILE]; fileopen_( char *filename, /* FILE NAME CONSTRUCTED FROM /MAIN BRANCH DIRECTORY, WHICH IS HARDWIRED INTO NAMING PROGRAMS, /PROBE TYPE/, /OBSERVED OR /STANDARD, AND /PARAMETER TYPE/, OR /MAIN BRANCH/, /PROBE TYPE/ /HEADER, /DEPTH OR /MASK/ AND FOR MASK, /PARAMETER TYPE/ AND /MASKNAME/ THESE NAMES ARE CONSTRUCTED IN NAMING PROGRAMS, NAMEOTHER FOR /DEPTH AND /HEADER FILES, NAMEFILE FOR PARAMETERS, AND MASKNAME FOR MASKS. */ char filetypein[], /* TYPE OF FILE TO BE OPENED, POSSIBLE TYPES ARE: r - TEXT FILE w - NEW TEXT FILE a - APPENDABLE TEXT FILE r+ - BINARY FILE w+ - NEW BINARY FILE a+ - APPEND TO BINARY FILE rb+ - READ AND WRITE BINARY FILE x - open as rb+ ONLY */ int *filenumber /* NUMBER ASSIGNED TO FILE TO BE OPENED, 0 FOR DEPTH FILE 1 FOR HEADER FILE CALCULATED DEPENDING ON FILE SET AND PARAMETER ORDER FOR PARAMETER FILE 70 + ORDER FOR MASK FILES */ ) { /*********************************************** S IS FOR CLOSING NEW FILES TO BE REOPENED ONLYOLD IS SET TO ONE IF ONLY AN OLD FILE SHOULD BE OPENED ORIGNUMBER IS ORIGINAL FILE NUMBER FILETYPE IS THE TYPE OF FILE TO BE OPENED ************************************************/ int s,ix,onlyold=0,orignumber; int nowrite=0; char filetype[5]; /*********************************************** IF FILE NUMBER IS LESS THAN ZERO, USER IS REQUESTING A COMPUTER GENERATED FILE IDENTIFICATION NUMBER ASSIGN FILE IDENTIFICATION NUMBER IN THIS CASE ************************************************/ if ( *filenumber == -2 ) { nowrite=1; *filenumber = -1; } /* printf("probename %s\n",probename_[1]);*/ orignumber = *filenumber; if ( *filenumber < 0 ) if ( (s = fileassign(filenumber)) == 0 ) return; /* printf("probename %s\n",probename_[1]);*/ /*********************************************** CHECK IF FILE IDENTIFICATION NUMBER IS ALREADY IN USE ************************************************/ if ( *filenumber >= 0 && ftrack[*filenumber] > 0 ) { printf(" CAUTION: FILENUMBER %d IS ALREADY IN USE.\n", *filenumber); printf(" FILE %s WILL NOT BE OPENED\n",filename); return; } /*********************************************** PRINT FILENUMBER AND FILENAME TO SCREEN SET FILETRACK TO 1 FOR THIS FILE NUMBER TO INDICATE FILE WILL BE OPENED ************************************************/ if ( nowrite == 0 ) printf(" %d %s\n", *filenumber, filename); /*printf("probename %s\n",probename_[1]);*/ ftrack[*filenumber] = 1; /********************************************** IF FILETYPE IS GIVEN AS 'x', RESET TO 'rb+', BUT ONLY OPEN IF FILE ALREADY EXISTS ***********************************************/ if ( filetypein[0] == 'x' ) { filetype[0]='r'; filetype[1]='b'; filetype[2]='+'; filetype[3]='\0'; onlyold = 1; } else { ix=0; while ((filetype[ix] = filetypein[ix]) != '\0' ) ix++; } /*********************************************** OPEN FILE ************************************************/ if ( nowrite == 0 ) printf("file mode: %s\n",filetype,filenumber); if ((fp[*filenumber] = fopen(filename,filetype)) == NULL) { printf("inside\n"); if ( onlyold == 0 ) { /*********************************************** IF THIS FAILS OPEN FILE AS READABLE TEXT FILE ************************************************/ if ((fp[*filenumber] = fopen(filename,"r")) ==NULL) { /*********************************************** IF THIS FAILS, OPEN A NEW FILE. ALTHOUGH THIS IS OPENED AS A TEXT FILE, IT CAN BE USED AS A BINARY FILE. PRINT TO SCREEN THAT THE FILE COULD NOT BE OPENED IF THIS FAILS. OTHERWISE CLOSE AND REOPEN THE FILE TO INSERT AN END OF FILE MARKER. PRINT TO SCREEN THAT A NEW FILE HAS BEEN OPENED. ************************************************/ if ((fp[*filenumber] = fopen(filename,"w")) ==NULL) { printf(" unable to open %s\n ", filename); ftrack[*filenumber] = 0; if ( orignumber == -1 ) *filenumber = -1; } else { s = fclose( fp[*filenumber] ); fp[*filenumber] = fopen(filename,"rb+"); printf(" %s is a new file\n ",filename); } } /************************************************************* INDICATE THAT THIS FILE HAS BEEN OPENED AS READ-ONLY *************************************************************/ else { printf("WARNING: FILE CAN ONLY BE OPENED AS READ-ONLY\n"); } } /************************************************************ INDICATE THAT FILE DOES NOT EXIST *************************************************************/ else { printf("FILE DOES NOT EXIST AND WILL NOT BE OPENED AS"); printf(" A NEW FILE\n"); ftrack[*filenumber] = 0; if ( orignumber == -1 ) *filenumber = -1; } } }