+
+//History Expansion
+void cleanHistoryExpand(CleanString string, CleanString *output, int *ret)
+{
+ char *cs_output;
+ char *cs_string = cleanStringToCString(string);
+ *ret = history_expand(cs_string, &cs_output);
+
+ CleanStringVariable(cleanOutput, strlen(cs_output));
+ *output = (CleanString) cleanOutput;
+ memcpy(CleanStringCharacters(cleanOutput), cs_output, strlen(cs_output));
+ CleanStringLength(cleanOutput) = strlen(cs_output);
+ free(cs_output);
+ free(cs_string);
+}
+
+void cleanGetHistoryEvent(
+ CleanString string, int qchar, int cindex, CleanString *output,
+ int *retcindex, int *null)
+{
+ char *cs_string = cleanStringToCString(string);
+ char *cs_output = get_history_event(cs_string, &cindex, qchar);
+
+ if(cs_output == NULL){
+ *null = 1;
+ cs_output = "";
+ } else {
+ *null = 0;
+ }
+
+ CleanStringVariable(cleanOutput, strlen(cs_output));
+ *output = (CleanString) cleanOutput;
+ memcpy(CleanStringCharacters(cleanOutput), cs_output, strlen(cs_output));
+ CleanStringLength(cleanOutput) = strlen(cs_output);
+
+ if(*null == 0){
+ free(cs_output);
+ }
+ *retcindex = cindex;
+}
+
+int cleanHistoryTokenizeInit(CleanString string)
+{
+ if(cs_tokens){
+ for(int i = 0; i<num_tokens; i++){
+ free(cs_tokens[i]);
+ }
+ free(cs_tokens);
+ }
+ char *cs_string = cleanStringToCString(string);
+ cs_tokens = history_tokenize(cs_string);
+ free(cs_string);
+
+ num_tokens = 0;
+ for(; cs_tokens[num_tokens]; num_tokens++);
+ return num_tokens;
+}
+
+void cleanHistoryTokenizeItem(int num, CleanString *output)
+{
+ char *cs_output = cs_tokens[num];
+ CleanStringVariable(cleanOutput, strlen(cs_output));
+ *output = (CleanString) cleanOutput;
+ memcpy(CleanStringCharacters(cleanOutput), cs_output, strlen(cs_output));
+ CleanStringLength(cleanOutput) = strlen(cs_output);
+}
+
+void cleanHistoryArgExtract(
+ int first, int last, CleanString string, CleanString *output, int *null)
+{
+ char *cs_string = cleanStringToCString(string);
+ char *cs_output = history_arg_extract(first, last, cs_string);
+ if(cs_output == NULL){
+ *null = 1;
+ cs_output = "";
+ } else {
+ *null = 0;
+ }
+
+ CleanStringVariable(cleanOutput, strlen(cs_output));
+ *output = (CleanString) cleanOutput;
+ memcpy(CleanStringCharacters(cleanOutput), cs_output, strlen(cs_output));
+ CleanStringLength(cleanOutput) = strlen(cs_output);
+
+ if(*null == 0){
+ free(cs_output);
+ }
+}