X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=perl-module%2FPSPP.xs;h=94ca9b01834b9fd968319a75e736c4ecd1ef71be;hb=69c134ad8584c6c0dbbd908ed8ed278e920445a9;hp=2d2c8d9d2456cb74f6bd4daab75aadc59e00ac14;hpb=d75247c28e0dce9c21070e4ee14fdc6a2338fb77;p=pspp-builds.git diff --git a/perl-module/PSPP.xs b/perl-module/PSPP.xs index 2d2c8d9d..94ca9b01 100644 --- a/perl-module/PSPP.xs +++ b/perl-module/PSPP.xs @@ -38,9 +38,11 @@ #include #include #include +#include #include #include #include +#include #include typedef struct fmt_spec input_format ; @@ -113,8 +115,9 @@ scalar_to_value (union value *val, SV *scalar, const struct variable *var) { STRLEN len; const char *p = SvPV (scalar, len); - memset (val->s, ' ', var_get_width (var)); - memcpy (val->s, p, len); + int width = var_get_width (var); + value_set_missing (val, width); + memcpy (value_str_rw (val, width), p, len); } } @@ -130,7 +133,10 @@ value_to_scalar (const union value *val, const struct variable *var) return newSVnv (val->f); } else - return newSVpvn (val->s, var_get_width (var)); + { + int width = var_get_width (var); + return newSVpvn (value_str (val, width), width); + } } @@ -142,12 +148,11 @@ var_set_input_format (struct variable *v, input_format ip_fmt) var_attach_aux (v, if_copy, var_dtor_free); } -static union value * -make_value_from_scalar (SV *val, const struct variable *var) +static void +make_value_from_scalar (union value *uv, SV *val, const struct variable *var) { - union value *uv = value_create (var_get_width (var)); + value_init (uv, var_get_width (var)); scalar_to_value (uv, val, var); - return uv; } @@ -160,6 +165,7 @@ onBoot (ver) const char *ver CODE: assert (0 == strcmp (ver, bare_version)); + i18n_init (); msg_init (NULL, message_handler); settings_init (0, 0); fh_init (); @@ -171,12 +177,12 @@ format_value (val, var) CODE: SV *ret; const struct fmt_spec *fmt = var_get_print_format (var); - union value *uv = make_value_from_scalar (val, var); + const struct dictionary *dict = var_get_vardict (var)->dict; + union value uv; char *s; - s = malloc (fmt->w); - memset (s, '\0', fmt->w); - data_out (uv, fmt, s); - free (uv); + make_value_from_scalar (&uv, val, var); + s = data_out (&uv, dict_get_encoding (dict), fmt); + value_destroy (&uv, var_get_width (var)); ret = newSVpv (s, fmt->w); free (s); RETVAL = ret; @@ -189,9 +195,11 @@ value_is_missing (val, var) SV *val struct variable *var CODE: - union value *uv = make_value_from_scalar (val, var); - int ret = var_is_value_missing (var, uv, MV_ANY); - free (uv); + union value uv; + int ret; + make_value_from_scalar (&uv, val, var); + ret = var_is_value_missing (var, &uv, MV_ANY); + value_destroy (&uv, var_get_width (var)); RETVAL = ret; OUTPUT: RETVAL @@ -398,26 +406,27 @@ INIT: sv_setpv (errstr, ""); CODE: union value the_value; + int width = var_get_width (var); + int ok; + value_init (&the_value, width); if ( var_is_numeric (var)) { if ( ! looks_like_number (key)) { sv_setpv (errstr, "Cannot add label with string key to a numeric variable"); + value_destroy (&the_value, width); XSRETURN_IV (0); } the_value.f = SvNV (key); } else { - if ( var_is_long_string (var) ) - { - sv_setpv (errstr, "Cannot add label to a long string variable"); - XSRETURN_IV (0); - } - strncpy (the_value.s, SvPV_nolen(key), MAX_SHORT_STRING); + value_copy_str_rpad (&the_value, width, SvPV_nolen(key), ' '); } - if (! var_add_value_label (var, &the_value, label) ) + ok = var_add_value_label (var, &the_value, label); + value_destroy (&the_value, width); + if (!ok) { sv_setpv (errstr, "Something went wrong"); XSRETURN_IV (0); @@ -486,20 +495,20 @@ get_value_labels (var) struct variable *var CODE: HV *labelhash = (HV *) sv_2mortal ((SV *) newHV()); - struct val_lab *vl; + const struct val_lab *vl; struct val_labs_iterator *viter = NULL; const struct val_labs *labels = var_get_value_labels (var); if ( labels ) { - for (vl = val_labs_first (labels, &viter); + for (vl = val_labs_first (labels); vl; - vl = val_labs_next (labels, &viter)) + vl = val_labs_next (labels, vl)) { SV *sv = value_to_scalar (&vl->value, var); STRLEN len; const char *s = SvPV (sv, len); - hv_store (labelhash, s, len, newSVpv (vl->label, 0), 0); + hv_store (labelhash, s, len, newSVpv (val_lab_get_label (vl), 0), 0); } } @@ -589,7 +598,7 @@ CODE: if ( av_len (av_case) >= dict_get_var_cnt (sfi->dict)) XSRETURN_UNDEF; - c = case_create (dict_get_next_value_idx (sfi->dict)); + c = case_create (dict_get_proto (sfi->dict)); dict_get_vars (sfi->dict, &vv, &nv, 1u << DC_ORDINARY | 1u << DC_SYSTEM); @@ -623,10 +632,7 @@ CODE: { const struct variable *v = vv[i++]; union value *val = case_data_rw (c, v); - if ( var_is_numeric (v)) - val->f = SYSMIS; - else - memset (val->s, ' ', var_get_width (v)); + value_set_missing (val, var_get_width (v)); } RETVAL = casewriter_write (sfi->writer, c); finish: @@ -671,32 +677,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 -