A placeholder.
[p5sagit/p5-mst-13.2.git] / epoc / epoc.c
index a2691f3..6652ef0 100644 (file)
@@ -17,6 +17,10 @@ Perl_epoc_init(int *argcp, char ***argvp) {
   int truecount=0;
   char **lastcp = (*argvp);
   char *ptr;
+
+#if 0
+  epoc_spawn_posix_server();
+#endif
   for (i=0; i< *argcp; i++) {
     if ((*argvp)[i]) {
       if (*((*argvp)[i]) == '<') {
@@ -94,55 +98,85 @@ __fixunsdfsi (a)
 #include "XSUB.h"
 
 int 
-do_aspawn( pTHX_ SV *really,SV **mark,SV **sp) {
-  return do_spawn( really, mark, sp);
+do_spawn( char *cmd) {
+    dTHXo;
+    char *argv0, *ptr;
+    char *cmdptr = cmd;
+    int ret;
+    
+    argv0 = ptr = malloc( strlen(cmd) + 1);
+
+    while (*cmdptr && !isSPACE( *cmdptr)) {
+      *ptr = *cmdptr;
+      if (*ptr == '/') {
+       *ptr = '\\';
+      }
+      ptr++; cmdptr++;
+    }
+    while (*cmdptr && isSPACE( *cmdptr)) {
+      cmdptr++;
+    }
+    *ptr = '\0';
+    ret = epoc_spawn( argv0, cmdptr);
+    free( argv0);
+    return ret;
 }
 
 int
-do_spawn (pTHX_ SV *really,SV **mark,SV **sp)
-{
-    dTHR;
+do_aspawn ( void *vreally, void **vmark, void **vsp) {
+
+    dTHXo;
+
+    SV *really = (SV*)vreally;
+    SV **mark = (SV**)vmark;
+    SV **sp = (SV**)vsp;
+
+    char **argv;
+    char *str;
+    char *p2, **ptr;
+    char *cmd, *cmdline;
+
+
     int  rc;
-    char **a,*cmd,**ptr, *cmdline, **argv, *p2; 
-    STRLEN n_a;
-    size_t len = 0;
+    int index = 0;
+    int len = 0;
 
     if (sp<=mark)
       return -1;
     
-    a=argv=ptr=(char**) malloc ((sp-mark+3)*sizeof (char*));
+    ptr = argv =(char**) malloc ((sp-mark+3)*sizeof (char*));
     
     while (++mark <= sp) {
-      if (*mark)
-       *a = SvPVx(*mark, n_a);
+      if (*mark && (str = SvPV_nolen(*mark)))
+       argv[index] = str;
       else
-       *a = "";
-      len += strlen( *a) + 1;
-      a++;
+       argv[index] = "";
+      
+      len += strlen(argv[ index++]) + 1;
     }
-    *a = Nullch;
+    argv[index++] = 0;
 
-    if (!(really && *(cmd = SvPV(really, n_a)))) {
-      cmd = argv[0];
-      argv++;
+    cmd = strdup((const char*)(really ? SvPV_nolen(really) : argv[0]));
+
+    for (p2=cmd; *p2 != '\0'; p2++) {
+      /* Change / to \ */
+      if ( *p2 == '/') 
+       *p2 = '\\';
     }
       
     cmdline = (char * ) malloc( len + 1);
     cmdline[ 0] = '\0';
     while (*argv != NULL) {
-      strcat( cmdline, *argv++);
+      strcat( cmdline, *ptr++);
       strcat( cmdline, " ");
     }
+    
+    free( argv);
 
-    for (p2=cmd; *p2 != '\0'; p2++) {
-      /* Change / to \ */
-      if ( *p2 == '/') 
-       *p2 = '\\';
-    }
     rc = epoc_spawn( cmd, cmdline);
-    free( ptr);
     free( cmdline);
-    
+    free( cmd);
+
     return rc;
 }