fa9315aadfb7da3fc867829bdd527be3c913f9d4
4 #include <readline/readline.h>
5 #include <readline/history.h>
9 static char *cs_answer
= (char *)NULL
;
10 HISTORY_STATE
*history_state
= NULL
;
12 char *cleanStringToCString(CleanString s
){
13 unsigned long len
= CleanStringLength(s
);
14 char *cs
= (char *)malloc(len
+1);
16 printf("malloc failed...\n");
19 memcpy(cs
, CleanStringCharacters(s
), len
);
24 void cleanReadLine(CleanString prompt
, int history
, CleanString
*result
)
26 char *cs_prompt
= cleanStringToCString(prompt
);
28 //Get the answer and add to history if not empty
31 cs_answer
= (char *)NULL
;
33 cs_answer
= readline(cs_prompt
);
35 if(cs_answer
&& *cs_answer
&& history
){
36 add_history(cs_answer
);
39 if(!cs_answer
){ //In case of an EOF
40 CleanStringVariable(answer
, 1);
41 *result
= (CleanString
) answer
;
42 memcpy(CleanStringCharacters(answer
), "", 1);
43 CleanStringLength(answer
) = 1;
44 } else { //In case of a proper response
45 CleanStringVariable(answer
, strlen(cs_answer
));
46 *result
= (CleanString
) answer
;
47 memcpy(CleanStringCharacters(answer
), cs_answer
, strlen(cs_answer
));
48 CleanStringLength(answer
) = strlen(cs_answer
);
52 void cleanSetReadLineName(CleanString name
){
53 rl_readline_name
= cleanStringToCString(name
);
56 void cleanUsingHistory(){
60 void cleanGetState(int *offset
, int *num
, int *flags
){
61 *offset
= history_get_history_state()->offset
;
62 *num
= history_get_history_state()->length
;
63 *flags
= history_get_history_state()->flags
;
66 void cleanGetHistoryItem(int num
, CleanString
*line
, CleanString
*timestamp
){
67 char *cs_line
= history_get_history_state()->entries
[num
]->line
;
68 char *cs_stamp
= history_get_history_state()->entries
[num
]->timestamp
;
70 CleanStringVariable(cleanLine
, strlen(cs_line
));
71 *line
= (CleanString
) cleanLine
;
72 memcpy(CleanStringCharacters(cleanLine
), cs_line
, strlen(cs_line
));
73 CleanStringLength(cleanLine
) = strlen(cs_line
);
75 CleanStringVariable(cleanTimestamp
, strlen(cs_stamp
));
76 *timestamp
= (CleanString
) cleanTimestamp
;
77 memcpy(CleanStringCharacters(cleanTimestamp
), cs_stamp
, strlen(cs_stamp
));
78 CleanStringLength(cleanTimestamp
) = strlen(cs_stamp
);
81 void cleanInitNewHistoryState(int offset
, int flags
, int num
){
82 printf("Initializing: %d, %d, %d\n", offset
, flags
, num
);
83 if(history_state
!= NULL
){
86 history_state
= (HISTORY_STATE
*)malloc(sizeof(HISTORY_STATE
));
87 if(history_state
== NULL
){
88 printf("Not enough memory...\n");
91 HIST_ENTRY
**entries
= (HIST_ENTRY
**)malloc(sizeof(HIST_ENTRY
*)*num
);
93 printf("Not enough memory...\n");
96 for(int i
= 0; i
<num
; i
++){
97 entries
[i
] = (HIST_ENTRY
*)malloc(sizeof(HIST_ENTRY
));
99 history_state
->offset
= offset
;
100 history_state
->entries
= entries
;
101 history_state
->length
= num
;
102 history_state
->size
= num
;
103 history_state
->flags
= 0;
104 printf("Initialization done\n");
107 void cleanSetNewHistoryEntry(int i
, CleanString line
, CleanString timestamp
){
108 char *cs_line
= cleanStringToCString(line
);
109 char *cs_timestamp
= cleanStringToCString(timestamp
);
110 printf("adding: %d, %s, %s\n", i
, cs_line
, cs_timestamp
);
111 history_state
->entries
[i
]->line
= cs_line
;
112 history_state
->entries
[i
]->timestamp
= cs_timestamp
;
113 printf("done adding: %d, %s, %s\n", i
, cs_line
, cs_timestamp
);
116 void cleanCommitSetHistory(void){
118 history_set_history_state(history_state
);
119 printf("committed\n");
122 void cleanAddHistory(CleanString entry
){
123 char *cs_entry
= cleanStringToCString(entry
);
124 add_history(cs_entry
);
128 void cleanClearHistory(){
132 int cleanHistorySearch(CleanString s
, int dir
){
133 char *cs_s
= cleanStringToCString(s
);
134 int ret
= history_search(cs_s
, dir
);
139 int cleanHistorySearchPrefix(CleanString s
, int dir
){
140 char *cs_s
= cleanStringToCString(s
);
141 int ret
= history_search_prefix(cs_s
, dir
);
146 int cleanHistorySearchPos(CleanString s
, int dir
, int pos
){
147 char *cs_s
= cleanStringToCString(s
);
148 int ret
= history_search_pos(cs_s
, dir
, pos
);
153 int cleanReadHistory(CleanString path
)
155 char *cs_path
= cleanStringToCString(path
);
156 int errno
= read_history(cs_path
);
161 int cleanReadHistoryRange(CleanString path
, int from
, int to
)
163 char *cs_path
= cleanStringToCString(path
);
164 int errno
= read_history_range(cs_path
, from
, to
);
169 int cleanWriteHistory(CleanString path
)
171 char *cs_path
= cleanStringToCString(path
);
172 int errno
= write_history(cs_path
);
177 int cleanAppendHistory(int n
, CleanString path
)
179 char *cs_path
= cleanStringToCString(path
);
180 int errno
= append_history(n
, cs_path
);
185 int cleanHistoryTruncateFile(CleanString path
, int nlines
)
187 char *cs_path
= cleanStringToCString(path
);
188 int errno
= history_truncate_file(cs_path
, nlines
);