expanding implemented
[CleanReadLine.git] / Clean System Files / readLine.c
index 814541c..eb5c76a 100644 (file)
@@ -7,6 +7,8 @@
 #include "Clean.h"
 
 static char *cs_answer = (char *)NULL;
+static char **cs_tokens = (char **)NULL;
+static int num_tokens = 0;
 HISTORY_STATE *history_state = NULL;
 
 //Helper functions
@@ -337,3 +339,91 @@ int cleanHistoryTruncateFile(CleanString path, int nlines)
        free(cs_path);
        return errno == 0;
 }
+
+//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);
+       }
+}