911f98ffaa
tweak some dp compatibility things. probably futile. moved ode to a plugin. added screenshot_mega command to take massive screenshots that are not tied to current video mode. removed offscreen-gecko code completely. added cvars to rescale offsetmapping from paletted sources, so it can be disabled where its ugly. added support for zip weak encryption. the password defaults to 'thisispublic'. nothing is fool-proof. gl: fix stereoscopic rendering. gl: fix rendertargets with depth. qc: added support for named builtins that do not have any specific number. qc: added some new builtins. drawrotpic, drawtextfield, search_getfilemtime, and a few others. qc: PF_Fixme now attempts to figure out which builtin you tried to call, for more friendly fatal error messages. qccgui: stepover and stepout are now implemented, as is setnextstatement. qccgui: added a way to annotate code with the asm statements generated from them. qccgui: fixed double-clicking a src file. qccgui: handles multiple .src files more usefully. git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@4832 fc73d0e0-1445-4013-8a0c-d673dee63da5
242 lines
3.9 KiB
C
242 lines
3.9 KiB
C
//compile routines
|
|
|
|
#include "qcc.h"
|
|
#undef progfuncs
|
|
|
|
char errorfile[128];
|
|
int errorline;
|
|
|
|
progfuncs_t *qccprogfuncs;
|
|
|
|
#include <setjmp.h>
|
|
|
|
extern int qcc_compileactive;
|
|
jmp_buf qcccompileerror;
|
|
char qcc_gamedir[128];
|
|
void QCC_PR_ResetErrorScope(void);
|
|
|
|
|
|
|
|
#if defined(MINIMAL) || defined(OMIT_QCC)
|
|
|
|
#else
|
|
|
|
int qccalloced;
|
|
int qcchunksize;
|
|
char *qcchunk;
|
|
void *qccHunkAlloc(size_t mem)
|
|
{
|
|
mem = (mem + 7)&~7;
|
|
|
|
qccalloced+=mem;
|
|
if (qccalloced > qcchunksize)
|
|
QCC_Error(ERR_INTERNAL, "Compile hunk was filled");
|
|
|
|
memset(qcchunk+qccalloced-mem, 0, mem);
|
|
return qcchunk+qccalloced-mem;
|
|
}
|
|
void qccClearHunk(void)
|
|
{
|
|
if (qcchunk)
|
|
{
|
|
free(qcchunk);
|
|
qcchunk=NULL;
|
|
}
|
|
}
|
|
int qccpersisthunk;
|
|
void PostCompile(void)
|
|
{
|
|
if (!qccpersisthunk)
|
|
qccClearHunk();
|
|
QCC_PR_CloseProcessor();
|
|
QCC_Cleanup();
|
|
|
|
if (asmfile)
|
|
{
|
|
fclose(asmfile);
|
|
asmfile = NULL;
|
|
}
|
|
}
|
|
pbool PreCompile(void)
|
|
{
|
|
QCC_PR_ResetErrorScope();
|
|
|
|
qccClearHunk();
|
|
strcpy(qcc_gamedir, "");
|
|
qcchunk = malloc(qcchunksize=128*1024*1024);
|
|
while(!qcchunk && qcchunksize > 8*1024*1024)
|
|
{
|
|
qcchunksize /= 2;
|
|
qcchunk = malloc(qcchunksize);
|
|
}
|
|
qccalloced=0;
|
|
|
|
return !!qcchunk;
|
|
}
|
|
|
|
pbool QCC_main (int argc, char **argv);
|
|
void QCC_ContinueCompile(void);
|
|
void QCC_FinishCompile(void);
|
|
|
|
int comp_nump;char **comp_parms;
|
|
//void Editor(char *fname, int line, int numparms, char **compileparms);
|
|
pbool CompileParams(progfuncs_t *progfuncs, int doall, int nump, char **parms)
|
|
{
|
|
comp_nump = nump;
|
|
comp_parms = parms;
|
|
*errorfile = '\0';
|
|
qccprogfuncs = progfuncs;
|
|
if (setjmp(qcccompileerror))
|
|
{
|
|
PostCompile();
|
|
if (*errorfile)
|
|
{
|
|
printf("Error in %s on line %i\n", errorfile, errorline);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
if (!QCC_main(nump, parms))
|
|
return false;
|
|
|
|
while(qcc_compileactive)
|
|
QCC_ContinueCompile();
|
|
|
|
PostCompile();
|
|
|
|
return true;
|
|
}
|
|
int PDECL Comp_Begin(pubprogfuncs_t *progfuncs, int nump, char **parms)
|
|
{
|
|
comp_nump = nump;
|
|
comp_parms = parms;
|
|
qccprogfuncs = (progfuncs_t*)progfuncs;
|
|
*errorfile = '\0';
|
|
if (setjmp(qcccompileerror))
|
|
{
|
|
PostCompile();
|
|
return false;
|
|
}
|
|
|
|
if (!QCC_main(nump, parms))
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
int PDECL Comp_Continue(pubprogfuncs_t *progfuncs)
|
|
{
|
|
qccprogfuncs = (progfuncs_t *)progfuncs;
|
|
if (setjmp(qcccompileerror))
|
|
{
|
|
PostCompile();
|
|
return false;
|
|
}
|
|
|
|
if (qcc_compileactive)
|
|
QCC_ContinueCompile();
|
|
else
|
|
{
|
|
PostCompile();
|
|
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
#endif
|
|
pbool CompileFile(progfuncs_t *progfuncs, const char *filename)
|
|
{
|
|
#if defined(MINIMAL) || defined(OMIT_QCC)
|
|
return false;
|
|
#else
|
|
char srcfile[32];
|
|
char newname[32];
|
|
static char *p[5];
|
|
int parms;
|
|
char *s, *s2;
|
|
|
|
p[0] = NULL;
|
|
parms = 1;
|
|
|
|
strcpy(newname, filename);
|
|
s = newname;
|
|
if (strchr(s+1, '/'))
|
|
{
|
|
while(1)
|
|
{
|
|
s2 = strchr(s+1, '/');
|
|
if (!s2)
|
|
{
|
|
*s = '\0';
|
|
break;
|
|
}
|
|
s = s2;
|
|
}
|
|
p[parms] = "-src";
|
|
p[parms+1] = newname;
|
|
parms+=2;
|
|
|
|
strcpy(srcfile, s+1);
|
|
srcfile[strlen(srcfile)-4] = '\0';
|
|
strcat(srcfile, ".src");
|
|
|
|
if (externs->FileSize(qcva("%s/%s", newname, srcfile))>0)
|
|
{
|
|
p[parms] = "-srcfile";
|
|
p[parms+1] = srcfile;
|
|
parms+=2;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
p[parms] = "-srcfile";
|
|
p[parms+1] = newname;
|
|
newname[strlen(newname)-4] = '\0';
|
|
strcat(newname, ".src");
|
|
parms+=2;
|
|
}
|
|
// p[2][strlen(p[2])-4] = '\0';
|
|
// strcat(p[2], "/");
|
|
|
|
while (!CompileParams(progfuncs, true, parms, p))
|
|
{
|
|
return false;
|
|
}
|
|
return true;
|
|
#endif
|
|
}
|
|
|
|
int QC_strncasecmp(const char *s1, const char *s2, int n)
|
|
{
|
|
int c1, c2;
|
|
|
|
while (1)
|
|
{
|
|
c1 = *s1++;
|
|
c2 = *s2++;
|
|
|
|
if (!n--)
|
|
return 0; // strings are equal until end point
|
|
|
|
if (c1 != c2)
|
|
{
|
|
if (c1 >= 'a' && c1 <= 'z')
|
|
c1 -= ('a' - 'A');
|
|
if (c2 >= 'a' && c2 <= 'z')
|
|
c2 -= ('a' - 'A');
|
|
if (c1 != c2)
|
|
return -1; // strings not equal
|
|
}
|
|
if (!c1)
|
|
return 0; // strings are equal
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
void editbadfile(char *fname, int line)
|
|
{
|
|
strcpy(errorfile, fname);
|
|
errorline = line;
|
|
}
|
|
|