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 <stdlib.h>
#include "alloc.h"
#include "bitvector.h"
#include "command.h"
+#include "dictionary.h"
#include "error.h"
#include "hash.h"
#include "lexer.h"
#include "var.h"
#include "vfm.h"
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
/* FIXME: should change weighting variable, etc. */
/* These control the ordering produced by
compare_variables_given_ordering(). */
if (lex_match_id ("REORDER"))
{
struct variable **v = NULL;
- int nv = 0;
+ size_t nv = 0;
if (already_encountered & 1)
{
do
{
struct ordering ordering;
- int prev_nv = nv;
+ size_t prev_nv = nv;
ordering.forward = ordering.positional = 1;
if (lex_match_id ("FORWARD"));
lex_match ('=');
do
{
- int prev_nv_1 = vm.rename_cnt;
- int prev_nv_2 = vm.rename_cnt;
+ size_t prev_nv_1 = vm.rename_cnt;
+ size_t prev_nv_2 = vm.rename_cnt;
if (!lex_match ('('))
{
else if (lex_match_id ("KEEP"))
{
struct variable **keep_vars, **all_vars, **drop_vars;
- int keep_cnt, all_cnt, drop_cnt;
+ size_t keep_cnt, all_cnt, drop_cnt;
if (already_encountered & 4)
{
compare_variables_given_ordering, &forward_positional_ordering);
dict_get_vars (default_dict, &all_vars, &all_cnt, 0);
+ assert (all_cnt >= keep_cnt);
drop_cnt = all_cnt - keep_cnt;
- drop_vars = xmalloc (drop_cnt * sizeof *keep_vars);
+ drop_vars = xnmalloc (drop_cnt, sizeof *keep_vars);
if (set_difference (all_vars, all_cnt,
keep_vars, keep_cnt,
sizeof *all_vars,
else if (lex_match_id ("DROP"))
{
struct variable **drop_vars;
- int drop_cnt;
+ size_t drop_cnt;
if (already_encountered & 4)
{
if (ordering->positional)
result = a->index < b->index ? -1 : a->index > b->index;
else
- result = strcmp (a->name, b->name);
+ result = strcasecmp (a->name, b->name);
if (!ordering->forward)
result = -result;
return result;
struct var_renaming
{
struct variable *var;
- char new_name[9];
+ char new_name[LONG_NAME_LEN + 1];
};
/* A algo_compare_func that compares new_name members in struct
const struct var_renaming *a = a_;
const struct var_renaming *b = b_;
- return strcmp (a->new_name, b->new_name);
+ return strcasecmp (a->new_name, b->new_name);
}
/* Returns true if performing VM on dictionary D would not cause
struct variable **all_vars;
struct variable **keep_vars;
struct variable **drop_vars;
- size_t all_cnt, keep_cnt, drop_cnt;
+ size_t keep_cnt, drop_cnt;
+ size_t all_cnt;
struct var_renaming *var_renaming;
int valid;
/* Drop variables, in index order. */
drop_cnt = vm->drop_cnt;
- drop_vars = xmalloc (drop_cnt * sizeof *drop_vars);
+ drop_vars = xnmalloc (drop_cnt, sizeof *drop_vars);
memcpy (drop_vars, vm->drop_vars, drop_cnt * sizeof *drop_vars);
sort (drop_vars, drop_cnt, sizeof *drop_vars,
compare_variables_given_ordering, &forward_positional_ordering);
/* Keep variables, in index order. */
+ assert (all_cnt >= drop_cnt);
keep_cnt = all_cnt - drop_cnt;
- keep_vars = xmalloc (keep_cnt * sizeof *keep_vars);
+ keep_vars = xnmalloc (keep_cnt, sizeof *keep_vars);
if (set_difference (all_vars, all_cnt,
drop_vars, drop_cnt,
sizeof *all_vars,
assert (0);
/* Copy variables into var_renaming array. */
- var_renaming = xmalloc (keep_cnt * sizeof *var_renaming);
+ var_renaming = xnmalloc (keep_cnt, sizeof *var_renaming);
for (i = 0; i < keep_cnt; i++)
{
var_renaming[i].var = keep_vars[i];
/* Record the old names of variables to rename. After
variables are deleted, we can't depend on the variables to
still exist, but we can still look them up by name. */
- rename_old_names = xmalloc (vm->rename_cnt * sizeof *rename_old_names);
+ rename_old_names = xnmalloc (vm->rename_cnt, sizeof *rename_old_names);
for (i = 0; i < vm->rename_cnt; i++)
rename_old_names[i] = xstrdup (vm->rename_vars[i]->name);
dict_delete_vars (d, vm->drop_vars, vm->drop_cnt);
/* Compose lists of variables to rename and their new names. */
- rename_vars = xmalloc (vm->rename_cnt * sizeof *rename_vars);
- rename_new_names = xmalloc (vm->rename_cnt * sizeof *rename_new_names);
+ rename_vars = xnmalloc (vm->rename_cnt, sizeof *rename_vars);
+ rename_new_names = xnmalloc (vm->rename_cnt, sizeof *rename_new_names);
rename_cnt = 0;
for (i = 0; i < vm->rename_cnt; i++)
{