#include "proto.h" #ifdef _WIN64 typedef int64_t protoLegacySizeT; #else typedef int protoLegacySizeT; #endif typedef protoLegacySizeT (PROTOAPI *protoProcessCallbackLegacy)(protoContext context, protoPtr arrayOut, protoLegacySizeT arrayOutSize, protoPtr arrayIn, protoLegacySizeT arrayInSize, protoPtr localdata); /************************************************************************** Internal callback structure (DO NOT ACCESS THIS STRUCTURE) **************************************************************************/ typedef struct protoInfo_s { int version; void *(PROTOAPI *allocLegacy)(protoContext context, protoLegacySizeT size); void (PROTOAPI *dealloc)(protoContext context, void * ptr); void (PROTOAPI *setDefaultLevel)(protoContext context, int level); void (PROTOAPI *parse)(protoContext context, protoPtr result, const char * names, int flags); int (PROTOAPI *cancel)(protoContext context); protoLegacySizeT (PROTOAPI *readTraceLegacy)(protoContext context, protoLegacySizeT index, protoTime * timestamp, int * data); void (PROTOAPI *puts)(protoContext context, const char *text); void (PROTOAPI *printf)(protoContext context, const char *format, va_list ap) ATTRIBUTE_PRINTF(2, 0); void (PROTOAPI *control)(protoContext context, int controlcode); void (PROTOAPI *registerProcessCallbackLegacy)(protoContext context, protoProcessCallbackLegacy callback, protoPtr localdata, protoLegacySizeT size, int flags); void (PROTOAPI *registerDisplayCallback)(protoContext context, protoDisplayCallback callback, protoPtr localdata, int flags); void (PROTOAPI *registerChartCallback)(protoContext context, protoChartCallback callback, protoPtr localdata, int flags); void (PROTOAPI *registerDrawCallback)(protoContext context, protoDrawCallback callback, protoPtr localdata, int flags, int channels, int low, int high); void (PROTOAPI *registerFindCallback)(protoContext context, protoFindCallback callback, protoPtr localdata, int flags); void (PROTOAPI *registerExportCallback)(protoContext context, protoExportCallback callback, protoPtr localdata, int flags); /* fields below this line exist if version >= 2 */ void (PROTOAPI *registerShareCallback)(protoContext context, protoShareCallback callback, protoPtr localdata, int flags); void (PROTOAPI *registerProfileChartCallback)(protoContext context, protoProfileChartCallback callback, protoPtr localdata, int flags); protoLegacySizeT (PROTOAPI *findTraceLegacy)(protoContext context, protoLegacySizeT index, int signal, protoTime * timestamp, int * data); int apiversion; /* fields below this line exist if version >= 3 */ int (PROTOAPI *init)(protoContext context); void *(PROTOAPI *alloc)(protoContext context, protoSizeT size); protoSizeT (PROTOAPI *readTrace)(protoContext context, protoSizeT index, protoTime * timestamp, int * data); void (PROTOAPI *registerProcessCallback)(protoContext context, protoProcessCallback callback, protoPtr localdata, protoSizeT size, int flags); protoSizeT (PROTOAPI *findTrace)(protoContext context, protoSizeT index, int signal, protoTime * timestamp, int * data); } protoInfo; #ifndef PROTO_DONT_DEFINE_INTERFACE /************************************************************************** Entry point **************************************************************************/ int PROTOAPI PROTO_Interface(protoContext context, int command) { int result; if (context->version >= 2) { context->apiversion = PROTO_VERSION; } if (context->version >= 3) { result = context->init(context); if (result < 0) { return result; } } return PROTO_Init(context, command); } /************************************************************************** Generic functions **************************************************************************/ int PROTOAPI PROTO_RequestVersion(protoContext context, int version) { if (context->version < 2) return PROTO_FAIL; if (context->version < version) return PROTO_FAIL; return PROTO_OK; } void * PROTOAPI PROTO_Alloc(protoContext context, protoSizeT size) { if (context->version >= 3) { return context->alloc(context, size); } else { return context->allocLegacy(context, (protoLegacySizeT)size); } } void PROTOAPI PROTO_Free(protoContext context, void * ptr) { context->dealloc(context, ptr); } void PROTOAPI PROTO_SetDefaultLevel(protoContext context, int level) { context->setDefaultLevel(context, level); } void PROTOAPI PROTO_Parse(protoContext context, protoPtr result, const char * names, int flags) { context->parse(context, result, names, flags); } struct protoProcessCallbackTrampoline { protoProcessCallback callback; protoPtr localdata; }; static protoLegacySizeT PROTOAPI PROTO_ProcessCallbackTrampoline(protoContext context, protoPtr arrayOut, protoLegacySizeT arrayOutSize, protoPtr arrayIn, protoLegacySizeT arrayInSize, protoPtr localdata) { struct protoProcessCallbackTrampoline *trampoline; trampoline = (struct protoProcessCallbackTrampoline *)localdata; return (protoLegacySizeT)trampoline->callback(context, arrayOut, arrayOutSize, arrayIn, arrayInSize, trampoline->localdata); } void PROTOAPI PROTO_RegisterProcessCallback(protoContext context, protoProcessCallback callback, protoPtr localdata, protoSizeT size, int flags) { struct protoProcessCallbackTrampoline *trampoline; if (context->version >= 3) { context->registerProcessCallback(context, callback, localdata, size, flags); } else { trampoline = (struct protoProcessCallbackTrampoline *)context->allocLegacy(context, sizeof(struct protoProcessCallbackTrampoline)); if (trampoline != NULL) { trampoline->callback = callback; trampoline->localdata = localdata; context->registerProcessCallbackLegacy(context, PROTO_ProcessCallbackTrampoline, trampoline, (protoLegacySizeT)size, flags); } } } void PROTOAPI PROTO_RegisterDisplayCallback(protoContext context, protoDisplayCallback callback, protoPtr localdata, int flags) { context->registerDisplayCallback(context, callback, localdata, flags); } void PROTOAPI PROTO_RegisterChartCallback(protoContext context, protoChartCallback callback, protoPtr localdata, int flags) { context->registerChartCallback(context, callback, localdata, flags); } void PROTOAPI PROTO_RegisterProfileChartCallback(protoContext context, protoProfileChartCallback callback, protoPtr localdata, int flags) { if (context->version >= 2) { context->registerProfileChartCallback(context, callback, localdata, flags); } } void PROTOAPI PROTO_RegisterDrawCallback(protoContext context, protoDrawCallback callback, protoPtr localdata, int flags, int channels, int low, int high) { context->registerDrawCallback(context, callback, localdata, flags, channels, low, high); } void PROTOAPI PROTO_RegisterFindCallback(protoContext context, protoFindCallback callback, protoPtr localdata, int flags) { context->registerFindCallback(context, callback, localdata, flags); } void PROTOAPI PROTO_RegisterExportCallback(protoContext context, protoExportCallback callback, protoPtr localdata, int flags) { context->registerExportCallback(context, callback, localdata, flags); } void PROTOAPI PROTO_RegisterShareCallback(protoContext context, protoShareCallback callback, protoPtr localdata, int flags) { if (context->version >= 2) { context->registerShareCallback (context, callback, localdata, flags); } } int PROTOAPI PROTO_Cancel(protoContext context) { return context->cancel(context); } protoSizeT PROTOAPI PROTO_ReadTrace(protoContext context, protoSizeT index, protoTime * timestamp, int * data) { if (context->version >= 3) { return context->readTrace(context, index, timestamp, data); } else { return context->readTraceLegacy(context, (protoLegacySizeT)index, timestamp, data); } } protoSizeT PROTOAPI PROTO_FindTrace(protoContext context, protoSizeT index, int signal, protoTime * timestamp, int * data) { if (context->version >= 3) { return context->findTrace(context, index, signal, timestamp, data); } else { return context->findTraceLegacy(context, (protoLegacySizeT)index, signal, timestamp, data); } } void PROTOAPI PROTO_Puts(protoContext context, const char *text) { context->puts(context, text); } void PROTOAPI PROTO_Printf(protoContext context, const char *format, ...) { va_list ap; va_start(ap, format); context->printf(context, format, ap); va_end(ap); } void PROTOAPI PROTO_Control(protoContext context, int controlcode) { context->control(context, controlcode); } #endif // PROTO_DONT_DEFINE_INTERFACE