X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fofpbuf.c;h=91ea36303f9f2d06be06d412f730f3d14eb1a4c4;hb=e05924baf0c757b579eef2b3743130ade4b1a93c;hp=77595e032f6f7b61542958d0023110750a8ab504;hpb=0bc9407dbbe18734c25e9dc470592def5cb27077;p=openvswitch diff --git a/lib/ofpbuf.c b/lib/ofpbuf.c index 77595e03..91ea3630 100644 --- a/lib/ofpbuf.c +++ b/lib/ofpbuf.c @@ -242,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