INTEGER FUNCTION ISTKGT(NITEMS,ITYPE) C C ALLOCATES SPACE OUT OF THE INTEGER ARRAY ISTAK (IN COMMON C BLOCK CSTAK) FOR AN ARRAY OF LENGTH NITEMS AND OF TYPE C DETERMINED BY ITYPE AS FOLLOWS C C 1 - LOGICAL C 2 - INTEGER C 3 - REAL C 4 - DOUBLE PRECISION C 5 - COMPLEX C C ON RETURN, THE ARRAY WILL OCCUPY C C STAK(ISTKGT), STAK(ISTKGT+1), ..., STAK(ISTKGT-NITEMS+1) C C WHERE STAK IS AN ARRAY OF TYPE ITYPE EQUIVALENCED TO ISTAK. C C (FOR THOSE WANTING TO MAKE MACHINE DEPENDENT MODIFICATIONS C TO SUPPORT OTHER TYPES, CODES 6,7,8,9,10,11 AND 12 HAVE C BEEN RESERVED FOR 1/4 LOGICAL, 1/2 LOGICAL, 1/4 INTEGER, C 1/2 INTEGER, QUAD PRECISION, DOUBLE COMPLEX AND QUAD C COMPLEX, RESPECTIVELY.) C C THE ALLOCATOR RESERVES THE FIRST TEN INTEGER WORDS OF THE STACK C FOR ITS OWN INTERNAL BOOK-KEEPING. THESE ARE INITIALIZED BY C THE INITIALIZING SUBPROGRAM I0TK00 UPON THE FIRST CALL C TO A SUBPROGRAM IN THE ALLOCATION PACKAGE. C C THE USE OF THE FIRST FIVE WORDS IS DESCRIBED BELOW. C C ISTAK( 1) - LOUT, THE NUMBER OF CURRENT ALLOCATIONS. C ISTAK( 2) - LNOW, THE CURRENT ACTIVE LENGTH OF THE STACK. C ISTAK( 3) - LUSED, THE MAXIMUM VALUE OF ISTAK(2) ACHIEVED. C ISTAK( 4) - LMAX, THE MAXIMUM LENGTH THE STACK. C ISTAK( 5) - LBOOK, THE NUMBER OF WORDS USED FOR BOOKEEPING. C C THE NEXT FIVE WORDS CONTAIN INTEGERS DESCRIBING THE AMOUNT C OF STORAGE ALLOCATED BY THE FORTRAN SYSTEM TO THE VARIOUS C DATA TYPES. THE UNIT OF MEASUREMENT IS ARBITRARY AND MAY C BE WORDS, BYTES OR BITS OR WHATEVER IS CONVENIENT. THE C VALUES CURRENTLY ASSUMED CORRESPOND TO AN ANS FORTRAN C ENVIRONMENT. FOR SOME MINI-COMPUTER SYSTEMS THE VALUES MAY C HAVE TO BE CHANGED (SEE I0TK00). C C ISTAK( 6) - THE NUMBER OF UNITS ALLOCATED TO LOGICAL C ISTAK( 7) - THE NUMBER OF UNITS ALLOCATED TO INTEGER C ISTAK( 8) - THE NUMBER OF UNITS ALLOCATED TO REAL C ISTAK( 9) - THE NUMBER OF UNITS ALLOCATED TO DOUBLE PRECISION C ISTAK(10) - THE NUMBER OF UNITS ALLOCATED TO COMPLEX C C ERROR STATES - C C 1 - NITEMS .LT. 0 C 2 - ITYPE .LE. 0 .OR. ITYPE .GE. 6 C 3 - LNOW, LUSED, LMAX OR LBOOK OVERWRITTEN C 4 - STACK OVERFLOW C COMMON /CSTAK/DSTAK C DOUBLE PRECISION DSTAK(500) INTEGER ISTAK(1000) INTEGER ISIZE(5) C LOGICAL INIT C EQUIVALENCE (DSTAK(1),ISTAK(1)) EQUIVALENCE (ISTAK(1),LOUT) EQUIVALENCE (ISTAK(2),LNOW) EQUIVALENCE (ISTAK(3),LUSED) EQUIVALENCE (ISTAK(4),LMAX) EQUIVALENCE (ISTAK(5),LBOOK) EQUIVALENCE (ISTAK(6),ISIZE(1)) C DATA INIT/.TRUE./ C IF (INIT) CALL I0TK00(INIT,500,4) C C/6S C IF (NITEMS.LT.0) CALL SETERR(20HISTKGT - NITEMS.LT.0,20,1,2) C/7S IF (NITEMS.LT.0) CALL SETERR('ISTKGT - NITEMS.LT.0',20,1,2) C/ C C/6S C IF (ITYPE.LE.0 .OR. ITYPE.GE.6) CALL SETERR C 1 (33HISTKGT - ITYPE.LE.0.OR.ITYPE.GE.6,33,2,2) C/7S IF (ITYPE.LE.0 .OR. ITYPE.GE.6) CALL SETERR 1 ('ISTKGT - ITYPE.LE.0.OR.ITYPE.GE.6',33,2,2) C/ C C/6S C IF (LNOW.LT.LBOOK.OR.LNOW.GT.LUSED.OR.LUSED.GT.LMAX) CALL SETERR C 1 (47HISTKGT - LNOW, LUSED, LMAX OR LBOOK OVERWRITTEN, C 2 47,3,2) C/7S IF (LNOW.LT.LBOOK.OR.LNOW.GT.LUSED.OR.LUSED.GT.LMAX) CALL SETERR 1 ('ISTKGT - LNOW, LUSED, LMAX OR LBOOK OVERWRITTEN', 2 47,3,2) C/ C ISTKGT = (LNOW*ISIZE(2)-1)/ISIZE(ITYPE) + 2 I = ( (ISTKGT-1+NITEMS)*ISIZE(ITYPE) - 1 )/ISIZE(2) + 3 C C STACK OVERFLOW IS AN UNRECOVERABLE ERROR. C C/6S C IF (I.GT.LMAX) CALL SETERR(69HISTKGT - STACK TOO SHORT. ENLARGE IT C 1 AND CALL ISTKIN IN MAIN PROGRAM.,69,4,2) C/7S IF (I.GT.LMAX) CALL SETERR('ISTKGT - STACK TOO SHORT. ENLARGE IT A *ND CALL ISTKIN IN MAIN PROGRAM.',69,4,2) C/ C C ISTAK(I-1) CONTAINS THE TYPE FOR THIS ALLOCATION. C ISTAK(I ) CONTAINS A POINTER TO THE END OF THE PREVIOUS C ALLOCATION. C ISTAK(I-1) = ITYPE ISTAK(I ) = LNOW LOUT = LOUT+1 LNOW = I LUSED = MAX0(LUSED,LNOW) C RETURN C END .