projects
/
pspp
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fixed bug #14822.
[pspp]
/
src
/
val-labs.c
diff --git
a/src/val-labs.c
b/src/val-labs.c
index 9d289cbce50f7c707637092332d1f53ae59b5fdc..47d1ee65b406d67d839161c0f5ee42fa80dbd986 100644
(file)
--- a/
src/val-labs.c
+++ b/
src/val-labs.c
@@
-14,8
+14,8
@@
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc., 5
9 Temple Place - Suite 330
, Boston, MA
- 0211
1-1307
, USA. */
+ Foundation, Inc., 5
1 Franklin Street, Fifth Floor
, Boston, MA
+ 0211
0-1301
, USA. */
#include <config.h>
#include <stdio.h>
#include <config.h>
#include <stdio.h>
@@
-28,6
+28,9
@@
#include "str.h"
#include "value-labels.h"
#include "var.h"
#include "str.h"
#include "value-labels.h"
#include "var.h"
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
\f
/* Declarations. */
\f
/* Declarations. */
@@
-41,17
+44,12
@@
static int get_label (struct variable **vars, int var_cnt);
int
cmd_value_labels (void)
{
int
cmd_value_labels (void)
{
- lex_match_id ("VALUE");
- lex_match_id ("LABELS");
return do_value_labels (1);
}
int
cmd_add_value_labels (void)
{
return do_value_labels (1);
}
int
cmd_add_value_labels (void)
{
- lex_match_id ("ADD");
- lex_match_id ("VALUE");
- lex_match_id ("LABELS");
return do_value_labels (0);
}
\f
return do_value_labels (0);
}
\f
@@
-62,12
+60,19
@@
do_value_labels (int erase)
{
struct variable **vars; /* Variable list. */
int var_cnt; /* Number of variables. */
{
struct variable **vars; /* Variable list. */
int var_cnt; /* Number of variables. */
+ int parse_err=0; /* true if error parsing variables */
lex_match ('/');
while (token != '.')
{
lex_match ('/');
while (token != '.')
{
- parse_variables (default_dict, &vars, &var_cnt, PV_SAME_TYPE);
+ parse_err = !parse_variables (default_dict, &vars, &var_cnt,
+ PV_SAME_TYPE) ;
+ if (var_cnt < 1)
+ {
+ free(vars);
+ return CMD_FAILURE;
+ }
if (!verify_val_labs (vars, var_cnt))
goto lossage;
if (erase)
if (!verify_val_labs (vars, var_cnt))
goto lossage;
if (erase)
@@
-77,7
+82,11
@@
do_value_labels (int erase)
goto lossage;
if (token != '/')
goto lossage;
if (token != '/')
+ {
+ free (vars);
break;
break;
+ }
+
lex_get ();
free (vars);
lex_get ();
free (vars);
@@
-89,7
+98,7
@@
do_value_labels (int erase)
return CMD_TRAILING_GARBAGE;
}
return CMD_TRAILING_GARBAGE;
}
- return CMD_SUCCESS;
+ return
parse_err ? CMD_PART_SUCCESS_MAYBE :
CMD_SUCCESS;
lossage:
free (vars);
lossage:
free (vars);
@@
-107,7
+116,7
@@
verify_val_labs (struct variable **vars, int var_cnt)
{
struct variable *vp = vars[i];
{
struct variable *vp = vars[i];
- if (vp->type == ALPHA && vp->width >
8
)
+ if (vp->type == ALPHA && vp->width >
MAX_SHORT_STRING
)
{
msg (SE, _("It is not possible to assign value labels to long "
"string variables such as %s."), vp->name);
{
msg (SE, _("It is not possible to assign value labels to long "
"string variables such as %s."), vp->name);
@@
-148,16
+157,16
@@
get_label (struct variable **vars, int var_cnt)
lex_error (_("expecting string"));
return 0;
}
lex_error (_("expecting string"));
return 0;
}
-
st_bare_pad_copy (value.s, ds_value (&tokstr), MAX_SHORT_STRING
);
+
buf_copy_str_rpad (value.s, MAX_SHORT_STRING, ds_c_str (&tokstr)
);
}
else
{
}
else
{
- if (
token != T_NUM
)
+ if (
!lex_is_number ()
)
{
lex_error (_("expecting integer"));
return 0;
}
{
lex_error (_("expecting integer"));
return 0;
}
- if (!lex_i
nteger_p
())
+ if (!lex_i
s_integer
())
msg (SW, _("Value label `%g' is not integer."), tokval);
value.f = tokval;
}
msg (SW, _("Value label `%g' is not integer."), tokval);
value.f = tokval;
}
@@
-171,7
+180,7
@@
get_label (struct variable **vars, int var_cnt)
msg (SW, _("Truncating value label to 60 characters."));
ds_truncate (&tokstr, 60);
}
msg (SW, _("Truncating value label to 60 characters."));
ds_truncate (&tokstr, 60);
}
- label = ds_
value
(&tokstr);
+ label = ds_
c_str
(&tokstr);
for (i = 0; i < var_cnt; i++)
val_labs_replace (vars[i]->val_labs, value, label);
for (i = 0; i < var_cnt; i++)
val_labs_replace (vars[i]->val_labs, value, label);