[3308] | 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 | }
|
---|