static char * genhelp_handler (void) { int i, j; unsigned long fp; struct handler * h; struct key * kw; char * reply; char * p; reply = MALLOC(INITIAL_REPLY_LEN); if (!reply) return NULL; p = reply; p += sprintf(p, VERSION_STRING); p += sprintf(p, "CLI commands reference:\n"); vector_foreach_slot (handlers, h, i) { fp = h->fingerprint; vector_foreach_slot (keys, kw, j) { if ((kw->code & fp)) { fp -= kw->code; p += sprintf(p, " %s", kw->str); p += genhelp_sprint_aliases(p, keys, kw); if (kw->has_param) p += sprintf(p, " $%s", kw->str); } } p += sprintf(p, "\n"); }
static int do_genhelp(char *reply, int maxlen, const char *cmd, int error) { int len = 0; int i, j; uint64_t fp; struct handler * h; struct key * kw; switch(error) { case ENOMEM: len += snprintf(reply + len, maxlen - len, "%s: Not enough memory\n", cmd); break; case EAGAIN: len += snprintf(reply + len, maxlen - len, "%s: not found\n", cmd); break; case EINVAL: len += snprintf(reply + len, maxlen - len, "%s: Missing argument\n", cmd); break; } if (len >= maxlen) goto out; len += snprintf(reply + len, maxlen - len, VERSION_STRING); if (len >= maxlen) goto out; len += snprintf(reply + len, maxlen - len, "CLI commands reference:\n"); if (len >= maxlen) goto out; vector_foreach_slot (handlers, h, i) { fp = h->fingerprint; vector_foreach_slot (keys, kw, j) { if ((kw->code & fp)) { fp -= kw->code; len += snprintf(reply + len , maxlen - len, " %s", kw->str); if (len >= maxlen) goto out; len += genhelp_sprint_aliases(reply + len, maxlen - len, keys, kw); if (len >= maxlen) goto out; if (kw->has_param) { len += snprintf(reply + len, maxlen - len, " $%s", kw->str); if (len >= maxlen) goto out; } } } len += snprintf(reply + len, maxlen - len, "\n"); if (len >= maxlen) goto out; }