BBString * bmx_stringbuilder_right(struct MaxStringBuilder * buf, int length) { if (length <= 0) { return &bbEmptyString; } else if (length >= buf->count) { return bbStringFromShorts(buf->buffer, buf->count); } else { return bbStringFromShorts(buf->buffer + (buf->count - length), length); } }
BBString *bbStringFromUTF8String( const char *p ){ int c,n; short *d,*q; BBString *str; if( !p ) return &bbEmptyString; n=strlen(p); d=(short*)malloc( n*2 ); q=d; while( c=*p++ & 0xff ){ if( c<0x80 ){ *q++=c; }else{ int d=*p++ & 0x3f; if( c<0xe0 ){ *q++=((c&31)<<6) | d; }else{ int e=*p++ & 0x3f; if( c<0xf0 ){ *q++=((c&15)<<12) | (d<<6) | e; }else{ int f=*p++ & 0x3f; int v=((c&7)<<18) | (d<<12) | (e<<6) | f; if( v & 0xffff0000 ) bbExThrowCString( "Unicode character out of UCS-2 range" ); *q++=v; } } } } str=bbStringFromShorts( d,q-d ); free( d ); return str; }
BBString * bmx_stringbuffer_tostring(struct MaxStringBuffer * buf) { if (!buf->count) { return &bbEmptyString; } else { return bbStringFromShorts(buf->buffer, buf->count); } }
BBString *bbStringTrim( BBString *str ){ int b=0,e=str->length; while( b<e && str->buf[b]<=' ' ) ++b; if( b==e ) return &bbEmptyString; while( str->buf[e-1]<=' ' ) --e; if( e-b==str->length ) return str; return bbStringFromShorts( str->buf+b,e-b ); }
BBString *bbStringFromVariant2(VARIANT *v){ unsigned short *w; int n; if (v->vt!=VT_BSTR) return 0; w=(unsigned short*)v->bstrVal; n=0; while (w[n++]) {} return bbStringFromShorts(w,n-1); }
BBString * bbStringFromPath(boost::filesystem::path & path) { std::wstring s(path.generic_wstring()); int l = s.size(); unsigned short buf[l]; for (int i = 0; i < l; i++) { buf[i] = s[i]; } return bbStringFromShorts(buf, l); }
BBString * bmx_stringbuffer_substring(struct MaxStringBuffer * buf, int beginIndex, int endIndex) { if (!endIndex) { endIndex = buf->count; } if (beginIndex < 0 || endIndex > buf->count || endIndex < beginIndex) { return &bbEmptyString; } return bbStringFromShorts(buf->buffer + beginIndex, endIndex - beginIndex); }
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; }
BBString *bbStringFromWString( const BBChar *p ){ return p ? bbStringFromShorts( p,wstrlen(p) ) : &bbEmptyString; }
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(); }