Browse Source

Add level, status and command to kpargv_t

Serj Kalichev 2 years ago
parent
commit
87245f657d
5 changed files with 55 additions and 22 deletions
  1. 2 2
      bin/klishd/klishd.c
  2. 22 0
      klish/kpargv.h
  3. 2 11
      klish/ksession.h
  4. 15 1
      klish/ksession/kpargv.c
  5. 14 8
      klish/ksession/ksession_parse.c

+ 2 - 2
bin/klishd/klishd.c

@@ -176,9 +176,9 @@ int main(int argc, char **argv)
 
 	// Parsing
 	{
-	kparse_status_e pstatus = KPARSE_NONE;
+	kpargv_status_e pstatus = KPARSE_NONE;
 	char *s = NULL;
-	const char *line = "cmd1 o1 m7 o2 e1";
+	const char *line = "cmd o1 m7 o2 e1";
 	kpargv_t *pargv = NULL;
 	kpargv_pargs_node_t *p_iter = NULL;
 	

+ 22 - 0
klish/kpargv.h

@@ -9,6 +9,18 @@
 #include <faux/list.h>
 #include <klish/kentry.h>
 
+
+typedef enum {
+	KPARSE_NONE,
+	KPARSE_OK,
+	KPARSE_INPROGRESS,
+	KPARSE_NOTFOUND,
+	KPARSE_INCOMPLETED,
+	KPARSE_ILLEGAL,
+	KPARSE_ERROR,
+} kpargv_status_e;
+
+
 typedef struct kpargv_s kpargv_t;
 typedef struct kparg_s kparg_t;
 
@@ -31,6 +43,16 @@ const char *kparg_value(const kparg_t *parg);
 kpargv_t *kpargv_new();
 void kpargv_free(kpargv_t *pargv);
 
+// Status
+kpargv_status_e kpargv_status(const kpargv_t *pargv);
+bool_t kpargv_set_status(kpargv_t *pargv, kpargv_status_e status);
+// Level
+size_t kpargv_level(const kpargv_t *pargv);
+bool_t kpargv_set_level(kpargv_t *pargv, size_t level);
+// Command
+const kentry_t *kpargv_command(const kpargv_t *pargv);
+bool_t kpargv_set_command(kpargv_t *pargv, const kentry_t *command);
+// Pargs
 faux_list_t *kpargv_pargs(const kpargv_t *pargv);
 ssize_t kpargv_pargs_len(const kpargv_t *pargv);
 bool_t kpargv_pargs_is_empty(const kpargv_t *pargv);

+ 2 - 11
klish/ksession.h

@@ -8,21 +8,12 @@
 
 #include <klish/kscheme.h>
 #include <klish/kpath.h>
+#include <klish/kpargv.h>
 
 #define KSESSION_STARTING_ENTRY "main"
 
 typedef struct ksession_s ksession_t;
 
-typedef enum {
-	KPARSE_NONE,
-	KPARSE_OK,
-	KPARSE_INPROGRESS,
-	KPARSE_NOTFOUND,
-	KPARSE_INCOMPLETED,
-	KPARSE_ILLEGAL,
-	KPARSE_ERROR,
-} kparse_status_e;
-
 
 C_DECL_BEGIN
 
@@ -32,7 +23,7 @@ void ksession_free(ksession_t *session);
 const kscheme_t *ksession_scheme(const ksession_t *session);
 kpath_t *ksession_path(const ksession_t *session);
 
-kparse_status_e ksession_parse_line(ksession_t *session, const char *line,
+kpargv_status_e ksession_parse_line(ksession_t *session, const char *line,
 	kpargv_t **parsed_argv);
 
 

+ 15 - 1
klish/ksession/kpargv.c

@@ -7,14 +7,28 @@
 
 #include <faux/list.h>
 #include <klish/khelper.h>
-//#include <klish/kentry.h>
+#include <klish/kentry.h>
 #include <klish/kpargv.h>
 
 
 struct kpargv_s {
 	faux_list_t *pargs;
+	kpargv_status_e status; // Parse status
+	size_t level; // Number of path's level where command was found
+	const kentry_t *command; // ENTRY that consider as command (has ACTIONs)
 };
 
+// Level
+KGET(pargv, kpargv_status_e, status);
+KSET(pargv, kpargv_status_e, status);
+
+// Level
+KGET(pargv, size_t, level);
+KSET(pargv, size_t, level);
+
+// Command
+KGET(pargv, const kentry_t *, command);
+KSET(pargv, const kentry_t *, command);
 
 // Pargs
 KGET(pargv, faux_list_t *, pargs);

+ 14 - 8
klish/ksession/ksession_parse.c

@@ -37,13 +37,13 @@ static bool_t ksession_validate_arg(kentry_t *entry, const char *arg)
 }
 
 
-static kparse_status_e ksession_parse_arg(kentry_t *current_entry,
+static kpargv_status_e ksession_parse_arg(kentry_t *current_entry,
 	faux_argv_node_t **argv_iter, kpargv_t *pargv)
 {
 	kentry_t *entry = current_entry;
 	kentry_mode_e mode = KENTRY_MODE_NONE;
-	kparse_status_e retcode = KPARSE_NOTFOUND; // For ENTRY itself
-	kparse_status_e rc = KPARSE_NOTFOUND; // For nested ENTRYs
+	kpargv_status_e retcode = KPARSE_NOTFOUND; // For ENTRY itself
+	kpargv_status_e rc = KPARSE_NOTFOUND; // For nested ENTRYs
 
 	assert(current_entry);
 	if (!current_entry)
@@ -105,7 +105,7 @@ static kparse_status_e ksession_parse_arg(kentry_t *current_entry,
 		kentry_t *nested = NULL;
 
 		while ((nested = kentry_entrys_each(&iter))) {
-			kparse_status_e nrc = KPARSE_NOTFOUND;
+			kpargv_status_e nrc = KPARSE_NOTFOUND;
 			size_t num = 0;
 			size_t min = kentry_min(nested);
 
@@ -156,15 +156,17 @@ static kparse_status_e ksession_parse_arg(kentry_t *current_entry,
 }
 
 
-kparse_status_e ksession_parse_line(ksession_t *session, const char *line,
+kpargv_status_e ksession_parse_line(ksession_t *session, const char *line,
 	kpargv_t **parsed_argv)
 {
 	faux_argv_t *argv = NULL;
 	faux_argv_node_t *argv_iter = NULL;
 	kpargv_t *pargv = NULL;
-	kparse_status_e pstatus = KPARSE_NONE;
+	kpargv_status_e pstatus = KPARSE_NONE;
 	kpath_levels_node_t *levels_iterr = NULL;
 	klevel_t *level = NULL;
+	size_t level_found = 0; // Level where command was found
+	kpath_t *path = NULL;
 
 	if (parsed_argv)
 		*parsed_argv = NULL;
@@ -190,12 +192,15 @@ kparse_status_e ksession_parse_line(ksession_t *session, const char *line,
 	assert(pargv);
 	// Iterate levels of path from higher to lower. Note the reversed
 	// iterator will be used.
-	levels_iterr = kpath_iterr(ksession_path(session));
+	path = ksession_path(session);
+	levels_iterr = kpath_iterr(path);
+	level_found = kpath_len(path);
 	while ((level = kpath_eachr(&levels_iterr))) {
 		kentry_t *current_entry = klevel_entry(level);
 		pstatus = ksession_parse_arg(current_entry, &argv_iter, pargv);
 		if (pstatus != KPARSE_NOTFOUND)
 			break;
+		level_found--;
 	}
 	// It's a higher level of parsing, so some statuses can have different
 	// meanings
@@ -216,6 +221,7 @@ kparse_status_e ksession_parse_line(ksession_t *session, const char *line,
 	*parsed_argv = pargv;
 
 	faux_argv_free(argv);
-
+if (pargv)
+printf("Level: %lu\n", level_found);
 	return pstatus;
 }