26 |
#include <stddef.h> |
#include <stddef.h> |
27 |
#include <stdio.h> |
#include <stdio.h> |
28 |
#include <stdlib.h> |
#include <stdlib.h> |
29 |
|
#include "bool.h" |
30 |
#include "error.h" |
#include "error.h" |
31 |
#include "getline.h" |
#include "getline.h" |
32 |
#include "julcal/julcal.h" |
#include "calendar.h" |
33 |
#include "lexer.h" |
#include "lexer.h" |
34 |
#include "magic.h" |
#include "magic.h" |
35 |
#include "misc.h" |
#include "misc.h" |
46 |
PRINTF_FORMAT (2, 3); |
PRINTF_FORMAT (2, 3); |
47 |
|
|
48 |
static void |
static void |
49 |
dls_error (const struct data_in *i, const char *format, ...) |
vdls_error (const struct data_in *i, const char *format, va_list args) |
50 |
{ |
{ |
51 |
char buf[1024]; |
struct error e; |
52 |
|
struct string title; |
53 |
|
|
54 |
if (i->flags & DI_IGNORE_ERROR) |
if (i->flags & DI_IGNORE_ERROR) |
55 |
return; |
return; |
56 |
|
|
57 |
{ |
ds_init (&title, 64); |
58 |
va_list args; |
if (!getl_reading_script) |
59 |
|
ds_puts (&title, _("data-file error: ")); |
60 |
|
if (i->f1 == i->f2) |
61 |
|
ds_printf (&title, _("(column %d"), i->f1); |
62 |
|
else |
63 |
|
ds_printf (&title, _("(columns %d-%d"), i->f1, i->f2); |
64 |
|
ds_printf (&title, _(", field type %s) "), fmt_to_string (&i->format)); |
65 |
|
|
66 |
|
e.class = DE; |
67 |
|
err_location (&e.where); |
68 |
|
e.title = ds_c_str (&title); |
69 |
|
|
70 |
va_start (args, format); |
err_vmsg (&e, format, args); |
|
snprintf (buf, 1024, format, args); |
|
|
va_end (args); |
|
|
} |
|
|
|
|
|
{ |
|
|
struct error e; |
|
|
struct string title; |
|
71 |
|
|
72 |
ds_init (&title, 64); |
ds_destroy (&title); |
73 |
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; |
|
74 |
|
|
75 |
err_vmsg (&e); |
static void |
76 |
|
dls_error (const struct data_in *i, const char *format, ...) |
77 |
|
{ |
78 |
|
va_list args; |
79 |
|
|
80 |
ds_destroy (&title); |
va_start (args, format); |
81 |
} |
vdls_error (i, format, args); |
82 |
|
va_end (args); |
83 |
} |
} |
84 |
|
|
85 |
/* Excludes leading and trailing whitespace from I by adjusting |
/* Excludes leading and trailing whitespace from I by adjusting |
1165 |
{ |
{ |
1166 |
case '-': |
case '-': |
1167 |
i->s++; |
i->s++; |
1168 |
*sign = 1; |
*sign = -1; |
1169 |
break; |
break; |
1170 |
|
|
1171 |
case '+': |
case '+': |
1173 |
/* fall through */ |
/* fall through */ |
1174 |
|
|
1175 |
default: |
default: |
1176 |
*sign = 0; |
*sign = 1; |
1177 |
break; |
break; |
1178 |
} |
} |
1179 |
|
|
1182 |
|
|
1183 |
/* Date & time formats. */ |
/* Date & time formats. */ |
1184 |
|
|
1185 |
static int |
static void |
1186 |
valid_date (struct data_in *i) |
calendar_error (void *i_, const char *format, ...) |
1187 |
{ |
{ |
1188 |
if (i->v->f == SYSMIS) |
struct data_in *i = i_; |
1189 |
|
va_list args; |
1190 |
|
|
1191 |
|
va_start (args, format); |
1192 |
|
vdls_error (i, format, args); |
1193 |
|
va_end (args); |
1194 |
|
} |
1195 |
|
|
1196 |
|
static bool |
1197 |
|
ymd_to_ofs (struct data_in *i, int year, int month, int day, double *ofs) |
1198 |
|
{ |
1199 |
|
*ofs = calendar_gregorian_to_offset (year, month, day, calendar_error, i); |
1200 |
|
return *ofs != SYSMIS; |
1201 |
|
} |
1202 |
|
|
1203 |
|
static bool |
1204 |
|
ymd_to_date (struct data_in *i, int year, int month, int day, double *date) |
1205 |
|
{ |
1206 |
|
if (ymd_to_ofs (i, year, month, day, date)) |
1207 |
{ |
{ |
1208 |
dls_error (i, _("Date is not in valid range between " |
*date *= 60. * 60. * 24.; |
1209 |
"15 Oct 1582 and 31 Dec 19999.")); |
return true; |
|
return 0; |
|
1210 |
} |
} |
1211 |
else |
else |
1212 |
return 1; |
return false; |
1213 |
} |
} |
1214 |
|
|
1215 |
static int |
static int |
1217 |
{ |
{ |
1218 |
long day, month, year; |
long day, month, year; |
1219 |
|
|
1220 |
if (!parse_leader (i) |
return (parse_leader (i) |
1221 |
|| !parse_day (i, &day) |
&& parse_day (i, &day) |
1222 |
|| !parse_date_delimiter (i) |
&& parse_date_delimiter (i) |
1223 |
|| !parse_month (i, &month) |
&& parse_month (i, &month) |
1224 |
|| !parse_date_delimiter (i) |
&& parse_date_delimiter (i) |
1225 |
|| !parse_year (i, &year) |
&& parse_year (i, &year) |
1226 |
|| !parse_trailer (i)) |
&& parse_trailer (i) |
1227 |
return 0; |
&& ymd_to_date (i, year, month, day, &i->v->f)); |
|
|
|
|
i->v->f = calendar_to_julian (year, month, day); |
|
|
if (!valid_date (i)) |
|
|
return 0; |
|
|
i->v->f *= 60. * 60. * 24.; |
|
|
|
|
|
return 1; |
|
1228 |
} |
} |
1229 |
|
|
1230 |
static int |
static int |
1232 |
{ |
{ |
1233 |
long month, day, year; |
long month, day, year; |
1234 |
|
|
1235 |
if (!parse_leader (i) |
return (parse_leader (i) |
1236 |
|| !parse_month (i, &month) |
&& parse_month (i, &month) |
1237 |
|| !parse_date_delimiter (i) |
&& parse_date_delimiter (i) |
1238 |
|| !parse_day (i, &day) |
&& parse_day (i, &day) |
1239 |
|| !parse_date_delimiter (i) |
&& parse_date_delimiter (i) |
1240 |
|| !parse_year (i, &year) |
&& parse_year (i, &year) |
1241 |
|| !parse_trailer (i)) |
&& parse_trailer (i) |
1242 |
return 0; |
&& ymd_to_date (i, year, month, day, &i->v->f)); |
|
|
|
|
i->v->f = calendar_to_julian (year, month, day); |
|
|
if (!valid_date (i)) |
|
|
return 0; |
|
|
i->v->f *= 60. * 60. * 24.; |
|
|
|
|
|
return 1; |
|
1243 |
} |
} |
1244 |
|
|
1245 |
static int |
static int |
1247 |
{ |
{ |
1248 |
long month, day, year; |
long month, day, year; |
1249 |
|
|
1250 |
if (!parse_leader (i) |
return (parse_leader (i) |
1251 |
|| !parse_day (i, &day) |
&& parse_day (i, &day) |
1252 |
|| !parse_date_delimiter (i) |
&& parse_date_delimiter (i) |
1253 |
|| !parse_month (i, &month) |
&& parse_month (i, &month) |
1254 |
|| !parse_date_delimiter (i) |
&& parse_date_delimiter (i) |
1255 |
|| !parse_year (i, &year) |
&& parse_year (i, &year) |
1256 |
|| !parse_trailer (i)) |
&& parse_trailer (i) |
1257 |
return 0; |
&& ymd_to_date (i, year, month, day, &i->v->f)); |
|
|
|
|
i->v->f = calendar_to_julian (year, month, day); |
|
|
if (!valid_date (i)) |
|
|
return 0; |
|
|
i->v->f *= 60. * 60. * 24.; |
|
|
|
|
|
return 1; |
|
1258 |
} |
} |
1259 |
|
|
1260 |
static int |
static int |
1262 |
{ |
{ |
1263 |
long month, day, year; |
long month, day, year; |
1264 |
|
|
1265 |
if (!parse_leader (i) |
return (parse_leader (i) |
1266 |
|| !parse_year (i, &year) |
&& parse_year (i, &year) |
1267 |
|| !parse_date_delimiter (i) |
&& parse_date_delimiter (i) |
1268 |
|| !parse_month (i, &month) |
&& parse_month (i, &month) |
1269 |
|| !parse_date_delimiter (i) |
&& parse_date_delimiter (i) |
1270 |
|| !parse_day (i, &day) |
&& parse_day (i, &day) |
1271 |
|| !parse_trailer (i)) |
&& parse_trailer (i) |
1272 |
return 0; |
&& ymd_to_date (i, year, month, day, &i->v->f)); |
|
|
|
|
i->v->f = calendar_to_julian (year, month, day); |
|
|
if (!valid_date (i)) |
|
|
return 0; |
|
|
i->v->f *= 60. * 60. * 24.; |
|
|
|
|
|
return 1; |
|
1273 |
} |
} |
1274 |
|
|
1275 |
static int |
static int |
1276 |
parse_JDATE (struct data_in *i) |
parse_JDATE (struct data_in *i) |
1277 |
{ |
{ |
1278 |
long julian; |
long julian; |
1279 |
|
double ofs; |
1280 |
|
|
1281 |
if (!parse_leader (i) |
if (!parse_leader (i) |
1282 |
|| !parse_julian (i, &julian) |
|| !parse_julian (i, &julian) |
1283 |
|| !parse_trailer (i)) |
|| !parse_trailer (i) |
1284 |
|
|| !ymd_to_ofs (i, julian / 1000, 1, 1, &ofs)) |
1285 |
return 0; |
return 0; |
1286 |
|
|
1287 |
if (julian / 1000 == 1582) |
i->v->f = (ofs + julian % 1000 - 1) * 60. * 60. * 24.; |
1288 |
i->v->f = calendar_to_julian (1583, 1, 1) - 365; |
return 1; |
|
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); |
|
1289 |
} |
} |
1290 |
|
|
1291 |
static int |
static int |
1293 |
{ |
{ |
1294 |
long quarter, year; |
long quarter, year; |
1295 |
|
|
1296 |
if (!parse_leader (i) |
return (parse_leader (i) |
1297 |
|| !parse_quarter (i, &quarter) |
&& parse_quarter (i, &quarter) |
1298 |
|| !parse_q_delimiter (i) |
&& parse_q_delimiter (i) |
1299 |
|| !parse_year (i, &year) |
&& parse_year (i, &year) |
1300 |
|| !parse_trailer (i)) |
&& parse_trailer (i) |
1301 |
return 0; |
&& ymd_to_date (i, year, (quarter - 1) * 3 + 1, 1, &i->v->f)); |
|
|
|
|
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; |
|
1302 |
} |
} |
1303 |
|
|
1304 |
static int |
static int |
1306 |
{ |
{ |
1307 |
long month, year; |
long month, year; |
1308 |
|
|
1309 |
if (!parse_leader (i) |
return (parse_leader (i) |
1310 |
|| !parse_month (i, &month) |
&& parse_month (i, &month) |
1311 |
|| !parse_date_delimiter (i) |
&& parse_date_delimiter (i) |
1312 |
|| !parse_year (i, &year) |
&& parse_year (i, &year) |
1313 |
|| !parse_trailer (i)) |
&& parse_trailer (i) |
1314 |
return 0; |
&& ymd_to_date (i, year, month, 1, &i->v->f)); |
|
|
|
|
i->v->f = calendar_to_julian (year, month, 1); |
|
|
if (!valid_date (i)) |
|
|
return 0; |
|
|
i->v->f *= 60. * 60. * 24.; |
|
|
|
|
|
return 1; |
|
1315 |
} |
} |
1316 |
|
|
1317 |
static int |
static int |
1318 |
parse_WKYR (struct data_in *i) |
parse_WKYR (struct data_in *i) |
1319 |
{ |
{ |
1320 |
long week, year; |
long week, year; |
1321 |
|
double ofs; |
1322 |
|
|
1323 |
if (!parse_leader (i) |
if (!parse_leader (i) |
1324 |
|| !parse_week (i, &week) |
|| !parse_week (i, &week) |
1327 |
|| !parse_trailer (i)) |
|| !parse_trailer (i)) |
1328 |
return 0; |
return 0; |
1329 |
|
|
1330 |
i->v->f = calendar_to_julian (year, 1, 1); |
if (year != 1582) |
1331 |
if (!valid_date (i)) |
{ |
1332 |
return 0; |
if (!ymd_to_ofs (i, year, 1, 1, &ofs)) |
1333 |
i->v->f = (i->v->f + (week - 1) * 7) * 60. * 60. * 24.; |
return 0; |
1334 |
|
} |
1335 |
|
else |
1336 |
|
{ |
1337 |
|
if (ymd_to_ofs (i, 1583, 1, 1, &ofs)) |
1338 |
|
return 0; |
1339 |
|
ofs -= 365; |
1340 |
|
} |
1341 |
|
|
1342 |
|
i->v->f = (ofs + (week - 1) * 7) * 60. * 60. * 24.; |
1343 |
return 1; |
return 1; |
1344 |
} |
} |
1345 |
|
|
1359 |
|| !parse_opt_second (i, &second)) |
|| !parse_opt_second (i, &second)) |
1360 |
return 0; |
return 0; |
1361 |
|
|
1362 |
i->v->f = hour * 60. * 60. + minute * 60. + second; |
i->v->f = (hour * 60. * 60. + minute * 60. + second) * sign; |
|
if (sign) |
|
|
i->v->f = -i->v->f; |
|
1363 |
return 1; |
return 1; |
1364 |
} |
} |
1365 |
|
|
1385 |
i->v->f = (day_count * 60. * 60. * 24. |
i->v->f = (day_count * 60. * 60. * 24. |
1386 |
+ hour * 60. * 60. |
+ hour * 60. * 60. |
1387 |
+ minute * 60. |
+ minute * 60. |
1388 |
+ second); |
+ second) * sign; |
|
if (sign) |
|
|
i->v->f = -i->v->f; |
|
1389 |
return 1; |
return 1; |
1390 |
} |
} |
1391 |
|
|
1407 |
|| !parse_hour24 (i, &hour24) |
|| !parse_hour24 (i, &hour24) |
1408 |
|| !parse_time_delimiter (i) |
|| !parse_time_delimiter (i) |
1409 |
|| !parse_minute (i, &minute) |
|| !parse_minute (i, &minute) |
1410 |
|| !parse_opt_second (i, &second)) |
|| !parse_opt_second (i, &second) |
1411 |
|
|| !ymd_to_date (i, year, month, day, &i->v->f)) |
1412 |
return 0; |
return 0; |
1413 |
|
|
1414 |
i->v->f = calendar_to_julian (year, month, day); |
i->v->f += hour24 * 60. * 60. + minute * 60. + second; |
|
if (!valid_date (i)) |
|
|
return 0; |
|
|
i->v->f = (i->v->f * 60. * 60. * 24. |
|
|
+ hour24 * 60. * 60. |
|
|
+ minute * 60. |
|
|
+ second); |
|
|
|
|
1415 |
return 1; |
return 1; |
1416 |
} |
} |
1417 |
|
|