diff rvinterf/trdump.c @ 133:56b53c289785

rvtdump: some restructuring
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Sat, 02 Nov 2013 22:24:14 +0000
parents f4f0c8738dcb
children e01e3a60c858
line wrap: on
line diff
--- a/rvinterf/trdump.c	Sat Nov 02 01:48:11 2013 +0000
+++ b/rvinterf/trdump.c	Sat Nov 02 22:24:14 2013 +0000
@@ -4,83 +4,136 @@
 
 #include <sys/types.h>
 #include <stdio.h>
+#include <string.h>
+#include <strings.h>
 #include "pktmux.h"
 
 extern u_char rxpkt[];
 extern size_t rxpkt_len;
 
-void
-print_presumed_string(str, len)
-	u_char *str;
-	size_t len;
-{
-	int i, c;
-
-	if (len >= 3 &&
-	    (str[len-2] == '\r' && str[len-1] == '\n' ||
-	     str[len-2] == '\n' && str[len-1] == '\r'))
-		len -= 2;
-	for (i = 0; i < len; i++) {
-		c = str[i];
-		if (c & 0x80) {
-			putchar('M');
-			putchar('-');
-			c &= 0x7F;
-		}
-		if (c < 0x20) {
-			putchar('^');
-			putchar(c + '@');
-		} else if (c == 0x7F) {
-			putchar('^');
-			putchar('?');
-		} else
-			putchar(c);
-	}
-}
+char pr_item[4096];
 
 void
 print_rv_trace()
 {
-	int i;
+	int i, c;
+	char *dp;
 
-	fputs("RV ", stdout);
+	dp = pr_item;
+	strcpy(dp, "RV ");
+	dp += 3;
 	/* the SWE static ID is sent MSB first */
-	for (i = 1; i <= 4; i++)
-		printf("%02X", rxpkt[i]);
+	for (i = 1; i <= 4; i++) {
+		sprintf(dp, "%02X", rxpkt[i]);
+		dp += 2;
+	}
 	/* severity level */
-	printf(" %d ", rxpkt[5]);
-	print_presumed_string(rxpkt + 6, rxpkt_len - 6);
-	putchar('\n');
+	sprintf(dp, " %d ", rxpkt[5]);
+	dp = index(dp, '\0');
+	for (i = 6; i < rxpkt_len; i++) {
+		c = rxpkt[i];
+		if (c & 0x80) {
+			*dp++ = 'M';
+			*dp++ = '-';
+			c &= 0x7F;
+		}
+		if (c < 0x20) {
+			*dp++ = '^';
+			*dp++ = c + '@';
+		} else if (c == 0x7F) {
+			*dp++ = '^';
+			*dp++ = '?';
+		} else
+			*dp++ = c;
+	}
+	*dp = '\0';
+	print_item();
 }
 
 void
 print_l1_trace()
 {
-	fputs("L1: ", stdout);
-	print_presumed_string(rxpkt + 1, rxpkt_len - 1);
-	putchar('\n');
+	int i, c;
+	char *dp;
+
+	dp = pr_item;
+	strcpy(dp, "L1: ");
+	dp += 4;
+	for (i = 1; i < rxpkt_len; i++) {
+		if ((i+1 < rxpkt_len) &&
+		    (rxpkt[i] == '\r' && rxpkt[i+1] == '\n' ||
+		     rxpkt[i] == '\n' && rxpkt[i+1] == '\r')) {
+			*dp = '\0';
+			print_item();
+			if (i+2 == rxpkt_len)
+				return;
+			dp = pr_item;
+			*dp++ = '+';
+			*dp++ = ' ';
+			i++;
+			continue;
+		}
+		c = rxpkt[i];
+		if (c & 0x80) {
+			*dp++ = 'M';
+			*dp++ = '-';
+			c &= 0x7F;
+		}
+		if (c < 0x20) {
+			*dp++ = '^';
+			*dp++ = c + '@';
+		} else if (c == 0x7F) {
+			*dp++ = '^';
+			*dp++ = '?';
+		} else
+			*dp++ = c;
+	}
+	/* will get here only if no newline sequence at the end */
+	*dp = '\0';
+	print_item();
 }
 
 void
 print_g23_trace()
 {
 	int i;
+	char *dp;
 
-	fputs("G23:", stdout);
-	for (i = 1; i < rxpkt_len; i++)
-		printf(" %02X", rxpkt[i]);
-	putchar('\n');
+	dp = pr_item;
+	strcpy(dp, "G23:");
+	dp += 4;
+	for (i = 1; i < rxpkt_len; i++) {
+		sprintf(dp, " %02X", rxpkt[i]);
+		dp += 3;
+	}
+	*dp = '\0';
+	print_item();
+}
+
+void
+print_unknown_packet()
+{
+	int i;
+	char *dp;
+
+	dp = pr_item;
+	strcpy(dp, "UNK:");
+	dp += 4;
+	for (i = 0; i < rxpkt_len; i++) {
+		sprintf(dp, " %02X", rxpkt[i]);
+		dp += 3;
+	}
+	*dp = '\0';
+	print_item();
 }
 
 void
 print_rx_packet()
 {
-	int i;
-
 	switch (rxpkt[0]) {
 	case RVT_RV_HEADER:
 		if (rxpkt_len < 6)
-			break;
+			goto unknown;
 		print_rv_trace();
 		return;
 	case RVT_L1_HEADER:
@@ -89,10 +142,8 @@
 	case RVT_L23_HEADER:
 		print_g23_trace();
 		return;
+	default:
+	unknown:
+		print_unknown_packet();
 	}
-	/* default case: print the whole packet in hex as an unknown */
-	fputs("UNK:", stdout);
-	for (i = 0; i < rxpkt_len; i++)
-		printf(" %02X", rxpkt[i]);
-	putchar('\n');
 }