From: Andre Noll <maan@tuebingen.mpg.de>
Date: Tue, 6 Oct 2015 02:32:31 +0000 (+0000)
Subject: Constify struct filter access and introduce filter_get().
X-Git-Tag: v0.5.6~65
X-Git-Url: https://git.tue.mpg.de/?a=commitdiff_plain;h=b0a115ed731885c92fcd8b6fb1c89b97dca410e8;p=paraslash.git

Constify struct filter access and introduce filter_get().

This modifies all users of the filter API to not access the filter
array directly. Instead all callers now obtain a const pointer to
the filter structure through the new filter_get() accessor function.

However, the filter array can not be made constant yet because the
->init methods modify the filter structure. This requires some casts
in filter_common.c unfortunately.
---

diff --git a/audiod.c b/audiod.c
index e5f9c6be..798142f3 100644
--- a/audiod.c
+++ b/audiod.c
@@ -525,11 +525,11 @@ static void close_filters(struct slot_info *s)
 		return;
 	for (i = a->num_filters - 1; i >= 0; i--) {
 		struct filter_node *fn = s->fns + i;
-		struct filter *f;
+		const struct filter *f;
 
 		if (!fn)
 			continue;
-		f = filters + fn->filter_num;
+		f = filter_get(fn->filter_num);
 		if (f->close)
 			f->close(fn);
 		btr_remove_node(&fn->btrn);
@@ -588,7 +588,7 @@ static void open_filters(struct slot_info *s)
 	parent = s->receiver_node->btrn;
 	for (i = 0; i < nf; i++) {
 		char buf[20];
-		struct filter *f = filters + a->filter_nums[i];
+		const struct filter *f = filter_get(a->filter_nums[i]);
 		fn = s->fns + i;
 		fn->filter_num = a->filter_nums[i];
 		fn->conf = a->filter_conf[i];
@@ -858,7 +858,7 @@ static int add_filter(int format, char *cmdline)
 	a->filter_conf[nf] = cfg;
 	a->num_filters++;
 	PARA_INFO_LOG("%s filter %d: %s\n", audio_formats[format], nf,
-		filters[filter_num].name);
+		filter_get(filter_num)->name);
 	return filter_num;
 }
 
@@ -993,20 +993,20 @@ static int init_default_filters(void)
 		}
 		/* add "dec" to audio format name */
 		tmp = make_message("%sdec", audio_formats[i]);
-		for (j = 0; filters[j].name; j++)
-			if (!strcmp(tmp, filters[j].name))
+		for (j = 0; filter_get(j); j++)
+			if (!strcmp(tmp, filter_get(j)->name))
 				break;
 		free(tmp);
 		ret = -E_UNSUPPORTED_FILTER;
-		if (!filters[j].name)
+		if (!filter_get(j))
 			goto out;
-		tmp = para_strdup(filters[j].name);
+		tmp = para_strdup(filter_get(j)->name);
 		ret = add_filter(i, tmp);
 		free(tmp);
 		if (ret < 0)
 			goto out;
 		PARA_INFO_LOG("%s -> default filter: %s\n", audio_formats[i],
-			filters[j].name);
+			filter_get(j)->name);
 	}
 out:
 	return ret;
diff --git a/filter.c b/filter.c
index f9ba17ad..1ba12689 100644
--- a/filter.c
+++ b/filter.c
@@ -106,7 +106,7 @@ int main(int argc, char *argv[])
 {
 	static struct sched s;
 	int i, ret;
-	struct filter *f;
+	const struct filter *f;
 	struct btr_node *parent;
 	struct filter_node **fns;
 
@@ -133,7 +133,7 @@ int main(int argc, char *argv[])
 			goto out_cleanup;
 		}
 		fn->filter_num = ret;
-		f = filters + fn->filter_num;
+		f = filter_get(fn->filter_num);
 		PARA_DEBUG_LOG("filter #%d: %s\n", i, f->name);
 		fn->btrn = btr_new_node(&(struct btr_node_description)
 			EMBRACE(.name = f->name, .parent = parent,
@@ -159,7 +159,7 @@ out_cleanup:
 	for (i--; i >= 0; i--) {
 		struct filter_node *fn = fns[i];
 
-		f = filters + fn->filter_num;
+		f = filter_get(fn->filter_num);
 		if (f->close)
 			f->close(fn);
 		btr_remove_node(&fn->btrn);
diff --git a/filter.h b/filter.h
index ab312f5d..31eedcc0 100644
--- a/filter.h
+++ b/filter.h
@@ -141,4 +141,4 @@ static inline void write_int16_host_endian(char *buf, int val)
 DECLARE_FILTER_INITS
 
 /** The filter array, one structure for each supported filter. */
-extern struct filter filters[NUM_SUPPORTED_FILTERS];
+const struct filter *filter_get(int filter_num);
diff --git a/filter_common.c b/filter_common.c
index 53cde746..099d056e 100644
--- a/filter_common.c
+++ b/filter_common.c
@@ -23,7 +23,14 @@
 #define FOR_EACH_SUPPORTED_FILTER(j)  for (j = 0; j < NUM_SUPPORTED_FILTERS; j++)
 
 /** The array of supported filters. */
-struct filter filters[NUM_SUPPORTED_FILTERS] = {FILTER_ARRAY};
+static struct filter filters[NUM_SUPPORTED_FILTERS] = {FILTER_ARRAY};
+
+const struct filter *filter_get(int filter_num)
+{
+	assert(filter_num >= 0);
+	assert(filter_num < NUM_SUPPORTED_FILTERS);
+	return filters + filter_num;
+}
 
 /**
  * Call the init function of each supported filter.
@@ -34,7 +41,7 @@ void filter_init(void)
 	int i;
 
 	FOR_EACH_SUPPORTED_FILTER(i)
-		filters[i].init(filters + i);
+		filter_get(i)->init((struct filter *)filter_get(i));
 }
 
 /*
@@ -43,7 +50,7 @@ void filter_init(void)
  */
 static int parse_filter_args(int filter_num, char *options, void **conf)
 {
-	struct filter *f = &filters[filter_num];
+	const struct filter *f = filter_get(filter_num);
 	int ret, argc;
 	char **argv;
 
@@ -83,7 +90,7 @@ int check_filter_arg(char *fa, void **conf)
 	*conf = NULL;
 //	PARA_DEBUG_LOG("arg: %s\n", fa);
 	FOR_EACH_SUPPORTED_FILTER(j) {
-		const char *name = filters[j].name;
+		const char *name = filter_get(j)->name;
 		size_t len = strlen(name);
 		char c;
 		if (strlen(fa) < len)
@@ -93,7 +100,7 @@ int check_filter_arg(char *fa, void **conf)
 		c = fa[len];
 		if (c && c != ' ')
 			continue;
-		if (c && !filters[j].parse_config)
+		if (c && !filter_get(j)->parse_config)
 			return -E_BAD_FILTER_OPTIONS;
 		return parse_filter_args(j, c? fa + len + 1 :
 			fa + strlen(fa), conf);
@@ -116,12 +123,12 @@ void print_filter_helps(unsigned flags)
 			printf_or_die("\n                  ");
 			num = 0;
 		}
-		num += printf_or_die("%s%s", i? " " : "", filters[i].name);
+		num += printf_or_die("%s%s", i? " " : "", filter_get(i)->name);
 	}
 	printf_or_die("\n");
 
 	FOR_EACH_SUPPORTED_FILTER(i) {
-		struct filter *f = filters + i;
+		struct filter *f = (struct filter *)filter_get(i);
 
 		if (!f->help.short_help)
 			continue;
diff --git a/play.c b/play.c
index 23d184da..6e6b91f9 100644
--- a/play.c
+++ b/play.c
@@ -263,7 +263,7 @@ static int get_playback_error(struct play_task *pt)
 static int eof_cleanup(struct play_task *pt)
 {
 	struct writer *w = writers + DEFAULT_WRITER;
-	struct filter *decoder = filters + pt->fn.filter_num;
+	const struct filter *decoder = filter_get(pt->fn.filter_num);
 	int ret;
 
 	ret = get_playback_error(pt);
@@ -368,7 +368,7 @@ static int load_file(struct play_task *pt)
 	const char *af;
 	char *tmp, buf[20];
 	int ret;
-	struct filter *decoder;
+	const struct filter *decoder;
 
 	btr_remove_node(&pt->rn.btrn);
 	if (!pt->rn.receiver || pt->next_file != pt->current_file) {
@@ -393,7 +393,7 @@ static int load_file(struct play_task *pt)
 	if (ret < 0)
 		goto fail;
 	pt->fn.filter_num = ret;
-	decoder = filters + ret;
+	decoder = filter_get(ret);
 	pt->fn.btrn = btr_new_node(&(struct btr_node_description)
 		EMBRACE(.name = decoder->name, .parent = pt->rn.btrn,
 			.handler = decoder->execute, .context = &pt->fn));