]> The Tcpdump Group git mirrors - tcpdump/blobdiff - util-print.c
Use more the ND_TTEST_1() macro
[tcpdump] / util-print.c
index 25ea1386f0b054f27b4fbd4da6cee7976bb34a85..58efc4b4b5a6dcc2c579701601284e69a0bf5198 100644 (file)
@@ -53,6 +53,7 @@
 #include <string.h>
 
 #include "netdissect.h"
+#include "extract.h"
 #include "ascii_strcasecmp.h"
 #include "timeval-operations.h"
 
@@ -93,10 +94,10 @@ fn_print_char(netdissect_options *ndo, u_char c)
  */
 int
 fn_print(netdissect_options *ndo,
-         register const u_char *s, register const u_char *ep)
+         const u_char *s, const u_char *ep)
 {
-       register int ret;
-       register u_char c;
+       int ret;
+       u_char c;
 
        ret = 1;                        /* assume truncated */
        while (ep == NULL || s < ep) {
@@ -127,10 +128,10 @@ fn_print(netdissect_options *ndo,
  */
 u_int
 fn_printztn(netdissect_options *ndo,
-         register const u_char *s, register u_int n, register const u_char *ep)
+         const u_char *s, u_int n, const u_char *ep)
 {
-       register u_int bytes;
-       register u_char c;
+       u_int bytes;
+       u_char c;
 
        bytes = 0;
        for (;;) {
@@ -176,9 +177,9 @@ fn_printztn(netdissect_options *ndo,
  */
 int
 fn_printn(netdissect_options *ndo,
-          register const u_char *s, register u_int n, register const u_char *ep)
+          const u_char *s, u_int n, const u_char *ep)
 {
-       register u_char c;
+       u_char c;
 
        while (n > 0 && (ep == NULL || s < ep)) {
                n--;
@@ -205,11 +206,11 @@ fn_printn(netdissect_options *ndo,
  */
 int
 fn_printzp(netdissect_options *ndo,
-           register const u_char *s, register u_int n,
-           register const u_char *ep)
+           const u_char *s, u_int n,
+           const u_char *ep)
 {
-       register int ret;
-       register u_char c;
+       int ret;
+       u_char c;
 
        ret = 1;                        /* assume truncated */
        while (n > 0 && (ep == NULL || s < ep)) {
@@ -311,9 +312,9 @@ _U_
  */
 void
 ts_print(netdissect_options *ndo,
-         register const struct timeval *tvp)
+         const struct timeval *tvp)
 {
-       register int s;
+       int s;
        struct tm *tm;
        time_t Time;
        char buf[TS_BUF_SIZE];
@@ -479,8 +480,8 @@ print_unknown_data(netdissect_options *ndo, const u_char *cp,const char *ident,i
  * Convert a token value to a string; use "fmt" if not found.
  */
 const char *
-tok2strbuf(register const struct tok *lp, register const char *fmt,
-          register u_int v, char *buf, size_t bufsize)
+tok2strbuf(const struct tok *lp, const char *fmt,
+          u_int v, char *buf, size_t bufsize)
 {
        if (lp != NULL) {
                while (lp->s != NULL) {
@@ -502,8 +503,8 @@ tok2strbuf(register const struct tok *lp, register const char *fmt,
  * in round-robin fashion.
  */
 const char *
-tok2str(register const struct tok *lp, register const char *fmt,
-       register u_int v)
+tok2str(const struct tok *lp, const char *fmt,
+       u_int v)
 {
        static char buf[4][TOKBUFSIZE];
        static int idx = 0;
@@ -520,14 +521,14 @@ tok2str(register const struct tok *lp, register const char *fmt,
  * if the s field is positive.
  */
 static char *
-bittok2str_internal(register const struct tok *lp, register const char *fmt,
-          register u_int v, const char *sep)
+bittok2str_internal(const struct tok *lp, const char *fmt,
+          u_int v, const char *sep)
 {
         static char buf[1024+1]; /* our string buffer */
         char *bufp = buf;
         size_t space_left = sizeof(buf), string_size;
-        register u_int rotbit; /* this is the bit we rotate through all bitpositions */
-        register u_int tokval;
+        u_int rotbit; /* this is the bit we rotate through all bitpositions */
+        u_int tokval;
         const char * sepstr = "";
 
        while (lp != NULL && lp->s != NULL) {
@@ -573,8 +574,8 @@ bittok2str_internal(register const struct tok *lp, register const char *fmt,
  * this is useful for parsing bitfields, the output strings are not seperated.
  */
 char *
-bittok2str_nosep(register const struct tok *lp, register const char *fmt,
-          register u_int v)
+bittok2str_nosep(const struct tok *lp, const char *fmt,
+          u_int v)
 {
     return (bittok2str_internal(lp, fmt, v, ""));
 }
@@ -584,8 +585,8 @@ bittok2str_nosep(register const struct tok *lp, register const char *fmt,
  * this is useful for parsing bitfields, the output strings are comma seperated.
  */
 char *
-bittok2str(register const struct tok *lp, register const char *fmt,
-          register u_int v)
+bittok2str(const struct tok *lp, const char *fmt,
+          u_int v)
 {
     return (bittok2str_internal(lp, fmt, v, ", "));
 }
@@ -597,8 +598,8 @@ bittok2str(register const struct tok *lp, register const char *fmt,
  * correct for bounds-checking.
  */
 const char *
-tok2strary_internal(register const char **lp, int n, register const char *fmt,
-       register int v)
+tok2strary_internal(const char **lp, int n, const char *fmt,
+       int v)
 {
        static char buf[TOKBUFSIZE];
 
@@ -690,7 +691,7 @@ fetch_token(netdissect_options *ndo, const u_char *pptr, u_int idx, u_int len,
        size_t toklen = 0;
 
        for (; idx < len; idx++) {
-               if (!ND_TTEST(*(pptr + idx))) {
+               if (!ND_TTEST_1(pptr + idx)) {
                        /* ran past end of captured data */
                        return (0);
                }
@@ -724,7 +725,7 @@ fetch_token(netdissect_options *ndo, const u_char *pptr, u_int idx, u_int len,
         * an end-of-line (CR or LF).
         */
        for (; idx < len; idx++) {
-               if (!ND_TTEST(*(pptr + idx))) {
+               if (!ND_TTEST_1(pptr + idx)) {
                        /* ran past end of captured data */
                        break;
                }
@@ -759,7 +760,7 @@ print_txt_line(netdissect_options *ndo, const char *protoname,
 
        startidx = idx;
        while (idx < len) {
-               ND_TCHECK(*(pptr+idx));
+               ND_TCHECK_1(pptr + idx);
                if (*(pptr+idx) == '\n') {
                        /*
                         * LF without CR; end of line.
@@ -775,7 +776,7 @@ print_txt_line(netdissect_options *ndo, const char *protoname,
                                /* not in this packet */
                                return (0);
                        }
-                       ND_TCHECK(*(pptr+idx+1));
+                       ND_TCHECK_1(pptr + idx + 1);
                        if (*(pptr+idx+1) == '\n') {
                                /*
                                 * CR-LF; end of line.
@@ -946,11 +947,38 @@ safeputchar(netdissect_options *ndo,
        ND_PRINT((ndo, (c < 0x80 && ND_ISPRINT(c)) ? "%c" : "\\0x%02x", c));
 }
 
-#ifdef LBL_ALIGN
+#if (defined(__i386__) || defined(_M_IX86) || defined(__X86__) || defined(__x86_64__) || defined(_M_X64)) || \
+    (defined(__arm__) || defined(_M_ARM) || defined(__aarch64__)) || \
+    (defined(__m68k__) && (!defined(__mc68000__) && !defined(__mc68010__))) || \
+    (defined(__ppc__) || defined(__ppc64__) || defined(_M_PPC) || defined(_ARCH_PPC) || defined(_ARCH_PPC64)) || \
+    (defined(__s390__) || defined(__s390x__) || defined(__zarch__)) || \
+    defined(__vax__)
 /*
- * Some compilers try to optimize memcpy(), using the alignment constraint
- * on the argument pointer type.  by using this function, we try to avoid the
- * optimization.
+ * The procesor natively handles unaligned loads, so just use memcpy()
+ * and memcmp(), to enable those optimizations.
+ *
+ * XXX - are those all the x86 tests we need?
+ * XXX - do we need to worry about ARMv1 through ARMv5, which didn't
+ * support unaligned loads, and, if so, do we need to worry about all
+ * of them, or just some of them, e.g. ARMv5?
+ * XXX - are those the only 68k tests we need not to generated
+ * unaligned accesses if the target is the 68000 or 68010?
+ * XXX - are there any tests we don't need, because some definitions are for
+ * compilers that also predefine the GCC symbols?
+ * XXX - do we need to test for both 32-bit and 64-bit versions of those
+ * architectures in all cases?
+ */
+#else
+/*
+ * The processor doesn't natively handle unaligned loads,
+ * and the compiler might "helpfully" optimize memcpy()
+ * and memcmp(), when handed pointers that would normally
+ * be properly aligned, into sequences that assume proper
+ * alignment.
+ *
+ * Do copies and compares of possibly-unaligned data by
+ * calling routines that wrap memcpy() and memcmp(), to
+ * prevent that optimization.
  */
 void
 unaligned_memcpy(void *p, const void *q, size_t l)