packages feed

netlink-1.1.1.0: Scripts/GenerateNL80211.hs

module Main where

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

import Helpers

main :: IO ()
main = do
    [out] <- getArgs
    let inc = mkIncludeBlock includeFiles ++ "#include \"headers/ieee80211.h\"\n"
    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.GeNetlink.NL80211.Constants (" ++
            join (intersperse ", " $ join exports) ++
            ") where",
            ""]
    writeFile out $ unlines (prelude ++ join definitions)

outputs :: Map String Integer -> [Map String Integer] -> ([[String]], [[String]])
outputs _ e = let {-define r = selectDefines r d-}
                  enum r = selectEnum r e
              in map fst &&& map snd $
       [ mkEnum "NL80211Commands" $ enum "^NL80211_CMD_"
       , mkEnum "NL80211Attrs" $ enum "^NL80211_ATTR_([^C]|(C[^Q])|(CQ[^M])|(CQM$))|NUM_NL80211_ATTR$"
       , mkEnum "NL80211Bss" . bssenum $selectEnums "^NL80211_BSS_" e
       , mkEnum "Nl80211StaInfo" $ enum "^NL80211_STA_INFO_"
       , mkEnum "IEEE80211EID" $ enum "^WLAN_EID_"
       , mkEnum "NL80211RateInfo" $ enum "^NL80211_RATE_INFO_"
       ]

  where bssenum = getFirst . noChanWidth . noBssStatus . noBssSelect
        getFirst (x:_) = x
        getFirst [] = error "Couldn't find the bssenum enum in files"
        noChanWidth = filter (all (not . isInfixOf "CHAN_WIDTH_") . keys)
        noBssStatus = filter (all (not . isInfixOf "BSS_STATUS_") . keys)
        noBssSelect = filter (all (not . isInfixOf "BSS_SELECT_") . keys)

includeFiles :: [String]
includeFiles = [ "linux/nl80211.h" ]