projects
/
pspp-builds.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix crash on text import dialog
[pspp-builds.git]
/
perl-module
/
PSPP.xs
diff --git
a/perl-module/PSPP.xs
b/perl-module/PSPP.xs
index 2d2c8d9d2456cb74f6bd4daab75aadc59e00ac14..b3ac4cdc31e84670194ede7d254315ab48deea23 100644
(file)
--- a/
perl-module/PSPP.xs
+++ b/
perl-module/PSPP.xs
@@
-38,9
+38,11
@@
#include <data/sys-file-writer.h>
#include <data/sys-file-reader.h>
#include <data/value.h>
#include <data/sys-file-writer.h>
#include <data/sys-file-reader.h>
#include <data/value.h>
+#include <data/vardict.h>
#include <data/value-labels.h>
#include <data/format.h>
#include <data/data-in.h>
#include <data/value-labels.h>
#include <data/format.h>
#include <data/data-in.h>
+#include <data/data-out.h>
#include <string.h>
typedef struct fmt_spec input_format ;
#include <string.h>
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);
{
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 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);
}
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);
scalar_to_value (uv, val, var);
- return uv;
}
}
@@
-160,6
+165,7
@@
onBoot (ver)
const char *ver
CODE:
assert (0 == strcmp (ver, bare_version));
const char *ver
CODE:
assert (0 == strcmp (ver, bare_version));
+ i18n_init ();
msg_init (NULL, message_handler);
settings_init (0, 0);
fh_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);
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;
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;
ret = newSVpv (s, fmt->w);
free (s);
RETVAL = ret;
@@
-189,9
+195,11
@@
value_is_missing (val, var)
SV *val
struct variable *var
CODE:
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
RETVAL = ret;
OUTPUT:
RETVAL
@@
-398,26
+406,27
@@
INIT:
sv_setpv (errstr, "");
CODE:
union value the_value;
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");
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
{
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);
{
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 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 )
{
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;
- 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);
{
SV *sv = value_to_scalar (&vl->value, var);
STRLEN len;
const char *s = SvPV (sv, len);
- hv_store (labelhash, s, len, newSVpv (v
l->label
, 0), 0);
+ hv_store (labelhash, s, len, newSVpv (v
al_lab_get_label (vl)
, 0), 0);
}
}
}
}
@@
-589,7
+598,7
@@
CODE:
if ( av_len (av_case) >= dict_get_var_cnt (sfi->dict))
XSRETURN_UNDEF;
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);
dict_get_vars (sfi->dict, &vv, &nv, 1u << DC_ORDINARY | 1u << DC_SYSTEM);
@@
-605,6
+614,7
@@
CODE:
{
struct substring ss = ss_cstr (SvPV_nolen (sv));
if ( ! data_in (ss, LEGACY_NATIVE, ifmt->type, 0, 0, 0,
{
struct substring ss = ss_cstr (SvPV_nolen (sv));
if ( ! data_in (ss, LEGACY_NATIVE, ifmt->type, 0, 0, 0,
+ sfi->dict,
case_data_rw (c, v),
var_get_width (v)) )
{
case_data_rw (c, v),
var_get_width (v)) )
{
@@
-623,10
+633,7
@@
CODE:
{
const struct variable *v = vv[i++];
union value *val = case_data_rw (c, v);
{
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:
}
RETVAL = casewriter_write (sfi->writer, c);
finish:
@@
-671,32
+678,24
@@
CODE:
RETVAL
RETVAL
-SV *
+void
get_next_case (sfr)
struct sysreader_info *sfr;
get_next_case (sfr)
struct sysreader_info *sfr;
-CODE:
+
PP
CODE:
struct ccase *c;
struct ccase *c;
- if (! (c = casereader_read (sfr->reader)))
- {
- RETVAL = 0;
- }
- else
+ if (c = casereader_read (sfr->reader))
{
int v;
{
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);
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);
}
case_unref (c);
- RETVAL = newRV ((SV *) av_case);
}
}
-OUTPUT:
- RETVAL
-