C ENLEV3    SOURCE    CB215821  18/01/29    21:15:05     9715           
      SUBROUTINE ENLEV3 (IPOINT,IEME,IPOIN3,IPOS)
C***********************************************************************
C
C                             E N L E V 3
C                             -----------
C
C FONCTION:
C ---------
C
C     ENLEVER LE I-EME ELEMENT D'UN OBJET DE TYPE "LISTMOTS".
C
C PARAMETRES:   (E)=ENTREE   (S)=SORTIE
C -----------
C
C     IEME    ENTIER    (E)  NUMERO D'ORDRE DE L'ELEMENT A ENLEVER DANS
C                            L'OBJET DE TYPE "LISTMOTS".
C     IPOINT  ENTIER    (E)  POINTEUR DE L'OBJET DE TYPE "LISTMOTS".
C     IPOIN3  ENTIER    (S)  POINTEUR DU 'LISTMOTS' CREE.
C     IPOS    ENTIER    (E)  SI NEGATIF, IEME EST UN POINTEUR "LISTENTI"
C
C SOUS-PROGRAMMES APPELES:
C ------------------------
C
C     ERREUR
C
C AUTEUR, DATE DE CREATION:
C -------------------------
C
C     PASCAL MANIGOT     6 DECEMBRE 1984
C
C LANGAGE:
C --------
C
C     ESOPE + FORTRAN77 + EXTENSION: CARACTERES MIS DANS DES ENTIERS
C
C***********************************************************************
C
      IMPLICIT INTEGER(I-N)

-INC PPARAM
-INC CCOPTIO
-INC SMLMOTS
-INC SMLENTI
C
      MLMOTS = IPOINT
      SEGACT,MLMOTS
      LDIM = MOTS(/2)

C     Y a-t-il plusieurs remplacements a faire ?
      IF (IPOS.LT.0) THEN
        MLENT1=IEME
        NBENLE=MLENT1.LECT(/1)
        
        IF (NBENLE .EQ. 0) THEN
C         Cas de la liste VIDE
          SEGINI,MLMOT1=MLMOTS
          IPOIN3=MLMOT1
          RETURN          
        ENDIF

C       Le LISTENTI est ordonne donc le min en 1 et le max en NBENLE
        IPOMIN=MLENT1.LECT(1)
        IPOMAX=MLENT1.LECT(NBENLE)

        IF     (IPOMIN.LT.1   ) THEN
C         L'indice %i1 est au dela des bornes de la liste
          INTERR(1) = IPOMIN
          CALL ERREUR(620)
          RETURN
        ELSEIF (IPOMAX.GT.LDIM) THEN
C         L'indice %i1 est au dela des bornes de la liste
          INTERR(1) = IPOMAX
          CALL ERREUR(620)
          RETURN
        ENDIF

      ELSE
        NBENLE=1
        IF (IEME.LT.1 .OR. IEME.GT.LDIM) THEN
C         L'indice %i1 est au dela des bornes de la liste
          INTERR(1) = IEME
          CALL ERREUR(620)
          RETURN
        ENDIF
      ENDIF
C
      JGN=MOTS(/1)
      JGM=LDIM - 1
      SEGINI,MLMOT1
C
      IENLE = 1
      DO II=1,LDIM
        IF (IPOS.LT.0) IEME=MLENT1.LECT(IENLE)
        IF (II.EQ.IEME) THEN
          IENLE = IENLE + 1
          IF (IENLE.GT.NBENLE) GOTO 10
        ELSE
          MLMOT1.MOTS(II-IENLE+1) = MOTS(II)
        ENDIF
      ENDDO

 10   IF (IEME.LT.LDIM) THEN
        DO II=IEME+1,LDIM
          MLMOT1.MOTS(II-NBENLE) = MOTS(II)
        ENDDO
      ENDIF
C
      JGM=LDIM-NBENLE
      SEGADJ,MLMOT1
      IPOIN3=MLMOT1
      SEGDES,MLMOT1

      RETURN
      END
 
 
