#ifndef H_ED_DATE_20030327171623
#define H_ED_DATE_20030327171623

#ifdef __cplusplus
extern "C"
{
#endif

/* ---------------------------------------------------------------------
   (c) ED 2000
   Projet       : CLIB
   Fonction     : Gestion des dates
   Module       : DATE
   Fichier      : DATE.H
   Creation     : 10-01-2000
   Modification : 16-01-2004
   --------------------------------------------------------------------- */

/* ---------------------------------------------------------------------
   Journal

   0.0 du 10-01-2000 Creation
   1.0 du 11-01-2000 Version operationelle
   1.1 du 26-03-2003 Ajout de la structure sDATE et des fonctions de
   .                 conversion 'struct tm' <-> 'sDATE'
   2.0 du 23-04-2003 Les anciennes fonctions 'tm' deviennent DATE_tm_*()
   .                 Les fonctions DATE_*() utilisent sDATE
   2.1 du 28-04-2003 Dans DATE2tm(), ajout de 'tm_isdst = 0'
   2.2 du 29-04-2003 Ajout des formats standard pour printf DATE_FTM_xxx
   2.3 du 06-05-2003 Ajout de DATE_print() (si DATE_PRINT est defini)
   2.4 du 16-01-2004 Mise au point DATE_is_valid()

   ---------------------------------------------------------------------

   * ATTENTION *

   Les anciennes fonctions

   int DATE_limites (struct tm const *const p_tm);
   int DATE_valide (struct tm const *const p_tm);
   int DATE_jour_max (struct tm const *const p_tm);

   utilisent la structure standard 'tm' sans en respecter les
   specifications (notament concernant tm_year et tm_mon).

   Elles ont ete renommees. Elles s'appellent maintenant :

   int DATE_tm_limites (struct tm const *const p_tm);
   int DATE_tm_valide (struct tm const *const p_tm);
   int DATE_tm_jour_max (struct tm const *const p_tm);

   L'usage des anciennes fonctions DATE_tm*() est desormais interdit dans
   de nouveaux projets. Dans les anciens, il faut si possible les remplacer
   par les nouvelles fonctions correspondantes.

   int DATE_is_valid (sDATE const *const p_date);
   int DATE_last_day (sDATE *date);

   La fonction DATE_is_valid() remplace les fonctions DATE_tm_limites()
   et DATE_tm_valide()

   L'activation des anciennes fonctions se fait en definissant la macro
   globale :

   DATE_TM

   REMARQUE

   Pour le moment, les fonctions

   int DATE_Date2tm (char const *s_date, struct tm *const p_tm);
   int DATE_Time2tm (char const *s_time, struct tm *const p_tm);

   utilisant des fonctions internes de DATE_tm(), elle ne sont accessibles
   que si DATE_TM est defini.

   --------------------------------------------------------------------- */
#include <time.h>
#include "ed/inc/types.h"

/* macros ============================================================== */
/* constants =========================================================== */

#define DATETIME2tm 1           /* 0 | 1 */

/* format d'affichage standard
   YYYY-MM-DD
   HH:MM:SS
 */
#define DATE_FMT_DATE "%04d-%02u-%02u"
#define DATE_FMT_TIME "%02u:%02u:%02u"
#define DATE_FMT_FULL DATE_FMT_DATE " " DATE_FMT_TIME


/* types =============================================================== */
/* structures ========================================================== */

   typedef struct
   {
      /* 16 bits */
      int year;                 /* -32767..+32767 */
      uint month:4;             /* 0-15 */
      uint day:5;               /* 0-31 */

      uint hour:5;              /* 0-31 */
      uint minute:6;            /* 0-63 */
      uint second:6;            /* 0-63 */
   }
   sDATE;

/* internal public data ================================================ */
/* internal public functions =========================================== */
/* entry points ======================================================== */

/* ---------------------------------------------------------------------
   DATE_sver()
   ---------------------------------------------------------------------
   Role : Retourne une chaine "Version"
   ---------------------------------------------------------------------
   E :
   S : Pointeur de chaine ASCIIZ
   --------------------------------------------------------------------- */
   const char *DATE_sver (void);

/* ---------------------------------------------------------------------
   DATE_sid()
   ---------------------------------------------------------------------
   Role : Retourne une chaine "Identification"
   ---------------------------------------------------------------------
   E :
   S : Pointeur de chaine ASCIIZ
   --------------------------------------------------------------------- */
   const char *DATE_sid (void);

/* ---------------------------------------------------------------------
   DATE_annee4()
   ---------------------------------------------------------------------
   Role : Conversion d'une date modulo 100 en date 4 digit
   ---------------------------------------------------------------------
   E : date charniere
   E : date sur 2 chiffres (0-99)
   S : date sur 4 chiffres (charniere - charniere+99)
   --------------------------------------------------------------------- */
   int DATE_annee4 (int const yy, int const y2);

/* ---------------------------------------------------------------------
   DATE_is_valid()
   ---------------------------------------------------------------------
   Role : tester la validite d'une date
   ---------------------------------------------------------------------
   E : structure date (sDATE)
   S : 1=ok 0=err
   --------------------------------------------------------------------- */
   int DATE_is_valid (sDATE const *const p_date);

/* ---------------------------------------------------------------------
   DATE_jour_max()
   ---------------------------------------------------------------------
   Role : Retourne le jour max en fonction de la date courante
   ---------------------------------------------------------------------
   E : structure date (sDATE)
   S :
   --------------------------------------------------------------------- */
   int DATE_jour_max (sDATE * date);

/* ---------------------------------------------------------------------
   tm2DATE()
   ---------------------------------------------------------------------
   Role : Conversion d'une date standard C en sDATE
   ---------------------------------------------------------------------
   E : adresse de sortie (sDATE)
   E : adresse de la date d'entree (struct tm)
   S : 0=ok 1=err
   --------------------------------------------------------------------- */
   int tm2DATE (sDATE * const p_date, struct tm const *const p_tm);

/* ---------------------------------------------------------------------
   DATE2tm()
   ---------------------------------------------------------------------
   Role : Conversion d'une date sDATE en standard C
   ---------------------------------------------------------------------
   E : adresse de sortie (struct tm)
   E : adresse de la date d'entree (sDATE)
   S : 0=ok 1=err
   --------------------------------------------------------------------- */
   int DATE2tm (struct tm *const p_tm, sDATE const *const p_date);

/* ---------------------------------------------------------------------
   DATE_get()
   ---------------------------------------------------------------------
   Lecture de la date courante dans une sDATE.
   L'epoch standard (time_t) est retournee
   ---------------------------------------------------------------------
   E : adresse de la structure sDATE
   S : valeur de l'epoch (time_t)
   --------------------------------------------------------------------- */
   time_t DATE_get (sDATE * p_date);

#ifdef DATE_PRINT
/* ----------------------------------------------------------------------
   DATE_print()
   ----------------------------------------------------------------------

   ----------------------------------------------------------------------
   E: structure interne de date
   S:
   ---------------------------------------------------------------------- */
   void DATE_print (sDATE const *const p_date);
#endif



#ifdef DATE_TM
/* ---------------------------------------------------------------------
   DATE_tm_limites()
   ---------------------------------------------------------------------
   Role : tester le limites d'une date
   ---------------------------------------------------------------------
   E : structure standard date (tm)
   S : 0=OK -1=KO
   --------------------------------------------------------------------- */
   int DATE_tm_limites (struct tm const *const p_tm);

/* ---------------------------------------------------------------------
   DATE_tm_valide()
   ---------------------------------------------------------------------
   Role : tester la validite d'une date
   ---------------------------------------------------------------------
   E : structure standard date (tm)
   S : 0=OK -1=KO
   --------------------------------------------------------------------- */
   int DATE_tm_valide (struct tm const *const p_tm);

/* ---------------------------------------------------------------------
   DATE_tm_jour_max()
   ---------------------------------------------------------------------
   Role : Retourne le jour max en fonction de la date courante
   ---------------------------------------------------------------------
   E : structure standard date (tm)
   S :
   --------------------------------------------------------------------- */
   int DATE_tm_jour_max (struct tm const *const p_tm);

#if DATETIME2tm
/* ---------------------------------------------------------------------
   DATE_Date2tm()
   ---------------------------------------------------------------------
   Role : Convertir une date au format __DATE__ au format tm
   (les autres champs ne sont pas modifies)
   ---------------------------------------------------------------------
   E : chaine sur __DATE__
   E : structure standard date (tm)
   S : 0=OK -1=KO
   --------------------------------------------------------------------- */
   int DATE_Date2tm (char const *s_date, struct tm *const p_tm);

/* ---------------------------------------------------------------------
   DATE_Time2tm()
   ---------------------------------------------------------------------
   Role : Convertir une heure au format __TIME__ au format tm
   (les autres champs ne sont pas modifies)
   ---------------------------------------------------------------------
   E : chaine sur __TIME__
   E : structure standard date (tm)
   S : 0=OK -1=KO
   --------------------------------------------------------------------- */
   int DATE_Time2tm (char const *s_time, struct tm *const p_tm);
#endif                          /* DATETIME2tm */

#endif                          /* DATE_TM */

/* public data ========================================================= */

/* File generated by 'NEW.EXE' Ver 1.20 (c) ED 1998-99 */

#ifdef __cplusplus
}
#endif

#endif                          /* H_ED_DATE_20030327171623 */

/* Guards added by GUARD (c) ED 2000-2003 Feb 14 2003 Ver. 1.5 */
