Implementation of spawnl and spawnlp

Mike Bond mbond at cox.rr.com
Fri May 18 09:43:36 CDT 2001


Index: dlls/msvcrt/process.c
===================================================================
RCS file: /home/wine/wine/dlls/msvcrt/process.c,v
retrieving revision 1.5
diff -u -r1.5 process.c
--- dlls/msvcrt/process.c	2001/04/10 23:25:25	1.5
+++ dlls/msvcrt/process.c	2001/05/18 14:38:31
@@ -109,6 +109,45 @@
   return ret;
 }
 
+/* INTERNAL: Convert va_list to a single 'delim'-separated string */
+static char* msvcrt_valisttos(const char* arg0, va_list ap, char delim)
+{
+  va_list search = ap;
+  long size;
+  char *arg;
+  char *ret;
+  int strsize;
+
+  if (!arg0 && !delim)
+    return NULL;
+
+  /* get length */
+  size = strlen(arg0) + 1;
+  while((arg = va_arg(search, char *)) != NULL)
+  {
+    size += strlen(arg) + 1;
+  }
+
+  if (!(ret = (char *)MSVCRT_calloc(size + 1, 1)))
+    return NULL;
+
+  /* fill string */
+  search = ap;
+  size = 0;
+  strsize = strlen(arg0);
+  memcpy(ret+size,arg0,strsize);
+  ret[size+strsize] = delim;
+  size += strsize + 1;
+  while((arg = va_arg(search, char *)) != NULL)
+  {
+    strsize = strlen(search);
+    memcpy(ret+size,search,strsize);
+    ret[size+strsize] = delim;
+    size += strsize + 1;
+  }
+  return ret;
+}
+
 /*********************************************************************
  *		_cwait (MSVCRT.@)
  */
@@ -140,6 +179,47 @@
     MSVCRT__set_errno(doserrno);
 
   return status ? *status = -1 : -1;
+}
+
+/*********************************************************************
+ *		_spawnl (MSVCRT.@)
+ */
+int _spawnl(int flags, const char* name, const char* arg0, ...)
+{
+  va_list ap;
+  char * args;
+  int ret;
+
+  va_start(ap, arg0);
+  args = msvcrt_valisttos(arg0, ap, ' ');
+  va_end(ap);
+
+  ret = msvcrt_spawn(flags, name, args, NULL);
+  MSVCRT_free(args);
+
+  return ret;
+}
+
+/*********************************************************************
+ *		_spawnl (MSVCRT.@)
+ */
+int _spawnlp(int flags, const char* name, const char* arg0, ...)
+{
+  va_list ap;
+  char * args;
+  int ret;
+  char fullname[MAX_PATH];
+
+  _searchenv(name, "PATH", fullname);
+
+  va_start(ap, arg0);
+  args = msvcrt_valisttos(arg0, ap, ' ');
+  va_end(ap);
+
+  ret = msvcrt_spawn(flags, name, args, NULL);
+  MSVCRT_free(args);
+
+  return ret;
 }
 
 /*********************************************************************
Index: dlls/msvcrt/msvcrt.spec
===================================================================
RCS file: /home/wine/wine/dlls/msvcrt/msvcrt.spec,v
retrieving revision 1.12
diff -u -r1.12 msvcrt.spec
--- dlls/msvcrt/msvcrt.spec	2001/05/02 01:09:47	1.12
+++ dlls/msvcrt/msvcrt.spec	2001/05/18 14:38:31
@@ -442,9 +442,9 @@
 @ varargs _snprintf(str long str) snprintf
 @ forward -noimport _snwprintf ntdll._snwprintf
 @ cdecl _sopen(str long long) MSVCRT__sopen
-@ stub _spawnl #(str str) varargs
+@ varargs _spawnl(str str) _spawnl
 @ stub _spawnle #(str str) varargs
-@ stub _spawnlp #(str str) varargs
+@ varargs _spawnlp(str str) _spawnlp
 @ stub _spawnlpe #(str str) varargs
 @ cdecl _spawnv(long str ptr) _spawnv
 @ cdecl _spawnve(long str ptr ptr) _spawnve

-- 
TTFN
MikeB




More information about the wine-patches mailing list