};
/* Closest member to this in a non-empty map. */
-static struct strmap *closest(struct strmap *n, const char *member)
+static struct strmap *closest(struct strmap *n, const char *member, size_t len)
{
- size_t len = strlen(member);
const u8 *bytes = (const u8 *)member;
/* Anything with NULL value is a node. */
return n;
}
-void *strmap_get_(const struct strmap *map, const char *member)
+void *strmap_getn_(const struct strmap *map,
+ const char *member, size_t memberlen)
{
struct strmap *n;
/* Not empty map? */
if (map->u.n) {
- n = closest((struct strmap *)map, member);
- if (streq(member, n->u.s))
+ n = closest((struct strmap *)map, member, memberlen);
+ if (!strncmp(member, n->u.s, memberlen) && !n->u.s[memberlen])
return n->v;
}
errno = ENOENT;
return NULL;
}
+void *strmap_get_(const struct strmap *map, const char *member)
+{
+ return strmap_getn_(map, member, strlen(member));
+}
+
bool strmap_add_(struct strmap *map, const char *member, const void *value)
{
size_t len = strlen(member);
}
/* Find closest existing member. */
- n = closest(map, member);
+ n = closest(map, member, len);
/* Find where they differ. */
for (byte_num = 0; n->u.s[byte_num] == member[byte_num]; byte_num++) {
/**
* strmap_get - get a value from a string map
* @map: the typed strmap to search.
- * @member: the string to search for.
+ * @member: the string to search for (nul terminated)
*
* Returns the value, or NULL if it isn't in the map (and sets errno = ENOENT).
*
tcon_cast((map), canary, strmap_get_(tcon_unwrap(map), (member)))
void *strmap_get_(const struct strmap *map, const char *member);
+/**
+ * strmap_getn - get a value from a string map
+ * @map: the typed strmap to search.
+ * @member: the string to search for.
+ * @memberlen: the length of @member.
+ *
+ * Returns the value, or NULL if it isn't in the map (and sets errno = ENOENT).
+ *
+ * Example:
+ * val = strmap_getn(&map, "hello", 5);
+ * if (val)
+ * printf("hello => %i\n", *val);
+ */
+#define strmap_getn(map, member, n) \
+ tcon_cast((map), canary, strmap_getn_(tcon_unwrap(map), (member), (n)))
+void *strmap_getn_(const struct strmap *map, const char *member, size_t n);
+
/**
* strmap_add - place a member in the string map.
* @map: the typed strmap to add to.