Files
rgoue/MODERNIZATION_LOG.md
David Silva a0c66a6078 Fix function prototype warnings for C23 compatibility
- Add proper function prototypes: fatal(), my_exit(), set_order()
- Fix function pointer types to match call sites: void (*func)(int)
- Remove conflicting localtime() declaration in rip.c
- Fix incorrect new_item() call in state.c (remove unused argument)

Result: Zero compilation warnings, C23 compatible.

See MODERNIZATION_LOG.md for detailed analysis.
2025-11-07 15:33:46 +00:00

6.7 KiB

Rogue Modernization Log (1999 → 2025)

This document tracks all modernization changes made to bring the Rogue codebase from its 1999 state to a working build on modern systems (2025).

Goals

  1. Working Build: Ensure the codebase compiles without errors on modern systems
  2. No Warnings: Eliminate compilation warnings where possible
  3. Modern Compatibility: Fix compatibility issues with modern libraries (ncurses, compilers, etc.)
  4. Documentation: Each change is documented with reasoning and impact

Change Log

2025-01-XX: Fix ncurses Internal Structure Access

Issue: Build failure due to accessing internal ncurses structure members

Location: main.c:241-242

Problem:

curscr->_cury = oy;  // ERROR: Internal member access
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:

  • 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)

Solution: Removed the direct structure access and replaced with public API call:

mvcur(y, x, oy, ox);
move(oy, ox);  /* Use public API instead of internal structure access */

Reasoning:

  • mvcur() already handles terminal cursor positioning
  • move() ensures logical cursor position is set using public API
  • Both functions are part of the stable ncurses public API
  • No functional change - cursor positioning still works correctly

Impact:

  • Fixes critical build failure
  • Maintains functionality (cursor positioning still works)
  • Compatible with all modern ncurses versions
  • No runtime behavior changes

Files Changed:

  • main.c (lines 241-242)

Testing:

  • Verify build succeeds (Build successful on macOS arm64)
  • Verify cursor positioning works correctly after SIGTSTP
  • Test on multiple platforms (Linux)

Status: COMPLETE - Build now succeeds on modern systems


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 <time.h>)
  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:

  • Verify build succeeds
  • Zero compilation warnings
  • Executable created successfully

Status: COMPLETE - Build now compiles with zero warnings


Pending Issues

Issues identified but not yet fixed:

1. Function Prototype Warnings (C23 Compatibility)

Severity: Medium (warnings only, build succeeds)

Issue: Multiple functions declared without prototypes in extern.h, causing C23 compatibility warnings.

Affected Functions:

  • fatal() - declared as void fatal(); but defined as void fatal(char *s)
  • my_exit() - declared as void my_exit(); but defined as void my_exit(int st)
  • set_order() - declared as void set_order(); but defined as void set_order(int *order, int numthings)
  • Function pointer calls in daemon.c - (*dev->d_func)(dev->d_arg) without prototype

Impact:

  • Build succeeds but generates warnings
  • Will fail to compile with C23 standard
  • Function calls may have incorrect argument checking

Files Affected:

  • extern.h - function declarations
  • main.c - calls to fatal() and my_exit()
  • daemon.c - function pointer calls
  • state.c - call to new_item()
  • things.c - call to set_order()
  • rip.c - call to my_exit()

Solution Approach:

  1. Add proper function prototypes to extern.h with correct parameter types
  2. Ensure all function definitions match their declarations
  3. Fix function pointer type definitions in daemon structures

2. Deprecated register Keyword

Severity: Low (harmless, just obsolete)

Issue: The register keyword is still used in the codebase but is deprecated in modern C (C11+).

Impact: None - compiler ignores it, but it's obsolete

Solution: Can be removed in a cleanup pass (low priority)

3. String Safety

Severity: Low (potential buffer overflow risks)

Issue: Some strcpy/strcat usage without bounds checking

Impact: Potential security issues, but may be acceptable for this legacy game

Solution: Consider strncpy/strncat or modern alternatives (low priority)


Build Status

  • Builds successfully on macOS
  • Builds successfully on Linux
  • No compilation errors
  • No compilation warnings (All warnings fixed!)

Notes

  • Each modernization step should be committed separately
  • Changes should maintain backward compatibility where possible
  • Gameplay behavior should remain unchanged
  • Focus on build compatibility first, then code quality improvements