User Tools

Site Tools


codesnippets:octets

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
codesnippets:octets [2021/04/17 07:30] f2b216codesnippets:octets [2025/10/08 00:48] (current) – external edit 127.0.0.1
Line 1: Line 1:
 ====== Octets ====== ====== Octets ======
-~~DISCUSSION~~ 
  
   * type ''class'' ''Octetable''   * type ''class'' ''Octetable''
-    * with type ''Octets'' +    * with type ''Octet'', and ''Octets'' 
-    * with instances for ''Word32'', ''Char'', ''Integer'', and ''Int'' +    * with instances for ''Word32'', ''Char'', ''Utf8Char'', ''Integer'', and ''Int'' 
-  * as an example +  * example
-  * with test execution+
     * code, of module ''Octetable'':<code Haskell>     * code, of module ''Octetable'':<code Haskell>
-{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE BinaryLiterals #-}
  
 module Octetable module Octetable
     (     (
         Octetable(..),          Octetable(..), 
 +        Octet, 
         Octets,          Octets, 
         getOctets,          getOctets, 
Line 23: Line 22:
 import qualified System.IO as SysIo import qualified System.IO as SysIo
 import qualified Data.ByteString as BS import qualified Data.ByteString as BS
 +import           Data.Bits ((.|.), (.&.))
  
-type Octets [W.Word8]+type Octet = W.Word8 
 + 
 +type Octets = [Octet]
  
 getOctets :: SysIo.Handle -> IO [W.Word8] getOctets :: SysIo.Handle -> IO [W.Word8]
Line 35: Line 37:
     toOctets :: a -> Octets     toOctets :: a -> Octets
     fromOctets :: Octets -> a     fromOctets :: Octets -> a
- 
  
 instance Octetable W.Word32 where instance Octetable W.Word32 where
Line 51: Line 52:
     fromOctets lw = Chr.chr (integralFromOctets lw)     fromOctets lw = Chr.chr (integralFromOctets lw)
  
-instance Octetable [Charwhere +{-| UTF-8 character 
-    toOctets lch foldr (\ch lw8 -> (toOctets ch++ lw8) [] lch + 
-    fromOctets [] = [] +* prefix: cu8 
-    fromOctets lw fmap (Chr.chr . fromIntegrallw+* represent on UTF-8 character 
 +* keeps one, two, three or four character 
 +-} 
 +data Utf8Char =  
 +      OneByte (W.Word8) 
 +    | TwoBytes (W.Word8, W.Word8) 
 +    | ThreeBytes (W.Word8, W.Word8, W.Word8) 
 +    | FourBytes (W.Word8, W.Word8, W.Word8, W.Word8) 
 +    deriving (Show, Eq) 
 + 
 +instance Octetable Utf8Char where 
 +    toOctets (OneByte w81) = [w81
 +    toOctets (TwoBytes (w81,w82)) [w81,w82] 
 +    toOctets (ThreeBytes (w81,w82,w83)) = [w81,w82,w83] 
 +    toOctets (FourBytes (w81,w82,w83,w84)) [w81,w82,w83,w84
 +    fromOctets (w81:w82:w83:w84:_) 
 +        | (w81 .&. 0b10000000) == 0b00000000 = OneByte w81 
 +        | (w81 .&. 0b11100000) == 0b11000000 = TwoBytes (w81,w82) 
 +        | (w81 .&. 0b11110000) == 0b11100000 = ThreeBytes (w81,w82,w83) 
 +        | otherwise                          = FourBytes (w81,w82,w83,w84) 
 +    fromOctets (w81:w82:w83:[]
 +        | (w81 .&. 0b10000000) == 0b00000000 = OneByte w81 
 +        | (w81 .&. 0b11100000) == 0b11000000 = TwoBytes (w81,w82) 
 +        | otherwise                          = ThreeBytes (w81,w82,w83) 
 +    fromOctets (w81:w82:[]
 +        | (w81 .&. 0b10000000) == 0b00000000 = OneByte w81 
 +        | otherwise                          = TwoBytes (w81,w82) 
 +    fromOctets (w81:[]) = OneByte w81 
 +    fromOctets [] = (OneByte 0)
  
 instance Octetable Integer where instance Octetable Integer where
Line 80: Line 109:
     fIntegralToOctets' (n `div` 256, (fromIntegral (n `mod` 256)) : lw)     fIntegralToOctets' (n `div` 256, (fromIntegral (n `mod` 256)) : lw)
  
-keepOctetsPositive :: Octets-> Octets+keepOctetsPositive :: Octets -> Octets
 keepOctetsPositive [] = [] keepOctetsPositive [] = []
 keepOctetsPositive lw8 keepOctetsPositive lw8
Line 86: Line 115:
     | otherwise                =     lw8 -- highest bit is NOT set, hence positive -> keep as is     | otherwise                =     lw8 -- highest bit is NOT set, hence positive -> keep as is
  
-keepOctetsNegative :: Octets-> Octets+keepOctetsNegative :: Octets -> Octets
 keepOctetsNegative [] = [] keepOctetsNegative [] = []
 keepOctetsNegative lw8 keepOctetsNegative lw8
Line 96: Line 125:
     | Bts.testBit (head lw8) 7 = (negate . (+1) . integralFromOctets . (fmap Bts.complement)) lw8     | Bts.testBit (head lw8) 7 = (negate . (+1) . integralFromOctets . (fmap Bts.complement)) lw8
     | otherwise                = foldl (\n w8 -> (n * 256) + (fromIntegral w8))  0 lw8     | otherwise                = foldl (\n w8 -> (n * 256) + (fromIntegral w8))  0 lw8
-</code> 
-    * code, of module ''Main'', to get and put octets from streams:<code Haskell> 
-import qualified Octetable as Oct 
-import qualified Data.Word as W 
-import qualified System.IO as SysIo 
- 
-main :: IO () 
-main =  
-    do 
-        o1 <- Oct.getOctets SysIo.stdin 
-        Oct.putOctets SysIo.stdout o1 
-        Oct.putOctets SysIo.stdout o2 
- 
-o2 :: [W.Word8] 
-o2 = Oct.toOctets "Hallo!" 
 </code> </code>
     * code, of module ''Main'', to test fromOctets and toOctets:<code Haskell>     * code, of module ''Main'', to test fromOctets and toOctets:<code Haskell>
Line 317: Line 331:
    -2299819935653645082894452792461391785316838819634854499582649773064497657338657176722815066047012042970707985364005424194851744592589349276289737892620644753316103773332601282923749730891215409124729751179101572661546264659399035941959433049031612193674931427369793499974748103941854396793949658196683481215335075331190973321382630193047486040570710476538476805752828595396636100262237982462365668148474400831819729686520016831142034423035989126884829798702369001522511603033547628403647714677841344568950917375570064143430404597420770773439867113060747581916408770350655859231601822693794335340024703291277047383009545489812044665828872069515086161470043404212964143599392663515383545253369964683097804303493196001346972875807092655666775774755153966987089557598493216241473998446786105682286003208993649406238722161069532282900618217219492148604518557515368241354830826940556257234738134897451091801018568418762856248825737587480173029024436395984067723608292575876261695468817805283649009112581009389828573386359739601662047431757990274166003464056141974382728940618484203465938650973604530113187308736921734424683365243118100998126580691247572322148932020120247574456331416847236654458804902164954387120540919072050362384906504090722699288613319388277341509353032905698955788548406169450791248838342383275106318381042808878054409211203094805561198699897359477344778815969939545770630197346441568662820604992751625101251259774130554173720020589092927339037514717894135290456906563866080001    -2299819935653645082894452792461391785316838819634854499582649773064497657338657176722815066047012042970707985364005424194851744592589349276289737892620644753316103773332601282923749730891215409124729751179101572661546264659399035941959433049031612193674931427369793499974748103941854396793949658196683481215335075331190973321382630193047486040570710476538476805752828595396636100262237982462365668148474400831819729686520016831142034423035989126884829798702369001522511603033547628403647714677841344568950917375570064143430404597420770773439867113060747581916408770350655859231601822693794335340024703291277047383009545489812044665828872069515086161470043404212964143599392663515383545253369964683097804303493196001346972875807092655666775774755153966987089557598493216241473998446786105682286003208993649406238722161069532282900618217219492148604518557515368241354830826940556257234738134897451091801018568418762856248825737587480173029024436395984067723608292575876261695468817805283649009112581009389828573386359739601662047431757990274166003464056141974382728940618484203465938650973604530113187308736921734424683365243118100998126580691247572322148932020120247574456331416847236654458804902164954387120540919072050362384906504090722699288613319388277341509353032905698955788548406169450791248838342383275106318381042808878054409211203094805561198699897359477344778815969939545770630197346441568662820604992751625101251259774130554173720020589092927339037514717894135290456906563866080001
 </code> </code>
 +  * example, used with module FileSystem
 +    * code, of module ''Main'':<code Haskell>
 +import qualified FileSystem as FS
 +import qualified System.IO as SysIo
 +import qualified Octetable as Oct
 +import qualified Data.Char as Chr
  
 +main :: IO ()
 +main = 
 +        FS.processData
 +            (FS.DataReader (FS.FileInp ".\\test\\a.txt") (hGetNReplace  octBlank octUnderscore))
 +            [
 +                FS.DataWriter (FS.FileOut ".\\test\\b.txt") Oct.putOctets, 
 +                FS.DataWriter FS.StdOut (hReplaceNPut octUnderscore octBlank), 
 +                FS.DataWriter FS.StdErr Oct.putOctets
 +            ]
 +
 +octBlank :: Oct.Octet
 +octBlank = ((fromIntegral . Chr.ord) ' ')
 +
 +octUnderscore :: Oct.Octet
 +octUnderscore = ((fromIntegral . Chr.ord) '_')
 +
 +hGetNReplace :: Oct.Octet -> Oct.Octet -> SysIo.Handle -> IO Oct.Octets
 +hGetNReplace a b h = 
 +    do
 +        s <- Oct.getOctets h
 +        return (fmap (\x -> if x == a then b else x) s)
 +
 +hReplaceNPut :: Oct.Octet -> Oct.Octet -> SysIo.Handle -> Oct.Octets -> IO ()
 +hReplaceNPut a b h s = Oct.putOctets h (fmap (\x -> if x == a then b else x) s)
 +</code>
 +    * compiles, error and warning free, with compiler: GHC 8.10.4, using compiler option -Wall
 +    * input, file "a.txt":<code>
 +The quick brown fox jumps over the lazy dog.
 +</code>
 +    * executes, with output, first line stdout, second line stderr:<code>
 +The quick brown fox jumps over the lazy dog.
 +The_quick_brown_fox_jumps_over_the_lazy_dog.
 +</code>
 +    * executes, with output file "b.txt":<code>
 +The_quick_brown_fox_jumps_over_the_lazy_dog.
 +</code>
 +
 +
 +===== ✎ =====
 +~~DISCUSSION~~
codesnippets/octets.1618637448.txt.gz · Last modified: (external edit)

Except where otherwise noted, content on this wiki is licensed under the following license: CC0 1.0 Universal
CC0 1.0 Universal Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki