From:	CSBVAX::MRGATE!INFO-VAX-RELAY@KL.SRI.COM@SMTP  8-JUL-1988 13:51
To:	ARISIA::EVERHART
Subj:	Finding next UIC - a FORTRAN version


Received: from CUNYVM.CUNY.EDU by KL.SRI.COM with TCP; Tue, 5 Jul 88 01:12:08 PDT
Received: from HROEUR51.BITNET by CUNYVM.CUNY.EDU (IBM VM SMTP R1.1) with BSMTP id 1103; Tue, 05 Jul 88 04:09:57 EDT
Date:     Tue, 5 Jul 88 10:01 N
From:     <ARJAN%HROEUR51.BITNET@CUNYVM.CUNY.EDU>
Subject:  Finding next UIC - a FORTRAN version
To:       INFO-VAX@KL.SRI.COM
X-Original-To:  INFO-VAX@KL.SRI.COM, ARJAN

Finding the next free available UIC by searching RIGHTSLIST.DAT;
A FORTRAN version.

The C program I posted may have been nice, but
Bitnet%"carl@CitHex.Bitnet" sent me a fortran program
doing the same thing, only it is much more elegant
and it's faster too. I felt I had to post it to INFO-VAX,
because the method is also much more general than my
C program. (Don't forget to replace the spaces at the
beginning of line 5 with a tab.)

********************************************************************************

        PROGRAM NEXT_FREE_UIC
        CHARACTER*6 MEMBER
        INTEGER GROUP, KEYNUM, UIC, NEXT_UIC
        OPEN(UNIT=1,FILE='SYS$SYSTEM:RIGHTSLIST.DAT',SHARED,READONLY,
        1       ACCESS='KEYED',STATUS='OLD',FORM='UNFORMATTED')
        TYPE 10
10      FORMAT(' GROUP: ',$)
        READ 20, GROUP
20      FORMAT(O6)
        KEYNUM = GROUP * '10000'X
        UIC = KEYNUM
        READ(1,KEYGE=KEYNUM,KEYID=0,ERR=900) NEXT_UIC
30      IF ((NEXT_UIC/'10000'X) .NE. GROUP) GOTO 900
        IF (IAND(NEXT_UIC,'FFFF'X) .EQ. 'FFFF'X) GOTO 900
        UIC = NEXT_UIC
        READ(1,ERR=900) NEXT_UIC
        GOTO 30
900     UIC = UIC + 1
        IF (IAND(UIC,'FFFF'X) .EQ. 'FFFF'X) GOTO 950
        TYPE 910, UIC/'10000'X, IAND(UIC,'FFFF'X)
910     FORMAT(1X,'THE NEXT UIC IN THE GROUP IS [',O6.6,',',O6.6,']')
        WRITE(MEMBER,920) IAND(UIC,'FFFF'X)
920     FORMAT(O6.6)
        CALL LIB$SET_SYMBOL('MEMBER', MEMBER)
        GOTO 999
950     TYPE 960, GROUP
960     FORMAT(' GROUP', O6.6, ' IS FULL')
999     END

********************************************************************************

If there were a KEYLT specifier, the loop could be eliminated, and it could
all be done with a single read from the file, by setting KEYNUM equal to
GROUP * '10000'X + 'FFFF'X.                             (-Carl's comment)
