+
+
+\f
+
+MODULE = PSPP PACKAGE = PSPP::Reader
+
+struct sysreader_info *
+pxs_open_sysfile (name)
+ char * name
+CODE:
+ struct casereader *reader;
+ struct sysreader_info *sri = NULL;
+ struct file_handle *fh =
+ fh_create_file (NULL, name, fh_default_properties () );
+
+ sri = xmalloc (sizeof (*sri));
+ sri->reader = sfm_open_reader (fh, &sri->dict, &sri->opts);
+
+ if ( NULL == sri->reader)
+ {
+ free (sri);
+ sri = NULL;
+ }
+
+ RETVAL = sri;
+ OUTPUT:
+RETVAL
+
+
+struct dictionary *
+pxs_get_dict (reader)
+ struct sysreader_info *reader;
+CODE:
+ RETVAL = reader->dict;
+ OUTPUT:
+RETVAL
+
+
+SV *
+get_next_case (sfr)
+ struct sysreader_info *sfr;
+CODE:
+ struct ccase c;
+
+ if (! casereader_read (sfr->reader, &c))
+ {
+ RETVAL = 0;
+ }
+ else
+ {
+ int v;
+ AV *av_case = (AV *) sv_2mortal ((SV *) newAV());
+
+ for (v = 0; v < dict_get_var_cnt (sfr->dict); ++v )
+ {
+ const struct variable *var = dict_get_var (sfr->dict, v);
+ const union value *val = case_data (&c, var);
+
+ av_push (av_case, value_to_scalar (val, var));
+ }
+
+ case_destroy (&c);
+ RETVAL = newRV ((SV *) av_case);
+ }
+OUTPUT:
+ RETVAL
+
+