
//	gg630504 hg9ieg
//	2012-11-06
//	linux.ubuntu.gcc
//	dátum

#ifndef _ggdt_
#define _ggdt_

#include "ggstd.h"

//#define DdFromDj( dj_ ) ( (dj_)-1721059L )
//#define DjFromDd( dd_ ) ( (dd_)+1721059L )

#define dmdFirst	1
#define dmdLim		32
#define dymFirst	1
#define dsZFirst	(-86400L)
#define dsZLast		86400L
#define dwLim		521774L
#define dyLim		10000
#define dywFirst	1
#define dywLim	53

#define tdh12First	1
#define tdh12Lim	13
#define tdh24Lim	24
#define thmLim		60
#define tmsLim		60
#define tsmsLim		1000

#define dyMin		0
#define dyMax		9999

enum {
dylNo,
dylYes, // szökőév
dylLim
};

enum {	// hét napja
dwdSun,	// vasárnap
dwdMon,	// hétfő
dwdTue,	// kedd
dwdWed,	// szerda
dwdThu,	// csutörtök
dwdFri,	// péntek
dwdSat,	// szombat
dwdLim
};

enum {	// hónap
dymJan = dymFirst, // január
dymFeb,	// február
dymMar,	// március
dymApr,	// április
dymMay,	// május
dymJun,	// június
dymJul,	// július
dymAug,	// augusztus
dymSep,	// szeptember
dymOct,	// október
dymNov,	// november
dymDec,	// december
dymLim
};

enum {	// napszak
tdpAm,	// délelőtt
tdpPm,	// délután
tdpLim
};

typedef signed int	DD; // nap
typedef double		DJ; // Julian-dátum
typedef double		DMJ; // módosított Julian-dátum
typedef signed char	DM; // hónap 1..12
typedef signed char	DS; // másodperc 0..59
typedef signed char	DW; // hét 0..6

typedef signed char	DC; // évszázad 21
typedef signed char	DMD; // hónapban nap 1..31
typedef signed char	DWD; // hétben nap 0..7
typedef signed short int	DYD; // évben nap 1..365
typedef unsigned char	DYL; // szökőév
typedef signed char	DYM; // évben hónap
typedef signed char	DYW; // évben hét 1..52
typedef signed int	DY; // year, év

typedef signed char	TDH; // napban óra 0..23
typedef signed char	THM; // órában perc 0..59
typedef signed char	TMS; // percben másodperc 0..59
typedef unsigned char	TDP; // napszak 0..1
typedef signed short int	TSMS; // másodpercben ezredmp 0..999

typedef struct	{
DY		dy; // év
DYM		dym; // évben hónap
DMD		dmd; // hónapban nap
}		DTD; // dátum

typedef struct	{
TDH		tdh; // napban óra
THM		thm; // órában perc
TMS		tms; // percben másodperc
}		DTT; // idő

typedef struct 	{
DTD		dtd; // dátum
DTT		dtt; // idő
}		DT;

typedef struct	{
DTD		dtd; // dátum és idő

DC		dc; // évszázad
DD		dd; // nap
DYL		dyl; // szökőév
DWD		dwd; // hétben nap
DW		wd; // hét
DYD		dyd; // évben nap
DYW		wyw; // évben hét
TDH		tdh12; // óra 12 órás módban
TDP		tdp; // napszak
DS		ds; // másodperc
}		DTF; // teljes dátum és idő

typedef struct	{
DTD		dtdMin;
DTD		dtdMax;
}		DTDMM;

typedef DT *	PDT;
typedef DTD *	PDTD;
typedef DTF *	PDTF;
typedef DTT *	PDTT;
typedef DY *	PDY;
typedef DD *	PDD;
typedef DTDMM *	PDTDMM;

#define szMaplDwd	szMaplLanDwd[ lanCur ]
#define szMaplDym	szMaplLanDym[ lanCur ]
#define szMapsDwd	szMapsLanDwd[ lanCur ]
#define szMapsDym	szMapsLanDym[ lanCur ]
#define szMapTpd	szMapLanTpd [ lanCur ]

extern DMD	dmdLenDylDym[ dylLim ][ dymLim ];
extern DWD	dwdBegin; // hét eleje
extern DYD	dydOffsDylDym[ dylLim ][ dymLim ];
extern SZ	szMapLanTpd [ lanLim ][ tdpLim ];
extern SZ	szMaplLanDwd[ lanLim ][ dwdLim ];
extern SZ	szMaplLanDym[ lanLim ][ dymLim ];
extern SZ	szMapsLanDwd[ lanLim ][ dwdLim ];
extern SZ	szMapsLanDym[ lanLim ][ dymLim ];
extern TDH	tdhMapTdh[ tdh24Lim ];
extern TDP	tdpMapTdh[ tdh24Lim ];

#define dsLocFromOs ((dsLocFromUtc)+(dsUtcFormOs))

DD	DdFromPdtd( PDTD );
DD	DdFromPdt( PDT );
DJ	DjFromPdt( PDT );
DMJ	DmjFromPdt( PDT );
DS	DsFromPdt( PDT );
DS	DsFromPdtt( PDTT );
DS	DsSubPdtPdt( PDT, PDT );
DWD	DwdFromDd( DD );
DWD	DwdFromPdtd( PDTD );
DWD	DwdFromPdt( PDT );
DYD	DydFromPdtd( PDTD );
DYD	DydFromPdt( PDT );
DYL	DylFromDy( DY );
DYW	DywFromLanDd( LAN, DD );
DYW	DywFromLanPdtd( LAN, PDTD );
DYW	DywFromLanPdt( LAN, PDT );
F	FDayLightPdt( PDT );
F	FNoWorkPdtd( PDTD );
PDTD	PdtdAddDPdtdW( PDTD, W );
PDTD	PdtdAddMPdtdW( PDTD, W );
PDTD	PdtdAddYPdtdW( PDTD, W );
PDTD	PdtdFromPdtdDd( PDTD, DD );
PDTD	PdtdOsUTCPdtd( PDTD );
PDT	PdtAddPdtDs( PDT, DS );
PDT	PdtAdjPdtPdt( PDT, PDT );
PDT	PdtOsUTCPdt( PDT );
PDTT	PdttFromPdttDs( PDTT, DS );
PDTT	PdttOsUTCPdtt( PDTT );
R	RChkPdtd( PDTD );
R	RChkPdt( PDT );
R	RChkPdtt( PDTT );
SZ	SzOsUTCSzSzSzSz( SZ, SZ, SZ, SZ );	// eeee0hh0nn1oo2pp2mm	>=20
SZ	SzSzPdtdSz( SZ, PDTD, SZ );		// eeee0hh0mm		>=11
SZ	SzSzPdtSzSzSz( SZ, PDT, SZ, SZ, SZ );	// eeee0hh0nn1oo2pp2mm	>=20
SZ	SzSzPdttSz( SZ, PDTT, SZ );		// oo0pp0mm		>=9
V	VAdjDtZoneV( V );
W	WSignPdtdmmPdtd( PDTDMM, PDTD );
W	WSignPdtdPdtd( PDTD, PDTD );
W	WSignPdtPdt( PDT, PDT );
W	WSignPdttPdtt( PDTT, PDTT );


#define dd_001 366L
#define dd_002 731L
#define dd_003 1096L
#define dd_004 1461L
#define dd_004_1 1460L
#define dd_100 36525L
#define dd_200 73049L
#define dd_300 109573L
#define dd_400 146097L

//#define BFromBcd( b ) (10*( (b)>>4 ) + ( (b)&0xF ))

V	VPdyPddDdDdDd( PDY, PDD, DD, DD, DD );
DYW	DywFromDdDd( DD, DD );

#endif

