varray *hl_sys_env() { varray *a; pchar **e = environ; pchar **arr; int count = 0; while( *e ) { pchar *x = pstrchr(*e,'='); if( x == NULL ) { e++; continue; } count++; } a = hl_alloc_array(&hlt_bytes,count*2); e = environ; arr = hl_aptr(a,pchar*); while( *e ) { pchar *x = pstrchr(*e,'='); if( x == NULL ) { e++; continue; } *arr++ = pstrdup(*e,(int)(x - *e)); *arr++ = pstrdup(x,-1); e++; } return a; }
/** result_next : 'result -> object? <doc>Returns the next row in the result or [null] if no more result.</doc> **/ HL_PRIM varray *HL_NAME(result_next)( sqlite_result *r ) { if( r->done ) return NULL; switch( sqlite3_step(r->r) ) { case SQLITE_ROW: r->first = 0; varray *a = hl_alloc_array(&hlt_dyn, r->ncols); int i; for(i=0;i<r->ncols;i++) { vdynamic *v; switch( sqlite3_column_type(r->r,i) ) { case SQLITE_NULL: v = NULL; break; case SQLITE_INTEGER: { int vint = sqlite3_column_int(r->r, i); if (r->bools[i]) v = hl_make_dyn(&vint, &hlt_bool); else v = hl_make_dyn(&vint, &hlt_i32); break; } case SQLITE_FLOAT: { double d = sqlite3_column_double(r->r, i); v = hl_make_dyn(&d, &hlt_f64); break; } case SQLITE_TEXT: { uchar *text16 = (uchar *)sqlite3_column_text16(r->r, i); v = hl_make_dyn(&text16, &hlt_bytes); break; } case SQLITE_BLOB: { vbyte *blob = (vbyte *)sqlite3_column_blob(r->r, i); v = hl_make_dyn(&blob, &hlt_bytes); break; } default: hl_error_msg(USTR("SQLite error: Unknown type #%d"), sqlite3_column_type(r->r,i)); } hl_aptr(a, vdynamic*)[i] = v; } return a; case SQLITE_DONE: HL_NAME(finalize_request)(r, true); return NULL; case SQLITE_BUSY: hl_error("SQLite error: Database is busy"); case SQLITE_ERROR: HL_NAME(error)(r->db->db, false); default: return NULL; } return NULL; }
/** result_get_fields : 'result -> array<string> <doc>Returns the array of field names in the result.</doc> **/ HL_PRIM varray *HL_NAME(result_get_fields)( sqlite_result *r ) { varray *a = hl_alloc_array(&hlt_bytes, r->ncols); int i; for (i = 0; i < r->ncols; i++) { hl_aptr(a, vbyte*)[i] = (vbyte *)sqlite3_column_name16(r->r, i); } return a; }
HL_PRIM varray *hl_exception_stack() { hl_thread_info *t = hl_get_thread(); varray *a = hl_alloc_array(&hlt_bytes, t->exc_stack_count); int i; for(i=0;i<t->exc_stack_count;i++) { void *addr = t->exc_stack_trace[i]; uchar sym[512]; int size = 512; uchar *str = resolve_symbol_func(addr, sym, &size); if( str == NULL ) { int iaddr = (int)(int_val)addr; str = sym; size = usprintf(str,512,USTR("@0x%X"),iaddr); } hl_aptr(a,vbyte*)[i] = hl_copy_bytes((vbyte*)str,sizeof(uchar)*(size+1)); } return a; }
varray *hl_sys_stat( vbyte *path ) { pstat s; varray *a; int *i; if( stat((pchar*)path,&s) != 0 ) return NULL; a = hl_alloc_array(&hlt_i32,12); i = hl_aptr(a,int); *i++ = s.st_gid; *i++ = s.st_uid; *i++ = s.st_atime; *i++ = s.st_mtime; *i++ = s.st_ctime; *i++ = s.st_size; *i++ = s.st_dev; *i++ = s.st_ino; *i++ = s.st_nlink; *i++ = s.st_rdev; *i++ = s.st_mode; return a; }
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; }
HL_PRIM void *hl_wrapper_call( void *_c, void **args, vdynamic *ret ) { vclosure_wrapper *c = (vclosure_wrapper*)_c; hl_type_fun *tfun = c->cl.t->fun; union { double d; int i; float f; } tmp[HL_MAX_ARGS]; void *vargs[HL_MAX_ARGS+1]; vdynamic out; vclosure *w = c->wrappedFun; int i; int p = 0; void *pret, *aret; if( ret == NULL ) ret = &out; if( w->fun == fun_var_args ) { varray *a; w = (vclosure*)w->value; // the real callback a = hl_alloc_array(&hlt_dyn,tfun->nargs); for(i=0;i<tfun->nargs;i++) { hl_type *t = tfun->args[i]; void *v = hl_is_ptr(t) ? args + i : args[i]; hl_aptr(a,void*)[i] = hl_make_dyn(v,t); } if( w->hasValue ) vargs[p++] = (vdynamic*)w->value; vargs[p++] = (vdynamic*)a; } else { if( w->hasValue ) vargs[p++] = (vdynamic*)w->value; for(i=0;i<w->t->fun->nargs;i++) { hl_type *t = tfun->args[i]; hl_type *to = w->t->fun->args[i]; void *v = hl_is_ptr(t) ? args + i : args[i]; switch( to->kind ) { case HUI8: case HUI16: case HI32: case HBOOL: tmp[i].i = hl_dyn_casti(v,t,to); v = &tmp[i].i; break; case HF32: tmp[i].f = hl_dyn_castf(v,t); v = &tmp[i].f; break; case HF64: tmp[i].d = hl_dyn_castd(v,t); v = &tmp[i].d; break; default: v = hl_dyn_castp(v,t,to); break; } vargs[p++] = v; } } pret = hlc_static_call(w->fun,w->hasValue ? w->t->fun->parent : w->t,vargs,ret); aret = hl_is_ptr(w->t->fun->ret) ? &pret : pret; if( aret == NULL ) aret = &pret; switch( tfun->ret->kind ) { case HVOID: return NULL; case HUI8: case HUI16: case HI32: case HBOOL: ret->v.i = hl_dyn_casti(aret,w->t->fun->ret,tfun->ret); break; case HF32: ret->v.f = hl_dyn_castf(aret,w->t->fun->ret); break; case HF64: ret->v.d = hl_dyn_castd(aret,w->t->fun->ret); break; default: pret = hl_dyn_castp(aret,w->t->fun->ret,tfun->ret); break; } return pret; }