+ *(unsigned int *) c->var = val;
+
+ option_changed = 1;
+ }
+ }
+ break;
+ case var_integer:
+ case var_zinteger:
+ {
+ LONGEST val;
+
+ if (arg == NULL)
+ {
+ if (c->var_type == var_integer)
+ error_no_arg (_("integer to set it to, or \"unlimited\"."));
+ else
+ error_no_arg (_("integer to set it to."));
+ }
+
+ if (c->var_type == var_integer && is_unlimited_literal (arg))
+ val = 0;
+ else
+ val = parse_and_eval_long (arg);
+
+ if (val == 0 && c->var_type == var_integer)
+ val = INT_MAX;
+ else if (val < INT_MIN
+ /* For var_integer, don't let the user set the value
+ to INT_MAX directly, as that exposes an
+ implementation detail to the user interface. */
+ || (c->var_type == var_integer && val >= INT_MAX)
+ || (c->var_type == var_zinteger && val > INT_MAX))
+ error (_("integer %s out of range"), plongest (val));
+
+ if (*(int *) c->var != val)
+ {
+ *(int *) c->var = val;
+
+ option_changed = 1;
+ }
+ break;
+ }
+ case var_enum:
+ {
+ int i;
+ int len;
+ int nmatches;
+ const char *match = NULL;
+ char *p;
+
+ /* If no argument was supplied, print an informative error
+ message. */
+ if (arg == NULL)
+ {
+ char *msg;
+ int msg_len = 0;
+
+ for (i = 0; c->enums[i]; i++)
+ msg_len += strlen (c->enums[i]) + 2;
+
+ msg = xmalloc (msg_len);
+ *msg = '\0';
+ make_cleanup (xfree, msg);
+
+ for (i = 0; c->enums[i]; i++)