[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
baby shell: code that compiles (for the most part), but indent doesn't l
From: |
L A Walsh |
Subject: |
baby shell: code that compiles (for the most part), but indent doesn't like it |
Date: |
Sun, 09 Jun 2019 14:39:36 -0700 |
User-agent: |
Thunderbird |
I'm not sure how to best handle this for the general case,
but for simple cases, probably substituting the define text ink,
then maybe removing it when finished would allow it to work?
I's the ",close(" -- creates a bunch of unmatched ')'
The code which implements a primitive shell was turned
into a obfuscation contest --, so my first thought was to
turn to 'indent' to reformat it (originally from
https://www.ioccc.org/1990/tbr.hint).
#define D ,close(
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))||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;}
-----
I hand formatted it, and substituted in the value
of the define: ",close(". But the problem is since the compiler
handles the above, shouldn't 'indent' be able to as well?
if you want to run it, I had to substitute in my own
'exit' value that doesn't cause a compile error.
To get the original out, add an 'e' before the 2 calls
to 'xit' in the source.
#define D ,close(
int xit(int x) { exit(x) ;}
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)) || xit(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), close(o) , close(*f)
: 4, wait(0)
: ( o ? dup2(*f,0), close(*f), close(o)
: *i
? 1 , close(0), e(open(*i,0))
: 5, t
? dup2(t,1), close(t)
: i[2]
? 9 ,close(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 || xit(1)
: 5 ;
}
-----
Not that it is likely needed, but my ".indent.pro" file is here:
--braces-on-if-line
--braces-on-func-def-line
--braces-on-struct-decl-line
--break-after-boolean-operator
--cuddle-do-while
--cuddle-else
--continuation-indentation2
--case-indentation2
--dont-break-function-decl-args
--no-space-after-function-call-names
--no-space-after-parentheses
--paren-indentation2
--preserve-mtime
--space-special-semicolon
--swallow-optional-blank-lines
--tab-size2
--use-tabs
.
- baby shell: code that compiles (for the most part), but indent doesn't like it,
L A Walsh <=