/[pspp]/pspp/src/data-in.c
ViewVC logotype

Diff of /pspp/src/data-in.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.12 by blp, Mon May 31 05:50:27 2004 UTC revision 1.13 by blp, Tue Mar 1 08:16:15 2005 UTC
# Line 26  Line 26 
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"
# Line 45  static void dls_error (const struct data Line 46  static void dls_error (const struct data
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
# Line 1167  parse_sign (struct data_in *i, int *sign Line 1165  parse_sign (struct data_in *i, int *sign
1165      {      {
1166      case '-':      case '-':
1167        i->s++;        i->s++;
1168        *sign = 1;        *sign = -1;
1169        break;        break;
1170    
1171      case '+':      case '+':
# Line 1175  parse_sign (struct data_in *i, int *sign Line 1173  parse_sign (struct data_in *i, int *sign
1173        /* fall through */        /* fall through */
1174    
1175      default:      default:
1176        *sign = 0;        *sign = 1;
1177        break;        break;
1178      }      }
1179    
# Line 1184  parse_sign (struct data_in *i, int *sign Line 1182  parse_sign (struct data_in *i, int *sign
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
# Line 1202  parse_DATE (struct data_in *i) Line 1217  parse_DATE (struct data_in *i)
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
# Line 1224  parse_ADATE (struct data_in *i) Line 1232  parse_ADATE (struct data_in *i)
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
# Line 1246  parse_EDATE (struct data_in *i) Line 1247  parse_EDATE (struct data_in *i)
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
# Line 1268  parse_SDATE (struct data_in *i) Line 1262  parse_SDATE (struct data_in *i)
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
# Line 1315  parse_QYR (struct data_in *i) Line 1293  parse_QYR (struct data_in *i)
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
# Line 1335  parse_MOYR (struct data_in *i) Line 1306  parse_MOYR (struct data_in *i)
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)
# Line 1362  parse_WKYR (struct data_in *i) Line 1327  parse_WKYR (struct data_in *i)
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    
# Line 1386  parse_TIME (struct data_in *i) Line 1359  parse_TIME (struct data_in *i)
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    
# Line 1414  parse_DTIME (struct data_in *i) Line 1385  parse_DTIME (struct data_in *i)
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    
# Line 1438  parse_DATETIME (struct data_in *i) Line 1407  parse_DATETIME (struct data_in *i)
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    

Legend:
Removed from v.1.12  
changed lines
  Added in v.1.13

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26