~sircmpwn/hare-dev

This thread contains a patchset. You're looking at the original emails, but you may wish to use the patch review UI. Review patch
5 4

[PATCH hare v2] replace copyright headers with license headers

Details
Message ID
<20230915013313.9935-1-ecs@d2evs.net>
DKIM signature
missing
Download raw message
Patch: +533 -996
and get rid of contributors.sh. also enforce that license headers are
added in the correct format in ci

Signed-off-by: Ember Sawady <ecs@d2evs.net>
---
v2: add license headers, drop contributors.sh, add copyright.sh + ci
glue. successful build since this makes changes to the ci:
https://builds.sr.ht/~ecs/job/1057882

everything in cmd/ uses gpl, and everything in the stdlib uses mpl with
the exception of a few files in crypto/blowfish which are mit from go
stdlib and hare/parse/doc which is still gpl pending approval to
relicense from yyp and handlerug
 .builds/alpine.yml                   |  3 ++
 ascii/ctype.ha                       |  2 --
 ascii/string.ha                      |  3 +-
 ascii/valid.ha                       |  3 +-
 bufio/scanner.ha                     |  4 +--
 bufio/scanner_test+test.ha           |  2 ++
 bufio/stream.ha                      |  5 +--
 bufio/stream_test+test.ha            |  2 ++
 bytes/contains.ha                    |  3 --
 bytes/equal.ha                       |  1 -
 bytes/index.ha                       |  3 --
 bytes/reverse.ha                     |  1 -
 bytes/tokenize.ha                    |  4 +--
 bytes/trim.ha                        |  2 ++
 bytes/two_way.ha                     |  2 +-
 bytes/zero.ha                        |  2 +-
 cmd/hare/arch.ha                     |  2 ++
 cmd/hare/build.ha                    |  2 ++
 cmd/hare/build/gather.ha             |  2 ++
 cmd/hare/build/queue.ha              |  2 ++
 cmd/hare/build/types.ha              |  2 ++
 cmd/hare/build/util.ha               |  2 ++
 cmd/hare/cache.ha                    |  2 ++
 cmd/hare/deps.ha                     |  2 ++
 cmd/hare/error.ha                    |  2 ++
 cmd/hare/main.ha                     |  3 +-
 cmd/hare/util.ha                     |  2 ++
 cmd/hare/version.ha                  |  2 ++
 cmd/harec/context.ha                 |  3 +-
 cmd/harec/errors.ha                  |  3 +-
 cmd/harec/gen.ha                     |  4 +--
 cmd/harec/genutil.ha                 |  2 +-
 cmd/harec/main.ha                    |  4 +--
 cmd/harec/qbe.ha                     |  3 +-
 cmd/harec/qtype.ha                   |  3 +-
 cmd/haredoc/arch.ha                  |  2 ++
 cmd/haredoc/doc/color.ha             |  2 +-
 cmd/haredoc/doc/hare.ha              |  4 +--
 cmd/haredoc/doc/html.ha              |  6 ----
 cmd/haredoc/doc/resolve.ha           |  4 +--
 cmd/haredoc/doc/sort.ha              |  3 +-
 cmd/haredoc/doc/tty.ha               |  4 +--
 cmd/haredoc/doc/types.ha             |  3 +-
 cmd/haredoc/doc/util.ha              |  3 +-
 cmd/haredoc/error.ha                 |  2 ++
 cmd/haredoc/main.ha                  |  5 +--
 cmd/haredoc/util.ha                  |  2 ++
 cmd/haretype/main.ha                 |  2 +-
 cmd/ioctlgen/main.ha                 |  2 ++
 contrib/contributors.sh              | 48 ----------------------------
 crypto/+test/authenc_test.ha         |  2 +-
 crypto/aes/+test/gcm.ha              |  2 ++
 crypto/aes/+test/ni_test+x86_64.ha   |  2 ++
 crypto/aes/+x86_64/ni.ha             |  2 ++
 crypto/aes/aes+x86_64.ha             |  2 +-
 crypto/aes/aes.ha                    |  2 +-
 crypto/aes/aes_ct64.ha               |  2 --
 crypto/aes/block.ha                  |  2 +-
 crypto/aes/cbc+test.ha               |  3 +-
 crypto/aes/ct64+test.ha              |  3 +-
 crypto/aes/ctr+test.ha               |  3 +-
 crypto/aes/rt+test.ha                |  3 +-
 crypto/aes/xts/+test.ha              |  2 +-
 crypto/aes/xts/xts.ha                |  2 +-
 crypto/argon2/+test.ha               |  3 +-
 crypto/argon2/argon2.ha              |  2 ++
 crypto/authenc.ha                    |  3 +-
 crypto/bcrypt/+test.ha               |  2 ++
 crypto/bcrypt/base64.ha              |  4 +--
 crypto/bcrypt/bcrypt.ha              |  4 +--
 crypto/bigint/+test/arithm_test.ha   |  2 ++
 crypto/bigint/+test/encoding_test.ha |  2 ++
 crypto/bigint/+test/monty_test.ha    |  1 +
 crypto/bigint/+test/utils.ha         |  2 ++
 crypto/bigint/arithm.ha              |  2 ++
 crypto/bigint/encoding.ha            |  2 ++
 crypto/bigint/monty.ha               |  2 ++
 crypto/bigint/types.ha               |  2 ++
 crypto/bigint/util.ha                |  2 ++
 crypto/blake2b/+test.ha              |  5 +--
 crypto/blake2b/blake2b.ha            |  4 +--
 crypto/blake2b/vectors+test.ha       |  1 -
 crypto/blowfish/+test.ha             |  2 ++
 crypto/blowfish/blowfish.ha          |  3 +-
 crypto/blowfish/const.ha             |  2 --
 crypto/chacha/+test.ha               |  2 +-
 crypto/chacha/chacha20.ha            |  2 +-
 crypto/chachapoly/chachapoly.ha      |  2 +-
 crypto/chachapoly/encryption+test.ha |  2 +-
 crypto/cipher/block.ha               |  2 --
 crypto/cipher/cbc.ha                 |  3 +-
 crypto/cipher/cipher.ha              |  1 -
 crypto/cipher/ctr.ha                 |  3 +-
 crypto/cipher/gcm.ha                 |  2 +-
 crypto/cipher/ghash.ha               |  2 ++
 crypto/cipher/stream.ha              |  2 +-
 crypto/curve25519/+test.ha           |  2 +-
 crypto/curve25519/curve25519.ha      |  2 +-
 crypto/ed25519/+test.ha              |  2 +-
 crypto/ed25519/ed25519.ha            |  1 -
 crypto/ed25519/edwards25519.ha       |  1 -
 crypto/hkdf/+test.ha                 |  2 +-
 crypto/hkdf/hkdf.ha                  |  2 +-
 crypto/hmac/+test.ha                 |  2 +-
 crypto/hmac/hmac.ha                  |  3 +-
 crypto/hmac/sha1.ha                  |  2 +-
 crypto/hmac/sha256.ha                |  2 +-
 crypto/keyderiv.ha                   |  2 +-
 crypto/keystore/impl+linux.ha        |  2 ++
 crypto/keystore/impl.ha              |  2 ++
 crypto/mac/mac.ha                    |  2 +-
 crypto/math/arithm.ha                |  3 +-
 crypto/math/bits.ha                  |  3 --
 crypto/poly1305/+test.ha             |  2 +-
 crypto/poly1305/poly1305.ha          |  1 -
 crypto/random/+freebsd.ha            |  3 +-
 crypto/random/+linux.ha              |  3 +-
 crypto/random/random.ha              |  3 +-
 crypto/rsa/+test/core_test.ha        |  2 +-
 crypto/rsa/+test/keys_test.ha        |  2 +-
 crypto/rsa/+test/pkcs1_test.ha       |  2 +-
 crypto/rsa/core.ha                   |  2 ++
 crypto/rsa/errors.ha                 |  2 +-
 crypto/rsa/keys.ha                   |  2 +-
 crypto/rsa/pkcs1.ha                  |  2 +-
 crypto/salsa/+test.ha                |  2 +-
 crypto/salsa/salsa20.ha              |  2 +-
 crypto/sha1/+test.ha                 |  4 +--
 crypto/sha1/sha1.ha                  |  5 +--
 crypto/sha256/+test.ha               |  4 +--
 crypto/sha256/sha256.ha              |  4 +--
 crypto/sha512/+test.ha               |  4 +--
 crypto/sha512/sha512.ha              |  6 +---
 crypto/x25519/+test.ha               |  2 +-
 crypto/x25519/x25519.ha              |  2 +-
 dirs/xdg.ha                          |  6 +---
 encoding/base32/base32.ha            |  2 +-
 encoding/base64/base64.ha            |  7 +---
 encoding/hex/hex.ha                  |  5 +--
 encoding/pem/+test.ha                |  2 +-
 encoding/pem/pem.ha                  |  2 +-
 encoding/utf8/decode.ha              |  3 --
 encoding/utf8/decodetable.ha         |  2 ++
 encoding/utf8/encode.ha              |  1 -
 encoding/utf8/rune.ha                |  1 -
 endian/big.ha                        |  2 --
 endian/endian.ha                     |  2 --
 endian/host+aarch64.ha               |  1 -
 endian/host+riscv64.ha               |  1 -
 endian/host+x86_64.ha                |  1 -
 endian/little.ha                     |  2 --
 endian/network.ha                    |  1 -
 errors/common.ha                     |  3 --
 errors/opaque.ha                     |  2 --
 errors/rt.ha                         |  2 +-
 errors/string.ha                     |  2 --
 fmt/fmt.ha                           |  7 +---
 fnmatch/+test.ha                     |  1 -
 fnmatch/fnmatch.ha                   |  7 +---
 format/elf/arch+aarch64.ha           |  1 -
 format/elf/arch+riscv64.ha           |  1 -
 format/elf/arch+x86_64.ha            |  1 -
 format/elf/platform+freebsd.ha       |  1 -
 format/elf/platform+linux.ha         |  1 -
 format/elf/types.ha                  |  3 --
 format/ini/+test.ha                  |  2 +-
 format/ini/scan.ha                   |  5 +--
 format/ini/types.ha                  |  4 +--
 format/tar/reader.ha                 |  2 +-
 format/tar/types.ha                  |  2 +-
 fs/fs.ha                             |  8 +----
 fs/types.ha                          |  5 +--
 fs/util.ha                           |  5 +--
 getopt/getopts.ha                    |  7 +---
 glob/+test.ha                        |  2 ++
 glob/glob.ha                         |  2 +-
 hare/ast/decl.ha                     |  3 +-
 hare/ast/expr.ha                     |  4 +--
 hare/ast/ident.ha                    |  4 +--
 hare/ast/import.ha                   |  3 +-
 hare/ast/type.ha                     |  4 +--
 hare/ast/unit.ha                     |  2 --
 hare/lex/+test.ha                    |  7 +---
 hare/lex/lex.ha                      |  7 +---
 hare/lex/token.ha                    |  4 +--
 hare/module/cache.ha                 |  2 ++
 hare/module/deps.ha                  |  2 ++
 hare/module/format.ha                |  2 ++
 hare/module/srcs.ha                  |  2 ++
 hare/module/types.ha                 |  2 ++
 hare/module/util.ha                  |  2 ++
 hare/parse/+test/expr_test.ha        |  5 ---
 hare/parse/+test/ident_test.ha       |  3 +-
 hare/parse/+test/loc.ha              |  4 +--
 hare/parse/+test/roundtrip.ha        |  5 +--
 hare/parse/+test/types.ha            |  1 -
 hare/parse/+test/unit_test.ha        |  6 +---
 hare/parse/decl.ha                   |  3 +-
 hare/parse/doc/doc.ha                |  6 +---
 hare/parse/expr.ha                   |  6 +---
 hare/parse/ident.ha                  |  4 +--
 hare/parse/import.ha                 |  3 +-
 hare/parse/parse.ha                  |  5 +--
 hare/parse/type.ha                   |  4 +--
 hare/parse/unit.ha                   |  3 +-
 hare/types/+aarch64/writesize.ha     |  2 ++
 hare/types/+riscv64/writesize.ha     |  2 ++
 hare/types/+test.ha                  |  6 +---
 hare/types/+x86_64/writesize.ha      |  2 ++
 hare/types/arch.ha                   |  1 -
 hare/types/builtins.ha               |  1 -
 hare/types/class.ha                  |  2 --
 hare/types/hash.ha                   |  3 +-
 hare/types/lookup.ha                 |  3 +-
 hare/types/store.ha                  |  4 +--
 hare/types/types.ha                  |  4 +--
 hare/unit/+test.ha                   |  3 +-
 hare/unit/check.ha                   |  3 +-
 hare/unit/context.ha                 |  2 +-
 hare/unit/errors.ha                  |  2 +-
 hare/unit/expr.ha                    |  2 +-
 hare/unit/process.ha                 |  6 +---
 hare/unit/scan.ha                    |  4 +--
 hare/unit/scope.ha                   |  3 +-
 hare/unit/unit.ha                    |  2 +-
 hare/unparse/decl.ha                 |  5 +--
 hare/unparse/expr.ha                 |  5 +--
 hare/unparse/ident.ha                |  4 +--
 hare/unparse/import.ha               |  4 +--
 hare/unparse/type.ha                 |  4 +--
 hare/unparse/unit.ha                 |  3 +-
 hare/unparse/util.ha                 |  3 +-
 hash/adler32/adler32.ha              |  4 +--
 hash/crc16/crc16.ha                  |  4 +--
 hash/crc32/crc32.ha                  |  4 +--
 hash/crc64/crc64.ha                  |  4 +--
 hash/fnv/+aarch64.ha                 |  2 --
 hash/fnv/+riscv64.ha                 |  2 --
 hash/fnv/+x86_64.ha                  |  2 --
 hash/fnv/fnv.ha                      |  3 +-
 hash/hash.ha                         |  4 +--
 hash/siphash/+test.ha                |  2 ++
 hash/siphash/siphash.ha              |  2 ++
 io/+freebsd/mmap.ha                  |  3 +-
 io/+freebsd/platform_file.ha         |  3 +-
 io/+freebsd/vector.ha                |  2 +-
 io/+linux/mmap.ha                    |  3 +-
 io/+linux/platform_file.ha           |  4 +--
 io/+linux/vector.ha                  |  2 +-
 io/+test/limit_test.ha               |  4 +--
 io/+test/stream_test.ha              |  2 --
 io/arch+aarch64.ha                   |  1 -
 io/arch+riscv64.ha                   |  1 -
 io/arch+x86_64.ha                    |  1 -
 io/copy.ha                           |  3 +-
 io/drain.ha                          |  3 --
 io/empty.ha                          |  2 --
 io/file.ha                           |  1 +
 io/handle.ha                         |  2 --
 io/limit.ha                          |  3 --
 io/stream.ha                         |  4 +--
 io/tee.ha                            |  2 --
 io/types.ha                          |  3 +-
 io/util.ha                           |  3 --
 io/zero.ha                           |  3 +-
 linux/env.ha                         |  2 +-
 linux/keyctl/keyctl.ha               |  2 ++
 linux/keyctl/types.ha                |  2 ++
 linux/start+libc.ha                  |  2 +-
 linux/start.ha                       |  2 +-
 linux/timerfd/timerfd.ha             |  1 -
 linux/vdso/vdso.ha                   |  4 +--
 log/funcs.ha                         |  2 ++
 log/global.ha                        |  2 ++
 log/logger.ha                        |  2 ++
 log/silent.ha                        |  2 ++
 math/+test/data.ha                   |  2 --
 math/+test/floats_test.ha            |  2 ++
 math/+test/math_test.ha              |  2 ++
 math/+test/trig_test.ha              |  2 ++
 math/checked/checked.ha              |  2 ++
 math/complex/+test.ha                |  2 --
 math/complex/complex.ha              |  2 --
 math/fenv+aarch64.ha                 |  1 -
 math/fenv+riscv64.ha                 |  2 --
 math/fenv+x86_64.ha                  |  1 -
 math/fenv_func.ha                    |  2 +-
 math/floats.ha                       |  6 +---
 math/ints.ha                         |  5 +--
 math/math.ha                         |  3 --
 math/random/random.ha                |  1 -
 math/trig.ha                         |  1 -
 math/uints.ha                        |  1 -
 memio/ops.ha                         |  4 +--
 memio/stream.ha                      |  5 +--
 mime/database.ha                     |  2 +-
 mime/lookup.ha                       |  2 +-
 mime/parse.ha                        |  2 +-
 mime/system.ha                       |  2 +-
 net/+freebsd.ha                      |  4 +--
 net/+linux.ha                        |  4 +--
 net/dial/dial.ha                     |  2 +-
 net/dial/ip.ha                       |  3 --
 net/dial/registry.ha                 |  3 +-
 net/dial/resolve.ha                  |  3 +-
 net/dns/decode.ha                    |  3 +-
 net/dns/encode.ha                    |  2 +-
 net/dns/error.ha                     |  3 +-
 net/dns/query.ha                     |  2 +-
 net/dns/strdomain.ha                 |  2 +-
 net/dns/types.ha                     |  5 +--
 net/errors.ha                        |  4 +--
 net/ip/+freebsd.ha                   |  3 +-
 net/ip/+linux.ha                     |  4 +--
 net/ip/ip.ha                         |  9 +-----
 net/ip/test+test.ha                  |  6 +---
 net/msg.ha                           |  1 -
 net/tcp/+freebsd.ha                  |  3 +-
 net/tcp/+linux.ha                    |  3 +-
 net/tcp/listener.ha                  |  2 +-
 net/tcp/options.ha                   |  2 +-
 net/types.ha                         |  2 ++
 net/udp/+freebsd.ha                  |  3 +-
 net/udp/+linux.ha                    |  3 +-
 net/udp/options.ha                   |  2 +-
 net/unix/+freebsd.ha                 |  3 +-
 net/unix/+linux.ha                   |  4 +--
 net/unix/addr.ha                     |  2 --
 net/unix/cmsg.ha                     |  2 +-
 net/unix/dial.ha                     |  3 +-
 net/unix/listener.ha                 |  2 +-
 net/unix/options.ha                  |  2 +-
 net/unix/socketpair.ha               |  3 +-
 net/uri/+test.ha                     |  2 ++
 net/uri/fmt.ha                       |  2 ++
 net/uri/parse.ha                     |  3 +-
 net/uri/query.ha                     |  2 ++
 net/uri/uri.ha                       |  2 ++
 os/+freebsd/dirfdfs.ha               |  4 +--
 os/+freebsd/exit+libc-test.ha        |  2 ++
 os/+freebsd/exit+test.ha             |  1 -
 os/+freebsd/exit.ha                  |  2 +-
 os/+freebsd/fs.ha                    |  3 +-
 os/+freebsd/platform_environ.ha      |  3 +-
 os/+freebsd/status.ha                |  2 ++
 os/+freebsd/stdfd.ha                 |  3 +-
 os/+linux/dirfdfs.ha                 |  6 +---
 os/+linux/exit+libc-test.ha          |  2 ++
 os/+linux/exit+test.ha               |  1 -
 os/+linux/exit.ha                    |  2 +-
 os/+linux/fs.ha                      |  3 +-
 os/+linux/memory.ha                  |  2 ++
 os/+linux/platform_environ.ha        |  3 +-
 os/+linux/status.ha                  |  2 ++
 os/+linux/stdfd.ha                   |  3 +-
 os/environ.ha                        |  2 ++
 os/exec/cmd.ha                       |  4 +--
 os/exec/exec+freebsd.ha              |  3 +-
 os/exec/exec+linux.ha                |  3 +-
 os/exec/process+freebsd.ha           |  4 +--
 os/exec/process+linux.ha             |  4 +--
 os/exec/types.ha                     |  3 +-
 os/os.ha                             |  5 +--
 path/+freebsd.ha                     |  1 -
 path/+linux.ha                       |  1 -
 path/buffer.ha                       |  3 +-
 path/error.ha                        |  2 ++
 path/ext_stack.ha                    |  1 +
 path/iter.ha                         |  4 +--
 path/posix.ha                        |  4 +--
 path/prefix.ha                       |  2 ++
 path/stack.ha                        |  2 +-
 regex/+test.ha                       |  2 +-
 regex/regex.ha                       |  2 +-
 rt/+aarch64/arch_jmp.ha              |  1 -
 rt/+aarch64/backtrace.ha             |  3 --
 rt/+aarch64/cpuid.ha                 |  2 ++
 rt/+freebsd/+aarch64.ha              |  2 ++
 rt/+freebsd/+riscv64.ha              |  2 ++
 rt/+freebsd/+x86_64.ha               |  2 ++
 rt/+freebsd/env.ha                   |  1 -
 rt/+freebsd/errno.ha                 |  1 -
 rt/+freebsd/platform_abort.ha        |  1 -
 rt/+freebsd/platformstart.ha         |  1 -
 rt/+freebsd/segmalloc.ha             |  2 --
 rt/+freebsd/signal.ha                |  1 -
 rt/+freebsd/socket.ha                |  2 --
 rt/+freebsd/syscallno.ha             |  1 -
 rt/+freebsd/syscalls.ha              |  3 --
 rt/+freebsd/types.ha                 |  4 ---
 rt/+linux/+aarch64.ha                |  3 --
 rt/+linux/+riscv64.ha                |  3 --
 rt/+linux/+x86_64.ha                 |  2 --
 rt/+linux/env.ha                     |  1 -
 rt/+linux/errno.ha                   |  2 --
 rt/+linux/platform_abort.ha          |  1 -
 rt/+linux/platformstart-libc.ha      |  2 --
 rt/+linux/prctl.ha                   |  1 -
 rt/+linux/segmalloc.ha               |  2 --
 rt/+linux/signal.ha                  |  1 -
 rt/+linux/socket.ha                  |  2 --
 rt/+linux/stat.ha                    |  1 -
 rt/+linux/syscallno+aarch64.ha       |  1 -
 rt/+linux/syscallno+riscv64.ha       |  1 -
 rt/+linux/syscallno+x86_64.ha        |  1 -
 rt/+linux/syscalls.ha                |  6 ----
 rt/+linux/types.ha                   |  8 -----
 rt/+riscv64/arch_jmp.ha              |  1 -
 rt/+riscv64/backtrace.ha             |  2 --
 rt/+riscv64/cpuid.ha                 |  2 ++
 rt/+riscv64/fenv.s                   |  3 --
 rt/+test/signal_test.ha              |  1 -
 rt/+x86_64/arch_jmp.ha               |  1 -
 rt/+x86_64/backtrace.ha              |  3 --
 rt/+x86_64/cpuid.ha                  |  2 ++
 rt/abort+test.ha                     |  2 --
 rt/abort.ha                          |  1 -
 rt/ensure.ha                         |  2 --
 rt/fenv_defs.ha                      |  1 -
 rt/jmp.ha                            |  1 -
 rt/malloc+debug.ha                   |  1 -
 rt/malloc+libc.ha                    |  1 -
 rt/malloc.ha                         |  2 ++
 rt/memcpy.ha                         |  1 -
 rt/memmove.ha                        |  1 -
 rt/memset.ha                         |  1 -
 rt/start+libc.ha                     |  1 -
 rt/start+test+libc.ha                |  1 -
 rt/start+test.ha                     |  1 -
 rt/start.ha                          |  2 --
 rt/strcmp.ha                         |  1 -
 rt/u64tos.ha                         |  2 ++
 rt/unknown_errno.ha                  |  2 ++
 scripts/copyright.sh                 | 30 +++++++++++++++++
 shlex/+test.ha                       |  3 +-
 shlex/escape.ha                      |  3 +-
 shlex/split.ha                       |  3 +-
 sort/+test.ha                        |  2 --
 sort/bisect.ha                       |  1 -
 sort/cmp/cmp.ha                      |  2 ++
 sort/search.ha                       |  1 -
 sort/sort.ha                         |  2 --
 sort/types.ha                        |  1 -
 strconv/+test/stoi_test.ha           |  5 +--
 strconv/+test/stou_test.ha           |  3 --
 strconv/ftos.ha                      |  6 ----
 strconv/ftostof+test.ha              |  2 ++
 strconv/itos.ha                      |  4 +--
 strconv/numeric.ha                   |  3 +-
 strconv/stof.ha                      |  3 --
 strconv/stof_data.ha                 |  1 -
 strconv/stoi.ha                      |  5 +--
 strconv/stou.ha                      |  4 +--
 strconv/types.ha                     |  3 --
 strconv/utos.ha                      |  4 +--
 strings/compare.ha                   |  2 ++
 strings/concat.ha                    |  1 -
 strings/contains.ha                  |  4 +--
 strings/dup.ha                       |  5 +--
 strings/index.ha                     |  4 +--
 strings/iter.ha                      |  6 +---
 strings/pad.ha                       |  2 +-
 strings/replace.ha                   |  2 --
 strings/runes.ha                     |  2 +-
 strings/sub.ha                       |  5 +--
 strings/suffix.ha                    |  4 +--
 strings/template/template.ha         |  2 +-
 strings/tokenize.ha                  |  5 +--
 strings/trim.ha                      |  5 +--
 strings/utf8.ha                      |  2 +-
 temp/+freebsd.ha                     |  5 +--
 temp/+linux.ha                       |  5 +--
 test/+test.ha                        |  2 ++
 test/common.ha                       |  2 ++
 test/fail+test.ha                    |  2 ++
 time/+freebsd/functions.ha           |  3 +-
 time/+linux/+aarch64.ha              |  1 -
 time/+linux/+riscv64.ha              |  1 -
 time/+linux/+x86_64.ha               |  1 -
 time/+linux/functions.ha             |  4 +--
 time/arithm.ha                       |  3 +-
 time/chrono/+freebsd.ha              |  1 -
 time/chrono/+linux.ha                |  1 -
 time/chrono/arithmetic.ha            |  2 +-
 time/chrono/chronology.ha            |  2 +-
 time/chrono/error.ha                 |  2 +-
 time/chrono/leapsec.ha               |  2 +-
 time/chrono/timescale.ha             |  2 +-
 time/chrono/timezone.ha              |  2 +-
 time/chrono/tzdb.ha                  |  2 +-
 time/conv.ha                         |  2 ++
 time/date/date.ha                    |  3 +-
 time/date/daydate.ha                 |  2 --
 time/date/daytime.ha                 |  2 +-
 time/date/error.ha                   |  1 -
 time/date/format.ha                  |  4 +--
 time/date/locality.ha                |  3 +-
 time/date/observe.ha                 |  2 +-
 time/date/parithm.ha                 |  4 +--
 time/date/parse.ha                   |  4 +--
 time/date/period.ha                  |  1 -
 time/date/reckon.ha                  |  2 +-
 time/date/tarithm.ha                 |  2 +-
 time/date/virtual.ha                 |  2 +-
 time/types.ha                        |  3 +-
 types/arch+aarch64.ha                |  1 -
 types/arch+riscv64.ha                |  1 -
 types/arch+x86_64.ha                 |  1 -
 types/c/+test.ha                     |  2 ++
 types/c/arch+aarch64.ha              |  2 ++
 types/c/arch+riscv64.ha              |  2 ++
 types/c/arch+x86_64.ha               |  2 ++
 types/c/strings.ha                   |  2 ++
 types/c/types.ha                     |  2 ++
 types/classes.ha                     |  1 -
 types/limits.ha                      |  2 --
 unix/+freebsd/getuid.ha              |  2 +-
 unix/+freebsd/groups.ha              |  2 ++
 unix/+freebsd/nice.ha                |  3 +-
 unix/+freebsd/pipe.ha                |  3 +-
 unix/+freebsd/setuid.ha              |  3 +-
 unix/+freebsd/umask.ha               |  2 +-
 unix/+linux/getuid.ha                |  2 +-
 unix/+linux/groups.ha                |  2 ++
 unix/+linux/nice.ha                  |  3 +-
 unix/+linux/pipe.ha                  |  2 +-
 unix/+linux/setuid.ha                |  3 +-
 unix/+linux/umask.ha                 |  3 +-
 unix/hosts/+freebsd.ha               |  1 -
 unix/hosts/+linux.ha                 |  1 -
 unix/hosts/hosts.ha                  |  5 +--
 unix/hosts/test+test.ha              |  2 +-
 unix/passwd/group.ha                 |  4 +--
 unix/passwd/passwd.ha                |  4 +--
 unix/passwd/types.ha                 |  2 --
 unix/poll/+freebsd.ha                |  3 +-
 unix/poll/+linux.ha                  |  3 +-
 unix/poll/types.ha                   |  2 ++
 unix/resolvconf/+freebsd.ha          |  1 -
 unix/resolvconf/+linux.ha            |  1 -
 unix/resolvconf/load.ha              |  4 +--
 unix/signal/+freebsd.ha              |  2 ++
 unix/signal/+linux.ha                |  2 +-
 unix/signal/types.ha                 |  1 -
 unix/tty/+freebsd/isatty.ha          |  3 +-
 unix/tty/+freebsd/open.ha            |  3 +-
 unix/tty/+freebsd/pty.ha             |  2 +-
 unix/tty/+freebsd/termios.ha         |  3 +-
 unix/tty/+freebsd/winsize.ha         |  3 +-
 unix/tty/+linux/isatty.ha            |  5 +--
 unix/tty/+linux/open.ha              |  5 +--
 unix/tty/+linux/pty.ha               |  2 +-
 unix/tty/+linux/termios.ha           |  3 +-
 unix/tty/+linux/winsize.ha           |  4 +--
 unix/tty/pty_common.ha               |  2 ++
 unix/tty/types.ha                    |  4 +--
 uuid/uuid.ha                         |  4 +--
 557 files changed, 533 insertions(+), 996 deletions(-)
 delete mode 100755 contrib/contributors.sh
 create mode 100755 scripts/copyright.sh

diff --git a/.builds/alpine.yml b/.builds/alpine.yml
index 0dec402f..685218b4 100644
--- a/.builds/alpine.yml
+++ b/.builds/alpine.yml
@@ -44,6 +44,9 @@ tasks:
- check_with_libc: |
    cd hare
    .bin/hare-tests-libc
- copyright: |
    cd hare
    ./scripts/copyright.sh
- docs: |
    if [ $BUILD_SUBMITTER != "git.sr.ht" ]
    then
diff --git a/ascii/ctype.ha b/ascii/ctype.ha
index 356ec215..5440d869 100644
--- a/ascii/ctype.ha
+++ b/ascii/ctype.ha
@@ -1,6 +1,4 @@
// License: MPL-2.0
// (c) 2021 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021 Drew DeVault <sir@cmpwn.com>

def U: u8 = 0o1;
def L: u8 = 0o2;
diff --git a/ascii/string.ha b/ascii/string.ha
index c006c1c1..84ee12a1 100644
--- a/ascii/string.ha
+++ b/ascii/string.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use encoding::utf8;
use strings;

diff --git a/ascii/valid.ha b/ascii/valid.ha
index 2859cc2a..73be4a83 100644
--- a/ascii/valid.ha
+++ b/ascii/valid.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2022 Sebastian <sebastian@sebsite.pw>
// (c) 2021 Drew Devault <sir@cmpwn.com>

use strings;

// Returns true if a rune is a valid ASCII character.
diff --git a/bufio/scanner.ha b/bufio/scanner.ha
index 31d4e188..4eda17d5 100644
--- a/bufio/scanner.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021-2023 Alexey Yerin <yyp@disroot.org>
// (c) 2021-2023 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use bytes;
use encoding::utf8;
use errors;
diff --git a/bufio/scanner_test+test.ha b/bufio/scanner_test+test.ha
index 5cdb380c..730ea128 100644
--- a/bufio/scanner_test+test.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use bytes;
use encoding::utf8;
use io;
diff --git a/bufio/stream.ha b/bufio/stream.ha
index e787429d..d58bc53e 100644
--- a/bufio/stream.ha
@@ -1,8 +1,5 @@
// License: MPL-2.0
// (c) 2022 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Byron Torres <b@torresjrjr.com>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use bytes;
use encoding::utf8;
use errors;
diff --git a/bufio/stream_test+test.ha b/bufio/stream_test+test.ha
index 2a6a50b4..f40bbf05 100644
--- a/bufio/stream_test+test.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use bytes;
use io;
use memio;
diff --git a/bytes/contains.ha b/bytes/contains.ha
index 295c25e7..6cb6cae1 100644
--- a/bytes/contains.ha
@@ -1,7 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Thomas Bracht Laumann Jespersen <t@laumann.xyz>

// Returns true if a byte slice contains a byte or a sequence of bytes.
export fn contains(haystack: []u8, needles: (u8 | []u8)...) bool = {
diff --git a/bytes/equal.ha b/bytes/equal.ha
index 2d70c91b..e6a952e7 100644
--- a/bytes/equal.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

// Returns true if the two byte sequences are identical.
//
diff --git a/bytes/index.ha b/bytes/index.ha
index ac3e581c..de765e80 100644
--- a/bytes/index.ha
@@ -1,7 +1,4 @@
// License: MPL-2.0
// (c) 2021 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

// Returns the offset of the first instance of "needle" in a "haystack" of
// bytes, or void if it is not found.
diff --git a/bytes/reverse.ha b/bytes/reverse.ha
index d0d7f5cf..494400f6 100644
--- a/bytes/reverse.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

// Reverses a slice of bytes.
export fn reverse(b: []u8) void = {
diff --git a/bytes/tokenize.ha b/bytes/tokenize.ha
index 01ce6597..44254c55 100644
--- a/bytes/tokenize.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use types;

export type tokenizer = struct {
diff --git a/bytes/trim.ha b/bytes/trim.ha
index 77f5cd72..d40fd768 100644
--- a/bytes/trim.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

// Returns a slice (borrowed from given input slice) after trimming off of
// the start of the input slice the bytes in the given list.
export fn ltrim(in: []u8, trim: u8...) []u8 = {
diff --git a/bytes/two_way.ha b/bytes/two_way.ha
index e37ea2c9..3d5f6623 100644
--- a/bytes/two_way.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021 Bor Grošelj Simić <bor.groseljsimic@telemach.net>

use types;

// Implements the so called Two-way string matching algorithm by Crochemore and
diff --git a/bytes/zero.ha b/bytes/zero.ha
index 5924094b..e0b07c0a 100644
--- a/bytes/zero.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use rt;

// Sets all bytes in a slice to zero. This is suitable for erasing private data
diff --git a/cmd/hare/arch.ha b/cmd/hare/arch.ha
index b9328ef4..880874f9 100644
--- a/cmd/hare/arch.ha
+++ b/cmd/hare/arch.ha
@@ -1,3 +1,5 @@
// License: GPL-3.0

use hare::module;
use os;
use strings;
diff --git a/cmd/hare/build.ha b/cmd/hare/build.ha
index fa55878d..8966d151 100644
--- a/cmd/hare/build.ha
+++ b/cmd/hare/build.ha
@@ -1,3 +1,5 @@
// License: GPL-3.0

use cmd::hare::build;
use errors;
use fmt;
diff --git a/cmd/hare/build/gather.ha b/cmd/hare/build/gather.ha
index 7811375f..7c6a4611 100644
--- a/cmd/hare/build/gather.ha
+++ b/cmd/hare/build/gather.ha
@@ -1,3 +1,5 @@
// License: GPL-3.0

use fs;
use hare::ast;
use hare::module;
diff --git a/cmd/hare/build/queue.ha b/cmd/hare/build/queue.ha
index 26b03acd..50782535 100644
--- a/cmd/hare/build/queue.ha
+++ b/cmd/hare/build/queue.ha
@@ -1,3 +1,5 @@
// License: GPL-3.0

use crypto::sha256;
use encoding::hex;
use errors;
diff --git a/cmd/hare/build/types.ha b/cmd/hare/build/types.ha
index 34461b6a..0dbded53 100644
--- a/cmd/hare/build/types.ha
+++ b/cmd/hare/build/types.ha
@@ -1,3 +1,5 @@
// License: GPL-3.0

use crypto::sha256;
use fs;
use hare::ast;
diff --git a/cmd/hare/build/util.ha b/cmd/hare/build/util.ha
index f421699c..da554175 100644
--- a/cmd/hare/build/util.ha
+++ b/cmd/hare/build/util.ha
@@ -1,3 +1,5 @@
// License: GPL-3.0

use crypto::sha256;
use fmt;
use hare::ast;
diff --git a/cmd/hare/cache.ha b/cmd/hare/cache.ha
index 1a71e1ab..12b96f48 100644
--- a/cmd/hare/cache.ha
+++ b/cmd/hare/cache.ha
@@ -1,3 +1,5 @@
// License: GPL-3.0

use fmt;
use fs;
use getopt;
diff --git a/cmd/hare/deps.ha b/cmd/hare/deps.ha
index fe45ead3..06e80fce 100644
--- a/cmd/hare/deps.ha
+++ b/cmd/hare/deps.ha
@@ -1,3 +1,5 @@
// License: GPL-3.0

use fmt;
use getopt;
use hare::ast;
diff --git a/cmd/hare/error.ha b/cmd/hare/error.ha
index c3d70d74..cf433c15 100644
--- a/cmd/hare/error.ha
+++ b/cmd/hare/error.ha
@@ -1,3 +1,5 @@
// License: GPL-3.0

use fs;
use hare::module;
use hare::parse;
diff --git a/cmd/hare/main.ha b/cmd/hare/main.ha
index c4d67ce7..164a1cae 100644
--- a/cmd/hare/main.ha
+++ b/cmd/hare/main.ha
@@ -1,6 +1,5 @@
// License: GPL-3.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use fmt;
use fs;
use getopt;
diff --git a/cmd/hare/util.ha b/cmd/hare/util.ha
index f7d8f86e..04ee87a6 100644
--- a/cmd/hare/util.ha
+++ b/cmd/hare/util.ha
@@ -1,3 +1,5 @@
// License: GPL-3.0

use ascii;
use dirs;
use errors;
diff --git a/cmd/hare/version.ha b/cmd/hare/version.ha
index 44f05712..08a91338 100644
--- a/cmd/hare/version.ha
+++ b/cmd/hare/version.ha
@@ -1,3 +1,5 @@
// License: GPL-3.0

use ascii;
use bufio;
use fmt;
diff --git a/cmd/harec/context.ha b/cmd/harec/context.ha
index 30002db7..6b4213b7 100644
--- a/cmd/harec/context.ha
+++ b/cmd/harec/context.ha
@@ -1,6 +1,5 @@
// License: GPL-3.0
// (c) 2022 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use io;
use hare::types;
use hare::unit;
diff --git a/cmd/harec/errors.ha b/cmd/harec/errors.ha
index d5b8f40f..cfa78399 100644
--- a/cmd/harec/errors.ha
+++ b/cmd/harec/errors.ha
@@ -1,6 +1,5 @@
// License: GPL-3.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use bufio;
use fmt;
use hare::lex;
diff --git a/cmd/harec/gen.ha b/cmd/harec/gen.ha
index f078febe..e7176c55 100644
--- a/cmd/harec/gen.ha
+++ b/cmd/harec/gen.ha
@@ -1,7 +1,5 @@
// License: GPL-3.0
// (c) 2022 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use fmt;
use hare::ast;
use hare::lex;
diff --git a/cmd/harec/genutil.ha b/cmd/harec/genutil.ha
index 1cb61695..5be32e61 100644
--- a/cmd/harec/genutil.ha
+++ b/cmd/harec/genutil.ha
@@ -1,5 +1,5 @@
// License: GPL-3.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use fmt;

fn mklabel(ctx: *context, name: str) str = {
diff --git a/cmd/harec/main.ha b/cmd/harec/main.ha
index d3835090..b05bba65 100644
--- a/cmd/harec/main.ha
+++ b/cmd/harec/main.ha
@@ -1,7 +1,5 @@
// License: GPL-3.0
// (c) 2022 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use bufio;
use fmt;
use fs;
diff --git a/cmd/harec/qbe.ha b/cmd/harec/qbe.ha
index bc0fe289..c14dfdd6 100644
--- a/cmd/harec/qbe.ha
+++ b/cmd/harec/qbe.ha
@@ -1,6 +1,5 @@
// License: GPL-3.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use fmt;
use io;
use hare::types;
diff --git a/cmd/harec/qtype.ha b/cmd/harec/qtype.ha
index 601a10c0..944f6a77 100644
--- a/cmd/harec/qtype.ha
+++ b/cmd/harec/qtype.ha
@@ -1,6 +1,5 @@
// License: GPL-3.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use fmt;
use hare::types;
use hare::types::{builtin};
diff --git a/cmd/haredoc/arch.ha b/cmd/haredoc/arch.ha
index 81769ea5..c77663aa 100644
--- a/cmd/haredoc/arch.ha
+++ b/cmd/haredoc/arch.ha
@@ -1,3 +1,5 @@
// License: GPL-3.0

use hare::module;
use os;
use strings;
diff --git a/cmd/haredoc/doc/color.ha b/cmd/haredoc/doc/color.ha
index 9b8497e0..c8356fe9 100644
--- a/cmd/haredoc/doc/color.ha
+++ b/cmd/haredoc/doc/color.ha
@@ -1,5 +1,5 @@
// License: GPL-3.0
// (c) 2022 Byron Torres <b@torresjrjr.com>

use ascii;
use fmt;
use io;
diff --git a/cmd/haredoc/doc/hare.ha b/cmd/haredoc/doc/hare.ha
index 9b8e8333..5ac953af 100644
--- a/cmd/haredoc/doc/hare.ha
+++ b/cmd/haredoc/doc/hare.ha
@@ -1,7 +1,5 @@
// License: GPL-3.0
// (c) 2021 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use bufio;
use fmt;
use hare::ast;
diff --git a/cmd/haredoc/doc/html.ha b/cmd/haredoc/doc/html.ha
index 79488e48..e9e53317 100644
--- a/cmd/haredoc/doc/html.ha
+++ b/cmd/haredoc/doc/html.ha
@@ -1,10 +1,4 @@
// License: GPL-3.0
// (c) 2021-2022 Alexey Yerin <yyp@disroot.org>
// (c) 2022 Byron Torres <b@torresjrjr.com>
// (c) 2021-2022 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Thomas Bracht Laumann Jespersen <t@laumann.xyz>
// (c) 2022 Umar Getagazov <umar@handlerug.me>

// Note: ast::ident should never have to be escaped
use encoding::utf8;
diff --git a/cmd/haredoc/doc/resolve.ha b/cmd/haredoc/doc/resolve.ha
index f113d6b5..cd1e20ca 100644
--- a/cmd/haredoc/doc/resolve.ha
+++ b/cmd/haredoc/doc/resolve.ha
@@ -1,7 +1,5 @@
// License: GPL-3.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2022 Alexey Yerin <yyp@disroot.org>

use fmt;
use fs;
use hare::ast;
diff --git a/cmd/haredoc/doc/sort.ha b/cmd/haredoc/doc/sort.ha
index b3deb38f..5e0fa8ed 100644
--- a/cmd/haredoc/doc/sort.ha
+++ b/cmd/haredoc/doc/sort.ha
@@ -1,6 +1,5 @@
// License: GPL-3.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use hare::ast;
use sort;
use strings;
diff --git a/cmd/haredoc/doc/tty.ha b/cmd/haredoc/doc/tty.ha
index 744e582e..82381489 100644
--- a/cmd/haredoc/doc/tty.ha
+++ b/cmd/haredoc/doc/tty.ha
@@ -1,7 +1,5 @@
// License: GPL-3.0
// (c) 2021 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use ascii;
use bufio;
use fmt;
diff --git a/cmd/haredoc/doc/types.ha b/cmd/haredoc/doc/types.ha
index 8398f6e3..232f7081 100644
--- a/cmd/haredoc/doc/types.ha
+++ b/cmd/haredoc/doc/types.ha
@@ -1,6 +1,5 @@
// License: GPL-3.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use fs;
use hare::ast;
use hare::lex;
diff --git a/cmd/haredoc/doc/util.ha b/cmd/haredoc/doc/util.ha
index d6016539..ad652cbd 100644
--- a/cmd/haredoc/doc/util.ha
+++ b/cmd/haredoc/doc/util.ha
@@ -1,6 +1,5 @@
// License: GPL-3.0
// (c) 2022 Byron Torres <b@torresjrjr.com>
// (c) 2022 Sebastian <sebastian@sebsite.pw>

use fmt;
use fs;
use hare::module;
diff --git a/cmd/haredoc/error.ha b/cmd/haredoc/error.ha
index 9bcf6f1d..10072d10 100644
--- a/cmd/haredoc/error.ha
+++ b/cmd/haredoc/error.ha
@@ -1,3 +1,5 @@
// License: GPL-3.0

use cmd::haredoc::doc;
use fs;
use hare::module;
diff --git a/cmd/haredoc/main.ha b/cmd/haredoc/main.ha
index c6919dce..d777655d 100644
--- a/cmd/haredoc/main.ha
+++ b/cmd/haredoc/main.ha
@@ -1,8 +1,5 @@
// License: GPL-3.0
// (c) 2021 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2022 Sebastian <sebastian@sebsite.pw>

use cmd::haredoc::doc;
use fmt;
use fs;
diff --git a/cmd/haredoc/util.ha b/cmd/haredoc/util.ha
index fdd9e603..85cfb066 100644
--- a/cmd/haredoc/util.ha
+++ b/cmd/haredoc/util.ha
@@ -1,3 +1,5 @@
// License: GPL-3.0

use ascii;
use dirs;
use errors;
diff --git a/cmd/haretype/main.ha b/cmd/haretype/main.ha
index 4e243a6e..199314da 100644
--- a/cmd/haretype/main.ha
+++ b/cmd/haretype/main.ha
@@ -1,5 +1,5 @@
// License: GPL-3.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use fmt;
use getopt;
use hare::ast;
diff --git a/cmd/ioctlgen/main.ha b/cmd/ioctlgen/main.ha
index 497e7942..dcad2ecb 100644
--- a/cmd/ioctlgen/main.ha
+++ b/cmd/ioctlgen/main.ha
@@ -1,3 +1,5 @@
// License: GPL-3.0

use bufio;
use fmt;
use hare::ast;
diff --git a/contrib/contributors.sh b/contrib/contributors.sh
deleted file mode 100755
index 8b107a14..00000000
--- a/contrib/contributors.sh
@@ -1,48 +0,0 @@
#!/bin/sh -eu

authors=
commits=

while true; do
  files=${1:-.}
  if [ -d "$files" ]; then
    files=$(git ls-tree -r --name-only HEAD "$files")
    files=$(printf '%s' "$files" | grep -E '(\.(ha|s)|(^|/)README)$')
  fi

  for file in $files; do
    authorinfo=$(git blame "$file" --porcelain --incremental)

    # Format as: Author Name <test@example.com>
    while read -r line; do
      if printf '%s' "$line" | grep -qE '^[0-9a-f]{40} \d+ \d+ \d+$'; then
        commits=$(printf '%s\n%s' "$commits" \
          "$(printf '%s' "$line" | cut -d' ' -f1)")
        continue
      fi
      case "$line" in
        "author "*) author=$(printf '%s' "$line" | sed 's/author //') ;;
        "author-mail "*) mail=$(printf '%s' "$line" | sed 's/author-mail //') ;;
        "filename "*) authors=$(printf '%s\n%s' "$authors" "$author $mail") ;;
        *) ;;
      esac
    done << EOF
    $authorinfo
EOF
  done

  if [ $# -eq 1 ]; then
    break
  fi
  shift 1
done

# Get co-authors of commits
for commit in $(printf '%s' "$commits" | sort -u); do
  coauthors=$(git show "$commit" | grep '^    Co-authored-by:' \
    | sed 's/    Co-authored-by: *//g')
  authors=$(printf '%s\n%s' "$authors" "$coauthors")
done

# Get only the unique author names
printf '%s\n' "$authors" | tail -n+2 | sort -u
diff --git a/crypto/+test/authenc_test.ha b/crypto/+test/authenc_test.ha
index 61c70426..90f65d8d 100644
--- a/crypto/+test/authenc_test.ha
+++ b/crypto/+test/authenc_test.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Armin Preiml <apreiml@strohwolke.at>

use bytes;
use errors;

diff --git a/crypto/aes/+test/gcm.ha b/crypto/aes/+test/gcm.ha
index 30770be8..5f94aad9 100644
--- a/crypto/aes/+test/gcm.ha
+++ b/crypto/aes/+test/gcm.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use bytes;
use crypto::cipher;
use errors;
diff --git a/crypto/aes/+test/ni_test+x86_64.ha b/crypto/aes/+test/ni_test+x86_64.ha
index 5e05695b..cd7daf4c 100644
--- a/crypto/aes/+test/ni_test+x86_64.ha
+++ b/crypto/aes/+test/ni_test+x86_64.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use bytes;
use crypto::cipher;

diff --git a/crypto/aes/+x86_64/ni.ha b/crypto/aes/+x86_64/ni.ha
index 4da5e584..eee560d9 100644
--- a/crypto/aes/+x86_64/ni.ha
+++ b/crypto/aes/+x86_64/ni.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use bytes;
use crypto::cipher;
use rt;
diff --git a/crypto/aes/aes+x86_64.ha b/crypto/aes/aes+x86_64.ha
index 029ca59f..813d6173 100644
--- a/crypto/aes/aes+x86_64.ha
+++ b/crypto/aes/aes+x86_64.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Armin Preiml <apreiml@strohwolke.at>

use crypto::cipher;

def MAXEXPKEYSZ: size = CT64_EXPKEYSZ;
diff --git a/crypto/aes/aes.ha b/crypto/aes/aes.ha
index 985496db..6de4cbea 100644
--- a/crypto/aes/aes.ha
+++ b/crypto/aes/aes.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Armin Preiml <apreiml@strohwolke.at>

use crypto::cipher;

def MAXEXPKEYSZ: size = CT64_EXPKEYSZ;
diff --git a/crypto/aes/aes_ct64.ha b/crypto/aes/aes_ct64.ha
index 985b7e53..3d2c6bbb 100644
--- a/crypto/aes/aes_ct64.ha
+++ b/crypto/aes/aes_ct64.ha
@@ -1,6 +1,4 @@
// License: MPL-2.0
// (c) 2021 Armin Preiml <apreiml@strohwolke.at>
// (c) 2021 Drew DeVault <sir@cmpwn.com>

// Constant time aes implementation optimized for 64bit CPUs.
// The code was ported from BearSSL, which contained the following notice:
diff --git a/crypto/aes/block.ha b/crypto/aes/block.ha
index 1ebc11ec..c0bf2d05 100644
--- a/crypto/aes/block.ha
+++ b/crypto/aes/block.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Armin Preiml <apreiml@strohwolke.at>

use bytes;
use crypto::cipher;

diff --git a/crypto/aes/cbc+test.ha b/crypto/aes/cbc+test.ha
index ca61cf2e..21dd2257 100644
--- a/crypto/aes/cbc+test.ha
+++ b/crypto/aes/cbc+test.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Armin Preiml <apreiml@strohwolke.at>
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use crypto::cipher;
use bytes;

diff --git a/crypto/aes/ct64+test.ha b/crypto/aes/ct64+test.ha
index a8b11172..495d1458 100644
--- a/crypto/aes/ct64+test.ha
+++ b/crypto/aes/ct64+test.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Armin Preiml <apreiml@strohwolke.at>
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use crypto::cipher;
use bytes;

diff --git a/crypto/aes/ctr+test.ha b/crypto/aes/ctr+test.ha
index 41a8641d..57cd0f9f 100644
--- a/crypto/aes/ctr+test.ha
+++ b/crypto/aes/ctr+test.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2022 Armin Preiml <apreiml@strohwolke.at>
// (c) 2022 Drew DeVault <sir@cmpwn.com>

use bytes;
use crypto::cipher;
use errors;
diff --git a/crypto/aes/rt+test.ha b/crypto/aes/rt+test.ha
index fffdb8ba..1a9a126f 100644
--- a/crypto/aes/rt+test.ha
+++ b/crypto/aes/rt+test.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Armin Preiml <apreiml@strohwolke.at>
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use crypto::cipher;
use bytes;

diff --git a/crypto/aes/xts/+test.ha b/crypto/aes/xts/+test.ha
index 5c5fb781..0f0f5cc3 100644
--- a/crypto/aes/xts/+test.ha
+++ b/crypto/aes/xts/+test.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Armin Preiml <apreiml@strohwolke.at>

use bytes;

@test fn oneblock() void = {
diff --git a/crypto/aes/xts/xts.ha b/crypto/aes/xts/xts.ha
index 1ad2daee..613f6fb6 100644
--- a/crypto/aes/xts/xts.ha
+++ b/crypto/aes/xts/xts.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Armin Preiml <apreiml@strohwolke.at>

use crypto::aes;
use bytes;
use crypto::cipher;
diff --git a/crypto/argon2/+test.ha b/crypto/argon2/+test.ha
index 0e997c21..4e413da7 100644
--- a/crypto/argon2/+test.ha
+++ b/crypto/argon2/+test.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021-2022 Armin Preiml <apreiml@strohwolke.at>
// (c) 2022 Drew DeVault <sir@cmpwn.com>

use bytes;
use encoding::hex;
use strings;
diff --git a/crypto/argon2/argon2.ha b/crypto/argon2/argon2.ha
index 219b34e2..c0a31857 100644
--- a/crypto/argon2/argon2.ha
+++ b/crypto/argon2/argon2.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

// (c) 2022 Alexey Yerin <yyp@disroot.org>
// (c) 2021-2022 Armin Preiml <apreiml@strohwolke.at>
// (c) 2021-2022 Drew DeVault <sir@cmpwn.com>
diff --git a/crypto/authenc.ha b/crypto/authenc.ha
index 004f18a1..9cb0c753 100644
--- a/crypto/authenc.ha
+++ b/crypto/authenc.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2023 Armin Preiml <apreiml@strohwolke.at>
// (c) 2023 Drew DeVault <sir@cmpwn.com>

use bytes;
use crypto::chachapoly;
use crypto::math;
diff --git a/crypto/bcrypt/+test.ha b/crypto/bcrypt/+test.ha
index d1d98a5a..70bf2716 100644
--- a/crypto/bcrypt/+test.ha
+++ b/crypto/bcrypt/+test.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use strings;
use fmt;

diff --git a/crypto/bcrypt/base64.ha b/crypto/bcrypt/base64.ha
index f9e2276b..3c3d28a5 100644
--- a/crypto/bcrypt/base64.ha
+++ b/crypto/bcrypt/base64.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2011 The Go Authors
// (c) 2022 Drew DeVault <sir@cmpwn.com>
//

// bcrypt uses a crappy variant of base64 with its own special alphabet and no
// padding. This file glues encoding::base64 to the bcrypt semantics.
use encoding::base64;
diff --git a/crypto/bcrypt/bcrypt.ha b/crypto/bcrypt/bcrypt.ha
index 9b22c713..03dae123 100644
--- a/crypto/bcrypt/bcrypt.ha
+++ b/crypto/bcrypt/bcrypt.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2011 The Go Authors
// (c) 2022 Drew DeVault <sir@cmpwn.com>
//

// This implementation is not great, but neither is this algorithm. Mostly
// ported from Go.
//
diff --git a/crypto/bigint/+test/arithm_test.ha b/crypto/bigint/+test/arithm_test.ha
index 29930acd..7d57b038 100644
--- a/crypto/bigint/+test/arithm_test.ha
+++ b/crypto/bigint/+test/arithm_test.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use bytes;

@test fn add() void = {
diff --git a/crypto/bigint/+test/encoding_test.ha b/crypto/bigint/+test/encoding_test.ha
index 6c7c013a..e952173e 100644
--- a/crypto/bigint/+test/encoding_test.ha
+++ b/crypto/bigint/+test/encoding_test.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use bytes;

@test fn encode() void = {
diff --git a/crypto/bigint/+test/monty_test.ha b/crypto/bigint/+test/monty_test.ha
index bc7e9157..e7d9a6cb 100644
--- a/crypto/bigint/+test/monty_test.ha
+++ b/crypto/bigint/+test/monty_test.ha
@@ -1,3 +1,4 @@
// License: MPL-2.0

@test fn montyencode() void = {
	let m = fromhex("0010000061");
diff --git a/crypto/bigint/+test/utils.ha b/crypto/bigint/+test/utils.ha
index 9473e934..3dac95f3 100644
--- a/crypto/bigint/+test/utils.ha
+++ b/crypto/bigint/+test/utils.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use encoding::hex;

// The caller must free the result.
diff --git a/crypto/bigint/arithm.ha b/crypto/bigint/arithm.ha
index c8967bd5..a046424f 100644
--- a/crypto/bigint/arithm.ha
+++ b/crypto/bigint/arithm.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

// The following code was initially ported from BearSSL.
//
// Copyright (c) 2017 Thomas Pornin <pornin@bolet.org>
diff --git a/crypto/bigint/encoding.ha b/crypto/bigint/encoding.ha
index f3892aec..81e90977 100644
--- a/crypto/bigint/encoding.ha
+++ b/crypto/bigint/encoding.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

// The following code was initially ported from BearSSL.
//
// Copyright (c) 2017 Thomas Pornin <pornin@bolet.org>
diff --git a/crypto/bigint/monty.ha b/crypto/bigint/monty.ha
index 78fb4451..dc36a3ab 100644
--- a/crypto/bigint/monty.ha
+++ b/crypto/bigint/monty.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

// The following code was initially ported from BearSSL.
//
// Copyright (c) 2017 Thomas Pornin <pornin@bolet.org>
diff --git a/crypto/bigint/types.ha b/crypto/bigint/types.ha
index 85f4a283..c44a53fd 100644
--- a/crypto/bigint/types.ha
+++ b/crypto/bigint/types.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

// A big integer is stored in an array of words. The first word holds
// information about the effective size of the big integer. The subsequend
// words encode the value in little-endian order. The [[WORD_BITMASK]] masks the
diff --git a/crypto/bigint/util.ha b/crypto/bigint/util.ha
index 7fa657db..23c86283 100644
--- a/crypto/bigint/util.ha
+++ b/crypto/bigint/util.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

// The following code was initially ported from BearSSL.
//
// Copyright (c) 2017 Thomas Pornin <pornin@bolet.org>
diff --git a/crypto/blake2b/+test.ha b/crypto/blake2b/+test.ha
index 6a670c43..eb188a20 100644
--- a/crypto/blake2b/+test.ha
+++ b/crypto/blake2b/+test.ha
@@ -1,8 +1,5 @@
// License: MPL-2.0
// (c) 2022 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Armin Preiml <apreiml@strohwolke.at>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use bytes;
use encoding::hex;
use fmt;
diff --git a/crypto/blake2b/blake2b.ha b/crypto/blake2b/blake2b.ha
index 1a43ed59..01439aa9 100644
--- a/crypto/blake2b/blake2b.ha
+++ b/crypto/blake2b/blake2b.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021-2022 Armin Preiml <apreiml@strohwolke.at>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use bytes;
use crypto::math;
use endian;
diff --git a/crypto/blake2b/vectors+test.ha b/crypto/blake2b/vectors+test.ha
index c929592f..c918841a 100644
--- a/crypto/blake2b/vectors+test.ha
+++ b/crypto/blake2b/vectors+test.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Ember Sawady <ecs@d2evs.net>

type vector = struct {
	in: str,
diff --git a/crypto/blowfish/+test.ha b/crypto/blowfish/+test.ha
index f1508f9d..33c39d1c 100644
--- a/crypto/blowfish/+test.ha
+++ b/crypto/blowfish/+test.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use bytes;
use crypto::cipher;

diff --git a/crypto/blowfish/blowfish.ha b/crypto/blowfish/blowfish.ha
index d8441de4..5d400f05 100644
--- a/crypto/blowfish/blowfish.ha
+++ b/crypto/blowfish/blowfish.ha
@@ -1,7 +1,6 @@
// License: MPL-2.0
// License: MIT
// (c) 2022 Drew DeVault <sir@cmpwn.com>
// (c) 2010 The Go Authors. All rights reserved.

use bytes;
use crypto::cipher;
use endian;
diff --git a/crypto/blowfish/const.ha b/crypto/blowfish/const.ha
index da331e0d..8882a6b9 100644
--- a/crypto/blowfish/const.ha
+++ b/crypto/blowfish/const.ha
@@ -1,6 +1,4 @@
// License: MPL-2.0
// License: MIT
// (c) 2022 Drew DeVault <sir@cmpwn.com>
// (c) 2010 The Go Authors. All rights reserved.

const s0: [256]u32 = [
diff --git a/crypto/chacha/+test.ha b/crypto/chacha/+test.ha
index 0a66bb1f..667a7c01 100644
--- a/crypto/chacha/+test.ha
+++ b/crypto/chacha/+test.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Armin Preiml <apreiml@strohwolke.at>

use bytes;
use crypto::cipher;
use io;
diff --git a/crypto/chacha/chacha20.ha b/crypto/chacha/chacha20.ha
index 3792d7c6..cd8cbd91 100644
--- a/crypto/chacha/chacha20.ha
+++ b/crypto/chacha/chacha20.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Armin Preiml <apreiml@strohwolke.at>

use bytes;
use crypto::cipher;
use crypto::math::{rotl32, xor};
diff --git a/crypto/chachapoly/chachapoly.ha b/crypto/chachapoly/chachapoly.ha
index 4e1f4f9e..6cafbb11 100644
--- a/crypto/chachapoly/chachapoly.ha
+++ b/crypto/chachapoly/chachapoly.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2023 Armin Preiml <apreiml@strohwolke.at>

use bytes;
use crypto::chacha;
use crypto::mac;
diff --git a/crypto/chachapoly/encryption+test.ha b/crypto/chachapoly/encryption+test.ha
index 458afca2..35b9cf8e 100644
--- a/crypto/chachapoly/encryption+test.ha
+++ b/crypto/chachapoly/encryption+test.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2023 Armin Preiml <apreiml@strohwolke.at>

use bytes;
use io;
use memio;
diff --git a/crypto/cipher/block.ha b/crypto/cipher/block.ha
index e39df528..5a99f50b 100644
--- a/crypto/cipher/block.ha
+++ b/crypto/cipher/block.ha
@@ -1,6 +1,4 @@
// License: MPL-2.0
// (c) 2021 Armin Preiml <apreiml@strohwolke.at>
// (c) 2021 Drew DeVault <sir@cmpwn.com>

// An abstract interface for implementing block ciphers.
export type blockvtable = struct {
diff --git a/crypto/cipher/cbc.ha b/crypto/cipher/cbc.ha
index a6785396..9e614688 100644
--- a/crypto/cipher/cbc.ha
+++ b/crypto/cipher/cbc.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Armin Preiml <apreiml@strohwolke.at>
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use crypto::math;

export type cbc_mode = struct {
diff --git a/crypto/cipher/cipher.ha b/crypto/cipher/cipher.ha
index ed605fd1..dab11e31 100644
--- a/crypto/cipher/cipher.ha
+++ b/crypto/cipher/cipher.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021-2022 Armin Preiml <apreiml@strohwolke.at>

// Discards any state associated with a block or a stream cipher algorithm,
// securely erasing secret data from memory.
diff --git a/crypto/cipher/ctr.ha b/crypto/cipher/ctr.ha
index 07be32e2..370373dd 100644
--- a/crypto/cipher/ctr.ha
+++ b/crypto/cipher/ctr.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2022 Armin Preiml <apreiml@strohwolke.at>
// (c) 2022 Drew DeVault <sir@cmpwn.com>

use bytes;
use crypto::math;
use crypto::math::{xor};
diff --git a/crypto/cipher/gcm.ha b/crypto/cipher/gcm.ha
index 870cfecd..6b64f37c 100644
--- a/crypto/cipher/gcm.ha
+++ b/crypto/cipher/gcm.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Armin Preiml <apreiml@strohwolke.at>

use bytes;
use crypto::math::{xor,eqslice};
use endian::{beputu64, beputu32, begetu32};
diff --git a/crypto/cipher/ghash.ha b/crypto/cipher/ghash.ha
index d342ea40..bad98606 100644
--- a/crypto/cipher/ghash.ha
+++ b/crypto/cipher/ghash.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

// The following code was initially ported from BearSSL.
//
// Copyright (c) 2016 Thomas Pornin <pornin@bolet.org>
diff --git a/crypto/cipher/stream.ha b/crypto/cipher/stream.ha
index 56ebf3fa..6e2c5b27 100644
--- a/crypto/cipher/stream.ha
+++ b/crypto/cipher/stream.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Armin Preiml <apreiml@strohwolke.at>

use io;
use crypto::math::{xor};

diff --git a/crypto/curve25519/+test.ha b/crypto/curve25519/+test.ha
index a87de461..f873e133 100644
--- a/crypto/curve25519/+test.ha
+++ b/crypto/curve25519/+test.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021 Thomas Bracht Laumann Jespersen <t@laumann.xyz>

use bytes;
use fmt;
use io;
diff --git a/crypto/curve25519/curve25519.ha b/crypto/curve25519/curve25519.ha
index 9aa76172..cf386e1b 100644
--- a/crypto/curve25519/curve25519.ha
+++ b/crypto/curve25519/curve25519.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021 Thomas Bracht Laumann Jespersen <t@laumann.xyz>

use bytes;

// Implements the curve25519 elliptic curve
diff --git a/crypto/ed25519/+test.ha b/crypto/ed25519/+test.ha
index 05df6d45..629dddb6 100644
--- a/crypto/ed25519/+test.ha
+++ b/crypto/ed25519/+test.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Luke Champine <luke.champine@gmail.com>

use bytes;
use encoding::hex;
use strings;
diff --git a/crypto/ed25519/ed25519.ha b/crypto/ed25519/ed25519.ha
index c9f99871..0e1f3fd5 100644
--- a/crypto/ed25519/ed25519.ha
+++ b/crypto/ed25519/ed25519.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2022 Luke Champine <luke.champine@gmail.com>

// Implements the Ed25519 signature scheme.
//
diff --git a/crypto/ed25519/edwards25519.ha b/crypto/ed25519/edwards25519.ha
index 6fe93941..e8c383d1 100644
--- a/crypto/ed25519/edwards25519.ha
+++ b/crypto/ed25519/edwards25519.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2022 Luke Champine <luke.champine@gmail.com>

def FIELDSZ: size = 16;
type elem = [FIELDSZ]i64;
diff --git a/crypto/hkdf/+test.ha b/crypto/hkdf/+test.ha
index ae7f1cd1..94a0424f 100644
--- a/crypto/hkdf/+test.ha
+++ b/crypto/hkdf/+test.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2023 Armin Preiml <apreiml@strohwolke.at>

use bytes;
use crypto::sha1;
use crypto::sha256;
diff --git a/crypto/hkdf/hkdf.ha b/crypto/hkdf/hkdf.ha
index ed9fa338..2507f40f 100644
--- a/crypto/hkdf/hkdf.ha
+++ b/crypto/hkdf/hkdf.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2023 Armin Preiml <apreiml@strohwolke.at>

use bytes;
use crypto::hmac;
use crypto::mac;
diff --git a/crypto/hmac/+test.ha b/crypto/hmac/+test.ha
index 4cd865f9..5c60308b 100644
--- a/crypto/hmac/+test.ha
+++ b/crypto/hmac/+test.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021-2022 Armin Preiml <apreiml@strohwolke.at>

use bytes;
use crypto::mac;
use crypto::sha1;
diff --git a/crypto/hmac/hmac.ha b/crypto/hmac/hmac.ha
index d2f5c5e1..abdec2e1 100644
--- a/crypto/hmac/hmac.ha
+++ b/crypto/hmac/hmac.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021-2022 Armin Preiml <apreiml@strohwolke.at>
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use bytes;
use crypto::mac;
use hash;
diff --git a/crypto/hmac/sha1.ha b/crypto/hmac/sha1.ha
index 8112caa9..e2df3784 100644
--- a/crypto/hmac/sha1.ha
+++ b/crypto/hmac/sha1.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Drew DeVault <sir@cmpwn.com>

use bytes;
use crypto::mac;
use crypto::sha1;
diff --git a/crypto/hmac/sha256.ha b/crypto/hmac/sha256.ha
index 3ba02980..76c03782 100644
--- a/crypto/hmac/sha256.ha
+++ b/crypto/hmac/sha256.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Armin Preiml <apreiml@strohwolke.at>

use bytes;
use crypto::mac;
use crypto::sha256;
diff --git a/crypto/keyderiv.ha b/crypto/keyderiv.ha
index 75edfe54..2ffd9ef7 100644
--- a/crypto/keyderiv.ha
+++ b/crypto/keyderiv.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Drew DeVault <sir@cmpwn.com>

use errors;
use crypto::argon2;

diff --git a/crypto/keystore/impl+linux.ha b/crypto/keystore/impl+linux.ha
index 49fa09c3..322a273d 100644
--- a/crypto/keystore/impl+linux.ha
+++ b/crypto/keystore/impl+linux.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use errors;
use linux::keyctl;

diff --git a/crypto/keystore/impl.ha b/crypto/keystore/impl.ha
index bbc661d7..28919f81 100644
--- a/crypto/keystore/impl.ha
+++ b/crypto/keystore/impl.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

// TODO: At least use mlock or something
use bytes;
use errors;
diff --git a/crypto/mac/mac.ha b/crypto/mac/mac.ha
index a7426b03..57c36a19 100644
--- a/crypto/mac/mac.ha
+++ b/crypto/mac/mac.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Armin Preiml <apreiml@strohwolke.at>

use io;
// TODO: Use a vtable-based approach like io::stream

diff --git a/crypto/math/arithm.ha b/crypto/math/arithm.ha
index 433b58df..df5a8a2c 100644
--- a/crypto/math/arithm.ha
+++ b/crypto/math/arithm.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2022 Armin Preiml <apreiml@strohwolke.at>
//

// The following code was initially ported from BearSSL.
//
// Copyright (c) 2017 Thomas Pornin <pornin@bolet.org>
diff --git a/crypto/math/bits.ha b/crypto/math/bits.ha
index 0c697e67..1b8152a4 100644
--- a/crypto/math/bits.ha
+++ b/crypto/math/bits.ha
@@ -1,7 +1,4 @@
// License: MPL-2.0
// (c) 2021-2022 Armin Preiml <apreiml@strohwolke.at>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Thomas Bracht Laumann Jespersen <t@laumann.xyz>

// Rotates a 32-bit unsigned integer left by k bits. k may be negative to rotate
// right instead, or see [[rotr32]].
diff --git a/crypto/poly1305/+test.ha b/crypto/poly1305/+test.ha
index e6661d95..27567d94 100644
--- a/crypto/poly1305/+test.ha
+++ b/crypto/poly1305/+test.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Armin Preiml <apreiml@strohwolke.at>

use bytes;
use crypto::mac;
use encoding::hex;
diff --git a/crypto/poly1305/poly1305.ha b/crypto/poly1305/poly1305.ha
index a396c61c..7a4af891 100644
--- a/crypto/poly1305/poly1305.ha
+++ b/crypto/poly1305/poly1305.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2022 Armin Preiml <apreiml@strohwolke.at>

// This implementation was ported from Loup Vaillant's monocypher project.

diff --git a/crypto/random/+freebsd.ha b/crypto/random/+freebsd.ha
index 597f153d..5a111c94 100644
--- a/crypto/random/+freebsd.ha
+++ b/crypto/random/+freebsd.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use errors;
use rt;
use io;
diff --git a/crypto/random/+linux.ha b/crypto/random/+linux.ha
index 597f153d..5a111c94 100644
--- a/crypto/random/+linux.ha
+++ b/crypto/random/+linux.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use errors;
use rt;
use io;
diff --git a/crypto/random/random.ha b/crypto/random/random.ha
index 099f7b61..23d2ee85 100644
--- a/crypto/random/random.ha
+++ b/crypto/random/random.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use io;
use rt;

diff --git a/crypto/rsa/+test/core_test.ha b/crypto/rsa/+test/core_test.ha
index f09a7900..a639e0fd 100644
--- a/crypto/rsa/+test/core_test.ha
+++ b/crypto/rsa/+test/core_test.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Armin Preiml <apreiml@strohwolke.at>

use bytes;
use crypto::bigint::*;

diff --git a/crypto/rsa/+test/keys_test.ha b/crypto/rsa/+test/keys_test.ha
index f9ca4ca8..5c680c5d 100644
--- a/crypto/rsa/+test/keys_test.ha
+++ b/crypto/rsa/+test/keys_test.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Armin Preiml <apreiml@strohwolke.at>

use bytes;

type keypair = struct {
diff --git a/crypto/rsa/+test/pkcs1_test.ha b/crypto/rsa/+test/pkcs1_test.ha
index 82e8d5e7..f4f42c59 100644
--- a/crypto/rsa/+test/pkcs1_test.ha
+++ b/crypto/rsa/+test/pkcs1_test.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Armin Preiml <apreiml@strohwolke.at>

use bytes;
use crypto::sha1;
use crypto::sha256;
diff --git a/crypto/rsa/core.ha b/crypto/rsa/core.ha
index 1bcb3fa0..f5f286d4 100644
--- a/crypto/rsa/core.ha
+++ b/crypto/rsa/core.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

// The following code was initially ported from BearSSL.
//
// Copyright (c) 2016 Thomas Pornin <pornin@bolet.org>
diff --git a/crypto/rsa/errors.ha b/crypto/rsa/errors.ha
index e5e17a91..a117eb13 100644
--- a/crypto/rsa/errors.ha
+++ b/crypto/rsa/errors.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Armin Preiml <apreiml@strohwolke.at>

use errors;

// Signature verification failed.
diff --git a/crypto/rsa/keys.ha b/crypto/rsa/keys.ha
index b2d1dec6..a896e0bf 100644
--- a/crypto/rsa/keys.ha
+++ b/crypto/rsa/keys.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Armin Preiml <apreiml@strohwolke.at>

use bytes;
use crypto::bigint;
use crypto::math::*;
diff --git a/crypto/rsa/pkcs1.ha b/crypto/rsa/pkcs1.ha
index ac963362..d6428ced 100644
--- a/crypto/rsa/pkcs1.ha
+++ b/crypto/rsa/pkcs1.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Armin Preiml <apreiml@strohwolke.at>

use bufio;
use crypto::sha1;
use crypto::sha256;
diff --git a/crypto/salsa/+test.ha b/crypto/salsa/+test.ha
index 5689b9c6..1ae28d5d 100644
--- a/crypto/salsa/+test.ha
+++ b/crypto/salsa/+test.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021 Armin Preiml <apreiml@strohwolke.at>

use bytes;
use crypto::cipher;
use io;
diff --git a/crypto/salsa/salsa20.ha b/crypto/salsa/salsa20.ha
index 688a1643..18426f8c 100644
--- a/crypto/salsa/salsa20.ha
+++ b/crypto/salsa/salsa20.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021-2022 Armin Preiml <apreiml@strohwolke.at>

use bytes;
use crypto::cipher;
use crypto::math::{rotl32, xor};
diff --git a/crypto/sha1/+test.ha b/crypto/sha1/+test.ha
index 5770e2c6..658682bf 100644
--- a/crypto/sha1/+test.ha
+++ b/crypto/sha1/+test.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Kiëd Llaentenn <kiedtl@tilde.team>
// (c) 2021 Thomas Bracht Laumann Jespersen <t@laumann.xyz>

use fmt;
use hash;
use strings;
diff --git a/crypto/sha1/sha1.ha b/crypto/sha1/sha1.ha
index 5df7fd7a..8a5fd2a4 100644
--- a/crypto/sha1/sha1.ha
+++ b/crypto/sha1/sha1.ha
@@ -1,8 +1,5 @@
// License: MPL-2.0
// (c) 2021-2022 Armin Preiml <apreiml@strohwolke.at>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Kiëd Llaentenn <kiedtl@tilde.team>
// (c) 2021 Thomas Bracht Laumann Jespersen <t@laumann.xyz>

use hash;
use io;
use bytes;
diff --git a/crypto/sha256/+test.ha b/crypto/sha256/+test.ha
index 935388c0..b2799f40 100644
--- a/crypto/sha256/+test.ha
+++ b/crypto/sha256/+test.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Kiëd Llaentenn <kiedtl@tilde.team>
// (c) 2021 Thomas Bracht Laumann Jespersen <t@laumann.xyz>

use fmt;
use hash;
use strings;
diff --git a/crypto/sha256/sha256.ha b/crypto/sha256/sha256.ha
index 4ee3aedc..6ccd0c85 100644
--- a/crypto/sha256/sha256.ha
+++ b/crypto/sha256/sha256.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2022 Armin Preiml <apreiml@strohwolke.at>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Kiëd Llaentenn <kiedtl@tilde.team>

use crypto::math;
use bytes;
use endian;
diff --git a/crypto/sha512/+test.ha b/crypto/sha512/+test.ha
index 0a63c93d..3c1a10f4 100644
--- a/crypto/sha512/+test.ha
+++ b/crypto/sha512/+test.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Kiëd Llaentenn <kiedtl@tilde.team>
// (c) 2021 Thomas Bracht Laumann Jespersen <t@laumann.xyz>

use fmt;
use hash;
use strings;
diff --git a/crypto/sha512/sha512.ha b/crypto/sha512/sha512.ha
index c7a75a4c..a44b6d33 100644
--- a/crypto/sha512/sha512.ha
+++ b/crypto/sha512/sha512.ha
@@ -1,9 +1,5 @@
// License: MPL-2.0
// (c) 2021-2022 Armin Preiml <apreiml@strohwolke.at>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Kiëd Llaentenn <kiedtl@tilde.team>
// (c) 2021 Thomas Bracht Laumann Jespersen <t@laumann.xyz>

use bytes;
use crypto::math;
use endian;
diff --git a/crypto/x25519/+test.ha b/crypto/x25519/+test.ha
index 3107736e..8ae9338f 100644
--- a/crypto/x25519/+test.ha
+++ b/crypto/x25519/+test.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Armin Preiml <apreiml@strohwolke.at>

use bytes;
use encoding::hex;
use crypto::random;
diff --git a/crypto/x25519/x25519.ha b/crypto/x25519/x25519.ha
index 4cc6de1d..4adddd71 100644
--- a/crypto/x25519/x25519.ha
+++ b/crypto/x25519/x25519.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Armin Preiml <apreiml@strohwolke.at>

use crypto::curve25519;

// Type for private, public or shared keys.
diff --git a/dirs/xdg.ha b/dirs/xdg.ha
index 0ceff666..dd671beb 100644
--- a/dirs/xdg.ha
+++ b/dirs/xdg.ha
@@ -1,9 +1,5 @@
// License: MPL-2.0
// (c) 2021-2022 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2022 Sebastian <sebastian@sebsite.pw>
// (c) 2022 Jon Eskin <eskinjp@gmail.com>
// (c) 2022 Simon Ser <contact@emersion.fr>

use errors;
use fmt;
use fs;
diff --git a/encoding/base32/base32.ha b/encoding/base32/base32.ha
index bc43a9cd..0019cbbd 100644
--- a/encoding/base32/base32.ha
+++ b/encoding/base32/base32.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Ajay R <ar324@protonmail.com>

use ascii;
use bytes;
use errors;
diff --git a/encoding/base64/base64.ha b/encoding/base64/base64.ha
index b091851c..777fd7c5 100644
--- a/encoding/base64/base64.ha
+++ b/encoding/base64/base64.ha
@@ -1,10 +1,5 @@
// License: MPL-2.0
// (c) 2022 Ajay R <ar324@protonmail.com>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Steven Guikal <void@fluix.one>
// (c) 2021 Thomas Bracht Laumann Jespersen <t@laumann.xyz>
// (c) 2023 Armin Preiml <apreiml@strohwolke.at>

use ascii;
use bytes;
use errors;
diff --git a/encoding/hex/hex.ha b/encoding/hex/hex.ha
index 8e81d6fb..e74e29c7 100644
--- a/encoding/hex/hex.ha
+++ b/encoding/hex/hex.ha
@@ -1,8 +1,5 @@
// License: MPL-2.0
// (c) 2021-2022 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2022 Sebastian <sebastian@sebsite.pw>

use ascii;
use bytes;
use errors;
diff --git a/encoding/pem/+test.ha b/encoding/pem/+test.ha
index dd7f1a39..cb483418 100644
--- a/encoding/pem/+test.ha
+++ b/encoding/pem/+test.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Drew DeVault <sir@cmpwn.com>

use bytes;
use io;
use fmt;
diff --git a/encoding/pem/pem.ha b/encoding/pem/pem.ha
index e1176de1..3ff65098 100644
--- a/encoding/pem/pem.ha
+++ b/encoding/pem/pem.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Drew DeVault <sir@cmpwn.com>

use ascii;
use bufio;
use encoding::base64;
diff --git a/encoding/utf8/decode.ha b/encoding/utf8/decode.ha
index 258bb9f7..b1953bca 100644
--- a/encoding/utf8/decode.ha
+++ b/encoding/utf8/decode.ha
@@ -1,7 +1,4 @@
// License: MPL-2.0
// (c) 2021 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

fn toutf8(in: str) []u8 = *(&in: *[]u8);

diff --git a/encoding/utf8/decodetable.ha b/encoding/utf8/decodetable.ha
index e575c127..131def76 100644
--- a/encoding/utf8/decodetable.ha
+++ b/encoding/utf8/decodetable.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

let table: [8][256]i8 = [
        [ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
          0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
diff --git a/encoding/utf8/encode.ha b/encoding/utf8/encode.ha
index a8a8a968..8f27a500 100644
--- a/encoding/utf8/encode.ha
+++ b/encoding/utf8/encode.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

// Encodes a rune as UTF-8 and returns the result as a slice. The return value
// is statically allocated, and will not be consistent after subsequent calls to
diff --git a/encoding/utf8/rune.ha b/encoding/utf8/rune.ha
index ca5337c6..34a95644 100644
--- a/encoding/utf8/rune.ha
+++ b/encoding/utf8/rune.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

type rsize = struct {
	mask: u8,
diff --git a/endian/big.ha b/endian/big.ha
index 9766cc89..ff2dd8a4 100644
--- a/endian/big.ha
+++ b/endian/big.ha
@@ -1,6 +1,4 @@
// License: MPL-2.0
// (c) 2021 Armin Weigl <tb46305@gmail.com>
// (c) 2021 Drew DeVault <sir@cmpwn.com>

// Reads a u16 from a buffer in big-endian order.
export fn begetu16(buf: []u8) u16 = {
diff --git a/endian/endian.ha b/endian/endian.ha
index d910de44..86b04415 100644
--- a/endian/endian.ha
+++ b/endian/endian.ha
@@ -1,6 +1,4 @@
// License: MPL-2.0
// (c) 2021 Armin Weigl <tb46305@gmail.com>
// (c) 2021 Drew DeVault <sir@cmpwn.com>

// The set of functions used for endian-aware encoding.
export type endian = struct {
diff --git a/endian/host+aarch64.ha b/endian/host+aarch64.ha
index 96c20712..b1e935ee 100644
--- a/endian/host+aarch64.ha
+++ b/endian/host+aarch64.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

// The [[endian]] functions which map to the host architecture.
export const host: *endian = &little;
diff --git a/endian/host+riscv64.ha b/endian/host+riscv64.ha
index 96c20712..b1e935ee 100644
--- a/endian/host+riscv64.ha
+++ b/endian/host+riscv64.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

// The [[endian]] functions which map to the host architecture.
export const host: *endian = &little;
diff --git a/endian/host+x86_64.ha b/endian/host+x86_64.ha
index 96c20712..b1e935ee 100644
--- a/endian/host+x86_64.ha
+++ b/endian/host+x86_64.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

// The [[endian]] functions which map to the host architecture.
export const host: *endian = &little;
diff --git a/endian/little.ha b/endian/little.ha
index 9bcc4482..80a4bd86 100644
--- a/endian/little.ha
+++ b/endian/little.ha
@@ -1,6 +1,4 @@
// License: MPL-2.0
// (c) 2021 Armin Weigl <tb46305@gmail.com>
// (c) 2021 Drew DeVault <sir@cmpwn.com>

// Reads a u16 from a buffer in little-endian order.
export fn legetu16(buf: []u8) u16 = {
diff --git a/endian/network.ha b/endian/network.ha
index 6b3e57d2..cbf0189b 100644
--- a/endian/network.ha
+++ b/endian/network.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

// Converts a u16 from host order to network order.
export fn htonu16(in: u16) u16 = {
diff --git a/errors/common.ha b/errors/common.ha
index 2fdeee8c..cad53684 100644
--- a/errors/common.ha
+++ b/errors/common.ha
@@ -1,7 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Noah Altunian <nbaltunian@gmail.com>

// The requested resource is not available.
export type busy = !void;
diff --git a/errors/opaque.ha b/errors/opaque.ha
index ebde4fb8..ceedc0cc 100644
--- a/errors/opaque.ha
+++ b/errors/opaque.ha
@@ -1,6 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

// An "opaque" error is used as a portable error type for an underlying error
// which is implementation-specific. It provides a function which can be used to
diff --git a/errors/rt.ha b/errors/rt.ha
index 8cda13cc..69039679 100644
--- a/errors/rt.ha
+++ b/errors/rt.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use rt;

// Wraps an [[rt::errno]] to produce an [[errors::opaque_]]. This is a non-portable
diff --git a/errors/string.ha b/errors/string.ha
index ecb8c2ad..b0167c7d 100644
--- a/errors/string.ha
+++ b/errors/string.ha
@@ -1,6 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

// Converts an [[error]] into a human-friendly string representation.
//
diff --git a/fmt/fmt.ha b/fmt/fmt.ha
index 1bffdb24..635a6ced 100644
--- a/fmt/fmt.ha
+++ b/fmt/fmt.ha
@@ -1,10 +1,5 @@
// License: MPL-2.0
// (c) 2022 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Andri Yngvason <andri@yngvason.is>
// (c) 2021-2022 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021 Byron Torres <b@torresjrjr.com>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use ascii;
use encoding::utf8;
use io;
diff --git a/fnmatch/+test.ha b/fnmatch/+test.ha
index 488d96e2..89f045bd 100644
--- a/fnmatch/+test.ha
+++ b/fnmatch/+test.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Bor Grošelj Simić <bor.groseljsimic@telemach.net>

type testcase = (str, str, bool, []flag);

diff --git a/fnmatch/fnmatch.ha b/fnmatch/fnmatch.ha
index 999558ba..ddd3f0ee 100644
--- a/fnmatch/fnmatch.ha
+++ b/fnmatch/fnmatch.ha
@@ -1,10 +1,5 @@
// License: MPL-2.0
// (c) 2021 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Miccah Castorina <contact@miccah.io>
// (c) 2021 Thomas Bracht Laumann Jespersen <t@laumann.xyz>

use ascii;
use errors;
use strings;
diff --git a/format/elf/arch+aarch64.ha b/format/elf/arch+aarch64.ha
index 3bb4d40d..13eaae0a 100644
--- a/format/elf/arch+aarch64.ha
+++ b/format/elf/arch+aarch64.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

// The machine (architecture) of the target.
export def TARGET_MACHINE: elf_machine = elf_machine::AARCH64;
diff --git a/format/elf/arch+riscv64.ha b/format/elf/arch+riscv64.ha
index 2e72d9be..09cd9694 100644
--- a/format/elf/arch+riscv64.ha
+++ b/format/elf/arch+riscv64.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

// The machine (architecture) of the target.
export def TARGET_MACHINE: elf_machine = elf_machine::RISCV;
diff --git a/format/elf/arch+x86_64.ha b/format/elf/arch+x86_64.ha
index 5cfb0195..2a45c7f9 100644
--- a/format/elf/arch+x86_64.ha
+++ b/format/elf/arch+x86_64.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

// The machine (architecture) of the target.
export def TARGET_MACHINE: elf_machine = elf_machine::X86_64;
diff --git a/format/elf/platform+freebsd.ha b/format/elf/platform+freebsd.ha
index 6364f508..cad3b939 100644
--- a/format/elf/platform+freebsd.ha
+++ b/format/elf/platform+freebsd.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

// The ABI of the target.
export def TARGET_ABI: ident_abi = ident_abi::SYSV;
diff --git a/format/elf/platform+linux.ha b/format/elf/platform+linux.ha
index 6364f508..cad3b939 100644
--- a/format/elf/platform+linux.ha
+++ b/format/elf/platform+linux.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

// The ABI of the target.
export def TARGET_ABI: ident_abi = ident_abi::SYSV;
diff --git a/format/elf/types.ha b/format/elf/types.ha
index 41ecdb4a..ad306d6c 100644
--- a/format/elf/types.ha
+++ b/format/elf/types.ha
@@ -1,7 +1,4 @@
// License: MPL-2.0
// (c) 2021-2022 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Mykyta Holubakha <hilobakho@gmail.com>

// TODO:
// - Flesh out ELF32 structures
diff --git a/format/ini/+test.ha b/format/ini/+test.ha
index 31488e57..fb1ae00e 100644
--- a/format/ini/+test.ha
+++ b/format/ini/+test.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021-2022 Alexey Yerin <yyp@disroot.org>

use io;
use memio;
use strings;
diff --git a/format/ini/scan.ha b/format/ini/scan.ha
index d9480022..cec383b5 100644
--- a/format/ini/scan.ha
+++ b/format/ini/scan.ha
@@ -1,8 +1,5 @@
// License: MPL-2.0
// (c) 2021 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Thomas Bracht Laumann Jespersen <t@laumann.xyz>

use bufio;
use encoding::utf8;
use fmt;
diff --git a/format/ini/types.ha b/format/ini/types.ha
index d67ed0de..b458cf6b 100644
--- a/format/ini/types.ha
+++ b/format/ini/types.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use encoding::utf8;
use fmt;
use io;
diff --git a/format/tar/reader.ha b/format/tar/reader.ha
index d942e81d..5fe05199 100644
--- a/format/tar/reader.ha
+++ b/format/tar/reader.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Drew DeVault <sir@cmpwn.com>

use bytes;
use endian;
use io;
diff --git a/format/tar/types.ha b/format/tar/types.ha
index 025008e6..d8b68d1b 100644
--- a/format/tar/types.ha
+++ b/format/tar/types.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Drew DeVault <sir@cmpwn.com>

use io;

// The size of each block in a tar file.
diff --git a/fs/fs.ha b/fs/fs.ha
index d5a7b9a6..bb64bddd 100644
--- a/fs/fs.ha
+++ b/fs/fs.ha
@@ -1,11 +1,5 @@
// License: MPL-2.0
// (c) 2021 Alexey Yerin <yyp@disroot.org>
// (c) 2021-2022 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021-2022 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Thomas Bracht Laumann Jespersen <t@laumann.xyz>
// (c) 2021 Umar Getagazov <umar@handlerug.me>
// (c) 2022 Jon Eskin <eskinjp@gmail.com>

use errors;
use io;
use path;
diff --git a/fs/types.ha b/fs/types.ha
index e12a48b4..33c63db3 100644
--- a/fs/types.ha
+++ b/fs/types.ha
@@ -1,8 +1,5 @@
// License: MPL-2.0
// (c) 2021 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2022 Jon Eskin <eskinjp@gmail.com>

use errors;
use io;
use path;
diff --git a/fs/util.ha b/fs/util.ha
index 45411ae8..982d4f6f 100644
--- a/fs/util.ha
+++ b/fs/util.ha
@@ -1,8 +1,5 @@
// License: MPL-2.0
// (c) 2022 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021-2022 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Thomas Bracht Laumann Jespersen <t@laumann.xyz>

use io;
use path;
use strings;
diff --git a/getopt/getopts.ha b/getopt/getopts.ha
index 573936d8..ad102c04 100644
--- a/getopt/getopts.ha
+++ b/getopt/getopts.ha
@@ -1,10 +1,5 @@
// License: MPL-2.0
// (c) 2021 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Byron Torres <b@torresjrjr.com>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Jonathan Halmen <slowjo@halmen.xyz>
// (c) 2021 Thomas Bracht Laumann Jespersen <t@laumann.xyz>

use fmt;
use io;
use os;
diff --git a/glob/+test.ha b/glob/+test.ha
index 5a5eea2a..bce0b8e3 100644
--- a/glob/+test.ha
+++ b/glob/+test.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use fnmatch;
use strings;

diff --git a/glob/glob.ha b/glob/glob.ha
index 36d40540..de28610c 100644
--- a/glob/glob.ha
+++ b/glob/glob.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Yasumasa Tada <ytada@spartan.dev>

use fnmatch;
use fs;
use io;
diff --git a/hare/ast/decl.ha b/hare/ast/decl.ha
index 955639d9..7884dff2 100644
--- a/hare/ast/decl.ha
+++ b/hare/ast/decl.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use hare::lex;

// A constant declaration.
diff --git a/hare/ast/expr.ha b/hare/ast/expr.ha
index b7d6d61a..afbdbabf 100644
--- a/hare/ast/expr.ha
+++ b/hare/ast/expr.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2022 Sebastian <sebastian@sebsite.pw>

use hare::lex;

// An identifier access expression.
diff --git a/hare/ast/ident.ha b/hare/ast/ident.ha
index bfe3f211..f75b937d 100644
--- a/hare/ast/ident.ha
+++ b/hare/ast/ident.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2022 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use strings;

// Identifies a single object, e.g. foo::bar::baz.
diff --git a/hare/ast/import.ha b/hare/ast/import.ha
index a5dbd8c6..380eb8be 100644
--- a/hare/ast/import.ha
+++ b/hare/ast/import.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use hare::lex;

// Variants of the import statement
diff --git a/hare/ast/type.ha b/hare/ast/type.ha
index e3c2ee53..1d4fd967 100644
--- a/hare/ast/type.ha
+++ b/hare/ast/type.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use hare::lex;

// A type alias.
diff --git a/hare/ast/unit.ha b/hare/ast/unit.ha
index 3bed943f..c2617102 100644
--- a/hare/ast/unit.ha
+++ b/hare/ast/unit.ha
@@ -1,6 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

// A sub-unit, typically representing a single source file.
export type subunit = struct {
diff --git a/hare/lex/+test.ha b/hare/lex/+test.ha
index 05aaab3d..ed241155 100644
--- a/hare/lex/+test.ha
+++ b/hare/lex/+test.ha
@@ -1,10 +1,5 @@
// License: MPL-2.0
// (c) 2022 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Armin Weigl <tb46305@gmail.com>
// (c) 2021 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Sudipto Mallick <smlckz@disroot.org>

use fmt;
use io;
use io::{mode};
diff --git a/hare/lex/lex.ha b/hare/lex/lex.ha
index e3f03255..9dbe5f7f 100644
--- a/hare/lex/lex.ha
+++ b/hare/lex/lex.ha
@@ -1,10 +1,5 @@
// License: MPL-2.0
// (c) 2021-2022 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Armin Weigl <tb46305@gmail.com>
// (c) 2021 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Sudipto Mallick <smlckz@disroot.org>

use ascii;
use bufio;
use encoding::utf8;
diff --git a/hare/lex/token.ha b/hare/lex/token.ha
index 26fff35d..9febfc3a 100644
--- a/hare/lex/token.ha
+++ b/hare/lex/token.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use encoding::utf8;
use strings;

diff --git a/hare/module/cache.ha b/hare/module/cache.ha
index 8ea0c259..505722a3 100644
--- a/hare/module/cache.ha
+++ b/hare/module/cache.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use path;

// Gets the cache directory for a given module, given the value of 'harecache'.
diff --git a/hare/module/deps.ha b/hare/module/deps.ha
index 82fe4726..0c2bd2e5 100644
--- a/hare/module/deps.ha
+++ b/hare/module/deps.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use bufio;
use fmt;
use fs;
diff --git a/hare/module/format.ha b/hare/module/format.ha
index 9b5ef035..ef09a983 100644
--- a/hare/module/format.ha
+++ b/hare/module/format.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use time::date;
use fmt;
use hare::unparse;
diff --git a/hare/module/srcs.ha b/hare/module/srcs.ha
index 07e093a1..0bc365e6 100644
--- a/hare/module/srcs.ha
+++ b/hare/module/srcs.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use bytes;
use fs;
use hare::ast;
diff --git a/hare/module/types.ha b/hare/module/types.ha
index c7e3bbbd..d625469e 100644
--- a/hare/module/types.ha
+++ b/hare/module/types.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use encoding::utf8;
use fs;
use hare::ast;
diff --git a/hare/module/util.ha b/hare/module/util.ha
index 0849d351..0904075b 100644
--- a/hare/module/util.ha
+++ b/hare/module/util.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use ascii;
use fs;
use os;
diff --git a/hare/parse/+test/expr_test.ha b/hare/parse/+test/expr_test.ha
index 84e47d7b..4a8a7f2d 100644
--- a/hare/parse/+test/expr_test.ha
+++ b/hare/parse/+test/expr_test.ha
@@ -1,9 +1,4 @@
// License: MPL-2.0
// (c) 2021 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2022 Sebastian <sebastian@sebsite.pw>

@test fn assignment() void = {
	roundtrip("export fn main() void = {
diff --git a/hare/parse/+test/ident_test.ha b/hare/parse/+test/ident_test.ha
index 77dc272d..1d10f3b6 100644
--- a/hare/parse/+test/ident_test.ha
+++ b/hare/parse/+test/ident_test.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2022 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use hare::ast;
use hare::lex;
use hare::lex::{ltok};
diff --git a/hare/parse/+test/loc.ha b/hare/parse/+test/loc.ha
index 98888c5e..26a19429 100644
--- a/hare/parse/+test/loc.ha
+++ b/hare/parse/+test/loc.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2022 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use encoding::utf8;
use fmt;
use hare::ast;
diff --git a/hare/parse/+test/roundtrip.ha b/hare/parse/+test/roundtrip.ha
index e1f93b53..1d54a722 100644
--- a/hare/parse/+test/roundtrip.ha
+++ b/hare/parse/+test/roundtrip.ha
@@ -1,8 +1,5 @@
// License: MPL-2.0
// (c) 2022 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2022 Sebastian <sebastian@sebsite.pw>

use fmt;
use hare::ast;
use hare::lex;
diff --git a/hare/parse/+test/types.ha b/hare/parse/+test/types.ha
index 073c9276..6604b37f 100644
--- a/hare/parse/+test/types.ha
+++ b/hare/parse/+test/types.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

@test fn struct_union() void = {
	roundtrip("export type foo = struct {
diff --git a/hare/parse/+test/unit_test.ha b/hare/parse/+test/unit_test.ha
index 27310da7..49d15c01 100644
--- a/hare/parse/+test/unit_test.ha
+++ b/hare/parse/+test/unit_test.ha
@@ -1,9 +1,5 @@
// License: MPL-2.0
// (c) 2022 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Armin Weigl <tb46305@gmail.com>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2022 Sebastian <sebastian@sebsite.pw>

use hare::ast;
use hare::lex;
use io::{mode};
diff --git a/hare/parse/decl.ha b/hare/parse/decl.ha
index fca5074e..2608eb85 100644
--- a/hare/parse/decl.ha
+++ b/hare/parse/decl.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use ascii;
use hare::ast;
use hare::lex::{ltok};
diff --git a/hare/parse/doc/doc.ha b/hare/parse/doc/doc.ha
index f9f4c732..73658bb7 100644
--- a/hare/parse/doc/doc.ha
+++ b/hare/parse/doc/doc.ha
@@ -1,9 +1,5 @@
// License: GPL-3.0
// (c) 2022 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Thomas Bracht Laumann Jespersen <t@laumann.xyz>
// (c) 2022 Umar Getagazov <umar@handlerug.me>

use ascii;
use bufio;
use encoding::utf8;
diff --git a/hare/parse/expr.ha b/hare/parse/expr.ha
index 9314a91c..1b896018 100644
--- a/hare/parse/expr.ha
+++ b/hare/parse/expr.ha
@@ -1,9 +1,5 @@
// License: MPL-2.0
// (c) 2021 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2022 Sebastian <sebastian@sebsite.pw>

use hare::ast;
use hare::lex::{ltok};
use hare::lex;
diff --git a/hare/parse/ident.ha b/hare/parse/ident.ha
index 010ca537..ac316576 100644
--- a/hare/parse/ident.ha
+++ b/hare/parse/ident.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2022 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use hare::ast;
use hare::lex::{ltok};
use hare::lex;
diff --git a/hare/parse/import.ha b/hare/parse/import.ha
index b2b6ba3a..d0381abd 100644
--- a/hare/parse/import.ha
+++ b/hare/parse/import.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use hare::ast;
use hare::lex;
use hare::lex::{ltok};
diff --git a/hare/parse/parse.ha b/hare/parse/parse.ha
index 18a6e823..f1f16c6e 100644
--- a/hare/parse/parse.ha
+++ b/hare/parse/parse.ha
@@ -1,8 +1,5 @@
// License: MPL-2.0
// (c) 2022 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Byron Torres <b@torresjrjr.com>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use fmt;
use hare::lex::{ltok};
use hare::lex;
diff --git a/hare/parse/type.ha b/hare/parse/type.ha
index 0eec0d3b..7d9d3c22 100644
--- a/hare/parse/type.ha
+++ b/hare/parse/type.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use hare::ast;
use hare::ast::{builtin_type};
use hare::lex;
diff --git a/hare/parse/unit.ha b/hare/parse/unit.ha
index cd9e8b31..9c0e93f3 100644
--- a/hare/parse/unit.ha
+++ b/hare/parse/unit.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use hare::ast;
use hare::lex;

diff --git a/hare/types/+aarch64/writesize.ha b/hare/types/+aarch64/writesize.ha
index 02ddf4cc..b560aabe 100644
--- a/hare/types/+aarch64/writesize.ha
+++ b/hare/types/+aarch64/writesize.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use hash;

fn writesize(h: *hash::hash, u: size) void = write64(h, u);
diff --git a/hare/types/+riscv64/writesize.ha b/hare/types/+riscv64/writesize.ha
index 02ddf4cc..b560aabe 100644
--- a/hare/types/+riscv64/writesize.ha
+++ b/hare/types/+riscv64/writesize.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use hash;

fn writesize(h: *hash::hash, u: size) void = write64(h, u);
diff --git a/hare/types/+test.ha b/hare/types/+test.ha
index a40d2b69..d80245db 100644
--- a/hare/types/+test.ha
+++ b/hare/types/+test.ha
@@ -1,9 +1,5 @@
// License: MPL-2.0
// (c) 2022 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2022 Sebastian <sebastian@sebsite.pw>

use fmt;
use hare::ast;
use hare::lex;
diff --git a/hare/types/+x86_64/writesize.ha b/hare/types/+x86_64/writesize.ha
index 02ddf4cc..b560aabe 100644
--- a/hare/types/+x86_64/writesize.ha
+++ b/hare/types/+x86_64/writesize.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use hash;

fn writesize(h: *hash::hash, u: size) void = write64(h, u);
diff --git a/hare/types/arch.ha b/hare/types/arch.ha
index 0ac28267..67fdf911 100644
--- a/hare/types/arch.ha
+++ b/hare/types/arch.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

// Configuration for a specific architecture.
export type arch = struct {
diff --git a/hare/types/builtins.ha b/hare/types/builtins.ha
index f515c64a..cc1bb1fa 100644
--- a/hare/types/builtins.ha
+++ b/hare/types/builtins.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

// IDs are precomputed, but a test verifies that they match what they would be
// if computed at runtime
diff --git a/hare/types/class.ha b/hare/types/class.ha
index 4909a573..2c9ba4aa 100644
--- a/hare/types/class.ha
+++ b/hare/types/class.ha
@@ -1,6 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

// Returns true if the given type is a signed type.
export fn is_signed(ty: const *_type) bool = {
diff --git a/hare/types/hash.ha b/hare/types/hash.ha
index 5df0f580..c63c99fe 100644
--- a/hare/types/hash.ha
+++ b/hare/types/hash.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use endian;
use hash::fnv;
use hash;
diff --git a/hare/types/lookup.ha b/hare/types/lookup.ha
index f33c24b0..fda3d1b9 100644
--- a/hare/types/lookup.ha
+++ b/hare/types/lookup.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use hare::ast;

// Unwraps a type which may be aliased and returns the underlying type.
diff --git a/hare/types/store.ha b/hare/types/store.ha
index 5db42276..621fc7e4 100644
--- a/hare/types/store.ha
+++ b/hare/types/store.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use errors;
use hare::ast;
use sort;
diff --git a/hare/types/types.ha b/hare/types/types.ha
index 88c6cc99..23c1504f 100644
--- a/hare/types/types.ha
+++ b/hare/types/types.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use hare::ast;

// A type alias.
diff --git a/hare/unit/+test.ha b/hare/unit/+test.ha
index 045fa2e3..e268673c 100644
--- a/hare/unit/+test.ha
+++ b/hare/unit/+test.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021-2022 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use hare::ast;
use hare::lex;
use hare::parse;
diff --git a/hare/unit/check.ha b/hare/unit/check.ha
index f83ff15b..ca255113 100644
--- a/hare/unit/check.ha
+++ b/hare/unit/check.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use hare::ast;
use hare::types;

diff --git a/hare/unit/context.ha b/hare/unit/context.ha
index 7f1744ee..e62bd392 100644
--- a/hare/unit/context.ha
+++ b/hare/unit/context.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use hare::types;

type context = struct {
diff --git a/hare/unit/errors.ha b/hare/unit/errors.ha
index aa2df5f5..3617b996 100644
--- a/hare/unit/errors.ha
+++ b/hare/unit/errors.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use hare::types;

// TODO: More errors
diff --git a/hare/unit/expr.ha b/hare/unit/expr.ha
index ea8dd75b..420d8efc 100644
--- a/hare/unit/expr.ha
+++ b/hare/unit/expr.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use hare::ast;
use hare::lex;
use hare::types;
diff --git a/hare/unit/process.ha b/hare/unit/process.ha
index 34b93041..5c463d50 100644
--- a/hare/unit/process.ha
+++ b/hare/unit/process.ha
@@ -1,9 +1,5 @@
// License: MPL-2.0
// (c) 2021 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2022 Sebastian <sebastian@sebsite.pw>

use hare::ast;
use hare::lex;
use hare::types;
diff --git a/hare/unit/scan.ha b/hare/unit/scan.ha
index 5a3fbb4b..ab4c6b40 100644
--- a/hare/unit/scan.ha
+++ b/hare/unit/scan.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use hare::ast;
use hare::types;

diff --git a/hare/unit/scope.ha b/hare/unit/scope.ha
index e4ea28a1..94b0af0e 100644
--- a/hare/unit/scope.ha
+++ b/hare/unit/scope.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use hare::ast;
use hare::types;
use hash::fnv;
diff --git a/hare/unit/unit.ha b/hare/unit/unit.ha
index dca71736..8971377d 100644
--- a/hare/unit/unit.ha
+++ b/hare/unit/unit.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use hare::ast;
use hare::lex;
use hare::types;
diff --git a/hare/unparse/decl.ha b/hare/unparse/decl.ha
index 1b34ce23..36ea1f25 100644
--- a/hare/unparse/decl.ha
+++ b/hare/unparse/decl.ha
@@ -1,8 +1,5 @@
// License: MPL-2.0
// (c) 2021-2022 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2022 Sebastian <sebastian@sebsite.pw>

use io;
use fmt;
use hare::ast;
diff --git a/hare/unparse/expr.ha b/hare/unparse/expr.ha
index 272dcb3f..e0a39a6f 100644
--- a/hare/unparse/expr.ha
+++ b/hare/unparse/expr.ha
@@ -1,8 +1,5 @@
// License: MPL-2.0
// (c) 2021 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2022 Sebastian <sebastian@sebsite.pw>

use io;
use fmt;
use hare::ast;
diff --git a/hare/unparse/ident.ha b/hare/unparse/ident.ha
index 8438b8aa..8a45b08a 100644
--- a/hare/unparse/ident.ha
+++ b/hare/unparse/ident.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2022 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use fmt;
use hare::ast;
use io;
diff --git a/hare/unparse/import.ha b/hare/unparse/import.ha
index 983bf2cf..420246c8 100644
--- a/hare/unparse/import.ha
+++ b/hare/unparse/import.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2022 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use fmt;
use io;
use hare::ast;
diff --git a/hare/unparse/type.ha b/hare/unparse/type.ha
index 2dae8cc9..7db4ef1b 100644
--- a/hare/unparse/type.ha
+++ b/hare/unparse/type.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021-2022 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use fmt;
use io;
use hare::ast;
diff --git a/hare/unparse/unit.ha b/hare/unparse/unit.ha
index a88a04cc..ed7ef844 100644
--- a/hare/unparse/unit.ha
+++ b/hare/unparse/unit.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use io;
use fmt;
use hare::ast;
diff --git a/hare/unparse/util.ha b/hare/unparse/util.ha
index 086304b7..28c5f536 100644
--- a/hare/unparse/util.ha
+++ b/hare/unparse/util.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use io;
use fmt;

diff --git a/hash/adler32/adler32.ha b/hash/adler32/adler32.ha
index be2bb18c..c7a5cdb1 100644
--- a/hash/adler32/adler32.ha
+++ b/hash/adler32/adler32.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Kiëd Llaentenn <kiedtl@tilde.team>

use endian;
use hash;
use io;
diff --git a/hash/crc16/crc16.ha b/hash/crc16/crc16.ha
index c2a608bf..a1d9f32f 100644
--- a/hash/crc16/crc16.ha
+++ b/hash/crc16/crc16.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Kiëd Llaentenn <kiedtl@tilde.team>

use endian;
use hash;
use io;
diff --git a/hash/crc32/crc32.ha b/hash/crc32/crc32.ha
index dc2951d3..ab0ff88d 100644
--- a/hash/crc32/crc32.ha
+++ b/hash/crc32/crc32.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Kiëd Llaentenn <kiedtl@tilde.team>

use endian;
use hash;
use io;
diff --git a/hash/crc64/crc64.ha b/hash/crc64/crc64.ha
index 6f05282b..77ffea0a 100644
--- a/hash/crc64/crc64.ha
+++ b/hash/crc64/crc64.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Kiëd Llaentenn <kiedtl@tilde.team>

use endian;
use hash;
use io;
diff --git a/hash/fnv/+aarch64.ha b/hash/fnv/+aarch64.ha
index 1340a8ad..e565fb7a 100644
--- a/hash/fnv/+aarch64.ha
+++ b/hash/fnv/+aarch64.ha
@@ -1,6 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2022 Sebastian <sebastian@sebsite.pw>

// Hashes a string, returning a size key, for use in a hash map.
export fn string(s: str) size = string64(s): size;
diff --git a/hash/fnv/+riscv64.ha b/hash/fnv/+riscv64.ha
index 1340a8ad..e565fb7a 100644
--- a/hash/fnv/+riscv64.ha
+++ b/hash/fnv/+riscv64.ha
@@ -1,6 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2022 Sebastian <sebastian@sebsite.pw>

// Hashes a string, returning a size key, for use in a hash map.
export fn string(s: str) size = string64(s): size;
diff --git a/hash/fnv/+x86_64.ha b/hash/fnv/+x86_64.ha
index 1340a8ad..e565fb7a 100644
--- a/hash/fnv/+x86_64.ha
+++ b/hash/fnv/+x86_64.ha
@@ -1,6 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2022 Sebastian <sebastian@sebsite.pw>

// Hashes a string, returning a size key, for use in a hash map.
export fn string(s: str) size = string64(s): size;
diff --git a/hash/fnv/fnv.ha b/hash/fnv/fnv.ha
index 0689763c..93f33948 100644
--- a/hash/fnv/fnv.ha
+++ b/hash/fnv/fnv.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Kiëd Llaentenn <kiedtl@tilde.team>

use endian;
use hash;
use io;
diff --git a/hash/hash.ha b/hash/hash.ha
index 722977f4..8047a84d 100644
--- a/hash/hash.ha
+++ b/hash/hash.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021 Armin Preiml <apreiml@strohwolke.at>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Kiëd Llaentenn <kiedtl@tilde.team>

use io;
use fmt;
// TODO: Use a vtable-based approach for this like io::stream
diff --git a/hash/siphash/+test.ha b/hash/siphash/+test.ha
index 0e3fba46..652d1fe1 100644
--- a/hash/siphash/+test.ha
+++ b/hash/siphash/+test.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use endian;
use fmt;
use hash;
diff --git a/hash/siphash/siphash.ha b/hash/siphash/siphash.ha
index 47ed72b4..6932e3d7 100644
--- a/hash/siphash/siphash.ha
+++ b/hash/siphash/siphash.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use crypto::math::{rotl64};
use endian::{leputu64, legetu64};
use hash;
diff --git a/io/+freebsd/mmap.ha b/io/+freebsd/mmap.ha
index f920fc72..4d450725 100644
--- a/io/+freebsd/mmap.ha
+++ b/io/+freebsd/mmap.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use errors;
use rt;

diff --git a/io/+freebsd/platform_file.ha b/io/+freebsd/platform_file.ha
index 900df7a0..c5fa9847 100644
--- a/io/+freebsd/platform_file.ha
+++ b/io/+freebsd/platform_file.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021-2022 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use errors;
use rt;

diff --git a/io/+freebsd/vector.ha b/io/+freebsd/vector.ha
index 78032013..8d473373 100644
--- a/io/+freebsd/vector.ha
+++ b/io/+freebsd/vector.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use errors;
use rt;

diff --git a/io/+linux/mmap.ha b/io/+linux/mmap.ha
index 00253739..21e84183 100644
--- a/io/+linux/mmap.ha
+++ b/io/+linux/mmap.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use errors;
use rt;

diff --git a/io/+linux/platform_file.ha b/io/+linux/platform_file.ha
index 43b8c676..c7995ce3 100644
--- a/io/+linux/platform_file.ha
+++ b/io/+linux/platform_file.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021-2022 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use errors;
use rt;

diff --git a/io/+linux/vector.ha b/io/+linux/vector.ha
index 78032013..8d473373 100644
--- a/io/+linux/vector.ha
+++ b/io/+linux/vector.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use errors;
use rt;

diff --git a/io/+test/limit_test.ha b/io/+test/limit_test.ha
index 267fbefa..1815cefd 100644
--- a/io/+test/limit_test.ha
+++ b/io/+test/limit_test.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021-2022 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021-2022 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use errors;

@test fn limit() void = {
diff --git a/io/+test/stream_test.ha b/io/+test/stream_test.ha
index 86acb4ae..3e9fb7f9 100644
--- a/io/+test/stream_test.ha
+++ b/io/+test/stream_test.ha
@@ -1,6 +1,4 @@
// License: MPL-2.0
// (c) 2021 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021 Drew DeVault <sir@cmpwn.com>

const teststream_vtable: vtable = vtable {
	reader = &teststream_read,
diff --git a/io/arch+aarch64.ha b/io/arch+aarch64.ha
index be5e8902..2afeaacb 100644
--- a/io/arch+aarch64.ha
+++ b/io/arch+aarch64.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Ember Sawady <ecs@d2evs.net>

// An offset for a [[handle]].
export type off = i64;
diff --git a/io/arch+riscv64.ha b/io/arch+riscv64.ha
index cbeb3ed9..2afeaacb 100644
--- a/io/arch+riscv64.ha
+++ b/io/arch+riscv64.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

// An offset for a [[handle]].
export type off = i64;
diff --git a/io/arch+x86_64.ha b/io/arch+x86_64.ha
index be5e8902..2afeaacb 100644
--- a/io/arch+x86_64.ha
+++ b/io/arch+x86_64.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Ember Sawady <ecs@d2evs.net>

// An offset for a [[handle]].
export type off = i64;
diff --git a/io/copy.ha b/io/copy.ha
index 426164da..aa9b5aa2 100644
--- a/io/copy.ha
+++ b/io/copy.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use errors;

// Copies data from one handle into another. If reading from the source file
diff --git a/io/drain.ha b/io/drain.ha
index efa7f5fa..efa103d9 100644
--- a/io/drain.ha
+++ b/io/drain.ha
@@ -1,7 +1,4 @@
// License: MPL-2.0
// (c) 2022 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021-2022 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

// Reads an entire stream into a []u8. The caller must free the return value.
// Note that this function will never return if the handle is infinite.
diff --git a/io/empty.ha b/io/empty.ha
index 81e37bda..6eab509f 100644
--- a/io/empty.ha
+++ b/io/empty.ha
@@ -1,6 +1,4 @@
// License: MPL-2.0
// (c) 2022 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021 Drew DeVault <sir@cmpwn.com>

const _empty_vt: vtable = vtable {
	reader = &empty_read,
diff --git a/io/file.ha b/io/file.ha
index d04bc464..45702559 100644
--- a/io/file.ha
+++ b/io/file.ha
@@ -1,4 +1,5 @@
// License: MPL-2.0

use rt;

// Lock operation to use with [[lock]].
diff --git a/io/handle.ha b/io/handle.ha
index e8002ea6..9bf73a84 100644
--- a/io/handle.ha
+++ b/io/handle.ha
@@ -1,6 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

// TODO: Examine the ABI constraints of [[handle]]. Would it be better to make
// stream an integer representing an internal handle into a stream table? This
diff --git a/io/limit.ha b/io/limit.ha
index 515b6f8b..d0045857 100644
--- a/io/limit.ha
+++ b/io/limit.ha
@@ -1,7 +1,4 @@
// License: MPL-2.0
// (c) 2021 Alexey Yerin <yyp@disroot.org>
// (c) 2021-2022 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021-2022 Drew DeVault <sir@cmpwn.com>

export type limitstream = struct {
	vtable: stream,
diff --git a/io/stream.ha b/io/stream.ha
index caf6fc91..e1bddb42 100644
--- a/io/stream.ha
+++ b/io/stream.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021-2022 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Thomas Bracht Laumann Jespersen <t@laumann.xyz>

use errors;

// A stream is a pointer to a [[vtable]] which allows for user-defined I/O
diff --git a/io/tee.ha b/io/tee.ha
index 099dc41b..aa59da14 100644
--- a/io/tee.ha
+++ b/io/tee.ha
@@ -1,6 +1,4 @@
// License: MPL-2.0
// (c) 2021-2022 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

export type teestream = struct {
	vtable: stream,
diff --git a/io/types.ha b/io/types.ha
index 403a92af..6cb51fc6 100644
--- a/io/types.ha
+++ b/io/types.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use errors;

// Returned by [[readall]] if the I/O handle returned [[EOF]] prior to
diff --git a/io/util.ha b/io/util.ha
index 03c3f363..89916d30 100644
--- a/io/util.ha
+++ b/io/util.ha
@@ -1,7 +1,4 @@
// License: MPL-2.0
// (c) 2022 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

// Reads an entire buffer, perhaps issuing several [[read]] calls to do so. If
// EOF is immediately encountered, it is returned; if [[EOF]] is encountered
diff --git a/io/zero.ha b/io/zero.ha
index 8a6d92bf..46145043 100644
--- a/io/zero.ha
+++ b/io/zero.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2022 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021-2022 Drew DeVault <sir@cmpwn.com>

use bytes;

const _zero_vt: vtable = vtable {
diff --git a/linux/env.ha b/linux/env.ha
index 22c56110..72fb8412 100644
--- a/linux/env.ha
+++ b/linux/env.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021 Mykyta Holubakha <hilobakho@gmail.com>

use format::elf;

// System V auxillary vector for the current process
diff --git a/linux/keyctl/keyctl.ha b/linux/keyctl/keyctl.ha
index a17b9657..4d631ec4 100644
--- a/linux/keyctl/keyctl.ha
+++ b/linux/keyctl/keyctl.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use bytes;
use errors;
use rt;
diff --git a/linux/keyctl/types.ha b/linux/keyctl/types.ha
index 463b4fbf..8cfc84eb 100644
--- a/linux/keyctl/types.ha
+++ b/linux/keyctl/types.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use errors;
use types::c;

diff --git a/linux/start+libc.ha b/linux/start+libc.ha
index a1db4783..ef2e7df3 100644
--- a/linux/start+libc.ha
+++ b/linux/start+libc.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Alexey Yerin <yyp@disroot.org>

use rt;
use format::elf;

diff --git a/linux/start.ha b/linux/start.ha
index 456995c5..ef2e7df3 100644
--- a/linux/start.ha
+++ b/linux/start.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021 Mykyta Holubakha <hilobakho@gmail.com>

use rt;
use format::elf;

diff --git a/linux/timerfd/timerfd.ha b/linux/timerfd/timerfd.ha
index 978ca66a..36739697 100644
--- a/linux/timerfd/timerfd.ha
+++ b/linux/timerfd/timerfd.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Vincent Dagonneau <v@vda.io>

use errors;
use rt;
diff --git a/linux/vdso/vdso.ha b/linux/vdso/vdso.ha
index a37da4b5..86d7af2e 100644
--- a/linux/vdso/vdso.ha
+++ b/linux/vdso/vdso.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Mykyta Holubakha <hilobakho@gmail.com>

use format::elf;
use linux;
use types::c;
diff --git a/log/funcs.ha b/log/funcs.ha
index 2df425ea..612e189c 100644
--- a/log/funcs.ha
+++ b/log/funcs.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use fmt;
use os;

diff --git a/log/global.ha b/log/global.ha
index 9ff0559f..530bb018 100644
--- a/log/global.ha
+++ b/log/global.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use io;
use os;

diff --git a/log/logger.ha b/log/logger.ha
index 8aac3e86..5fb6707c 100644
--- a/log/logger.ha
+++ b/log/logger.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use fmt;
use io;
use os;
diff --git a/log/silent.ha b/log/silent.ha
index fa2d8288..b0cafe22 100644
--- a/log/silent.ha
+++ b/log/silent.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use fmt;

// A logger that does not print any messages.
diff --git a/math/+test/data.ha b/math/+test/data.ha
index cc46c95e..e32fe11a 100644
--- a/math/+test/data.ha
+++ b/math/+test/data.ha
@@ -1,6 +1,4 @@
// License: MPL-2.0
// (c) 2021 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Vlad-Stefan Harbuz <vlad@vladh.net>

// The test data below is based on Go's implementation, and came with the
// following note and copyright notice:
diff --git a/math/+test/floats_test.ha b/math/+test/floats_test.ha
index 7c84a06d..4c66533e 100644
--- a/math/+test/floats_test.ha
+++ b/math/+test/floats_test.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

@test fn floatbits() void = {
	const a: [_]f64 = [INF, -INF, 0.0, 1.0, -1.0, 123456789.0,
		F64_MIN, F64_MIN_NORMAL, F64_MAX_NORMAL];
diff --git a/math/+test/math_test.ha b/math/+test/math_test.ha
index 8bb99a10..9f8ab105 100644
--- a/math/+test/math_test.ha
+++ b/math/+test/math_test.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

@test fn eqwithin() void = {
	assert(eqwithin(1f64, 2f64, 2f64));
	assert(eqwithin(1.0f32, 2.0f32, 2.0f32));
diff --git a/math/+test/trig_test.ha b/math/+test/trig_test.ha
index af7231ce..ee193f5b 100644
--- a/math/+test/trig_test.ha
+++ b/math/+test/trig_test.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

@test fn trig_reduce() void = {
	for (let idx = 0z; idx < 10; idx += 1) {
		const reduced = trig_reduce(TEST_INPUTS[idx]);
diff --git a/math/checked/checked.ha b/math/checked/checked.ha
index 135dce6a..e44ad73c 100644
--- a/math/checked/checked.ha
+++ b/math/checked/checked.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use math;

// Adds 'a' and 'b', returning the result and whether overflow occurred.
diff --git a/math/complex/+test.ha b/math/complex/+test.ha
index 43e34b79..c03f272b 100644
--- a/math/complex/+test.ha
+++ b/math/complex/+test.ha
@@ -1,6 +1,4 @@
// License: MPL-2.0
// (c) 2022 Sebastian <sebastian@sebsite.pw>
// (c) 2022 Carlos Une <une@fastmail.fm>

// The test data below is based on Go's implementation, and came with the
// following note and copyright notice:
diff --git a/math/complex/complex.ha b/math/complex/complex.ha
index 980d2107..445792a7 100644
--- a/math/complex/complex.ha
+++ b/math/complex/complex.ha
@@ -1,6 +1,4 @@
// License: MPL-2.0
// (c) 2022 Sebastian <sebastian@sebsite.pw>
// (c) 2022 Carlos Une <une@fastmail.fm>

// Sections of the code below are based on Go's implementation, which is, in
// turn, based on Cephes Math Library. The original C code can be found at
diff --git a/math/fenv+aarch64.ha b/math/fenv+aarch64.ha
index 88fd2765..649c27d9 100644
--- a/math/fenv+aarch64.ha
+++ b/math/fenv+aarch64.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2022 Bor Grošelj Simić <bor.groseljsimic@telemach.net>

// Defines flags characterizing types of floating point exceptions,
// Each of the flags is only defined when the target platform supports handling
diff --git a/math/fenv+riscv64.ha b/math/fenv+riscv64.ha
index 04cc1cd0..60869817 100644
--- a/math/fenv+riscv64.ha
+++ b/math/fenv+riscv64.ha
@@ -1,6 +1,4 @@
// License: MPL-2.0
// (c) 2022 Alexey Yerin <yyp@disroot.org>
// (c) 2022 Bor Grošelj Simić <bor.groseljsimic@telemach.net>

// Defines flags characterizing types of floating point exceptions,
// Each of the flags is only defined when the target platform supports handling
diff --git a/math/fenv+x86_64.ha b/math/fenv+x86_64.ha
index d3d6fd19..d2ae7b0e 100644
--- a/math/fenv+x86_64.ha
+++ b/math/fenv+x86_64.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2022 Bor Grošelj Simić <bor.groseljsimic@telemach.net>

// Defines flags characterizing types of floating point exceptions,
// Each of the flags is only defined when the target platform supports handling
diff --git a/math/fenv_func.ha b/math/fenv_func.ha
index 0b0c6993..06f735d8 100644
--- a/math/fenv_func.ha
+++ b/math/fenv_func.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Bor Grošelj Simić <bor.groseljsimic@telemach.net>

use rt;

// Accepts a set of flags from [[fexcept]] ORed together and clears
diff --git a/math/floats.ha b/math/floats.ha
index b720783c..131b472c 100644
--- a/math/floats.ha
+++ b/math/floats.ha
@@ -1,9 +1,5 @@
// License: MPL-2.0
// (c) 2022 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021-2022 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Sudipto Mallick <smlckz@disroot.org>
// (c) 2021 Vlad-Stefan Harbuz <vlad@vladh.net>

use types;

// Returns the binary representation of the given f64.
diff --git a/math/ints.ha b/math/ints.ha
index 8d772324..39c98f83 100644
--- a/math/ints.ha
+++ b/math/ints.ha
@@ -1,8 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2022 Haelwenn (lanodan) Monnier <contact@hacktivis.me>
// (c) 2021-2022 Vlad-Stefan Harbuz <vlad@vladh.net>

use types;

// Returns the absolute value of signed integer n.
diff --git a/math/math.ha b/math/math.ha
index 61edce33..6ac78580 100644
--- a/math/math.ha
+++ b/math/math.ha
@@ -1,7 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Vlad-Stefan Harbuz <vlad@vladh.net>

// Sections of the code below, in particular log() and exp(), are based on Go's
// implementation, which is, in turn, based on FreeBSD's. The original C code,
diff --git a/math/random/random.ha b/math/random/random.ha
index 001415e6..20180c48 100644
--- a/math/random/random.ha
+++ b/math/random/random.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Steven Guikal <void@fluix.dev>

// State for a pseudorandom number generator.
export type random = u64;
diff --git a/math/trig.ha b/math/trig.ha
index 35dea9a7..99c4642d 100644
--- a/math/trig.ha
+++ b/math/trig.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Vlad-Stefan Harbuz <vlad@vladh.net>

// Sections of the code below are based on Go's implementation, which is, in
// turn, based on:
diff --git a/math/uints.ha b/math/uints.ha
index d7f72903..f6d04a1c 100644
--- a/math/uints.ha
+++ b/math/uints.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Vlad-Stefan Harbuz <vlad@vladh.net>

// Sections of the code below are based on Go's implementation, in particular
// https://raw.githubusercontent.com/golang/go/master/src/math/bits/bits.go.
diff --git a/memio/ops.ha b/memio/ops.ha
index cc71b662..75fa1cff 100644
--- a/memio/ops.ha
+++ b/memio/ops.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2022 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2022 Yasumasa Tada <ytada@spartan.dev>

use encoding::utf8;
use io;
use strings;
diff --git a/memio/stream.ha b/memio/stream.ha
index 2fce7075..6bfb99eb 100644
--- a/memio/stream.ha
+++ b/memio/stream.ha
@@ -1,8 +1,5 @@
// License: MPL-2.0
// (c) 2022 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use bytes;
use encoding::utf8;
use errors;
diff --git a/mime/database.ha b/mime/database.ha
index bd31503e..75639c5d 100644
--- a/mime/database.ha
+++ b/mime/database.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Drew DeVault <sir@cmpwn.com>

use hash::fnv;
use strings;

diff --git a/mime/lookup.ha b/mime/lookup.ha
index 24d2e0e0..d7d66ca6 100644
--- a/mime/lookup.ha
+++ b/mime/lookup.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Drew DeVault <sir@cmpwn.com>

use hash::fnv;
use strings;

diff --git a/mime/parse.ha b/mime/parse.ha
index 666a5f52..920ced49 100644
--- a/mime/parse.ha
+++ b/mime/parse.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Drew DeVault <sir@cmpwn.com>

use ascii;
use errors;
use strings;
diff --git a/mime/system.ha b/mime/system.ha
index 1d71d15a..2b223114 100644
--- a/mime/system.ha
+++ b/mime/system.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Drew DeVault <sir@cmpwn.com>

use bufio;
use encoding::utf8;
use fmt;
diff --git a/net/+freebsd.ha b/net/+freebsd.ha
index 380a3903..22b8a7bc 100644
--- a/net/+freebsd.ha
+++ b/net/+freebsd.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2022 Noah Pederson <noah@packetlost.dev>

use errors;
use io;
use rt;
diff --git a/net/+linux.ha b/net/+linux.ha
index 35f88717..e23360cb 100644
--- a/net/+linux.ha
+++ b/net/+linux.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2022 Noah Pederson <noah@packetlost.dev>

use errors;
use io;
use rt;
diff --git a/net/dial/dial.ha b/net/dial/dial.ha
index 37fad3dd..80a7d95e 100644
--- a/net/dial/dial.ha
+++ b/net/dial/dial.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use errors;
use fmt;
use net;
diff --git a/net/dial/ip.ha b/net/dial/ip.ha
index c02d9487..f2241e34 100644
--- a/net/dial/ip.ha
+++ b/net/dial/ip.ha
@@ -1,7 +1,4 @@
// License: MPL-2.0
// (c) 2021 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

// Provides default dialers for tcp and udp
use net;
diff --git a/net/dial/registry.ha b/net/dial/registry.ha
index 1f6340ab..145d0ed6 100644
--- a/net/dial/registry.ha
+++ b/net/dial/registry.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use net;
use net::dns;
use unix::hosts;
diff --git a/net/dial/resolve.ha b/net/dial/resolve.ha
index 382c8a86..e0b70841 100644
--- a/net/dial/resolve.ha
+++ b/net/dial/resolve.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021-2022 Ember Sawady <ecs@d2evs.net>

use crypto::random;
use net::dns;
use net::ip;
diff --git a/net/dns/decode.ha b/net/dns/decode.ha
index e336fb58..a6463b17 100644
--- a/net/dns/decode.ha
+++ b/net/dns/decode.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2022 Lassi Pulkkinen <lassi@pulk.fi>

use ascii;
use endian;
use fmt;
diff --git a/net/dns/encode.ha b/net/dns/encode.ha
index 46df753c..0bf94721 100644
--- a/net/dns/encode.ha
+++ b/net/dns/encode.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use endian;
use errors;
use fmt;
diff --git a/net/dns/error.ha b/net/dns/error.ha
index 3a8498cf..83911647 100644
--- a/net/dns/error.ha
+++ b/net/dns/error.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use errors;
use fmt;
use io;
diff --git a/net/dns/query.ha b/net/dns/query.ha
index 35dd7522..5f2b6adc 100644
--- a/net/dns/query.ha
+++ b/net/dns/query.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use endian;
use errors;
use io;
diff --git a/net/dns/strdomain.ha b/net/dns/strdomain.ha
index d6921ef1..ba49fea9 100644
--- a/net/dns/strdomain.ha
+++ b/net/dns/strdomain.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use strings;

// Converts a human-readable domain name (e.g. "example.org") into a DNS-ready
diff --git a/net/dns/types.ha b/net/dns/types.ha
index fbd0c87e..88c45702 100644
--- a/net/dns/types.ha
+++ b/net/dns/types.ha
@@ -1,8 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Jonathan Halmen <slowjo@halmen.xyz>
// (c) 2022 Lassi Pulkkinen <lassi@pulk.fi>

use net::ip;
use strings;

diff --git a/net/errors.ha b/net/errors.ha
index 00161dc1..05095aba 100644
--- a/net/errors.ha
+++ b/net/errors.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use errors;
use io;

diff --git a/net/ip/+freebsd.ha b/net/ip/+freebsd.ha
index f4256340..ceb753a0 100644
--- a/net/ip/+freebsd.ha
+++ b/net/ip/+freebsd.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use rt;
use endian;

diff --git a/net/ip/+linux.ha b/net/ip/+linux.ha
index de785584..fb53960a 100644
--- a/net/ip/+linux.ha
+++ b/net/ip/+linux.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Mykyta Holubakha <hilobakho@gmail.com>

use rt;
use endian;

diff --git a/net/ip/ip.ha b/net/ip/ip.ha
index 400a2f10..2f6eb25b 100644
--- a/net/ip/ip.ha
+++ b/net/ip/ip.ha
@@ -1,12 +1,5 @@
// License: MPL-2.0
// (c) 2022 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021 Byron Torres <b@torresjrjr.com>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Miccah Castorina <contact@miccah.io>
// (c) 2021 Mykyta Holubakha <hilobakho@gmail.com>
// (c) 2021 Thomas Bracht Laumann Jespersen <t@laumann.xyz>

use bytes;
use endian;
use fmt;
diff --git a/net/ip/test+test.ha b/net/ip/test+test.ha
index 56eeb570..9cd6716e 100644
--- a/net/ip/test+test.ha
+++ b/net/ip/test+test.ha
@@ -1,9 +1,5 @@
// License: MPL-2.0
// (c) 2021 Byron Torres <b@torresjrjr.com>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Miccah Castorina <contact@miccah.io>
// (c) 2021 Mykyta Holubakha <hilobakho@gmail.com>

use strings;
use fmt;

diff --git a/net/msg.ha b/net/msg.ha
index 30906867..38fe4ea4 100644
--- a/net/msg.ha
+++ b/net/msg.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

// TODO:
// - Set name field
diff --git a/net/tcp/+freebsd.ha b/net/tcp/+freebsd.ha
index a7cf096a..8321f500 100644
--- a/net/tcp/+freebsd.ha
+++ b/net/tcp/+freebsd.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use errors;
use io;
use net::ip;
diff --git a/net/tcp/+linux.ha b/net/tcp/+linux.ha
index 356e9aa7..f72e1e81 100644
--- a/net/tcp/+linux.ha
+++ b/net/tcp/+linux.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use errors;
use io;
use net::ip;
diff --git a/net/tcp/listener.ha b/net/tcp/listener.ha
index 6101d89f..114796fb 100644
--- a/net/tcp/listener.ha
+++ b/net/tcp/listener.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use net;

// Accepts the next connection from a socket. Blocks until a new connection is
diff --git a/net/tcp/options.ha b/net/tcp/options.ha
index ae401ba0..81485e31 100644
--- a/net/tcp/options.ha
+++ b/net/tcp/options.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use net;

// Enables keep-alive for a socket.
diff --git a/net/types.ha b/net/types.ha
index a1f6c221..049d5bf5 100644
--- a/net/types.ha
+++ b/net/types.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

// The end of the full-duplex connection that should be [[shutdown]].
export type shut = enum {
	RD, // Disables further receptions.
diff --git a/net/udp/+freebsd.ha b/net/udp/+freebsd.ha
index 12e3bcd9..ca98aded 100644
--- a/net/udp/+freebsd.ha
+++ b/net/udp/+freebsd.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use errors;
use io;
use net::ip;
diff --git a/net/udp/+linux.ha b/net/udp/+linux.ha
index ce4cda5a..307bed37 100644
--- a/net/udp/+linux.ha
+++ b/net/udp/+linux.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use errors;
use io;
use net::ip;
diff --git a/net/udp/options.ha b/net/udp/options.ha
index 6c2da95e..e64fc6ee 100644
--- a/net/udp/options.ha
+++ b/net/udp/options.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use net;

// Enables port re-use for a UDP listener.
diff --git a/net/unix/+freebsd.ha b/net/unix/+freebsd.ha
index e57b4bdd..57cb0e15 100644
--- a/net/unix/+freebsd.ha
+++ b/net/unix/+freebsd.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use errors;
use fmt;
use io;
diff --git a/net/unix/+linux.ha b/net/unix/+linux.ha
index b1b04a32..4e5d0772 100644
--- a/net/unix/+linux.ha
+++ b/net/unix/+linux.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Mykyta Holubakha <hilobakho@gmail.com>

use errors;
use fmt;
use io;
diff --git a/net/unix/addr.ha b/net/unix/addr.ha
index 409b9e62..93b9f0da 100644
--- a/net/unix/addr.ha
+++ b/net/unix/addr.ha
@@ -1,6 +1,4 @@
// License: MPL-2.0
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Mykyta Holubakha <hilobakho@gmail.com>

// A UNIX socket address.
export type addr = str;
diff --git a/net/unix/cmsg.ha b/net/unix/cmsg.ha
index ab9fdde2..a7e7d0db 100644
--- a/net/unix/cmsg.ha
+++ b/net/unix/cmsg.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use net;
use io;
use rt;
diff --git a/net/unix/dial.ha b/net/unix/dial.ha
index 72910a50..b5234c05 100644
--- a/net/unix/dial.ha
+++ b/net/unix/dial.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use net::dial;
use net;

diff --git a/net/unix/listener.ha b/net/unix/listener.ha
index 6101d89f..114796fb 100644
--- a/net/unix/listener.ha
+++ b/net/unix/listener.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use net;

// Accepts the next connection from a socket. Blocks until a new connection is
diff --git a/net/unix/options.ha b/net/unix/options.ha
index 4ef1fb24..aac4110c 100644
--- a/net/unix/options.ha
+++ b/net/unix/options.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use net;

// Configures the backlog size for a listener. If not specified, a sensible
diff --git a/net/unix/socketpair.ha b/net/unix/socketpair.ha
index 54a67f2b..3c0aefed 100644
--- a/net/unix/socketpair.ha
+++ b/net/unix/socketpair.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Thomas Bracht Laumann Jespersen <t@laumann.xyz>

use errors;
use io;
use net;
diff --git a/net/uri/+test.ha b/net/uri/+test.ha
index bff204c6..905ea82b 100644
--- a/net/uri/+test.ha
+++ b/net/uri/+test.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use fmt;
use net::ip;

diff --git a/net/uri/fmt.ha b/net/uri/fmt.ha
index eb32e3d2..8228eea0 100644
--- a/net/uri/fmt.ha
+++ b/net/uri/fmt.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use ascii;
use encoding::utf8;
use fmt;
diff --git a/net/uri/parse.ha b/net/uri/parse.ha
index 563c8376..38531b75 100644
--- a/net/uri/parse.ha
+++ b/net/uri/parse.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2022 Alexey Yerin <yyp@disroot.org>
// (c) 2022 Umar Getagazov <umar@handlerug.me>

use ascii;
use encoding::utf8;
use io;
diff --git a/net/uri/query.ha b/net/uri/query.ha
index 0e752fa3..d927df95 100644
--- a/net/uri/query.ha
+++ b/net/uri/query.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use io;
use memio;
use strings;
diff --git a/net/uri/uri.ha b/net/uri/uri.ha
index 5e501f07..d0170298 100644
--- a/net/uri/uri.ha
+++ b/net/uri/uri.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use net::ip;
use strings;

diff --git a/os/+freebsd/dirfdfs.ha b/os/+freebsd/dirfdfs.ha
index 637fa51c..3806e497 100644
--- a/os/+freebsd/dirfdfs.ha
+++ b/os/+freebsd/dirfdfs.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021-2022 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2022 Jon Eskin <eskinjp@gmail.com>

use errors;
use encoding::utf8;
use fs;
diff --git a/os/+freebsd/exit+libc-test.ha b/os/+freebsd/exit+libc-test.ha
index bfdfa130..020934fd 100644
--- a/os/+freebsd/exit+libc-test.ha
+++ b/os/+freebsd/exit+libc-test.ha
@@ -1,2 +1,4 @@
// License: MPL-2.0

// Exit the program with the provided status code.
export @symbol("exit") fn exit(status: int) never;
diff --git a/os/+freebsd/exit+test.ha b/os/+freebsd/exit+test.ha
index a7614c21..1b075553 100644
--- a/os/+freebsd/exit+test.ha
+++ b/os/+freebsd/exit+test.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2023 Sebastian <sebastian@sebsite.pw>

// Exit the program with the provided status code.
export fn exit(status: int) never = {
diff --git a/os/+freebsd/exit.ha b/os/+freebsd/exit.ha
index 57638a66..58727544 100644
--- a/os/+freebsd/exit.ha
+++ b/os/+freebsd/exit.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use rt;

// Exit the program with the provided status code.
diff --git a/os/+freebsd/fs.ha b/os/+freebsd/fs.ha
index ed95f293..f494d783 100644
--- a/os/+freebsd/fs.ha
+++ b/os/+freebsd/fs.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use errors;
use fs;
use path;
diff --git a/os/+freebsd/platform_environ.ha b/os/+freebsd/platform_environ.ha
index 1c915713..217aeb40 100644
--- a/os/+freebsd/platform_environ.ha
+++ b/os/+freebsd/platform_environ.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use errors;
use rt;
use strings;
diff --git a/os/+freebsd/status.ha b/os/+freebsd/status.ha
index 7abcc1c2..8ac600dd 100644
--- a/os/+freebsd/status.ha
+++ b/os/+freebsd/status.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

// Values that may be passed to [[exit]] to indicate successful or unsuccessful
// termination, respectively.
export type status = enum {
diff --git a/os/+freebsd/stdfd.ha b/os/+freebsd/stdfd.ha
index 0fd49054..abf4b21e 100644
--- a/os/+freebsd/stdfd.ha
+++ b/os/+freebsd/stdfd.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2022 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use bufio;
use io;
use rt;
diff --git a/os/+linux/dirfdfs.ha b/os/+linux/dirfdfs.ha
index 8ad59807..832a7930 100644
--- a/os/+linux/dirfdfs.ha
+++ b/os/+linux/dirfdfs.ha
@@ -1,9 +1,5 @@
// License: MPL-2.0
// (c) 2021 Alexey Yerin <yyp@disroot.org>
// (c) 2022 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021-2022 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2022 Jon Eskin <eskinjp@gmail.com>

use errors;
use encoding::utf8;
use fs;
diff --git a/os/+linux/exit+libc-test.ha b/os/+linux/exit+libc-test.ha
index bfdfa130..020934fd 100644
--- a/os/+linux/exit+libc-test.ha
+++ b/os/+linux/exit+libc-test.ha
@@ -1,2 +1,4 @@
// License: MPL-2.0

// Exit the program with the provided status code.
export @symbol("exit") fn exit(status: int) never;
diff --git a/os/+linux/exit+test.ha b/os/+linux/exit+test.ha
index a7614c21..1b075553 100644
--- a/os/+linux/exit+test.ha
+++ b/os/+linux/exit+test.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2023 Sebastian <sebastian@sebsite.pw>

// Exit the program with the provided status code.
export fn exit(status: int) never = {
diff --git a/os/+linux/exit.ha b/os/+linux/exit.ha
index 57638a66..58727544 100644
--- a/os/+linux/exit.ha
+++ b/os/+linux/exit.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use rt;

// Exit the program with the provided status code.
diff --git a/os/+linux/fs.ha b/os/+linux/fs.ha
index 36f34929..0076ba48 100644
--- a/os/+linux/fs.ha
+++ b/os/+linux/fs.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use errors;
use fs;
use path;
diff --git a/os/+linux/memory.ha b/os/+linux/memory.ha
index 07730e58..4d324d94 100644
--- a/os/+linux/memory.ha
+++ b/os/+linux/memory.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

// TODO: Implement FreeBSD version
use errors;
use rt;
diff --git a/os/+linux/platform_environ.ha b/os/+linux/platform_environ.ha
index dee78dcb..1f2cb211 100644
--- a/os/+linux/platform_environ.ha
+++ b/os/+linux/platform_environ.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use errors;
use math;
use rt;
diff --git a/os/+linux/status.ha b/os/+linux/status.ha
index 7abcc1c2..8ac600dd 100644
--- a/os/+linux/status.ha
+++ b/os/+linux/status.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

// Values that may be passed to [[exit]] to indicate successful or unsuccessful
// termination, respectively.
export type status = enum {
diff --git a/os/+linux/stdfd.ha b/os/+linux/stdfd.ha
index 0fd49054..abf4b21e 100644
--- a/os/+linux/stdfd.ha
+++ b/os/+linux/stdfd.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2022 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use bufio;
use io;
use rt;
diff --git a/os/environ.ha b/os/environ.ha
index 9551516a..6005803e 100644
--- a/os/environ.ha
+++ b/os/environ.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use errors;
use strings;

diff --git a/os/exec/cmd.ha b/os/exec/cmd.ha
index b88e0d63..cbedea6a 100644
--- a/os/exec/cmd.ha
+++ b/os/exec/cmd.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021-2022 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Thomas Bracht Laumann Jespersen <t@laumann.xyz>

use ascii;
use errors;
use io;
diff --git a/os/exec/exec+freebsd.ha b/os/exec/exec+freebsd.ha
index bb366522..7e8e3967 100644
--- a/os/exec/exec+freebsd.ha
+++ b/os/exec/exec+freebsd.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use errors;
use io;
use rt;
diff --git a/os/exec/exec+linux.ha b/os/exec/exec+linux.ha
index 30a7f5ce..1aab3c39 100644
--- a/os/exec/exec+linux.ha
+++ b/os/exec/exec+linux.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use errors;
use io;
use os;
diff --git a/os/exec/process+freebsd.ha b/os/exec/process+freebsd.ha
index 8cdd1f5e..ad0b3295 100644
--- a/os/exec/process+freebsd.ha
+++ b/os/exec/process+freebsd.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2022 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021-2022 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use errors;
use fmt;
use rt;
diff --git a/os/exec/process+linux.ha b/os/exec/process+linux.ha
index 9abdc1f5..1c71de97 100644
--- a/os/exec/process+linux.ha
+++ b/os/exec/process+linux.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2022 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021-2022 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use errors;
use fmt;
use rt;
diff --git a/os/exec/types.ha b/os/exec/types.ha
index e6bec844..6e56772f 100644
--- a/os/exec/types.ha
+++ b/os/exec/types.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use errors;
use fs;
use io;
diff --git a/os/os.ha b/os/os.ha
index 4d3688d6..55c53db9 100644
--- a/os/os.ha
+++ b/os/os.ha
@@ -1,8 +1,5 @@
// License: MPL-2.0
// (c) 2021 Alexey Yerin <yyp@disroot.org>
// (c) 2021-2022 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2022 Jon Eskin <eskinjp@gmail.com>

use fs;
use io;
use path;
diff --git a/path/+freebsd.ha b/path/+freebsd.ha
index b4d5435d..7603cbbb 100644
--- a/path/+freebsd.ha
+++ b/path/+freebsd.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021-2022 Drew DeVault <sir@cmpwn.com>

// Platform-specific path separator byte.
export def SEP: u8 = '/';
diff --git a/path/+linux.ha b/path/+linux.ha
index b4d5435d..7603cbbb 100644
--- a/path/+linux.ha
+++ b/path/+linux.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021-2022 Drew DeVault <sir@cmpwn.com>

// Platform-specific path separator byte.
export def SEP: u8 = '/';
diff --git a/path/buffer.ha b/path/buffer.ha
index d5ce98f0..67f247f7 100644
--- a/path/buffer.ha
+++ b/path/buffer.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2022 Drew DeVault <sir@cmpwn.com>
// (c) 2022 Humm <hummsmith42@gmail.com>

use bytes;
use strings;

diff --git a/path/error.ha b/path/error.ha
index b2870c18..4cba2422 100644
--- a/path/error.ha
+++ b/path/error.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

// Returned when adding an extension if the path is root, or the final path
// segment consists entirely of dots.
export type cant_extend = !void;
diff --git a/path/ext_stack.ha b/path/ext_stack.ha
index 0a45187c..66cb5e50 100644
--- a/path/ext_stack.ha
+++ b/path/ext_stack.ha
@@ -1,4 +1,5 @@
// License: MPL-2.0

use bytes;
use strings;

diff --git a/path/iter.ha b/path/iter.ha
index a1ef705a..3fde1400 100644
--- a/path/iter.ha
+++ b/path/iter.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021-2022 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use bytes;
use strings;

diff --git a/path/posix.ha b/path/posix.ha
index 312c3270..3b88935e 100644
--- a/path/posix.ha
+++ b/path/posix.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2022 Alexey Yerin <yyp@disroot.org>
// (c) 2021-2022 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use bytes;
use strings;

diff --git a/path/prefix.ha b/path/prefix.ha
index 39e55e87..75aea649 100644
--- a/path/prefix.ha
+++ b/path/prefix.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use bytes;
use strings;

diff --git a/path/stack.ha b/path/stack.ha
index 3222aca5..bc6cbcd0 100644
--- a/path/stack.ha
+++ b/path/stack.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021-2022 Drew DeVault <sir@cmpwn.com>

use bytes;
use strings;

diff --git a/regex/+test.ha b/regex/+test.ha
index d81e537d..ae544333 100644
--- a/regex/+test.ha
+++ b/regex/+test.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Vlad-Stefan Harbuz <vlad@vladh.net>

use fmt;
use strings;
use types;
diff --git a/regex/regex.ha b/regex/regex.ha
index 97892d14..31f07f89 100644
--- a/regex/regex.ha
+++ b/regex/regex.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Vlad-Stefan Harbuz <vlad@vladh.net>

use ascii;
use bufio;
use encoding::utf8;
diff --git a/rt/+aarch64/arch_jmp.ha b/rt/+aarch64/arch_jmp.ha
index 04eb4312..84a86216 100644
--- a/rt/+aarch64/arch_jmp.ha
+++ b/rt/+aarch64/arch_jmp.ha
@@ -1,4 +1,3 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

export type arch_jmpbuf = [22]u64;
diff --git a/rt/+aarch64/backtrace.ha b/rt/+aarch64/backtrace.ha
index fd6f6eb2..7053d5c7 100644
--- a/rt/+aarch64/backtrace.ha
+++ b/rt/+aarch64/backtrace.ha
@@ -1,7 +1,4 @@
// License: MPL-2.0
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Mykyta Holubakha <hilobakho@gmail.com>
// (c) 2021 Sudipto Mallick <smlckz@disroot.org>

fn getfp() **opaque;

diff --git a/rt/+aarch64/cpuid.ha b/rt/+aarch64/cpuid.ha
index 70b786d1..5c04987f 100644
--- a/rt/+aarch64/cpuid.ha
+++ b/rt/+aarch64/cpuid.ha
@@ -1 +1,3 @@
// License: MPL-2.0

// TODO
diff --git a/rt/+freebsd/+aarch64.ha b/rt/+freebsd/+aarch64.ha
index aca36741..4578dcdd 100644
--- a/rt/+freebsd/+aarch64.ha
+++ b/rt/+freebsd/+aarch64.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

export type siginfo = struct {
	si_signo: int,
	si_errno: int,
diff --git a/rt/+freebsd/+riscv64.ha b/rt/+freebsd/+riscv64.ha
index aca36741..4578dcdd 100644
--- a/rt/+freebsd/+riscv64.ha
+++ b/rt/+freebsd/+riscv64.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

export type siginfo = struct {
	si_signo: int,
	si_errno: int,
diff --git a/rt/+freebsd/+x86_64.ha b/rt/+freebsd/+x86_64.ha
index aca36741..4578dcdd 100644
--- a/rt/+freebsd/+x86_64.ha
+++ b/rt/+freebsd/+x86_64.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

export type siginfo = struct {
	si_signo: int,
	si_errno: int,
diff --git a/rt/+freebsd/env.ha b/rt/+freebsd/env.ha
index 4deb6423..016bdb35 100644
--- a/rt/+freebsd/env.ha
+++ b/rt/+freebsd/env.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

export let argc: size = 0;
export let argv: *[*]*u8 = null: *[*]*u8;
diff --git a/rt/+freebsd/errno.ha b/rt/+freebsd/errno.ha
index c038cfe7..c63707c3 100644
--- a/rt/+freebsd/errno.ha
+++ b/rt/+freebsd/errno.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

// Represents an error returned from the FreeBSD kernel.
export type errno = !int;
diff --git a/rt/+freebsd/platform_abort.ha b/rt/+freebsd/platform_abort.ha
index aae7c890..cd021772 100644
--- a/rt/+freebsd/platform_abort.ha
+++ b/rt/+freebsd/platform_abort.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

fn platform_abort(path: *str, line: u64, col: u64, msg: str) void = {
	const prefix = "Abort: ";
diff --git a/rt/+freebsd/platformstart.ha b/rt/+freebsd/platformstart.ha
index 0d1389e5..70be29b7 100644
--- a/rt/+freebsd/platformstart.ha
+++ b/rt/+freebsd/platformstart.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

export fn start_freebsd(iv: *[*]uintptr) never = {
	// TODO: Find & parse auxv
diff --git a/rt/+freebsd/segmalloc.ha b/rt/+freebsd/segmalloc.ha
index 0b96a74d..99d03ee1 100644
--- a/rt/+freebsd/segmalloc.ha
+++ b/rt/+freebsd/segmalloc.ha
@@ -1,6 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

// Allocates a segment.
fn segmalloc(n: size) nullable *opaque = {
diff --git a/rt/+freebsd/signal.ha b/rt/+freebsd/signal.ha
index 66ec7f68..9ee3abf9 100644
--- a/rt/+freebsd/signal.ha
+++ b/rt/+freebsd/signal.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

// TODO: work when _NSIG != 32

diff --git a/rt/+freebsd/socket.ha b/rt/+freebsd/socket.ha
index afc6b5c3..7bae6f5a 100644
--- a/rt/+freebsd/socket.ha
+++ b/rt/+freebsd/socket.ha
@@ -1,6 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2022 Sebastian <sebastian@sebsite.pw>

export type sa_family_t = u8;
export type socklen_t = u32;
diff --git a/rt/+freebsd/syscallno.ha b/rt/+freebsd/syscallno.ha
index 21efcf55..4eff53a5 100644
--- a/rt/+freebsd/syscallno.ha
+++ b/rt/+freebsd/syscallno.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

export def SYS_syscall: u64 = 0;
export def SYS_exit: u64 = 1;
diff --git a/rt/+freebsd/syscalls.ha b/rt/+freebsd/syscalls.ha
index 60af8e8d..e3c8bcd0 100644
--- a/rt/+freebsd/syscalls.ha
+++ b/rt/+freebsd/syscalls.ha
@@ -1,7 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Thomas Bracht Laumann Jespersen <t@laumann.xyz>

fn syscall0(u64) u64;
fn syscall1(u64, u64) u64;
diff --git a/rt/+freebsd/types.ha b/rt/+freebsd/types.ha
index af43bdea..6621a7c9 100644
--- a/rt/+freebsd/types.ha
+++ b/rt/+freebsd/types.ha
@@ -1,8 +1,4 @@
// License: MPL-2.0
// (c) 2021 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2022 Sebastian <sebastian@sebsite.pw>

export type time_t = i64;
export type suseconds_t = i64;
diff --git a/rt/+linux/+aarch64.ha b/rt/+linux/+aarch64.ha
index 847798f3..e0dc7970 100644
--- a/rt/+linux/+aarch64.ha
+++ b/rt/+linux/+aarch64.ha
@@ -1,7 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Sudipto Mallick <smlckz@disroot.org>

// #define __ADDR_BND_PKEY_PAD (_Alignof(void *) < sizeof(short) ? sizeof(short) : _Alignof(void *))
def __ADDR_BND_PKEY_PAD: size = 8;
diff --git a/rt/+linux/+riscv64.ha b/rt/+linux/+riscv64.ha
index 1d038694..2ede88e5 100644
--- a/rt/+linux/+riscv64.ha
+++ b/rt/+linux/+riscv64.ha
@@ -1,7 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Michael Forney <mforney@mforney.org>

// #define __ADDR_BND_PKEY_PAD (_Alignof(void *) < sizeof(short) ? sizeof(short) : _Alignof(void *))
def __ADDR_BND_PKEY_PAD: size = 8;
diff --git a/rt/+linux/+x86_64.ha b/rt/+linux/+x86_64.ha
index 143c29c2..cb75bb33 100644
--- a/rt/+linux/+x86_64.ha
+++ b/rt/+linux/+x86_64.ha
@@ -1,6 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

// #define __ADDR_BND_PKEY_PAD (_Alignof(void *) < sizeof(short) ? sizeof(short) : _Alignof(void *))
def __ADDR_BND_PKEY_PAD: size = 8;
diff --git a/rt/+linux/env.ha b/rt/+linux/env.ha
index 4deb6423..016bdb35 100644
--- a/rt/+linux/env.ha
+++ b/rt/+linux/env.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

export let argc: size = 0;
export let argv: *[*]*u8 = null: *[*]*u8;
diff --git a/rt/+linux/errno.ha b/rt/+linux/errno.ha
index c73c90d2..90b568c7 100644
--- a/rt/+linux/errno.ha
+++ b/rt/+linux/errno.ha
@@ -1,6 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

// Represents an error returned from the Linux kernel.
export type errno = !int;
diff --git a/rt/+linux/platform_abort.ha b/rt/+linux/platform_abort.ha
index aae7c890..cd021772 100644
--- a/rt/+linux/platform_abort.ha
+++ b/rt/+linux/platform_abort.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

fn platform_abort(path: *str, line: u64, col: u64, msg: str) void = {
	const prefix = "Abort: ";
diff --git a/rt/+linux/platformstart-libc.ha b/rt/+linux/platformstart-libc.ha
index 4d9e597a..4e7f4cc0 100644
--- a/rt/+linux/platformstart-libc.ha
+++ b/rt/+linux/platformstart-libc.ha
@@ -1,6 +1,4 @@
// License: MPL-2.0
// (c) 2021 Armin Weigl <tb46305@gmail.com>
// (c) 2021 Drew DeVault <sir@cmpwn.com>

export fn start_linux(iv: *[*]uintptr) never = {
	argc = iv[0]: size;
diff --git a/rt/+linux/prctl.ha b/rt/+linux/prctl.ha
index cddc5f9b..28692d02 100644
--- a/rt/+linux/prctl.ha
+++ b/rt/+linux/prctl.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Ember Sawady <ecs@d2evs.net>

export def PR_SET_PDEATHSIG = 1;
export def PR_GET_PDEATHSIG = 2;
diff --git a/rt/+linux/segmalloc.ha b/rt/+linux/segmalloc.ha
index 0b96a74d..99d03ee1 100644
--- a/rt/+linux/segmalloc.ha
+++ b/rt/+linux/segmalloc.ha
@@ -1,6 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

// Allocates a segment.
fn segmalloc(n: size) nullable *opaque = {
diff --git a/rt/+linux/signal.ha b/rt/+linux/signal.ha
index 301e1ec1..7980f154 100644
--- a/rt/+linux/signal.ha
+++ b/rt/+linux/signal.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Mykyta Holubakha <hilobakho@gmail.com>

// TODO: work when _NSIG != 64

diff --git a/rt/+linux/socket.ha b/rt/+linux/socket.ha
index 12db9d4b..eb7a5972 100644
--- a/rt/+linux/socket.ha
+++ b/rt/+linux/socket.ha
@@ -1,6 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Mykyta Holubakha <hilobakho@gmail.com>

export type sa_family_t = u16;
export type socklen_t = uint;
diff --git a/rt/+linux/stat.ha b/rt/+linux/stat.ha
index 693cee43..f4512ef1 100644
--- a/rt/+linux/stat.ha
+++ b/rt/+linux/stat.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

export fn mkdev(major: u32, minor: u32) dev_t =
	((major: u64 & 0xFFFFF000) << 32) |
diff --git a/rt/+linux/syscallno+aarch64.ha b/rt/+linux/syscallno+aarch64.ha
index eddfa813..c165865d 100644
--- a/rt/+linux/syscallno+aarch64.ha
+++ b/rt/+linux/syscallno+aarch64.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

export def SYS_io_setup: u64			= 0;
export def SYS_io_destroy: u64			= 1;
diff --git a/rt/+linux/syscallno+riscv64.ha b/rt/+linux/syscallno+riscv64.ha
index 8174bc25..aa023618 100644
--- a/rt/+linux/syscallno+riscv64.ha
+++ b/rt/+linux/syscallno+riscv64.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

export def SYS_io_setup: u64 = 0;
export def SYS_io_destroy: u64 = 1;
diff --git a/rt/+linux/syscallno+x86_64.ha b/rt/+linux/syscallno+x86_64.ha
index 1a5d689a..1e513d01 100644
--- a/rt/+linux/syscallno+x86_64.ha
+++ b/rt/+linux/syscallno+x86_64.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

export def SYS_read: u64			= 0;
export def SYS_write: u64			= 1;
diff --git a/rt/+linux/syscalls.ha b/rt/+linux/syscalls.ha
index 6db4af44..6f75f035 100644
--- a/rt/+linux/syscalls.ha
+++ b/rt/+linux/syscalls.ha
@@ -1,10 +1,4 @@
// License: MPL-2.0
// (c) 2021 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Mykyta Holubakha <hilobakho@gmail.com>
// (c) 2021 Thomas Bracht Laumann Jespersen <t@laumann.xyz>
// (c) 2022 Vincent Dagonneau <v@vda.io>

fn syscall0(u64) u64;
fn syscall1(u64, u64) u64;
diff --git a/rt/+linux/types.ha b/rt/+linux/types.ha
index 0936c037..f66ad03e 100644
--- a/rt/+linux/types.ha
+++ b/rt/+linux/types.ha
@@ -1,12 +1,4 @@
// License: MPL-2.0
// (c) 2021 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Kiëd Llaentenn <kiedtl@tilde.team>
// (c) 2021 Mykyta Holubakha <hilobakho@gmail.com>
// (c) 2022 Sebastian <sebastian@sebsite.pw>
// (c) 2022 Vincent Dagonneau <v@vda.io>

export type off_t = u64;
export type dev_t = u64;
diff --git a/rt/+riscv64/arch_jmp.ha b/rt/+riscv64/arch_jmp.ha
index bed9ac33..8d8d65da 100644
--- a/rt/+riscv64/arch_jmp.ha
+++ b/rt/+riscv64/arch_jmp.ha
@@ -1,4 +1,3 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

export type arch_jmpbuf = [26]u64;
diff --git a/rt/+riscv64/backtrace.ha b/rt/+riscv64/backtrace.ha
index ba8cc2a4..3212dd6c 100644
--- a/rt/+riscv64/backtrace.ha
+++ b/rt/+riscv64/backtrace.ha
@@ -1,6 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

fn getfp() **opaque;

diff --git a/rt/+riscv64/cpuid.ha b/rt/+riscv64/cpuid.ha
index 70b786d1..5c04987f 100644
--- a/rt/+riscv64/cpuid.ha
+++ b/rt/+riscv64/cpuid.ha
@@ -1 +1,3 @@
// License: MPL-2.0

// TODO
diff --git a/rt/+riscv64/fenv.s b/rt/+riscv64/fenv.s
index ce1fd644..465d3a84 100644
--- a/rt/+riscv64/fenv.s
+++ b/rt/+riscv64/fenv.s
@@ -1,6 +1,3 @@
# License: MPL-2.0
# (c) 2022 Alexey Yerin <yyp@disroot.org>

.section ".text.rt.feclearexcept","ax"
.global rt.feclearexcept
.type rt.feclearexcept,@function
diff --git a/rt/+test/signal_test.ha b/rt/+test/signal_test.ha
index 8ff7aa17..3df7daa4 100644
--- a/rt/+test/signal_test.ha
+++ b/rt/+test/signal_test.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2022 Jose Lombera <jose@lombera.dev>

// Test sigset operations do not fail for valid signal numbers.
@test fn sigset_valid_signum() void = {
diff --git a/rt/+x86_64/arch_jmp.ha b/rt/+x86_64/arch_jmp.ha
index c14186c5..2f0d9318 100644
--- a/rt/+x86_64/arch_jmp.ha
+++ b/rt/+x86_64/arch_jmp.ha
@@ -1,4 +1,3 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

export type arch_jmpbuf = [8]u64;
diff --git a/rt/+x86_64/backtrace.ha b/rt/+x86_64/backtrace.ha
index e9436ff9..f0d0ae39 100644
--- a/rt/+x86_64/backtrace.ha
+++ b/rt/+x86_64/backtrace.ha
@@ -1,7 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Mykyta Holubakha <hilobakho@gmail.com>

fn getfp() **opaque;

diff --git a/rt/+x86_64/cpuid.ha b/rt/+x86_64/cpuid.ha
index 4bff9ec1..6a21b7d4 100644
--- a/rt/+x86_64/cpuid.ha
+++ b/rt/+x86_64/cpuid.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

export type cpuid_vendor = enum {
	AMD,
	INTEL,
diff --git a/rt/abort+test.ha b/rt/abort+test.ha
index 24977a34..d6704350 100644
--- a/rt/abort+test.ha
+++ b/rt/abort+test.ha
@@ -1,6 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

export type abort_reason = struct {
	path: nullable *str,
diff --git a/rt/abort.ha b/rt/abort.ha
index fd4b1200..cc39fb70 100644
--- a/rt/abort.ha
+++ b/rt/abort.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

export @symbol("rt.abort") fn _abort(
	path: *str,
diff --git a/rt/ensure.ha b/rt/ensure.ha
index 647b5249..808431d5 100644
--- a/rt/ensure.ha
+++ b/rt/ensure.ha
@@ -1,6 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

export type slice = struct {
	data: nullable *opaque,
diff --git a/rt/fenv_defs.ha b/rt/fenv_defs.ha
index 5fc74cc3..5f6df421 100644
--- a/rt/fenv_defs.ha
+++ b/rt/fenv_defs.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2022 Bor Grošelj Simić <bor.groseljsimic@telemach.net>

export fn feclearexcept(ex: uint) void;
export fn feraiseexcept(ex: uint) void;
diff --git a/rt/jmp.ha b/rt/jmp.ha
index c956a38d..2523ac46 100644
--- a/rt/jmp.ha
+++ b/rt/jmp.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

export type jmpbuf = struct {
	__jb: arch_jmpbuf,
diff --git a/rt/malloc+debug.ha b/rt/malloc+debug.ha
index 29f7f2bb..ed8fd729 100644
--- a/rt/malloc+debug.ha
+++ b/rt/malloc+debug.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

// This is a very simple "debug" allocator which works by allocating only via
// mmap and returning pointers to the end of the segment such that any writes
diff --git a/rt/malloc+libc.ha b/rt/malloc+libc.ha
index 3e9ccece..98555070 100644
--- a/rt/malloc+libc.ha
+++ b/rt/malloc+libc.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Alexey Yerin <yyp@disroot.org>

// Allocates n bytes of memory and returns a pointer to them, or null if there
// is insufficient memory.
diff --git a/rt/malloc.ha b/rt/malloc.ha
index 0598ba70..218b3718 100644
--- a/rt/malloc.ha
+++ b/rt/malloc.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

// This is a simple memory allocator, based on
// Appel, Andrew W., and David A. Naumann. "Verified sequential malloc/free"
// but with logarithmic bin sizing and additional safety checks. Not thread-safe
diff --git a/rt/memcpy.ha b/rt/memcpy.ha
index b49175cd..91e6e7fa 100644
--- a/rt/memcpy.ha
+++ b/rt/memcpy.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

def MOD32 = size(u32) - 1;

diff --git a/rt/memmove.ha b/rt/memmove.ha
index 597a1fee..be00cbfb 100644
--- a/rt/memmove.ha
+++ b/rt/memmove.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

def SZSZ = size(size);
def MODSZ = size(size) - 1;
diff --git a/rt/memset.ha b/rt/memset.ha
index 7c5f6200..87911026 100644
--- a/rt/memset.ha
+++ b/rt/memset.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

export fn memset(dest: *opaque, val: u8, n: size) void = {
	// implementation adapted from musl libc
diff --git a/rt/start+libc.ha b/rt/start+libc.ha
index fbaa9356..191fcaef 100644
--- a/rt/start+libc.ha
+++ b/rt/start+libc.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

@symbol(".main") fn main() void;
@symbol("exit") fn c_exit(status: int) never;
diff --git a/rt/start+test+libc.ha b/rt/start+test+libc.ha
index fd95de60..594d0ace 100644
--- a/rt/start+test+libc.ha
+++ b/rt/start+test+libc.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Alexey Yerin <yyp@disroot.org>

@symbol("__test_main") fn test_main() size;

diff --git a/rt/start+test.ha b/rt/start+test.ha
index 673fc36c..8e361a6e 100644
--- a/rt/start+test.ha
+++ b/rt/start+test.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

@symbol("__test_main") fn test_main() size;

diff --git a/rt/start.ha b/rt/start.ha
index 732407aa..44e55d9f 100644
--- a/rt/start.ha
+++ b/rt/start.ha
@@ -1,6 +1,4 @@
// License: MPL-2.0
// (c) 2021 Armin Weigl <tb46305@gmail.com>
// (c) 2021 Drew DeVault <sir@cmpwn.com>

@symbol("main") fn main() void;

diff --git a/rt/strcmp.ha b/rt/strcmp.ha
index a58c84ea..49690bca 100644
--- a/rt/strcmp.ha
+++ b/rt/strcmp.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

type string = struct {
	data: *[*]u8,
diff --git a/rt/u64tos.ha b/rt/u64tos.ha
index cb00dcc7..12679598 100644
--- a/rt/u64tos.ha
+++ b/rt/u64tos.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

fn u64tos(u: u64) (*const u8, size) = {
	static let buf: [20]u8 = [0...]; // len("18446744073709551615")
	let sl = buf[..0];
diff --git a/rt/unknown_errno.ha b/rt/unknown_errno.ha
index 5029b330..94075675 100644
--- a/rt/unknown_errno.ha
+++ b/rt/unknown_errno.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

fn unknown_errno(err: errno) str = {
	static let buf: [27]u8 = [0...];
	const s = *(&"[unknown errno ": *[]u8);
diff --git a/scripts/copyright.sh b/scripts/copyright.sh
new file mode 100755
index 00000000..bdf63eea
--- /dev/null
+++ b/scripts/copyright.sh
@@ -0,0 +1,30 @@
#!/bin/sh -eu

# XXX: technically doesn't work with paths that have newlines in them, but
# find -exec doesn't propagate the exit status
find . -name '*.ha' | while read -r f; do
	awk 'BEGIN { state = "start" }
		state == "start" {
			if ($0 !~ /^\/\/ License: /) {
				print "missing copyright header in " FILENAME
				exit 1
			}
			state = "comment"
			next
		}
		state == "comment" && $0 !~ /^\/\// {
			if ($0 != "") {
				print "missing empty line after copyright header in " FILENAME
				exit 1
			}
			state = "postheader"
			next
		}
		state == "postheader" {
			if ($0 == "") {
				print "extra empty line after copyright header in " FILENAME
				exit 1
			}
			exit 0
		}' "$f"
done
diff --git a/shlex/+test.ha b/shlex/+test.ha
index 02b6242f..134cc5a5 100644
--- a/shlex/+test.ha
+++ b/shlex/+test.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Alexey Yerin <yyp@disroot.org>
// (c) 2022 Drew DeVault <sir@cmpwn.com>

use io;
use memio;
use strings;
diff --git a/shlex/escape.ha b/shlex/escape.ha
index 05365852..f9e1d36c 100644
--- a/shlex/escape.ha
+++ b/shlex/escape.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Alexey Yerin <yyp@disroot.org>
// (c) 2022 Drew DeVault <sir@cmpwn.com>

use ascii;
use encoding::utf8;
use io;
diff --git a/shlex/split.ha b/shlex/split.ha
index 98703e6d..a0950392 100644
--- a/shlex/split.ha
+++ b/shlex/split.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021-2022 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use io;
use memio;
use strings;
diff --git a/sort/+test.ha b/sort/+test.ha
index 5069319d..ece043db 100644
--- a/sort/+test.ha
+++ b/sort/+test.ha
@@ -1,6 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use math::random;
use sort::cmp;
diff --git a/sort/bisect.ha b/sort/bisect.ha
index 19e1d4e7..fcb57255 100644
--- a/sort/bisect.ha
+++ b/sort/bisect.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2022 Sebastian <sebastian@sebsite.pw>

// Determines the index that 'elem' should be inserted into sorted slice 'in'.
// If 'elem' already appears in the slice, inserting to the returned index will
diff --git a/sort/cmp/cmp.ha b/sort/cmp/cmp.ha
index b9c23f82..73719bf6 100644
--- a/sort/cmp/cmp.ha
+++ b/sort/cmp/cmp.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use strings;

// [[sort::cmpfunc]] for use with int.
diff --git a/sort/search.ha b/sort/search.ha
index 5ae78ffd..5dc245a8 100644
--- a/sort/search.ha
+++ b/sort/search.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

// Performs a binary search over a sorted slice. If the key is found, index of
// the matching item in the slice is returned. Otherwise, void is returned.
diff --git a/sort/sort.ha b/sort/sort.ha
index 54713bdb..b48b9855 100644
--- a/sort/sort.ha
+++ b/sort/sort.ha
@@ -1,6 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Steven Guikal <void@fluix.one>

use math;
use types;
diff --git a/sort/types.ha b/sort/types.ha
index 333cb74a..2d3241ff 100644
--- a/sort/types.ha
+++ b/sort/types.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2022 Sebastian <sebastian@sebsite.pw>

// This function type is used when sorting and searching. Given two pointers to
// values, a function of this type should return an integer less than, equal to,
diff --git a/strconv/+test/stoi_test.ha b/strconv/+test/stoi_test.ha
index 363abd89..adb01b1a 100644
--- a/strconv/+test/stoi_test.ha
+++ b/strconv/+test/stoi_test.ha
@@ -1,8 +1,5 @@
// License: MPL-2.0
// (c) 2021 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Andri Yngvason <andri@yngvason.is>
// (c) 2022 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use types;

@test fn stoi() void = {
diff --git a/strconv/+test/stou_test.ha b/strconv/+test/stou_test.ha
index 75022ab8..4aec1536 100644
--- a/strconv/+test/stou_test.ha
+++ b/strconv/+test/stou_test.ha
@@ -1,7 +1,4 @@
// License: MPL-2.0
// (c) 2021 Andri Yngvason <andri@yngvason.is>
// (c) 2022 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

@test fn stou() void = {
	assert(stou64("") as invalid == 0: invalid);
diff --git a/strconv/ftos.ha b/strconv/ftos.ha
index da996d33..d35cfed9 100644
--- a/strconv/ftos.ha
+++ b/strconv/ftos.ha
@@ -1,10 +1,4 @@
// License: MPL-2.0
// (c) 2021 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Sudipto Mallick <smlckz@disroot.org>
// (c) 2021 Sudipto Mallick <smlckz@envs.net>
// (c) 2021 Vlad-Stefan Harbuz <vlad@vladh.net>

// Using Ryū: fast float-to-string conversion algorithm by Ulf Adams.
// https://doi.org/10.1145/3192366.3192369
diff --git a/strconv/ftostof+test.ha b/strconv/ftostof+test.ha
index 1264e7b0..1d3b636f 100644
--- a/strconv/ftostof+test.ha
+++ b/strconv/ftostof+test.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use math;

// test round-trip accuracy of ftos followed by stof.
diff --git a/strconv/itos.ha b/strconv/itos.ha
index 8ce80640..6832d40a 100644
--- a/strconv/itos.ha
+++ b/strconv/itos.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021 Andri Yngvason <andri@yngvason.is>
// (c) 2021 Armin Weigl <tb46305@gmail.com>
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use bytes;
use types;
use strings;
diff --git a/strconv/numeric.ha b/strconv/numeric.ha
index e38e510e..49757a7c 100644
--- a/strconv/numeric.ha
+++ b/strconv/numeric.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021-2022 Ember Sawady <ecs@d2evs.net>

use types;

// Converts any [[types::signed]] to a string in a given base. The return value is
diff --git a/strconv/stof.ha b/strconv/stof.ha
index e6d5016e..8d191285 100644
--- a/strconv/stof.ha
+++ b/strconv/stof.ha
@@ -1,7 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Sudipto Mallick <smlckz@disroot.org>
// (c) 2021 Vlad-Stefan Harbuz <vlad@vladh.net>

// Using the Eisel-Lemire algorithm [1] for fast parsing of floating-point
// numbers, with Simple Decimal Conversion algorithm [2] as fallback.
diff --git a/strconv/stof_data.ha b/strconv/stof_data.ha
index 08c86860..a09893de 100644
--- a/strconv/stof_data.ha
+++ b/strconv/stof_data.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Sudipto Mallick <smlckz@disroot.org>

const left_shift_table: [65]u16 = [
	0x0000, 0x0800, 0x0801, 0x0803, 0x1006, 0x1009, 0x100D, 0x1812, 0x1817,
diff --git a/strconv/stoi.ha b/strconv/stoi.ha
index 72732343..f63a8b9e 100644
--- a/strconv/stoi.ha
+++ b/strconv/stoi.ha
@@ -1,8 +1,5 @@
// License: MPL-2.0
// (c) 2021 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Andri Yngvason <andri@yngvason.is>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use types;
use strings;

diff --git a/strconv/stou.ha b/strconv/stou.ha
index 34822b7e..e34264bb 100644
--- a/strconv/stou.ha
+++ b/strconv/stou.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021 Andri Yngvason <andri@yngvason.is>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use strings;
use types;
use ascii;
diff --git a/strconv/types.ha b/strconv/types.ha
index a62e0ff0..c0a1b9a9 100644
--- a/strconv/types.ha
+++ b/strconv/types.ha
@@ -1,7 +1,4 @@
// License: MPL-2.0
// (c) 2021 Andri Yngvason <andri@yngvason.is>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

// Indicates that the input string doesn't have the requested number format
// (integer or float). Contains the index of the first invalid rune.
diff --git a/strconv/utos.ha b/strconv/utos.ha
index d55af8f9..fa2fbf3a 100644
--- a/strconv/utos.ha
+++ b/strconv/utos.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021 Andri Yngvason <andri@yngvason.is>
// (c) 2021 Armin Weigl <tb46305@gmail.com>
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use bytes;
use types;

diff --git a/strings/compare.ha b/strings/compare.ha
index ed6123d3..40e3d86b 100644
--- a/strings/compare.ha
+++ b/strings/compare.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

// Compares two strings by their Unicode codepoint sort order. Zero is returned
// if the strings are equal, a negative value if a is less than b, or a positive
// value if a is greater than b.
diff --git a/strings/concat.ha b/strings/concat.ha
index b7cc6755..36775f7b 100644
--- a/strings/concat.ha
+++ b/strings/concat.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

// Concatenates two or more strings. The caller must free the return value.
export fn concat(strs: str...) str = {
diff --git a/strings/contains.ha b/strings/contains.ha
index 65212385..13ffe39b 100644
--- a/strings/contains.ha
+++ b/strings/contains.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2022 Vlad-Stefan Harbuz <vlad@vladh.net>

use bytes;
use encoding::utf8;

diff --git a/strings/dup.ha b/strings/dup.ha
index a0cbe4c5..06923d4a 100644
--- a/strings/dup.ha
+++ b/strings/dup.ha
@@ -1,8 +1,5 @@
// License: MPL-2.0
// (c) 2021-2022 Alexey Yerin <yyp@disroot.org>
// (c) 2022 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use types;

// Duplicates a string. Aborts on allocation failure.
diff --git a/strings/index.ha b/strings/index.ha
index aecfac00..95a12e1f 100644
--- a/strings/index.ha
+++ b/strings/index.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Vlad-Stefan Harbuz <vlad@vladh.net>

use bytes;
use encoding::utf8;

diff --git a/strings/iter.ha b/strings/iter.ha
index 47fde6e5..4f37f7f4 100644
--- a/strings/iter.ha
+++ b/strings/iter.ha
@@ -1,9 +1,5 @@
// License: MPL-2.0
// (c) 2022 Ajay R <ar324@protonmail.com>
// (c) 2021 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021-2022 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Miccah Castorina <contact@miccah.io>

use encoding::utf8;

export type iterator = struct {
diff --git a/strings/pad.ha b/strings/pad.ha
index 4dc91717..a5a51d05 100644
--- a/strings/pad.ha
+++ b/strings/pad.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021 Vlad-Stefan Harbuz <vlad@vladh.net>

use encoding::utf8;

// Pads a string's start with 'prefix' until it reaches length 'target_len'.
diff --git a/strings/replace.ha b/strings/replace.ha
index 146dc7c8..9f542a04 100644
--- a/strings/replace.ha
+++ b/strings/replace.ha
@@ -1,6 +1,4 @@
// License: MPL-2.0
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Vlad-Stefan Harbuz <vlad@vladh.net>

use bytes;

diff --git a/strings/runes.ha b/strings/runes.ha
index 0a152c4e..2f78d984 100644
--- a/strings/runes.ha
+++ b/strings/runes.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Byron Torres <b@torresjrjr.com>

use encoding::utf8;

// Returns a slice of runes for a string in O(n). The caller must free the
diff --git a/strings/sub.ha b/strings/sub.ha
index 5f069a59..05ec151b 100644
--- a/strings/sub.ha
+++ b/strings/sub.ha
@@ -1,8 +1,5 @@
// License: MPL-2.0
// (c) 2021 Andri Yngvason <andri@yngvason.is>
// (c) 2021-2022 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use encoding::utf8;

export type end = void;
diff --git a/strings/suffix.ha b/strings/suffix.ha
index af2a5959..83fade26 100644
--- a/strings/suffix.ha
+++ b/strings/suffix.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Thomas Bracht Laumann Jespersen <t@laumann.xyz>

use bytes;
use encoding::utf8;

diff --git a/strings/template/template.ha b/strings/template/template.ha
index 8fa1d1ec..38c21c88 100644
--- a/strings/template/template.ha
+++ b/strings/template/template.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Drew DeVault <sir@cmpwn.com>

use ascii;
use errors;
use fmt;
diff --git a/strings/tokenize.ha b/strings/tokenize.ha
index 05325478..8c05afb5 100644
--- a/strings/tokenize.ha
+++ b/strings/tokenize.ha
@@ -1,8 +1,5 @@
// License: MPL-2.0
// (c) 2021 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2022 Sebastian <sebastian@sebsite.pw>

use bytes;
use types;

diff --git a/strings/trim.ha b/strings/trim.ha
index a6652165..4633efdc 100644
--- a/strings/trim.ha
+++ b/strings/trim.ha
@@ -1,8 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Miccah Castorina <contact@miccah.io>
// (c) 2021 Sudipto Mallick <smlckz@disroot.org>

use bytes;
use encoding::utf8;

diff --git a/strings/utf8.ha b/strings/utf8.ha
index 8cabd370..c370283f 100644
--- a/strings/utf8.ha
+++ b/strings/utf8.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021-2022 Drew DeVault <sir@cmpwn.com>

use encoding::utf8;
use types;

diff --git a/temp/+freebsd.ha b/temp/+freebsd.ha
index 4112c768..6352c5ae 100644
--- a/temp/+freebsd.ha
+++ b/temp/+freebsd.ha
@@ -1,8 +1,5 @@
// License: MPL-2.0
// (c) 2022 Alexey Yerin <yyp@disroot.org>
// (c) 2021-2022 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2022 Jon Eskin <eskinjp@gmail.com>

use crypto::random;
use encoding::hex;
use errors;
diff --git a/temp/+linux.ha b/temp/+linux.ha
index 92e73ecc..11611d6a 100644
--- a/temp/+linux.ha
+++ b/temp/+linux.ha
@@ -1,8 +1,5 @@
// License: MPL-2.0
// (c) 2022 Alexey Yerin <yyp@disroot.org>
// (c) 2021-2022 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2022 Jon Eskin <eskinjp@gmail.com>

use crypto::random;
use encoding::hex;
use errors;
diff --git a/test/+test.ha b/test/+test.ha
index 20c95d42..cf2feaa7 100644
--- a/test/+test.ha
+++ b/test/+test.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use bufio;
use encoding::hex;
use encoding::utf8;
diff --git a/test/common.ha b/test/common.ha
index f72196e9..0c7948b6 100644
--- a/test/common.ha
+++ b/test/common.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

let want_abort = false;

// Expect the currently running test to abort. The test will fail if it doesn't
diff --git a/test/fail+test.ha b/test/fail+test.ha
index dc557ded..5c9187de 100644
--- a/test/fail+test.ha
+++ b/test/fail+test.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use os;

@test fn _abort() void = {
diff --git a/time/+freebsd/functions.ha b/time/+freebsd/functions.ha
index eaf52d5c..054b9651 100644
--- a/time/+freebsd/functions.ha
+++ b/time/+freebsd/functions.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use rt;

// Converts a [[duration]] to an [[rt::timespec]]. This function is
diff --git a/time/+linux/+aarch64.ha b/time/+linux/+aarch64.ha
index 8a7922fd..621538cc 100644
--- a/time/+linux/+aarch64.ha
+++ b/time/+linux/+aarch64.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Mykyta Holubakha <hilobakho@gmail.com>

def VDSO_CGT_SYM: str = "__kernel_clock_gettime";
def VDSO_CGT_VER: str = "LINUX_2.6.39";
diff --git a/time/+linux/+riscv64.ha b/time/+linux/+riscv64.ha
index 9653d429..6e37d38d 100644
--- a/time/+linux/+riscv64.ha
+++ b/time/+linux/+riscv64.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

def VDSO_CGT_SYM: str = "__kernel_clock_gettime";
def VDSO_CGT_VER: str = "LINUX_4.15";
diff --git a/time/+linux/+x86_64.ha b/time/+linux/+x86_64.ha
index 0c846d20..42f68d02 100644
--- a/time/+linux/+x86_64.ha
+++ b/time/+linux/+x86_64.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Mykyta Holubakha <hilobakho@gmail.com>

def VDSO_CGT_SYM: str = "__vdso_clock_gettime";
def VDSO_CGT_VER: str = "LINUX_2.6";
diff --git a/time/+linux/functions.ha b/time/+linux/functions.ha
index 2a91bace..c6c073e5 100644
--- a/time/+linux/functions.ha
+++ b/time/+linux/functions.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Mykyta Holubakha <hilobakho@gmail.com>

use rt;
use linux::vdso;

diff --git a/time/arithm.ha b/time/arithm.ha
index c4445f81..58101c11 100644
--- a/time/arithm.ha
+++ b/time/arithm.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2022 Byron Torres <b@torresjrjr.com>
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use math;

// Adds a [[duration]] to an [[instant]], returning an instant further in the
diff --git a/time/chrono/+freebsd.ha b/time/chrono/+freebsd.ha
index cdafe82f..7bf88551 100644
--- a/time/chrono/+freebsd.ha
+++ b/time/chrono/+freebsd.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2022 Sebastian <sebastian@sebsite.pw>

def LOCALTIME_PATH: str = "/etc/localtime";
def ZONEINFO_PREFIX: str = "/usr/share/zoneinfo/";
diff --git a/time/chrono/+linux.ha b/time/chrono/+linux.ha
index cdafe82f..7bf88551 100644
--- a/time/chrono/+linux.ha
+++ b/time/chrono/+linux.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2022 Sebastian <sebastian@sebsite.pw>

def LOCALTIME_PATH: str = "/etc/localtime";
def ZONEINFO_PREFIX: str = "/usr/share/zoneinfo/";
diff --git a/time/chrono/arithmetic.ha b/time/chrono/arithmetic.ha
index 47ca1ab7..d1f357aa 100644
--- a/time/chrono/arithmetic.ha
+++ b/time/chrono/arithmetic.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2023 Byron Torres <b@torresjrjr.com>

use time;

// Compares two [[moment]]s. Returns -1 if a precedes b, 0 if a and b are
diff --git a/time/chrono/chronology.ha b/time/chrono/chronology.ha
index e86764a2..f4232cc1 100644
--- a/time/chrono/chronology.ha
+++ b/time/chrono/chronology.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021-2022 Byron Torres <b@torresjrjr.com>

use time;

// Invalid [[moment]].
diff --git a/time/chrono/error.ha b/time/chrono/error.ha
index 78876f5b..8abc8d83 100644
--- a/time/chrono/error.ha
+++ b/time/chrono/error.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Byron Torres <b@torresjrjr.com>

use encoding::utf8;
use fmt;
use fs;
diff --git a/time/chrono/leapsec.ha b/time/chrono/leapsec.ha
index afe2de34..d531ebb3 100644
--- a/time/chrono/leapsec.ha
+++ b/time/chrono/leapsec.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021-2022 Byron Torres <b@torresjrjr.com>

use bufio;
use encoding::utf8;
use fs;
diff --git a/time/chrono/timescale.ha b/time/chrono/timescale.ha
index 0137a0d4..dfcbbd2c 100644
--- a/time/chrono/timescale.ha
+++ b/time/chrono/timescale.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021-2022 Byron Torres <b@torresjrjr.com>

use time;

// Represents a scale of time; a time standard. See [[convert]].
diff --git a/time/chrono/timezone.ha b/time/chrono/timezone.ha
index 9051b6f9..12cdf033 100644
--- a/time/chrono/timezone.ha
+++ b/time/chrono/timezone.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021-2022 Byron Torres <b@torresjrjr.com>

use bufio;
use io;
use os;
diff --git a/time/chrono/tzdb.ha b/time/chrono/tzdb.ha
index 5a1794a2..214369bc 100644
--- a/time/chrono/tzdb.ha
+++ b/time/chrono/tzdb.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021-2022 Byron Torres <b@torresjrjr.com>

use bufio;
use bytes;
use encoding::utf8;
diff --git a/time/conv.ha b/time/conv.ha
index 06660390..048a1563 100644
--- a/time/conv.ha
+++ b/time/conv.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

// Converts a given [[instant]] to a Unix timestamp.
// Note, nanosecond information is lost during conversion.
export fn unix(i: instant) i64 = i.sec;
diff --git a/time/date/date.ha b/time/date/date.ha
index aeb374cb..feb30d09 100644
--- a/time/date/date.ha
+++ b/time/date/date.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021-2022 Byron Torres <b@torresjrjr.com>
// (c) 2022 Drew DeVault <sir@cmpwn.com>

use time;
use time::chrono;

diff --git a/time/date/daydate.ha b/time/date/daydate.ha
index ce77e502..6562702a 100644
--- a/time/date/daydate.ha
+++ b/time/date/daydate.ha
@@ -1,6 +1,4 @@
// License: MPL-2.0
// (c) 2021-2022 Byron Torres <b@torresjrjr.com>
// (c) 2021-2022 Vlad-Stefan Harbuz <vlad@vladh.net>

// Hare internally uses the Unix epoch (1970-01-01) for calendrical logic. Here
// we provide useful constant for working with the astronomically numbered
diff --git a/time/date/daytime.ha b/time/date/daytime.ha
index cdcfdf15..0b811dc1 100644
--- a/time/date/daytime.ha
+++ b/time/date/daytime.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021-2022 Byron Torres <b@torresjrjr.com>

use time;

// Calculates the wall clock (hour, minute, second, nanosecond),
diff --git a/time/date/error.ha b/time/date/error.ha
index 78ee7cdc..dd023c9c 100644
--- a/time/date/error.ha
+++ b/time/date/error.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2023 Byron Torres <b@torresjrjr.com>

// All possible errors returned from [[date]].
export type error = !(insufficient | invalid | parsefail);
diff --git a/time/date/format.ha b/time/date/format.ha
index 72a9fd98..cc249fd8 100644
--- a/time/date/format.ha
+++ b/time/date/format.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021-2022 Byron Torres <b@torresjrjr.com>
// (c) 2022 Drew DeVault <sir@cmpwn.com>
// (c) 2021-2022 Vlad-Stefan Harbuz <vlad@vladh.net>

use ascii;
use fmt;
use io;
diff --git a/time/date/locality.ha b/time/date/locality.ha
index eb7ea52b..c85339da 100644
--- a/time/date/locality.ha
+++ b/time/date/locality.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021-2022 Byron Torres <b@torresjrjr.com>
// (c) 2022 Drew DeVault <sir@cmpwn.com>

use time;
use time::chrono;

diff --git a/time/date/observe.ha b/time/date/observe.ha
index c64f6e54..e3e2b221 100644
--- a/time/date/observe.ha
+++ b/time/date/observe.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021-2022 Byron Torres <b@torresjrjr.com>

use time::chrono;

// These functions are renamed to avoid namespace conflicts, like in the
diff --git a/time/date/parithm.ha b/time/date/parithm.ha
index 5ddc24c6..9be951f4 100644
--- a/time/date/parithm.ha
+++ b/time/date/parithm.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021-2022 Byron Torres <b@torresjrjr.com>
// (c) 2022 Drew DeVault <sir@cmpwn.com>
// (c) 2021-2022 Vlad-Stefan Harbuz <vlad@vladh.net>

use fmt;
use math;
use time;
diff --git a/time/date/parse.ha b/time/date/parse.ha
index 56f0579c..9faa7175 100644
--- a/time/date/parse.ha
+++ b/time/date/parse.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021-2022 Byron Torres <b@torresjrjr.com>
// (c) 2022 Drew DeVault <sir@cmpwn.com>
// (c) 2021-2022 Vlad-Stefan Harbuz <vlad@vladh.net>

use ascii;
use io;
use strconv;
diff --git a/time/date/period.ha b/time/date/period.ha
index d0c8bc8d..bb1db7a2 100644
--- a/time/date/period.ha
+++ b/time/date/period.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2023 Byron Torres <b@torresjrjr.com>

// Represents a span of time in the Gregorian chronology, using nominal units of
// time. Used for chronological arithmetic.
diff --git a/time/date/reckon.ha b/time/date/reckon.ha
index fe4374a5..a18a2de4 100644
--- a/time/date/reckon.ha
+++ b/time/date/reckon.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2023 Byron Torres <b@torresjrjr.com>

use time;
use time::chrono;

diff --git a/time/date/tarithm.ha b/time/date/tarithm.ha
index f8591977..1d6b25f9 100644
--- a/time/date/tarithm.ha
+++ b/time/date/tarithm.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2023 Byron Torres <b@torresjrjr.com>

use time;

// Adds a [[time::duration]] to a [[date]] with [[time::add]]. This is a
diff --git a/time/date/virtual.ha b/time/date/virtual.ha
index f31d400c..d099865b 100644
--- a/time/date/virtual.ha
+++ b/time/date/virtual.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021-2022 Byron Torres <b@torresjrjr.com>

use time;
use time::chrono;

diff --git a/time/types.ha b/time/types.ha
index 5228854c..826aaeae 100644
--- a/time/types.ha
+++ b/time/types.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use types;

// The elapsed time between two instants, in nanoseconds. The largest
diff --git a/types/arch+aarch64.ha b/types/arch+aarch64.ha
index d8538ba4..ea270075 100644
--- a/types/arch+aarch64.ha
+++ b/types/arch+aarch64.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

// Minimum value which can be stored in an int type.
export def INT_MIN: int = I32_MIN;
diff --git a/types/arch+riscv64.ha b/types/arch+riscv64.ha
index d8538ba4..ea270075 100644
--- a/types/arch+riscv64.ha
+++ b/types/arch+riscv64.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

// Minimum value which can be stored in an int type.
export def INT_MIN: int = I32_MIN;
diff --git a/types/arch+x86_64.ha b/types/arch+x86_64.ha
index d8538ba4..ea270075 100644
--- a/types/arch+x86_64.ha
+++ b/types/arch+x86_64.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

// Minimum value which can be stored in an int type.
export def INT_MIN: int = I32_MIN;
diff --git a/types/c/+test.ha b/types/c/+test.ha
index c7e309d7..05c93eea 100644
--- a/types/c/+test.ha
+++ b/types/c/+test.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

@test fn sizes() void = {
	static assert(size(char) == size(schar));
	static assert(size(char) == size(uchar));
diff --git a/types/c/arch+aarch64.ha b/types/c/arch+aarch64.ha
index 492b6739..7576d0f3 100644
--- a/types/c/arch+aarch64.ha
+++ b/types/c/arch+aarch64.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use types;

// Integer type compatible with `char`, as specified by ISO/IEC 9899.
diff --git a/types/c/arch+riscv64.ha b/types/c/arch+riscv64.ha
index 492b6739..7576d0f3 100644
--- a/types/c/arch+riscv64.ha
+++ b/types/c/arch+riscv64.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use types;

// Integer type compatible with `char`, as specified by ISO/IEC 9899.
diff --git a/types/c/arch+x86_64.ha b/types/c/arch+x86_64.ha
index 1ed67904..afb86080 100644
--- a/types/c/arch+x86_64.ha
+++ b/types/c/arch+x86_64.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use types;

// Integer type compatible with `char`, as specified by ISO/IEC 9899.
diff --git a/types/c/strings.ha b/types/c/strings.ha
index 954fa630..30f75123 100644
--- a/types/c/strings.ha
+++ b/types/c/strings.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use encoding::utf8;
use types;

diff --git a/types/c/types.ha b/types/c/types.ha
index b3101dbc..2d22bf09 100644
--- a/types/c/types.ha
+++ b/types/c/types.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use types;

// Integer type compatible with `char8_t`, as defined in <uchar.h> and specified
diff --git a/types/classes.ha b/types/classes.ha
index 4b98d017..c363892b 100644
--- a/types/classes.ha
+++ b/types/classes.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

// A tagged union of all signed integer types.
export type signed = (i8 | i16 | i32 | i64 | int);
diff --git a/types/limits.ha b/types/limits.ha
index 22484d08..4afe9351 100644
--- a/types/limits.ha
+++ b/types/limits.ha
@@ -1,6 +1,4 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Sudipto Mallick <smlckz@disroot.org>

// Minimum value which can be stored in an i8 type.
export def I8_MIN: i8 = -128;
diff --git a/unix/+freebsd/getuid.ha b/unix/+freebsd/getuid.ha
index f5be0b4d..fd3f48a4 100644
--- a/unix/+freebsd/getuid.ha
+++ b/unix/+freebsd/getuid.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use rt;

// Returns the current process user ID.
diff --git a/unix/+freebsd/groups.ha b/unix/+freebsd/groups.ha
index c4aca2cf..6958ba77 100644
--- a/unix/+freebsd/groups.ha
+++ b/unix/+freebsd/groups.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use rt;

// Returns a list of supplementary group IDs for the current process.
diff --git a/unix/+freebsd/nice.ha b/unix/+freebsd/nice.ha
index 7ea10ecf..a7b881b5 100644
--- a/unix/+freebsd/nice.ha
+++ b/unix/+freebsd/nice.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use errors;
use rt;

diff --git a/unix/+freebsd/pipe.ha b/unix/+freebsd/pipe.ha
index 1dd04662..15ba938e 100644
--- a/unix/+freebsd/pipe.ha
+++ b/unix/+freebsd/pipe.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use errors;
use io;
use rt;
diff --git a/unix/+freebsd/setuid.ha b/unix/+freebsd/setuid.ha
index 5c379535..a870af71 100644
--- a/unix/+freebsd/setuid.ha
+++ b/unix/+freebsd/setuid.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use rt;

// Sets the caller's user ID to the specified value. This generally requires
diff --git a/unix/+freebsd/umask.ha b/unix/+freebsd/umask.ha
index dba1eec3..27f6bfcb 100644
--- a/unix/+freebsd/umask.ha
+++ b/unix/+freebsd/umask.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use fs;
use rt;

diff --git a/unix/+linux/getuid.ha b/unix/+linux/getuid.ha
index f5be0b4d..fd3f48a4 100644
--- a/unix/+linux/getuid.ha
+++ b/unix/+linux/getuid.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>

use rt;

// Returns the current process user ID.
diff --git a/unix/+linux/groups.ha b/unix/+linux/groups.ha
index c4aca2cf..6958ba77 100644
--- a/unix/+linux/groups.ha
+++ b/unix/+linux/groups.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use rt;

// Returns a list of supplementary group IDs for the current process.
diff --git a/unix/+linux/nice.ha b/unix/+linux/nice.ha
index 7ea10ecf..a7b881b5 100644
--- a/unix/+linux/nice.ha
+++ b/unix/+linux/nice.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use errors;
use rt;

diff --git a/unix/+linux/pipe.ha b/unix/+linux/pipe.ha
index 50b84806..15ba938e 100644
--- a/unix/+linux/pipe.ha
+++ b/unix/+linux/pipe.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use errors;
use io;
use rt;
diff --git a/unix/+linux/setuid.ha b/unix/+linux/setuid.ha
index 5c379535..a870af71 100644
--- a/unix/+linux/setuid.ha
+++ b/unix/+linux/setuid.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use rt;

// Sets the caller's user ID to the specified value. This generally requires
diff --git a/unix/+linux/umask.ha b/unix/+linux/umask.ha
index c344f96e..3bc16fbb 100644
--- a/unix/+linux/umask.ha
+++ b/unix/+linux/umask.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Umar Getagazov <umar@handlerug.me>

use fs;
use rt;

diff --git a/unix/hosts/+freebsd.ha b/unix/hosts/+freebsd.ha
index 69220e9e..443628af 100644
--- a/unix/hosts/+freebsd.ha
+++ b/unix/hosts/+freebsd.ha
@@ -1,4 +1,3 @@
// License: MPL-2.0
// (c) 2022 Sebastian <sebastian@sebsite.pw>

def PATH: str = "/etc/hosts";
diff --git a/unix/hosts/+linux.ha b/unix/hosts/+linux.ha
index 69220e9e..443628af 100644
--- a/unix/hosts/+linux.ha
+++ b/unix/hosts/+linux.ha
@@ -1,4 +1,3 @@
// License: MPL-2.0
// (c) 2022 Sebastian <sebastian@sebsite.pw>

def PATH: str = "/etc/hosts";
diff --git a/unix/hosts/hosts.ha b/unix/hosts/hosts.ha
index e8913984..6ce5f5de 100644
--- a/unix/hosts/hosts.ha
+++ b/unix/hosts/hosts.ha
@@ -1,8 +1,5 @@
// License: MPL-2.0
// (c) 2023 Dmitry Matveyev <public@greenfork.me>
// (c) 2022 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use bufio;
use encoding::utf8;
use fs;
diff --git a/unix/hosts/test+test.ha b/unix/hosts/test+test.ha
index 138fb7df..cba84752 100644
--- a/unix/hosts/test+test.ha
+++ b/unix/hosts/test+test.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2023 Dmitry Matveyev <public@greenfork.me>

use io;
use memio;
use net::ip;
diff --git a/unix/passwd/group.ha b/unix/passwd/group.ha
index 8d0f9995..5b79c989 100644
--- a/unix/passwd/group.ha
+++ b/unix/passwd/group.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021-2022 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use bufio;
use io;
use memio;
diff --git a/unix/passwd/passwd.ha b/unix/passwd/passwd.ha
index 7fd77038..c5e3b36f 100644
--- a/unix/passwd/passwd.ha
+++ b/unix/passwd/passwd.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021-2022 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use bufio;
use io;
use memio;
diff --git a/unix/passwd/types.ha b/unix/passwd/types.ha
index a5030d76..0122bf6c 100644
--- a/unix/passwd/types.ha
+++ b/unix/passwd/types.ha
@@ -1,6 +1,4 @@
// License: MPL-2.0
// (c) 2021 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

// An invalid entry was encountered during parsing.
export type invalid = !void;
diff --git a/unix/poll/+freebsd.ha b/unix/poll/+freebsd.ha
index a0dcb246..2d41ab36 100644
--- a/unix/poll/+freebsd.ha
+++ b/unix/poll/+freebsd.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use errors;
use io;
use rt;
diff --git a/unix/poll/+linux.ha b/unix/poll/+linux.ha
index 7ac7207d..6041d359 100644
--- a/unix/poll/+linux.ha
+++ b/unix/poll/+linux.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use errors;
use io;
use rt;
diff --git a/unix/poll/types.ha b/unix/poll/types.ha
index bf483bb9..a88910ae 100644
--- a/unix/poll/types.ha
+++ b/unix/poll/types.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use errors;

// All error types that can be returned from [[poll]].
diff --git a/unix/resolvconf/+freebsd.ha b/unix/resolvconf/+freebsd.ha
index d96f585a..a38a7fdf 100644
--- a/unix/resolvconf/+freebsd.ha
+++ b/unix/resolvconf/+freebsd.ha
@@ -1,4 +1,3 @@
// License: MPL-2.0
// (c) 2022 Sebastian <sebastian@sebsite.pw>

def PATH: str = "/etc/resolv.conf";
diff --git a/unix/resolvconf/+linux.ha b/unix/resolvconf/+linux.ha
index d96f585a..a38a7fdf 100644
--- a/unix/resolvconf/+linux.ha
+++ b/unix/resolvconf/+linux.ha
@@ -1,4 +1,3 @@
// License: MPL-2.0
// (c) 2022 Sebastian <sebastian@sebsite.pw>

def PATH: str = "/etc/resolv.conf";
diff --git a/unix/resolvconf/load.ha b/unix/resolvconf/load.ha
index ddf97216..8e7dbedf 100644
--- a/unix/resolvconf/load.ha
+++ b/unix/resolvconf/load.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2022 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use bufio;
use io;
use memio;
diff --git a/unix/signal/+freebsd.ha b/unix/signal/+freebsd.ha
index aca65bf7..c3532dc3 100644
--- a/unix/signal/+freebsd.ha
+++ b/unix/signal/+freebsd.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use io;
use rt;

diff --git a/unix/signal/+linux.ha b/unix/signal/+linux.ha
index 4a2f2f44..f183a05d 100644
--- a/unix/signal/+linux.ha
+++ b/unix/signal/+linux.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Drew DeVault <sir@cmpwn.com>

use errors;
use io;
use rt;
diff --git a/unix/signal/types.ha b/unix/signal/types.ha
index 7883ac1b..dafa047b 100644
--- a/unix/signal/types.ha
+++ b/unix/signal/types.ha
@@ -1,5 +1,4 @@
// License: MPL-2.0
// (c) 2022 Drew DeVault <sir@cmpwn.com>

// A function which handles a signal. The first argument is the signal number
// which was caught, the second provides information about the signal, and the
diff --git a/unix/tty/+freebsd/isatty.ha b/unix/tty/+freebsd/isatty.ha
index 6924f3b6..fcc19080 100644
--- a/unix/tty/+freebsd/isatty.ha
+++ b/unix/tty/+freebsd/isatty.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use rt;
use io;
use os;
diff --git a/unix/tty/+freebsd/open.ha b/unix/tty/+freebsd/open.ha
index abe9a838..4c98ed88 100644
--- a/unix/tty/+freebsd/open.ha
+++ b/unix/tty/+freebsd/open.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use errors;
use fs;
use io;
diff --git a/unix/tty/+freebsd/pty.ha b/unix/tty/+freebsd/pty.ha
index 7c94c449..ca974f55 100644
--- a/unix/tty/+freebsd/pty.ha
+++ b/unix/tty/+freebsd/pty.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Re Elbertson <citrons@mondecitronne.com>

use errors;
use fmt;
use fs;
diff --git a/unix/tty/+freebsd/termios.ha b/unix/tty/+freebsd/termios.ha
index 0120306f..4de54347 100644
--- a/unix/tty/+freebsd/termios.ha
+++ b/unix/tty/+freebsd/termios.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use io;
use rt;
use errors;
diff --git a/unix/tty/+freebsd/winsize.ha b/unix/tty/+freebsd/winsize.ha
index daade762..7f89ff73 100644
--- a/unix/tty/+freebsd/winsize.ha
+++ b/unix/tty/+freebsd/winsize.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use errors;
use io;
use os;
diff --git a/unix/tty/+linux/isatty.ha b/unix/tty/+linux/isatty.ha
index ecc3419a..fcc19080 100644
--- a/unix/tty/+linux/isatty.ha
+++ b/unix/tty/+linux/isatty.ha
@@ -1,8 +1,5 @@
// License: MPL-2.0
// (c) 2021 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Kiëd Llaentenn <kiedtl@tilde.team>

use rt;
use io;
use os;
diff --git a/unix/tty/+linux/open.ha b/unix/tty/+linux/open.ha
index 10ef8edb..4c98ed88 100644
--- a/unix/tty/+linux/open.ha
+++ b/unix/tty/+linux/open.ha
@@ -1,8 +1,5 @@
// License: MPL-2.0
// (c) 2021 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Kiëd Llaentenn <kiedtl@tilde.team>

use errors;
use fs;
use io;
diff --git a/unix/tty/+linux/pty.ha b/unix/tty/+linux/pty.ha
index 082845b1..2d13ecb4 100644
--- a/unix/tty/+linux/pty.ha
+++ b/unix/tty/+linux/pty.ha
@@ -1,5 +1,5 @@
// License: MPL-2.0
// (c) 2022 Re Elbertson <citrons@mondecitronne.com>

use errors;
use fmt;
use fs;
diff --git a/unix/tty/+linux/termios.ha b/unix/tty/+linux/termios.ha
index 356ff64e..dce90c4b 100644
--- a/unix/tty/+linux/termios.ha
+++ b/unix/tty/+linux/termios.ha
@@ -1,6 +1,5 @@
// License: MPL-2.0
// (c) 2021 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

// TODO: Not in love with this interface
use io;
use rt;
diff --git a/unix/tty/+linux/winsize.ha b/unix/tty/+linux/winsize.ha
index d3929efd..4c55a218 100644
--- a/unix/tty/+linux/winsize.ha
+++ b/unix/tty/+linux/winsize.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Kiëd Llaentenn <kiedtl@tilde.team>

use errors;
use io;
use os;
diff --git a/unix/tty/pty_common.ha b/unix/tty/pty_common.ha
index 9fb29c8b..53a26a90 100644
--- a/unix/tty/pty_common.ha
+++ b/unix/tty/pty_common.ha
@@ -1,3 +1,5 @@
// License: MPL-2.0

use bufio;
use fmt;
use fs;
diff --git a/unix/tty/types.ha b/unix/tty/types.ha
index 01f629b5..2a560aa9 100644
--- a/unix/tty/types.ha
+++ b/unix/tty/types.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2021 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Ember Sawady <ecs@d2evs.net>
// (c) 2021 Kiëd Llaentenn <kiedtl@tilde.team>

use errors;

// Any error that may occur during TTY-related tasks.
diff --git a/uuid/uuid.ha b/uuid/uuid.ha
index faa0c491..002439d2 100644
--- a/uuid/uuid.ha
+++ b/uuid/uuid.ha
@@ -1,7 +1,5 @@
// License: MPL-2.0
// (c) 2022 Alexey Yerin <yyp@disroot.org>
// (c) 2021 Drew DeVault <sir@cmpwn.com>
// (c) 2021 Ember Sawady <ecs@d2evs.net>

use bytes;
use crypto::random;
use endian;
-- 
2.42.0

[hare/patches] build success

builds.sr.ht <builds@sr.ht>
Details
Message ID
<CVJ3SE1YSWSF.GUQ8I07SL5QZ@cirno2>
In-Reply-To
<20230915013313.9935-1-ecs@d2evs.net> (view parent)
DKIM signature
missing
Download raw message
hare/patches: SUCCESS in 1m25s

[replace copyright headers with license headers][0] v2 from [Ember Sawady][1]

[0]: https://lists.sr.ht/~sircmpwn/hare-dev/patches/44731
[1]: ecs@d2evs.net

✓ #1057885 SUCCESS hare/patches/freebsd.yml https://builds.sr.ht/~sircmpwn/job/1057885
✓ #1057884 SUCCESS hare/patches/alpine.yml  https://builds.sr.ht/~sircmpwn/job/1057884
Details
Message ID
<ZQO-hzAezv8GWI8Z@cloudsdale.the-delta.net.eu.org>
In-Reply-To
<20230915013313.9935-1-ecs@d2evs.net> (view parent)
DKIM signature
missing
Download raw message
- I think there should still be a form of authorship, specially given that both are copyleft and MPL-2.0 makes it likely to be vendored/reused elsewhere, people typically fail at adding authorship when doing so (and you'd end up with different author lines in third-party software).
   For example:

     Copyright 2019 Hare Authors <https://harelang.org>

- Any reason to not use SPDX-License-Identifier? Which would also mean explicit disambiguity between GPL-3.0-only and GPL-3.0-or-later

(Those two would mean REUSE compatibility btw)
Details
Message ID
<CVJ5RQGC6T6I.T4ZQ9Z43J9P4@monch>
In-Reply-To
<ZQO-hzAezv8GWI8Z@cloudsdale.the-delta.net.eu.org> (view parent)
DKIM signature
missing
Download raw message
On Fri Sep 15, 2023 at 2:16 AM UTC, Haelwenn (lanodan) Monnier wrote:
> - I think there should still be a form of authorship, specially given that both are copyleft and MPL-2.0 makes it likely to be vendored/reused elsewhere, people typically fail at adding authorship when doing so (and you'd end up with different author lines in third-party software).
>    For example:
>
>      Copyright 2019 Hare Authors <https://harelang.org>

dislike having the year here, could do something like

// License: MPL-2.0
// (c) Hare authors <https://harelang.org>

modelled after what we currently do

> - Any reason to not use SPDX-License-Identifier? Which would also mean explicit disambiguity between GPL-3.0-only and GPL-3.0-or-later

iirc Drew doesn't like SPDX-License-Identifier? i don't really care
though, and switching to GPL-3.0-only sounds reasonable
Details
Message ID
<ZQP24De5hqbv6Rod@fluorine.ljabl.com>
In-Reply-To
<ZQO-hzAezv8GWI8Z@cloudsdale.the-delta.net.eu.org> (view parent)
DKIM signature
missing
Download raw message
Quoth Haelwenn (lanodan) Monnier:
>- I think there should still be a form of authorship, specially 
>given that both are copyleft and MPL-2.0 makes it likely to be 
>vendored/reused elsewhere, people typically fail at adding 
>authorship when doing so (and you'd end up with different author 
>lines in third-party software).
>  For example:
>
>    Copyright 2019 Hare Authors <https://harelang.org>

To me, this seems useless.   “This file was authored by its 
authors.”   What difference is there between vendored copies 
having no such legally useless “copyright line” at all and having 
one that doesn’t even provide the perceived benefit of some kind 
of credit, like the explicit ones would?
Details
Message ID
<ZQP7-0bkaviXbKn3@cloudsdale.the-delta.net.eu.org>
In-Reply-To
<CVJ5RQGC6T6I.T4ZQ9Z43J9P4@monch> (view parent)
DKIM signature
missing
Download raw message
[2023-09-15 03:07:55+0000] Ember Sawady:
>On Fri Sep 15, 2023 at 2:16 AM UTC, Haelwenn (lanodan) Monnier wrote:
>> - I think there should still be a form of authorship, specially given that both are copyleft and MPL-2.0 makes it likely to be vendored/reused elsewhere, people typically fail at adding authorship when doing so (and you'd end up with different author lines in third-party software).
>>    For example:
>>
>>      Copyright 2019 Hare Authors <https://harelang.org>
>
>dislike having the year here, could do something like
>
>// License: MPL-2.0
>// (c) Hare authors <https://harelang.org>
>
>modelled after what we currently do

Works for me

>> - Any reason to not use SPDX-License-Identifier? Which would also mean explicit disambiguity between GPL-3.0-only and GPL-3.0-or-later
>
>iirc Drew doesn't like SPDX-License-Identifier? i don't really care
>though, and switching to GPL-3.0-only sounds reasonable

I wish it would be a bit shorter / easier to remember, but sadly REUSE only supports this one.
Not a bit deal but maybe see if it can be changed in the spec?
Reply to thread Export thread (mbox)