packages feed

cpphs-1.6: docs/cpphs/Language/Preprocessor/Cpphs/Options.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<pre><a name="(line1)"></a><font color=Blue>-----------------------------------------------------------------------------</font>
<a name="(line2)"></a><font color=Blue>-- |</font>
<a name="(line3)"></a><font color=Blue>-- Module      :  Options</font>
<a name="(line4)"></a><font color=Blue>-- Copyright   :  2006 Malcolm Wallace</font>
<a name="(line5)"></a><font color=Blue>-- Licence     :  LGPL</font>
<a name="(line6)"></a><font color=Blue>--</font>
<a name="(line7)"></a><font color=Blue>-- Maintainer  :  Malcolm Wallace &lt;Malcolm.Wallace@cs.york.ac.uk&gt;</font>
<a name="(line8)"></a><font color=Blue>-- Stability   :  experimental</font>
<a name="(line9)"></a><font color=Blue>-- Portability :  All</font>
<a name="(line10)"></a><font color=Blue>--</font>
<a name="(line11)"></a><font color=Blue>-- This module deals with Cpphs options and parsing them</font>
<a name="(line12)"></a><font color=Blue>-----------------------------------------------------------------------------</font>
<a name="(line13)"></a>
<a name="(line14)"></a><font color=Green><u>module</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>Options
<a name="(line15)"></a>  <font color=Cyan>(</font> CpphsOptions<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>
<a name="(line16)"></a>  <font color=Cyan>,</font> BoolOptions<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>
<a name="(line17)"></a>  <font color=Cyan>,</font> parseOptions
<a name="(line18)"></a>  <font color=Cyan>,</font> defaultCpphsOptions
<a name="(line19)"></a>  <font color=Cyan>,</font> defaultBoolOptions
<a name="(line20)"></a>  <font color=Cyan>)</font> <font color=Green><u>where</u></font>
<a name="(line21)"></a>
<a name="(line22)"></a><font color=Green><u>import</u></font> Maybe
<a name="(line23)"></a><font color=Green><u>import</u></font> List <font color=Cyan>(</font>isPrefixOf<font color=Cyan>)</font>
<a name="(line24)"></a>
<a name="(line25)"></a><a name="CpphsOptions"></a><font color=Blue>-- | Cpphs options structure.</font>
<a name="(line26)"></a><a name="CpphsOptions"></a><font color=Green><u>data</u></font> CpphsOptions <font color=Red>=</font> CpphsOptions 
<a name="(line27)"></a>    <font color=Cyan>{</font> infiles	<font color=Red>::</font> <font color=Red>[</font>FilePath<font color=Red>]</font>
<a name="(line28)"></a>    <font color=Cyan>,</font> outfiles	<font color=Red>::</font> <font color=Red>[</font>FilePath<font color=Red>]</font>
<a name="(line29)"></a>    <font color=Cyan>,</font> defines	<font color=Red>::</font> <font color=Red>[</font><font color=Cyan>(</font>String<font color=Cyan>,</font>String<font color=Cyan>)</font><font color=Red>]</font>
<a name="(line30)"></a>    <font color=Cyan>,</font> includes	<font color=Red>::</font> <font color=Red>[</font>String<font color=Red>]</font>
<a name="(line31)"></a>    <font color=Cyan>,</font> preInclude<font color=Red>::</font> <font color=Red>[</font>FilePath<font color=Red>]</font>	<font color=Blue>-- ^ Files to #include before anything else</font>
<a name="(line32)"></a>    <font color=Cyan>,</font> boolopts	<font color=Red>::</font> BoolOptions
<a name="(line33)"></a>    <font color=Cyan>}</font>
<a name="(line34)"></a>
<a name="(line35)"></a><a name="defaultCpphsOptions"></a><font color=Blue>-- | Default options.</font>
<a name="(line36)"></a>defaultCpphsOptions <font color=Red>::</font> CpphsOptions
<a name="(line37)"></a>defaultCpphsOptions <font color=Red>=</font> CpphsOptions <font color=Cyan>{</font> infiles <font color=Red>=</font> []<font color=Cyan>,</font> outfiles <font color=Red>=</font> []
<a name="(line38)"></a>                                   <font color=Cyan>,</font> defines <font color=Red>=</font> []<font color=Cyan>,</font> includes <font color=Red>=</font> []
<a name="(line39)"></a>                                   <font color=Cyan>,</font> preInclude <font color=Red>=</font> []
<a name="(line40)"></a>                                   <font color=Cyan>,</font> boolopts <font color=Red>=</font> defaultBoolOptions <font color=Cyan>}</font>
<a name="(line41)"></a>
<a name="(line42)"></a><a name="BoolOptions"></a><font color=Blue>-- | Options representable as Booleans.</font>
<a name="(line43)"></a><a name="BoolOptions"></a><font color=Green><u>data</u></font> BoolOptions <font color=Red>=</font> BoolOptions
<a name="(line44)"></a>    <font color=Cyan>{</font> macros	<font color=Red>::</font> Bool  <font color=Blue>-- ^ Leave \#define and \#undef in output of ifdef?</font>
<a name="(line45)"></a>    <font color=Cyan>,</font> locations	<font color=Red>::</font> Bool	 <font color=Blue>-- ^ Place #line droppings in output?</font>
<a name="(line46)"></a>    <font color=Cyan>,</font> pragma	<font color=Red>::</font> Bool  <font color=Blue>-- ^ Keep #pragma in final output?</font>
<a name="(line47)"></a>    <font color=Cyan>,</font> stripEol	<font color=Red>::</font> Bool  <font color=Blue>-- ^ Remove C eol (\/\/) comments everywhere?</font>
<a name="(line48)"></a>    <font color=Cyan>,</font> stripC89	<font color=Red>::</font> Bool  <font color=Blue>-- ^ Remove C inline (\/**\/) comments everywhere?</font>
<a name="(line49)"></a>    <font color=Cyan>,</font> lang	<font color=Red>::</font> Bool  <font color=Blue>-- ^ Lex input as Haskell code?</font>
<a name="(line50)"></a>    <font color=Cyan>,</font> ansi	<font color=Red>::</font> Bool  <font color=Blue>-- ^ Permit stringise \# and catenate \#\# operators?</font>
<a name="(line51)"></a>    <font color=Cyan>,</font> layout	<font color=Red>::</font> Bool  <font color=Blue>-- ^ Retain newlines in macro expansions?</font>
<a name="(line52)"></a>    <font color=Cyan>,</font> literate	<font color=Red>::</font> Bool  <font color=Blue>-- ^ Remove literate markup?</font>
<a name="(line53)"></a>    <font color=Cyan>,</font> warnings	<font color=Red>::</font> Bool  <font color=Blue>-- ^ Issue warnings?</font>
<a name="(line54)"></a>    <font color=Cyan>}</font>
<a name="(line55)"></a>
<a name="(line56)"></a><a name="defaultBoolOptions"></a><font color=Blue>-- | Default settings of boolean options.</font>
<a name="(line57)"></a>defaultBoolOptions <font color=Red>::</font> BoolOptions
<a name="(line58)"></a>defaultBoolOptions <font color=Red>=</font> BoolOptions <font color=Cyan>{</font> macros   <font color=Red>=</font> True<font color=Cyan>,</font>   locations <font color=Red>=</font> True
<a name="(line59)"></a>                                 <font color=Cyan>,</font> pragma   <font color=Red>=</font> False
<a name="(line60)"></a>                                 <font color=Cyan>,</font> stripEol <font color=Red>=</font> False<font color=Cyan>,</font>  stripC89  <font color=Red>=</font> False
<a name="(line61)"></a>                                 <font color=Cyan>,</font> lang     <font color=Red>=</font> True<font color=Cyan>,</font>   ansi      <font color=Red>=</font> False
<a name="(line62)"></a>                                 <font color=Cyan>,</font> layout   <font color=Red>=</font> False<font color=Cyan>,</font>  literate  <font color=Red>=</font> False
<a name="(line63)"></a>                                 <font color=Cyan>,</font> warnings <font color=Red>=</font> True <font color=Cyan>}</font>
<a name="(line64)"></a>
<a name="(line65)"></a><a name="RawOption"></a><font color=Blue>-- | Raw command-line options.  This is an internal intermediate data</font>
<a name="(line66)"></a><a name="RawOption"></a><font color=Blue>--   structure, used during option parsing only.</font>
<a name="(line67)"></a><a name="RawOption"></a><font color=Green><u>data</u></font> RawOption
<a name="(line68)"></a>    <font color=Red>=</font> NoMacro
<a name="(line69)"></a>    <font color=Red>|</font> NoLine
<a name="(line70)"></a>    <font color=Red>|</font> Pragma
<a name="(line71)"></a>    <font color=Red>|</font> Text
<a name="(line72)"></a>    <font color=Red>|</font> Strip
<a name="(line73)"></a>    <font color=Red>|</font> StripEol
<a name="(line74)"></a>    <font color=Red>|</font> Ansi
<a name="(line75)"></a>    <font color=Red>|</font> Layout
<a name="(line76)"></a>    <font color=Red>|</font> Unlit
<a name="(line77)"></a>    <font color=Red>|</font> SuppressWarnings
<a name="(line78)"></a>    <font color=Red>|</font> Macro <font color=Cyan>(</font>String<font color=Cyan>,</font>String<font color=Cyan>)</font>
<a name="(line79)"></a>    <font color=Red>|</font> Path String
<a name="(line80)"></a>    <font color=Red>|</font> PreInclude FilePath
<a name="(line81)"></a>      <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font> Show<font color=Cyan>)</font>
<a name="(line82)"></a>
<a name="(line83)"></a><a name="flags"></a>flags <font color=Red>::</font> <font color=Red>[</font><font color=Cyan>(</font>String<font color=Cyan>,</font> RawOption<font color=Cyan>)</font><font color=Red>]</font>
<a name="(line84)"></a>flags <font color=Red>=</font> <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"--nomacro"</font><font color=Cyan>,</font> NoMacro<font color=Cyan>)</font>
<a name="(line85)"></a>        <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"--noline"</font><font color=Cyan>,</font>  NoLine<font color=Cyan>)</font>
<a name="(line86)"></a>        <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"--pragma"</font><font color=Cyan>,</font>  Pragma<font color=Cyan>)</font>
<a name="(line87)"></a>        <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"--text"</font><font color=Cyan>,</font>    Text<font color=Cyan>)</font>
<a name="(line88)"></a>        <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"--strip"</font><font color=Cyan>,</font>   Strip<font color=Cyan>)</font>
<a name="(line89)"></a>        <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"--strip-eol"</font><font color=Cyan>,</font>  StripEol<font color=Cyan>)</font>
<a name="(line90)"></a>        <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"--hashes"</font><font color=Cyan>,</font>  Ansi<font color=Cyan>)</font>
<a name="(line91)"></a>        <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"--layout"</font><font color=Cyan>,</font>  Layout<font color=Cyan>)</font>
<a name="(line92)"></a>        <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"--unlit"</font><font color=Cyan>,</font>   Unlit<font color=Cyan>)</font>
<a name="(line93)"></a>        <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"--nowarn"</font><font color=Cyan>,</font>  SuppressWarnings<font color=Cyan>)</font>
<a name="(line94)"></a>        <font color=Red>]</font>
<a name="(line95)"></a>
<a name="(line96)"></a><a name="rawOption"></a><font color=Blue>-- | Parse a single raw command-line option.  Parse failure is indicated by</font>
<a name="(line97)"></a><font color=Blue>--   result Nothing.</font>
<a name="(line98)"></a>rawOption <font color=Red>::</font> String <font color=Red>-&gt;</font> Maybe RawOption
<a name="(line99)"></a>rawOption x <font color=Red>|</font> isJust a <font color=Red>=</font> a
<a name="(line100)"></a>    <font color=Green><u>where</u></font> a <font color=Red>=</font> lookup x flags
<a name="(line101)"></a>rawOption <font color=Cyan>(</font><font color=Magenta>'-'</font><font color=Red><b>:</b></font><font color=Magenta>'D'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> Just <font color=Cyan>$</font> Macro <font color=Cyan>(</font>s<font color=Cyan>,</font> <font color=Green><u>if</u></font> null d <font color=Green><u>then</u></font> <font color=Magenta>"1"</font> <font color=Green><u>else</u></font> tail d<font color=Cyan>)</font>
<a name="(line102)"></a>    <font color=Green><u>where</u></font> <font color=Cyan>(</font>s<font color=Cyan>,</font>d<font color=Cyan>)</font> <font color=Red>=</font> break <font color=Cyan>(</font><font color=Cyan>==</font><font color=Magenta>'='</font><font color=Cyan>)</font> xs
<a name="(line103)"></a>rawOption <font color=Cyan>(</font><font color=Magenta>'-'</font><font color=Red><b>:</b></font><font color=Magenta>'I'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> Just <font color=Cyan>$</font> Path <font color=Cyan>$</font> trailing <font color=Magenta>"/\\"</font> xs
<a name="(line104)"></a>rawOption xs <font color=Red>|</font> <font color=Magenta>"--include="</font><font color=Cyan>`isPrefixOf`</font>xs
<a name="(line105)"></a>            <font color=Red>=</font> Just <font color=Cyan>$</font> PreInclude <font color=Cyan>(</font>drop <font color=Magenta>10</font> xs<font color=Cyan>)</font>
<a name="(line106)"></a>rawOption <font color=Green><u>_</u></font> <font color=Red>=</font> Nothing
<a name="(line107)"></a>
<a name="(line108)"></a><a name="trailing"></a>trailing <font color=Red>::</font> <font color=Cyan>(</font>Eq a<font color=Cyan>)</font> <font color=Red>=&gt;</font> <font color=Red>[</font>a<font color=Red>]</font> <font color=Red>-&gt;</font> <font color=Red>[</font>a<font color=Red>]</font> <font color=Red>-&gt;</font> <font color=Red>[</font>a<font color=Red>]</font>
<a name="(line109)"></a>trailing xs <font color=Red>=</font> reverse <font color=Cyan>.</font> dropWhile <font color=Cyan>(</font><font color=Cyan>`elem`</font>xs<font color=Cyan>)</font> <font color=Cyan>.</font> reverse
<a name="(line110)"></a>
<a name="(line111)"></a><a name="boolOpts"></a><font color=Blue>-- | Convert a list of RawOption to a BoolOptions structure.</font>
<a name="(line112)"></a>boolOpts <font color=Red>::</font> <font color=Red>[</font>RawOption<font color=Red>]</font> <font color=Red>-&gt;</font> BoolOptions
<a name="(line113)"></a>boolOpts opts <font color=Red>=</font>
<a name="(line114)"></a>  BoolOptions
<a name="(line115)"></a>    <font color=Cyan>{</font> macros	<font color=Red>=</font> not <font color=Cyan>(</font>NoMacro <font color=Cyan>`elem`</font> opts<font color=Cyan>)</font>
<a name="(line116)"></a>    <font color=Cyan>,</font> locations	<font color=Red>=</font> not <font color=Cyan>(</font>NoLine  <font color=Cyan>`elem`</font> opts<font color=Cyan>)</font>
<a name="(line117)"></a>    <font color=Cyan>,</font> pragma	<font color=Red>=</font>      Pragma  <font color=Cyan>`elem`</font> opts
<a name="(line118)"></a>    <font color=Cyan>,</font> stripEol	<font color=Red>=</font>      StripEol<font color=Cyan>`elem`</font> opts
<a name="(line119)"></a>    <font color=Cyan>,</font> stripC89	<font color=Red>=</font>      StripEol<font color=Cyan>`elem`</font> opts <font color=Cyan>||</font> Strip <font color=Cyan>`elem`</font> opts
<a name="(line120)"></a>    <font color=Cyan>,</font> lang      <font color=Red>=</font> not <font color=Cyan>(</font>Text    <font color=Cyan>`elem`</font> opts<font color=Cyan>)</font>
<a name="(line121)"></a>    <font color=Cyan>,</font> ansi	<font color=Red>=</font>      Ansi    <font color=Cyan>`elem`</font> opts
<a name="(line122)"></a>    <font color=Cyan>,</font> layout	<font color=Red>=</font>      Layout  <font color=Cyan>`elem`</font> opts
<a name="(line123)"></a>    <font color=Cyan>,</font> literate	<font color=Red>=</font>      Unlit   <font color=Cyan>`elem`</font> opts
<a name="(line124)"></a>    <font color=Cyan>,</font> warnings	<font color=Red>=</font> not <font color=Cyan>(</font>SuppressWarnings <font color=Cyan>`elem`</font> opts<font color=Cyan>)</font>
<a name="(line125)"></a>    <font color=Cyan>}</font>
<a name="(line126)"></a>
<a name="(line127)"></a><a name="parseOptions"></a><font color=Blue>-- | Parse all command-line options.</font>
<a name="(line128)"></a>parseOptions <font color=Red>::</font> <font color=Red>[</font>String<font color=Red>]</font> <font color=Red>-&gt;</font> Either String CpphsOptions
<a name="(line129)"></a>parseOptions xs <font color=Red>=</font> f <font color=Cyan>(</font>[]<font color=Cyan>,</font> []<font color=Cyan>,</font> []<font color=Cyan>)</font> xs
<a name="(line130)"></a>  <font color=Green><u>where</u></font>
<a name="(line131)"></a>    f <font color=Cyan>(</font>opts<font color=Cyan>,</font> ins<font color=Cyan>,</font> outs<font color=Cyan>)</font> <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>'-'</font><font color=Red><b>:</b></font><font color=Magenta>'O'</font><font color=Red><b>:</b></font>x<font color=Cyan>)</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> f <font color=Cyan>(</font>opts<font color=Cyan>,</font> ins<font color=Cyan>,</font> x<font color=Red><b>:</b></font>outs<font color=Cyan>)</font> xs
<a name="(line132)"></a>    f <font color=Cyan>(</font>opts<font color=Cyan>,</font> ins<font color=Cyan>,</font> outs<font color=Cyan>)</font> <font color=Cyan>(</font>x<font color=Red>@</font><font color=Cyan>(</font><font color=Magenta>'-'</font><font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> <font color=Green><u>case</u></font> rawOption x <font color=Green><u>of</u></font>
<a name="(line133)"></a>                                           Nothing <font color=Red>-&gt;</font> Left x
<a name="(line134)"></a>                                           Just a  <font color=Red>-&gt;</font> f <font color=Cyan>(</font>a<font color=Red><b>:</b></font>opts<font color=Cyan>,</font> ins<font color=Cyan>,</font> outs<font color=Cyan>)</font> xs
<a name="(line135)"></a>    f <font color=Cyan>(</font>opts<font color=Cyan>,</font> ins<font color=Cyan>,</font> outs<font color=Cyan>)</font> <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> f <font color=Cyan>(</font>opts<font color=Cyan>,</font> normalise x<font color=Red><b>:</b></font>ins<font color=Cyan>,</font> outs<font color=Cyan>)</font> xs
<a name="(line136)"></a>    f <font color=Cyan>(</font>opts<font color=Cyan>,</font> ins<font color=Cyan>,</font> outs<font color=Cyan>)</font> []     <font color=Red>=</font>
<a name="(line137)"></a>        Right CpphsOptions <font color=Cyan>{</font> infiles  <font color=Red>=</font> reverse ins
<a name="(line138)"></a>                           <font color=Cyan>,</font> outfiles <font color=Red>=</font> reverse outs
<a name="(line139)"></a>                           <font color=Cyan>,</font> defines  <font color=Red>=</font> <font color=Red>[</font> x <font color=Red>|</font> Macro x <font color=Red>&lt;-</font> reverse opts <font color=Red>]</font>
<a name="(line140)"></a>                           <font color=Cyan>,</font> includes <font color=Red>=</font> <font color=Red>[</font> x <font color=Red>|</font> Path x  <font color=Red>&lt;-</font> reverse opts <font color=Red>]</font>
<a name="(line141)"></a>                           <font color=Cyan>,</font> preInclude<font color=Red>=</font><font color=Red>[</font> x <font color=Red>|</font> PreInclude x <font color=Red>&lt;-</font> reverse opts <font color=Red>]</font>
<a name="(line142)"></a>                           <font color=Cyan>,</font> boolopts <font color=Red>=</font> boolOpts opts
<a name="(line143)"></a>                           <font color=Cyan>}</font>
<a name="(line144)"></a>    normalise <font color=Cyan>(</font><font color=Magenta>'/'</font><font color=Red><b>:</b></font><font color=Magenta>'/'</font><font color=Red><b>:</b></font>filepath<font color=Cyan>)</font> <font color=Red>=</font> normalise <font color=Cyan>(</font><font color=Magenta>'/'</font><font color=Red><b>:</b></font>filepath<font color=Cyan>)</font>
<a name="(line145)"></a>    normalise <font color=Cyan>(</font>x<font color=Red><b>:</b></font>filepath<font color=Cyan>)</font>       <font color=Red>=</font> x<font color=Red><b>:</b></font>normalise filepath
<a name="(line146)"></a>    normalise []                 <font color=Red>=</font> []
</pre>
</html>