Clean up move_ground()'s parsing of DIR_MAP

Split with parse() and pass first two arguments instead of the raw
tail to the map() callback.  Advantages:

* Consistent with do_unit_move().

* Does the right thing when the tail is just spaces.  Before, the
  spaces got passed to the map() callback, which complained about
  syntax.  Now, they are ignored.  This is what the commit I just
  reverted tried to fix.

* Works better when the tail splits into more than two arguments.
  Except for explore_map(), which ignores the argument(s), the map()
  callbacks use display_region_map(), which split the tail at the
  first space, and complained about any spaces in the second part.
  Now, display_region_map() takes two argument strings instead of a
  single, unsplit argument string, and extra arguments get silently
  ignored, as usual.
This commit is contained in:
Markus Armbruster 2011-04-10 18:09:16 +02:00
parent 40cfb41b4e
commit 28d4847416
Notes: Markus Armbruster 2012-02-11 09:54:40 +01:00
Deprecate usage without space between DIR_MAP and first argument.
7 changed files with 36 additions and 34 deletions

View file

@ -420,29 +420,21 @@ unit_map(int unit_type, int uid, struct nstr_sect *nsp, char *originp)
int
display_region_map(int bmap, int unit_type, coord curx, coord cury,
char *arg)
char *arg1, char *arg2)
{
char coordinates[80];
char *map_flag_arg;
if (!arg || !*arg) {
if (!arg1 || !*arg1) {
struct natstr *np;
np = getnatp(player->cnum);
sprintf(coordinates, "%d:%d,%d:%d",
xrel(np, curx - 10), xrel(np, curx + 10),
yrel(np, cury - 5), yrel(np, cury + 5));
arg = coordinates;
map_flag_arg = NULL;
} else {
map_flag_arg = strchr(arg, ' ');
if (map_flag_arg != NULL) {
*map_flag_arg++ = '\0';
while (isspace(*map_flag_arg)) map_flag_arg++;
}
arg1 = coordinates;
}
player->condarg = NULL;
return do_map(bmap, unit_type, arg, map_flag_arg);
return do_map(bmap, unit_type, arg1, arg2);
}
int

View file

@ -47,8 +47,8 @@ static int move_map(coord curx, coord cury, char *arg);
int
move_ground(struct sctstr *start, struct sctstr *end,
double weight, char *path,
int (*map)(coord, coord, char *), int exploring,
int *dam)
int (*map)(coord, coord, char *, char *),
int exploring, int *dam)
{
struct sctstr sect;
struct sctstr next;
@ -62,6 +62,9 @@ move_ground(struct sctstr *start, struct sctstr *end,
size_t len;
double mobility = start->sct_mobil;
int dir;
char scanspace[1024];
char *argp[128];
int ac;
int intcost;
int takedam = *dam;
int out = 0;
@ -119,7 +122,7 @@ move_ground(struct sctstr *start, struct sctstr *end,
oldy = cury;
if (!movstr || *movstr == 0) {
if (exploring) {
map(curx, cury, NULL);
map(curx, cury, NULL, NULL);
} else {
move_map(curx, cury, NULL);
}
@ -168,15 +171,23 @@ move_ground(struct sctstr *start, struct sctstr *end,
*movstr = 0;
continue;
}
movstr++;
if (dir == DIR_MAP) {
ac = parse(movstr, scanspace, argp, NULL, NULL, NULL);
if (ac == 1) {
pr("Use of '%c' without a space before its argument is deprecated.\n"
"Support for it will go away in a future release\n",
*movstr);
argp[1] = argp[0] + 1;
}
if (!exploring)
map(curx, cury, movstr + 1);
map(curx, cury, argp[1], argp[2]);
*movstr = 0;
continue;
} else if (dir == DIR_STOP)
}
movstr++;
if (dir == DIR_STOP)
break;
else if (dir == DIR_VIEW) {
if (dir == DIR_VIEW) {
pr("%d%% %s with %d civilians.\n", sect.sct_effic,
dchr[sect.sct_type].d_name, sect.sct_item[I_CIVIL]);
continue;