Implemented support for very long strings a la spss v13/v14
[pspp-builds.git] / src / data / data-in.c
1 /* PSPP - computes sample statistics.
2    Copyright (C) 1997-9, 2000 Free Software Foundation, Inc.
3    Written by Ben Pfaff <blp@gnu.org>.
4
5    This program is free software; you can redistribute it and/or
6    modify it under the terms of the GNU General Public License as
7    published by the Free Software Foundation; either version 2 of the
8    License, or (at your option) any later version.
9
10    This program is distributed in the hope that it will be useful, but
11    WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    General Public License for more details.
14
15    You should have received a copy of the GNU General Public License
16    along with this program; if not, write to the Free Software
17    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18    02110-1301, USA. */
19
20 #include <config.h>
21 #include "data-in.h"
22 #include <libpspp/message.h>
23 #include <math.h>
24 #include <ctype.h>
25 #include <stdarg.h>
26 #include <stddef.h>
27 #include <stdio.h>
28 #include <stdlib.h>
29 #include <stdbool.h>
30 #include <libpspp/message.h>
31 #include "calendar.h"
32 #include <libpspp/compiler.h>
33 #include "identifier.h"
34 #include <libpspp/magic.h>
35 #include <libpspp/misc.h>
36 #include "settings.h"
37 #include <libpspp/str.h>
38 #include "variable.h"
39
40 #include "gettext.h"
41 #define _(msgid) gettext (msgid)
42 \f
43 /* Specialized error routine. */
44
45 static void dls_error (const struct data_in *, const char *format, ...)
46      PRINTF_FORMAT (2, 3);
47
48 static void
49 vdls_error (const struct data_in *i, const char *format, va_list args)
50 {
51   struct msg m;
52   struct string text;
53
54   if (i->flags & DI_IGNORE_ERROR)
55     return;
56
57   ds_init (&text, 64);
58   if (i->f1 == i->f2)
59     ds_printf (&text, _("(column %d"), i->f1);
60   else
61     ds_printf (&text, _("(columns %d-%d"), i->f1, i->f2);
62   ds_printf (&text, _(", field type %s) "), fmt_to_string (&i->format));
63   ds_vprintf (&text, format, args);
64
65   m.category = MSG_DATA;
66   m.severity = MSG_ERROR;
67   msg_location (&m.where);
68   m.text = ds_c_str (&text);
69
70   msg_emit (&m);
71 }
72
73 static void
74 dls_error (const struct data_in *i, const char *format, ...) 
75 {
76   va_list args;
77
78   va_start (args, format);
79   vdls_error (i, format, args);
80   va_end (args);
81 }
82 \f
83 /* Parsing utility functions. */
84
85 /* Excludes leading and trailing whitespace from I by adjusting
86    pointers. */
87 static void
88 trim_whitespace (struct data_in *i)
89 {
90   while (i->s < i->e && isspace ((unsigned char) i->s[0])) 
91     i->s++;
92
93   while (i->s < i->e && isspace ((unsigned char) i->e[-1]))
94     i->e--;
95 }
96
97 /* Returns nonzero if we're not at the end of the string being
98    parsed. */
99 static inline bool
100 have_char (struct data_in *i)
101 {
102   return i->s < i->e;
103 }
104
105 /* If implied decimal places are enabled, apply them to
106    I->v->f. */
107 static void
108 apply_implied_decimals (struct data_in *i) 
109 {
110   if ((i->flags & DI_IMPLIED_DECIMALS) && i->format.d > 0)
111     i->v->f /= pow (10., i->format.d);
112 }
113 \f
114 /* Format parsers. */ 
115
116 static bool parse_int (struct data_in *i, long *result);
117
118 /* This function is based on strtod() from the GNU C library. */
119 static bool
120 parse_numeric (struct data_in *i)
121 {
122   int sign;                     /* +1 or -1. */
123   double num;                   /* The number so far.  */
124
125   bool got_dot;                 /* Found a decimal point.  */
126   size_t digit_cnt;             /* Count of digits.  */
127
128   int decimal;                  /* Decimal point character. */
129   int grouping;                 /* Grouping character. */
130
131   long int exponent;            /* Number's exponent. */
132   int type;                     /* Usually same as i->format.type. */
133
134   trim_whitespace (i);
135
136   type = i->format.type;
137   if (type == FMT_DOLLAR && have_char (i) && *i->s == '$')
138     {
139       i->s++;
140       type = FMT_COMMA;
141     }
142
143   /* Get the sign.  */
144   if (have_char (i))
145     {
146       sign = *i->s == '-' ? -1 : 1;
147       if (*i->s == '-' || *i->s == '+')
148         i->s++;
149     }
150   else
151     sign = 1;
152   
153   if (type != FMT_DOT)
154     {
155       decimal = get_decimal();
156       grouping = get_grouping();
157     }
158   else
159     {
160       decimal = get_grouping();
161       grouping = get_decimal();
162     }
163
164   i->v->f = SYSMIS;
165   num = 0.0;
166   got_dot = false;
167   digit_cnt = 0;
168   exponent = 0;
169   for (; have_char (i); i->s++)
170     {
171       if (isdigit ((unsigned char) *i->s))
172         {
173           digit_cnt++;
174
175           /* Make sure that multiplication by 10 will not overflow.  */
176           if (num > DBL_MAX * 0.1)
177             /* The value of the digit doesn't matter, since we have already
178                gotten as many digits as can be represented in a `double'.
179                This doesn't necessarily mean the result will overflow.
180                The exponent may reduce it to within range.
181
182                We just need to record that there was another
183                digit so that we can multiply by 10 later.  */
184             ++exponent;
185           else
186             num = (num * 10.0) + (*i->s - '0');
187
188           /* Keep track of the number of digits after the decimal point.
189              If we just divided by 10 here, we would lose precision.  */
190           if (got_dot)
191             --exponent;
192         }
193       else if (!got_dot && *i->s == decimal)
194         /* Record that we have found the decimal point.  */
195         got_dot = true;
196       else if ((type != FMT_COMMA && type != FMT_DOT) || *i->s != grouping)
197         /* Any other character terminates the number.  */
198         break;
199     }
200
201   if (!digit_cnt)
202     {
203       if (got_dot)
204         {
205           i->v->f = SYSMIS;
206           return true;
207         }
208       dls_error (i, _("Field does not form a valid floating-point constant."));
209       i->v->f = SYSMIS;
210       return false;
211     }
212   
213   if (have_char (i) && strchr ("eEdD-+", *i->s))
214     {
215       /* Get the exponent specified after the `e' or `E'.  */
216       long exp;
217
218       if (isalpha ((unsigned char) *i->s))
219         i->s++;
220       if (!parse_int (i, &exp))
221         {
222           i->v->f = SYSMIS;
223           return false;
224         }
225
226       exponent += exp;
227     }
228   else if (!got_dot && (i->flags & DI_IMPLIED_DECIMALS))
229     exponent -= i->format.d;
230
231   if (type == FMT_PCT && have_char (i) && *i->s == '%')
232     i->s++;
233   if (i->s < i->e)
234     {
235       dls_error (i, _("Field contents followed by garbage."));
236       i->v->f = SYSMIS;
237       return false;
238     }
239
240   if (num == 0.0)
241     {
242       i->v->f = 0.0;
243       return true;
244     }
245
246   /* Multiply NUM by 10 to the EXPONENT power, checking for overflow
247      and underflow.  */
248   if (exponent < 0)
249     {
250       if (-exponent + digit_cnt > -(DBL_MIN_10_EXP) + 5
251           || num < DBL_MIN * pow (10.0, (double) -exponent)) 
252         {
253           dls_error (i, _("Underflow in floating-point constant."));
254           i->v->f = 0.0;
255           return false;
256         }
257
258       num *= pow (10.0, (double) exponent);
259     }
260   else if (exponent > 0)
261     {
262       if (num > DBL_MAX * pow (10.0, (double) -exponent))
263         {
264           dls_error (i, _("Overflow in floating-point constant."));
265           i->v->f = SYSMIS;
266           return false;
267         }
268       
269       num *= pow (10.0, (double) exponent);
270     }
271
272   i->v->f = sign > 0 ? num : -num;
273   return true;
274 }
275
276 /* Returns the integer value of hex digit C. */
277 static inline int
278 hexit_value (int c)
279 {
280   const char s[] = "0123456789abcdef";
281   const char *cp = strchr (s, tolower ((unsigned char) c));
282
283   assert (cp != NULL);
284   return cp - s;
285 }
286
287 static inline bool
288 parse_N (struct data_in *i)
289 {
290   const char *cp;
291
292   i->v->f = 0;
293   for (cp = i->s; cp < i->e; cp++)
294     {
295       if (!isdigit ((unsigned char) *cp))
296         {
297           dls_error (i, _("All characters in field must be digits."));
298           return false;
299         }
300
301       i->v->f = i->v->f * 10.0 + (*cp - '0');
302     }
303
304   apply_implied_decimals (i);
305   return true;
306 }
307
308 static inline bool
309 parse_PIBHEX (struct data_in *i)
310 {
311   double n;
312   const char *cp;
313
314   trim_whitespace (i);
315
316   n = 0.0;
317   for (cp = i->s; cp < i->e; cp++)
318     {
319       if (!isxdigit ((unsigned char) *cp))
320         {
321           dls_error (i, _("Unrecognized character in field."));
322           return false;
323         }
324
325       n = n * 16.0 + hexit_value (*cp);
326     }
327   
328   i->v->f = n;
329   return true;
330 }
331
332 static inline bool
333 parse_RBHEX (struct data_in *i)
334 {
335   /* Validate input. */
336   trim_whitespace (i);
337   if ((i->e - i->s) % 2)
338     {
339       dls_error (i, _("Field must have even length."));
340       return false;
341     }
342   
343   {
344     const char *cp;
345     
346     for (cp = i->s; cp < i->e; cp++)
347       if (!isxdigit ((unsigned char) *cp))
348         {
349           dls_error (i, _("Field must contain only hex digits."));
350           return false;
351         }
352   }
353   
354   /* Parse input. */
355   {
356     union
357       {
358         double d;
359         unsigned char c[sizeof (double)];
360       }
361     u;
362
363     int j;
364
365     memset (u.c, 0, sizeof u.c);
366     for (j = 0; j < min ((i->e - i->s) / 2, sizeof u.d); j++)
367       u.c[j] = 16 * hexit_value (i->s[j * 2]) + hexit_value (i->s[j * 2 + 1]);
368
369     i->v->f = u.d;
370   }
371   
372   return true;
373 }
374
375 static inline bool
376 parse_Z (struct data_in *i)
377 {
378   char buf[64];
379   bool got_dot = false;
380
381   /* Warn user that we suck. */
382   {
383     static bool warned;
384
385     if (!warned)
386       {
387         msg (MW, 
388              _("Quality of zoned decimal (Z) input format code is "
389                "suspect.  Check your results three times. Report bugs "
390                 "to %s."),PACKAGE_BUGREPORT);
391         warned = true;
392       }
393   }
394
395   /* Validate input. */
396   trim_whitespace (i);
397
398   if (i->e - i->s < 2)
399     {
400       dls_error (i, _("Zoned decimal field contains fewer than 2 "
401                       "characters."));
402       return false;
403     }
404
405   /* Copy sign into buf[0]. */
406   if ((i->e[-1] & 0xc0) != 0xc0)
407     {
408       dls_error (i, _("Bad sign byte in zoned decimal number."));
409       return false;
410     }
411   buf[0] = (i->e[-1] ^ (i->e[-1] >> 1)) & 0x10 ? '-' : '+';
412
413   /* Copy digits into buf[1 ... len - 1] and terminate string. */
414   {
415     const char *sp;
416     char *dp;
417
418     for (sp = i->s, dp = buf + 1; sp < i->e - 1; sp++, dp++)
419       if (*sp == '.') 
420         {
421           *dp = '.';
422           got_dot = true;
423         }
424       else if ((*sp & 0xf0) == 0xf0 && (*sp & 0xf) < 10)
425         *dp = (*sp & 0xf) + '0';
426       else
427         {
428           dls_error (i, _("Format error in zoned decimal number."));
429           return false;
430         }
431
432     *dp = '\0';
433   }
434
435   /* Parse as number. */
436   {
437     char *tail;
438     
439     i->v->f = strtod (buf, &tail);
440     if (tail != i->e)
441       {
442         dls_error (i, _("Error in syntax of zoned decimal number."));
443         return false;
444       }
445   }
446
447   if (!got_dot)
448     apply_implied_decimals (i);
449
450   return true;
451 }
452
453 static inline bool
454 parse_IB (struct data_in *i)
455 {
456 #ifndef WORDS_BIGENDIAN
457   char buf[64];
458 #endif
459   const unsigned char *p;
460
461   unsigned char xor;
462
463   /* We want the data to be in big-endian format.  If this is a
464      little-endian machine, reverse the byte order. */
465 #ifdef WORDS_BIGENDIAN
466   p = (const unsigned char *) i->s;
467 #else
468   memcpy (buf, i->s, i->e - i->s);
469   buf_reverse (buf, i->e - i->s);
470   p = (const unsigned char *) buf;
471 #endif
472
473   /* If the value is negative, we need to logical-NOT each value
474      before adding it. */
475   if (p[0] & 0x80)
476     xor = 0xff;
477   else
478     xor = 0x00;
479   
480   {
481     int j;
482
483     i->v->f = 0.0;
484     for (j = 0; j < i->e - i->s; j++)
485       i->v->f = i->v->f * 256.0 + (p[j] ^ xor);
486   }
487
488   /* If the value is negative, add 1 and set the sign, to complete a
489      two's-complement negation. */
490   if (p[0] & 0x80)
491     i->v->f = -(i->v->f + 1.0);
492
493   apply_implied_decimals (i);
494
495   return true;
496 }
497
498 static inline bool
499 parse_PIB (struct data_in *i)
500 {
501   int j;
502
503   i->v->f = 0.0;
504 #if WORDS_BIGENDIAN
505   for (j = 0; j < i->e - i->s; j++)
506     i->v->f = i->v->f * 256.0 + (unsigned char) i->s[j];
507 #else
508   for (j = i->e - i->s - 1; j >= 0; j--)
509     i->v->f = i->v->f * 256.0 + (unsigned char) i->s[j];
510 #endif
511
512   apply_implied_decimals (i);
513
514   return true;
515 }
516
517 static inline bool
518 parse_P (struct data_in *i)
519 {
520   const char *cp;
521
522   i->v->f = 0.0;
523   for (cp = i->s; cp < i->e - 1; cp++)
524     {
525       i->v->f = i->v->f * 10 + ((*cp >> 4) & 15);
526       i->v->f = i->v->f * 10 + (*cp & 15);
527     }
528   i->v->f = i->v->f * 10 + ((*cp >> 4) & 15);
529   if ((*cp ^ (*cp >> 1)) & 0x10)
530       i->v->f = -i->v->f;
531
532   apply_implied_decimals (i);
533
534   return true;
535 }
536
537 static inline bool
538 parse_PK (struct data_in *i)
539 {
540   const char *cp;
541
542   i->v->f = 0.0;
543   for (cp = i->s; cp < i->e; cp++)
544     {
545       i->v->f = i->v->f * 10 + ((*cp >> 4) & 15);
546       i->v->f = i->v->f * 10 + (*cp & 15);
547     }
548
549   apply_implied_decimals (i);
550
551   return true;
552 }
553
554 static inline bool
555 parse_RB (struct data_in *i)
556 {
557   union
558     {
559       double d;
560       unsigned char c[sizeof (double)];
561     }
562   u;
563
564   memset (u.c, 0, sizeof u.c);
565   memcpy (u.c, i->s, min (sizeof u.c, (size_t) (i->e - i->s)));
566   i->v->f = u.d;
567
568   return true;
569 }
570
571
572 static inline bool
573 parse_A (struct data_in *i)
574 {
575   const int bytes = width_to_bytes(i->format.w);
576
577   copy_mangle (i->v->s, bytes, i->s, i->e - i->s);
578   
579   return true;
580 }
581
582 static inline bool
583 parse_AHEX (struct data_in *i)
584 {
585   /* Validate input. */
586   trim_whitespace (i);
587   if ((i->e - i->s) % 2)
588     {
589       dls_error (i, _("Field must have even length."));
590       return false;
591     }
592
593   {
594     const char *cp;
595     
596     for (cp = i->s; cp < i->e; cp++)
597       if (!isxdigit ((unsigned char) *cp))
598         {
599           dls_error (i, _("Field must contain only hex digits."));
600           return false;
601         }
602   }
603   
604   {
605     int j;
606     
607     /* Parse input. */
608     for (j = 0; j < min (i->e - i->s, i->format.w); j += 2)
609       i->v->s[j / 2] = hexit_value (i->s[j]) * 16 + hexit_value (i->s[j + 1]);
610     memset (i->v->s + (i->e - i->s) / 2, ' ', (i->format.w - (i->e - i->s)) / 2);
611   }
612   
613   return true;
614 }
615 \f
616 /* Date & time format components. */
617
618 /* Advances *CP past any whitespace characters. */
619 static inline void
620 skip_whitespace (struct data_in *i)
621 {
622   while (isspace ((unsigned char) *i->s))
623     i->s++;
624 }
625
626 static inline bool
627 parse_leader (struct data_in *i)
628 {
629   skip_whitespace (i);
630   return true;
631 }
632
633 static inline bool
634 force_have_char (struct data_in *i)
635 {
636   if (have_char (i))
637     return true;
638
639   dls_error (i, _("Unexpected end of field."));
640   return false;
641 }
642
643 static bool
644 parse_int (struct data_in *i, long *result)
645 {
646   bool negative = false;
647   
648   if (!force_have_char (i))
649     return false;
650
651   if (*i->s == '+')
652     {
653       i->s++;
654       force_have_char (i);
655     }
656   else if (*i->s == '-')
657     {
658       negative = true;
659       i->s++;
660       force_have_char (i);
661     }
662   
663   if (!isdigit ((unsigned char) *i->s))
664     {
665       dls_error (i, _("Digit expected in field."));
666       return false;
667     }
668
669   *result = 0;
670   for (;;)
671     {
672       *result = *result * 10 + (*i->s++ - '0');
673       if (!have_char (i) || !isdigit ((unsigned char) *i->s))
674         break;
675     }
676
677   if (negative)
678     *result = -*result;
679   return true;
680 }
681
682 static bool
683 parse_day (struct data_in *i, long *day)
684 {
685   if (!parse_int (i, day))
686     return false;
687   if (*day >= 1 && *day <= 31)
688     return true;
689
690   dls_error (i, _("Day (%ld) must be between 1 and 31."), *day);
691   return false;
692 }
693
694 static bool
695 parse_day_count (struct data_in *i, long *day_count)
696 {
697   return parse_int (i, day_count);
698 }
699
700 static bool
701 parse_date_delimiter (struct data_in *i)
702 {
703   bool delim = false;
704
705   while (have_char (i)
706          && (*i->s == '-' || *i->s == '/' || isspace ((unsigned char) *i->s)
707              || *i->s == '.' || *i->s == ','))
708     {
709       delim = true;
710       i->s++;
711     }
712   if (delim)
713     return true;
714
715   dls_error (i, _("Delimiter expected between fields in date."));
716   return false;
717 }
718
719 /* Association between a name and a value. */
720 struct enum_name
721   {
722     const char *name;           /* Name. */
723     bool can_abbreviate;        /* True if name may be abbreviated. */
724     int value;                  /* Value associated with name. */
725   };
726
727 /* Reads a name from I and sets *OUTPUT to the value associated
728    with that name.  Returns true if successful, false otherwise. */
729 static bool
730 parse_enum (struct data_in *i, const char *what,
731             const struct enum_name *enum_names,
732             long *output) 
733 {
734   const char *name;
735   size_t length;
736   const struct enum_name *ep;
737
738   /* Consume alphabetic characters. */
739   name = i->s;
740   length = 0;
741   while (have_char (i) && isalpha ((unsigned char) *i->s)) 
742     {
743       length++;
744       i->s++; 
745     }
746   if (length == 0) 
747     {
748       dls_error (i, _("Parse error at `%c' expecting %s."), *i->s, what);
749       return false;
750     }
751
752   for (ep = enum_names; ep->name != NULL; ep++)
753     if ((ep->can_abbreviate
754          && lex_id_match_len (ep->name, strlen (ep->name), name, length))
755         || (!ep->can_abbreviate && length == strlen (ep->name)
756             && !buf_compare_case (name, ep->name, length)))
757       {
758         *output = ep->value;
759         return true;
760       }
761
762   dls_error (i, _("Unknown %s `%.*s'."), what, (int) length, name);
763   return false;
764 }
765
766 static bool
767 parse_month (struct data_in *i, long *month)
768 {
769   static const struct enum_name month_names[] = 
770     {
771       {"january", true, 1},
772       {"february", true, 2},
773       {"march", true, 3},
774       {"april", true, 4},
775       {"may", true, 5},
776       {"june", true, 6},
777       {"july", true, 7},
778       {"august", true, 8},
779       {"september", true, 9},
780       {"october", true, 10},
781       {"november", true, 11},
782       {"december", true, 12},
783
784       {"i", false, 1},
785       {"ii", false, 2},
786       {"iii", false, 3},
787       {"iv", false, 4},
788       {"iiii", false, 4},
789       {"v", false, 5},
790       {"vi", false, 6},
791       {"vii", false, 7},
792       {"viii", false, 8},
793       {"ix", false, 9},
794       {"viiii", false, 9},
795       {"x", false, 10},
796       {"xi", false, 11},
797       {"xii", false, 12},
798
799       {NULL, false, 0},
800     };
801
802   if (!force_have_char (i))
803     return false;
804   
805   if (isdigit ((unsigned char) *i->s))
806     {
807       if (!parse_int (i, month))
808         return false;
809       if (*month >= 1 && *month <= 12)
810         return true;
811       
812       dls_error (i, _("Month (%ld) must be between 1 and 12."), *month);
813       return false;
814     }
815   else 
816     return parse_enum (i, _("month"), month_names, month);
817 }
818
819 static bool
820 parse_year (struct data_in *i, long *year)
821 {
822   if (!parse_int (i, year))
823     return false;
824   
825   if (*year >= 0 && *year <= 199)
826     *year += 1900;
827   if (*year >= 1582 || *year <= 19999)
828     return true;
829
830   dls_error (i, _("Year (%ld) must be between 1582 and 19999."), *year);
831   return false;
832 }
833
834 static bool
835 parse_trailer (struct data_in *i)
836 {
837   skip_whitespace (i);
838   if (!have_char (i))
839     return true;
840   
841   dls_error (i, _("Trailing garbage \"%s\" following date."), i->s);
842   return false;
843 }
844
845 static bool
846 parse_julian (struct data_in *i, long *julian)
847 {
848   if (!parse_int (i, julian))
849     return false;
850    
851   {
852     int day = *julian % 1000;
853
854     if (day < 1 || day > 366)
855       {
856         dls_error (i, _("Julian day (%d) must be between 1 and 366."), day);
857         return false;
858       }
859   }
860   
861   {
862     int year = *julian / 1000;
863
864     if (year >= 0 && year <= 199)
865       *julian += 1900000L;
866     else if (year < 1582 || year > 19999)
867       {
868         dls_error (i, _("Year (%d) must be between 1582 and 19999."), year);
869         return false;
870       }
871   }
872
873   return true;
874 }
875
876 static bool
877 parse_quarter (struct data_in *i, long *quarter)
878 {
879   if (!parse_int (i, quarter))
880     return false;
881   if (*quarter >= 1 && *quarter <= 4)
882     return true;
883
884   dls_error (i, _("Quarter (%ld) must be between 1 and 4."), *quarter);
885   return false;
886 }
887
888 static bool
889 parse_q_delimiter (struct data_in *i)
890 {
891   skip_whitespace (i);
892   if (!have_char (i) || tolower ((unsigned char) *i->s) != 'q')
893     {
894       dls_error (i, _("`Q' expected between quarter and year."));
895       return false;
896     }
897   i->s++;
898   skip_whitespace (i);
899   return true;
900 }
901
902 static bool
903 parse_week (struct data_in *i, long *week)
904 {
905   if (!parse_int (i, week))
906     return false;
907   if (*week >= 1 && *week <= 53)
908     return true;
909
910   dls_error (i, _("Week (%ld) must be between 1 and 53."), *week);
911   return false;
912 }
913
914 static bool
915 parse_wk_delimiter (struct data_in *i)
916 {
917   skip_whitespace (i);
918   if (i->s + 1 >= i->e
919       || tolower ((unsigned char) i->s[0]) != 'w'
920       || tolower ((unsigned char) i->s[1]) != 'k')
921     {
922       dls_error (i, _("`WK' expected between week and year."));
923       return false;
924     }
925   i->s += 2;
926   skip_whitespace (i);
927   return true;
928 }
929
930 static bool
931 parse_time_delimiter (struct data_in *i)
932 {
933   bool delim = false;
934
935   while (have_char (i) && (*i->s == ':' || *i->s == '.'
936                            || isspace ((unsigned char) *i->s)))
937     {
938       delim = true;
939       i->s++;
940     }
941
942   if (delim)
943     return true;
944   
945   dls_error (i, _("Delimiter expected between fields in time."));
946   return false;
947 }
948
949 static bool
950 parse_hour (struct data_in *i, long *hour)
951 {
952   if (!parse_int (i, hour))
953     return false;
954   if (*hour >= 0)
955     return true;
956   
957   dls_error (i, _("Hour (%ld) must be positive."), *hour);
958   return false;
959 }
960
961 static bool
962 parse_minute (struct data_in *i, long *minute)
963 {
964   if (!parse_int (i, minute))
965     return false;
966   if (*minute >= 0 && *minute <= 59)
967     return true;
968   
969   dls_error (i, _("Minute (%ld) must be between 0 and 59."), *minute);
970   return false;
971 }
972
973 static bool
974 parse_opt_second (struct data_in *i, double *second)
975 {
976   bool delim = false;
977
978   char buf[64];
979   char *cp;
980
981   while (have_char (i)
982          && (*i->s == ':' || *i->s == '.' || isspace ((unsigned char) *i->s)))
983     {
984       delim = true;
985       i->s++;
986     }
987   
988   if (!delim || !isdigit ((unsigned char) *i->s))
989     {
990       *second = 0.0;
991       return true;
992     }
993
994   cp = buf;
995   while (have_char (i) && isdigit ((unsigned char) *i->s))
996     *cp++ = *i->s++;
997   if (have_char (i) && *i->s == '.')
998     *cp++ = *i->s++;
999   while (have_char (i) && isdigit ((unsigned char) *i->s))
1000     *cp++ = *i->s++;
1001   *cp = '\0';
1002   
1003   *second = strtod (buf, NULL);
1004
1005   return true;
1006 }
1007
1008 static bool
1009 parse_hour24 (struct data_in *i, long *hour24)
1010 {
1011   if (!parse_int (i, hour24))
1012     return false;
1013   if (*hour24 >= 0 && *hour24 <= 23)
1014     return true;
1015   
1016   dls_error (i, _("Hour (%ld) must be between 0 and 23."), *hour24);
1017   return false;
1018 }
1019
1020      
1021 static bool
1022 parse_weekday (struct data_in *i, long *weekday)
1023 {
1024   static const struct enum_name weekday_names[] = 
1025     {
1026       {"sunday", true, 1},
1027       {"su", true, 1},
1028       {"monday", true, 2},
1029       {"mo", true, 2},
1030       {"tuesday", true, 3},
1031       {"tu", true, 3},
1032       {"wednesday", true, 4},
1033       {"we", true, 4},
1034       {"thursday", true, 5},
1035       {"th", true, 5},
1036       {"friday", true, 6},
1037       {"fr", true, 6},
1038       {"saturday", true, 7},
1039       {"sa", true, 7},
1040       
1041       {NULL, false, 0},
1042     };
1043
1044   return parse_enum (i, _("weekday"), weekday_names, weekday);
1045 }
1046
1047 static bool
1048 parse_spaces (struct data_in *i)
1049 {
1050   skip_whitespace (i);
1051   return true;
1052 }
1053
1054 static bool
1055 parse_sign (struct data_in *i, int *sign)
1056 {
1057   if (!force_have_char (i))
1058     return false;
1059
1060   switch (*i->s)
1061     {
1062     case '-':
1063       i->s++;
1064       *sign = -1;
1065       break;
1066
1067     case '+':
1068       i->s++;
1069       /* fall through */
1070
1071     default:
1072       *sign = 1;
1073       break;
1074     }
1075
1076   return true;
1077 }
1078 \f
1079 /* Date & time formats. */
1080
1081 static void
1082 calendar_error (void *i_, const char *format, ...) 
1083 {
1084   struct data_in *i = i_;
1085   va_list args;
1086
1087   va_start (args, format);
1088   vdls_error (i, format, args);
1089   va_end (args);
1090 }
1091
1092 static bool
1093 ymd_to_ofs (struct data_in *i, int year, int month, int day, double *ofs) 
1094 {
1095   *ofs = calendar_gregorian_to_offset (year, month, day, calendar_error, i);
1096   return *ofs != SYSMIS;
1097 }
1098
1099 static bool
1100 ymd_to_date (struct data_in *i, int year, int month, int day, double *date) 
1101 {
1102   if (ymd_to_ofs (i, year, month, day, date)) 
1103     {
1104       *date *= 60. * 60. * 24.;
1105       return true; 
1106     }
1107   else
1108     return false;
1109 }
1110
1111 static bool
1112 parse_DATE (struct data_in *i)
1113 {
1114   long day, month, year;
1115
1116   return (parse_leader (i)
1117           && parse_day (i, &day)
1118           && parse_date_delimiter (i)
1119           && parse_month (i, &month)
1120           && parse_date_delimiter (i)
1121           && parse_year (i, &year)
1122           && parse_trailer (i)
1123           && ymd_to_date (i, year, month, day, &i->v->f));
1124 }
1125
1126 static bool
1127 parse_ADATE (struct data_in *i)
1128 {
1129   long month, day, year;
1130
1131   return (parse_leader (i)
1132           && parse_month (i, &month)
1133           && parse_date_delimiter (i)
1134           && parse_day (i, &day)
1135           && parse_date_delimiter (i)
1136           && parse_year (i, &year)
1137           && parse_trailer (i)
1138           && ymd_to_date (i, year, month, day, &i->v->f));
1139 }
1140
1141 static bool
1142 parse_EDATE (struct data_in *i)
1143 {
1144   long month, day, year;
1145
1146   return (parse_leader (i)
1147           && parse_day (i, &day)
1148           && parse_date_delimiter (i)
1149           && parse_month (i, &month)
1150           && parse_date_delimiter (i)
1151           && parse_year (i, &year)
1152           && parse_trailer (i)
1153           && ymd_to_date (i, year, month, day, &i->v->f));
1154 }
1155
1156 static bool
1157 parse_SDATE (struct data_in *i)
1158 {
1159   long month, day, year;
1160
1161   return (parse_leader (i)
1162           && parse_year (i, &year)
1163           && parse_date_delimiter (i)
1164           && parse_month (i, &month)
1165           && parse_date_delimiter (i)
1166           && parse_day (i, &day)
1167           && parse_trailer (i)
1168           && ymd_to_date (i, year, month, day, &i->v->f));
1169 }
1170
1171 static bool
1172 parse_JDATE (struct data_in *i)
1173 {
1174   long julian;
1175   double ofs;
1176   
1177   if (!parse_leader (i)
1178       || !parse_julian (i, &julian)
1179       || !parse_trailer (i)
1180       || !ymd_to_ofs (i, julian / 1000, 1, 1, &ofs))
1181     return false;
1182
1183   i->v->f = (ofs + julian % 1000 - 1) * 60. * 60. * 24.;
1184   return true;
1185 }
1186
1187 static bool
1188 parse_QYR (struct data_in *i)
1189 {
1190   long quarter, year;
1191
1192   return (parse_leader (i)
1193           && parse_quarter (i, &quarter)
1194           && parse_q_delimiter (i)
1195           && parse_year (i, &year)
1196           && parse_trailer (i)
1197           && ymd_to_date (i, year, (quarter - 1) * 3 + 1, 1, &i->v->f));
1198 }
1199
1200 static bool
1201 parse_MOYR (struct data_in *i)
1202 {
1203   long month, year;
1204
1205   return (parse_leader (i)
1206           && parse_month (i, &month)
1207           && parse_date_delimiter (i)
1208           && parse_year (i, &year)
1209           && parse_trailer (i)
1210           && ymd_to_date (i, year, month, 1, &i->v->f));
1211 }
1212
1213 static bool
1214 parse_WKYR (struct data_in *i)
1215 {
1216   long week, year;
1217   double ofs;
1218
1219   if (!parse_leader (i)
1220       || !parse_week (i, &week)
1221       || !parse_wk_delimiter (i)
1222       || !parse_year (i, &year)
1223       || !parse_trailer (i))
1224     return false;
1225
1226   if (year != 1582) 
1227     {
1228       if (!ymd_to_ofs (i, year, 1, 1, &ofs))
1229         return false;
1230     }
1231   else 
1232     {
1233       if (ymd_to_ofs (i, 1583, 1, 1, &ofs))
1234         return false;
1235       ofs -= 365;
1236     }
1237
1238   i->v->f = (ofs + (week - 1) * 7) * 60. * 60. * 24.;
1239   return true;
1240 }
1241
1242 static bool
1243 parse_TIME (struct data_in *i)
1244 {
1245   int sign;
1246   double second;
1247   long hour, minute;
1248
1249   if (!parse_leader (i)
1250       || !parse_sign (i, &sign)
1251       || !parse_spaces (i)
1252       || !parse_hour (i, &hour)
1253       || !parse_time_delimiter (i)
1254       || !parse_minute (i, &minute)
1255       || !parse_opt_second (i, &second))
1256     return false;
1257
1258   i->v->f = (hour * 60. * 60. + minute * 60. + second) * sign;
1259   return true;
1260 }
1261
1262 static bool
1263 parse_DTIME (struct data_in *i)
1264 {
1265   int sign;
1266   long day_count, hour;
1267   double second;
1268   long minute;
1269
1270   if (!parse_leader (i)
1271       || !parse_sign (i, &sign)
1272       || !parse_spaces (i)
1273       || !parse_day_count (i, &day_count)
1274       || !parse_time_delimiter (i)
1275       || !parse_hour (i, &hour)
1276       || !parse_time_delimiter (i)
1277       || !parse_minute (i, &minute)
1278       || !parse_opt_second (i, &second))
1279     return false;
1280
1281   i->v->f = (day_count * 60. * 60. * 24.
1282              + hour * 60. * 60.
1283              + minute * 60.
1284              + second) * sign;
1285   return true;
1286 }
1287
1288 static bool
1289 parse_DATETIME (struct data_in *i)
1290 {
1291   long day, month, year;
1292   long hour24;
1293   double second;
1294   long minute;
1295
1296   if (!parse_leader (i)
1297       || !parse_day (i, &day)
1298       || !parse_date_delimiter (i)
1299       || !parse_month (i, &month)
1300       || !parse_date_delimiter (i)
1301       || !parse_year (i, &year)
1302       || !parse_time_delimiter (i)
1303       || !parse_hour24 (i, &hour24)
1304       || !parse_time_delimiter (i)
1305       || !parse_minute (i, &minute)
1306       || !parse_opt_second (i, &second)
1307       || !ymd_to_date (i, year, month, day, &i->v->f))
1308     return false;
1309
1310   i->v->f += hour24 * 60. * 60. + minute * 60. + second;
1311   return true;
1312 }
1313
1314 static bool
1315 parse_WKDAY (struct data_in *i)
1316 {
1317   long weekday;
1318
1319   if (!parse_leader (i)
1320       || !parse_weekday (i, &weekday)
1321       || !parse_trailer (i))
1322     return false;
1323
1324   i->v->f = weekday;
1325   return true;
1326 }
1327
1328 static bool
1329 parse_MONTH (struct data_in *i)
1330 {
1331   long month;
1332
1333   if (!parse_leader (i)
1334       || !parse_month (i, &month)
1335       || !parse_trailer (i))
1336     return false;
1337
1338   i->v->f = month;
1339   return true;
1340 }
1341 \f
1342 /* Main dispatcher. */
1343
1344 static void
1345 default_result (struct data_in *i)
1346 {
1347   const struct fmt_desc *const fmt = &formats[i->format.type];
1348
1349   /* Default to SYSMIS or blanks. */
1350   if (fmt->cat & FCAT_STRING)
1351     memset (i->v->s, ' ', i->format.w);
1352   else
1353     i->v->f = get_blanks();
1354 }
1355
1356 bool
1357 data_in (struct data_in *i)
1358 {
1359   const struct fmt_desc *const fmt = &formats[i->format.type];
1360
1361   assert (check_input_specifier (&i->format, 0));
1362
1363   /* Check that we've got a string to work with. */
1364   if (i->e == i->s || i->format.w <= 0)
1365     {
1366       default_result (i);
1367       return true;
1368     }
1369
1370   i->f2 = i->f1 + (i->e - i->s) - 1;
1371
1372   /* Make sure that the string isn't too long. */
1373   if (i->format.w > fmt->Imax_w)
1374     {
1375       dls_error (i, _("Field too long (%d characters).  Truncated after "
1376                    "character %d."),
1377                  i->format.w, fmt->Imax_w);
1378       i->format.w = fmt->Imax_w;
1379     }
1380
1381   if (fmt->cat & FCAT_BLANKS_SYSMIS)
1382     {
1383       const char *cp;
1384
1385       cp = i->s;
1386       for (;;)
1387         {
1388           if (!isspace ((unsigned char) *cp))
1389             break;
1390
1391           if (++cp == i->e)
1392             {
1393               i->v->f = get_blanks();
1394               return true;
1395             }
1396         }
1397     }
1398   
1399   {
1400     static bool (*const handlers[FMT_NUMBER_OF_FORMATS])(struct data_in *) = 
1401       {
1402         parse_numeric, parse_N, parse_numeric, parse_numeric,
1403         parse_numeric, parse_numeric, parse_numeric,
1404         parse_Z, parse_A, parse_AHEX, parse_IB, parse_P, parse_PIB,
1405         parse_PIBHEX, parse_PK, parse_RB, parse_RBHEX,
1406         NULL, NULL, NULL, NULL, NULL,
1407         parse_DATE, parse_EDATE, parse_SDATE, parse_ADATE, parse_JDATE,
1408         parse_QYR, parse_MOYR, parse_WKYR,
1409         parse_DATETIME, parse_TIME, parse_DTIME,
1410         parse_WKDAY, parse_MONTH,
1411       };
1412
1413     bool (*handler)(struct data_in *);
1414     bool success;
1415
1416     handler = handlers[i->format.type];
1417     assert (handler != NULL);
1418
1419     success = handler (i);
1420     if (!success)
1421       default_result (i);
1422
1423     return success;
1424   }
1425 }
1426 \f
1427 /* Utility function. */
1428
1429 /* Sets DI->{s,e} appropriately given that LINE has length LEN and the
1430    field starts at one-based column FC and ends at one-based column
1431    LC, inclusive. */
1432 void
1433 data_in_finite_line (struct data_in *di, const char *line, size_t len,
1434                      int fc, int lc)
1435 {
1436   di->s = line + ((size_t) fc <= len ? fc - 1 : len);
1437   di->e = line + ((size_t) lc <= len ? lc : len);
1438 }