12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*	$NetBSD: print-ascii.c,v 1.1 1999/09/30 14:49:12 sjg Exp $ 	*/
22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*-
42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc.
52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * All rights reserved.
62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * This code is derived from software contributed to The NetBSD Foundation
82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * by Alan Barrett and Simon J. Gerraty.
92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Redistribution and use in source and binary forms, with or without
112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * modification, are permitted provided that the following conditions
122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * are met:
132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    documentation and/or other materials provided with the distribution.
182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 3. All advertising materials mentioning features or use of this software
192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    must display the following acknowledgement:
202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *        This product includes software developed by the NetBSD
212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *        Foundation, Inc. and its contributors.
222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 4. Neither the name of The NetBSD Foundation nor the names of its
232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    contributors may be used to endorse or promote products derived
242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    from this software without specific prior written permission.
252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * POSSIBILITY OF SUCH DAMAGE.
372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H
402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h"
412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint
442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ =
452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project     "@(#) $Header: /tcpdump/master/tcpdump/print-ascii.c,v 1.16.2.1 2005/07/06 20:54:49 guy Exp $";
462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h>
482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h>
492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h"
512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ASCII_LINELENGTH 300
532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define HEXDUMP_BYTES_PER_LINE 16
542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define HEXDUMP_SHORTS_PER_LINE (HEXDUMP_BYTES_PER_LINE / 2)
552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define HEXDUMP_HEXSTUFF_PER_SHORT 5 /* 4 hex digits and a space */
562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define HEXDUMP_HEXSTUFF_PER_LINE \
572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(HEXDUMP_HEXSTUFF_PER_SHORT * HEXDUMP_SHORTS_PER_LINE)
582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectascii_print(register const u_char *cp, register u_int length)
612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register int s;
632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	putchar('\n');
652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	while (length > 0) {
662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		s = *cp++;
672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		length--;
682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!isgraph(s) &&
692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    (s != '\t' && s != ' ' && s != '\n' && s != '\r'))
702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			putchar('.');
712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		else
722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			putchar(s);
732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecthex_and_ascii_print_with_offset(register const char *ident,
782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    register const u_char *cp, register u_int length, register u_int oset)
792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register u_int i;
812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register int s1, s2;
822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register int nshorts;
832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	char hexstuff[HEXDUMP_SHORTS_PER_LINE*HEXDUMP_HEXSTUFF_PER_SHORT+1], *hsp;
842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	char asciistuff[ASCII_LINELENGTH+1], *asp;
852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	nshorts = length / sizeof(u_short);
872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	i = 0;
882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	hsp = hexstuff; asp = asciistuff;
892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	while (--nshorts >= 0) {
902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		s1 = *cp++;
912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		s2 = *cp++;
922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)snprintf(hsp, sizeof(hexstuff) - (hsp - hexstuff),
932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    " %02x%02x", s1, s2);
942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		hsp += HEXDUMP_HEXSTUFF_PER_SHORT;
952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		*(asp++) = (isgraph(s1) ? s1 : '.');
962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		*(asp++) = (isgraph(s2) ? s2 : '.');
972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		i++;
982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (i >= HEXDUMP_SHORTS_PER_LINE) {
992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			*hsp = *asp = '\0';
1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("%s0x%04x: %-*s  %s",
1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    ident, oset, HEXDUMP_HEXSTUFF_PER_LINE,
1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    hexstuff, asciistuff);
1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			i = 0; hsp = hexstuff; asp = asciistuff;
1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			oset += HEXDUMP_BYTES_PER_LINE;
1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (length & 1) {
1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		s1 = *cp++;
1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)snprintf(hsp, sizeof(hexstuff) - (hsp - hexstuff),
1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    " %02x", s1);
1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		hsp += 3;
1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		*(asp++) = (isgraph(s1) ? s1 : '.');
1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		++i;
1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (i > 0) {
1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		*hsp = *asp = '\0';
1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("%s0x%04x: %-*s  %s",
1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		     ident, oset, HEXDUMP_HEXSTUFF_PER_LINE,
1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		     hexstuff, asciistuff);
1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecthex_and_ascii_print(register const char *ident, register const u_char *cp,
1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    register u_int length)
1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	hex_and_ascii_print_with_offset(ident, cp, length, 0);
1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * telnet_print() wants this.  It is essentially default_print_unaligned()
1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecthex_print_with_offset(register const char *ident, register const u_char *cp, register u_int length,
1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		      register u_int oset)
1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register u_int i, s;
1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register int nshorts;
1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	nshorts = (u_int) length / sizeof(u_short);
1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	i = 0;
1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	while (--nshorts >= 0) {
1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((i++ % 8) == 0) {
1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("%s0x%04x: ", ident, oset);
1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			oset += HEXDUMP_BYTES_PER_LINE;
1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		s = *cp++;
1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" %02x%02x", s, *cp++);
1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (length & 1) {
1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((i % 8) == 0)
1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("%s0x%04x: ", ident, oset);
1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" %02x", *cp);
1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * just for completeness
1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecthex_print(register const char *ident, register const u_char *cp, register u_int length)
1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	hex_print_with_offset(ident, cp, length, 0);
1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef MAIN
1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint
1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectmain(int argc, char *argv[])
1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	hex_print("\n\t", "Hello, World!\n", 14);
1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("\n");
1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	hex_and_ascii_print("\n\t", "Hello, World!\n", 14);
1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("\n");
1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ascii_print("Hello, World!\n", 14);
1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("\n");
1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define TMSG "Now is the winter of our discontent...\n"
1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	hex_print_with_offset("\n\t", TMSG, sizeof(TMSG) - 1, 0x100);
1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("\n");
1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	hex_and_ascii_print_with_offset("\n\t", TMSG, sizeof(TMSG) - 1, 0x100);
1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("\n");
1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	exit(0);
1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* MAIN */
184