C C======================================================================= C C PARSCO.PGM C C======================================================================= C LOGICAL*1 SWITCH,YCOOR,L1,LANG,LRAD BYTE COMMA,SLASH,ISW(2) BYTE STRNG(1) INTEGER*2 ISWIT1(5),ISWIT2(3) REAL*4 PARM(NPNTS),PARMO(4),RCOOR(2) REAL*4 MPTFM0,MPTFM1 DOUBLE PRECISION ERRMSG(2,3) C EQUIVALENCE (ISWTCH,ISW(1)) DATA COMMA,SLASH/',','/'/ DATA DEGRAD/0.0174532925/ C DATA ERRMSG(1,1),ERRMSG(2,1)/8HDecoding,8Hnumber / DATA ERRMSG(1,2),ERRMSG(2,2)/8HIllegal ,8Hswitch / DATA ERRMSG(1,3),ERRMSG(2,3)/8HIllegal ,8Hpolar co/ C DATA NSWIT1,ISWIT1/5,'AB','RE','IN','PA','PR'/ DATA NSWIT2,ISWIT2/3,'RW','PL','PH'/ C C------------------------------------------------------------------------------ C C ENTRY POINT C C------------------------------------------------------------------------------ C ICHAR = 0 IP = 0 IPNT = 0 IERR = 0 PORIGN = .FALSE. C C------------------------------------------------------------------------------ C C NEW POINT C C------------------------------------------------------------------------------ C 100 IPNT = IPNT + 1 IF (IPNT.GT.NPNTS.OR.PORIGN) GO TO 999 YCOOR = .FALSE. LANG = .FALSE. LRAD = .FALSE. C C------------------------------------------------------------------------------ C C NEW COORDINATE C C------------------------------------------------------------------------------ C 150 IFRST = ICHAR + 1 IP = IP + 1 SWITCH = .FALSE. IC = 1 IF (YCOOR) IC = 2 RIN = 0.0 IF (ICHAR.GT.LSTRN) GO TO 400 C C FIND SWITCHES AND END OF COORDINATE C 200 ICHAR = ICHAR + 1 IF (ICHAR.GT.LSTRN) GO TO 300 CHAR = STRNG(ICHAR) IF (CHAR.EQ.COMMA) GO TO 300 IF (CHAR.NE.SLASH) GO TO 200 C C HANDLE SWITCHES C IF (SWITCH) GO TO 210 SWITCH = .TRUE. LSSTR = ICHAR - IFRST 210 ISW(1) = STRNG(ICHAR+1) ISW(2) = STRNG(ICHAR+2) NSW1 = NPARS1 CALL GETCMD (ISWTCH,ISWIT1,NSWIT1,N1) CALL GETCMD (ISWTCH,ISWIT2,NSWIT2,N2) IF (N1.NE.0) NPARS1 = N1 IF (N2.NE.0) NPARS2 = N2 L1 = ISWTCH.EQ.'OR' PORIGN = PORIGN.OR.L1 IF (N1.EQ.0.AND.N2.EQ.0.AND..NOT.L1) GO TO 9002 ICHAR = ICHAR + 2 GO TO 200 C C------------------------------------------------------------------------------ C C END OF COORDINATE C C------------------------------------------------------------------------------ C 300 IF (.NOT.SWITCH) LSSTR = ICHAR - IFRST NNN = IFRST + LSSTR DECODE (LSSTR,8000,STRNG(IFRST),ERR=9001) RIN 400 IF (LISTXY) WRITE (LUNTI,8500) IPNT,IC,NPARS1,NPARS2,PORIGN,RIN C C::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: C C ADJUST FOR MODE C C::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: C GO TO (430,420,410,431,432) NPARS1 C C INCREMENTAL C 410 RCOOR(IC) = RIN + MPTFM1(PARMO(IC+2),IC) GO TO 435 C C RELATIVE C 420 RCOOR(IC) = RIN + MPTFM1(PARMO(IC),IC) GO TO 435 C C ABSOLUTE C 430 RCOOR(IC) = RIN GO TO 435 C C POLAR COORDINATES (ANGLE INPUT) C 431 THETA = DEGRAD*RIN LANG = .TRUE. NPARS1 = NSW1 IF (YCOOR) GO TO 433 YCOOR = .TRUE. GO TO 150 C C POLAR COORDINATE (RADIUS INPUT) C 432 RADIUS = RIN LRAD = .TRUE. NPARS1 = NSW1 IF (YCOOR) GO TO 433 YCOOR = .TRUE. GO TO 150 C C POLAR COORDINATE (FINAL) C 433 IF (.NOT.(LANG.AND.LRAD)) GO TO 9003 RCOOR(1) = RADIUS*COS(THETA) + MPTFM1(PARMO(1),1) RCOOR(2) = RADIUS*SIN(THETA) + MPTFM1(PARMO(2),2) GO TO 500 C C ABSOLUTE, RELATIVE, INCREMENTAL C 435 IF (LANG.OR.LRAD) GO TO 9003 IF (YCOOR) GO TO 500 YCOOR = .TRUE. GO TO 150 C C------------------------------------------------------------------------------ C C TRANSFORM SPACE AND STORE C C------------------------------------------------------------------------------ C 500 RCOOR(1) = MPTFM0(RCOOR(1),1) RCOOR(2) = MPTFM0(RCOOR(2),2) PARM(IP-1) = RCOOR(1) PARM(IP) = RCOOR(2) PARMO(3) = RCOOR(1) PARMO(4) = RCOOR(2) IF (.NOT.PORIGN) GO TO 302 PARMO(1) = RCOOR(1) PARMO(2) = RCOOR(2) 302 IF (LISTXY) WRITE (LUNTI,8501) IPNT,PARM,PARMO GO TO 100 C C------------------------------------------------------------------------------ C C ERROR HANDLER C C------------------------------------------------------------------------------ C 9003 IERR = IERR + 1 9002 IERR = IERR + 1 9001 IERR = IERR + 1 CALL ERRPRT(' PARSCO',IERR,1,ERRMSG(1,IERR)) C C------------------------------------------------------------------------------ C C RETURN C C------------------------------------------------------------------------------ C 999 NXCHAR = ICHAR + 1 RETURN C C------------------------------------------------------------------------------ C C FORMATS C C------------------------------------------------------------------------------ C 8000 FORMAT (E18.0) C 8500 FORMAT (' PC-1: ',4I2,L2,E12.5) 8501 FORMAT (' PC-2: ',I2,2E11.4/(9X,4E11.4)) END