diff options
author | Guy Harris <guy@alum.mit.edu> | 1999-03-31 08:20:28 +0000 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 1999-03-31 08:20:28 +0000 |
commit | f1e024b6057ab5c7128eefe9cc31dbcf87651f18 (patch) | |
tree | 7757124c109b8e721fea9646f28b31020df80cbc /packet.c | |
parent | ccba477d7fbd4dc69691fa6329770a6e110d7940 (diff) | |
download | wireshark-f1e024b6057ab5c7128eefe9cc31dbcf87651f18.tar.gz |
Move the bitfield-decoding routines to "packet.h", along with other
helper routines for packet dissecting, and away from "util.c", which is
now all GUI-related. (Among other things, this makes life more pleasant
for Gilbert Ramirez's "tethereal" stuff, although a lot more separation
of GUI from other stuff needs to be done to make that - or a
"curses"-based variant of Ethereal, or a variant using some other GUI
toolkit - work smoothly.)
svn path=/trunk/; revision=235
Diffstat (limited to 'packet.c')
-rw-r--r-- | packet.c | 82 |
1 files changed, 81 insertions, 1 deletions
@@ -1,7 +1,7 @@ /* packet.c * Routines for packet disassembly * - * $Id: packet.c,v 1.23 1999/03/30 04:41:01 guy Exp $ + * $Id: packet.c,v 1.24 1999/03/31 08:20:28 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@zing.org> @@ -360,6 +360,86 @@ match_strval(guint32 val, const value_string *vs) { return(NULL); } +/* Generate, into "buf", a string showing the bits of a bitfield. + Return a pointer to the character after that string. */ +static char * +decode_bitfield_value(char *buf, guint32 val, guint32 mask, int width) +{ + int i; + guint32 bit; + char *p; + + i = 0; + p = buf; + bit = 1 << (width - 1); + for (;;) { + if (mask & bit) { + /* This bit is part of the field. Show its value. */ + if (val & bit) + *p++ = '1'; + else + *p++ = '0'; + } else { + /* This bit is not part of the field. */ + *p++ = '.'; + } + bit >>= 1; + i++; + if (i >= width) + break; + if (i % 4 == 0) + *p++ = ' '; + } + strcpy(p, " = "); + p += 3; + return p; +} + +/* Generate a string describing a Boolean bitfield (a one-bit field that + says something is either true of false). */ +const char * +decode_boolean_bitfield(guint32 val, guint32 mask, int width, + const char *truedesc, const char *falsedesc) +{ + static char buf[1025]; + char *p; + + p = decode_bitfield_value(buf, val, mask, width); + if (val & mask) + strcpy(p, truedesc); + else + strcpy(p, falsedesc); + return buf; +} + +/* Generate a string describing an enumerated bitfield (an N-bit field + with various specific values having particular names). */ +const char * +decode_enumerated_bitfield(guint32 val, guint32 mask, int width, + const value_string *tab, const char *fmt) +{ + static char buf[1025]; + char *p; + + p = decode_bitfield_value(buf, val, mask, width); + sprintf(p, fmt, val_to_str(val & mask, tab, "Unknown")); + return buf; +} + +/* Generate a string describing a numeric bitfield (an N-bit field whose + value is just a number). */ +const char * +decode_numeric_bitfield(guint32 val, guint32 mask, int width, + const char *fmt) +{ + static char buf[1025]; + char *p; + + p = decode_bitfield_value(buf, val, mask, width); + sprintf(p, fmt, val & mask); + return buf; +} + /* Checks to see if a particular packet information element is needed for the packet list */ gint |