void irc_unqueue(irc_t *irc) { irc_queued_t *entry; size_t events = 0; /* Only when enough time has passed */ if (difftime(time(NULL), irc->lastunqueue) <= IRC_FLOOD_INTERVAL) { irc_manager_wake(irc->manager); return; } while (events != IRC_FLOOD_LINES && (entry = list_shift(irc->queue))) { const size_t targetlen = string_length(entry->target); const char *target = string_contents(entry->target); const irc_command_func_t *func = &irc_commands[entry->command]; /* If there is a payload we use the extended call */ if (entry->payload) { size_t payloadlen = string_length(entry->payload); const char *payload = string_contents(entry->payload); size_t corelen = func->baselen + targetlen + 63; /* 63 is MAX_HOST_LENGTH */ /* Split payload for 512 byte IRC line limit */ while (corelen + payloadlen > 512) { char truncate[512]; size_t size = sizeof(truncate) - corelen; strncpy(truncate, payload, size); truncate[size] = '\0'; func->extended(irc, target, truncate); /* Flood protection */ if (++events == IRC_FLOOD_LINES) { /* Construct a new partial payload */ char *move = string_move(entry->payload); entry->payload = string_create(move + (payload - move) + size); free(move); list_prepend(irc->queue, entry); break; } payloadlen -= size; payload += size; } func->extended(irc, target, payload); events++; string_destroy(entry->payload); } else { /* Otherwise we do a standard call */ func->standard(irc, target); events++; } string_destroy(entry->target); free(entry); } /* Flood protection */ if (events == IRC_FLOOD_LINES) { irc->lastunqueue = time(NULL); irc_manager_wake(irc->manager); } }
xml_token_type_t xml_get_tag_attributes(xml_reader_t *xr, xml_node_t *node) { string_t tokenValue, attrName, attrValue; xml_token_type_t token; string_init(&tokenValue); string_init(&attrName); string_init(&attrValue); token = xml_get_token(xr, &tokenValue); while (1) { if (token == RightAngle || token == RightAngleQ || token == RightAngleSlash) break; if (token != Identifier) { xml_parse_error(xr, "Unexpected token in tag attributes"); token = None; break; } string_move(&attrName, &tokenValue); token = xml_get_token(xr, &tokenValue); if (token != Equals) { xml_node_add_attr(node, attrName.string, NULL); continue; } token = xml_get_token(xr, &tokenValue); if (token != QuotedString) { xml_parse_error(xr, "Attribute value not a quoted string!"); token = None; break; } xml_debug(" attr %s=%s\n", attrName.string, tokenValue.string); xml_node_add_attr(node, attrName.string, tokenValue.string); token = xml_get_token(xr, &tokenValue); } string_destroy(&tokenValue); string_destroy(&attrName); string_destroy(&attrValue); return token; }