示例#1
0
BBArray *bbArrayConcat( const char *type,BBArray *x,BBArray *y ){

	BBArray *arr;
	char *data;
	int length=x->scales[0]+y->scales[0];
	
	if( length<=0 ) return &bbEmptyArray;

	arr=allocateArray( type,1,&length );
	
	data=(char*)BBARRAYDATA( arr,1 );
	
	memcpy( data,BBARRAYDATA( x,1 ),x->size );
	memcpy( data+x->size,BBARRAYDATA( y,1 ),y->size );
	
#ifdef BB_GC_RC
	if( type[0]==':' || type[0]=='$' || type[0]=='[' ){
		int i;
		BBObject **p=(BBObject**)data;
		for( i=0;i<length;++i ){
			BBObject *o=*p++;
			BBINCREFS( o );
		}
	}
#endif
	return arr;
}
示例#2
0
void bbArraySort( BBArray *arr,int ascending ){
	int n;
	void *p;
	n=arr->scales[0]-1;
	if( n<=0 ) return;
	p=BBARRAYDATA(arr,arr->dims);
	if( ascending ){
		switch( arr->type[0] ){
		case 'b':_qsort_b( (unsigned char*)p,(unsigned char*)p+n );break;
		case 's':_qsort_s( (unsigned short*)p,(unsigned short*)p+n );break;
		case 'i':qsort_i( (int*)p,(int*)p+n );break;
		case 'l':qsort_l( (BBInt64*)p,(BBInt64*)p+n );break;
		case 'f':qsort_f( (float*)p,(float*)p+n );break;
		case 'd':qsort_d( (double*)p,(double*)p+n );break;
		case '$':case ':':qsort_obj( (BBObject**)p,(BBObject**)p+n );break;
		}
	}else{
		switch( arr->type[0] ){
		case 'b':qsort_b_d( (unsigned char*)p,(unsigned char*)p+n );break;
		case 's':qsort_s_d( (unsigned short*)p,(unsigned short*)p+n );break;
		case 'i':qsort_i_d( (int*)p,(int*)p+n );break;
		case 'l':qsort_l_d( (BBInt64*)p,(BBInt64*)p+n );break;
		case 'f':qsort_f_d( (float*)p,(float*)p+n );break;
		case 'd':qsort_d_d( (double*)p,(double*)p+n );break;
		case '$':case ':':qsort_obj_d( (BBObject**)p,(BBObject**)p+n );break;
		}
	}
}
示例#3
0
文件: glue.cpp 项目: Chaduke/bah.mod
BBArray * bmx_filesystem_loaddir(BBString * dir) {
	boost::filesystem::path p(bbStringToPath(dir));
	std::vector<boost::filesystem::path> v;

	if (boost::filesystem::exists(p)) {
		copy(boost::filesystem::directory_iterator(p), boost::filesystem::directory_iterator(), back_inserter(v));
		
		
		int n = v.size();
		
		if (n > 0) {
			int i = 0;
			
			BBArray *arr = bbArrayNew1D( "$",n );
			BBString **s = (BBString**)BBARRAYDATA( arr, arr->dims );
		
			for (std::vector<boost::filesystem::path>::const_iterator it (v.begin()); it != v.end(); ++it) {
				boost::filesystem::path path((*it).filename());
				s[i] = bbStringFromPath( path );
				BBRETAIN( s[i] );
				i++;
			}
			return arr;
		}
	}
	
	return &bbEmptyArray;
}
示例#4
0
BBArray *vertsToBBFloatArray( int num, cpVect *verts ){
	BBArray *p=bbArrayNew1D( "f", num * 2 );
	cpFloat *s=(cpFloat*)BBARRAYDATA( p,p->dims );
	for( int i=0;i < num;++i ){
		s[i * 2] = verts[i].x;
		s[i * 2 + 1] = verts[i].y;
	}
	return p;
}
示例#5
0
文件: glue.cpp 项目: GWRon/wx.mod
void bmx_wxgraphicscontext_strokedisconnectedlines(wxGraphicsContext * context, BBArray * sp, BBArray * ep) {
	int n = sp->scales[0] / 2;
	double *s=(double*)BBARRAYDATA( sp,sp->dims );
	double *e=(double*)BBARRAYDATA( ep,ep->dims );
	
	wxPoint2DDouble * startPoints = new wxPoint2DDouble[n];
	wxPoint2DDouble * endPoints = new wxPoint2DDouble[n];

	for (int i = 0; i < n; i++) {
		startPoints[i].m_x = s[i * 2];
		startPoints[i].m_y = s[i * 2 + 1];

		endPoints[i].m_x = e[i * 2];
		endPoints[i].m_y = e[i * 2 + 1];
	}
	
	context->StrokeLines(n, startPoints, endPoints);
	delete [] startPoints;
	delete [] endPoints;
}
示例#6
0
BBArray *bbArrayFromData( const char *type,int length,void *data ){

	int k;
	BBArray *arr;

	if( length<=0 ) return &bbEmptyArray;
	
	arr=allocateArray( type,1,&length );

	if( type[0]=='b' ){
		unsigned char *p=BBARRAYDATA( arr,1 );
		for( k=0;k<length;++k ) p[k]=((int*)data)[k];
	}else if( type[0]=='s' ){
		unsigned short *p=BBARRAYDATA( arr,1 );
		for( k=0;k<length;++k ) p[k]=((int*)data)[k];
	}else{
		memcpy( BBARRAYDATA( arr,1 ),data,arr->size );
	}
	return arr;
}
示例#7
0
文件: glue.cpp 项目: GWRon/wx.mod
void bmx_wxgraphicscontext_strokelines(wxGraphicsContext * context, BBArray * p) {
	int n = p->scales[0] / 2;
	double *s=(double*)BBARRAYDATA( p,p->dims );
	
	wxPoint2DDouble * points = new wxPoint2DDouble[n];
	for (int i = 0; i < n; i++) {
		points[i].m_x = s[i * 2];
		points[i].m_y = s[i * 2 + 1];
	}
	
	context->StrokeLines(n, points);
	delete [] points;
}
示例#8
0
BBString *bbStringFromArray( BBArray *arr ){
	int n;
	void *p;
	if( arr->dims!=1 ) return &bbEmptyString;
	n=arr->scales[0];
	p=BBARRAYDATA(arr,arr->dims);
	switch( arr->type[0] ){
	case 'b':return bbStringFromBytes( p,n );
	case 's':return bbStringFromShorts( p,n );
	case 'i':return bbStringFromInts( p,n );
	}
	return &bbEmptyString;
}
示例#9
0
文件: glue.cpp 项目: GWRon/wx.mod
void bmx_wxgraphicscontext_drawlines(wxGraphicsContext * context, BBArray * p, int fillStyle) {
	int n = p->scales[0] / 2;
	double *s=(double*)BBARRAYDATA( p,p->dims );
	
	wxPoint2DDouble * points = new wxPoint2DDouble[n];
	for (int i = 0; i < n; i++) {
		points[i].m_x = s[i * 2];
		points[i].m_y = s[i * 2 + 1];
	}
	
	context->DrawLines(n, points, static_cast<wxPolygonFillMode>(fillStyle));
	delete [] points;
}
示例#10
0
文件: glue.cpp 项目: Chaduke/bah.mod
FMOD_RESULT bmx_FMOD_System_GetSpectrum(FMOD_SYSTEM *system, BBArray * spectrumArray, int channelOffset, FMOD_DSP_FFT_WINDOW windowType) {

	int size = spectrumArray->scales[0];
	float arr[size];
	
	FMOD_RESULT res = FMOD_System_GetSpectrum(system, &arr[0], size, channelOffset, windowType);

	float *s=(float*)BBARRAYDATA( spectrumArray, spectrumArray->dims );
	for (int i = 0; i < size; i ++) {
		s[i] = arr[i];
	}
	
	return res;
}
示例#11
0
文件: glue.cpp 项目: Chaduke/bah.mod
FMOD_RESULT bmx_FMOD_Channel_GetSpectrum(MAX_FMOD_CHANNEL *channel, BBArray * spectrumArray, int channelOffset, FMOD_DSP_FFT_WINDOW windowType) {

	int size = spectrumArray->scales[0];
	float arr[size];
	
	FMOD_RESULT res = FMOD_Channel_GetSpectrum(channel->channel, &arr[0], size, channelOffset, windowType);

	float *s=(float*)BBARRAYDATA( spectrumArray, spectrumArray->dims );
	for (int i = 0; i < size; i ++) {
		s[i] = arr[i];
	}
	
	return res;
}
示例#12
0
static void initializeArray( BBArray *arr ){
	void *init,**p;
	
	if( !arr->size ) return;
	
	init=arrayInitializer( arr );
	p=(void**)(BBARRAYDATA( arr,arr->dims ));

	if( init ){
		int k;
		for( k=arr->scales[0];k>0;--k ) *p++=init;
	}else{
		memset( p,0,arr->size );
	}
}
示例#13
0
void XMLCALL bmx_expat_StartElementHandler(void *userData, const char *name, const char **atts) {

	int n;
	for (n = 0; atts[n]; n += 2) {}

	BBArray *p = bbArrayNew1D( "$",n );
	BBString **s = (BBString**)BBARRAYDATA( p,p->dims );
	for( int i = 0; i < n; ++i ){
		s[i] = bbStringFromUTF8String(atts[i]);
		BBRETAIN(s[i]);
	}

	_bah_expat_TXMLParser__StartElementHandler((BBObject *)userData, bbStringFromUTF8String(name), p);

}
示例#14
0
文件: glue.cpp 项目: Chaduke/bah.mod
CFMutableArrayRef CFArrayFromBBStringArray(BBArray * array) {

	int size = array->scales[0];
	CFMutableArrayRef list = CFArrayCreateMutable(kCFAllocatorDefault,
					size, &kCFTypeArrayCallBacks);
	
	BBString **s=(BBString**)BBARRAYDATA(array, array->dims);

	for (int i = 0; i < size; i++) {
		CFStringRef value = CFStringFromBBString(s[i]);
		CFArrayAppendValue(list, value);
		CFRelease(value);
	}

	return list;
}
示例#15
0
文件: glue.c 项目: GWRon/TVTower
void bmx_stringbuffer_join(struct MaxStringBuffer * buf, BBArray * bits, struct MaxStringBuffer * newbuf) {
    if(bits == &bbEmptyArray) {
        return;
    }

    int i;
    int n_bits = bits->scales[0];
    BBString **p = (BBString**)BBARRAYDATA( bits,1 );
    for(i = 0; i < n_bits; ++i) {
        if (i) {
            bmx_stringbuffer_append_stringbuffer(newbuf, buf);
        }
        BBString *bit = *p++;
        bmx_stringbuffer_append_string(newbuf, bit);
    }
}
示例#16
0
BBArray *bbArrayDimensions( BBArray *arr ){
	int *p,i,n;
	BBArray *dims;

	if( !arr->scales[0] ) return &bbEmptyArray;
	
	n=arr->dims;
	dims=bbArrayNew1D( "i",n );
	p=(int*)BBARRAYDATA( dims,1 );

	for( i=0;i<n-1;++i ){
		p[i]=arr->scales[i]/arr->scales[i+1];
	}
	p[i]=arr->scales[i];
	
	return dims;
}
示例#17
0
文件: glue.c 项目: GWRon/TVTower
BBArray * bmx_stringbuffer_splitbuffer_toarray(struct MaxSplitBuffer * buf) {
    int i, n;
    BBString **p,*bit;
    BBArray *bits;

    n = buf->count;

    bits = bbArrayNew1D("$", n);
    p = (BBString**)BBARRAYDATA(bits, 1);

    i = 0;
    while (n--) {
        bit = bmx_stringbuffer_substring(buf->buffer, buf->startIndex[i], buf->endIndex[i]);
        BBINCREFS( bit );
        *p++ = bit;
        i++;
    }
    return bits;
}
示例#18
0
//***** Note: Only used by ref counting GC.
static void bbArrayFree( BBObject *o ){
#ifdef BB_GC_RC
	int k;
	BBObject **p;
	BBArray *arr=(BBArray*)o;
	
	if( arr==&bbEmptyArray ){
		arr->refs=BBGC_MANYREFS;
		return;
	}

	switch( arr->type[0] ){
	case ':':case '$':case '[':
		p=(BBObject**)BBARRAYDATA(arr,arr->dims);
		for( k=arr->scales[0];k>0;--k ){
			BBObject *o=*p++;
			BBDECREFS( o );
		}
		break;
	}
	bbGCDeallocObject( arr,BBARRAYSIZE( arr->size,arr->dims ) );
#endif
}
示例#19
0
文件: glue.cpp 项目: maxmods/wx.mod
void bmx_wxstatusbar_setstatusstyles(wxStatusBar * statusbar, BBArray * styles) {
	statusbar->SetStatusStyles(styles->scales[0], (int*)BBARRAYDATA( styles, styles->dims ));
}
示例#20
0
文件: glue.cpp 项目: Chaduke/bah.mod
FMOD_RESULT bmx_FMOD_Channel_GetSpeakerLevels(MAX_FMOD_CHANNEL *channel, FMOD_SPEAKER speaker, BBArray * levels) {
	int n = levels->scales[0];
	float *f=(float*)BBARRAYDATA( levels,levels->dims );
	return FMOD_Channel_GetSpeakerLevels(channel->channel, speaker, f, n);
}
示例#21
0
文件: glue.cpp 项目: Chaduke/bah.mod
FMOD_RESULT bmx_FMOD_Channel_GetWaveData(MAX_FMOD_CHANNEL *channel, BBArray * waveArray, int channelOffset) {
	int n = waveArray->scales[0];
	float *f=(float*)BBARRAYDATA( waveArray, waveArray->dims );
	return FMOD_Channel_GetWaveData(channel->channel, f, n, channelOffset);
}
示例#22
0
/* Converts a Lua table to a BMax array - the type of the array is determined by the first value in the table (at index 1) */
BBArray *lua_tobmaxarray(lua_State *state, int index) {
    switch (lua_type(state, index))
    {
    case LUA_TNONE:
        luaL_error(state, ERRORSTR("@lua_tobmaxarray: Invalid index (%d)"), index);
        return &bbEmptyArray;

    case LUA_TNIL:
        return &bbEmptyArray;

    case LUA_TUSERDATA:
        if ( lua_isbmaxobject(state, index) ) {
            BBObject *obj = lua_tobmaxobject(state, index);
            if ( obj->clas == &bbArrayClass ) {
                return (BBArray*)obj;
            }
            else {
                luaL_error(state, ERRORSTR("@lua_tobmaxarray: Value at index (%d) is not an array."), index);
                return &bbEmptyArray;
            }
        }

    case LUA_TTABLE: /* code below */
        break;

    default:
        if (lua_type(state, index) != LUA_TTABLE) {
            luaL_error(state, ERRORSTR("@lua_tobmaxarray: Value at index (%d) is not a table."), index);
            return &bbEmptyArray;
        }
    }

    /* make the index absolute, since we're now dealing with more than one value on the stack */
    if (index < 0 && index > LUA_REGISTRYINDEX)
        index = lua_gettop(state)+(index+1);

    /* the index into the array */
    size_t table_index;
    BBArray *arr = NULL;
    size_t len = lua_objlen(state, index);

    if ( len == 0 )
        return &bbEmptyArray;

    /* get the first item of the table */
    lua_pushinteger(state, 1);
    lua_gettable(state, index);

    /* starting at index 2 when iterating */
    table_index = 2;

    /* determine what type of array to create based on the first value in the table (at index 0) */
    switch (lua_type(state, -1)) {
    case LUA_TNUMBER: {		/* array of doubles */
        double *p;

        arr = bbArrayNew1D("d", len);
        p = (double*)BBARRAYDATA(arr, arr->dims);

        *p++ = lua_tonumber(state, -1);
        lua_pop(state, 1);

        for (; table_index <= len; ++table_index) {
            lua_pushinteger(state, table_index);
            lua_gettable(state, index);

            *p++ = lua_tonumber(state, -1);

            lua_pop(state, 1);
        }

        return arr;
    }

    case LUA_TBOOLEAN: {		/* array of integers */
        int *p;

        arr = bbArrayNew1D("i", len);
        p = (int*)BBARRAYDATA(arr, arr->dims);

        *p++ = lua_toboolean(state, -1);
        lua_pop(state, 1);

        for (; table_index <= len; ++table_index) {
            lua_pushinteger(state, table_index);
            lua_gettable(state, index);

            *p++ = lua_toboolean(state, -1);

            lua_pop(state, 1);
        }

        return arr;
    }

    case LUA_TSTRING: {		/* array of strings */
        BBString **p;

        arr = bbArrayNew1D("$", len);
        p = (BBString**)BBARRAYDATA(arr, arr->dims);

        *p = bbStringFromCString(lua_tostring(state, -1));
        BBRETAIN((BBObject*)*p++);
        lua_pop(state, 1);

        for (; table_index <= len; ++table_index) {
            lua_pushinteger(state, table_index);
            lua_gettable(state, index);

            *p = bbStringFromCString(lua_tostring(state, -1));
            BBRETAIN((BBObject*)*p++);

            lua_pop(state, 1);
        }

        return arr;
    }

    case LUA_TTABLE:		/* array of arrays (arrays inside of arrays do not have to be the same type) */
    case LUA_TUSERDATA:
    {
        BBObject **p;

        arr = bbArrayNew1D(":Object", len);
        p = (BBObject**)BBARRAYDATA(arr, arr->dims);

        *p = lua_tobmaxobject(state, -1);
        BBRETAIN(*p++);
        lua_pop(state, 1);

        for (; table_index <= len; ++table_index) {
            lua_pushinteger(state, table_index);
            lua_gettable(state, index);

            *p = lua_tobmaxobject(state, -1);
            BBRETAIN(*p++);

            lua_pop(state, 1);
        }

        return arr;
    }

    default:
        luaL_error(state, ERRORSTR("@lua_tobmaxarray: Arrays of type %s are not unsupported"), lua_typename(state, lua_type(state, -1)));
        return &bbEmptyArray;
    } /* switch lua type */

    return arr;
} /* lua_tobmaxarray */
示例#23
0
static int lugi_newindex_array(lua_State *state) {
    if (lua_isnumber(state, 2) == 1) {
        BBArray *arr = lua_tobmaxarray(state, 1);

        lua_Integer index = lua_tointeger(state, 2);
        if ( index < 0 || arr->scales[0] <= index ) {
            return luaL_error(state, ERRORSTR("@lugi_newindex_array: Attempt to index array failed: index (%d) out of bounds"), index);
        }

        switch (arr->type[0]) {
        case 'b':	/* byte */
            if ( lua_isnumber(state, 3) ) {
                ((BBBYTE*)BBARRAYDATA(arr, arr->dims))[index] = (BBBYTE)lua_tointeger(state, 3);
            }
            else {
                return luaL_error(state, ERRORSTR("@lugi_newindex_array: Cannot assign value with type %s to element of byte array"), lua_typename(state, lua_type(state, 3)));
            }
            break;

        case 's':	/* short */
            if ( lua_isnumber(state, 3) ) {
                ((BBSHORT*)BBARRAYDATA(arr, arr->dims))[index] = (BBSHORT)lua_tointeger(state, 3);
            }
            else {
                return luaL_error(state, ERRORSTR("@lugi_newindex_array: Cannot assign value with type %s to element of short array"), lua_typename(state, lua_type(state, 3)));
            }
            break;

        case 'i':	/* int */
            if ( lua_isnumber(state, 3) ) {
                ((BBINT*)BBARRAYDATA(arr, arr->dims))[index] = (BBINT)lua_tointeger(state, 3);
            }
            else {
                return luaL_error(state, ERRORSTR("@lugi_newindex_array: Cannot assign value with type %s to element of integer array"), lua_typename(state, lua_type(state, 3)));
            }
            break;

        case 'l':	/* long */
            if ( lua_isnumber(state, 3) ) {
                ((BBLONG*)BBARRAYDATA(arr, arr->dims))[index] = (BBLONG)lua_tointeger(state, 3);
            }
            else {
                return luaL_error(state, ERRORSTR("@lugi_newindex_array: Cannot assign value with type %s to element of long array"), lua_typename(state, lua_type(state, 3)));
            }
            break;

        case 'f':	/* float */
            if ( lua_isnumber(state, 3) ) {
                ((BBFLOAT*)BBARRAYDATA(arr, arr->dims))[index] = (BBFLOAT)lua_tonumber(state, 3);
            }
            else {
                return luaL_error(state, ERRORSTR("@lugi_newindex_array: Cannot assign value with type %s to element of short array"), lua_typename(state, lua_type(state, 3)));
            }
            break;

        case 'd':	/* double */
            if ( lua_isnumber(state, 3) ) {
                ((BBDOUBLE*)BBARRAYDATA(arr, arr->dims))[index] = (BBDOUBLE)lua_tonumber(state, 3);
            }
            else {
                return luaL_error(state, ERRORSTR("@lugi_newindex_array: Cannot assign value with type %s to element of short array"), lua_typename(state, lua_type(state, 3)));
            }
            break;

        case '$':	/* string */
        {
            BBString **data = ((BBString**)BBARRAYDATA(arr, arr->dims));
            if ( lua_isstring(state, 3) ) {
                BBString *newstring = bbStringFromCString(lua_tostring(state, 3));
                BBRETAIN((BBObject*)newstring);
                BBRELEASE((BBObject*)data[index]);
                data[index] = newstring;
            }
            else if ( lua_isnil(state, 3 ) ) {
                BBRELEASE((BBObject*)data[index]);
                data[index] = &bbEmptyString;
            }
            else {
                return luaL_error(state, ERRORSTR("@lugi_newindex_array: Cannot assign value with type %s to element of string array"), lua_typename(state, lua_type(state, 3)));
            }
        }
        break;

        case ':':	/* any type of object */
        {
            BBObject *value = lua_tobmaxobject(state, 3);
            BBClass *arrclas = NULL;

            {   /* search for the array element type's class */
                const char *arrtypename = arr->type+1;
                int numTypes = 0;
                int regidx = 0;
                BBClass **regtypes = bbObjectRegisteredTypes(&numTypes);

                for (; regidx < numTypes; ++regidx) {
                    if ( strcmp(regtypes[regidx]->debug_scope->name, arrtypename) == 0 ) {
                        arrclas = regtypes[regidx];
                        break;
                    }
                }
            }

            if ( arrclas == NULL ) {
                return luaL_error(state, ERRORSTR("@lugi_newindex_array: Undefined array type encountered: %s"), arr->type);
            }

            value = bbObjectDowncast(value, arrclas);

            BBObject **data = (BBObject**)BBARRAYDATA(arr, arr->dims);
            BBRETAIN(value);
            BBRELEASE(data[index]);
            data[index] = value;
        }
        break;

        case '[': {
            BBArray *value = lua_tobmaxarray(state, 3);
            if ( (BBObject*)value == &bbNullObject ) {
                value = &bbEmptyArray;
            }

            if ( value == &bbEmptyArray || strcmp(arr->type+2, value->type) == 0 ) {
                BBArray **data = (BBArray**)BBARRAYDATA(arr, arr->dims);
                BBRETAIN((BBObject*)value);
                BBRELEASE((BBObject*)data[index]);
                data[index] = value;
            }
            else {
                return luaL_error(state, ERRORSTR("@lugi_newindex_array: Cannot assign array value to an element of an array of a differing type"));
            }
        }
        break;

        default:
            return luaL_error(state, ERRORSTR("@lugi_newindex_array: Unsupported array element type: %s"), arr->type);
        }

        return 0;
    } /* key is a valid type of index for an array */

    return luaL_error(state, ERRORSTR("@lugi_newindex_array: Invalid type for an array index (%s), must be an integer or a string convertible to an integer"), lua_typename(state, lua_type(state, 2)));
}
示例#24
0
文件: glue.cpp 项目: Chaduke/bah.mod
FMOD_RESULT bmx_FMOD_Channel_SetInputChannelMix(MAX_FMOD_CHANNEL *channel, BBArray * levels) {
	int n = levels->scales[0];
	float *f=(float*)BBARRAYDATA( levels, levels->dims );
	return FMOD_Channel_SetInputChannelMix(channel->channel, f, n);
}
示例#25
0
void bbStartup( int argc,char *argv[],void *dummy1,void *dummy2 ){

	int i,k;
	BBString **p;
	
	//Start up GC and create bbAppFile, bbAppDir and bbLaunchDir
	
#if _WIN32

	char *ebp;
	OSVERSIONINFO os={ sizeof(os) };
	
	//asm( "movl %%ebp,%0;":"=r"(ebp) );//::"%ebp" );
	
	//bbGCStackTop=ebp+28;
	
	// BaH bbThreadStartup();
	bbGCStartup();

	if( GetVersionEx( &os ) ){
		if( os.dwPlatformId==VER_PLATFORM_WIN32_NT ){
			_bbusew=1;
		}
	}
	
	if( _bbusew ){
		int e=0;
		wchar_t buf[MAX_PATH];
		
		_wgetcwd( buf,MAX_PATH );
		for( i=0;buf[i];++i ){
			if( buf[i]=='\\' ) buf[i]='/';
		}
		bbLaunchDir=bbStringFromWString( buf );
		
		GetModuleFileNameW( GetModuleHandleW(0),buf,MAX_PATH );
		for( i=0;buf[i];++i ){
			if( buf[i]=='\\' ) buf[i]='/';
			if( buf[i]=='/' ) e=i;
		}
		bbAppFile=bbStringFromWString( buf );

		if( e ){
			if( buf[e-1]==':' ) ++e;
			bbAppDir=bbStringFromShorts( buf,e );
		}else{
			bbAppDir=&bbEmptyString;
		}

		_wchdir( bbTmpWString( bbAppDir ) );
		
	}else{
		int e=0;
		char buf[MAX_PATH];

		_getcwd( buf,MAX_PATH );
		for( i=0;buf[i];++i ){
			if( buf[i]=='\\' ) buf[i]='/';
		}
		bbLaunchDir=bbStringFromCString( buf );
		
		GetModuleFileNameA( GetModuleHandleA(0),buf,MAX_PATH );
		for( i=0;buf[i];++i ){
			if( buf[i]=='\\' ) buf[i]='/';
			if( buf[i]=='/' ) e=i;
		}
		bbAppFile=bbStringFromCString( buf );

		if( e ){
			if( buf[e-1]==':' ) ++e;
			bbAppDir=bbStringFromBytes( buf,e );
		}else{
			bbAppDir=&bbEmptyString;
		}

		_chdir( bbTmpCString( bbAppDir ) );
	}

#elif __linux

	char *ebp;
	char buf[PATH_MAX];
	char lnk[PATH_MAX];
	pid_t pid;
	
	// asm( "movl %%ebp,%0;":"=r"(ebp) );//::"%ebp" );
	
	bbGCStackTop=ebp+28;
	
	// BaH bbThreadStartup();
	bbGCStartup();
	
	getcwd( buf,PATH_MAX );
	bbLaunchDir=bbStringFromUTF8String( buf );
	
	pid=getpid();
	sprintf( lnk,"/proc/%i/exe",pid );
	i=readlink( lnk,buf,PATH_MAX );
	if( i>0 ){
		char *p;
		buf[i]=0;
		bbAppFile=bbStringFromUTF8String( buf );
		p=strrchr( buf,'/' );
		if( p ){
			*p=0;
			bbAppDir=bbStringFromUTF8String( buf );
		}else{
			bbAppDir=&bbEmptyString;
		}
	}else{
		bbAppFile=&bbEmptyString;
		bbAppDir=&bbEmptyString;
	}
	
	chdir( bbTmpUTF8String( bbAppDir ) );
	
#elif __APPLE__
	
	CFURLRef url;
	char buf[PATH_MAX],*e;
	
//#if BB_ARGP
//	bbGCStackTop=bbArgp(0);
//#else
	bbGCStackTop=&argc;
//#endif

	// BaH bbThreadStartup();
	bbGCStartup();
	
	getcwd( buf,PATH_MAX );
	bbLaunchDir=bbStringFromUTF8String( buf );
	
	url=CFBundleCopyExecutableURL( CFBundleGetMainBundle() );
	CFURLGetFileSystemRepresentation( url,true,(UInt8*)buf,PATH_MAX );
	CFRelease( url );
	
	bbAppFile=bbStringFromUTF8String( buf );

	if( e=strstr( buf,".app/Contents/MacOS/" ) ){
		*e=0;
	}
	if( e=strrchr( buf,'/' ) ){
		*e=0;
		bbAppDir=bbStringFromUTF8String( buf );
	}else{
		bbAppDir=&bbEmptyString;
	}
	
	chdir( bbTmpUTF8String( bbAppDir ) );
	
#endif

	BBINCREFS( bbLaunchDir );
	BBINCREFS( bbAppDir );
	BBINCREFS( bbAppFile );

	bbAppTitle=bbStringFromCString( "BlitzMax Application" );
	BBINCREFS( bbAppTitle );

	bbAppArgs=bbArrayNew1D( "$",argc );
	BBINCREFS( bbAppArgs );

	p=(BBString**)BBARRAYDATA( bbAppArgs,1 );
	
	for( k=0;k<argc;++k ){
		BBString *arg=bbStringFromCString( argv[k] );
		BBINCREFS( arg );
		*p++=arg;
	}
	
	startup();
}
示例#26
0
文件: glue.cpp 项目: maxmods/wx.mod
void bmx_wxstatusbar_setstatuswidths(wxStatusBar * statusbar, BBArray * widths) {
	statusbar->SetStatusWidths(widths->scales[0], (int*)BBARRAYDATA( widths, widths->dims ));
}
示例#27
0
文件: glue.cpp 项目: Chaduke/bah.mod
FMOD_RESULT bmx_FMOD_Sound_SetSubSoundSentence(FMOD_SOUND * sound, BBArray * soundList) {
	int length = soundList->scales[0];
	int *s=(int*)BBARRAYDATA( soundList, soundList->dims );

	return FMOD_Sound_SetSubSoundSentence(sound, s, length);
}
示例#28
0
文件: glue.cpp 项目: Chaduke/bah.mod
BBArray * bmx_bass_channelgettags(DWORD handle, DWORD tags) {
	const char * text;
	TAG_ID3 *id3;
	
	switch (tags) {
		case BASS_TAG_ID3:
			id3 = (TAG_ID3*) BASS_ChannelGetTags(handle, BASS_TAG_ID3); // get the ID3 tags
			if (id3) {
				
				char buffer[4];
				
				BBArray * p = bbArrayNew1D("$", 7);
				BBString **s = (BBString**)BBARRAYDATA( p,p->dims );
							
				sprintf(buffer, "%.3s", id3->id);
				s[0] = bbStringFromCString(buffer);
				BBRETAIN( s[0] );
				
				s[1] = bbStringFromCString(id3->title);
				BBRETAIN( s[1] );
				
				s[2] = bbStringFromCString(id3->artist);
				BBRETAIN( s[2] );
				
				s[3] = bbStringFromCString(id3->album);
				BBRETAIN( s[3] );
	
				sprintf(buffer, "%.4s", id3->year);
				s[4] = bbStringFromCString(buffer);
				BBRETAIN( s[4] );
				
				s[5] = bbStringFromCString(id3->comment);
				BBRETAIN( s[5] );
							
				sprintf(buffer, "%d", id3->genre);
				s[6] = bbStringFromCString(buffer);
				BBRETAIN( s[6] );
				
				return p;
			} else {
				return &bbEmptyArray;
			}
		case BASS_TAG_META:
		case BASS_TAG_LYRICS3:
		case BASS_TAG_VENDOR:
		case BASS_TAG_MUSIC_NAME:
		case BASS_TAG_MUSIC_MESSAGE:
			text = BASS_ChannelGetTags(handle, tags);

			if (text) {
				BBArray * p = bbArrayNew1D("$", 1);
				BBString **s = (BBString**)BBARRAYDATA( p,p->dims );
				
				s[0] = bbStringFromCString( text );
				BBRETAIN( s[0] );

				return p;
			} else {
				return &bbEmptyArray;
			}
		
		default:
			text = BASS_ChannelGetTags(handle, tags);
			
			if (text) {
				int count = 0;
				const char * current = text;
				
				while (*current) {
					current += strlen(current) + 1;
					count++;
				}
				
				BBArray * p = bbArrayNew1D("$", count);
				BBString **s = (BBString**)BBARRAYDATA( p,p->dims );
				
				count = 0;
				current = text;
				while (*current) {
					s[count] = bbStringFromCString( current );
					BBRETAIN( s[count] );
		
					current += strlen(current) + 1;
					count++;
				}
				
				return p;
			
			} else {
				return &bbEmptyArray;
			}
	}
}
示例#29
0
MaxPalette * bmx_wxpalette_create(BBArray * r, BBArray * g, BBArray *b) {
	wxPalette p(r->scales[0], (unsigned char*)BBARRAYDATA( r,r->dims ),
		(unsigned char*)BBARRAYDATA( g,g->dims ), (unsigned char*)BBARRAYDATA( b,b->dims ));
	return new MaxPalette(p);
}
示例#30
0
BBArray *bbArraySlice( const char *type,BBArray *inarr,int beg,int end ){

	char *p;
	void *init;
	BBArray *arr;
	int n,k,el_size;
	int length=end-beg;

	if( length<=0 ) return &bbEmptyArray;
	
	arr=allocateArray( type,1,&length );

	el_size=arr->size/length;
	
	init=arrayInitializer( arr );
	p=(char*)BBARRAYDATA( arr,1 );

	n=-beg;
	if( n>0 ){
		if( beg+n>end ) n=end-beg;
		if( init ){
			void **dst=(void**)p;
			for( k=0;k<n;++k ) *dst++=init;
			p=(char*)dst;
		}else{
			memset( p,0,n*el_size );
			p+=n*el_size;
		}
		beg+=n;
		if( beg==end ) return arr;
	}
	n=inarr->scales[0]-beg;
	if( n>0 ){
		if( beg+n>end ) n=end-beg;
#ifdef BB_GC_RC
		if( type[0]==':' || type[0]=='$' || type[0]=='[' ){
			BBObject **dst=(BBObject**)p;
			BBObject **src=(BBObject**)BBARRAYDATA(inarr,inarr->dims)+beg;
			for( k=0;k<n;++k ){ 
				BBObject *o=*src++;
				BBINCREFS( o );
				*dst++=o; 
			}
			p=(char*)dst;
		}else{
			memcpy( p,(char*)BBARRAYDATA(inarr,inarr->dims)+beg*el_size,n*el_size );
			p+=n*el_size;
		}
#else
		memcpy( p,(char*)BBARRAYDATA(inarr,inarr->dims)+beg*el_size,n*el_size );
		p+=n*el_size;
#endif
		beg+=n;
		if( beg==end ) return arr;
	}
	n=end-beg;
	if( n>0 ){
		if( init ){
			void **dst=(void**)p;
			for( k=0;k<n;++k ) *dst++=init;
		}else{
			memset( p,0,n*el_size );
		}
	}
	return arr;
}