Browse Source

kpargv: kpargv_debug()

Serj Kalichev 2 years ago
parent
commit
df3d1f9a46
4 changed files with 59 additions and 29 deletions
  1. 6 0
      klish/kpargv.h
  2. 49 0
      klish/ksession/kpargv.c
  3. 1 0
      klish/ksession/ksession_parse.c
  4. 3 29
      klish/ktp/ktpd_session.c

+ 6 - 0
klish/kpargv.h

@@ -74,6 +74,9 @@ bool_t kpargv_set_purpose(kpargv_t *pargv, kpargv_purpose_e purpose);
 // Last argument
 bool_t kpargv_set_last_arg(kpargv_t *pargv, const char *last_arg);
 const char *kpargv_last_arg(const kpargv_t *pargv);
+// Original line
+bool_t kpargv_set_orig_line(kpargv_t *pargv, const char *orig_line);
+const char *kpargv_orig_line(const kpargv_t *pargv);
 
 // Pargs
 faux_list_t *kpargv_pargs(const kpargv_t *pargv);
@@ -93,6 +96,9 @@ bool_t kpargv_completions_is_empty(const kpargv_t *pargv);
 kpargv_completions_node_t *kpargv_completions_iter(const kpargv_t *pargv);
 kentry_t *kpargv_completions_each(kpargv_completions_node_t **iter);
 
+// Debug
+bool_t kpargv_debug(const kpargv_t *pargv);
+
 C_DECL_END
 
 #endif // _klish_kpargv_h

+ 49 - 0
klish/ksession/kpargv.c

@@ -20,6 +20,7 @@ struct kpargv_s {
 	bool_t continuable; // Last argument can be expanded
 	kpargv_purpose_e purpose; // Exec/Completion/Help
 	char *last_arg;
+	char *orig_line;
 };
 
 // Status
@@ -46,6 +47,10 @@ KSET(pargv, kpargv_purpose_e, purpose);
 KSET_STR(pargv, last_arg);
 KGET_STR(pargv, last_arg);
 
+// Original line
+KSET_STR(pargv, orig_line);
+KGET_STR(pargv, orig_line);
+
 // Pargs
 KGET(pargv, faux_list_t *, pargs);
 KADD_NESTED(pargv, kparg_t *, pargs);
@@ -97,6 +102,7 @@ kpargv_t *kpargv_new()
 	pargv->continuable = BOOL_FALSE;
 	pargv->purpose = KPURPOSE_EXEC;
 	pargv->last_arg = NULL;
+	pargv->orig_line = NULL;
 
 	// Parsed arguments list
 	pargv->pargs = faux_list_new(FAUX_LIST_UNSORTED, FAUX_LIST_NONUNIQUE,
@@ -188,3 +194,46 @@ const char *kpargv_status_str(const kpargv_t *pargv)
 
 	return kpargv_status_decode(kpargv_status(pargv));
 }
+
+
+bool_t kpargv_debug(const kpargv_t *pargv)
+{
+#ifdef PARGV_DEBUG
+	kpargv_pargs_node_t *p_iter = NULL;
+
+	assert(pargv);
+	if (!pargv)
+		return BOOL_FALSE;
+
+	printf("Level: %lu, Command: %s, Line '%s': %s\n",
+		kpargv_level(pargv),
+		kpargv_command(pargv) ? kentry_name(kpargv_command(pargv)) : "<none>",
+		kpargv_orig_line(pargv),
+		kpargv_status_str(pargv));
+
+	// Parsed parameters
+	p_iter = kpargv_pargs_iter(pargv);
+	if (kpargv_pargs_len(pargv) > 0) {
+		kparg_t *parg = NULL;
+		while ((parg = kpargv_pargs_each(&p_iter))) {
+			printf("%s(%s) ", kparg_value(parg), kentry_name(kparg_entry(parg)));
+		}
+		printf("\n");
+	}
+
+	// Completions
+	if (!kpargv_completions_is_empty(pargv)) {
+		kentry_t *completion = NULL;
+		kpargv_completions_node_t *citer = kpargv_completions_iter(pargv);
+		printf("Completions (%s):\n", kpargv_last_arg(pargv));
+		while ((completion = kpargv_completions_each(&citer)))
+			printf("* %s\n", kentry_name(completion));
+	}
+
+	return BOOL_TRUE;
+#else
+	pargv = pargv; // Happy compiler
+
+	return BOOL_TRUE;
+#endif
+}

+ 1 - 0
klish/ksession/ksession_parse.c

@@ -243,6 +243,7 @@ kpargv_t *ksession_parse_line(ksession_t *session, const char *line,
 	assert(pargv);
 	kpargv_set_continuable(pargv, faux_argv_is_continuable(argv));
 	kpargv_set_purpose(pargv, purpose);
+	kpargv_set_orig_line(pargv, line);
 
 	// Iterate levels of path from higher to lower. Note the reversed
 	// iterator will be used.

+ 3 - 29
klish/ktp/ktpd_session.c

@@ -67,7 +67,6 @@ static bool_t ktpd_session_process_cmd(ktpd_session_t *session, faux_msg_t *msg)
 	char *line = NULL;
 	faux_msg_t *emsg = NULL;
 	kpargv_t *pargv = NULL;
-	kpargv_pargs_node_t *p_iter = NULL;
 
 	assert(session);
 	if (!session)
@@ -76,45 +75,20 @@ static bool_t ktpd_session_process_cmd(ktpd_session_t *session, faux_msg_t *msg)
 	if (!msg)
 		goto err;
 
+	// Get line from message
 	if (!faux_msg_get_param_by_type(msg, KTP_PARAM_LINE,
 		(void **)&line_raw, &line_raw_len)) {
 		error = "The line is not specified";
 		goto err;
 	}
 	line = faux_str_dupn(line_raw, line_raw_len);
-printf("LINE: %s\n", line);
 
 	// Parsing
-//	session = ksession_new(scheme, "/lowview");
-//	kpath_push(ksession_path(session), klevel_new(kscheme_find_entry_by_path(scheme, "/main")));
 	pargv = ksession_parse_line(session->ksession, line, KPURPOSE_COMPLETION);
-	if (pargv) {
-		printf("Level: %lu, Command: %s, Line '%s': %s\n",
-			kpargv_level(pargv),
-			kpargv_command(pargv) ? kentry_name(kpargv_command(pargv)) : "<none>",
-			line,
-			kpargv_status_str(pargv));
-
-		kparg_t *parg = NULL;
-		p_iter = kpargv_pargs_iter(pargv);
-		if (kpargv_pargs_len(pargv) > 0) {
-			while ((parg = kpargv_pargs_each(&p_iter))) {
-				printf("%s(%s) ", kparg_value(parg), kentry_name(kparg_entry(parg)));
-			}
-			printf("\n");
-		}
-
-		// Completions
-		if (!kpargv_completions_is_empty(pargv)) {
-			kentry_t *completion = NULL;
-			kpargv_completions_node_t *citer = kpargv_completions_iter(pargv);
-			printf("Completions (%s):\n", kpargv_last_arg(pargv));
-			while ((completion = kpargv_completions_each(&citer)))
-				printf("* %s\n", kentry_name(completion));
-		}
-	}
+	kpargv_debug(pargv);
 	kpargv_free(pargv);
 
+	// Send ACK message
 	emsg = ktp_msg_preform(KTP_CMD_ACK, KTP_STATUS_NONE);
 	faux_msg_send_async(emsg, session->async);
 	faux_msg_free(emsg);