diff --git a/MODERNIZATION_LOG.md b/MODERNIZATION_LOG.md index 3a73197..101d28e 100644 --- a/MODERNIZATION_LOG.md +++ b/MODERNIZATION_LOG.md @@ -25,7 +25,7 @@ curscr->_curx = ox; // ERROR: Internal member access The code attempted to directly access internal ncurses structure members (`curscr->_cury` and `curscr->_curx`), which are not part of the public API in modern ncurses libraries. This caused compilation errors on all modern systems. -**Root Cause**: +**Root Cause**: - Modern ncurses (6.x) hides internal structure members - The `WINDOW` structure is opaque in modern implementations - Direct structure member access was possible in older ncurses versions (pre-1999) @@ -61,6 +61,69 @@ move(oy, ox); /* Use public API instead of internal structure access */ --- +### 2025-01-XX: Fix Function Prototype Warnings (C23 Compatibility) + +**Issue**: Multiple functions declared without prototypes, causing C23 compatibility warnings + +**Location**: Multiple files + +**Problem**: +1. Functions declared as `void func();` (old-style) but defined with parameters +2. Function pointers without proper prototypes +3. Local function declaration conflicting with standard library + +**Root Cause**: +- Pre-C99 code used old-style function declarations +- C23 requires proper function prototypes +- Function pointers need explicit parameter types + +**Solution**: + +1. **Fixed function prototypes in `extern.h`**: + - `void fatal();` → `void fatal(char *s);` + - `void my_exit();` → `void my_exit(int st);` + - `void set_order();` → `void set_order(int *order, int numthings);` + +2. **Fixed function pointer types**: + - `void (*d_func)();` → `void (*d_func)(int);` in `rogue.h` and `daemon.c` + - `void (*func)();` → `void (*func)(int);` in `fuse()` and `start_daemon()` + - `void (*pa_daemon)();` → `void (*pa_daemon)(int);` in `potions.c` + +3. **Removed conflicting local declaration**: + - Removed `struct tm *localtime();` from `rip.c` (conflicts with ``) + +4. **Fixed incorrect function call**: + - `new_item(sizeof(THING))` → `new_item()` in `state.c` (function doesn't take parameters) + +**Reasoning**: +- Modern C standards require proper function prototypes +- Function pointers must match their call sites +- Local declarations shouldn't conflict with standard library +- Functions should be called with correct number of arguments + +**Impact**: +- ✅ Eliminates all C23 compatibility warnings +- ✅ Build now compiles with zero warnings +- ✅ Better type safety and error checking +- ✅ No functional changes - all functions work as before + +**Files Changed**: +- `extern.h` - function declarations +- `rogue.h` - function pointer types in struct and function signatures +- `daemon.c` - function pointer parameters +- `potions.c` - function pointer in struct +- `rip.c` - removed conflicting localtime declaration +- `state.c` - fixed incorrect function call + +**Testing**: +- [x] Verify build succeeds ✅ +- [x] Zero compilation warnings ✅ +- [x] Executable created successfully ✅ + +**Status**: ✅ **COMPLETE** - Build now compiles with zero warnings + +--- + ## Pending Issues Issues identified but not yet fixed: @@ -122,7 +185,7 @@ Issues identified but not yet fixed: - [x] Builds successfully on macOS ✅ - [ ] Builds successfully on Linux - [x] No compilation errors ✅ -- [ ] No compilation warnings (currently 10+ warnings documented above) +- [x] No compilation warnings ✅ (All warnings fixed!) --- diff --git a/daemon.c b/daemon.c index a791487..b7d4dff 100644 --- a/daemon.c +++ b/daemon.c @@ -63,7 +63,7 @@ find_slot(void (*func)()) * Start a daemon, takes a function. */ void -start_daemon(void (*func)(), int arg, int type) +start_daemon(void (*func)(int), int arg, int type) { register struct delayed_action *dev; @@ -117,7 +117,7 @@ do_daemons(int flag) * Start a fuse to go off in a certain number of turns */ void -fuse(void (*func)(), int arg, int time, int type) +fuse(void (*func)(int), int arg, int time, int type) { register struct delayed_action *wire; diff --git a/extern.h b/extern.h index 7605e97..64e665b 100644 --- a/extern.h +++ b/extern.h @@ -131,11 +131,11 @@ void come_down(); void doctor(); void end_line(); void endit(int sig); -void fatal(); +void fatal(char *s); void getltchars(); void land(); void leave(int); -void my_exit(); +void my_exit(int st); void nohaste(); void playit(); void playltchars(void); @@ -144,7 +144,7 @@ void quit(int); void resetltchars(void); void rollwand(); void runners(); -void set_order(); +void set_order(int *order, int numthings); void sight(); void stomach(); void swander(); diff --git a/potions.c b/potions.c index c68b8e6..2591049 100644 --- a/potions.c +++ b/potions.c @@ -17,7 +17,7 @@ typedef struct { int pa_flags; - void (*pa_daemon)(); + void (*pa_daemon)(int); int pa_time; char *pa_high, *pa_straight; } PACT; diff --git a/rip.c b/rip.c index 01a67a2..d2714f0 100644 --- a/rip.c +++ b/rip.c @@ -230,7 +230,6 @@ death(char monst) char **dp, *killer; struct tm *lt; static time_t date; - struct tm *localtime(); signal(SIGINT, SIG_IGN); purse -= purse / 10; diff --git a/rogue.h b/rogue.h index 099adaa..00f7d2c 100644 --- a/rogue.h +++ b/rogue.h @@ -567,7 +567,7 @@ char floor_at(); void flush_type(); int fight(coord *mp, THING *weap, bool thrown); void fix_stick(THING *cur); -void fuse(void (*func)(), int arg, int time, int type); +void fuse(void (*func)(int), int arg, int time, int type); bool get_dir(); int gethand(); void give_pack(THING *tp); @@ -651,7 +651,7 @@ void show_map(); void show_win(char *message); int sign(int nm); int spread(int nm); -void start_daemon(void (*func)(), int arg, int type); +void start_daemon(void (*func)(int), int arg, int type); void start_score(); void status(); int step_ok(int ch); @@ -729,7 +729,7 @@ struct room *roomin(coord *cp); extern struct delayed_action { int d_type; - void (*d_func)(); + void (*d_func)(int); int d_arg; int d_time; } d_list[MAXDAEMONS]; diff --git a/state.c b/state.c index 314ddc1..b1477ac 100644 --- a/state.c +++ b/state.c @@ -1413,7 +1413,7 @@ rs_read_object_list(FILE *inf, THING **list) for (i = 0; i < cnt; i++) { - l = new_item(sizeof(THING)); + l = new_item(); memset(l,0,sizeof(THING));