Pass argc pointer to parse_options()

This lets us keep argc up to date as the backend picks out arguments
from the argv array.
diff --git a/clients/calibrator.c b/clients/calibrator.c
index 3b9f2fc..cc6f4ed 100644
--- a/clients/calibrator.c
+++ b/clients/calibrator.c
@@ -238,7 +238,7 @@
 	struct display *display;
 	struct calibrator *calibrator;
 
-	display = display_create(argc, argv);
+	display = display_create(&argc, argv);
 
 	if (display == NULL) {
 		fprintf(stderr, "failed to create display: %m\n");
diff --git a/clients/clickdot.c b/clients/clickdot.c
index c74bc91..714b4b9 100644
--- a/clients/clickdot.c
+++ b/clients/clickdot.c
@@ -297,7 +297,7 @@
 	struct display *display;
 	struct clickdot *clickdot;
 
-	display = display_create(argc, argv);
+	display = display_create(&argc, argv);
 	if (display == NULL) {
 		fprintf(stderr, "failed to create display: %m\n");
 		return -1;
diff --git a/clients/cliptest.c b/clients/cliptest.c
index 4dd4380..b824715 100644
--- a/clients/cliptest.c
+++ b/clients/cliptest.c
@@ -890,7 +890,7 @@
 	if (argc > 1)
 		return benchmark();
 
-	d = display_create(argc, argv);
+	d = display_create(&argc, argv);
 	if (d == NULL) {
 		fprintf(stderr, "failed to create display: %m\n");
 		return -1;
diff --git a/clients/desktop-shell.c b/clients/desktop-shell.c
index 1cae789..41e7daa 100644
--- a/clients/desktop-shell.c
+++ b/clients/desktop-shell.c
@@ -1094,7 +1094,7 @@
 	desktop.unlock_task.run = unlock_dialog_finish;
 	wl_list_init(&desktop.outputs);
 
-	desktop.display = display_create(argc, argv);
+	desktop.display = display_create(&argc, argv);
 	if (desktop.display == NULL) {
 		fprintf(stderr, "failed to create display: %m\n");
 		return -1;
diff --git a/clients/dnd.c b/clients/dnd.c
index 4aad070..140f3f4 100644
--- a/clients/dnd.c
+++ b/clients/dnd.c
@@ -614,7 +614,7 @@
 	struct dnd *dnd;
 	int i;
 
-	d = display_create(argc, argv);
+	d = display_create(&argc, argv);
 	if (d == NULL) {
 		fprintf(stderr, "failed to create display: %m\n");
 		return -1;
diff --git a/clients/editor.c b/clients/editor.c
index 32c3f9b..0de2500 100644
--- a/clients/editor.c
+++ b/clients/editor.c
@@ -1056,7 +1056,7 @@
 	g_type_init();
 #endif
 
-	editor.display = display_create(argc, argv);
+	editor.display = display_create(&argc, argv);
 	if (editor.display == NULL) {
 		fprintf(stderr, "failed to create display: %m\n");
 		return -1;
diff --git a/clients/eventdemo.c b/clients/eventdemo.c
index e59b076..05ad5dc 100644
--- a/clients/eventdemo.c
+++ b/clients/eventdemo.c
@@ -390,11 +390,11 @@
 	struct display *d;
 	struct eventdemo *e;
 
-	argc = parse_options(eventdemo_options,
-			     ARRAY_LENGTH(eventdemo_options), argc, argv);
+	parse_options(eventdemo_options,
+		      ARRAY_LENGTH(eventdemo_options), &argc, argv);
 
 	/* Connect to the display and have the arguments parsed */
-	d = display_create(argc, argv);
+	d = display_create(&argc, argv);
 	if (d == NULL) {
 		fprintf(stderr, "failed to create display: %m\n");
 		return -1;
diff --git a/clients/flower.c b/clients/flower.c
index 21c38bf..87a1a00 100644
--- a/clients/flower.c
+++ b/clients/flower.c
@@ -159,7 +159,7 @@
 	struct display *d;
 	struct timeval tv;
 
-	d = display_create(argc, argv);
+	d = display_create(&argc, argv);
 	if (d == NULL) {
 		fprintf(stderr, "failed to create display: %m\n");
 		return -1;
diff --git a/clients/gears.c b/clients/gears.c
index a622cda..e7249eb 100644
--- a/clients/gears.c
+++ b/clients/gears.c
@@ -474,7 +474,7 @@
 {
 	struct display *d;
 
-	d = display_create(argc, argv);
+	d = display_create(&argc, argv);
 	if (d == NULL) {
 		fprintf(stderr, "failed to create display: %m\n");
 		return -1;
diff --git a/clients/image.c b/clients/image.c
index e25a665..cbd466c 100644
--- a/clients/image.c
+++ b/clients/image.c
@@ -410,7 +410,7 @@
 	int i;
 	int image_counter = 0;
 
-	d = display_create(argc, argv);
+	d = display_create(&argc, argv);
 	if (d == NULL) {
 		fprintf(stderr, "failed to create display: %m\n");
 		return -1;
diff --git a/clients/keyboard.c b/clients/keyboard.c
index 3760ff7..ad34b85 100644
--- a/clients/keyboard.c
+++ b/clients/keyboard.c
@@ -706,7 +706,7 @@
 
 	memset(&virtual_keyboard, 0, sizeof virtual_keyboard);
 
-	virtual_keyboard.display = display_create(argc, argv);
+	virtual_keyboard.display = display_create(&argc, argv);
 	if (virtual_keyboard.display == NULL) {
 		fprintf(stderr, "failed to create display: %m\n");
 		return -1;
diff --git a/clients/resizor.c b/clients/resizor.c
index d02ab29..27879a0 100644
--- a/clients/resizor.c
+++ b/clients/resizor.c
@@ -281,7 +281,7 @@
 	struct display *display;
 	struct resizor *resizor;
 
-	display = display_create(argc, argv);
+	display = display_create(&argc, argv);
 	if (display == NULL) {
 		fprintf(stderr, "failed to create display: %m\n");
 		return -1;
diff --git a/clients/smoke.c b/clients/smoke.c
index 80b8c58..5d7333d 100644
--- a/clients/smoke.c
+++ b/clients/smoke.c
@@ -279,7 +279,7 @@
 	struct display *d;
 	int size;
 
-	d = display_create(argc, argv);
+	d = display_create(&argc, argv);
 	if (d == NULL) {
 		fprintf(stderr, "failed to create display: %m\n");
 		return -1;
diff --git a/clients/tablet-shell.c b/clients/tablet-shell.c
index 993da7c..f756cbc 100644
--- a/clients/tablet-shell.c
+++ b/clients/tablet-shell.c
@@ -459,7 +459,7 @@
 	char *config_file;
 	struct output *output;
 
-	display = display_create(argc, argv);
+	display = display_create(&argc, argv);
 	if (display == NULL) {
 		fprintf(stderr, "failed to create display: %m\n");
 		return -1;
diff --git a/clients/terminal.c b/clients/terminal.c
index 664df5d..e80e0e5 100644
--- a/clients/terminal.c
+++ b/clients/terminal.c
@@ -2683,10 +2683,10 @@
 			  NULL);
 	free(config_file);
 
-	argc = parse_options(terminal_options,
-			     ARRAY_LENGTH(terminal_options), argc, argv);
+	parse_options(terminal_options,
+		      ARRAY_LENGTH(terminal_options), &argc, argv);
 
-	d = display_create(argc, argv);
+	d = display_create(&argc, argv);
 	if (d == NULL) {
 		fprintf(stderr, "failed to create display: %m\n");
 		return -1;
diff --git a/clients/transformed.c b/clients/transformed.c
index 75c1250..8983bb5 100644
--- a/clients/transformed.c
+++ b/clients/transformed.c
@@ -264,7 +264,7 @@
 			usage(EXIT_FAILURE);
 	}
 
-	d = display_create(argc, argv);
+	d = display_create(&argc, argv);
 	if (d == NULL) {
 		fprintf(stderr, "failed to create display: %m\n");
 		return -1;
diff --git a/clients/view.c b/clients/view.c
index 1bb9b9b..c8ced15 100644
--- a/clients/view.c
+++ b/clients/view.c
@@ -295,10 +295,9 @@
 
 	g_type_init();
 
-	argc = parse_options(view_options,
-			     ARRAY_LENGTH(view_options), argc, argv);
+	parse_options(view_options, ARRAY_LENGTH(view_options), &argc, argv);
 
-	d = display_create(argc, argv);
+	d = display_create(&argc, argv);
 	if (d == NULL) {
 		fprintf(stderr, "failed to create display: %m\n");
 		return -1;
diff --git a/clients/window.c b/clients/window.c
index d917550..249ba6f 100644
--- a/clients/window.c
+++ b/clients/window.c
@@ -4329,7 +4329,7 @@
 }
 
 struct display *
-display_create(int argc, char *argv[])
+display_create(int *argc, char *argv[])
 {
 	struct display *d;
 
diff --git a/clients/window.h b/clients/window.h
index 646b3dd..c2946d8 100644
--- a/clients/window.h
+++ b/clients/window.h
@@ -53,7 +53,7 @@
 };
 
 struct display *
-display_create(int argc, char *argv[]);
+display_create(int *argc, char *argv[]);
 
 void
 display_destroy(struct display *display);
diff --git a/clients/wscreensaver.c b/clients/wscreensaver.c
index e0c165a..9a2c47a 100644
--- a/clients/wscreensaver.c
+++ b/clients/wscreensaver.c
@@ -310,10 +310,10 @@
 
 	init_frand();
 
-	argc = parse_options(wscreensaver_options,
-			     ARRAY_LENGTH(wscreensaver_options), argc, argv);
+	parse_options(wscreensaver_options,
+		      ARRAY_LENGTH(wscreensaver_options), &argc, argv);
 
-	d = display_create(argc, argv);
+	d = display_create(&argc, argv);
 	if (d == NULL) {
 		fprintf(stderr, "failed to create display: %m\n");
 		return EXIT_FAILURE;
diff --git a/shared/config-parser.h b/shared/config-parser.h
index 7fa9c3f..314057a 100644
--- a/shared/config-parser.h
+++ b/shared/config-parser.h
@@ -67,7 +67,7 @@
 
 int
 parse_options(const struct weston_option *options,
-	      int count, int argc, char *argv[]);
+	      int count, int *argc, char *argv[]);
 
 #endif /* CONFIGPARSER_H */
 
diff --git a/shared/option-parser.c b/shared/option-parser.c
index 600f110..a7e497f 100644
--- a/shared/option-parser.c
+++ b/shared/option-parser.c
@@ -51,11 +51,11 @@
 
 int
 parse_options(const struct weston_option *options,
-	      int count, int argc, char *argv[])
+	      int count, int *argc, char *argv[])
 {
 	int i, j, k, len = 0;
 
-	for (i = 1, j = 1; i < argc; i++) {
+	for (i = 1, j = 1; i < *argc; i++) {
 		for (k = 0; k < count; k++) {
 			if (options[k].name)
 				len = strlen(options[k].name);
@@ -77,6 +77,7 @@
 			argv[j++] = argv[i];
 	}
 	argv[j] = NULL;
+	*argc = j;
 
 	return j;
 }
diff --git a/src/compositor-drm.c b/src/compositor-drm.c
index c170f97..a824324 100644
--- a/src/compositor-drm.c
+++ b/src/compositor-drm.c
@@ -2134,7 +2134,7 @@
 static struct weston_compositor *
 drm_compositor_create(struct wl_display *display,
 		      int connector, const char *seat, int tty, int pixman,
-		      int argc, char *argv[], const char *config_file)
+		      int *argc, char *argv[], const char *config_file)
 {
 	struct drm_compositor *ec;
 	struct udev_device *drm_device;
@@ -2430,7 +2430,7 @@
 }
 
 WL_EXPORT struct weston_compositor *
-backend_init(struct wl_display *display, int argc, char *argv[],
+backend_init(struct wl_display *display, int *argc, char *argv[],
 	     const char *config_file)
 {
 	int connector = 0, tty = 0, use_pixman = 0;
diff --git a/src/compositor-fbdev.c b/src/compositor-fbdev.c
index 1df3bbc..070d187 100644
--- a/src/compositor-fbdev.c
+++ b/src/compositor-fbdev.c
@@ -826,7 +826,7 @@
 }
 
 static struct weston_compositor *
-fbdev_compositor_create(struct wl_display *display, int argc, char *argv[],
+fbdev_compositor_create(struct wl_display *display, int *argc, char *argv[],
                         const char *config_file, struct fbdev_parameters *param)
 {
 	struct fbdev_compositor *compositor;
@@ -897,7 +897,7 @@
 }
 
 WL_EXPORT struct weston_compositor *
-backend_init(struct wl_display *display, int argc, char *argv[],
+backend_init(struct wl_display *display, int *argc, char *argv[],
 	     const char *config_file)
 {
 	/* TODO: Ideally, available frame buffers should be enumerated using
diff --git a/src/compositor-headless.c b/src/compositor-headless.c
index 03bd0a4..1e286fa 100644
--- a/src/compositor-headless.c
+++ b/src/compositor-headless.c
@@ -152,7 +152,7 @@
 static struct weston_compositor *
 headless_compositor_create(struct wl_display *display,
 			  int width, int height, const char *display_name,
-			  int argc, char *argv[], const char *config_file)
+			  int *argc, char *argv[], const char *config_file)
 {
 	struct headless_compositor *c;
 
@@ -187,7 +187,7 @@
 }
 
 WL_EXPORT struct weston_compositor *
-backend_init(struct wl_display *display, int argc, char *argv[],
+backend_init(struct wl_display *display, int *argc, char *argv[],
 	     const char *config_file)
 {
 	int width = 1024, height = 640;
diff --git a/src/compositor-rpi.c b/src/compositor-rpi.c
index 208271f..d3767b9 100644
--- a/src/compositor-rpi.c
+++ b/src/compositor-rpi.c
@@ -1423,7 +1423,7 @@
 };
 
 static struct weston_compositor *
-rpi_compositor_create(struct wl_display *display, int argc, char *argv[],
+rpi_compositor_create(struct wl_display *display, int *argc, char *argv[],
 		      const char *config_file, struct rpi_parameters *param)
 {
 	struct rpi_compositor *compositor;
@@ -1536,7 +1536,7 @@
 #define DEFAULT_MAX_PLANES 80
 
 WL_EXPORT struct weston_compositor *
-backend_init(struct wl_display *display, int argc, char *argv[],
+backend_init(struct wl_display *display, int *argc, char *argv[],
 	     const char *config_file)
 {
 	struct rpi_parameters param = {
diff --git a/src/compositor-wayland.c b/src/compositor-wayland.c
index af493e7..66e9695 100644
--- a/src/compositor-wayland.c
+++ b/src/compositor-wayland.c
@@ -622,7 +622,7 @@
 static struct weston_compositor *
 wayland_compositor_create(struct wl_display *display,
 			  int width, int height, const char *display_name,
-			  int argc, char *argv[], const char *config_file)
+			  int *argc, char *argv[], const char *config_file)
 {
 	struct wayland_compositor *c;
 	struct wl_event_loop *loop;
@@ -697,7 +697,7 @@
 }
 
 WL_EXPORT struct weston_compositor *
-backend_init(struct wl_display *display, int argc, char *argv[],
+backend_init(struct wl_display *display, int *argc, char *argv[],
 	     const char *config_file)
 {
 	int width = 1024, height = 640;
diff --git a/src/compositor-x11.c b/src/compositor-x11.c
index 9cc41fd..1119934 100644
--- a/src/compositor-x11.c
+++ b/src/compositor-x11.c
@@ -1366,7 +1366,7 @@
 		      int fullscreen,
 		      int no_input,
 		      int use_pixman,
-		      int argc, char *argv[], const char *config_file)
+		      int *argc, char *argv[], const char *config_file)
 {
 	struct x11_compositor *c;
 	struct x11_configured_output *o;
@@ -1556,7 +1556,7 @@
 }
 
 WL_EXPORT struct weston_compositor *
-backend_init(struct wl_display *display, int argc, char *argv[],
+backend_init(struct wl_display *display, int *argc, char *argv[],
 	     const char *config_file)
 {
 	int fullscreen = 0;
diff --git a/src/compositor.c b/src/compositor.c
index 64d0830..fb5cb2c 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -2951,8 +2951,7 @@
 WL_EXPORT int
 weston_compositor_init(struct weston_compositor *ec,
 		       struct wl_display *display,
-		       int argc,
-		       char *argv[],
+		       int *argc, char *argv[],
 		       const char *config_file)
 {
 	struct wl_event_loop *loop;
@@ -3336,7 +3335,7 @@
 	struct sigaction segv_action;
 	struct weston_compositor
 		*(*backend_init)(struct wl_display *display,
-				 int argc, char *argv[], const char *config_file);
+				 int *argc, char *argv[], const char *config_file);
 	int i;
 	char *backend = NULL;
 	const char *modules = "desktop-shell.so", *option_modules = NULL;
@@ -3366,8 +3365,7 @@
 		{ WESTON_OPTION_BOOLEAN, "version", 0, &version },
 	};
 
-	argc = parse_options(core_options,
-			     ARRAY_LENGTH(core_options), argc, argv);
+	parse_options(core_options, ARRAY_LENGTH(core_options), &argc, argv);
 
 	if (help)
 		usage(EXIT_SUCCESS);
@@ -3419,7 +3417,7 @@
 	if (!backend_init)
 		exit(EXIT_FAILURE);
 
-	ec = backend_init(display, argc, argv, config_file);
+	ec = backend_init(display, &argc, argv, config_file);
 	if (ec == NULL) {
 		weston_log("fatal: failed to create compositor\n");
 		exit(EXIT_FAILURE);
@@ -3431,9 +3429,10 @@
 	sigaction(SIGSEGV, &segv_action, NULL);
 	segv_compositor = ec;
 
-	for (i = 1; argv[i]; i++)
+
+	for (i = 1; i < argc; i++)
 		weston_log("fatal: unhandled option: %s\n", argv[i]);
-	if (argv[1]) {
+	if (argc > 1) {
 		ret = EXIT_FAILURE;
 		goto out;
 	}
diff --git a/src/compositor.h b/src/compositor.h
index fdde762..11afbb9 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -714,7 +714,7 @@
 
 int
 weston_compositor_init(struct weston_compositor *ec, struct wl_display *display,
-		       int argc, char *argv[], const char *config_file);
+		       int *argc, char *argv[], const char *config_file);
 void
 weston_compositor_shutdown(struct weston_compositor *ec);
 void
@@ -839,8 +839,8 @@
 noop_renderer_init(struct weston_compositor *ec);
 
 struct weston_compositor *
-backend_init(struct wl_display *display, int argc, char *argv[],
-	    const char *config_file);
+backend_init(struct wl_display *display, int *argc, char *argv[],
+	     const char *config_file);
 
 int
 module_init(struct weston_compositor *compositor);