/// Response Types
#define JTBoolean 1
#define JTChar 2
#define JTInteger 4
#define JTFloat 8
#define JTComplex 16
#define JTBox 32
#define JTExtendedInt 64
#define JTRational 128
#define JTSymbol 65536
#define JTWide 131072
#define JNJPassThrough -1
typedef void V;
typedef long long I;
typedef char C;
typedef double D;
typedef struct {
I k, flag, m, t, c, n, r, s[1];
} * A; // J array struct used in Jwd
typedef V *J;
typedef V *(*JIT)();
typedef V *(*JFT)(J);
typedef int (*JDT)(J, C *);
typedef C *(*JGT)(J);
typedef V *(*JFT)(J);
typedef V *(*JSXT)(J, V *, V *, V *, V *, I);
typedef int (*JGMT)(J, C *, I *, I *, I *, I *);
typedef int (*JSMT)(J, C *, I *, I *, I *, I *);
typedef A (*JGAT)(J jt, I n, C *name);
typedef I (*JSAT)(J jt, I n, C *name, I x, C *d);
// Get pointer to J engine
static JIT JInit;
static JFT JFree;
// Load J callbacks
// Format: {Output callback, Jwd(?), Input Callback, Console type flag}
static JSXT JSMX;
// Execute J sentence
static JDT JDo;
// Get J variable
static JGMT JGetM;
static JSMT JSetM;
static JGT JGetR;
static JGAT JGetA; /* get 3!:1 from name */
static JSAT JSetA;
V *jinit();
V jfree(J);
int jdo(J, C *);
V *loaddl();
int jgetm(J, C *, I *, I *, I *, I *);
int jsetm(J, C *, I *, I *, I *, I *);
C *jgetr(J);
A jgeta(J, I, C *);
I jseta(J, I, C *, I, C *);