forked from msteveb/jimtcl
-
Notifications
You must be signed in to change notification settings - Fork 0
/
jim-history.c
122 lines (107 loc) · 2.9 KB
/
jim-history.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#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);
}
static void JimHistoryDelProc(Jim_Interp *interp, void *privData)
{
Jim_Free(privData);
}
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, JimHistoryDelProc);
return JIM_OK;
}