*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: builtins.h,v 1.11 1997/03/12 21:28:14 scrappy Exp $
+ * $Id: builtins.h,v 1.12 1997/03/14 23:33:18 scrappy Exp $
*
* NOTES
* This should normally only be included by fmgr.h.
#define BUILTINS_H
#include <storage/itemptr.h>
-#include <utils/geo-decls.h>
+#include <utils/geo_decls.h>
#include <utils/datetime.h>
#include <utils/nabstime.h>
#include <utils/rel.h>
* Defined in adt/
*/
/* bool.c */
-extern int32 boolin(char *b);
+extern bool boolin(char *b);
extern char *boolout(long b);
-extern int32 booleq(int8 arg1, int8 arg2);
-extern int32 boolne(int8 arg1, int8 arg2);
+extern bool booleq(int8 arg1, int8 arg2);
+extern bool boolne(int8 arg1, int8 arg2);
/* char.c */
extern int32 charin(char *ch);
extern char *cidout(int32 c);
extern char *char16in(char *s);
extern char *char16out(char *s);
-extern int32 chareq(int8 arg1, int8 arg2);
-extern int32 charne(int8 arg1, int8 arg2);
-extern int32 charlt(int8 arg1, int8 arg2);
-extern int32 charle(int8 arg1, int8 arg2);
-extern int32 chargt(int8 arg1, int8 arg2);
-extern int32 charge(int8 arg1, int8 arg2);
+extern bool chareq(int8 arg1, int8 arg2);
+extern bool charne(int8 arg1, int8 arg2);
+extern bool charlt(int8 arg1, int8 arg2);
+extern bool charle(int8 arg1, int8 arg2);
+extern bool chargt(int8 arg1, int8 arg2);
+extern bool charge(int8 arg1, int8 arg2);
extern int8 charpl(int8 arg1, int8 arg2);
extern int8 charmi(int8 arg1, int8 arg2);
extern int8 charmul(int8 arg1, int8 arg2);
extern int8 chardiv(int8 arg1, int8 arg2);
-extern int32 cideq(int8 arg1, int8 arg2);
-extern int32 char16eq(char *arg1, char *arg2);
-extern int32 char16ne(char *arg1, char *arg2);
-extern int32 char16lt(char *arg1, char *arg2);
-extern int32 char16le(char *arg1, char *arg2);
-extern int32 char16gt(char *arg1, char *arg2);
-extern int32 char16ge(char *arg1, char *arg2);
+extern bool cideq(int8 arg1, int8 arg2);
+extern bool char16eq(char *arg1, char *arg2);
+extern bool char16ne(char *arg1, char *arg2);
+extern bool char16lt(char *arg1, char *arg2);
+extern bool char16le(char *arg1, char *arg2);
+extern bool char16gt(char *arg1, char *arg2);
+extern bool char16ge(char *arg1, char *arg2);
extern uint16 char2in(char *s);
extern char *char2out(uint16 s);
-extern int32 char2eq(uint16 a, uint16 b);
-extern int32 char2ne(uint16 a, uint16 b);
-extern int32 char2lt(uint16 a, uint16 b);
-extern int32 char2le(uint16 a, uint16 b);
-extern int32 char2gt(uint16 a, uint16 b);
-extern int32 char2ge(uint16 a, uint16 b);
+extern bool char2eq(uint16 a, uint16 b);
+extern bool char2ne(uint16 a, uint16 b);
+extern bool char2lt(uint16 a, uint16 b);
+extern bool char2le(uint16 a, uint16 b);
+extern bool char2gt(uint16 a, uint16 b);
+extern bool char2ge(uint16 a, uint16 b);
extern int32 char2cmp(uint16 a, uint16 b);
extern uint32 char4in(char *s);
extern char *char4out(uint32 s);
-extern int32 char4eq(uint32 a, uint32 b);
-extern int32 char4ne(uint32 a, uint32 b);
-extern int32 char4lt(uint32 a, uint32 b);
-extern int32 char4le(uint32 a, uint32 b);
-extern int32 char4gt(uint32 a, uint32 b);
-extern int32 char4ge(uint32 a, uint32 b);
+extern bool char4eq(uint32 a, uint32 b);
+extern bool char4ne(uint32 a, uint32 b);
+extern bool char4lt(uint32 a, uint32 b);
+extern bool char4le(uint32 a, uint32 b);
+extern bool char4gt(uint32 a, uint32 b);
+extern bool char4ge(uint32 a, uint32 b);
extern int32 char4cmp(uint32 a, uint32 b);
extern char *char8in(char *s);
extern char *char8out(char *s);
-extern int32 char8eq(char *arg1, char *arg2);
-extern int32 char8ne(char *arg1, char *arg2);
-extern int32 char8lt(char *arg1, char *arg2);
-extern int32 char8le(char *arg1, char *arg2);
-extern int32 char8gt(char *arg1, char *arg2);
-extern int32 char8ge(char *arg1, char *arg2);
+extern bool char8eq(char *arg1, char *arg2);
+extern bool char8ne(char *arg1, char *arg2);
+extern bool char8lt(char *arg1, char *arg2);
+extern bool char8le(char *arg1, char *arg2);
+extern bool char8gt(char *arg1, char *arg2);
+extern bool char8ge(char *arg1, char *arg2);
extern int32 char8cmp(char *arg1, char *arg2);
/* int.c */
extern char *int4out(int32 l);
extern int32 i2toi4(int16 arg1);
extern int16 i4toi2(int32 arg1);
-extern int32 int4eq(int32 arg1, int32 arg2);
-extern int32 int4ne(int32 arg1, int32 arg2);
-extern int32 int4lt(int32 arg1, int32 arg2);
-extern int32 int4le(int32 arg1, int32 arg2);
-extern int32 int4gt(int32 arg1, int32 arg2);
-extern int32 int4ge(int32 arg1, int32 arg2);
-extern int32 int2eq(int16 arg1, int16 arg2);
-extern int32 int2ne(int16 arg1, int16 arg2);
-extern int32 int2lt(int16 arg1, int16 arg2);
-extern int32 int2le(int16 arg1, int16 arg2);
-extern int32 int2gt(int16 arg1, int16 arg2);
-extern int32 int2ge(int16 arg1, int16 arg2);
-extern int32 int24eq(int32 arg1, int32 arg2);
-extern int32 int24ne(int32 arg1, int32 arg2);
-extern int32 int24lt(int32 arg1, int32 arg2);
-extern int32 int24le(int32 arg1, int32 arg2);
-extern int32 int24gt(int32 arg1, int32 arg2);
-extern int32 int24ge(int32 arg1, int32 arg2);
-extern int32 int42eq(int32 arg1, int32 arg2);
-extern int32 int42ne(int32 arg1, int32 arg2);
-extern int32 int42lt(int32 arg1, int32 arg2);
-extern int32 int42le(int32 arg1, int32 arg2);
-extern int32 int42gt(int32 arg1, int32 arg2);
-extern int32 int42ge(int32 arg1, int32 arg2);
-extern int32 keyfirsteq(int16 *arg1, int16 arg2);
+extern bool int4eq(int32 arg1, int32 arg2);
+extern bool int4ne(int32 arg1, int32 arg2);
+extern bool int4lt(int32 arg1, int32 arg2);
+extern bool int4le(int32 arg1, int32 arg2);
+extern bool int4gt(int32 arg1, int32 arg2);
+extern bool int4ge(int32 arg1, int32 arg2);
+extern bool int2eq(int16 arg1, int16 arg2);
+extern bool int2ne(int16 arg1, int16 arg2);
+extern bool int2lt(int16 arg1, int16 arg2);
+extern bool int2le(int16 arg1, int16 arg2);
+extern bool int2gt(int16 arg1, int16 arg2);
+extern bool int2ge(int16 arg1, int16 arg2);
+extern bool int24eq(int32 arg1, int32 arg2);
+extern bool int24ne(int32 arg1, int32 arg2);
+extern bool int24lt(int32 arg1, int32 arg2);
+extern bool int24le(int32 arg1, int32 arg2);
+extern bool int24gt(int32 arg1, int32 arg2);
+extern bool int24ge(int32 arg1, int32 arg2);
+extern bool int42eq(int32 arg1, int32 arg2);
+extern bool int42ne(int32 arg1, int32 arg2);
+extern bool int42lt(int32 arg1, int32 arg2);
+extern bool int42le(int32 arg1, int32 arg2);
+extern bool int42gt(int32 arg1, int32 arg2);
+extern bool int42ge(int32 arg1, int32 arg2);
+extern bool keyfirsteq(int16 *arg1, int16 arg2);
extern int32 int4um(int32 arg);
extern int32 int4pl(int32 arg1, int32 arg2);
extern int32 int4mi(int32 arg1, int32 arg2);
/* name.c */
extern NameData *namein(char *s);
extern char *nameout(NameData *s);
-extern int32 nameeq(NameData *arg1, NameData *arg2);
-extern int32 namene(NameData *arg1, NameData *arg2);
-extern int32 namelt(NameData *arg1, NameData *arg2);
-extern int32 namele(NameData *arg1, NameData *arg2);
-extern int32 namegt(NameData *arg1, NameData *arg2);
-extern int32 namege(NameData *arg1, NameData *arg2);
+extern bool nameeq(NameData *arg1, NameData *arg2);
+extern bool namene(NameData *arg1, NameData *arg2);
+extern bool namelt(NameData *arg1, NameData *arg2);
+extern bool namele(NameData *arg1, NameData *arg2);
+extern bool namegt(NameData *arg1, NameData *arg2);
+extern bool namege(NameData *arg1, NameData *arg2);
extern int namecmp(Name n1, Name n2);
extern int namecpy(Name n1, Name n2);
extern int namecat(Name n1, Name n2);
* Per-opclass comparison functions for new btrees. These are
* stored in pg_amproc and defined in nbtree/
*/
-extern int32 btint2cmp(int16 a, int16 b);
-extern int32 btint4cmp(int32 a, int32 b);
-extern int32 btint24cmp(int16 a, int32 b);
-extern int32 btint42cmp(int32 a, int16 b);
-extern int32 btfloat4cmp(float32 a, float32 b);
-extern int32 btfloat8cmp(float64 a, float64 b);
-extern int32 btoidcmp(Oid a, Oid b);
-extern int32 btabstimecmp(AbsoluteTime a, AbsoluteTime b);
-extern int32 btcharcmp(char a, char b);
-extern int32 btchar2cmp(uint16 a, uint16 b);
-extern int32 btchar4cmp(uint32 a, uint32 b);
-extern int32 btchar8cmp(char *a, char *b);
-extern int32 btchar16cmp(char *a, char *b);
-extern int32 btnamecmp(NameData *a, NameData *b);
-extern int32 bttextcmp(struct varlena *a, struct varlena *b);
+extern int32 btint2cmp(int16 a, int16 b);
+extern int32 btint4cmp(int32 a, int32 b);
+extern int32 btint24cmp(int16 a, int32 b);
+extern int32 btint42cmp(int32 a, int16 b);
+extern int32 btfloat4cmp(float32 a, float32 b);
+extern int32 btfloat8cmp(float64 a, float64 b);
+extern int32 btoidcmp(Oid a, Oid b);
+extern int32 btabstimecmp(AbsoluteTime a, AbsoluteTime b);
+extern int32 btcharcmp(char a, char b);
+extern int32 btchar2cmp(uint16 a, uint16 b);
+extern int32 btchar4cmp(uint32 a, uint32 b);
+extern int32 btchar8cmp(char *a, char *b);
+extern int32 btchar16cmp(char *a, char *b);
+extern int32 btnamecmp(NameData *a, NameData *b);
+extern int32 bttextcmp(struct varlena *a, struct varlena *b);
/* support routines for the rtree access method, by opclass */
-extern BOX *rt_box_union(BOX *a,BOX *b);
-extern BOX *rt_box_inter(BOX *a, BOX *b);
-extern void rt_box_size(BOX *a, float *size);
-extern void rt_bigbox_size(BOX *a,float *size);
-extern void rt_poly_size(POLYGON *a, float *size);
+extern BOX *rt_box_union(BOX *a,BOX *b);
+extern BOX *rt_box_inter(BOX *a, BOX *b);
+extern void rt_box_size(BOX *a, float *size);
+extern void rt_bigbox_size(BOX *a,float *size);
+extern void rt_poly_size(POLYGON *a, float *size);
extern POLYGON *rt_poly_union(POLYGON *a, POLYGON *b);
extern POLYGON *rt_poly_inter(POLYGON *a, POLYGON *b);
extern int ininterval(AbsoluteTime t, TimeInterval interval);
extern RelativeTime intervalrel(TimeInterval interval);
extern AbsoluteTime timenow(void);
-extern int32 reltimeeq(RelativeTime t1, RelativeTime t2);
-extern int32 reltimene(RelativeTime t1, RelativeTime t2);
-extern int32 reltimelt(RelativeTime t1, RelativeTime t2);
-extern int32 reltimegt(RelativeTime t1, RelativeTime t2);
-extern int32 reltimele(RelativeTime t1, RelativeTime t2);
-extern int32 reltimege(RelativeTime t1, RelativeTime t2);
-extern int32 intervaleq(TimeInterval i1, TimeInterval i2);
-extern int32 intervalleneq(TimeInterval i, RelativeTime t);
-extern int32 intervallenne(TimeInterval i, RelativeTime t);
-extern int32 intervallenlt(TimeInterval i, RelativeTime t);
-extern int32 intervallengt(TimeInterval i, RelativeTime t);
-extern int32 intervallenle(TimeInterval i, RelativeTime t);
-extern int32 intervallenge(TimeInterval i, RelativeTime t);
-extern int32 intervalct(TimeInterval i1, TimeInterval i2);
-extern int32 intervalov(TimeInterval i1, TimeInterval i2);
+extern bool reltimeeq(RelativeTime t1, RelativeTime t2);
+extern bool reltimene(RelativeTime t1, RelativeTime t2);
+extern bool reltimelt(RelativeTime t1, RelativeTime t2);
+extern bool reltimegt(RelativeTime t1, RelativeTime t2);
+extern bool reltimele(RelativeTime t1, RelativeTime t2);
+extern bool reltimege(RelativeTime t1, RelativeTime t2);
+extern bool intervaleq(TimeInterval i1, TimeInterval i2);
+extern bool intervalleneq(TimeInterval i, RelativeTime t);
+extern bool intervallenne(TimeInterval i, RelativeTime t);
+extern bool intervallenlt(TimeInterval i, RelativeTime t);
+extern bool intervallengt(TimeInterval i, RelativeTime t);
+extern bool intervallenle(TimeInterval i, RelativeTime t);
+extern bool intervallenge(TimeInterval i, RelativeTime t);
+extern bool intervalct(TimeInterval i1, TimeInterval i2);
+extern bool intervalov(TimeInterval i1, TimeInterval i2);
extern AbsoluteTime intervalstart(TimeInterval i);
extern AbsoluteTime intervalend(TimeInterval i);
extern int isreltime(char *timestring, int *sign, long *quantity, int *unitnr);
extern text *timeofday(void);
/* dt.c */
-extern int32 dtin(char *datetime);
-extern char *dtout(int32 datetime);
+extern DateTime *datetime_in(char *str);
+extern char *datetime_out(DateTime *datetime);
+extern TimeSpan *timespan_in(char *str);
+extern char *timespan_out(TimeSpan *timespan);
/* filename.c */
extern char *filename_in(char *file);
extern long float84gt(float64 arg1, float32 arg2);
extern long float84ge(float64 arg1, float32 arg2);
-/* geo-ops.c, geo-selfuncs.c */
+/* geo_ops.c, geo_selfuncs.c */
/* misc.c */
extern bool NullValue(Datum value, bool *isNull);
extern char *oid8out(Oid (*oidArray)[]);
extern Oid oidin(char *s);
extern char *oidout(Oid o);
-extern int32 oideq(Oid arg1, Oid arg2);
-extern int32 oidne(Oid arg1, Oid arg2);
-extern int32 oid8eq(Oid arg1[], Oid arg2[]);
+extern bool oideq(Oid arg1, Oid arg2);
+extern bool oidne(Oid arg1, Oid arg2);
+extern bool oid8eq(Oid arg1[], Oid arg2[]);
extern bool oideqint4(Oid arg1, int32 arg2);
extern bool int4eqoid(int32 arg1, Oid arg2);
extern char *bpcharout(char *s);
extern char *varcharin(char *s, int dummy, int typlen);
extern char *varcharout(char *s);
-extern int32 bpchareq(char *arg1, char *arg2);
-extern int32 bpcharne(char *arg1, char *arg2);
-extern int32 bpcharlt(char *arg1, char *arg2);
-extern int32 bpcharle(char *arg1, char *arg2);
-extern int32 bpchargt(char *arg1, char *arg2);
-extern int32 bpcharge(char *arg1, char *arg2);
+extern bool bpchareq(char *arg1, char *arg2);
+extern bool bpcharne(char *arg1, char *arg2);
+extern bool bpcharlt(char *arg1, char *arg2);
+extern bool bpcharle(char *arg1, char *arg2);
+extern bool bpchargt(char *arg1, char *arg2);
+extern bool bpcharge(char *arg1, char *arg2);
extern int32 bpcharcmp(char *arg1, char *arg2);
-extern int32 varchareq(char *arg1, char *arg2);
-extern int32 varcharne(char *arg1, char *arg2);
-extern int32 varcharlt(char *arg1, char *arg2);
-extern int32 varcharle(char *arg1, char *arg2);
-extern int32 varchargt(char *arg1, char *arg2);
-extern int32 varcharge(char *arg1, char *arg2);
+extern bool varchareq(char *arg1, char *arg2);
+extern bool varcharne(char *arg1, char *arg2);
+extern bool varcharlt(char *arg1, char *arg2);
+extern bool varcharle(char *arg1, char *arg2);
+extern bool varchargt(char *arg1, char *arg2);
+extern bool varcharge(char *arg1, char *arg2);
extern int32 varcharcmp(char *arg1, char *arg2);
extern uint32 hashbpchar(struct varlena *key);
extern uint32 hashvarchar(struct varlena *key);
extern char *textout(struct varlena *vlena);
extern int textlen (text* t);
extern text *textcat(text* t1, text* t2);
-extern int32 texteq(struct varlena *arg1, struct varlena *arg2);
-extern int32 textne(struct varlena *arg1, struct varlena *arg2);
-extern int32 text_lt(struct varlena *arg1, struct varlena *arg2);
-extern int32 text_le(struct varlena *arg1, struct varlena *arg2);
-extern int32 text_gt(struct varlena *arg1, struct varlena *arg2);
-extern int32 text_ge(struct varlena *arg1, struct varlena *arg2);
+extern bool texteq(struct varlena *arg1, struct varlena *arg2);
+extern bool textne(struct varlena *arg1, struct varlena *arg2);
+extern bool text_lt(struct varlena *arg1, struct varlena *arg2);
+extern bool text_le(struct varlena *arg1, struct varlena *arg2);
+extern bool text_gt(struct varlena *arg1, struct varlena *arg2);
+extern bool text_ge(struct varlena *arg1, struct varlena *arg2);
extern int32 byteaGetSize(struct varlena *v);
extern int32 byteaGetByte(struct varlena *v, int32 n);
extern int32 byteaGetBit(struct varlena *v, int32 n);
extern struct varlena *byteaSetByte(struct varlena *v, int32 n, int32 newByte);
extern struct varlena *byteaSetBit(struct varlena *v, int32 n, int32 newBit);
-/* datetimes.c */
+/* datetime.c */
+#if USE_NEW_DATE
+
+extern DateADT date_in(char *datestr);
+extern char *date_out(DateADT dateVal);
+extern bool date_eq(DateADT dateVal1, DateADT dateVal2);
+extern bool date_ne(DateADT dateVal1, DateADT dateVal2);
+extern bool date_lt(DateADT dateVal1, DateADT dateVal2);
+extern bool date_le(DateADT dateVal1, DateADT dateVal2);
+extern bool date_gt(DateADT dateVal1, DateADT dateVal2);
+extern bool date_ge(DateADT dateVal1, DateADT dateVal2);
+extern int date_cmp(DateADT dateVal1, DateADT dateVal2);
+extern DateADT date_larger(DateADT dateVal1, DateADT dateVal2);
+extern DateADT date_smaller(DateADT dateVal1, DateADT dateVal2);
+extern int32 date_mi(DateADT dateVal1, DateADT dateVal2);
+extern DateADT date_pli(DateADT dateVal, int32 days);
+extern DateADT date_mii(DateADT dateVal, int32 days);
+
+#else
+
extern int4 date_in(char *datestr);
extern char *date_out(int4 dateVal);
-extern int date_eq(int4 dateVal1, int4 dateVal2);
-extern int date_ne(int4 dateVal1, int4 dateVal2);
-extern int date_lt(int4 dateVal1, int4 dateVal2);
-extern int date_le(int4 dateVal1, int4 dateVal2);
-extern int date_gt(int4 dateVal1, int4 dateVal2);
-extern int date_ge(int4 dateVal1, int4 dateVal2);
+extern bool date_eq(int4 dateVal1, int4 dateVal2);
+extern bool date_ne(int4 dateVal1, int4 dateVal2);
+extern bool date_lt(int4 dateVal1, int4 dateVal2);
+extern bool date_le(int4 dateVal1, int4 dateVal2);
+extern bool date_gt(int4 dateVal1, int4 dateVal2);
+extern bool date_ge(int4 dateVal1, int4 dateVal2);
extern int date_cmp(int4 dateVal1, int4 dateVal2);
extern int4 date_larger(int4 dateVal1, int4 dateVal2);
extern int4 date_smaller(int4 dateVal1, int4 dateVal2);
extern int32 date_mi(int4 dateVal1, int4 dateVal2);
extern int4 date_pli(int4 dateVal, int32 days);
extern int4 date_mii(int4 dateVal, int32 days);
-extern char *time_in(char *timestr);
+
+#endif
+
+extern TimeADT *time_in(char *timestr);
extern char *time_out(TimeADT *time);
-extern int time_eq(TimeADT *time1, TimeADT *time2);
-extern int time_ne(TimeADT *time1, TimeADT *time2);
-extern int time_lt(TimeADT *time1, TimeADT *time2);
-extern int time_le(TimeADT *time1, TimeADT *time2);
-extern int time_gt(TimeADT *time1, TimeADT *time2);
-extern int time_ge(TimeADT *time1, TimeADT *time2);
+extern bool time_eq(TimeADT *time1, TimeADT *time2);
+extern bool time_ne(TimeADT *time1, TimeADT *time2);
+extern bool time_lt(TimeADT *time1, TimeADT *time2);
+extern bool time_le(TimeADT *time1, TimeADT *time2);
+extern bool time_gt(TimeADT *time1, TimeADT *time2);
+extern bool time_ge(TimeADT *time1, TimeADT *time2);
extern int time_cmp(TimeADT *time1, TimeADT *time2);
extern int32 int42reltime(int32 timevalue);
--- /dev/null
+/*-------------------------------------------------------------------------
+ *
+ * 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: dt.h,v 1.1 1997/03/14 23:33:23 scrappy Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef DT_H
+#define DT_H
+
+#include <time.h>
+
+/*
+ * DateTime represents absolute time.
+ * TimeSpan represents delta time.
+ * Note that Postgres uses "time interval" to mean a bounded interval,
+ * consisting of a beginning and ending time, not a time span.
+ */
+
+typedef double DateTime;
+
+typedef struct {
+ double time; /* all time units other than months and years */
+ int4 month; /* months and years */
+} TimeSpan;
+
+
+#define USE_NEW_TIME_CODE 1
+#define USE_NEW_DATE 0
+#define USE_NEW_TIME 0
+
+/* ----------------------------------------------------------------
+ * 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 DYEAR "year"
+#define DDECADE "decade"
+#define DCENTURY "century"
+#define DMILLENIUM "millenium"
+#define DA_D "ad"
+#define DB_C "bc"
+
+/*
+ * 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 TIME 4
+#define TZ 5
+#define DTZ 6
+#define IGNORE 7
+#define AMPM 8
+#define HOUR 9
+#define MINUTE 10
+#define SECOND 11
+#define DOY 12
+#define DOW 13
+#define UNITS 14
+#define ADBC 15
+/* these are only for relative dates */
+#define ABS_BEFORE 14
+#define ABS_AFTER 15
+#define AGO 16
+
+/*
+ * 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].
+ */
+#define DTK_NUMBER 0
+#define DTK_STRING 1
+
+#define DTK_DATETIME 2
+#define DTK_DATE 3
+#define DTK_TIME 4
+#define DTK_TZ 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 32
+#define DTK_SECOND 33
+#define DTK_MINUTE 34
+#define DTK_HOUR 35
+#define DTK_DAY 36
+#define DTK_WEEK 37
+#define DTK_MONTH 38
+#define DTK_YEAR 39
+#define DTK_DECADE 40
+#define DTK_CENTURY 41
+#define DTK_MILLENIUM 42
+#define DTK_MILLISEC 43
+#define DTK_MICROSEC 44
+#define DTK_AGO 45
+
+/*
+ * 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;
+
+
+extern int EuroDates;
+extern void GetCurrentTime(struct tm *tm);
+
+/*
+ * dt.c prototypes
+ */
+extern DateTime *datetime_in( char *str);
+extern char *datetime_out( DateTime *dt);
+extern TimeSpan *timespan_in(char *str);
+extern char *timespan_out(TimeSpan *span);
+
+extern TimeSpan *datetime_sub(DateTime *dt1, DateTime *dt2);
+extern DateTime *datetime_add_span(DateTime *dt, TimeSpan *span);
+extern DateTime *datetime_sub_span(DateTime *dt, TimeSpan *span);
+extern TimeSpan *timespan_add(TimeSpan *span1, TimeSpan *span2);
+extern TimeSpan *timespan_sub(TimeSpan *span1, TimeSpan *span2);
+
+extern DateTime dt2local( DateTime dt, int timezone);
+
+extern void j2date( int jd, int *year, int *month, int *day);
+extern int date2j( int year, int month, int day);
+extern int j2day( int jd);
+
+extern double time2t(const int hour, const int min, const double sec);
+extern void dt2time(DateTime dt, int *hour, int *min, double *sec);
+
+/*
+extern void GetCurrentTime(struct tm *tm);
+*/
+extern int ParseDateTime( char *timestr, char *lowstr,
+ char *field[], int ftype[], int maxfields, int *numfields);
+
+extern int DecodeDateTime( char *field[], int ftype[],
+ int nf, int *dtype, struct tm *tm, double *fsec, int *tzp);
+extern int DecodeDate(char *str, int fmask, int *tmask, struct tm *tm);
+extern int DecodeNumber( int flen, char *field,
+ int fmask, int *tmask, struct tm *tm, double *fsec);
+extern int DecodeNumberField( int len, char *str,
+ int fmask, int *tmask, struct tm *tm, double *fsec);
+extern int DecodeTime(char *str,
+ int fmask, int *tmask, struct tm *tm, double *fsec);
+extern int DecodeTimeOnly( char *field[], int ftype[], int nf,
+ int *dtype, struct tm *tm, double *fsec);
+extern int DecodeTimezone( char *str, int *tzp);
+extern int DecodeSpecial(int field, char *lowtoken, int *val);
+
+extern int DecodeDateDelta( char *field[], int ftype[],
+ int nf, int *dtype, struct tm *tm, double *fsec);
+extern int DecodeUnits(int field, char *lowtoken, int *val);
+
+extern int EncodeSpecialDateTime(DateTime *dt, char *str);
+extern int EncodePostgresDate(struct tm *tm, double fsec, char *str);
+extern int EncodePostgresSpan(struct tm *tm, double fsec, char *str);
+
+
+extern datetkn *datebsearch(char *key, datetkn *base, unsigned int nel);
+
+#endif /* DT_H */