function pointers and callbacks
This commit is contained in:
@@ -4,12 +4,22 @@ pass_alias :: func(value native.imported_int_alias) native.imported_int {
|
||||
return value
|
||||
}
|
||||
|
||||
double_value :: c_func(value c_int) c_int {
|
||||
return value + value
|
||||
}
|
||||
|
||||
call_mapper :: func(mapper native.Imported_Mapper) c_int {
|
||||
return mapper?(21)
|
||||
}
|
||||
|
||||
main :: func() void {
|
||||
_ = native.imported_add(pass_alias(20), 22)
|
||||
_ = native.imported_scalar(3, 4)
|
||||
_ = native.child_value(7)
|
||||
_ = native.imported_read(native.imported_handle()?)
|
||||
_ = native.imported_string("hello")
|
||||
_ = native.imported_apply(double_value, 21)
|
||||
_ = call_mapper(double_value)
|
||||
_ = native.configured_value(9)
|
||||
signed i8 :: -2
|
||||
unsigned u16 :: 3
|
||||
|
||||
@@ -7,12 +7,35 @@ typedef int imported_int;
|
||||
typedef imported_int imported_int_alias;
|
||||
typedef struct Imported_Handle Imported_Handle;
|
||||
typedef void (*Imported_Callback)(int value);
|
||||
typedef int (*Imported_Mapper)(int value);
|
||||
typedef struct Imported_Value {
|
||||
int value;
|
||||
} Imported_Value;
|
||||
typedef union Imported_Union {
|
||||
int value;
|
||||
} Imported_Union;
|
||||
typedef struct Imported_Bitfield {
|
||||
unsigned value : 1;
|
||||
} Imported_Bitfield;
|
||||
typedef struct __attribute__((packed)) Imported_Packed {
|
||||
char first;
|
||||
int second;
|
||||
} Imported_Packed;
|
||||
typedef struct Imported_Flexible {
|
||||
int count;
|
||||
int values[];
|
||||
} Imported_Flexible;
|
||||
typedef struct Imported_Qualified {
|
||||
const int value;
|
||||
} Imported_Qualified;
|
||||
typedef struct Imported_Overaligned {
|
||||
_Alignas(16) int value;
|
||||
} Imported_Overaligned;
|
||||
typedef struct Imported_Anonymous {
|
||||
struct {
|
||||
int value;
|
||||
};
|
||||
} Imported_Anonymous;
|
||||
typedef enum Imported_Enum {
|
||||
IMPORTED_ENUM_VALUE,
|
||||
} Imported_Enum;
|
||||
@@ -22,6 +45,7 @@ unsigned long imported_scalar(unsigned char value, unsigned long extra);
|
||||
Imported_Handle *imported_handle(void);
|
||||
int imported_read(const Imported_Handle *handle);
|
||||
int imported_string(const char *value);
|
||||
int imported_apply(Imported_Mapper mapper, int value);
|
||||
Imported_Value imported_by_value(Imported_Value value);
|
||||
int imported_volatile(volatile int *value);
|
||||
_Bool imported_bool(_Bool value);
|
||||
@@ -37,5 +61,11 @@ int configured_value(int value);
|
||||
|
||||
#define IMPORTED_MACRO 42
|
||||
int imported_variadic(int marker, ...);
|
||||
Imported_Bitfield imported_bitfield(Imported_Bitfield value);
|
||||
Imported_Packed imported_packed(Imported_Packed value);
|
||||
Imported_Flexible imported_flexible(Imported_Flexible value);
|
||||
Imported_Qualified imported_qualified(Imported_Qualified value);
|
||||
Imported_Overaligned imported_overaligned(Imported_Overaligned value);
|
||||
Imported_Anonymous imported_anonymous(Imported_Anonymous value);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -36,6 +36,17 @@ int imported_string(const char *value) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int imported_apply(Imported_Mapper mapper, int value) {
|
||||
if (mapper == NULL) {
|
||||
abort();
|
||||
}
|
||||
int result = mapper(value);
|
||||
if (result != value * 2) {
|
||||
abort();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
int imported_variadic(int marker, ...) {
|
||||
va_list args;
|
||||
va_start(args, marker);
|
||||
|
||||
Reference in New Issue
Block a user