@code_type c .c
@comment_type /* %s */

@title wmaffle

@s Introduction

This is the source code for wmaffle.
It parses it's arguments and prints either help / info text, or runs the window manager.

Here's an overview:

--- wmaffle.c
@{copyright notice}
@{c headers}
@{posix headers}
@{defines}

int
main(int argc, char *argv[])
{
	@{variables local to main}
	@{parse arguments}
}
---

Note that this is version NaV (not a version).

--- defines
#define VERSION_STRING "NaV"
---

@s Copyright

This project is licensed under the Mozilla Public License Version 2.0. Please read LICENSE for more details.

--- copyright notice
/* Copyright (c), Niclas Meyer <niclas@countingsort.com>
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
 * You can obtain one at https://mozilla.org/MPL/2.0/.
 */
---

@s Parse arguments

There are only two arguments and two of them are rather straight forward.
I use getopt for this, since it's quite good and allows us to extract the config argument easily.

This requires `getopt.h`.

--- posix headers
#include <getopt.h>
#include <limits.h>
---

That one we save in a local variable in main.

--- variables local to main
char config_path[PATH_MAX];
int option;
---

--- parse arguments
config_path[0] = '\0'; // Used to check if config was already set

while ((option = getopt(argc, argv, "hvc:")) != -1) {
	switch (option) {
	case 'h':
		printf("Usage: %s [-h|-v|-c <config_path>]\n", argv[0]);
		exit(EXIT_SUCCESS);
		break;
	case 'v':
		printf("v" VERSION_STRING "\n");
		exit(EXIT_SUCCESS);
		break;
	case 'c':
		strncpy(config_path, optarg, sizeof(config_path));
		break;
	}
}

if (!config_path[0]) {
	@{get default config path}
}
---

We also need `string.h`, `stdio.h`, and `stdlib.h`.

--- c headers
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
---

@s Config default path

I can clearly see how a user doesn't specify a config path.

This was a design decision to make, whether to load a default config. I decided to go with it.

It loads `"${XDG_CONFIG_HOME:-$HOME/.config}/wmaffle/wmafflerc"`.

---get default config path
char *config_home = getenv("XDG_CONFIG_HOME");

if (config_home) {
	snprintf(
		config_path,
		sizeof(config_path),
		"%s/%s",
		config_home,
		"wmafflw/wmafflerc"
	);
} else {
	snprintf(
		config_path,
		sizeof(config_path),
		"%s/%s",
		getenv("HOME"),
		".config/wmaffle/wmafflerc"
	);
}
---