Esempio n. 1
0
File: sys.c Progetto: bsmr-haxe/hl
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;
}
Esempio n. 2
0
/**
	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;
}
Esempio n. 3
0
/**
	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;
}
Esempio n. 4
0
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;
}
Esempio n. 5
0
File: sys.c Progetto: bsmr-haxe/hl
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;
}
Esempio n. 6
0
File: sys.c Progetto: bsmr-haxe/hl
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;
	}
Esempio n. 7
0
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;
}