Skip to content

Commit

Permalink
fix passing of function pointer parameters
Browse files Browse the repository at this point in the history
this should fix issue ryupold#26
  • Loading branch information
ryupold committed Aug 14, 2023
1 parent f7fd52e commit c2dd447
Show file tree
Hide file tree
Showing 5 changed files with 58 additions and 52 deletions.
14 changes: 10 additions & 4 deletions generate.zig
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,9 @@ fn writeFunctions(
}

for (func.params) |param| {
if (bindings.containsStruct(stripType(param.typ)) and isPointer(param.typ)) {
if (isFunctionPointer(param.typ)) {
try file.writeAll(try allocPrint(allocator, "@ptrCast({s}),\n", .{param.name}));
} else if (bindings.containsStruct(stripType(param.typ)) and isPointer(param.typ)) {
try file.writeAll(try allocPrint(allocator, "@intToPtr([*c]raylib.{s}, @ptrToInt({s})),\n", .{ stripType(param.typ), param.name }));
} else if (bindings.containsEnum(param.typ)) {
try file.writeAll(try allocPrint(allocator, "@enumToInt({s}),\n", .{param.name}));
Expand Down Expand Up @@ -255,7 +257,7 @@ fn writeCSignature(
if (func.params) |params| {
for (params, 0..) |param, i| {
const paramType = param.type;
if (mapping.isPrimitiveOrPointer(paramType)) {
if (mapping.isPrimitiveOrPointer(paramType) or isFunctionPointer(paramType)) {
try file.writeAll(try allocPrint(allocator, "{s} {s}", .{ paramType, param.name }));
} else {
try file.writeAll(try allocPrint(allocator, "{s} *{s}", .{ paramType, param.name }));
Expand Down Expand Up @@ -316,7 +318,7 @@ fn writeCFunctions(

if (func.params) |params| {
for (params, 0..) |param, i| {
if (mapping.isPrimitiveOrPointer(param.type)) {
if (mapping.isPrimitiveOrPointer(param.type) or isFunctionPointer(param.type)) {
try c.writeAll(
try allocPrint(
allocator,
Expand Down Expand Up @@ -468,11 +470,15 @@ fn endsWith(haystack: []const u8, needle: []const u8) bool {
return std.mem.endsWith(u8, haystack, needle);
}

/// is c pointer type
/// is pointer type
fn isPointer(z: []const u8) bool {
return pointerOffset(z) > 0;
}

fn isFunctionPointer(z: []const u8) bool {
return std.mem.indexOf(u8, z, "fn(") != null or std.mem.endsWith(u8, z, "Callback");
}

fn pointerOffset(z: []const u8) usize {
if (startsWith(z, "*")) return 1;
if (startsWith(z, "?*")) return 2;
Expand Down
12 changes: 6 additions & 6 deletions inject.zig
Original file line number Diff line number Diff line change
Expand Up @@ -650,22 +650,22 @@ pub const MATERIAL_MAP_SPECULAR = @as(usize, @intCast(@intFromEnum(MaterialMapIn
//--- callbacks -----------------------------------------------------------------------------------

/// Logging: Redirect trace log messages
pub const TraceLogCallback = fn (logLevel: c_int, text: [*c]const u8, args: ?*anyopaque) callconv(.C) void;
pub const TraceLogCallback = *const fn (logLevel: c_int, text: [*c]const u8, args: ?*anyopaque) void;

/// FileIO: Load binary data
pub const LoadFileDataCallback = fn (fileName: [*c]const u8, bytesRead: [*c]c_uint) callconv(.C) [*c]u8;
pub const LoadFileDataCallback = *const fn (fileName: [*c]const u8, bytesRead: [*c]c_uint) [*c]u8;

/// FileIO: Save binary data
pub const SaveFileDataCallback = fn (fileName: [*c]const u8, data: ?*anyopaque, bytesToWrite: c_uint) callconv(.C) bool;
pub const SaveFileDataCallback = *const fn (fileName: [*c]const u8, data: ?*anyopaque, bytesToWrite: c_uint) bool;

/// FileIO: Load text data
pub const LoadFileTextCallback = fn (fileName: [*c]const u8) callconv(.C) [*c]u8;
pub const LoadFileTextCallback = *const fn (fileName: [*c]const u8) [*c]u8;

/// FileIO: Save text data
pub const SaveFileTextCallback = fn (fileName: [*c]const u8, text: [*c]const u8) callconv(.C) bool;
pub const SaveFileTextCallback = *const fn (fileName: [*c]const u8, text: [*c]const u8) bool;

/// Audio Loading and Playing Functions (Module: audio)
pub const AudioCallback = fn (bufferData: ?*anyopaque, frames: u32) callconv(.C) void;
pub const AudioCallback = *const fn (bufferData: ?*anyopaque, frames: u32) void;

//--- utils ---------------------------------------------------------------------------------------

Expand Down
36 changes: 18 additions & 18 deletions marshal.c
Original file line number Diff line number Diff line change
Expand Up @@ -503,24 +503,24 @@ void mOpenURL(const char * url)
OpenURL(url);
}

void mSetLoadFileDataCallback(LoadFileDataCallback *callback)
void mSetLoadFileDataCallback(LoadFileDataCallback callback)
{
SetLoadFileDataCallback(*callback);
SetLoadFileDataCallback(callback);
}

void mSetSaveFileDataCallback(SaveFileDataCallback *callback)
void mSetSaveFileDataCallback(SaveFileDataCallback callback)
{
SetSaveFileDataCallback(*callback);
SetSaveFileDataCallback(callback);
}

void mSetLoadFileTextCallback(LoadFileTextCallback *callback)
void mSetLoadFileTextCallback(LoadFileTextCallback callback)
{
SetLoadFileTextCallback(*callback);
SetLoadFileTextCallback(callback);
}

void mSetSaveFileTextCallback(SaveFileTextCallback *callback)
void mSetSaveFileTextCallback(SaveFileTextCallback callback)
{
SetSaveFileTextCallback(*callback);
SetSaveFileTextCallback(callback);
}

bool mSaveFileData(const char * fileName, void * data, unsigned int bytesToWrite)
Expand Down Expand Up @@ -2513,29 +2513,29 @@ void mSetAudioStreamBufferSizeDefault(int size)
SetAudioStreamBufferSizeDefault(size);
}

void mSetAudioStreamCallback(AudioStream *stream, AudioCallback *callback)
void mSetAudioStreamCallback(AudioStream *stream, AudioCallback callback)
{
SetAudioStreamCallback(*stream, *callback);
SetAudioStreamCallback(*stream, callback);
}

void mAttachAudioStreamProcessor(AudioStream *stream, AudioCallback *processor)
void mAttachAudioStreamProcessor(AudioStream *stream, AudioCallback processor)
{
AttachAudioStreamProcessor(*stream, *processor);
AttachAudioStreamProcessor(*stream, processor);
}

void mDetachAudioStreamProcessor(AudioStream *stream, AudioCallback *processor)
void mDetachAudioStreamProcessor(AudioStream *stream, AudioCallback processor)
{
DetachAudioStreamProcessor(*stream, *processor);
DetachAudioStreamProcessor(*stream, processor);
}

void mAttachAudioMixedProcessor(AudioCallback *processor)
void mAttachAudioMixedProcessor(AudioCallback processor)
{
AttachAudioMixedProcessor(*processor);
AttachAudioMixedProcessor(processor);
}

void mDetachAudioMixedProcessor(AudioCallback *processor)
void mDetachAudioMixedProcessor(AudioCallback processor)
{
DetachAudioMixedProcessor(*processor);
DetachAudioMixedProcessor(processor);
}

void mrlMatrixMode(int mode)
Expand Down
18 changes: 9 additions & 9 deletions marshal.h
Original file line number Diff line number Diff line change
Expand Up @@ -310,16 +310,16 @@ void mSetTraceLogLevel(int logLevel);
void mOpenURL(const char * url);

// Set custom file binary data loader
void mSetLoadFileDataCallback(LoadFileDataCallback *callback);
void mSetLoadFileDataCallback(LoadFileDataCallback callback);

// Set custom file binary data saver
void mSetSaveFileDataCallback(SaveFileDataCallback *callback);
void mSetSaveFileDataCallback(SaveFileDataCallback callback);

// Set custom file text data loader
void mSetLoadFileTextCallback(LoadFileTextCallback *callback);
void mSetLoadFileTextCallback(LoadFileTextCallback callback);

// Set custom file text data saver
void mSetSaveFileTextCallback(SaveFileTextCallback *callback);
void mSetSaveFileTextCallback(SaveFileTextCallback callback);

// Save data to file from byte array (write), returns true on success
bool mSaveFileData(const char * fileName, void * data, unsigned int bytesToWrite);
Expand Down Expand Up @@ -1516,19 +1516,19 @@ void mSetAudioStreamPan(AudioStream *stream, float pan);
void mSetAudioStreamBufferSizeDefault(int size);

// Audio thread callback to request new data
void mSetAudioStreamCallback(AudioStream *stream, AudioCallback *callback);
void mSetAudioStreamCallback(AudioStream *stream, AudioCallback callback);

// Attach audio stream processor to stream, receives the samples as <float>s
void mAttachAudioStreamProcessor(AudioStream *stream, AudioCallback *processor);
void mAttachAudioStreamProcessor(AudioStream *stream, AudioCallback processor);

// Detach audio stream processor from stream
void mDetachAudioStreamProcessor(AudioStream *stream, AudioCallback *processor);
void mDetachAudioStreamProcessor(AudioStream *stream, AudioCallback processor);

// Attach audio stream processor to the entire audio pipeline, receives the samples as <float>s
void mAttachAudioMixedProcessor(AudioCallback *processor);
void mAttachAudioMixedProcessor(AudioCallback processor);

// Detach audio stream processor from the entire audio pipeline
void mDetachAudioMixedProcessor(AudioCallback *processor);
void mDetachAudioMixedProcessor(AudioCallback processor);

// Choose the current matrix to be transformed
void mrlMatrixMode(int mode);
Expand Down
30 changes: 15 additions & 15 deletions raylib.zig
Original file line number Diff line number Diff line change
Expand Up @@ -650,22 +650,22 @@ pub const MATERIAL_MAP_SPECULAR = @as(usize, @intCast(@intFromEnum(MaterialMapIn
//--- callbacks -----------------------------------------------------------------------------------

/// Logging: Redirect trace log messages
pub const TraceLogCallback = fn (logLevel: c_int, text: [*c]const u8, args: ?*anyopaque) callconv(.C) void;
pub const TraceLogCallback = *const fn (logLevel: c_int, text: [*c]const u8, args: ?*anyopaque) void;

/// FileIO: Load binary data
pub const LoadFileDataCallback = fn (fileName: [*c]const u8, bytesRead: [*c]c_uint) callconv(.C) [*c]u8;
pub const LoadFileDataCallback = *const fn (fileName: [*c]const u8, bytesRead: [*c]c_uint) [*c]u8;

/// FileIO: Save binary data
pub const SaveFileDataCallback = fn (fileName: [*c]const u8, data: ?*anyopaque, bytesToWrite: c_uint) callconv(.C) bool;
pub const SaveFileDataCallback = *const fn (fileName: [*c]const u8, data: ?*anyopaque, bytesToWrite: c_uint) bool;

/// FileIO: Load text data
pub const LoadFileTextCallback = fn (fileName: [*c]const u8) callconv(.C) [*c]u8;
pub const LoadFileTextCallback = *const fn (fileName: [*c]const u8) [*c]u8;

/// FileIO: Save text data
pub const SaveFileTextCallback = fn (fileName: [*c]const u8, text: [*c]const u8) callconv(.C) bool;
pub const SaveFileTextCallback = *const fn (fileName: [*c]const u8, text: [*c]const u8) bool;

/// Audio Loading and Playing Functions (Module: audio)
pub const AudioCallback = fn (bufferData: ?*anyopaque, frames: u32) callconv(.C) void;
pub const AudioCallback = *const fn (bufferData: ?*anyopaque, frames: u32) void;

//--- utils ---------------------------------------------------------------------------------------

Expand Down Expand Up @@ -1831,7 +1831,7 @@ pub fn SetLoadFileDataCallback(
callback: LoadFileDataCallback,
) void {
raylib.mSetLoadFileDataCallback(
callback,
@ptrCast(callback),
);
}

Expand All @@ -1840,7 +1840,7 @@ pub fn SetSaveFileDataCallback(
callback: SaveFileDataCallback,
) void {
raylib.mSetSaveFileDataCallback(
callback,
@ptrCast(callback),
);
}

Expand All @@ -1849,7 +1849,7 @@ pub fn SetLoadFileTextCallback(
callback: LoadFileTextCallback,
) void {
raylib.mSetLoadFileTextCallback(
callback,
@ptrCast(callback),
);
}

Expand All @@ -1858,7 +1858,7 @@ pub fn SetSaveFileTextCallback(
callback: SaveFileTextCallback,
) void {
raylib.mSetSaveFileTextCallback(
callback,
@ptrCast(callback),
);
}

Expand Down Expand Up @@ -6934,7 +6934,7 @@ pub fn SetAudioStreamCallback(
) void {
raylib.mSetAudioStreamCallback(
@as([*c]raylib.AudioStream, @ptrFromInt(@intFromPtr(&stream))),
callback,
@ptrCast(callback),
);
}

Expand All @@ -6945,7 +6945,7 @@ pub fn AttachAudioStreamProcessor(
) void {
raylib.mAttachAudioStreamProcessor(
@as([*c]raylib.AudioStream, @ptrFromInt(@intFromPtr(&stream))),
processor,
@ptrCast(processor),
);
}

Expand All @@ -6956,7 +6956,7 @@ pub fn DetachAudioStreamProcessor(
) void {
raylib.mDetachAudioStreamProcessor(
@as([*c]raylib.AudioStream, @ptrFromInt(@intFromPtr(&stream))),
processor,
@ptrCast(processor),
);
}

Expand All @@ -6965,7 +6965,7 @@ pub fn AttachAudioMixedProcessor(
processor: AudioCallback,
) void {
raylib.mAttachAudioMixedProcessor(
processor,
@ptrCast(processor),
);
}

Expand All @@ -6974,7 +6974,7 @@ pub fn DetachAudioMixedProcessor(
processor: AudioCallback,
) void {
raylib.mDetachAudioMixedProcessor(
processor,
@ptrCast(processor),
);
}

Expand Down

0 comments on commit c2dd447

Please sign in to comment.