Fix do_map()'s misuse of snxtsct() for testing argument syntax

It assumes snxtsct() fails only when the argument can't be parsed.  It
can also fail when the condition argument has errors.  `map # ?xxx'
first complains about xxx, then maps around ship#0.  Broken since
Chainsaw 2 introduced smap, pmap and lmap.

Use sarg_type() to recognize sectors vs. unit argument.  `map # ?xxx'
now fails as it should.

Subtle side effect: do_map() no longer prompts for argument "",
because snxtsct() is now guarded by sarg_type().  Impact on callers:

* display_region_map() is not affected, because it never passes "".

* map() passes on "" arguments.  Change it to prompt in that case.
  Consistent with how other commands behave.  No functional change.

* do_unit_move() passes on "" arguments.  Keep it that way.  This
  changes navigate and march sub-commands 'M' and 'B' not to prompt
  for "" arguments, which is consistent with sub-command 'm' of move,
  test and transport.
This commit is contained in:
Markus Armbruster 2011-04-09 14:57:42 +02:00
parent baee0744ff
commit 16daa4007c
2 changed files with 9 additions and 2 deletions

View file

@ -73,7 +73,7 @@ map(void)
}
}
if (player->argp[1] == NULL) {
if (!player->argp[1] || !*player->argp[1]) {
if (unit_type == EF_BAD) {
str = getstring("(sects)? ", buf);
} else {

View file

@ -76,7 +76,14 @@ do_map(int bmap, int unit_type, char *arg, char *map_flags_arg)
char *b;
int map_flags = 0;
if (!snxtsct(&ns, arg)) {
switch (sarg_type(arg)) {
case NS_DIST:
case NS_AREA:
case NS_ALL:
if (!snxtsct(&ns, arg))
return RET_SYN;
break;
default:
if (unit_map(unit_type, atoi(arg), &ns, &origin))
return RET_FAIL;
}