I'm converting a bunch of Fortran to Coldfusion. The issue I'm running into is
compatibility. The person who wrote
the Fortran code used numerous goto tags instead of loops. I've tried
converting these tags into loops but I'm
running into problems.
Does anyone know if sfscript can use goto tags?
Originally posted by: James74
I'm converting a bunch of Fortran to Coldfusion. The issue I'm running into
is compatibility. The person who wrote
the Fortran code used numerous goto tags instead of loops. I've tried
converting these tags into loops but I'm
running into problems.
Does anyone know if sfscript can use goto tags?
No it can't.
In fortran, go to commands often equate to calling a subroutine or function.
The cold fusion way of doing this sort of thing is to:
write a separate template and use the cfinclude tag.
write a custom tag
write a user defined function. These can be put inside components if you want.
Thanks,
I had a feeling it couldn't because of similar posts. The code I'm converting
was written so sloppy that I was hoping for an easy way out. It would be nice
to just rewrite it, but there's little to no documentation and its old (uses
characters from the punch card days).
MikerRoo - 01 Dec 2005 19:37 GMT
Simple "if-then goto's are easily replaced by an if() statement.
Some multiple-referer goto's can be replaced by a function call.
The other common case can be replaced with a pseudo loop like so:
This:
If A GOTO BarfAndBail
Action_A_not
If B GOTO BarfAndBail
Action_B_not
GOTO AllDone
:BarfAndBail
print 'Awe shucks...'
STOP
:AllDone
RETURN
Becomes This:
bItsAllRight = true;
while (bItsAllRight) //-- Pseudo loop for code ease
{
If (A)
{
bItsAllRight = false;
break;
}
Action_A_not (); //-- Or list of statements
If (B)
{
bItsAllRight = false;
break;
}
Action_B_not (); //-- Or list of statements
break; //-- Never really want to loop
}
if (NOT bItsAllRight)
{
WriteOutput ('That corks it!');
Abort ('Awe shucks...'); //-- This is a UDF wrapper for cfabort.
}
Return ();
It is also possible to write a "compiler" that converts the code (I've done it
in past lives) but editor macros can probably greatly speed the conversion with
less fuss.
> I'm converting a bunch of Fortran to Coldfusion. The issue I'm running into is
> compatibility. The person who wrote
can you post a bit of the code? it's been so long that i've seen any
fortran that i'd enjoy looking thru some :-)
Hi Paul H. Sorry about the late response. Here's some FORTRAN code for you:
SUBROUTINE SSESCR
C
IMPLICIT INTEGER (A-Z)
C
INCLUDE 'MOLE.INC'
INCLUDE 'SUBS.INC'
INCLUDE 'USE.INC'
INCLUDE 'TYPE.INC'
INCLUDE 'DEBUG.INC'
C.................................................
C.... THIS ROUTINE SCREENS FOR POSATMIBLE ATOMS.....
C.... IN THE SUB-GRAPH FROM THE MOLECULE .........
C.................................................
C.... INITIALIZE INTERNAL VARIABLES ..............
C.................................................
SUBOK=1
NUMSGP=0
IF(BUGSSE.EQ.1) TYPE *,NUMSBD,NUMSAT,NUMBND,NUMATM
IF(NUMATM.LT.NUMSAT) SUBOK=0
IF(NUMBND.LT.NUMSBD) SUBOK=0
IF(NUMRNG.LT.NUMSRG) SUBOK=0
IF(SUBOK.EQ.0) RETURN
DO I=1,NUMSAT
POSBEG(I)=0
POSEND(I)=0
ENDDO
NPOSS=0
C..................................................
C... FIND FIRST POSSIBLE FOR ATOM 1 ...............
C..................................................
DO I=1,NUMSAT
POSBEG(I)=NPOSS+1
ISAT=SATM(I)
ISAD=SATMDG(I)
ISAC=SATMCH(I)
DO 100 J=1,NUMATM
IAAT=ATMTYP(J)
IAAD=ATMDEG(J)
IAAC=ATMCHR(J)
C... CHECK FOR WILDCARD HALOGENS......................
IF(ISAT.EQ.WLDHAL) THEN
IF(IAAT.EQ.CHLORO) GOTO 1000
IF(IAAT.EQ.FLORO ) GOTO 1000
IF(IAAT.EQ.IODO ) GOTO 1000
IF(IAAT.EQ.BROMO ) GOTO 1000
ENDIF
CHKA=0
IF(BUGSSE.EQ.1) TYPE *,' IAAT,ISAT=',IAAT,ISAT,IAAD,ISAD,
* iaac,isac
IF(ISAT.EQ.IAAT) CHKA=1
IF(CHKA.EQ.0.AND.ISAT.NE.WLDATM) GOTO 100
CHKD=0
IF(ISAD.EQ.IAAD) CHKD=1
IF(ISAT.EQ.TMPRT) CHKD=1
IF(ISAT.EQ.TMPRTA) CHKD=1
IF(ISAT.EQ.WLDATM) THEN
CHKA=1
CHKD=1
ENDIF
CHKC=0
IF(ISAC.EQ.IAAC .OR. ISAT.EQ.WLDATM) CHKC=1
CHKC=1 ! turn off charge checking until consequences studied
C IF(ISAC.EQ.IAAC) CHKC=1
C IF(ISAC.EQ.0.AND.ISAT.EQ.WLDATM) CHKC=1
C THE ABOVE LINE WAS CHANGED TO BE MORE SPECIFIC *********
C... CHECK OTHER QUALIFIERS ................
CHKDA=0
CHKDI=0
CHKRA=0
CHKRI=0
CHKO=1
DO 300 L=2,SATMQL(1,I)
IQL=SATMQL(L,I)
GOTO (201,202,203,204,205,206,207,
* 208,209,210,211,212,213,214,
* 215,216,217,218,219,220,221,
* 222,223,224) IQL
201 IF(ISAT.EQ.WLDATM.AND.IAAT.EQ.CARBON) CHKRA=1
CHKRI=1
GOTO 300
202 IF(ISAT.EQ.WLDATM.AND.IAAT.EQ.OXEGEN) CHKRA=1
CHKRI=1
GOTO 300
203 IF(ISAT.EQ.WLDATM.AND.IAAT.EQ.NITRO ) CHKRA=1
CHKRI=1
GOTO 300
204 IF(ISAT.EQ.WLDATM.AND.IAAT.EQ.SULFUR) CHKRA=1
CHKRI=1
GOTO 300
205 IF(ISAT.EQ.WLDATM.AND.IAAT.EQ.PHOS ) CHKRA=1
CHKRI=1
GOTO 300
206 IF(INRING(J).EQ.0) CHKO=0
GOTO 300
207 IF(INRING(J).LT.2) CHKO=0
GOTO 300
208 IF(ISAT.NE.IAAT) CHKA=1
GOTO 300
209 IF(INRING(J).NE.0) CHKO=0
GOTO 300
210 AR=0
DO JJ=ATMBEG(J),ATMEND(J)
IF(BNDTY(JJ).EQ.AROMAT) AR=AR+1
ENDDO
IF(INRING(J).EQ.0.OR.AR.EQ.0) CHKO=0
GOTO 300
211 CHKDA=1
CHKDI=1
GOTO 300
212 IF (IAAD.EQ.1) CHKDA=1
CHKDI=1
GOTO 300
213 IF (IAAD.EQ.2) CHKDA=1
CHKDI=1
GOTO 300
214 IF (IAAD.EQ.3) CHKDA=1
CHKDI=1
GOTO 300
215 IF (IAAD.EQ.4) CHKDA=1
CHKDI=1
GOTO 300
216 CONTINUE
RN=3
GOTO 21900
217 CONTINUE
RN=4
GOTO 21900
218 CONTINUE
RN=5
GOTO 21900
219 CONTINUE
RN=6
21900 CONTINUE
IF(INRING(J).EQ.0) THEN
CHKO=0
GOTO 300
ENDIF
DO LL=1,NUMRNG
IF(RINGL(LL).EQ.RN) THEN
DO LLL=1,RINGL(LL)
IF(J.EQ.RING(LLL,LL)) GOTO 300
ENDDO
ENDIF
ENDDO
CHKO=0
GOTO 300
220 CONTINUE
DO LL=ATMBEG(J),ATMEND(J)
IF(BNDTY(LL).NE.SINGLE) THEN
CHKO=0
GOTO 300
ENDIF
ENDDO
GOTO 300
221 CONTINUE
DO LL=ATMBEG(J),ATMEND(J)
IF(BNDTY(LL).EQ.DOUBLE) GOTO 300
ENDDO
CHKO=0
GOTO 300
222 CONTINUE
DO LL=ATMBEG(J),ATMEND(J)
IF(BNDTY(LL).EQ.AROMAT) THEN
CHKO=0
GOTO 300
ENDIF
ENDDO
GOTO 300
223 IF (IAAT .EQ. FLORO ) GOTO 298 ! halogens ...
224 IF (IAAT .EQ. CHLORO) GOTO 298 ! ... or halogens less fluorine
IF (IAAT .EQ. BROMO ) GOTO 298
IF (IAAT .EQ. IODO ) GOTO 298
GOTO 299
298 IF (ISAT .EQ. WLDATM) CHKRA= 1 ! must be a wild card atom
299 CHKRI=1
300 CONTINUE
C.... IS IF IT ATOM IS INCLUDED .........................
CHKR=1
IF(CHKRI.EQ.1) CHKR=CHKRA
IF(CHKDI.EQ.1) CHKD=CHKDA
IF(BUGSSE.EQ.1) TYPE 333,I,CHKA,CHKD,CHKC,CHKO,CHKR
333 FORMAT(' CHECK:I=',I2,' A,D,C,O,R=',5(I1,X))
IF(CHKA*CHKD*CHKC*CHKO*CHKR.EQ.0) GOTO 100
C.... ADD IN NEW POSATMIBLIITY ............................
1000 CONTINUE
NPOSS=NPOSS+1
POSATM(NPOSS)=J
100 CONTINUE
POSEND(I)=NPOSS
IF(POSBEG(I).GT.POSEND(I)) THEN
IF(BUGSSE.NE.0) TYPE *,' ZAP OUT AT ',I
SUBOK=0
RETURN
ENDIF
IF(BUGSSE.EQ.1) TYPE 1234,I,POSBEG(I),POSEND(I),
* (POSATM(LL),LL=POSBEG(I),POSEND(I))
1234 FORMAT(' I=',I2,' PB(I)=',I3,' PE(I)=',I3,
* ' ATT=',25(I2,X))
ENDDO
C........................................................
C... PRUNE OUT ALL REAL OBVIOUS MISTAKES ................
C........................................................
20000 CONTINUE
LOPOK=0
DO FROM=1,NUMSAT
DO IT=SATMBG(FROM),SATMED(FROM)
TO=SBNDTO(IT)
BD=SBNDTY(IT)
DO IPF=POSBEG(FROM),POSEND(FROM)
IPFA=POSATM(IPF)
IF(IPFA.NE.0) THEN
DO IPT=POSBEG(TO),POSEND(TO)
IPTA=POSATM(IPT)
IF(IPTA.NE.IPFA) THEN
DO 4900 JJ=ATMBEG(IPFA),ATMEND(IPFA)
IF(BNDTO(JJ).NE.IPTA) GOTO 4900
IF (BD.EQ.WLDBND) GOTO 5000
IF (BNDTY(JJ).NE.BD) GOTO 4900
GOTO 5000
4900 CONTINUE
if(bugsse.eq.1) type *,'a1,a2,b1,b2=',
* bndto(jj),ipta,bndty(jj),bd
ENDIF
ENDDO
IF(BUGSSE.EQ.1) TYPE 5673,FROM,TO,IPF,IPFA,IPT,IPTA
5673 FORMAT(' ZAP IPF;FROM,TO,IPF,IPFA,IPT,IPTA=',10(I3,X))
POSATM(IPF)=0
LOPOK=1
5000 CONTINUE
ENDIF
ENDDO
ENDDO
21000 CONTINUE
IF(BUGSSE.EQ.1) TYPE 5555,FROM,(POSATM(L),
* L=POSBEG(FROM),POSEND(FROM))
5555 FORMAT(' PRUNE:FROM=',I2,' PPOSATM=',20(I2,X))
ENDDO
C-----------------------------------------------------------
C... COLLECT NON ZERO TERMS AND RETURN....................
NPOSS=0
DO I=1,NUMSAT
IB=POSBEG(I)
POSBEG(I)=NPOSS+1
DO J=IB,POSEND(I)
IF(POSATM(J).NE.0) THEN
NPOSS=NPOSS+1
POSATM(NPOSS)=POSATM(J)
ENDIF
ENDDO
POSEND(I)=NPOSS
IF(POSBEG(I).GT.POSEND(I)) THEN
SUBOK=0
RETURN
ENDIF
IF(BUGSSE.EQ.1) TYPE 123,I,(POSATM(L),L=POSBEG(I),POSEND(I))
123 FORMAT(' END OF PRUNE:I=',I2,':',20(I2,X))
ENDDO
IF(LOPOK.EQ.1) GOTO 20000
RETURN
END