# Copyright 2022 Mattia Giambirtone & All Contributors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. ## Utilities to handle multibyte sequences proc toDouble*(input: int | uint | uint16): array[2, uint8] = ## Converts an unsigned integer ## to an array[2, uint8] result = cast[array[2, uint8]](uint16(input)) proc toTriple*(input: uint | int): array[3, uint8] = ## Converts an unsigned integer to an array[3, uint8] result = cast[array[3, uint8]](uint(input)) proc toQuad*(input: int | uint | uint16 | uint32): array[4, uint8] = ## Converts an unsigned integer to an array[4, uint8] result = cast[array[4, uint8]](uint(input)) proc toLong*(input: int | uint | uint16 | uint32 | uint64): array[8, uint8] = ## Converts an unsigned integer to an array[8, uint8] result = cast[array[8, uint8]](uint(input)) proc fromDouble*(input: array[2, uint8]): uint16 = ## Rebuilds the output of toDouble into ## an uint16 copyMem(result.addr, unsafeAddr(input), sizeof(uint16)) proc fromTriple*(input: array[3, uint8]): uint = ## Rebuilds the output of toTriple into ## an uint copyMem(result.addr, unsafeAddr(input), sizeof(uint8) * 3) proc fromQuad*(input: array[4, uint8]): uint = ## Rebuilts the output of toQuad into ## an uint copyMem(result.addr, unsafeAddr(input), sizeof(uint32)) proc fromLong*(input: array[8, uint8]): uint = ## Rebuilts the output of toQuad into ## an uint copyMem(result.addr, unsafeAddr(input), sizeof(uint64)) proc toBytes*(s: string): seq[byte] = ## Converts a string into a sequence ## of bytes for c in s: result.add(byte(c)) proc toBytes*(s: int): array[8, uint8] = ## Converts result = cast[array[8, uint8]](s) proc fromBytes*(input: seq[byte]): string = ## Converts a sequence of bytes to ## a string for b in input: result.add(char(b)) proc extend*[T](s: var seq[T], a: openarray[T]) = ## Extends s with the elements of a for e in a: s.add(e)