implementation module ReadLine 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" } readHistoryRange :: !String !Int !Int !*env -> (!Bool, !*env) readHistoryRange s i1 i2 e = code { ccall cleanReadHistoryRange "SII:I:A" } writeHistory :: !String !*env -> (!Bool, !*env) writeHistory s e = code { ccall cleanWriteHistory "S:I:A" } appendHistory :: !Int !String !*env -> (!Bool, !*env) appendHistory i s e = code { ccall cleanWriteHistory "IS:I:A" } historyTruncateFile :: !String !Int !*env -> (!Bool, !*env) historyTruncateFile i s e = code { ccall cleanWriteHistory "SI:I:A" }