Cloned SEACAS for EXODUS library with extra build files for internal package management.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

188 lines
6.0 KiB

C Copyright(C) 1999-2020 National Technology & Engineering Solutions
C of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with
C NTESS, the U.S. Government retains certain rights in this software.
C
C See packages/seacas/LICENSE for details
C=======================================================================
SUBROUTINE POSTFX (NUMENT, NAMENT, TYPENT, INXENT, VALENT, ITMENT,
& NERR)
C=======================================================================
C --*** POSTFX *** (ALGEBRA) Convert the equation to postfix form
C -- Written by Amy Gilkey - revised 08/18/87
C --
C --POSTFX converts the equation to postfix form. Parenthesis
C --are eliminated. Nothing is done if NERR is non-zero.
C --
C --Conversion is done using an operator stack. Operators are
C --moved to the operator stack and returned to the equation in
C --postfix order. Non-operators are simply moved up in the equation.
C --Any operator which is moved to the stack has precedence over those
C --already in the stack. An operator of lower precedence will move
C --the preceding stack operator to the equation. A special case is
C --made for a function. It is pushed onto the operator stack, and
C --popped back into the equation at the end of the parameters.
C --
C --Parameters:
C -- NUMENT - IN/OUT - the number of entries (as in /ENT../)
C -- NAMENT - IN/OUT - the equation entries (as in /ENT../)
C -- TYPENT - IN/OUT - the type of each equation entry (as in /ENT../)
C -- INXENT - IN/OUT - based on TYPENT (as in /ENT../)
C -- VALENT - IN/OUT - based on TYPENT (as in /ENT../)
C -- ITMENT - IN/OUT - based on TYPENT (as in /ENT../)
C -- NERR - IN/OUT - the number of errors in the equation, may be set
include 'ag_namlen.blk'
include 'ag_numeqn.blk'
PARAMETER (ICURTM = 1, ILSTTM = 2, IONETM = 3)
CHARACTER*(*) NAMENT(*)
CHARACTER TYPENT(*)
INTEGER INXENT(*)
REAL VALENT(*)
INTEGER ITMENT(*)
CHARACTER*(maxnam) STKNAM(MAXENT)
CHARACTER STKTYP(MAXENT)
INTEGER STKINX(MAXENT)
REAL STKVAL(MAXENT)
INTEGER STKITM(MAXENT)
C --STK.. - the operand stack; holds the corresponding /ENT../ values
INTEGER STKEQU(MAXENT)
C --STKEQU - the IOPTBL index for this operand
INTEGER IEQUIV(0:10)
SAVE IEQUIV
C --IEQUIV - the IOPTBL index for the given operator
INTEGER IOPTBL(-1:5,-1:8)
SAVE IOPTBL
C --IOPTBL - chart of stack actions to be performed
C --IOPTBL(i,j) - i = top stack operator, j = current operator
C -- = 1 Pop operator from stack into the equation
C -- = 2 Push operator onto the stack
C -- = 3 Pop matching '(' off the stack
C -- = 4 Delete from equation
C -- = 0 Error
C # ~ + - * / ^ ( ) = ,
DATA IEQUIV / 0, 1, 2, 2, 3, 3, 4, 5, 6, 7, 8 /
C --Index -1 is reserved for the function name
C F # ~ + * ^ ( ) = ,
DATA (IOPTBL(-1,J),J=-1,8) / 0, 1, 0, 1, 1, 1, 2, 1, 0, 1 /
DATA (IOPTBL(0,J), J=-1,8) / 2, 4, 2, 2, 2, 2, 2, 0, 0, 0 /
DATA (IOPTBL(1,J), J=-1,8) / 2, 1, 0, 1, 1, 1, 2, 1, 0, 1 /
DATA (IOPTBL(2,J), J=-1,8) / 2, 1, 2, 1, 2, 2, 2, 1, 0, 1 /
DATA (IOPTBL(3,J), J=-1,8) / 2, 1, 2, 1, 1, 2, 2, 1, 0, 1 /
DATA (IOPTBL(4,J), J=-1,8) / 2, 1, 2, 1, 1, 2, 2, 1, 0, 1 /
DATA (IOPTBL(5,J), J=-1,8) / 2, 0, 2, 2, 2, 2, 2, 3, 0, 4 /
IF (NERR .NE. 0) GOTO 120
C --Initialize the operator stack by putting '#' on it
STKNAM(1) = '#'
STKTYP(1) = 'O'
STKINX(1) = 0
STKVAL(1) = -999
STKITM(1) = ICURTM
STKEQU(1) = 0
IOPTOS = 1
C --IOPTOS - the top of the operator stack
C --Put '#' at end of the equation
NENT = NUMENT+1
NAMENT(NENT) = STKNAM(1)
TYPENT(NENT) = STKTYP(1)
INXENT(NENT) = STKINX(1)
VALENT(NENT) = STKVAL(1)
ITMENT(NENT) = STKITM(1)
IEQTOS = 2
C --IEQTOS - the top of new postfix equation stack
DO 110 NENT = 3, NUMENT+1
IF ((TYPENT(NENT) .NE. 'O')
& .AND. (TYPENT(NENT) .NE. 'F')) THEN
C --Move entry up in the equation
IEQTOS = IEQTOS + 1
IF (IEQTOS .NE. NENT) THEN
NAMENT(IEQTOS) = NAMENT(NENT)
TYPENT(IEQTOS) = TYPENT(NENT)
INXENT(IEQTOS) = INXENT(NENT)
VALENT(IEQTOS) = VALENT(NENT)
ITMENT(IEQTOS) = ITMENT(NENT)
END IF
ELSE
100 CONTINUE
IF (TYPENT(NENT) .EQ. 'O') THEN
IEQU = IEQUIV(INXENT(NENT))
ELSE
IEQU = -1
END IF
J = STKEQU(IOPTOS)
IACT = IOPTBL(J,IEQU)
IF (IACT .EQ. 1) THEN
C --Pop operator from stack onto the equation, and redo
IEQTOS = IEQTOS + 1
NAMENT(IEQTOS) = STKNAM(IOPTOS)
TYPENT(IEQTOS) = STKTYP(IOPTOS)
INXENT(IEQTOS) = STKINX(IOPTOS)
VALENT(IEQTOS) = STKVAL(IOPTOS)
ITMENT(IEQTOS) = STKITM(IOPTOS)
IOPTOS = IOPTOS - 1
GOTO 100
ELSE IF (IACT .EQ. 2) THEN
C --Push operator onto the stack
IOPTOS = IOPTOS + 1
STKNAM(IOPTOS) = NAMENT(NENT)
STKTYP(IOPTOS) = TYPENT(NENT)
STKINX(IOPTOS) = INXENT(NENT)
STKVAL(IOPTOS) = VALENT(NENT)
STKITM(IOPTOS) = ITMENT(NENT)
STKEQU(IOPTOS) = IEQU
ELSE IF (IACT .EQ. 3) THEN
C --Pop matching '(' off the stack
IOPTOS = IOPTOS - 1
ELSE IF (IACT .EQ. 4) THEN
C --Delete from equation
CONTINUE
ELSE
C --Error
NERR = NERR + 1
CALL PRTERR ('PROGRAM', 'Postfix string problem')
GOTO 120
END IF
END IF
110 CONTINUE
NUMENT = IEQTOS
120 CONTINUE
RETURN
END