[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Pspp-cvs] Changes to pspp/src/data-in.c
From: |
Ben Pfaff |
Subject: |
[Pspp-cvs] Changes to pspp/src/data-in.c |
Date: |
Tue, 01 Mar 2005 03:16:23 -0500 |
Index: pspp/src/data-in.c
diff -u pspp/src/data-in.c:1.12 pspp/src/data-in.c:1.13
--- pspp/src/data-in.c:1.12 Mon May 31 05:50:27 2004
+++ pspp/src/data-in.c Tue Mar 1 08:16:15 2005
@@ -26,9 +26,10 @@
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
+#include "bool.h"
#include "error.h"
#include "getline.h"
-#include "julcal/julcal.h"
+#include "calendar.h"
#include "lexer.h"
#include "magic.h"
#include "misc.h"
@@ -45,43 +46,40 @@
PRINTF_FORMAT (2, 3);
static void
-dls_error (const struct data_in *i, const char *format, ...)
+vdls_error (const struct data_in *i, const char *format, va_list args)
{
- char buf[1024];
+ struct error e;
+ struct string title;
if (i->flags & DI_IGNORE_ERROR)
return;
- {
- va_list args;
+ ds_init (&title, 64);
+ if (!getl_reading_script)
+ ds_puts (&title, _("data-file error: "));
+ if (i->f1 == i->f2)
+ ds_printf (&title, _("(column %d"), i->f1);
+ else
+ ds_printf (&title, _("(columns %d-%d"), i->f1, i->f2);
+ ds_printf (&title, _(", field type %s) "), fmt_to_string (&i->format));
+
+ e.class = DE;
+ err_location (&e.where);
+ e.title = ds_c_str (&title);
- va_start (args, format);
- snprintf (buf, 1024, format, args);
- va_end (args);
- }
-
- {
- struct error e;
- struct string title;
+ err_vmsg (&e, format, args);
- ds_init (&title, 64);
- if (!getl_reading_script)
- ds_puts (&title, _("data-file error: "));
- if (i->f1 == i->f2)
- ds_printf (&title, _("(column %d"), i->f1);
- else
- ds_printf (&title, _("(columns %d-%d"), i->f1, i->f2);
- ds_printf (&title, _(", field type %s) "), fmt_to_string (&i->format));
-
- e.class = DE;
- err_location (&e.where);
- e.title = ds_c_str (&title);
- e.text = buf;
+ ds_destroy (&title);
+}
- err_vmsg (&e);
+static void
+dls_error (const struct data_in *i, const char *format, ...)
+{
+ va_list args;
- ds_destroy (&title);
- }
+ va_start (args, format);
+ vdls_error (i, format, args);
+ va_end (args);
}
/* Excludes leading and trailing whitespace from I by adjusting
@@ -1167,7 +1165,7 @@
{
case '-':
i->s++;
- *sign = 1;
+ *sign = -1;
break;
case '+':
@@ -1175,7 +1173,7 @@
/* fall through */
default:
- *sign = 0;
+ *sign = 1;
break;
}
@@ -1184,17 +1182,34 @@
/* Date & time formats. */
-static int
-valid_date (struct data_in *i)
+static void
+calendar_error (void *i_, const char *format, ...)
{
- if (i->v->f == SYSMIS)
+ struct data_in *i = i_;
+ va_list args;
+
+ va_start (args, format);
+ vdls_error (i, format, args);
+ va_end (args);
+}
+
+static bool
+ymd_to_ofs (struct data_in *i, int year, int month, int day, double *ofs)
+{
+ *ofs = calendar_gregorian_to_offset (year, month, day, calendar_error, i);
+ return *ofs != SYSMIS;
+}
+
+static bool
+ymd_to_date (struct data_in *i, int year, int month, int day, double *date)
+{
+ if (ymd_to_ofs (i, year, month, day, date))
{
- dls_error (i, _("Date is not in valid range between "
- "15 Oct 1582 and 31 Dec 19999."));
- return 0;
+ *date *= 60. * 60. * 24.;
+ return true;
}
else
- return 1;
+ return false;
}
static int
@@ -1202,21 +1217,14 @@
{
long day, month, year;
- if (!parse_leader (i)
- || !parse_day (i, &day)
- || !parse_date_delimiter (i)
- || !parse_month (i, &month)
- || !parse_date_delimiter (i)
- || !parse_year (i, &year)
- || !parse_trailer (i))
- return 0;
-
- i->v->f = calendar_to_julian (year, month, day);
- if (!valid_date (i))
- return 0;
- i->v->f *= 60. * 60. * 24.;
-
- return 1;
+ return (parse_leader (i)
+ && parse_day (i, &day)
+ && parse_date_delimiter (i)
+ && parse_month (i, &month)
+ && parse_date_delimiter (i)
+ && parse_year (i, &year)
+ && parse_trailer (i)
+ && ymd_to_date (i, year, month, day, &i->v->f));
}
static int
@@ -1224,21 +1232,14 @@
{
long month, day, year;
- if (!parse_leader (i)
- || !parse_month (i, &month)
- || !parse_date_delimiter (i)
- || !parse_day (i, &day)
- || !parse_date_delimiter (i)
- || !parse_year (i, &year)
- || !parse_trailer (i))
- return 0;
-
- i->v->f = calendar_to_julian (year, month, day);
- if (!valid_date (i))
- return 0;
- i->v->f *= 60. * 60. * 24.;
-
- return 1;
+ return (parse_leader (i)
+ && parse_month (i, &month)
+ && parse_date_delimiter (i)
+ && parse_day (i, &day)
+ && parse_date_delimiter (i)
+ && parse_year (i, &year)
+ && parse_trailer (i)
+ && ymd_to_date (i, year, month, day, &i->v->f));
}
static int
@@ -1246,21 +1247,14 @@
{
long month, day, year;
- if (!parse_leader (i)
- || !parse_day (i, &day)
- || !parse_date_delimiter (i)
- || !parse_month (i, &month)
- || !parse_date_delimiter (i)
- || !parse_year (i, &year)
- || !parse_trailer (i))
- return 0;
-
- i->v->f = calendar_to_julian (year, month, day);
- if (!valid_date (i))
- return 0;
- i->v->f *= 60. * 60. * 24.;
-
- return 1;
+ return (parse_leader (i)
+ && parse_day (i, &day)
+ && parse_date_delimiter (i)
+ && parse_month (i, &month)
+ && parse_date_delimiter (i)
+ && parse_year (i, &year)
+ && parse_trailer (i)
+ && ymd_to_date (i, year, month, day, &i->v->f));
}
static int
@@ -1268,46 +1262,30 @@
{
long month, day, year;
- if (!parse_leader (i)
- || !parse_year (i, &year)
- || !parse_date_delimiter (i)
- || !parse_month (i, &month)
- || !parse_date_delimiter (i)
- || !parse_day (i, &day)
- || !parse_trailer (i))
- return 0;
-
- i->v->f = calendar_to_julian (year, month, day);
- if (!valid_date (i))
- return 0;
- i->v->f *= 60. * 60. * 24.;
-
- return 1;
+ return (parse_leader (i)
+ && parse_year (i, &year)
+ && parse_date_delimiter (i)
+ && parse_month (i, &month)
+ && parse_date_delimiter (i)
+ && parse_day (i, &day)
+ && parse_trailer (i)
+ && ymd_to_date (i, year, month, day, &i->v->f));
}
static int
parse_JDATE (struct data_in *i)
{
long julian;
+ double ofs;
if (!parse_leader (i)
|| !parse_julian (i, &julian)
- || !parse_trailer (i))
+ || !parse_trailer (i)
+ || !ymd_to_ofs (i, julian / 1000, 1, 1, &ofs))
return 0;
- if (julian / 1000 == 1582)
- i->v->f = calendar_to_julian (1583, 1, 1) - 365;
- else
- i->v->f = calendar_to_julian (julian / 1000, 1, 1);
-
- if (valid_date (i))
- {
- i->v->f = (i->v->f + julian % 1000 - 1) * 60. * 60. * 24.;
- if (i->v->f < 0.)
- i->v->f = SYSMIS;
- }
-
- return valid_date (i);
+ i->v->f = (ofs + julian % 1000 - 1) * 60. * 60. * 24.;
+ return 1;
}
static int
@@ -1315,19 +1293,12 @@
{
long quarter, year;
- if (!parse_leader (i)
- || !parse_quarter (i, &quarter)
- || !parse_q_delimiter (i)
- || !parse_year (i, &year)
- || !parse_trailer (i))
- return 0;
-
- i->v->f = calendar_to_julian (year, (quarter - 1) * 3 + 1, 1);
- if (!valid_date (i))
- return 0;
- i->v->f *= 60. * 60. * 24.;
-
- return 1;
+ return (parse_leader (i)
+ && parse_quarter (i, &quarter)
+ && parse_q_delimiter (i)
+ && parse_year (i, &year)
+ && parse_trailer (i)
+ && ymd_to_date (i, year, (quarter - 1) * 3 + 1, 1, &i->v->f));
}
static int
@@ -1335,25 +1306,19 @@
{
long month, year;
- if (!parse_leader (i)
- || !parse_month (i, &month)
- || !parse_date_delimiter (i)
- || !parse_year (i, &year)
- || !parse_trailer (i))
- return 0;
-
- i->v->f = calendar_to_julian (year, month, 1);
- if (!valid_date (i))
- return 0;
- i->v->f *= 60. * 60. * 24.;
-
- return 1;
+ return (parse_leader (i)
+ && parse_month (i, &month)
+ && parse_date_delimiter (i)
+ && parse_year (i, &year)
+ && parse_trailer (i)
+ && ymd_to_date (i, year, month, 1, &i->v->f));
}
static int
parse_WKYR (struct data_in *i)
{
long week, year;
+ double ofs;
if (!parse_leader (i)
|| !parse_week (i, &week)
@@ -1362,11 +1327,19 @@
|| !parse_trailer (i))
return 0;
- i->v->f = calendar_to_julian (year, 1, 1);
- if (!valid_date (i))
- return 0;
- i->v->f = (i->v->f + (week - 1) * 7) * 60. * 60. * 24.;
+ if (year != 1582)
+ {
+ if (!ymd_to_ofs (i, year, 1, 1, &ofs))
+ return 0;
+ }
+ else
+ {
+ if (ymd_to_ofs (i, 1583, 1, 1, &ofs))
+ return 0;
+ ofs -= 365;
+ }
+ i->v->f = (ofs + (week - 1) * 7) * 60. * 60. * 24.;
return 1;
}
@@ -1386,9 +1359,7 @@
|| !parse_opt_second (i, &second))
return 0;
- i->v->f = hour * 60. * 60. + minute * 60. + second;
- if (sign)
- i->v->f = -i->v->f;
+ i->v->f = (hour * 60. * 60. + minute * 60. + second) * sign;
return 1;
}
@@ -1414,9 +1385,7 @@
i->v->f = (day_count * 60. * 60. * 24.
+ hour * 60. * 60.
+ minute * 60.
- + second);
- if (sign)
- i->v->f = -i->v->f;
+ + second) * sign;
return 1;
}
@@ -1438,17 +1407,11 @@
|| !parse_hour24 (i, &hour24)
|| !parse_time_delimiter (i)
|| !parse_minute (i, &minute)
- || !parse_opt_second (i, &second))
+ || !parse_opt_second (i, &second)
+ || !ymd_to_date (i, year, month, day, &i->v->f))
return 0;
- i->v->f = calendar_to_julian (year, month, day);
- if (!valid_date (i))
- return 0;
- i->v->f = (i->v->f * 60. * 60. * 24.
- + hour24 * 60. * 60.
- + minute * 60.
- + second);
-
+ i->v->f += hour24 * 60. * 60. + minute * 60. + second;
return 1;
}
- [Pspp-cvs] Changes to pspp/src/data-in.c,
Ben Pfaff <=