C LIPROC SOURCE PV090527 24/01/09 21:15:12 11817 ************************************************************************ * NOM : LIPROC * DESCRIPTION : Lit une procedure GIBIANE depuis un fichier externe ************************************************************************ * HISTORIQUE : 19/12/2013 : JCARDO : création de la subroutine * HISTORIQUE : 30/01/2013 : JCARDO : remplissage de la subroutine * HISTORIQUE : 31/01/2013 : JCARDO : corr. bug appel depuis procedure * HISTORIQUE : 26/03/2014 : PV : SREDLE non affecte remplace par IREDLE * HISTORIQUE : 05/05/2015 : JCARDO : ajout de SREDLE=IREDLE * HISTORIQUE : ************************************************************************ * Prière de PRENDRE LE TEMPS DE COMPLÉTER LES COMMENTAIRES * en cas de modification de ce sous-programme afin de faciliter * la maintenance ! ************************************************************************ * APPELÉ PAR : lirefi.eso ************************************************************************ * ENTRÉES :: aucune * SORTIES :: aucune ************************************************************************ * SYNTAXE (GIBIANE) : * * LIRE 'PROC' NOMFIC1 (MOT1) ; * ************************************************************************ SUBROUTINE LIPROC IMPLICIT INTEGER(I-N) IMPLICIT REAL*8(A-H,O-Z) -INC PPARAM -INC CCNOYAU -INC CCOPTIO -INC SMBLOC -INC CCREDLE C LOCHAI dans CCNOYAU.INC CHARACTER*(LOCHAI) NOMSRC,CHBUFF CHARACTER*(LONOM) NOMPR1,NOMPR2,NOMPR3 CHARACTER*8 CHA8 CHARACTER*4 MDEBP(1) DATA MDEBP/'DEBP'/ PARAMETER(IOTMP=70) PARAMETER(LTMP=10) CHARACTER*(LTMP) FITMP DATA FITMP/'LIPROC.TMP'/ SEGMENT ITITE3 INTEGER ITITEN(NIS),IOU(NIS) CHARACTER*(8) ITITEM(NIS) ENDSEGMENT * +---------------------------------+ * | | * | LECTURE DES PARAMETRES D'ENTREE | * | | * +---------------------------------+ * LECTURE DU NOM DU FICHIER SOURCE CALL LIRCHA(NOMSRC,1,LSRC) IF (IERR.NE.0) RETURN * LECTURE EVENTUELLE ET VERIFICATION DU NOM DE LA PROCEDURE CALL LIRCHA(NOMPR1,0,LPR1) IF (LPR1.GT.0) THEN CALL VERNAM(NOMPR1(1:LPR1),IRET) IF (IRET.EQ.0) THEN MOTERR(1:8)=NOMPR1(1:LPR1) IF (LPR1.GT.8) MOTERR(6:8)='...' CALL ERREUR(1029) RETURN ENDIF ENDIF * +-----------------------------+ * | | * | SAUVETAGE DE L'ETAT COURANT | * | | * +-----------------------------+ * SAUVETAGE DU TYPE DES OBJETS TEMPORAIRES SREDLE=IREDLE ITITE=0 IF (IPTEM.NE.0) THEN ITITE=1 MOT(1:LONOM)='#' IRE=3 NIS=IPTEM SEGINI,ITITE3 DO I=1,IPTEM IF (I.LT.10) THEN WRITE(MOT(2:2),FMT='(I1)') I NCAR=2 ELSE WRITE(MOT(2:3),FMT='(I2)') I NCAR=3 ENDIF IAVA=0 CALL PRENOM(IPLAMO,IAVA,SREDLE) ITITEN(I)=IPLAMO ITITEM(I)=INOOB2(IPLAMO) IOU(I)=IOUEP2(IPLAMO) ENDDO ENDIF * SAUVETAGE DE CCNOYAU ET CCREDLE CALL PROCSA MBFONC=1 * +-----------------------------+ * | | * | OUVERTURE DU FICHIER SOURCE | * | | * +-----------------------------+ OPEN(UNIT=IOCAR, & ACCESS='SEQUENTIAL', & STATUS='OLD', & FILE=NOMSRC(1:LSRC), & FORM='FORMATTED', & IOSTAT=IOS) IF (IOS.NE.0) THEN INTERR(1)=IOS MOTERR=NOMSRC(1:LSRC) CALL ERREUR(424) RETURN ENDIF * POSITIONNEMENT DE LA LECTURE GIBI SUR LE FICHIER SOURCE JOLEC=IOLEC IOLEC=IOCAR * +---------------------------+ * | | * | CHARGEMENT DES PROCEDURES | * | | * +---------------------------+ * ON DECREMENTE LE NIVEAU D'ECRITURE IECHA=IECHO IECHO=MAX(0,IECHO-1) * NBPROC = nombre de procedures importees avec succes * NDELIM = nombre de delimiteurs $$$$ lus NBPROC=0 NDELIM=0 1 READ(UNIT=IOCAR,FMT=FMCHAI,END=1000) CHBUFF IF (CHBUFF.EQ.' ') GOTO 1 * ================================================================== * LE FICHIER CONTIENT UNE OU PLUSIEURS PROCEDURES SEPAREES PAR LES * DELIMITEURS $$$$ (FORMAT STANDARD, COMPATIBLE AVEC UTIL 'PROC') * ================================================================== IF (CHBUFF(1:4).EQ.'$$$$') THEN NDELIM=NDELIM+1 * MESSAGE INDIQUANT QUE LE FICHIER EST AU FORMAT STANDARD IF ((NDELIM.EQ.1).AND.(IIMPI.GE.10)) CALL ERREUR(-348) * LECTURE DU NOM DERRIERE LE DELIMITEUR $$$$ * ------------------------------------------ NOMPR2=CHBUFF(6:LOCHAI) CALL LENCHA(NOMPR2,LPR2) IF (LPR2.EQ.0) GOTO 1 * LECTURE DU NOM DERRIERE L'INSTRUCTION DEBP * ------------------------------------------ CALL NOUTRU CALL LIRMOT(MDEBP,1,IRET,1) CHA8=' ' CALL LIROBJ(CHA8,IOBJ1,1,IRET) CALL QUENOM(NOMPR3) CALL LENCHA(NOMPR3,LPR3) * VERIFICATION QUE LES DEUX NOMS CONCORDENT ET SONT VALIDES * --------------------------------------------------------- CALL MINMAJ(NOMPR2(1:LPR2)) CALL MINMAJ(NOMPR3(1:LPR3)) CALL VERNAM(NOMPR2(1:LPR2),IRET) IF (IRET.EQ.0) THEN MOTERR(1:8)=NOMPR2(1:LPR2) IF (LPR2.GT.8) MOTERR(6:8)='...' CALL ERREUR(1029) GOTO 1002 ELSEIF (NOMPR2(1:LPR2).NE.NOMPR3(1:LPR3)) THEN MOTERR(1:8)=NOMPR2(1:LPR2) MOTERR(9:16)=NOMPR3(1:LPR3) CALL ERREUR(1031) GOTO 1002 ENDIF * SI UN NOM DE PROCEDURE A ETE FOURNI EN ENTREE, ON IGNORE * TOUTES LES PROCEDURES LUES QUI NE PORTENT PAS CE NOM * -------------------------------------------------------- IF ((LPR1.NE.0).AND.(NOMPR1(1:LPR1).NE.NOMPR2(1:LPR2))) THEN IF (IIMPI.GE.10) THEN MOTERR(1:8)=NOMPR2(1:LPR2) CALL ERREUR(-351) ENDIF GOTO 1 ENDIF * CREATION ET CHARGEMENT DU CONTENU DE L'OBJET PROCEDUR * ----------------------------------------------------- CALL REFUS CALL MAPR(1) IF (IERR.NE.0) RETURN * MESSAGE INDIQUANT UNE ERREUR OU LA REUSSITE DE L'IMPORTATION * ------------------------------------------------------------ MOTERR(1:8)=NOMPR2(1:LPR2) IF (IERR.NE.0) THEN IERR=0 CALL ERREUR(1030) GOTO 1002 ELSEIF (IIMPI.GE.10) THEN CALL ERREUR(-350) NBPROC=NBPROC+1 ENDIF GOTO 1 * ================================================================== * LE FICHIER INDIQUE CONTIENT UNE SUITE D'INSTRUCTIONS BRUTES, SANS * LE DELIMITEUR $$$$ NI LES INSTRUCTIONS DEBP/FINP * ================================================================== ELSEIF (NDELIM.EQ.0) THEN * MESSAGE INDIQUANT QUE L'ON A PAS TROUVE DE DELIMITEURS IF ((LPR1.EQ.0).OR.(IIMPI.GE.10)) CALL ERREUR(-349) * DANS CE CAS DE FIGURE, IL EST OBLIGATOIRE DE FOURNIR LE NOM * DE LA PROCEDURE QUE L'ON VA CREER IF (LPR1.EQ.0) THEN IOLEC=JOLEC MOTERR(1:8)='PROCEDUR' CALL ERREUR(1028) GOTO 1002 ENDIF * CREATION D'UN FICHIER TEMPORAIRE * -------------------------------- OPEN(UNIT=IOTMP, & ACCESS='SEQUENTIAL', & STATUS='UNKNOWN', & FILE=FITMP(1:LTMP), & FORM='FORMATTED', & IOSTAT=IOS) IF (IOS.NE.0) THEN INTERR(1)=IOS MOTERR=FITMP(1:LTMP) CALL ERREUR(424) GOTO 1002 ENDIF * ECRITURE DU NOM DE LA PROCEDURE (REQUIS PAR MAPR) * ------------------------------------------------- WRITE(IOTMP,'(A)') NOMPR1(1:LPR1)//' ;' * COPIE DES INSTRUCTIONS CONTENUES DANS LE FICHIER SOURCE * ------------------------------------------------------- BACKSPACE(UNIT=IOCAR) 2 READ (UNIT=IOCAR,FMT=FMCHAI,END=3) CHBUFF WRITE(UNIT=IOTMP,FMT=FMCHAI ) CHBUFF GOTO 2 3 CONTINUE * AJOUT DE L'INSTRUCTION FINP (REQUIS PAR MAPR) * => NE POSE PAS DE PROBLEME SI ELLE ETAIT DEJA PRESENTE * ------------------------------------------------------ WRITE(IOTMP,'(A6)') 'FINP ;' * REPOSITIONNEMENT DE LA LECTURE GIBI SUR LE FICHIER TEMPORAIRE * ------------------------------------------------------------- REWIND(UNIT=IOTMP) IOLEC=IOTMP CALL NOUTRU * CREATION ET CHARGEMENT DU CONTENU DE L'OBJET PROCEDUR * ----------------------------------------------------- CALL MAPR(1) IF (IERR.NE.0) RETURN * MESSAGE INDIQUANT UNE ERREUR OU LA REUSSITE DE L'IMPORTATION * ------------------------------------------------------------ MOTERR(1:8)=NOMPR1(1:LPR1) IF (IERR.NE.0) THEN IERR=0 CALL ERREUR(1030) GOTO 1001 ELSEIF (IIMPI.GE.10) THEN CALL ERREUR(-350) NBPROC=NBPROC+1 ENDIF GOTO 1000 ENDIF GOTO 1 * +-------------------------+ * | | * | SORTIE DE LA SUBROUTINE | * | | * +-------------------------+ 1000 CONTINUE * MESSAGE INDIQUANT LE NOMBRE DE PROCEDURES CREEES IF (IIMPI.GE.10) THEN INTERR(1)=NBPROC CALL ERREUR(-352) ENDIF 1001 CONTINUE * ON FERME LE FICHIER TEMPORAIRE CLOSE(UNIT=IOTMP,STATUS='DELETE') 1002 CONTINUE * ON FERME LE FICHIER SOURCE CLOSE(UNIT=IOCAR) * ON RESTAURE LA LECTURE SUR L'ANCIENNE UNITE * (OU SUR LE TERMINAL S'IL Y A UNE ERREUR) IF (IERR.NE.0) THEN IOLEC=IOTER ELSE IOLEC=JOLEC ENDIF * ON RESTAURE LE NIVEAU D'ECRITURE IECHO=IECHA * ON RESTAURE LES TYPES D'OBJETS TEMPORAIRES, LE NOYAU ET LA LECTURE IF (ITITE.NE.0) THEN DO I=1,ITITEN(/1) IPLAMO=ITITEN(I) INOOB2(IPLAMO)=ITITEM(I) IOUEP2(IPLAMO)=IOU(I) ENDDO SEGSUP,ITITE3 ENDIF CALL PROCRE RETURN END