-- ghc-mod: Making Haskell development *more* fun -- Copyright (C) 2015 Nikolay Yakimov -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU Affero General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU Affero General Public License for more details. -- -- You should have received a copy of the GNU Affero General Public License -- along with this program. If not, see . module GHCMod.Options.ShellParse (parseCmdLine) where import Data.Char import Data.Maybe isQuote :: Char -> Bool isQuote = (==) '"' isEscapeChar :: Char -> Bool isEscapeChar = (==) '\\' isEscapable :: Char -> Bool isEscapable c = any ($ c) [isSpace, isQuote, isEscapeChar] go :: String -> String -> [String] -> Maybe Char -> [String] -- result go [] curarg accargs _ = reverse $ reverse curarg : accargs -- escaped character go (esc:c:cl) curarg accargs quote | isEscapeChar esc = if isEscapable c then go cl (c:curarg) accargs quote else go (c:cl) (esc:curarg) accargs quote go (c:cl) curarg accargs quotes -- quote character -- opens quotes | isQuote c, isNothing quotes = go cl curarg accargs (Just c) -- close quotes | quotes == Just c = go cl curarg accargs Nothing -- space separates argumetns outside quotes | isSpace c, isNothing quotes = if null curarg then go cl curarg accargs quotes else go cl [] (reverse curarg : accargs) quotes -- general character | otherwise = go cl (c:curarg) accargs quotes parseCmdLine :: String -> [String] parseCmdLine comline = go comline [] [] Nothing