Implemented basic argument parsing

- Help done
- Version done
- Config path done (with fallback according to XDG standards)
This commit is contained in:
buffet 2018-09-27 20:44:46 +02:00
parent 2349092d02
commit edbb9b6732
2 changed files with 89 additions and 12 deletions

View file

@ -10,6 +10,6 @@ SRCPREFIX = .
CC = gcc
LIT = lit
CFLAGS = -std=c99 -Wall -Wextra -pedantic -Os
CFLAGS = -std=c99 -Wall -Wextra -pedantic -Os -D_POSIX_C_SOURCE=2
LDFLAGS =
CPPFLAGS = -MD -MP

View file

@ -5,21 +5,31 @@
@s Introduction
Simple placeholder.
This is the source code for wmaffle.
It parses it's arguments and prints either help / info text, or runs the window manager.
Overview:
Here's an overview:
--- wmaffle.c
@{copyright notice}
@{includes}
@{c headers}
@{posix headers}
@{defines}
int
main(void)
main(int argc, char *argv[])
{
@{say hi}
@{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.
@ -33,16 +43,83 @@ This project is licensed under the Mozilla Public License Version 2.0. Please re
*/
---
@s Greeting people
@s Parse arguments
Since I'm a nice guy, I'm going to greet everyone.
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.
--- say hi
printf("Hello, everyone!\n");
This requires `getopt.h`.
--- posix headers
#include <getopt.h>
#include <limits.h>
---
This needs the `stdio.h` header though.
That one we save in a local variable in main.
--- includes
--- 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"
);
}
---