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., 59 Temple Place - Suite 330, Boston, MA
- 02111-1307, USA. */
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA. */
#include <config.h>
#include <stdio.h>
#include "str.h"
#include "value-labels.h"
#include "var.h"
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
\f
/* Declarations. */
static int do_value_labels (int);
-static int verify_val_labs (struct variable **vars, int var_cnt);
-static void erase_labels (struct variable **vars, int var_cnt);
-static int get_label (struct variable **vars, int var_cnt);
+static int verify_val_labs (struct variable **vars, size_t var_cnt);
+static void erase_labels (struct variable **vars, size_t var_cnt);
+static int get_label (struct variable **vars, size_t var_cnt);
\f
/* Stubs. */
do_value_labels (int erase)
{
struct variable **vars; /* Variable list. */
- int var_cnt; /* Number of variables. */
+ size_t var_cnt; /* Number of variables. */
+ int parse_err=0; /* true if error parsing variables */
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)
goto lossage;
if (token != '/')
+ {
+ free (vars);
break;
+ }
+
lex_get ();
free (vars);
}
- free (vars);
if (token != '.')
{
return CMD_TRAILING_GARBAGE;
}
- return CMD_SUCCESS;
+ return parse_err ? CMD_PART_SUCCESS_MAYBE : CMD_SUCCESS;
lossage:
free (vars);
/* Verifies that none of the VAR_CNT variables in VARS are long
string variables. */
static int
-verify_val_labs (struct variable **vars, int var_cnt)
+verify_val_labs (struct variable **vars, size_t var_cnt)
{
- int i;
+ size_t i;
for (i = 0; i < var_cnt; 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);
/* Erases all the labels for the VAR_CNT variables in VARS. */
static void
-erase_labels (struct variable **vars, int var_cnt)
+erase_labels (struct variable **vars, size_t var_cnt)
{
- int i;
+ size_t i;
/* Erase old value labels if desired. */
for (i = 0; i < var_cnt; i++)
/* Parse all the labels for the VAR_CNT variables in VARS and add
the specified labels to those variables. */
static int
-get_label (struct variable **vars, int var_cnt)
+get_label (struct variable **vars, size_t var_cnt)
{
/* Parse all the labels and add them to the variables. */
do
{
union value value;
char *label;
- int i;
+ size_t i;
/* Set value. */
if (vars[0]->type == ALPHA)
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
{
- if (token != T_NUM)
+ if (!lex_is_number ())
{
lex_error (_("expecting integer"));
return 0;
}
- if (!lex_integer_p ())
+ if (!lex_is_integer ())
msg (SW, _("Value label `%g' is not integer."), tokval);
value.f = tokval;
}
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);