void _binpachilti_sink_connect_intern(binpac_sink* sink, const hlt_type_info* type, void** pobj, binpac_parser* parser, hlt_bytes* mtype, hlt_exception** excpt, hlt_execution_context* ctx) { __parser_state* state = hlt_malloc(sizeof(__parser_state)); state->parser = parser; GC_CCTOR(state->parser, hlt_BinPACHilti_Parser, ctx); state->pobj = *pobj; GC_CCTOR_GENERIC(&state->pobj, type, ctx); state->data = 0; state->resume = 0; state->disconnected = 0; state->next = sink->head; sink->head = state; #ifdef DEBUG if ( mtype ) { hlt_string s = hlt_string_decode(mtype, Hilti_Charset_ASCII, excpt, ctx); char* r1 = hlt_string_to_native(s, excpt, ctx); char* r2 = hlt_string_to_native(parser->name, excpt, ctx); DBG_LOG("binpac-sinks", "connected parser %s [%p] to sink %p for MIME type %s", r2, *pobj, sink, r1); hlt_free(r1); hlt_free(r2); } else { char* p = hlt_string_to_native(parser->name, excpt, ctx); DBG_LOG("binpac-sinks", "connected parser %s [%p] to sink %p", p, *pobj, sink); hlt_free(p); } #endif }
void binpachilti_sink_disconnect(binpac_sink* sink, const hlt_type_info* type, void** pobj, hlt_exception** excpt, hlt_execution_context* ctx) { if ( ! sink ) return; __parser_state* s = 0; for ( s = sink->head; s; s = s->next ) { if ( s->pobj == *pobj ) break; } if ( ! s ) // Not found, ignore. return; #ifdef DEBUG char* p = hlt_string_to_native(s->parser->name, excpt, ctx); DBG_LOG("binpac-sinks", "disconnected parser %s [%p] from sink %p", p, *pobj, sink); hlt_free(p); #endif // We don't delete the object here as we may be deep inside the parsing // when disconnecting is called. s->disconnected = 1; }
char* hlt_regexp_to_asciiz(hlt_regexp* re, hlt_exception** excpt, hlt_execution_context* ctx) { // Don't need type info nor seen. hlt_string p = hlt_regexp_to_string(0, &re, 0, 0, excpt, ctx); char* c = hlt_string_to_native(p, excpt, ctx); return c; }
static void __add_parser(hlt_bytes* mt, binpac_parser* parser, hlt_exception** excpt, hlt_execution_context* ctx) { __mime_parser* mp = GC_NEW_REF(__mime_parser, ctx); GC_INIT(mp->parser, parser, hlt_BinPACHilti_Parser, ctx); mp->next = 0; // Deep-copy the pointers, the map needs that. __mime_parser** cmp = hlt_malloc(sizeof(__mime_parser*)); hlt_bytes** cmt = hlt_malloc(sizeof(hlt_bytes*)); *cmt = mt; *cmp = mp; __mime_parser** current = hlt_map_get_default(__binpac_globals_get()->mime_types, &hlt_type_info_hlt_bytes, cmt, &hlt_type_info___mime_parser, 0, excpt, ctx); if ( current ) { mp->next = *current; GC_CCTOR(mp->next, __mime_parser, ctx); } hlt_map_insert(__binpac_globals_get()->mime_types, &hlt_type_info_hlt_bytes, cmt, &hlt_type_info___mime_parser, cmp, excpt, ctx); GC_DTOR(mp, __mime_parser, ctx); hlt_free(cmp); hlt_free(cmt); #ifdef DEBUG hlt_string s = hlt_string_decode(mt, Hilti_Charset_ASCII, excpt, ctx); char* r1 = hlt_string_to_native(s, excpt, ctx); char* r2 = hlt_string_to_native(parser->name, excpt, ctx); DBG_LOG("binpac-sinks", "MIME type %s registered for parser %s", r1, r2); hlt_free(r1); hlt_free(r2); #endif }
static void __exception_print(const char* prefix, hlt_exception* e, hlt_execution_context* ctx) { hlt_exception* excpt = 0; // We must not terminate while in here. int old_state; hlt_pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &old_state); flockfile(stderr); hlt_string s = __exception_render(e, ctx); char* c = hlt_string_to_native(s, &excpt, ctx); fprintf(stderr, "%s%s\n", prefix, c); hlt_free(c); fflush(stderr); funlockfile(stderr); hlt_pthread_setcancelstate(old_state, NULL); }
char* hlt_exception_to_asciiz(hlt_exception* e, hlt_exception** excpt, hlt_execution_context* ctx) { hlt_string s = __exception_render(e, ctx); return hlt_string_to_native(s, excpt, ctx); }