sdlparser-scrap/docs/KNOWN_ISSUES.md

7.8 KiB

Known Issues and Limitations

This document lists current limitations and remaining issues in the SDL3 header parser.

Current Status

45+ SDL3 headers successfully generated with automatic dependency resolution and JSON export.

Successfully Generated APIs

All major SDL3 APIs parse and generate correctly, including:

  • Core: audio, camera, clipboard, dialog, events, filesystem, gamepad, gpu, haptic, hints, init, joystick, keyboard, log, mouse, pen, power, properties, rect, render, sensor, storage, surface, time, timer, touch, video
  • Platform: iostream, loadso, locale, messagebox, misc, process, stdinc, system, vulkan
  • Specialized: blendmode, error, guid, metal, pixels, scancode

Intentionally Skipped

  • assert: Macro-only header (no types to parse)
  • mutex: Low-level unsafe primitives (use std.Thread.Mutex instead)
  • thread: Complex concurrency primitives (use std.Thread instead)
  • hidapi: Low-level USB/HID interface (specialized use)
  • tray: Platform-specific system tray (incomplete API)

Known Limitations

1. Field Names That Shadow Zig Keywords

Issue: Fields named type, error, async, etc. cause compilation errors

Status: FIXED - Automatic escaping implemented

Example:

typedef struct {
    int type;  // Automatically escaped now
} SDL_Something;

Generated:

pub const Something = extern struct {
    @"type": c_int,  // Auto-escaped!
};

Keywords Handled: type, error, async, await, suspend, resume, try, catch, if, else, for, while, switch, return, break, continue, defer, unreachable, noreturn, comptime, inline, export, extern, packed, const, var, fn, pub, test, struct, enum, union, opaque

2. Function Pointer Typedefs

Issue: Function pointer types generate as opaque types instead of function pointers

Status: FIXED - Proper function pointer typedef support implemented

Example:

typedef void (*SDL_HitTest)(SDL_Window *window, const SDL_Point *pt, void *data);

Generated:

pub const HitTest = *const fn (?*Window, *const Point, ?*anyopaque) callconv(.C) void;

Support: Full function pointer parsing with parameters, return types, and proper Zig calling convention

3. SDL_UINT64_C Macro in Bit Positions

Issue: Some 64-bit flag patterns may not parse correctly

Example:

#define SDL_WINDOW_FULLSCREEN SDL_UINT64_C(0x0000000000000001)

Status: Enhanced support added, but not fully tested

Workaround: Manual flag definitions if needed

Priority: Medium
Effort: ~30 minutes validation
Affected: SDL_video.h WindowFlags

4. External Library Types

Issue: Types from external libraries (EGL, OpenGL) not found

Example:

SDL_EGLConfig
SDL_EGLDisplay
SDL_GLContext

Status: Expected behavior (not SDL types)

Workaround: Use C imports or manual definitions

Priority: N/A (expected)

5. Memory Leaks in Comment Handling

Issue: Small memory leaks in struct comment parsing

Status: FIXED - Proper memory cleanup implemented

Impact: None - all allocations properly freed

6. Array Field Declarations

Issue: Array fields in multi-field syntax not supported

Example:

int array1[10], array2[20];  // Not handled

Workaround: Rare in SDL, can be manually defined

Priority: Low
Effort: ~1 hour

7. Bit Field Declarations

Issue: Bit fields not supported

Example:

struct {
    unsigned a : 4;
    unsigned b : 4;
};

Status: Not used in SDL public API

Priority: Very Low

Workaround Strategies

Strategy 1: Manual Type Definitions

Create a supplementary file with missing types:

// manual_types.zig
pub const HitTest = *const fn(?*Window, *const Point, ?*anyopaque) callconv(.C) void;
pub const Scancode = c_int;  // Simplified if full enum not needed

Strategy 2: Direct C Import

For problematic types, use C directly:

const c = @cImport(@cInclude("SDL3/SDL.h"));
pub const Scancode = c.SDL_Scancode;

Strategy 3: Selective Generation

Only generate for headers that work:

# These work well:
zig build run -- SDL_gpu.h --output=gpu.zig
zig build run -- SDL_properties.h --output=properties.zig

# These need work:
# SDL_keyboard.h, SDL_events.h (use C import for now)

Testing Results

Successfully Generated (45+ headers)

All major SDL3 APIs successfully parse and generate working Zig bindings:

Core: audio, camera, clipboard, dialog, events, filesystem, gamepad, gpu, haptic, hints, init, joystick, keyboard, log, mouse, pen, power, properties, rect, render, sensor, storage, surface, time, timer, touch, video

Platform: iostream, loadso, locale, messagebox, misc, process, stdinc, system, vulkan

Specialized: blendmode, error, guid, metal, pixels, scancode

Coverage: ~95% of SDL3 public API

Error Messages Explained

"Could not find definition for type: X"

Meaning: Type referenced but not found in any included header

Possible Causes:

  1. Type is a function pointer (not supported)
  2. Type is external (EGL, GL) (expected)
  3. Type is in a header not included
  4. Type uses unsupported pattern

Action: Check if type is needed, add manually if so

"Syntax errors detected in generated code"

Meaning: Generated Zig code doesn't parse

Possible Causes:

  1. Large enum parsing issue
  2. Field name shadows keyword
  3. Unsupported C pattern

Action: Check line numbers in error, see if manual fix needed

"InvalidBitPosition"

Meaning: Flag value pattern not recognized

Possible Causes:

  1. Uses SDL_UINT64_C macro (partially supported)
  2. Complex bit expression
  3. Non-standard format

Action: May need to manually define flags

Memory Leak Warnings

Meaning: Small allocations not freed

Impact: Minimal (1-2KB per run)

Status: Known issue in comment handling, functional

Action: None required (will be fixed in future)

Supported vs Unsupported

Fully Supported

  • Opaque types
  • Simple structs
  • Multi-field structs (int x, y;)
  • Enums (up to ~100 values)
  • Flags (with standard patterns)
  • Typedefs (simple type aliases)
  • Functions (extern declarations)
  • Dependency resolution
  • Type conversion
  • Method grouping

⚠️ Partially Supported

  • Large enums (300+ values) - needs work
  • SDL_UINT64_C flags - enhanced but not fully tested
  • Some bit position patterns

Not Supported

  • Function pointer typedefs
  • #define-based type definitions (without typedef)
  • Union types
  • Bit field structs
  • Complex macro expressions
  • Non-SDL types

Reporting Issues

When encountering a new issue:

  1. Check this document - May already be known
  2. Test with simple case - Isolate the problem
  3. Check generated output - Look at line numbers in errors
  4. Document the pattern - Save example for future reference

Future Improvements

Possible Enhancements

  1. Union support - Rarely used in SDL (low priority)
  2. Bit field support - Not in SDL public API (very low priority)
  3. Array field improvements - Handle complex array patterns (low priority)
  4. Better error messages - More detailed diagnostics (medium priority)

Comparison with Manual Approach

Manual Binding Creation

Time: ~30 minutes per header Error Rate: High (missing fields, wrong types) Maintenance: Manual updates needed Consistency: Varies by developer

Parser Approach

Time: ~0.5 seconds Error Rate: Low (for supported patterns) Maintenance: Automatic with SDL updates Consistency: Perfect (deterministic)

Conclusion: Parser is vastly superior for supported patterns, with clear workarounds for unsupported cases.


Status: Production ready - 45+ SDL3 headers successfully generated
Recommendation: Use generated bindings for all supported headers
Next: See Development for extending the parser