static void HL_NAME(error)( sqlite3 *db, bool close ) { hl_buffer *b = hl_alloc_buffer(); hl_buffer_str(b, USTR("SQLite error: ")); hl_buffer_str(b, sqlite3_errmsg16(db)); if ( close ) sqlite3_close(db); hl_error_msg(hl_buffer_content(b, NULL)); }
bool hl_sys_put_env( vbyte *e, vbyte *v ) { #ifdef HL_WIN hl_buffer *b = hl_alloc_buffer(); hl_buffer_str(b,(uchar*)e); hl_buffer_char(b,'='); if( v ) hl_buffer_str(b,(uchar*)v); return putenv(hl_buffer_content(b,NULL)) == 0; #else if( v == NULL ) return unsetenv((char*)e) == 0; return setenv((char*)e,(char*)v,1) == 0; #endif }
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; }
varray *hl_sys_read_dir( vbyte *_path ) { pchar *path = (pchar*)_path; int count = 0; int pos = 0; varray *a = NULL; pchar **current = NULL; #ifdef HL_WIN WIN32_FIND_DATAW d; HANDLE handle; hl_buffer *b = hl_alloc_buffer(); int len = (int)pstrlen(path); hl_buffer_str(b,path); if( len && path[len-1] != '/' && path[len-1] != '\\' ) hl_buffer_str(b,USTR("/*.*")); else hl_buffer_str(b,USTR("*.*")); path = hl_buffer_content(b,NULL); handle = FindFirstFileW(path,&d); if( handle == INVALID_HANDLE_VALUE ) return NULL; while( true ) { // skip magic dirs if( d.cFileName[0] != '.' || (d.cFileName[1] != 0 && (d.cFileName[1] != '.' || d.cFileName[2] != 0)) ) { if( pos == count ) { int ncount = count == 0 ? 16 : count * 2; varray *narr = hl_alloc_array(&hlt_bytes,count); pchar **ncur = hl_aptr(narr,pchar*); memcpy(ncur,current,count*sizeof(void*)); current = ncur; a = narr; count = ncount; } current[pos++] = pstrdup(d.cFileName,-1); } if( !FindNextFileW(handle,&d) ) break; }
/** 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; }
static void hl_type_str_rec( hl_buffer *b, hl_type *t, tlist *parents ) { const uchar *c = TSTR[t->kind]; tlist *l, cur; int i; if( c != NULL ) { hl_buffer_str(b,c); return; } l = parents; while( l ) { if( l->t == t ) { hl_buffer_str(b,USTR("<...>")); return; } l = l->next; } cur.t = t; cur.next = parents; l = &cur; switch( t->kind ) { case HFUN: hl_buffer_char(b,'('); hl_type_str_rec(b,t->fun->ret,l); hl_buffer_char(b,' '); hl_buffer_char(b,'('); for(i=0; i<t->fun->nargs; i++) { if( i ) hl_buffer_char(b,','); hl_type_str_rec(b,t->fun->args[i],l); } hl_buffer_char(b,')'); hl_buffer_char(b,')'); break; case HOBJ: hl_buffer_char(b,'#'); hl_buffer_str(b,t->obj->name); break; case HREF: hl_buffer_str(b,USTR("ref<")); hl_type_str_rec(b,t->tparam,l); hl_buffer_char(b,'>'); break; case HVIRTUAL: hl_buffer_str(b,USTR("virtual<")); for(i=0; i<t->virt->nfields; i++) { hl_obj_field *f = t->virt->fields + i; if( i ) hl_buffer_char(b,','); hl_buffer_str(b,f->name); hl_buffer_char(b,':'); hl_type_str_rec(b,f->t,l); } hl_buffer_char(b,'>'); break; case HABSTRACT: hl_buffer_str(b,t->abs_name); break; case HENUM: hl_buffer_str(b,USTR("enum")); if( t->tenum->name ) { hl_buffer_char(b,'<'); hl_buffer_str(b,t->tenum->name); hl_buffer_char(b,'>'); } break; case HNULL: hl_buffer_str(b,USTR("null<")); hl_type_str_rec(b,t->tparam,l); hl_buffer_char(b,'>'); break; default: hl_buffer_str(b,USTR("???")); break; } }