Lib Struct Function Pointers for C Function

If I have the C struct below, that is used as argument type for a C function I want to import via Crystal’s “Lib”:

nf_init(const char * driverName, NF_EventHandler * pHandler);

How am I supposed to define all the function pointers in the struct in Crystal, found nothing searching. Any kind advice?

typedef struct _NF_EventHandler
{
	 void (NFAPI_CC *threadStart)();
	 void (NFAPI_CC *threadEnd)();
	 void (NFAPI_CC *tcpConnectRequest)(ENDPOINT_ID id, PNF_TCP_CONN_INFO pConnInfo);
	 void (NFAPI_CC *tcpConnected)(ENDPOINT_ID id, PNF_TCP_CONN_INFO pConnInfo);
	 void (NFAPI_CC *tcpClosed)(ENDPOINT_ID id, PNF_TCP_CONN_INFO pConnInfo);
	 void (NFAPI_CC *tcpReceive)(ENDPOINT_ID id, const char * buf, int len);
	 void (NFAPI_CC *tcpSend)(ENDPOINT_ID id, const char * buf, int len);
	 void (NFAPI_CC *tcpCanReceive)(ENDPOINT_ID id);
	 void (NFAPI_CC *tcpCanSend)(ENDPOINT_ID id);
	 void (NFAPI_CC *udpCreated)(ENDPOINT_ID id, PNF_UDP_CONN_INFO pConnInfo);
	 void (NFAPI_CC *udpConnectRequest)(ENDPOINT_ID id, PNF_UDP_CONN_REQUEST pConnReq);
	 void (NFAPI_CC *udpClosed)(ENDPOINT_ID id, PNF_UDP_CONN_INFO pConnInfo);
	 void (NFAPI_CC *udpReceive)(ENDPOINT_ID id, const unsigned char * remoteAddress, const char * buf, int len, PNF_UDP_OPTIONS options);
	 void (NFAPI_CC *udpSend)(ENDPOINT_ID id, const unsigned char * remoteAddress, const char * buf, int len, PNF_UDP_OPTIONS options);
	 void (NFAPI_CC *udpCanReceive)(ENDPOINT_ID id);
	 void (NFAPI_CC *udpCanSend)(ENDPOINT_ID id);
} NF_EventHandler, *PNF_EventHandler;

You can see an example of this at crystal/lib_z.cr at master · crystal-lang/crystal · GitHub

You can define an alias to fn types and use that in structs. See AllocFunc and ZStream

1 Like