+void
+rule_collection_init(struct rule_collection *rules)
+{
+ rules->rules = rules->stub;
+ rules->n = 0;
+ rules->capacity = ARRAY_SIZE(rules->stub);
+}
+
+void
+rule_collection_add(struct rule_collection *rules, struct rule *rule)
+{
+ if (rules->n >= rules->capacity) {
+ size_t old_size, new_size;
+
+ old_size = rules->capacity * sizeof *rules->rules;
+ rules->capacity *= 2;
+ new_size = rules->capacity * sizeof *rules->rules;
+
+ if (rules->rules == rules->stub) {
+ rules->rules = xmalloc(new_size);
+ memcpy(rules->rules, rules->stub, old_size);
+ } else {
+ rules->rules = xrealloc(rules->rules, new_size);
+ }
+ }
+
+ rules->rules[rules->n++] = rule;
+}
+
+void
+rule_collection_destroy(struct rule_collection *rules)
+{
+ if (rules->rules != rules->stub) {
+ free(rules->rules);
+ }
+}
+