summaryrefslogtreecommitdiffhomepage
path: root/docs/coption_api.md
blob: 66038b386322ff98d54ed5188409b49cd5bc09bc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# STC Module [copt](../stc/coption.h): Command line argument parsing

This describes the API of the *coption_get()* function for command line argument parsing.
See [getopt_long](https://www.freebsd.org/cgi/man.cgi?getopt_long(3)) for a similar posix function.

## Types

```c
enum {
    copt_no_argument = 0,
    copt_required_argument = 1,
    copt_optional_argument = 2
};
typedef struct {
    int ind;             /* equivalent to posix optind */
    int opt;             /* equivalent to posix optopt */
    const char *arg;     /* equivalent to posix optarg */
    const char *faulty;  /* points to the faulty option, if any */
    int longindex;       /* index of long option; or -1 if short */
    ...
} coption;

typedef struct {
    const char *name;
    int has_arg;
    int val;
} coption_long;

const coption coption_inits;
```

## Methods

```c
coption             coption_init(void);
int                 coption_get(coption *opt, int argc, char *argv[],
                                const char *shortopts, const coption_long *longopts);
```

## Example

```c
#include <stdio.h>
#include "stc/coption.h"

int main(int argc, char *argv[]) {
    static coption_long long_options[] = {
      {"verbose", copt_no_argument,       'V'},
      {"help",    copt_no_argument,       'H'},
      {"add",     copt_no_argument,       'a'},
      {"append",  copt_no_argument,       'b'},
      {"delete",  copt_required_argument, 'd'},
      {"create",  copt_required_argument, 'c'},
      {"file",    copt_required_argument, 'f'},
      {NULL}
    };
    coption opt = coption_init();
    int c;
    while ((c = coption_get(&opt, argc, argv, ":if:lr", long_options)) != -1) {
        switch (c) {
            case 'V': case 'H':
            case 'a': case 'b':
            case 'd': case 'c':
            case 'i': case 'l':
            case 'r':
                printf("option: %c\n", c);
                break;
            case 'f':
                printf("filename: %s\n", opt.arg);
                break;
            case ':':
                printf("option %s needs a value\n", opt.faulty);
                break;
            case '?':
                printf("unknown option: %s\n", opt.faulty);
                break;
        }
    }

    for (; opt.ind < argc; ++opt.ind) {
        printf("extra arguments: %s\n", argv[opt.ind]);
    }
    return 0;
}
```