setting history now works
[CleanReadLine.git] / ReadLine.icl
index 8807f4f..07b90ac 100644 (file)
@@ -4,11 +4,105 @@ import StdEnv
 
 import code from "readLine.o"
 
+//Readline
 readLine :: !String !Bool !*env -> (!String, !*env)
 readLine s h e = code {
                        ccall cleanReadLine "SI:S:A"
        }
 
+setReadLineName :: !String !*env -> !*env
+setReadLineName s e = code {
+                       ccall cleanSetReadLineName "S:V:A"
+       }
+
+//Initializing History and State Management
+usingHistory :: !*env -> !*env
+usingHistory e = code {
+                       ccall cleanUsingHistory ":V:A"
+       }
+
+historyGetHistoryState :: !*env -> (!HistoryState, !*env)
+historyGetHistoryState e
+# (offset, num, flags, e) = getState e
+# (entries, e) = getItems num e
+= ({HistoryState | entries=entries, offset=offset, flags=flags}, e)
+       where
+               getState :: !*env -> (!Int, !Int, !Int, !*env)
+               getState e= code {
+                       ccall cleanGetState ":VIII:A"
+               }
+               getItems :: !Int !*env -> (![HistoryItem], !*env)
+               getItems 0 e = ([], e)
+               getItems i e
+               # (line, timestamp, e) = getItem (i-1) e
+               # (rest, e) = getItems (i-1) e
+               = ([{line=line,timestamp=timestamp}:rest], e)
+
+               getItem :: !Int !*env -> (!String, !String, !*env)
+               getItem i e = code {
+                       ccall cleanGetHistoryItem "I:VSS:A"
+               }
+               
+
+historySetHistoryState :: !HistoryState !*env -> !*env
+historySetHistoryState {entries,offset,flags} e
+# e = initNewHistoryState offset flags (length entries) e
+# e = setItems entries 0 e
+= commit e
+       where
+               initNewHistoryState :: !Int !Int !Int !*env -> !*env
+               initNewHistoryState o f l e = code {
+                               ccall cleanInitNewHistoryState "III:V:A"
+                       }
+               setItems :: ![HistoryItem] !Int !*env -> !*env
+               setItems [] _ e = e
+               setItems [x:xs] i e
+               # e = setItem i x.line x.timestamp e
+               = setItems xs (i+1) e
+
+               setItem :: !Int !String !String !*env -> !*env
+               setItem i l t e = code {
+                               ccall cleanSetNewHistoryEntry "ISS:V:A"
+                       }
+               
+               commit :: !*env -> !*env
+               commit e = code {
+                               ccall cleanCommitSetHistory ":V:A"
+                       }
+
+//History List Management
+addHistory :: !String !*env -> !*env
+addHistory s e = code {
+                       ccall cleanAddHistory "S:V:A"
+       }
+
+clearHistory :: !*env -> !*env
+clearHistory e = code {
+                       ccall cleanClearHistory ":V:A"
+       }
+
+//Information About the History List
+
+//Moving Around the History List
+
+//Searching the History List
+historySearch :: !String !Int !*env-> (!Int, !*env)
+historySearch s i e = code {
+                       ccall cleanHistorySearch "SI:I:A"
+       }
+
+historySearchPrefix :: !String !Int !*env-> (!Int, !*env)
+historySearchPrefix s i e = code {
+                       ccall cleanHistorySearchPrefix "SI:I:A"
+       }
+       
+historySearchPos :: !String !Int !Int !*env-> (!Int, !*env)
+historySearchPos s i1 i2 e = code {
+                       ccall cleanHistorySearchPos "SI:I:A"
+       }
+       
+
+//Managing the History File
 readHistory :: !String !*env -> (!Bool, !*env)
 readHistory s e = code {
                        ccall cleanReadHistory "S:I:A"