1: /*
2: ================================================================================
3: RPL/2 (R) version 4.1.36
4: Copyright (C) 1989-2025 Dr. BERTRAND Joël
5:
6: This file is part of RPL/2.
7:
8: RPL/2 is free software; you can redistribute it and/or modify it
9: under the terms of the CeCILL V2 License as published by the french
10: CEA, CNRS and INRIA.
11:
12: RPL/2 is distributed in the hope that it will be useful, but WITHOUT
13: ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14: FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL V2 License
15: for more details.
16:
17: You should have received a copy of the CeCILL License
18: along with RPL/2. If not, write to info@cecill.info.
19: ================================================================================
20: */
21:
22:
23: #include "rpl-conv.h"
24:
25:
26: /*
27: ================================================================================
28: Fonction de calcul d'une date
29: ================================================================================
30: Entrées : pointeur sur un time_t
31: --------------------------------------------------------------------------------
32: Sorties : pointeur sur un object
33: --------------------------------------------------------------------------------
34: Effets de bord : néant
35: ================================================================================
36: */
37:
38: struct_objet *
39: formateur_date(struct_processus *s_etat_processus, struct timeval *horodatage)
40: {
41: char tableau[64 + 1];
42:
43: integer8 jour_julien;
44:
45: long d;
46: long heures;
47: long m;
48: long minutes;
49: long secondes;
50: long y;
51:
52: real8 heure_julienne;
53: real8 offset_julien;
54:
55: size_t taille;
56:
57: struct_liste_chainee *l_element_courant;
58:
59: struct_objet *s_objet;
60:
61: struct tm *stm;
62:
63: /*
64: * Récupération de la structure tm
65: */
66:
67: stm = localtime((const time_t *) &((*horodatage).tv_sec));
68:
69: if ((s_objet = allocation(s_etat_processus, LST)) == NULL)
70: {
71: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
72: return(NULL);
73: }
74:
75: /*
76: * Jour de la semaine
77: */
78:
79: if ((l_element_courant = malloc(sizeof(struct_liste_chainee))) == NULL)
80: {
81: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
82: return(NULL);
83: }
84:
85: (*s_objet).objet = l_element_courant;
86:
87: if (((*l_element_courant).donnee = allocation(s_etat_processus, CHN))
88: == NULL)
89: {
90: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
91: return(NULL);
92: }
93:
94: taille = strftime(tableau, 64, "%A", stm);
95:
96: if (((*(*l_element_courant).donnee).objet = malloc((taille + 1) *
97: sizeof(unsigned char))) == NULL)
98: {
99: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
100: return(NULL);
101: }
102:
103: strcpy((unsigned char *) (*(*l_element_courant).donnee).objet, tableau);
104:
105: /*
106: * Quantième du mois
107: */
108:
109: if (((*l_element_courant).suivant = malloc(sizeof(struct_liste_chainee)))
110: == NULL)
111: {
112: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
113: return(NULL);
114: }
115:
116: l_element_courant = (*l_element_courant).suivant;
117:
118: if (((*l_element_courant).donnee = allocation(s_etat_processus, INT))
119: == NULL)
120: {
121: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
122: return(NULL);
123: }
124:
125: taille = strftime(tableau, 64, "%d", stm);
126: sscanf(tableau, "%lld", (integer8 *) (*(*l_element_courant).donnee).objet);
127: d = (long) (*((integer8 *) (*(*l_element_courant).donnee).objet));
128:
129: /*
130: * Mois
131: */
132:
133: if (((*l_element_courant).suivant = malloc(sizeof(struct_liste_chainee)))
134: == NULL)
135: {
136: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
137: return(NULL);
138: }
139:
140: l_element_courant = (*l_element_courant).suivant;
141:
142: if (((*l_element_courant).donnee = allocation(s_etat_processus, CHN))
143: == NULL)
144: {
145: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
146: return(NULL);
147: }
148:
149: taille = strftime(tableau, 64, "%B", stm);
150:
151: if (((*(*l_element_courant).donnee).objet = malloc((taille + 1) *
152: sizeof(unsigned char))) == NULL)
153: {
154: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
155: return(NULL);
156: }
157:
158: strcpy((unsigned char *) (*(*l_element_courant).donnee).objet, tableau);
159:
160: /*
161: * Année
162: */
163:
164: if (((*l_element_courant).suivant = malloc(sizeof(struct_liste_chainee)))
165: == NULL)
166: {
167: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
168: return(NULL);
169: }
170:
171: l_element_courant = (*l_element_courant).suivant;
172:
173: if (((*l_element_courant).donnee = allocation(s_etat_processus, INT))
174: == NULL)
175: {
176: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
177: return(NULL);
178: }
179:
180: taille = strftime(tableau, 64, "%Y", stm);
181: sscanf(tableau, "%lld", (integer8 *) (*(*l_element_courant).donnee).objet);
182: y = (long) (*((integer8 *) (*(*l_element_courant).donnee).objet));
183:
184: /*
185: * Heure
186: */
187:
188: if (((*l_element_courant).suivant = malloc(sizeof(struct_liste_chainee)))
189: == NULL)
190: {
191: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
192: return(NULL);
193: }
194:
195: l_element_courant = (*l_element_courant).suivant;
196:
197: if (((*l_element_courant).donnee = allocation(s_etat_processus, INT))
198: == NULL)
199: {
200: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
201: return(NULL);
202: }
203:
204: taille = strftime(tableau, 64, "%H", stm);
205: sscanf(tableau, "%lld", (integer8 *) (*(*l_element_courant).donnee).objet);
206: heures = (long) (*((integer8 *) (*(*l_element_courant).donnee).objet));
207:
208: /*
209: * Minutes
210: */
211:
212: if (((*l_element_courant).suivant = malloc(sizeof(struct_liste_chainee)))
213: == NULL)
214: {
215: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
216: return(NULL);
217: }
218:
219: l_element_courant = (*l_element_courant).suivant;
220:
221: if (((*l_element_courant).donnee = allocation(s_etat_processus, INT))
222: == NULL)
223: {
224: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
225: return(NULL);
226: }
227:
228: taille = strftime(tableau, 64, "%M", stm);
229: sscanf(tableau, "%lld", (integer8 *) (*(*l_element_courant).donnee).objet);
230: minutes = (long) (*((integer8 *) (*(*l_element_courant).donnee).objet));
231:
232: /*
233: * Secondes
234: */
235:
236: if (((*l_element_courant).suivant = malloc(sizeof(struct_liste_chainee)))
237: == NULL)
238: {
239: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
240: return(NULL);
241: }
242:
243: l_element_courant = (*l_element_courant).suivant;
244:
245: if (((*l_element_courant).donnee = allocation(s_etat_processus, INT))
246: == NULL)
247: {
248: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
249: return(NULL);
250: }
251:
252: taille = strftime(tableau, 64, "%S", stm);
253: sscanf(tableau, "%lld", (integer8 *) (*(*l_element_courant).donnee).objet);
254: secondes = (long) (*((integer8 *) (*(*l_element_courant).donnee).objet));
255:
256: /*
257: * Microsecondes
258: */
259:
260: if (((*l_element_courant).suivant = malloc(sizeof(struct_liste_chainee)))
261: == NULL)
262: {
263: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
264: return(NULL);
265: }
266:
267: l_element_courant = (*l_element_courant).suivant;
268:
269: if (((*l_element_courant).donnee = allocation(s_etat_processus, INT))
270: == NULL)
271: {
272: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
273: return(NULL);
274: }
275:
276: (*((integer8 *) (*(*l_element_courant).donnee).objet)) =
277: (integer8) (*horodatage).tv_usec;
278:
279: /*
280: * Fuseau horaire
281: */
282:
283: if (((*l_element_courant).suivant = malloc(sizeof(struct_liste_chainee)))
284: == NULL)
285: {
286: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
287: return(NULL);
288: }
289:
290: l_element_courant = (*l_element_courant).suivant;
291:
292: if (((*l_element_courant).donnee = allocation(s_etat_processus, CHN))
293: == NULL)
294: {
295: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
296: return(NULL);
297: }
298:
299: taille = strftime(tableau, 64, "%Z", stm);
300:
301: if (((*(*l_element_courant).donnee).objet = malloc((taille + 1) *
302: sizeof(unsigned char))) == NULL)
303: {
304: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
305: return(NULL);
306: }
307:
308: strcpy((unsigned char *) (*(*l_element_courant).donnee).objet, tableau);
309:
310: /*
311: * Jour de la semaine en numérique
312: */
313:
314: if (((*l_element_courant).suivant = malloc(sizeof(struct_liste_chainee)))
315: == NULL)
316: {
317: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
318: return(NULL);
319: }
320:
321: l_element_courant = (*l_element_courant).suivant;
322:
323: if (((*l_element_courant).donnee = allocation(s_etat_processus, INT))
324: == NULL)
325: {
326: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
327: return(NULL);
328: }
329:
330: taille = strftime(tableau, 64, "%u", stm);
331: sscanf(tableau, "%lld", (integer8 *) (*(*l_element_courant).donnee).objet);
332:
333: /*
334: * Numéro de la semaine
335: */
336:
337: if (((*l_element_courant).suivant = malloc(sizeof(struct_liste_chainee)))
338: == NULL)
339: {
340: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
341: return(NULL);
342: }
343:
344: l_element_courant = (*l_element_courant).suivant;
345:
346: if (((*l_element_courant).donnee = allocation(s_etat_processus, INT))
347: == NULL)
348: {
349: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
350: return(NULL);
351: }
352:
353: taille = strftime(tableau, 64, "%W", stm);
354: sscanf(tableau, "%lld", (integer8 *) (*(*l_element_courant).donnee).objet);
355:
356: /*
357: * Numéro du mois
358: */
359:
360: if (((*l_element_courant).suivant = malloc(sizeof(struct_liste_chainee)))
361: == NULL)
362: {
363: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
364: return(NULL);
365: }
366:
367: l_element_courant = (*l_element_courant).suivant;
368:
369: if (((*l_element_courant).donnee = allocation(s_etat_processus, INT))
370: == NULL)
371: {
372: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
373: return(NULL);
374: }
375:
376: taille = strftime(tableau, 64, "%m", stm);
377: sscanf(tableau, "%lld", (integer8 *) (*(*l_element_courant).donnee).objet);
378: m = (long) (*((integer8 *) (*(*l_element_courant).donnee).objet));
379:
380: /*
381: * Numéro du jour dans l'année
382: */
383:
384: if (((*l_element_courant).suivant = malloc(sizeof(struct_liste_chainee)))
385: == NULL)
386: {
387: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
388: return(NULL);
389: }
390:
391: l_element_courant = (*l_element_courant).suivant;
392:
393: if (((*l_element_courant).donnee = allocation(s_etat_processus, INT))
394: == NULL)
395: {
396: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
397: return(NULL);
398: }
399:
400: taille = strftime(tableau, 64, "%j", stm);
401: sscanf(tableau, "%lld", (integer8 *) (*(*l_element_courant).donnee).objet);
402:
403: /*
404: * Jours juliens (référence 0 le 24 novembre -4713 dans le calendrier
405: * grégorien proleptique). Le résultat est séparé en deux, tout
406: * d'abord la partie entière, puis la partie fractionnaire.
407: * Cette valeur apparaît dans la liste en deux parties, tout d'abord la
408: * partie entière, puis la partie fractionnaire.
409: */
410:
411: if (((*l_element_courant).suivant = malloc(sizeof(struct_liste_chainee)))
412: == NULL)
413: {
414: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
415: return(NULL);
416: }
417:
418: l_element_courant = (*l_element_courant).suivant;
419:
420: if (((*l_element_courant).donnee = allocation(s_etat_processus, INT))
421: == NULL)
422: {
423: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
424: return(NULL);
425: }
426:
427: if (m < 3)
428: {
429: y--;
430: m += 12;
431: }
432:
433: /*
434: * À noter : la date de base est toujours dans le calendrier
435: * grégorien à moins d'avoir un sérieux problème de date
436: * sur le calculateur.
437: */
438:
439: jour_julien = 1721024 + (365 * y) + (30 * m) + d + ((integer8) (y / 4))
440: + 2 + ((integer8) (y / 400)) - ((integer8) (y / 100));
441: heure_julienne = floor(((real8) 0.6001) * ((real8) m + 1)) +
442: (((real8) heures) / 24) + (((real8) minutes) / 1440) +
443: (((real8) secondes + (((real8) (*horodatage).tv_usec) / 1000000)) /
444: 86400) + ((real8) 0.5);
445:
446: offset_julien = floor(heure_julienne);
447:
448: jour_julien += (integer8) offset_julien;
449: heure_julienne -= offset_julien;
450:
451: (*((integer8 *) (*(*l_element_courant).donnee).objet)) = jour_julien;
452:
453: if (((*l_element_courant).suivant = malloc(sizeof(struct_liste_chainee)))
454: == NULL)
455: {
456: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
457: return(NULL);
458: }
459:
460: l_element_courant = (*l_element_courant).suivant;
461:
462: if (((*l_element_courant).donnee = allocation(s_etat_processus, REL))
463: == NULL)
464: {
465: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
466: return(NULL);
467: }
468:
469: (*((real8 *) (*(*l_element_courant).donnee).objet)) = heure_julienne;
470:
471: /*
472: * Temps Unix
473: */
474:
475: if (((*l_element_courant).suivant = malloc(sizeof(struct_liste_chainee)))
476: == NULL)
477: {
478: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
479: return(NULL);
480: }
481:
482: l_element_courant = (*l_element_courant).suivant;
483:
484: if (((*l_element_courant).donnee = allocation(s_etat_processus, INT))
485: == NULL)
486: {
487: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
488: return(NULL);
489: }
490:
491: (*((integer8 *) (*(*l_element_courant).donnee).objet)) =
492: (*horodatage).tv_sec;
493:
494: /*
495: * Fermeture de la liste
496: */
497:
498: (*l_element_courant).suivant = NULL;
499:
500: return(s_objet);
501: }
502:
503: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>