#include "../h/licasc.h"

/*
 =======================================================================

     serasc = lecture d'une serie dans un fichier ascii au format
              fsi

     parametres =
        e  fdfic        = descripteur du fichier ascii,
        e  kser         = numero de la serie contenant le vecteur,
        e  iechd        = rang du premier echantillon,
        e  nechm        = nombre d'echantillons de la serie,
        e  ivect        = tableau des numeros de vecteurs demandes,
        e  nvecm        = nombre de vecteurs demandes,
        e  nech         = nombre d'echantillons demandes,
         s nech         = nombre d'echantillons effectivement lus.
         s ivect        = tableau des numeros de vecteurs lus,
         s rmatt        = tableau des valeurs lues,

     retourne =
            kerr        = indicateur d'erreur :
                          -3 = serie absente dans le fichier,
                          -2 = certains vecteurs ne sont pas presents
                                dans la serie,
                          -1 = rang du premier echantillon superieur au
                             nombre d'echantillons presents,
                           0 = absence d'erreur,
                           1 = nombre d'echantillons demandes superieur
                             au nombre d'echantillons presents.

     generiques =
         err    = erreur
      P...      = pointeur
      S...      = structure
       ...t     = tableau

     auteur = marimai.henaff    iut.orsay
     version 1.1 du 02/01/95

 =======================================================================
*/

int serasc ( fdfic, kser, iechd, nechm, ivect, nvecm, rmatt, nech)
FILE *fdfic;
int     *kser, *iechd, *nechm, *nvecm, *ivect, *nech;
float   rmatt[];
{
        /* ... variables locales  ... */

        double dpart[NPARM];

        int     kerr ;
        int     bfin, bcrlf ;
        int     bser, bvec ;
        int     iech, ival, ipar, ichr, ivec, imat, icle, itab;
        int     lzlig, llig, npar ;
        int     itypt[NPARM], idebt[NPARM], nlont[NPARM] ;

        char    zser[3], zvec[NVECM][4];
        char    zlig[LLIGM] ;
        char    *Pzlig =zlig ;
        char    zligw[LLIGM] ;
        char    *Pzligw =zligw ;

        /* ... initialisations ... */

        bser = 0;
        bvec = 0;
        iech = 0;
        ival = 0;
        kerr = 0 ;
        bfin = 0 ;
        bcrlf = 0 ;
        llig = LLIGM ;
        lzlig = LLIGM ;

        for ( ivec = 0; ivec < *nvecm; ivec++) {
           sprintf ( zvec[ivec], "V%d\0", ivect[ivec] ) ;
        }
        sprintf ( zser, "%s%d", ZCLESER, *kser ) ;

        /* ... boucle sur le fichier ... */

        while (bfin == 0) {

         /* ... lecture d'une ligne ... */

         fgets ( zlig, LLIGM, fdfic) ;

         if (feof ( fdfic)) {
             bfin = 1;
         }
         else {

           /* ... detection de la cle serie ... */

           if ( strncmp ( zlig, zser, 3) == 0) {
              if ( !bser) {
                 bser = 1 ;
              }
              else {
                 bfin = 1 ;
              }
           }
           else {

              /* ... detection d'un commentaire ... */

              if ( strncmp ( zlig, ZCLECOM, strlen( ZCLECOM)) != 0) {

                 if ( bser == 1) {

                    /* ... detection d'une nouvelle cle serie ... */

                    if (strncmp( zlig, ZCLESER, strlen( ZCLESER)) == 0){

                       if ( bvec == 0) {
                          kerr = -2 ;
                       }
                       else {
                          if ( iech < *iechd) {
                             kerr = -1 ;
                          }
                       }
                       bfin = 1 ;

                    }
                    else {

                       /* ... detection d'une ligne blanche ... */

                       if ( ! ligspc ( zlig, llig)) {

                          if ( bvec == 0) {

                             /* ... detection des cles vecteur ... */

                             for ( ivec = 0; ivec < *nvecm; ivec++) {
                                if (!ligstr ( zlig, llig, zvec[ivec],strlen( zvec[ivec]))) {
                                   kerr ++ ;
                                   ivect[ivec] = 0 ;
                                }
                             }
                             if ( kerr == ivec) {
                                kerr == -2 ;
                                bfin = 1 ;
                             }
                             else {
                                if ( kerr != 0) kerr == -2 ;
                                bvec = 1 ;
                             }
                          }
                          else {

                             iech++ ;

                             if ( iech >= *iechd) {

                                /* ... initialisations ... */

                                npar = NPARM ;
                                for ( ipar = 0; ipar < npar; ipar++) {
                                   dpart[ipar] = 0.0 ;
                                   itypt[ipar] = 0 ;
                                   idebt[ipar] = 0 ;
                                   nlont[ipar] = 0 ;
                                }
                                bcrlf = 0 ;
                                imat = 0 ;

                                /* ... on rajoute des espaces ... */

                                for ( ichr = 0; ichr < llig; ichr++) {
                                   if ( zlig[ichr] == '\n') {
                                      bcrlf = 1 ;
                                   }
                                   if ( bcrlf != 1) {
                                      zligw[ichr] = zlig[ichr] ;
                                   }
                                   else {
                                      strncpy ( zligw+ichr, " ", 1) ;
                                   }
                                }

                                /* analyse syntaxique de la ligne */

                                anastx ( Pzligw, llig, &npar,
                                  itypt, idebt, nlont, dpart) ;

                                if ( itypt[0] == 0) {
                                   ipar = 0 ;
                                }
                                else {
                                   ipar = -1;
                                }

                                /* remplissage du tableau des valeur */

                                for( ivec = 0; ivec < *nvecm; ivec ++) {
                                   icle = ivect[ivec] ;
                                   if ( icle != 0 ) {
                                      itab = ( imat * *nechm) + ival ;
                                      rmatt[itab] = dpart[ipar+icle] ;
                                      imat++ ;
                                   }
                                }
                                ival++ ;
                                if (ival == *nech) bfin = 1 ;

                             }

                          }
                       }
                    }
                 }
              }
           }

         }
        }

        if (( ival != *nech ) && (kerr != -1)) {
           kerr = 1;
        }
        *nech = ival ;

        if (bser == 0) {
           kerr = -3 ;
        }

        return ( kerr) ;

}
