#include "dt.h"
#include "pgtypes_timestamp.h"
-static int day_tab[2][13] = {
+int day_tab[2][13] = {
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 0},
{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 0}};
#include "pgtypes_timestamp.h"
#include "pgtypes_date.h"
+
int PGTYPEStimestamp_defmt_scan(char **, char *, timestamp *, int *, int *, int *,
int *, int *, int *, int *);
free(mfmt);
return i;
}
+
+/*
+* add an interval to a time stamp
+*
+* *tout = tin + span
+*
+* returns 0 if successful
+* returns -1 if it fails
+*
+*/
+
+int
+PGTYPEStimestamp_add_interval(timestamp *tin, interval *span, timestamp *tout)
+{
+
+
+ if (TIMESTAMP_NOT_FINITE(*tin))
+ *tout = *tin;
+
+
+ else
+ {
+ if (span->month != 0)
+ {
+ struct tm tt,
+ *tm = &tt;
+ fsec_t fsec;
+
+
+ if (timestamp2tm(*tin, NULL, tm, &fsec, NULL) !=0)
+ return -1;
+ tm->tm_mon += span->month;
+ if (tm->tm_mon > 12)
+ {
+ tm->tm_year += ((tm->tm_mon - 1) / 12);
+ tm->tm_mon = (((tm->tm_mon - 1) % 12) + 1);
+ }
+ else if (tm->tm_mon < 1)
+ {
+ tm->tm_year += ((tm->tm_mon / 12) - 1);
+ tm->tm_mon = ((tm->tm_mon % 12) + 12);
+ }
+
+
+ /* adjust for end of month boundary problems... */
+ if (tm->tm_mday > day_tab[isleap(tm->tm_year)][tm->tm_mon - 1])
+ tm->tm_mday = (day_tab[isleap(tm->tm_year)][tm->tm_mon - 1]);
+
+
+ if (tm2timestamp(tm, fsec, NULL, tin) !=0)
+ return -1;
+ }
+
+
+ *tin +=span->time;
+ *tout = *tin;
+ }
+ return 0;
+
+}
+
+
+/*
+* subtract an interval from a time stamp
+*
+* *tout = tin - span
+*
+* returns 0 if successful
+* returns -1 if it fails
+*
+*/
+
+int
+PGTYPEStimestamp_sub_interval(timestamp *tin, interval *span, timestamp *tout)
+{
+ interval tspan;
+
+ tspan.month = -span->month;
+ tspan.time = -span->time;
+
+
+ return PGTYPEStimestamp_add_interval(tin, &tspan, tout );
+}
+
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.132 2004/08/29 04:13:11 momjian Exp $
+ * $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.133 2004/12/23 10:46:10 meskes Exp $
*
*-------------------------------------------------------------------------
*/
yb->buffer = YY_CURRENT_BUFFER;
yb->lineno = yylineno;
yb->filename = mm_strdup(input_filename);
- ptr->used = yb->next = yy_buffer;
+ yb->next = yy_buffer;
- yy_buffer = yb;
+ ptr->used = yy_buffer = yb;
yy_scan_string(ptr->new);
break;
yb->buffer = YY_CURRENT_BUFFER;
yb->lineno = yylineno;
yb->filename = mm_strdup(input_filename);
- ptr->used = yb->next = yy_buffer;
+ yb->next = yy_buffer;
- yy_buffer = yb;
+ ptr->used = yy_buffer = yb;
yy_scan_string(ptr->new);
break;