+/* 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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
-#if defined(__WATCOMC__) || defined(_MSC_VER) || defined(__MINGW32__)
-# include <process.h> /* DOS, OS/2 and Windows */
-#else
-# include "spawn.h" /* All others */
+#ifdef HAVE_SPAWN
+# include <process.h>
#endif
/* common */
+#include "attrib.h"
#include "cmdline.h"
#include "fname.h"
+#include "strbuf.h"
#include "target.h"
#include "version.h"
#include "xmalloc.h"
/*****************************************************************************/
-/* 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 */
/*****************************************************************************/
# 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
cl65: $(OBJS) $(LIBS)
- $(CC) $(LDFLAGS) -o cl65 $(CFLAGS) $(OBJS) $(LIBS)
+ $(CC) $(LDFLAGS) -o cl65 $(OBJS) $(LIBS)
@if [ $(OS2_SHELL) ] ; then $(EBIND) cl65 ; fi
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
+++ /dev/null
-/*****************************************************************************/
-/* */
-/* 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 <stdio.h>
-#include <clib/dos_protos.h>
-
-/* 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;
-}
-
-
-
--- /dev/null
+/*****************************************************************************/
+/* */
+/* 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 <stdio.h>
+#include <clib/dos_protos.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;
+}
+
+
+
+++ /dev/null
-/*****************************************************************************/
-/* */
-/* 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 <unistd.h>
-#include <string.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-
-/* 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);
-}
-
-
-
--- /dev/null
+/*****************************************************************************/
+/* */
+/* 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 <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+
+
+/*****************************************************************************/
+/* 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);
+}
+
+
+