diff --git a/bin/build.js b/bin/build.js index 8737c49..cd5454c 100755 --- a/bin/build.js +++ b/bin/build.js @@ -17,6 +17,7 @@ p.property('ptr', 'trigger'); p.property('ptr', 'triee'); p.property('ptr', 'lifee'); p.property('ptr', 'info'); +p.property('ptr', 'tmpStr'); p.property('i32', 'stackPointer'); p.property('ptr', 'id'); p.property('ptr', 'napi_env'); diff --git a/vcd.c b/vcd.c index 61eb7f6..1c53078 100644 --- a/vcd.c +++ b/vcd.c @@ -123,10 +123,12 @@ METHOD(init) { ASSERT_OBJECT(args[2], state->info) static char triggerString [4096] = " "; + static char tmpStr [4096] = " "; state->trigger = triggerString; state->reason = "NO REASON"; state->napi_env = env; + state->tmpStr = tmpStr; napi_value status; ASSERT(status, napi_create_string_latin1(env, "declaration", NAPI_AUTO_LENGTH, &status)) diff --git a/vcd_spans.c b/vcd_spans.c index 45e47ba..b308ed4 100644 --- a/vcd_spans.c +++ b/vcd_spans.c @@ -8,6 +8,17 @@ napi_throw(env, val); \ } +void strcopy(const unsigned char* p, const unsigned char* endp, unsigned char* dst) { + unsigned char* src; + src = p; + while (src < (endp - 1)) { + *dst = *src; + src++; + dst++; + } + *dst = 0; +} + // FIXME use a better structure to match strings int stringEq ( const unsigned char* gold, // search pattern @@ -60,15 +71,16 @@ int commandSpan(vcd_parser_t* state, const unsigned char* p, const unsigned char return 0; } -int scopeIdentifierSpan(vcd_parser_t* state, const unsigned char* p, /* FIXME const */ unsigned char* endp) { +int scopeIdentifierSpan(vcd_parser_t* state, const unsigned char* p, const unsigned char* endp) { napi_env env = state->napi_env; - *(endp - 1) = 0; // FIXME NULL termination of ASCII string + // *(endp - 1) = 0; // FIXME NULL termination of ASCII string + strcopy(p, endp, state->tmpStr); napi_value name, obj, stack, top; ASSERT(name, napi_create_string_latin1(env, (char*)p, (endp - p - 1), &name)) ASSERT(obj, napi_create_object(env, &obj)) ASSERT(state->info, napi_get_named_property(env, state->info, "stack", &stack)) ASSERT(top, napi_get_element(env, stack, state->stackPointer, &top)) - ASSERT(top, napi_set_named_property(env, top, p, obj)) + ASSERT(top, napi_set_named_property(env, top, state->tmpStr, obj)) state->stackPointer += 1; ASSERT(top, napi_set_element(env, stack, state->stackPointer, obj)) return 0; @@ -81,18 +93,21 @@ int varSizeSpan(vcd_parser_t* state, const unsigned char* p, const unsigned char int varIdSpan(vcd_parser_t* state, const unsigned char* p, const unsigned char* endp) { napi_env env = state->napi_env; - napi_value val; - ASSERT(state->id, napi_create_string_latin1(env, (char*)p, (endp - p - 1), &state->id)) + napi_value varId; + ASSERT(varId, napi_create_string_latin1(env, (char*)p, (endp - p - 1), &varId)) + ASSERT(state->info, napi_set_named_property(env, state->info, "varId", varId)) return 0; } -int varNameSpan(vcd_parser_t* state, const unsigned char* p, /* FIXME const */ unsigned char* endp) { +int varNameSpan(vcd_parser_t* state, const unsigned char* p, const unsigned char* endp) { napi_env env = state->napi_env; - *(endp - 1) = 0; // FIXME NULL termination of ASCII string - napi_value stack, top; + // *(endp - 1) = 0; // FIXME NULL termination of ASCII string + strcopy(p, endp, state->tmpStr); + napi_value stack, top, varId; ASSERT(state->info, napi_get_named_property(env, state->info, "stack", &stack)) ASSERT(top, napi_get_element(env, stack, state->stackPointer, &top)) - ASSERT(state->info, napi_set_named_property(env, top, p, state->id)) + ASSERT(state->info, napi_get_named_property(env, state->info, "varId", &varId)) + ASSERT(state->info, napi_set_named_property(env, top, state->tmpStr, varId)) return 0; }