TSP: The Transport Sample Protocol



Main Page | Modules | Alphabetical List | Data Structures | File List | Data Fields | Globals | Related Pages

datar.c

Go to the documentation of this file.
00001 
00038 /****************************************************************\
00039 |*                                                              *|
00040 |*   Name       :                                                           *|
00041 |*                                                              *|
00042 |*      d_ropen         Ouverture pour lecture                              *|
00043 |*      d_rcom          Lecture d'une ligne commentaire                     *|
00044 |*      d_rnam          Lecture d'une declaration                           *|
00045 |*      d_read          Lecture d'un enregistrement                         *|
00046 |*      d_dread         Lecture a acces aleatoire                           *|
00047 |*      d_rval          Retourne des parametres de taille                               *|
00048 |*                                                                  *|
00049 |*          version reentrante des fonctions (definir _LIBUTIL_REENTRANT)                       *|
00050 |*      d_ropen_r               Ouverture pour lecture                              *|
00051 |*      d_rcom_r                Lecture d'une ligne commentaire                     *|
00052 |*      d_rnam_r                Lecture d'une declaration                           *|
00053 |*      d_read_r                Lecture d'un enregistrement                         *|
00054 |*      d_dread_r               Lecture a acces aleatoire                           *|
00055 |*      d_rval_r                Retourne des parametres de taille                               *|
00056 |*      d_rclos_r               Fermeture apres lecture                                     *|
00057 |*                                                              *|
00058 |*                                                              *|
00059 |*   Synopsis   :                                               *|
00060 |*                                                              *|
00061 |*                                                              *|
00062 |*      d_ropen (name);                                         *|
00063 |*      d_rcom  (com,i);                                                    *|
00064 |*      d_rnam  (nam,desc,i);                                               *|
00065 |*      n  =  d_read  (rec);                                                *|
00066 |*      n  =  d_dread (rec,i);                                          *|
00067 |*      v  =  d_rval ( c);                                                  *|
00068 |*                                                              *|
00069 |*      d_ropen_r (name, use_dbl);                                      *|
00070 |*                                                              *|
00071 |*      int     use_dbl;                Indique si le fichier est un fichier de double ou de float*|
00072 |*      char    *name;          Nom du fichier                  *|
00073 |*      char    *com;           Ligne commentaire                           *|
00074 |*      char    *nam;           Nom de variable                 *|
00075 |*      char    *desc;          Descriptif de la variable                   *|
00076 |*      float/double *rec;      Tableau de donnees                                      *|
00077 |*      int     i;              Numero de l'enregistrement                  *|
00078 |*      int     c;              Type de valeur a retourner :                *|
00079 |*                                'v'  nombre de variables                  *|
00080 |*                                'r'  nombre d'enregistrements                 *|
00081 |*                                'c'  nombre de commentaires               *|
00082 |*      int     v;              Valeur retournee                            *|
00083 |*      int     n;              Nombre de char lus ou EOF                   *|
00084 |*                                                              *|
00085 |*   Description :                                                          *|
00086 |*                                                              *|
00087 |*      Routines d'interface lecture avec les fichiers de                               *|
00088 |*      donnees                                                 *|
00089 |*                                                              *|
00090 \****************************************************************/
00091 #include  <fcntl.h>
00092 #include  <stdio.h>
00093 #include  <stdlib.h>
00094 #include  <string.h>
00095 #include  <sys/param.h>
00096 
00097 #define _LIBUTIL_COMPIL
00098 #include "libUTIL.h"
00099 
00100 char    *datar_sccsid={"@(#)datar.c\t1.9\t00/09/29\tMATRA UTIL"};
00101 
00102 
00103 
00104 struct data_read
00105 {
00106   int   datafd;                 /* seule variable externe pour  */
00107                                 /* d_close en lecture           */
00108   long  pdat,pend;              /* pointeur sur donnees et fin  */
00109   long  pcom[RES_COM_NUM];      /* pointeurs sur commentaires   */
00110   long   pnom[RES_VAR_NUM*2];   /* pointeurs sur noms           */
00111   int   vnum,cnum,rnum;         /* nombre de variables,comment  */
00112                                 /*           enregistrements    */
00113   int   recl;                   /* Longueur d'un record         */
00114   int   firstr;                 /* file descrip et flags        */
00115   long  ll;
00116   int    use_dbl;               /* Utilisation des doubles */
00117 
00118 };
00119 
00120 typedef struct data_read data_read;
00121 
00122 /* d_glob_rhandle cannot be static, because in the non reentrant version
00123 of this lib, there's one single close function both for read and write,
00124 and this function is in dataw.c*/
00125 d_rhandle d_glob_rhandle = 0;
00126 
00127 /*-----------------------------------------------------*\
00128 |                                                       |
00129 |                       d_ropen                         |
00130 |                                                       |
00131 \*-----------------------------------------------------*/
00132 
00133 void    d_ropen (char *name)
00134 {
00135   d_glob_rhandle = d_ropen_r (name,&_use_dbl);
00136   if(!d_glob_rhandle)
00137     {
00138       exit(1);
00139     }
00140     
00141 }
00142 
00143 d_rhandle       d_ropen_r (char *name, int* use_dbl)
00144 {
00145   int   inw,n;
00146   char  c;
00147   char  did[6],nam[MAXPATHLEN];
00148   data_read* obj;
00149 
00150 
00151   obj = (data_read*)calloc(1, sizeof(data_read));
00152   if(!obj)
00153     {
00154       fprintf ( stderr, "libRES : *** Echec de l'allocation memoire\n");      
00155       return 0;
00156     }
00157 
00158   strcpy(nam, name);
00159   if(strcmp(nam+strlen(nam)-4, ".res") != 0)
00160     strcat(nam, ".res");
00161 
00162   obj->datafd = open (nam,(O_RDONLY));
00163 
00164   if(obj->datafd <=0 ) {
00165     fprintf ( stderr, "*** Erreur a l'ouverture de %s\n",nam);
00166     free(obj);
00167     return 0;
00168   }
00169 
00170         
00171   obj->pend  = lseek(obj->datafd,0L,2); /*  pointeur sur le dernier byte        */
00172   obj->ll    = lseek(obj->datafd,0L,0); /*  position debut de fichier           */
00173 
00174   read(obj->datafd,did,6);
00175   if((strcmp(did,"data2")!=0)&&(strcmp(did,"data3")!=0)) {
00176     obj->ll = lseek(obj->datafd,0L,0);
00177     obj->use_dbl = 0;
00178     obj->pcom[0] = 0;
00179   }
00180   else {
00181     if(strcmp(did,"data3")==0)
00182       obj->use_dbl = 1;
00183     else
00184       obj->use_dbl = 0;
00185 
00186     obj->pcom[0] = 6;
00187   }
00188   *use_dbl = obj->use_dbl;
00189 
00190   obj->cnum  = 0;
00191   obj->vnum  = 0;
00192   inw   = 0;                    /* indicateur de zone en cours          */
00193   obj->firstr= 1;                       /* flag first read                      */
00194 
00195 
00196   while (inw != 2) {            /* Boucle de lecture jusqu'a la zone    */
00197     /*  de donnees                              */
00198 
00199     n = read(obj->datafd,&c,1); /* Lecture caractere                    */
00200 
00201     switch (c)  {
00202     case '\0' :         /* fin de chaine de caractere           */
00203       switch (inw) {
00204       case 0 :  /* lecture commentaires                 */
00205         obj->pcom[++obj->cnum] = lseek(obj->datafd,0L,1);
00206         break;
00207       case 1 :  /* lecture noms                         */
00208         obj->pnom[++obj->vnum] = lseek(obj->datafd,0L,1);
00209         break;
00210       }
00211       break;
00212     case '\1' :         /* Fin de zone                          */
00213       switch (inw) {
00214       case 0 :  /* Fin de zone commentaires             */
00215         inw++;
00216         obj->pnom[0] = lseek (obj->datafd,0L,1);
00217         break;
00218       case 1 :  /* Fin de zone noms                     */
00219         inw++;
00220         obj->pdat   = lseek (obj->datafd,0L,1);
00221         break;
00222       }
00223     }
00224   }
00225 
00226   obj->vnum = obj->vnum/2;
00227 
00228   if(obj->use_dbl)
00229     obj->recl = obj->vnum * sizeof(double);
00230   else
00231     obj->recl = obj->vnum * sizeof(float);
00232 
00233   obj->rnum = (int)(obj->pend-obj->pdat) /obj->recl;
00234 
00235   lseek (obj->datafd,obj->pdat,0);              /* Position debut de zone donnees       */
00236 
00237   return obj;
00238 }
00239 
00240 /*-----------------------------------------------------*\
00241 |                                                       |
00242 |                       d_read                          |
00243 |                                                       |
00244 \*-----------------------------------------------------*/
00245 
00246 int     d_read (void *buf)
00247 {
00248   return d_read_r(d_glob_rhandle,buf); 
00249 }
00250 
00251 int     d_read_r (d_rhandle h, void *buf)
00252 {
00253   data_read* obj = (data_read*)h;
00254   int   n;
00255   void  *p;
00256 
00257   if (obj->firstr) {
00258     lseek (obj->datafd,obj->pdat,0);
00259     obj->firstr = 0;
00260   }
00261   if ((n=read(obj->datafd,buf,obj->recl)) != obj->recl)
00262     return (EOF);
00263 
00264   /* FIXME : buf is supposed to be typed to float XOR double
00265      shall swap 32 or 64 according to my endianity */
00266   p=(void *)buf;
00267   if(obj->use_dbl)
00268     for(n=0; n<obj->recl; n+=sizeof(double))
00269       {
00270         DOUBLE_FROM_BE(p);
00271         p += sizeof(double);
00272       }
00273   else
00274     for(n=0; n<obj->recl; n+=sizeof(float))
00275       {
00276         FLOAT_FROM_BE(p);
00277         p += sizeof(float);
00278       }
00279 
00280   return (obj->recl);
00281 }
00282 
00283 int     d_restart_r (d_rhandle h)
00284 {
00285   int ret=0;
00286   data_read* obj = (data_read*)h;
00287   ret = lseek (obj->datafd,obj->pdat,0);
00288   return ret;
00289 }
00290     
00291 /*-----------------------------------------------------*\
00292 |                                                       |
00293 |                       d_dread                         |
00294 |                                                       |
00295 \*-----------------------------------------------------*/
00296 int     d_dread (void *buf, int i)
00297 {
00298   return d_dread_r(d_glob_rhandle,buf,i);
00299 }
00300 
00301 int     d_dread_r (d_rhandle h, void *buf, int i)
00302 {
00303   data_read* obj = (data_read*)h;
00304   int   n;
00305   long  l;
00306 
00307   l  = (long)(i * obj->recl) + obj->pdat;
00308   lseek (obj->datafd,l,0);
00309 
00310   if ((n=read(obj->datafd,buf,obj->recl)) != obj->recl)
00311     return (EOF);
00312 
00313   return (obj->recl);
00314 }
00315 
00316 /*-----------------------------------------------------*\
00317 |                                                       |
00318 |                       d_rcom                          |
00319 |                                                       |
00320 \*-----------------------------------------------------*/
00321 void    d_rcom(char *com, int i)
00322 {
00323   d_rcom_r(d_glob_rhandle, com,i);
00324     }
00325 
00326 void    d_rcom_r(d_rhandle h, char *com, int i)
00327 {
00328   data_read* obj = (data_read*)h;
00329   char  *p,
00330     cbuf[RES_COM_LEN];
00331 
00332   lseek (obj->datafd,obj->pcom[i],0);           /*  position sur le commentaire demande */
00333   read  (obj->datafd,cbuf,RES_COM_LEN); /*  Lecture de RES_COM_LEN caracteres   */
00334 
00335   p = cbuf;
00336 
00337   while ((*com++ = *p++) != '\0' )      /*  Recopie jusqu'au zero       */
00338     ;
00339   *com++ = '\0';
00340 
00341   return;
00342 } 
00343 
00344 /*-----------------------------------------------------*\
00345 |                                                       |
00346 |                       d_rnam                          |
00347 |                                                       |
00348 \*-----------------------------------------------------*/
00349 void    d_rnam(char *nam, char *desc, int i)
00350 {
00351   d_rnam_r(d_glob_rhandle, nam, desc, i);
00352 }
00353 
00354 void    d_rnam_r(d_rhandle h, char *nam, char *desc, int i)
00355 {
00356   data_read* obj = (data_read*)h;
00357   char  *p,
00358     cbuf[RES_NAME_LEN+RES_DESC_LEN];
00359 
00360   lseek (obj->datafd,obj->pnom[i*2],0);                 /*  position sur la variable demandee */
00361   read  (obj->datafd,cbuf,RES_NAME_LEN+RES_DESC_LEN);   /*  Lecture de ??? caracteres   */
00362 
00363   p = cbuf;
00364 
00365   while ( (*nam++ = *p++) != '\0' )             /*  Recopie nom jusqu'au zero   */
00366     ;
00367   *nam++ = '\0';
00368 
00369   while ( (*desc++ = *p++) != '\0' )            /*  Recopie desc jusqu'au zero  */
00370     ;
00371   *desc++ = '\0';
00372 
00373   return;
00374 }
00375 
00376 /*-----------------------------------------------------*\
00377 |                                                       |
00378 |                       d_rval                          |
00379 |                                                       |
00380 \*-----------------------------------------------------*/
00381 int     d_rval(int c)
00382 {
00383   return d_rval_r(d_glob_rhandle, c);
00384 }
00385 
00386 int     d_rval_r(d_rhandle h, int c)
00387 {
00388   data_read* obj = (data_read*)h;
00389   switch  (c) {
00390   case 'v' :
00391     return(obj->vnum);
00392   case 'c' :
00393     return(obj->cnum);
00394   case 'r' :
00395     return(obj->rnum);
00396   }
00397 
00398   return(0);
00399 }
00400 
00401 void    d_rclos_r(d_rhandle h)
00402 {
00403     data_read* obj = (data_read*)h;
00404     close(obj->datafd);
00405     free(obj);
00406     
00407 }
Framework Home Page.

Beware !! TSP wave is coming...