ofpbuf: New function ofpbuf_put_hex().
authorBen Pfaff <blp@nicira.com>
Wed, 8 Dec 2010 21:09:59 +0000 (13:09 -0800)
committerBen Pfaff <blp@nicira.com>
Thu, 9 Dec 2010 22:51:31 +0000 (14:51 -0800)
This commit converts nx_match_from_string() to use this new function.  The
new function will also have another user in an upcoming commit.

lib/nx-match.c
lib/ofpbuf.c
lib/ofpbuf.h

index bcb6482aafe7a02845ec308f118a4b7160d73d57..359441da6c8ced4db66a5b928d0249e588811130 100644 (file)
@@ -749,25 +749,6 @@ parse_nxm_field_name(const char *name, int name_len)
 
     return 0;
 }
-
-static const char *
-parse_hex_bytes(struct ofpbuf *b, const char *s, unsigned int n)
-{
-    while (n--) {
-        uint8_t byte;
-        bool ok;
-
-        s += strspn(s, " ");
-        byte = hexits_value(s, 2, &ok);
-        if (!ok) {
-            ovs_fatal(0, "%.2s: hex digits expected", s);
-        }
-
-        ofpbuf_put(b, &byte, 1);
-        s += 2;
-    }
-    return s;
-}
 \f
 /* nx_match_from_string(). */
 
@@ -788,6 +769,7 @@ nx_match_from_string(const char *s, struct ofpbuf *b)
         const char *name;
         uint32_t header;
         int name_len;
+        size_t n;
 
         name = s;
         name_len = strcspn(s, "(");
@@ -803,14 +785,20 @@ nx_match_from_string(const char *s, struct ofpbuf *b)
         s += name_len + 1;
 
         nxm_put_header(b, header);
-        s = parse_hex_bytes(b, s, nxm_field_bytes(header));
+        s = ofpbuf_put_hex(b, s, &n);
+        if (n != nxm_field_bytes(header)) {
+            ovs_fatal(0, "%.2s: hex digits expected", s);
+        }
         if (NXM_HASMASK(header)) {
             s += strspn(s, " ");
             if (*s != '/') {
                 ovs_fatal(0, "%s: missing / in masked field %.*s",
                           full_s, name_len, name);
             }
-            s = parse_hex_bytes(b, s + 1, nxm_field_bytes(header));
+            s = ofpbuf_put_hex(b, s + 1, &n);
+            if (n != nxm_field_bytes(header)) {
+                ovs_fatal(0, "%.2s: hex digits expected", s);
+            }
         }
 
         s += strspn(s, " ");
index 77595e032f6f7b61542958d0023110750a8ab504..91ea36303f9f2d06be06d412f730f3d14eb1a4c4 100644 (file)
@@ -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
index a7b5ded9da0b4ef030a08b26f1da7a12ca2dad07..bd668c1e3f08f8030f810a3ee88260d8da607feb 100644 (file)
@@ -65,6 +65,7 @@ void *ofpbuf_end(const struct ofpbuf *);
 void *ofpbuf_put_uninit(struct ofpbuf *, size_t);
 void *ofpbuf_put_zeros(struct ofpbuf *, size_t);
 void *ofpbuf_put(struct ofpbuf *, const void *, size_t);
+char *ofpbuf_put_hex(struct ofpbuf *, const char *s, size_t *n);
 void ofpbuf_reserve(struct ofpbuf *, size_t);
 void *ofpbuf_push_uninit(struct ofpbuf *b, size_t);
 void *ofpbuf_push_zeros(struct ofpbuf *, size_t);