C************************************************************** C C RSXCCL.FLX ENVOIE A MCR UNE LIGNE DE COMMANDE C DU GENRE C C PIP TI:=XXXXXX.XX;XX C C ORDRES INSTALLES : C C POUR PIP : FRE DIR TYP COP DEL SDL REN DLK PUR EOF C C POUR SRD : ALF EXP SER DAT SDX C C C PROTECTION : LES COMMANDES DEL *.*;* C DEL *.FLX;* C DEL *.FTN;* C DEL *.TSK;* C SONT INTERDITES. C C*************************************************************** PROGRAM RSXCCL BYTE LI(80),LO(79),PROTEC(8) REAL*8 SECURT LOGICAL*1 FLAG,FSLASH,FVIRG,FNUIC,FSEC EQUIVALENCE (LI(1),CMCR),(PROTEC,SECURT) DATA XMCR/6RMCR.../ DO (I=1,80) LI(I)=' ' FLAG=.FALSE. ID=5 ! MONO-LIGNE: LA COMMANDE DEBUTE EN 5 NTCAR=6 ! MONO-LIGNE: NTCAR-3=3 => MULTI-LIGNE CALL GETMCR(LI,NCHAR) IF (NCHAR.EQ.3) LI(4)=' ' SMCR=CMCR 100 LO(1)='P' LO(2)='I' LO(3)='P' LO(4)=' ' DO (I=5,79) LO(I)=0 CONDITIONAL C ! JAMAIS DE FORME MULTILIGNE (SMCR.EQ.'FRE') DO (I=4,NCHAR) LO(I)=LI(I) FIN LO(NCHAR+2)='/' ! SI ">FRE",NCHAR=3 :IL FAUT LO(NCHAR+3)='F' ! MENAGER UN INTERVALLE LO(NCHAR+4)='R' FIN (SMCR.EQ.'DIR') C ! JAMAIS DE FORME MULTILIGNE UNLESS (NCHAR.EQ.3) DO (I=4,NCHAR) LO(I)=LI(I) FIN LO(NCHAR+2)='/' ! SI ">DIR",NCHAR=3 :IL FAUT LO(NCHAR+3)='L' ! MENAGER UN INTERVALLE LO(NCHAR+4)='I' FIN (SMCR.EQ.'ALF' .OR. SMCR.EQ.'SER' .OR. SMCR.EQ.'EXP') LO(1)='S' LO(2)='R' LO(3)='D' LO(4)='' IAN=4 I=4 FNUIC=.TRUE. WHILE (IAN.LE.NCHAR .AND. FNUIC) IAN=IAN+1 IF (LI(IAN).EQ.'[') WHILE (IAN.LE.NCHAR .AND. FNUIC) I=I+1 LO(I)=LI(IAN) IF (LI(IAN).EQ.']') FNUIC=.FALSE. IAN=IAN+1 FIN FIN FIN IF (FNUIC) IAN=5 C IAN POINTE LE "LI" SUIVANT;I POINTE LE "LO" ACTUEL LO(I+1)='/' LO(I+2)='S' LO(I+3)='E' I=I+4 IF (IAN.LE.NCHAR) LO(I)=':' DO (K=IAN,NCHAR) I=I+1 LO(I)=LI(K) FIN FIN IF (SMCR.EQ.'ALF') LO(I+1)='/' LO(I+2)='N' LO(I+3)='A' FIN IF (SMCR.EQ.'EXP') LO(I+1)='/' LO(I+2)='N' LO(I+3)='E' FIN FIN (SMCR.EQ.'DAT') LO(1)='S' LO(2)='R' LO(3)='D' LO(4)='' IAN=4 I=4 FNUIC=.TRUE. WHILE (IAN.LE.NCHAR .AND. FNUIC) IAN=IAN+1 IF (LI(IAN).EQ.'[') WHILE (IAN.LE.NCHAR .AND. FNUIC) I=I+1 LO(I)=LI(IAN) IF (LI(IAN).EQ.']') FNUIC=.FALSE. IAN=IAN+1 FIN FIN FIN LO(I+1)='/' LO(I+2)='D' LO(I+3)='A' LO(I+4)='/' LO(I+5)='N' LO(I+6)='A' LO(I+7)='/' LO(I+8)='M' LO(I+9)='I' FIN (NCHAR.EQ.NTCAR-3) 10 TYPE 1,SMCR,'>' 1 FORMAT('$',A3,A1) FLAG=.TRUE. READ(5,2,END=110)NCHAR,LI 2 FORMAT(Q,80A1) DO (IB=1,NCHAR) IF (LI(IB).NE.' ') ID=1 ! MULTI-LIGNE: TOUT EST UTIL NTCAR=3 ! MULTI-LIGNE: NTCAR-3=0 => MULTI-LIGNE GO TO 100 FIN FIN GO TO 10 FIN (SMCR.EQ.'TYP') LO(5)='T' LO(6)='I' LO(7)=':' LO(8)='=' DO (I=ID,NCHAR) LO(I-ID+9)=LI(I) FIN (SMCR.EQ.'COP') DO (I=ID,NCHAR) LO(I-ID+5)=LI(I) FIN FIN (SMCR.EQ.'DEL') FSEC=.TRUE. SECURT='' J=1 DO (I=ID,NCHAR) UNLESS (LI(I).EQ.'') WHEN(LI(I).EQ.','.OR.LI(I).EQ.':'.OR.LI(I).EQ.']') SECURT='' J=1 FIN ELSE IF (J.LT.8) PROTEC (J)=LI(I) J=J+1 FIN FIN SELECT (SECURT) ('*.*;*') TYPE *,'===> ETES-VOUS FOU ! ? !' TYPE *,'===> Vous voulez detruire TOUS vos programmes ?' TYPE *,'===> Ne comptez pas sur moi pour cette folie' FSEC=.FALSE. FIN ('*.FLX;*') TYPE *,'===> HELP ! ! ! ' TYPE *,'===> Vous allez detruire TOUS vos FLEXs !' TYPE *,'===> Je tiens a la vie, je ne marche pas' FSEC=.FALSE. FIN ('*.FTN;*') TYPE *,'===> HE OH !!!' TYPE *,'===> Vous allez detruire TOUS vos FORTRANs !' TYPE *,'===> Je n''ais pas l''ame d''un boureau' FSEC=.FALSE. FIN ('*.TSK;*') TYPE *,'===> HE ! STOP !!' TYPE *,'===> Vous allez ecraser TOUTES vos TACHES ' TYPE *,'===> Apres qui devra RE-TKB ? C''est moi ...' FSEC=.FALSE. FIN FIN FIN FIN UNLESS (FSEC) CALL EXIT FNUIC=.TRUE. FVIRG=.TRUE. NV=5 DO (I=ID,NCHAR) IF (LI(I).EQ.'[') FNUIC=.FALSE. IF (LI(I).EQ.']') FNUIC=.TRUE. IF (LI(I).EQ.',' .AND. FNUIC) IF (FVIRG) INST=I-ID+5 LO(INST)='/' LO(INST+1)='L' LO(INST+2)='D' FVIRG=.FALSE. NV=NV+3 FIN FIN LO(I-ID+NV)=LI(I) FIN INST=NCHAR-ID+NV+1 LO(INST)='/' LO(INST+1)='D' LO(INST+2)='E' IF (FVIRG) INST=INST+3 LO(INST)='/' LO(INST+1)='L' LO(INST+2)='D' FIN FIN (SMCR.EQ.'SDL') DO (I=ID,NCHAR) LO(I-ID+5)=LI(I) FIN NV=1 IF (ID.EQ.1) NV=5 LO(NCHAR+NV)='/' ! FORME MONO-LIGNE :ID=5 ON PLACE "/" LO(NCHAR+NV+1)='S' ! EN "NCHAR+1" - MULTILIGNE : ID=1 LO(NCHAR+NV+2)='D' ! LE "/" EN "NCHAR+5" (4 CAR. "PIP ") FIN (SMCR.EQ.'SDX') LO(1)='S' LO(2)='R' LO(3)='D' LO(4)='' LO(5)='/' LO(6)='S' LO(7)='E' LO(8)=':' FVIRG=.TRUE. I=8 IAN=ID WHILE (IAN.LE.NCHAR .AND. FVIRG) UNLESS (LI(IAN).EQ.'') I=I+1 WHEN (LI(IAN).EQ.',') FVIRG=.FALSE. ELSE LO(I)=LI(IAN) FIN IAN=IAN+1 FIN LO(I+1)='/' LO(I+2)='S' LO(I+3)='D' LO(I+4)='/' LO(I+5)='M' LO(I+6)='I' LO(I+7)='/' LO(I+8)='N' LO(I+9)='A' FIN (SMCR.EQ.'REN') DO (I=ID,NCHAR) LO(I-ID+5)=LI(I) FIN NV=1 IF (ID.EQ.1) NV=5 LO(NCHAR+NV)='/' LO(NCHAR+NV+1)='R' LO(NCHAR+NV+2)='E' FIN (SMCR.EQ.'DLK') DO (I=ID,NCHAR) LO(I-ID+5)=LI(I) FIN NV=1 IF (ID.EQ.1) NV=5 LO(NCHAR+NV)='/' LO(NCHAR+NV+1)='U' LO(NCHAR+NV+2)='N' FIN (SMCR.EQ.'EOF') DO (I=ID,NCHAR) LO(I-ID+5)=LI(I) FIN NV=1 IF (ID.EQ.1) NV=5 LO(NCHAR+NV)='/' LO(NCHAR+NV+1)='E' LO(NCHAR+NV+2)='O' LO(NCHAR+NV+3)='F' FIN (SMCR.EQ.'PUR') C C 3 CAS POSSIBLE : C TYPE 1 PUR *.*,*.* ON NE CONSERVE QUE LA DERNIERE VERSION C TYPE 2 PUR *.*,*.*,*.* /X, PORTE SUR TOUT LE CHAMP C TYPE 3 PUR *.*,*.* /X,*.* /Y CHAQUE SWITCHE DOIT ETRE GARDE C ISLH=0 ! INDICE DE POSITION DU 1 "/" ILD=0 ! " " 1 "," IVRG=0 ! " " DERN. "," FNUIC=.TRUE. N=5-ID DO (IAN=ID,NCHAR) CONDITIONAL (ISLH.EQ.0 .AND. LI(IAN).EQ.'/') ISLH=IAN (LI(IAN).EQ.'[') FNUIC=.FALSE. (LI(IAN).EQ.']') FNUIC=.TRUE. (ILD.EQ.0 .AND. LI(IAN).EQ.',' .AND. FNUIC) ILD =IAN (LI(IAN).EQ.',' .AND. FNUIC) IVRG =IAN FIN FIN C VERIFICATION WHEN (ISLH.EQ.ID.OR.IVRG.EQ.ID.OR.ILD.EQ.ID) TYPE *,'===>> Mauvaise ligne de commande CCL <<===' FIN ELSE WHEN (ISLH.NE.0 .AND. IVRG.GT.ISLH) C TYPE 3 DO (I=ID,NCHAR) CONDITIONAL (LI(I).EQ.'/') LO(I+N)=LI(I) LO(I+N+1)='P' LO(I+N+2)='U' LO(I+N+3)=':' N=N+3 FIN (I.EQ.ILD) LO(I+N)='/' LO(I+N+1)='L' LO(I+N+2)='D' LO(I+N+3)=LI(I) N=N+3 FIN (OTHERWISE) LO(I+N)=LI(I) FIN FIN FIN ELSE C C TYPE 1 OU 2 C WHEN (ISLH.EQ.0) NFIN=NCHAR ELSE NFIN=ISLH-1 C WHEN (ILD.EQ.0) NSTOP=NFIN ELSE NSTOP=ILD-1 DO (I=ID,NSTOP) LO(I+N)=LI(I) I=NSTOP LO(I+N+1)='/' LO(I+N+2)='L' LO(I+N+3)='D' LO(I+N+4)='/' LO(I+N+5)='P' LO(I+N+6)='U' I=I+N+6 UNLESS (ISLH.EQ.0) I=I+1 LO(I)=':' DO (J=ISLH+1,NCHAR) I=I+1 LO(I)=LI(J) FIN FIN UNLESS (ILD.EQ.0) DO (J=ILD,NFIN) I=I+1 LO(I)=LI(J) FIN FIN FIN FIN FIN (OTHERWISE) TYPE *,'===>> Commande incorrecte (4 lettres?) <<===' CALL EXIT FIN FIN IEFN=50 REPEAT WHILE (IDS.EQ.-7) CALL CLREF(IEFN) CALL SPAWN(XMCR,,,IEFN,,,,LO,79,,,IDS) CONDITIONAL (IDS.EQ.-7) TYPE *,'===>> Patience, la tache est ACTIVE <<===' (IDS.LT.0) TYPE*,'===>> ERREUR FATALE <<===' TYPE 99,LO 99 FORMAT(' LO = '/1X ,79A1) TYPE *,' IDS ',IDS TYPE 199,LO 199 FORMAT(' LO = '/4(1X,20 O4)/) CALL EXIT FIN FIN CALL WAITFR(IEFN) FIN IF (SMCR.EQ.'SDX'.AND. .NOT.FVIRG) DO (IAN=ID,NCHAR) WHEN (LI(IAN).EQ.',') LI(IAN)='' GO TO 100 FIN ELSE LI(IAN)='' FIN FIN IF (FLAG) 90 TYPE 1,SMCR,'>' READ(5,2,END=110)NCHAR,LI DO (IB=1,NCHAR) IF (LI(IB).NE.' ') GO TO 100 FIN GO TO 90 FIN 110 CALL EXIT END