arogue5: fix some daemon-related pointer/int casting.

Daemons and fuses take a single argument, nominally an int but either
ignored or unsafely cast to a pointer.  Its type has now been changed
to void*.

The save/restore code no longer tries to store this argument in the
savefile.  For doctor(), this is not a problem, because player is the
only argument it is ever given as a daemon.  However, alchemy() will
fail to do anything when passed NULL.  Fixing this would be complicated
but possible.

Summary: the code is slightly safer, but alchemy jugs are guaranteed to
stop working after save and restore, instead of just extremely likely.
This commit is contained in:
John "Elwin" Edwards 2014-03-28 10:57:03 -07:00
parent dff96acf36
commit 7b0ec1230e
3 changed files with 9 additions and 10 deletions

View file

@ -87,8 +87,7 @@ reg int (*func)();
* start_daemon:
* Start a daemon, takes a function.
*/
start_daemon(func, arg, type)
reg int arg, type, (*func)();
start_daemon(int (*func)(), void *arg, int type)
{
reg struct delayed_action *dev;
@ -122,7 +121,7 @@ reg int (*func)();
* Take it out of the list
*/
dev->d_type = EMPTY;
dev->d_arg = 0;
dev->d_arg = NULL;
dev->d_func = NULL;
dev->d_time = 0;
demoncnt -= 1; /* update count */
@ -155,8 +154,7 @@ reg int flag;
* fuse:
* Start a fuse to go off in a certain number of turns
*/
fuse(func, arg, time, type)
reg int (*func)(), arg, time, type;
fuse(int (*func)(), void *arg, int time, int type)
{
reg struct delayed_action *wire;
@ -199,7 +197,7 @@ reg int (*func)();
return;
wire->d_type = EMPTY;
wire->d_func = NULL;
wire->d_arg = 0;
wire->d_arg = NULL;
wire->d_time = 0;
fusecnt -= 1;
}