Browse Source

pline: Find out last argument type

Serj Kalichev 1 year ago
parent
commit
c9059d41fc
3 changed files with 64 additions and 3 deletions
  1. 1 1
      bin/ytree.c
  2. 58 0
      src/pline.c
  3. 5 2
      src/pline.h

+ 1 - 1
bin/ytree.c

@@ -34,7 +34,7 @@ int main(int argc, char **argv)
 	faux_argv_del_continuable(args);
 	pline = pline_parse(sess, args, 0);
 	faux_argv_free(args);
-//	pline_debug(pline);
+	pline_debug(pline);
 	pline_print_completions(pline, BOOL_TRUE);
 	pline_free(pline);
 

+ 58 - 0
src/pline.c

@@ -190,9 +190,46 @@ void pline_debug(pline_t *pline)
 
 	iter = faux_list_head(pline->exprs);
 	while ((pexpr = (pexpr_t *)faux_list_each(&iter))) {
+		char *pat = NULL;
 		printf("pexpr.xpath = %s\n", pexpr->xpath ? pexpr->xpath : "NULL");
 		printf("pexpr.value = %s\n", pexpr->value ? pexpr->value : "NULL");
 		printf("pexpr.active = %s\n", pexpr->active ? "true" : "false");
+		switch (pexpr->pat) {
+		case 0x0001:
+			pat = "NONE";
+			break;
+		case 0x0002:
+			pat = "CONTAINER";
+			break;
+		case 0x0004:
+			pat = "LIST";
+			break;
+		case 0x0008:
+			pat = "LIST_KEY";
+			break;
+		case 0x0010:
+			pat = "LIST_KEY_INCOMPLETED";
+			break;
+		case 0x0020:
+			pat = "LEAF";
+			break;
+		case 0x0040:
+			pat = "LEAF_VALUE";
+			break;
+		case 0x0080:
+			pat = "LEAF_EMPTY";
+			break;
+		case 0x0100:
+			pat = "LEAFLIST";
+			break;
+		case 0x0200:
+			pat = "LEAFLIST_VALUE";
+			break;
+		default:
+			pat = "UNKNOWN";
+			break;
+		}
+		printf("pexpr.pat = %s\n", pat);
 		printf("\n");
 	}
 
@@ -329,6 +366,8 @@ static bool_t pline_parse_module(const struct lys_module *module, faux_argv_t *a
 		// Container
 		} else if (node->nodetype & LYS_CONTAINER) {
 
+			pexpr->pat = PAT_CONTAINER;
+
 			// Completion
 			if (!str) {
 				pline_add_compl_subtree(pline, module, node);
@@ -342,6 +381,8 @@ static bool_t pline_parse_module(const struct lys_module *module, faux_argv_t *a
 		} else if (node->nodetype & LYS_LIST) {
 			const struct lysc_node *iter = NULL;
 
+			pexpr->pat = PAT_LIST;
+
 			// Next element
 			if (!is_rollback) {
 				bool_t break_upper_loop = BOOL_FALSE;
@@ -376,11 +417,15 @@ static bool_t pline_parse_module(const struct lys_module *module, faux_argv_t *a
 					faux_str_free(tmp);
 					faux_argv_each(&arg);
 					str = (const char *)faux_argv_current(arg);
+
+					pexpr->pat = PAT_LIST_KEY_INCOMPLETED;
 				}
 				if (break_upper_loop)
 					break;
 			}
 
+			pexpr->pat = PAT_LIST_KEY;
+
 			// Completion
 			if (!str) {
 				pline_add_compl_subtree(pline, module, node);
@@ -397,6 +442,9 @@ static bool_t pline_parse_module(const struct lys_module *module, faux_argv_t *a
 
 			// Next element
 			if (LY_TYPE_EMPTY == leaf->type->basetype) {
+
+				pexpr->pat = PAT_LEAF_EMPTY;
+
 				// Completion
 				if (!str) {
 					pline_add_compl_subtree(pline,
@@ -407,12 +455,18 @@ static bool_t pline_parse_module(const struct lys_module *module, faux_argv_t *a
 				// really consumed
 				next_arg = BOOL_FALSE;
 			} else {
+
+				pexpr->pat = PAT_LEAF;
+
 				// Completion
 				if (!str) {
 					pline_add_compl(pline,
 						PCOMPL_TYPE, node, NULL);
 					break;
 				}
+
+				pexpr->pat = PAT_LEAF_VALUE;
+
 				// Idenity must have prefix
 				if (LY_TYPE_IDENT == leaf->type->basetype) {
 					const char *prefix = NULL;
@@ -438,6 +492,8 @@ static bool_t pline_parse_module(const struct lys_module *module, faux_argv_t *a
 			struct lysc_node_leaflist *leaflist =
 				(struct lysc_node_leaflist *)node;
 
+			pexpr->pat = PAT_LEAFLIST;
+
 			// Completion
 			if (!str) {
 				pline_add_compl(pline,
@@ -445,6 +501,8 @@ static bool_t pline_parse_module(const struct lys_module *module, faux_argv_t *a
 				break;
 			}
 
+			pexpr->pat = PAT_LEAFLIST_VALUE;
+
 			// Idenity must have prefix
 			if (LY_TYPE_IDENT == leaflist->type->basetype) {
 				prefix = identityref_prefix(

+ 5 - 2
src/pline.h

@@ -21,8 +21,9 @@ typedef enum {
 	PAT_LIST_KEY_INCOMPLETED	= 0x0010,
 	PAT_LEAF			= 0x0020,
 	PAT_LEAF_VALUE			= 0x0040,
-	PAT_LEAFLIST			= 0x0080,
-	PAT_LEAFLIST_VALUE		= 0x0100,
+	PAT_LEAF_EMPTY			= 0x0080,
+	PAT_LEAFLIST			= 0x0100,
+	PAT_LEAFLIST_VALUE		= 0x0200,
 } pat_e;
 
 
@@ -34,12 +35,14 @@ typedef enum {
 		PAT_CONTAINER |
 		PAT_LIST_KEY |
 		PAT_LEAF_VALUE |
+		PAT_LEAF_EMPTY |
 		PAT_LEAFLIST_VALUE,
 
 	PT_DEL =
 		PAT_CONTAINER |
 		PAT_LIST_KEY |
 		PAT_LEAF |
+		PAT_LEAF_EMPTY |
 		PAT_LEAFLIST |
 		PAT_LEAFLIST_VALUE,