X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=perl-module%2FPSPP.xs;h=e0943d6e6513b052b6ff97417d7b82f09fdc9ca1;hb=8ec9e3a8a285f20c614d555185e4cffca3bea8ef;hp=de5cbf7b0a8eef5be89c3f08244d4a7494436c24;hpb=1145dad25fd785efd141a5258c32d2ff0e694c12;p=pspp diff --git a/perl-module/PSPP.xs b/perl-module/PSPP.xs index de5cbf7b0a..e0943d6e65 100644 --- a/perl-module/PSPP.xs +++ b/perl-module/PSPP.xs @@ -31,7 +31,9 @@ #include #include #include +#include #include +#include #include #include #include @@ -55,6 +57,9 @@ struct sysfile_info /* A pointer to the dictionary. Owned externally */ const struct dictionary *dict; + + /* The scalar containing the dictionary */ + SV *dict_sv; }; @@ -177,7 +182,7 @@ CODE: RETVAL = ret; OUTPUT: RETVAL - + int value_is_missing (val, var) @@ -273,6 +278,23 @@ CODE: OUTPUT: RETVAL + +struct variable * +pxs_get_var_by_name (dict, name) + struct dictionary *dict + const char *name +INIT: + SV *errstr = get_sv("PSPP::errstr", TRUE); + sv_setpv (errstr, ""); +CODE: + struct variable *var = dict_lookup_var (dict, name); + if ( ! var ) + sv_setpv (errstr, "No such variable."); + RETVAL = var; + OUTPUT: +RETVAL + + MODULE = PSPP PACKAGE = PSPP::Var @@ -403,6 +425,43 @@ CODE: XSRETURN_IV (1); +SV * +get_attributes (var) + struct variable *var +CODE: + HV *attrhash = (HV *) sv_2mortal ((SV *) newHV()); + + struct attrset *as = var_get_attributes (var); + + if ( as ) + { + struct attrset_iterator iter; + struct attribute *attr; + + for (attr = attrset_first (as, &iter); + attr; + attr = attrset_next (as, &iter)) + { + int i; + const char *name = attribute_get_name (attr); + + AV *values = newAV (); + + for (i = 0 ; i < attribute_get_n_values (attr); ++i ) + { + const char *value = attribute_get_value (attr, i); + av_push (values, newSVpv (value, 0)); + } + + hv_store (attrhash, name, strlen (name), + newRV_noinc ((SV*) values), 0); + } + } + + RETVAL = newRV ((SV *) attrhash); + OUTPUT: +RETVAL + const char * get_name (var) @@ -454,11 +513,13 @@ MODULE = PSPP PACKAGE = PSPP::Sysfile struct sysfile_info * -pxs_create_sysfile (name, dict, opts_hr) +pxs_create_sysfile (name, dict_ref, opts_hr) char *name - struct dictionary *dict + SV *dict_ref SV *opts_hr INIT: + SV *dict_sv = SvRV (dict_ref); + struct dictionary *dict = (void *) SvIV (dict_sv); struct sfm_write_options opts; if (!SvROK (opts_hr)) { @@ -482,6 +543,8 @@ CODE: sfi->writer = sfm_open_writer (fh, dict, opts); sfi->dict = dict; sfi->opened = true; + sfi->dict_sv = dict_sv; + SvREFCNT_inc (sfi->dict_sv); RETVAL = sfi; OUTPUT: @@ -500,6 +563,7 @@ DESTROY (sfi) struct sysfile_info *sfi CODE: sysfile_close (sfi); + SvREFCNT_dec (sfi->dict_sv); free (sfi); int @@ -519,13 +583,13 @@ CODE: const struct variable **vv; size_t nv; - struct ccase c; + struct ccase *c; SV *sv; if ( av_len (av_case) >= dict_get_var_cnt (sfi->dict)) XSRETURN_UNDEF; - case_create (&c, dict_get_next_value_idx (sfi->dict)); + c = case_create (dict_get_next_value_idx (sfi->dict)); dict_get_vars (sfi->dict, &vv, &nv, 1u << DC_ORDINARY | 1u << DC_SYSTEM); @@ -541,7 +605,7 @@ CODE: { struct substring ss = ss_cstr (SvPV_nolen (sv)); if ( ! data_in (ss, LEGACY_NATIVE, ifmt->type, 0, 0, 0, - case_data_rw (&c, v), + case_data_rw (c, v), var_get_width (v)) ) { RETVAL = 0; @@ -550,7 +614,7 @@ CODE: } else { - scalar_to_value (case_data_rw (&c, v), sv, v); + scalar_to_value (case_data_rw (c, v), sv, v); } } @@ -558,15 +622,14 @@ CODE: while (i < dict_get_var_cnt (sfi->dict)) { const struct variable *v = vv[i++]; - union value *val = case_data_rw (&c, v); + union value *val = case_data_rw (c, v); if ( var_is_numeric (v)) val->f = SYSMIS; else memset (val->s, ' ', var_get_width (v)); } - RETVAL = casewriter_write (sfi->writer, &c); + RETVAL = casewriter_write (sfi->writer, c); finish: -// case_destroy (&c); free (vv); OUTPUT: RETVAL @@ -612,9 +675,9 @@ SV * get_next_case (sfr) struct sysreader_info *sfr; CODE: - struct ccase c; + struct ccase *c; - if (! casereader_read (sfr->reader, &c)) + if (! (c = casereader_read (sfr->reader))) { RETVAL = 0; } @@ -626,12 +689,12 @@ CODE: 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); + const union value *val = case_data (c, var); av_push (av_case, value_to_scalar (val, var)); } - case_destroy (&c); + case_unref (c); RETVAL = newRV ((SV *) av_case); } OUTPUT: