| 1 | /*   Ce fichier contient les fonctions de creation, et de lecture */
 | 
|---|
| 2 | /*   du fichier de suivi des etoiles                              */
 | 
|---|
| 3 | /*                                      R. Ansari Mars 92         */
 | 
|---|
| 4 |  
 | 
|---|
| 5 | #include <stdlib.h>
 | 
|---|
| 6 | #include <string.h>
 | 
|---|
| 7 | #include <ctype.h>
 | 
|---|
| 8 | 
 | 
|---|
| 9 | #include "machdefs.h"
 | 
|---|
| 10 | #include "swapbytes.h"
 | 
|---|
| 11 | 
 | 
|---|
| 12 | #include "fsvcache.h"
 | 
|---|
| 13 | #include "filecache.h"
 | 
|---|
| 14 | 
 | 
|---|
| 15 | /*   SOPHYA V >= 2.130 , SWAPDEFAUT n'est plus defini */
 | 
|---|
| 16 | #if ( IS_BIG_ENDIAN == 0 ) 
 | 
|---|
| 17 | #define SWAPDEFAUT 1
 | 
|---|
| 18 | #else
 | 
|---|
| 19 | #define SWAPDEFAUT 0
 | 
|---|
| 20 | #endif
 | 
|---|
| 21 | 
 | 
|---|
| 22 | #ifdef RFIO
 | 
|---|
| 23 | #include <shift.h>
 | 
|---|
| 24 | #endif
 | 
|---|
| 25 |  
 | 
|---|
| 26 | /* 
 | 
|---|
| 27 | ++ 
 | 
|---|
| 28 |   Module        Gestion des Suivis (C)
 | 
|---|
| 29 |   Lib   fsv
 | 
|---|
| 30 |   include       fsvcache.h
 | 
|---|
| 31 | 
 | 
|---|
| 32 |         Ce groupe de fonctions permettent de manipuler les fichiers de 
 | 
|---|
| 33 |         suivi. Les données sont stockées sous format binaire dans le
 | 
|---|
| 34 |         fichier et les fonctions de lecture/ écriture assure le 
 | 
|---|
| 35 |         changement de l'ordre des octets en fonction de l'architecture 
 | 
|---|
| 36 |         de la machine (Little Endian, Big Endian), à l'odre d'écriture des 
 | 
|---|
| 37 |         octets dans le fichier, et du format des données déclaré à la 
 | 
|---|
| 38 |         création du suivi. L'ordre d'écriture des octets dans le fichier
 | 
|---|
| 39 |         correspond à celui de la machine où a lieu la création du fichier.
 | 
|---|
| 40 |         Une description plus detaillée se trouve dans la note Peida No 1.
 | 
|---|
| 41 | --
 | 
|---|
| 42 | */
 | 
|---|
| 43 | 
 | 
|---|
| 44 | /*  declaration des fonctions privees de ce fichier  */
 | 
|---|
| 45 |  
 | 
|---|
| 46 | #ifdef IBMVM
 | 
|---|
| 47 | #define FindSizeofRec FndSzRec
 | 
|---|
| 48 | #endif
 | 
|---|
| 49 |  
 | 
|---|
| 50 | int_4 FindSizeofRec(char *fmt);
 | 
|---|
| 51 | void SwapSuiviEntete(ENTETESUIVI *hp);
 | 
|---|
| 52 | void SwapSuiviRecord(char* rec, char* fmt, int fmtl, int nr);
 | 
|---|
| 53 | 
 | 
|---|
| 54 | static int sv_prtlev = 0;
 | 
|---|
| 55 | /* Nouvelle-Fonction */
 | 
|---|
| 56 | void SuiviSetPrtLevel(int lev)
 | 
|---|
| 57 | {
 | 
|---|
| 58 | sv_prtlev = lev;
 | 
|---|
| 59 | zfSetPrtLevel(lev);
 | 
|---|
| 60 | }
 | 
|---|
| 61 |  
 | 
|---|
| 62 |  
 | 
|---|
| 63 | /*
 | 
|---|
| 64 | ++
 | 
|---|
| 65 | Titre   Création des fichiers de suivi 
 | 
|---|
| 66 | --
 | 
|---|
| 67 | */
 | 
|---|
| 68 | /*
 | 
|---|
| 69 | ++
 | 
|---|
| 70 | int SuiviCreate(char *filename, int typ, int rec0size, char *rec1fmt, -
 | 
|---|
| 71 |                 char *rec2fmt, char *rec3fmt, char *rec4fmt, int nitem)
 | 
|---|
| 72 | 
 | 
|---|
| 73 |         Cette fonction crée la structure d'entete avec 
 | 
|---|
| 74 |         la définition des formats des enregistrements (record). 
 | 
|---|
| 75 | |       filename : Nom de fichier 
 | 
|---|
| 76 | |       typ : Identificateur de type de fichier de suivi
 | 
|---|
| 77 | |       rec0size : Taille de la zone commentaire (Rec-0) en octets
 | 
|---|
| 78 | |       recifmt : (i=1..4) Format des records Rec-i (i=1..4) 
 | 
|---|
| 79 | |       nitem : facteur de groupement des mesures
 | 
|---|
| 80 |         Les formats sont spécifiés sous forme d'une chaine de caractère décrivant
 | 
|---|
| 81 |         la succession de valeurs constituant un record (Ex: "IIFFS").
 | 
|---|
| 82 | |       I ou L : entier (4 octets)
 | 
|---|
| 83 | |       S : entier (2 octets)
 | 
|---|
| 84 | |       F : Reel (4 octets)
 | 
|---|
| 85 | |       D : Double precision (8 octets)
 | 
|---|
| 86 |         Le code de retour est nul (0) en cas de succès.
 | 
|---|
| 87 | --
 | 
|---|
| 88 | */ 
 | 
|---|
| 89 | 
 | 
|---|
| 90 | /* Nouvelle-Fonction */
 | 
|---|
| 91 | int SuiviCreate(char *filename, int typ, int rec0size, char *rec1fmt,
 | 
|---|
| 92 |                 char *rec2fmt, char *rec3fmt, char *rec4fmt, int nitem)
 | 
|---|
| 93 |  
 | 
|---|
| 94 | /*  Cette fonction permet la creation d'un fichier de suivi  */
 | 
|---|
| 95 | /*  Retourne 0 si OK  -  Non-nul si probleme.                */
 | 
|---|
| 96 | /*  Arguments :                                              */
 | 
|---|
| 97 | /*     - filename : Nom de fichier.                          */
 | 
|---|
| 98 | /*     - typ : valeur stockee ds l'entete (Type)             */
 | 
|---|
| 99 | /*     - rec0size : Taille de la zone comment (Rec0) en byte */
 | 
|---|
| 100 | /*     - rec1/2/3/4fmt : Format des records type 1,2,3,4     */
 | 
|---|
| 101 | /*     Les formats sont specifies sous forme d'une chaines   */
 | 
|---|
| 102 | /*     de charactere avec le codage suivant:                 */
 | 
|---|
| 103 | /*       I S L : Entiers short int  et long int (L=I)        */
 | 
|---|
| 104 | /*       F D   : float et double                             */
 | 
|---|
| 105 | /*     - nitem : Nb de mesures / record   (def = 10)         */
 | 
|---|
| 106 |  
 | 
|---|
| 107 | {
 | 
|---|
| 108 |  
 | 
|---|
| 109 | int i;
 | 
|---|
| 110 | ENTETESUIVI head;
 | 
|---|
| 111 | FILE *fip;
 | 
|---|
| 112 | char fiac[80];
 | 
|---|
| 113 |  
 | 
|---|
| 114 |  
 | 
|---|
| 115 | if (rec0size < 0) rec0size=0;
 | 
|---|
| 116 | if (nitem <= 0)  nitem = 10;
 | 
|---|
| 117 |  
 | 
|---|
| 118 | head.RecSize[0] = rec0size;
 | 
|---|
| 119 | head.NItem = nitem;
 | 
|---|
| 120 | head.NbMesTot = head.NbStars = (int_4)0;
 | 
|---|
| 121 | head.Swap = 0;
 | 
|---|
| 122 | head.Type = typ;
 | 
|---|
| 123 | head.FgCorrupt = 0;
 | 
|---|
| 124 | /*  Pour le Byte-Swap  */
 | 
|---|
| 125 | if (SWAPDEFAUT)  head.Swap = 0xFFFF;
 | 
|---|
| 126 | else head.Swap = 0;
 | 
|---|
| 127 |  
 | 
|---|
| 128 | /*  Analyse des formats   */
 | 
|---|
| 129 | if ( (head.RecSize[1] = FindSizeofRec(rec1fmt)) <= 0 )
 | 
|---|
| 130 |   { printf("  SuiviCreate-Erreur ds format Rec_1 \n"); return(1); }
 | 
|---|
| 131 | if ( (head.RecSize[2] = FindSizeofRec(rec2fmt)) <= 0 )
 | 
|---|
| 132 |   { printf("  SuiviCreate-Erreur ds format Rec_2 \n"); return(2); }
 | 
|---|
| 133 | if ( (head.RecSize[3] = FindSizeofRec(rec3fmt)) <= 0 )
 | 
|---|
| 134 |   { printf("  SuiviCreate-Erreur ds format Rec_3 \n"); return(3); }
 | 
|---|
| 135 | if ( (head.RecSize[4] = FindSizeofRec(rec4fmt)) <= 0 )
 | 
|---|
| 136 |   { printf("  SuiviCreate-Erreur ds format Rec_4 \n"); return(4); }
 | 
|---|
| 137 |  
 | 
|---|
| 138 | head.RecSize[3] *= head.NItem;
 | 
|---|
| 139 | head.RecSize[4] *= head.NItem;
 | 
|---|
| 140 |  
 | 
|---|
| 141 |  
 | 
|---|
| 142 | head.FmtSize[0] = 0;
 | 
|---|
| 143 | head.FmtSize[1] = strlen(rec1fmt);
 | 
|---|
| 144 | head.FmtSize[2] = strlen(rec2fmt);
 | 
|---|
| 145 | head.FmtSize[3] = strlen(rec3fmt);
 | 
|---|
| 146 | head.FmtSize[4] = strlen(rec4fmt);
 | 
|---|
| 147 |  
 | 
|---|
| 148 |  
 | 
|---|
| 149 | head.HSize = sizeof(ENTETESUIVI);
 | 
|---|
| 150 | for(i=0; i<5; i++)  head.HSize += head.FmtSize[i];
 | 
|---|
| 151 | head.FileSize = head.HSize;
 | 
|---|
| 152 |  
 | 
|---|
| 153 | #ifndef IBMVM
 | 
|---|
| 154 | strcpy(fiac,"wb");
 | 
|---|
| 155 | #else
 | 
|---|
| 156 | strcpy(fiac,"wb, recfm=FS, lrecl=1024");
 | 
|---|
| 157 | #endif
 | 
|---|
| 158 |  
 | 
|---|
| 159 | if ((fip=fopen(filename,fiac)) == NULL)
 | 
|---|
| 160 |   { printf("  SuiviCreate-Erreur ouverture fichier \n"); return(10); }
 | 
|---|
| 161 |  
 | 
|---|
| 162 |  
 | 
|---|
| 163 | fwrite(&head,sizeof(ENTETESUIVI),1,fip);
 | 
|---|
| 164 | fwrite(rec1fmt,1,head.FmtSize[1],fip);
 | 
|---|
| 165 | fwrite(rec2fmt,1,head.FmtSize[2],fip);
 | 
|---|
| 166 | fwrite(rec3fmt,1,head.FmtSize[3],fip);
 | 
|---|
| 167 | fwrite(rec4fmt,1,head.FmtSize[4],fip);
 | 
|---|
| 168 |  
 | 
|---|
| 169 | fclose(fip);
 | 
|---|
| 170 |  
 | 
|---|
| 171 | return(0);
 | 
|---|
| 172 | }
 | 
|---|
| 173 |  
 | 
|---|
| 174 | #ifdef IBMVM
 | 
|---|
| 175 | int NPg[5]={0,50,100,150,200};
 | 
|---|
| 176 | int PgSz[5]={0,4096,8092,16184,32768};
 | 
|---|
| 177 | #else
 | 
|---|
| 178 | int NPg[5]={0,10,50,100,200};
 | 
|---|
| 179 | int PgSz[5]={0,2048,2048,4096,8092};
 | 
|---|
| 180 | #endif
 | 
|---|
| 181 |  
 | 
|---|
| 182 | /*
 | 
|---|
| 183 | ++
 | 
|---|
| 184 | Titre   Ouverture, fermeture des suivis
 | 
|---|
| 185 |         Le pointeur (l'identificateur) de fichier renvoyé par 
 | 
|---|
| 186 |         "SuiviOpen()" est le premier argument de toutes les autres 
 | 
|---|
| 187 |         fonctions "(suivifip)".
 | 
|---|
| 188 | --
 | 
|---|
| 189 | */
 | 
|---|
| 190 | 
 | 
|---|
| 191 | /*
 | 
|---|
| 192 | ++
 | 
|---|
| 193 | SUIVIFIP *SuiviOpen(char * filename, int rw)
 | 
|---|
| 194 |         Ouverture du fichier en mode lecture "rw=SUOF_RO" ou 
 | 
|---|
| 195 |         lecture/ecriture "rw=SUOF_RW". L'activation de la
 | 
|---|
| 196 |         memoire cache se fait aussi a travers l'argument "rw"
 | 
|---|
| 197 | |       SUOF_RW_MEM, SUOF_RO_MEM
 | 
|---|
| 198 | |       ou MEM2 , MEM3, MEM4
 | 
|---|
| 199 | 
 | 
|---|
| 200 | int SuiviClose(SUIVIFIP *suivfip)
 | 
|---|
| 201 |         fermeture du fichier de suivi. Le fichier peut être corrompu s'il est 
 | 
|---|
| 202 |         ouvert en écriture et si "SuiviClose()" n'est pas appelé.  
 | 
|---|
| 203 | 
 | 
|---|
| 204 | void SuiviSetPrtLevel(int lev)
 | 
|---|
| 205 |         Modification du niveau d'impression des messages d'informations/debug
 | 
|---|
| 206 |         
 | 
|---|
| 207 | --
 | 
|---|
| 208 | */
 | 
|---|
| 209 | 
 | 
|---|
| 210 | /* Nouvelle-Fonction */ 
 | 
|---|
| 211 | SUIVIFIP *SuiviOpen(char * filename, int rw)
 | 
|---|
| 212 |  
 | 
|---|
| 213 | /* Fonction d'ouverture de fichier de suivi pour lecture/ecriture   */
 | 
|---|
| 214 | /* Retourne un pointeur sur la structure SUIVIFIP - NULL si Pb.     */
 | 
|---|
| 215 | /*    rw : Flag d'ouverture fichier en Read/Write  SUOF_RW          */
 | 
|---|
| 216 | /*                                 ou en ReadOnly  SUOF_RO          */
 | 
|---|
| 217 |  
 | 
|---|
| 218 | {
 | 
|---|
| 219 | SUIVIFIP *sfip;
 | 
|---|
| 220 | char *po;
 | 
|---|
| 221 | char fiac[20];
 | 
|---|
| 222 | int mopt;
 | 
|---|
| 223 | FILE *fip;
 | 
|---|
| 224 | int_4 res2;
 | 
|---|
| 225 | char* fmtspace; 
 | 
|---|
| 226 | int i,lfmt,rsz;
 | 
|---|
| 227 |  
 | 
|---|
| 228 | if ((po=(char *)malloc(sizeof(SUIVIFIP)+strlen(filename)+1)) == NULL)
 | 
|---|
| 229 |   { printf(" SuiviOpen_Erreur : Pb malloc() \n"); return(NULL); }
 | 
|---|
| 230 | sfip = (SUIVIFIP *)(po);
 | 
|---|
| 231 | sfip->Nom = po+sizeof(SUIVIFIP);
 | 
|---|
| 232 |  
 | 
|---|
| 233 | mopt = rw/10;
 | 
|---|
| 234 | if ( (mopt<0) || (mopt>4) )   mopt=0;
 | 
|---|
| 235 | rw = rw%10;
 | 
|---|
| 236 |  
 | 
|---|
| 237 | if ( rw == SUOF_RW )  { strcpy(fiac,"rb+"); sfip->FgRW = SUOF_RW ; }
 | 
|---|
| 238 | else { strcpy(fiac,"rb");  sfip->FgRW = rw = SUOF_RO ; }
 | 
|---|
| 239 |  
 | 
|---|
| 240 | #ifdef IBMVM
 | 
|---|
| 241 | strcat(fiac,"b");
 | 
|---|
| 242 | #endif
 | 
|---|
| 243 | 
 | 
|---|
| 244 | /*  Lecture entete  - En cas de d'ouverture en RW, on reecrit l'entete  */
 | 
|---|
| 245 | /*  en utilisant le mot FgCorrupt qui passe a negatif -                 */
 | 
|---|
| 246 | /*  Head.FgCorrupt = Flag FileCorrupted                                 */ 
 | 
|---|
| 247 | /*  OK -> FgCorrupt == NbMesTot , Negatif -> -(Derniere mesure OK)      */
 | 
|---|
| 248 | /*  ou -99999999                  Reza 10/12/96                         */
 | 
|---|
| 249 | 
 | 
|---|
| 250 | if ( (fip = fopen(filename,fiac)) == NULL )  
 | 
|---|
| 251 |   { printf("SuiviOpen_Erreur : Pb fopen(%s) \n",filename); 
 | 
|---|
| 252 |   free(po); return(NULL); }
 | 
|---|
| 253 | 
 | 
|---|
| 254 | fseek(fip, (long)0, SEEK_SET);
 | 
|---|
| 255 | fread(&(sfip->Head),sizeof(ENTETESUIVI),1,fip);
 | 
|---|
| 256 | 
 | 
|---|
| 257 | /*  On verifie avant tout si le fichier doit etre byte-swape  */
 | 
|---|
| 258 | if ( (sfip->Head.Swap != 0)  &&  (SWAPDEFAUT != 0) )  sfip->FgSwap = 0;
 | 
|---|
| 259 | else if ( (sfip->Head.Swap == 0)  &&  (SWAPDEFAUT == 0) )  sfip->FgSwap = 0;
 | 
|---|
| 260 | else { 
 | 
|---|
| 261 |   sfip->FgSwap = 1;
 | 
|---|
| 262 |   if (sv_prtlev > 3) printf("SuiviOpen_Warning: ByteSwap[%x,%x] de Suivi(%s) \n", 
 | 
|---|
| 263 |                            (int)SWAPDEFAUT, (int)sfip->Head.Swap, filename);
 | 
|---|
| 264 |   SwapSuiviEntete(&(sfip->Head));
 | 
|---|
| 265 | }
 | 
|---|
| 266 | 
 | 
|---|
| 267 | /*  Allocation d'espace pour les formats */
 | 
|---|
| 268 | lfmt = 0;
 | 
|---|
| 269 | for(i=1;i<5;i++)  lfmt += (sfip->Head.FmtSize[i]+1);
 | 
|---|
| 270 | 
 | 
|---|
| 271 | fmtspace = (char *)malloc(lfmt);
 | 
|---|
| 272 | if (fmtspace == NULL) { 
 | 
|---|
| 273 |   printf(" SuiviOpen_Erreur : Pb. malloc fmtspace \n");
 | 
|---|
| 274 |   free(po); return(NULL); }
 | 
|---|
| 275 | 
 | 
|---|
| 276 | sfip->RecFmt[0] = fmtspace;
 | 
|---|
| 277 | /*  Lecture des elements de formats   */ 
 | 
|---|
| 278 | for(i=1;i<5;i++) {
 | 
|---|
| 279 |   sfip->RecFmt[i] = fmtspace;
 | 
|---|
| 280 |   if ( (rsz=sfip->Head.FmtSize[i]) <= 0)  continue;
 | 
|---|
| 281 |   fread(sfip->RecFmt[i], 1, rsz, fip);  
 | 
|---|
| 282 |   *(sfip->RecFmt[i]+rsz) = '\0';
 | 
|---|
| 283 |   fmtspace += rsz;
 | 
|---|
| 284 |   }
 | 
|---|
| 285 |  
 | 
|---|
| 286 | res2 = sfip->Head.FgCorrupt;
 | 
|---|
| 287 | /* NbMesTot < 0 ne devrait pas arriver ! */
 | 
|---|
| 288 | if (sfip->Head.NbMesTot < 0) {
 | 
|---|
| 289 |   printf("SuiviOpen_Erreur: NMes<0 File=%s (FgCorrupt=%d NMes=%d) !?\n",
 | 
|---|
| 290 |          filename, res2, sfip->Head.NbMesTot); 
 | 
|---|
| 291 |   free(fmtspace); free(po); 
 | 
|---|
| 292 |   fclose(fip); return(NULL); 
 | 
|---|
| 293 | }
 | 
|---|
| 294 |   
 | 
|---|
| 295 | if (res2 != sfip->Head.NbMesTot)  
 | 
|---|
| 296 |   printf("SuiviOpen_Warning : file %s corrompu  (FgCorrupt=%d NMes=%d) !?\n",
 | 
|---|
| 297 |          filename, res2, sfip->Head.NbMesTot); 
 | 
|---|
| 298 | if ( (rw == SUOF_RW) && (res2 >= 0) )
 | 
|---|
| 299 |   {
 | 
|---|
| 300 |   sfip->Head.FgCorrupt = -res2;
 | 
|---|
| 301 |   if (sfip->Head.FgCorrupt == 0)  sfip->Head.FgCorrupt = -99999999;
 | 
|---|
| 302 |   if (sfip->Head.Swap)    SwapSuiviEntete(&(sfip->Head));  /* Avant ecriture */
 | 
|---|
| 303 |   fseek(fip, (long)0, SEEK_SET);
 | 
|---|
| 304 |   fwrite(&(sfip->Head),sizeof(ENTETESUIVI),1,fip);
 | 
|---|
| 305 |   if (sfip->Head.Swap)    SwapSuiviEntete(&(sfip->Head));  /* Reswap apres ecriture */
 | 
|---|
| 306 |   sfip->Head.FgCorrupt = res2;
 | 
|---|
| 307 |   }
 | 
|---|
| 308 | fclose(fip);
 | 
|---|
| 309 | 
 | 
|---|
| 310 | /*   Ouverture fichier  */
 | 
|---|
| 311 | if ( (sfip->fcp = zfopen(filename,fiac,NPg[mopt],PgSz[mopt])) == NULL )
 | 
|---|
| 312 |   { printf("SuiviOpen_Erreur : Pb zfopen(%s) \n",filename); 
 | 
|---|
| 313 |   free(fmtspace); free(po); return(NULL); }
 | 
|---|
| 314 |  
 | 
|---|
| 315 | sfip->fip = sfip->fcp->fip;  
 | 
|---|
| 316 | strcpy(sfip->Nom,filename);
 | 
|---|
| 317 | sfip->OffsetMes = sfip->Head.HSize + sfip->Head.RecSize[0] +
 | 
|---|
| 318 |                   sfip->Head.RecSize[1] +
 | 
|---|
| 319 |                   sfip->Head.NbStars*sfip->Head.RecSize[2];
 | 
|---|
| 320 |  
 | 
|---|
| 321 | /*  Impression de debug   */
 | 
|---|
| 322 | if (sv_prtlev > 3)
 | 
|---|
| 323 |   { 
 | 
|---|
| 324 |   printf(" SuiviOpen_Debug : File= %s , TotSize,Hsize= %ld , %ld  Offset= %ld Swap=%x\n",
 | 
|---|
| 325 |     sfip->Nom,(long)sfip->Head.FileSize, (long)sfip->Head.HSize, 
 | 
|---|
| 326 |     (long)sfip->OffsetMes, (int)sfip->Head.Swap);
 | 
|---|
| 327 |   printf(" SuiviOpen_Debug : RecSize[0..4] %d %d %d %d %d\n",sfip->Head.RecSize[0],
 | 
|---|
| 328 |    sfip->Head.RecSize[1],sfip->Head.RecSize[2],sfip->Head.RecSize[3],sfip->Head.RecSize[4]);
 | 
|---|
| 329 |   printf(" SuiviOpen_Debug : FmtSize[0..4] %d %d %d %d %d\n",sfip->Head.FmtSize[0],
 | 
|---|
| 330 |    sfip->Head.FmtSize[1],sfip->Head.FmtSize[2],sfip->Head.FmtSize[3],sfip->Head.FmtSize[4]);
 | 
|---|
| 331 |   printf(" SuiviOpen_Debug : NItem,NbStars,NbMesTot %d %d %d Type=%d (FgCorrupt= %d)\n",
 | 
|---|
| 332 |     sfip->Head.NItem,sfip->Head.NbStars,sfip->Head.NbMesTot,
 | 
|---|
| 333 |     (int)sfip->Head.Type, sfip->Head.FgCorrupt);
 | 
|---|
| 334 |   } 
 | 
|---|
| 335 |  
 | 
|---|
| 336 |  
 | 
|---|
| 337 | return(sfip);
 | 
|---|
| 338 | }
 | 
|---|
| 339 |  
 | 
|---|
| 340 | /*
 | 
|---|
| 341 | ++
 | 
|---|
| 342 | Titre   Accès aux informations de l'entête
 | 
|---|
| 343 |         Les fonctions suivantes permettent d'accéder a certaines 
 | 
|---|
| 344 |         informations sauvegardées dans l'entête (Nb. d'étoiles, 
 | 
|---|
| 345 |         de mesures, ...)
 | 
|---|
| 346 | --
 | 
|---|
| 347 | */
 | 
|---|
| 348 | 
 | 
|---|
| 349 | /*
 | 
|---|
| 350 | ++
 | 
|---|
| 351 | int_4 SuiviGetNbStars(SUIVIFIP *suivfip)
 | 
|---|
| 352 |         Retourne le nombre d'étoiles dans le fichier.
 | 
|---|
| 353 | 
 | 
|---|
| 354 | int_4 SuiviGetNbMesures(SUIVIFIP *suivfip)
 | 
|---|
| 355 |         Retourne le nombre de mesures dans le fichier.
 | 
|---|
| 356 | 
 | 
|---|
| 357 | int_4 SuiviGetType(SUIVIFIP *suivfip)
 | 
|---|
| 358 |         Retourne le type déclaré à la création du fichier.
 | 
|---|
| 359 | 
 | 
|---|
| 360 | int_4 SuiviGetSize(SUIVIFIP *suivfip)
 | 
|---|
| 361 |         Retourne la taille actuelle du fichier de suivi.
 | 
|---|
| 362 | 
 | 
|---|
| 363 | int_4 SuiviPredictSize(SUIVIFIP *suivfip, int nbst, int nbmes)
 | 
|---|
| 364 |         Retourne la taille calculée pour le fichier avec "nbst" étoiles
 | 
|---|
| 365 |         et "nbmes" mesures.
 | 
|---|
| 366 | --
 | 
|---|
| 367 | */
 | 
|---|
| 368 | 
 | 
|---|
| 369 |  
 | 
|---|
| 370 | /* Nouvelle-Fonction */
 | 
|---|
| 371 | int_4 SuiviGetNbytStars(SUIVIFIP *suivfip)
 | 
|---|
| 372 | /*  Retourne le nombre d'item pour chaque mesure ds le fichier   */
 | 
|---|
| 373 | {  return ( suivfip->Head.RecSize[4] / suivfip->Head.NItem ) ; }
 | 
|---|
| 374 |  
 | 
|---|
| 375 |  
 | 
|---|
| 376 | /* Nouvelle-Fonction */
 | 
|---|
| 377 | int_4 SuiviGetNbStars(SUIVIFIP *suivfip)
 | 
|---|
| 378 | /*  Retourne le nombre d'etoiles ds le fichier   */
 | 
|---|
| 379 | {  return ( suivfip->Head.NbStars ) ; }
 | 
|---|
| 380 |  
 | 
|---|
| 381 | /* Nouvelle-Fonction */
 | 
|---|
| 382 | int_4 SuiviGetNbMesures(SUIVIFIP *suivfip)
 | 
|---|
| 383 | /*  Retourne le nb de mesures ds le fichier   */
 | 
|---|
| 384 | {  return ( suivfip->Head.NbMesTot ) ; }
 | 
|---|
| 385 |  
 | 
|---|
| 386 | /* Nouvelle-Fonction */
 | 
|---|
| 387 | int_4 SuiviGetType(SUIVIFIP *suivfip)
 | 
|---|
| 388 | /*  Retourne le type de fichier declare ds l'entete le fichier   */
 | 
|---|
| 389 | {  return ( suivfip->Head.Type ) ; }
 | 
|---|
| 390 |  
 | 
|---|
| 391 | /* Nouvelle-Fonction */
 | 
|---|
| 392 | int_4 SuiviGetSize(SUIVIFIP *suivfip)
 | 
|---|
| 393 | /*  Retourne la taille actuelle du fichier de suivi */
 | 
|---|
| 394 | {  return ( suivfip->Head.FileSize ) ; }
 | 
|---|
| 395 |  
 | 
|---|
| 396 | /* Nouvelle-Fonction */
 | 
|---|
| 397 | int_4 SuiviPredictSize(SUIVIFIP *sfip, int nbst, int nbmes)
 | 
|---|
| 398 | /*  Retourne la taille calculee pour le nb d'etoiles (nbst) et mesures (nbmes)   */
 | 
|---|
| 399 | {  
 | 
|---|
| 400 | int_4 totsz, nbm;
 | 
|---|
| 401 | totsz = sfip->Head.HSize + sfip->Head.RecSize[0] + /* Entete+zone commentaire  */
 | 
|---|
| 402 |         sfip->Head.RecSize[1] +                    /*  Zone globinfo */
 | 
|---|
| 403 |         nbst*sfip->Head.RecSize[2];                /* Les starInfos   */
 | 
|---|
| 404 | 
 | 
|---|
| 405 | /*  On calcule le nombre de blocks mesures */
 | 
|---|
| 406 | nbm = nbmes / sfip->Head.NItem;  /* Les mesures sont groupees par block de NItem */
 | 
|---|
| 407 | if ((nbmes%sfip->Head.NItem) != 0)  nbm++;
 | 
|---|
| 408 | totsz += nbm*(sfip->Head.RecSize[3] + nbst*sfip->Head.RecSize[4]);
 | 
|---|
| 409 | return ( totsz ) ; 
 | 
|---|
| 410 | }
 | 
|---|
| 411 |  
 | 
|---|
| 412 |  
 | 
|---|
| 413 |  
 | 
|---|
| 414 |  
 | 
|---|
| 415 | /* Nouvelle-Fonction */
 | 
|---|
| 416 |  
 | 
|---|
| 417 | int SuiviClose(SUIVIFIP *suivfip)
 | 
|---|
| 418 |  
 | 
|---|
| 419 | /*   Fonction de fermeture de fichier de suivi - Cet appel est obligatoire en */
 | 
|---|
| 420 | /* cas de modification (ecriture) du fichier de suivi, avant la fin du prog.  */
 | 
|---|
| 421 | /*   Retour 0 OK  -  NonNul-> Erreur                                          */
 | 
|---|
| 422 |  
 | 
|---|
| 423 | {
 | 
|---|
| 424 | if (suivfip == NULL)  return(1);
 | 
|---|
| 425 |  
 | 
|---|
| 426 | /*  Ecriture entete fichier  */
 | 
|---|
| 427 | if (suivfip->FgRW == SUOF_RW)
 | 
|---|
| 428 |   {
 | 
|---|
| 429 |    if (suivfip->Head.FgCorrupt >= 0)  /*  M.A.J Flag FileCorrupted */
 | 
|---|
| 430 |     suivfip->Head.FgCorrupt = suivfip->Head.NbMesTot;
 | 
|---|
| 431 |   if (suivfip->FgSwap)   /*  On byte-swap avant ecriture */
 | 
|---|
| 432 |     SwapSuiviEntete(&(suivfip->Head));
 | 
|---|
| 433 |   if (zfseek(suivfip->fcp, (long)(0), SEEK_SET) != 0)
 | 
|---|
| 434 |     { printf(" SuiviClose_Erreur : Pb zfseek() \n"); return(10); }
 | 
|---|
| 435 |   zfwrite(&(suivfip->Head),sizeof(ENTETESUIVI),1,suivfip->fcp);
 | 
|---|
| 436 |   }
 | 
|---|
| 437 |  
 | 
|---|
| 438 | zfclose(suivfip->fcp);
 | 
|---|
| 439 | free(suivfip->RecFmt[0]);
 | 
|---|
| 440 | free(suivfip);
 | 
|---|
| 441 |  
 | 
|---|
| 442 | return(0);
 | 
|---|
| 443 |  
 | 
|---|
| 444 | }
 | 
|---|
| 445 |  
 | 
|---|
| 446 |  
 | 
|---|
| 447 | /*
 | 
|---|
| 448 | ++
 | 
|---|
| 449 | Titre   Lecture, écriture
 | 
|---|
| 450 |         Pour toutes les fonctions de lecture/ecriture, "buff"
 | 
|---|
| 451 |          désigne le pointeur d'une zone mémoire contenant 
 | 
|---|
| 452 |         l'information à écrire ou destinée à recevoir 
 | 
|---|
| 453 |         l'information lue dans le fichier de suivi.   
 | 
|---|
| 454 |         L'argument "numet" indique le numéro d'étoile (1..NbStars),
 | 
|---|
| 455 |         et "numes" le numéro de mesure (1..NbMes).
 | 
|---|
| 456 |         Le code de retour est non nul en cas d'erreur. 
 | 
|---|
| 457 | --
 | 
|---|
| 458 | */
 | 
|---|
| 459 | 
 | 
|---|
| 460 | /*
 | 
|---|
| 461 | ++
 | 
|---|
| 462 | int SuiviWriteComment(SUIVIFIP *suivfip, char *buff)
 | 
|---|
| 463 |         Ecriture de la zone commentaire.
 | 
|---|
| 464 | 
 | 
|---|
| 465 | int SuiviReadComment(SUIVIFIP *suivfip, char *buff)
 | 
|---|
| 466 |         Lecture de la zone commentaire.
 | 
|---|
| 467 | 
 | 
|---|
| 468 | --
 | 
|---|
| 469 | */
 | 
|---|
| 470 |  
 | 
|---|
| 471 |  
 | 
|---|
| 472 | /* Nouvelle-Fonction */
 | 
|---|
| 473 |  
 | 
|---|
| 474 | int SuiviWriteComment(SUIVIFIP *suivfip, char *buff)
 | 
|---|
| 475 |  
 | 
|---|
| 476 | /*   Cette fonction ecrit les comment ds le fichier de suivi   */
 | 
|---|
| 477 | /*  retour 0 OK                                                */
 | 
|---|
| 478 |  
 | 
|---|
| 479 | {
 | 
|---|
| 480 | int_4 sz;
 | 
|---|
| 481 | int rc;
 | 
|---|
| 482 |  
 | 
|---|
| 483 | if (suivfip == NULL)  return(1);
 | 
|---|
| 484 | if (suivfip->FgRW != SUOF_RW)
 | 
|---|
| 485 |   {printf(" SuiviWriteComment_Erreur : Fichier ReadOnly \n"); return(2);}
 | 
|---|
| 486 |  
 | 
|---|
| 487 | /*  Ecriture */
 | 
|---|
| 488 | rc = 0;
 | 
|---|
| 489 | if (zfseek(suivfip->fcp, (long)suivfip->Head.HSize, SEEK_SET) != 0)
 | 
|---|
| 490 |   { printf(" SuiviWriteComment_Erreur : Pb zfseek() \n"); 
 | 
|---|
| 491 |   suivfip->Head.FgCorrupt = -99999999;  rc = 10; }
 | 
|---|
| 492 | else if (zfwrite(buff,1,(size_t)suivfip->Head.RecSize[0],suivfip->fcp) != suivfip->Head.RecSize[0])
 | 
|---|
| 493 |   { printf(" SuiviWriteComment_Erreur : Pb zfwrite() \n"); 
 | 
|---|
| 494 |   suivfip->Head.FgCorrupt = -99999999;  rc = 11; }
 | 
|---|
| 495 |  
 | 
|---|
| 496 | /*  M.A.J. Entete  */
 | 
|---|
| 497 | sz = suivfip->Head.HSize+suivfip->Head.RecSize[0];
 | 
|---|
| 498 | if (suivfip->Head.FileSize < sz)  suivfip->Head.FileSize = sz;
 | 
|---|
| 499 |  
 | 
|---|
| 500 | return(rc);
 | 
|---|
| 501 | }
 | 
|---|
| 502 |  
 | 
|---|
| 503 |  
 | 
|---|
| 504 |  
 | 
|---|
| 505 |  
 | 
|---|
| 506 | /* Nouvelle-Fonction */
 | 
|---|
| 507 |  
 | 
|---|
| 508 | int SuiviReadComment(SUIVIFIP *suivfip, char *buff)
 | 
|---|
| 509 |  
 | 
|---|
| 510 | /*   Cette fonction lit les comment ds le fichier de suivi   */
 | 
|---|
| 511 | /*       retour 0 OK                                         */
 | 
|---|
| 512 |  
 | 
|---|
| 513 | {
 | 
|---|
| 514 | if (suivfip == NULL)  return(1);
 | 
|---|
| 515 | if (zfseek(suivfip->fcp, (long)suivfip->Head.HSize, SEEK_SET) != 0)
 | 
|---|
| 516 |   { printf(" SuiviReadComment_Erreur : Pb zfseek() \n"); return(10); }
 | 
|---|
| 517 | zfread(buff,1,(size_t)suivfip->Head.RecSize[0],suivfip->fcp);
 | 
|---|
| 518 | return(0);
 | 
|---|
| 519 | }
 | 
|---|
| 520 |  
 | 
|---|
| 521 |  
 | 
|---|
| 522 |  
 | 
|---|
| 523 | /*
 | 
|---|
| 524 | ++
 | 
|---|
| 525 | int SuiviWriteGlobInfo(SUIVIFIP *suivfip, char *buff)
 | 
|---|
| 526 |         Ecriture de l'enregistrement GlobInfo.
 | 
|---|
| 527 | 
 | 
|---|
| 528 | int SuiviReadGlobInfo(SUIVIFIP *suivfip, char *buff)
 | 
|---|
| 529 |         Lecture de l'enregistrement GlobInfo.
 | 
|---|
| 530 | 
 | 
|---|
| 531 | --
 | 
|---|
| 532 | */
 | 
|---|
| 533 | 
 | 
|---|
| 534 | /* Nouvelle-Fonction */
 | 
|---|
| 535 |  
 | 
|---|
| 536 | int SuiviWriteGlobInfo(SUIVIFIP *suivfip, char *buff)
 | 
|---|
| 537 |  
 | 
|---|
| 538 | /*   Cette fonction ecrit l'enregistrement des infos globales   */
 | 
|---|
| 539 | /*  retour 0 OK                                                 */
 | 
|---|
| 540 |  
 | 
|---|
| 541 | {
 | 
|---|
| 542 | int_4 sz;
 | 
|---|
| 543 | int rc;
 | 
|---|
| 544 |  
 | 
|---|
| 545 | if (suivfip == NULL)  return(1);
 | 
|---|
| 546 | if (suivfip->FgRW != SUOF_RW)
 | 
|---|
| 547 |   {printf(" SuiviWriteComment_Erreur : Fichier ReadOnly \n"); return(2);}
 | 
|---|
| 548 | 
 | 
|---|
| 549 | if (suivfip->FgSwap)   /*  On byte-swap avant ecriture */
 | 
|---|
| 550 |   SwapSuiviRecord(buff, suivfip->RecFmt[1], suivfip->Head.FmtSize[1], 1);
 | 
|---|
| 551 | /*  Ecriture */
 | 
|---|
| 552 | rc = 0;
 | 
|---|
| 553 | sz = suivfip->Head.HSize+suivfip->Head.RecSize[0];
 | 
|---|
| 554 | if (zfseek(suivfip->fcp, (long)sz, SEEK_SET) != 0)
 | 
|---|
| 555 |   { printf(" SuiviWriteGlobInfo_Erreur : Pb zfseek() \n"); 
 | 
|---|
| 556 |   suivfip->Head.FgCorrupt = -99999999;  rc = 10; }
 | 
|---|
| 557 | else if (zfwrite(buff,1,(size_t)suivfip->Head.RecSize[1],suivfip->fcp) != suivfip->Head.RecSize[1])
 | 
|---|
| 558 |   { printf(" SuiviWriteGlobInfo_Erreur : Pb zfwrite() \n"); 
 | 
|---|
| 559 |   suivfip->Head.FgCorrupt = -99999999; rc = 11; }
 | 
|---|
| 560 | 
 | 
|---|
| 561 | 
 | 
|---|
| 562 | if (suivfip->FgSwap)   /*  On remet dans le bon sens */
 | 
|---|
| 563 |   SwapSuiviRecord(buff, suivfip->RecFmt[1], suivfip->Head.FmtSize[1], 1);
 | 
|---|
| 564 |  
 | 
|---|
| 565 | /*  M.A.J. Entete  */
 | 
|---|
| 566 | sz = suivfip->Head.HSize + suivfip->Head.RecSize[0] +
 | 
|---|
| 567 |                            suivfip->Head.RecSize[1];
 | 
|---|
| 568 | if (suivfip->Head.FileSize < sz)  suivfip->Head.FileSize = sz;
 | 
|---|
| 569 |  
 | 
|---|
| 570 | return(rc);
 | 
|---|
| 571 | }
 | 
|---|
| 572 |  
 | 
|---|
| 573 |  
 | 
|---|
| 574 |  
 | 
|---|
| 575 |  
 | 
|---|
| 576 | /* Nouvelle-Fonction */
 | 
|---|
| 577 |  
 | 
|---|
| 578 | int SuiviReadGlobInfo(SUIVIFIP *suivfip, char *buff)
 | 
|---|
| 579 |  
 | 
|---|
| 580 | /*   Cette fonction lit l'enregistrement des infos globales   */
 | 
|---|
| 581 | /*       retour 0 OK                                          */
 | 
|---|
| 582 |  
 | 
|---|
| 583 | {
 | 
|---|
| 584 | int_4 pos;
 | 
|---|
| 585 | if (suivfip == NULL)  return(1);
 | 
|---|
| 586 | pos = suivfip->Head.HSize+suivfip->Head.RecSize[0];
 | 
|---|
| 587 | if (zfseek(suivfip->fcp, (long)pos, SEEK_SET) != 0)
 | 
|---|
| 588 |   { printf(" SuiviReadGlobInfo_Erreur : Pb zfseek() \n"); return(10); }
 | 
|---|
| 589 | zfread(buff,1,(size_t)suivfip->Head.RecSize[1],suivfip->fcp);
 | 
|---|
| 590 | if (suivfip->FgSwap)   /*  On byte-swap apres lecture */
 | 
|---|
| 591 |   SwapSuiviRecord(buff, suivfip->RecFmt[1], suivfip->Head.FmtSize[1], 1);
 | 
|---|
| 592 | return(0);
 | 
|---|
| 593 | }
 | 
|---|
| 594 |  
 | 
|---|
| 595 | 
 | 
|---|
| 596 | /*
 | 
|---|
| 597 | ++
 | 
|---|
| 598 | int SuiviWriteStarInfo(SUIVIFIP *suivfip, int_4 num, char *buff)
 | 
|---|
| 599 |         Ecriture de l'enregistrement StarInfo pour l'étoile "num"
 | 
|---|
| 600 | 
 | 
|---|
| 601 | int SuiviReadStarInfo(SUIVIFIP *suivfip, int_4 num, char *buff)
 | 
|---|
| 602 |         Lecture de l'enregistrement StarInfo pour l'étoile "num"
 | 
|---|
| 603 | --
 | 
|---|
| 604 | */
 | 
|---|
| 605 |   
 | 
|---|
| 606 |  
 | 
|---|
| 607 | /* Nouvelle-Fonction */
 | 
|---|
| 608 |  
 | 
|---|
| 609 | int SuiviWriteStarInfo(SUIVIFIP *suivfip, int_4 num, char *buff)
 | 
|---|
| 610 |  
 | 
|---|
| 611 | /*   Cette fonction ecrit les infos etoiles pour l'etoile   */
 | 
|---|
| 612 | /*  numero num -  Retour 0  OK                              */
 | 
|---|
| 613 |  
 | 
|---|
| 614 | {
 | 
|---|
| 615 | int_4 sz,pos;
 | 
|---|
| 616 | int rc;
 | 
|---|
| 617 |  
 | 
|---|
| 618 | if (suivfip == NULL)  return(1);
 | 
|---|
| 619 | if (suivfip->FgRW != SUOF_RW)
 | 
|---|
| 620 |   {printf(" SuiviWriteStarInfo_Erreur : Fichier ReadOnly \n");  return(2);}
 | 
|---|
| 621 | if (num <= (int_4)0)
 | 
|---|
| 622 |   { printf(" SuiviWriteStarInfo_Erreur : Num (=%ld) <= 0 \n",(long)num); return(3); }
 | 
|---|
| 623 |  
 | 
|---|
| 624 | if ( (suivfip->Head.NbMesTot > 0) && (suivfip->Head.NbStars < num) )
 | 
|---|
| 625 |   { printf(" SuiviWriteStarInfo_Erreur : Fichier contient des mesures ! \n");
 | 
|---|
| 626 |     return(4); }
 | 
|---|
| 627 | 
 | 
|---|
| 628 | if (suivfip->FgSwap)   /*  On byte-swap avant ecriture */
 | 
|---|
| 629 |   SwapSuiviRecord(buff, suivfip->RecFmt[2], suivfip->Head.FmtSize[2], 1);
 | 
|---|
| 630 |  
 | 
|---|
| 631 | /*  Ecriture */
 | 
|---|
| 632 | pos = suivfip->Head.HSize + suivfip->Head.RecSize[0] +
 | 
|---|
| 633 |       suivfip->Head.RecSize[1] +
 | 
|---|
| 634 |       (num-1)*suivfip->Head.RecSize[2];
 | 
|---|
| 635 | rc = 0;
 | 
|---|
| 636 | if (zfseek(suivfip->fcp, (long)pos, SEEK_SET) != 0)
 | 
|---|
| 637 |   { printf(" SuiviWriteStarInfo_Erreur : Pb zfseek() \n"); 
 | 
|---|
| 638 |   suivfip->Head.FgCorrupt = -99999999;  rc = 10; }
 | 
|---|
| 639 | else if ( zfwrite(buff,1,(size_t)suivfip->Head.RecSize[2],suivfip->fcp) != suivfip->Head.RecSize[2])
 | 
|---|
| 640 |   { printf(" SuiviWriteStarInfo_Erreur : Pb zfwrite() \n"); 
 | 
|---|
| 641 |   suivfip->Head.FgCorrupt = -99999999; rc = 11; }
 | 
|---|
| 642 | 
 | 
|---|
| 643 | if (suivfip->FgSwap)   /*  On remet dans le bon sens */
 | 
|---|
| 644 |   SwapSuiviRecord(buff, suivfip->RecFmt[2], suivfip->Head.FmtSize[2], 1);
 | 
|---|
| 645 |  
 | 
|---|
| 646 | /*  M.A.J. Entete  */
 | 
|---|
| 647 | sz = pos+suivfip->Head.RecSize[2];
 | 
|---|
| 648 | if (suivfip->Head.FileSize < sz)  suivfip->Head.FileSize = sz;
 | 
|---|
| 649 | if (suivfip->Head.NbStars < num)
 | 
|---|
| 650 |   {
 | 
|---|
| 651 |   suivfip->Head.NbStars = num;
 | 
|---|
| 652 |   suivfip->OffsetMes = suivfip->Head.HSize + suivfip->Head.RecSize[0] +
 | 
|---|
| 653 |                        suivfip->Head.RecSize[1] +
 | 
|---|
| 654 |                        suivfip->Head.NbStars*suivfip->Head.RecSize[2];
 | 
|---|
| 655 |   }
 | 
|---|
| 656 |  
 | 
|---|
| 657 | return(rc);
 | 
|---|
| 658 | }
 | 
|---|
| 659 |  
 | 
|---|
| 660 |  
 | 
|---|
| 661 |  
 | 
|---|
| 662 |  
 | 
|---|
| 663 | /* Nouvelle-Fonction */
 | 
|---|
| 664 |  
 | 
|---|
| 665 | int SuiviReadStarInfo(SUIVIFIP *suivfip, int_4 num, char *buff)
 | 
|---|
| 666 |  
 | 
|---|
| 667 | /*   Cette fonction lit les infos etoiles pour l'etoile   */
 | 
|---|
| 668 | /*  numero num -  Retour 0  OK                            */
 | 
|---|
| 669 |  
 | 
|---|
| 670 | {
 | 
|---|
| 671 | int_4 pos;
 | 
|---|
| 672 |  
 | 
|---|
| 673 | if (suivfip == NULL)  return(1);
 | 
|---|
| 674 | if ( (num <= (int_4)0) || (num > suivfip->Head.NbStars) )
 | 
|---|
| 675 |   { printf(" SuiviReadStarInfo_Erreur : Num (=%ld) out of range \n",(long)num); return(2); }
 | 
|---|
| 676 |  
 | 
|---|
| 677 | /*  lecture */
 | 
|---|
| 678 | pos = suivfip->Head.HSize + suivfip->Head.RecSize[0] +
 | 
|---|
| 679 |       suivfip->Head.RecSize[1] +
 | 
|---|
| 680 |       (num-1)*suivfip->Head.RecSize[2];
 | 
|---|
| 681 | if (zfseek(suivfip->fcp, (long)pos, SEEK_SET) != 0)
 | 
|---|
| 682 |   { printf(" SuiviReadStarInfo_Erreur : Pb zfseek() \n"); return(10); }
 | 
|---|
| 683 | zfread(buff,1,(size_t)suivfip->Head.RecSize[2],suivfip->fcp);
 | 
|---|
| 684 | 
 | 
|---|
| 685 | if (suivfip->FgSwap)   /*  On byte-swap apres lecture */
 | 
|---|
| 686 |   SwapSuiviRecord(buff, suivfip->RecFmt[2], suivfip->Head.FmtSize[2], 1);
 | 
|---|
| 687 |  
 | 
|---|
| 688 |  
 | 
|---|
| 689 | return(0);
 | 
|---|
| 690 | }
 | 
|---|
| 691 |  
 | 
|---|
| 692 | /*
 | 
|---|
| 693 | ++
 | 
|---|
| 694 | int SuiviAddMesure(SUIVIFIP *suivfip, char *buff)
 | 
|---|
| 695 |         Ajoute une nouvelle mesure dans le fichier. "buff" contient
 | 
|---|
| 696 |         l'information TimeInfo pour cette mesure.
 | 
|---|
| 697 | --
 | 
|---|
| 698 | */
 | 
|---|
| 699 |   
 | 
|---|
| 700 |  
 | 
|---|
| 701 | /* Nouvelle-Fonction */
 | 
|---|
| 702 | int SuiviAddMesure(SUIVIFIP *suivfip, char *buff)
 | 
|---|
| 703 |  
 | 
|---|
| 704 | /*  Cette fonction rajoute une nouvelle mesure ds le fichier de suivi  */
 | 
|---|
| 705 | /*  *buff contient l'information temps de cette mesure                 */
 | 
|---|
| 706 | /*  Les mesures correspondant a ce temps doivent etre rajoute par      */
 | 
|---|
| 707 | /*  SuiviWriteMesure()                                                 */
 | 
|---|
| 708 |  
 | 
|---|
| 709 | {
 | 
|---|
| 710 | int_4 pos,l1;
 | 
|---|
| 711 | ENTETESUIVI *head;
 | 
|---|
| 712 | int_4 itsiz;
 | 
|---|
| 713 | char bidbuf[4] = {'\0','\0','\0','\0'};
 | 
|---|
| 714 | int rc;
 | 
|---|
| 715 |  
 | 
|---|
| 716 | if (suivfip == NULL)  return(1);
 | 
|---|
| 717 | if (suivfip->FgRW != SUOF_RW)
 | 
|---|
| 718 |   {printf(" SuiviAddMesure_Erreur : Fichier ReadOnly \n");  return(2);}
 | 
|---|
| 719 | head = &(suivfip->Head);
 | 
|---|
| 720 |  
 | 
|---|
| 721 | /*   On verifie voir s'il faut creer de nouveaux records ?   */
 | 
|---|
| 722 | if ( (head->NbMesTot % head->NItem) == (int_4)(0) ) {
 | 
|---|
| 723 |   pos = suivfip->OffsetMes  +
 | 
|---|
| 724 |       ( (head->NbMesTot / head->NItem) + 1) *
 | 
|---|
| 725 |       ( head->RecSize[3] + (head->NbStars)*head->RecSize[4] ) - 4 ;
 | 
|---|
| 726 |   if (zfseek(suivfip->fcp, (long)pos, SEEK_SET) != 0)
 | 
|---|
| 727 |     { printf(" SuiviAddMesure_Erreur : Pb zfseek() \n");
 | 
|---|
| 728 |     suivfip->Head.FgCorrupt = -99999999;  return(10); } 
 | 
|---|
| 729 |   if (zfwrite(bidbuf,1, 4, suivfip->fcp) != 4) 
 | 
|---|
| 730 |     { printf(" SuiviAddMesure_Erreur : Pb zfwrite() \n");
 | 
|---|
| 731 |     suivfip->Head.FgCorrupt = -99999999;  return(11); } 
 | 
|---|
| 732 |   head->FileSize = pos+4;       
 | 
|---|
| 733 |   }
 | 
|---|
| 734 |  
 | 
|---|
| 735 | head->NbMesTot++;
 | 
|---|
| 736 |  
 | 
|---|
| 737 | l1 = (head->NbMesTot-1) / head->NItem;
 | 
|---|
| 738 | pos = suivfip->OffsetMes +
 | 
|---|
| 739 |       l1 * (head->RecSize[3] +
 | 
|---|
| 740 |       head->NbStars*head->RecSize[4]);
 | 
|---|
| 741 | itsiz = head->RecSize[3] / head->NItem ;
 | 
|---|
| 742 | pos += (head->NbMesTot-1 - l1*head->NItem) * itsiz;
 | 
|---|
| 743 | 
 | 
|---|
| 744 | if (suivfip->FgSwap)   /*  On byte-swap avant ecriture */
 | 
|---|
| 745 |   SwapSuiviRecord(buff, suivfip->RecFmt[3], suivfip->Head.FmtSize[3], 1);
 | 
|---|
| 746 | 
 | 
|---|
| 747 | rc = 0; 
 | 
|---|
| 748 | if (zfseek(suivfip->fcp, (long)pos, SEEK_SET) != 0)
 | 
|---|
| 749 |   { printf(" SuiviAddMesure_Erreur : Pb zfseek() \n"); 
 | 
|---|
| 750 |   suivfip->Head.FgCorrupt = -99999999; rc = 10; }
 | 
|---|
| 751 | else if (zfwrite(buff,1,(size_t)itsiz,suivfip->fcp) != itsiz)
 | 
|---|
| 752 |   { printf(" SuiviAddMesure_Erreur : Pb zfseek() \n"); 
 | 
|---|
| 753 |   suivfip->Head.FgCorrupt = -99999999;  rc = 11; }
 | 
|---|
| 754 |  
 | 
|---|
| 755 | if (suivfip->FgSwap)   /*  On remet dans le bon sens apres ecriture */
 | 
|---|
| 756 |   SwapSuiviRecord(buff, suivfip->RecFmt[3], suivfip->Head.FmtSize[3], 1);
 | 
|---|
| 757 |  
 | 
|---|
| 758 | return(rc);
 | 
|---|
| 759 | }
 | 
|---|
| 760 |  
 | 
|---|
| 761 |  
 | 
|---|
| 762 | /*
 | 
|---|
| 763 | ++
 | 
|---|
| 764 | int SuiviWriteTimeInfo(SUIVIFIP *suivfip, int_4 numes, char *buff)
 | 
|---|
| 765 |         Ecriture de TimeInfo pour la mesure numéro "numes" (1..NbMes).
 | 
|---|
| 766 | --
 | 
|---|
| 767 | */
 | 
|---|
| 768 | 
 | 
|---|
| 769 |  
 | 
|---|
| 770 | /* Nouvelle-Fonction */ 
 | 
|---|
| 771 | int SuiviWriteTimeInfo(SUIVIFIP *suivfip, int_4 numes, char *buff)
 | 
|---|
| 772 |  
 | 
|---|
| 773 | /*  Cette fonction ecrit l'info temps pour la mesure numero num  */
 | 
|---|
| 774 | /*  *buff contient l'information temps - Retour 0 OK             */
 | 
|---|
| 775 |  
 | 
|---|
| 776 | {
 | 
|---|
| 777 | int_4 pos,l1;
 | 
|---|
| 778 | ENTETESUIVI *head;
 | 
|---|
| 779 | int_4 itsiz;
 | 
|---|
| 780 | int rc;
 | 
|---|
| 781 |  
 | 
|---|
| 782 | if (suivfip == NULL)  return(1);
 | 
|---|
| 783 | if (suivfip->FgRW != SUOF_RW)
 | 
|---|
| 784 |   {printf(" SuiviWriteTimeInfo_Erreur : Fichier ReadOnly \n");  return(2);}
 | 
|---|
| 785 | head = &(suivfip->Head);
 | 
|---|
| 786 |  
 | 
|---|
| 787 | if ( (numes <= (int_4)0) || (numes > suivfip->Head.NbMesTot) )
 | 
|---|
| 788 |   { printf(" SuiviWriteTimeInfo_Erreur : NumMesure (=%ld) out of range \n",(long)numes);
 | 
|---|
| 789 |     return(3); }
 | 
|---|
| 790 |  
 | 
|---|
| 791 | l1 = (numes-1) / head->NItem;
 | 
|---|
| 792 | pos = suivfip->OffsetMes +
 | 
|---|
| 793 |       l1 * ( head->RecSize[3] +
 | 
|---|
| 794 |              head->NbStars*head->RecSize[4] );
 | 
|---|
| 795 | itsiz = head->RecSize[3] / head->NItem ;
 | 
|---|
| 796 | pos += ( numes-1 - l1*head->NItem ) * itsiz;
 | 
|---|
| 797 | 
 | 
|---|
| 798 | if (suivfip->FgSwap)   /*  On byte-swap avant ecriture */
 | 
|---|
| 799 |   SwapSuiviRecord(buff, suivfip->RecFmt[3], suivfip->Head.FmtSize[3], 1);
 | 
|---|
| 800 | rc = 0; 
 | 
|---|
| 801 | if (zfseek(suivfip->fcp, (long)pos, SEEK_SET) != 0)
 | 
|---|
| 802 |   { printf(" SuiviWriteTimeInfo_Erreur : Pb zfseek() \n"); 
 | 
|---|
| 803 |   suivfip->Head.FgCorrupt = -99999999;  rc = 10; }
 | 
|---|
| 804 | if (zfwrite(buff,1,(size_t)itsiz,suivfip->fcp) != itsiz)
 | 
|---|
| 805 |   { printf(" SuiviWriteTimeInfo_Erreur : Pb zfwrite() \n"); 
 | 
|---|
| 806 |   suivfip->Head.FgCorrupt = -99999999;  rc = 11; }
 | 
|---|
| 807 | 
 | 
|---|
| 808 |  
 | 
|---|
| 809 | if (suivfip->FgSwap)   /*  On remet dans le bon sens apres ecriture */
 | 
|---|
| 810 |   SwapSuiviRecord(buff, suivfip->RecFmt[3], suivfip->Head.FmtSize[3], 1);
 | 
|---|
| 811 |  
 | 
|---|
| 812 | return(rc);
 | 
|---|
| 813 | }
 | 
|---|
| 814 |  
 | 
|---|
| 815 |  
 | 
|---|
| 816 |  
 | 
|---|
| 817 | /*
 | 
|---|
| 818 | ++
 | 
|---|
| 819 | int SuiviWriteMesure(SUIVIFIP *suivfip, int_4 numet, int_4 nummes, char *buff)
 | 
|---|
| 820 |         Ecriture de l'infomation Mesure pour l'étoile numéro "numet" 
 | 
|---|
| 821 |         et la mesure numéro "numes" 
 | 
|---|
| 822 | --
 | 
|---|
| 823 | */
 | 
|---|
| 824 |  
 | 
|---|
| 825 | /* Nouvelle-Fonction */ 
 | 
|---|
| 826 | int SuiviWriteMesure(SUIVIFIP *suivfip, int_4 numet,
 | 
|---|
| 827 |                      int_4 nummes, char *buff)
 | 
|---|
| 828 |  
 | 
|---|
| 829 | /*  Cette fonction ecrit une mesure ds le fichier de suivi    */
 | 
|---|
| 830 | /*  numet est le numero d'etoile, nummes le numero de mesure  */
 | 
|---|
| 831 | /*  *buff contient l'information mesure - Retour 0 OK         */
 | 
|---|
| 832 |  
 | 
|---|
| 833 | {
 | 
|---|
| 834 | int_4 pos,l1;
 | 
|---|
| 835 | ENTETESUIVI *head;
 | 
|---|
| 836 | int_4 itsiz;
 | 
|---|
| 837 | int rc;
 | 
|---|
| 838 |  
 | 
|---|
| 839 | if (suivfip == NULL)  return(1);
 | 
|---|
| 840 | if (suivfip->FgRW != SUOF_RW)
 | 
|---|
| 841 |   {printf(" SuiviWriteMesure_Erreur : Fichier ReadOnly \n");  return(2);}
 | 
|---|
| 842 | head = &(suivfip->Head);
 | 
|---|
| 843 |  
 | 
|---|
| 844 | if ( (numet <= (int_4)0) || (numet > suivfip->Head.NbStars) )
 | 
|---|
| 845 |   { printf(" SuiviWriteMesure_Erreur : NumEtoile (=%ld) out of range \n",(long)numet);
 | 
|---|
| 846 |     return(2); }
 | 
|---|
| 847 |  
 | 
|---|
| 848 | if ( (nummes <= (int_4)0) || (nummes > suivfip->Head.NbMesTot) )
 | 
|---|
| 849 |   { printf(" SuiviWriteMesure_Erreur : NumMesure (=%ld) out of range \n",(long)nummes);
 | 
|---|
| 850 |     return(3); }
 | 
|---|
| 851 |  
 | 
|---|
| 852 | l1 = (nummes-1) / head->NItem;
 | 
|---|
| 853 | pos = suivfip->OffsetMes +
 | 
|---|
| 854 |       l1 * (head->RecSize[3] +
 | 
|---|
| 855 |       head->NbStars*head->RecSize[4]) +
 | 
|---|
| 856 |       head->RecSize[3] + (numet-1)*head->RecSize[4];
 | 
|---|
| 857 | itsiz = head->RecSize[4] / head->NItem ;
 | 
|---|
| 858 | pos += (nummes-1 - l1*head->NItem) * itsiz;
 | 
|---|
| 859 | 
 | 
|---|
| 860 | if (suivfip->FgSwap)   /*  On byte-swap avant ecriture */
 | 
|---|
| 861 |   SwapSuiviRecord(buff, suivfip->RecFmt[4], suivfip->Head.FmtSize[4], 1);
 | 
|---|
| 862 | 
 | 
|---|
| 863 | rc = 0; 
 | 
|---|
| 864 | if (zfseek(suivfip->fcp, (long)pos, SEEK_SET) != 0)
 | 
|---|
| 865 |   { printf(" SuiviWriteMesure_Erreur : Pb zfseek() \n"); 
 | 
|---|
| 866 |   suivfip->Head.FgCorrupt = -99999999;  rc = 10; }
 | 
|---|
| 867 | else if (zfwrite(buff,1,(size_t)itsiz,suivfip->fcp) != itsiz) 
 | 
|---|
| 868 |   { printf(" SuiviWriteMesure_Erreur : Pb zfwrite() \n"); 
 | 
|---|
| 869 |   suivfip->Head.FgCorrupt = -99999999;  rc = 11; }
 | 
|---|
| 870 | 
 | 
|---|
| 871 | if (suivfip->FgSwap)   /*  On remet dans le bon sens apres ecriture */
 | 
|---|
| 872 |   SwapSuiviRecord(buff, suivfip->RecFmt[4], suivfip->Head.FmtSize[4], 1);
 | 
|---|
| 873 |  
 | 
|---|
| 874 | return(rc);
 | 
|---|
| 875 | }
 | 
|---|
| 876 |  
 | 
|---|
| 877 | 
 | 
|---|
| 878 | /*
 | 
|---|
| 879 | ++
 | 
|---|
| 880 | int SuiviReadTimeInfo(SUIVIFIP *suivfip, int_4 debut, int_4 fin, char *buff)
 | 
|---|
| 881 |         Lecture des informations TimeInfo pour "debut <= mes <= fin". 
 | 
|---|
| 882 |         Attention : Des erreurs d'alignement d'accès mémoire peuvent 
 | 
|---|
| 883 |         avoir lieu en cas de lecture multiple "(fin > debut)" si la taille 
 | 
|---|
| 884 |         de la structure TimeInfo ne coincide pas avec celle de l'enregistrement
 | 
|---|
| 885 |         correspondant. 
 | 
|---|
| 886 | --
 | 
|---|
| 887 | */
 | 
|---|
| 888 |  
 | 
|---|
| 889 |  
 | 
|---|
| 890 | /* Nouvelle-Fonction */ 
 | 
|---|
| 891 | int SuiviReadTimeInfo(SUIVIFIP *suivfip, int_4 debut,
 | 
|---|
| 892 |                       int_4 fin, char *buff)
 | 
|---|
| 893 |  
 | 
|---|
| 894 | /*  Cette fonction lit l'information temps pour les mesures  */
 | 
|---|
| 895 | /*   debut <= NumMes <= fin         Retour 0  OK             */
 | 
|---|
| 896 |  
 | 
|---|
| 897 | {
 | 
|---|
| 898 | int_4 pos,l1;
 | 
|---|
| 899 | ENTETESUIVI *head;
 | 
|---|
| 900 | int_4 itsiz;
 | 
|---|
| 901 | int_4 fr,to,nit;
 | 
|---|
| 902 | char* buff0;
 | 
|---|
| 903 |  
 | 
|---|
| 904 | if (suivfip == NULL)  return(1);
 | 
|---|
| 905 | head = &(suivfip->Head);
 | 
|---|
| 906 |  
 | 
|---|
| 907 |  
 | 
|---|
| 908 | if ( (debut <= (int_4)0) || (debut > head->NbMesTot) )
 | 
|---|
| 909 |   { printf(" SuiviReadTimeInfo_Erreur : NumDebut (=%ld) out of range \n",(long)debut);
 | 
|---|
| 910 |     return(3); }
 | 
|---|
| 911 |  
 | 
|---|
| 912 | if ( (fin <= (int_4)0) || (fin > head->NbMesTot) )
 | 
|---|
| 913 |   { printf(" SuiviReadTimeInfo_Erreur : NumFin (=%ld) out of range \n",(long)fin);
 | 
|---|
| 914 |     return(4); }
 | 
|---|
| 915 |  
 | 
|---|
| 916 | if ( debut > fin)
 | 
|---|
| 917 |   { printf(" SuiviReadTimeInfo_Erreur : NumFin (=%ld) < NumDebut(=%ld) \n",
 | 
|---|
| 918 |            (long)fin, (long)debut);
 | 
|---|
| 919 |     return(5); }
 | 
|---|
| 920 |  
 | 
|---|
| 921 | itsiz = head->RecSize[3] / head->NItem ;
 | 
|---|
| 922 |  
 | 
|---|
| 923 | fr=to=debut;
 | 
|---|
| 924 | buff0 = buff;
 | 
|---|
| 925 |  
 | 
|---|
| 926 | do {
 | 
|---|
| 927 |  
 | 
|---|
| 928 |   l1 = (fr-1) / head->NItem;
 | 
|---|
| 929 |   to = (l1+1) * head->NItem;
 | 
|---|
| 930 |   if (to > fin)  nit = fin-fr+1;
 | 
|---|
| 931 |   else nit = to-fr+1;
 | 
|---|
| 932 |   pos = suivfip->OffsetMes +
 | 
|---|
| 933 |         l1 * (head->RecSize[3] +
 | 
|---|
| 934 |         head->NbStars*head->RecSize[4]);
 | 
|---|
| 935 |   pos += (fr-1 - l1*head->NItem) * itsiz;
 | 
|---|
| 936 |   if (zfseek(suivfip->fcp, (long)pos, SEEK_SET) != 0)
 | 
|---|
| 937 |     { printf(" SuiviReadTimeInfo_Erreur : Pb zfseek() \n"); return(10); }
 | 
|---|
| 938 |   zfread(buff,(size_t)itsiz,nit,suivfip->fcp);
 | 
|---|
| 939 |   fr += nit;  buff += nit * itsiz;
 | 
|---|
| 940 |  
 | 
|---|
| 941 | } while (fr <= fin);
 | 
|---|
| 942 |  
 | 
|---|
| 943 | if (suivfip->FgSwap)   /*  On byte-swap apres lecture */
 | 
|---|
| 944 |   SwapSuiviRecord(buff0, suivfip->RecFmt[3], suivfip->Head.FmtSize[3], fin-debut+1);
 | 
|---|
| 945 |  
 | 
|---|
| 946 | return(0);
 | 
|---|
| 947 | }
 | 
|---|
| 948 |  
 | 
|---|
| 949 |  
 | 
|---|
| 950 |  
 | 
|---|
| 951 |  
 | 
|---|
| 952 | /*
 | 
|---|
| 953 | ++
 | 
|---|
| 954 | int SuiviReadMesures(SUIVIFIP *suivfip, int_4 numet, int_4 debut, int_4 fin, char *buff)
 | 
|---|
| 955 |         Lecture des informations Mesure pour l'étoile "numet", "debut <= mes <= fin". 
 | 
|---|
| 956 |         Attention : Des erreurs d'alignement d'accès mémoire peuvent 
 | 
|---|
| 957 |         avoir lieu en cas de lecture multiple "(fin > debut)" si la taille 
 | 
|---|
| 958 |         de la structure Mesure ne coincide pas avec celle de l'enregistrement
 | 
|---|
| 959 |         correspondant.
 | 
|---|
| 960 | --
 | 
|---|
| 961 | */
 | 
|---|
| 962 |  
 | 
|---|
| 963 |  
 | 
|---|
| 964 | /* Nouvelle-Fonction */ 
 | 
|---|
| 965 | int SuiviReadMesures(SUIVIFIP *suivfip, int_4 numet,
 | 
|---|
| 966 |                      int_4 debut, int_4 fin, char *buff)
 | 
|---|
| 967 |  
 | 
|---|
| 968 | /*  Cette fonction lit les mesures pour l'etoile numet       */
 | 
|---|
| 969 | /*   debut <= NumMes <= fin         Retour 0  OK             */
 | 
|---|
| 970 |  
 | 
|---|
| 971 | {
 | 
|---|
| 972 | int_4 pos,l1;
 | 
|---|
| 973 | ENTETESUIVI *head;
 | 
|---|
| 974 | int_4 itsiz;
 | 
|---|
| 975 | int_4 fr,to,nit;
 | 
|---|
| 976 | char* buff0;
 | 
|---|
| 977 |  
 | 
|---|
| 978 | if (suivfip == NULL)  return(1);
 | 
|---|
| 979 | head = &(suivfip->Head);
 | 
|---|
| 980 |  
 | 
|---|
| 981 | if ( (numet <= (int_4)0) || (numet > head->NbStars) )
 | 
|---|
| 982 |   { printf(" SuiviReadMesures_Erreur : NumEtoile (=%ld) out of range \n", (long)numet);
 | 
|---|
| 983 |     return(2); }
 | 
|---|
| 984 |  
 | 
|---|
| 985 | if ( (debut <= (int_4)0) || (debut > head->NbMesTot) )
 | 
|---|
| 986 |   { printf(" SuiviReadMesures_Erreur : NumDebut (=%ld) out of range \n", (long)debut);
 | 
|---|
| 987 |     return(3); }
 | 
|---|
| 988 |  
 | 
|---|
| 989 | if ( (fin <= (int_4)0) || (fin > head->NbMesTot) )
 | 
|---|
| 990 |   { printf(" SuiviReadMesures_Erreur : NumFin (=%ld) out of range \n", (long)fin);
 | 
|---|
| 991 |     return(4); }
 | 
|---|
| 992 |  
 | 
|---|
| 993 | if ( debut > fin)
 | 
|---|
| 994 |   { printf(" SuiviReadMesures_Erreur : NumFin (=%ld) < NumDebut(=%ld) \n", 
 | 
|---|
| 995 |            (long)fin, (long)debut);
 | 
|---|
| 996 |     return(5); }
 | 
|---|
| 997 |  
 | 
|---|
| 998 | itsiz = head->RecSize[4] / head->NItem ;
 | 
|---|
| 999 |  
 | 
|---|
| 1000 | fr=to=debut;
 | 
|---|
| 1001 | buff0 = buff;
 | 
|---|
| 1002 |  
 | 
|---|
| 1003 | do {
 | 
|---|
| 1004 |  
 | 
|---|
| 1005 |   l1 = (fr-1) / head->NItem;
 | 
|---|
| 1006 |   to = (l1+1) * head->NItem;
 | 
|---|
| 1007 |   if (to > fin)  nit = fin-fr+1;
 | 
|---|
| 1008 |   else nit = to-fr+1;
 | 
|---|
| 1009 |   pos = suivfip->OffsetMes +
 | 
|---|
| 1010 |         l1 * (head->RecSize[3] +
 | 
|---|
| 1011 |         head->NbStars*head->RecSize[4]) +
 | 
|---|
| 1012 |         head->RecSize[3] + (numet-1)*head->RecSize[4];;
 | 
|---|
| 1013 |   pos += (fr-1 - l1*head->NItem) * itsiz;
 | 
|---|
| 1014 |   if (zfseek(suivfip->fcp, (long)pos, SEEK_SET) != 0)
 | 
|---|
| 1015 |     { printf(" SuiviReadMesures_Erreur : Pb zfseek() \n"); return(10); }
 | 
|---|
| 1016 |   zfread(buff,(size_t)itsiz,nit,suivfip->fcp);
 | 
|---|
| 1017 |   fr += nit;  buff += nit * itsiz;
 | 
|---|
| 1018 |  
 | 
|---|
| 1019 | } while (fr <= fin);
 | 
|---|
| 1020 | 
 | 
|---|
| 1021 | if (suivfip->FgSwap)   /*  On byte-swap apres lecture */
 | 
|---|
| 1022 |   SwapSuiviRecord(buff0, suivfip->RecFmt[4], suivfip->Head.FmtSize[4], fin-debut+1);
 | 
|---|
| 1023 |  
 | 
|---|
| 1024 |  
 | 
|---|
| 1025 | return(0);
 | 
|---|
| 1026 | }
 | 
|---|
| 1027 |  
 | 
|---|
| 1028 |  
 | 
|---|
| 1029 |   
 | 
|---|
| 1030 |  
 | 
|---|
| 1031 | /* Nouvelle-Fonction */
 | 
|---|
| 1032 | int_4 FindSizeofRec(char *fmt)
 | 
|---|
| 1033 |  
 | 
|---|
| 1034 | {
 | 
|---|
| 1035 | int i;
 | 
|---|
| 1036 | char c;
 | 
|---|
| 1037 | int sz;
 | 
|---|
| 1038 |  
 | 
|---|
| 1039 | i= sz = 0;
 | 
|---|
| 1040 | while ( (*fmt) != '\0' )
 | 
|---|
| 1041 |   {
 | 
|---|
| 1042 |   c = toupper(*fmt);
 | 
|---|
| 1043 |   switch (c)
 | 
|---|
| 1044 |     {
 | 
|---|
| 1045 |     case 'I' :
 | 
|---|
| 1046 |       sz += sizeof(int_4); i++;
 | 
|---|
| 1047 |       break;
 | 
|---|
| 1048 |     case 'L' :
 | 
|---|
| 1049 |       sz += sizeof(int_4); i++;
 | 
|---|
| 1050 |       break;
 | 
|---|
| 1051 |     case 'S' :
 | 
|---|
| 1052 |       sz += sizeof(int_2); i++;
 | 
|---|
| 1053 |       break;
 | 
|---|
| 1054 |     case 'F' :
 | 
|---|
| 1055 |       sz += sizeof(r_4); i++;
 | 
|---|
| 1056 |       break;
 | 
|---|
| 1057 |     case 'D' :
 | 
|---|
| 1058 |       sz += sizeof(r_8); i++;
 | 
|---|
| 1059 |       break;
 | 
|---|
| 1060 |     default :
 | 
|---|
| 1061 |       printf(" FindSizeofRec_Erreur : Code format inconnu : %c \n",c);
 | 
|---|
| 1062 |       return(-1);
 | 
|---|
| 1063 |       break;
 | 
|---|
| 1064 |     }
 | 
|---|
| 1065 |   fmt++;
 | 
|---|
| 1066 |   }
 | 
|---|
| 1067 |  
 | 
|---|
| 1068 | /*    printf(" FindSizeofRec_debug : N= %d , size= %d \n",i,sz);   */
 | 
|---|
| 1069 |  
 | 
|---|
| 1070 | return(sz);
 | 
|---|
| 1071 | }
 | 
|---|
| 1072 | 
 | 
|---|
| 1073 | /* Nouvelle-Fonction */
 | 
|---|
| 1074 | void SwapSuiviEntete(ENTETESUIVI *hp)
 | 
|---|
| 1075 | {
 | 
|---|
| 1076 | int i;
 | 
|---|
| 1077 | Swap_Bytes4( &(hp->FileSize) );
 | 
|---|
| 1078 | Swap_Bytes4( &(hp->HSize) );
 | 
|---|
| 1079 | for(i=0; i<5; i++)  Swap_Bytes2( &(hp->RecSize[i]) );
 | 
|---|
| 1080 | Swap_Bytes2( &(hp->NItem) );
 | 
|---|
| 1081 | Swap_Bytes4( &(hp->NbStars) );
 | 
|---|
| 1082 | Swap_Bytes4( &(hp->NbMesTot) );
 | 
|---|
| 1083 | for(i=0; i<5; i++)  Swap_Bytes2( &(hp->FmtSize[i]) );
 | 
|---|
| 1084 | Swap_Bytes2(  &(hp->Swap) );
 | 
|---|
| 1085 | Swap_Bytes2(  &(hp->Type) );
 | 
|---|
| 1086 | Swap_Bytes4(  &(hp->FgCorrupt) );
 | 
|---|
| 1087 | }
 | 
|---|
| 1088 | 
 | 
|---|
| 1089 | /* Nouvelle-Fonction */
 | 
|---|
| 1090 | void SwapSuiviRecord(char* rec, char* fmt, int fmtl, int nr)
 | 
|---|
| 1091 | {
 | 
|---|
| 1092 | int i,j;
 | 
|---|
| 1093 | char *pc;
 | 
|---|
| 1094 | 
 | 
|---|
| 1095 | pc = rec;
 | 
|---|
| 1096 | for( j = 0 ; j < nr ; j++ ) {
 | 
|---|
| 1097 |   for ( i = 0 ; i < fmtl ; i++ ) {
 | 
|---|
| 1098 |     switch( toupper(fmt[i]) )  {
 | 
|---|
| 1099 |       case 'I' :  
 | 
|---|
| 1100 |       case 'L' :
 | 
|---|
| 1101 |         Swap_Bytes4(pc);  
 | 
|---|
| 1102 |         pc += sizeof(int_4); 
 | 
|---|
| 1103 |         break;
 | 
|---|
| 1104 |       case 'S' :
 | 
|---|
| 1105 |         Swap_Bytes2(pc);  
 | 
|---|
| 1106 |         pc += sizeof(int_2); 
 | 
|---|
| 1107 |         break;
 | 
|---|
| 1108 |       case 'F' :
 | 
|---|
| 1109 |         Swap_Bytes4(pc);  
 | 
|---|
| 1110 |         pc += sizeof(r_4); 
 | 
|---|
| 1111 |         break;
 | 
|---|
| 1112 |       case 'D' :
 | 
|---|
| 1113 |         Swap_Bytes8(pc);  
 | 
|---|
| 1114 |         pc += sizeof(r_8); 
 | 
|---|
| 1115 |         break;
 | 
|---|
| 1116 |       default :
 | 
|---|
| 1117 |         printf(" SwapSuiviRecord_Erreur : Code format inconnu : %c \n",fmt[i]);
 | 
|---|
| 1118 |         break;
 | 
|---|
| 1119 |     }
 | 
|---|
| 1120 |   }
 | 
|---|
| 1121 | }
 | 
|---|
| 1122 | 
 | 
|---|
| 1123 | return;
 | 
|---|
| 1124 | }
 | 
|---|