X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=epoc%2Fepoc.c;h=e5496eafd0e1fd7ec8e9563787a54d69fd6fb8ec;hb=0de7d1a6dbad298170dc03586eac337ac8b2bc61;hp=d0fae23f7ee600441428a37fb789750b073938f9;hpb=ae2d1787751a38d67ea377bb8eb603cbbf3a36bc;p=p5sagit%2Fp5-mst-13.2.git diff --git a/epoc/epoc.c b/epoc/epoc.c index d0fae23..e5496ea 100644 --- a/epoc/epoc.c +++ b/epoc/epoc.c @@ -11,13 +11,16 @@ #include #include -char *environ = NULL; void Perl_epoc_init(int *argcp, char ***argvp) { int i; 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]) == '<') { @@ -59,6 +62,7 @@ Perl_epoc_init(int *argcp, char ***argvp) { } + #ifdef __MARM__ /* Symbian forgot to include __fixunsdfi into the MARM euser.lib */ /* This is from libgcc2.c , gcc-2.7.2.3 */ @@ -88,3 +92,152 @@ __fixunsdfsi (a) } #endif + +#include "EXTERN.h" +#include "perl.h" +#include "XSUB.h" + +int +do_spawn( char *cmd) { + dTHX; + 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_aspawn ( void *vreally, void **vmark, void **vsp) { + + dTHX; + + SV *really = (SV*)vreally; + SV **mark = (SV**)vmark; + SV **sp = (SV**)vsp; + + char **argv; + char *str; + char *p2, **ptr; + char *cmd, *cmdline; + + + int rc; + int index = 0; + int len = 0; + + if (sp<=mark) + return -1; + + ptr = argv =(char**) malloc ((sp-mark+3)*sizeof (char*)); + + while (++mark <= sp) { + if (*mark && (str = SvPV_nolen(*mark))) + argv[index] = str; + else + argv[index] = ""; + + len += strlen(argv[ index++]) + 1; + } + argv[index++] = 0; + + 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, *ptr++); + strcat( cmdline, " "); + } + + free( argv); + + rc = epoc_spawn( cmd, cmdline); + free( cmdline); + free( cmd); + + return rc; +} + +static +XS(epoc_getcwd) /* more or less stolen from win32.c */ +{ + dXSARGS; + /* Make the host for current directory */ + char *buffer; + int buflen = 256; + + char *ptr; + buffer = (char *) malloc( buflen); + if (buffer == NULL) { + XSRETURN_UNDEF; + } + while ((NULL == ( ptr = getcwd( buffer, buflen))) && (errno == ERANGE)) { + buflen *= 2; + if (NULL == realloc( buffer, buflen)) { + XSRETURN_UNDEF; + } + + } + + /* + * If ptr != Nullch + * then it worked, set PV valid, + * else return 'undef' + */ + + if (ptr) { + SV *sv = sv_newmortal(); + char *tptr; + + for (tptr = ptr; *tptr != '\0'; tptr++) { + if (*tptr == '\\') { + *tptr = '/'; + } + } + sv_setpv(sv, ptr); + free( buffer); + + EXTEND(SP,1); + SvPOK_on(sv); + ST(0) = sv; + XSRETURN(1); + } + free( buffer); + XSRETURN_UNDEF; +} + + +void +Perl_init_os_extras(void) +{ + dTHX; + char *file = __FILE__; + newXS("EPOC::getcwd", epoc_getcwd, file); +} + +void +Perl_my_setenv(pTHX_ char *nam,char *val) { + setenv( nam, val, 1); +}