Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
T
TLMSP curl
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
CYBER - Cyber Security
TS 103 523 MSP
TLMSP
TLMSP curl
Commits
ae837551
Commit
ae837551
authored
23 years ago
by
Daniel Stenberg
Browse files
Options
Downloads
Patches
Plain Diff
Andreas Damm made it reentrant safe!
parent
e3f10eb8
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
lib/getdate.y
+212
-197
212 additions, 197 deletions
lib/getdate.y
with
212 additions
and
197 deletions
lib/getdate.y
+
212
−
197
View file @
ae837551
...
...
@@ -173,41 +173,48 @@ typedef enum _MERIDIAN {
MERam, MERpm, MER24
} MERIDIAN;
/*
** Global variables. We could get rid of most of these by using a good
** union as the yacc stack. (This routine was originally written before
** yacc had the %union construct.) Maybe someday; right now we only use
** the %union very rarely.
/* parse results and input string */
typedef struct _CONTEXT {
const char *yyInput;
int yyDayOrdinal;
int yyDayNumber;
int yyHaveDate;
int yyHaveDay;
int yyHaveRel;
int yyHaveTime;
int yyHaveZone;
int yyTimezone;
int yyDay;
int yyHour;
int yyMinutes;
int yyMonth;
int yySeconds;
int yyYear;
MERIDIAN yyMeridian;
int yyRelDay;
int yyRelHour;
int yyRelMinutes;
int yyRelMonth;
int yyRelSeconds;
int yyRelYear;
} CONTEXT;
/* enable use of extra argument to yyparse and yylex which can be used to pass
** in a user defined value (CONTEXT struct in our case)
*/
static const char *yyInput;
static int yyDayOrdinal;
static int yyDayNumber;
static int yyHaveDate;
static int yyHaveDay;
static int yyHaveRel;
static int yyHaveTime;
static int yyHaveZone;
static int yyTimezone;
static int yyDay;
static int yyHour;
static int yyMinutes;
static int yyMonth;
static int yySeconds;
static int yyYear;
static MERIDIAN yyMeridian;
static int yyRelDay;
static int yyRelHour;
static int yyRelMinutes;
static int yyRelMonth;
static int yyRelSeconds;
static int yyRelYear;
#define YYPARSE_PARAM cookie
#define YYLEX_PARAM cookie
#define context ((CONTEXT *) cookie)
%}
/* This grammar has 13 shift/reduce conflicts. */
%expect 13
/* turn global variables into locals, additionally enable extra arguments
** for yylex (pointer to yylval and use defined value)
*/
%pure_parser
%union {
int Number;
enum _MERIDIAN Meridian;
...
...
@@ -229,91 +236,91 @@ spec : /* NULL */
;
item : time {
yyHaveTime++;
context->
yyHaveTime++;
}
| zone {
yyHaveZone++;
context->
yyHaveZone++;
}
| date {
yyHaveDate++;
context->
yyHaveDate++;
}
| day {
yyHaveDay++;
context->
yyHaveDay++;
}
| rel {
yyHaveRel++;
context->
yyHaveRel++;
}
| number
;
time : tUNUMBER tMERIDIAN {
yyHour = $1;
yyMinutes = 0;
yySeconds = 0;
yyMeridian = $2;
context->
yyHour = $1;
context->
yyMinutes = 0;
context->
yySeconds = 0;
context->
yyMeridian = $2;
}
| tUNUMBER ':' tUNUMBER o_merid {
yyHour = $1;
yyMinutes = $3;
yySeconds = 0;
yyMeridian = $4;
context->
yyHour = $1;
context->
yyMinutes = $3;
context->
yySeconds = 0;
context->
yyMeridian = $4;
}
| tUNUMBER ':' tUNUMBER tSNUMBER {
yyHour = $1;
yyMinutes = $3;
yyMeridian = MER24;
yyHaveZone++;
yyTimezone = ($4 < 0
? -$4 % 100 + (-$4 / 100) * 60
: - ($4 % 100 + ($4 / 100) * 60));
context->
yyHour = $1;
context->
yyMinutes = $3;
context->
yyMeridian = MER24;
context->
yyHaveZone++;
context->
yyTimezone = ($4 < 0
? -$4 % 100 + (-$4 / 100) * 60
: - ($4 % 100 + ($4 / 100) * 60));
}
| tUNUMBER ':' tUNUMBER ':' tUNUMBER o_merid {
yyHour = $1;
yyMinutes = $3;
yySeconds = $5;
yyMeridian = $6;
context->
yyHour = $1;
context->
yyMinutes = $3;
context->
yySeconds = $5;
context->
yyMeridian = $6;
}
| tUNUMBER ':' tUNUMBER ':' tUNUMBER tSNUMBER {
yyHour = $1;
yyMinutes = $3;
yySeconds = $5;
yyMeridian = MER24;
yyHaveZone++;
yyTimezone = ($6 < 0
? -$6 % 100 + (-$6 / 100) * 60
: - ($6 % 100 + ($6 / 100) * 60));
context->
yyHour = $1;
context->
yyMinutes = $3;
context->
yySeconds = $5;
context->
yyMeridian = MER24;
context->
yyHaveZone++;
context->
yyTimezone = ($6 < 0
? -$6 % 100 + (-$6 / 100) * 60
: - ($6 % 100 + ($6 / 100) * 60));
}
;
zone : tZONE {
yyTimezone = $1;
context->
yyTimezone = $1;
}
| tDAYZONE {
yyTimezone = $1 - 60;
context->
yyTimezone = $1 - 60;
}
|
tZONE tDST {
yyTimezone = $1 - 60;
context->
yyTimezone = $1 - 60;
}
;
day : tDAY {
yyDayOrdinal = 1;
yyDayNumber = $1;
context->
yyDayOrdinal = 1;
context->
yyDayNumber = $1;
}
| tDAY ',' {
yyDayOrdinal = 1;
yyDayNumber = $1;
context->
yyDayOrdinal = 1;
context->
yyDayNumber = $1;
}
| tUNUMBER tDAY {
yyDayOrdinal = $1;
yyDayNumber = $2;
context->
yyDayOrdinal = $1;
context->
yyDayNumber = $2;
}
;
date : tUNUMBER '/' tUNUMBER {
yyMonth = $1;
yyDay = $3;
context->
yyMonth = $1;
context->
yyDay = $3;
}
| tUNUMBER '/' tUNUMBER '/' tUNUMBER {
/* Interpret as YYYY/MM/DD if $1 >= 1000, otherwise as MM/DD/YY.
...
...
@@ -322,144 +329,145 @@ date : tUNUMBER '/' tUNUMBER {
you want portability, use the ISO 8601 format. */
if ($1 >= 1000)
{
yyYear = $1;
yyMonth = $3;
yyDay = $5;
context->
yyYear = $1;
context->
yyMonth = $3;
context->
yyDay = $5;
}
else
{
yyMonth = $1;
yyDay = $3;
yyYear = $5;
context->
yyMonth = $1;
context->
yyDay = $3;
context->
yyYear = $5;
}
}
| tUNUMBER tSNUMBER tSNUMBER {
/* ISO 8601 format. yyyy-mm-dd. */
yyYear = $1;
yyMonth = -$2;
yyDay = -$3;
context->
yyYear = $1;
context->
yyMonth = -$2;
context->
yyDay = -$3;
}
| tUNUMBER tMONTH tSNUMBER {
/* e.g. 17-JUN-1992. */
yyDay = $1;
yyMonth = $2;
yyYear = -$3;
context->
yyDay = $1;
context->
yyMonth = $2;
context->
yyYear = -$3;
}
| tMONTH tUNUMBER {
yyMonth = $1;
yyDay = $2;
context->
yyMonth = $1;
context->
yyDay = $2;
}
| tMONTH tUNUMBER ',' tUNUMBER {
yyMonth = $1;
yyDay = $2;
yyYear = $4;
context->
yyMonth = $1;
context->
yyDay = $2;
context->
yyYear = $4;
}
| tUNUMBER tMONTH {
yyMonth = $2;
yyDay = $1;
context->
yyMonth = $2;
context->
yyDay = $1;
}
| tUNUMBER tMONTH tUNUMBER {
yyMonth = $2;
yyDay = $1;
yyYear = $3;
context->
yyMonth = $2;
context->
yyDay = $1;
context->
yyYear = $3;
}
;
rel : relunit tAGO {
yyRelSeconds = -yyRelSeconds;
yyRelMinutes = -yyRelMinutes;
yyRelHour = -yyRelHour;
yyRelDay = -yyRelDay;
yyRelMonth = -yyRelMonth;
yyRelYear = -yyRelYear;
context->
yyRelSeconds = -
context->
yyRelSeconds;
context->
yyRelMinutes = -
context->
yyRelMinutes;
context->
yyRelHour = -
context->
yyRelHour;
context->
yyRelDay = -
context->
yyRelDay;
context->
yyRelMonth = -
context->
yyRelMonth;
context->
yyRelYear = -
context->
yyRelYear;
}
| relunit
;
relunit : tUNUMBER tYEAR_UNIT {
yyRelYear += $1 * $2;
context->
yyRelYear += $1 * $2;
}
| tSNUMBER tYEAR_UNIT {
yyRelYear += $1 * $2;
context->
yyRelYear += $1 * $2;
}
| tYEAR_UNIT {
yyRelYear += $1;
context->
yyRelYear += $1;
}
| tUNUMBER tMONTH_UNIT {
yyRelMonth += $1 * $2;
context->
yyRelMonth += $1 * $2;
}
| tSNUMBER tMONTH_UNIT {
yyRelMonth += $1 * $2;
context->
yyRelMonth += $1 * $2;
}
| tMONTH_UNIT {
yyRelMonth += $1;
context->
yyRelMonth += $1;
}
| tUNUMBER tDAY_UNIT {
yyRelDay += $1 * $2;
context->
yyRelDay += $1 * $2;
}
| tSNUMBER tDAY_UNIT {
yyRelDay += $1 * $2;
context->
yyRelDay += $1 * $2;
}
| tDAY_UNIT {
yyRelDay += $1;
context->
yyRelDay += $1;
}
| tUNUMBER tHOUR_UNIT {
yyRelHour += $1 * $2;
context->
yyRelHour += $1 * $2;
}
| tSNUMBER tHOUR_UNIT {
yyRelHour += $1 * $2;
context->
yyRelHour += $1 * $2;
}
| tHOUR_UNIT {
yyRelHour += $1;
context->
yyRelHour += $1;
}
| tUNUMBER tMINUTE_UNIT {
yyRelMinutes += $1 * $2;
context->
yyRelMinutes += $1 * $2;
}
| tSNUMBER tMINUTE_UNIT {
yyRelMinutes += $1 * $2;
context->
yyRelMinutes += $1 * $2;
}
| tMINUTE_UNIT {
yyRelMinutes += $1;
context->
yyRelMinutes += $1;
}
| tUNUMBER tSEC_UNIT {
yyRelSeconds += $1 * $2;
context->
yyRelSeconds += $1 * $2;
}
| tSNUMBER tSEC_UNIT {
yyRelSeconds += $1 * $2;
context->
yyRelSeconds += $1 * $2;
}
| tSEC_UNIT {
yyRelSeconds += $1;
context->
yyRelSeconds += $1;
}
;
number : tUNUMBER
{
if (yyHaveTime && yyHaveDate && !yyHaveRel)
yyYear = $1;
if (context->yyHaveTime && context->yyHaveDate &&
!context->yyHaveRel)
context->yyYear = $1;
else
{
if ($1>10000)
{
yyHaveDate++;
yyDay= ($1)%100;
yyMonth= ($1/100)%100;
yyYear = $1/10000;
context->
yyHaveDate++;
context->
yyDay= ($1)%100;
context->
yyMonth= ($1/100)%100;
context->
yyYear = $1/10000;
}
else
{
yyHaveTime++;
context->
yyHaveTime++;
if ($1 < 100)
{
yyHour = $1;
yyMinutes = 0;
context->
yyHour = $1;
context->
yyMinutes = 0;
}
else
{
yyHour = $1 / 100;
yyMinutes = $1 % 100;
context->
yyHour = $1 / 100;
context->
yyMinutes = $1 % 100;
}
yySeconds = 0;
yyMeridian = MER24;
context->
yySeconds = 0;
context->
yyMeridian = MER24;
}
}
}
...
...
@@ -730,7 +738,8 @@ ToYear (Year)
}
static int
LookupWord (buff)
LookupWord (yylval, buff)
YYSTYPE *yylval;
char *buff;
{
register char *p;
...
...
@@ -746,12 +755,12 @@ LookupWord (buff)
if (strcmp (buff, "am") == 0 || strcmp (buff, "a.m.") == 0)
{
yylval
.
Meridian = MERam;
yylval
->
Meridian = MERam;
return tMERIDIAN;
}
if (strcmp (buff, "pm") == 0 || strcmp (buff, "p.m.") == 0)
{
yylval
.
Meridian = MERpm;
yylval
->
Meridian = MERpm;
return tMERIDIAN;
}
...
...
@@ -772,13 +781,13 @@ LookupWord (buff)
{
if (strncmp (buff, tp->name, 3) == 0)
{
yylval
.
Number = tp->value;
yylval
->
Number = tp->value;
return tp->type;
}
}
else if (strcmp (buff, tp->name) == 0)
{
yylval
.
Number = tp->value;
yylval
->
Number = tp->value;
return tp->type;
}
}
...
...
@@ -786,7 +795,7 @@ LookupWord (buff)
for (tp = TimezoneTable; tp->name; tp++)
if (strcmp (buff, tp->name) == 0)
{
yylval
.
Number = tp->value;
yylval
->
Number = tp->value;
return tp->type;
}
...
...
@@ -796,7 +805,7 @@ LookupWord (buff)
for (tp = UnitsTable; tp->name; tp++)
if (strcmp (buff, tp->name) == 0)
{
yylval
.
Number = tp->value;
yylval
->
Number = tp->value;
return tp->type;
}
...
...
@@ -808,7 +817,7 @@ LookupWord (buff)
for (tp = UnitsTable; tp->name; tp++)
if (strcmp (buff, tp->name) == 0)
{
yylval
.
Number = tp->value;
yylval
->
Number = tp->value;
return tp->type;
}
buff[i] = 's'; /* Put back for "this" in OtherTable. */
...
...
@@ -817,7 +826,7 @@ LookupWord (buff)
for (tp = OtherTable; tp->name; tp++)
if (strcmp (buff, tp->name) == 0)
{
yylval
.
Number = tp->value;
yylval
->
Number = tp->value;
return tp->type;
}
...
...
@@ -827,7 +836,7 @@ LookupWord (buff)
for (tp = MilitaryTable; tp->name; tp++)
if (strcmp (buff, tp->name) == 0)
{
yylval
.
Number = tp->value;
yylval
->
Number = tp->value;
return tp->type;
}
}
...
...
@@ -843,7 +852,7 @@ LookupWord (buff)
for (tp = TimezoneTable; tp->name; tp++)
if (strcmp (buff, tp->name) == 0)
{
yylval
.
Number = tp->value;
yylval
->
Number = tp->value;
return tp->type;
}
...
...
@@ -851,7 +860,9 @@ LookupWord (buff)
}
static int
yylex ()
yylex (yylval, cookie)
YYSTYPE *yylval;
void *cookie;
{
register unsigned char c;
register char *p;
...
...
@@ -861,42 +872,42 @@ yylex ()
for (;;)
{
while (ISSPACE ((unsigned char) *yyInput))
yyInput++;
while (ISSPACE ((unsigned char) *
context->
yyInput))
context->
yyInput++;
if (ISDIGIT (c = *yyInput) || c == '-' || c == '+')
if (ISDIGIT (c = *
context->
yyInput) || c == '-' || c == '+')
{
if (c == '-' || c == '+')
{
sign = c == '-' ? -1 : 1;
if (!ISDIGIT (*++yyInput))
if (!ISDIGIT (*++
context->
yyInput))
/* skip the '-' sign */
continue;
}
else
sign = 0;
for (yylval
.
Number = 0; ISDIGIT (c = *yyInput++);)
yylval
.
Number = 10 * yylval
.
Number + c - '0';
yyInput--;
for (yylval
->
Number = 0; ISDIGIT (c = *
context->
yyInput++);)
yylval
->
Number = 10 * yylval
->
Number + c - '0';
context->
yyInput--;
if (sign < 0)
yylval
.
Number = -yylval
.
Number;
yylval
->
Number = -yylval
->
Number;
return sign ? tSNUMBER : tUNUMBER;
}
if (ISALPHA (c))
{
for (p = buff; (c = *yyInput++, ISALPHA (c)) || c == '.';)
for (p = buff; (c = *
context->
yyInput++, ISALPHA (c)) || c == '.';)
if (p < &buff[sizeof buff - 1])
*p++ = c;
*p = '\0';
yyInput--;
return LookupWord (buff);
context->
yyInput--;
return LookupWord (
yylval,
buff);
}
if (c != '(')
return *yyInput++;
return *
context->
yyInput++;
Count = 0;
do
{
c = *yyInput++;
c = *
context->
yyInput++;
if (c == '\0')
return c;
if (c == '(')
...
...
@@ -936,10 +947,11 @@ curl_getdate (const char *p, const time_t *now)
{
struct tm tm, tm0, *tmp;
time_t Start;
CONTEXT cookie;
#ifdef HAVE_LOCALTIME_R
struct tm keeptime;
#endif
yyInput = p;
cookie.
yyInput = p;
Start = now ? *now : time ((time_t *) NULL);
#ifdef HAVE_LOCALTIME_R
tmp = (struct tm *)localtime_r(&Start, &keeptime);
...
...
@@ -948,52 +960,55 @@ curl_getdate (const char *p, const time_t *now)
#endif
if (!tmp)
return -1;
yyYear = tmp->tm_year + TM_YEAR_ORIGIN;
yyMonth = tmp->tm_mon + 1;
yyDay = tmp->tm_mday;
yyHour = tmp->tm_hour;
yyMinutes = tmp->tm_min;
yySeconds = tmp->tm_sec;
cookie.
yyYear = tmp->tm_year + TM_YEAR_ORIGIN;
cookie.
yyMonth = tmp->tm_mon + 1;
cookie.
yyDay = tmp->tm_mday;
cookie.
yyHour = tmp->tm_hour;
cookie.
yyMinutes = tmp->tm_min;
cookie.
yySeconds = tmp->tm_sec;
tm.tm_isdst = tmp->tm_isdst;
yyMeridian = MER24;
yyRelSeconds = 0;
yyRelMinutes = 0;
yyRelHour = 0;
yyRelDay = 0;
yyRelMonth = 0;
yyRelYear = 0;
yyHaveDate = 0;
yyHaveDay = 0;
yyHaveRel = 0;
yyHaveTime = 0;
yyHaveZone = 0;
if (yyparse ()
|| yyHaveTime > 1 || yyHaveZone > 1 || yyHaveDate > 1 || yyHaveDay > 1)
cookie.yyMeridian = MER24;
cookie.yyRelSeconds = 0;
cookie.yyRelMinutes = 0;
cookie.yyRelHour = 0;
cookie.yyRelDay = 0;
cookie.yyRelMonth = 0;
cookie.yyRelYear = 0;
cookie.yyHaveDate = 0;
cookie.yyHaveDay = 0;
cookie.yyHaveRel = 0;
cookie.yyHaveTime = 0;
cookie.yyHaveZone = 0;
if (yyparse (&cookie)
|| cookie.yyHaveTime > 1 || cookie.yyHaveZone > 1 ||
cookie.yyHaveDate > 1 || cookie.yyHaveDay > 1)
return -1;
tm.tm_year = ToYear (yyYear) - TM_YEAR_ORIGIN + yyRelYear;
tm.tm_mon = yyMonth - 1 + yyRelMonth;
tm.tm_mday = yyDay + yyRelDay;
if (yyHaveTime || (yyHaveRel && !yyHaveDate && !yyHaveDay))
tm.tm_year = ToYear (cookie.yyYear) - TM_YEAR_ORIGIN + cookie.yyRelYear;
tm.tm_mon = cookie.yyMonth - 1 + cookie.yyRelMonth;
tm.tm_mday = cookie.yyDay + cookie.yyRelDay;
if (cookie.yyHaveTime ||
(cookie.yyHaveRel && !cookie.yyHaveDate && !cookie.yyHaveDay))
{
tm.tm_hour = ToHour (yyHour, yyMeridian);
tm.tm_hour = ToHour (
cookie.
yyHour,
cookie.
yyMeridian);
if (tm.tm_hour < 0)
return -1;
tm.tm_min = yyMinutes;
tm.tm_sec = yySeconds;
tm.tm_min =
cookie.
yyMinutes;
tm.tm_sec =
cookie.
yySeconds;
}
else
{
tm.tm_hour = tm.tm_min = tm.tm_sec = 0;
}
tm.tm_hour += yyRelHour;
tm.tm_min += yyRelMinutes;
tm.tm_sec += yyRelSeconds;
tm.tm_hour +=
cookie.
yyRelHour;
tm.tm_min +=
cookie.
yyRelMinutes;
tm.tm_sec +=
cookie.
yyRelSeconds;
/* Let mktime deduce tm_isdst if we have an absolute timestamp,
or if the relative timestamp mentions days, months, or years. */
if (yyHaveDate | yyHaveDay | yyHaveTime | yyRelDay | yyRelMonth | yyRelYear)
if (cookie.yyHaveDate | cookie.yyHaveDay | cookie.yyHaveTime |
cookie.yyRelDay | cookie.yyRelMonth | cookie.yyRelYear)
tm.tm_isdst = -1;
tm0 = tm;
...
...
@@ -1011,18 +1026,18 @@ curl_getdate (const char *p, const time_t *now)
we apply mktime to 1970-01-02 08:00:00 instead and adjust the time
zone by 24 hours to compensate. This algorithm assumes that
there is no DST transition within a day of the time_t boundaries. */
if (yyHaveZone)
if (
cookie.
yyHaveZone)
{
tm = tm0;
if (tm.tm_year <= EPOCH - TM_YEAR_ORIGIN)
{
tm.tm_mday++;
yyTimezone -= 24 * 60;
cookie.
yyTimezone -= 24 * 60;
}
else
{
tm.tm_mday--;
yyTimezone += 24 * 60;
cookie.
yyTimezone += 24 * 60;
}
Start = mktime (&tm);
}
...
...
@@ -1031,22 +1046,22 @@ curl_getdate (const char *p, const time_t *now)
return Start;
}
if (yyHaveDay && !yyHaveDate)
if (
cookie.
yyHaveDay && !
cookie.
yyHaveDate)
{
tm.tm_mday += ((yyDayNumber - tm.tm_wday + 7) % 7
+ 7 * (yyDayOrdinal - (0 < yyDayOrdinal)));
tm.tm_mday += ((
cookie.
yyDayNumber - tm.tm_wday + 7) % 7
+ 7 * (
cookie.
yyDayOrdinal - (0 <
cookie.
yyDayOrdinal)));
Start = mktime (&tm);
if (Start == (time_t) -1)
return Start;
}
if (yyHaveZone)
if (
cookie.
yyHaveZone)
{
long delta;
struct tm *gmt = gmtime (&Start);
if (!gmt)
return -1;
delta = yyTimezone * 60L + difftm (&tm, gmt);
delta =
cookie.
yyTimezone * 60L + difftm (&tm, gmt);
if ((Start + delta < Start) != (delta < 0))
return -1; /* time_t overflow */
Start += delta;
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment