C$UT INCLUD PROCESS %INCLUDE STATEMENTS IN SOURCE CODE C. 14-AUG-78 P. H. CANNON EXTENSIVE REVISIONS TO C. DOCUMENTATION C. 25-OCT-77 P. H. CANNON C.AU CANNON, PHILIP H. C.ID V1.0 C.EN RSX-11M V3.1 C.CH FORTRAN IV C.KW INCLUDE; PREPROCESSOR C.AB THE INCLUDE TASK IS MEANT TO BE USED JUST PRIOR TO COMPILING A C. PROGRAM. THE TASK READS THROUGH A SOURCE PROGRAM AND GENERATES C. AN OUTPUT FILE. EACH STATEMENT IN THE SOURCE PROGRAM IS COPIED C. TO THE OUTPUT FILE. STATEMENTS OF THE FORM "C %INLUDE FLN" C. ARE REPLACE WITH THE CONTENTS OF THE FILE NAMED "FLN". THE C. OUTPUT FILE IS THEN PASSED TO THE FORTRAN IV COMPILER OR THE C. MACRO-11 ASSEMBLER. C. C.EP STEP BY STEP ON HOW TO USE THE INCLUDE TASK: C. C. A. INSTALL THE INCLUDE TASK IN YOUR SYSTEM. (YOUR SYSTEM MANAGER C. MAY HAVE TO DO THIS, AND IT SHOULD ONLY BE DONE ONCE.) C. C. INS $INCLUD/TASK=...INC C. C. B. EDIT THE FILE ( FLN.INC) THAT CONTAINS THE STATEMENTS TO BE C. INCLUDED IN SEVERAL MAIN PROGRAMS. C. C. C. EDIT A FILE CONTAINING THE SOURCE OF A MAIN PROGRAM C. ( MAIN.FTN). IN THE MAIN PROGRAM PLACE THE INCLUDE STATEMENT C. (C %INCLUDE FLN.INC) AT THE POINT THE STATEMENTS IN THE C. INCLUDE FILE SHOULD APPEAR. (SEE BELOW FOR A DETAILED C. SPECIFICATION ON THE SYNTAX OF THE %INCLUDE STATEMENT) C. C. D. INVOKE THE INCLUDE TASK TO EXPAND THE SOURCE OF THE MAIN C. PROGRAM (MAIN.FTN) INTO A NEW FILE (MAIN.EXP) THAT CONTAINS C. THE MAIN PROGRAM PLUS THE CONTENTS OF ALL FILES WHOSE NAMES C. APPEAR ON INCLUDE STATEMENTS. C. C. INC MAIN.FTN C. C. THE FILE NAME "MAIN.FTN" CANNOT SPECIFY A DEVICE OR UIC. C. "MAIN.FTN" MUST RESIDE UNDER THE USER'S UIC AND BE ON THE C. USER'S "SY:" DEVICE. C. C. E. THE OUTPUT FILE FROM THE INCLUDE TASK (MAIN.EXP) IS PASSED C. TO THE COMPILER. THE OUTPUT FILE GENERATED BY THE INCLUDE C. TASK ALWAYS HAS THE SAME NAME AS THE INPUT FILE, BUT INCLUDE C. APPENDS THE EXTENSION ".EXP". C. C. FOR MAIN,LP=MAIN.EXP C. C. F. DELETE THE EXPANDED SOURCE PROGRAM. C. C. PIP MAIN.EXP;*/DE C. C. C. BELOW IS AN ALTERNATE WAY TO INVOKE THE INCLUDE TASK C. WHICH DOES NOT REQUIRE THE TASK TO BE INSTALLED. C. C. FIRST ELIMINATE STEP A ABOVE C. THEN REPLACE THE LINE "INC MAIN.FTN" IN STEP D WITH C. THE TWO LINES: C. C. RUN $INCLUD C. ENTER FILE NAME: MAIN.FTN C. C. C. C. C. THE SYNTAX OF THE %INCLUDE STATEMENT IS AS FOLLOWS: C. C. C %INCLUDE FILENAME.XXX C. C. WHERE: C. C. THE "C" IS THE COMMENT CHARACTER; IT IS A "C" IN C. FORTRAN IV AND A ";" IN MACRO-11. C. C. THE % CHARACTER MUST BE IN COLUMNS 1-7. C. C. THE "FILENAME" IS ANY 9 CHARACTER FILE NAME THAT C. RESIDES ON THE DEVICE "SY:" AND IS UNDER UIC [77,77]. C. DEVICE NAMES AND UICS CANNOT APPEAR IN THE "FILENAME". C. C. THE ".XXX" REPRESENTS ANY VALID 3 CHARACTER EXTENSION. C. IF ".XXX" IS OMITTED, THEN ".INC" IS ASSUMED. C. C. C. C. ERROR MESSAGES C. "CANNOT CREATE OUTPUT FILE XXXXX.EXP" --- THE OUTPUT FILE C. XXXXX.EXP CANNOT BE ALLOCATED. C. "INCLUDE FILE NOT FOUND= XXXXX.XXX" --- THE FILE XXXXX.XXX C. APPEARS ON AN %INCLUDE STATEMENT, BUT IT CANNOT BE FOUND. C. "SOURCE FILE NOT FOUND= XXXXX.XXX" --- THE FILE XXXXX.XXX C. WAS GIVEN AS THE SOURCE FILE TO THE INCLUDE TASK, BUT IT CANNOT C. BE FOUND. C. C.EXAMPLES C. C. ********** AN EXAMPLE FOR FORTRAN IV PROGRAMS ********** C. C. CREATE THE FILE TO BE INCLUDED SY:[77,77]TESTCOM.INC C. C. INTEGER*2 A,B,C,D C. COMMON /TEST/A,B,C,D C. C. CREATE THE SOURCE FILE TEST.FTN C. C. C %INCLUDE TESTCOM C. A=1 C. B=2 C. C=3 C. D=4 C. END C. C. C. C. TO EXPAND THE "INCLUDE" FILES IN TEST.FTN WE TYPE: C. C. INS $INCLUD/TASK=...INC (DO ONLY ONCE) C. INC TEST.FTN C. C. C. THE RESULTING EXPANDED FILE TEST.EXP LOOKS LIKE: C. C. INTEGER*2 A,B,C,D C. COMMON /TEST/A,B,C,D C. A=1 C. B=2 C. C=3 C. D=4 C. END C. C. TO COMPILE TEST.EXP WE TYPE: C. C. FOR TEST,TEST=TEST.EXP C. C. C. THE RESULTING LISTING FILE TEST.LST LOOKS LIKE C. C. C. FORTRAN IV V01C-03D WED 23-AUG-78 07:56:21 PAGE 001 C. CORE=12K, UIC=[3,3] TEST,TEST=TEST.EXP C. C. 0001 INTEGER*2 A,B,C,D C. 0002 COMMON /TEST/A,B,C,D C. 0003 A=1 C. 0004 B=2 C. 0005 C=3 C. 0006 D=4 C. 0007 END C. C. C. FORTRAN IV STORAGE MAP C. C. NAME OFFSET ATTRIBUTES C. C. COMMON BLOCK /TEST/ LENGTH 000010 C. C. A 000000 INTEGER*2 VARIABLE C. B 000002 INTEGER*2 VARIABLE C. C 000004 INTEGER*2 VARIABLE C. D 000006 INTEGER*2 VARIABLE C. C. C. WE THEN DELETE THE EXPANDED FILE BY TYPING: C. C. PIP TEST.EXP;*/DE C. C. ********** AN EXAMPLE FOR MACRO-11 PROGRAMS ********** C. C. CREATE THE FILE TO BE INCLUDED SY:[77,77]DEF.INC CONTAINS C. C. ; DEFINITIONS FOR THE DATA BASE C. A1=0 C. A2=2 C. A3=4 C. C. C. CREATE THE SOURCE FILE TEST.MAC CONTAINS C. C. ; THIS IS A TEST PROGRAM C. .TITLE TEST C. ; %INCLUDE DEF C. MOV #TABLE,R0 C. MOV #1,A1(R0) C. MOV #2,A2(R0) C. MOV #3,A3(R0) C. .END C. C. TO EXPAND THE INCLUDE FILES IN TEST. MAC WE TYPE: C. (WE WILL ALSO ILLUSTRATE THE ALTERNATE METHOD OF C. INVOKING THE INCLUDE TASK.) C. C. C. RUN $INCLUD C. ENTER FILE NAME: TEST.MAC C. C. C. THE RESULTING EXPANDED FILE TEST.EXP LOOKS LIKE: C. C. ; THIS IS A TEST PROGRAM C. .TITLE TEST C. ; DEFINITIONS FOR THE DATA BASE C. A1=0 C. A2=2 C. A3=4 C. MOV #TABLE,R0 C. MOV #1,A1(R0) C. MOV #2,A2(R0) C. MOV #3,A3(R0) C. .END C. C. TO ASSEMBLE THE EXPANDED FILE TEST.EXP WE TYPE: C. C. MAC TEST,TEST=TEST.EXP C. C. C. THE RESULTING LISTING FILE TEST.LST LOOKS LIKE: C. C. C. TEST MACRO M1110 23-AUG-78 07:57 PAGE 1 C. C. C. 1 ; THIS IS A TEST PROGRAM C. 2 .TITLE TEST C. 3 ; DEFINITIONS FOR THE DATA BASE C. 4 000000 A1=0 C. 5 000002 A2=2 C. 6 000004 A3=4 C. 7 000000 012700 000000G MOV #TABLE,R0 C. 8 000004 012760 000001 000000 MOV #1,A1(R0) C. 9 000012 012760 000002 000002 MOV #2,A2(R0) C. 10 000020 012760 000003 000004 MOV #3,A3(R0) C. 11 000001 .END C. C. TEST MACRO M1110 23-AUG-78 07:57 PAGE 1-1 C. SYMBOL TABLE C. C. A1 = 000000 A2 = 000002 A3 = 000004 TABLE = ****** GX C. C. . ABS. 000000 000 C. 000026 001 C. ERRORS DETECTED: 0 C. C. VIRTUAL MEMORY USED: 59 WORDS ( 1 PAGES) C. DYNAMIC MEMORY: 3244 WORDS ( 12 PAGES) C. ELAPSED TIME: 00:00:02 C. TEST,TEST=TEST.EXP C. C. C. C. TO DELETE THE EXPANDED FILE TEST.EXP WE TYPE: C. C. C. PIP TEST.EXP;*/DE C. C. C. ********* A SHORT CUT USING INDIRECT COMMAND FILES ********* C. C. TO AVOID TYPING IN THREE COMMAND LINES ALL THE TIME, ONE MIGHT C. TRY THE FOLLOWING INDIRECT COMMAND FILE. THE INCLUDE TASK C. (...INC) MUST BE INSTALLED TO BE USED FROM AN INDIRECT COMMAND C. FILE. C. C. THE FILE IS INCFOR.CMD C. .ENABLE SUBSTITUTION C. .ASK FILE ENTER FILENAME C. INC 'FILE'.FTN C. FOR 'FILE',LP='FILE'.EXP C. PIP 'FILE'.EXP;*/DE C. C. C. THEN TO COMPILE THE FORTRAN EXAMPLE ABOVE WE JUST TYPE C. C. C. @INCFOR C. ENTER FILENAME [S]: TEST C. C. C. ********************************************************* C. C.NOTES: C. THE %INCLUDE STATEMENTS CANNOT BE NESTED, THAT IS AN INCLUDE C. FILE CANNOT CONTAIN A %INCLUDE STATEMENT. HOWEVER, THE NUMBER C. OF INCLUDE STATEMENTS A PROGRAM CAN HAVE IS NOT LIMITED. C. C. TO REMOVE THE RESTRICTION THAT THE "MAIN.FTN" CANNOT CONTAIN C. A DEVICE NAME OR UIC SPECIFICATION WOULD REQUIRE ADDITIONAL C. PARSING. C. C. TO REMOVE THE RESTRICTION THAT THE "FILENAME" ON THE INCLUDE C. STATEMENT CANNOT CONTAIN A DEVICE NAME OR UIC SPECIFICATION C. WOULD REQUIRE ADDITIONAL PARSING. C. C. THE RESTRICTION OF REQUIRING THE TASK TO BE INSTALLED IS SO C. THE SYSTEM ROUTINE "GETMCR" CAN GET THE MCR LINE WHEN THE INCLUDE C. TASK IS INVOKED FROM AN INDIRECT COMMAND FILE. C. C. THE ABOVE RESTRICTIONS WERE CONSIDERED TOLEARABLE SINCE IT WAS C. INTENDED THAT ALL ".INC" FILES WERE TO RESIDE UNDER ONE UIC AND C. THE "SY:" VOLUMNE WAS LARGE ENOUGH TO HOLD ALL OF THE C. SOURCE FILES. C. C. C. C. A BRIEF THEORY OF OPERATION IS INCLUDED FOR REFERENCE C. C. THE INLCUDE TASK GETS THE NAME OF A SOURCE INPUT FILE FROM C. THE MCR COMMAND LINE OR FROM THE KEYBOARD. C. C. IT THEN CREATES AN OUTPUT FILE WITH THE SAME NAME AS THE C. INPUT FILE, BUT WITH THE EXTENSION ".EXP" FOR EXPANDED. C. C. EACH SOURCE LINE IN THE INPUT FILE IS COPIED TO THE C. OUTPUT FILE. C. ALONG THE WAY COLUMNS 1-7 OF EVERY LINE ARE INSPECTED. C. IF A % CHARACTER APPEARS IN COLUMNS 1-7 THE SEVEN CHARACTERS C. IN THE WORD "INCLUDE" ARE SKIPPED (NOTE: THE WORD INCUDE IS NOT C. CHECKED FOR) AND THE FILENAME.XXX IS FOUND. C. C. THE FILENAME.XXX IS OPENED AND ALL LINES ARE PASSED TO THE C. OUTPUT FILE. WHEN EOF ON THE FILENAME.XXX IS ENCOUNTERED, THE C. TASK RETURNS TO THE NEXT LINE IN THE MAIN SOURCE FILE. C. C. THE LINE CONTAINING THE %INCLUDE IS NOT COPIED TO THE OUTPUT C. FILE. WHEN EOF IS REACHED ON THE INPUT FILE, ALL FILES ARE C. CLOSED AND THE INCLUDE TASK EXITS. C. C. C.SC INIT-INIT C. SYSLIB-GETMCR C. DARIO-WRITE C. DARIO-READ C. MVC-MVC C. OPEN-OPEN C. CLOSE-CLOSE C. SYSLIB-EXIT C. C LOGICAL*1 HOCIN(2),HOCOUT(2),HOCINC(2) INTEGER*2 LUNIN,LUNOUT,LUNINC INTEGER*2 DSW REAL*4 EXP,INC LOGICAL*1 PERCNT,BLANK,PERIOD,LINE(132) LOGICAL*1 FDBIN(128),FDBOUT(128),FDBINC(128) LOGICAL*1 NAMIN(26),NAMOUT(26),NAMINC(26) DATA PERCNT/'%'/ DATA BLANK/' '/ DATA PERIOD/'.'/ DATA EXP/'.EXP'/,INC/'.INC'/ IN=5 IOUT=5 LUNIN=1 LUNOUT=2 LUNINC=3 CALL INIT(FDBIN) CALL INIT(FDBOUT) CALL INIT(FDBINC) C C SET UP THE FACC C FA.RD HOCIN(1)=1 C SET UP THE RACC HOCIN(2)=0 C SET UP THE FACC C FA.WRT,FA.EXT,FA.CRE,FA.NSP HOCOUT(1)="116 C SET UP THE RACC HOCOUT(2)=0 C SET UP THE FACC C FA.RD HOCINC(1)=1 C SET UP THE RACC HOCINC(2)=0 DO 50 I=1,132 50 LINE(I)=BLANK DSW=0 CALL GETMCR(LINE,DSW) IF(DSW .GT. 3) GO TO 10000 WRITE(IOUT,100) 100 FORMAT(1X,'ENTER FILE NAME ',$) READ(IN,200) (NAMIN(I),I=1,26) 200 FORMAT(26A1) C PUT A ZERO AT THE END OF THE INPUT FILE NAME 250 CONTINUE DO 300 I=1,26 IF(NAMIN(I) .EQ. BLANK) NAMIN(I)=0 300 CONTINUE C C C CONSTRUCT THE OUTPUT FILE NAME BY USING C THE INPUT FILE NAME PLUS THE EXTENSTION "EXP". C K=1 350 NAMOUT(K)=NAMIN(K) C FIRST LOCATE THE END OF THE INPUT FILE NAME C OR THE BEGINNING OF ITS EXTENSION. K=K+1 IF (NAMIN(K) .EQ. 0) GO TO 375 IF (NAMIN(K) .EQ. PERIOD) GO TO 375 GO TO 350 C C ADD ON THE "EXP" EXTENSION C C 375 CALL MVC(EXP,NAMOUT(K),4) C PUT A ZERO AT THE END OF THE OUTPUT FILE NAME NAMOUT(K+4)=0 C C C OPEN THE FORTRAN SOURCE INPUT FILE CALL OPEN(FDBIN,HOCIN,LUNIN,,,NAMIN,IER) IF (IER .LT. 0) GO TO 9000 C CREATE THE NEW OUTPUT FILE C SET UP THE RECORD TYPE BYTE "F.RTYP" C FOR VARIABLE LENGTH RECORDS (R.VAR) FDBOUT(1)=2 C SET UP THE RECORD ATTRIBUTE BYTE "F.RATT" C FOR LINE FEEDS BEFORE AND CARRAIGE RETURNS C AFTER A LINE IS PRINTED (FD.CR) FDBOUT(2)=2 CALL OPEN(FDBOUT,HOCOUT,LUNOUT,,,NAMOUT,IER) IF(IER .LT. 0) GO TO 7000 C C CLEAR THE LINE BUFFER C 1000 CONTINUE C DO 400 I=1,132 400 LINE(I)=BLANK C C C READ A LINE FROM THE SOURCE INPUT FILE CALL READ(FDBIN,LINE,132,NBT,IER) C CHECK FOR END OF FILE IF(IER .EQ. 0) GO TO 5000 C C C LOOK FOR A % (PERCENT) IN THE FIRST SEVEN COLUMNS C M=0 DO 1100 I=1,7 1100 IF(LINE(I) .EQ. PERCNT) M=I IF(M .NE. 0) GO TO 1300 C WRITE THE LINE TO THE OUTPUT FILE CALL WRITE(FDBOUT,LINE,NBT,,IER) GO TO 1000 C C C C HERE IF A PERCENT WAS FOUND C C C ASSUME IT IS A %INCLUDE. M POINTS TO THE C PERCENT (%) SIGN. C C C SKIP PAST THE WORD "INCLUDE" C 1300 IF (LINE(M) .EQ. BLANK) GO TO 1320 M=M+1 GO TO 1300 C C C FIND THE FIRST CHARACTER IN THE FILE NAME C 1320 IF (LINE(M) .NE. BLANK .OR. M .EQ. 132) GO TO 1340 M=M+1 GO TO 1320 C C HERE TO PICK UP THE FILE NAME C 1340 L=0 DO 1400 I=1,26 IF (M .GT. 130) GO TO 1420 IF (M .EQ. 130) LINE(M)=BLANK NAMINC(I)=LINE(M) C PUT A ZERO AT THE END OF THE %INCLUDE FILE NAME IF (LINE(M) .EQ. BLANK) NAMINC(I)=0 C CHECK TO SEE IF AN EXTENSION EXISTS IF (LINE(M) .EQ. PERIOD) L=1 1400 M=M+1 C C 1420 CONTINUE C C IF AN EXTENSION EXISTS, THEN USE IT IF (L .NE. 0) GO TO 1480 C IF ONE DOES NOT EXISTS, THEN USE .INC L=1 1450 IF(NAMINC(L) .EQ. 0) GO TO 1475 L=L+1 GO TO 1450 C C C INSERT THE EXTENSTION ".INC" C 1475 CALL MVC(INC,NAMINC(L),4) C C 1480 CONTINUE C OPEN THE FILE NAME ON THE %INCLUDE STATEMENT CALL OPEN(FDBINC,HOCINC,LUNINC,'SY:','[77,77]',NAMINC,IER) IF (IER .LE. 0) GO TO 8000 C C COPY THE INCLUDE FILE TO THE OUTPUT FILE 1500 CALL READ(FDBINC,LINE,132,NBT,IER) IF(IER .EQ. 0) GO TO 2000 CALL WRITE(FDBOUT,LINE,NBT,,IER) GO TO 1500 C C C HERE WHEN THE INCLUDE FILE IS EMPTY C 2000 CALL CLOSE(FDBINC) GO TO 1000 C C C HERE WHEN THE SOURCE FILE IS EMPTY. C THIS MEANS THE PROGRAM HAS COMPLETED C 5000 CALL CLOSE(FDBIN) CALL CLOSE(FDBOUT) CALL EXIT C C HERE WHEN THE OUTPUT FILE CANNOT BE OPENED C 7000 WRITE(IOUT,7100) (NAMOUT(I),I=1,26) 7100 FORMAT(1X,'CANNOT CREATE OUTPUT FILE = ',26A1) GO TO 5000 C C C C HERE WHEN THE % INCLUDE FILE CANNOT BE FOUND C 8000 WRITE(IOUT,8100) (NAMINC(I),I=1,26) 8100 FORMAT(1X,'INCLUDE FILE NOT FOUND= ',26A1) GO TO 1000 C C C C HERE IF WE CANNOT FIND THE SOURCE FILE C 9000 WRITE(IOUT,9100)(NAMIN(I),I=1,26) 9100 FORMAT(1X,'SOURCE FILE NOT FOUND= ',26A1) CALL EXIT C C HERE IF A FILE NAME HAS BEEN GIVEN ON THE MCR C COMMAND LINE. C THE COMMAND LINE HAS THE FOLLOWING FORMAT: C >INC FILENAME.EXT C C C SET M EQUAL TO START OF FIRST CHARACTER IN THE FILE NAME C NOTE IF THE USER TYPES: >INC FILENAME.EXT, THE MCR C WILL REMOVE THE EXTRA BLANKS AND PASS >INC FILENAME.EXT 10000 M=5 C COMPUTE THE NUMBER OF CHARACTERS IN THE FILE NAME. N=DSW-4 C COPY THE FILE NAME TO NAMINC DO 10100 I=1,N NAMIN(I)=LINE(M) 10100 M=M+1 C PUT A ZERO AFTER THE FILE NAME NAMIN(N+1)=0 GO TO 250 C END