tech-userlevel archive

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

Re: bin/39709: improvements for '/bin/sh -x'



The patch below improves '/bin/sh -x' output.
Demo:

    0 ~>cat /home/cheusov/tmp/1.sh 
    #!/bin/sh

    echo a
    echo b c 'd e'
    echo 'a b' c '' '"'
    echo "'"
    echo "aaa'bbb"
    0 ~>/bin/sh -x /home/cheusov/tmp/1.sh # original shell
    + echo a
    a
    + echo b c d e
    b c d e
    + echo a b c  "
    a b c  "
    + echo '
    '
    + echo aaa'bbb
    aaa'bbb
    0 ~>/srv/src_netbsd/bin/sh/sh -x /home/cheusov/tmp/1.sh # patched shell
    + echo a
    a
    + echo b c 'd e'
    b c d e
    + echo 'a b' c '' '"'
    a b c  "
    + echo ''\'''
    '
    + echo 'aaa'\''bbb'
    aaa'bbb
    0 ~>

Index: eval.c
===================================================================
RCS file: /pub/NetBSD-CVS/src/bin/sh/eval.c,v
retrieving revision 1.88.2.1
diff -u -r1.88.2.1 eval.c
--- eval.c      8 Jun 2008 20:08:01 -0000       1.88.2.1
+++ eval.c      30 Oct 2008 22:52:46 -0000
@@ -759,13 +759,13 @@
                for (sp = varlist.list ; sp ; sp = sp->next) {
                        if (sep != 0)
                                outc(sep, &errout);
-                       out2str(sp->text);
+                       out2shstr(sp->text);
                        sep = ' ';
                }
                for (sp = arglist.list ; sp ; sp = sp->next) {
                        if (sep != 0)
                                outc(sep, &errout);
-                       out2str(sp->text);
+                       out2shstr(sp->text);
                        sep = ' ';
                }
                outc('\n', &errout);
Index: output.c
===================================================================
RCS file: /pub/NetBSD-CVS/src/bin/sh/output.c,v
retrieving revision 1.29
diff -u -r1.29 output.c
--- output.c    17 Mar 2006 14:47:10 -0000      1.29
+++ output.c    30 Oct 2008 22:52:46 -0000
@@ -140,6 +140,43 @@
 }
 
 
+void
+out2shstr(const char *p)
+{
+       outshstr(p, out2);
+}
+
+
+void
+outshstr(const char *p, struct output *file)
+{
+       static const char norm_chars [] \
+               = 
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
+       int need_q = p[0] == 0 || p[strspn(p, norm_chars)] != 0;
+       char c;
+
+       if (need_q)
+               outc('\'', file);
+
+       while (c = *p++, c != 0){
+               if (c != '\''){
+                       outc(c, file);
+               }else{
+                       outc('\'', file);
+                       outc('\\', file);
+                       outc(c, file);
+                       outc('\'', file);
+               }
+       }
+
+       if (need_q)
+               outc('\'', file);
+
+       if (file == out2)
+               flushout(file);
+}
+
+
 char out_junk[16];
 
 
Index: output.h
===================================================================
RCS file: /pub/NetBSD-CVS/src/bin/sh/output.h,v
retrieving revision 1.17
diff -u -r1.17 output.h
--- output.h    7 Aug 2003 09:05:36 -0000       1.17
+++ output.h    30 Oct 2008 22:52:46 -0000
@@ -57,6 +57,8 @@
 void out1str(const char *);
 void out2str(const char *);
 void outstr(const char *, struct output *);
+void out2shstr(const char *);
+void outshstr(const char *, struct output *);
 void emptyoutbuf(struct output *);
 void flushall(void);
 void flushout(struct output *);

-- 
Best regards, Aleksey Cheusov.


Home | Main Index | Thread Index | Old Index