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