TSP: The Transport Sample Protocol



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

dataw.c

Go to the documentation of this file.
00001 
00038 /****************************************************************\
00039 |*                                                              *|
00040 |*   Name       :                                                           *|
00041 |*                                                              *|
00042 |*      d_wopen         Open data file for write access                     *|
00043 |*      d_wcom          Write comment in data file                          *|
00044 |*      d_wnam          Ecriture du nom et descriptif                       *|
00045 |*                        d'une variable                                    *|
00046 |*      d_writ          Ecriture d'un enregistrement                        *|
00047 |*      d_clos          Fermeture du fichier                                *|
00048 |*                                                              *|
00049 |*          version reentrante des fonctions (definir _LIBUTIL_REENTRANT)                       *|
00050 |*      d_wopen_r               Ouvre une fichier res en ecriture                           *|
00051 |*      d_wcom_r                Ecrit les commentaires dans le fichier          *|
00052 |*      d_wnam_r                Ecriture du nom et descriptif                       *|
00053 |*                        d'une variable                                    *|
00054 |*      d_writ_r                Ecriture d'un enregistrement                        *|
00055 |*      d_wclos_r               Fermeture du fichier                                *|
00056 |*                                                              *|
00057 |*   Synopsis   :                                               *|
00058 |*                                                              *|
00059 |*      d_wopen (name);                                         *|
00060 |*      d_wcom  (com);                                          *|
00061 |*      d_wnam  (nam,desc);                                                 *|
00062 |*      d_writ  (rec)                                           *|
00063 |*      d_clos  ();                                                         *|
00064 |*                                                              *|
00065 |*      d_wopen_r (name, use_dbl);                                      *|
00066 |*                                                              *|
00067 |*      int     use_dbl;                Indique si le fichier doit etre un fichier de double ou de float*|
00068 |*      char    *name;          Nom du fichier                  *|
00069 |*      char    *com;           Ligne commentaire                           *|
00070 |*      char    *nam;           Nom de variable                 *|
00071 |*      char    *desc;          Descriptif de la variable                   *|
00072 |*      float/double *rec;      Tableau de donnees                                      *|
00073 |*                                                              *|
00074 |*   Description :                                                          *|
00075 |*                                                              *|
00076 |*      Routines d'interface ecriture avec les fichiers de                              *|
00077 |*      donnees                                                 *|
00078 |*                                                              *|
00079 |*                                                              *|
00080 \****************************************************************/
00081 #include <fcntl.h>
00082 #include <stdio.h>
00083 #include <stdlib.h>
00084 #include <string.h>
00085 #include <sys/types.h>
00086 #include <sys/stat.h>
00087 #include <sys/param.h>
00088 
00089 #define _LIBUTIL_COMPIL
00090 #include "libUTIL.h"
00091 
00092 #ifdef MC
00093 
00094 #define S_IRUSR 0000400         /* read permission, owner */
00095 #define S_IWUSR 0000200         /* write permission, owner */
00096 #define S_IXUSR 0000100         /* execute/search permission, owner */
00097 #define S_IRGRP 0000040         /* read permission, group */
00098 #define S_IWGRP 0000020         /* write permission, grougroup */
00099 #define S_IXGRP 0000010         /* execute/search permission, group */
00100 #define S_IROTH 0000004         /* read permission, other */
00101 #define S_IWOTH 0000002         /* write permission, other */
00102 #define S_IXOTH 0000001         /* execute/search permission, other */
00103 
00104 #endif
00105 
00106 char    *dataw_sccsid={"@(#)dataw.c\t1.12\t00/09/29\tMATRA UTIL"};
00107 
00108 
00109 struct data_write
00110 {
00111 int     datafd;                         /* fichier */
00112                                         /* pour d_clos  en lecture      */
00113                                         /* pointeurs sur noms           */
00114 int     vnum;           /* nombre de variables,comment  */
00115                                 /*           enregistrements    */
00116 int     recl;                   /* Longueur d'un record         */
00117 int     firstw,firstn;          /* file descrip et flags        */
00118 int      use_dbl;               /* Utilisation des doubles */
00119 
00120 };
00121 
00122 typedef struct data_write data_write;
00123  
00124 
00125 extern d_rhandle d_glob_rhandle;
00126 
00127 static d_whandle d_glob_whandle = 0;
00128 
00129 
00130 
00131 /*-----------------------------------------------------*\
00132 |                                                       |
00133 |                       d_wopen                         |
00134 |                                                       |
00135 \*-----------------------------------------------------*/
00136 
00137 void    d_wopen (char *name)
00138 {
00139    d_glob_whandle = d_wopen_r (name, _use_dbl);
00140   if(!d_glob_whandle)
00141     {
00142       exit(1);
00143     }
00144 }
00145 
00146 d_whandle       d_wopen_r (char *name , int use_dbl)
00147 {
00148         char    nam[MAXPATHLEN];
00149         data_write* obj;
00150         obj = (data_write*)calloc(1, sizeof(data_write));
00151         if(!obj)
00152           {
00153             fprintf ( stderr, "libRES : *** Echec de l'allocation memoire\n");      
00154             return 0;
00155           }
00156 
00157         strcpy(nam, name);
00158         if(strcmp(nam+strlen(nam)-4, ".res") != 0)
00159                 strcat(nam, ".res");
00160 
00161         obj->datafd = open (nam,(O_TRUNC | O_CREAT | O_RDWR),
00162                 (S_IWUSR | S_IWGRP | S_IRUSR | S_IRGRP));
00163 
00164 
00165         if(obj->datafd<=0) {
00166                 fprintf ( stderr, "*** Erreur a l'ouverture de '%s'\n", nam);
00167                 free(obj);
00168                 return 0;
00169         }
00170 
00171         obj->firstw = 1;                /*  set first write flag        */
00172         obj->firstn = 1;                /*  set first name  flag        */
00173         obj->vnum   = 0;                /*  init nombre de var          */
00174         obj->use_dbl = use_dbl;         /* use double */
00175 
00176         if(obj->use_dbl)
00177                 write (obj->datafd, "data3", 6);
00178         else
00179                 write (obj->datafd, "data2", 6);
00180 
00181         return obj;
00182 }
00183 
00184 /*-----------------------------------------------------*\
00185 |                                                       |
00186 |                       d_wcom                          |
00187 |                                                       |
00188 \*-----------------------------------------------------*/
00189 void    d_wcom(char *com)
00190 {
00191   d_wcom_r(d_glob_whandle, com);
00192 }
00193 
00194 void    d_wcom_r(d_whandle h, char *com)
00195 {
00196   data_write* obj = (data_write*)h;
00197   
00198         int     n;
00199 
00200         n = write (obj->datafd,com,strlen(com)+1);
00201 
00202         return;
00203 }
00204 
00205 /*-----------------------------------------------------*\
00206 |                                                       |
00207 |                       d_wnam                          |
00208 |                                                       |
00209 \*-----------------------------------------------------*/
00210 void    d_wnam(char *nam, char *des)
00211 {
00212   d_wnam_r(d_glob_whandle, nam, des);
00213 }
00214 
00215 void    d_wnam_r(d_rhandle h, char *nam, char *des)
00216 {
00217         int     n;
00218         data_write* obj = (data_write*)h;
00219         if (obj->firstn) {                              /* si premier appel ecriture    */
00220                 n  =  write (obj->datafd,"\001",1);     /* pour delimiter comm et noms  */
00221                 obj->firstn = 0;
00222         }
00223 
00224         n = write (obj->datafd,nam,strlen(nam)+1);
00225         n = write (obj->datafd,des,strlen(des)+1);
00226         obj->vnum++;                                    /* compeur du nombre de var     */
00227 }
00228 /*-----------------------------------------------------*\
00229 |                                                       |
00230 |                       d_writ                          |
00231 |                                                       |
00232 \*-----------------------------------------------------*/
00233 void    d_writ(void *buf)
00234 {
00235   d_writ_r(d_glob_whandle, buf);
00236 }
00237 
00238 void    d_writ_r(d_whandle h, void *buf)
00239 {
00240         int     n;
00241         data_write* obj = (data_write*)h;
00242         void *p;
00243 
00244         if (obj->firstw) {                              /* si premier write ecriture    */
00245                 n = write (obj->datafd,"\001",1);       /* de \001 pour delimiter       */
00246                 obj->firstw = 0;                        /* les zones noms et data       */
00247                 if(obj->use_dbl)
00248                         obj->recl = obj->vnum * sizeof(double); /* nombre de char par record    */
00249                 else
00250                         obj->recl = obj->vnum * sizeof(float);  /* nombre de char par record    */
00251         }
00252 
00253         /* FIXME : buf is supposed to be typed to float XOR double
00254            shall swap 32 or 64 according to my endianity */
00255         p=(void *)buf;
00256         if(obj->use_dbl)
00257           for(n=0; n<obj->recl; n+=sizeof(double))
00258           {
00259             DOUBLE_TO_BE(p);
00260             p += sizeof(double);
00261           }
00262         else
00263           for(n=0; n<obj->recl; n+=sizeof(float))
00264           {
00265             FLOAT_TO_BE(p);
00266             p += sizeof(float);
00267           }
00268 
00269         if ((n = write (obj->datafd,(void *)buf,obj->recl)) != obj->recl) {
00270                 fprintf (stderr,"*** d_writ : Erreur a l'ecriture\n");
00271                 exit(1);
00272         }
00273 
00274         return;
00275 }
00276 
00277 /*-----------------------------------------------------*\
00278 |                                                       |
00279 |                       d_clos                          |
00280 |                                                       |
00281 \*-----------------------------------------------------*/
00282 
00283 
00284 
00285 void    d_clos(void)
00286 {
00287 
00288   if(d_glob_rhandle)
00289     {
00290       d_rclos_r(d_glob_rhandle);
00291       d_glob_rhandle = 0;
00292     }
00293 
00294  if(d_glob_whandle)
00295     {
00296       d_wclos_r(d_glob_whandle);
00297       d_glob_whandle = 0;
00298     }
00299         
00300 }
00301 
00302 void     d_wclos_r(d_whandle h)
00303 {
00304    data_write* obj = (data_write*)h;
00305     close(obj->datafd);
00306     free(obj);
00307 }
Framework Home Page.

Beware !! TSP wave is coming...