C
C This file is issued from the MODULEF library, but has been 
C subsequently modified
C
      SUBROUTINE FONSUI(CITEM,LITEM,NITEM)
C ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
C           S.P. FONSUI          (FONCTIONS INTERPRETEES)
C           -----------
C ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
C BUT :
C     LIRE L'ITEM SUIVANT (SCANNER)
C
C PARAMETRES DE SORTIE :
C     CITEM   : CHAINE DE CARACTERE CONTENANT L'ITEM
C     LITEM   : LONGUEUR DE L'ITEM (EN CARACTERES)
C     NITEM   : NUMERO DE CODE DE L'ITEM ; LE CHIFFRE DES 10 000 EST
C               1 IDENTIFICATEUR, 2 MOT-CLE, 3 CONSTANTE, 4 SEPARATEUR
C
C REMARQUE : CE SOUS-PROGRAMME MEMORISE D'UN APPEL A L'AUTRE :
C     MLIG    = LIGNE LUE PRECEDEMMENT
C     IDLIG   = INDICE DANS MLIG DU PREMIER CAR. DE L'ITEM PRECEDENT
C     IFLIG   = INDICE DANS MLIG DU DERNIER CAR. DE L'ITEM PRECEDENT + 1
C     NITEMS  = NUMERO DE CODE DE L'ITEM PRECEDENT
C ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
C PROGRAMMEUR : PATRICK LAUG ; INRIA (3) 954 90 20 POSTE 508
C ......................................................................
      PARAMETER (LLIG=257)
      CHARACTER*256 CITEM,BUFFER
      CHARACTER* 1 MLIG(LLIG),CFIN
      COMMON /FONLIG/ MLIG
      COMMON /FONNUM/ IDLIG,IFLIG,NITEMS,NBIDEN,IMPLIC
      COMMON /UNITES/ LECTEU,IMPRIM,INTERA,NFNEWS,NFSAUV
      COMMON /COMCOU/ NCOU,IACOU,LCOU,NFIC,NBENR,LGCOU
C
C CFIN CONTIENT '@' (RETOUR CHARIOT)
C ON LIT ET ON MET UN '@' APRES LE DERNIER CARACTERE NON BLANC
  100 CFIN = MLIG(IFLIG)
      IF (CFIN.EQ.'@') THEN
  110    CALL LIBLIG(BUFFER)
         IF (NFIC.NE.0) CALL FONSAV(BUFFER)
         INB = 0
         DO 120 I = 1,256
            CFIN = BUFFER(I:I)
            MLIG(I) = CFIN
            IF (CFIN.NE.' ') INB = I
  120    CONTINUE
         IF (INB.EQ.0) GOTO 110
         MLIG(INB+1) = '@'
         IFLIG = 1
         CFIN = MLIG(1)
      END IF
C
C CFIN CONTIENT ' ' (BLANC)
C ON CHERCHE LE PREMIER CARACTERE NON BLANC
C N.B. : APRES UN BLANC, ON NE PEUT PAS AVOIR DE '@'
  200 IF (CFIN.EQ.' ') THEN
         IFLIG = IFLIG + 1
         CFIN = MLIG(IFLIG)
         GOTO 200
      END IF
C
C ON EST MAINTENANT POSITIONNE AU DEBUT DE L'ITEM
C SI CFIN = + OU -, ON TESTE SI C'EST UN OPERATEUR UNAIRE
C OU BINAIRE AVANT DE TESTER SI ON A UNE CONSTANTE NUMERIQUE
      IDLIG = IFLIG
      IGOTO = INDEX('ABCDEFGHIJKLMNOPQRSTUVWXYZ_+-*/<=>'';(),',CFIN)
      IF (IGOTO.NE.0) THEN
         IGOTO = IGOTO - 26
         IF (IGOTO.LE.0) IGOTO = 1
         GOTO (501,502,503,504,505,506,507,508,509,
     +         510,511,512,513),IGOTO
      END IF
C
C EST-CE UNE CONSTANTE NUMERIQUE ?
      CALL FONAUT(MLIG(IDLIG),LGCSTE,NTCSTE)
      IF (IMPLIC.EQ.2 .AND. NTCSTE.EQ.2) NTCSTE = 3
      IF (NTCSTE.EQ.1) THEN
         WRITE (IMPRIM,*) ' FONSUI: CARACTERE IGNORE : ',CFIN
         IFLIG = IFLIG + 1
         GOTO 100
      END IF
      NITEM = 30 000 + NTCSTE*1000
      IFLIG = IFLIG + LGCSTE
      GOTO 910
C
C IDENTIFICATEUR OU MOT-CLE
  501 IFLIG = IFLIG + 1
      IF (INDEX('ABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789',
     +   MLIG(IFLIG)) .NE. 0) GOTO 501
      CALL FONCMR(MLIG(IDLIG), IFLIG-IDLIG, NITEM)
      GOTO 910
C
C CFIN CONTIENT +
C SI ITEM PRECEDENT = IDENT, CSTE, OU PAR. FERMANTE, ALORS PLUS BINAIRE
C SINON PLUS UNAIRE
  502 I = NITEMS / 10 000
      IF (I.EQ.1 .OR. I.EQ.3 .OR. NITEMS.EQ.40 003) THEN
         NITEM = 42 001
         GOTO 900
      END IF
      CALL FONAUT(MLIG(IDLIG),LGCSTE,NTCSTE)
      IF (IMPLIC.EQ.2 .AND. NTCSTE.EQ.2) NTCSTE = 3
      IF (NTCSTE.EQ.1) THEN
         NITEM = 41 001
         GOTO 900
      ELSE
         NITEM = 30 000 + NTCSTE*1000
         IFLIG = IFLIG + LGCSTE
         GOTO 910
      END IF
C
C CFIN CONTIENT - (MOINS BINAIRE OU UNAIRE)
  503 I = NITEMS / 10 000
      IF (I.EQ.1 .OR. I.EQ.3 .OR. NITEMS.EQ.40 003) THEN
         NITEM = 42 002
         GOTO 900
      END IF
      CALL FONAUT(MLIG(IDLIG),LGCSTE,NTCSTE)
      IF (IMPLIC.EQ.2 .AND. NTCSTE.EQ.2) NTCSTE = 3
      IF (NTCSTE.EQ.1) THEN
         NITEM = 41 002
         GOTO 900
      ELSE
         NITEM = 30 000 + NTCSTE*1000
         IFLIG = IFLIG + LGCSTE
         GOTO 910
      END IF
C
C CFIN CONTIENT * (MULTIPLIE OU PUISSANCE)
  504 IF (MLIG(IFLIG+1).NE.'*') THEN
         NITEM = 42 003
         GOTO 900
      ELSE
         NITEM = 42 005
         IFLIG = IFLIG + 2
         GOTO 910
      END IF
C
C CFIN CONTIENT /
  505 NITEM = 42 004
      GOTO 900
C
C CFIN CONTIENT < = >
  506 CONTINUE
  507 CONTINUE
  508 CONTINUE
      NITEM = 42 006
      GOTO 900
C
C CHAINE DE CARACTERES
  509 NITEM = 31 000
  609 IFLIG = IFLIG + 1
      IF (MLIG(IFLIG) .EQ. '@') THEN
         WRITE (IMPRIM,*) ' FONSUI: CHAINE DE CARACTERE INCOMPLETE'
         GOTO 910
      END IF
      IF (MLIG(IFLIG)   .NE. '''') GOTO 609
      IF (MLIG(IFLIG+1) .NE. '''') GOTO 910
      IFLIG = IFLIG + 1
      GOTO 609
C
C CFIN CONTIENT ; ( ) ,
  510 CONTINUE
  511 CONTINUE
  512 CONTINUE
  513 CONTINUE
      NITEM = 40 000 + (IGOTO - 9)
      GOTO 900
C
C RETOUR
  900 IFLIG = IFLIG + 1
  910 LITEM = IFLIG - IDLIG
      DO 950 I = 1,LITEM
  950 CITEM(I:I) = MLIG(IDLIG+I-1)
      NITEMS = NITEM
      END
