138 lines
2.9 KiB
C++
138 lines
2.9 KiB
C++
|
|
#include "libs.h"
|
|
#include "blitzide.h"
|
|
#include "editor.h"
|
|
#include "stdafx.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;
|
|
}
|