X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=perl-module%2FPSPP.xs;h=237ae95f541a9564829ff93bff2ce33d8fcb2314;hb=00d84d9cfd8260a3ddfe804e9ae741558213dbd2;hp=7bb36ef3bc7468bd419a8ce2681ea00ba064baf9;hpb=4ed307e3ae98c362d182bc5c8b2d79f4252ff1b8;p=pspp-builds.git diff --git a/perl-module/PSPP.xs b/perl-module/PSPP.xs index 7bb36ef3..237ae95f 100644 --- a/perl-module/PSPP.xs +++ b/perl-module/PSPP.xs @@ -1,5 +1,5 @@ /* PSPP - computes sample statistics. - Copyright (C) 2007, 2008 Free Software Foundation, Inc. + Copyright (C) 2007, 2008, 2009 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -31,7 +31,9 @@ #include #include #include +#include #include +#include #include #include #include @@ -180,7 +182,7 @@ CODE: RETVAL = ret; OUTPUT: RETVAL - + int value_is_missing (val, var) @@ -423,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) @@ -544,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); @@ -566,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; @@ -575,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); } } @@ -583,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 @@ -633,32 +671,24 @@ CODE: RETVAL -SV * +void get_next_case (sfr) struct sysreader_info *sfr; -CODE: - struct ccase c; +PPCODE: + struct ccase *c; - if (! casereader_read (sfr->reader, &c)) - { - RETVAL = 0; - } - else + if (c = casereader_read (sfr->reader)) { int v; - AV *av_case = (AV *) sv_2mortal ((SV *) newAV()); + EXTEND (SP, dict_get_var_cnt (sfr->dict)); 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)); + PUSHs (sv_2mortal (value_to_scalar (val, var))); } - case_destroy (&c); - RETVAL = newRV ((SV *) av_case); + case_unref (c); } -OUTPUT: - RETVAL -