pspp-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Pspp-cvs] Changes to pspp/src/data-list.c


From: Ben Pfaff
Subject: [Pspp-cvs] Changes to pspp/src/data-list.c
Date: Tue, 07 Jun 2005 03:20:51 -0400

Index: pspp/src/data-list.c
diff -u pspp/src/data-list.c:1.36 pspp/src/data-list.c:1.37
--- pspp/src/data-list.c:1.36   Wed May 18 04:03:48 2005
+++ pspp/src/data-list.c        Tue Jun  7 07:20:50 2005
@@ -1369,7 +1369,11 @@
 {
   struct repeating_data_trns *rpd;
   int table = 1;                /* Print table? */
-  unsigned seen = 0;            /* Mark subcommands as already seen. */
+  bool saw_starts = false;      /* Saw STARTS subcommand? */
+  bool saw_occurs = false;      /* Saw OCCURS subcommand? */
+  bool saw_length = false;      /* Saw LENGTH subcommand? */
+  bool saw_continued = false;   /* Saw CONTINUED subcommand? */
+  bool saw_id = false;          /* Saw ID subcommand? */
   struct file_handle *const fh = default_handle;
   
   assert (case_source_is_complex (vfm_source));
@@ -1406,13 +1410,13 @@
       else if (lex_match_id ("STARTS"))
        {
          lex_match ('=');
-         if (seen & 1)
+         if (saw_starts)
            {
              msg (SE, _("%s subcommand given multiple times."),"STARTS");
              goto error;
            }
-         seen |= 1;
-
+          saw_starts = true;
+          
          if (!parse_num_or_var (&rpd->starts_beg, "STARTS beginning column"))
            goto error;
 
@@ -1441,12 +1445,12 @@
       else if (lex_match_id ("OCCURS"))
        {
          lex_match ('=');
-         if (seen & 2)
+         if (saw_occurs)
            {
              msg (SE, _("%s subcommand given multiple times."),"OCCURS");
              goto error;
            }
-         seen |= 2;
+         saw_occurs |= 2;
 
          if (!parse_num_or_var (&rpd->occurs, "OCCURS"))
            goto error;
@@ -1454,12 +1458,12 @@
       else if (lex_match_id ("LENGTH"))
        {
          lex_match ('=');
-         if (seen & 4)
+         if (saw_length & 4)
            {
              msg (SE, _("%s subcommand given multiple times."),"LENGTH");
              goto error;
            }
-         seen |= 4;
+         saw_length |= 4;
 
          if (!parse_num_or_var (&rpd->length, "LENGTH"))
            goto error;
@@ -1467,12 +1471,12 @@
       else if (lex_match_id ("CONTINUED"))
        {
          lex_match ('=');
-         if (seen & 8)
+         if (saw_continued & 8)
            {
              msg (SE, _("%s subcommand given multiple times."),"CONTINUED");
              goto error;
            }
-         seen |= 8;
+         saw_continued |= 8;
 
          if (!lex_match ('/'))
            {
@@ -1500,12 +1504,12 @@
       else if (lex_match_id ("ID"))
        {
          lex_match ('=');
-         if (seen & 16)
+         if (saw_id & 16)
            {
              msg (SE, _("%s subcommand given multiple times."),"ID");
              goto error;
            }
-         seen |= 16;
+         saw_id |= 16;
          
          if (!lex_force_int ())
            goto error;
@@ -1569,58 +1573,52 @@
     }
 
   /* Comes here when DATA specification encountered. */
-  if ((seen & (1 | 2)) != (1 | 2))
+  if (!saw_starts || !saw_occurs)
     {
-      if ((seen & 1) == 0)
+      if (!saw_starts)
        msg (SE, _("Missing required specification STARTS."));
-      if ((seen & 2) == 0)
+      if (!saw_occurs)
        msg (SE, _("Missing required specification OCCURS."));
       goto error;
     }
 
   /* Enforce ID restriction. */
-  if ((seen & 16) && !(seen & 8))
+  if (saw_id && !saw_continued)
     {
       msg (SE, _("ID specified without CONTINUED."));
       goto error;
     }
 
-  /* Calculate starts_end, cont_end if necessary. */
-  if (rpd->starts_end.num == 0 && rpd->starts_end.var == NULL)
-    rpd->starts_end.num = handle_get_record_width (fh);
-  if (rpd->cont_end.num == 0 && rpd->cont_end.var == NULL)
-    rpd->cont_end.num = handle_get_record_width (fh);
-      
-  /* Calculate length if possible. */
-  if ((seen & 4) == 0)
+  /* Calculate starts_end, cont_end if necessary and possible. */
+  if (fh != NULL) 
     {
-      struct dls_var_spec *iter;
-      
-      for (iter = rpd->first; iter; iter = iter->next)
-       {
-         if (iter->lc > rpd->length.num)
-           rpd->length.num = iter->lc;
-       }
-      assert (rpd->length.num != 0);
+      if (rpd->starts_end.num == 0 && rpd->starts_end.var == NULL)
+        rpd->starts_end.num = handle_get_record_width (fh);
+      if (rpd->cont_end.num == 0 && rpd->cont_end.var == NULL)
+        rpd->cont_end.num = handle_get_record_width (fh);
     }
   
   lex_match ('=');
   if (!parse_repeating_data (&rpd->first, &rpd->last))
     goto error;
 
+  /* Calculate length if necessary. */
+  if (!saw_length)
+    {
+      struct dls_var_spec *iter;
+      
+      for (iter = rpd->first; iter; iter = iter->next)
+        if (iter->lc > rpd->length.num)
+          rpd->length.num = iter->lc;
+      assert (rpd->length.num != 0);
+    }
+  
   if (table)
     dump_fixed_table (rpd->first, fh, rpd->last->rec);
 
-  {
-    struct repeating_data_trns *new_trns;
-
-    rpd->h.proc = repeating_data_trns_proc;
-    rpd->h.free = repeating_data_trns_free;
-
-    new_trns = xmalloc (sizeof *new_trns);
-    memcpy (new_trns, &rpd, sizeof *new_trns);
-    add_transformation ((struct trns_header *) new_trns);
-  }
+  rpd->h.proc = repeating_data_trns_proc;
+  rpd->h.free = repeating_data_trns_free;
+  add_transformation (&rpd->h);
 
   return lex_end_of_command ();
 
@@ -1746,25 +1744,23 @@
 /* Obtains the real value for rpd_num_or_var N in case C and returns
    it.  The valid range is nonnegative numbers, but numbers outside
    this range can be returned and should be handled by the caller as
-   invalid. */
+   invalid.  If N does not have a value, returns DEFAULT_VALUE,
+   which must be nonzero if this is possible. */
 static int
-realize_value (struct rpd_num_or_var *n, struct ccase *c)
+realize_value (struct rpd_num_or_var *n, struct ccase *c, int default_value)
 {
-  if (n->num > 0)
+  if (n->num != 0)
     return n->num;
-  
-  assert (n->num == 0);
-  if (n->var != NULL)
+  else if (n->var != NULL)
     {
       double v = case_num (c, n->var->fv);
-
-      if (v == SYSMIS || v <= INT_MIN || v >= INT_MAX)
-       return -1;
-      else
-       return v;
+      return v != SYSMIS && v >= INT_MIN && v <= INT_MAX ? v : -1;
+    }
+  else 
+    {
+      assert (default_value != 0);
+      return default_value;
     }
-  else
-    return 0;
 }
 
 /* Parameter record passed to rpd_parse_record(). */
@@ -1919,13 +1915,13 @@
   dfm_forward_record (t->reader);
 
   /* Calculate occurs, length. */
-  occurs_left = occurs = realize_value (&t->occurs, c);
+  occurs_left = occurs = realize_value (&t->occurs, c, 0);
   if (occurs <= 0)
     {
       tmsg (SE, RPD_ERR, _("Invalid value %d for OCCURS."), occurs);
       return -3;
     }
-  starts_beg = realize_value (&t->starts_beg, c);
+  starts_beg = realize_value (&t->starts_beg, c, 0);
   if (starts_beg <= 0)
     {
       tmsg (SE, RPD_ERR, _("Beginning column for STARTS (%d) must be "
@@ -1933,7 +1929,7 @@
             starts_beg);
       return -3;
     }
-  starts_end = realize_value (&t->starts_end, c);
+  starts_end = realize_value (&t->starts_end, c, line.length + 1);
   if (starts_end < starts_beg)
     {
       tmsg (SE, RPD_ERR, _("Ending column for STARTS (%d) is less than "
@@ -1941,14 +1937,14 @@
             starts_end, starts_beg);
       skip_first_record = 1;
     }
-  length = realize_value (&t->length, c);
+  length = realize_value (&t->length, c, 0);
   if (length < 0)
     {
       tmsg (SE, RPD_ERR, _("Invalid value %d for LENGTH."), length);
       length = 1;
       occurs = occurs_left = 1;
     }
-  cont_beg = realize_value (&t->cont_beg, c);
+  cont_beg = realize_value (&t->cont_beg, c, 0);
   if (cont_beg < 0)
     {
       tmsg (SE, RPD_ERR, _("Beginning column for CONTINUED (%d) must be "
@@ -1956,7 +1952,7 @@
             cont_beg);
       return -2;
     }
-  cont_end = realize_value (&t->cont_end, c);
+  cont_end = realize_value (&t->cont_end, c, line.length + 1);
   if (cont_end < cont_beg)
     {
       tmsg (SE, RPD_ERR, _("Ending column for CONTINUED (%d) is less than "




reply via email to

[Prev in Thread] Current Thread [Next in Thread]