Files
rgoue/MODERNIZATION_LOG.md
David Silva 97aee89f9c Update date in second modernization iteration entry
- Change date from placeholder 2025-01-XX to 2025-11-07 for function prototype fixes
2025-11-07 15:37:05 +00:00

5.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-11-07: 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 (low priority - build works correctly):

1. Function Prototype Warnings (C23 Compatibility) FIXED

Status: All function prototype warnings have been resolved in Iteration 2.

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