X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fofpbuf.c;h=91ea36303f9f2d06be06d412f730f3d14eb1a4c4;hb=e05924baf0c757b579eef2b3743130ade4b1a93c;hp=3f18d29d0f83616d6ce06583effc5e94904c9616;hpb=b3907fbc6c74ddad7507d0f7abb1f5a2528cd2be;p=openvswitch diff --git a/lib/ofpbuf.c b/lib/ofpbuf.c index 3f18d29d..91ea3630 100644 --- a/lib/ofpbuf.c +++ b/lib/ofpbuf.c @@ -40,6 +40,17 @@ ofpbuf_use(struct ofpbuf *b, void *base, size_t allocated) b->private_p = NULL; } +/* Initializes 'b' as an ofpbuf whose data starts at 'data' and continues for + * 'size' bytes. This is appropriate for an ofpbuf that will be used to + * inspect existing data, without moving it around or reallocating it, and + * generally without modifying it at all. */ +void +ofpbuf_use_const(struct ofpbuf *b, const void *data, size_t size) +{ + ofpbuf_use(b, (void *) data, size); + b->size = size; +} + /* Initializes 'b' as an empty ofpbuf with an initial capacity of 'size' * bytes. */ void @@ -231,6 +242,33 @@ ofpbuf_put(struct ofpbuf *b, const void *p, size_t size) return dst; } +/* Parses as many pairs of hex digits as possible (possibly separated by + * spaces) from the beginning of 's', appending bytes for their values to 'b'. + * Returns the first character of 's' that is not the first of a pair of hex + * digits. If 'n' is nonnull, stores the number of bytes added to 'b' in + * '*n'. */ +char * +ofpbuf_put_hex(struct ofpbuf *b, const char *s, size_t *n) +{ + size_t initial_size = b->size; + for (;;) { + uint8_t byte; + bool ok; + + s += strspn(s, " "); + byte = hexits_value(s, 2, &ok); + if (!ok) { + if (n) { + *n = b->size - initial_size; + } + return (char *) s; + } + + ofpbuf_put(b, &byte, 1); + s += 2; + } +} + /* Reserves 'size' bytes of headroom so that they can be later allocated with * ofpbuf_push_uninit() without reallocating the ofpbuf. */ void