Use delim_output to support proper hiding in structures and functions
diff --git a/lens_default.c b/lens_default.c
index fc8b0e4..4348c76 100644
--- a/lens_default.c
+++ b/lens_default.c
@@ -200,24 +200,40 @@
 	}
 }
 
+struct format_argument_data
+{
+	struct value *value;
+	struct value_dict *arguments;
+};
+
+static int
+format_argument_cb(FILE *stream, void *ptr)
+{
+	struct format_argument_data *data = ptr;
+	return format_argument(stream, data->value, data->arguments);
+}
+
 static int
 format_struct(FILE *stream, struct value *value, struct value_dict *arguments)
 {
 	int written = 0;
 	if (acc_fprintf(&written, stream, "{ ") < 0)
 		return -1;
+
+	int need_delim = 0;
 	size_t i;
 	for (i = 0; i < type_struct_size(value->type); ++i) {
-		if (i > 0 && acc_fprintf(&written, stream, ", ") < 0)
-			return -1;
-
 		struct value element;
 		if (value_init_element(&element, value, i) < 0)
 			return -1;
-		int o = format_argument(stream, &element, arguments);
+
+		struct format_argument_data data = { &element, arguments };
+		int o = delim_output(stream, &need_delim,
+				     format_argument_cb, &data);
 		value_destroy(&element);
 		if (o < 0)
 			return -1;
+
 		written += o;
 	}
 	if (acc_fprintf(&written, stream, " }") < 0)
diff --git a/output.c b/output.c
index 63c8ea5..94c433d 100644
--- a/output.c
+++ b/output.c
@@ -238,9 +238,9 @@
 }
 
 static int
-output_error(void)
+output_error(FILE *stream)
 {
-	return account_output(&current_column, fprintf(options.output, "?"));
+	return fprintf(stream, "?");
 }
 
 static int
@@ -383,15 +383,19 @@
 	return 0;
 }
 
-static int
-output_one(struct value *val, struct value_dict *arguments)
+struct format_argument_data
 {
-	int o = format_argument(options.output, val, arguments);
-	if (account_output(&current_column, o) < 0) {
-		if (output_error() < 0)
-			return -1;
-		o = 1;
-	}
+	struct value *value;
+	struct value_dict *arguments;
+};
+
+static int
+format_argument_cb(FILE *stream, void *ptr)
+{
+	struct format_argument_data *data = ptr;
+	int o = format_argument(stream, data->value, data->arguments);
+	if (o < 0)
+		o = output_error(stream);
 	return o;
 }
 
@@ -400,20 +404,18 @@
 	      int *need_delimp)
 {
 	size_t i;
-	int need_delim = *need_delimp;
 	for (i = start; i < end; ++i) {
-		if (need_delim
-		    && account_output(&current_column,
-				      fprintf(options.output, ", ")) < 0)
-			return -1;
 		struct value *value = val_dict_get_num(arguments, i);
 		if (value == NULL)
 			return -1;
-		need_delim = output_one(value, arguments);
-		if (need_delim < 0)
+
+		struct format_argument_data data = { value, arguments };
+		int o = delim_output(options.output, need_delimp,
+				     format_argument_cb, &data);
+		if (o < 0)
 			return -1;
+		current_column += o;
 	}
-	*need_delimp = need_delim;
 	return 0;
 }
 
@@ -565,8 +567,10 @@
 	tabto(options.align - 1);
 	fprintf(options.output, "= ");
 
-	if (context != NULL && retval.type != NULL)
-		output_one(&retval, stel->arguments);
+	if (context != NULL && retval.type != NULL) {
+		struct format_argument_data data = { &retval, stel->arguments };
+		format_argument_cb(options.output, &data);
+	}
 
 	if (own_retval)
 		value_destroy(&retval);