-
Notifications
You must be signed in to change notification settings - Fork 0
/
dllMain.c
120 lines (90 loc) · 3.01 KB
/
dllMain.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include <Windows.h>
#include <stdio.h>
#include "HsFFI.h"
#include "formulaDll_stub.h"
#define EQ_API extern __attribute__((dllexport))
extern void __stginit_FormulaDll(void);
typedef void eq_context_t;
BOOL APIENTRY DllMain( HANDLE hModule
, DWORD ul_reason_for_call
, LPVOID lpReserved
)
{ return TRUE; }
char *internArgv[] = { "formulaDll", "Bleh" };
char* lastResult = NULL;
wchar_t* dotNetizeW( /*out*/ wchar_t *cHeapString )
{
int i;
size_t length = wcslen( cHeapString );
wchar_t *out = (wchar_t*)CoTaskMemAlloc( (length + 1) * sizeof( wchar_t ) );
for (i = 0; i < length; ++i)
out[i] = cHeapString[i];
// just to be sure...
out[ length ] = 0;
eqFreeHaskellString( cHeapString );
return out;
}
char* dotNetize( /*out*/ char* cHeapString )
{
int i;
size_t length = strlen( cHeapString );
char *out = (char*)CoTaskMemAlloc( (length + 1) * sizeof( char ) );
for (i = 0; i < length; ++i)
out[i] = cHeapString[i];
// just to be sure...
out[ length ] = 0;
eqFreeHaskellString( cHeapString );
return out;
}
EQ_API HsBool eq_begin_runtime()
{
char **argv = internArgv;
int argc = 1;
lastResult = NULL;
hs_init(&argc, &argv);
hs_add_root(__stginit_FormulaDll);
return HS_BOOL_TRUE;
}
EQ_API eq_context_t* eq_create_context_with_base_library()
{ return eqCreateContextWithBaseLibrary( 0 ); }
EQ_API eq_context_t* eq_create_context()
{ return eqCreateContext( 0 ); }
EQ_API void eq_delete_context( eq_context_t* handle )
{ eqDeleteContext( handle ); }
EQ_API wchar_t* eq_translate_mathml( wchar_t *in )
{ return dotNetizeW( (wchar_t*)eqMathMLTranslate( (HsPtr)in ) ); }
EQ_API wchar_t* eq_evalW( wchar_t *in )
{ return dotNetizeW( (wchar_t*)eqWEval( (HsPtr)in ) ); }
EQ_API char* eq_eval( char *in )
{ return dotNetize( (char*)eqEval( (HsPtr)in ) ); }
EQ_API char* eq_format( char *in )
{ return dotNetize( (char*)eqFormat( (HsPtr)in ) ); }
EQ_API wchar_t* eq_formatW( wchar_t *in )
{ return dotNetizeW( (wchar_t*)eqWFormat( (HsPtr)in ) ); }
EQ_API void eq_end_runtime()
{ hs_exit(); }
EQ_API void eq_eval_with_contextW( wchar_t *in, eq_context_t *ctxt,
wchar_t **pRez, wchar_t **pUnparsed,
wchar_t **pMathml )
{
wchar_t *rez;
wchar_t *unparsed;
wchar_t *mathml;
eqWEvalWithContext( in, ctxt, &rez, &unparsed, &mathml );
*pRez = dotNetizeW( rez );
*pUnparsed = dotNetizeW( unparsed );
*pMathml = dotNetizeW( mathml );
}
EQ_API char* eq_eval_with_context( char *in, eq_context_t *ctxt,
char **pRez, char **pUnparsed,
char **pMathml )
{
char *rez;
char *unparsed;
char *mathml;
eqEvalWithContext( in, ctxt, &rez, &unparsed, &mathml );
*pRez = dotNetize( rez );
*pUnparsed = dotNetize( unparsed );
*pMathml = dotNetize( mathml );
return NULL;
}