Revision 1857

trunk/nntpgrab_core/strptime.c (revision 1857)
107 107
    __label__ do_normal;                                                     \
108 108
    if (*decided != raw)                                                     \
109 109
      {                                                                              \
110
       const char *alts = _NL_CURRENT (LC_TIME, ALT_DIGITS);                 \
111
       int __n = n;                                                          \
112
       int any = 0;                                                          \
113
       while (*rp == ' ')                                                    \
114
         ++rp;                                                               \
115
       val = 0;                                                              \
116
       do {                                                                  \
117
         val *= 10;                                                          \
118
         while (*alts != '\0')                                               \
119
           {                                                                 \
120
             size_t len = strlen (alts);                                     \
121
             if (strncasecmp (alts, rp, len) == 0)                           \
122
               break;                                                        \
123
             alts += len + 1;                                                \
124
             ++val;                                                          \
125
           }                                                                 \
126
         if (*alts == '\0')                                                  \
127
           {                                                                 \
128
             if (*decided == not && ! any)                                   \
129
               goto do_normal;                                               \
130
             /* If we haven't read anything it's an error.  */               \
131
             if (! any)                                                      \
132
               return NULL;                                                  \
133
             /* Correct the premature multiplication.  */                    \
134
             val /= 10;                                                      \
135
             break;                                                          \
136
           }                                                                 \
137
         else                                                                \
138
           *decided = loc;                                                   \
139
       } while (--__n > 0 && val * 10 <= to);                                  \
140
       if (val < from || val > to)                                             \
141
         return NULL;                                                        \
110
        const char *alts = _NL_CURRENT (LC_TIME, ALT_DIGITS);                \
111
        int __n = n;                                                         \
112
        int any = 0;                                                         \
113
        while (*rp == ' ')                                                   \
114
          ++rp;                                                                      \
115
        val = 0;                                                             \
116
        do {                                                                 \
117
          val *= 10;                                                         \
118
          while (*alts != '\0')                                                      \
119
            {                                                                \
120
              size_t len = strlen (alts);                                    \
121
              if (strncasecmp (alts, rp, len) == 0)                          \
122
                break;                                                       \
123
              alts += len + 1;                                               \
124
              ++val;                                                         \
125
            }                                                                \
126
          if (*alts == '\0')                                                 \
127
            {                                                                \
128
              if (*decided == not && ! any)                                  \
129
                goto do_normal;                                                      \
130
              /* If we haven't read anything it's an error.  */                      \
131
              if (! any)                                                     \
132
                return NULL;                                                 \
133
              /* Correct the premature multiplication.  */                   \
134
              val /= 10;                                                     \
135
              break;                                                         \
136
            }                                                                \
137
          else                                                               \
138
            *decided = loc;                                                  \
139
        } while (--__n > 0 && val * 10 <= to);                                 \
140
        if (val < from || val > to)                                            \
141
          return NULL;                                                       \
142 142
      }                                                                              \
143 143
    else                                                                     \
144 144
      {                                                                              \
... ...
232 232
     the weekday.  */
233 233
  int corr_year = 1900 + tm->tm_year - (tm->tm_mon < 2);
234 234
  int wday = (-473
235
             + (365 * (tm->tm_year - 70))
236
             + (corr_year / 4)
237
             - ((corr_year / 4) / 25) + ((corr_year / 4) % 25 < 0)
238
             + (((corr_year / 4) / 25) / 4)
239
             + __mon_yday[0][tm->tm_mon]
240
             + tm->tm_mday - 1);
235
              + (365 * (tm->tm_year - 70))
236
              + (corr_year / 4)
237
              - ((corr_year / 4) / 25) + ((corr_year / 4) % 25 < 0)
238
              + (((corr_year / 4) / 25) / 4)
239
              + __mon_yday[0][tm->tm_mon]
240
              + tm->tm_mday - 1);
241 241
  tm->tm_wday = ((wday % 7) + 7) % 7;
242 242
}
243 243

                
... ...
246 246
day_of_the_year (struct tm *tm)
247 247
{
248 248
  tm->tm_yday = (__mon_yday[__isleap (1900 + tm->tm_year)][tm->tm_mon]
249
                + (tm->tm_mday - 1));
249
                 + (tm->tm_mday - 1));
250 250
}
251 251

                
252 252
static char *
... ...
254 254
internal_function
255 255
#endif
256 256
strptime_internal __P ((const char *rp, const char *fmt, struct tm *tm,
257
                       enum locale_status *decided, int era_cnt));
257
                        enum locale_status *decided, int era_cnt));
258 258

                
259 259
static char *
260 260
#ifdef _LIBC
... ...
267 267
     enum locale_status *decided;
268 268
     int era_cnt;
269 269
{
270
  const char *rp_backup;
271 270
  int cnt;
272 271
  size_t val;
273 272
  int have_I, is_pm;
... ...
277 276
  int have_yday;
278 277
  int have_mon, have_mday;
279 278
#ifdef _NL_CURRENT
279
  const char *rp_backup;
280 280
  size_t num_eras;
281
  struct era_entry *era;
281 282
#endif
282
  struct era_entry *era;
283 283

                
284 284
  have_I = is_pm = 0;
285 285
  century = -1;
... ...
292 292
  while (*fmt != '\0')
293 293
    {
294 294
      /* A white space in the format string matches 0 more or white
295
        space in the input string.  */
295
         space in the input string.  */
296 296
      if (isspace (*fmt))
297
       {
298
         while (isspace (*rp))
299
           ++rp;
300
         ++fmt;
301
         continue;
302
       }
297
        {
298
          while (isspace (*rp))
299
            ++rp;
300
          ++fmt;
301
          continue;
302
        }
303 303

                
304 304
      /* Any character but `%' must be matched by the same character
305
        in the iput string.  */
305
         in the iput string.  */
306 306
      if (*fmt != '%')
307
       {
308
         match_char (*fmt++, *rp++);
309
         continue;
310
       }
307
        {
308
          match_char (*fmt++, *rp++);
309
          continue;
310
        }
311 311

                
312 312
      ++fmt;
313 313
#ifndef _NL_CURRENT
... ...
315 315
    start_over:
316 316
#endif
317 317

                
318
#ifdef _NL_CURRENT
318 319
      /* Make back up of current processing pointer.  */
319 320
      rp_backup = rp;
321
#endif
320 322

                
321 323
      switch (*fmt++)
322
       {
323
       case '%':
324
         /* Match the `%' character itself.  */
325
         match_char ('%', *rp++);
326
         break;
327
       case 'a':
328
       case 'A':
329
         /* Match day of week.  */
330
         for (cnt = 0; cnt < 7; ++cnt)
331
           {
324
        {
325
        case '%':
326
          /* Match the `%' character itself.  */
327
          match_char ('%', *rp++);
328
          break;
329
        case 'a':
330
        case 'A':
331
          /* Match day of week.  */
332
          for (cnt = 0; cnt < 7; ++cnt)
333
            {
332 334
#ifdef _NL_CURRENT
333
             if (*decided !=raw)
334
               {
335
                 if (match_string (_NL_CURRENT (LC_TIME, DAY_1 + cnt), rp))
336
                   {
337
                     if (*decided == not
338
                         && strcmp (_NL_CURRENT (LC_TIME, DAY_1 + cnt),
339
                                    weekday_name[cnt]))
340
                       *decided = loc;
341
                     break;
342
                   }
343
                 if (match_string (_NL_CURRENT (LC_TIME, ABDAY_1 + cnt), rp))
344
                   {
345
                     if (*decided == not
346
                         && strcmp (_NL_CURRENT (LC_TIME, ABDAY_1 + cnt),
347
                                    ab_weekday_name[cnt]))
348
                       *decided = loc;
349
                     break;
350
                   }
351
               }
335
              if (*decided !=raw)
336
                {
337
                  if (match_string (_NL_CURRENT (LC_TIME, DAY_1 + cnt), rp))
338
                    {
339
                      if (*decided == not
340
                          && strcmp (_NL_CURRENT (LC_TIME, DAY_1 + cnt),
341
                                     weekday_name[cnt]))
342
                        *decided = loc;
343
                      break;
344
                    }
345
                  if (match_string (_NL_CURRENT (LC_TIME, ABDAY_1 + cnt), rp))
346
                    {
347
                      if (*decided == not
348
                          && strcmp (_NL_CURRENT (LC_TIME, ABDAY_1 + cnt),
349
                                     ab_weekday_name[cnt]))
350
                        *decided = loc;
351
                      break;
352
                    }
353
                }
352 354
#endif
353
             if (*decided != loc
354
                 && (match_string (weekday_name[cnt], rp)
355
                     || match_string (ab_weekday_name[cnt], rp)))
356
               {
357
                 *decided = raw;
358
                 break;
359
               }
360
           }
361
         if (cnt == 7)
362
           /* Does not match a weekday name.  */
363
           return NULL;
364
         tm->tm_wday = cnt;
365
         have_wday = 1;
366
         break;
367
       case 'b':
368
       case 'B':
369
       case 'h':
370
         /* Match month name.  */
371
         for (cnt = 0; cnt < 12; ++cnt)
372
           {
355
              if (*decided != loc
356
                  && (match_string (weekday_name[cnt], rp)
357
                      || match_string (ab_weekday_name[cnt], rp)))
358
                {
359
                  *decided = raw;
360
                  break;
361
                }
362
            }
363
          if (cnt == 7)
364
            /* Does not match a weekday name.  */
365
            return NULL;
366
          tm->tm_wday = cnt;
367
          have_wday = 1;
368
          break;
369
        case 'b':
370
        case 'B':
371
        case 'h':
372
          /* Match month name.  */
373
          for (cnt = 0; cnt < 12; ++cnt)
374
            {
373 375
#ifdef _NL_CURRENT
374
             if (*decided !=raw)
375
               {
376
                 if (match_string (_NL_CURRENT (LC_TIME, MON_1 + cnt), rp))
377
                   {
378
                     if (*decided == not
379
                         && strcmp (_NL_CURRENT (LC_TIME, MON_1 + cnt),
380
                                    month_name[cnt]))
381
                       *decided = loc;
382
                     break;
383
                   }
384
                 if (match_string (_NL_CURRENT (LC_TIME, ABMON_1 + cnt), rp))
385
                   {
386
                     if (*decided == not
387
                         && strcmp (_NL_CURRENT (LC_TIME, ABMON_1 + cnt),
388
                                    ab_month_name[cnt]))
389
                       *decided = loc;
390
                     break;
391
                   }
392
               }
376
              if (*decided !=raw)
377
                {
378
                  if (match_string (_NL_CURRENT (LC_TIME, MON_1 + cnt), rp))
379
                    {
380
                      if (*decided == not
381
                          && strcmp (_NL_CURRENT (LC_TIME, MON_1 + cnt),
382
                                     month_name[cnt]))
383
                        *decided = loc;
384
                      break;
385
                    }
386
                  if (match_string (_NL_CURRENT (LC_TIME, ABMON_1 + cnt), rp))
387
                    {
388
                      if (*decided == not
389
                          && strcmp (_NL_CURRENT (LC_TIME, ABMON_1 + cnt),
390
                                     ab_month_name[cnt]))
391
                        *decided = loc;
392
                      break;
393
                    }
394
                }
393 395
#endif
394
             if (match_string (month_name[cnt], rp)
395
                 || match_string (ab_month_name[cnt], rp))
396
               {
397
                 *decided = raw;
398
                 break;
399
               }
400
           }
401
         if (cnt == 12)
402
           /* Does not match a month name.  */
403
           return NULL;
404
         tm->tm_mon = cnt;
405
         want_xday = 1;
406
         break;
407
       case 'c':
408
         /* Match locale's date and time format.  */
396
              if (match_string (month_name[cnt], rp)
397
                  || match_string (ab_month_name[cnt], rp))
398
                {
399
                  *decided = raw;
400
                  break;
401
                }
402
            }
403
          if (cnt == 12)
404
            /* Does not match a month name.  */
405
            return NULL;
406
          tm->tm_mon = cnt;
407
          want_xday = 1;
408
          break;
409
        case 'c':
410
          /* Match locale's date and time format.  */
409 411
#ifdef _NL_CURRENT
410
         if (*decided != raw)
411
           {
412
             if (!recursive (_NL_CURRENT (LC_TIME, D_T_FMT)))
413
               {
414
                 if (*decided == loc)
415
                   return NULL;
416
                 else
417
                   rp = rp_backup;
418
               }
419
             else
420
               {
421
                 if (*decided == not &&
422
                     strcmp (_NL_CURRENT (LC_TIME, D_T_FMT), HERE_D_T_FMT))
423
                   *decided = loc;
424
                 want_xday = 1;
425
                 break;
426
               }
427
             *decided = raw;
428
           }
412
          if (*decided != raw)
413
            {
414
              if (!recursive (_NL_CURRENT (LC_TIME, D_T_FMT)))
415
                {
416
                  if (*decided == loc)
417
                    return NULL;
418
                  else
419
                    rp = rp_backup;
420
                }
421
              else
422
                {
423
                  if (*decided == not &&
424
                      strcmp (_NL_CURRENT (LC_TIME, D_T_FMT), HERE_D_T_FMT))
425
                    *decided = loc;
426
                  want_xday = 1;
427
                  break;
428
                }
429
              *decided = raw;
430
            }
429 431
#endif
430
         if (!recursive (HERE_D_T_FMT))
431
           return NULL;
432
         want_xday = 1;
433
         break;
434
       case 'C':
435
         /* Match century number.  */
432
          if (!recursive (HERE_D_T_FMT))
433
            return NULL;
434
          want_xday = 1;
435
          break;
436
        case 'C':
437
          /* Match century number.  */
436 438
#ifdef _NL_CURRENT
437
       match_century:
439
        match_century:
438 440
#endif
439
         get_number (0, 99, 2);
440
         century = val;
441
         want_xday = 1;
442
         break;
443
       case 'd':
444
       case 'e':
445
         /* Match day of month.  */
446
         get_number (1, 31, 2);
447
         tm->tm_mday = val;
448
         have_mday = 1;
449
         want_xday = 1;
450
         break;
451
       case 'F':
452
         if (!recursive ("%Y-%m-%d"))
453
           return NULL;
454
         want_xday = 1;
455
         break;
456
       case 'x':
441
          get_number (0, 99, 2);
442
          century = val;
443
          want_xday = 1;
444
          break;
445
        case 'd':
446
        case 'e':
447
          /* Match day of month.  */
448
          get_number (1, 31, 2);
449
          tm->tm_mday = val;
450
          have_mday = 1;
451
          want_xday = 1;
452
          break;
453
        case 'F':
454
          if (!recursive ("%Y-%m-%d"))
455
            return NULL;
456
          want_xday = 1;
457
          break;
458
        case 'x':
457 459
#ifdef _NL_CURRENT
458
         if (*decided != raw)
459
           {
460
             if (!recursive (_NL_CURRENT (LC_TIME, D_FMT)))
461
               {
462
                 if (*decided == loc)
463
                   return NULL;
464
                 else
465
                   rp = rp_backup;
466
               }
467
             else
468
               {
469
                 if (*decided == not
470
                     && strcmp (_NL_CURRENT (LC_TIME, D_FMT), HERE_D_FMT))
471
                   *decided = loc;
472
                 want_xday = 1;
473
                 break;
474
               }
475
             *decided = raw;
476
           }
460
          if (*decided != raw)
461
            {
462
              if (!recursive (_NL_CURRENT (LC_TIME, D_FMT)))
463
                {
464
                  if (*decided == loc)
465
                    return NULL;
466
                  else
467
                    rp = rp_backup;
468
                }
469
              else
470
                {
471
                  if (*decided == not
472
                      && strcmp (_NL_CURRENT (LC_TIME, D_FMT), HERE_D_FMT))
473
                    *decided = loc;
474
                  want_xday = 1;
475
                  break;
476
                }
477
              *decided = raw;
478
            }
477 479
#endif
478
         /* Fall through.  */
479
       case 'D':
480
         /* Match standard day format.  */
481
         if (!recursive (HERE_D_FMT))
482
           return NULL;
483
         want_xday = 1;
484
         break;
485
       case 'k':
486
       case 'H':
487
         /* Match hour in 24-hour clock.  */
488
         get_number (0, 23, 2);
489
         tm->tm_hour = val;
490
         have_I = 0;
491
         break;
492
       case 'I':
493
         /* Match hour in 12-hour clock.  */
494
         get_number (1, 12, 2);
495
         tm->tm_hour = val % 12;
496
         have_I = 1;
497
         break;
498
       case 'j':
499
         /* Match day number of year.  */
500
         get_number (1, 366, 3);
501
         tm->tm_yday = val - 1;
502
         have_yday = 1;
503
         break;
504
       case 'm':
505
         /* Match number of month.  */
506
         get_number (1, 12, 2);
507
         tm->tm_mon = val - 1;
508
         have_mon = 1;
509
         want_xday = 1;
510
         break;
511
       case 'M':
512
         /* Match minute.  */
513
         get_number (0, 59, 2);
514
         tm->tm_min = val;
515
         break;
516
       case 'n':
517
       case 't':
518
         /* Match any white space.  */
519
         while (isspace (*rp))
520
           ++rp;
521
         break;
522
       case 'p':
523
         /* Match locale's equivalent of AM/PM.  */
480
          /* Fall through.  */
481
        case 'D':
482
          /* Match standard day format.  */
483
          if (!recursive (HERE_D_FMT))
484
            return NULL;
485
          want_xday = 1;
486
          break;
487
        case 'k':
488
        case 'H':
489
          /* Match hour in 24-hour clock.  */
490
          get_number (0, 23, 2);
491
          tm->tm_hour = val;
492
          have_I = 0;
493
          break;
494
        case 'I':
495
          /* Match hour in 12-hour clock.  */
496
          get_number (1, 12, 2);
497
          tm->tm_hour = val % 12;
498
          have_I = 1;
499
          break;
500
        case 'j':
501
          /* Match day number of year.  */
502
          get_number (1, 366, 3);
503
          tm->tm_yday = val - 1;
504
          have_yday = 1;
505
          break;
506
        case 'm':
507
          /* Match number of month.  */
508
          get_number (1, 12, 2);
509
          tm->tm_mon = val - 1;
510
          have_mon = 1;
511
          want_xday = 1;
512
          break;
513
        case 'M':
514
          /* Match minute.  */
515
          get_number (0, 59, 2);
516
          tm->tm_min = val;
517
          break;
518
        case 'n':
519
        case 't':
520
          /* Match any white space.  */
521
          while (isspace (*rp))
522
            ++rp;
523
          break;
524
        case 'p':
525
          /* Match locale's equivalent of AM/PM.  */
524 526
#ifdef _NL_CURRENT
525
         if (*decided != raw)
526
           {
527
             if (match_string (_NL_CURRENT (LC_TIME, AM_STR), rp))
528
               {
529
                 if (strcmp (_NL_CURRENT (LC_TIME, AM_STR), HERE_AM_STR))
530
                   *decided = loc;
531
                 break;
532
               }
533
             if (match_string (_NL_CURRENT (LC_TIME, PM_STR), rp))
534
               {
535
                 if (strcmp (_NL_CURRENT (LC_TIME, PM_STR), HERE_PM_STR))
536
                   *decided = loc;
537
                 is_pm = 1;
538
                 break;
539
               }
540
             *decided = raw;
541
           }
527
          if (*decided != raw)
528
            {
529
              if (match_string (_NL_CURRENT (LC_TIME, AM_STR), rp))
530
                {
531
                  if (strcmp (_NL_CURRENT (LC_TIME, AM_STR), HERE_AM_STR))
532
                    *decided = loc;
533
                  break;
534
                }
535
              if (match_string (_NL_CURRENT (LC_TIME, PM_STR), rp))
536
                {
537
                  if (strcmp (_NL_CURRENT (LC_TIME, PM_STR), HERE_PM_STR))
538
                    *decided = loc;
539
                  is_pm = 1;
540
                  break;
541
                }
542
              *decided = raw;
543
            }
542 544
#endif
543
         if (!match_string (HERE_AM_STR, rp)) {
544
           if (match_string (HERE_PM_STR, rp)) {
545
             is_pm = 1;
546
           } else {
547
             return NULL;
545
          if (!match_string (HERE_AM_STR, rp)) {
546
            if (match_string (HERE_PM_STR, rp)) {
547
              is_pm = 1;
548
            } else {
549
              return NULL;
548 550
        }
549 551
      }
550
         break;
551
       case 'r':
552
          break;
553
        case 'r':
552 554
#ifdef _NL_CURRENT
553
         if (*decided != raw)
554
           {
555
             if (!recursive (_NL_CURRENT (LC_TIME, T_FMT_AMPM)))
556
               {
557
                 if (*decided == loc)
558
                   return NULL;
559
                 else
560
                   rp = rp_backup;
561
               }
562
             else
563
               {
564
                 if (*decided == not &&
565
                     strcmp (_NL_CURRENT (LC_TIME, T_FMT_AMPM),
566
                             HERE_T_FMT_AMPM))
567
                   *decided = loc;
568
                 break;
569
               }
570
             *decided = raw;
571
           }
555
          if (*decided != raw)
556
            {
557
              if (!recursive (_NL_CURRENT (LC_TIME, T_FMT_AMPM)))
558
                {
559
                  if (*decided == loc)
560
                    return NULL;
561
                  else
562
                    rp = rp_backup;
563
                }
564
              else
565
                {
566
                  if (*decided == not &&
567
                      strcmp (_NL_CURRENT (LC_TIME, T_FMT_AMPM),
568
                              HERE_T_FMT_AMPM))
569
                    *decided = loc;
570
                  break;
571
                }
572
              *decided = raw;
573
            }
572 574
#endif
573
         if (!recursive (HERE_T_FMT_AMPM))
574
           return NULL;
575
         break;
576
       case 'R':
577
         if (!recursive ("%H:%M"))
578
           return NULL;
579
         break;
580
       case 's':
581
         {
582
           /* The number of seconds may be very high so we cannot use
583
              the `get_number' macro.  Instead read the number
584
              character for character and construct the result while
585
              doing this.  */
586
           time_t secs = 0;
587
           if (*rp < '0' || *rp > '9')
588
             /* We need at least one digit.  */
589
             return NULL;
575
          if (!recursive (HERE_T_FMT_AMPM))
576
            return NULL;
577
          break;
578
        case 'R':
579
          if (!recursive ("%H:%M"))
580
            return NULL;
581
          break;
582
        case 's':
583
          {
584
            /* The number of seconds may be very high so we cannot use
585
               the `get_number' macro.  Instead read the number
586
               character for character and construct the result while
587
               doing this.  */
588
            time_t secs = 0;
589
            if (*rp < '0' || *rp > '9')
590
              /* We need at least one digit.  */
591
              return NULL;
590 592

                
591
           do
592
             {
593
               secs *= 10;
594
               secs += *rp++ - '0';
595
             }
596
           while (*rp >= '0' && *rp <= '9');
593
            do
594
              {
595
                secs *= 10;
596
                secs += *rp++ - '0';
597
              }
598
            while (*rp >= '0' && *rp <= '9');
597 599

                
598
           if (localtime_r (&secs, tm) == NULL)
599
             /* Error in function.  */
600
             return NULL;
601
         }
602
         break;
603
       case 'S':
604
         get_number (0, 61, 2);
605
         tm->tm_sec = val;
606
         break;
607
       case 'X':
600
            if (localtime_r (&secs, tm) == NULL)
601
              /* Error in function.  */
602
              return NULL;
603
          }
604
          break;
605
        case 'S':
606
          get_number (0, 61, 2);
607
          tm->tm_sec = val;
608
          break;
609
        case 'X':
608 610
#ifdef _NL_CURRENT
609
         if (*decided != raw)
610
           {
611
             if (!recursive (_NL_CURRENT (LC_TIME, T_FMT)))
612
               {
613
                 if (*decided == loc)
614
                   return NULL;
615
                 else
616
                   rp = rp_backup;
617
               }
618
             else
619
               {
620
                 if (strcmp (_NL_CURRENT (LC_TIME, T_FMT), HERE_T_FMT))
621
                   *decided = loc;
622
                 break;
623
               }
624
             *decided = raw;
625
           }
611
          if (*decided != raw)
612
            {
613
              if (!recursive (_NL_CURRENT (LC_TIME, T_FMT)))
614
                {
615
                  if (*decided == loc)
616
                    return NULL;
617
                  else
618
                    rp = rp_backup;
619
                }
620
              else
621
                {
622
                  if (strcmp (_NL_CURRENT (LC_TIME, T_FMT), HERE_T_FMT))
623
                    *decided = loc;
624
                  break;
625
                }
626
              *decided = raw;
627
            }
626 628
#endif
627
         /* Fall through.  */
628
       case 'T':
629
         if (!recursive (HERE_T_FMT))
630
           return NULL;
631
         break;
632
       case 'u':
633
         get_number (1, 7, 1);
634
         tm->tm_wday = val % 7;
635
         have_wday = 1;
636
         break;
637
       case 'g':
638
         get_number (0, 99, 2);
639
         /* XXX This cannot determine any field in TM.  */
640
         break;
641
       case 'G':
642
         if (*rp < '0' || *rp > '9')
643
           return NULL;
644
         /* XXX Ignore the number since we would need some more
645
            information to compute a real date.  */
646
         do
647
           ++rp;
648
         while (*rp >= '0' && *rp <= '9');
649
         break;
650
       case 'U':
651
       case 'V':
652
       case 'W':
653
         get_number (0, 53, 2);
654
         /* XXX This cannot determine any field in TM without some
655
            information.  */
656
         break;
657
       case 'w':
658
         /* Match number of weekday.  */
659
         get_number (0, 6, 1);
660
         tm->tm_wday = val;
661
         have_wday = 1;
662
         break;
663
       case 'y':
629
          /* Fall through.  */
630
        case 'T':
631
          if (!recursive (HERE_T_FMT))
632
            return NULL;
633
          break;
634
        case 'u':
635
          get_number (1, 7, 1);
636
          tm->tm_wday = val % 7;
637
          have_wday = 1;
638
          break;
639
        case 'g':
640
          get_number (0, 99, 2);
641
          /* XXX This cannot determine any field in TM.  */
642
          break;
643
        case 'G':
644
          if (*rp < '0' || *rp > '9')
645
            return NULL;
646
          /* XXX Ignore the number since we would need some more
647
             information to compute a real date.  */
648
          do
649
            ++rp;
650
          while (*rp >= '0' && *rp <= '9');
651
          break;
652
        case 'U':
653
        case 'V':
654
        case 'W':
655
          get_number (0, 53, 2);
656
          /* XXX This cannot determine any field in TM without some
657
             information.  */
658
          break;
659
        case 'w':
660
          /* Match number of weekday.  */
661
          get_number (0, 6, 1);
662
          tm->tm_wday = val;
663
          have_wday = 1;
664
          break;
665
        case 'y':
664 666
#ifdef _NL_CURRENT
665
       match_year_in_century:
667
        match_year_in_century:
666 668
#endif
667
         /* Match year within century.  */
668
         get_number (0, 99, 2);
669
         /* The "Year 2000: The Millennium Rollover" paper suggests that
670
            values in the range 69-99 refer to the twentieth century.  */
671
         tm->tm_year = val >= 69 ? val : val + 100;
672
         /* Indicate that we want to use the century, if specified.  */
673
         want_century = 1;
674
         want_xday = 1;
675
         break;
676
       case 'Y':
677
         /* Match year including century number.  */
678
         get_number (0, 9999, 4);
679
         tm->tm_year = val - 1900;
680
         want_century = 0;
681
         want_xday = 1;
682
         break;
683
       case 'Z':
684
         /* XXX How to handle this?  */
685
         break;
686
       case 'E':
669
          /* Match year within century.  */
670
          get_number (0, 99, 2);
671
          /* The "Year 2000: The Millennium Rollover" paper suggests that
672
             values in the range 69-99 refer to the twentieth century.  */
673
          tm->tm_year = val >= 69 ? val : val + 100;
674
          /* Indicate that we want to use the century, if specified.  */
675
          want_century = 1;
676
          want_xday = 1;
677
          break;
678
        case 'Y':
679
          /* Match year including century number.  */
680
          get_number (0, 9999, 4);
681
          tm->tm_year = val - 1900;
682
          want_century = 0;
683
          want_xday = 1;
684
          break;
685
        case 'Z':
686
          /* XXX How to handle this?  */
687
          break;
688
        case 'E':
687 689
#ifdef _NL_CURRENT
688
         switch (*fmt++)
689
           {
690
           case 'c':
691
             /* Match locale's alternate date and time format.  */
692
             if (*decided != raw)
693
               {
694
                 const char *fmt = _NL_CURRENT (LC_TIME, ERA_D_T_FMT);
690
          switch (*fmt++)
691
            {
692
            case 'c':
693
              /* Match locale's alternate date and time format.  */
694
              if (*decided != raw)
695
                {
696
                  const char *fmt = _NL_CURRENT (LC_TIME, ERA_D_T_FMT);
695 697

                
696
                 if (*fmt == '\0')
697
                   fmt = _NL_CURRENT (LC_TIME, D_T_FMT);
698
                  if (*fmt == '\0')
699
                    fmt = _NL_CURRENT (LC_TIME, D_T_FMT);
698 700

                
699
                 if (!recursive (fmt))
700
                   {
701
                     if (*decided == loc)
702
                       return NULL;
703
                     else
704
                       rp = rp_backup;
705
                   }
706
                 else
707
                   {
708
                     if (strcmp (fmt, HERE_D_T_FMT))
709
                       *decided = loc;
710
                     want_xday = 1;
711
                     break;
712
                   }
713
                 *decided = raw;
714
               }
715
             /* The C locale has no era information, so use the
716
                normal representation.  */
717
             if (!recursive (HERE_D_T_FMT))
718
               return NULL;
719
             want_xday = 1;
720
             break;
721
           case 'C':
722
             if (*decided != raw)
723
               {
724
                 if (era_cnt >= 0)
725
                   {
726
                     era = _nl_select_era_entry (era_cnt);
727
                     if (match_string (era->era_name, rp))
728
                       {
729
                         *decided = loc;
730
                         break;
731
                       }
732
                     else
733
                       return NULL;
734
                   }
735
                 else
736
                   {
737
                     num_eras = _NL_CURRENT_WORD (LC_TIME,
738
                                                  _NL_TIME_ERA_NUM_ENTRIES);
739
                     for (era_cnt = 0; era_cnt < (int) num_eras;
740
                          ++era_cnt, rp = rp_backup)
741
                       {
742
                         era = _nl_select_era_entry (era_cnt);
743
                         if (match_string (era->era_name, rp))
744
                           {
745
                             *decided = loc;
746
                             break;
747
                           }
748
                       }
749
                     if (era_cnt == (int) num_eras)
750
                       {
751
                         era_cnt = -1;
752
                         if (*decided == loc)
753
                           return NULL;
754
                       }
755
                     else
756
                       break;
757
                   }
701
                  if (!recursive (fmt))
702
                    {
703
                      if (*decided == loc)
704
                        return NULL;
705
                      else
706
                        rp = rp_backup;
707
                    }
708
                  else
709
                    {
710
                      if (strcmp (fmt, HERE_D_T_FMT))
711
                        *decided = loc;
712
                      want_xday = 1;
713
                      break;
714
                    }
715
                  *decided = raw;
716
                }
717
              /* The C locale has no era information, so use the
718
                 normal representation.  */
719
              if (!recursive (HERE_D_T_FMT))
720
                return NULL;
721
              want_xday = 1;
722
              break;
723
            case 'C':
724
              if (*decided != raw)
725
                {
726
                  if (era_cnt >= 0)
727
                    {
728
                      era = _nl_select_era_entry (era_cnt);
729
                      if (match_string (era->era_name, rp))
730
                        {
731
                          *decided = loc;
732
                          break;
733
                        }
734
                      else
735
                        return NULL;
736
                    }
737
                  else
738
                    {
739
                      num_eras = _NL_CURRENT_WORD (LC_TIME,
740
                                                   _NL_TIME_ERA_NUM_ENTRIES);
741
                      for (era_cnt = 0; era_cnt < (int) num_eras;
742
                           ++era_cnt, rp = rp_backup)
743
                        {
744
                          era = _nl_select_era_entry (era_cnt);
745
                          if (match_string (era->era_name, rp))
746
                            {
747
                              *decided = loc;
748
                              break;
749
                            }
750
                        }
751
                      if (era_cnt == (int) num_eras)
752
                        {
753
                          era_cnt = -1;
754
                          if (*decided == loc)
755
                            return NULL;
756
                        }
757
                      else
758
                        break;
759
                    }
758 760

                
759
                 *decided = raw;
760
               }
761
             /* The C locale has no era information, so use the
762
                normal representation.  */
763
             goto match_century;
764
           case 'y':
765
             if (*decided == raw)
766
               goto match_year_in_century;
761
                  *decided = raw;
762
                }
763
              /* The C locale has no era information, so use the
764
                 normal representation.  */
765
              goto match_century;
766
            case 'y':
767
              if (*decided == raw)
768
                goto match_year_in_century;
767 769

                
768
             get_number(0, 9999, 4);
769
             tm->tm_year = val;
770
             want_era = 1;
771
             want_xday = 1;
772
             break;
773
           case 'Y':
774
             if (*decided != raw)
775
               {
776
                 num_eras = _NL_CURRENT_WORD (LC_TIME,
777
                                              _NL_TIME_ERA_NUM_ENTRIES);
778
                 for (era_cnt = 0; era_cnt < (int) num_eras;
779
                      ++era_cnt, rp = rp_backup)
780
                   {
781
                     era = _nl_select_era_entry (era_cnt);
782
                     if (recursive (era->era_format))
783
                       break;
784
                   }
785
                 if (era_cnt == (int) num_eras)
786
                   {
787
                     era_cnt = -1;
788
                     if (*decided == loc)
789
                       return NULL;
790
                     else
791
                       rp = rp_backup;
792
                   }
793
                 else
794
                   {
795
                     *decided = loc;
796
                     era_cnt = -1;
797
                     break;
798
                   }
770
              get_number(0, 9999, 4);
771
              tm->tm_year = val;
772
              want_era = 1;
773
              want_xday = 1;
774
              break;
775
            case 'Y':
776
              if (*decided != raw)
777
                {
778
                  num_eras = _NL_CURRENT_WORD (LC_TIME,
779
                                               _NL_TIME_ERA_NUM_ENTRIES);
780
                  for (era_cnt = 0; era_cnt < (int) num_eras;
781
                       ++era_cnt, rp = rp_backup)
782
                    {
783
                      era = _nl_select_era_entry (era_cnt);
784
                      if (recursive (era->era_format))
785
                        break;
786
                    }
787
                  if (era_cnt == (int) num_eras)
788
                    {
789
                      era_cnt = -1;
790
                      if (*decided == loc)
791
                        return NULL;
792
                      else
793
                        rp = rp_backup;
794
                    }
795
                  else
796
                    {
797
                      *decided = loc;
798
                      era_cnt = -1;
799
                      break;
800
                    }
799 801

                
800
                 *decided = raw;
801
               }
802
             get_number (0, 9999, 4);
803
             tm->tm_year = val - 1900;
804
             want_century = 0;
805
             want_xday = 1;
806
             break;
807
           case 'x':
808
             if (*decided != raw)
809
               {
810
                 const char *fmt = _NL_CURRENT (LC_TIME, ERA_D_FMT);
802
                  *decided = raw;
803
                }
804
              get_number (0, 9999, 4);
805
              tm->tm_year = val - 1900;
806
              want_century = 0;
807
              want_xday = 1;
808
              break;
809
            case 'x':
810
              if (*decided != raw)
811
                {
812
                  const char *fmt = _NL_CURRENT (LC_TIME, ERA_D_FMT);
811 813

                
812
                 if (*fmt == '\0')
813
                   fmt = _NL_CURRENT (LC_TIME, D_FMT);
814
                  if (*fmt == '\0')
815
                    fmt = _NL_CURRENT (LC_TIME, D_FMT);
814 816

                
815
                 if (!recursive (fmt))
816
                   {
817
                     if (*decided == loc)
818
                       return NULL;
819
                     else
820
                       rp = rp_backup;
821
                   }
822
                 else
823
                   {
824
                     if (strcmp (fmt, HERE_D_FMT))
825
                       *decided = loc;
826
                     break;
827
                   }
828
                 *decided = raw;
829
               }
830
             if (!recursive (HERE_D_FMT))
831
               return NULL;
832
             break;
833
           case 'X':
834
             if (*decided != raw)
835
               {
836
                 const char *fmt = _NL_CURRENT (LC_TIME, ERA_T_FMT);
817
                  if (!recursive (fmt))
818
                    {
819
                      if (*decided == loc)
820
                        return NULL;
821
                      else
822
                        rp = rp_backup;
823
                    }
824
                  else
825
                    {
826
                      if (strcmp (fmt, HERE_D_FMT))
827
                        *decided = loc;
828
                      break;
829
                    }
830
                  *decided = raw;
831
                }
832
              if (!recursive (HERE_D_FMT))
833
                return NULL;
834
              break;
835
            case 'X':
836
              if (*decided != raw)
837
                {
838
                  const char *fmt = _NL_CURRENT (LC_TIME, ERA_T_FMT);
837 839

                
838
                 if (*fmt == '\0')
839
                   fmt = _NL_CURRENT (LC_TIME, T_FMT);
840
                  if (*fmt == '\0')
841
                    fmt = _NL_CURRENT (LC_TIME, T_FMT);
840 842

                
841
                 if (!recursive (fmt))
842
                   {
843
                     if (*decided == loc)
844
                       return NULL;
845
                     else
846
                       rp = rp_backup;
847
                   }
848
                 else
849
                   {
850
                     if (strcmp (fmt, HERE_T_FMT))
851
                       *decided = loc;
852
                     break;
853
                   }
854
                 *decided = raw;
855
               }
856
             if (!recursive (HERE_T_FMT))
857
               return NULL;
858
             break;
859
           default:
860
             return NULL;
861
           }
862
         break;
843
                  if (!recursive (fmt))
844
                    {
845
                      if (*decided == loc)
846
                        return NULL;
847
                      else
848
                        rp = rp_backup;
849
                    }
850
                  else
851
                    {
852
                      if (strcmp (fmt, HERE_T_FMT))
853
                        *decided = loc;
854
                      break;
855
                    }
856
                  *decided = raw;
857
                }
858
              if (!recursive (HERE_T_FMT))
859
                return NULL;
860
              break;
861
            default:
862
              return NULL;
863
            }
864
          break;
863 865
#else
864
         /* We have no information about the era format.  Just use
865
            the normal format.  */
866
         if (*fmt != 'c' && *fmt != 'C' && *fmt != 'y' && *fmt != 'Y'
867
             && *fmt != 'x' && *fmt != 'X')
868
           /* This is an illegal format.  */
869
           return NULL;
866
          /* We have no information about the era format.  Just use
867
             the normal format.  */
868
          if (*fmt != 'c' && *fmt != 'C' && *fmt != 'y' && *fmt != 'Y'
869
              && *fmt != 'x' && *fmt != 'X')
870
            /* This is an illegal format.  */
871
            return NULL;
870 872

                
871
         goto start_over;
873
          goto start_over;
872 874
#endif
873
       case 'O':
874
         switch (*fmt++)
875
           {
876
           case 'd':
877
           case 'e':
878
             /* Match day of month using alternate numeric symbols.  */
879
             get_alt_number (1, 31, 2);
880
             tm->tm_mday = val;
881
             have_mday = 1;
882
             want_xday = 1;
883
             break;
884
           case 'H':
885
             /* Match hour in 24-hour clock using alternate numeric
886
                symbols.  */
887
             get_alt_number (0, 23, 2);
888
             tm->tm_hour = val;
889
             have_I = 0;
890
             break;
891
           case 'I':
892
             /* Match hour in 12-hour clock using alternate numeric
893
                symbols.  */
894
             get_alt_number (1, 12, 2);
895
             tm->tm_hour = val - 1;
896
             have_I = 1;
897
             break;
898
           case 'm':
899
             /* Match month using alternate numeric symbols.  */
900
             get_alt_number (1, 12, 2);
901
             tm->tm_mon = val - 1;
902
             have_mon = 1;
903
             want_xday = 1;
904
             break;
905
           case 'M':
906
             /* Match minutes using alternate numeric symbols.  */
907
             get_alt_number (0, 59, 2);
908
             tm->tm_min = val;
909
             break;
910
           case 'S':
911
             /* Match seconds using alternate numeric symbols.  */
912
             get_alt_number (0, 61, 2);
913
             tm->tm_sec = val;
914
             break;
915
           case 'U':
916
           case 'V':
917
           case 'W':
918
             get_alt_number (0, 53, 2);
919
             /* XXX This cannot determine any field in TM without
920
                further information.  */
921
             break;
922
           case 'w':
923
             /* Match number of weekday using alternate numeric symbols.  */
924
             get_alt_number (0, 6, 1);
925
             tm->tm_wday = val;
926
             have_wday = 1;
927
             break;
928
           case 'y':
929
             /* Match year within century using alternate numeric symbols.  */
930
             get_alt_number (0, 99, 2);
931
             tm->tm_year = val >= 69 ? val : val + 100;
932
             want_xday = 1;
933
             break;
934
           default:
935
             return NULL;
936
           }
937
         break;
938
       default:
939
         return NULL;
940
       }
875
        case 'O':
876
          switch (*fmt++)
877
            {
878
            case 'd':
879
            case 'e':
880
              /* Match day of month using alternate numeric symbols.  */
881
              get_alt_number (1, 31, 2);
882
              tm->tm_mday = val;
883
              have_mday = 1;
884
              want_xday = 1;
885
              break;
886
            case 'H':
887
              /* Match hour in 24-hour clock using alternate numeric
888
                 symbols.  */
889
              get_alt_number (0, 23, 2);
890
              tm->tm_hour = val;
891
              have_I = 0;
892
              break;
893
            case 'I':
894
              /* Match hour in 12-hour clock using alternate numeric
895
                 symbols.  */
896
              get_alt_number (1, 12, 2);
897
              tm->tm_hour = val - 1;
898
              have_I = 1;
899
              break;
900
            case 'm':
901
              /* Match month using alternate numeric symbols.  */
902
              get_alt_number (1, 12, 2);
903
              tm->tm_mon = val - 1;
904
              have_mon = 1;
905
              want_xday = 1;
906
              break;
907
            case 'M':
908
              /* Match minutes using alternate numeric symbols.  */
909
              get_alt_number (0, 59, 2);
910
              tm->tm_min = val;
911
              break;
912
            case 'S':
913
              /* Match seconds using alternate numeric symbols.  */
914
              get_alt_number (0, 61, 2);
915
              tm->tm_sec = val;
916
              break;
917
            case 'U':
918
            case 'V':
919
            case 'W':
920
              get_alt_number (0, 53, 2);
921
              /* XXX This cannot determine any field in TM without
922
                 further information.  */
923
              break;
924
            case 'w':
925
              /* Match number of weekday using alternate numeric symbols.  */
926
              get_alt_number (0, 6, 1);
927
              tm->tm_wday = val;
928
              have_wday = 1;
929
              break;
930
            case 'y':
931
              /* Match year within century using alternate numeric symbols.  */
932
              get_alt_number (0, 99, 2);
933
              tm->tm_year = val >= 69 ? val : val + 100;
934
              want_xday = 1;
935
              break;
936
            default:
937
              return NULL;
938
            }
939
          break;
940
        default:
941
          return NULL;
942
        }
941 943
    }
942 944

                
943 945
  if (have_I && is_pm)
... ...
946 948
  if (century != -1)
947 949
    {
948 950
      if (want_century)
949
       tm->tm_year = tm->tm_year % 100 + (century - 19) * 100;
951
        tm->tm_year = tm->tm_year % 100 + (century - 19) * 100;
950 952
      else
951
       /* Only the century, but not the year.  Strange, but so be it.  */
952
       tm->tm_year = (century - 19) * 100;
953
        /* Only the century, but not the year.  Strange, but so be it.  */
954
        tm->tm_year = (century - 19) * 100;
953 955
    }
954 956

                
955 957
#ifdef _NL_CURRENT
... ...
957 959
    {
958 960
      era = _nl_select_era_entry(era_cnt);
959 961
      if (want_era)
960
       tm->tm_year = (era->start_date[0]
961
                      + ((tm->tm_year - era->offset)
962
                         * era->absolute_direction));
962
        tm->tm_year = (era->start_date[0]
963
                       + ((tm->tm_year - era->offset)
964
                          * era->absolute_direction));
963 965
      else
964
       /* Era start year assumed.  */
965
       tm->tm_year = era->start_date[0];
966
        /* Era start year assumed.  */
967
        tm->tm_year = era->start_date[0];
966 968
    }
967 969
  else
968 970
#endif
... ...
972 974
  if (want_xday && !have_wday)
973 975
    {
974 976
      if ( !(have_mon && have_mday) && have_yday)
975
       {
976
         /* We don't have tm_mon and/or tm_mday, compute them.  */
977
         int t_mon = 0;
978
         while (__mon_yday[__isleap(1900 + tm->tm_year)][t_mon] <= tm->tm_yday)
979
             t_mon++;
980
         if (!have_mon)
981
             tm->tm_mon = t_mon - 1;
982
         if (!have_mday)
983
             tm->tm_mday =
984
               (tm->tm_yday
985
                - __mon_yday[__isleap(1900 + tm->tm_year)][t_mon - 1] + 1);
986
       }
977
        {
978
          /* We don't have tm_mon and/or tm_mday, compute them.  */
979
          int t_mon = 0;
980
          while (__mon_yday[__isleap(1900 + tm->tm_year)][t_mon] <= tm->tm_yday)
981
              t_mon++;
982
          if (!have_mon)
983
              tm->tm_mon = t_mon - 1;
984
          if (!have_mday)
985
              tm->tm_mday =
986
                (tm->tm_yday
987
                 - __mon_yday[__isleap(1900 + tm->tm_year)][t_mon - 1] + 1);
988
        }
987 989
      day_of_the_week (tm);
988 990
    }
989 991
  if (want_xday && !have_yday)
trunk/nntpgrab_core/download_thread.c (revision 1857)
515 515
                            connection_error_occured = TRUE;
516 516
                        }
517 517
                    } else {
518
                        ng_plugin_emit_log_msg(NULL, NG_LOG_LEVEL_INFO, "nntpconnection_connect_to_server SUCCEEDED, conn_id = %i, poll_fd = %i", conn->connection_id, conn->poll_fd.fd);
518
                        ng_plugin_emit_log_msg(NULL, NG_LOG_LEVEL_INFO, "nntpconnection_connect_to_server SUCCEEDED, conn_id = %i, poll_fd = %i", conn->connection_id, (int) conn->poll_fd.fd);
519 519
                        reset_poll_fd_list(active_connections, &active_connection_polls, &num_active_connections);
520 520
                    }
521 521
                }
trunk/nntpgrab_core/nntpconnection.c (revision 1857)
586 586
static void
587 587
nntpconnection_process_xover_data(NntpConnection *conn)
588 588
{
589
#if 0
589 590
    char buf[1024];
590 591
    int length = 0;
591 592
    gboolean more_data_ready = FALSE;
... ...
652 653
    }
653 654

                
654 655
    return;
656
#endif
655 657
}
656 658

                
657 659
void
... ...
660 662
    g_return_if_fail(conn != NULL);
661 663

                
662 664
    if (!conn->active_method) {
663
        ng_plugin_emit_log_msg(NULL, NG_LOG_LEVEL_INFO, "NNTP connection to server '%s' (connection_id %i, poll_fd %i) is in an undefined state", conn->server_info.servername, conn->connection_id, conn->poll_fd.fd);
665
        ng_plugin_emit_log_msg(NULL, NG_LOG_LEVEL_INFO, "NNTP connection to server '%s' (connection_id %i, poll_fd %i) is in an undefined state", conn->server_info.servername, conn->connection_id, (int) conn->poll_fd.fd);
664 666
        nntpconnection_disconnect_from_server(conn, DISCONNECT_UNEXPECTED, _("NNTP Connection is in an undefined state"), __FILE__, __LINE__);
665 667
        return;
666 668
    }
trunk/nntpgrab_core/nntpconnection_backend_native.c (revision 1857)
124 124
{
125 125
    NntpconnectionBackendNativePrivate *conn_priv = NNTPCONNECTION_BACKEND_NATIVE(conn)->priv;
126 126
    int retval;
127
#ifdef WIN32
128
    char *errmsg_tmp = NULL;
129
#endif
130 127

                
131 128
    g_return_val_if_fail(conn != NULL, FALSE);
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff