what you give them. Help stamp out software-hoarding!
-------------------------------------------------------------------------*/
+//#define USE_SYSTEM_SYSTEM_CALLS
+
#include "common.h"
#include <ctype.h>
+#include "newalloc.h"
+#include "SDCCerr.h"
#if NATIVE_WIN32
#include <process.h>
#endif
// This is a bit messy because we define link ourself
-#define link NoLiNk
+#if !defined(__BORLANDC__) && !defined(_MSC_VER)
+
#include <unistd.h>
-#undef link
+
+#else
+// No unistd.h in Borland C++
+extern int access(const char *, int);
+#define X_OK 1
+
+#endif
//REMOVE ME!!!
extern int yyparse();
bool verboseExec = FALSE;
char *preOutName;
+// In MSC VC6 default search path for exe's to path for this
+
+#if defined(_MSC_VER)
+
+char DefaultExePath[_MAX_PATH] ;
+
+#endif
+
/* Far functions, far data */
#define OPTION_LARGE_MODEL "-model-large"
/* Far functions, near data */
#define OPTION_NOSTDLIB "-nostdlib"
#define OPTION_NOSTDINC "-nostdinc"
#define OPTION_VERBOSE "-verbose"
+#define OPTION_ANSIINT "-ansiint"
static const char *_preCmd[] = {
"sdcpp", "-Wall", "-lang-c++", "-DSDCC=1",
"$l", "-I" SDCC_INCLUDE_DIR, "$1", "$2", NULL
#if !OPT_DISABLE_DS390
&ds390_port,
#endif
+#if !OPT_DISABLE_PIC
+ &pic14_port,
+#endif
+#if !OPT_DISABLE_I186
+ &i186_port,
+#endif
+#if !OPT_DISABLE_TLCS900H
+ &tlcs900h_port,
+#endif
};
#define NUM_PORTS (sizeof(_ports)/sizeof(_ports[0]))
+/**
+ remove me - TSD a hack to force sdcc to generate gpasm format .asm files.
+ */
+extern void pic14glue();
+
/** Sets the port to the one given by the command line option.
@param The name minus the option (eg 'mcs51')
@return 0 on success.
exit(1);
}
+static void _validatePorts(void)
+{
+ int i;
+ for (i=0; i<NUM_PORTS; i++) {
+ if (_ports[i]->magic != PORT_MAGIC) {
+ printf("Error: port %s is incomplete.\n", _ports[i]->target);
+ wassert(0);
+ }
+ }
+}
+
+#ifdef USE_SYSTEM_SYSTEM_CALLS
+void buildCmdLine(char *into, const char **cmds,
+ const char *p1, const char *p2,
+ const char *p3, const char **list)
+{
+ const char *p, *from;
+
+ *into = '\0';
+
+ while (*cmds) {
+
+ from = *cmds;
+ cmds++;
+
+ /* See if it has a '$' anywhere - if not, just copy */
+ if ((p = strchr(from, '$'))) {
+ strncat(into, from, p - from);
+ /* seperate it */
+ strcat(into, " ");
+ from = p+2;
+ p++;
+ switch (*p) {
+ case '1':
+ if (p1)
+ strcat(into, p1);
+ break;
+ case '2':
+ if (p2)
+ strcat(into, p2);
+ break;
+ case '3':
+ if (p3)
+ strcat(into, p3);
+ break;
+ case 'l': {
+ const char **tmp = list;
+ if (tmp) {
+ while (*tmp) {
+ strcat(into, *tmp);
+ strcat(into, " ");
+ tmp++;
+ }
+ }
+ break;
+ }
+ default:
+ assert(0);
+ }
+ }
+ strcat(into, from); // this includes the ".asm" from "$1.asm"
+ strcat(into, " ");
+ }
+}
+#else
void buildCmdLine(char *into, char **args, const char **cmds,
const char *p1, const char *p2,
const char *p3, const char **list)
}
*args = NULL;
}
+#endif
/*-----------------------------------------------------------------*/
/* printVersionInfo - prints the version info */
/* get rid of the "." */
strtok(buffer,".");
- ALLOC_ATOMIC(srcFileName,strlen(buffer)+1);
+ srcFileName = Safe_calloc(strlen(buffer)+1);
strcpy(srcFileName,buffer);
/* get rid of any path information
*(fext-1) != '/' &&
*(fext-1) != ':')
fext--;
- ALLOC_ATOMIC(moduleName,strlen(fext)+1);
+ moduleName = Safe_calloc(strlen(fext)+1);
strcpy(moduleName,fext);
return ;
options.verbose=1;
continue;
}
+
+ if (strcmp(&argv[i][1],OPTION_ANSIINT) == 0) {
+ options.ANSIint=1;
+ continue;
+ }
if (!port->parseOption(&argc, argv, &i))
{
/*-----------------------------------------------------------------*/
/* my_system - will call a program with arguments */
/*-----------------------------------------------------------------*/
-char *try_dir[]= {SRCDIR "/bin",PREFIX "/bin", NULL};
+
+#if defined(_MSC_VER)
+
+char *try_dir[]= {DefaultExePath, NULL}; // TODO : Fill in some default search list
+
+#else
+
+//char *try_dir[]= {SRCDIR "/bin",PREFIX "/bin", NULL};
+char *try_dir[]= {NULL};
+
+#endif
+
+#ifdef USE_SYSTEM_SYSTEM_CALLS
+int my_system (const char *cmd)
+{
+ int argsStart, e, i=0;
+ char *cmdLine=NULL;
+
+ argsStart=strstr(cmd, " ")-cmd;
+
+ // try to find the command in predefined path's
+ while (try_dir[i]) {
+ cmdLine = (char*)malloc(strlen(try_dir[i])+strlen(cmd)+10);
+ strcpy(cmdLine, try_dir[i]); // the path
+ strcat(cmdLine, "/");
+ strncat(cmdLine, cmd, argsStart); // the command
+#if NATIVE_WIN32
+ strcat(cmdLine, ".exe");
+ /* Mung slashes into backslashes to keep WIndoze happy. */
+ {
+ char *r=cmdLine;
+ while (*r) {
+ if (*r == '/') {
+ *r = '\\';
+ }
+ r++;
+ }
+ }
+#endif
+ if (access(cmdLine, X_OK) == 0) {
+ // the arguments
+ strcat(cmdLine, cmd+argsStart);
+ break;
+ }
+ free(cmdLine);
+ cmdLine=NULL;
+ i++;
+ }
+
+ if (verboseExec) {
+ printf ("+ %s\n", cmdLine ? cmdLine : cmd);
+ }
+
+ if (cmdLine) {
+ // command found in predefined path
+ e=system(cmdLine);
+ free(cmdLine);
+ } else {
+ // trust on $PATH
+ e=system(cmd);
+ }
+ return e;
+}
+
+#else
+
int my_system (const char *cmd, char **cmd_argv)
{
char *dir, *got= NULL; int i= 0;
while (!got && try_dir[i])
{
- dir= (char*)malloc(strlen(try_dir[i])+strlen(cmd)+10);
+ dir= (char*)Safe_malloc(strlen(try_dir[i])+strlen(cmd)+10);
strcpy(dir, try_dir[i]);
strcat(dir, "/");
strcat(dir, cmd);
}
if (got)
+ {
i= spawnv(P_WAIT,got,cmd_argv) == -1;
+ free(got) ;
+ }
else
i= spawnvp(P_WAIT,cmd,cmd_argv) == -1;
if (i) {
return 0;
}
+#endif
/*-----------------------------------------------------------------*/
/* linkEdit : - calls the linkage editor with options */
static void linkEdit (char **envp)
{
FILE *lnkfile ;
+#ifndef USE_SYSTEM_SYSTEM_CALLS
char *argv[128];
+#endif
char *segName, *c;
int i;
fprintf (lnkfile,"\n-e\n");
fclose(lnkfile);
- buildCmdLine(buffer, argv, port->linker.cmd, srcFileName, NULL, NULL, NULL);
-
if (options.verbose)
printf ("sdcc: Calling linker...\n");
+
+#ifdef USE_SYSTEM_SYSTEM_CALLS
+ buildCmdLine(buffer, port->linker.cmd, srcFileName, NULL, NULL, NULL);
+ if (my_system(buffer)) {
+ exit(1);
+ }
+#else
+ buildCmdLine(buffer, argv, port->linker.cmd, srcFileName, NULL, NULL, NULL);
if (my_system(argv[0], argv)) {
perror("Cannot exec linker");
exit(1);
}
+#endif
+
if (strcmp(srcFileName,"temp") == 0) {
/* rename "temp.cdb" to "firstRelFile.cdb" */
char *f = strtok(strdup(relFiles[0]),".");
/*-----------------------------------------------------------------*/
static void assemble (char **envp)
{
+#ifdef USE_SYSTEM_SYSTEM_CALLS
+ buildCmdLine(buffer, port->assembler.cmd, srcFileName, NULL, NULL, asmOptions);
+ if (my_system(buffer)) {
+ exit(1);
+ }
+#else
char *argv[128]; /* assembler arguments */
buildCmdLine(buffer, argv, port->assembler.cmd, srcFileName, NULL, NULL, asmOptions);
if (my_system(argv[0], argv)) {
- perror("Cannot exec assember");
+ perror("Cannot exec assembler");
exit(1);
}
+#endif
}
/*-----------------------------------------------------------------*/
static int preProcess (char **envp)
{
+#ifndef USE_SYSTEM_SYSTEM_CALLS
char *argv[128];
+#endif
char procDef[128];
preOutName = NULL;
if (!preProcOnly)
preOutName = strdup(tmpnam(NULL));
- buildCmdLine(buffer, argv, _preCmd, fullSrcFileName,
- preOutName, srcFileName, preArgv);
-
if (options.verbose)
printf ("sdcc: Calling preprocessor...\n");
+#ifdef USE_SYSTEM_SYSTEM_CALLS
+ buildCmdLine(buffer, _preCmd, fullSrcFileName,
+ preOutName, srcFileName, preArgv);
+ if (my_system(buffer)) {
+ exit(1);
+ }
+#else
+ buildCmdLine(buffer, argv, _preCmd, fullSrcFileName,
+ preOutName, srcFileName, preArgv);
+
if (my_system(argv[0], argv)) {
unlink (preOutName);
perror("Cannot exec Preprocessor");
exit(1);
}
+#endif
if (preProcOnly)
exit(0);
}
static void _findPort(int argc, char **argv)
{
+ _validatePorts();
+
argc--;
while (argc) {
if (!strncmp(*argv, "-m", 2)) {
if (port->init)
port->init();
+#if defined(_MSC_VER)
+
+ {
+ int i ;
+
+ // Create a default exe search path from the path to the sdcc command
+
+ strcpy(DefaultExePath,argv[0]) ;
+
+ for(i = strlen(DefaultExePath) ; i > 0 ; i--)
+ if (DefaultExePath[i] == '\\')
+ {
+ DefaultExePath[i] = '\0' ;
+ break ;
+ }
+
+ if (i == 0)
+ DefaultExePath[0] = '\0' ;
+ }
+
+#endif
+
setDefaultOptions();
parseCmdLine(argc,argv);
if (!fatalError)
{
+/* TSD PIC port hack - if the PIC port option is enabled
+ and SDCC is used to generate PIC code, then we will
+ generate .asm files in gpasm's format instead of SDCC's
+ assembler's format
+*/
+#if !OPT_DISABLE_PIC
+ if(IS_PIC_PORT)
+ pic14glue();
+ else
+#endif
glue();
if (fatalError)
{
return 0;
-}
+ }