When I added the 'gets()' and 'exit()' macros to make the code look more
like the original I accidentally left out a space between 'gets(x)' and
'fgets(...' so that it looked like:
#define gets(x)fgets((x),512,stdin)
which I believe is incorrect. It now looks instead like:
#define gets(x) fgets((x),512,stdin)
The compact version that the authors provided was compile fixed quite
some time back but I never added the exit macro to match the original
more closely.
Also since the compact version was meant to be identical in function of
the entry and since that entry was changed to use fgets() (by the macro
gets()) I decided it would be better to make it use fgets() also, also
through redefining gets(). To make the line length closer in match to
the original compact version I changed the code to be two lines. This
wasn't necessary to do, as I recall, in the entry itself though it's
possible it was and I just managed to get the ASCII art the same or
almost the same.
The thanks-for-fixes.md file was updated for this change but
unfortunately I had made some changes yesterday that I forgot about
(just rewording) in another entry so that will also be in this commit.
14 lines
654 B
C
14 lines
654 B
C
#define D ,close(
|
|
#define exit(x) exit((x)),0
|
|
#define gets(x) fgets((x),512,stdin)
|
|
char*c,q[512],m[256],*v[99],**u,*i[3];int f[2],p;main(){for(m[m[60]=m[62]=
|
|
32]=m[*m=124[m]=9]=6;e(-8),((gets(1+(c=q)),(c+1)[strlen(c+1)-1]='\0'),1)||
|
|
(exit(0));r(0,0))for(;*++c;);}r(t,o){*i=i[2]=0;for(u=v+98;m[*--c]^9;m[*c]&32?i[*c&2]=
|
|
*u,u-v^98&&++u:3)if(!m[*c]){for(*++c=0;!m[*--c];);*--u=
|
|
++c;}u-v^98?strcmp(*u,"cd")?*c?pipe(f),o=f[1]:1,(p=fork())?e(p),o?
|
|
r(o,0)D o)D*f):4,wait(0):(o?dup2(*f,0)D*f)D o):*i?1 D
|
|
0),e(open(*i,0)):5,t?dup2(t,1)D t):i[2]?9 D
|
|
1),e(creat(i[2],438)):2,e(execvp(*u,u))):e(chdir(u[1])*2):6;}
|
|
e(x){x<0?write(2,"?\n$ "-x/4,2),x+1||(exit(1)):5;}
|
|
|