ddc-interface (empty) → 0.3.2.1
raw patch · 5 files changed
+302/−0 lines, 5 filesdep +basedep +containersdep +ddc-basesetup-changed
Dependencies added: base, containers, ddc-base, directory
Files
- DDC/Interface/Input.hs +189/−0
- DDC/Interface/Source.hs +43/−0
- LICENSE +30/−0
- Setup.hs +2/−0
- ddc-interface.cabal +38/−0
+ DDC/Interface/Input.hs view
@@ -0,0 +1,189 @@++module DDC.Interface.Input+ ( InputInterface (..)+ , InputState (..)+ , Input (..)+ , readInput+ , inputLine)+where+import DDC.Interface.Source+import DDC.Data.ListUtils+import System.Directory+import Data.List+import Data.Char+++-- InputState -----------------------------------------------------------------+-- Interpreter input state+data InputState command+ = InputState+ { -- Function to parse commands.+ inputParseCommand :: String -> Maybe (command, String)++ -- Input mode.+ , inputMode :: Input++ -- Command that we're still receiving input for,+ -- along with the line number it started on.+ , inputCommand :: Maybe (Maybe command, Int)+++ -- The current line number in the command stream.+ , inputLineNumber :: Int++ -- Accumulation of current input buffer.+ , inputAcc :: String }+++-- InputInterface -------------------------------------------------------------+-- | What interface is being used.+data InputInterface+ -- | Read commands from unix command-line args.+ = InputInterfaceArgs++ -- | Read commands interactively from the console.+ | InputInterfaceConsole++ -- | Read commands from the file with this name.+ | InputInterfaceBatch FilePath+ deriving (Eq, Show)+++-- Input ----------------------------------------------------------------------+-- | How we're reading the current expression.+data Input+ -- | Read input line-by-line, using a backslash at the end of the+ -- line to continue to the next.+ = InputLine++ -- | Read input as a block terminated by a double semicolon (;;)+ | InputBlock++ -- | Read input from a file specified on the prompt+ | InputFile FilePath+ deriving (Eq, Show)+++-- | Read the input mode from the front of a string.+readInput :: String -> (Input, String)+readInput ss+ | isPrefixOf ".." ss+ = (InputBlock, drop 2 ss)++ | isPrefixOf "<" ss+ , filePath <- dropWhile isSpace (drop 1 ss)+ = (InputFile filePath, drop (length filePath) ss)++ | otherwise+ = (InputLine, ss)++-------------------------------------------------------------------------------+inputLine + :: InputInterface+ -> InputState c + -> String+ -> IO ( InputState c+ , Maybe (Source, Maybe c, String))+ -- Just for complete command.+ -- .. then Maybe for the default command.++inputLine interface inputState chunk+ | InputState readCmd mode mCommand lineNumber acc <- inputState+ = do + -- If this is the first line then try to read the command and+ -- input mode from the front so we know how to continue.+ -- If we can't read an explicit command then assume this is + -- an expression to evaluate.+ let (cmd, lineStart, (input, rest))+ = case mCommand of+ -- We haven't started a command yet.+ Nothing+ -> case readCmd chunk of+ Just (cmd', rest') -> (Just cmd', lineNumber, readInput rest')+ Nothing -> (Nothing, lineNumber, (InputLine, chunk))+ + -- We've already started a command, and this is more input for it.+ Just (cmd', lineStart')+ -> (cmd', lineStart', (mode, chunk))++ let source + -- We were instructed to read the program from a file.+ -- Report this file as the source location, independent+ -- of how we were instructed to read it.+ | InputFile filePath <- input+ = SourceFile filePath++ -- The program was embedded in the command stream.+ | otherwise+ = case interface of+ InputInterfaceArgs -> SourceArgs+ InputInterfaceConsole -> SourceConsole lineStart+ InputInterfaceBatch file -> SourceBatch file lineStart+++ case input of+ -- For line-by-line mode, if the line ends with backslash then keep+ -- reading, otherwise run the command.+ -- We also convert the backslash to a newline so the source+ -- position comes out right in parser error messages.+ InputLine+ | not $ null rest+ , last rest == '\\'+ , Just initRest <- takeInit rest+ -> return ( inputState+ { inputCommand = (Just (cmd, lineStart))+ , inputLineNumber = lineNumber + 1+ , inputAcc = acc ++ initRest ++ "\n" }+ , Nothing)++ | otherwise+ -> return ( inputState+ { inputMode = InputLine+ , inputCommand = Nothing+ , inputLineNumber = lineNumber + 1+ , inputAcc = [] }+ , Just (source, cmd, acc ++ rest))+++ -- For block mode, if the line ends with ';;' then run the command,+ -- otherwise keep reading.+ InputBlock+ | isSuffixOf ";;" rest+ -> do let rest' = take (length rest - 2) rest+ return ( inputState+ { inputMode = InputLine+ , inputCommand = Nothing+ , inputLineNumber = lineNumber + 1+ , inputAcc = [] }+ , Just (source, cmd, acc ++ rest'))++ | otherwise+ -> return ( inputState+ { inputMode = input+ , inputCommand = Just (cmd, lineStart)+ , inputLineNumber = lineNumber + 1+ , inputAcc = acc ++ rest ++ "\n" }+ , Nothing)++ -- Read input from a file+ InputFile filePath+ -> do exists <- doesFileExist filePath+ if exists + then do + contents <- readFile filePath+ return ( inputState+ { inputMode = InputLine+ , inputCommand = Nothing+ , inputLineNumber = lineNumber + 1+ , inputAcc = [] }+ , Just (source, cmd, contents))+ else do+ putStrLn "No such file."+ return ( inputState+ { inputMode = InputLine+ , inputCommand = Nothing+ , inputLineNumber = lineNumber + 1+ , inputAcc = [] }+ , Nothing)++
+ DDC/Interface/Source.hs view
@@ -0,0 +1,43 @@++module DDC.Interface.Source+ ( Source(..)+ , lineStartOfSource+ , nameOfSource)+where++-- | Where some source code was obtained from.+--+-- This is used when generating error messages.+data Source+ -- | Read directly from a file.+ = SourceFile FilePath ++ -- | Supplied on the command line.+ | SourceArgs ++ -- | Typed into the console.+ | SourceConsole Int++ -- | Part of a @.dcx@ batch file.+ | SourceBatch FilePath Int+ deriving (Eq, Show)+++-- | Get the starting source line number to report for this source.+lineStartOfSource :: Source -> Int+lineStartOfSource ss+ = case ss of+ SourceFile{} -> 1+ SourceArgs{} -> 1+ SourceConsole i -> i+ SourceBatch _ i -> i+++-- | Get the name of a source.+nameOfSource :: Source -> String+nameOfSource ss+ = case ss of+ SourceFile f -> f+ SourceArgs -> "<arg>"+ SourceConsole{} -> "<console>"+ SourceBatch{} -> "<batch>"
+ LICENSE view
@@ -0,0 +1,30 @@+--------------------------------------------------------------------------------+The Disciplined Disciple Compiler License (MIT style)++Copyrite (K) 2007-2013 The Disciplined Disciple Compiler Strike Force+All rights reversed.++Permission is hereby granted, free of charge, to any person obtaining a copy+of this software and associated documentation files (the "Software"), to deal+in the Software without restriction, including without limitation the rights+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell+copies of the Software, and to permit persons to whom the Software is+furnished to do so, subject to the following conditions:++The above copyright notice and this permission notice shall be included in+all copies or substantial portions of the Software.++-------------------------------------------------------------------------------+Under Australian law copyright is free and automatic.+By contributing to DDC authors grant all rights they have regarding their+contributions to the other members of the Disciplined Disciple Compiler Strike+Force, past, present and future, as well as placing their contributions under+the above license.++Use "darcs show authors" to get a list of Strike Force members.++--------------------------------------------------------------------------------+Redistributions of libraries in ./external are governed by their own licenses:++ - TinyPTC GNU Lesser General Public License+
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ ddc-interface.cabal view
@@ -0,0 +1,38 @@+Name: ddc-interface+Version: 0.3.2.1+License: MIT+License-file: LICENSE+Author: The Disciplined Disciple Compiler Strike Force+Maintainer: Ben Lippmeier <benl@ouroborus.net>+Build-Type: Simple+Cabal-Version: >=1.6+Stability: experimental+Category: Compilers/Interpreters+Homepage: http://disciple.ouroborus.net+Synopsis: Disciplined Disciple Compiler user interface support.+Description: Disciplined Disciple Compiler user interface support.++Library+ Build-Depends: + base == 4.6.*,+ containers == 0.5.*,+ directory == 1.2.*,+ ddc-base == 0.3.2.*++ Exposed-modules:+ DDC.Interface.Input+ DDC.Interface.Source++ GHC-options:+ -Wall+ -fno-warn-orphans+ -fno-warn-missing-signatures+ -fno-warn-unused-do-bind++ Extensions:+ NoMonomorphismRestriction+ KindSignatures+ ScopedTypeVariables+ PatternGuards+ ParallelListComp+