Added PGTYPEStimestamp_add_interval written by Dave Cramer.

Fixed parsing of defines to make sure they used more than once.
This commit is contained in:
Michael Meskes 2004-12-23 10:46:10 +00:00
parent f8ffb60492
commit f0299325e4
4 changed files with 92 additions and 6 deletions

View File

@ -305,5 +305,6 @@ extern char *pgtypes_date_weekdays_short[];
extern char *pgtypes_date_months[];
extern char *months[];
extern char *days[];
extern int day_tab[2][13];
#endif /* DT_H */

View File

@ -8,7 +8,7 @@
#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}};

View File

@ -12,6 +12,7 @@
#include "pgtypes_timestamp.h"
#include "pgtypes_date.h"
int PGTYPEStimestamp_defmt_scan(char **, char *, timestamp *, int *, int *, int *,
int *, int *, int *, int *);
@ -844,3 +845,87 @@ PGTYPEStimestamp_defmt_asc(char *str, char *fmt, timestamp *d)
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 );
}

View File

@ -12,7 +12,7 @@
*
*
* 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 $
*
*-------------------------------------------------------------------------
*/
@ -611,9 +611,9 @@ cppline {space}*#(.*\\{space})+.*
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;
@ -712,9 +712,9 @@ cppline {space}*#(.*\\{space})+.*
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;