diff options
author | Steve Bennett <steveb@workware.net.au> | 2011-12-06 08:56:35 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2011-12-09 12:10:33 +1000 |
commit | 8e90299b82be4dc6c8c86dbd206db9e0efdbffc6 (patch) | |
tree | bf75cde4346bec5000f5566cc4421703e912d53a /jim-history.c | |
parent | a2fe8bd6794e017117986dfa11619fbf00b62239 (diff) | |
download | jimtcl-8e90299b82be4dc6c8c86dbd206db9e0efdbffc6.zip jimtcl-8e90299b82be4dc6c8c86dbd206db9e0efdbffc6.tar.gz jimtcl-8e90299b82be4dc6c8c86dbd206db9e0efdbffc6.tar.bz2 |
Add the history command
Signed-off-by: Steve Bennett <steveb@workware.net.au>
Diffstat (limited to 'jim-history.c')
-rw-r--r-- | jim-history.c | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/jim-history.c b/jim-history.c new file mode 100644 index 0000000..d46ed7f --- /dev/null +++ b/jim-history.c @@ -0,0 +1,117 @@ +#include <stdlib.h> +#include <string.h> +#include <stdio.h> + +#include "jim.h" +#include "jimautoconf.h" +#include "jim-subcmd.h" + +static int history_cmd_getline(Jim_Interp *interp, int argc, Jim_Obj *const *argv) +{ + Jim_Obj *objPtr; + char *line = Jim_HistoryGetline(Jim_String(argv[0])); + + /* On EOF returns -1 if varName was specified, or the empty string. */ + if (line == NULL) { + if (argc == 2) { + Jim_SetResultInt(interp, -1); + } + return JIM_OK; + } + + objPtr = Jim_NewStringObjNoAlloc(interp, line, -1); + + /* Returns the length of the string if varName was specified */ + if (argc == 2) { + if (Jim_SetVariable(interp, argv[1], objPtr) != JIM_OK) { + Jim_FreeNewObj(interp, objPtr); + return JIM_ERR; + } + Jim_SetResultInt(interp, Jim_Length(objPtr)); + } + else { + Jim_SetResult(interp, objPtr); + } + return JIM_OK; +} + +static int history_cmd_load(Jim_Interp *interp, int argc, Jim_Obj *const *argv) +{ + Jim_HistoryLoad(Jim_String(argv[0])); + return JIM_OK; +} + +static int history_cmd_save(Jim_Interp *interp, int argc, Jim_Obj *const *argv) +{ + Jim_HistorySave(Jim_String(argv[0])); + return JIM_OK; +} + +static int history_cmd_add(Jim_Interp *interp, int argc, Jim_Obj *const *argv) +{ + Jim_HistoryAdd(Jim_String(argv[0])); + return JIM_OK; +} + +static int history_cmd_show(Jim_Interp *interp, int argc, Jim_Obj *const *argv) +{ + Jim_HistoryShow(); + return JIM_OK; +} + +static const jim_subcmd_type history_command_table[] = { + { "getline", + "prompt ?varname?", + history_cmd_getline, + 1, + 2, + /* Description: Reads one line from the user. Similar to gets. */ + }, + { "load", + "filename", + history_cmd_load, + 1, + 1, + /* Description: Loads history from the given file, if possible */ + }, + { "save", + "filename", + history_cmd_save, + 1, + 1, + /* Description: Saves history to the given file */ + }, + { "add", + "line", + history_cmd_add, + 1, + 1, + /* Description: Adds the line to the history ands saves */ + }, + { "show", + NULL, + history_cmd_show, + 0, + 0, + /* Description: Displays the history */ + }, + { NULL } +}; + +static int JimHistorySubCmdProc(Jim_Interp *interp, int argc, Jim_Obj *const *argv) +{ + return Jim_CallSubCmd(interp, Jim_ParseSubCmd(interp, history_command_table, argc, argv), argc, argv); +} + +int Jim_historyInit(Jim_Interp *interp) +{ + void **history; + if (Jim_PackageProvide(interp, "history", "1.0", JIM_ERRMSG)) + return JIM_ERR; + + history = Jim_Alloc(sizeof(*history)); + *history = NULL; + + Jim_CreateCommand(interp, "history", JimHistorySubCmdProc, history, NULL); + return JIM_OK; +} |