struct agent *
search_agent(
const char *name,
- size_t length,
+ uint8_t length,
struct agent ***ppprev
) {
struct agent *it, **pprev;
pprev = &agents;
- while((it = *pprev)
- && ((uint8_t)length != it->len || memcmp(it->name, name, length)))
+ it = agents;
+ while(it && length > it->len) {
pprev = &it->next;
+ it = it->next;
+ }
+ while(it && length == it->len) {
+ if (!memcmp(it->name, name, length)) {
+ *ppprev = pprev;
+ return it;
+ }
+ pprev = &it->next;
+ it = it->next;
+ }
*ppprev = pprev;
- return it;
+ return NULL;
}
/**
required_agent(
const char *value
) {
- struct agent **pprev;
+ struct agent **pprev, *agent;
size_t length;
for (length = 0 ; length <= UINT8_MAX && value[length] ; length++)
- if (value[length] == AGENT_SEPARATOR_CHARACTER)
- return search_agent(value, length, &pprev);
+ if (value[length] == AGENT_SEPARATOR_CHARACTER) {
+ agent = search_agent(value, (uint8_t)length, &pprev);
+ if (agent)
+ return agent;
+ }
return NULL;
}
void *closure
) {
struct agent *agent, **pprev;
- size_t length;
+ uint8_t length;
/* compute and check name */
length = agent_check_name(name);
return -EEXIST;
/* allocates the memory */
- agent = malloc(sizeof *agent + 1 + length);
+ agent = malloc(sizeof *agent + 1 + (size_t)length);
if (!agent)
return -ENOMEM;
/* initialize the agent */
- agent->next = 0;
agent->agent_cb = agent_cb;
agent->closure = closure;
- agent->len = (uint8_t)length;
- memcpy(agent->name, name, length + 1);
+ agent->len = length;
+ memcpy(agent->name, name, 1 + (size_t)length);
+ agent->next = *pprev;
*pprev = agent;
return 0;
const char *name
) {
struct agent *agent, **pprev;
- size_t length;
+ uint8_t length;
/* compute and check name length */
length = agent_check_name(name);
* @param name the name to check
* @return the length of the name or zero if invalid
*/
-size_t
+uint8_t
agent_check_name(
const char *name
) {
char c;
- size_t length = 0;
+ uint8_t length = 0;
+
if (name) {
while ((c = name[length])) {
- if (length > UINT8_MAX
- || (!isalnum(c) && !strchr("@_-$", c))) {
+ if (!isalnum(c) && !strchr("@_-$", c)) {
length = 0;
break;
}
- length++;
+ if (!++length)
+ break;
}
}
return length;