C MOTS      SOURCE    CB215821  21/11/25    21:15:11     11201          
      SUBROUTINE MOTS
************************************************************************
*
*                               M O T S
*                               -------
*
*            SOUS-PROGRAMME ASSOCIE A L'OPERATEUR "MOTS"
*
* FONCTION:
* ---------
*
*     ENREGISTRER UN OBJET DE TYPE 'LISTMOTS'.
*
* PHRASE D'APPEL (EN GIBIANE):
* ----------------------------
*
*     OBJET1 = MOTS MOT1 (MOT2 (MOT3 ...) ) ;
*
*     LES PARENTHESES INDIQUANT DES ARGUMENTS FACULTATIFS.
*
* ARGUMENTS (EN GIBIANE):
* -----------------------
*
*     MOT1,              )  CHAINES DE CARACTERES QUELCONQUES NE
*      MOT2,             )) CONTENANT NI BLANC, NI CARACTERE RESERVE
*       MOT3, ...        )  (TEL LE SIGNE "=").
*
*     OBJET1    'LISTMOTS'  LISTE DE MOTS CREEE (tronques a LOCHAI caracteres).
*
* DICTIONNAIRE DES VARIABLES: (ORDRE ALPHABETIQUE)
* ---------------------------
*
*     IPMOTS  ENTIER    POINTEUR SUR L'OBJET "OBJET1".
*     LEMOT   ENTIER    CONTIENT L'UN DES MOTS "MOT1", MOT2", ...
*
* SOUS-PROGRAMMES APPELES:
* ------------------------
*
*     LIRCHA, ECROBJ, ERREUR.
*
* REMARQUES:
* ----------
*
*     L'APPEL AU SOUS-PROGRAMME "ERREUR" EST DU AU FAIT QUE LE
*     SOUS-PROGRAMME "LIROBJ" NE FOURNIT PAS LE NOM DE L'OBJET, QUAND IL
*     EN RECONNAIT UN, MAIS SIMPLEMENT SA VALEUR.
*     OR, LA TABLE DES NOMS D'OBJETS NE PERMET PAS DE RETROUVER UN NOM
*     CONNAISSANT UN POINTEUR (C-A-D UN OBJET) CAR PLUSIEURS NOMS
*     PEUVENT AVOIR ETE ATTRIBUES A UN MEME OBJET.
*     IL N'EST DONC PAS POSSIBLE DE RECUPERER LE NOM COMME UN SIMPLE
*     MOT QUAND CE NOM EST UN NOM D'OBJET.
*
*     LA LECTURE D'UN ENTIER OU D'UN REEL COMME UN SIMPLE MOT NE
*     FONCTIONNE PAS ACTUELLEMENT, MAIS CELA PEUT ETRE FAIT
*     (MOYENNANT UN APPEL A UN SOUS-PROGRAMME ACCEPTANT DE COMMETTRE
*     QUELQUES INDELICATESSES VIS-A-VIS DE LA NORME FORTRAN77).
*
*
************************************************************************
*
      IMPLICIT INTEGER(I-N)
-INC SMLMOTS
-INC PPARAM
-INC CCOPTIO
*
      CHARACTER*4 MSPE(1)
      DATA MSPE/'*   '/
      CHARACTER*(LOCHAI) LEMOT
*
      PARAMETER (INFINI = 9999)
*
*
      JGN   = LOCOMP
      JGM   = 10
      IPMOTS= 0
      IMO   = 0
      SEGINI,MLMOTS
      IPMOTS=MLMOTS
*
*
*     BOUCLE SUR LA LISTE D'OBJETS PASSES A L'OPERATEUR MOTS
*     ----------------------------------------------------------------
 100  CONTINUE
*
*         ON LIT UN EVENTUEL MOT-CLE DE REPETITION (*) ...
          NFOIS=1
          CALL LIRENT(NFOIS,0,IRET1)
*
*         ...PUIS ON CHERCHE UN NOUVEAU MOT
          CALL LIRCHA(LEMOT,0,IRETOU)
*
*
*      => PAS DE NOUVEAU MOT
          IF (IRETOU.EQ.0) THEN
*
*             ERREUR, car on attendait le caractere special *
              IF (IRET1.NE.0) GOTO 999
*
*             Sinon, on ajuste eventuellement le LISTMOTS et on sort
              IF (IMO.NE.JGM) THEN
                  JGM=IMO
                  SEGADJ,MLMOTS
              ENDIF
              GOTO 110
*
*      => NOUVEAU MOT TROUVE
          ELSE

            IF(IRETOU .GT. JGN)THEN
              JGN = IRETOU
              SEGADJ,MLMOTS
            ENDIF

            IF (IRET1.NE.0) THEN
*             ERREUR, car on attendait le caractere special *
              IF (LEMOT.NE.MSPE(1)) GOTO 999
              CALL LIRCHA(LEMOT,1,IRETOU)
            ENDIF
*
*           Sinon, on complète le LISTMOTS
            IMO=IMO+NFOIS
            IF (IMO.GT.JGM) THEN
                JGM=IMO * 2 + 10
                SEGADJ,MLMOTS
            ENDIF
            DO JJ=1,NFOIS
                MOTS(IMO+JJ-NFOIS)=LEMOT
            ENDDO
*
          END IF
      GOTO 100

*     ----------------------------------------------------------------
*
 999  CONTINUE
      MOTERR=MSPE(1)
      CALL ERREUR(396)
      RETURN
*
*
 110  CONTINUE
      SEGDES,MLMOTS
      CALL ECROBJ ('LISTMOTS',IPMOTS)

      END
 
 
 
 
