sdlparser-scrap/docs/QUICKSTART.md

204 lines
5.3 KiB
Markdown

# SDL3 Parser - Quick Start Guide
## What It Does
Automatically generates Zig bindings from SDL3 C headers with automatic dependency resolution.
## Installation & Build
```bash
cd parser/
zig build # Build parser executable
zig build test # Run all tests
```
## Basic Usage
### Parse a Header
```bash
# Output to stdout
zig build run -- ../SDL/include/SDL3/SDL_gpu.h
# Output to file
zig build run -- ../SDL/include/SDL3/SDL_gpu.h --output=gpu.zig
# Generate with C mocks
zig build run -- ../SDL/include/SDL3/SDL_gpu.h --output=gpu.zig --mocks=gpu_mock.c
```
### What It Generates
**Input** (`SDL_gpu.h` excerpt):
```c
typedef struct SDL_GPUDevice SDL_GPUDevice;
extern SDL_DECLSPEC void SDLCALL SDL_DestroyGPUDevice(SDL_GPUDevice *device);
```
**Output** (`gpu.zig`):
```zig
pub const GPUDevice = opaque {
pub inline fn destroyGPUDevice(gpudevice: *GPUDevice) void {
return c.SDL_DestroyGPUDevice(gpudevice);
}
};
```
## Features
### ✅ Supported C Patterns
- **Opaque types**: `typedef struct SDL_Type SDL_Type;`
- **Enums**: `typedef enum { VALUE1, VALUE2 } SDL_Type;`
- **Structs**: `typedef struct { int field; } SDL_Type;`
- **Flags**: Packed bitfield enums
- **Functions**: `extern SDL_DECLSPEC RetType SDLCALL SDL_Func(...);`
### ✅ Automatic Dependency Resolution
- Detects types referenced but not defined
- Searches included headers for definitions
- Automatically includes needed types in output
- Handles: `SDL_FColor`, `SDL_Rect`, `SDL_Window`, `SDL_FlipMode`, etc.
### ✅ Type Conversion
| C Type | Zig Type |
|--------|----------|
| `bool` | `bool` |
| `Uint32` | `u32` |
| `SDL_Type*` | `?*Type` (nullable) |
| `const SDL_Type*` | `*const Type` |
| `void*` | `?*anyopaque` |
| `const char*` | `[*c]const u8` |
### ✅ Naming Conventions
- Strip `SDL_` prefix: `SDL_GPUDevice``GPUDevice`
- Remove first underscore: `SDL_GPU_Type``GPUType`
- camelCase functions: `SDL_CreateDevice``createDevice`
## Current Limitations
### ⚠️ Not Yet Supported
1. **Multi-field structs**: `int x, y;` (parsed as single field)
- **Workaround**: Manually expand or wait for next version
2. **Simple typedefs**: `typedef Uint32 SDL_Type;`
- **Workaround**: Add manually to output
3. **#define constants**: `#define VALUE (1u << 0)`
- **Workaround**: Use clang preprocessor or manual definitions
## Project Structure
```
parser/
├── src/
│ ├── parser.zig # Main entry point
│ ├── patterns.zig # Pattern matching & scanning
│ ├── types.zig # C to Zig type conversion
│ ├── naming.zig # Naming conventions
│ ├── codegen.zig # Zig code generation
│ ├── mock_codegen.zig # C mock generation
│ └── dependency_resolver.zig # Dependency analysis [NEW]
├── test/ # Test files
├── docs/ # Documentation
├── build.zig # Build configuration
└── README.md # Full documentation
```
## Documentation
- `PARSER_OVERVIEW.md` - How the parser works
- `DEPENDENCY_PLAN.md` - Original dependency design
- `DEPENDENCY_IMPLEMENTATION_STATUS.md` - Current status
- `IMPLEMENTATION_SUMMARY.md` - Session summary
- `AGENTS.md` - Zig 0.15 guidelines for AI agents
- `TODO.md` - Next steps
## Testing
```bash
# Run all tests
zig build test
# Test with specific header
zig build run -- ../SDL/include/SDL3/SDL_gpu.h --output=test_output.zig
# Verify output compiles (requires c.zig)
zig ast-check test_output.zig
```
## Example Workflow
1. **Parse header with dependencies**:
```bash
zig build run -- ../SDL/include/SDL3/SDL_gpu.h --output=gpu.zig
```
2. **Check the output**:
```bash
cat gpu.zig | head -50
```
3. **Create c.zig wrapper**:
```zig
pub const c = @cImport({
@cInclude("SDL3/SDL.h");
});
```
4. **Use in your project**:
```zig
const gpu = @import("gpu.zig");
pub fn main() !void {
const device = gpu.createGPUDevice(true);
defer device.?.destroyGPUDevice();
}
```
## Common Issues
### "FileNotFound" error
- Check header path is correct relative to working directory
- Use absolute path: `/full/path/to/SDL/include/SDL3/SDL_gpu.h`
### "Syntax errors detected"
- Usually multi-field struct issue (known limitation)
- Check output file for specific line numbers
- Manually fix or wait for parser update
### "Warning: Could not find definition for type"
- Type might be typedef (not yet supported)
- Type might be in different include (check manually)
- Type might be #define-based (use manual definition)
## Performance
- Small headers (<100 decls): ~100ms
- Large headers (SDL_gpu.h, 169 decls): ~500ms with dependencies
- Memory usage: ~2-5MB peak
- Output size: ~1KB per declaration
## Getting Help
1. Check `DEPENDENCY_IMPLEMENTATION_STATUS.md` for known issues
2. Look at `TODO.md` for planned improvements
3. Read `AGENTS.md` if you're an AI agent working on this
4. Check test files in `test/` for usage examples
## Version Info
- **Parser Version**: 2.0 (with dependency resolution)
- **Zig Version**: 0.15.2
- **SDL Version**: 3.2.0
- **Status**: Operational with known limitations
---
**Last Updated**: 2026-01-22
**Next Milestone**: Fix multi-field struct parsing