summaryrefslogtreecommitdiffstats
path: root/tools/lint/cmd_debug.c
blob: 3661bfae6f1aca34fb918b317889771a9a8c31d5 (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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/**
 * @file cmd_debug.c
 * @author Adam Piecek <piecek@cesnet.cz>
 * @brief 'verb' command of the libyang's yanglint tool.
 *
 * Copyright (c) 2023-2023 CESNET, z.s.p.o.
 *
 * This source code is licensed under BSD 3-Clause License (the "License").
 * You may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     https://opensource.org/licenses/BSD-3-Clause
 */

#ifndef NDEBUG

#include "cmd.h"

#include <assert.h>
#include <getopt.h>
#include <stdint.h>
#include <stdio.h>
#include <strings.h>

#include "libyang.h"

#include "common.h"
#include "yl_opt.h"

struct debug_groups {
    char *name;
    uint32_t flag;
} const dg [] = {
    {"dict", LY_LDGDICT},
    {"xpath", LY_LDGXPATH},
    {"dep-sets", LY_LDGDEPSETS},
};
#define DG_LENGTH (sizeof dg / sizeof *dg)

void
cmd_debug_help(void)
{
    uint32_t i;

    printf("Usage: debug (");
    for (i = 0; i < DG_LENGTH; i++) {
        if ((i + 1) == DG_LENGTH) {
            printf("%s", dg[i].name);
        } else {
            printf("%s | ", dg[i].name);
        }
    }
    printf(")+\n");
}

int
cmd_debug_opt(struct yl_opt *yo, const char *cmdline, char ***posv, int *posc)
{
    int rc = 0, argc = 0;
    int opt, opt_index;
    struct option options[] = {
        {"help", no_argument, NULL, 'h'},
        {NULL, 0, NULL, 0}
    };

    if ((rc = parse_cmdline(cmdline, &argc, &yo->argv))) {
        return rc;
    }

    while ((opt = getopt_long(argc, yo->argv, commands[CMD_DEBUG].optstring, options, &opt_index)) != -1) {
        switch (opt) {
        case 'h':
            cmd_debug_help();
            return 1;
        default:
            YLMSG_E("Unknown option.");
            return 1;
        }
    }

    *posv = &yo->argv[optind];
    *posc = argc - optind;

    return 0;
}

int
cmd_debug_dep(struct yl_opt *yo, int posc)
{
    (void) yo;

    if (yo->interactive && !posc) {
        /* no argument */
        cmd_debug_help();
        return 1;
    }

    return 0;
}

int
cmd_debug_store(struct ly_ctx **ctx, struct yl_opt *yo, const char *posv)
{
    (void) ctx;
    uint32_t i;
    ly_bool set;

    assert(posv);

    set = 0;
    for (i = 0; i < DG_LENGTH; i++) {
        if (!strcasecmp(posv, dg[i].name)) {
            yo->dbg_groups |= dg[i].flag;
            set = 1;
            break;
        }
    }

    if (!set) {
        YLMSG_E("Unknown debug group \"%s\".", posv);
        return 1;
    }

    return 0;
}

int
cmd_debug_setlog(struct ly_ctx *ctx, struct yl_opt *yo)
{
    (void) ctx;
    return ly_log_dbg_groups(yo->dbg_groups);
}

#endif