C
C This file is issued from the MODULEF library, but has been 
C subsequently modified
C
      SUBROUTINE ZALDY4(MAAAA,NOM,NBMOT,ITYPE,IADRES)
C  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
C  BUT : ALLOCATION DYNAMIQUE - CREER UN TABLEAU SANS TEST D'EXISTENCE
C  ---
C  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
C  IN :  NOM , ITYPE , NBMOT ; NOM , TYPE ET NOMBRE DE MOT DU TABLEAU
C  --
C  OUT : IADRES   ADRESSE DU TABLEAU
C  ---
C  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
C  PROGRAMMEUR : F. HECHT - INRIA - AVRIL 86
C  .....................................................................
      DIMENSION MAAAA(*),NOMCP(64)
      CHARACTER*(*) NOM
      DATA IDEBUT /5/
      DATA ICONST /15/
  998 FORMAT(' %% ERREUR ZALDY4 : LE NOM DU TABLEAU ',A/
     +       ' A ',I6,' CARACTERES ')
  999 FORMAT(/' %% STOP DANS ZALDY4 (ALLOUE,ADRESS,READRE)'/)
 1000 FORMAT(' ZALDY4  :             ',A4,2X,A16,1X,I1,1X,I9)
 1001 FORMAT(' **  LE SUPER TABLEAU EST PLEIN '/)
 1002 FORMAT(' **  LE NOMBRE DE MOT DU TABLEAU A ALLOUER EST < 0 OU 0')
 1003 FORMAT(' **  PROBLEME DANS LES POINTEURS ')
      NBCNOM = LEN(NOM)
      IMPRIM = IINFO('I')
      IF ( NBCNOM.GT.256 .OR. NBCNOM.LT.1 ) THEN
         WRITE (IMPRIM,998) NOM,NBCNOM
         STOP
      END IF
      CALL CHAINT (NOM,NOMCP,64,NBMNOM)
      IF(ITYPE.LE.4) GOTO 20
      IF(ITYPE.LE.6) GOTO 10
C                  4 MOT PAR VARIABLE     6<ITYPE
         MOTVAR=4
         GOTO 30
   10 CONTINUE
C                  2 MOT PAR VARIABLE     4<ITYPE<7
         MOTVAR=2
         GOTO 30
   20 CONTINUE
C                  1 MOT PAR VARIABLE        ITYPE<5
         MOTVAR=1
   30 CONTINUE
C
C VERIFICATION DE LA LONGUEUR DEMANDEE
      IF (NBMOT.LE.0) GOTO 910
C
C PASSAGE A L'ESPACE SUIVANT
      ID1 = 0
      ID2 = -IDEBUT
  100 ID2 = -ID2
  110 IF (ID2.GT.MAAAA(1)) GOTO 800
      IF (ID2.LE.ID1) GOTO 920
      ID1 = ID2
      ID2 = MAAAA(ID2)
      IF (ID2.GT.0) GOTO 110
C
C LTDIFF = NOMBRE DE MOTS RESTANTS SI ON ALLOUAIT DANS L'ESPACE COURANT
      IADRES = ID1 + 3 + NBMNOM
      IDN    = IADRES + NBMOT
      LTDIFF = -ID2 - IDN
      IF (LTDIFF.LT.0) GOTO 100
C
C        IADRES = K * MOTVAR + 1
C
      IF(ITYPE.LE.4) GOTO 120
        K = (IADRES - 2)/MOTVAR + 1
        IADRES= K * MOTVAR + 1
        IDN    = IADRES + NBMOT
        LTDIFF = -ID2 - IDN
        IF (LTDIFF.LT.0) GOTO 100
  120 CONTINUE
      DO 130 I=1,NBMNOM
         ID1I=ID1+I
  130 MAAAA(ID1I)=NOMCP(I)
      MAAAA(ID1I+1)=ITYPE
      MAAAA(ID1I+2)=NBMOT
      IF (LTDIFF.GE.ICONST) GOTO 500
C
C LTDIFF>=0 MAIS <ICONST : ON ALLOUE UN ESPACE LEGEREMENT PLUS GRAND,
C DE LONGUEUR LTESPA+LTDIFF, POUR ACCELERER LES RECHERCHES FUTURES
      MAAAA(ID1) = -ID2
      IDN=-ID2-1
      GOTO 700
C
C LTDIFF >= ICONST
  500 MAAAA(ID1) = IDN
      MAAAA(IDN) = ID2
C
C SUCCES : ON PEUT RESERVER UN ESPACE COMMENCANT EN IDESPA
  700 CONTINUE
      MAAAA(2)=MAX(MAAAA(2),IDN)
      RETURN
C
C ECHEC : IL N'Y A PAS D'ESPACE SUFFISANT
  800 CONTINUE
      WRITE (IMPRIM, 999)
      WRITE (IMPRIM,1000) MAAAA(4),NOM,ITYPE,NBMOT
      WRITE (IMPRIM,1001)
      CALL IMALDY (MAAAA)
      STOP
C
C ERREURS
  910 WRITE (IMPRIM, 999)
      WRITE (IMPRIM,1000) MAAAA(4),NOM,ITYPE,NBMOT
      WRITE (IMPRIM,1002)
      STOP
  920 WRITE (IMPRIM, 999)
      WRITE (IMPRIM,1000) MAAAA(4),NOM,ITYPE,NBMOT
      WRITE (IMPRIM,1003)
      CALL IMALDY (MAAAA)
      STOP
      END
