| /* | 
 | PostgreSQL Data Base Management System (formerly known as Postgres, then | 
 | as Postgres95). | 
 |  | 
 | Copyright (c) 1994-7 Regents of the University of California | 
 |  | 
 | Permission to use, copy, modify, and distribute this software and its | 
 | documentation for any purpose, without fee, and without a written agreement | 
 | is hereby granted, provided that the above copyright notice and this | 
 | paragraph and the following two paragraphs appear in all copies. | 
 |  | 
 | IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR | 
 | DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING | 
 | LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS | 
 | DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE | 
 | POSSIBILITY OF SUCH DAMAGE. | 
 |  | 
 | THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, | 
 | INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY | 
 | AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS | 
 | ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO | 
 | PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. | 
 | */ | 
 | /*------------------------------------------------------------------------- | 
 |  * | 
 |  * dt.h-- | 
 |  *	  Definitions for the date/time and other date/time support code. | 
 |  *	  The support code is shared with other date data types, | 
 |  *	   including abstime, reltime, date, and time. | 
 |  * | 
 |  * | 
 |  * Copyright (c) 1994, Regents of the University of California | 
 |  * | 
 |  * $Id$ | 
 |  * | 
 |  *------------------------------------------------------------------------- | 
 |  */ | 
 | #ifndef DT_H | 
 | #define DT_H | 
 |  | 
 | #include <time.h> | 
 | #include <math.h> | 
 |  | 
 | /* We have to include stdlib.h here because it defines many of these macros | 
 |    on some platforms, and we only want our definitions used if stdlib.h doesn't | 
 |    have its own. | 
 | */ | 
 |  | 
 | #include <stdlib.h> | 
 |  | 
 | /* ---------------------------------------------------------------- | 
 |  *				Section 1:	bool, true, false, TRUE, FALSE | 
 |  * ---------------------------------------------------------------- | 
 |  */ | 
 | /* | 
 |  * bool -- | 
 |  *		Boolean value, either true or false. | 
 |  * | 
 |  */ | 
 | #define false	((char) 0) | 
 | #define true	((char) 1) | 
 | #ifndef __cplusplus | 
 | #ifndef bool | 
 | typedef char bool; | 
 | #endif   /* ndef bool */ | 
 | #endif	 /* not C++ */ | 
 | typedef bool *BoolPtr; | 
 |  | 
 | #ifndef TRUE | 
 | #define TRUE	1 | 
 | #endif	 /* TRUE */ | 
 |  | 
 | #ifndef FALSE | 
 | #define FALSE	0 | 
 | #endif	 /* FALSE */ | 
 |  | 
 |  | 
 |  | 
 | /* ---------------------------------------------------------------- | 
 |  *				Section 3:	standard system types | 
 |  * ---------------------------------------------------------------- | 
 |  */ | 
 |  | 
 | /* | 
 |  * intN -- | 
 |  *		Signed integer, EXACTLY N BITS IN SIZE, | 
 |  *		used for numerical computations and the | 
 |  *		frontend/backend protocol. | 
 |  */ | 
 | typedef signed char int8;		/* == 8 bits */ | 
 | typedef signed short int16;		/* == 16 bits */ | 
 | typedef signed int int32;		/* == 32 bits */ | 
 |  | 
 | /* | 
 |  * uintN -- | 
 |  *		Unsigned integer, EXACTLY N BITS IN SIZE, | 
 |  *		used for numerical computations and the | 
 |  *		frontend/backend protocol. | 
 |  */ | 
 | typedef unsigned char uint8;	/* == 8 bits */ | 
 | typedef unsigned short uint16;	/* == 16 bits */ | 
 | typedef unsigned int uint32;	/* == 32 bits */ | 
 |  | 
 | /* | 
 |  * floatN -- | 
 |  *		Floating point number, AT LEAST N BITS IN SIZE, | 
 |  *		used for numerical computations. | 
 |  * | 
 |  *		Since sizeof(floatN) may be > sizeof(char *), always pass | 
 |  *		floatN by reference. | 
 |  */ | 
 | typedef float float32data; | 
 | typedef double float64data; | 
 | typedef float *float32; | 
 | typedef double *float64; | 
 |  | 
 | /* | 
 |  * boolN -- | 
 |  *		Boolean value, AT LEAST N BITS IN SIZE. | 
 |  */ | 
 | typedef uint8 bool8;			/* >= 8 bits */ | 
 | typedef uint16 bool16;			/* >= 16 bits */ | 
 | typedef uint32 bool32;			/* >= 32 bits */ | 
 |  | 
 |  | 
 | /* Date/Time Configuration | 
 |  * | 
 |  * Constants to pass info from runtime environment: | 
 |  *	USE_POSTGRES_DATES specifies traditional postgres format for output. | 
 |  *	USE_ISO_DATES specifies ISO-compliant format for output. | 
 |  *	USE_SQL_DATES specified Oracle/Ingres-compliant format for output. | 
 |  *	USE_GERMAN_DATES specifies German-style dd.mm/yyyy date format. | 
 |  * | 
 |  * DateStyle specifies preference for date formatting for output. | 
 |  * EuroDates if client prefers dates interpreted and written w/European conventions. | 
 |  * | 
 |  * HasCTZSet if client timezone is specified by client. | 
 |  * CDayLight is the apparent daylight savings time status. | 
 |  * CTimeZone is the timezone offset in seconds. | 
 |  * CTZName is the timezone label. | 
 |  */ | 
 |  | 
 | #define USE_POSTGRES_DATES		0 | 
 | #define USE_ISO_DATES			1 | 
 | #define USE_SQL_DATES			2 | 
 | #define USE_GERMAN_DATES		3 | 
 |  | 
 | int	DateStyle; | 
 | bool EuroDates; | 
 | int	CTimeZone; | 
 |  | 
 | typedef double float8; | 
 |  | 
 | struct varlena | 
 | { | 
 | 	int		vl_len; | 
 | 	char		vl_dat[1]; | 
 | }; | 
 |  | 
 | typedef struct varlena text; | 
 |  | 
 |  | 
 |  | 
 | typedef int AbsoluteTime; | 
 | typedef int RelativeTime; | 
 |  | 
 | /* | 
 |  * Note a leap year is one that is a multiple of 4 | 
 |  * but not of a 100.  Except if it is a multiple of | 
 |  * 400 then it is a leap year. | 
 |  */ | 
 | #define isleap(y) (((y % 4) == 0) && (((y % 100) != 0) || ((y % 400) == 0))) | 
 |  | 
 | /* | 
 |  * DateTime represents absolute time. | 
 |  * TimeSpan represents delta time. Keep track of months (and years) | 
 |  *	separately since the elapsed time spanned is unknown until instantiated | 
 |  *	relative to an absolute time. | 
 |  * | 
 |  * Note that Postgres uses "time interval" to mean a bounded interval, | 
 |  *	consisting of a beginning and ending time, not a time span - thomas 97/03/20 | 
 |  */ | 
 |  | 
 | typedef double DateTime; | 
 |  | 
 | typedef struct | 
 | { | 
 | 	double		time;			/* all time units other than months and | 
 | 								 * years */ | 
 | 	int		month;			/* months and years, after time for | 
 | 								 * alignment */ | 
 | } TimeSpan; | 
 |  | 
 |  | 
 | /* ---------------------------------------------------------------- | 
 |  *				time types + support macros | 
 |  * | 
 |  * String definitions for standard time quantities. | 
 |  * | 
 |  * These strings are the defaults used to form output time strings. | 
 |  * Other alternate forms are hardcoded into token tables in dt.c. | 
 |  * ---------------------------------------------------------------- | 
 |  */ | 
 |  | 
 | #define DAGO			"ago" | 
 | #define DCURRENT		"current" | 
 | #define EPOCH			"epoch" | 
 | #define INVALID			"invalid" | 
 | #define EARLY			"-infinity" | 
 | #define LATE			"infinity" | 
 | #define NOW				"now" | 
 | #define TODAY			"today" | 
 | #define TOMORROW		"tomorrow" | 
 | #define YESTERDAY		"yesterday" | 
 | #define ZULU			"zulu" | 
 |  | 
 | #define DMICROSEC		"usecond" | 
 | #define DMILLISEC		"msecond" | 
 | #define DSECOND			"second" | 
 | #define DMINUTE			"minute" | 
 | #define DHOUR			"hour" | 
 | #define DDAY			"day" | 
 | #define DWEEK			"week" | 
 | #define DMONTH			"month" | 
 | #define DQUARTER		"quarter" | 
 | #define DYEAR			"year" | 
 | #define DDECADE			"decade" | 
 | #define DCENTURY		"century" | 
 | #define DMILLENIUM		"millenium" | 
 | #define DA_D			"ad" | 
 | #define DB_C			"bc" | 
 | #define DTIMEZONE		"timezone" | 
 |  | 
 | /* | 
 |  * Fundamental time field definitions for parsing. | 
 |  * | 
 |  *	Meridian:  am, pm, or 24-hour style. | 
 |  *	Millenium: ad, bc | 
 |  */ | 
 |  | 
 | #define AM		0 | 
 | #define PM		1 | 
 | #define HR24	2 | 
 |  | 
 | #define AD		0 | 
 | #define BC		1 | 
 |  | 
 | /* | 
 |  * Fields for time decoding. | 
 |  * Can't have more of these than there are bits in an unsigned int | 
 |  *	since these are turned into bit masks during parsing and decoding. | 
 |  */ | 
 |  | 
 | #define RESERV	0 | 
 | #define MONTH	1 | 
 | #define YEAR	2 | 
 | #define DAY		3 | 
 | #define TIMES	4				/* not used - thomas 1997-07-14 */ | 
 | #define TZ		5 | 
 | #define DTZ		6 | 
 | #define DTZMOD	7 | 
 | #define IGNOREFIELD	8 | 
 | #define AMPM	9 | 
 | #define HOUR	10 | 
 | #define MINUTE	11 | 
 | #define SECOND	12 | 
 | #define DOY		13 | 
 | #define DOW		14 | 
 | #define UNITS	15 | 
 | #define ADBC	16 | 
 | /* these are only for relative dates */ | 
 | #define AGO		17 | 
 | #define ABS_BEFORE		18 | 
 | #define ABS_AFTER		19 | 
 |  | 
 | /* | 
 |  * Token field definitions for time parsing and decoding. | 
 |  * These need to fit into the datetkn table type. | 
 |  * At the moment, that means keep them within [-127,127]. | 
 |  * These are also used for bit masks in DecodeDateDelta() | 
 |  *	so actually restrict them to within [0,31] for now. | 
 |  * - thomas 97/06/19 | 
 |  * Not all of these fields are used for masks in DecodeDateDelta | 
 |  *	so allow some larger than 31. - thomas 1997-11-17 | 
 |  */ | 
 |  | 
 | #define DTK_NUMBER		0 | 
 | #define DTK_STRING		1 | 
 |  | 
 | #define DTK_DATE		2 | 
 | #define DTK_TIME		3 | 
 | #define DTK_TZ			4 | 
 | #define DTK_AGO			5 | 
 |  | 
 | #define DTK_SPECIAL		6 | 
 | #define DTK_INVALID		7 | 
 | #define DTK_CURRENT		8 | 
 | #define DTK_EARLY		9 | 
 | #define DTK_LATE		10 | 
 | #define DTK_EPOCH		11 | 
 | #define DTK_NOW			12 | 
 | #define DTK_YESTERDAY	13 | 
 | #define DTK_TODAY		14 | 
 | #define DTK_TOMORROW	15 | 
 | #define DTK_ZULU		16 | 
 |  | 
 | #define DTK_DELTA		17 | 
 | #define DTK_SECOND		18 | 
 | #define DTK_MINUTE		19 | 
 | #define DTK_HOUR		20 | 
 | #define DTK_DAY			21 | 
 | #define DTK_WEEK		22 | 
 | #define DTK_MONTH		23 | 
 | #define DTK_QUARTER		24 | 
 | #define DTK_YEAR		25 | 
 | #define DTK_DECADE		26 | 
 | #define DTK_CENTURY		27 | 
 | #define DTK_MILLENIUM	28 | 
 | #define DTK_MILLISEC	29 | 
 | #define DTK_MICROSEC	30 | 
 |  | 
 | #define DTK_DOW			32 | 
 | #define DTK_DOY			33 | 
 | #define DTK_TZ_HOUR		34 | 
 | #define DTK_TZ_MINUTE	35 | 
 |  | 
 | /* | 
 |  * Bit mask definitions for time parsing. | 
 |  */ | 
 |  | 
 | #define DTK_M(t)		(0x01 << (t)) | 
 |  | 
 | #define DTK_DATE_M		(DTK_M(YEAR) | DTK_M(MONTH) | DTK_M(DAY)) | 
 | #define DTK_TIME_M		(DTK_M(HOUR) | DTK_M(MINUTE) | DTK_M(SECOND)) | 
 |  | 
 | #define MAXDATELEN		47		/* maximum possible length of an input | 
 | 								 * date string */ | 
 | #define MAXDATEFIELDS	25		/* maximum possible number of fields in a | 
 | 								 * date string */ | 
 | #define TOKMAXLEN		10		/* only this many chars are stored in | 
 | 								 * datetktbl */ | 
 |  | 
 | /* keep this struct small; it gets used a lot */ | 
 | typedef struct | 
 | { | 
 | #if defined(_AIX) | 
 | 	char	   *token; | 
 | #else | 
 | 	char		token[TOKMAXLEN]; | 
 | #endif	 /* _AIX */ | 
 | 	char		type; | 
 | 	char		value;			/* this may be unsigned, alas */ | 
 | } datetkn; | 
 |  | 
 |  | 
 |  | 
 | /* | 
 |  * dt.c prototypes | 
 |  */ | 
 |  | 
 |  | 
 | void j2date(int jd, int *year, int *month, int *day); | 
 | int	date2j(int year, int month, int day); | 
 |  | 
 | int ParseDateTime(char *timestr, char *lowstr, | 
 | 			  char **field, int *ftype, int maxfields, int *numfields); | 
 | int DecodeDateTime(char **field, int *ftype, | 
 | 			 int nf, int *dtype, struct tm * tm, double *fsec, int *tzp); | 
 |  | 
 | int DecodeTimeOnly(char **field, int *ftype, int nf, | 
 | 			   int *dtype, struct tm * tm, double *fsec); | 
 |  | 
 |  | 
 | #endif	 /* DT_H */ |