HXQ-0.8: Main.hs
{--------------------------------------------------------------
-
- The main program of the XQuery interpreter
- Programmer: Leonidas Fegaras (fegaras@cse.uta.edu)
- Date: 05/02/2008
-
---------------------------------------------------------------}
{-# OPTIONS_GHC -fth #-}
module Main where
import System.Environment
import qualified Control.Exception
import XML.HXQ.Compiler(functions)
import XML.HXQ.Interpreter(evalInput,xqueryE)
import XML.HXQ.XQuery
version = "0.8"
parseEnv :: [String] -> [(String,String)]
parseEnv [] = [("o","Temp.hs")]
parseEnv ("-help":xs) = ("help",""):(parseEnv xs)
parseEnv ("-c":file:xs) = ("c",file):(parseEnv xs)
parseEnv ("-o":file:xs) = ("o",file):(parseEnv xs)
parseEnv ("-p":query:file:xs) = ("p","doc('"++file++"')"++query):(parseEnv xs)
parseEnv (('-':x):_) = error ("Unrecognized option -"++x++". Use -help.")
parseEnv (file:xs) = ("r",file):(parseEnv xs)
main = do putStrLn ("HXQ: XQuery Interpreter version "++version++". Use -help for help.")
senv <- getArgs
let env = parseEnv senv
Just system_path = lookup "ghc" env
Just hxq_path = lookup "hxq" env
case lookup "help" env of
Just _ -> do putStrLn "Command line options and files:"
putStrLn " xquery-file interpret the XQuery in xquery-file"
putStrLn " -c xquery-file compile the XQuery in xquery-file into Haskell code"
putStrLn " -o haskell-file set the Haskell file for -c (default is Temp.hs)"
putStrLn " -p XPath-query xml-file interpret the XPath query against the xml-file"
putStrLn "Without options, it reads and interprets the input:"
putStrLn " The input may be an XQuery or a declare variable or function"
putStrLn " To write an XQuery in multiple lines, wrap it in {}"
putStrLn ("Functions: "++(foldr (\(f,_,_) r -> f++" "++r) "" functions))
_ -> case lookup "c" env of
Just file -> do query <- readFile file
let qf = map (\c -> if c=='\"' then '\'' else c)
(foldr1 (\a r -> a++" "++r) (lines query))
pr = "{-# OPTIONS_GHC -fth #-}\nmodule Main where\nimport XML.HXQ.XQuery\n\nmain = do res <- $(xq \""
++ qf ++ "\")\n putXSeq res\n"
Just ofile = lookup "o" env
writeFile ofile pr
_ -> case lookup "r" env of
Just file -> do result <- xfile file
putXSeq result
_ -> case lookup "p" env of
Just query -> do result <- xquery query
putXSeq result
_ -> evalInput (\s vs fs-> Control.Exception.catch (do (result,nvs,nfs) <- xqueryE s vs fs
putXSeq result
return (nvs,nfs))
(\e -> do putStrLn (show e); return (vs,fs))) [] []