diff --git a/CHANGELOG.md b/CHANGELOG.md index 258dc3f..933556a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Revision history for based -## 0.1.0.0 -- YYYY-mm-dd +## 0.1.0.0 -- 2022-05-17 * First version. Released on an unsuspecting world. + +## 0.2.0.0 -- 2022-05-19 + +* Added the following based and encodings + * Decimal to hex + * Hex to decmial + * Xxencoding + * UuEncoding + * YEncoding + * Quoted-Printable diff --git a/Main.hs b/Main.hs index 7260233..6d0b4a0 100644 --- a/Main.hs +++ b/Main.hs @@ -4,6 +4,12 @@ module Main where import System.Console.CmdArgs import Control.Arrow +import Numeric (showHex, showIntAtBase) +import Data.Char (intToDigit) +import Data.Char (ord, chr) +import TextShow (toText) +import Text.XML.HXT.DOM.Util (stringToHexString, hexStringToInt, intToHexString, charToHexString, decimalStringToInt) +import TextShow.Data.Integral (showbBin, showbHex) import qualified Data.Either.Unwrap as U import qualified Codec.Binary.Base91 as B91 import qualified Codec.Binary.Base85 as B85 @@ -11,6 +17,10 @@ import qualified Codec.Binary.Base64 as B64 import qualified Data.Word.Base62 as B62 import qualified Codec.Binary.Base32 as B32 import qualified Codec.Binary.Base16 as B16 +import qualified Codec.Binary.QuotedPrintable as QP +import qualified Codec.Binary.Uu as UU +import qualified Codec.Binary.Xx as XX +import qualified Codec.Binary.Yenc as Y import qualified Data.Bytes as Bytes import qualified Data.Bytes.Text.Ascii as ASCII import Data.ByteString.UTF8 as BSU -- from utf8-string @@ -21,16 +31,28 @@ data Based = Decode { b85 :: Bool, b64 :: Bool, b62 :: Bool, + b58 :: Bool, b32 :: Bool, - b16 :: Bool + b16 :: Bool, + b10 :: Bool, + qp :: Bool, + uu :: Bool, + xx :: Bool, + yenc :: Bool } | Encode { b91 :: Bool, b85 :: Bool, b64 :: Bool, b62 :: Bool, + b58 :: Bool, b32 :: Bool, - b16 :: Bool + b16 :: Bool, + b10 :: Bool, + qp :: Bool, + uu :: Bool, + xx :: Bool, + yenc :: Bool } deriving(Show, Data, Typeable) @@ -43,11 +65,23 @@ dec64 = C.unpack . U.fromRight . B64.decode . BSU.fromString enc64 = C.unpack . B64.encode . BSU.fromString dec62 = show . B62.decode64 . ASCII.fromString enc62 = show . B62.decode64 . ASCII.fromString +dec58 = show +enc58 = show dec32 = C.unpack . U.fromRight . B32.decode . BSU.fromString enc32 = C.unpack . B32.encode . BSU.fromString dec16 = C.unpack . U.fromRight . B16.decode . BSU.fromString enc16 = C.unpack . B16.encode . BSU.fromString - +dec10 = show . hexStringToInt +enc10 = C.unpack . BSU.fromString . intToHexString . decimalStringToInt -- Depending on what you want, do enc10 = show . map ord +decqp = C.unpack . U.fromRight . QP.decode . BSU.fromString +encqp = C.unpack . QP.encode . BSU.fromString +decuu = C.unpack . U.fromRight . UU.decode . BSU.fromString +encuu = C.unpack . UU.encode . BSU.fromString +decxx = C.unpack . U.fromRight . XX.decode . BSU.fromString +encxx = C.unpack . XX.encode . BSU.fromString +decy = C.unpack . U.fromRight . Y.decode . BSU.fromString +ency = C.unpack . Y.encode . BSU.fromString + optionHandler Decode{b91=True} = dec91 optionHandler Encode{b91=True} = enc91 @@ -57,18 +91,36 @@ optionHandler Decode{b64=True} = dec64 optionHandler Encode{b64=True} = enc64 optionHandler Decode{b62=True} = dec62 optionHandler Encode{b62=True} = enc62 +optionHandler Decode{b58=True} = dec58 +optionHandler Encode{b58=True} = enc58 optionHandler Decode{b32=True} = dec32 optionHandler Encode{b32=True} = enc32 optionHandler Decode{b16=True} = dec16 optionHandler Encode{b16=True} = enc16 +optionHandler Decode{b10=True} = dec10 +optionHandler Encode{b10=True} = enc10 +optionHandler Decode{qp=True} = decqp +optionHandler Encode{qp=True} = encqp +optionHandler Encode{uu=True} = decuu +optionHandler Decode{uu=True} = encuu +optionHandler Decode{xx=True} = decxx +optionHandler Encode{xx=True} = encxx +optionHandler Decode{yenc=True} = decy +optionHandler Encode{yenc=True} = ency decode_ = Decode { b91 = def &= help "decode base91", b85 = def &= help "decode base85", b64 = def &= help "decode base64", b62 = def &= help "decode base62", + b58 = def &= help "decode base58", b32 = def &= help "decode base32", - b16 = def &= help "decode base16" + b16 = def &= help "decode base16", + b10 = def &= help "decode base10 to hex", + qp = def &= help "decode quoted-printable", + uu = def &= help "decode uu", + xx = def &= help "decode xx", + yenc = def &= help "decode yEncode" } &= help "Decode chosen base" &=auto encode_ = Encode { @@ -76,8 +128,14 @@ encode_ = Encode { b85 = def &= help "encode base85", b64 = def &= help "encode base64", b62 = def &= help "encode base62", + b58 = def &= help "encode base58", b32 = def &= help "encode base32", - b16 = def &= help "encode base16" + b16 = def &= help "encode base16", + b10 = def &= help "encode base10 to hex", + qp = def &= help "encode quoted-printable", + uu = def &= help "encode uu", + xx = def &= help "encode xx", + yenc = def &= help "encode yEncode" } &= help "Encode chosen base" -main = cmdArgs (modes[decode_, encode_] &= help "Anybased, when Cyberchef simply doesn't cut it. " &= program "based" &= summary "Based v0.1") >>= interact . optionHandler +main = cmdArgs (modes[decode_, encode_] &= help "Anybased, when Cyberchef simply doesn't cut it. " &= program "based" &= summary "based v0.1") >>= interact . optionHandler diff --git a/README.md b/README.md index 7692b70..7658362 100644 --- a/README.md +++ b/README.md @@ -4,13 +4,14 @@ A commandline tool that lets you encode and decode most of the bases. Release binary is statically linked via ```sh -cabal v2-build --enable-executable-static +cabal v2-build --enable-executable-static -O2 ``` ## Compilation * If you want to compile your own build, link it dynamically via ```sh +git clone https://git.stefan.works/whx/based.git cd based/ cabal install cabal run diff --git a/based.cabal b/based.cabal index 085b0ac..097a580 100644 --- a/based.cabal +++ b/based.cabal @@ -27,6 +27,6 @@ executable based main-is: Main.hs other-modules: MyLib -- other-extensions: - build-depends: base ^>=4.13.0.0, based, cmdargs, sandi, base62, base91, utf8-string, bytestring, byteslice, either-unwrap + build-depends: base ^>=4.13.0.0, based, cmdargs, sandi, base62, base91, utf8-string, bytestring, byteslice, either-unwrap, text-show, hxt -- hs-source-dirs: default-language: Haskell2010