Browse Source

New show settings: ShowBrackets, ShowSemicolons, Indent

Serj Kalichev 1 year ago
parent
commit
f421778a63
8 changed files with 194 additions and 134 deletions
  1. 30 12
      docs/klish-plugin-sysrepo.ru.md
  2. 5 7
      src/pline.c
  3. 12 8
      src/pline.h
  4. 44 18
      src/plugin.c
  5. 4 10
      src/private.h
  6. 74 56
      src/show.c
  7. 22 22
      src/syms.c
  8. 3 1
      xml/sysrepo.xml

+ 30 - 12
docs/klish-plugin-sysrepo.ru.md

@@ -446,32 +446,41 @@ test
 особенности поведения модуля.
 
 
-### Настройка `JuniperLikeShow`
+### Настройка `ShowBrackets`
 
 Поле может принимать значения `y` и `n`. В случае, если задано `y`, то команды,
-показывающие конфигурацию, отображают ее в виде похожем на то, как конфиг
-выглядит в системах Juniper. С фигурными скобками, выделяющими секции и символом
-`;` в конце строк с "листьями" (узлы `leaf`).
+показывающие конфигурацию, отображают фигурные скобки, выделяющие секции и
+уровни вложенности.
 
 ```
 test {
     iface eth0 {
-        comment "Test desc";
-        type ethernet;
+        comment "Test desc"
+        type ethernet
     }
 }
 ```
 
-Если задано значение `n`, то конфигурация будет отображаться в более кратком и
-простом виде. Структура секций помечается отступами.
+По умолчанию отображение фигурных скобок включено.
+
+
+### Настройка `ShowSemicolons`
+
+Поле может принимать значения `y` и `n`. В случае, если задано `y`, то команды,
+показывающие конфигурацию, отображают символ `;` в конце строк с "листьями"
+(узлы `leaf`).
 
 ```
 test
-    iface eth0
-        comment "Test desc"
-        type ethernet
+    iface eth0 {
+        comment "Test desc";
+        type ethernet;
+    }
+}
 ```
 
+По умолчанию отображение символа `;` включено.
+
 
 ### Настройка `FirstKeyWithStatement`
 
@@ -531,13 +540,22 @@ test
 в каких то случаях может быть полезно отключить настройку `Colorize`.
 
 
+### Настройка `Indent`
+
+Поле принимает числовое значение. Задает величину отступа для каждого уровня
+вложенности. Измеряется в количестве символов "пробел" в начале строки. По
+умолчанию имеет значение `2`.
+
+
 ### Пример настройки модуля
 
 ```
 <PLUGIN name="sysrepo">
-	JuniperLikeShow = y
+	ShowBrackets = y
+	ShowSemicolons = y
 	FirstKeyWithStatement = n
 	MultiKeysWithStatement = y
 	Colorize = y
+	Indent = 2
 </PLUGIN>
 ```

+ 5 - 7
src/pline.c

@@ -523,7 +523,7 @@ static char *leafref_xpath(const struct lysc_node *node, const char *node_path)
 
 
 static bool_t pline_parse_module(const struct lys_module *module, faux_argv_t *argv,
-	pline_t *pline, uint32_t flags)
+	pline_t *pline, pline_opts_t *opts)
 {
 	faux_argv_node_t *arg = faux_argv_iter(argv);
 	const struct lysc_node *node = NULL;
@@ -629,8 +629,8 @@ static bool_t pline_parse_module(const struct lys_module *module, faux_argv_t *a
 					assert (leaf->type->basetype != LY_TYPE_EMPTY);
 
 					// Parse statement if necessary
-					if ((first_key && (flags & PPARSE_FIRST_KEY_W_STMT)) ||
-						(!first_key && (flags & PPARSE_MULTI_KEYS_W_STMT))) {
+					if ((first_key && opts->first_key_w_stmt) ||
+						(!first_key && opts->multi_keys_w_stmt)) {
 						// Completion
 						if (!str) {
 							pline_add_compl(pline,
@@ -821,7 +821,7 @@ static bool_t pline_parse_module(const struct lys_module *module, faux_argv_t *a
 }
 
 
-pline_t *pline_parse(sr_session_ctx_t *sess, faux_argv_t *argv, uint32_t flags)
+pline_t *pline_parse(sr_session_ctx_t *sess, faux_argv_t *argv, pline_opts_t *opts)
 {
 	const struct ly_ctx *ctx = NULL;
 	struct lys_module *module = NULL;
@@ -851,7 +851,7 @@ pline_t *pline_parse(sr_session_ctx_t *sess, faux_argv_t *argv, uint32_t flags)
 			continue;
 		if (!module->compiled->data)
 			continue;
-		if (pline_parse_module(module, argv, pline, flags))
+		if (pline_parse_module(module, argv, pline, opts))
 			break; // Found
 	}
 
@@ -865,8 +865,6 @@ pline_t *pline_parse(sr_session_ctx_t *sess, faux_argv_t *argv, uint32_t flags)
 			faux_list_del(pline->exprs, last_expr_node);
 	}
 
-	flags = flags; // Happy compiler
-
 	return pline;
 }
 

+ 12 - 8
src/pline.h

@@ -110,13 +110,17 @@ typedef struct pline_s {
 } pline_t;
 
 
-// Parse options
-typedef enum {
-	PPARSE_FIRST_KEY_W_STMT		= 0x00000001,
-	PPARSE_MULTI_KEYS_W_STMT	= 0x00000002,
-	PPARSE_JUNIPER_SHOW		= 0x00010000,
-	PPARSE_COLORIZE			= 0x00008000,
-} pparse_flags_e;
+// Parse/show settings
+typedef struct {
+	char begin_bracket;
+	char end_bracket;
+	bool_t show_brackets;
+	bool_t show_semicolons;
+	bool_t first_key_w_stmt;
+	bool_t multi_keys_w_stmt;
+	bool_t colorize;
+	uint8_t indent;
+} pline_opts_t;
 
 
 #define SRP_NODETYPE_CONF (LYS_CONTAINER | LYS_LIST | LYS_LEAF | LYS_LEAFLIST)
@@ -125,7 +129,7 @@ typedef enum {
 C_DECL_BEGIN
 
 pline_t *pline_new(sr_session_ctx_t *sess);
-pline_t *pline_parse(sr_session_ctx_t *sess, faux_argv_t *argv, uint32_t flags);
+pline_t *pline_parse(sr_session_ctx_t *sess, faux_argv_t *argv, pline_opts_t *opts);
 pexpr_t *pline_current_expr(pline_t *pline);
 
 void pline_free(pline_t *pline);

+ 44 - 18
src/plugin.c

@@ -9,6 +9,7 @@
 #include <faux/faux.h>
 #include <faux/str.h>
 #include <faux/ini.h>
+#include <faux/conv.h>
 #include <klish/kplugin.h>
 #include <klish/kcontext.h>
 
@@ -21,7 +22,7 @@
 const uint8_t kplugin_sysrepo_major = KPLUGIN_MAJOR;
 const uint8_t kplugin_sysrepo_minor = KPLUGIN_MINOR;
 
-static uint32_t parse_plugin_conf(const char *conf, uint32_t default_flags);
+static int parse_plugin_conf(const char *conf, pline_opts_t *opts);
 
 
 int kplugin_sysrepo_init(kcontext_t *context)
@@ -90,7 +91,18 @@ int kplugin_sysrepo_init(kcontext_t *context)
 	udata = faux_zmalloc(sizeof(*udata));
 	assert(udata);
 	udata->path = NULL;
-	udata->flags = parse_plugin_conf(kplugin_conf(plugin), SRP_DEFAULT_PARSE_OPTS);
+
+	// Settings
+	udata->opts.begin_bracket = '{';
+	udata->opts.end_bracket = '}';
+	udata->opts.show_brackets = BOOL_TRUE;
+	udata->opts.show_semicolons = BOOL_TRUE;
+	udata->opts.first_key_w_stmt = BOOL_FALSE;
+	udata->opts.multi_keys_w_stmt = BOOL_TRUE;
+	udata->opts.colorize = BOOL_TRUE;
+	udata->opts.indent = 2;
+	parse_plugin_conf(kplugin_conf(plugin), &udata->opts);
+
 	kplugin_set_udata(plugin, udata);
 
 	return 0;
@@ -114,7 +126,7 @@ int kplugin_sysrepo_fini(kcontext_t *context)
 }
 
 
-uint32_t srp_udata_flags(kcontext_t *context)
+pline_opts_t *srp_udata_opts(kcontext_t *context)
 {
 	srp_udata_t *udata = NULL;
 
@@ -123,7 +135,7 @@ uint32_t srp_udata_flags(kcontext_t *context)
 	udata = (srp_udata_t *)kcontext_udata(context);
 	assert(udata);
 
-	return udata->flags;
+	return &udata->opts;
 }
 
 
@@ -154,50 +166,64 @@ void srp_udata_set_path(kcontext_t *context, faux_argv_t *path)
 }
 
 
-static uint32_t parse_plugin_conf(const char *conf, uint32_t default_flags)
+static int parse_plugin_conf(const char *conf, pline_opts_t *opts)
 {
-	uint32_t flags = default_flags;
 	faux_ini_t *ini = NULL;
 	const char *val = NULL;
 
+	if (!opts)
+		return -1;
 	if (!conf)
-		return flags;
+		return 0; // Use defaults
 
 	ini = faux_ini_new();
 	if (!faux_ini_parse_str(ini, conf)) {
 		faux_ini_free(ini);
-		return flags;
+		return -1;
 	}
 
-	if ((val = faux_ini_find(ini, "JuniperLikeShow"))) {
+	if ((val = faux_ini_find(ini, "ShowBrackets"))) {
 		if (faux_str_cmp(val, "y") == 0)
-			flags = flags | PPARSE_JUNIPER_SHOW;
+			opts->show_brackets = BOOL_TRUE;
 		else if (faux_str_cmp(val, "n") == 0)
-			flags = flags & (~(uint32_t)PPARSE_JUNIPER_SHOW);
+			opts->show_brackets = BOOL_FALSE;
+	}
+
+	if ((val = faux_ini_find(ini, "ShowSemicolons"))) {
+		if (faux_str_cmp(val, "y") == 0)
+			opts->show_semicolons = BOOL_TRUE;
+		else if (faux_str_cmp(val, "n") == 0)
+			opts->show_semicolons = BOOL_FALSE;
 	}
 
 	if ((val = faux_ini_find(ini, "FirstKeyWithStatement"))) {
 		if (faux_str_cmp(val, "y") == 0)
-			flags = flags | PPARSE_FIRST_KEY_W_STMT;
+			opts->first_key_w_stmt = BOOL_TRUE;
 		else if (faux_str_cmp(val, "n") == 0)
-			flags = flags & (~(uint32_t)PPARSE_FIRST_KEY_W_STMT);
+			opts->first_key_w_stmt = BOOL_FALSE;
 	}
 
 	if ((val = faux_ini_find(ini, "MultiKeysWithStatement"))) {
 		if (faux_str_cmp(val, "y") == 0)
-			flags = flags | PPARSE_MULTI_KEYS_W_STMT;
+			opts->multi_keys_w_stmt = BOOL_TRUE;
 		else if (faux_str_cmp(val, "n") == 0)
-			flags = flags & (~(uint32_t)PPARSE_MULTI_KEYS_W_STMT);
+			opts->multi_keys_w_stmt = BOOL_FALSE;
 	}
 
 	if ((val = faux_ini_find(ini, "Colorize"))) {
 		if (faux_str_cmp(val, "y") == 0)
-			flags = flags | PPARSE_COLORIZE;
+			opts->colorize = BOOL_TRUE;
 		else if (faux_str_cmp(val, "n") == 0)
-			flags = flags & (~(uint32_t)PPARSE_COLORIZE);
+			opts->colorize = BOOL_FALSE;
+	}
+
+	if ((val = faux_ini_find(ini, "Indent"))) {
+		unsigned char indent = 0;
+		if (faux_conv_atouc(val, &indent, 10))
+			opts->indent = indent;
 	}
 
 	faux_ini_free(ini);
 
-	return flags;
+	return 0;
 }

+ 4 - 10
src/private.h

@@ -15,19 +15,13 @@
 // Plugin's user-data structure
 typedef struct {
 	faux_argv_t *path; // Current data hierarchy path ('edit' operation)
-	uint32_t flags; // Parse/Show flags
+	pline_opts_t opts; // Settings
 } srp_udata_t;
 
 
 // Repository to edit with srp commands
 #define SRP_REPO_EDIT SR_DS_CANDIDATE
 
-// Defaut parse options
-#define SRP_DEFAULT_PARSE_OPTS ( \
-	PPARSE_MULTI_KEYS_W_STMT | \
-	PPARSE_JUNIPER_SHOW \
-	)
-
 
 C_DECL_BEGIN
 
@@ -63,7 +57,7 @@ int srp_diff(kcontext_t *context);
 int srp_deactivate(kcontext_t *context);
 
 // Plugin's user-data service functions
-uint32_t srp_udata_flags(kcontext_t *context);
+pline_opts_t *srp_udata_opts(kcontext_t *context);
 faux_argv_t *srp_udata_path(kcontext_t *context);
 void srp_udata_set_path(kcontext_t *context, faux_argv_t *path);
 
@@ -75,9 +69,9 @@ enum diff_op {
     DIFF_OP_NONE,
 };
 
-bool_t show_xpath(sr_session_ctx_t *sess, const char *xpath, uint32_t flags);
+bool_t show_xpath(sr_session_ctx_t *sess, const char *xpath, pline_opts_t *opts);
 void show_subtree(const struct lyd_node *nodes_list, size_t level,
-	enum diff_op op, uint32_t flags);
+	enum diff_op op, pline_opts_t *opts);
 
 // Sysrepo copy-paste
 int sr_module_is_internal(const struct lys_module *ly_mod);

+ 74 - 56
src/show.c

@@ -17,21 +17,17 @@
 #include "pline.h"
 #include "private.h"
 
-#define LEVEL_SPACES_NUM 4
-
-#define JUN(flags) (flags & PPARSE_JUNIPER_SHOW)
-
 
 static void show_container(const struct lyd_node *node, size_t level,
-	enum diff_op op, uint32_t flags);
+	enum diff_op op, pline_opts_t *opts);
 static void show_list(const struct lyd_node *node, size_t level,
-	enum diff_op op, uint32_t flags);
+	enum diff_op op, pline_opts_t *opts);
 static void show_leaf(const struct lyd_node *node, size_t level,
-	enum diff_op op, uint32_t flags);
+	enum diff_op op, pline_opts_t *opts);
 static void show_leaflist(const struct lyd_node *node, size_t level,
-	enum diff_op op, uint32_t flags);
+	enum diff_op op, pline_opts_t *opts);
 static void show_node(const struct lyd_node *node, size_t level,
-	enum diff_op op, uint32_t flags);
+	enum diff_op op, pline_opts_t *opts);
 static enum diff_op str2diff_op(const char *str);
 
 
@@ -79,9 +75,9 @@ static char *get_value(const struct lyd_node *node)
 }
 
 
-static const char *diff_prefix(enum diff_op op, uint32_t flags)
+static const char *diff_prefix(enum diff_op op, pline_opts_t *opts)
 {
-	bool_t c = flags & PPARSE_COLORIZE;
+	bool_t c = opts->colorize;
 
 	if (DIFF_OP_CREATE == op)
 		return c ? "\x1b[32m+" : "+";
@@ -94,9 +90,9 @@ static const char *diff_prefix(enum diff_op op, uint32_t flags)
 }
 
 
-static const char *diff_suffix(enum diff_op op, uint32_t flags)
+static const char *diff_suffix(enum diff_op op, pline_opts_t *opts)
 {
-	if ((flags & PPARSE_COLORIZE) && (DIFF_OP_NONE != op))
+	if (opts->colorize && (DIFF_OP_NONE != op))
 		return "\x1b[0m";
 
 	return "";
@@ -104,26 +100,34 @@ static const char *diff_suffix(enum diff_op op, uint32_t flags)
 
 
 static void show_container(const struct lyd_node *node, size_t level,
-	enum diff_op op, uint32_t flags)
+	enum diff_op op, pline_opts_t *opts)
 {
+	char begin_bracket[3] = {' ', opts->begin_bracket, '\0'};
+
 	if (!node)
 		return;
 
-	printf("%s%*s%s%s%s\n", diff_prefix(op, flags),
-		(int)(level * LEVEL_SPACES_NUM), "",
-		node->schema->name, JUN(flags) ? " {" : "",
-		diff_suffix(op, flags));
-	show_subtree(lyd_child(node), level + 1, op, flags);
-	if (JUN(flags))
-		printf("%s%*s%s%s\n", diff_prefix(op, flags),
-			(int)(level * LEVEL_SPACES_NUM), "", "}",
-			diff_suffix(op, flags));
+	printf("%s%*s%s%s%s\n",
+		diff_prefix(op, opts),
+		(int)(level * opts->indent), "",
+		node->schema->name,
+		opts->show_brackets ? begin_bracket : "",
+		diff_suffix(op, opts));
+	show_subtree(lyd_child(node), level + 1, op, opts);
+	if (opts->show_brackets) {
+		printf("%s%*s%c%s\n",
+			diff_prefix(op, opts),
+			(int)(level * opts->indent), "",
+			opts->end_bracket,
+			diff_suffix(op, opts));
+	}
 }
 
 
 static void show_list(const struct lyd_node *node, size_t level,
-	enum diff_op op, uint32_t flags)
+	enum diff_op op, pline_opts_t *opts)
 {
+	char begin_bracket[3] = {' ', opts->begin_bracket, '\0'};
 	size_t keys_num = 0;
 	const struct lyd_node *iter = NULL;
 	bool_t first_key = BOOL_TRUE;
@@ -131,8 +135,10 @@ static void show_list(const struct lyd_node *node, size_t level,
 	if (!node)
 		return;
 
-	printf("%s%*s%s", diff_prefix(op, flags),
-		(int)(level * LEVEL_SPACES_NUM), "", node->schema->name);
+	printf("%s%*s%s",
+		diff_prefix(op, opts),
+		(int)(level * opts->indent), "",
+		node->schema->name);
 
 	LY_LIST_FOR(lyd_child(node), iter) {
 		char *value = NULL;
@@ -141,25 +147,30 @@ static void show_list(const struct lyd_node *node, size_t level,
 			continue;
 		if (!(iter->schema->flags & LYS_KEY))
 			continue;
-		if ((first_key && (flags & PPARSE_FIRST_KEY_W_STMT)) ||
-			(!first_key && (flags & PPARSE_MULTI_KEYS_W_STMT)))
+		if ((first_key && opts->first_key_w_stmt) ||
+			(!first_key && opts->multi_keys_w_stmt))
 			printf(" %s", iter->schema->name);
 		value = get_value(iter);
 		printf(" %s", value);
 		faux_str_free(value);
 		first_key = BOOL_FALSE;
 	}
-	printf("%s%s\n", JUN(flags) ? " {" : "", diff_suffix(op, flags));
-	show_subtree(lyd_child(node), level + 1, op, flags);
-	if (JUN(flags))
-		printf("%s%*s%s%s\n", diff_prefix(op, flags),
-			(int)(level * LEVEL_SPACES_NUM), "", "}",
-			diff_suffix(op, flags));
+	printf("%s%s\n",
+		opts->show_brackets ? begin_bracket : "",
+		diff_suffix(op, opts));
+	show_subtree(lyd_child(node), level + 1, op, opts);
+	if (opts->show_brackets) {
+		printf("%s%*s%c%s\n",
+			diff_prefix(op, opts),
+			(int)(level * opts->indent), "",
+			opts->end_bracket,
+			diff_suffix(op, opts));
+	}
 }
 
 
 static void show_leaf(const struct lyd_node *node, size_t level,
-	enum diff_op op, uint32_t flags)
+	enum diff_op op, pline_opts_t *opts)
 {
 	struct lysc_node_leaf *leaf = (struct lysc_node_leaf *)node;
 
@@ -168,8 +179,10 @@ static void show_leaf(const struct lyd_node *node, size_t level,
 	if (node->schema->flags & LYS_KEY)
 		return;
 
-	printf("%s%*s%s", diff_prefix(op, flags),
-		(int)(level * LEVEL_SPACES_NUM), "", node->schema->name);
+	printf("%s%*s%s",
+		diff_prefix(op, opts),
+		(int)(level * opts->indent), "",
+		node->schema->name);
 
 	leaf = (struct lysc_node_leaf *)node->schema;
 	if (leaf->type->basetype != LY_TYPE_EMPTY) {
@@ -178,12 +191,14 @@ static void show_leaf(const struct lyd_node *node, size_t level,
 		faux_str_free(value);
 	}
 
-	printf("%s%s\n", JUN(flags) ? ";" : "", diff_suffix(op, flags));
+	printf("%s%s\n",
+		opts->show_semicolons ? ";" : "",
+		diff_suffix(op, opts));
 }
 
 
 static void show_leaflist(const struct lyd_node *node, size_t level,
-	enum diff_op op, uint32_t flags)
+	enum diff_op op, pline_opts_t *opts)
 {
 	char *value = NULL;
 
@@ -191,16 +206,19 @@ static void show_leaflist(const struct lyd_node *node, size_t level,
 		return;
 
 	value = get_value(node);
-	printf("%s%*s%s %s%s%s\n", diff_prefix(op, flags),
-		(int)(level * LEVEL_SPACES_NUM), "", node->schema->name,
-		value, JUN(flags) ? ";" : "",
-		diff_suffix(op, flags));
+	printf("%s%*s%s %s%s%s\n",
+		diff_prefix(op, opts),
+		(int)(level * opts->indent), "",
+		node->schema->name,
+		value,
+		opts->show_semicolons ? ";" : "",
+		diff_suffix(op, opts));
 	faux_str_free(value);
 }
 
 
 static void show_node(const struct lyd_node *node, size_t level,
-	enum diff_op op, uint32_t flags)
+	enum diff_op op, pline_opts_t *opts)
 {
 	const struct lysc_node *schema = NULL;
 	struct lyd_meta *meta = NULL;
@@ -225,19 +243,19 @@ static void show_node(const struct lyd_node *node, size_t level,
 
 	// Container
 	if (schema->nodetype & LYS_CONTAINER) {
-		show_container(node, level, cur_op, flags);
+		show_container(node, level, cur_op, opts);
 
 	// List
 	} else if (schema->nodetype & LYS_LIST) {
-		show_list(node, level, cur_op, flags);
+		show_list(node, level, cur_op, opts);
 
 	// Leaf
 	} else if (schema->nodetype & LYS_LEAF) {
-		show_leaf(node, level, cur_op, flags);
+		show_leaf(node, level, cur_op, opts);
 
 	// Leaf-list
 	} else if (schema->nodetype & LYS_LEAFLIST) {
-		show_leaflist(node, level, cur_op, flags);
+		show_leaflist(node, level, cur_op, opts);
 
 	} else {
 		return;
@@ -246,7 +264,7 @@ static void show_node(const struct lyd_node *node, size_t level,
 
 
 static void show_sorted_list(faux_list_t *list, size_t level,
-	enum diff_op op, uint32_t flags)
+	enum diff_op op, pline_opts_t *opts)
 {
 	faux_list_node_t *iter = NULL;
 	const struct lyd_node *lyd = NULL;
@@ -256,7 +274,7 @@ static void show_sorted_list(faux_list_t *list, size_t level,
 
 	iter = faux_list_head(list);
 	while ((lyd = (const struct lyd_node *)faux_list_each(&iter)))
-		show_node(lyd, level, op, flags);
+		show_node(lyd, level, op, opts);
 }
 
 
@@ -310,7 +328,7 @@ static int leaflist_compare(const void *first, const void *second)
 
 
 void show_subtree(const struct lyd_node *nodes_list, size_t level,
-	enum diff_op op, uint32_t flags)
+	enum diff_op op, pline_opts_t *opts)
 {
 	const struct lyd_node *iter = NULL;
 	faux_list_t *list = NULL;
@@ -326,7 +344,7 @@ void show_subtree(const struct lyd_node *nodes_list, size_t level,
 				faux_list_add(list, (void *)iter);
 				continue;
 			}
-			show_sorted_list(list, level, op, flags);
+			show_sorted_list(list, level, op, opts);
 			faux_list_free(list);
 			list = NULL;
 			saved_lysc = NULL;
@@ -347,17 +365,17 @@ void show_subtree(const struct lyd_node *nodes_list, size_t level,
 			continue;
 		}
 
-		show_node(iter, level, op, flags);
+		show_node(iter, level, op, opts);
 	}
 
 	if (list) {
-		show_sorted_list(list, level, op, flags);
+		show_sorted_list(list, level, op, opts);
 		faux_list_free(list);
 	}
 }
 
 
-bool_t show_xpath(sr_session_ctx_t *sess, const char *xpath, uint32_t flags)
+bool_t show_xpath(sr_session_ctx_t *sess, const char *xpath, pline_opts_t *opts)
 {
 	sr_data_t *data = NULL;
 	struct lyd_node *nodes_list = NULL;
@@ -374,7 +392,7 @@ bool_t show_xpath(sr_session_ctx_t *sess, const char *xpath, uint32_t flags)
 		nodes_list = data->tree;
 	}
 
-	show_subtree(nodes_list, 0, DIFF_OP_NONE, flags);
+	show_subtree(nodes_list, 0, DIFF_OP_NONE, opts);
 	sr_release_data(data);
 
 	return BOOL_TRUE;

+ 22 - 22
src/syms.c

@@ -76,7 +76,7 @@ static int srp_compl_or_help(kcontext_t *context, bool_t help)
 	cur_path = (faux_argv_t *)srp_udata_path(context);
 	entry_name = kentry_name(kcontext_candidate_entry(context));
 	args = param2argv(cur_path, kcontext_parent_pargv(context), entry_name);
-	pline = pline_parse(sess, args, srp_udata_flags(context));
+	pline = pline_parse(sess, args, srp_udata_opts(context));
 	faux_argv_free(args);
 	pline_print_completions(pline, help);
 	pline_free(pline);
@@ -146,7 +146,7 @@ static int srp_check_type(kcontext_t *context,
 	args = param2argv(cur_path, kcontext_parent_pargv(context), entry_name);
 	if (value)
 		faux_argv_add(args, value);
-	pline = pline_parse(sess, args, srp_udata_flags(context));
+	pline = pline_parse(sess, args, srp_udata_opts(context));
 	faux_argv_free(args);
 
 	if (pline->invalid)
@@ -195,7 +195,7 @@ int srp_PLINE_INSERT_FROM(kcontext_t *context)
 
 
 static faux_argv_t *assemble_insert_to(sr_session_ctx_t *sess, const kpargv_t *pargv,
-	faux_argv_t *cur_path, const char *candidate_value, uint32_t flags)
+	faux_argv_t *cur_path, const char *candidate_value, pline_opts_t *opts)
 {
 	faux_argv_t *args = NULL;
 	faux_argv_t *insert_to = NULL;
@@ -206,7 +206,7 @@ static faux_argv_t *assemble_insert_to(sr_session_ctx_t *sess, const kpargv_t *p
 	assert(sess);
 
 	args = param2argv(cur_path, pargv, "from_path");
-	pline = pline_parse(sess, args, flags);
+	pline = pline_parse(sess, args, opts);
 	expr = pline_current_expr(pline);
 	for (i = 0; i < (expr->args_num - expr->list_pos); i++) {
 		faux_argv_node_t *iter = faux_argv_iterr(args);
@@ -247,8 +247,8 @@ int srp_PLINE_INSERT_TO(kcontext_t *context)
 	cur_path = (faux_argv_t *)srp_udata_path(context);
 	value = kcontext_candidate_value(context);
 	args = assemble_insert_to(sess, kcontext_parent_pargv(context),
-		cur_path, value, srp_udata_flags(context));
-	pline = pline_parse(sess, args, srp_udata_flags(context));
+		cur_path, value, srp_udata_opts(context));
+	pline = pline_parse(sess, args, srp_udata_opts(context));
 	faux_argv_free(args);
 
 	if (pline->invalid)
@@ -288,8 +288,8 @@ static int srp_compl_or_help_insert_to(kcontext_t *context, bool_t help)
 
 	cur_path = (faux_argv_t *)srp_udata_path(context);
 	args = assemble_insert_to(sess, kcontext_parent_pargv(context),
-		cur_path, NULL, srp_udata_flags(context));
-	pline = pline_parse(sess, args, srp_udata_flags(context));
+		cur_path, NULL, srp_udata_opts(context));
+	pline = pline_parse(sess, args, srp_udata_opts(context));
 	faux_argv_free(args);
 	pline_print_completions(pline, help);
 	pline_free(pline);
@@ -335,7 +335,7 @@ int srp_set(kcontext_t *context)
 
 	cur_path = (faux_argv_t *)srp_udata_path(context);
 	args = param2argv(cur_path, kcontext_pargv(context), "path");
-	pline = pline_parse(sess, args, srp_udata_flags(context));
+	pline = pline_parse(sess, args, srp_udata_opts(context));
 	faux_argv_free(args);
 
 	if (pline->invalid) {
@@ -399,7 +399,7 @@ int srp_del(kcontext_t *context)
 
 	cur_path = (faux_argv_t *)srp_udata_path(context);
 	args = param2argv(cur_path, kcontext_pargv(context), "path");
-	pline = pline_parse(sess, args, srp_udata_flags(context));
+	pline = pline_parse(sess, args, srp_udata_opts(context));
 	faux_argv_free(args);
 
 	if (pline->invalid) {
@@ -457,7 +457,7 @@ int srp_edit(kcontext_t *context)
 
 	cur_path = (faux_argv_t *)srp_udata_path(context);
 	args = param2argv(cur_path, kcontext_pargv(context), "path");
-	pline = pline_parse(sess, args, srp_udata_flags(context));
+	pline = pline_parse(sess, args, srp_udata_opts(context));
 
 	if (pline->invalid) {
 		fprintf(stderr, "Invalid 'edit' request\n");
@@ -534,7 +534,7 @@ int srp_up(kcontext_t *context)
 
 		iter = faux_argv_iterr(cur_path);
 		faux_argv_del(cur_path, iter);
-		pline = pline_parse(sess, cur_path, srp_udata_flags(context));
+		pline = pline_parse(sess, cur_path, srp_udata_opts(context));
 		if (pline->invalid) {
 			pline_free(pline);
 			continue;
@@ -596,7 +596,7 @@ int srp_insert(kcontext_t *context)
 
 	// 'from' argument
 	insert_from = param2argv(cur_path, pargv, "from_path");
-	pline = pline_parse(sess, insert_from, srp_udata_flags(context));
+	pline = pline_parse(sess, insert_from, srp_udata_opts(context));
 	faux_argv_free(insert_from);
 
 	if (pline->invalid) {
@@ -633,8 +633,8 @@ int srp_insert(kcontext_t *context)
 	// 'to' argument
 	if ((SR_MOVE_BEFORE == position) || (SR_MOVE_AFTER == position)) {
 		insert_to = assemble_insert_to(sess, pargv, cur_path,
-			NULL, srp_udata_flags(context));
-		pline_to = pline_parse(sess, insert_to, srp_udata_flags(context));
+			NULL, srp_udata_opts(context));
+		pline_to = pline_parse(sess, insert_to, srp_udata_opts(context));
 		faux_argv_free(insert_to);
 
 		if (pline_to->invalid) {
@@ -810,7 +810,7 @@ int srp_show_xml(kcontext_t *context)
 
 	cur_path = (faux_argv_t *)srp_udata_path(context);
 	args = param2argv(cur_path, kcontext_pargv(context), "path");
-	pline = pline_parse(sess, args, srp_udata_flags(context));
+	pline = pline_parse(sess, args, srp_udata_opts(context));
 	faux_argv_free(args);
 
 	if (pline->invalid) {
@@ -883,7 +883,7 @@ static int show(kcontext_t *context, sr_datastore_t ds)
 
 	if (kpargv_find(kcontext_pargv(context), "path") || cur_path) {
 		args = param2argv(cur_path, kcontext_pargv(context), "path");
-		pline = pline_parse(sess, args, srp_udata_flags(context));
+		pline = pline_parse(sess, args, srp_udata_opts(context));
 		faux_argv_free(args);
 
 		if (pline->invalid) {
@@ -911,7 +911,7 @@ static int show(kcontext_t *context, sr_datastore_t ds)
 		xpath = expr->xpath;
 	}
 
-	show_xpath(sess, xpath, srp_udata_flags(context));
+	show_xpath(sess, xpath, srp_udata_opts(context));
 
 	ret = 0;
 err:
@@ -940,7 +940,7 @@ int srp_show_running(kcontext_t *context)
 		return -1;
 	}
 
-	show_xpath(sess, NULL, srp_udata_flags(context));
+	show_xpath(sess, NULL, srp_udata_opts(context));
 	sr_disconnect(conn);
 
 	return 0;
@@ -970,7 +970,7 @@ int srp_deactivate(kcontext_t *context)
 
 	cur_path = (faux_argv_t *)srp_udata_path(context);
 	args = param2argv(cur_path, kcontext_pargv(context), "path");
-	pline = pline_parse(sess, args, srp_udata_flags(context));
+	pline = pline_parse(sess, args, srp_udata_opts(context));
 	faux_argv_free(args);
 
 	if (pline->invalid) {
@@ -1066,7 +1066,7 @@ int srp_diff(kcontext_t *context)
 		pexpr_t *expr = NULL;
 
 		args = param2argv(cur_path, kcontext_pargv(context), "path");
-		pline = pline_parse(sess2, args, srp_udata_flags(context));
+		pline = pline_parse(sess2, args, srp_udata_opts(context));
 		faux_argv_free(args);
 
 		if (pline->invalid) {
@@ -1111,7 +1111,7 @@ int srp_diff(kcontext_t *context)
 		goto err;
 	}
 
-	show_subtree(diff, 0, DIFF_OP_NONE, srp_udata_flags(context));
+	show_subtree(diff, 0, DIFF_OP_NONE, srp_udata_opts(context));
 	lyd_free_siblings(diff);
 
 	ret = 0;

+ 3 - 1
xml/sysrepo.xml

@@ -5,10 +5,12 @@
 	xsi:schemaLocation="https://src.libcode.org/pkun/klish/src/master/klish.xsd">
 
 <PLUGIN name="sysrepo">
-	JuniperLikeShow = y
+	ShowBrackets = y
+	ShowSemicolons = y
 	FirstKeyWithStatement = n
 	MultiKeysWithStatement = y
 	Colorize = y
+	Indent = 2
 </PLUGIN>