| /** |
| * @file main.c |
| * @author Radek Krejci <rkrejci@cesnet.cz> |
| * @author Adam Piecek <piecek@cesnet.cz> |
| * @brief libyang's yanglint tool |
| * |
| * Copyright (c) 2015-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 |
| */ |
| |
| #define _GNU_SOURCE |
| #define _POSIX_C_SOURCE 200809L /* strdup */ |
| |
| #include <stdint.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| |
| #include "libyang.h" |
| |
| #include "cmd.h" |
| #include "common.h" |
| #include "completion.h" |
| #include "configuration.h" |
| #include "linenoise/linenoise.h" |
| #include "yl_opt.h" |
| |
| int done; |
| struct ly_ctx *ctx = NULL; |
| |
| /* main_ni.c */ |
| int main_ni(int argc, char *argv[]); |
| |
| int |
| main(int argc, char *argv[]) |
| { |
| int cmdlen, posc, i, j; |
| struct yl_opt yo = {0}; |
| char *empty = NULL, *cmdline; |
| char **posv; |
| uint8_t cmd_found; |
| |
| if (argc > 1) { |
| /* run in non-interactive mode */ |
| return main_ni(argc, argv); |
| } |
| yo.interactive = 1; |
| |
| /* continue in interactive mode */ |
| linenoiseSetCompletionCallback(complete_cmd); |
| load_config(); |
| |
| if (ly_ctx_new(NULL, YL_DEFAULT_CTX_OPTIONS, &ctx)) { |
| YLMSG_E("Failed to create context.\n"); |
| return 1; |
| } |
| |
| while (!done) { |
| cmd_found = 0; |
| |
| posv = ∅ |
| posc = 0; |
| |
| /* get the command from user */ |
| cmdline = linenoise(PROMPT); |
| |
| /* EOF -> exit */ |
| if (cmdline == NULL) { |
| done = 1; |
| cmdline = strdup("quit"); |
| } |
| |
| /* empty line -> wait for another command */ |
| if (*cmdline == '\0') { |
| free(cmdline); |
| continue; |
| } |
| |
| /* isolate the command word. */ |
| for (cmdlen = 0; cmdline[cmdlen] && (cmdline[cmdlen] != ' '); cmdlen++) {} |
| |
| /* execute the command if any valid specified */ |
| for (i = 0; commands[i].name; i++) { |
| if (strncmp(cmdline, commands[i].name, (size_t)cmdlen) || (commands[i].name[cmdlen] != '\0')) { |
| continue; |
| } |
| |
| cmd_found = 1; |
| if (commands[i].opt_func && commands[i].opt_func(&yo, cmdline, &posv, &posc)) { |
| break; |
| } |
| if (commands[i].dep_func && commands[i].dep_func(&yo, posc)) { |
| break; |
| } |
| if (posc) { |
| for (j = 0; j < posc; j++) { |
| yo.last_one = (j + 1) == posc; |
| if (commands[i].exec_func(&ctx, &yo, posv[j])) { |
| break; |
| } |
| } |
| } else { |
| commands[i].exec_func(&ctx, &yo, NULL); |
| } |
| if (commands[i].fin_func) { |
| commands[i].fin_func(ctx, &yo); |
| } |
| |
| break; |
| } |
| |
| if (!cmd_found) { |
| /* if unknown command specified, tell it to user */ |
| YLMSG_E("Unknown command \"%.*s\", type 'help' for more information.\n", cmdlen, cmdline); |
| } |
| |
| linenoiseHistoryAdd(cmdline); |
| free(cmdline); |
| yl_opt_erase(&yo); |
| } |
| |
| /* Global variables in commands are freed. */ |
| cmd_free(); |
| |
| store_config(); |
| ly_ctx_destroy(ctx); |
| |
| return 0; |
| } |