fixed issue 1, changed function type of readline
[CleanReadLine.git] / Clean System Files / readLine.c
index bea7de6..c73bc06 100644 (file)
@@ -9,7 +9,9 @@
 static char *cs_answer = (char *)NULL;
 HISTORY_STATE *history_state = NULL;
 
-char *cleanStringToCString(CleanString s){
+//Helper functions
+char *cleanStringToCString(CleanString s)
+{
        unsigned long len = CleanStringLength(s);
        char *cs = (char *)malloc(len+1);
        if(cs == NULL){
@@ -21,7 +23,13 @@ char *cleanStringToCString(CleanString s){
        return cs;
 }
 
-void cleanReadLine(CleanString prompt, int history, CleanString *result)
+void cleanSetReadLineName(CleanString name)
+{
+       rl_readline_name = cleanStringToCString(name);
+}
+
+//Readline functions
+void cleanReadLine(CleanString prompt, int history, CleanString *result, int *eof)
 {
        char *cs_prompt = cleanStringToCString(prompt);
 
@@ -35,35 +43,35 @@ void cleanReadLine(CleanString prompt, int history, CleanString *result)
        if(cs_answer && *cs_answer && history){
                add_history(cs_answer);
        }
-
+       
+       *eof = 0;
        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);
+               cs_answer = (char *)malloc(1);
+               cs_answer[0] = '\0';
+               *eof = 1;
        }
+       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(){
+//History Functions
+//Initializing History and State Management
+void cleanUsingHistory()
+{
        using_history();
 }
 
-void cleanGetState(int *offset, int *num, int *flags){
+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){
+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;
 
@@ -78,7 +86,8 @@ void cleanGetHistoryItem(int num, CleanString *line, CleanString *timestamp){
        CleanStringLength(cleanTimestamp) = strlen(cs_stamp);
 }
 
-void cleanInitNewHistoryState(int offset, int flags, int num){
+void cleanInitNewHistoryState(int offset, int flags, int num)
+{
        if(history_state != NULL){
                //we should test if we can recursively free the object
                free(history_state);
@@ -103,48 +112,136 @@ void cleanInitNewHistoryState(int offset, int flags, int num){
        history_state->flags = 0;
 }
 
-void cleanSetNewHistoryEntry(int i, CleanString line, CleanString timestamp){
+void cleanSetNewHistoryEntry(int i, CleanString line, CleanString timestamp)
+{
        char *cs_line = cleanStringToCString(line);
        char *cs_timestamp = cleanStringToCString(timestamp);
        history_state->entries[i]->line = cs_line;
        history_state->entries[i]->timestamp = cs_timestamp;
 }
 
-void cleanCommitSetHistory(void){
+void cleanCommitSetHistory(void)
+{
        history_set_history_state(history_state);
 }
 
-void cleanAddHistory(CleanString entry){
+//History List Management
+void cleanAddHistoryTime(CleanString timestamp)
+{
+       char *cs_timestamp = cleanStringToCString(timestamp);
+       add_history_time(cs_timestamp);
+       free(cs_timestamp);
+}
+
+void cleanAddHistory(CleanString entry)
+{
        char *cs_entry = cleanStringToCString(entry);
        add_history(cs_entry);
        free(cs_entry);
 }
 
-void cleanClearHistory(){
+void cleanRemoveHistory(int which, CleanString *line, CleanString *timestamp)
+{
+       HIST_ENTRY *entry = remove_history(which);
+       char *cs_line =  entry->line;
+       char *cs_stamp = entry->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);
+
+       histdata_t tofree = free_history_entry(entry);
+       free(tofree);
+}
+
+void cleanReplaceHistoryEntry(
+               int which, CleanString l, CleanString *line, CleanString *timestamp)
+{
+       char *cs_l = cleanStringToCString(l);
+       HIST_ENTRY *entry = replace_history_entry(which, cs_l, NULL);
+       free(cs_l);
+       if(entry == NULL){
+               printf("invalid which\n");
+       }
+
+       char *cs_line =  entry->line;
+       char *cs_stamp = entry->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);
+
+       histdata_t tofree = free_history_entry(entry);
+       free(tofree);
+}
+
+
+void cleanClearHistory()
+{
        clear_history();
 }
 
-int cleanHistorySearch(CleanString s, int dir){
+void cleanStifleHistory(int max)
+{
+       stifle_history(max);
+}
+
+int cleanUnstifleHistory()
+{
+       return unstifle_history();
+}
+
+int cleanHistoryIsStifled()
+{
+       return history_is_stifled();
+}
+
+//Information About the History List
+int cleanHistoryTotalBytes()
+{
+       return history_total_bytes();
+}
+
+//Moving Around the History List
+
+//Searching the History List
+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){
+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){
+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;
 }
 
+//Managing the History File
 int cleanReadHistory(CleanString path)
 {
        char *cs_path = cleanStringToCString(path);