X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=perl-module%2FPSPP.xs;h=237ae95f541a9564829ff93bff2ce33d8fcb2314;hb=5fb2011a5a7d63dd694d49944a114562bfe764ca;hp=c479c75b09e1e67f85a208aa03fc6aa08e27257e;hpb=a8a61c1dd90faf464a46ad11620c6e461f31bab1;p=pspp-builds.git diff --git a/perl-module/PSPP.xs b/perl-module/PSPP.xs index c479c75b..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) @@ -632,32 +671,24 @@ CODE: RETVAL -SV * +void get_next_case (sfr) struct sysreader_info *sfr; -CODE: +PPCODE: struct ccase *c; - if (! (c = casereader_read (sfr->reader))) - { - 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); - av_push (av_case, value_to_scalar (val, var)); + PUSHs (sv_2mortal (value_to_scalar (val, var))); } case_unref (c); - RETVAL = newRV ((SV *) av_case); } -OUTPUT: - RETVAL -