#include <ctype.h>
#include <math.h>

/*
 =======================================================================

     anastx = analyse synthaxique d'un tableau de caracteres.

     parametres =
        e       ztab    = tableau de caracteres a analyser,
        e       ltab    = longueur du tableau de caracteres,
        e       nprm    = nombre maximum de parametres,
         s      nprm    = nombre de parametres analyses,
         s      itypt   = types des parametres:
                                0       non numerique
                                1       entier
                                2       reel
                                3       reel avec exposant,
         s      idebt   = position du premier caractere de
                          chaque parametre,
         s      ilont   = longueur de chaque parametre,
         s      rprmt   = valeur reelle des parametres numeriques.

     generiques =
         err    = erreur
      P...      = pointeur
      S...      = structure
       ...t     = tableau

     auteur = marimai.henaff    iut.orsay
     version 1.4 du 5/7/92

 =======================================================================
*/

int anastx ( ztab, ltab, nprm, itypt, idebt, ilont, dprmt)
char *ztab ;
int ltab, *nprm, *itypt, *idebt, *ilont ;
double *dprmt ;

{

        /* ... variables locales ... */

        double dval, dmant, dsmant, dmul, dsign;

        int     kerr ;
        int     icar, iprm, ideb, ilon ,iexp ,itmp ,i ;
        int     nprma, isexp, nexp, ndec ;
        int     bpar ;

        char    car;

        /* ... initialisations ...................................... */

        bpar = 0 ;
        kerr = 0 ;
        icar = 0 ;
        iprm = 0 ;
        ideb = 1 ;
        ilon = 0 ;
        dmant = 0. ;
        isexp = 1 ;
        dsign = 1.;
        nprma = -1 ;
        nexp = 0 ;
        ndec = 0 ;


        /* ... debut du traitement .................................. */

        car = ztab[icar] ;

        while ( ( car != '\0') && ( icar < ltab)
               && ( nprma < *nprm - 1) || ( bpar == 1)) {

         /* ... detection d'un espace dans une chaine ... */

         if ( (isspace ( car)) && (bpar == 1) && (itypt[nprma] == 0)) {
           ideb++ ;
           ilon++ ;
/* printf ( " un espace en %d \n", ideb); */
         }
         else {

           /* ... detection d'un espace ou d'une virgule ... */

           if ( ( !isspace ( car)) && ( car != ',') ) {

              /* ...traitement du premier caractere d'un parametre... */

              if ( bpar == 0 ) {

                 bpar = 1 ;
                 nprma++ ;
                 idebt[nprma] = ideb ;

                 /* ... detection d'une lettre ... */

                 if ((!isdigit ( car)) && ( car != '-') &&
                     ( car != '+') && ( car != '.')) {
                    itypt[nprma] = 0 ;
                 }

                 /* ... detection d'un chiffre ou signe ... */

                 else {
                    if ( car == '.') {
                       itypt[nprma] = 2 ;
                    }
                    else {
                       itypt[nprma] = 1 ;
                       if ( car == '-') {
                          dsign = -1 ;
                       }
                       else {
                          if ( isdigit ( car)) {
                             sscanf ( &car, "%lf", &dmant) ;
                          }
                       }
                    }
                 }
              }

              /* ... traitement d'un caractere d'un parametre ... */

              else {

                 switch ( itypt[nprma]) {

                    /* ... cas de la partie entiere ... */

                    case ( 1) :

                       if ( isdigit ( car)) {
                          sscanf ( &car, "%lf", &dval) ;
                          dmant = dmant * 10 + dval ;
                       }
                       else {
                          if ( car == '.') {
                             itypt[nprma] = 2 ;
                          }
                          else {
                             itypt[nprma] = 0 ;
                          }
                       }
                       break ;

                    /* ... cas de la partie decimale ... */

                    case ( 2) :

                       if ( isdigit ( car)) {
                          sscanf ( &car, "%lf", &dval) ;
                          dmant = dmant * 10 + dval ;
                          ndec++ ;
                       }
                       else {
                          if ( ( car == 'e') || ( car == 'E') ||                                        ( car == 'd') || ( car == 'D')) {
                             itypt[nprma] = 3 ;
                          }
                          else {
                             itypt[nprma] = 0 ;
                          }
                       }
                       break ;

                    /* ... cas de l'exposant ... */

                    case ( 3) :

                       if ( car == '-') {
                          isexp = -1 ;
                       }
                       else {
                          if ( isdigit ( car)) {
                             sscanf ( &car, "%lf", &dval) ;
                             nexp = nexp * 10 + dval ;
                          }
                          else {
                             if ( car != '+') {
                                itypt[nprma] = 0 ;
                             }
                          }
                       }
                       break ;
                 }
              }
              ideb++ ;
              ilon++  ;
           }

           else {

              /* ... traitement de fin d'un parametre ... */

              if ( bpar == 1) {

                 /* ... cas d'un parametre numerique ... */

                 iexp = nexp * isexp - ndec ;
                 dsmant = dmant * dsign;

                 if ( itypt[nprma] == 1) {
                    dval = dsmant;
                 }
                 else {
                    dmul =  pow ( 10.0, (double)iexp);
                    dval = dsmant * dmul;
                 }

                 dprmt[nprma] = dval ;
                 ilont[nprma] = ilon ;

                 /* ... reinitialisations  ... */

                 bpar = 0 ;
                 nexp = 0 ;
                 ndec = 0 ;
                 dmant = 0.;
                 isexp = 1 ;
                 dsign = 1.;
                 ilon = 0 ;
              } /* fin traitement de fin de parametre */
              ideb++ ;
           } /* fin detection du caractere separateur  */

          } /* detection d'un espace dans une chaine */
          icar++ ;
          car = ztab[icar];

        } /* end while */
        nprma++;
        *nprm = nprma ;

        /* ... fin du traitement .................................... */

        return ( kerr) ;

}
