gdritter repos s-cargot / master Data / SCargot / Rivest.hs
master

Tree @master (Download .tar.gz)

Rivest.hs @master

adeaaa4
63ca71a
 
 
 
 
 
 
 
94563a1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
63ca71a
 
 
 
 
 
 
 
 
94563a1
 
63ca71a
 
 
 
 
 
94563a1
 
 
 
 
module Data.SCargot.Rivest where

import           Data.ByteString (ByteString)
import qualified Data.ByteString as BS
import qualified Data.ByteString.Base64 as B64
import           Data.Text (Text)
import qualified Data.Text as T

pToken :: Parser ByteString
pToken = do
  x <- char (isAlpha || isTokenPunct)
  xs <- takeWhile1 (isAlpha || isDigit || isTokenPunct)

isTokenPunct :: Char -> Bool
isTokenPunct c = c `elem` "-./_:*+="

pWithLength :: Parser ByteString
pWithLength = do
  n <- takeWhile1 isDigit
  pFindType (Just (read (T.unpack n)))

pFindType :: Maybe Int -> Parser ByteString
pFindType len = do
  c <- peekChar
  case c of
    ':' -> case len of
             Just l  -> pVerbatim l
             Nothing -> fail "Verbatim encoding without length given"
    '"' -> pQuoted len
    '#' -> pHex len
    '{' -> pBase64Verbatim len
    '|' -> pBase64 len
    _   -> case len of
             Just _  -> fail "Unexpected length field"
             Nothing -> pToken

pQuoted :: Maybe Int -> Parser ByteString
pQuoted = do
  char '"'
  ss <- many1 quoteChar
  char '"'
  return ss

pHex :: Parser ByteString
pHex = do


pVerbatim :: Int -> Parser ByteString
pVerbatim = do
  char ':'
  take n

pBase64Verbatim :: Maybe Int -> Parser ByteString
pBase64Verbatim = undefined

pBase64 :: Maybe Int -> Parser ByteString
pBase64 = undefined