packages feed

netlink-1.1.1.0: Scripts/Generate.hs

module Main where

import Control.Arrow ((&&&))
import Control.Monad (join)
import Data.List (intersperse)
import Data.Map (Map, union)
import System.Environment (getArgs)

import Helpers

main :: IO ()
main = do
    [out] <- getArgs
    let inc = mkIncludeBlock includeFiles
    defines <- getDefinitions inc
    enums <- getEnums inc
    let (exports, definitions) = outputs defines enums
        prelude = [
            "{-# OPTIONS_HADDOCK hide, prune, ignore-exports #-}",
            "{-# LANGUAGE GeneralizedNewtypeDeriving #-}",
            "module System.Linux.Netlink.Constants (" ++
            join (intersperse ", " $ join exports) ++
            ") where",
            "",
            "import Data.Bits",
            ""]
    writeFile out $ unlines (prelude ++ join definitions)

outputs :: Map String Integer -> [Map String Integer] -> ([[String]], [[String]])
outputs d e = let define r = selectDefines r d
                  enum r = selectEnum r e
              in map fst &&& map snd $
    [mkEnum "AddressFamily" $ define "^AF_",
     mkEnum "MessageType" $
       union (define "^NLMSG_(?!ALIGNTO)") (enum "^RTM_"),
     mkFlag "MessageFlags"  $ define "^NLM_F_",
     mkEnum "LinkType"      $ define "^ARPHRD_",
     mkFlag "LinkFlags"     $
       union (define "^IFF_") (enum "^IFF_"),
     mkEnum "LinkAttrType"  $ enum   "^IFLA_",
     mkFlag "AddrFlags"     $ define "^IFA_F_",
     mkEnum "Scope"         $ enum   "^RT_SCOPE_",
     mkEnum "AddrAttrType"  $ enum   "^IFA_",
     mkEnum "RouteTableId"  $ enum   "^RT_TABLE_",
     mkEnum "RouteProto"    $ define "^RTPROT_",
     mkEnum "RouteType"     $ enum   "^RTN_",
     mkFlag "RouteFlags"    $ define "^RTM_F_",
     mkEnum "RouteAttrType" $ enum   "^RTA_",
     mkEnum "NeighAttrType" $ enum   "^NDA_",
     mkFlag "NeighStateFlags" $ define   "^NUD_",
     mkEnum "NetlinkFamily" $ define   "^NETLINK_",
     mkEnum "RtNetlinkGroups" $ enum   "^RTNLGRP_"]

includeFiles :: [String]
includeFiles = [ "sys/types.h"
               , "sys/socket.h"
               , "linux/if.h"
               , "linux/if_tun.h"
               , "linux/if_arp.h"
               , "linux/if_link.h"
               , "linux/netlink.h"
               , "linux/rtnetlink.h"
               , "linux/neighbour.h"
               ]