7.7 KiB
Known Issues and Limitations
This document lists current limitations of the SDL3 header parser.
Production Ready ✅
SDL_gpu.h
- Status: 100% working
- Dependencies: All resolved automatically
- Output: Production-ready Zig bindings
- Issue: 1 minor (field name
typeshadows keyword)
Known Limitations
1. Field Names That Shadow Zig Keywords
Issue: Fields named type, error, if, etc. cause compilation errors
Example:
typedef struct {
int type; // Shadows Zig keyword
} SDL_Something;
Error:
error: name shadows primitive 'type'
Workaround: Manual edit
// Change:
type: GPUTextureType,
// To:
@"type": GPUTextureType,
Priority: Low
Effort: ~30 minutes to auto-escape
Frequency: Rare (a few SDL structs)
2. Large Enum Parsing
Issue: Enums with 300+ values generate syntax errors
Affected:
- SDL_Scancode (300+ keyboard scancodes)
- SDL_Keycode (300+ key codes)
Example:
typedef enum {
SDL_SCANCODE_A = 4,
SDL_SCANCODE_B = 5,
// ... 300 more values
} SDL_Scancode;
Error: 77+ syntax errors in generated enum
Root Cause: Special enum value expressions not fully supported
Workaround: Manual enum definition or use C directly
Priority: High (blocks SDL_keyboard.h)
Effort: ~1-2 hours
Status: Documented in MULTI_HEADER_TEST_RESULTS.md
3. Function Pointer Typedefs
Issue: Function pointer types not parsed
Example:
typedef void (*SDL_HitTest)(SDL_Window *window, const SDL_Point *pt, void *data);
typedef int (*SDL_EventFilter)(void *userdata, SDL_Event *event);
Impact: Callback types not auto-resolved
Workaround: Manual definition
pub const HitTest = *const fn(?*Window, *const Point, ?*anyopaque) callconv(.C) void;
Priority: Medium
Effort: ~2-3 hours
Frequency: Uncommon in SDL public API
4. 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
5. 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)
6. Memory Leaks in Comment Handling
Issue: Small memory leaks (4-8 allocations per run) in struct comment parsing
Impact: ~1-2KB leaked per parse
Status: Functional but should be fixed
Priority: Low
Effort: ~30 minutes
7. 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
8. 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 by Header
✅ Fully Working
| Header | Declarations | Dependencies | Issues |
|---|---|---|---|
| SDL_gpu.h | 169 | 5/5 (100%) | 1 minor (field name) |
⚠️ Partial Support
| Header | Dependencies Resolved | Main Issue |
|---|---|---|
| SDL_keyboard.h | 6/6 (100%) | Large enum syntax errors |
| SDL_video.h | 5/14 (36%) | Bit position parsing |
| SDL_events.h | Unknown | Parse errors |
Error Messages Explained
"Could not find definition for type: X"
Meaning: Type referenced but not found in any included header
Possible Causes:
- Type is a function pointer (not supported)
- Type is external (EGL, GL) (expected)
- Type is in a header not included
- 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:
- Large enum parsing issue
- Field name shadows keyword
- Unsupported C pattern
Action: Check line numbers in error, see if manual fix needed
"InvalidBitPosition"
Meaning: Flag value pattern not recognized
Possible Causes:
- Uses SDL_UINT64_C macro (partially supported)
- Complex bit expression
- 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:
- Check this document - May already be known
- Test with simple case - Isolate the problem
- Check generated output - Look at line numbers in errors
- Document the pattern - Save example for future reference
Future Improvements
High Priority
- Large enum support - Would enable SDL_keyboard.h
- SDL_UINT64_C validation - Complete SDL_video.h support
Medium Priority
- Function pointer typedefs - For callback types
- Field name escaping - Auto-fix keyword shadowing
- Memory leak cleanup - Fix comment handling
Low Priority
- Union support - Rarely used in SDL
- Bit field support - Not in SDL public API
- Array fields - Uncommon pattern
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 for SDL_gpu.h, partial support for other headers.
Recommendation: Use parser for SDL_gpu.h, evaluate others case-by-case.
Next: See Development for how to fix remaining issues.