#include #include #include #include #include #include "vcd_parser.h" using namespace std; /// Typedef used as part of c->js call typedef void externalJsMethodZero(const char* name, const size_t len); // typedef void externalJsMethodOne (const char* name, const size_t len, const uint64_t time, const uint8_t command, const int valueWords, const int aValue, const int aMask); typedef void externalJsMethodOne (const char* name, const size_t len, const int time, const int command, const int valueWords, const int aValue, const int aMask); typedef int externalJsGetProperty(const char* name, const size_t len); typedef void externalJsSetProperty(const char* name, const size_t len, const int type, const int v0, const int v1); /// function pointer for c->js static externalJsMethodZero* externalZero = 0; static externalJsMethodOne* externalOne = 0; static externalJsSetProperty* bound_set_property = 0; static externalJsGetProperty* bound_get_property = 0; static struct vcd_parser_s* state; extern "C" { void set_property_int(const char* name, const int value) { bound_set_property(name, strlen(name), 0, value, 0); } void set_property_string(const char* name, const char* value) { bound_set_property(name, strlen(name), 1, (int)value, strlen(value)); } void set_path_string(const char* name, const char* value) { bound_set_property(name, strlen(name), 2, (int)value, strlen(value)); } void set_path_to_path(const char* name, const char* value) { bound_set_property(name, strlen(name), 3, (int)value, strlen(value)); } void new_object_path(const char* name) { bound_set_property(name, strlen(name), 4, 0, 0); } int get_property_int(const char* name) { return bound_get_property(name, strlen(name)); } void emit_lifee(const char* name) { externalZero(name, strlen(name)); } void emit_triee(const char* name, const int64_t time, const int command, const int valueWords, uint64_t* aValue, uint64_t* aMask) { // return; // externalOne( // "hi" // ,2 // ,time // ,command // ,0 // ,0 // ,0 // ); externalOne( name, strlen(name), time, command, valueWords, (int)aValue, (int)aMask ); } // returns context int init( externalJsMethodZero* f0, externalJsMethodOne* f1, externalJsSetProperty* sfn, externalJsGetProperty* gfn ) { state = (struct vcd_parser_s*) malloc(sizeof *state); const int32_t error = vcd_parser_init(state); if (error) { cout << "ERROR: " << error << "\n"; return -1; } bound_set_property = sfn; bound_get_property = gfn; externalZero = f0; externalOne = f1; state->lifee = 0; state->triee = 0; static char triggerString [4096] = " "; static char tmpStr [4096] = " "; static char tmpStr2 [4096] = " "; static uint64_t valueBuf [4096] = {}; static uint64_t maskBuf [4096] = {}; state->trigger = triggerString; state->reason = "NO REASON"; state->napi_env = 0; state->tmpStr = tmpStr; state->tmpStr2 = tmpStr2; state->value = valueBuf; state->mask = maskBuf; state->digitCount = 0; state->time = UINT64_MAX; set_property_string("status", "declaration"); static int context = 0; context++; return context; } int32_t execute( const int context, externalJsMethodZero* f0, externalJsMethodOne* f1, externalJsSetProperty* sfn, externalJsGetProperty* gfn, char* p ) { // cout << "execute got " << p << "\n"; // cout << "execute " << (int)sfn << " and got " << p << "\n"; bound_set_property = sfn; bound_get_property = gfn; externalZero = f0; externalOne = f1; const size_t plen = strlen(p); const int32_t error = vcd_parser_execute(state, p, p + plen); return error; } int setTrigger(const int context, char* triggerString) { state->trigger = malloc(strlen(triggerString)); strcpy((char*)state->trigger, triggerString); // cout << "setTrigger() got " << triggerString << "\n"; return 0; } uint64_t getTime(const int context) { return state->time; } // void execute( // const int context, // externalJsMethodZero* f0, // externalJsMethodOne* f1, // externalJsSetProperty* sfn, // externalJsGetProperty* gfn, // char* chunk // ) { // // cout << "execute got " << p << "\n"; // cout << "execute " << (int)sfn << " and got " << chunk << "\n"; // bound_set_property = sfn; // bound_get_property = gfn; // externalZero = f0; // externalOne = f1; // set_property_int("foo", 10); // int got = get_property_int("bar"); // cout << "got " << got << " for bar\n"; // } int main(void) { // cout << "main()\n"; return 0; } } // extern C