xref: /plan9/sys/src/cmd/ip/snoopy/dump.c (revision 3ff48bf5ed603850fcd251ddf13025d23d693782)
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
99a747e4fSDavid du Colombier p_compile(Filter *)
109a747e4fSDavid du Colombier {
119a747e4fSDavid du Colombier }
129a747e4fSDavid du Colombier 
139a747e4fSDavid du Colombier static int
149a747e4fSDavid du Colombier p_filter(Filter *, Msg *)
159a747e4fSDavid du Colombier {
169a747e4fSDavid du Colombier 	return 0;
179a747e4fSDavid du Colombier }
189a747e4fSDavid du Colombier 
199a747e4fSDavid du Colombier static char tohex[16] = {
209a747e4fSDavid du Colombier 	'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
219a747e4fSDavid du Colombier 	'a', 'b', 'c', 'd', 'e', 'f'
229a747e4fSDavid du Colombier };
239a747e4fSDavid du Colombier 
249a747e4fSDavid du Colombier static int
259a747e4fSDavid du Colombier p_seprint(Msg *m)
269a747e4fSDavid du Colombier {
279a747e4fSDavid du Colombier 	int c, i, n, isstring;
289a747e4fSDavid du Colombier 	uchar *ps = m->ps;
299a747e4fSDavid du Colombier 	char *p = m->p;
309a747e4fSDavid du Colombier 	char *e = m->e;
319a747e4fSDavid du Colombier 
329a747e4fSDavid du Colombier 	n = m->pe - ps;
339a747e4fSDavid du Colombier 	if(n > Nflag)
349a747e4fSDavid du Colombier 		n = Nflag;
359a747e4fSDavid du Colombier 
369a747e4fSDavid du Colombier 	isstring = 1;
379a747e4fSDavid du Colombier 	for(i = 0; i < n; i++){
389a747e4fSDavid du Colombier 		c = ps[i];
399a747e4fSDavid du Colombier 		if(!isprint(c) && !isspace(c)){
409a747e4fSDavid du Colombier 			isstring = 0;
419a747e4fSDavid du Colombier 			break;
429a747e4fSDavid du Colombier 		}
439a747e4fSDavid du Colombier 	}
449a747e4fSDavid du Colombier 
459a747e4fSDavid du Colombier 	if(isstring){
469a747e4fSDavid du Colombier 		for(i = 0; i < n && p+1<e; i++){
479a747e4fSDavid du Colombier 			c = ps[i];
489a747e4fSDavid du Colombier 			switch(c){
499a747e4fSDavid du Colombier 			case '\t':
509a747e4fSDavid du Colombier 				*p++ = '\\';
519a747e4fSDavid du Colombier 				*p++ = 't';
529a747e4fSDavid du Colombier 				break;
539a747e4fSDavid du Colombier 			case '\r':
549a747e4fSDavid du Colombier 				*p++ = '\\';
559a747e4fSDavid du Colombier 				*p++ = 'r';
569a747e4fSDavid du Colombier 				break;
579a747e4fSDavid du Colombier 			case '\n':
589a747e4fSDavid du Colombier 				*p++ = '\\';
599a747e4fSDavid du Colombier 				*p++ = 'n';
609a747e4fSDavid du Colombier 				break;
619a747e4fSDavid du Colombier 			default:
629a747e4fSDavid du Colombier 				*p++ = c;
639a747e4fSDavid du Colombier 			}
649a747e4fSDavid du Colombier 		}
659a747e4fSDavid du Colombier 	} else {
669a747e4fSDavid du Colombier 		for(i = 0; i < n && p+1<e; i++){
679a747e4fSDavid du Colombier 			c = ps[i];
689a747e4fSDavid du Colombier 			*p++ = tohex[c>>4];
699a747e4fSDavid du Colombier 			*p++ = tohex[c&0xf];
709a747e4fSDavid du Colombier 		}
719a747e4fSDavid du Colombier 	}
729a747e4fSDavid du Colombier 
739a747e4fSDavid du Colombier 	m->pr = nil;
749a747e4fSDavid du Colombier 	m->p = p;
759a747e4fSDavid du Colombier 	m->ps = ps;
769a747e4fSDavid du Colombier 
779a747e4fSDavid du Colombier 	return 0;
789a747e4fSDavid du Colombier }
799a747e4fSDavid du Colombier 
809a747e4fSDavid du Colombier Proto dump =
819a747e4fSDavid du Colombier {
829a747e4fSDavid du Colombier 	"dump",
839a747e4fSDavid du Colombier 	p_compile,
849a747e4fSDavid du Colombier 	p_filter,
859a747e4fSDavid du Colombier 	p_seprint,
86*3ff48bf5SDavid du Colombier 	nil,
87*3ff48bf5SDavid du Colombier 	nil,
88*3ff48bf5SDavid du Colombier 	defaultframer,
899a747e4fSDavid du Colombier };
90