source: Sophya/trunk/FrEROS/AnaLC/nomfits2.c@ 3572

Last change on this file since 3572 was 3572, checked in by cmv, 17 years ago

char* -> const char* pour regler les problemes de deprecated string const... + comparaison unsigned signed + suppression EVOL_PLANCK rz+cmv 07/02/2009

  • Property svn:executable set to *
File size: 11.6 KB
Line 
1#include <string.h>
2#include <stdlib.h>
3#include <stdio.h>
4#include <ctype.h>
5
6#include "strutil.h"
7#include "nomfits2.h"
8#include "datime.h"
9
10/*
11++
12 Module Aide au codage des noms Fits (C).
13 Lib LibsUtil
14 include nomfits2.h
15
16 Pour aider a coder et decoder les noms de fichiers Fits Eros 1 et 2.
17 Pour verifier la bonne sante d'un fichier Fits.
18--
19*/
20/* ----------------------------------------------------------------- */
21/* Reza+farhang, Avril 2007, copie depuis Peida/LibsUtil/datime.h .c */
22/*
23++
24 int DecodeStrgtoJMAHMS(const char* strg, JMA* jma, HMS* hms)
25 Decodage d'une chaine sous forme "yyyy-mm-ddThh:mm:ss.s" ou "dd/mm/yy" ou
26 "yy/mm/dd" (si yy > 31) ou "yyyy-mm-dd" ou "dd/mm/yyThh:mm:ss.s" en
27 structure JMA et HMS. Si yy < 100 , 1900 est ajoute a l'annee.
28 Les argumets "jma" ou "hms" peuvenet etre nuls.
29 Code de retour :
30| Bit 0 ( -> 1) : Decodage date OK
31| Bit 1 ( -> 2) : DecodaGE Heure OK
32
33--
34*/
35/* Nouvelle-Fonction */
36int DecodeStrgtoJMAHMS(const char* strg, JMA* jma, HMS* hms)
37{
38JMA lj;
39HMS lh;
40int i,j,l,rc;
41int tiret;
42int T;
43char buff[256];
44
45if (jma == NULL) jma = &lj;
46if (hms == NULL) hms = &lh;
47
48/* Initialisation de la date et de l'heure */
49rc = 0;
50hms->Heures = 0;
51hms->Minutes = 0;
52hms->Secondes = 0.;
53jma->Annee = 0;
54jma->Mois = 0;
55jma->Jour = 0;
56
57
58l = strlen(strg);
59tiret = T = -1;
60for(i=0,j=0; i<l; i++) {
61 if (j > 254) break;
62 if (strg[i] == ' ') continue;
63 buff[j] = strg[i];
64 if (buff[j] == '-') { buff[j] = ' '; tiret = 1; } /* Date code avec un tiret */
65 if (buff[j] == 'T') T = j; /* Heure code dans la chaine */
66 j++;
67 }
68
69buff[j] ='\0';
70if (T >= 0) {
71 buff[T] ='\0';
72 sscanf(buff+T+1,"%d:%d:%lf", &(hms->Heures),&(hms->Minutes),&(hms->Secondes));
73 if ( (hms->Heures>=0.) && (hms->Heures<24.) &&
74 (hms->Minutes>=0.) && (hms->Minutes<60.) &&
75 (hms->Secondes>=0.) && (hms->Secondes<60.) ) rc += 2;
76 }
77if (tiret < 0) {
78 sscanf(buff,"%d/%d/%d", &(jma->Jour),&(jma->Mois),&(jma->Annee));
79 /* Jour > 31 -> On tente yy/mm/dd */
80 if (jma->Jour>31) sscanf(buff,"%d/%d/%d", &(jma->Annee),&(jma->Mois),&(jma->Jour));
81 }
82else { /* Date code avec un tiret */
83 sscanf(buff,"%d %d %d", &(jma->Annee),&(jma->Mois),&(jma->Jour));
84 }
85if (jma->Annee < 100) jma->Annee += 1900;
86if ( (jma->Mois >= 1) && (jma->Mois <= 12) && (jma->Jour >= 1) && (jma->Jour <= 31) ) rc += 1;
87return(rc);
88}
89/* --- fin ajout depuis Peida/LibsUtil/datime.h ----- */
90
91
92/*====================================================*/
93/*
94++
95unsigned long int decode_zeza(const char* s, int i1, int i2)
96 Pour coder (Rc) en entier decimal la chaine de caracteres
97 comprise entre `s[i1]' et `s[i2]' interpretee comme
98 une suite de Zezas (base 36 : 0 a z).
99--
100*/
101unsigned long int decode_zeza(const char* s, int i1, int i2)
102{
103 unsigned long int D, ibase = 1;
104 int i, i0, sic;
105
106 if( i1 < 0 ) i1 = 0;
107 if( i2 > strlen(s) ) i2 = strlen(s);
108 if( i2 < i1 ) return(0);
109 for(i=i1; i<=i2; i++) if( ! isalnum((int) s[i]) ) break;
110 i2 = i-1;
111 /* printf("s=%s i1=%d i2=%d\n",s,i1,i2); */
112 if( i2 < i1 ) return(0);
113
114 D = 0;
115 for(i=i2; i>=i1; i--) {
116 sic = (int) s[i];
117 if( islower(sic) ) i0 = (int) 'a' - 10;
118 else if( isupper(sic) ) i0 = (int) 'A' - 10;
119 else i0 = (int) '0';
120 D += (unsigned long int) ( sic - i0 ) * ibase;
121 /* printf("-- s[%d]=%c sic=%d i0=%d D=%ld\n",i,s[i],sic,i0,D); */
122 ibase *= 36;
123 }
124 return( D );
125}
126
127/*====================================================*/
128/*
129++
130char * dec2zeza(unsigned long z, char *s, int n)
131 Pour coder en Zeza (base 36) dans la chaine de characteres
132 `s' de longeur maximum `n' le nombre entier decimal `z'.
133--
134*/
135char * dec2zeza(unsigned long z, char *s, int n)
136{
137int r,i,j;
138char sz[16];
139if(n<2) return NULL;
140sz[0] = '0'; sz[1] = '\0';
141i=0;
142while (z) {
143 r = z%36;
144 if(r<10) sz[i] = '0'+r; else sz[i] = 'a'+r-10;
145 z /= 36;
146 i++;
147 }
148for(j=0;j<i && j<n-1;j++) s[j] = sz[i-j-1];
149s[j] = '\0';
150
151return( s );
152}
153
154/*====================================================*/
155/*
156++
157int qSort_fits2(const void *x1,const void *x2)
158 Pour trier avec `qsort' un tableau de pointeurs sur
159 des chaines de caracteres de noms de fichiers fits Eros2.
160 Le tri s'effectue dans l'ordre canonique suivant,
161 apres convertion des chaines de caracteres
162 interpretees comme des Zezas en entier decimal:
163| nom = oo ccc C c s f t dddd sss
164| 1- sur la date dddd,
165| 2- sur l'objet oo,
166| 3- sur le champ ccc,
167| 4- sur le numero de camera C
168| 5- sur le nom du filtre f,
169| 6- sur le type de traitement t,
170| 7- sur le numero de sequence sss,
171| 8- sur le numero de sous-image s,
172| 9- sur le numero de ccd c.
173--
174*/
175int qSort_fits2(const void *x1,const void *x2)
176/* oo ccc c c s f t dddd sss */
177/* bb hhh a c s i r aaaa eee */
178/* jj ppp m d i l a tttt qqq */
179/* */
180/* 01 234 5 6 7 8 9 1111 111 */
181/* 0123 456 */
182{
183unsigned long int i,j;
184char *s1, *s2;
185
186s1 = *((char **) x1);
187s2 = *((char **) x2);
188
189/* tri par date */
190i = decode_zeza(s1,10,13);
191j = decode_zeza(s2,10,13);
192if(i<j) return(-1); else if(i>j) return(1);
193
194/* puis tri par objet*/
195i = decode_zeza(s1,0,1);
196j = decode_zeza(s2,0,1);
197if(i<j) return(-1); else if(i>j) return(1);
198
199/* puis tri par champ */
200i = decode_zeza(s1,2,4);
201j = decode_zeza(s2,2,4);
202if(i<j) return(-1); else if(i>j) return(1);
203
204/* puis tri par camera */
205i = decode_zeza(s1,5,5);
206j = decode_zeza(s2,5,5);
207if(i<j) return(-1); else if(i>j) return(1);
208
209/* puis tri par filtre */
210i = decode_zeza(s1,8,8);
211j = decode_zeza(s2,8,8);
212if(i<j) return(-1); else if(i>j) return(1);
213
214/* puis tri par traitement */
215i = decode_zeza(s1,9,9);
216j = decode_zeza(s2,9,9);
217if(i<j) return(-1); else if(i>j) return(1);
218
219/* puis tri par sequence */
220i = decode_zeza(s1,14,999);
221j = decode_zeza(s2,14,999);
222if(i<j) return(-1); else if(i>j) return(1);
223
224/* puis tri par sous-image */
225i = decode_zeza(s1,7,7);
226j = decode_zeza(s2,7,7);
227if(i<j) return(-1); else if(i>j) return(1);
228
229/* puis tri par ccd */
230i = decode_zeza(s1,6,6);
231j = decode_zeza(s2,6,6);
232if(i<j) return(-1); else if(i>j) return(1);
233
234/* Ici les noms sont identiques. */
235return(0);
236}
237
238
239
240/* CMV: test des conneries du serveur MG ! */
241
242/* taille du block d'un fichier fits */
243#define HEAD_SIZE_CMV 2880
244/* nombre maximum permis de blocks pour le header */
245#define N_BLK_HEAD_CMV 100
246
247/*
248++
249int Test_NoCorrupt(const char *flnm)
250 Test pour voir si le fichier Fits de nom `flnm' n'est
251 pas corrompu.
252| Rc = 0 : fichier OK
253| -1 : echec open
254| -2 : le buffer lu ne fait pas 80 caracteres
255| -3 : clef Fits sans signe =
256| -4 : la longueur que l'on deduit de l'entete fits
257| est incompatible avec celle du fichier.
258| -5 : il manque une clef Fits (NAXIS1,NAXIS2,NAXIS, BITPIX)
259| ou la clef BITPIX n'est pas correcte.
260--
261*/
262int Test_NoCorrupt(const char *flnm)
263{
264int lp=0;
265FILE *fip;
266char buff[81],*c,*cval;
267unsigned short naxis_set, naxis1_set, naxis2_set, bitpix_set, end_set;
268int naxis1, naxis2, naxis, bitpix;
269long int nbytes_head,nbytes_pix,nbytes_tot,nbytes_mes;
270size_t i;
271
272fip = fopen(flnm,"rb");
273if( fip == NULL ) {
274 if(lp) printf("fopen: impossible de lire %s\n",flnm);
275 return(-1);
276}
277
278naxis_set = naxis1_set = naxis2_set = bitpix_set = end_set = 0;
279naxis1 = naxis2 = naxis = bitpix = 0;
280nbytes_head = nbytes_pix = nbytes_tot = nbytes_mes = 0;
281
282for(;;) {
283
284 i = fread(buff,1,80,fip);
285 if(lp) printf("fread: rc=%d\n",(int) i);
286 if( i != 80 ) return(-2);
287 nbytes_head += (long int) i;
288
289 if( nbytes_head / HEAD_SIZE_CMV > N_BLK_HEAD_CMV ) {
290 if(lp) printf("Trop de block dans le header %d > %d\n"
291 , (int) nbytes_head/HEAD_SIZE_CMV,N_BLK_HEAD_CMV);
292 break;
293 }
294
295 buff[80] = '\0';
296 if(lp) printf("buff=(%s)\n",buff);
297
298 c = buff;
299 strip(c,'B',' ');
300 if(lp) printf(" c=(%s)\n",c);
301
302 if(strcmp(c,"END") == 0) {
303 if(lp) printf(" END trouve\n");
304 end_set = 1;
305 } else {
306 if( (i=posc(c,'=')) < 0 ) {
307 if(lp) printf(" pas de signe =\n");
308 return(-3);
309 }
310 *(c+i)='\0';
311 cval = c+i+1;
312 strip(c,'B',' ');
313 strip(cval,'B',' ');
314 if(lp) printf(" c=(%s) cval=(%s)\n",c,cval);
315
316 if(strcmp(c,"NAXIS") == 0) {
317 sscanf(cval,"%d",&naxis);
318 if(lp) printf(" NAXIS trouve\n");
319 naxis_set = 1;
320 }
321 if(strcmp(c,"NAXIS1") == 0) {
322 sscanf(cval,"%d",&naxis1);
323 if(lp) printf(" NAXIS1 trouve= %d\n",naxis1);
324 naxis1_set = 1;
325 }
326 if(strcmp(c,"NAXIS2") == 0) {
327 sscanf(cval,"%d",&naxis2);
328 if(lp) printf(" NAXIS2 trouve= %d\n",naxis2);
329 naxis2_set = 1;
330 }
331 if(strcmp(c,"BITPIX") == 0) {
332 sscanf(cval,"%d",&bitpix);
333 if(lp) printf(" BITPIX trouve= %d\n",bitpix);
334 bitpix_set = 1;
335 }
336 }
337
338 if(end_set) {
339 if( naxis1_set && naxis2_set && bitpix_set && bitpix%8==0 ) {
340
341 if( nbytes_head % HEAD_SIZE_CMV == 0 ) nbytes_head = nbytes_head / HEAD_SIZE_CMV;
342 else nbytes_head = nbytes_head / HEAD_SIZE_CMV + 1;
343 nbytes_head = nbytes_head*HEAD_SIZE_CMV;
344
345 if( bitpix < 0 ) bitpix *= -1;
346 bitpix /= 8;
347 nbytes_pix = bitpix * naxis1*naxis2;
348 if( nbytes_pix % HEAD_SIZE_CMV == 0 ) nbytes_pix = nbytes_pix / HEAD_SIZE_CMV;
349 else nbytes_pix = nbytes_pix / HEAD_SIZE_CMV + 1;
350 nbytes_pix = nbytes_pix*HEAD_SIZE_CMV;
351
352 nbytes_tot = nbytes_head + nbytes_pix;
353
354 if(lp)
355 printf("Taille predite: header=%ld core=%ld tot=%ld bytes\n"
356 ,nbytes_head,nbytes_pix,nbytes_tot);
357
358 fseek(fip, 0L, SEEK_END);
359 nbytes_mes = ftell(fip);
360 if(lp) printf("Taille totale mesuree= %ld bytes\n",nbytes_mes);
361
362 fclose(fip);
363 if( nbytes_tot == nbytes_mes ) return(0); else return(-4);
364 } else break;
365 }
366
367}
368
369fclose(fip);
370return(-5);
371}
372#undef HEAD_SIZE_CMV
373#undef N_BLK_HEAD_CMV
374
375
376/*====================================================*/
377/*
378++
379uint_4 DateTstoInt(char *date,char *t)
380 Pour coder la date et l'heure
381 dans un entier (TimeInfo).
382| 16 bits de poids forts : nombre de jours ecoules depuis de 1/1/90.
383| faibles: temps en unites de 2sec.
384--
385*/
386uint_4 DateTstoInt(const char *date,const char *ts)
387{
388JMA D,D0;
389HMS T;
390uint_4 Dj,Ts;
391int_4 dDj;
392
393/* init pout protection contre date,ts mal definis */
394StrgtoJMA("01/01/1990",D);
395StrgtoHMS("0:0:0",T);
396
397StrgtoJMA(date,D);
398StrgtoJMA("01/01/1990",D0);
399dDj = JMAtoJ(D) - JMAtoJ(D0);
400if( dDj > 32767 ) dDj = 32767;
401if( dDj < -32767 ) dDj = -32767;
402if (dDj >= 0) Dj = dDj;
403else Dj = 32768-dDj;
404
405StrgtoHMS(ts,T);
406Ts = (uint_4)(HMStoSec(T)/2.);
407if( Ts > 65535 ) Ts = 65535;
408
409return ((Dj<<16)+Ts);
410}
411
412/*====================================================*/
413/*
414++
415uint_4 DateTimetoInt(const char *datetime)
416 Pour coder la date et l'heure
417 dans un entier (TimeInfo).
418| 16 bits de poids forts : nombre de jours ecoules depuis de 1/1/90.
419| faibles: temps en unites de 2sec.
420--
421*/
422uint_4 DateTimetoInt(const char *datetime)
423{
424JMA D,D0;
425HMS T;
426uint_4 Dj,Ts;
427int_4 dDj;
428int rc;
429
430/* init pout protection contre date,ts mal definis */
431StrgtoJMA("01/01/1990",D);
432StrgtoHMS("0:0:0",T);
433rc = DecodeStrgtoJMAHMS(datetime, &D, &T);
434if (rc != 3)
435 printf("DateTimetoInt(%s)/Warning - incomplete Date/Time specification (Rc=%d) \n",
436 datetime, rc);
437StrgtoJMA("01/01/1990",D0);
438dDj = JMAtoJ(D) - JMAtoJ(D0);
439if( dDj > 32767 ) dDj = 32767;
440if( dDj < -32767 ) dDj = -32767;
441if (dDj >= 0) Dj = dDj;
442else Dj = 32768-dDj;
443
444Ts = (uint_4)(HMStoSec(T)/2.);
445if( Ts > 65535 ) Ts = 65535;
446
447return ((Dj<<16)+Ts);
448}
449
450/*====================================================*/
451/*
452++
453void InttoDateTs(uint_4 n,int_4 *date,int_4 *t)
454 Pour decoder la date et l'heure
455 depuis un entier (TimeInfo).
456| n : entier code.
457| date: nombre de jours ecoules depuis de 1/1/90.
458| t : heure en secondes (precision 2s).
459--
460*/
461void InttoDateTs(uint_4 n,int_4 *date,int_4 *ts)
462{
463uint_4 dj, dt;
464dt = 2 * (n & 0xFFFF);
465dj = (n>>16) & 0xFFFF;
466if (dj > 32767) dj = 32768 - dj;
467*ts = dt;
468*date = dj;
469}
Note: See TracBrowser for help on using the repository browser.