xref: /plan9/sys/src/cmd/ip/snoopy/dump.c (revision 2cca75a1b2b8c6083390679d69d5c50cf66d9a01)
19a747e4fSDavid du Colombier #include <u.h>
29a747e4fSDavid du Colombier #include <libc.h>
39a747e4fSDavid du Colombier #include <ip.h>
49a747e4fSDavid du Colombier #include <ctype.h>
59a747e4fSDavid du Colombier #include "dat.h"
69a747e4fSDavid du Colombier #include "protos.h"
79a747e4fSDavid du Colombier 
89a747e4fSDavid du Colombier static void
p_compile(Filter *)99a747e4fSDavid du Colombier p_compile(Filter *)
109a747e4fSDavid du Colombier {
119a747e4fSDavid du Colombier }
129a747e4fSDavid du Colombier 
139a747e4fSDavid du Colombier static char tohex[16] = {
149a747e4fSDavid du Colombier 	'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
159a747e4fSDavid du Colombier 	'a', 'b', 'c', 'd', 'e', 'f'
169a747e4fSDavid du Colombier };
179a747e4fSDavid du Colombier 
189a747e4fSDavid du Colombier static int
p_seprint(Msg * m)199a747e4fSDavid du Colombier p_seprint(Msg *m)
209a747e4fSDavid du Colombier {
219a747e4fSDavid du Colombier 	int c, i, n, isstring;
229a747e4fSDavid du Colombier 	uchar *ps = m->ps;
239a747e4fSDavid du Colombier 	char *p = m->p;
249a747e4fSDavid du Colombier 	char *e = m->e;
259a747e4fSDavid du Colombier 
269a747e4fSDavid du Colombier 	n = m->pe - ps;
279a747e4fSDavid du Colombier 	if(n > Nflag)
289a747e4fSDavid du Colombier 		n = Nflag;
299a747e4fSDavid du Colombier 
309a747e4fSDavid du Colombier 	isstring = 1;
319a747e4fSDavid du Colombier 	for(i = 0; i < n; i++){
329a747e4fSDavid du Colombier 		c = ps[i];
339a747e4fSDavid du Colombier 		if(!isprint(c) && !isspace(c)){
349a747e4fSDavid du Colombier 			isstring = 0;
359a747e4fSDavid du Colombier 			break;
369a747e4fSDavid du Colombier 		}
379a747e4fSDavid du Colombier 	}
389a747e4fSDavid du Colombier 
399a747e4fSDavid du Colombier 	if(isstring){
409a747e4fSDavid du Colombier 		for(i = 0; i < n && p+1<e; i++){
419a747e4fSDavid du Colombier 			c = ps[i];
429a747e4fSDavid du Colombier 			switch(c){
439a747e4fSDavid du Colombier 			case '\t':
449a747e4fSDavid du Colombier 				*p++ = '\\';
459a747e4fSDavid du Colombier 				*p++ = 't';
469a747e4fSDavid du Colombier 				break;
479a747e4fSDavid du Colombier 			case '\r':
489a747e4fSDavid du Colombier 				*p++ = '\\';
499a747e4fSDavid du Colombier 				*p++ = 'r';
509a747e4fSDavid du Colombier 				break;
519a747e4fSDavid du Colombier 			case '\n':
529a747e4fSDavid du Colombier 				*p++ = '\\';
539a747e4fSDavid du Colombier 				*p++ = 'n';
549a747e4fSDavid du Colombier 				break;
559a747e4fSDavid du Colombier 			default:
569a747e4fSDavid du Colombier 				*p++ = c;
579a747e4fSDavid du Colombier 			}
589a747e4fSDavid du Colombier 		}
599a747e4fSDavid du Colombier 	} else {
609a747e4fSDavid du Colombier 		for(i = 0; i < n && p+1<e; i++){
619a747e4fSDavid du Colombier 			c = ps[i];
629a747e4fSDavid du Colombier 			*p++ = tohex[c>>4];
639a747e4fSDavid du Colombier 			*p++ = tohex[c&0xf];
649a747e4fSDavid du Colombier 		}
659a747e4fSDavid du Colombier 	}
669a747e4fSDavid du Colombier 
679a747e4fSDavid du Colombier 	m->pr = nil;
689a747e4fSDavid du Colombier 	m->p = p;
699a747e4fSDavid du Colombier 	m->ps = ps;
709a747e4fSDavid du Colombier 
719a747e4fSDavid du Colombier 	return 0;
729a747e4fSDavid du Colombier }
739a747e4fSDavid du Colombier 
749a747e4fSDavid du Colombier Proto dump =
759a747e4fSDavid du Colombier {
769a747e4fSDavid du Colombier 	"dump",
779a747e4fSDavid du Colombier 	p_compile,
78*2cca75a1SDavid du Colombier 	nil,
799a747e4fSDavid du Colombier 	p_seprint,
803ff48bf5SDavid du Colombier 	nil,
813ff48bf5SDavid du Colombier 	nil,
82ed397113SDavid du Colombier 	nil,
833ff48bf5SDavid du Colombier 	defaultframer,
849a747e4fSDavid du Colombier };
85