mirror of
https://github.com/nzp-team/fteqw.git
synced 2024-11-30 07:31:13 +00:00
0bda1b5c38
Try to fix issues with newer gcc not merging common symbols any more. git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5720 fc73d0e0-1445-4013-8a0c-d673dee63da5
200 lines
4.3 KiB
C
200 lines
4.3 KiB
C
#include "qcc.h"
|
|
|
|
#include <stdarg.h>
|
|
#include <stdio.h>
|
|
|
|
#if defined(__linux__) || defined(__unix__)
|
|
#include <unistd.h>
|
|
#endif
|
|
|
|
/*
|
|
==============
|
|
LoadFile
|
|
==============
|
|
*/
|
|
static void *QCC_ReadFile(const char *fname, unsigned char *(*buf_get)(void *ctx, size_t len), void *buf_ctx, size_t *out_size, pbool issourcefile)
|
|
//unsigned char *PDECL QCC_ReadFile (const char *fname, void *buffer, int len, size_t *sz)
|
|
{
|
|
size_t len;
|
|
FILE *f;
|
|
char *buffer;
|
|
|
|
f = fopen(fname, "rb");
|
|
if (!f)
|
|
{
|
|
if (out_size)
|
|
*out_size = 0;
|
|
return NULL;
|
|
}
|
|
|
|
fseek(f, 0, SEEK_END);
|
|
len = ftell(f);
|
|
fseek(f, 0, SEEK_SET);
|
|
if (buf_get)
|
|
buffer = buf_get(buf_ctx, len+1);
|
|
else
|
|
buffer = malloc(len+1);
|
|
((char*)buffer)[len] = 0;
|
|
if (len != fread(buffer, 1, len, f))
|
|
{
|
|
if (!buf_get)
|
|
free(buffer);
|
|
buffer = NULL;
|
|
}
|
|
fclose(f);
|
|
|
|
if (out_size)
|
|
*out_size = len;
|
|
return buffer;
|
|
}
|
|
static int PDECL QCC_FileSize (const char *fname)
|
|
{
|
|
long length;
|
|
FILE *f;
|
|
f = fopen(fname, "rb");
|
|
if (!f)
|
|
return -1;
|
|
fseek(f, 0, SEEK_END);
|
|
length = ftell(f);
|
|
fclose(f);
|
|
|
|
return length;
|
|
}
|
|
|
|
static pbool PDECL QCC_WriteFile (const char *name, void *data, int len)
|
|
{
|
|
long length;
|
|
FILE *f;
|
|
f = fopen(name, "wb");
|
|
if (!f)
|
|
return false;
|
|
length = fwrite(data, 1, len, f);
|
|
fclose(f);
|
|
|
|
if (length != len)
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
#undef printf
|
|
#undef Sys_Error
|
|
|
|
static void PDECL Sys_Error(const char *text, ...)
|
|
{
|
|
va_list argptr;
|
|
static char msg[2048];
|
|
|
|
va_start (argptr,text);
|
|
QC_vsnprintf (msg,sizeof(msg)-1, text,argptr);
|
|
va_end (argptr);
|
|
|
|
QCC_Error(ERR_INTERNAL, "%s", msg);
|
|
}
|
|
|
|
|
|
static FILE *logfile;
|
|
static int logprintf(const char *format, ...)
|
|
{
|
|
va_list argptr;
|
|
static char string[1024];
|
|
|
|
va_start (argptr, format);
|
|
#ifdef _WIN32
|
|
_vsnprintf (string,sizeof(string)-1, format,argptr);
|
|
#else
|
|
vsnprintf (string,sizeof(string), format,argptr);
|
|
#endif
|
|
va_end (argptr);
|
|
|
|
printf("%s", string);
|
|
// fputs(string, stderr);
|
|
if (logfile)
|
|
fputs(string, logfile);
|
|
|
|
return 0;
|
|
}
|
|
|
|
int main (int argc, const char **argv)
|
|
{
|
|
unsigned int i;
|
|
pbool sucess;
|
|
#if 0//def _WIN32
|
|
pbool writelog = true; //spew log files on windows. windows often closes the window as soon as the program ends making its output otherwise unreadable.
|
|
#else
|
|
pbool writelog = false; //other systems are sane.
|
|
#endif
|
|
int colours = 2; //auto
|
|
progexterns_t ext;
|
|
progfuncs_t funcs;
|
|
progfuncs = &funcs;
|
|
memset(&funcs, 0, sizeof(funcs));
|
|
funcs.funcs.parms = &ext;
|
|
memset(&ext, 0, sizeof(progexterns_t));
|
|
funcs.funcs.parms->ReadFile = QCC_ReadFile;
|
|
funcs.funcs.parms->FileSize = QCC_FileSize;
|
|
funcs.funcs.parms->WriteFile = QCC_WriteFile;
|
|
funcs.funcs.parms->Printf = logprintf;
|
|
funcs.funcs.parms->Sys_Error = Sys_Error;
|
|
|
|
for (i = 0; i < argc; i++)
|
|
{
|
|
if (!argv[i])
|
|
continue;
|
|
if (!strcmp(argv[i], "-log"))
|
|
writelog = true;
|
|
else if (!strcmp(argv[i], "-nolog"))
|
|
writelog = false;
|
|
|
|
//arg consistency with ls
|
|
else if (!strcmp(argv[i], "--color=always") || !strcmp(argv[i], "--color"))
|
|
colours = 1;
|
|
else if (!strcmp(argv[i], "--color=never"))
|
|
colours = 0;
|
|
else if (!strcmp(argv[i], "--color=auto"))
|
|
colours = 2;
|
|
}
|
|
#if defined(__linux__) || defined(__unix__)
|
|
if (colours == 2)
|
|
colours = isatty(STDOUT_FILENO);
|
|
if (colours)
|
|
{ //only use colours if its a tty, and not if we're redirected.
|
|
col_none = "\e[0;m"; //reset to white
|
|
col_error = "\e[0;31m"; //red
|
|
col_symbol = "\e[0;32m"; //green
|
|
col_warning = "\e[0;33m"; //yellow
|
|
//col_ = "\e[0;34m"; //blue
|
|
col_name = "\e[0;35m"; //magenta
|
|
//col_ = "\e[0;36m"; //cyan
|
|
col_location = "\e[0;1;37m"; //bright white
|
|
}
|
|
#else
|
|
(void)colours;
|
|
#endif
|
|
|
|
logfile = writelog?fopen("fteqcc.log", "wt"):false;
|
|
|
|
if (logfile)
|
|
{
|
|
fputs("Args:", logfile);
|
|
for (i = 0; i < argc; i++)
|
|
{
|
|
if (!argv[i])
|
|
continue;
|
|
if (strchr(argv[i], ' '))
|
|
fprintf(logfile, " \"%s\"", argv[i]);
|
|
else
|
|
fprintf(logfile, " %s", argv[i]);
|
|
}
|
|
fprintf(logfile, "\n");
|
|
}
|
|
sucess = CompileParams(&funcs, NULL, argc, argv);
|
|
qccClearHunk();
|
|
if (logfile)
|
|
fclose(logfile);
|
|
|
|
#ifdef _WIN32
|
|
// fgetc(stdin); //wait for keypress
|
|
#endif
|
|
return sucess?EXIT_SUCCESS:EXIT_FAILURE;
|
|
}
|