void hex_and_ascii_print_with_offset(netdissect_options *ndo, register const char *ident, register const u_char *cp, register u_int length, register u_int oset) { u_int caplength; register u_int i; register int s1, s2; register int nshorts; char hexstuff[HEXDUMP_SHORTS_PER_LINE*HEXDUMP_HEXSTUFF_PER_SHORT+1], *hsp; char asciistuff[ASCII_LINELENGTH+1], *asp; caplength = (ndo->ndo_snapend >= cp) ? ndo->ndo_snapend - cp : 0; if (length > caplength) length = caplength; nshorts = length / sizeof(u_short); i = 0; hsp = hexstuff; asp = asciistuff; while (--nshorts >= 0) { s1 = *cp++; s2 = *cp++; (void)snprintf(hsp, sizeof(hexstuff) - (hsp - hexstuff), " %02x%02x", s1, s2); hsp += HEXDUMP_HEXSTUFF_PER_SHORT; *(asp++) = (ND_ISGRAPH(s1) ? s1 : '.'); *(asp++) = (ND_ISGRAPH(s2) ? s2 : '.'); i++; if (i >= HEXDUMP_SHORTS_PER_LINE) { *hsp = *asp = '\0'; ND_PRINT((ndo, "%s0x%04x: %-*s %s", ident, oset, HEXDUMP_HEXSTUFF_PER_LINE, hexstuff, asciistuff)); i = 0; hsp = hexstuff; asp = asciistuff; oset += HEXDUMP_BYTES_PER_LINE; } } if (length & 1) { s1 = *cp++; (void)snprintf(hsp, sizeof(hexstuff) - (hsp - hexstuff), " %02x", s1); hsp += 3; *(asp++) = (ND_ISGRAPH(s1) ? s1 : '.'); ++i; } if (i > 0) { *hsp = *asp = '\0'; ND_PRINT((ndo, "%s0x%04x: %-*s %s", ident, oset, HEXDUMP_HEXSTUFF_PER_LINE, hexstuff, asciistuff)); } }
void ascii_print(netdissect_options *ndo, const u_char *cp, u_int length) { u_int caplength; register u_char s; caplength = (ndo->ndo_snapend >= cp) ? ndo->ndo_snapend - cp : 0; if (length > caplength) length = caplength; ND_PRINT((ndo, "\n")); while (length > 0) { s = *cp++; length--; if (s == '\r') { /* * Don't print CRs at the end of the line; they * don't belong at the ends of lines on UN*X, * and the standard I/O library will give us one * on Windows so we don't need to print one * ourselves. * * In the middle of a line, just print a '.'. */ if (length > 1 && *cp != '\n') ND_PRINT((ndo, ".")); } else { if (!ND_ISGRAPH(s) && (s != '\t' && s != ' ' && s != '\n')) ND_PRINT((ndo, ".")); else ND_PRINT((ndo, "%c", s)); } } }
void ascii_print(netdissect_options *ndo, const u_char *cp, u_int length) { register u_char s; printf("\n"); while (length > 0) { s = *cp++; length--; if (s == '\r') { /* * Don't print CRs at the end of the line; they * don't belong at the ends of lines on UN*X, * and the standard I/O library will give us one * on Windows so we don't need to print one * ourselves. * * In the middle of a line, just print a '.'. */ if (length > 1 && *cp != '\n') printf("."); } else { if (!ND_ISGRAPH(s) && (s != '\t' && s != ' ' && s != '\n')) printf("."); else printf("%c", s); } } }