static user_t *pick_a_sucker(channel_t *c) { int slot = arc4random() % MOWGLI_LIST_LENGTH(&c->members); chanuser_t *cu; cu = (chanuser_t *) mowgli_node_nth_data(&c->members, slot); while (cu != NULL && is_internal_client(cu->user)) { slot = arc4random() % MOWGLI_LIST_LENGTH(&c->members); cu = (chanuser_t *) mowgli_node_nth_data(&c->members, slot); } return cu != NULL ? cu->user : NULL; }
void mowgli_formatter_format_from_argstack(char *buf, size_t bufstr, const char *fmtstr, const char *descstr, mowgli_argstack_t *stack) { size_t pos = 0; char *i = buf; const char *fiter = fmtstr; return_if_fail(buf != NULL); return_if_fail(fmtstr != NULL); return_if_fail(descstr != NULL); *i = '\0'; while (*fiter && pos <= bufstr) { int arg; mowgli_argstack_element_t *e; pos = strlen(buf); switch(*fiter) { case '%': fiter++; arg = atoi(fiter); e = mowgli_node_nth_data(&stack->stack, arg - 1); while (isdigit(*fiter)) fiter++; if (e == NULL) { arg = snprintf(i, bufstr - (i - buf), "(unknown)"); i += arg; continue; } switch(e->type) { case MOWGLI_ARG_STRING: arg = snprintf(i, bufstr - (i - buf), "%s", e->data.string); i += arg; break; case MOWGLI_ARG_NUMERIC: arg = snprintf(i, bufstr - (i - buf), "%d", e->data.numeric); i += arg; break; case MOWGLI_ARG_POINTER: arg = snprintf(i, bufstr - (i - buf), "%p", e->data.pointer); i += arg; break; case MOWGLI_ARG_BOOLEAN: arg = snprintf(i, bufstr - (i - buf), "%s", e->data.boolean ? "TRUE" : "FALSE"); i += arg; break; default: mowgli_log("unhandled type"); break; } continue; break; default: *i = *fiter; } i++; fiter++; } }