#pragma once #define DLL_ARGC_RET 15 // index of the return value for GSCalcArg.types[]...array_dims[] #define DLL_ARGT_EMPTY 0 #define DLL_ARGT_DOUBLE 1 #define DLL_ARGT_TEXT 2 #define DLL_ARGT_ARRAY 4 #define DLL_ARGT_IMAGE 8 #define DLL_ARGT_MESSAGE 16 #define DLL_ARGT_NONE 128 #define MAXINPUT 1024 #define ERROR1_DIV_BY_ZERO 1 // #DIV/0! #define ERROR1_INVALID_NAME 2 // #NAME?, invalid names in formulas #define ERROR1_NULL_VALUE 3 // #NULL!, empty intersection, empty array result #define ERROR1_NO_DATA 4 // #N/A!, no lookup results / no data in a cell #define ERROR1_INVALID_NUMBER 5 // #NUM!, wrong number values, overflow, underflow #define ERROR1_INVALID_REF 6 // #REF!, wrong row/col numbers, array result exceeding the sheet #define ERROR1_INVALID_VALUE 7 // #VALUE!, wrong argument types, too long text strings, str_stack overflow #define ERROR1_OUT_OF_MEMORY 8 // #MEMORY!, out of memory in an array formula #define ERROR1_ARRAY_NO_FILL 9 // #FILL!, array result area already occupied by some 'foreign' cells #define ERROR1_ARRAY_CIRC 10 // #CIRC!, circular reference #define ERROR1_NOT_IMPLEMENTED 11 // #IMPL! function not yet implemented #define ERROR1_SYNTAX_ERROR 12 // #SYNTAX! wrong number of parameters, operators or an invalid name struct ArrayItem { uint8_t type; // DLL_ARGT_EMPTY | DLL_ARGT_DOUBLE | DLL_ARGT_TEXT uint8_t err_code; // ERROR1_DIV_BY_ZERO...ERROR1_SYNTAX_ERROR uint16_t col; // [0, 4095] uint32_t row; // [0, 12582911] double num; // numeric cell char text[MAXINPUT + 1];// text cell; max. 1024+NULL char. utf-8 string }; typedef void* (__cdecl *MALLOC)(size_t s); typedef void(__cdecl *MFREE)(void *_Memory); typedef int(__cdecl *READ_ARRAY)(void *env, int array_index, ArrayItem *val); typedef int(__cdecl *WRITE_ARRAY)(void *env, int array_index, ArrayItem *val); struct GSCalcArg { uint8_t types[16]; // input: as in ArrayItem::type | DLL_ARGT_ARRAY // output: as above | DLL_ARGT_IMAGE | DLL_ARGT_MESSAGE uint8_t errors[16]; // ERROR1_DIV_BY_ZERO...ERROR1_SYNTAX_ERROR double numbers[16]; char *strings[16]; // input (UTF-8) strings are pre-allocated by GS-Calc and must not be overwritten // strings[15] used for output strings already points to a MAXINPUT+1 char. temp. buffer struct Dims { uint32_t cx; uint32_t cy; } array_dims[16]; // dimensions of the subsequent group together range/array arguments passed from GS-Calc struct { BYTE *data; // DIB data if you return types[15] = DLL_ARGT_IMAGE; must be (de-)allocated with memory_alloc/memory_free size_t size; // DIB data size Dims dims; // optional resizing when displaying the image (returned either as a DIB or a file path) MALLOC memory_alloc; MFREE memory_free; } image; READ_ARRAY read_array; // returns ArrayItem.type WRITE_ARRAY write_array; // returns ArrayItem.type or -1 if the out-of-memory condition occurs void *env; // internal data that must be passed back in read_array/write_array calls }; //typedef double(__cdecl *DLL_EXT_FUNCTION)(GSCalcArg *arg);