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; }
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); }
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; }
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; }
/* 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 */
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(); }
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; } } }