Skip to content

Latest commit

 

History

History
69 lines (58 loc) · 1.95 KB

coption_api.md

File metadata and controls

69 lines (58 loc) · 1.95 KB

STC coption: Command line argument parsing

This describes the API of the coption_get() function for command line argument parsing.

See getopt_long for a similar posix function.

Types

typedef enum {
    coption_no_argument,
    coption_required_argument,
    coption_optional_argument
} coption_type;

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

typedef struct {
    int ind;            /* equivalent to posix optind */
    int opt;            /* equivalent to posix optopt */
    const char *optstr; /* points to the option string, if any */
    const char *arg;    /* equivalent to posix optarg */
    ...
} coption;

Methods

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

Example

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

int main(int argc, char *argv[]) {
    coption_long longopts[] = {
        {"foo", coption_no_argument,       'f'},
        {"bar", coption_required_argument, 'b'},
        {"opt", coption_optional_argument, 'o'},
        {0}
    };
    const char* shortopts = "xy:z::123";
    if (argc == 1)
        printf("Usage: program -x -y ARG -z [ARG] -1 -2 -3 --foo --bar ARG --opt [ARG] [ARGUMENTS]\n", argv[0]);
    coption opt = coption_init();
    int c;
    while ((c = coption_get(&opt, argc, argv, shortopts, longopts)) != -1) {
        switch (c) {
            case '?': printf("error: unknown option: %s\n", opt.optstr); break;
            case ':': printf("error: missing argument for %s\n", opt.optstr); break;
            default:  printf("option: %c [%s]\n", opt.opt, opt.arg ? opt.arg : ""); break;
        }
    }
    printf("\nNon-option arguments:");
    for (int i = opt.ind; i < argc; ++i)
        printf(" %s", argv[i]);
    putchar('\n');
}