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
);
32 void cleanReadLine(CleanString prompt
, int history
, CleanString
*result
, int *eof
)
34 char *cs_prompt
= cleanStringToCString(prompt
);
36 //Get the answer and add to history if not empty
39 cs_answer
= (char *)NULL
;
41 cs_answer
= readline(cs_prompt
);
43 if(cs_answer
&& *cs_answer
&& history
){
44 add_history(cs_answer
);
48 if(!cs_answer
){ //In case of an EOF
49 cs_answer
= (char *)malloc(1);
53 CleanStringVariable(answer
, strlen(cs_answer
));
54 *result
= (CleanString
) answer
;
55 memcpy(CleanStringCharacters(answer
), cs_answer
, strlen(cs_answer
));
56 CleanStringLength(answer
) = strlen(cs_answer
);
60 //Initializing History and State Management
61 void cleanUsingHistory()
66 void cleanGetState(int *offset
, int *num
, int *flags
)
68 *offset
= history_get_history_state()->offset
;
69 *num
= history_get_history_state()->length
;
70 *flags
= history_get_history_state()->flags
;
73 void cleanGetHistoryItem(int num
, CleanString
*line
, CleanString
*timestamp
)
75 char *cs_line
= history_get_history_state()->entries
[num
]->line
;
76 char *cs_stamp
= history_get_history_state()->entries
[num
]->timestamp
;
78 CleanStringVariable(cleanLine
, strlen(cs_line
));
79 *line
= (CleanString
) cleanLine
;
80 memcpy(CleanStringCharacters(cleanLine
), cs_line
, strlen(cs_line
));
81 CleanStringLength(cleanLine
) = strlen(cs_line
);
83 CleanStringVariable(cleanTimestamp
, strlen(cs_stamp
));
84 *timestamp
= (CleanString
) cleanTimestamp
;
85 memcpy(CleanStringCharacters(cleanTimestamp
), cs_stamp
, strlen(cs_stamp
));
86 CleanStringLength(cleanTimestamp
) = strlen(cs_stamp
);
89 void cleanInitNewHistoryState(int offset
, int flags
, int num
)
91 if(history_state
!= NULL
){
92 //we should test if we can recursively free the object
95 history_state
= (HISTORY_STATE
*)malloc(sizeof(HISTORY_STATE
));
96 if(history_state
== NULL
){
97 printf("Not enough memory...\n");
100 HIST_ENTRY
**entries
= (HIST_ENTRY
**)malloc(sizeof(HIST_ENTRY
*)*num
);
102 printf("Not enough memory...\n");
105 for(int i
= 0; i
<num
; i
++){
106 entries
[i
] = (HIST_ENTRY
*)malloc(sizeof(HIST_ENTRY
));
108 history_state
->offset
= offset
;
109 history_state
->entries
= entries
;
110 history_state
->length
= num
;
111 history_state
->size
= num
;
112 history_state
->flags
= 0;
115 void cleanSetNewHistoryEntry(int i
, CleanString line
, CleanString timestamp
)
117 char *cs_line
= cleanStringToCString(line
);
118 char *cs_timestamp
= cleanStringToCString(timestamp
);
119 history_state
->entries
[i
]->line
= cs_line
;
120 history_state
->entries
[i
]->timestamp
= cs_timestamp
;
123 void cleanCommitSetHistory(void)
125 history_set_history_state(history_state
);
128 //History List Management
129 void cleanAddHistoryTime(CleanString timestamp
)
131 char *cs_timestamp
= cleanStringToCString(timestamp
);
132 add_history_time(cs_timestamp
);
136 void cleanAddHistory(CleanString entry
)
138 char *cs_entry
= cleanStringToCString(entry
);
139 add_history(cs_entry
);
143 void cleanRemoveHistory(int which
, CleanString
*line
, CleanString
*timestamp
)
145 HIST_ENTRY
*entry
= remove_history(which
);
146 char *cs_line
= entry
->line
;
147 char *cs_stamp
= entry
->timestamp
;
149 CleanStringVariable(cleanLine
, strlen(cs_line
));
150 *line
= (CleanString
) cleanLine
;
151 memcpy(CleanStringCharacters(cleanLine
), cs_line
, strlen(cs_line
));
152 CleanStringLength(cleanLine
) = strlen(cs_line
);
154 CleanStringVariable(cleanTimestamp
, strlen(cs_stamp
));
155 *timestamp
= (CleanString
) cleanTimestamp
;
156 memcpy(CleanStringCharacters(cleanTimestamp
), cs_stamp
, strlen(cs_stamp
));
157 CleanStringLength(cleanTimestamp
) = strlen(cs_stamp
);
159 histdata_t tofree
= free_history_entry(entry
);
163 void cleanReplaceHistoryEntry(
164 int which
, CleanString l
, CleanString
*line
, CleanString
*timestamp
)
166 char *cs_l
= cleanStringToCString(l
);
167 HIST_ENTRY
*entry
= replace_history_entry(which
, cs_l
, NULL
);
170 printf("invalid which\n");
173 char *cs_line
= entry
->line
;
174 char *cs_stamp
= entry
->timestamp
;
176 CleanStringVariable(cleanLine
, strlen(cs_line
));
177 *line
= (CleanString
) cleanLine
;
178 memcpy(CleanStringCharacters(cleanLine
), cs_line
, strlen(cs_line
));
179 CleanStringLength(cleanLine
) = strlen(cs_line
);
181 CleanStringVariable(cleanTimestamp
, strlen(cs_stamp
));
182 *timestamp
= (CleanString
) cleanTimestamp
;
183 memcpy(CleanStringCharacters(cleanTimestamp
), cs_stamp
, strlen(cs_stamp
));
184 CleanStringLength(cleanTimestamp
) = strlen(cs_stamp
);
186 histdata_t tofree
= free_history_entry(entry
);
191 void cleanClearHistory()
196 void cleanStifleHistory(int max
)
201 int cleanUnstifleHistory()
203 return unstifle_history();
206 int cleanHistoryIsStifled()
208 return history_is_stifled();
211 //Information About the History List
212 int cleanHistoryTotalBytes()
214 return history_total_bytes();
217 //Moving Around the History List
219 //Searching the History List
220 int cleanHistorySearch(CleanString s
, int dir
)
222 char *cs_s
= cleanStringToCString(s
);
223 int ret
= history_search(cs_s
, dir
);
228 int cleanHistorySearchPrefix(CleanString s
, int dir
)
230 char *cs_s
= cleanStringToCString(s
);
231 int ret
= history_search_prefix(cs_s
, dir
);
236 int cleanHistorySearchPos(CleanString s
, int dir
, int pos
)
238 char *cs_s
= cleanStringToCString(s
);
239 int ret
= history_search_pos(cs_s
, dir
, pos
);
244 //Managing the History File
245 int cleanReadHistory(CleanString path
)
247 char *cs_path
= cleanStringToCString(path
);
248 int errno
= read_history(cs_path
);
253 int cleanReadHistoryRange(CleanString path
, int from
, int to
)
255 char *cs_path
= cleanStringToCString(path
);
256 int errno
= read_history_range(cs_path
, from
, to
);
261 int cleanWriteHistory(CleanString path
)
263 char *cs_path
= cleanStringToCString(path
);
264 int errno
= write_history(cs_path
);
269 int cleanAppendHistory(int n
, CleanString path
)
271 char *cs_path
= cleanStringToCString(path
);
272 int errno
= append_history(n
, cs_path
);
277 int cleanHistoryTruncateFile(CleanString path
, int nlines
)
279 char *cs_path
= cleanStringToCString(path
);
280 int errno
= history_truncate_file(cs_path
, nlines
);