[cli] Read and write command history from and to a file.
authorMatthias Bolte <matthias.bolte@googlemail.com>
Sat, 18 Apr 2009 01:21:33 +0000 (03:21 +0200)
committerMatthias Bolte <matthias.bolte@googlemail.com>
Sat, 18 Apr 2009 01:21:33 +0000 (03:21 +0200)
Signed-off-by: Matthias Bolte <matthias.bolte@googlemail.com>

cli/core.c
cli/help.c
cli/option.c
include/libvsccli/core.h
include/libvsccli/option.h

index f379b6f..3fe4113 100644 (file)
@@ -26,6 +26,7 @@
 #include <libvscmisc/assert.h>
 #include <libvscmisc/error.h>
 #include <libvscmisc/memory.h>
+#include <libvscmisc/string.h>
 
 #include "../include/libvsccli/command.h"
 #include "../include/libvsccli/core.h"
 
 static int _initialized = FALSE;
 static int _verbose_errors = FALSE;
+static char *_histroy_path = FALSE;
 
-const char *_vsc_cli_name = NULL;
-const char *_vsc_cli_help = NULL;
+char *_vsc_cli_name = NULL;
+char *_vsc_cli_help = NULL;
 const struct VscCliOptionInfo *_vsc_cli_option_infos = NULL;
 const struct VscCliCommandInfo **_vsc_cli_command_infos = NULL;
 int _vsc_cli_output_coloring = TRUE;
@@ -189,8 +191,8 @@ _readline_completion (const char *text, int start, int end VSC__ATTR__UNUSED)
 }
 
 void
-vsc_cli_init (struct VscError *error,
-              const char *name, const char *help,
+vsc_cli_init (struct VscError *error, const char *name, const char *help,
+              const char *histroy_path,
               const struct VscCliOptionInfo *option_infos,
               const struct VscCliCommandInfo **command_infos,
               int output_coloring)
@@ -233,8 +235,20 @@ vsc_cli_init (struct VscError *error,
                return;
        }
 
-       _vsc_cli_name = name;
-       _vsc_cli_help = help;
+       _vsc_cli_name = vsc_strdup (error, name);
+
+       if (error->occured) {
+               VSC__APPEND_ERROR0 (error, VSC__ERROR_CODE__TRACE);
+               goto failure;
+       }
+
+       _vsc_cli_help = vsc_strdup (error, help);
+
+       if (error->occured) {
+               VSC__APPEND_ERROR0 (error, VSC__ERROR_CODE__TRACE);
+               goto failure;
+       }
+
        _vsc_cli_option_infos = option_infos;
        _vsc_cli_command_infos = command_infos;
        _vsc_cli_output_coloring = output_coloring;
@@ -244,7 +258,25 @@ vsc_cli_init (struct VscError *error,
 
        stifle_history (500);
 
+       if (histroy_path != NULL) {
+               _histroy_path = vsc_strdup (error, histroy_path);
+
+               if (error->occured) {
+                       VSC__APPEND_ERROR0 (error, VSC__ERROR_CODE__TRACE);
+                       goto failure;
+               }
+
+               read_history (histroy_path);
+       }
+
        _initialized = TRUE;
+
+       return;
+
+failure:
+       vsc_free (&_vsc_cli_name);
+       vsc_free (&_vsc_cli_help);
+       vsc_free (&_histroy_path);
 }
 
 void
@@ -256,8 +288,14 @@ vsc_cli_cleanup (void)
                return;
        }
 
-       _vsc_cli_name = NULL;
-       _vsc_cli_help = NULL;
+       if (_histroy_path != NULL) {
+               write_history (_histroy_path);
+       }
+
+       vsc_free (&_vsc_cli_name);
+       vsc_free (&_vsc_cli_help);
+       vsc_free (&_histroy_path);
+
        _vsc_cli_option_infos = NULL;
        _vsc_cli_command_infos = NULL;
        _vsc_cli_output_coloring = TRUE;
@@ -276,7 +314,11 @@ vsc_cli_error_fprint (struct VscError *error, FILE *stream)
                vsc_error_fprint (error, stream);
        } else {
                if (error->message != NULL) {
-                       if (error->code == VSC__ERROR_CODE__REMOTE_ERROR) {
+                       if (error->code == VSC__ERROR_CODE__XMLRPC_ERROR) {
+                               fprintf (stream, "%s: XML-RPC: %s\n",
+                                        _vsc_cli_output_coloring ? prefix_colored : prefix,
+                                        error->message);
+                       } else if (error->code == VSC__ERROR_CODE__REMOTE_ERROR) {
                                fprintf (stream, "%s: Remote: %s\n",
                                         _vsc_cli_output_coloring ? prefix_colored : prefix,
                                         error->message);
index baa816b..b1ddae5 100644 (file)
@@ -28,8 +28,8 @@
 #include "command.h"
 #include "option.h"
 
-extern const char *_vsc_cli_name;
-extern const char *_vsc_cli_help;
+extern char *_vsc_cli_name;
+extern char *_vsc_cli_help;
 extern const struct VscCliOptionInfo *_vsc_cli_option_infos;
 extern const struct VscCliCommandInfo **_vsc_cli_command_infos;
 extern int _vsc_cli_output_coloring;
@@ -67,7 +67,7 @@ _help (struct VscError *error,
        VSC__ASSERT (error != NULL);
        VSC__ASSERT (! error->occured);
 
-       command_name = vsc_cli_option_get_string (option_list, "command");
+       command_name = vsc_cli_option_list_lookup_string (option_list, "command");
 
        if (command_name != NULL) {
                command_info_ = _vsc_cli_command_info_lookup (command_name);
index 85d7137..53d417e 100644 (file)
@@ -272,9 +272,9 @@ failure:
        goto cleanup;
 }
 
-static const struct VscCliOption *
-_option_get (const struct VscCliOption *option_list,
-             const char *option_long_name)
+const struct VscCliOption *
+vsc_cli_option_list_lookup (const struct VscCliOption *option_list,
+                            const char *option_long_name)
 {
        const struct VscCliOption *option;
 
@@ -290,15 +290,15 @@ _option_get (const struct VscCliOption *option_list,
 }
 
 int
-vsc_cli_option_get_boolean (const struct VscCliOption *option_list,
-                            const char *option_long_name)
+vsc_cli_option_list_lookup_boolean (const struct VscCliOption *option_list,
+                                    const char *option_long_name)
 {
-       return _option_get (option_list, option_long_name) != NULL;
+       return vsc_cli_option_list_lookup (option_list, option_long_name) != NULL;
 }
 
 int
-vsc_cli_option_get_number (const struct VscCliOption *option_list,
-                           const char *option_long_name, int *found)
+vsc_cli_option_list_lookup_number (const struct VscCliOption *option_list,
+                                   const char *option_long_name, int *found)
 {
        const struct VscCliOption *option;
 
@@ -308,7 +308,7 @@ vsc_cli_option_get_number (const struct VscCliOption *option_list,
                *found = FALSE;
        }
 
-       option = _option_get (option_list, option_long_name);
+       option = vsc_cli_option_list_lookup (option_list, option_long_name);
 
        if (option == NULL) {
                return 0;
@@ -322,14 +322,14 @@ vsc_cli_option_get_number (const struct VscCliOption *option_list,
 }
 
 const char *
-vsc_cli_option_get_string (const struct VscCliOption *option_list,
-                           const char *option_long_name)
+vsc_cli_option_list_lookup_string (const struct VscCliOption *option_list,
+                                   const char *option_long_name)
 {
        const struct VscCliOption *option;
 
        VSC__ASSERT (option_long_name != NULL);
 
-       option = _option_get (option_list, option_long_name);
+       option = vsc_cli_option_list_lookup (option_list, option_long_name);
 
        if (option == NULL) {
                return NULL;
index 2092927..7e039b9 100644 (file)
@@ -30,8 +30,8 @@ extern "C" {
 extern const struct VscCliCommandInfo vsc_cli_quit_command_info;
 
 void
-vsc_cli_init (struct VscError *error,
-              const char *name, const char *help,
+vsc_cli_init (struct VscError *error, const char *name, const char *help,
+              const char *history_path,
               const struct VscCliOptionInfo *option_infos,
               const struct VscCliCommandInfo **command_infos,
               int output_coloring);
index 65023c0..a59f52a 100644 (file)
 extern "C" {
 #endif
 
-int
-vsc_cli_option_get_boolean (const struct VscCliOption *option_list,
+const struct VscCliOption *
+vsc_cli_option_list_lookup (const struct VscCliOption *option_list,
                             const char *option_long_name);
 
 int
-vsc_cli_option_get_number (const struct VscCliOption *option_list,
-                           const char *option_long_name, int *found);
+vsc_cli_option_list_lookup_boolean (const struct VscCliOption *option_list,
+                                    const char *option_long_name);
+
+int
+vsc_cli_option_list_lookup_number (const struct VscCliOption *option_list,
+                                   const char *option_long_name, int *found);
 
 const char *
-vsc_cli_option_get_string (const struct VscCliOption *option_list,
-                           const char *option_long_name);
+vsc_cli_option_list_lookup_string (const struct VscCliOption *option_list,
+                                   const char *option_long_name);
 
 void
 vsc_cli_option_list_free (struct VscCliOption **option_list);