Mercurial > hg > jgplsrc
diff xh.c @ 0:e0bbaa717f41 draft default tip
lol J
author | Jordi GutiƩrrez Hermoso <jordigh@octave.org> |
---|---|
date | Mon, 25 Nov 2013 11:56:30 -0500 (2013-11-25) |
parents | |
children |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/xh.c @@ -0,0 +1,104 @@ +/* Copyright 1990-2011, Jsoftware Inc. All rights reserved. */ +/* License in license.txt. */ +/* */ +/* Xenos: Host Command Facilities */ + +#ifdef _WIN32 +#include <windows.h> +#include <winbase.h> +#else +#include <unistd.h> +#endif + +#include "j.h" +#include "x.h" + +#if (SYS & SYS_ARCHIMEDES) +#define Wimp_StartTask 0x400DE +extern int os_swi1(I,I); +#endif + + +#if (SYS & SYS_MACINTOSH) + +F1(jthost ){ASSERT(0,EVDOMAIN);} +F1(jthostne){ASSERT(0,EVDOMAIN);} + +#else + +F1(jthost){A z; + F1RANK(1,jthost,0); + RZ(w=vs(w)); +#if (SYS & SYS_PCWIN) + ASSERT(0,EVDOMAIN); +#else +{ + A t;I b;C*fn,*s;F f;I n; + n=AN(w); + GA(t,LIT,n+5+L_tmpnam,1,0); s=CAV(t); + fn=5+n+s; MC(s,AV(w),n); + MC(n+s," > ",5L); {C* t=tmpnam(fn);} + b=!system(s); + if(b){f=fopen(fn,FREAD); z=rd(f,0L,-1L); fclose(f);} + unlink(fn); + ASSERT(b&&f,EVFACE); +} +#endif + R z; +} + +F1(jthostne){C*s; + F1RANK(1,jthostne,0); + RZ(w=vs(w)); + s=CAV(w); +#if SYS & SYS_PCWIN + ASSERT(0,EVNONCE); +#else + { + I b; + b=system(s); +#if !SY_64 && (SYS&SYS_LINUX) + //Java-jnative-j.so system always returns -1 + if(jt->sm==SMJAVA&&-1==b) b=-1==system("")?0:-1; +#endif + b=!b; + ASSERT(b,EVFACE); + } +#endif + R mtv; +} + +#endif + + +#if !(SYS & SYS_UNIX) + +F1(jthostio){ASSERT(0,EVDOMAIN);} +F1(jtjwait ){ASSERT(0,EVDOMAIN);} + +#else + +#define CL(f) {close(f[0]);close(f[1]);} + +F1(jthostio){C*s;A z;F*pz;I fi[2],fo[2],r;int fii[2],foi[2]; + fii[0]=fi[0];fii[1]=fi[1];foi[0]=fo[0];foi[1]=fo[1]; + F1RANK(1,jthostio,0); + RZ(w=vs(w)); + s=CAV(w); GA(z,INT,3,1,0); pz=(F*)AV(z); + if((r=pipe(fii))==-1||pipe(foi)==-1){if(r!=-1)CL(fi); ASSERT(0,EVFACE);} + if(!((pz[1]=fdopen(fi[0],"r"))&&(pz[2]=fdopen(fo[1],"w")))){ + if(pz[1])fclose(pz[1]); CL(fi);CL(fo);} + if(!add2(pz[1],pz[2],s)){fclose(pz[1]);fclose(pz[2]); + CL(fi);CL(fo);} + switch(r=fork()){ + case -1:CL(fi);CL(fo);ASSERT(0,EVFACE); + case 0:close(0);{int i=dup(fo[0]);};close(1);{int i=dup(fi[1]);};CL(fi);CL(fo); + execl("/bin/sh","/bin/sh","-c",s,NULL); exit(-1); + }close(fo[0]);close(fi[1]); + add2(NULL,NULL,NULL); pz[0]=(F)r; + R z; +} + +F1(jtjwait){I k;int s; RE(k=i0(w)); if(-1==waitpid(k,&s,0))jerrno(); R sc(s);} + +#endif