From: cuz Date: Mon, 25 Nov 2002 21:12:00 +0000 (+0000) Subject: Make the spawn module an include file as suggested by Greg King X-Git-Tag: V2.12.0~1998 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=ef886278a87fba783f84458dad2e9b94be05a16f;p=cc65 Make the spawn module an include file as suggested by Greg King git-svn-id: svn://svn.cc65.org/cc65/trunk@1649 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- diff --git a/src/cl65/main.c b/src/cl65/main.c index 3372850cb..bf7b8dceb 100644 --- a/src/cl65/main.c +++ b/src/cl65/main.c @@ -33,20 +33,31 @@ +/* Check out if we have a spawn() function on the system, or if we must use + * our own. + */ +#if defined(__WATCOMC__) || defined(_MSC_VER) || defined(__MINGW32__) || defined(__DJGPP__) +# define HAVE_SPAWN 1 +#else +# define NEED_SPAWN 1 +#endif + + + #include #include #include #include #include -#if defined(__WATCOMC__) || defined(_MSC_VER) || defined(__MINGW32__) -# include /* DOS, OS/2 and Windows */ -#else -# include "spawn.h" /* All others */ +#ifdef HAVE_SPAWN +# include #endif /* common */ +#include "attrib.h" #include "cmdline.h" #include "fname.h" +#include "strbuf.h" #include "target.h" #include "version.h" #include "xmalloc.h" @@ -124,7 +135,25 @@ static char* TargetLib = 0; /*****************************************************************************/ -/* Determine a file type */ +/* Include the system specific spawn function */ +/*****************************************************************************/ + + + +#if defined(NEED_SPAWN) +# if defined(SPAWN_UNIX) +# include "spawn-unix.inc" +# elif defined(SPAWN_AMIGA) +# include "spawn-amiga.inc" +# else +# error "Don't know which spawn module to include!" +# endif +#endif + + + +/*****************************************************************************/ +/* Determine a file type */ /*****************************************************************************/ diff --git a/src/cl65/make/gcc.mak b/src/cl65/make/gcc.mak index 96f9a2b91..87153f7cb 100644 --- a/src/cl65/make/gcc.mak +++ b/src/cl65/make/gcc.mak @@ -5,15 +5,18 @@ # Library dir COMMON = ../common +# Type of spawn function to use +SPAWN = SPAWN_UNIX + + CC=gcc -CFLAGS = -O2 -g -Wall -W -I$(COMMON) +CFLAGS = -O2 -g -Wall -W -I$(COMMON) -D$(SPAWN) EBIND = emxbind LDFLAGS= OBJS = error.o \ global.o \ - main.o \ - spawn-unix.o + main.o LIBS = $(COMMON)/common.a @@ -31,7 +34,7 @@ endif cl65: $(OBJS) $(LIBS) - $(CC) $(LDFLAGS) -o cl65 $(CFLAGS) $(OBJS) $(LIBS) + $(CC) $(LDFLAGS) -o cl65 $(OBJS) $(LIBS) @if [ $(OS2_SHELL) ] ; then $(EBIND) cl65 ; fi clean: @@ -47,7 +50,7 @@ zap: clean .PHONY: depend dep depend dep: $(OBJS:.o=.c) @echo "Creating dependency information" - $(CC) -I$(COMMON) -MM $^ > .depend + $(CC) -I$(COMMON) -D$(SPAWN) -MM $^ > .depend diff --git a/src/cl65/spawn-amiga.c b/src/cl65/spawn-amiga.c deleted file mode 100644 index 8a083f7d5..000000000 --- a/src/cl65/spawn-amiga.c +++ /dev/null @@ -1,81 +0,0 @@ -/*****************************************************************************/ -/* */ -/* spawn-amiga.c */ -/* */ -/* Execute other external programs (Amiga version) */ -/* */ -/* */ -/* */ -/* (C) 2002 Wolfgang Hosemann */ -/* EMail: whose@t-online.de */ -/* */ -/* */ -/* This software is provided 'as-is', without any expressed or implied */ -/* warranty. In no event will the authors be held liable for any damages */ -/* arising from the use of this software. */ -/* */ -/* Permission is granted to anyone to use this software for any purpose, */ -/* including commercial applications, and to alter it and redistribute it */ -/* freely, subject to the following restrictions: */ -/* */ -/* 1. The origin of this software must not be misrepresented; you must not */ -/* claim that you wrote the original software. If you use this software */ -/* in a product, an acknowledgment in the product documentation would be */ -/* appreciated but is not required. */ -/* 2. Altered source versions must be plainly marked as such, and must not */ -/* be misrepresented as being the original software. */ -/* 3. This notice may not be removed or altered from any source */ -/* distribution. */ -/* */ -/*****************************************************************************/ - - - -#include -#include - -/* common */ -#include "attrib.h" -#include "strbuf.h" - - - -/*****************************************************************************/ -/* Code */ -/*****************************************************************************/ - - - -int spawnvp (int Mode attribute ((unused)), - const char* File attribute ((unused)), - char* const argv []) -/* Execute the given program searching and wait til it terminates. The Mode - * argument is ignored (compatibility only). The result of the function is - * the return code of the program. The function will terminate the program - * on errors. - */ -{ - int Status; - StrBuf Command = AUTO_STRBUF_INITIALIZER; - - /* Build the command line */ - while (*argv) { - SB_AppendStr (&Command, *argv++); - SB_AppendChar (&Command, ' '); - } - - /* Terminate the command line */ - SB_Terminate (&Command); - - /* Invoke the shell to execute the command */ - Status = System (SB_GetConstBuf (&Command), TAG_END) - - /* Free the string buf data */ - DoneStrBuf (&Command); - - /* Return the result */ - return Status; -} - - - diff --git a/src/cl65/spawn-amiga.inc b/src/cl65/spawn-amiga.inc new file mode 100644 index 000000000..4f0565c2e --- /dev/null +++ b/src/cl65/spawn-amiga.inc @@ -0,0 +1,77 @@ +/*****************************************************************************/ +/* */ +/* spawn-amiga.inc */ +/* */ +/* Execute other external programs (Amiga version) */ +/* */ +/* */ +/* */ +/* (C) 2002 Wolfgang Hosemann */ +/* EMail: whose@t-online.de */ +/* */ +/* */ +/* This software is provided 'as-is', without any expressed or implied */ +/* warranty. In no event will the authors be held liable for any damages */ +/* arising from the use of this software. */ +/* */ +/* Permission is granted to anyone to use this software for any purpose, */ +/* including commercial applications, and to alter it and redistribute it */ +/* freely, subject to the following restrictions: */ +/* */ +/* 1. The origin of this software must not be misrepresented; you must not */ +/* claim that you wrote the original software. If you use this software */ +/* in a product, an acknowledgment in the product documentation would be */ +/* appreciated but is not required. */ +/* 2. Altered source versions must be plainly marked as such, and must not */ +/* be misrepresented as being the original software. */ +/* 3. This notice may not be removed or altered from any source */ +/* distribution. */ +/* */ +/*****************************************************************************/ + + + +#include +#include + + + +/*****************************************************************************/ +/* Code */ +/*****************************************************************************/ + + + +int spawnvp (int Mode attribute ((unused)), + const char* File attribute ((unused)), + char* const argv []) +/* Execute the given program searching and wait til it terminates. The Mode + * argument is ignored (compatibility only). The result of the function is + * the return code of the program. The function will terminate the program + * on errors. + */ +{ + int Status; + StrBuf Command = AUTO_STRBUF_INITIALIZER; + + /* Build the command line */ + while (*argv) { + SB_AppendStr (&Command, *argv++); + SB_AppendChar (&Command, ' '); + } + + /* Terminate the command line */ + SB_Terminate (&Command); + + /* Invoke the shell to execute the command */ + Status = System (SB_GetConstBuf (&Command), TAG_END) + + /* Free the string buf data */ + DoneStrBuf (&Command); + + /* Return the result */ + return Status; +} + + + diff --git a/src/cl65/spawn-unix.c b/src/cl65/spawn-unix.c deleted file mode 100644 index be25e66a0..000000000 --- a/src/cl65/spawn-unix.c +++ /dev/null @@ -1,99 +0,0 @@ -/*****************************************************************************/ -/* */ -/* spawn.c */ -/* */ -/* Execute other external programs (Unix version) */ -/* */ -/* */ -/* */ -/* (C) 1999 Ullrich von Bassewitz */ -/* Wacholderweg 14 */ -/* D-70597 Stuttgart */ -/* EMail: uz@musoftware.de */ -/* */ -/* */ -/* This software is provided 'as-is', without any expressed or implied */ -/* warranty. In no event will the authors be held liable for any damages */ -/* arising from the use of this software. */ -/* */ -/* Permission is granted to anyone to use this software for any purpose, */ -/* including commercial applications, and to alter it and redistribute it */ -/* freely, subject to the following restrictions: */ -/* */ -/* 1. The origin of this software must not be misrepresented; you must not */ -/* claim that you wrote the original software. If you use this software */ -/* in a product, an acknowledgment in the product documentation would be */ -/* appreciated but is not required. */ -/* 2. Altered source versions must be plainly marked as such, and must not */ -/* be misrepresented as being the original software. */ -/* 3. This notice may not be removed or altered from any source */ -/* distribution. */ -/* */ -/*****************************************************************************/ - - - -#include -#include -#include -#include -#include - -/* common */ -#include "attrib.h" - -/* cl65 */ -#include "error.h" - - - -/*****************************************************************************/ -/* Code */ -/*****************************************************************************/ - - - -int spawnvp (int Mode attribute ((unused)), const char* File, char* const argv []) -/* Execute the given program searching and wait til it terminates. The Mode - * argument is ignored (compatibility only). The result of the function is - * the return code of the program. The function will terminate the program - * on errors. - */ -{ - int Status = 0; - - /* Fork */ - int pid = fork (); - if (pid < 0) { - - /* Error forking */ - Error ("Cannot fork: %s", strerror (errno)); - - } else if (pid == 0) { - - /* The son - exec the program */ - if (execvp (File, argv) < 0) { - Error ("Cannot exec `%s': %s", File, strerror (errno)); - } - - } else { - - /* The father: Wait for the subprocess to terminate */ - if (waitpid (pid, &Status, 0) < 0) { - Error ("Failure waiting for subprocess: %s", strerror (errno)); - } - - /* Examine the child status */ - if (!WIFEXITED (Status)) { - Error ("Subprocess `%s' aborted by signal %d", File, WTERMSIG (Status)); - } - } - - /* Only the father goes here, we place a return here regardless of that - * to avoid compiler warnings. - */ - return WEXITSTATUS (Status); -} - - - diff --git a/src/cl65/spawn-unix.inc b/src/cl65/spawn-unix.inc new file mode 100644 index 000000000..d64d85d5b --- /dev/null +++ b/src/cl65/spawn-unix.inc @@ -0,0 +1,108 @@ +/*****************************************************************************/ +/* */ +/* spawn-unix.inc */ +/* */ +/* Execute other external programs (Unix version) */ +/* */ +/* */ +/* */ +/* (C) 1999-2002 Ullrich von Bassewitz */ +/* Wacholderweg 14 */ +/* D-70597 Stuttgart */ +/* EMail: uz@musoftware.de */ +/* */ +/* */ +/* This software is provided 'as-is', without any expressed or implied */ +/* warranty. In no event will the authors be held liable for any damages */ +/* arising from the use of this software. */ +/* */ +/* Permission is granted to anyone to use this software for any purpose, */ +/* including commercial applications, and to alter it and redistribute it */ +/* freely, subject to the following restrictions: */ +/* */ +/* 1. The origin of this software must not be misrepresented; you must not */ +/* claim that you wrote the original software. If you use this software */ +/* in a product, an acknowledgment in the product documentation would be */ +/* appreciated but is not required. */ +/* 2. Altered source versions must be plainly marked as such, and must not */ +/* be misrepresented as being the original software. */ +/* 3. This notice may not be removed or altered from any source */ +/* distribution. */ +/* */ +/*****************************************************************************/ + + + +#include +#include +#include +#include +#include + + + +/*****************************************************************************/ +/* Data */ +/*****************************************************************************/ + + + +/* Mode argument for spawn. This value is ignored by the function and only + * provided for DOS/Windows compatibility. + */ +#ifndef P_WAIT +#define P_WAIT 0 +#endif + + + +/*****************************************************************************/ +/* Code */ +/*****************************************************************************/ + + + +int spawnvp (int Mode attribute ((unused)), const char* File, char* const argv []) +/* Execute the given program searching and wait til it terminates. The Mode + * argument is ignored (compatibility only). The result of the function is + * the return code of the program. The function will terminate the program + * on errors. + */ +{ + int Status = 0; + + /* Fork */ + int pid = fork (); + if (pid < 0) { + + /* Error forking */ + Error ("Cannot fork: %s", strerror (errno)); + + } else if (pid == 0) { + + /* The son - exec the program */ + if (execvp (File, argv) < 0) { + Error ("Cannot exec `%s': %s", File, strerror (errno)); + } + + } else { + + /* The father: Wait for the subprocess to terminate */ + if (waitpid (pid, &Status, 0) < 0) { + Error ("Failure waiting for subprocess: %s", strerror (errno)); + } + + /* Examine the child status */ + if (!WIFEXITED (Status)) { + Error ("Subprocess `%s' aborted by signal %d", File, WTERMSIG (Status)); + } + } + + /* Only the father goes here, we place a return here regardless of that + * to avoid compiler warnings. + */ + return WEXITSTATUS (Status); +} + + +