Added last history function descriptions
[CleanReadLine.git] / ReadLine.icl
index 8807f4f..71d64df 100644 (file)
@@ -4,32 +4,250 @@ import StdEnv
 
 import code from "readLine.o"
 
-readLine :: !String !Bool !*env -> (!String, !*env)
-readLine s h e = code {
-                       ccall cleanReadLine "SI:S:A"
+//Maybe
+isNothing :: !(Maybe .x) -> Bool
+isNothing Nothing = True
+isNothing _ = False
+
+isJust    :: !(Maybe .x) -> Bool
+isJust Nothing = False
+isJust _ = True
+
+fromJust  :: !(Maybe .x) -> .x
+fromJust (Just x) = x
+
+instance toString HistoryItem where
+       toString {line,timestamp} = line +++ " (" +++ timestamp +++ ")"
+instance toString HistoryState where
+       toString {entries,offset,flags} = "[" +++ toS entries +++ "]\n" +++ 
+                       "offset: " +++ toString offset +++ "\nflags: " +++ toString flags
+               where
+                       toS :: [HistoryItem] -> String
+                       toS [] = "--empty--"
+                       toS [x] = toString x
+                       toS [x:xs] = toString x +++ ","
+
+//Readline
+readLine :: !String !Bool !*env -> (!Maybe String, !*env)
+readLine s h e
+# (s, eof, e) = readLineEof s h e
+= (if eof Nothing (Just s), e)
+       where
+               readLineEof :: !String !Bool !*env -> (!String, !Bool, !*env)
+               readLineEof s h e = code {
+                               ccall cleanReadLine "SI:VSI: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"
+       }
+
+addHistoryTime :: !String !*env -> *env
+addHistoryTime s e = code {
+               ccall cleanAddHistoryTime "S:V:A"
+       }
+
+removeHistory :: !Int !*env -> (!HistoryItem, !*env)
+removeHistory i e
+# (line, timestamp, e) = removeHistoryItem i e
+= ({HistoryItem | line=line, timestamp=timestamp}, e)
+       where
+               removeHistoryItem :: !Int !*env -> (!String, !String, !*env)
+               removeHistoryItem i e = code {
+                               ccall cleanRemoveHistory "I:VSS:A"
+                       }
+
+replaceHistoryEntry :: !Int !String !*env -> (!HistoryItem, !*env)
+replaceHistoryEntry i s e
+# (line, timestamp, e) = replaceItem i s e
+= ({HistoryItem | line=line, timestamp=timestamp}, e)
+       where
+               replaceItem :: !Int !String !*env -> (!String, !String, !*env)
+               replaceItem i s e = code {
+                               ccall cleanReplaceHistoryEntry "IS:VSS:A"
+                       }
+
+clearHistory :: !*env -> *env
+clearHistory e = code {
+               ccall cleanClearHistory ":V:A"
+       }
+
+stifleHistory :: !Int !*env -> *env
+stifleHistory i e = code {
+               ccall cleanStifleHistory "I:V:A"
+       }
+
+unstifleHistory :: !*env -> *env
+unstifleHistory e = code {
+               ccall cleanUnstifleHistory ":V:A"
+       }
+
+historyIsStifled :: !*env -> (!Int, !*env)
+historyIsStifled e = code {
+               ccall cleanHistoryIsStifled ":I:A"
+       }
+
+//Information About the History List
+historyList :: !*env -> (![HistoryItem], !*env)
+historyList e
+# ({entries,offset,flags}, e) = historyGetHistoryState e
+= (entries, e)
+
+whereHistory :: !*env -> (!Int, !*env)
+whereHistory e
+# ({entries,offset,flags}, e) = historyGetHistoryState e
+= (offset, e)
+
+currentHistory :: !*env -> (!Maybe HistoryItem, !*env)
+currentHistory e
+# ({entries,offset,flags}, e) = historyGetHistoryState e
+= (if (isEmpty entries) Nothing (Just (entries!!offset)), e)
+
+historyGet :: !Int !*env -> (!Maybe HistoryItem, !*env)
+historyGet i e
+# ({entries,offset,flags}, e) = historyGetHistoryState e
+= (if (isEmpty entries) Nothing (Just (entries!!i)), e)
+
+historyGetTime :: HistoryItem -> String
+historyGetTime {line,timestamp} = timestamp
+
+historyTotalBytes :: !*env -> (!Int, !*env)
+historyTotalBytes e = code {
+               ccall cleanHistoryTotalBytes ":I:A"
+       }
+
+//Moving Around the History List
+historySetPos :: !Int !*env -> (!Int, !*env)
+historySetPos i e = code {
+               ccall cleanHistorySetPos "I:I:A"
        }
 
+previousHistory :: !*env -> (!Maybe HistoryItem, !*env)
+previousHistory e
+# (line, timestamp, null, e) = previousHistoryItem e
+= (if null Nothing (Just {HistoryItem | line=line, timestamp=timestamp}), e)
+       where
+               previousHistoryItem :: !*env -> (!String, !String, !Bool, !*env)
+               previousHistoryItem e = code {
+                               ccall cleanPreviousHistory ":VSSI:A"
+                       }
+
+nextHistory :: !*env -> (!Maybe HistoryItem, !*env)
+nextHistory e
+# (line, timestamp, null, e) = nextHistoryItem e
+= (if null Nothing (Just {HistoryItem | line=line, timestamp=timestamp}), e)
+       where
+               nextHistoryItem :: !*env -> (!String, !String, !Bool, !*env)
+               nextHistoryItem e = code {
+                               ccall cleanNextHistory ":VSSI:A"
+                       }
+
+//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"
+               ccall cleanReadHistory "S:I:A"
        }
 
 readHistoryRange :: !String !Int !Int !*env -> (!Bool, !*env)
 readHistoryRange s i1 i2 e = code {
-                       ccall cleanReadHistoryRange "SII:I:A"
+               ccall cleanReadHistoryRange "SII:I:A"
        }
 
 writeHistory :: !String !*env -> (!Bool, !*env)
 writeHistory s e = code {
-                       ccall cleanWriteHistory "S:I:A"
+               ccall cleanWriteHistory "S:I:A"
        }
 
 appendHistory :: !Int !String !*env -> (!Bool, !*env)
 appendHistory i s e = code {
-                       ccall cleanWriteHistory "IS:I:A"
+               ccall cleanWriteHistory "IS:I:A"
        }
                
 historyTruncateFile :: !String !Int !*env -> (!Bool, !*env)
 historyTruncateFile i s e = code {
-                       ccall cleanWriteHistory "SI:I:A"
+               ccall cleanWriteHistory "SI:I:A"
        }
+
+historyExpand :: !String !*env -> (!String, !Int, !*env)
+getHistoryEvent :: !String !Int !Int !*env -> (!String, !*env)
+historyTokenize :: !String !*env -> ([String], !*env)
+historyArgExtract :: !Int !Int !String !*env -> (!String, !*env)