setting history now works
[CleanReadLine.git] / Clean System Files / readLine.c
index b39be2e..fa9315a 100644 (file)
@@ -7,18 +7,23 @@
 #include "Clean.h"
 
 static char *cs_answer = (char *)NULL;
+HISTORY_STATE *history_state = NULL;
 
-void cleanReadLine(CleanString prompt, int history, CleanString *result)
-{
-       //Initialize
-       unsigned long promptlen = CleanStringLength(prompt);
-       char *cs_prompt = (char *)malloc(promptlen+1);
-       if(cs_prompt == NULL){
+char *cleanStringToCString(CleanString s){
+       unsigned long len = CleanStringLength(s);
+       char *cs = (char *)malloc(len+1);
+       if(cs == NULL){
                printf("malloc failed...\n");
                exit(1);
        }
-       memcpy(cs_prompt, CleanStringCharacters(prompt), promptlen);
-       cs_prompt[promptlen] = '\0';
+       memcpy(cs, CleanStringCharacters(s), len);
+       cs[len] = '\0';
+       return cs;
+}
+
+void cleanReadLine(CleanString prompt, int history, CleanString *result)
+{
+       char *cs_prompt = cleanStringToCString(prompt);
 
        //Get the answer and add to history if not empty
        if(cs_answer){
@@ -31,9 +36,157 @@ void cleanReadLine(CleanString prompt, int history, CleanString *result)
                add_history(cs_answer);
        }
 
-       //Transfor answer into cstring
-       CleanStringVariable(answer, strlen(cs_answer));
-       *result = (CleanString) answer;
-       memcpy(CleanStringCharacters(answer), cs_answer, strlen(cs_answer));
-       CleanStringLength(answer) = strlen(cs_answer);
+       if(!cs_answer){ //In case of an EOF
+               CleanStringVariable(answer, 1);
+               *result = (CleanString) answer;
+               memcpy(CleanStringCharacters(answer), "", 1);
+               CleanStringLength(answer) = 1;
+       } else { //In case of a proper response
+               CleanStringVariable(answer, strlen(cs_answer));
+               *result = (CleanString) answer;
+               memcpy(CleanStringCharacters(answer), cs_answer, strlen(cs_answer));
+               CleanStringLength(answer) = strlen(cs_answer);
+       }
+}
+
+void cleanSetReadLineName(CleanString name){
+       rl_readline_name = cleanStringToCString(name);
+}
+
+void cleanUsingHistory(){
+       using_history();
+}
+
+void cleanGetState(int *offset, int *num, int *flags){
+       *offset = history_get_history_state()->offset;
+       *num = history_get_history_state()->length;
+       *flags = history_get_history_state()->flags;
+}
+
+void cleanGetHistoryItem(int num, CleanString *line, CleanString *timestamp){
+       char *cs_line = history_get_history_state()->entries[num]->line;
+       char *cs_stamp = history_get_history_state()->entries[num]->timestamp;
+
+       CleanStringVariable(cleanLine, strlen(cs_line));
+       *line = (CleanString) cleanLine;
+       memcpy(CleanStringCharacters(cleanLine), cs_line, strlen(cs_line));
+       CleanStringLength(cleanLine) = strlen(cs_line);
+
+       CleanStringVariable(cleanTimestamp, strlen(cs_stamp));
+       *timestamp = (CleanString) cleanTimestamp;
+       memcpy(CleanStringCharacters(cleanTimestamp), cs_stamp, strlen(cs_stamp));
+       CleanStringLength(cleanTimestamp) = strlen(cs_stamp);
+}
+
+void cleanInitNewHistoryState(int offset, int flags, int num){
+       printf("Initializing: %d, %d, %d\n", offset, flags, num);
+       if(history_state != NULL){
+               free(history_state);
+       }
+       history_state = (HISTORY_STATE *)malloc(sizeof(HISTORY_STATE));
+       if(history_state == NULL){
+               printf("Not enough memory...\n");
+               exit(1);
+       }
+       HIST_ENTRY **entries = (HIST_ENTRY **)malloc(sizeof(HIST_ENTRY*)*num);
+       if(entries == NULL){
+               printf("Not enough memory...\n");
+               exit(1);
+       }
+       for(int i = 0; i<num; i++){
+               entries[i] = (HIST_ENTRY *)malloc(sizeof(HIST_ENTRY));
+       }
+       history_state->offset = offset;
+       history_state->entries = entries;
+       history_state->length = num;
+       history_state->size = num;
+       history_state->flags = 0;
+       printf("Initialization done\n");
+}
+
+void cleanSetNewHistoryEntry(int i, CleanString line, CleanString timestamp){
+       char *cs_line = cleanStringToCString(line);
+       char *cs_timestamp = cleanStringToCString(timestamp);
+       printf("adding: %d, %s, %s\n", i, cs_line, cs_timestamp);
+       history_state->entries[i]->line = cs_line;
+       history_state->entries[i]->timestamp = cs_timestamp;
+       printf("done adding: %d, %s, %s\n", i, cs_line, cs_timestamp);
 }
+
+void cleanCommitSetHistory(void){
+       printf("commit\n");
+       history_set_history_state(history_state);
+       printf("committed\n");
+}
+
+void cleanAddHistory(CleanString entry){
+       char *cs_entry = cleanStringToCString(entry);
+       add_history(cs_entry);
+       free(cs_entry);
+}
+
+void cleanClearHistory(){
+       clear_history();
+}
+
+int cleanHistorySearch(CleanString s, int dir){
+       char *cs_s = cleanStringToCString(s);
+       int ret = history_search(cs_s, dir);
+       free(cs_s);
+       return ret;
+}
+
+int cleanHistorySearchPrefix(CleanString s, int dir){
+       char *cs_s = cleanStringToCString(s);
+       int ret = history_search_prefix(cs_s, dir);
+       free(cs_s);
+       return ret;
+}
+
+int cleanHistorySearchPos(CleanString s, int dir, int pos){
+       char *cs_s = cleanStringToCString(s);
+       int ret = history_search_pos(cs_s, dir, pos);
+       free(cs_s);
+       return ret;
+}
+
+int cleanReadHistory(CleanString path)
+{
+       char *cs_path = cleanStringToCString(path);
+       int errno = read_history(cs_path);
+       free(cs_path);
+       return errno;
+}
+
+int cleanReadHistoryRange(CleanString path, int from, int to)
+{
+       char *cs_path = cleanStringToCString(path);
+       int errno = read_history_range(cs_path, from, to);
+       free(cs_path);
+       return errno;
+}
+
+int cleanWriteHistory(CleanString path)
+{
+       char *cs_path = cleanStringToCString(path);
+       int errno = write_history(cs_path);
+       free(cs_path);
+       return errno;
+}
+
+int cleanAppendHistory(int n, CleanString path)
+{
+       char *cs_path = cleanStringToCString(path);
+       int errno = append_history(n, cs_path);
+       free(cs_path);
+       return errno;
+}
+
+int cleanHistoryTruncateFile(CleanString path, int nlines)
+{
+       char *cs_path = cleanStringToCString(path);
+       int errno = history_truncate_file(cs_path, nlines);
+       free(cs_path);
+       return errno;
+}
+