71 lines
1.7 KiB
Haskell
71 lines
1.7 KiB
Haskell
|
|
{-# LANGUAGE BangPatterns #-}
|
||
|
|
{-# LANGUAGE DeriveDataTypeable #-}
|
||
|
|
{-# LANGUAGE TypeFamilies #-}
|
||
|
|
{-# LANGUAGE RebindableSyntax #-}
|
||
|
|
{-# LANGUAGE NoImplicitPrelude #-}
|
||
|
|
-- |
|
||
|
|
-- Module : Basement.String.Encoding.ISO_8859_1
|
||
|
|
-- License : BSD-style
|
||
|
|
-- Maintainer : Foundation
|
||
|
|
-- Stability : experimental
|
||
|
|
-- Portability : portable
|
||
|
|
--
|
||
|
|
|
||
|
|
{-# LANGUAGE MagicHash #-}
|
||
|
|
|
||
|
|
module Basement.String.Encoding.ISO_8859_1
|
||
|
|
( ISO_8859_1(..)
|
||
|
|
, ISO_8859_1_Invalid(..)
|
||
|
|
) where
|
||
|
|
|
||
|
|
import Basement.Compat.Base
|
||
|
|
import Basement.Compat.Primitive
|
||
|
|
import Basement.Types.OffsetSize
|
||
|
|
import Basement.Numerical.Additive
|
||
|
|
import Basement.Monad
|
||
|
|
|
||
|
|
import GHC.Prim (int2Word#, ord#)
|
||
|
|
import GHC.Word
|
||
|
|
import GHC.Types
|
||
|
|
import Basement.UArray
|
||
|
|
import Basement.UArray.Mutable (MUArray)
|
||
|
|
import Basement.MutableBuilder
|
||
|
|
|
||
|
|
import Basement.String.Encoding.Encoding
|
||
|
|
|
||
|
|
-- offset of size one
|
||
|
|
aone :: Offset Word8
|
||
|
|
aone = Offset 1
|
||
|
|
|
||
|
|
data ISO_8859_1_Invalid
|
||
|
|
= NotISO_8859_1 Char
|
||
|
|
deriving (Typeable, Show, Eq)
|
||
|
|
instance Exception ISO_8859_1_Invalid
|
||
|
|
|
||
|
|
data ISO_8859_1 = ISO_8859_1
|
||
|
|
|
||
|
|
instance Encoding ISO_8859_1 where
|
||
|
|
type Unit ISO_8859_1 = Word8
|
||
|
|
type Error ISO_8859_1 = ISO_8859_1_Invalid
|
||
|
|
encodingNext _ = next
|
||
|
|
encodingWrite _ = write
|
||
|
|
|
||
|
|
next :: (Offset Word8 -> Word8)
|
||
|
|
-> Offset Word8
|
||
|
|
-> Either ISO_8859_1_Invalid (Char, Offset Word8)
|
||
|
|
next getter off = Right (toChar w, off + aone)
|
||
|
|
where
|
||
|
|
!(W8# w) = getter off
|
||
|
|
toChar :: Word8# -> Char
|
||
|
|
toChar a = C# (word8ToChar# w)
|
||
|
|
|
||
|
|
write :: (PrimMonad st, Monad st)
|
||
|
|
=> Char
|
||
|
|
-> Builder (UArray Word8) (MUArray Word8) Word8 st err ()
|
||
|
|
write c@(C# ch)
|
||
|
|
| c <= toEnum 0xFF = builderAppend (W8# x)
|
||
|
|
| otherwise = throw $ NotISO_8859_1 c
|
||
|
|
where
|
||
|
|
x :: Word8#
|
||
|
|
!x = wordToWord8# (int2Word# (ord# ch))
|