Beispiel #1
0
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;
}
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;
}
Beispiel #3
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);

}
Beispiel #4
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;
}
Beispiel #5
0
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;
}
Beispiel #6
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 */
Beispiel #7
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();
}
Beispiel #8
0
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;
			}
	}
}