C FILE [6,10]ACCTPRE.FTN C C P. KURJAN 3-OCT-82 C C WITH THANKS TO STEVEN G. DUFF FOR PROVIDING CHARGEBACK ACCOUNTING TOOLS C ON RSX-11M SIG TAPE, UIC [370,120] C C REVISION HISTORY: C C DESCRIPTION: C C THIS PROGRAM PREPROCESSES THE DATA FROM THE "ACC" ACCOUNTING C UTILITY. THE PREPROCESSED OUTPUT MAY BE USED AS INPUT TO A REPORT C GENERATOR. ONE OR MORE INPUT FILES MAY BE PREPROCESSED INTO A SINGLE C OUTPUT FILE. C C THIS PROGRAM ALSO PROVIDES FOR MODIFICATION OF PREPROCESSED OUTPUT FILES C TO REFLECT CHANGES IN CHARGE RATES. C C RATES AND RECORD SELECTION PARAMETERS MAY BE READ FROM A PARAMETER FILE. C C THE MACRO SOURCE FOR THE ACC UTILITY SHOULD BE CONSULTED FOR A DETAILED C EXPLANATION OF THE ACCOUNTING RECORD WRITTEN FOR TASKS AND FOR CONNECT C TIME (PSEUDO-TASKS). C C IF THE USER WISHES TO PREPROCESS DATA FROM THE CURRENTLY OPEN ACCOUNTING C FILE, HE SHOULD: C C 1. HALT SYSTEM ACCOUNTING BY TYPING "RES ACC" C 2. COPY OR RENAME "ACCTLOG.DAT" (THE OUTPUT FILE FROM THE ACC UTILITY). C 3. RESUME SYSTEM ACCOUNTING BY TYPING "ACC" (if ACCTLOG.DAT was renamed, C a new ACCTLOG.DAT will be created. If copied, the old ACCTLOG.DAT C will be appended). C 4. PROCEED WITH PREPROCESSING, USING THE COPIED OR RENAMED "ACCTLOG.DAT" C AS AN INPUT FILE. C C THIS PROGRAM FORMATS THE LOGGED DATA FOR ASCII OUTPUT. IT SELECTS RECORDS C FOR PREPROCESSING, AND CALCULATES CHARGES, BASED ON PARAMETERS FROM THE C PARAMETER FILE. C C THE FORMAT OF THE OUTPUT RECORD IS AS FOLLOWS: C RECORD DATA C POSITIONS C --------- ---- C 1..3 GROUP OF UIC (octal) C 4..6 USER OF UIC (octal) C 7..12 TASKNAME (ascii) C 14..15 START YEAR (EG 83) C 16..17 START MONTH C 18..19 START DAY C 20..21 START HOUR (range 0-23) C 22..23 START MINUTE C 24..25 START SECOND C 27..29 TASK PRIORITY (decimal) C 30..31 TASK MEMORY IN KBYTES (decimal) C 32..39 WALL TIME OF TASK IN SECONDS (F8.1 - 999999.9) C 40..47 CPU TIME OF TASK IN SECONDS (F8.1 - 999999.9) C 48..55 DISK TIME OF TASK IN SECONDS (F8.1 - 999999.9) C 56..63 LINE PRINTER TIME OF TASK IN SECS (F8.1 - 999999.9) C 64..72 DOLLAR TOTAL. (F9.2 - 999999.99) C C NOTE THAT ALL OUTPUT EXCEPT DOLLAR TOTAL IS OBTAINED FROM THE LOG RECORD C INPUT FILE(S). C C TASKBUILD WITH OPTIONS: C ACTFIL=3 C UNITS=5 C ASG=NL:3 C IMPLICIT INTEGER*4 (A-Z) C C LOG RECORD DEFINITION INTEGER*2 LOGREC(24) LOGICAL*1 LRBYTE(48) EQUIVALENCE (LOGREC(1),LRBYTE(1)) C C SAMPLE FIELDS OF LOG RECORD (16 BIT UNSIGNED) INTEGER*2 TOTSMP,DIOSMP,LPOSMP,SPNSMP,WFRSMP,CKPSMP,STPSMP,CPUSMP C EQUIVALENCE (TOTSMP,LOGREC(17)),(DIOSMP,LOGREC(24)), 1 (LPOSMP,LOGREC(23)),(SPNSMP,LOGREC(18)), 2 (WFRSMP,LOGREC(19)),(CKPSMP,LOGREC(20)), 3 (STPSMP,LOGREC(21)),(CPUSMP,LOGREC(22)) C C TIME FIELDS OF LOG RECORD INTEGER*2 STYEAR,STMNTH,STDAY,STHOUR,STMIN,STSEC,STTICK, 1 TPSEC,TPSAMP EQUIVALENCE (STYEAR,LOGREC( 3)),(STMNTH,LOGREC( 4)), 1 (STDAY ,LOGREC( 5)),(STHOUR,LOGREC( 6)), 2 (STMIN ,LOGREC( 7)),(STSEC ,LOGREC( 8)), 3 (STTICK,LOGREC( 9)),(TPSEC ,LOGREC(10)), 4 (TPSAMP,LOGREC(11)) C C GENERAL TASK PARAMETERS IN LOG RECORD INTEGER*2 TNAM(2),TUIC,TPRI,TMEM EQUIVALENCE (TNAM(1),LOGREC(12)),(TUIC,LOGREC(14)), 1 (TPRI,LOGREC(15)),(TMEM,LOGREC(16)) C C CONVERTED SECONDS VARIABLES REAL*4 WLTIME,CPTIME,DKTIME,LPTIME COMMON/TIMES/NTIMES,WLTIME,CPTIME,DKTIME,LPTIME C C CONVERSION ROUTINES REAL*4 SECNDS,USI2TR C C RATE MULTIPLIERS FOR TIMES REAL*4 DKRATE,LPRATE,CPRATE,WLRATT,WLRATC COMMON/RATES/NRATES,WLRATT,WLRATC,CPRATE,DKRATE,LPRATE C C OTHER OUTPUT VARIABLES C LOGICAL PARTST REAL*4 MOOLAH,BUCKS INTEGER*2 TNAMEA(3),MEMKB LOGICAL*1 GROUP,USER EQUIVALENCE (GROUP,LRBYTE(28)),(USER,LRBYTE(27)) COMMON /LOGDAT/ LOGREC C C PROCESSING PARAMETERS C REAL*4 MINWL,MINCP,MINDK,MINLP,SILVER COMMON/MINTIM/MINWL,MINCP,MINDK,MINLP COMMON/DATES/STDATE,ENDATE COMMON/CHEAP/SILVER C C FILE SPECIFIERS C BYTE IFILE(32),OFILE(32),PFILE(32) COMMON/FILES/IFILE,OFILE,PFILE C C MAIN OPTION LOOP C 10 WRITE(5,1000) 1000 FORMAT(/' 1-SPECIFY PARAMETERS'/' 2-PREPROCESS LOGGED DATA'/ 1 ' 3-RECALCULATE PREVIOUSLY PROPROCESSED DATA'/' 4-EXIT'/ 2 ' ACCTPRE>'$) READ(5,1010,ERR=10) IOPT 1010 FORMAT(I6) IF(IOPT.LT.1.OR.IOPT.GT.4) GO TO 10 GO TO (100,200,300,400),IOPT C C SPECIFY PARAMETERS-OPTION 1 C READ IN MINIMUM TIME AND COST PARAMETERS; DATE SELECTION PARAMETERS C FROM TERMINAL OR PARAMETER FILE C 100 CALL PARIN GO TO 10 C C PROPROCESS ONE OR MORE LOGGED DATA FILES-OPTION 2 C C OPEN THE OUTPUT FILE C 200 CALL FILSPC('OUTPUT',OFILE) OPEN(UNIT=2,NAME=OFILE,TYPE='NEW',CARRIAGECONTROL='LIST', 1 FORM='FORMATTED',ERR=10) C C OPEN THE INPUT FILE C 210 WRITE(5,1020) 1020 FORMAT(/' (-1 IF DONE)') CALL FILSPC(' INPUT',IFILE) IF(IFILE(1).EQ.'-') GO TO 295 OPEN(UNIT=1,NAME=IFILE,READONLY,FORM='FORMATTED',TYPE='OLD', 1 ERR=210) C C READ RECORDS UNTIL END-OF-FILE IS REACHED C 220 CONTINUE READ(1,1030,END=290) LOGREC 1030 FORMAT(24A2) C C CONVWERT # SAMPLES TAKEN INTO SECONDS C WLTIME=SECNDS(TOTSMP) !TOTAL (ACTIVE OR CONNECT) TIME CPTIME=SECNDS(CPUSMP) !APPROXIMATE CPU TIME DKTIME=SECNDS(DIOSMP) !TIME WITH ACTIVE DISK I/O LPTIME=SECNDS(LPOSMP) !TIME WITH ACTIVE PRINTER I/O C C CONVERT TASK NAME TO ASCII, AND MEMORY TO KBYTES C CALL R50ASC(6,TNAM,TNAMEA) MEMKB=USI2TR(TMEM*64.0+512.0)/1024.0 C TEST TO SEE IF THIS RECORD FALLS WITHIN THE DATE WINDOW C AND IS ABOVE THE MINIMUM TIME THRESHHOLD C IF(.NOT.PARTST(STYEAR,STMNTH,STDAY,TNAMEA)) GO TO 220 C C CALCULATE THE BOTTOM LINE, AND TEST TO SEE IF ITS ENOUGH TO BOTHER WITH C MOOLAH=BUCKS(GROUP,USER,MEMKB,TPRI,TNAMEA,STYEAR,STMNTH,STDAY) IF(MOOLAH.LT.SILVER) GO TO 220 C C WRITE THE FORMATTED PREPROCESSED OUTPUT RECORD C WRITE(2,1040) GROUP,USER,TNAMEA,STYEAR,STMNTH,STDAY,STHOUR, 1 STMIN,STSEC,TPRI,MEMKB,WLTIME,CPTIME,DKTIME,LPTIME,MOOLAH 1040 FORMAT(2O3,3A2,1X,6I2,1X,I3,I2,4F8.1,F9.2) C C LOOP TO NEXT RECORD C GO TO 220 C C DONE WITH THIS INPUT LOG FILE. C CLOSE IT AND QUERY FOR ANOTHER. C 290 CLOSE(UNIT=1) GO TO 210 C C DONE WITH THIS OUTPUT FILE. C CLOSE IT AND GO TO MAIN OPTION LOOP C 295 CLOSE(UNIT=2) GO TO 10 C C RECALCULATE CHARGE FOR PREVIOUSLY PREPROCESSED FILE - OPTION 3 C (NOTE NO THRESHHOLD OR DATE PARAMETERS ARE USED) C C OPEN THE OUTPUT FILE C 300 CALL FILSPC('OUTPUT',OFILE) OPEN(UNIT=2,NAME=OFILE,TYPE='NEW',CARRIAGECONTROL='LIST', 1 FORM='FORMATTED',ERR=10) C C OPEN THE INPUT FILE C 305 CALL FILSPC(' INPUT',IFILE) OPEN(UNIT=1,NAME=IFILE,READONLY,TYPE='OLD',FORM='FORMATTED', 1 ERR=305) C C READ RECORDS UNTIL END OF INPUT FILE. C RECALCULATE MOOLAH; WRITE RECORD TO OUTPUT FILE C 310 READ(1,1050,END=390) GROUP,USER,TNAMEA,STYEAR,STMNTH,STDAY,STHOUR, 1 STMIN,STSEC,TPRI,MEMKB,WLTIME,CPTIME,DKTIME,LPTIME,MOOLAH MOOLAH=BUCKS(GROUP,USER,MEMKB,TPRI,TNAMEA) 1050 FORMAT(1X,2O3,3A2,1X,6I2,1X,I3,I2,4F8.1,F9.2) WRITE(2,1040) GROUP,USER,TNAMEA,STYEAR,STMNTH,STDAY,STHOUR, 1 STMIN,STSEC,TPRI,MEMKB,WLTIME,CPTIME,DKTIME,LPTIME,MOOLAH GO TO 310 C C WE'VE REACHED END OF INPUT FILE. CLOSE FILES; GO TO MAIN OPTION LOOP C 390 CLOSE(UNIT=1) CLOSE(UNIT=2) GO TO 10 C C EXIT TASK-OPTION 4 C 400 CALL EXIT END SUBROUTINE PARIN C C PARAMETER INPUT SUBROUTINE FOR ACCTPRE PREPROCESSOR C TO INPUT DATE WINDOW, TIME THRESHHOLDS, AND RATES C FROM TERMINAL OR DISK FILE. C C SEE LB:[6,10]LOGDATA.PAR FOR SAMPLE PARAMETER FILE C IMPLICIT INTEGER*4 (A-Z) REAL*4 DUM C C TIME THRESHHOLD VALUES C REAL*4 MIN COMMON/MINTIM/MIN(5) C C CHARGE RATES C REAL*4 RATE COMMON/RATES/NRATES,RATE(6) C C MINIMUM CHARGE C REAL*4 SILVER COMMON/CHEAP/SILVER C C DATE WINDOW C DIMENSION YMD(3,2) COMMON/DATES/DATE(2) C C FILE SPECIFIERS C BYTE IFILE(32),OFILE(32),PFILE(32) COMMON/FILES/IFILE,OFILE,PFILE C C TEXT STRINGS C REAL*8 TRATE(6),TMIN(5),TDATE1(2),TDATE2(3) DIMENSION RDATE(3) DATA TDATE1/'START','END'/ DATA TDATE2/'YEAR','MONTH','DAY'/ DATA RDATE/99,12,31/ DATA TRATE/'TASK','LOGIN','CPU','DISK','PRINTER','DEVICE 3'/ DATA TMIN/'TOTAL','CPU','DISK','PRINTER','DEVICE 3'/ C C NAME YOUR PREFERENCE, FRIEND C 10 WRITE(5,1000) 1000 FORMAT(/' READ PARAMETERS FROM:'/' 1-DISK FILE'/' 2-TERMINAL'/ 1 ' ACCTPRE>'$) READ(5,1010,ERR=10) IOPT 1010 FORMAT(I6) IF(IOPT.LT.1.OR.IOPT.GT.2) GO TO 10 GO TO (100,200),IOPT C C OPTION 1 - READ FROM DISK FILE C 100 CALL FILSPC(' PARAM',PFILE) NOUT=3 !OUTPUT PROMPTS TO NULL DEVICE NIN=1 OPEN(UNIT=NIN,NAME=PFILE,READONLY,FORM='FORMATTED',TYPE='OLD', 1 ERR=100) GO TO 300 C C OPTION 2 - INPUT PARAMETERS FROM TERMINAL C 200 NOUT=5 NIN=5 C C DECOMPOSE START, END DEFAULT DATES INTO YEAR, MONTH, DAY C 300 DO 310 I=1,2 YMD(1,I)=DATE(I)/10000 YMD(2,I)=(DATE(I)-10000*YMD(1,I))/100 310 YMD(3,I)=DATE(I)-10000*YMD(1,I)-100*YMD(2,I) C C QUERY FOR NEW START, END DATES C DO 325 I=1,2 DO 320 J=1,3 315 WRITE(NOUT,1020) TDATE1(I),TDATE2(J),RDATE(J),YMD(J,I) 1020 FORMAT(1X,A8,1X,A8,'(RANGE 1-',I2,' DEFAULT',I3,')='$) READ(NIN,1030,ERR=330) NCH,IDUM 1030 FORMAT(Q,I2) IF(NCH.EQ.0) GO TO 320 IF(IDUM.LT.1.OR.IDUM.GT.RDATE(J)) GO TO 330 YMD(J,I)=IDUM 320 CONTINUE C C REASSEMBLE DATE INTO DOUBLE-INTEGER FORMAT (FOR TESTS AGAINST WINDOW) C 325 DATE(I)=10000*YMD(1,I)+100*YMD(2,I)+YMD(3,I) GO TO 340 C C ERROR PROCESSING-IF TERMINAL INPUT, REPROMPT. IF FILE INPUT, RETURN C 330 IF(IOPT.EQ.2) GO TO 315 GO TO 900 C C INPUT MINIMUM TIME THRESHHOLDS C 340 CONTINUE DO 350 I=1,5 345 WRITE(NOUT,1040) TMIN(I),MIN(I) 1040 FORMAT(' MINIMUM ',A8,' TIME THRESHHOLD(DEFAULT ',F7.1, 1 ' SECS)='$) READ(NIN,1050,ERR=351) NCH,DUM 1050 FORMAT(Q,F10.0) IF(NCH.NE.0) MIN(I)=DUM 350 CONTINUE GO TO 360 351 IF(IOPT.EQ.2) GO TO 345 GO TO 900 C C INPUT MINIMUM TOTAL CHARGE THRESHHOLD C 360 WRITE(NOUT,1060) SILVER 1060 FORMAT(' MINIMUM TOTAL CHARGE THRESHHOLD (DEFAULT $',F6.2,')='$) READ(NIN,1050,ERR=370) NCH,DUM IF(NCH.NE.0) SILVER=DUM GO TO 375 370 IF(IOPT.EQ.2) GO TO 360 GO TO 900 375 CONTINUE C C INPUT CHARGE RATES PER SECOND C DO 390 I=1,NRATES 380 WRITE(NOUT,1070) TRATE(I),RATE(I) 1070 FORMAT(1X,A8,' RATE/SECOND(DEFAULT $',F8.5,')='$) READ(NIN,1050,ERR=391) NCH,DUM IF(NCH.NE.0) RATE(I)=DUM 390 CONTINUE GO TO 800 391 IF(IOPT.EQ.2) GO TO 380 GO TO 900 C C RETURN C 800 CLOSE(UNIT=NIN) RETURN C C ERROR IN PARAMETER FILE C 900 WRITE(5,2000) GO TO 800 2000 FORMAT(' PARAMETER FILE ERROR') C END REAL*4 FUNCTION BUCKS(GROUP,USER,MEMKB,TPRI,TNAMEA,STYEAR, 1 STMNTH,STDAY) C C SUBROUTINE TO DETERMINE CHARGES C FOR ACCTPRE PREPROCESSOR C IMPLICIT INTEGER*4(A-Z) INTEGER*2 STYEAR,STMNTH,STDAY INTEGER*2 TNAMEA(3),MEMKB LOGICAL*1 GROUP,USER LOGICAL LOGTSK C C TIMES (SECONDS) DETERMINED FROM LOG FILE C REAL*4 WLTIME,CPTIME,DKTIME,LPTIME COMMON/TIMES/NTIMES,WLTIME,CPTIME,DKTIME,LPTIME C C CHARGE RATES (FROM TERMINAL INPUT OR PARAMETER FILE) C REAL*4 DKRATE,LPRATE,CPRATE,WLRATT,WLRATC COMMON/RATES/NRATES,WLRATT,WLRATC,CPRATE,DKRATE,LPRATE C C DETERMINE IF THIS IS A PSEUDO-TASK (E.G. TERMINAL CONNECT TIME) C IF(LOGTSK(TNAMEA)) GO TO 50 C C THIS IS A TASK. CHARGE FOR WALL CLOCK TIME, CPU TIME, DISK TIME, C AND LINEPRINTER TIME C BUCKS=WLRATT*WLTIME + CPRATE*CPTIME + DKRATE*DKTIME 1 + LPRATE*LPTIME RETURN C C THIS IS TERMINAL CONNECT TIME. CHARGE ONLY FOR WALL CLOCK TIME C 50 BUCKS=WLRATC*WLTIME RETURN C END BLOCK DATA ACCTBD C C BLOCK DATA INITIALIZATION FOR DEFAULT PARAMETERS AND FILE SPECIFIERS C IMPLICIT INTEGER*4 (A-Z) C REAL*4 RATE COMMON/RATES/NRATES,RATE(6) C REAL*4 TIME COMMON/MINTIM/MTIME(5) COMMON/DATES/DATE(2) COMMON/FILES/IFILE(8),OFILE(8),PFILE(8) COMMON/TIMES/NTIMES C C DEFAULT RATES ARE $.0025/SECOND ($9.00/HR) FOR CONNECT TIME AND ACTIVE C TASK TIME; NOTHING FOR CPU TIME OR DEVICE TIME. C DATA NRATES,RATE/6,2*0.00250,4*0./ C C DEFAULT MINIMUM TIME THRESHHOLDS ARE ZERO (E.G. ALL RECORDS SELECTED) C DATA MTIME/5*0./ C C DEFAULT START DATE IS 29-DEC-72 (THE DATE OF THE "IMMACULATE RECEPTION"). C DEFAULT END DATE IS 31-DEC-99 (THE END OF TIME). C DATA DATE/721229,991231/ C C DEFAULT FILE SPECIFIERS C DATA PFILE/'LB:[','6,10',']LOG','DATA','.PAR',3*0/ DATA IFILE/'LB:[','6,10',']LOG','DATA','.DAT',3*0/ DATA OFILE/'LB:[','6,10',']LOG','DATA','.OUT',3*0/ C C NUMBER OF TIME VARIABLES CURRENTLY LOGGED C DATA NTIMES/5/ C END SUBROUTINE FILSPC(STRING,FILE) C C SUBROUTINE TO QUERY FOR AND INPUT A FILE SPECIFIER C C CALL: C C STRING - 6-CHARACTER IDENTIFIER FOR FILE (E.G. INPUT,OUTPUT,PARAM) C FILE - DEFAULT FILE SPECIFIER (ARRAY DIMENSIONED TO 32 ASCII BYTES MINIMUM) C C RETURN: C C FILE - SAME AS INPUT IF OPERATOR ACCEPTS DEFAULT BY KEYING (CR) C ELSE INPUT STRING, ZERO-FILLED C BYTE STRING(6),FILE(32),IFILE(32) WRITE(5,1000) STRING,FILE 1000 FORMAT(1X,6A1,' FILESPEC(DEFAULT=',32A1,')='$) READ(5,1010) NCHAR,IFILE 1010 FORMAT(Q,32A1) IF(NCHAR.EQ.0) RETURN DO 20 I=1,32 FILE(I)=IFILE(I) IF(I.GT.NCHAR) FILE(I)=0 20 CONTINUE RETURN END LOGICAL FUNCTION PARTST(YEAR,MONTH,DAY,TNAMEA) C C FUNCTION TO TEST AN INPUT LOG RECORD AGAINST THE TIME THRESHHOLD PARAMETERS C AND THE DATE WINDOW. C C CALL: C YEAR,MONTH,DAY-INTEGERS (RANGE 0-99; YEAR LAST 2 DIGITS) REPRESENTING C START DATE OF TASK OR TERMINAL SESSION C C RETURN: C FUNCTION=.TRUE. IF INPUT LOG RECORD PASSES ALL TESTS (ALL TIMES ARE C GREATER THAN THRESHHOLD VALUES; DATE IS WITHIN WINDOW); FALSE C OTHERWISE. C IMPLICIT INTEGER*4(A-Z) INTEGER*2 YEAR,MONTH,DAY,TNAMEA(3) REAL*4 MTIME,TIME LOGICAL LOGTSK C COMMON/MINTIM/MTIME(5) COMMON/TIMES/NTIMES,TIME(5) COMMON/DATES/STDATE,ENDATE C C ASSUME TEST IS FALSE UNTIL ALL CHECKS SATISFIED C PARTST=.FALSE. C C CONVERT DATE TO DOUBLE INTEGER FOR COMPARISON TEST; CHECK AGAINST WINDOW C DYEAR=YEAR DMONTH=MONTH DDAY=DAY DATE=10000*DYEAR + 100*DMONTH + DDAY D WRITE(5,1000) TNAMEA,DATE,STDATE,ENDATE D1000 FORMAT(1X,3A2,2X,'DATES',I8,2X,I8,2X,I8) IF(DATE.LT.STDATE.OR.DATE.GT.ENDATE) RETURN C C CHECK TIMES AGAINST MINIMUM THRESHHOLDS (if pseudo-task check connect time only) C N=NTIMES IF(LOGTSK(TNAMEA)) N=1 DO 20 I=1,N D WRITE(5,1010) I,TIME(I),MTIME(I) D1010 FORMAT(' TIME',I3,2F12.6) IF(TIME(I).LT.MTIME(I)) RETURN 20 CONTINUE C C THIS ONE SEEMS TO BE OK C PARTST=.TRUE. RETURN END REAL FUNCTION SECNDS(SAMPLS) REAL*4 USI2TR INTEGER*2 SAMPLS,LOGREC(24) COMMON /LOGDAT/ LOGREC SECNDS=(USI2TR(SAMPLS)*LOGREC(11))/LOGREC(10) END REAL FUNCTION USI2TR(INT2) C C CONVERT AN UNSIGNED INTEGER*2 ARGUMENT (0 <= INT2 <= 65535) TO REAL*4 C IMPLICIT INTEGER*2(A-Z) INTEGER*4 I INTEGER*2 J(2) EQUIVALENCE (I,J(1)) J(2)=0 J(1)=INT2 USI2TR=I END LOGICAL FUNCTION CMPINS(TN,IN) C C THIS FUNCTION RETURNS TRUE IFF THE 6-CHARACTER TN (TASKNAME) IS AN C INSTANCE OF THE THREE LETTER TASK "TN" AS IN "...NAM" OR "NAMTn " OR C "NAMTnn" (PER RSX STANDARD). C LOGICAL*1 TN(6),IN(3) C C FIRST, ASSUME TRUE AND CHECK FOR "...NAM" CMPINS=.TRUE. IF(TN(1) .EQ. '.' .AND. TN(2) .EQ. '.' .AND. TN(3) .EQ. '.' 1 .AND. TN(4) .EQ. IN(1) .AND. TN(5) .EQ. IN(2) .AND. 2 TN(6) .EQ. IN(3)) RETURN C C DIDN'T WORK. ASSUME FALSE AND CHECK FIRST FOUR LETTERS FOR "NAMT" CMPINS=.FALSE. IF(TN(1) .NE. IN(1) .OR. TN(2) .NE. IN(2) .OR. TN(3) .NE. IN(3) 1 .OR. TN(4) .NE. 'T') RETURN C C "NAMT??" CHECK FOR ONE OCTAL DIGIT AT POS 5. IF(TN(5) .LT. '1' .OR. TN(5) .GT. '7') RETURN C C "NAMTN?" CHECK FOR SPACE OR OCTAL DIGIT AT POS 6. IF SO, THEN GOOD. ELSE BAD IF(TN(6) .EQ. ' ') GOTO 100 IF(TN(6) .LT. '1' .OR. TN(6) .GT. '7') RETURN C C GOT IT. RETURN WITH TRUE 100 CONTINUE CMPINS=.TRUE. RETURN END LOGICAL FUNCTION CMPTSK(TN,IN) C C THIS MODULE WILL RETURN TRUE IF THE 6-CHARACTER TN (TASKNAME) IS C EXACTLY THE SAME AS THE 6-CHARACTER IN (INSTALLED NAME) C LOGICAL*1 TN(6),IN(6) C C ASSUME TRUE AND VERIFY ASSUMPTION BY CHECKING ALL 6 LETTERS CMPTSK=.TRUE. IF(TN(1) .EQ. IN(1) .AND. TN(2) .EQ. IN(2) .AND. 1 TN(3) .EQ. IN(3) .AND. TN(4) .EQ. IN(4) .AND. 2 TN(5) .EQ. IN(5) .AND. TN(6) .EQ. IN(6)) RETURN CMPTSK=.FALSE. RETURN END LOGICAL FUNCTION LOGTSK(TN) C C THIS MODULE RETURNS TRUE IFF THE 6 CHARACTER TN IS A PSEUDO-TASK C REPRESENTING A SIGNED ON TERMINAL. THIS IS EASY TO CHECK, SINCE C IT IS THE ONLY KIND OF TASK THAT CAN HAVE A "$" AS THE FOURTH LETTER. C LOGICAL*1 TN(6) LOGTSK=.FALSE. IF(TN(4) .EQ. '$') LOGTSK=.TRUE. RETURN END