REORG: sample: move code to release a sample expression in sample.c

This code has been moved from haproxy.c to sample.c and the function
release_sample_expr can now be called from anywhere to release a sample
expression. This function will be used by the stream processing offload engine
(SPOE).
diff --git a/src/haproxy.c b/src/haproxy.c
index b899c76..c40813b 100644
--- a/src/haproxy.c
+++ b/src/haproxy.c
@@ -1342,33 +1342,6 @@
 	}
 }
 
-static void deinit_sample_arg(struct arg *p)
-{
-	struct arg *p_back = p;
-
-	if (!p)
-		return;
-
-	while (p->type != ARGT_STOP) {
-		if (p->type == ARGT_STR || p->unresolved) {
-			free(p->data.str.str);
-			p->data.str.str = NULL;
-			p->unresolved = 0;
-		}
-		else if (p->type == ARGT_REG) {
-			if (p->data.reg) {
-				regex_free(p->data.reg);
-				free(p->data.reg);
-				p->data.reg = NULL;
-			}
-		}
-		p++;
-	}
-
-	if (p_back != empty_arg_list)
-		free(p_back);
-}
-
 static void deinit_stick_rules(struct list *rules)
 {
 	struct sticking_rule *rule, *ruleb;
@@ -1376,13 +1349,7 @@
 	list_for_each_entry_safe(rule, ruleb, rules, list) {
 		LIST_DEL(&rule->list);
 		deinit_acl_cond(rule->cond);
-		if (rule->expr) {
-			struct sample_conv_expr *conv_expr, *conv_exprb;
-			list_for_each_entry_safe(conv_expr, conv_exprb, &rule->expr->conv_exprs, list)
-				deinit_sample_arg(conv_expr->arg_p);
-			deinit_sample_arg(rule->expr->arg_p);
-			free(rule->expr);
-		}
+		release_sample_expr(rule->expr);
 		free(rule);
 	}
 }