> Good point, here's a fixed version:
New version looks good to me.
Ethan
>
> /* Parses a subfield from the beginning of '*sp' into 'sf'. If successful,
> * returns NULL and advances '*sp' to the first byte following the parsed
> * string. On failure, returns a malloc()'d error message, does not modify
> * '*sp', and does not properly initialize 'sf'.
> *
> * The syntax parsed from '*sp' takes the form "header[start..end]" where
> * 'header' is the name of an NXM field and 'start' and 'end' are (inclusive)
> * bit indexes. "..end" may be omitted to indicate a single bit.
> "start..end"
> * may both be omitted (the [] are still required) to indicate an entire
> * field. */
> char *
> mf_parse_subfield__(struct mf_subfield *sf, const char **sp)
> {
> const struct mf_field *field;
> const char *name;
> int start, end;
> const char *s;
> int name_len;
> bool wild;
>
> s = *sp;
> name = s;
> name_len = strcspn(s, "[");
> if (s[name_len] != '[') {
> return xasprintf("%s: missing [ looking for field name", *sp);
> }
>
> field = mf_parse_subfield_name(name, name_len, &wild);
> if (!field) {
> return xasprintf("%s: unknown field `%.*s'", *sp, name_len, s);
> }
>
> s += name_len;
> if (sscanf(s, "[%d..%d]", &start, &end) == 2) {
> /* Nothing to do. */
> } else if (sscanf(s, "[%d]", &start) == 1) {
> end = start;
> } else if (!strncmp(s, "[]", 2)) {
> start = 0;
> end = field->n_bits - 1;
> } else {
> return xasprintf("%s: syntax error expecting [] or [<bit>] or "
> "[<start>..<end>]", *sp);
> }
> s = strchr(s, ']') + 1;
>
> if (start > end) {
> return xasprintf("%s: starting bit %d is after ending bit %d",
> *sp, start, end);
> } else if (start >= field->n_bits) {
> return xasprintf("%s: starting bit %d is not valid because field is "
> "only %d bits wide", *sp, start, field->n_bits);
> } else if (end >= field->n_bits){
> return xasprintf("%s: ending bit %d is not valid because field is "
> "only %d bits wide", *sp, end, field->n_bits);
> }
>
> sf->field = field;
> sf->ofs = start;
> sf->n_bits = end - start + 1;
>
> *sp = s;
> return NULL;
> }
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev