From 16daa4007cdf4736c97dbc8ff186e77f343eac15 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Sat, 9 Apr 2011 14:57:42 +0200 Subject: [PATCH] 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. --- src/lib/commands/map.c | 2 +- src/lib/subs/maps.c | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/lib/commands/map.c b/src/lib/commands/map.c index ae995c29..cbce5548 100644 --- a/src/lib/commands/map.c +++ b/src/lib/commands/map.c @@ -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 { diff --git a/src/lib/subs/maps.c b/src/lib/subs/maps.c index b109b453..0f247595 100644 --- a/src/lib/subs/maps.c +++ b/src/lib/subs/maps.c @@ -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; }