Files
BlitzNext/ide/libs.cpp
T
Michael Fabian 'Xaymar' Dirks c2f795e4ef ide, launcher: Move to new directory
2019-01-19 18:31:46 +01:00

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;
}