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

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

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

revision 1.41 by blp, Wed Oct 26 05:06:14 2005 UTC revision 1.42 by blp, Thu Nov 3 06:21:46 2005 UTC
# Line 83  enum Line 83  enum
83  /* DATA LIST private data structure. */  /* DATA LIST private data structure. */
84  struct data_list_pgm  struct data_list_pgm
85    {    {
     struct trns_header h;  
   
86      struct dls_var_spec *first, *last;  /* Variable parsing specifications. */      struct dls_var_spec *first, *last;  /* Variable parsing specifications. */
87      struct dfm_reader *reader;  /* Data file reader. */      struct dfm_reader *reader;  /* Data file reader. */
88    
# Line 270  cmd_data_list (void) Line 268  cmd_data_list (void)
268      goto error;      goto error;
269    
270    if (vfm_source != NULL)    if (vfm_source != NULL)
271      {      add_transformation (data_list_trns_proc, data_list_trns_free, dls);
       dls->h.proc = data_list_trns_proc;  
       dls->h.free = data_list_trns_free;  
       add_transformation (&dls->h);  
     }  
272    else    else
273      vfm_source = create_case_source (&data_list_source_class, dls);      vfm_source = create_case_source (&data_list_source_class, dls);
274    
275    return CMD_SUCCESS;    return CMD_SUCCESS;
276    
277   error:   error:
278    destroy_dls_var_spec (dls->first);    data_list_trns_free (dls);
   free (dls->delims);  
   free (dls);  
279    return CMD_FAILURE;    return CMD_FAILURE;
280  }  }
281    
# Line 1233  destroy_dls_var_spec (struct dls_var_spe Line 1225  destroy_dls_var_spec (struct dls_var_spe
1225      }      }
1226  }  }
1227    
1228  /* Destroys DATA LIST transformation PGM. */  /* Destroys DATA LIST transformation DLS. */
1229  static void  static void
1230  data_list_trns_free (struct trns_header *pgm)  data_list_trns_free (void *dls_)
1231  {  {
1232    struct data_list_pgm *dls = (struct data_list_pgm *) pgm;    struct data_list_pgm *dls = dls_;
1233    free (dls->delims);    free (dls->delims);
1234    destroy_dls_var_spec (dls->first);    destroy_dls_var_spec (dls->first);
1235    dfm_close_reader (dls->reader);    dfm_close_reader (dls->reader);
1236      free (dls);
1237  }  }
1238    
1239  /* Handle DATA LIST transformation T, parsing data into C. */  /* Handle DATA LIST transformation DLS, parsing data into C. */
1240  static int  static int
1241  data_list_trns_proc (struct trns_header *t, struct ccase *c,  data_list_trns_proc (void *dls_, struct ccase *c, int case_num UNUSED)
                      int case_num UNUSED)  
1242  {  {
1243    struct data_list_pgm *dls = (struct data_list_pgm *) t;    struct data_list_pgm *dls = dls_;
1244    data_list_read_func *read_func;    data_list_read_func *read_func;
1245    int retval;    int retval;
1246    
# Line 1315  static void Line 1307  static void
1307  data_list_source_destroy (struct case_source *source)  data_list_source_destroy (struct case_source *source)
1308  {  {
1309    data_list_trns_free (source->aux);    data_list_trns_free (source->aux);
   free (source->aux);  
1310  }  }
1311    
1312  const struct case_source_class data_list_source_class =  const struct case_source_class data_list_source_class =
# Line 1338  struct rpd_num_or_var Line 1329  struct rpd_num_or_var
1329  /* REPEATING DATA private data structure. */  /* REPEATING DATA private data structure. */
1330  struct repeating_data_trns  struct repeating_data_trns
1331    {    {
     struct trns_header h;  
1332      struct dls_var_spec *first, *last;  /* Variable parsing specifications. */      struct dls_var_spec *first, *last;  /* Variable parsing specifications. */
1333      struct dfm_reader *reader;          /* Input file, never NULL. */      struct dfm_reader *reader;          /* Input file, never NULL. */
1334    
# Line 1452  cmd_repeating_data (void) Line 1442  cmd_repeating_data (void)
1442                msg (SE, _("%s subcommand given multiple times."),"OCCURS");                msg (SE, _("%s subcommand given multiple times."),"OCCURS");
1443                goto error;                goto error;
1444              }              }
1445            saw_occurs |= 2;            saw_occurs = true;
1446    
1447            if (!parse_num_or_var (&rpd->occurs, "OCCURS"))            if (!parse_num_or_var (&rpd->occurs, "OCCURS"))
1448              goto error;              goto error;
# Line 1460  cmd_repeating_data (void) Line 1450  cmd_repeating_data (void)
1450        else if (lex_match_id ("LENGTH"))        else if (lex_match_id ("LENGTH"))
1451          {          {
1452            lex_match ('=');            lex_match ('=');
1453            if (saw_length & 4)            if (saw_length)
1454              {              {
1455                msg (SE, _("%s subcommand given multiple times."),"LENGTH");                msg (SE, _("%s subcommand given multiple times."),"LENGTH");
1456                goto error;                goto error;
1457              }              }
1458            saw_length |= 4;            saw_length = true;
1459    
1460            if (!parse_num_or_var (&rpd->length, "LENGTH"))            if (!parse_num_or_var (&rpd->length, "LENGTH"))
1461              goto error;              goto error;
# Line 1473  cmd_repeating_data (void) Line 1463  cmd_repeating_data (void)
1463        else if (lex_match_id ("CONTINUED"))        else if (lex_match_id ("CONTINUED"))
1464          {          {
1465            lex_match ('=');            lex_match ('=');
1466            if (saw_continued & 8)            if (saw_continued)
1467              {              {
1468                msg (SE, _("%s subcommand given multiple times."),"CONTINUED");                msg (SE, _("%s subcommand given multiple times."),"CONTINUED");
1469                goto error;                goto error;
1470              }              }
1471            saw_continued |= 8;            saw_continued = true;
1472    
1473            if (!lex_match ('/'))            if (!lex_match ('/'))
1474              {              {
# Line 1507  cmd_repeating_data (void) Line 1497  cmd_repeating_data (void)
1497        else if (lex_match_id ("ID"))        else if (lex_match_id ("ID"))
1498          {          {
1499            lex_match ('=');            lex_match ('=');
1500            if (saw_id & 16)            if (saw_id)
1501              {              {
1502                msg (SE, _("%s subcommand given multiple times."),"ID");                msg (SE, _("%s subcommand given multiple times."),"ID");
1503                goto error;                goto error;
1504              }              }
1505            saw_id |= 16;            saw_id = true;
1506                        
1507            if (!lex_force_int ())            if (!lex_force_int ())
1508              goto error;              goto error;
# Line 1638  cmd_repeating_data (void) Line 1628  cmd_repeating_data (void)
1628    if (table)    if (table)
1629      dump_fixed_table (rpd->first, fh, rpd->last->rec);      dump_fixed_table (rpd->first, fh, rpd->last->rec);
1630    
1631    rpd->h.proc = repeating_data_trns_proc;    add_transformation (repeating_data_trns_proc, repeating_data_trns_free, rpd);
   rpd->h.free = repeating_data_trns_free;  
   add_transformation (&rpd->h);  
1632    
1633    return lex_end_of_command ();    return lex_end_of_command ();
1634    
1635   error:   error:
1636    destroy_dls_var_spec (rpd->first);    repeating_data_trns_free (rpd);
   free (rpd->id_value);  
1637    return CMD_FAILURE;    return CMD_FAILURE;
1638  }  }
1639    
# Line 1656  cmd_repeating_data (void) Line 1643  cmd_repeating_data (void)
1643  static void  static void
1644  find_variable_input_spec (struct variable *v, struct fmt_spec *spec)  find_variable_input_spec (struct variable *v, struct fmt_spec *spec)
1645  {  {
1646    int i;    size_t i;
1647        
1648    for (i = 0; i < n_trns; i++)    for (i = 0; i < n_trns; i++)
1649      {      {
1650        struct data_list_pgm *pgm = (struct data_list_pgm *) t_trns[i];        struct transformation *trns = &t_trns[i];
1651                
1652        if (pgm->h.proc == data_list_trns_proc)        if (trns->proc == data_list_trns_proc)
1653          {          {
1654              struct data_list_pgm *pgm = trns->private;
1655            struct dls_var_spec *iter;            struct dls_var_spec *iter;
1656    
1657            for (iter = pgm->first; iter; iter = iter->next)            for (iter = pgm->first; iter; iter = iter->next)
# Line 1900  rpd_parse_record (const struct rpd_parse Line 1888  rpd_parse_record (const struct rpd_parse
1888     DATA structure.  Returns -1 on success, -2 on end of file or     DATA structure.  Returns -1 on success, -2 on end of file or
1889     on failure. */     on failure. */
1890  int  int
1891  repeating_data_trns_proc (struct trns_header *trns, struct ccase *c,  repeating_data_trns_proc (void *trns_, struct ccase *c, int case_num UNUSED)
                           int case_num UNUSED)  
1892  {  {
1893    struct repeating_data_trns *t = (struct repeating_data_trns *) trns;    struct repeating_data_trns *t = trns_;
1894            
1895    struct fixed_string line;       /* Current record. */    struct fixed_string line;       /* Current record. */
1896    
# Line 2055  repeating_data_trns_proc (struct trns_he Line 2042  repeating_data_trns_proc (struct trns_he
2042    
2043  /* Frees a REPEATING DATA transformation. */  /* Frees a REPEATING DATA transformation. */
2044  void  void
2045  repeating_data_trns_free (struct trns_header *rpd_)  repeating_data_trns_free (void *rpd_)
2046  {  {
2047    struct repeating_data_trns *rpd = (struct repeating_data_trns *) rpd_;    struct repeating_data_trns *rpd = rpd_;
2048    
2049    destroy_dls_var_spec (rpd->first);    destroy_dls_var_spec (rpd->first);
2050    dfm_close_reader (rpd->reader);    dfm_close_reader (rpd->reader);
2051    free (rpd->id_value);    free (rpd->id_value);
2052      free (rpd);
2053  }  }
2054    
2055  /* Lets repeating_data_trns_proc() know how to write the cases  /* Lets repeating_data_trns_proc() know how to write the cases
2056     that it composes.  Not elegant. */     that it composes.  Not elegant. */
2057  void  void
2058  repeating_data_set_write_case (struct trns_header *trns,  repeating_data_set_write_case (struct transformation *trns_,
2059                                 write_case_func *write_case,                                 write_case_func *write_case,
2060                                 write_case_data wc_data)                                 write_case_data wc_data)
2061  {  {
2062    struct repeating_data_trns *t = (struct repeating_data_trns *) trns;    struct repeating_data_trns *t = trns_->private;
2063    
2064    assert (trns->proc == repeating_data_trns_proc);    assert (trns_->proc == repeating_data_trns_proc);
2065    t->write_case = write_case;    t->write_case = write_case;
2066    t->wc_data = wc_data;    t->wc_data = wc_data;
2067  }  }

Legend:
Removed from v.1.41  
changed lines
  Added in v.1.42

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