C TEXT-DRIVEN REPORT GENERATOR C C Submitted by: C C R. N. Stillwell C Institute for Lipid Research C Baylor College of Medicine C Houston, Texas 77030 C C (who would be glad to receive comments, suggestions, bug fixes, etc., but C who promises no support whatever). C C Literature reference: C C R. N. Stillwell. A low-overhead laboratory data management system C for the PDP11. Comput. Biomed. Res., 15, 29-38(1982). C C Acknowledgement: C C This software was developed under National Institutes of Health grants C GM-13901 and GM-26611. C C General permission is hereby granted to copy, modify, or distribute this C program, but not for profit. Copyright to this software is and shall C remain in the public domain. C C 20-JUL-81 SUBTASKING SUPPORT ADDED C 09-OCT-81 UNIVERSAL LIBRARY SUPPORT ADDED C 02-NOV-81 %SKIP COMMAND C 07-JAN-82 %WHILE AND %EWHILE C 07-JAN-82 ALLOW BLANKS BETWEEN % AND COMMAND C 07-JAN-82 MOVE ERROR ROUTINES OUT C 27-JAN-82 ENFORCE "STANDARD COMMON" ON ALL ROUTINES C 08-MAR-82 ADD "%FREAD ' TO CLOSE FREAD FILE C C DECLARATIONS C C INCLUDE 'COMMON.FLX' C C DECLARE COMMON BLOCKS C COMMON /TABDAT/ NREC,NCOLS,LENREC,OFFSET,IPTRD,TABREC, 1 DATA,IALT,IDUM INTEGER NREC,NCOLS,LENREC,OFFSET,IPTRD(41),TABREC BYTE DATA(1000) LOGICAL*1 IALT,IDUM !1-82 COMMON /LUN/ INLUN,OUTLUN,TILUN,TABLUN,TAILUN,RDFLUN INTEGER INLUN,OUTLUN,TILUN,TABLUN,TAILUN,RDFLUN COMMON /INPUT/ IREC,INPTR,LLINE,INLINE BYTE INLINE(132) DATA MAXIN/132/ COMMON /OUTPUT/ OUTLIN,OUTPTR,OUTEND BYTE OUTLIN (132) INTEGER OUTPTR,OUTEND DATA MAXOUT /132/ COMMON /FILES/ FILNAM,MAXFNM,MODNAM,LFNAM,FLREC, 1 MAXLVL,INLVL,OLDLVL,ULBUF,CARCTL,TERM 1 ,OUTOPN,TBOPEN,OUTFIL C C FILE STACK C BYTE FILNAM(26,5) DATA MAXFNM/26/ REAL*4 MODNAM(5) !9-OCT-81 RAD50 MODULE NAMES INTEGER LFNAM(5) !LENGTHS OF NAMES C !POINTERS TO START OF CURRENT C !OR NEXT RECORD REAL*4 FLREC(5) !9-OCT-81 CHANGED FROM C !RECORD PTR TO BYTE PTR C D INTEGER IFLREC(2,5) D EQUIVALENCE (IFLREC,FLREC) DATA MAXLVL/5/ INTEGER INLVL !CURRENT LEVEL POINTER INTEGER OLDLVL !PREVIOUS LEVEL POINTER INTEGER ULBUF (7) BYTE CARCTL LOGICAL*1 TERM,OUTOPN,TBOPEN BYTE OUTFIL(26) C C SCRATCH MEMORY. DEFINITIONS MAY DIFFER FROM SUBROUTINE TO SUBROUTINE, C OR MAY USE EQUIVALENCE STATEMENTS. C COMMON /SCRATCH/ SCRATCH BYTE SCRATCH (576) C C LOCAL DECLARATIONS C EQUIVALENCE (SCRATCH,VARVAL) !ALSO TILINE, NAME! BYTE CHAR BYTE TILINE(132) DATA MAXTI/132/ INTEGER TIPTR BYTE VARVAL(256) EQUIVALENCE (VARVAL,TILINE) !WATCH THIS! DATA MAXVAR/256/ BYTE CMDCHR DATA CMDCHR/'%'/ BYTE CARRET,NULL,BLANK,FILTYP DATA CARRET,NULL,BLANK/"15,0,"40/ LOGICAL*1 EOF,EQUAL,FILERR,EVALER,LOGIC1,GOTLAB LOGICAL*1 NOPNT,GOTEIF,LTRACE,QUOTED,SAMFIL REAL*8 VARNAM BYTE BVAR(8) EQUIVALENCE (BVAR,VARNAM) BYTE NAME(256),NAME2(25) DATA MAXNAM,MXNAM2/256,25/ BYTE FMTBUF(20) EQUIVALENCE (NAME,VARVAL) !WATCH THIS! DATA FMTBUF/'(','F','2','0','.','7',',','A','1',')',10*' '/ DATA MAXFMT/20/ DATA LFMT/20/ REAL*4 RWIND !CODE FOR REWIND CALL TO OPENF DATA RWIND /0.0/ C C while stack C INTEGER WINLVL(10) !INPUT FILE LEVEL REAL*4 WHIPTR(10) !FILE POINTERS VIA .MARK INTEGER WHILVL !WHILE STACK POINTER INTEGER MAXWHL !SIZE OF STACK DATA MAXWHL /10/ C C read file name C BYTE RDFIL(26) !9-OCT-81 C C error definitions (from error.flx) !7-jan-82 C C SELECT (IERROR) C (1) ABORT-ON-IF-ERROR C (2) ABORT-ON-FILE-ERROR C (3) ABORT-ON-INPUT-FILE-ERROR C (4) ABORT-ON-INPUT-STACK-OVERFLOW C (5) ABORT-ON-LABEL-NOT-FOUND C (6) ABORT-ON-OUTPUT-FILE-ERROR C (7) ABORT-ON-TABLE-NAME-ERROR C (8) ABORT-ON-WHILE-MATCH-ERROR C (9) ABORT-ON-WHILE-STACK-ERROR C (101) REPORT-ERROR-LINE C (102) REPORT-EVALUATION-ERROR C (103) REPORT-FILE-NAME C (104) REPORT-ILLEGAL-COMMAND C (105) REPORT-INVALID-FORMAT C (106) REPORT-SKIP-ERROR C (107) REPORT-VARIABLE-ERROR C (108) REPORT-ADDVAR-ERROR C (OTHERWISE) REPORT-UNKNOWN-ERROR C FIN C C external procedures C INTEGER ADDVAR,GETVAR C C code C INLUN = 3 OUTLUN = 4 TILUN = 5 TABLUN = 2 TAILUN = 1 RDFLUN = 6 C INLVL = 1 OLDLVL = 0 IFLVL = 0 WHILVL = 0 LTRACE = .FALSE. INITIALIZE-ERROR-RECOVERY CALL INIFIL(NAME,MAXFNM,OUTFIL,MAXFNM) LNAME = LENGTH(NAME)-1 OPEN-INPUT-FILE OUTOPN = .FALSE. TBOPEN = .FALSE. CARCTL = BLANK EOF = .FALSE. C C initialize subtasking C CALL INITAS C C get the first character and we're off C GET-CHARACTER UNTIL (EOF.AND.(INLVL.EQ.1)) WHEN (CHAR.EQ.CMDCHR) PROCESS-COMMAND ELSE MOVE-CHARACTER-TO-OUTPUT UNLESS (EOF) GET-CHARACTER IF (EOF.AND.(INLVL.NE.1)) RE-OPEN-PREVIOUS-FILE FIN CALL-EXIT C TO PROCESS-COMMAND INTEGER COMMND,CMDCMD,COPY,DUMP,EIF,ETRACE,EWHILE,EXITC, 1 FORMAT,FREAD,GET,GOTO,IFCMD,INPUT,LABEL, 1 LIST,PROMPT,PUT,OUTPUT,READ,SET,SKIP,STRING,SUBTAS, 1 TABLE,TRACE,TYPE,WHILE C ...etc. DATA CMDCMD,COPY,DUMP,EIF,ETRACE,EWHILE,EXITC, 1 FORMAT,FREAD,GET,GOTO,IFCMD,INPUT,LABEL, 1 LIST,PROMPT,PUT,OUTPUT,READ,SET,SKIP,STRING,SUBTAS, 1 TABLE,TRACE,TYPE,WHILE 1 /'% ','CO','DU','EI','ET','EW','EX','FO','FR','GE','GO', 1 'IF','IN','LA','LI','PR', 1 'PU','OU','RE','SE','SK','ST','SU','TA','TR','TY','WH'/ C ...etc. GET-COMMAND SELECT (COMMND) (CMDCMD) DO-CMDCMD-COMMAND (COPY) DO-COPY-COMMAND (DUMP) CALL DMPVAR (LFMT,FMTBUF) (EIF) DO-EIF-COMMAND (ETRACE) LTRACE = .FALSE. (EWHILE) DO-EWHILE-COMMAND (EXITC) DO-EXIT-COMMAND (FORMAT) DO-FORMAT-COMMAND (FREAD) DO-FILE-READ-COMMAND (GET) DO-GET-COMMAND (GOTO) DO-GOTO-COMMAND (IFCMD) DO-IF-COMMAND (INPUT) DO-INPUT-COMMAND (LABEL) DO-LABEL-COMMAND (LIST) DO-LIST-COMMAND (OUTPUT) DO-OUTPUT-COMMAND (PROMPT) DO-PROMPT-COMMAND (PUT) DO-PUT-COMMAND (READ) DO-READ-COMMAND (SET) DO-SET-COMMAND (SKIP) DO-SKIP-COMMAND (STRING) DO-STRING-COMMAND (SUBTAS) DO-SUBTASK-COMMAND (TABLE) DO-TABLE-COMMAND (TRACE) LTRACE = .TRUE. (TYPE) DO-TYPE-COMMAND (WHILE) DO-WHILE-COMMAND C C (otherwise) report-illegal-command (OTHERWISE) CALL ERROR (104,2,COMMND) FIN C flush remainder of input line UNLESS (COMMND.EQ.CMDCMD) INPTR = 0 FIN C C C--------------------------------------------------- C C C do-command procedures C TO DO-CMDCMD-COMMAND C %% (% is output) CHAR = CMDCHR MOVE-CHARACTER-TO-OUTPUT FIN TO DO-COPY-COMMAND C %COPY (C() (but no ) is copied to output) GET-VARIABLE C if (lenvar.lt.0) report-variable-error IF (LENVAR.LT.0) CALL ERROR (107,LENVAR,VARNAM) IF (LENVAR.GT.0) DO (I=1,LENVAR) CHAR = VARVAL(I) MOVE-CHARACTER-TO-OUTPUT FIN FIN IF (LTRACE) WRITE (TILUN,501) VARNAM,(VARVAL(I),I=1,LENVAR) 501 FORMAT (' %COPY ',A8,' :',(1X,60A1)) FIN TO DO-EIF-COMMAND IFLVL = IFLVL-1 IF (LTRACE) WRITE (TILUN,502) IFLVL 502 FORMAT (' %EIF: IF-level =',I5) C if (iflvl.lt.0) abort-on-if-error IF (IFLVL.LT.0) CALL ERROR(1,LNAME,NAME) FIN TO DO-EWHILE-COMMAND C if (term) report-illegal-command IF (TERM) CALL ERROR (104,2,COMMND) C if (inlvl.ne.winlvl(whilvl)) abort-on-while-match-error IF (INLVL.NE.WINLVL(WHILVL)) CALL ERROR (8,LNAME,NAME) C back up to while-expression and re-evaluate FLREC(INLVL) = WHIPTR(WHILVL) OPEN-INPUT-FILE C skip past text and %while SKIP-TO-COMMAND GET-COMMAND IF (LTRACE) WRITE (TILUN,5021) (INLINE(I),I=INPTR,LLINE) 5021 FORMAT (' %EWHILE',(1X,60A1)) EVALUATE-WHILE-EXPRESSION FIN TO DO-EXIT-COMMAND C %EXIT (Clean up any active %WHiles in this file and EOF). WHILE (WHILVL.GT.0.AND.WINLVL(WHILVL).EQ.INLVL) WHILVL = WHILVL-1 EOF = .TRUE. FIN TO DO-FILE-READ-COMMAND C %FREAD (Read a line from the file into variable) C %FREAD (Close current read file). WHEN (INPTR.GT.LLINE) UNLESS (RDFIL(1).EQ.0) CLOSE (UNIT=RDFLUN) RDFIL(1) = 0 FIN ELSE GET-NAME GET-VARIABLE-NAME IF (.NOT.EQUAL(NAME,RDFIL)) UNLESS (RDFIL(1).EQ.0) CLOSE (UNIT=RDFLUN) CALL MVSTR(RDFIL,NAME,25) OPEN (UNIT=RDFLUN,NAME=RDFIL,TYPE='OLD',READONLY) FIN VAREAL = 0.0 !EOF := FALSE IF (LTRACE) WRITE (TILUN,524) (RDFIL(I),I=1,LNAME) 524 FORMAT (' %FREAD from file ',(1X,80A1)) READ (RDFLUN,27,ERR=29,END=28) LENVAR,(VARVAL(I),I=1,132) 27 FORMAT (Q,132A1) LENVAR = MIN0(MAXTI,LENVAR) IF (.FALSE.) 28 VAREAL = -1.0 !EOF := TRUE FIN IF (.FALSE.) 29 CONTINUE C ABORT-ON-FILE-ERROR CALL ERROR (2,LNAME,NAME) FIN IF (LTRACE) WRITE (TILUN,525) VAREAL,VARNAM,(VARVAL(I),I=1,LENVAR) 525 FORMAT (' EOF =',F6.0,' ',A8,' = ',(1X,40A1)) STORE-VARIABLE CONVERT-REAL-TO-VARIABLE VARNAM = 'EOF' STORE-VARIABLE FIN FIN TO DO-FORMAT-COMMAND C %FORMAT (set format for %SET) C can be any legal FORTRAN format for a real number, C or "Fw" to output an integer without decimal point in **w-1** C spaces. GET-NAME CALL MVSTR(FMTBUF(2),NAME) LFMT = LNAME+1 NOPNT = INDEX(NAME,'.') .EQ. 0 IF (NOPNT) CALL MVSTR(FMTBUF(LFMT+1),'.0') LFMT = LFMT+2 FIN CALL MVSTR(FMTBUF(LFMT+1),',A1)') LFMT = LFMT+4 !FOR DMPVAR IF (LTRACE) WRITE (TILUN,503) (NAME(I),I=1,LNAME) 503 FORMAT (' %FORMAT: ',(1X,60A1)) FIN TO DO-GET-COMMAND C %GET (replace C() with C(rowno, colno) C of current table. CALL GETTAB(LTRACE,EVALER) C IF (EVALER) REPORT-ERROR-LINE IF (EVALER) CALL ERROR (101,LNAME,NAME) FIN TO DO-GOTO-COMMAND C %GOTO