root/tools/net/ynl/ynltool/main.h
/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
/* Copyright (C) 2017-2018 Netronome Systems, Inc. */
/* Copyright Meta Platforms, Inc. and affiliates */

#ifndef __YNLTOOL_H
#define __YNLTOOL_H

#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

#include "json_writer.h"

#define NEXT_ARG()      ({ argc--; argv++; if (argc < 0) usage(); })
#define NEXT_ARGP()     ({ (*argc)--; (*argv)++; if (*argc < 0) usage(); })
#define BAD_ARG()       ({ p_err("what is '%s'?", *argv); -1; })
#define GET_ARG()       ({ argc--; *argv++; })
#define REQ_ARGS(cnt)                                                   \
        ({                                                              \
                int _cnt = (cnt);                                       \
                bool _res;                                              \
                                                                        \
                if (argc < _cnt) {                                      \
                        p_err("'%s' needs at least %d arguments, %d found", \
                              argv[-1], _cnt, argc);                    \
                        _res = false;                                   \
                } else {                                                \
                        _res = true;                                    \
                }                                                       \
                _res;                                                   \
        })

#define HELP_SPEC_OPTIONS                                               \
        "OPTIONS := { {-j|--json} [{-p|--pretty}] }"

extern const char *bin_name;

extern json_writer_t *json_wtr;
extern bool json_output;
extern bool pretty_output;

void __attribute__((format(printf, 1, 2))) p_err(const char *fmt, ...);
void __attribute__((format(printf, 1, 2))) p_info(const char *fmt, ...);

bool is_prefix(const char *pfx, const char *str);
int detect_common_prefix(const char *arg, ...);
void usage(void) __attribute__((noreturn));

struct cmd {
        const char *cmd;
        int (*func)(int argc, char **argv);
};

int cmd_select(const struct cmd *cmds, int argc, char **argv,
               int (*help)(int argc, char **argv));

/* subcommands */
int do_page_pool(int argc, char **argv);
int do_qstats(int argc, char **argv);

#endif /* __YNLTOOL_H */