bug-indent
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: baby shell: code that compiles (for the most part), but indent doesn


From: Eric Deplagne
Subject: Re: baby shell: code that compiles (for the most part), but indent doesn't like it
Date: Tue, 11 Jun 2019 10:55:05 +0200
User-agent: Mutt/1.5.18 (2008-05-17)

On Sun, 09 Jun 2019 14:39:36 -0700, L A Walsh wrote:
> 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?

  Clearly, a #define with both "," and "(", NO.

  Just remember the preprocessor can do almost any dirty trick
  (is cpp formally turing complete or not ?).

> 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
> 
> 
> 
>     .
> 
> 
> 
> _______________________________________________
> bug-indent mailing list
> address@hidden
> https://lists.gnu.org/mailman/listinfo/bug-indent

-- 
  Eric Deplagne

Attachment: signature.asc
Description: Digital signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]