static wref *alloc_ref( HWND h ) { wref *ref = hl_gc_alloc_finalizer(sizeof(wref)); memset(ref,0,sizeof(wref)); ref->h = h; ref->finalize = finalize_wref; SetProp(h,PREF,ref); return ref; }
/** request : 'db -> sql:string -> 'result <doc>Executes the SQL request and returns its result</doc> **/ HL_PRIM sqlite_result *HL_NAME(request)(sqlite_database *db, vbyte *sql ) { sqlite_result *r; const char *tl; int i,j; r = (sqlite_result*)hl_gc_alloc_finalizer(sizeof(sqlite_result)); r->finalize = HL_NAME(finalize_result); r->db = db; if( sqlite3_prepare16_v2(db->db, sql, -1, &r->r, &tl) != SQLITE_OK ) { HL_NAME(error)(db->db, false); } if( *tl ) { sqlite3_finalize(r->r); hl_error("SQLite error: Cannot execute several SQL requests at the same time"); } r->ncols = sqlite3_column_count(r->r); r->names = (int*)hl_gc_alloc(sizeof(int)*r->ncols); r->bools = (int*)hl_gc_alloc(sizeof(int)*r->ncols); r->first = 1; r->done = 0; for(i=0;i<r->ncols;i++) { int id = hl_hash_gen((uchar*)sqlite3_column_name16(r->r,i), true); const char *dtype = sqlite3_column_decltype(r->r,i); for(j=0;j<i;j++) if( r->names[j] == id ) { if( strcmp(sqlite3_column_name16(r->r,i), sqlite3_column_name16(r->r,j)) == 0 ) { sqlite3_finalize(r->r); hl_buffer *b = hl_alloc_buffer(); hl_buffer_str(b, USTR("SQLite error: Same field is two times in the request: ")); hl_buffer_str(b, (uchar*)sql); hl_error_msg(hl_buffer_content(b, NULL)); } else { hl_buffer *b = hl_alloc_buffer(); hl_buffer_str(b, USTR("SQLite error: Same field ids for: ")); hl_buffer_str(b, sqlite3_column_name16(r->r,i)); hl_buffer_str(b, USTR(" and ")); hl_buffer_str(b, sqlite3_column_name16(r->r,j)); sqlite3_finalize(r->r); hl_error_msg(hl_buffer_content(b, NULL)); } } r->names[i] = id; r->bools[i] = dtype?(strcmp(dtype,"BOOL") == 0):0; } // changes in an update/delete if( db->last != NULL ) HL_NAME(finalize_request)(db->last, false); db->last = r; return db->last; }
/** connect : filename:string -> 'db <doc>Open or create the database stored in the specified file.</doc> **/ HL_PRIM sqlite_database *HL_NAME(connect)( vbyte *filename ) { sqlite_database *db; sqlite3 *sqlite; if( sqlite3_open16(filename, &sqlite) != SQLITE_OK ) { HL_NAME(error)(sqlite, true); } db = (sqlite_database*)hl_gc_alloc_finalizer(sizeof(sqlite_database)); db->finalize = HL_NAME(finalize_database); db->db = sqlite; db->last = NULL; return db; }
HL_PRIM ereg *regexp_regexp_new_options( vbyte *str, vbyte *opts ) { ereg *r; const char *error; int err_offset; int errorcode; pcre16 *p; uchar *o = (uchar*)opts; int options = 0; while( *o ) { switch( *o++ ) { case 'i': options |= PCRE_CASELESS; break; case 's': options |= PCRE_DOTALL; break; case 'm': options |= PCRE_MULTILINE; break; case 'u': options |= PCRE_UTF8; break; case 'g': options |= PCRE_UNGREEDY; break; default: return NULL; } } p = pcre16_compile2((PCRE_SPTR16)str,options,&errorcode,&error,&err_offset,NULL); if( p == NULL ) { hl_buffer *b = hl_alloc_buffer(); hl_buffer_str(b,USTR("Regexp compilation error : ")); hl_buffer_cstr(b,error); hl_buffer_str(b,USTR(" in ")); hl_buffer_str(b,(uchar*)str); hl_error_msg(USTR("%s"),hl_buffer_content(b,NULL)); } r = (ereg*)hl_gc_alloc_finalizer(sizeof(ereg)); r->finalize = regexp_finalize; r->p = p; r->nmatches = 0; r->matched = 0; pcre16_fullinfo(p,NULL,PCRE_INFO_CAPTURECOUNT,&r->nmatches); r->nmatches++; r->matches = (int*)malloc(sizeof(int) * 3 * r->nmatches); limit.flags = PCRE_EXTRA_MATCH_LIMIT_RECURSION; limit.match_limit_recursion = 3500; // adapted based on Windows 1MB stack size return r; }
HL_CFFIPointer* HLCFFIPointer (void* handle, hl_finalizer finalizer) { if (handle) { HL_CFFIPointer* pointer = (HL_CFFIPointer*)hl_gc_alloc_finalizer (sizeof (HL_CFFIPointer)); pointer->finalizer = finalizer ? (void*)finalizer : 0; pointer->ptr = handle; return pointer; } else { return 0; } }
HL_PRIM fmt_zip *HL_NAME(deflate_init)( int level ) { z_stream *z; int err; fmt_zip *s; z = (z_stream*)malloc(sizeof(z_stream)); memset(z,0,sizeof(z_stream)); if( (err = deflateInit(z,level)) != Z_OK ) { free(z); zlib_error(NULL,err); } s = (fmt_zip*)hl_gc_alloc_finalizer(sizeof(fmt_zip)); s->finalize = free_stream_inf; s->flush = Z_NO_FLUSH; s->z = z; s->inflate = false; return s; }
HL_PRIM fmt_zip *HL_NAME(inflate_init)( int wbits ) { z_stream *z; int err; fmt_zip *s; if( wbits == 0 ) wbits = MAX_WBITS; z = (z_stream*)malloc(sizeof(z_stream)); memset(z,0,sizeof(z_stream)); if( (err = inflateInit2(z,wbits)) != Z_OK ) { free(z); zlib_error(NULL,err); } s = (fmt_zip*)hl_gc_alloc_finalizer(sizeof(fmt_zip)); s->finalize = free_stream_inf; s->flush = Z_NO_FLUSH; s->z = z; s->inflate = true; return s; }