blitz3d/blitzide/libs.cpp

125 lines
2.7 KiB
C++

#include "stdafx.h"
#include "libs.h"
#include "editor.h"
#include "blitzide.h"
static map<string,string> keyhelps;
int linker_ver,runtime_ver;
static string execProc( const string &proc ){
HANDLE rd,wr;
SECURITY_ATTRIBUTES sa={sizeof(sa),0,true};
if( CreatePipe( &rd,&wr,&sa,0 ) ){
STARTUPINFO si={sizeof(si)};
si.dwFlags=STARTF_USESTDHANDLES;
si.hStdOutput=si.hStdError=wr;
PROCESS_INFORMATION pi={0};
if( CreateProcess( 0,(char*)proc.c_str(),0,0,true,DETACHED_PROCESS,0,0,&si,&pi ) ){
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
CloseHandle( wr );
string t;
char *buf=new char[1024];
for(;;){
unsigned long sz;
int n=ReadFile( rd,buf,1024,&sz,0 );
if( !n && GetLastError()==ERROR_BROKEN_PIPE ) break;
if( !n ){ t="";break; }
if( !sz ) break;
t+=string( buf,sz );
}
delete[] buf;
CloseHandle(rd);
return t;
}
CloseHandle( rd );
CloseHandle( wr );
}
AfxMessageBox( (proc+" failed").c_str() );
ExitProcess(0);
return "";
}
int version( string vers,string t ){
t+=" version:";
int n=vers.find( t );n+=t.size();
int maj=atoi( vers.substr(n) );n=vers.find( '.',n )+1;
int min=atoi( vers.substr(n) );
return maj*100+min;
}
void initLibs(){
string valid=execProc( prefs.homeDir+"/bin/blitzcc -q" );
if( valid.size() ){
AfxMessageBox( ("Compiler environment error: "+valid).c_str() );
ExitProcess(0);
}
string vers=tolower( execProc( prefs.homeDir+"/bin/blitzcc -v" ) );
linker_ver=version( vers,"linker" );
runtime_ver=version( vers,"runtime" );
//generate keywords!
string kws=execProc( prefs.homeDir+"/bin/blitzcc +k" );
if( !kws.size() ){
AfxMessageBox( "Error generating keywords" );
ExitProcess(0);
}
int pos=0,n;
while( (n=kws.find( '\n',pos ))!=string::npos ){
string t=kws.substr( pos,n-pos-1 );
for( int q=0;(q=t.find('\r',q))!=string::npos; ) t=t.replace( q,1,"" );
string help=t;
int i=t.find(' ');
if( i!=string::npos ){
t=t.substr(0,i);if( !t.size() ){
AfxMessageBox( "Error in keywords" );
ExitProcess(0);
}
if( !isalnum(t[t.size()-1]) ) t=t.substr(0,t.size()-1);
}
Editor::addKeyword(t);
keyhelps[t]=help;
pos=n+1;
}
}
string quickHelp( const string &kw ){
map<string,string>::const_iterator it=keyhelps.find(kw);
return it==keyhelps.end() ? "" : it->second;
}
bool isMediaFile( const string &f ){
#ifndef PRO
return false;
#endif
static char *exts[]={
"bmp","jpg","png","tga","iff","pcx",
"wav","mid","mp3","mod","s3m","xm","it","rmi","sgt",
"x","3ds",0
};
int i=f.rfind( '.' );
if( i==string::npos || i+1==f.size() ) return false;
string ext=f.substr( i+1 );
char **p=exts;
while( const char *e=*p++ ){
string t(e);
if( i+t.size()+1!=f.size() ) continue;
if( ext==t ) return true;
}
return false;
}