| #include <u.h> |
| #include <libc.h> |
| #include <ip.h> |
| #include <ctype.h> |
| #include "dat.h" |
| #include "protos.h" |
| |
| static char tohex[16] = { |
| '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', |
| 'a', 'b', 'c', 'd', 'e', 'f' |
| }; |
| |
| static int |
| p_seprint(Msg *m) |
| { |
| int c, i, n, isstring; |
| uchar *ps = m->ps; |
| char *p = m->p; |
| char *e = m->e; |
| |
| n = m->pe - ps; |
| if(n > Nflag) |
| n = Nflag; |
| |
| isstring = 1; |
| for(i = 0; i < n; i++){ |
| c = ps[i]; |
| if(!isprint(c) && !isspace(c)){ |
| isstring = 0; |
| break; |
| } |
| } |
| |
| if(isstring){ |
| for(i = 0; i < n && p+1<e; i++){ |
| c = ps[i]; |
| switch(c){ |
| case '\t': |
| *p++ = '\\'; |
| *p++ = 't'; |
| break; |
| case '\r': |
| *p++ = '\\'; |
| *p++ = 'r'; |
| break; |
| case '\n': |
| *p++ = '\\'; |
| *p++ = 'n'; |
| break; |
| default: |
| *p++ = c; |
| } |
| } |
| } else { |
| for(i = 0; i < n && p+1<e; i++){ |
| c = ps[i]; |
| *p++ = tohex[c>>4]; |
| *p++ = tohex[c&0xf]; |
| } |
| } |
| |
| m->pr = nil; |
| m->p = p; |
| m->ps = ps; |
| |
| return 0; |
| } |
| |
| Proto dump = |
| { |
| "dump", |
| nil, |
| nil, |
| p_seprint, |
| nil, |
| nil, |
| nil, |
| defaultframer |
| }; |