#include "stdafx.h" #include "libs.h" #include "editor.h" #include "blitzide.h" static map 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::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; }