~svn/ubuntu/oneiric/subversion/ppa

« back to all changes in this revision

Viewing changes to subversion/libsvn_subr/date.c

  • Committer: Bazaar Package Importer
  • Author(s): Matthias Klose
  • Date: 2006-12-13 17:57:16 UTC
  • mfrom: (1.1.6 upstream) (0.1.3 etch)
  • Revision ID: james.westby@ubuntu.com-20061213175716-2ysv6z4w5dpa2r2f
Tags: 1.4.2dfsg1-2ubuntu1
* Merge with Debian unstable; remaining changes:
  - Create pot file on build.

Show diffs side-by-side

added added

removed removed

Lines of Context:
15
15
 * ====================================================================
16
16
 */
17
17
 
18
 
#include <svn_time.h>
 
18
#include "svn_time.h"
19
19
#include "svn_error.h"
20
20
 
21
21
#include "svn_private_config.h"
62
62
static const rule
63
63
rules[] =
64
64
{
65
 
  { 'Y', DIGITS, ACCUM, APR_OFFSETOF (match_state, base.tm_year) },
66
 
  { 'M', DIGITS, ACCUM, APR_OFFSETOF (match_state, base.tm_mon) },
67
 
  { 'D', DIGITS, ACCUM, APR_OFFSETOF (match_state, base.tm_mday) },
68
 
  { 'h', DIGITS, ACCUM, APR_OFFSETOF (match_state, base.tm_hour) },
69
 
  { 'm', DIGITS, ACCUM, APR_OFFSETOF (match_state, base.tm_min) },
70
 
  { 's', DIGITS, ACCUM, APR_OFFSETOF (match_state, base.tm_sec) },
71
 
  { 'u', DIGITS, MICRO, APR_OFFSETOF (match_state, base.tm_usec) },
72
 
  { 'O', DIGITS, ACCUM, APR_OFFSETOF (match_state, offhours) },
73
 
  { 'o', DIGITS, ACCUM, APR_OFFSETOF (match_state, offminutes) },
 
65
  { 'Y', DIGITS, ACCUM, APR_OFFSETOF(match_state, base.tm_year) },
 
66
  { 'M', DIGITS, ACCUM, APR_OFFSETOF(match_state, base.tm_mon) },
 
67
  { 'D', DIGITS, ACCUM, APR_OFFSETOF(match_state, base.tm_mday) },
 
68
  { 'h', DIGITS, ACCUM, APR_OFFSETOF(match_state, base.tm_hour) },
 
69
  { 'm', DIGITS, ACCUM, APR_OFFSETOF(match_state, base.tm_min) },
 
70
  { 's', DIGITS, ACCUM, APR_OFFSETOF(match_state, base.tm_sec) },
 
71
  { 'u', DIGITS, MICRO, APR_OFFSETOF(match_state, base.tm_usec) },
 
72
  { 'O', DIGITS, ACCUM, APR_OFFSETOF(match_state, offhours) },
 
73
  { 'o', DIGITS, ACCUM, APR_OFFSETOF(match_state, offminutes) },
74
74
  { '+', "-+", TZIND, 0 },
75
75
  { 'Z', "Z", TZIND, 0 },
76
76
  { ':', ":", NOOP, 0 },
86
86
/* Return the rule associated with TCHAR, or NULL if there
87
87
   is no such rule. */
88
88
static const rule *
89
 
find_rule (char tchar)
 
89
find_rule(char tchar)
90
90
{
91
 
  int i = sizeof (rules)/sizeof (rules[0]);
 
91
  int i = sizeof(rules)/sizeof(rules[0]);
92
92
  while (i--)
93
93
    if (rules[i].key == tchar)
94
94
      return &rules[i];
102
102
   should be used to interpret the match (i.e. if no time zone
103
103
   information was provided), or FALSE if not. */
104
104
static svn_boolean_t
105
 
template_match (apr_time_exp_t *expt, svn_boolean_t *localtz,
106
 
                const char *template, const char *value)
 
105
template_match(apr_time_exp_t *expt, svn_boolean_t *localtz,
 
106
               const char *template, const char *value)
107
107
{
108
108
  int multiplier = 100000;
109
109
  int tzind = 0;
110
110
  match_state ms;
111
111
  char *base = (char *)&ms;
112
112
 
113
 
  memset (&ms, 0, sizeof (ms));
 
113
  memset(&ms, 0, sizeof(ms));
114
114
 
115
115
  for (;;)
116
116
    {
117
 
      const rule *match = find_rule (*template++);
 
117
      const rule *match = find_rule(*template++);
118
118
      char vchar = *value++;
119
119
      apr_int32_t *place;
120
120
 
121
121
      if (!match || (match->valid
122
 
                     && (!vchar || !strchr (match->valid, vchar))))
 
122
                     && (!vchar || !strchr(match->valid, vchar))))
123
123
        return FALSE;
124
124
 
125
125
      /* Compute the address of memory location affected by this
147
147
        case SKIPFROM:
148
148
          if (!vchar)
149
149
            break;
150
 
          match = find_rule (*template);
151
 
          if (!strchr (match->valid, vchar))
152
 
            template = strchr (template, ']') + 1;
 
150
          match = find_rule(*template);
 
151
          if (!strchr(match->valid, vchar))
 
152
            template = strchr(template, ']') + 1;
153
153
          value--;
154
154
          continue;
155
155
        case ACCEPT:
190
190
};
191
191
 
192
192
svn_error_t *
193
 
svn_parse_date (svn_boolean_t *matched, apr_time_t *result, const char *text,
194
 
                apr_time_t now, apr_pool_t *pool)
 
193
svn_parse_date(svn_boolean_t *matched, apr_time_t *result, const char *text,
 
194
               apr_time_t now, apr_pool_t *pool)
195
195
{
196
196
  apr_time_exp_t expt, expnow;
197
197
  apr_status_t apr_err;
199
199
 
200
200
  *matched = FALSE;
201
201
 
202
 
  apr_err = apr_time_exp_lt (&expnow, now);
 
202
  apr_err = apr_time_exp_lt(&expnow, now);
203
203
  if (apr_err != APR_SUCCESS)
204
 
    return svn_error_wrap_apr (apr_err, _("Can't manipulate current date"));
 
204
    return svn_error_wrap_apr(apr_err, _("Can't manipulate current date"));
205
205
 
206
 
  if (template_match (&expt, &localtz, /* ISO-8601 extended, date only */
207
 
                      "YYYY-M[M]-D[D]",
208
 
                      text)
209
 
      || template_match (&expt, &localtz, /* ISO-8601 extended, UTC */
210
 
                         "YYYY-M[M]-D[D]Th[h]:mm[:ss[.u[u[u[u[u[u][Z]",
211
 
                         text)
212
 
      || template_match (&expt, &localtz, /* ISO-8601 extended, with offset */
213
 
                         "YYYY-M[M]-D[D]Th[h]:mm[:ss[.u[u[u[u[u[u]+OO[:oo]",
214
 
                         text)
215
 
      || template_match (&expt, &localtz, /* ISO-8601 basic, date only */
216
 
                         "YYYYMMDD",
217
 
                         text)
218
 
      || template_match (&expt, &localtz, /* ISO-8601 basic, UTC */
219
 
                         "YYYYMMDDThhmm[ss[.u[u[u[u[u[u][Z]",
220
 
                         text)
221
 
      || template_match (&expt, &localtz, /* ISO-8601 basic, with offset */
222
 
                         "YYYYMMDDThhmm[ss[.u[u[u[u[u[u]+OO[oo]",
223
 
                         text)
224
 
      || template_match (&expt, &localtz, /* "svn log" format */
225
 
                         "YYYY-M[M]-D[D] h[h]:mm[:ss[.u[u[u[u[u[u][ +OO[oo]",
226
 
                         text)
227
 
      || template_match (&expt, &localtz, /* GNU date's iso-8601 */
228
 
                         "YYYY-M[M]-D[D]Th[h]:mm[:ss[.u[u[u[u[u[u]+OO[oo]",
229
 
                         text))
 
206
  if (template_match(&expt, &localtz, /* ISO-8601 extended, date only */
 
207
                     "YYYY-M[M]-D[D]",
 
208
                     text)
 
209
      || template_match(&expt, &localtz, /* ISO-8601 extended, UTC */
 
210
                        "YYYY-M[M]-D[D]Th[h]:mm[:ss[.u[u[u[u[u[u][Z]",
 
211
                        text)
 
212
      || template_match(&expt, &localtz, /* ISO-8601 extended, with offset */
 
213
                        "YYYY-M[M]-D[D]Th[h]:mm[:ss[.u[u[u[u[u[u]+OO[:oo]",
 
214
                        text)
 
215
      || template_match(&expt, &localtz, /* ISO-8601 basic, date only */
 
216
                        "YYYYMMDD",
 
217
                        text)
 
218
      || template_match(&expt, &localtz, /* ISO-8601 basic, UTC */
 
219
                        "YYYYMMDDThhmm[ss[.u[u[u[u[u[u][Z]",
 
220
                        text)
 
221
      || template_match(&expt, &localtz, /* ISO-8601 basic, with offset */
 
222
                        "YYYYMMDDThhmm[ss[.u[u[u[u[u[u]+OO[oo]",
 
223
                        text)
 
224
      || template_match(&expt, &localtz, /* "svn log" format */
 
225
                        "YYYY-M[M]-D[D] h[h]:mm[:ss[.u[u[u[u[u[u][ +OO[oo]",
 
226
                        text)
 
227
      || template_match(&expt, &localtz, /* GNU date's iso-8601 */
 
228
                        "YYYY-M[M]-D[D]Th[h]:mm[:ss[.u[u[u[u[u[u]+OO[oo]",
 
229
                        text))
230
230
    {
231
231
      expt.tm_year -= 1900;
232
232
      expt.tm_mon -= 1;
233
233
    }
234
 
  else if (template_match (&expt, &localtz, /* Just a time */
235
 
                           "h[h]:mm[:ss[.u[u[u[u[u[u]",
236
 
                           text))
 
234
  else if (template_match(&expt, &localtz, /* Just a time */
 
235
                          "h[h]:mm[:ss[.u[u[u[u[u[u]",
 
236
                          text))
237
237
    {
238
238
      expt.tm_year = expnow.tm_year;
239
239
      expt.tm_mon = expnow.tm_mon;
272
272
         not.  So, calculate the time value using the current time's
273
273
         GMT offset and use the GMT offset of the resulting time. */
274
274
      expt.tm_gmtoff = expnow.tm_gmtoff;
275
 
      apr_err = apr_time_exp_gmt_get (&candidate, &expt);
276
 
      if (apr_err != APR_SUCCESS)
277
 
        return svn_error_wrap_apr (apr_err,
278
 
                                   _("Can't calculate requested date"));
279
 
      apr_err = apr_time_exp_lt (&expthen, candidate);
280
 
      if (apr_err != APR_SUCCESS)
281
 
        return svn_error_wrap_apr (apr_err, _("Can't expand time"));
 
275
      apr_err = apr_time_exp_gmt_get(&candidate, &expt);
 
276
      if (apr_err != APR_SUCCESS)
 
277
        return svn_error_wrap_apr(apr_err,
 
278
                                  _("Can't calculate requested date"));
 
279
      apr_err = apr_time_exp_lt(&expthen, candidate);
 
280
      if (apr_err != APR_SUCCESS)
 
281
        return svn_error_wrap_apr(apr_err, _("Can't expand time"));
282
282
      expt.tm_gmtoff = expthen.tm_gmtoff;
283
283
    }
284
 
  apr_err = apr_time_exp_gmt_get (result, &expt);
 
284
  apr_err = apr_time_exp_gmt_get(result, &expt);
285
285
  if (apr_err != APR_SUCCESS)
286
 
    return svn_error_wrap_apr (apr_err, _("Can't calculate requested date"));
 
286
    return svn_error_wrap_apr(apr_err, _("Can't calculate requested date"));
287
287
 
288
288
  *matched = TRUE;
289
289
  return SVN_NO_ERROR;