mirror of
https://github.com/nzp-team/fteqw.git
synced 2024-11-14 00:10:46 +00:00
fc82e561be
Fixes for class support. Its actually usable now. Seriously! I've even modified my menu code to use it! Why don't you believe me? Fixes for structs+pointers. Added warnings for comparisons against incompatible function etc types. This'll probably generate a load of th_pain warnings in vanilla code. git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@4383 fc73d0e0-1445-4013-8a0c-d673dee63da5
253 lines
4.4 KiB
C
253 lines
4.4 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();
|
|
|
|
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;
|
|
}
|
|
|
|
void 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)
|
|
{
|
|
if (!externs->useeditor)
|
|
printf("Error in %s on line %i\n", errorfile, errorline);
|
|
else
|
|
externs->useeditor(&progfuncs->funcs, errorfile, errorline, 0, nump, parms);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
if (!PreCompile())
|
|
return false;
|
|
QCC_main(nump, parms);
|
|
|
|
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();
|
|
if (*errorfile)
|
|
progfuncs->parms->useeditor(&qccprogfuncs->funcs, errorfile, errorline, 0, nump, parms);
|
|
return false;
|
|
}
|
|
|
|
if (!PreCompile())
|
|
return false;
|
|
QCC_main(nump, parms);
|
|
|
|
return true;
|
|
}
|
|
int PDECL Comp_Continue(pubprogfuncs_t *progfuncs)
|
|
{
|
|
qccprogfuncs = (progfuncs_t *)progfuncs;
|
|
if (setjmp(qcccompileerror))
|
|
{
|
|
PostCompile();
|
|
if (*errorfile && progfuncs->parms->useeditor)
|
|
progfuncs->parms->useeditor(progfuncs, errorfile, errorline, 0, comp_nump, comp_parms);
|
|
return false;
|
|
}
|
|
|
|
if (qcc_compileactive)
|
|
QCC_ContinueCompile();
|
|
else
|
|
{
|
|
PostCompile();
|
|
|
|
if (*errorfile && progfuncs->parms->useeditor)
|
|
progfuncs->parms->useeditor(progfuncs, errorfile, errorline, 0 , comp_nump, comp_parms);
|
|
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
#endif
|
|
pbool CompileFile(progfuncs_t *progfuncs, 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;
|
|
}
|
|
|