814541c2c248f57ebd8f52504eb0221ba61ba5e8
4 #include <readline/readline.h>
5 #include <readline/history.h>
9 static char *cs_answer
= (char *)NULL
;
10 HISTORY_STATE
*history_state
= NULL
;
13 char *cleanStringToCString(CleanString s
)
15 unsigned long len
= CleanStringLength(s
);
16 char *cs
= (char *)malloc(len
+1);
18 printf("malloc failed...\n");
21 memcpy(cs
, CleanStringCharacters(s
), len
);
26 void cleanSetReadLineName(CleanString name
)
28 rl_readline_name
= cleanStringToCString(name
);
33 CleanString prompt
, int history
, CleanString
*result
, int *eof
)
35 char *cs_prompt
= cleanStringToCString(prompt
);
37 //Get the answer and add to history if not empty
40 cs_answer
= (char *)NULL
;
42 cs_answer
= readline(cs_prompt
);
44 if(cs_answer
&& *cs_answer
&& history
){
45 add_history(cs_answer
);
49 if(!cs_answer
){ //In case of an EOF
50 cs_answer
= (char *)malloc(1);
54 CleanStringVariable(answer
, strlen(cs_answer
));
55 *result
= (CleanString
) answer
;
56 memcpy(CleanStringCharacters(answer
), cs_answer
, strlen(cs_answer
));
57 CleanStringLength(answer
) = strlen(cs_answer
);
61 //Initializing History and State Management
62 void cleanUsingHistory()
67 void cleanGetState(int *offset
, int *num
, int *flags
)
69 *offset
= history_get_history_state()->offset
;
70 *num
= history_get_history_state()->length
;
71 *flags
= history_get_history_state()->flags
;
74 void cleanGetHistoryItem(int num
, CleanString
*line
, CleanString
*timestamp
)
76 char *cs_line
= history_get_history_state()->entries
[num
]->line
;
77 char *cs_stamp
= history_get_history_state()->entries
[num
]->timestamp
;
79 CleanStringVariable(cleanLine
, strlen(cs_line
));
80 *line
= (CleanString
) cleanLine
;
81 memcpy(CleanStringCharacters(cleanLine
), cs_line
, strlen(cs_line
));
82 CleanStringLength(cleanLine
) = strlen(cs_line
);
84 CleanStringVariable(cleanTimestamp
, strlen(cs_stamp
));
85 *timestamp
= (CleanString
) cleanTimestamp
;
86 memcpy(CleanStringCharacters(cleanTimestamp
), cs_stamp
, strlen(cs_stamp
));
87 CleanStringLength(cleanTimestamp
) = strlen(cs_stamp
);
90 void cleanInitNewHistoryState(int offset
, int flags
, int num
)
92 if(history_state
!= NULL
){
93 //we should test if we can recursively free the object
96 history_state
= (HISTORY_STATE
*)malloc(sizeof(HISTORY_STATE
));
97 if(history_state
== NULL
){
98 printf("Not enough memory...\n");
101 HIST_ENTRY
**entries
= (HIST_ENTRY
**)malloc(sizeof(HIST_ENTRY
*)*num
);
103 printf("Not enough memory...\n");
106 for(int i
= 0; i
<num
; i
++){
107 entries
[i
] = (HIST_ENTRY
*)malloc(sizeof(HIST_ENTRY
));
109 history_state
->offset
= offset
;
110 history_state
->entries
= entries
;
111 history_state
->length
= num
;
112 history_state
->size
= num
;
113 history_state
->flags
= 0;
116 void cleanSetNewHistoryEntry(int i
, CleanString line
, CleanString timestamp
)
118 char *cs_line
= cleanStringToCString(line
);
119 char *cs_timestamp
= cleanStringToCString(timestamp
);
120 history_state
->entries
[i
]->line
= cs_line
;
121 history_state
->entries
[i
]->timestamp
= cs_timestamp
;
124 void cleanCommitSetHistory(void)
126 history_set_history_state(history_state
);
129 //History List Management
130 void cleanAddHistoryTime(CleanString timestamp
)
132 char *cs_timestamp
= cleanStringToCString(timestamp
);
133 add_history_time(cs_timestamp
);
137 void cleanAddHistory(CleanString entry
)
139 char *cs_entry
= cleanStringToCString(entry
);
140 add_history(cs_entry
);
144 void cleanRemoveHistory(int which
, CleanString
*line
, CleanString
*timestamp
)
146 HIST_ENTRY
*entry
= remove_history(which
);
147 char *cs_line
= entry
->line
;
148 char *cs_stamp
= entry
->timestamp
;
150 CleanStringVariable(cleanLine
, strlen(cs_line
));
151 *line
= (CleanString
) cleanLine
;
152 memcpy(CleanStringCharacters(cleanLine
), cs_line
, strlen(cs_line
));
153 CleanStringLength(cleanLine
) = strlen(cs_line
);
155 CleanStringVariable(cleanTimestamp
, strlen(cs_stamp
));
156 *timestamp
= (CleanString
) cleanTimestamp
;
157 memcpy(CleanStringCharacters(cleanTimestamp
), cs_stamp
, strlen(cs_stamp
));
158 CleanStringLength(cleanTimestamp
) = strlen(cs_stamp
);
160 histdata_t tofree
= free_history_entry(entry
);
164 void cleanReplaceHistoryEntry(
165 int which
, CleanString l
, CleanString
*line
, CleanString
*timestamp
)
167 char *cs_l
= cleanStringToCString(l
);
168 HIST_ENTRY
*entry
= replace_history_entry(which
, cs_l
, NULL
);
171 printf("invalid which\n");
174 char *cs_line
= entry
->line
;
175 char *cs_stamp
= entry
->timestamp
;
177 CleanStringVariable(cleanLine
, strlen(cs_line
));
178 *line
= (CleanString
) cleanLine
;
179 memcpy(CleanStringCharacters(cleanLine
), cs_line
, strlen(cs_line
));
180 CleanStringLength(cleanLine
) = strlen(cs_line
);
182 CleanStringVariable(cleanTimestamp
, strlen(cs_stamp
));
183 *timestamp
= (CleanString
) cleanTimestamp
;
184 memcpy(CleanStringCharacters(cleanTimestamp
), cs_stamp
, strlen(cs_stamp
));
185 CleanStringLength(cleanTimestamp
) = strlen(cs_stamp
);
187 histdata_t tofree
= free_history_entry(entry
);
192 void cleanClearHistory()
197 void cleanStifleHistory(int max
)
202 int cleanUnstifleHistory()
204 return unstifle_history();
207 int cleanHistoryIsStifled()
209 return history_is_stifled();
212 //Information About the History List
213 int cleanHistoryTotalBytes()
215 return history_total_bytes();
218 //Moving Around the History List
219 int cleanHistorySetPos(int pos
)
221 return history_set_pos(pos
);
224 void cleanPreviousHistory(
225 CleanString
*line
, CleanString
*timestamp
, int *null
)
228 HIST_ENTRY
*entry
= previous_history();
235 cs_line
= entry
->line
;
236 cs_stamp
= entry
->timestamp
;
239 CleanStringVariable(cleanLine
, strlen(cs_line
));
240 *line
= (CleanString
) cleanLine
;
241 memcpy(CleanStringCharacters(cleanLine
), cs_line
, strlen(cs_line
));
242 CleanStringLength(cleanLine
) = strlen(cs_line
);
244 CleanStringVariable(cleanTimestamp
, strlen(cs_stamp
));
245 *timestamp
= (CleanString
) cleanTimestamp
;
246 memcpy(CleanStringCharacters(cleanTimestamp
), cs_stamp
, strlen(cs_stamp
));
247 CleanStringLength(cleanTimestamp
) = strlen(cs_stamp
);
250 void cleanNextHistory(CleanString
*line
, CleanString
*timestamp
, int *null
)
253 HIST_ENTRY
*entry
= next_history();
260 cs_line
= entry
->line
;
261 cs_stamp
= entry
->timestamp
;
264 CleanStringVariable(cleanLine
, strlen(cs_line
));
265 *line
= (CleanString
) cleanLine
;
266 memcpy(CleanStringCharacters(cleanLine
), cs_line
, strlen(cs_line
));
267 CleanStringLength(cleanLine
) = strlen(cs_line
);
269 CleanStringVariable(cleanTimestamp
, strlen(cs_stamp
));
270 *timestamp
= (CleanString
) cleanTimestamp
;
271 memcpy(CleanStringCharacters(cleanTimestamp
), cs_stamp
, strlen(cs_stamp
));
272 CleanStringLength(cleanTimestamp
) = strlen(cs_stamp
);
275 //Searching the History List
276 int cleanHistorySearch(CleanString s
, int dir
)
278 char *cs_s
= cleanStringToCString(s
);
279 int ret
= history_search(cs_s
, dir
);
284 int cleanHistorySearchPrefix(CleanString s
, int dir
)
286 char *cs_s
= cleanStringToCString(s
);
287 int ret
= history_search_prefix(cs_s
, dir
);
292 int cleanHistorySearchPos(CleanString s
, int dir
, int pos
)
294 char *cs_s
= cleanStringToCString(s
);
295 int ret
= history_search_pos(cs_s
, dir
, pos
);
300 //Managing the History File
301 int cleanReadHistory(CleanString path
)
303 char *cs_path
= cleanStringToCString(path
);
304 int errno
= read_history(cs_path
);
309 int cleanReadHistoryRange(CleanString path
, int from
, int to
)
311 char *cs_path
= cleanStringToCString(path
);
312 int errno
= read_history_range(cs_path
, from
, to
);
317 int cleanWriteHistory(CleanString path
)
319 char *cs_path
= cleanStringToCString(path
);
320 int errno
= write_history(cs_path
);
325 int cleanAppendHistory(int n
, CleanString path
)
327 char *cs_path
= cleanStringToCString(path
);
328 int errno
= append_history(n
, cs_path
);
333 int cleanHistoryTruncateFile(CleanString path
, int nlines
)
335 char *cs_path
= cleanStringToCString(path
);
336 int errno
= history_truncate_file(cs_path
, nlines
);