shake-language-c-0.5.0: Development/Shake/Language/C/Util.hs
-- Copyright 2012-2014 Samplecount S.L.
--
-- Licensed under the Apache License, Version 2.0 (the "License");
-- you may not use this file except in compliance with the License.
-- You may obtain a copy of the License at
--
-- http://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.
module Development.Shake.Language.C.Util (
mapFlag
, concatMapFlag
, escapeSpaces
, words'
) where
import Data.List
mapFlag :: String -> [String] -> [String]
mapFlag f = concatMap (\x -> [f, x])
concatMapFlag :: String -> [String] -> [String]
concatMapFlag f = map (f++)
-- | Escape spaces with '\\' character.
escapeSpaces :: String -> String
escapeSpaces [] = []
escapeSpaces (' ':xs) = '\\' : ' ' : escapeSpaces xs
escapeSpaces ('\\':xs) = '\\' : '\\' : escapeSpaces xs
escapeSpaces (x:xs) = x : escapeSpaces xs
-- | Split a list of space separated strings.
--
-- Spaces can be escaped by '\\'.
words' :: String -> [String]
words' = unescape . words
where
escape = "\\"
escapeLength = length escape
isEscaped = isSuffixOf escape
dropEscape = (++" ") . reverse . drop escapeLength . reverse
unescape [] = []
unescape [x] = [if isEscaped x then dropEscape x else x]
unescape (x1:x2:xs)
| isEscaped x1 = unescape ((dropEscape x1 ++ x2):xs)
| otherwise = [x1] ++ unescape (x2:xs)