/************************************************************** SUBROUTINE SEQREAD SEQREAD READS ALL SEQUENTIAL MASKS TO FIND THE NEXT PROFILE TO BE EXAMINED. A SEQUENTIAL MASK IS A MASK WHICH CONTAINS ONLY PROFILE NUMBERS. THERE ARE TWO TYPES OF SEQUENTIAL MASKS; THE FIRST IS INCLUSIVE MASKS. INCLUSIVE MASKS CONTAIN THE PROFILE NUMBERS OF THOSE PROFILES WHICH ARE TO BE EXAMINED IN THE MAIN PROGRAM. THE SECOND TYPE IS EXCLUSIVE MASKS. THESE MASKS CONTAIN NUMBERS OF PROFILES WHICH ARE EXPRESSLY NOT TO BE EXAMINED IN THE MAIN PROGRAM. SEQREAD READS EACH MASK UNTIL THE NEXT PROFILE NUMBER WHICH IS IN AN INCLUSIVE MASK AND NOT IN AN EXCLUSIVE MASK IS FOUND. THE PRESENT PROFILE NUMBER FOR EACH MASK IS STORED IN JPRESENT. *****************************************************************/ seqread_( int *jj, /* PRESENT PROFILE RECORD NUMBER */ int *nmask, /* TOTAL NUMBER OF SEQUENTIAL MASKS */ int *nmask1, /* NUMBER OF INCLUSION MASKS */ int *eof, /* END OF SEARCH MARKER. SET TO ONE WHEN ALL FILES HAVE REACHED THEIR END OF FILE */ int *allend, /* NUMBER OF FILES WHICH HAVE REACHED THEIR END OF FILE */ int *fn /* FILE IDENTIFICATION NUMBERS FOR EACH MASK FILE */ ) { /************************************************************* I - COUNTER FOUND - DENOTES WHETHER A PROFILE RECORD NUMBER HAS BEEN FOUND JJIN - PROFILE RECORD NUMBER WHICH IS RETURNED TO THE MAIN PROGRAM. IT IS INITIALLY SET TO A VERY LARGE NUMBER SINCE THE SMALLEST OF ALL PROFILE RECORD NUMBERS CULLED FROM THE VARIOUS MASKS IS THE PROFILE RECORD NUMBER RETURNED. HENCE JJIN MUST FIRST BE SET TO A NUMBER WHICH IS LARGER THAN ANY PROFILE RECORD NUMBER. ***************************************************************/ int i; int found = 0; int jjin = 300000000; /*************************************************************** IF THERE ARE NO INCLUSIVE MASKS, SET THE OUTPUT RECORD NUMBER TO THE PRESENT RECORD NUMBER. IN THIS WAY, THE PRESENT RECORD NUMBER (PLUS ONE) WILL BE CHECKED AGAINST EXCLUSIVE MASKS. IF ALL MASKS ARE INCLUSIVE, SET FOUND TO -1. THIS IS THE ONLY WAY TO CHECK THE NEXT VALUE IN INCLUSIVE MASKS, SINCE MASKS ARE ONLY CHECKED IF FOUND IS LESS THAN THE NUMBER OF EXCLUSIVE MASKS. ****************************************************************/ if ( *nmask1 == 0 ) jjin = *jj; if ( *nmask - *nmask1 == 0 ) found = -1; /**************************************************************** IF FOUND IS LESS THAN THE NUMBER OF EXCLUSIVE MASKS, CHECK EACH MASK FILE. *****************************************************************/ while ( found < ( *nmask - *nmask1 ) ) { /**************************************************************** IF THERE ARE NO INCLUSIVE MASKS, CHECK THE NEXT SUCCESSIVE PROFILE AGAINST THE EXCLUSIVE MASKS. *****************************************************************/ if ( *nmask1 == 0 ) jjin += 1; /**************************************************************** IF THERE ARE NO EXCLUSIVE MASKS, SET FOUND TO ONE, SINCE THE NEXT VALUE READ FROM THE INCLUSIVE MASKS IS AUTOMATICALLY THE OUTPUT VALUE. OTHERWISE RESET FOUND. ****************************************************************/ if ( *nmask - *nmask1 == 0 ) found = 1; else found = 0; /*************************************************************** CHECK EACH INCLUSIVE MASK. ****************************************************************/ for ( i = 0; i < *nmask1; i++ ) { /*************************************************************** IF A MASK HAS ALREADY REACHED THE END OF ITS FILE, SUBTRACT ONE FROM *ALLEND, SINCE ONE WILL AGAIN BE ADDED AFTER AN ATTEMPT TO READ THE FILE. ****************************************************************/ if (feof(fp[*(fn+i)])) *allend -=1; /*************************************************************** WHILE THE PRESENT PROFILE RECORD NUMBER IN THE MASK IS LESS OR EQUAL TO THE LAST INVESTIGATED PROFILE RECORD NUMBER, READ THE NEXT PROFILE RECORD NUMBER FROM FILE (UNLESS THE FILE HAS BEEN COMPLETELY READ IN. ****************************************************************/ while ( jpresent[ i ] <= *jj && !feof( fp[ *(fn + i) ] )) { fread( &jpresent[i], sizeof( int ) , 1, fp[*(fn+i)]); } /*************************************************************** IF THE END OF FILE HAS BEEN REACHED, ADD ONE TO THE END OF FILE COUNTER. ****************************************************************/ if (feof(fp[*(fn+i)])) *allend +=1; } /*************************************************************** IF NOT ALL FILES HAVE REACHED THEIR END OF FILE, FIND THE LOWEST PROFILE NUMBER FROM ALL THE MASKS AND SET THIS AS THE NEXT PROFILE TO BE INVESTIGATED. *****************************************************************/ if ( *allend < *nmask1 ) { jjin = 300000000; for ( i = 0; i < *nmask1; i++ ) { if ( !feof(fp[*(fn+i)]) && jpresent[i] < jjin ) jjin = jpresent[i]; } } /********************************************************** IF ALL MASK FILES HAVE BEEN COMPLETELY READ, SET EOF TO ONE TO ALERT THE MAIN PROGRAM. ***********************************************************/ else if ( *nmask1 > 0 ) { *eof = 1; return; } /************************************************************ SET THE PROFILE RECORD NUMBER TO BE INVESTIGATED AS THE PRESENT PROFILE. **************************************************************/ *jj = jjin; /************************************************************* READ IN THE NEXT PROFILE RECORD NUMBERS FROM THE EXCLUSIVE MASKS. **************************************************************/ for ( i = *nmask1; i < *nmask; i++ ) { while ( jpresent[ i ] < jjin && !feof( fp[ *(fn + i) ] )) { fread( &jpresent[i], sizeof( int ) , 1, fp[*(fn+i)]); } /************************************************************* IF THE VALUE IN THE EXCLUSIVE MASK IS NOT EQUAL TO THE PRESENT PROFILE NUMBER OR THE EXCLUSIVE MASK HAS BEEN COMPLETELY READ, ADD ONE TO FOUND. WHEN FOUND EQUALS THE NUMBER OF EXCLUSIVE MASKS, THE PRESENT PROFILE RECORD NUMBER IS OUTPUT TO THE MAIN PROGRAM AS THE NEXT PROFILE TO BE INVESTIGATED. **************************************************************/ if ( feof(fp[*(fn+i)]) || jpresent[i] != jjin ) found +=1; } } }