Skip to content

Tags

Tags give the ability to mark specific points in history as being important
  • upstream/0.25.2
    Upstream version 0.25.2
  • debian/0.24.2-4
    a845dbd3 · Upload to unstable ·
    Debian release 0.24.2-4
    
  • debian/0.24.2-3
    11c978de · Upload to unstable ·
    Debian release 0.24.2-3
    
  • debian/0.24.2-2
    3eb4c365 · Upload to unstable ·
    Debian release 0.24.2-2
    
  • debian/0.24.2-1
    Debian release 0.24.2-1
    
  • upstream/0.24.2
    Upstream version 0.24.2
    
  • 0.24.2
    Hare 0.24.2
    
    This is the stable release of Hare 0.24.2. Highlights of this release
    include:
    
    * NetBSD support
    * for-each loops and the "done" type
    * Optional parameters for functions
    * Support for shared memory and memfds on supported platforms
    * Revised and improved APIs for unix::*
    * Improved performance for bufio and related APIs
    * regex:: now supports multiple alternation (i.e. (x|y|z))
    * New cryptography APIs:
      * crypto::ec
      * crypto::ecdh
      * crypto::ecdsa
    
    This release includes a number of breaking changes.
    
    The introduction of the "done" type to improve the iterator pattern
    introduces the following changes:
    
    * "done" is now a reserved word and cannot be used in user-defined names
    * The following standard library symbols have been updated to use done
      types in their API:
      * bytes::next_token/bytes::prev_token
      * encoding::utf8
      * fs::next
      * glob::next
      * io::EOF
      * mime
      * path::nextiter
      * strings::next/strings::prev
      * strings::next_token/strings::prev_token
      * In short, if your program matches on a function using the iterator
        pattern with "void" and this causes an error from 0.24.2, the
        correct solution is likely to rewrite it to use a for-each loop, or
        replace "void" with "done" in the relevant match case.
    
    bytes::tokenize now accepts multiple single-byte delimiters and removes
    support for multi-byte delimiters. strings::tokenize accepts multiple
    delimiters, limited to the set of ASCII characters.
    
    The following APIs have been overhauled and programs depending on them
    may need to be refactored:
    
    * unix::hosts
    * unix::passwd
    
    Several breaking changes have been made to time:
    
    * time::date now accepts a zone offset (zoff) parameter in
      time::date::reckon and time::date::truncate.
    * time::date::calculus has been renamed to time::date::rflag.
    * time::date::realize requires .vloc to be set, and no longer defaults
      to UTC.
    * time::date::now() is renamed to time::date::localnow() and
      time::date::nowutc() is renamed to time::date::now()
    * time::date::EPOCHAL_JULIAN and EPOCHAL_GREGORIAN have been renamed to
      EPOCHDAY_JULIAN and EPOCHDAY_GREGORIAN respectively
    * time::chrono::eq has been removed and replaced with
      time::chrono::simultaneous and time::chrono::coincident
    * time::chrono::mzone has been renamed to time::chrono::ozone
    * The type of time::date::parsefail has been chnaged from rune (storing
      the offending format specifier) to (size, rune), which adds the index
      of the position where the parsing failure occured.
    * Several constants for format layouts in time::date have been renamed:
      [[EMAILZ]] => [[EMAILZONE]]
      [[STAMP_NANO]] => [[STAMPNANO]]
      [[STAMP_ZOFF]] => [[STAMPZOFF]]
      [[STAMP_ZONE]] => [[STAMPZONE]]
      [[STAMP_NOZL]] => [[STAMPLOC]]
    
    strconv's "b" family of functions (those which accept a base for the
    conversion) have been removed, and the remaining functions accept the
    desired base as an optional parameter.
    
    The following modules have been removed from the standard library and
    placed in the extended library:
    
    * crypto::bcrypt
      https://git.sr.ht/~sircmpwn/hare-bcrypt
    * format::tar
      https://git.sr.ht/~sircmpwn/hare-tar
    
    Alexey Yerin (8):
          sort: Replace []void with []opaque in README
          os+linux: Match resolve_flag values with OS flag values
          strconv: Merge functions with their -b versions
          all: Use optional parameters for flags
          cmd/haredoc: Correctly display HTML module references
          Use 'def' globals where possible
          hare::unparse: Add 'done' literal
          net::uri: Clean up memory handling after failure
    
    Andreas Schwab (1):
          debug+riscv: use correct comment syntax
    
    Armin Preiml (30):
          asn1: add types and errors
          asn1: encoder
          asn1: decoder
          asn1: oid support
          asn1: add decode support for non utf8 string types
          asn1: add readme
          add crypto::ec
          crypto::ec: port the i31 p256 implementation from BearSSL
          crypto::ec: port the prime implementation from BearSSL
          crypto::ec: add max sz constants for static allocation
          add crypto::ecdh
          crypto::ecdha: testcases
          crypto::hmac: fix fail when buf is non-zero
          crypto: s/eliptic curve/elliptic curve
          crypto::sha512: export BLOCKSZ
          net::{tcp,unix}: set default values for flags
          strings::sub: end as default parameter
          crypto::ec: improve doc on curve parameters
          add crypto::ecdsa
          crypto::ecdsa: implement hmac_drbg
          crypto::ecdsa: key management functions
          crypto::ecdsa: implement sign and verify
          crypto::ecdsa: validation test
          crypto::ecdsa: add testcases from RFC 6979
          ecdsa: fix docs
          encoding::asn1: fix doc references
          os::exec: open /dev/null with RDWR flag on nullfd
          crypto::ecdsa: change api to match other crypto apis
          crypto:ec: be more strict with return values
          crypto::ecdsa: add privkey_finish
    
    Bor Grošelj Simić (11):
          ascii: fix compare-by-subtraction in strcasecmp
          test: don't count result interpretation in consumed time
          crypto/ec: remove trailing empty lines
          mime: add license headers for +platform files
          encoding::base64: rewrite decoder
          encoding::base64: improve encoder struct size
          encoding::base64: document behavior after errors
          regex: fix typos in error messages
          make bootstrap
          all: drop trailing ... in functions that are not variadic
          os::move: fix invalid match usage
    
    Byron Torres (43):
          time::chrono: leap-seconds.list whitespace parsing
          fmt: improve docs
          time::chrono: rename _lookupzone to lookupzone
          time::chrono: improve LOCAL, tz()
          time::chrono: moment.daytime: i64, not duration
          time::chrono: rename mzone to ozone
          time::chrono: rename path constant exports
          time::date: rename some calc functions
          time::date: make type insufficient an enum
          time::date: change type parsefail, add byteindex
          time::date: change, add layout constants
          time::date: virtual: add .vsec, .vnsec
          test: add HARETEST_INCLUDE, require(); slow tests
          time::chrono: improve LOCAL docs
          time::chrono: rm eq; add simultaneous, coincident
          time::date: improve observer fn docs
          time::date: improve new() docs
          time::date: rename epochal day constants
          time::date: improve realize() docs, describe .hour
          time::date: rename .halfhour to .hour12
          time::date: rename nowutc(), now(), use localnow()
          time::date: use "virtual date" phrase in docs
          getopt: README: use for-each
          time::chrono: lookupzone: use sort
          time::chrono: make zoneindex type size
          time::date: use nomimal constants throughout
          time::date: realize: require .vloc, no UTC default
          time::date: rename calculus to rflag
          time::date: add zflag enum, zfunresolved error
          time::date: implement zflag in realize()
          time::date: implement zflag in new()
          time::date: implement zflag in from_str()
          time::date: implement zflag in truncate()
          time::date: implement zflag in reckon()
          time::date: realize: fix v.year
          time::date: fix week(), isoweek()
          time::date: format: tidy
          time::date: format: fix
          time::date: format: docs
          time::date: format: add %G, %V, ISOWKSTAMP
          time::date: format: layout docs
          time::date: README: mention ISO week-numbering cal
          bufio: replace 'file' with 'h'
    
    Cephon Altera (1):
          added `os::hostname()` to OpenBSD
    
    Curtis Arthaud (9):
          syscalls: add utimensat, futimens
          os: add chtimes, fchtimes
          syscalls: add fchmod, fchown
          os: add fchmod, fchown
          time::date: add v.century, v.year100
          fmt: clarify docs
          syscalls: add clock_settime
          time: add set()
          time: set(): don't abort on EPERM
    
    Drew DeVault (44):
          rt+openbsd: add missing copyright headers
          encoding::asn1: clean up doc strings and style
          add docs/release.md
          cmd/hare: add toolchains to hare version -v
          rt+freebsd: expand ioctl support
          unix::tty: add tcsetpgrp
          unix::signal: add sigset_fill
          docs: drop docs which are obsoleted by harelang.org
          unix: unify and normalize credentials
          bytes: refactor tokenize
          unix, rt: add alarm(2) support
          unix::signal: add sigwait(2) family of functions
          rt+linux: fix getpgrp, alarm for !x86_64
          make bootstrap
          make bootstrap
          debug: updates per for-each support
          debug: fix issues with invalid frame pointers
          rt+linux: MCL_*: change type to uint
          hare(1): don't auto-add -lc if freestanding
          encoding::hex::dump: add optional base address
          .builds: disable NetBSD
          rt: rewrite platform_abort to use writev
          .builds/netbsd.yml: restore file path
          MAINTAINERS: Add Mallory Adams
          .builds/netbsd: install to /usr
          os: add shared memory support
          regex: use bufio::scanner for enumerating runes
          crypto::bcrypt: move to extlib
          format::ini: use bufio::scanner
          bytes::tokenize: clean up code
          bytes, strings::tokenize: support multiple delimiters
          unix::passwd: use bufio::scanner and refine API
          time::chrono: parse leap seconds with bufio::scanner
          unix::tty: use bufio::scanner for +test
          cmd/harec: remove
          cmd/ioctlgen: remove
          format::tar: move to extlib
          unix::hosts: rewrite with bufio::scanner
          unix::resolvconf: rewrite and expand parser
          Add missing copyright headers
          README.md: drop explanation of non-free spec license
          scripts/version: set version to 0.24.2-rc2
          errors: add netunreachable
          scripts/version: upgrade to 0.24.2
    
    Dridi Boukelmoune (1):
          Makefile: Build haredoc(1) with LDLINKFLAGS
    
    Ember Sawady (7):
          hare build: create empty td file if necessary
          hare build: pass -a to harec
          output to ./foo on `hare build foo.ha`
          rt::u64tos: return *[*]const u8 rather than *const u8
          get rid of trailing empty lines
          os::exec: add fallback for pre-faccessat2 linux
          os::exec: fix cmd() error case
    
    Hugo Osvaldo Barrera (5):
          os::exec: return concrete error when feasible
          syscalls: add setxattr
          syscalls: add getxattr
          syscalls: add removexattr
          os: add wrappers for xattr syscalls
    
    Jeremy Baxter (1):
          fix bootstrapping and installation link in readme
    
    Joe Finney (5):
          strconv: Simplify and fix bugs in stoi/stou.
          strconv: Minor stylistic fixes for stoi/stou.
          Update hare::parse for optional function params.
          Make bufio::newscanner's maxread parameter optional.
          Handle base::HEX_LOWER in stof and stou.
    
    Lennart Jablonka (3):
          rt: add TIOCSPGRP to +linux and +openbsd
          rt/+openbsd: add getpgid
          rt/+openbsd: fix writev syscall
    
    Lorenz (xha) (4):
          for-each changes
          mime: make SYSTEM_DB platform-dependent (fix openbsd)
          TREES: remove openbsd
          openbsd: remove the step for downloading leap-seconds.list
    
    Mallory Adams (5):
          hare::lex: allow digit separators
          all: replace spaces with tabs
          NetBSD: port Hare to NetBSD/amd64
          NetBSD: make the build pass, replace all compat syscalls
          NetBSD: add os::shm_open()
    
    Martin Quinson (1):
          Fix 102 memleaks in the stdlib tests
    
    Max Schillinger (4):
          regex: implement whole-expression alternation
          regex: fix typo in error message
          regex: implement multiple alternation
          bufio: remove scanner inefficiency
    
    Mykyta Holubakha (3):
          std: fix some low-hanging memory leaks
          tests: fix low-hanging memory leaks
          net/uri: fix some leaks
    
    Philipp Wolfer (1):
          haredoc: fix call to log warnings
    
    Sebastian (30):
          TREES: add harec-plus-plus (april fools 2024)
          regex: get rid of unnecessary void casts
          crypto::ec: replace pointer cast with integer cast
          regex: fix inexhaustive match
          debug: fix inexhaustive match
          debug: ignore io::close error in printframe
          debug: remove error assertion from signal handler
          test: fix require's signature outside of +test
          types: note where uintptr is excluded
          fmt: change order of tagged union return types
          fmt: remove unused variable
          fmt: ignore error in fatal/fatalf
          types::c+test: remove sizes test
          types::c: add strnlen
          types::c+test: add strlen and strnlen tests
          strings: mention == in strings::compare docs
          all: add trailing :: to module references
          strings: return done from peek_token
          bytes: return done from next_token/peek_token
          mime: return done from next_param
          fs: update documentation to use done
          test: color skipped tests gray
          test: fail gracefully on stack overflow
          math::checked: fix subi* with *_MAX and *_MIN
          math::checked: cast to int/uint
          math::checked: add saturating arithmetic functions
          haredoc: warn and continue on parsing error
          haredoc: fix accidental reuse of static string
          encoding::utf8: return done from next/prev
          hare.1: add note about poor error message quality
    
    Song Shuai (1):
          genbootstrap: Use '$@' in the rule for ssa target
    
    Vlad-Stefan Harbuz (1):
          haredoc: fix symbol links
    
    Willow Barraco (2):
          Help reading inotify_events
          unix::passwd: implement getgroups
    
    citrons (2):
          hare::module::find(): fix symlink resolution
          hare::module::find(): provide more error context
    
    lunacb (1):
          Make glob::strerror's buffer static
    
    spxtr (3):
          strconv: add sto(f64|f32)b with hex base support.
          hare::lex: lex hex.
          Remove most unused imports.
    
    ubq323 (1):
          math: add TAU constant
    
    wackbyte (3):
          follow style guide for void match/switch cases
          fix mixed indentation
          time::date: fix typo
    
  • 0.24.2-rc2
    Hare 0.24.2-rc2
    
    This is the second release candiate of Hare 0.24.2. Highlights of this
    release include:
    
    * NetBSD support
    * for-each loops and the "done" type
    * Optional parameters for functions
    * Support for shared memory and memfds on supported platforms
    * Revised and improved APIs for unix::*
    * Improved performance for bufio and related APIs
    * regex:: now supports multiple alternation (i.e. (x|y|z))
    * New cryptography APIs:
      * crypto::ec
      * crypto::ecdh
      * crypto::ecdsa
    
    This release includes a number of breaking changes.
    
    The introduction of the "done" type to improve the iterator pattern
    introduces the following changes:
    
    * "done" is now a reserved word and cannot be used in user-defined names
    * The following standard library symbols have been updated to use done
      types in their API:
      * bytes::next_token/bytes::prev_token
      * encoding::utf8
      * fs::next
      * glob::next
      * io::EOF
      * mime
      * path::nextiter
      * strings::next/strings::prev
      * strings::next_token/strings::prev_token
      * In short, if your program matches on a function using the iterator
        pattern with "void" and this causes an error from 0.24.2, the
        correct solution is likely to rewrite it to use a for-each loop, or
        replace "void" with "done" in the relevant match case.
    
    bytes::tokenize now accepts multiple single-byte delimiters and removes
    support for multi-byte delimiters. strings::tokenize accepts multiple
    delimiters, limited to the set of ASCII characters.
    
    The following APIs have been overhauled and programs depending on them
    may need to be refactored:
    
    * unix::hosts
    * unix::passwd
    
    Several breaking changes have been made to time:
    
    * time::date now accepts a zone offset (zoff) parameter in
      time::date::reckon and time::date::truncate.
    * time::date::calculus has been renamed to time::date::rflag.
    * time::date::realize requires .vloc to be set, and no longer defaults
      to UTC.
    * time::date::now() is renamed to time::date::localnow() and
      time::date::nowutc() is renamed to time::date::now()
    * time::date::EPOCHAL_JULIAN and EPOCHAL_GREGORIAN have been renamed to
      EPOCHDAY_JULIAN and EPOCHDAY_GREGORIAN respectively
    * time::chrono::eq has been removed and replaced with
      time::chrono::simultaneous and time::chrono::coincident
    * time::chrono::mzone has been renamed to time::chrono::ozone
    * The type of time::date::parsefail has been chnaged from rune (storing
      the offending format specifier) to (size, rune), which adds the index
      of the position where the parsing failure occured.
    * Several constants for format layouts in time::date have been renamed:
      [[EMAILZ]] => [[EMAILZONE]]
      [[STAMP_NANO]] => [[STAMPNANO]]
      [[STAMP_ZOFF]] => [[STAMPZOFF]]
      [[STAMP_ZONE]] => [[STAMPZONE]]
      [[STAMP_NOZL]] => [[STAMPLOC]]
    
    strconv's "b" family of functions (those which accept a base for the
    conversion) have been removed, and the remaining functions accept the
    desired base as an optional parameter.
    
    The following modules have been removed from the standard library and
    placed in the extended library:
    
    * crypto::bcrypt
      https://git.sr.ht/~sircmpwn/hare-bcrypt
    * format::tar
      https://git.sr.ht/~sircmpwn/hare-tar
    
    Alexey Yerin (7):
          sort: Replace []void with []opaque in README
          os+linux: Match resolve_flag values with OS flag values
          strconv: Merge functions with their -b versions
          all: Use optional parameters for flags
          cmd/haredoc: Correctly display HTML module references
          Use 'def' globals where possible
          hare::unparse: Add 'done' literal
    
    Andreas Schwab (1):
          debug+riscv: use correct comment syntax
    
    Armin Preiml (30):
          asn1: add types and errors
          asn1: encoder
          asn1: decoder
          asn1: oid support
          asn1: add decode support for non utf8 string types
          asn1: add readme
          add crypto::ec
          crypto::ec: port the i31 p256 implementation from BearSSL
          crypto::ec: port the prime implementation from BearSSL
          crypto::ec: add max sz constants for static allocation
          add crypto::ecdh
          crypto::ecdha: testcases
          crypto::hmac: fix fail when buf is non-zero
          crypto: s/eliptic curve/elliptic curve
          crypto::sha512: export BLOCKSZ
          net::{tcp,unix}: set default values for flags
          strings::sub: end as default parameter
          crypto::ec: improve doc on curve parameters
          add crypto::ecdsa
          crypto::ecdsa: implement hmac_drbg
          crypto::ecdsa: key management functions
          crypto::ecdsa: implement sign and verify
          crypto::ecdsa: validation test
          crypto::ecdsa: add testcases from RFC 6979
          ecdsa: fix docs
          encoding::asn1: fix doc references
          os::exec: open /dev/null with RDWR flag on nullfd
          crypto::ecdsa: change api to match other crypto apis
          crypto:ec: be more strict with return values
          crypto::ecdsa: add privkey_finish
    
    Bor Grošelj Simić (11):
          ascii: fix compare-by-subtraction in strcasecmp
          test: don't count result interpretation in consumed time
          crypto/ec: remove trailing empty lines
          mime: add license headers for +platform files
          encoding::base64: rewrite decoder
          encoding::base64: improve encoder struct size
          encoding::base64: document behavior after errors
          regex: fix typos in error messages
          make bootstrap
          all: drop trailing ... in functions that are not variadic
          os::move: fix invalid match usage
    
    Byron Torres (43):
          time::chrono: leap-seconds.list whitespace parsing
          fmt: improve docs
          time::chrono: rename _lookupzone to lookupzone
          time::chrono: improve LOCAL, tz()
          time::chrono: moment.daytime: i64, not duration
          time::chrono: rename mzone to ozone
          time::chrono: rename path constant exports
          time::date: rename some calc functions
          time::date: make type insufficient an enum
          time::date: change type parsefail, add byteindex
          time::date: change, add layout constants
          time::date: virtual: add .vsec, .vnsec
          test: add HARETEST_INCLUDE, require(); slow tests
          time::chrono: improve LOCAL docs
          time::chrono: rm eq; add simultaneous, coincident
          time::date: improve observer fn docs
          time::date: improve new() docs
          time::date: rename epochal day constants
          time::date: improve realize() docs, describe .hour
          time::date: rename .halfhour to .hour12
          time::date: rename nowutc(), now(), use localnow()
          time::date: use "virtual date" phrase in docs
          getopt: README: use for-each
          time::chrono: lookupzone: use sort
          time::chrono: make zoneindex type size
          time::date: use nomimal constants throughout
          time::date: realize: require .vloc, no UTC default
          time::date: rename calculus to rflag
          time::date: add zflag enum, zfunresolved error
          time::date: implement zflag in realize()
          time::date: implement zflag in new()
          time::date: implement zflag in from_str()
          time::date: implement zflag in truncate()
          time::date: implement zflag in reckon()
          time::date: realize: fix v.year
          time::date: fix week(), isoweek()
          time::date: format: tidy
          time::date: format: fix
          time::date: format: docs
          time::date: format: add %G, %V, ISOWKSTAMP
          time::date: format: layout docs
          time::date: README: mention ISO week-numbering cal
          bufio: replace 'file' with 'h'
    
    Cephon Altera (1):
          added `os::hostname()` to OpenBSD
    
    Curtis Arthaud (9):
          syscalls: add utimensat, futimens
          os: add chtimes, fchtimes
          syscalls: add fchmod, fchown
          os: add fchmod, fchown
          time::date: add v.century, v.year100
          fmt: clarify docs
          syscalls: add clock_settime
          time: add set()
          time: set(): don't abort on EPERM
    
    Drew DeVault (42):
          rt+openbsd: add missing copyright headers
          encoding::asn1: clean up doc strings and style
          add docs/release.md
          cmd/hare: add toolchains to hare version -v
          rt+freebsd: expand ioctl support
          unix::tty: add tcsetpgrp
          unix::signal: add sigset_fill
          docs: drop docs which are obsoleted by harelang.org
          unix: unify and normalize credentials
          bytes: refactor tokenize
          unix, rt: add alarm(2) support
          unix::signal: add sigwait(2) family of functions
          rt+linux: fix getpgrp, alarm for !x86_64
          make bootstrap
          make bootstrap
          debug: updates per for-each support
          debug: fix issues with invalid frame pointers
          rt+linux: MCL_*: change type to uint
          hare(1): don't auto-add -lc if freestanding
          encoding::hex::dump: add optional base address
          .builds: disable NetBSD
          rt: rewrite platform_abort to use writev
          .builds/netbsd.yml: restore file path
          MAINTAINERS: Add Mallory Adams
          .builds/netbsd: install to /usr
          os: add shared memory support
          regex: use bufio::scanner for enumerating runes
          crypto::bcrypt: move to extlib
          format::ini: use bufio::scanner
          bytes::tokenize: clean up code
          bytes, strings::tokenize: support multiple delimiters
          unix::passwd: use bufio::scanner and refine API
          time::chrono: parse leap seconds with bufio::scanner
          unix::tty: use bufio::scanner for +test
          cmd/harec: remove
          cmd/ioctlgen: remove
          format::tar: move to extlib
          unix::hosts: rewrite with bufio::scanner
          unix::resolvconf: rewrite and expand parser
          Add missing copyright headers
          README.md: drop explanation of non-free spec license
          scripts/version: set version to 0.24.2-rc2
    
    Dridi Boukelmoune (1):
          Makefile: Build haredoc(1) with LDLINKFLAGS
    
    Ember Sawady (7):
          hare build: create empty td file if necessary
          hare build: pass -a to harec
          output to ./foo on `hare build foo.ha`
          rt::u64tos: return *[*]const u8 rather than *const u8
          get rid of trailing empty lines
          os::exec: add fallback for pre-faccessat2 linux
          os::exec: fix cmd() error case
    
    Hugo Osvaldo Barrera (5):
          os::exec: return concrete error when feasible
          syscalls: add setxattr
          syscalls: add getxattr
          syscalls: add removexattr
          os: add wrappers for xattr syscalls
    
    Jeremy Baxter (1):
          fix bootstrapping and installation link in readme
    
    Joe Finney (5):
          strconv: Simplify and fix bugs in stoi/stou.
          strconv: Minor stylistic fixes for stoi/stou.
          Update hare::parse for optional function params.
          Make bufio::newscanner's maxread parameter optional.
          Handle base::HEX_LOWER in stof and stou.
    
    Lennart Jablonka (3):
          rt: add TIOCSPGRP to +linux and +openbsd
          rt/+openbsd: add getpgid
          rt/+openbsd: fix writev syscall
    
    Lorenz (xha) (4):
          for-each changes
          mime: make SYSTEM_DB platform-dependent (fix openbsd)
          TREES: remove openbsd
          openbsd: remove the step for downloading leap-seconds.list
    
    Mallory Adams (5):
          hare::lex: allow digit separators
          all: replace spaces with tabs
          NetBSD: port Hare to NetBSD/amd64
          NetBSD: make the build pass, replace all compat syscalls
          NetBSD: add os::shm_open()
    
    Martin Quinson (1):
          Fix 102 memleaks in the stdlib tests
    
    Max Schillinger (4):
          regex: implement whole-expression alternation
          regex: fix typo in error message
          regex: implement multiple alternation
          bufio: remove scanner inefficiency
    
    Mykyta Holubakha (3):
          std: fix some low-hanging memory leaks
          tests: fix low-hanging memory leaks
          net/uri: fix some leaks
    
    Philipp Wolfer (1):
          haredoc: fix call to log warnings
    
    Sebastian (30):
          TREES: add harec-plus-plus (april fools 2024)
          regex: get rid of unnecessary void casts
          crypto::ec: replace pointer cast with integer cast
          regex: fix inexhaustive match
          debug: fix inexhaustive match
          debug: ignore io::close error in printframe
          debug: remove error assertion from signal handler
          test: fix require's signature outside of +test
          types: note where uintptr is excluded
          fmt: change order of tagged union return types
          fmt: remove unused variable
          fmt: ignore error in fatal/fatalf
          types::c+test: remove sizes test
          types::c: add strnlen
          types::c+test: add strlen and strnlen tests
          strings: mention == in strings::compare docs
          all: add trailing :: to module references
          strings: return done from peek_token
          bytes: return done from next_token/peek_token
          mime: return done from next_param
          fs: update documentation to use done
          test: color skipped tests gray
          test: fail gracefully on stack overflow
          math::checked: fix subi* with *_MAX and *_MIN
          math::checked: cast to int/uint
          math::checked: add saturating arithmetic functions
          haredoc: warn and continue on parsing error
          haredoc: fix accidental reuse of static string
          encoding::utf8: return done from next/prev
          hare.1: add note about poor error message quality
    
    Song Shuai (1):
          genbootstrap: Use '$@' in the rule for ssa target
    
    Vlad-Stefan Harbuz (1):
          haredoc: fix symbol links
    
    Willow Barraco (2):
          Help reading inotify_events
          unix::passwd: implement getgroups
    
    citrons (2):
          hare::module::find(): fix symlink resolution
          hare::module::find(): provide more error context
    
    lunacb (1):
          Make glob::strerror's buffer static
    
    spxtr (3):
          strconv: add sto(f64|f32)b with hex base support.
          hare::lex: lex hex.
          Remove most unused imports.
    
    ubq323 (1):
          math: add TAU constant
    
    wackbyte (3):
          follow style guide for void match/switch cases
          fix mixed indentation
          time::date: fix typo
    
  • 0.24.2-rc1
    Hare 0.24.2-rc1
    
    This is the first release candidate for Hare 0.24.2. Highlights of this
    release include:
    
    * NetBSD support
    * for-each loops and the "done" type
    * Optional parameters for functions
    * Support for shared memory and memfds on supported platforms
    * Revised and improved APIs for unix::*
    * Improved performance for bufio and related APIs
    * regex:: now supports multiple alternation (i.e. (x|y|z))
    * New cryptography APIs:
      * crypto::ec
      * crypto::ecdh
      * crypto::ecdsa
    
    This release includes a number of breaking changes.
    
    The introduction of the "done" type to improve the iterator pattern
    introduces the following changes:
    
    * "done" is now a reserved word and cannot be used in user-defined names
    * The following standard library symbols have been updated to use done
      types in their API:
      * bytes::next_token/bytes::prev_token
      * encoding::utf8
      * fs::next
      * glob::next
      * io::EOF
      * mime
      * path::nextiter
      * strings::next/strings::prev
      * strings::next_token/strings::prev_token
      * In short, if your program matches on a function using the iterator
        pattern with "void" and this causes an error from 0.24.2, the
        correct solution is likely to rewrite it to use a for-each loop, or
        replace "void" with "done" in the relevant match case.
    
    bytes::tokenize now accepts multiple single-byte delimiters and removes
    support for multi-byte delimiters. strings::tokenize accepts multiple
    delimiters, limited to the set of ASCII characters.
    
    The following APIs have been overhauled and programs depending on them
    may need to be refactored:
    
    * unix::hosts
    * unix::passwd
    
    Several breaking changes have been made to time:
    
    * time::date now accepts a zone offset (zoff) parameter in
      time::date::reckon and time::date::truncate.
    * time::date::calculus has been renamed to time::date::rflag.
    * time::date::realize requires .vloc to be set, and no longer defaults
      to UTC.
    * time::date::now() is renamed to time::date::localnow() and
      time::date::nowutc() is renamed to time::date::now()
    * time::date::EPOCHAL_JULIAN and EPOCHAL_GREGORIAN have been renamed to
      EPOCHDAY_JULIAN and EPOCHDAY_GREGORIAN respectively
    * time::chrono::eq has been removed and replaced with
      time::chrono::simultaneous and time::chrono::coincident
    * time::chrono::mzone has been renamed to time::chrono::ozone
    * The type of time::date::parsefail has been chnaged from rune (storing
      the offending format specifier) to (size, rune), which adds the index
      of the position where the parsing failure occured.
    * Several constants for format layouts in time::date have been renamed:
      [[EMAILZ]] => [[EMAILZONE]]
      [[STAMP_NANO]] => [[STAMPNANO]]
      [[STAMP_ZOFF]] => [[STAMPZOFF]]
      [[STAMP_ZONE]] => [[STAMPZONE]]
      [[STAMP_NOZL]] => [[STAMPLOC]]
    
    strconv's "b" family of functions (those which accept a base for the
    conversion) have been removed, and the remaining functions accept the
    desired base as an optional parameter.
    
    The following modules have been removed from the standard library and
    placed in the extended library:
    
    * crypto::bcrypt
      https://git.sr.ht/~sircmpwn/hare-bcrypt
    * format::tar
      https://git.sr.ht/~sircmpwn/hare-tar
    
    Adnan Maolood (3):
          errors::strerror: handle errors::refused
          cmd/hare: implement compile-only builds
          regex: Handle escaped characters in brackets
    
    Ajay R (17):
          encoding: implemented the base-32 encoding scheme as defined by RFC 4648
          strings: fix iter documentation
          encoding::base32: add ASCII check for encoding alphabet
          encoding::base64: new design
          fs: (move) remove new file if error occurs
          base32 and base64: fix iteration variable's decrement logic
          encoding::base32: add convenience functions similar to base64
          encoding::base32: place encode above decode for consistency with base64
          fix errors after disallowing assignment of non-void types to void
          base32 and base64: return correct number of bytes processed by encode_writer
          encoding::base32: propagate error instead of ! in encode_closer
          encoding::hex: make stream oriented
          temp: update +freebsd.ha to use new hex module design
          encoding::hex: add README
          encoding::base32: new_{encoder, decoder} -> new{encoder, newdecoder}
          encoding::base32: update README
          encoding::base64: update README
    
    Ajay Raghavan (1):
          encoding/base64: Corrected encode() test function; Removed unused variable
    
    Alexey Yerin (191):
          fs: implement chmod
          fs: implement chown
          bufio: add scan* functions
          lex: replace io::getrune by bufio::scanrune
          getopt: update getopts -> getopt in the example
          bufio(scan): return io::EOF if nothing was read
          Add unix::passwd module for /etc/passwd parsing
          Add encoding::hex::dump
          unix/passwd: split out error type to types.ha
          unix/passwd: add /etc/group parser
          unix/passwd: update abort message to be consistent
          Fix use-after-free in unix::passwd
          unix/passwd: return user list as []str in grent
          hare/parse,unparse: add support for len expression
          hare/parse,unparse: add size expression
          hare/parse: enclose expected tokens in ''
          hare/parse,unparse: add assertion expressions
          Update match statements according to spec update
          hare/parse,unparse: add match expressions
          haredoc: show usage if given not enough arguments
          unix/passwd: update refs to look better in haredoc
          path: remove unnecessary strings::toutf8
          haredoc/html: highlight most of the types
          hare::parse: handle pointer types in match cases
          Fix module::identpath memory leaks
          hare::module: fix sha256 leak
          hare::module: fix bufio::scanline leak
          hare::module: free tags on return
          rt: add flag parameter to fch{own,mod}at syscalls
          crypto/md5,sha1: fix sha256 and sha512 references
          haredoc/html: highlight union types
          Update IRC channel according to move to Libera
          linux::io_uring: fix typos in docs
          fs: return errors::unsupported instead of abort()ing
          strconv: allow leading '+' in stoi*
          linux::io_uring: use error instead of errors::error
          hare::unit: use match insead of mutating body
          getopt: fix typo
          getopt: do not add newline when there are no arguments
          cmd/haredoc: emit error types in -Fhare
          hare::unparse: move '!' to the beginning
          cmd/haredoc: implement TTY output
          cmd/haredoc/html: move alias types into type_html
          unix::tty: open /dev/tty as writable
          cmd/haredoc/tty: make comments bold instead of gray
          cmd/haredoc: hide undocumented members unless -a is specified
          cmd/haredoc: show README as a comment in -F{hare,tty}
          cmd/haredoc/hare: add missing space between // and README
          unix::tty: remove stdout fall-back for open()
          unix::tty: improve documentation a bit
          cmd/haredoc/hare: add an empty line after README
          cmd/haredoc: error out on non-existent declarations
          cmd/haredoc: set -a when looking up a symbol directly
          os::exec: fix non-exhaustive match
          cmd/hare: move archive files to the end of ld command
          format::ini: new module
          math: only build testdata on +test
          cmd/haredoc: implement constants (def) in -Fhare and -Ftty
          time: add documentation for constants
          types: add strflag reflection helper
          types: strflag: special case 0 value to not match on anything
          types: add tests for reflection helpers
          hare::{parse,ast}: add NONE=0 to bitfield enums
          hare::types: add NONE=0 to func_flags to match hare::ast
          all: add 0 value to enums used as flags
          types+test: use '&' on literals instead of temporary variable
          format::ini: correct format string in strerror()
          iobus: export setuser and getuser
          format::ini: remove obsolete comment
          iobus: update documentation and assertion messages for open/create
          getopt: update switch syntax in example
          cmd/haredoc: don't try to search for unexported declarations
          iobus: free the bus object itself in destroy()
          rt: drop types::ENUM
          unix::tty: add initial termios support
          shlex: new module
          shlex: fix whitespace folding
          shlex: rewrite and fix some regressions
          fs::mem: fix unitialized inode in create()
          all: fix incomplete structs
          hare::module: export parse_name
          cmd/hare: track tags of hare.sc script
          Initial support for +libc
          cmd/hare: implement -l
          strings: make dupall return a new slice, add freeall
          shlex: drop splitfree in favor of strings::freeall
          unix::tty: add termios support on +freebsd
          cmd/haredoc: tty: fix enum unparsing
          shlex: correctly handle leading whitespace
          io: remove unused strings import
          io::limit{reader,writer}: take an io::handle
          strio: use caller allocation
          bufio: use caller allocation
          Fix up tests using bufio
          os+linux: fix stdout handle
          os+freebsd: update to reflect bufio changes
          format::elf: fix typo
          iobus::io_uring: correctly dispatch internal SQEs
          path::{dir,base}name: fix dup reference
          path::extension: accept a (str | *buffer)
          +libc: fix regressions caused by unique @init names
          strings: use alloc([...], len) syntax instead of rt::malloc
          cmd/harec: update for new QBE linkage syntax
          cmd/hare: add a progress indicator when building
          cmd/hare: clear progress indicator after build finishes
          os+freebsd: remove os:: namespace from getcwd call
          rt+freebsd: fix global syntax for socket constants
          cmd/hare: clear the indicator if a build error happens
          cmd/hare: don't close stderr
          os+freebsd: add amode enum from +linux
          rt,math+riscv64: implement fenv functions
          Implement net::uri
          scripts/gen-docs: don't download mascot.jpg
          cmd/haredoc: only allocate a buffer for unparse::_type when brief is set
          Fix undefined references throughout stdlib
          cmd/haredoc: resolve enum members
          gen-stdlib: add crypto::hmac dependency on crypto::sha1 for +test
          io: replace stream type with vtable in the docs
          cmd/haredoc/html: use a more contrast color for build tags on dark theme
          hash::fnv: use correct vtables for fnv{32,64}a()
          hare::types: fix tagged union sorting regression
          Do not rebuild haredoc and harec2 on install
          net/uri: add query string encoding and decoding
          Makefile: clean out generated manpages
          io: fix documentation for stream/vtable
          cmd/hare: resize the progress bar according to terminal size
          hare::lex: improve handling of invalid UTF-8
          cmd/harec: display error even if it includes invalid UTF-8
          bufio: extend used buffer size when unreading
          cmd/hare: error out if module has no input files
          cmd/hare: display "(root)" instead of empty namespace
          cmd/hare: add newlines after environment variables in verbose mode
          hare::parse: add tuple unpacking
          os::exec: return process from fork()
          rt+linux: add ptrace wrapper and related types
          io: return error from fd_close()
          crypto::keystore: fix incorrect return type
          bufio::scanbyte: remove underread check
          cmd/hare: clear the progress bar when an error happens
          rt: add shmat syscall
          hare::lex: propagate syntax errors in nextw
          hare::lex: error out when encountering an invalid escape sequence
          hare::lex: error out when encountering an invalid exponent
          rt: add mremap
          cmd/hare: simplify getcmd and getenv
          net::ip: export parsev4 and parsev6
          net::uri: do not ignore invalid characters in parse_authority
          net::uri: disallow non-IPv6 addresses inside [ ... ]
          net::uri: disallow '@' after seeing userinfo
          net: correct references of net::unix::prepfiles -> allocfiles
          os::exec: fill utime and stime
          +libc: include empty .init_array section
          Correctly convert strconv::base::DEC -> 10
          rt+libc: free() the pointer in realloc(p, 0)
          hare/module: tolerate empty extension
          linux::timerfd: correct man page reference
          linux::timerfd: add enums for flags
          hare::unparse: Wrap expressions in parentheses where needed
          net::uri: Remove duplicate test
          math: Add gcd
          unix::signal: Set SA_SIGINFO by default
          unix::signal::siginfo: Add most options specified by POSIX
          sort: Document that it provides a stable sort
          cmd/hare: Rename the temporary file after writing typedefs
          sort: Implement powersort for large arrays
          sort: Add performance tests for powersort
          test: Use time::SECOND
          cmd/hare: Avoid printing unnecessary newlines
          cmd/hare: Print a newline before the exit code
          cmd/hare: Do not pass fs::flag::CREATE to os::create
          os+freebsd: Do not invert CLOEXEC/CTTY twice
          strconv: Add base::DEFAULT instead of base::DEC being equal 0
          cmd/haredoc: Duplicate the static value of lex::tokstr
          hare::unparse: Consider indentation and newlines part of a comment
          cmd/haredoc: Add missing newlines after declarations in the index
          time::chrono: correct leap-seconds.list on FreeBSD
          time::chrono: imrove timescale load fail abort msg
          sort: Get rid of memmove and bring back bounds checks
          cmd/hare: Improve errors for task failure
          hare::parse: Disallow single element tuples
          hare::parse: Disallow single type tagged unions
          hare::parse: Disallow single element tuple types
          cmd/hare: Improve 'Command not found' error message in get_version
          strconv: Remove base restrictions from doc comment of integertosb
          math: Accept types::signed instead of integer in absi
          FreeBSD: Fix build with +libc
          +libc: Avoid overriding the default linker script on other platforms
          CI: Run tests with libc on FreeBSD
          encoding::utf8: Return invalid from utf8sz on invalid starting byte
          bufio::scanner: Always shift readout before requesting reads
          sort: Replace []void with []opaque in README
    
    Andrew Chambers (1):
          rt: Add more fcntl locking definitions.
    
    Andri Yngvason (13):
          gen-stdlib: add strconv::stou
          ascii: ctype: fix octal notation
          strconv: add string to unsigned integer converters
          strconv: stou: extract types into own file
          strconv: move tests into +test directory
          strconv: add string-to-integer converter
          strings: add substring function
          gen-stdlib: add strings::sub
          strconv: stou: implement base 16, 8 and 2
          strings: sub: align range with slicing operator
          strconv: utos: implement base 2, 8 and 16
          strconv: itos: implement itos using utos
          fmt: add modifier parsing
    
    Antero Mejr (2):
          tests: skip NaN sign-related complex tests
          time::chrono: allow /etc/localtime to be a file
    
    Armin Preiml (127):
          introduce crypto::cipher::block
          implement constant time, 64bit optimised AES
          change dst to dest to be uniform with other stdlib
          add crypto::math::xor
          add cipher block chaining mode to crypto::cipher
          add in place encryption tests for aes and cbc
          add block size bsz to hash
          add hash::createfunc
          add crypto::hmac
          add crypto::cipher::stream interface
          add crypto::cipher::ctr stream mode
          rename dst to dest vars to match the other stdlib
          caller must provide a buffer for cipher::cbc mode
          replace bytes::copy with slice copy in cbc.ha
          fix blake2b when writing multiple times
          implement version 1.3 of crypto::argon2
          remove trailing spaces
          crypto::cipher: use finish for stream ciphers
          Implement Salsa20 and XSalsa20 in crypto::salsa
          create crypto::mac, an interface for macs
          crypto::hmac: use crypto::mac api instead of hash
          hash: remove createfunc
          implement the crypto::poly1305 mac
          crypto::salsa: clear temp secret state on init
          implement Chacha20 and XChacha20 in crypto::chacha
          crypto::chacha: skip block on setctr
          crytpo::poly1305: pass key by reference
          crypto::poly1305: properly fill block during write
          crypto::math: fix cmpslice
          crypto: implement compare
          crypto: implement encrypt and decrypt
          crypto: fix padding for poly1305 in encrypt/decrypt
          crypto: limit slices to equal length on slice copy
          crypto::argon2: fix memory allocation in tests
          crypto::hmac: require caller provided buffer
          crypto::sha256: export internal block size
          crypto::hmac: provide sha256 variant of hmac
          crypto: make sure to clear state on closing hashes
          crypto::argon2: make sure to close blake2b after use
          implement crypto::aes::xts
          add cpuid for x86_64 to check flags and vendor
          implement AES-NI for x86_64
          remove hash::finish
          replacing hash::finish with hash::sum
          crypto::aes: x86ni doesn't support parallel operations
          crypto::aes::x86ni_init: save some jumps
          mime: fix match in load_systemdb
          bufio::fixed: fix empty writes exceeding buffer
          crypto::curve25519: move clamping to separate fn
          implement crypto::x25519
          crypto::cipher: add an abstract xorstream
          refactor crypto::aes::ctr to be a xorstream
          crypto::chacha20: convert to cipher::xorstream
          crypto::salsa: convert to a cipher::xorstream
          crypto::cipher: remove deprecated stream interface
          crypto::aes: make internal x86ni functions private
          crypto::cipher::poly1305: fix typo in attribution
          crypto::cipher::ctr: finish underlying block on close
          crypto::cipher: implement gcm
          crypto::math: Add a bunch of ct u32 bit operations
          change cmp{slice,u8} to eq{slice,u8}
          crypto::math: add divu32
          add crypto::hkdf
          crypto::cipher: test gcm inplace en/decryption
          crypto:ed25519: name keys pubkey and privkey
          crypto::math: minor doc improvement
          crypto::hmac: make key const
          log: add silent logger for turning off logs
          build: remove LOCALSRCDIR
          crypto::cipher::gcm: tag as slice
          add crypto::bigint
          crypto::bigint: improve some function names
          encoding::pem: support crlf
          strconv: add strerror
          rt: make alarm syscall only available to x86_64
          add crypto::rsa core functions
          crypto::bigint: add decrodd and isodd
          crypto::rsa: add pkcs1 sign and verify support
          gen-stdlib: add crypto::rsa
          crypto::cipher: block vtable
          crypto::aes unify blocks
          crypto::aes: add [[aes]] for choosing the algorithm
          crypto::aes: unexport specific aes implementations
          bufio: fix doc
          crypto::salsa: slice instead of array ptr
          crypto::chacha20: slice instead of array ptr
          crypto::aes: fix x86ni processing more than one block
          io::writeall: abort on error after partial write
          io::copy_fallback: use non static buffer
          encoding::base64: refactor encoder
          datetime: fix doc link
          crypto::argon2: fix initial hash and block indexing
          crypto::argon2: fix memsize calculation
          argon2: rename config to conf to break api
          crypto::derivekey: fix comment
          datetime: implement %F and %T specifiers in parse
          datetime: fail on invalid format specifier
          datetime: add errors.ha to build script
          datetime: from_str: use default values
          mime: move test entries into a +test file
          io::teestream: implement writer
          add crypto::chachapoly
          crypto: refactor authenc to use crypto::chachapoly
          base64: avoid infite loop in decoder
          hkdf: add extract and expand functions
          crypto::ed25519: change api to take slices
          crypto: use SZ as suffix for sizes
          hash: use SZ as suffix for sizes
          use SZ as suffix for sizes in other modules
          rt: add getpgid syscall
          crypto::*25519: change api to take slices
          add hare-tls to TREES
          Makefile: add haredoc to the all target
          Makefile: also add haredoc to {un}install targets
          crypto::ed25519: simplify golden test
          base64: do not abort on utf8 multibyte chars
          bufio::scanner: implement io::reader
          bufio::scanner: support unread
          bufio::scanner: fix unread for scan_byte and scan_rune
          time::date: move def to global scope
          crypto::aes: run aes ni tests only if ni available
          add ~apreiml/hare to TREES
          crypto::bigint: decode only actual encoded words
          crypto::math: make eq0u32 param u32
          crypto::{math,bigint}: export some util functions
          speed up crypto::argon2 a bit
          crypto::rsa: add pubkey_nbitlen
    
    Armin Weigl (17):
          strconv: Fix typos
          strconv: style
          move syscall helpers into function-sections
          Use $AS
          lex_string tests
          bufio/fixed use slice assignment
          Add @noreturn to start_*
          lex: implement \x, \u and \U
          fix trailing comma in member import
          hare::lex::lex_unicode: replace match with type assertion
          endian: *getu64
          rt/+linux/syscall+aarch64: Move parameters between registers
          rt/+linux/syscall+riscv64.s: Move parameters between registers
          rt/+freebsd/syscall+riscv64.s: Move parameters between registers
          rt/cpuid: fix compilation on non x86_64 architectures
          net::unix::socketpair: return net::socket instead of io::file
          gen-stdlib: unix::tty: fix dependencies
    
    Autumn! (65):
          Fix memory leaks in os::exec::{finish, clearenv}
          bytes: Add rtokenize and rcut
          strings: Add rindex, rbyteindex, rtokenize, rsplitn, rcut
          Add color to harec when appropriate
          cmd/haredoc: reduce filesize of mascot and use as favicon
          cmd/hare: Don't append .o/.a to output path of build -c
          haredoc: Don't overwrite $LESS and $MORE
          Implement deps subcommand
          Add graphviz dotfile output to deps
          time::chrono: heap allocate zone.abbr
          strconv: mark strconv::error as an error type
          datetime: populate time in finish(*builder)
          time::chrono: incorporate zone offset in in() and to_instant()
          strings: change multireplace to work in a single pass
          encoding::utf8: improve out-of-range tests
          os: move fs.ha to os.ha
          os: add exists()
          hare::{lex,parse}: statically allocate syntax error path
          strio: return error instead of abort when fixed buffer exceeded
          io: implement lock()
          format/elf: rename files to avoid conflict
          path: refactor init() to take varargs, drop reset()
          path: remove allocate()
          path: rename add() to push()
          path: implement pop()
          path: implement peek()
          path: remove trailing separators during normalization
          path: implement parent()
          path: use custom error types and strerror
          path: tidy up dirname/basename
          path: make iterators only take a *buffer
          path: replace extension() with stack-based functions
          path: remove join(), add prepend()
          path: add trimprefix() and local()
          path: refactor iterator, add riter() and remaining()
          fs: make realpath() return a resolved path
          time::chrono: load_tzif: fix memory leak
          hare::lex: add finish()
          hare::ast: add imports_finish
          rt: move +PLATFORM/abort.ha to +PLATFORM/platform_abort.ha
          time: add INSTANT_MIN, INSTANT_MAX
          path: add peek_exts()
          getopt: add subcommands and error handling
          getopt: document implicit -h in help text
          io: implement trunc()
          time::chrono: lazily load utc leapsecs
          bytes,strings: make {cut,rcut} return a tagged union value
          mime: fix compilation with new strings::cut
          rt: add 'slice cap smaller than initializer' abort message
          Only set HAREC_COLOR once in environ
          hare::types: rename +ARCH/hash.ha to avoid shadowing conflict
          strings: fix docstring format for multireplace
          rt, cmd/hare: pass empty namespace for toplevel on libc
          ascii: add strlower, strupper, rewrite strcasecmp
          io: move fd-related functions into one file
          all: rename 'flags' types to 'flag'
          getopt: add subcommand context to errors
          strio,bufio: merge memstream implementation into memio
          strings: rename runes() to torunes()
          rt: copy by words in memcpy
          rt: copy by words in memmove
          rt: copy from musl in memset
          bytes: use rt::memset in zero()
          os: remove workaround for cwd initialization
          add -j2 to .builds for hare
    
    B. Atticus Grobe (1):
          cmd/hare: pass -L to add directory to library search path
    
    Blain Smith (2):
          rt: sockaddr_ll and ETH_P_* socket protocols in linux
          rt: BPF socket structs & option levels for Linux
    
    Bor Grošelj Simić (138):
          mk/gen-stdlib.sh: don't generate trailing whitespace
          io: separate general purpose testing stream and copy test
          io: implement limit stream
          bytes/index.ha: fix a substring search bug
          bytes/tokenize.ha: use bytes::index
          bytes::tokenize: handle the case where delimiter is whole array
          bytes::tokenize: add a test for remaining_tokens()
          strings::tokenize: add a test for when delimiter is whole string
          {bytes,strings}/tokenize.ha: implement peeking
          encoding::utf8: implement bacwards decoder
          strings/iter.ha: implement reverse iterator with prev()
          strings/iter.ha: add strings::iter_reverse()
          bytes/index.ha: add rindex
          strings/iter.ha: rename iter_reverse to riter
          bufio::dynamic: take io::mode argument
          tokenizer: return zero tokens on empty slice
          fmt: fix memory leak
          bufio::dynamic: implement seek()
          bufio::dynamic: fix dynamic_write
          fs: prohibit calls to fs::mkdir with empty path
          crypto::math: fix typo
          bufio::fixed: implement closer
          bufio::fixed: merge with bufio/dynamic.ha
          bufio/memstream.ha: make abort messages more descriptive
          fs::rmdirall: mask irrelevant mode flags
          fs::mem: new module
          fs::mem: remove unused `use fmt;`
          bytes::index: implement two-way algorithm
          crypto: fix hash test cleanups
          bytes/tokenize.ha: uncomment a test
          bufio: depend on types
          hare::{lex,parse}: add &&=, ||= and ^^= operators
          update stdlib with the new &&=, ||= and ^^= operators
          haredoc: fix breadcrumbs urls
          hare::types: type_finish shouldn't be recursive
          ascii: implement isblank()
          fnmatch: new module
          fs::mem: utilize subtyping
          fs::mem: further improvements
          os: remove duplicate BUFSIZ declaration
          fix static asserts that weren't checked before
          remove unused declarations
          import io where needed
          temporarily make enum char an enum u8
          all: resolve name clashes that weren't noticed before
          iobus: change init array type to io::file
          fmt: print a diagnostic message if there aren't enough parameters
          math: nextafterf64, nextafterf32
          hare::module: don't attempt to parse non-hare files
          math: constants for smallest representable positive offset from 1
          math: nearbyintf{32,64}
          hare::lex: remove duplicated token
          math: floating point exceptions and rounding modes
          os::exec: expand waitpid functionality
          use strings::{dupall,freeall} on hare::ast::ident
          all: remove namespace prefixes from local objects
          rt+freebsd: add waitpid option flags
          implement os::exec::peek{,any}
          hare::parse: don't abort in want(..., ltok::NAME)
          strings::dup: don't overallocate and don't read out of bouds
          haredoc: error out on invalid trailing chars in parseident
          use value of HARE_DEBUG_WORKDIR as plan.workdir when set
          hare::{parse,unparse}: update for expanded import syntax
          update for stricter [*]array assignability rules
          use type assertion with nullable types in some places
          all: update for RCONST
          fix ascii::isspace docstring
          fix try_fromutf8 docstring
          add bytes::cut and use it in strings::cut
          {strings,bytes}/tokenize.ha: simplify code in @test
          {strings,bytes}/tokenize.ha improve docstrings
          bufio: remove an obsolete constraint of the api
          implement copier for bufio::memstream
          ascii::validstr: fix octal literal
          regex: use bool instead of two-valued enum for inst_match
          base64: don't call a function that has no effect
          add bytes::{l,r,}trim
          strings::{l,r,}trim: trim whitespace with bytes::
          strings/trim.ha: use the unsafe []u8 -> str conversion variant
          path: fix dangling pointer to a stack resource
          remove path::dup
          strio: simplify and unify fixed and dynamic types
          merge strio/fixed.ha and strio/dynamic.ha
          compare strings byte-by-byte
          bufio::buffered: use rbuffer as unread buffer
          bufio: improve buffered reader performance
          bufio::buffered: merge two identical if branches
          mention io::readall in docstring for io::underread
          store amount of succesfully read data in io::underread
          bytes: update outdated style
          modules starting with a-e: docs fixes
          readv,writev: don't treat underread/write as error in docs
          hash::siphash: new module
          encoding::pem: implement writer
          regex: simplify charclass name -> func mapping
          make hash.reset optional
          crypto::blake2b: don't store the key
          encoding::pem: fix an issue with short writes
          fs: document correct iterator disposal method
          remove reference to hare.sh in build manifest
          format::elf: fix HIPROC and LOPROC constants
          fixup strings::fromutf8 changes that were missed in 045f3096
          errors: specify rt dependency
          fix sort::icmp
          remove leading zeros before prohibiting them
          hare::parse: parse type assertions to null
          add net::uri as net::dial dependency
          s/align/_align/ before introduction of align builtin
          move tests depending on +test into +test
          remove arithmetic on pointer types
          strings: document non-obvious trim testcase
          use simpler and faster utf8 decoder
          use improved forward decode in backward decode
          rewrite encoding::utf8::valid using the new decoder table
          strings: simplify iter direction logic
          hare::lex: error out on overflowing integer exponents
          hare::lex: fix reported syntax error reason
          cmd/harec: make stype a rune enum
          datetime: parse: fix %z scanning, add test
          encoding::base64: reduce encoding info size
          encoding::base64: add utility functions for buffer size calculations
          fnmatch: simplify and modernize
          Revert "time::chrono: fix memory leak in load_tzif()"
          .builds/freebsd.yml: install the build driver
          builds: make .bin/hare-tests in parallel
          crypto::bcrypt: allocate blowfish state on the heap
          datetime::new: use slice copy instead of loop
          .builds/alpine.yml: run tests with +libc
          strings: add slice(), a new way to obtain a substring
          all: use strings::slice where appropriate
          strio: expand tests
          strio: implement concat with join
          strio: add rconcat
          rt: update abort for non-constant assert changes in harec
          unify fixed and non-fixed abort paths
          rt: mark platform_abort as @noreturn
          sort::cmp: use subtraction for 8 and 16 bit numbers
          ascii: fix compare-by-subtraction in strcasecmp
    
    Byron Torres (191):
          bufio::buffered: fix docs
          net::ip: invalidate leading zeros in IPv4 addrs
          fmt: introduce parametric modifiers
          getopt: fix mishandled len(help) == 0
          cmd/haredoc: -Fhtml: add dark mode css
          cmd/haredoc: -Fhtml: fix padding on narrow screens
          cmd/haredoc: -Fhtml: add viewport meta
          cmd/haredoc: -Fhtml: improve <pre> syntax colors
          time: add time::diff
          new chrono::isocal:: modules
          add moment{} stuct and conversion functions
          add calendar fns, expand localdate, sketch tz code
          reorganize time, chrono, datetime, isocal modules
          implement base timezones
          use timescale conversion error types
          index eras BCE=0, CE=1
          organise date calc, modify types
          outline datetime parsing/formatting
          add init functions
          add calendrical calc fns with some tests
          add ymd test, correct spelling
          adapt fmttime() code
          add exported API lazy eval date functions
          correct year(), month(), day(), weekday()
          fix now(), rename now() & new()
          tidy code and comments, add arithmetic.ha
          update for match binding "case let" syntax
          rename formatting functions
          codify timezone transitions
          merge date & time, improve tz
          sort out fmt and layout namespaces
          have datetime::datetime inherit chrono::moment
          use zone in datetime
          use locality union
          use EPOCH_COMMONERA for epochal()
          remove redundant calc_ymd()
          reorganise +test code
          new parser type
          add dummy datetime::diff()
          finish hour(), min(), sec(), nsec()
          remove todo for timelike calc_ fns
          refactor parsing api
          new type builder (replaces parser)
          update docstrings, comments, READMEs
          export timezone pointers
          fix commit 000a640: add print_period()
          make type locality = *timezone
          rename calendrical epochal constants
          etch new timezone functions
          introduce martian time
          update martian comments
          rename calendar.ha -> chronology.ha, some comments
          add format constants
          time::olsen: new module
          add name and abbrev fields to timescales
          fix format("%N"); add useful layout constants
          add datetime::from_moment()
          chrono: add moment.zone, new(), from_instant()
          new timezone in() functions
          expand olsen::tz() with dummy timezones
          fix chrono::in()
          new datetime::localize() wrapper
          rename olsen -> olson
          prepare localize() for datetime field getters
          new datetime::lookupzone()
          rename some martian entities
          add chrono::to_instant()
          fix localize(); new fixedzone()
          update comments for localize(), lookupzone()
          simplify time::interval
          mv timescales.ha -> timescale.ha; clean gen-stdlib
          add time/chrono/leapsec.ha
          new time::{error,ambiguous,nonexistent} types
          add temporary leap seconds data
          s/RFC3999/RFC3339/; remove some inline layouts
          new datetime::from_str()
          s/abbrev/abbr/
          add timezone.posix_extend
          lookupzone(); timezone.zone: zone
          olson: new TZif parser
          implement %Z, %z
          improve and fix %z
          datetime/README: update
          update comments, describe behaviour
          further comments and TODOs
          s/localize/transform/; prepare new() zone lookup
          make new() use given zoffset
          use chronological functions in sensible order
          brush up comments and code for review
          add convenient EMAILZ format
          new(): comment and prepose new parameter signature
          rm comment on returning timezone pointers
          change new() parameter signature
          rename base timezones and timescales
          fix olson::tz() open file leak
          tidy whitespace
          add new() TODO #565
          rm daylength function TODO
          rm {chrono,datetime}::tranform() docstrings
          rm chrono::unix: timescale
          rm datetime::datetime docstring
          rm datetime::print_period()
          datetime: s/method/strategy/
          s/builder/mock
          s/build()/finish()
          rename olson:: to tzdb::
          use math::absi()
          new datetime/parse.ha
          new types {chrono,datetime}::invalid
          make new() param 'loc' just chrono::locality
          WIP leap-seconds.list reader
          new datetime::from_instant()
          WIP tai/utc leaps handling
          new datetime::to_instant()
          fix "Fri" formatting
          datetime, time, time::chrono: correct docs links
          time::chrono: fix SECS_1900_1970 doc
          time: fix add()
          time: add @test add()
          haredoc: fix tty parameter and type colours
          haredoc: change tty colours to more accessible set
          haredoc: use brighter non-bold tty colours
          haredoc: -Fhtml: fix relative submodule lookup
          haredoc: -F{hare,tty}: list submodules
          datetime: add %L formatter and STAMP_NOZL layout
          datetime: document format specifiers
          datetime: fix format string constants docs
          datetime: fix %w docs
          time,time::chrono,datetime: improve docs
          time::chrono: fix reading of leap-seconds.lists
          time::chrono: improve invalidtzif error string
          time::chrono: make parse_tzif() accept tz pointer
          time::chrono: compare magic TZif bytes, not string
          time::chrono: handle invalid utf8
          gen-stdlib: update for time::chrono
          strings: add fromrunes()
          time::chrono: purge unused code
          time::chrono: change new() parameter order
          time::chrono,datetime: rename epochal to date
          time::chrono: fix LOCAL init, improve docs
          time::chrono: make lookup_leaps accept a pointer
          time::chrono: fix tt timescale name
          time::chrono: fix tt timescale converters
          time::chrono: standardise gps timescale code
          time::chrono: add GPS and TT timezones
          time: add mult()
          time::chrono: fix mtc timescale converters
          time::chrono: make in() handle multiple timescales
          haredoc: fix copyright typo
          datetime: add sundayweek, rectify 0783e33 ("%U")
          datetime: add calc_janfirstweekday()
          datetime: test calc_janfirstweekday()
          datetime: use calc_janfirstweekday()
          datetime: rm calc_ymd_from_yd(), simplify code
          datetime: simplify calc_date_from_ywd()
          haredoc: tty: add color.ha, rendering functions
          haredoc: tty: fully implement $HAREDOC_COLORS
          docs/haredoc.scd: document $HAREDOC_COLORS
          haredoc: use bold comments colorscheme
          time::chrono: handle errors, utc leapsecs init
          regex: improve error strings terseness
          regex: introduce result type; fix and improve docs
          Revert "time::chrono: incorporate zone offset in in() and to_instant()"
          Revert "datetime: populate time in finish(*builder)"
          time::chrono: fix conv_mtc_tai()
          time::chrono: use temporary offset
          time::chrono: give names to all timezones
          time::chrono,datetime: rename min, sec, nsec
          time::chrono,datetime: embed instant into moment
          time,time::chrono,datetime: overhaul
          time::chrono: rm use math; simplify def
          move datetime -> time::date
          time: rename datetime module in READMEs, docs
          time::date: rename datetime type to date
          time: improve function parameter names
          time::chrono: use daydate, daytime; improve docs
          time::date: rename source files appropriately
          time::date: new: use virtual interface
          time::date: simplify observers
          time::date: parse: fix scanners
          time::date: add %e; update POSIX layout
          time::chrono: fix $TZ causing TZ_LOCAL double-free
          time::date: avoid tz() in tests, TZDB dependency
          time::date: new(): drop void zoff feature
          time::chrono: complete utc timescale conversion
          time::chrono: test utc/tai timescale conversion
          time::date: fix calendar before 4715 BCE
          strings: readd pad functions
          strings: improve docs and params for pad functions
          strings: rename pad functions per convention
          time::chrono: leap-seconds.list whitespace parsing
    
    Callum Brown (2):
          haredoc: remove -Fgemtext from man page
          fmt: fix typos in README
    
    Carlos Une (7):
          Minor fix due to breaking change to strings::fromutf8
          Implement complex trig functions tan,atan,tanh,atanh
          Add tests for complex trig functions tan,atan,tanh,atanh
          special case libc implementation-dependent test
          math: fix order of operation
          math::complex::tan: test huge arguments
          strconv::stof32 fix doc
    
    Christopher M. Riedl (9):
          errors: use correct indefinite article
          xml: Fix module name in README
          io: Fix minor grammar mistake in docs
          gen-stdlib: add strcmp.ha
          gen-stdlib: restore replace.ha and pad.ha
          strings::replace: fix algorithm
          strings::replace: fix incorrect test
          rt: add O_ACCMODE file access modes mask
          rt/+linux: add mount and umount2 syscalls
    
    Christy X. Winslett (1):
          types::RUNE_MIN: correct documentation comment
    
    Conrad Hoffmann (21):
          os: run finalization functions on exit()
          net::dns: add support for CNAME records
          net::dns: handle NS, SOA, and SRV records
          net::dns: add support for CAA records
          net::dns: add support for PTR records
          net::dns: add support for SSHFP records
          net::dns: fix opcode bitmask
          os::exec: only open() regular files
          net::dns: retry over TCP on truncated response
          net::dns: add constants for DNS dynamic updates
          net::dns: implement encoding of TXT records
          net::dns: add TSIG records and decoding
          net::dns: write label terminator in encode_labels
          net::dns: enforce actual label size restriction
          rt: fix off-by-one haredocs for AF_* and IPPROTO_*
          net::dns: support for OPT records (EDNS, RFC 6891)
          net::dns: support for basic DNSSEC RR types
          rt: add IPPROTO_ICMPV6
          net::dns: fix off-by-one in encode_raw
          net::dns: remove obsolete reference in docs
          Move string comparison logic to sort::cmp::strs()
    
    David Rubin (1):
          correct inotify_event to use [*]u8
    
    Dmitry Matveyev (3):
          unix::hosts: refactor into more general interface
          bufio: elaborate on docs for scantok and scanline
          test: disable color if NO_COLOR or not a tty
    
    Dominik Hagowski (1):
          Fix duplicate task when building object files
    
    Drew DeVault (1480):
          Initial commit
          rt: main returns void
          types: initial commit
          Add io/println (temp)
          Initial commit
          Add .build.yml
          rt: import allocator from harec
          rt: don't export memcpy
          stdlib.mk: update rt
          rt: drop must_malloc references
          strconv: new module
          stdlib.mk: add new modules
          rt::malloc: use array expansion
          stdlib/types: add arch.ha
          Update license: LGPL => MPL 2.0
          types: fix slice layout
          strings: new module
          os: implement os::args
          stdlib: rig up os, strings
          os: use static argument array if possible
          os: only free args in @fini if allocated by @init
          strings: improve cstrings documentation
          abort_fixed: update OOM language
          Add README.md
          strconv: remove refs to buffer versions from docs
          bytes: add equal, index
          strings: add UTF-8 helper functions
          os: add getenv, must_getenv
          os::getenv: remove `return void`
          os: getenv improvements
          stdlib: update bytes, strings, os
          io: add initial stream abstraction
          Expand stdlib coverage
          rt: add errno wrapping helpers
          io: improve docs for stream
          os: add fdstream, stdfd
          os::fdstream: add static_fdopen (private)
          os: add streamfd function
          bytes::copy: new function
          strings::dup: new function
          Update existing code to use named struct initializers
          stdlib.mk: new files
          main.ha: simplify following grammar changes
          stdlib: incorporate os::open
          io: add errorln
          io: add io::mode
          os: add os::open
          os::open: add docs
          strings::c_strlen: fix docs
          os::fdstream: style
          main.ha: improve error handling
          rt, os: rig up errno descriptions
          main.ha: improve error handling
          main.ha: style
          fmt: new module (WIP)
          rt: export memcpy
          io: add io::copy
          main.ha: finish 'cat' example implementation
          io::copy: style
          io::copy: assert an assumption about write
          io: distinguish between closed and EOF conditions
          Remove hacks with slice casts
          encoding::utf8: new module
          encoding::utf8::decode: polymorphize
          encoding::utf8: various improvements
          Rig up encoding::utf8
          strings: add strings::iter
          main.ha: use strings::iter
          strings::iter: remove unnecessary doc comments
          fmt: initial workitude
          fmt: style
          ascii: new module
          stdlib: add ascii; fmt depends on strconv
          all: simplify match statements
          encoding::utf8: new function: valid
          strings: validate UTF-8 string invariants
          encoding::utf8: add docs for valid
          encoding::utf8::valid: improve docs
          os::fdstream: simplify switch usage
          io, os: implement streams with first-class copy
          io::copy: use io::unsupported to force fallback
          strconv, fmt: expand numeric support
          fmt: add printf, errorf
          rt: add memset
          Use static fd_streams for stdin et al
          fdstream: free name on close
          fdstream: add copier to static
          fdstream: autofill future io::stream fields
          stdlib: add rt::memset
          main.ha: demo use of fmt
          os: pass io::mode along to fdstream
          os::fd_copy: refactor out the offset parameter
          os::fdstream: dup name str during initialization
          Update .build.yml
          Add README.md
          os::open: remove TODO
          os::fdopen: remove comment about the stream name
          strings: add iterstr function
          strings: add test for iter
          rt::strcmp: import from harec
          stdlib: add rt::strcmp
          rt: add hare.sc
          strings::iter: fix broken test
          rt: split start_linux and start_ha
          stdlib: rt updates, linker script
          Write script to generate stdlib.mk
          Manage hare dependencies via gen-stdlib
          Rig up stdlib tests in `make check`
          rt: add basic test runner
          .build.yml: build & run tests
          strconv: add tests
          Add .build.yml
          Improve test names
          bytes::equal: add test
          rt +test: make test results line up
          Update stdlib
          bytes: add more test coverage
          rt +test: add more logging
          gen-stdlib: expand rt+test
          rt +test: exit nonzero on test failure
          Update stdlib
          rt: add setjmp/longjmp, update test runner
          Update README.md
          Update stdlib
          io::copy: add test
          rt::start+test: style
          os::fdstream: 80 column limit
          fmt: style
          ascii: rework API to use runes
          ascii: add tests
          fmt: implement numbered arguments
          fmt: accept runes in formattable
          encoding: add tests
          fmt: accept nullable *void
          fmt: close memory leak, fix style
          rt: update alloc following if changes
          Flesh out README.md
          fmt: flesh out a bit more
          strings: add push function
          fmt: expand format string parser
          bytes, strings: add tokenize, split
          Update stdlib
          itos, utos: fix tests
          fmt: add fprintln and friends
          main.ha: use fmt::fatal
          all: (mostly) port to aarch64
          all: port to aarch64
          stdlib: temporarily disable io test
          rt: add stat wrapper
          stdlib: update rt
          rt: convert syscall returns into useful hare values
          rt: drop arch-specific stat buffer
          gen-stdlib: remove rt::arch
          stdlib: io updates
          strings: add has_prefix, has_suffix
          stdlib: update strings
          bytes, strings: add contains
          Update stdlib
          stdlib: update strings
          strings::concat
          stdlib: io depends on strings
          strings::concat: reduce hack factor
          strings::concat: use from_utf8_unsafe
          Update README.md
          stdlib: add os::exec
          os::exec: new module
          os::exec::start: call finish on started command
          stdlib: disable io tests on aarch64 (again)
          rt: use clone instead of fork
          strings: style
          os::exec: remove unused fmt dependency
          Fix up dependency graph errors
          Minor style and doc fixes
          Update stdlib
          os::exec: expand start error handling
          os::exec: improve docs
          os::exec: set CLOEXEC on the pipe flags
          os::exec: add fork()
          os::exec: check for X_OK when testing executable
          rt: add fcntl wrapper
          all: style fixes
          io: add io::getrune
          io::copy: handle short writes
          rt: update hare.sc for gc sections
          Add --gc-sections to LD
          os: add must_fdstream
          stdlib: add crypto::random
          crypto::random: new module
          crypto::random: remove extraneous EAGAIN case
          Drop must_ versions of functions
          update stdlib
          types: slice and string data is nullable
          all: return without explicit void where appropriate
          strconv: expand non-decimal base support
          strconv: add lowercase hex support
          fmt: print pointers in hex
          strconv: implement signed base conversion
          strconv: style
          types: fix cast to uintptr
          all: improve slice allocation usage
          rt::realloc: free on zero size
          strings: add utf8 test
          types: add RUNE_MIN and RUNE_MAX
          Update stdlib
          hare::lex: initial riggings
          stdlib: fix up dependencies
          hare::lex: drop fmt dependency
          hare::lex: add unlex test
          hare::lex: replace linecol tuple with struct
          io: add io::empty
          Update stdlib
          hare::lex: lex1
          update stdlib
          hare::lex: add ATTR_OFFSET
          main.ha: remove unused imports
          hare::lex: lex2
          Update stdlib
          hare::lex+test: style
          README.md: start conventions list
          rt+test: print failed tests summary
          hare::lex: lex3
          rt+test: add ellapsed time to test results
          rt+test: overshot on the nanosecond conversion
          Update stdlib
          io, strings: style
          all: style improvements
          format::elf: initial riggings for new module
          stdlib: add format::elf
          stdlib: add sort
          sort: new module
          stdlib: add ascii::strcmp
          ascii: add strcmp
          sort: style
          hare::lex: finish lex_name
          ascii::ctype: rename test
          hare::lex: lex keywords
          hare::lex: add lexname test
          hare::lex2: add missing div/diveq tokens
          hare::lex: implement comments
          update stdlib
          hare::lex: lex rune literals
          hare::lex: expand keyword tests
          hare::lex: implement string literals
          stdlib: add hare::ast, hare::parse
          bytes: add types dependency
          hare::ast, hare::parse: new modules
          hare::*: s/identifier/ident/g
          Update stdlib
          hare::parse: simplify parse::ident
          hare::parse: parse import list
          hare::parse: retype ident as []str
          update stdlib
          slice::reverse: xor swap not actually useful here
          hare::ast: add import_free
          all: update allocations
          Update stdlib
          Update stdlib
          fmt: add asprintf
          bufio::dynamic: docs
          bufio: add bufio::finish
          os: take advantage of shadowing
          all: use error propagation where appropriate
          hare::parse: simplify namespace usage
          hare::parse: use error propagation
          hare::parse::error: is an error type
          hare::parse: import btoken directly
          rt: add (f)chdir
          os: refine the open & create APIs
          main.ha: accept a file name as input
          main.ha: use type inference for in
          rt: add note about (f)access(at)
          os::exec: use O_PATH for exec fd
          Update stdlib: add fs
          fs: new module
          stdlib: fs depends on strings
          fs: add iterator details
          fs: rename mode::OWNER_* to USER_*
          fs: correct mode::*_RW, add *_RX
          fs: add mode_perm, mode_type
          fs: clarify that programmer should not call next again
          fs::fs: update docs
          fs::filestat: use path type
          bufio: flesh out bufio::fixed
          strio: new module
          Update stdlib (bufio, strio)
          Flesh out bufio, strio some more
          fs: implement mode_str
          fs::mode_str: fill out more file types
          fs::fs: iter may only return the file type bits
          fs: add dirent, fix iter & readdir
          fs: add strio dependency
          main.ha: simplify error format
          hare::lex::errstr: update syntax format
          main.ha: scan imports
          main.ha: free imports
          os: initial pass on dirfd filesystem
          update stdlib
          os::dirfdfs: document resolve
          os::dirfdopen: accept resolve flags
          stdlib: update fs dependencies
          fs::mode_str: rewrite without fmt
          os::resolve: rename NONE to NORMAL
          os::dirfdfs: add subdir
          os: implement fs::iter
          update stdlib
          os: add filesystem convenience functions
          os: add os::chdir, os::chroot
          os::dirfdfs: remove unused import
          os::dirfdfs: implement stat
          strio: add strio::dynamic
          stdlib: update strio
          strio: add strio::concat
          stdlib: update strio
          strio: add truncate, reset
          strio: add strio::join
          strio: add strio::rjoin
          hare::{ast, parse}: add IDENT_MAX
          io::println, errorln: accept multiple arguments
          bufio: abort on invalid buffer/reset/truncate calls
          rt+test: select tests from command line
          stdlib: update rt
          Update stdlib
          path: new module
          hare::ast: reverse order of ast::ident
          strings::push: clarify behavior
          bufio: add bufio::dynamic_from
          fmt: implement some basic width settings
          endian: new module (WIP)
          crypto::math: new module (WIP)
          hash: new module
          crypto::sha256: new module
          stdlib: new modules
          hare::module: new module (WIP)
          fs: add fs::wrongtype error
          hare::module: implement scan, somewhat
          main.ha: rewrite to scan modules
          encoding::hex: new module
          stdlib: add encoding::hex
          hare::module: compute hashes on scan
          update stdlib
          hare::module: store hashes unencoded
          stdlib: update
          main.ha: minor tweaks
          io: add io::tee
          hare::module: scan imports
          update stdlib
          hare::module: close files
          endian: add little endian, host endian
          stdlib: update endian
          stdlib: add hash::fnv
          hash::fnv: new module
          path: add basename, dirname
          stdlib: update path
          path: fix non-rooted cases in names
          strings: drop @init function for c_empty
          rt: add path semantics and nul terminator handling
          fs, os: add mkdir, mkdirs
          hash::fnv: drop debug use fmt
          os::exec: record process information
          Initial riggings for build driver
          bytes: simplify rindex
          fs, os::dirfdfs: add exists error type
          rt+linux: fix envp initialization
          path: fix uninitialized memory errors
          dirs: new module
          hare::modules: initialize HARECACHE, HAREPATH
          stdlib: add dirs module
          strings: add strings::to_c
          os::exec: use strings::to_c for argv, envp
          path::join: handle empty string
          bufio::buffered: initial API design
          hare::ast: add unparse
          hare::context: fix slice-OOB in HAREPATH loader
          hare::module: implement lookup
          os::exec: pull environment from parent proc
          Resolve dependencies for build
          Print hostname during build
          os: add uname functions
          Add +$(ARCH) build tag to context
          os::exec: add setenv
          Pass HARECACHE environment to tasks
          execute: make more apparent that check is returned
          Refactor schedule planning code
          Use HAREC from environment if applicable
          os: add tryenv function
          strings: add try_from_utf8
          path: add path::extension
          path: remove is_root
          fmt: add tests, fix some bugs
          hare::module: identify input file type
          strio: add append_rune
          hare::module: parse tags for file eligibility
          Update stdlib module dependencies
          hare::module: move parse_tags out of types.ha
          hare::module: import tags_compat & update eligible
          hare::module: implement recursive dir scanning
          rt/hare.sc: add ENTRY
          Don't explicitly link to start.o
          Update stdlib
          path: add iter, fix misc. bugs
          fs: add resolve
          scan: resolve paths
          rt: fix docs for getcwd
          path::iter: remove debugging import
          dirs: fix docs for data()
          fs, os: unify open & create semantics
          fs: use fs::mode for create
          fs: add remove, rmdir, rmdirall
          os: dirfdfs: implement remove, rmdir
          os: add rmdir, rmdirall shortcuts
          fs: implement rmdirall
          Update stdlib, provision workdir
          temp: new module
          Update temp dependencies
          rt::ensure: fix off-by-one
          rt: add second parameter for getcwd
          rt: add fallbacks for newer syscalls
          path: add dup
          temp: reduce length of +linux dirs
          hare::module: store module path in version struct
          Update stdlib and schedule more tasks
          all: use str for path components
          strings: add strings::index
          Update stdlib
          hare::module::eligible: rewrite to use strings
          Choose next eligible task to build
          Free more state on exit
          hare::module: add context_free
          Schedule hare object separately from executable
          hare::module: fix invalid frees
          execute: don't error propegate exec::check
          Incorporate modules into the build
          Update stdlib
          Add getopts
          getopt: rename to parse, wrap usage
          os: add os::resolve
          Add basic (and wrong) command line parsing
          Fix output name selection
          hare::module: fix basedir for file input
          getopt: print summary before usage
          getopt: suppress extra newline for flagless cmd
          Expand option parsing and add subcmds.ha
          main.ha: remove extraneous dependencies
          build: correct typo
          os::exec: mark exec as @noreturn
          Generalize dependency planning
          Plan transitive dependencies
          Pass full version info to module scheduler
          subcmds: flesh out arguments for each
          getopt: use empty string instead of tagged union
          subcmds: update getopt usage
          Fix stdlib paths following harec changes
          plan: write modules to hare cache
          build: add TODO regarding default output name
          hare run: basic implementation
          os::exec: add setname
          hare run: simplify argument usage
          hare build: simplify usage
          build, run: add (non-functional) -j option
          plan: move file names closer to their usage
          subcmds: deduplicate tag initialization
          deps: new subcommand (placeholder)
          os::exec: remove (empty) process.ha
          build: link with all implicated modules
          test (will) accept -j
          test: tweak command line usage
          build, run: always link to rt
          Rehome build driver in cmd/hare/
          Merge remote-tracking branch 'stdlib/master'
          Update build system for post-stdlib merge
          Update README.md
          hare.sh: new script
          hare: split schedule.ha from plan.ha
          hare.sh: simplify script
          stdlib: add rt sockets
          hare {build,run}: improve module not found error
          Move binaries into .bin
          driver: add skeleton for cache manifest updates
          driver: riggings for cache subcommand
          fs: add busy error; expand dirfd support
          time: new module
          hare::module: initial manifest riggings
          os: fix RDONLY/WRONLY open flags
          hare::module: write manifests to the cache
          Move cache to .cache
          time: add time::time, time::now
          fs: add times to stat
          time: add time::compare
          hare::module: write mtime to manifest
          hare::module: assert that stat has what we need
          bufio: implement buffered read
          io: add stream unwrapping
          os: use bufio::buffered for stdin
          gen-stdlib: os depends on bufio
          Makefile: clean should remove .cache
          .build.yml: hare-tests has been moved
          rt+linux: use mkdirat for mkdir syscall
          rt: add ppoll, shim poll over it
          gen-stdlib: enable io tests on ARM
          bufio: fix partial consumption read buffer
          bufio: add is_buffered, has_buffered
          bufio: implement write
          os: buffer stdout
          os::exec: disambiguate files
          io: add docs to println, errorln
          hare::module: refactor scan
          hare::module: fill in input basename
          docs: initial draft of hare.scd
          hare(1): finish man page
          hare(1): add *FLAGS variables
          hare(1): formatting fixes
          cmd: commands are licensed with the GPL
          cmd/hare: fix some minor flags issues
          cmd/hare: implement hare version
          config.example.mk: add more options
          make: pass -D to test build
          cmd/hare: use const where possible
          Fix O_DIRECTORY on +aarch64
          rt: fix O_DIRECTORY definition on x86_64
          cmd/hare: implement -D option
          hare(1): mention that test adds +test and +debug
          Move utility scripts into scripts/
          cmd/hare: source platform from build
          hare(1): expand docs for build tags
          unicode: initial module riggings
          endian: add hton, ntoh
          strings::tokenize: fix docs
          hare::lex: fix typo
          rt: add ioctl
          hare::parse: improve error messages
          encoding::hex: add decode
          hare::module: implement cache manifest loading
          cmd/hare: skip dependencies which are current (WIP)
          cmd/hare: add TODO regarding manifests
          crypto::sha*: add docs
          crypto::random: hide internal stream state
          all: update names to be consistent with style guide
          s/to_utf8/toutf8/g
          time: rename time::time to time::instant
          encoding::hex: support encoding to stream
          endian: expand big endian support
          uuid: new module
          endian: complete earlier API expansions
          endian: fix typo
          strings: add warning about runewise operations
          strings::iter: add Unicode warning
          cmd/harec: format errors with context
          cmd/hare: fix lingering promotion issue
          hare::parse: flesh out expressions a bit
          hare::parse: fixes for expression-list
          cmd/harec: implement option parsing
          cmd/harec: clarify command usage
          cmd/harec: print usage and exit if no inputs
          make: enumerate harec sources as dependencies
          sha512: export SIZE constants
          uuid: use uuid type for id binding
          rt: restructure +test per module conventions
          hare test: stub out functionality
          net::ip::string: increase buffer size
          stdlib.mk: net::ip depends on fmt
          cmd/hare: implement hare version -v
          net: move platform-specific code to +linux
          net: generalize listener interface
          net: sketch out datagram socket interface
          sort::sort: basic implementation
          hare::module: sort module inputs
          slice: add []void functions
          slice: add docs
          Remove str => *const char cast and nul terminator
          strconv: cleanup nul terminator bits
          cmd/hare: only apply -D to the root namespace
          hare::module: prune down less-specific candidates
          cmd/hare: finishing touches on hare test
          hare::module: clean up candidate selection
          strconv::ftos: enable more tests following harec fix
          hare::module: flesh out ambiguous inputs algorithm
          cmd/hare: remove TODOs regarding rt omission
          hare::module: test if module cache is current
          hare(1): improve module resolution docs
          Clarify licensing in README.md
          hare::parse: implement binary arithmetic exprs
          hare::parse: move expression_list
          all: generalize error handling
          unix: add setuid, euid, gid, egid
          unix: add getuid, gid, euid, egid
          unix: add nice
          bufio: add unread functions
          encoding::xml: initial skeleton
          hare::parse: implement cast-expression
          hare::parse: fix nested cast expressions
          hare::parse: (mostly) implement unary arithmetic
          hare::ast: move TODO comment out of doc text
          hare::parse: move expr classes into exprclass.ha
          hare::parse: introduce mustlex utility
          stdlib.mk: add more errors dependencies
          format::elf: add elf_machine enum
          format::elf: add HOST_MACHINE, HOST_ABI
          format::elf: s/HOST_*/TARGET_*/
          format::elf: tweak doc comment placement
          io::println: don't write to stderr
          strio: rename append_rune to appendrune
          encoding::xml: parse element start
          encoding::xml: simplify scan_element
          hare::parse: skeleton for postfix-expression
          hare::parse: implement plain-expression
          format::elf: add +aarch64 target
          hare::parse: remove expression classes
          README.md: correct typo
          bufio::fixed: add closer
          encoding::xml: parse attributes
          encoding::xml: scan content
          encoding::xml: add module docs
          ascii: add strcasecmp
          encoding::xml: add tests
          encoding::xml: rename to format::xml
          bufio::unreadrune: support several unreads
          format::xml: implement XML comments
          format::xml: add test for comments
          format::xml: leave comments at deliberate omissions
          format::xml: implement XML entities
          format::xml: reuse strio buffers
          os: add BUFSIZ; use for stdin, stdout, format::xml
          format::xml: implement CDATA
          format::xml: add cdata test
          io: implement unwrap for tee, limit
          os: set BUFSIZ back to 4096
          gen-stdlib: format::xml depends on os
          format::xml: remove test logging
          rt::segmalloc: minor style nit
          dirs: assume $HOME is always set
          bufio, fdstream, dirfdfs: reorder declarations
          format::xml::parser.ha: simplify comments
          format::xml: validate closing tags
          os::streamfd: add unwrap parameter
          format::elf: improve auxv type
          format::xml: document lack of namespace handling
          all: fix append syntax
          hare::parse: s/want_tok/want/g et al
          hare::lex: add flag for lexing comments
          hare::lex: change approach to comments
          hare::lex: remove ltok::COMMENT
          hare::parse: move tests into subdir
          hare::parse: implement struct and union types
          hare::parse: types.ha => parse.ha
          hare::parse: merge util.ha => parse.ha
          hare::parse: implement slice & array types
          hare::parse: implement enum types
          hare::parse: parse constant expressions
          hare::unparse: fix str, rune constants
          hare::parse: make constant more concise
          hare::parse: use const where appropriate
          hare::parse: make precedence more concise
          hare::parse: remove exprclass.ha
          hare::parse: move builtin into separate function
          hare::parse: implement call expressions
          hare::parse+test: make expr.ha consistent
          hare::parse: implement struct field access
          hare::parse: implement tuple access
          hare::parse: implement error propagation
          hare::parse: remove workaround for #377
          hare::parse: implement indexing expressions
          hare::parse: add TODO regarding slicing expressions
          hare::parse: implement slicing expressions
          hare::parse: implement object selectors
          hare::parse: style
          hare::parse: implement (or finish) expression-list
          hare::parse::expression: don't unwrap errors twice
          hare::parse: add defer placeholder to builtin
          hare::parse: use const where appropriate
          hare::parse: improve call parsing
          hare::parse: remove control from expression-list
          hare::lex: implement labels
          hare::lex: use strio::dynamic where appropriate
          hare::parse: implement control expressions
          hare::parse: implement if expressions
          hare::parse: implement array literals
          hare::parse: implement tuple expressions
          hare: add doc.ha
          hare::parse: binarithm: simplify loops
          hare::parse: implement bindings
          hare::unparse: remove workaround for #380
          hare::unparse: remove obsolete TODO
          hare::parse: implement for loops
          hare::lex: implement => (case)
          hare::parse: implement switch expressions
          hare::unparse: flesh out documentation
          hare::parse: implement defer expressions
          hare::parse: implement assignment
          hare::parse: implement allocation expressions
          hare::parse: implement append expressions
          hare::parse: implement delete expressions
          hare::parse: implement free expressions
          hare::parse: don't unnecessarily unwrap errors
          hare::parse: store docs on ast::decl
          cmd/haredoc: initial commit
          ascii: update docs to follow style conventions
          make: add haredoc to build
          hare::parse: implement struct literals
          format::html: new module
          all: move docs.ha => README
          os: remove open.ha
          haredoc: flesh out command structure
          haredoc: basic HTML formatter
          haredoc: mock up breadcrumbs in HTML output
          haredoc: expand size of declaration text
          haredoc: mock up tags & source code URL
          haredoc: add permalink to each heading
          haredoc: implement module resolution
          haredoc: move toc into <pre>
          haredoc: remove type emitting hack
          all: move module docs into README files
          all: docs: change [ref] to [[ref]]
          hare::lex: fix i, u literal suffixes
          haredoc: provide file path to lexer
          hare::parse: fix delete_expr on object selector
          strio: improve docs
          haredoc: fix overzealous sed errors
          haredoc: remove obsolete TODO
          haredoc: fill out <title> with module ident
          haredoc: add decl type to headings
          haredoc: add max-width on <pre>
          hare::parse: use cast for indirect target
          rt: don't use out of range u64 literal
          haredoc: don't use assembly sources
          hare::parse: fix indirect assignment to non-objsel
          hare::parse: implement global prototypes
          rt: add README
          hare::unparse: fix test issues
          hare::lex: merge repeated strings into one token
          getopt::README: fix reference
          io: add io::drain
          getopt: improve docs
          haredoc: handle haredoc markup
          haredoc: mark all references as "invalid" (for now)
          hare:: improve docs
          unix: don't use negative unsigned constants
          haredoc: initial pass on references
          haredoc: resolve all references
          haredoc: change path to stdlib refs
          haredoc: improve generated <title> markup
          fmt: move module docs into README
          fmt: fix example string
          haredoc: generate breadcrumbs
          haredoc: sort errors out separately
          haredoc: enumerate submodules
          haredoc: handle empty directories better
          haredoc: sort errors
          Add haredoc(1) man page
          haredoc: highlight the linked-to symbol
          getopt: fix error in docs
          bufio: clarify purpose of bufstream type
          haredoc: visually distinguish undocumented members
          os, os::exec: add READMEs
          os: remove os::root
          hare::README: fix references
          haredoc: hide undocumented members by default
          hare::module: add README
          haredoc: support empty ident (to index stdlib)
          scripts/gen-docs: new script
          Rig up docs to build
          haredoc: fix <title> for stdlib index
          haredoc: fix header for stdlib index
          haredoc: improve nav layout
          haredoc: skip cmd dir, rig up meta-modules
          haredoc: use absolute paths to submodules
          gen-docs: fix module name regex
          ascii: doc improvements
          bufio: docs improvements
          bytes: docs improvements
          crypto: docs improvements
          encoding: doc improvements
          hash: minor doc fix
          hare::ast: doc improvements
          gen-docs: add rt to the explicit list
          path: improve docs
          format::xml: improve documentation
          Add Developer Certificate of Origin requirement
          hare::parse: separate constants and globals
          hare::lex: improve docs
          haredoc: exclude more non-module dirs
          all: fix error handling oversights
          rt: don't assert in rt::abort
          rt::abort: hang if kill fails
          fs: add README
          fmt: add hard stops to docs
          rt: add memmove
          hare::parse: use insert
          bufio: utilize insert where appropriate
          stdlib.mk: fix various missing deps
          hare::types: initial pass for new module
          hare::types: add note regarding ABI compat
          hare::types: add more hash samples, fix aliases
          hare::types: flesh out API design for type store
          gen-docs: don't re-download mascot.jpg
          hare::types: add README
          haredoc: fix indentation of nested structs
          hare::types: typestore is a private member
          hare::types: implement pointer types
          hare::types: add pointer test case
          hare::types: store type size & align
          hare::types: refactor type hashmap
          hare::types: document store_free
          hare::types: refine resolver interface
          gen-stdlib: hare::types+test depends on hare::parse
          time+linux: minor improvements
          hare::types: flesh out more type structures
          hare::types: add more hash tests
          hare::types: remove extra match branch
          hare::types: initial support for structs
          hare::types: fix struct size
          hare::types: basic union implementation
          hare::types +test: test field alignment
          hare::types: sort struct fields
          hare::types: fix struct alignment
          hare::types: remove unnecessary branch
          hare::types: test embedded structs & unions
          hare::types: fix embedded union offset computation
          hare::types: document typestore design better
          hare::types: use const where appropriate
          hare::types: test explicit offsets
          hare::types: remove c_compat
          hare::types: remove obsolete TODOs
          hare::types: implement tuples
          hare::types: style nit
          hare::types: tagged union data structures & hash
          hare::types: implement tagged types in type_finish
          hare::types: implement lookup for list types
          hare::types: simplify resolver error handling
          uuid: implement decode, decodestr
          uuid: improve docs
          uuid: minor style nit
          uuid: merge separate +test.ha file
          hare::lex: floating point constants
          strconv: partially implement floatingtosb
          haredoc: ! is a prefix now
          os: add mkfifo, mkblk, and mkchr functions
          errors: fix errors::errno strerror
          io::limit: clarify close behavior
          linux::uring: initial commit
          rt: add io_uring syscalls
          linux::uring: implement setup
          linux::uring: flesh out queue somewhat
          linux::uring: implement basic submitter
          linux::uring: add uring::finish
          linux::io_uring: re-home from linux::uring
          io_uring::get_cqe: return null if unavailable
          linux::io_uring: add readv/writev
          gen-docs: fix namespace issues
          linux::io_uring: implement io_uring_register
          linux::io_uring: add fixed read/write
          linux::io_uring: rewrite non-complaint code
          linux::io_uring: clarify usage of registered buffers
          linux::io_uring: add fsync
          linux::io_uring: add polling SQEs
          linux::io_uring: add CQE-related functions
          linux::io_uring: add must_get_sqe
          linux::io_uring: fix needs_enter
          linux::io_uring: add MAX_ENTRIES constant
          linux::io_uring: add result and get_user CQE funcs
          linux::io_uring: send/recv/sendmsg/recvmsg
          linux::io_uring: timeout operations
          linux::io_uring: add accept
          linux::io_uring: add close
          linux::io_uring: sqe_flags => flags
          linux::io_uring: add offs to read/write
          linux::io_uring: add link_timeout
          linux::io_uring: add openat
          linux::io_uring: add error flag to errors
          linux::signalfd: new module
          bufio::flush: don't flush without any pending data
          net+linux: fix setsockopt return value
          time: implement time::add
          rt::abort: add new abort reason
          net: reorganize modules
          net::unix: make to_native private
          net::udp: new module
          hare::udp: s/bind_option/listen_option/g
          net::dns: initial riggings
          net::dns: draft remainder of decoder API
          net::dns: Add README
          net::dns: correct documentation error
          net: add README
          net: add tcp::accept, unix::accept, etc
          net::dns::decode_header: use header, not message
          net: doc tweaks
          net::dns: flesh out message decoder
          net::dns: add decode_a, decode_aaaa
          net::dns: validate names are ASCII
          net::dns: add porcelain decoder API
          net::dns: add porcelain "query" function
          net::dns: update README
          unix::resolvconf: new module
          net::dns: use system nameservers in query
          unix::resolvconf: cache return value
          bufio::scantok: accept multiple tokens
          unix::resolvconf: skip comments
          unix::hosts: new module
          strings: add strings::join
          net::dns: minor fixes
          unix::resolvconf, unix::hosts: handle empty lines
          all: expand generic error handling
          net::udp: add stream function
          net::udp: add socket_for
          net::dial: new module (skeleton only)
          net::dial: update docs per generalized design
          net::dial: moar docs
          net::dial: add resolve stub
          net::dial: declare net::dns dependency
          net::dial: fix typo in docs
          hash::crc*: style fixes
          net::dial: flesh out dial (but not dial_tcp et al)
          net::dns: split encode/decode into separate files
          net::dns: refactor encode
          net::dns: dedupe name encoding
          net::dns: remove obsolete comment
          net::dns: add note about error handling
          fs: add fs::rename, fs::move
          fs::move: implement copy+delete fallback
          fs::move: assert that target is a regular file
          fs::move: use is_file instead of bitbanging mode
          net::dns: add decode_mx
          net::dns: handle server errors in query
          net::dns: refactor decoding for improved rdata
          net::dns: add parse_domain, unparse_domain
          net::dns: simplify decoder type, make private
          net::dns: fix decoding error w/multiple rrecords
          net::dns: decode_op/encode_op style fix
          net::dns: simplify decode_rrecord
          hare::dns::decode: minor optimization
          net::dns: send requests to all nameservers at once
          net::dns: fix AAAA decoding error
          unix::hosts, resolvconf: fix minor issues
          net::dial: initial version of dial::resolve
          net::dial: initial implementation for TCP
          net::dial: declare additional dependencies
          net::dial::resolve: correct off-by-one error
          net::dns: fix IPv6 nameservers; add timeout
          net::unix: add dial implementation
          net::dial: rig up udp dialer
          net::dial::resolve: special-case "unknown"
          net::dial::resolve: fix IP parsing
          bufio: rewrite README
          bufio: further docs improvements
          net::unix: declare net::dial dependency
          temp: implement temp::named
          temp: improve docs
          hare::module: use lock-free atomic manifest writes
          cmd/hare: bubble build errors up to subcmd
          cmd/hare: remove hare version -v
          cmd/hare: use const where possible
          hare::module: declare dependency on temp
          temp: declare dependency on fmt
          time: document clock type
          fs::fs: improve docs
          net::dns: implement TXT rdata decoder
          bufio::buffered: don't free static streams
          rt: add basic +debug allocator
          cmd/hare: add HARE_DEBUG_WORKDIR variable
          cmd/hare: simplify main.ha
          cmd/hare: rework 'hare version' command
          cmd/hare: print path details to stderr
          unix: declare fs dependency
          COPYING: Remove incompatibility notice
          unix::poll: new module
          net::dns: declare unix::poll dependency
          unix::poll: fix documentation reference
          gen-stdlib: fix up missing types dependencies
          encoding::base64: improve docs, trim down module
          all: fix bindings of zero size in match
          cmd/hare: touch up usage strings
          os::getenv: fix unbounded slice expression
          bufio: remove weird line from @test buffered_read
          rt: add support for unreachable abort
          linux::vdso: fix non-exhaustive switch
          all: roll back some gen vN workarounds
          os::dirfdfs: allow tuning getdents buffer size
          hare::types: add trailing padding to types
          Makefile: set harec and haredoc as PHONY
          hare::unit: new module
          hare::unit: fill in more bones
          hare::unit: partially implement constant exprs
          hare::unit: expand constants
          hare::unit: implement literals
          cmd/harec: add bare-bones gen skeleton
          cmd/harec: add some meat to these bones
          hare/README: expand module list
          cmd/harec: improve rtype logic
          hare::types: s/alias._type/alias.secondary/g
          all: s/_type._type/_type.repr/g
          format::html: remove module
          all: fix tests
          hare::types: add singletons for builtins
          cmd/harec: basic gen_expr_const implementation
          all: move labels to compound exprs
          cmd/hare: add environment to -v
          all: yield WIP
          haredoc: fix enum unparse in -Ftty
          cmd/harec: basic qtypes
          hare::*: simplify values
          cmd/harec: implement emit with args
          cmd/harec: add label to qval
          hare::unit: partially implement compound exprs
          cmd/harec: partially implement compound exprs
          hare::unit: implement return expressions
          cmd/harec: bindings, part one
          cmd/harec: basic gen_store
          cmd/harec: implement object access expressions
          hare::unit: add test for access exprs
          hare::unit: more docs
          hare::types: handle aliases for is_*
          hare::unit: moar docs
          cmd/haretype: new command
          cmd/haretype: handle null & undefined sizes
          hash::hash: refactor with subtyping
          hash::*: use caller allocation throughout
          crypto::*: use subtypes for hashes
          hash::*: remove closers
          io: stack-allocated limitreader/limitwriter
          io::tee: use stack allocation
          haredoc: show non-terminating newlines in comments
          fs: minor doc improvement
          os: embed io::stream in fdstream
          os: use stack allocation on fdopen
          io: add io::file
          io::file: expand interface with fdalloc
          fs: add open_file and create_file
          Remove os::streamfd, update net::*, unix::*
          io: introduce io::unwrapfd
          all: return io::file from os::open
          all: expand RISC-V support
          all: overhaul switch/match syntax
          riscv64: fix match syntax
          all: updates for reflection support
          hare::*: implement type builtin
          all: updates following reflection standardization
          all: update type IDs
          haredoc: fix issues with new tokens
          hare::module: add ABI_VERSION to hash
          types: add README
          types: fix slice repr
          fs: style fix
          rt: simplify mmap fix-up branch
          all: introduce io::handle and refactor usage
          fnmatch: fix up docs
          fnmatch: remove export on internal function
          iobus: initial commit
          iobus: add CQE callbacks
          iobus: implement accept
          iobus: fix bug with {un,}register_file
          iobus: fix typo
          iobus: docs improvements
          iobus: expand README
          hare::module: resolve symlinks
          iobus: fix net:: import
          gen-docs: add iobus explicitly
          iobus: join lines in README
          iobus: implement chain and serialize functions
          iobus: typo fix in [[done]] docs
          iobus: remove obsolete comment
          iobus: add setuser/getuser
          iobus: add busfile
          linux::io_uring: implement provide_buffers support
          linux::io_uring: add README
          iobus::io_uring: remove io_uring mentions from docs
          unix::poll: fix INDEF usage
          iobus::io_uring: reduce default SQE queue size
          cmd/iobus: initial commit
          iobus: implement poll
          iobus: rig up eventfd support
          cmd/iobus: flesh out dual bus management
          iobus: fill out ... files_update struct
          iobus: simplify busfile
          iobus: buffer pool management
          iobus: add error handling for register_file
          iobus: implement nobuffers error
          cmd/iobus: update register_file API
          os: add dirfile, refactor dirfdfs somewhat
          iobus: add open, create
          linux::io_uring: drop 'use fmt'
          rt: import hare.sc from harec
          .build.yml: email hare-dev on CI failures
          Remove email triggers from .build.yml
          stdlib.mk: drop + from PLATFORM & ARCH
          stdlib.mk: add platform-specific module versions
          iobus: clarify error behavior of [[getbuffer]]
          rt: initial +freebsd support
          .builds: add FreeBSD
          types: rename util+test.ha => +test.ha
          iobus: improve pool docs
          cmd/hare: add assembly debug symbols
          net::ip: initialize complete structs in to_native
          scripts/gen-docs: fix module list generation
          os::exec: use O_EXEC on +freebsd
          os::exec: use RDONLY on +freebsd
          cmd/haredoc: add 'out' to context
          os::exec: improve documentation for file mapping
          cmd/haredoc: page TTY output through pager
          hare::module: skip dirs with zero inputs
          Add /usr/local to default HAREPATH
          scripts/gen-docs: improve module listing
          hare::module: permit empty modules with README
          rt+linux: use dup3 for dup2 implementation
          rt/hare.sc: move .text higher in the address space
          slice: add slice::trunc
          strings: add strings::runes
          format::elf: fix up trailing whitespace
          cmd/haredoc: fix case where PAGER is unset
          rt: remove extraneous return statements
          io: add io::mmap
          rt+linux: expand ioctl functionality
          io: add munmap
          hare::unparse: export more functions
          Add (empty) READMEs for empty modules
          io: add readitem, readitems
          io: expand errors::unsupported into io::error
          io: add writeitem, writeitems
          os+freebsd: fix gid in fileinfo
          strings: accept rune in hasprefix, hassuffix
          iobus::io_uring: add send, recv
          net: listenerfd is portable
          hash::fnv: add string32, string64
          hash::fnv: add string
          io::drain: accept io::handle
          hare release: new subcmd (WIP)
          cmd/hare: use const where appropriate
          hare release: rig up initial changelog bits
          hare release: remove redundant error flag
          hare release: add git note signature
          all: drop bytes::copy in favor of slice assignment
          hare release: allow setting tag name manually
          hare release: move tag signing into separate func
          hare release: implement initial release
          hare release: fail gracefully if ssh-keygen is missing
          hare release: remove extra os::remove
          os::exec: improve fd manipulation
          os::exec: add exec::pipe
          os::exec: further docs improvements
          haredoc: prefer os::exec::pipe over unix::pipe
          os::exec::addfile: remove TODO
          os::exec: fix dependencies and +freebsd
          os::exec: add exec::wait to pipe docs
          os::exec+freebsd: import unix
          os::exec::addfile: swap from and to parameters
          os::exec+freebsd: update platform_exec
          os::exec: add kill
          hare release: start SSH agent for signing
          crypto::cipher, crypto::aes: improve docs
          crypto: address secure erasure of secret data
          all: remove reflection
          net::ip: add LOCAL_V4, LOCAL_V6
          rt: use eventfd2 rather than eventfd
          stdlib.mk: add a few missing io dependencies
          docs: add modules.md
          docs/modules.md: improve use of "module root"
          docs/modules.md: fix typo
          hare::module: implement walk
          hare::module: re-introduce README hack
          rt+libc: don't run @init/@fini twice
          rt+libc: exit with libc
          hare::module: add vendor/ to default HAREPATH
          cmd/hare: take advantage of slice duplication
          crypto::argon2: minor docs improvements
          io: fix typo in docs
          hare::module: bump ABI version
          strings: add cut
          Makefile: move .bin/harec to harec2
          io+freebsd: fix offs name
          all: updates for append/insert overhaul
          io::file: update docs
          io::file: fix doc error on +freebsd
          net: add sendmsg, recvmsg support
          os: add wrapper for fs::readlink
          path::join: fix join("/") case
          dirfdfs: swap EINVAL for fs::wrongtype on readlink
          pathbuf: initial commit
          pathbuf: add README
          pathbuf: add join
          pathbuf: use fromutf8_unsafe
          pathbuffer: merge into path
          path::iter: accept *path::buffer as input
          path: implement ".." for path::buffer
          path::buffer: expand ".." tests
          path: accept buffer for most path utilities
          path: add path::set
          path: return latest value from mutation functions
          hare release: use path::buffer
          path::join: minor improvements
          path::buffer: document+test trailing / behavior
          path: remove redundant namespace usage
          path: @test: don't be quite so rough on the stack
          cmd/hare/plan.ha: use path::buffer
          cmd/hare/schedule.ha: use path::buffer
          path::buffer: add additional test case
          dirs: use path::buffer
          dirs: add README
          dirs: improve documentation of 'prog' parameter
          temp: use path::buffer
          fs::rmdirall: use path::buffer
          fs::rmdirall: add perf comment
          fs, os: add realpath
          os: correct reference to fs::realpath
          fs::mem: drop module
          fs: tweak fs::resolve
          fs::readlink: use static return value
          os+freebsd: update fs_resolve
          crypto::md5: drop module
          gen-stdlib: drop crypto::md5
          crypto: stub out authenc.ha
          crypto::argon2: accept config as pointer
          crypto: implement derivekey
          crypto::derivekey: document algorithm details
          mime: new module
          os::exec: add self()
          io::drain: document return value ownership
          haredoc: improve dark theme
          strings: improve docs
          Revert "haredoc: improve dark theme"
          mime: implement internal MIME database
          mime: remove leftover assertion from debugging
          mime: fix typos in comments
          mime: slightly improved implementation of quoted-string
          mime: better approach to quoted-string
          mime: add some error cases to tests
          mime: load system database
          mime, os: remove temporary imports
          gen-docs: add mime
          io::limit: better define limit exceeded cases
          stdlib.mk: add os dependency for base32
          make: add install target
          scripts/version: let environment set version
          hare::module: fix default HAREPATH
          strings::iter: improve docs
          all: add copyright headers
          fmt: correct README error
          fs: add link, symlink
          os: add os::access
          fs: drop subdir/mksubdir
          hash::crc*: document sum32/sum64
          io::readall, io::writeall: new util functions
          compress::flate: use io::readall
          net::dial: fix error in docs
          rt+linux+libc: fix argv type
          haredoc: use data URI for mascot
          linux::keyctl: initial commit
          crypto::keystore: new module
          crypto::keystore: add README
          gen-docs: add crypto::keystore to whitelist
          gen-docs: disable format::ini
          crypto::keystore: implement destroy for +linux
          os+linux: add mlock family of functions
          encoding::base64: add encode, decode
          unix::tty: add strerror
          unix::tty: add noecho
          io: add readv, writev
          io: drop println, errorln
          fs: add finish for iter
          os+freebsd: fix iter
          regex: improve README
          unix::signal: new module
          Merge linux::signalfd into unix::signal
          unix::signal: refactor signalfd
          unix::signal: correct SIGINT name
          errors: add interrupted
          unix::signal: improve signalfd interface
          unix::signal: set SFD_NONBLOCK for signalfd
          unix::signal: further improvements to signalfds
          unix::signal: add procmask
          unix::signal: add sigprocmask bits
          glob: make failure an error type
          errors: add eagain
          unix::signal: fix stdlib.mk deps
          os::exec::addfile: clarify docs
          net: convert listener to io::file
          update strio usage per upstream changes
          datetime et al: updates per stdlib/compiler changes
          time::compare: improve docs
          time: improve README
          datetime: rename mock => builder
          datetime::new: rename zo to offs, update comments
          datetime: remove clone
          datetime: reflow README
          datetime: overhaul format functions
          datetime: rename start_of to truncate
          datetime: rename diff_in_unit => unitdiff
          datetime::hop, add, sub: improve docs
          datetime::is_*: remove is_ prefix
          datetime: docs improvements
          time::tzdb: improve error handling
          datetime: fix up docs
          datetime: document format string constants
          time::chrono: initialize leap seconds
          Merge time::tzdb into time::chrono
          os+freebsd: add init_cwd workaround
          datetime::parse: remove trailing newline in docs
          log: new module
          log: add README
          log: add fatal, lfatal
          haredoc: fix too many fmt args for index
          shlex: add quote, quotestr
          shlex: fix permissible characters
          crypto::hmac: add sha1
          crypto::blowfish: new module
          crypto::blowfish: fix aes reference
          crypto::blowfish: remove unused dependencies
          crypto: add opencollective to README
          stdlib.mk: add missing ed25519 deps
          all: add missing README files
          iobus: remove module
          linux::io_uring: remove module
          compress: remove module
          format::xml: remove module
          Update README.md
          all: use vtable for io::stream
          aes: initialize blocksz for ni
          rt+linux: drop obsolete comment
          keyctl: remove test
          Revert "bufio: improve buffered reader performance"
          Revert "bufio::buffered: use rbuffer as unread buffer"
          cmd/hare: print details on exec::cmd failure
          crypto::blowfish: fix salted initialization
          crypto::bcrypt: new module
          crypto::bcrypt: add README
          os::exec: fix error handling
          os::exec: add rt::SIGCHLD to clone call
          Revert "haredoc: use brighter non-bold tty colours"
          crypto::bcrypt: remove debug imports
          crypto::bcrypt: remove slice alloc workaround
          io: add io::zero
          bufio: buffer unreads into internal read buffer
          bufio: clarify abort behavior of unread
          encoding::pem: initial commit
          encoding::pem: add README
          encoding::pem: add license headers
          crypto::cipher::ctr: remove unused variables
          encoding::pem: minor style improvement
          encoding::pem: remove unused struct field
          README.md: yeet the principles
          crypto::argon2: fix erroneous recommendation
          crypto::blake2b: add README
          crypto::derivekey: use argon2id by default
          crypto::ed25519: add README
          crypto::hmac: add standard crypto disclaimer
          bufio::flush: accept any io::handle
          io: drop unwrap
          crypto::*25519: add note about keys
          io: improve io::close docs
          crypto::blowfish: loosen constraints on key size
          log: write to stderr by default
          encoding::json: new module
          encoding::json: (mostly) implement value type
          encoding::json: fix tests
          encoding::json: license headers
          stdlib.mk: add hash::fnv to encoding::json deps
          linux::timerfd: remove trailing whitespace
          encoding::json: add load
          encoding::json: add README
          encoding::json: clarify ownership semantics of set
          encoding::json: add iter(object)
          encoding::json: fix double free
          .builds/alpine.yml: check patches for sign-off
          hare::parse: add parse::decl
          cmd/ioctlgen: initial commit
          cmd/ioctlgen: use hex for output
          hare::types: complete type alias implementation
          ioctlgen: update per regex changes
          bufio: accept io::handle on unread
          ioctlgen: support type aliases
          cmd/ioctlgen: add switch default case
          cmd/ioctlgen: ioctls are u32's actually
          hare::types: createalias => newalias
          os: fix build on FreeBSD
          fmt: don't use io::writeall
          bufio: add borrowedread
          crypto::curve25519: clamp input scalar
          crypto::curve25519: zero clamped scalar
          encoding::pem: accept arbitrary I/O handle
          shlex: quote with ' instead of "
          Remove some obsolete tuple unpacking TODOs
          Mostly implement cross-compiling
          cmd/hare: remove obsolete TODO
          config.mk: use as/ar/cc/ld on x86_64 by default
          .builds/freebsd.yml: drop gmake
          format::tar: new module
          os::iter: improve documentation
          strings::template: new module
          strings::template: minor docs fixes
          net::dns: reuse sendbuf for recv
          os::exec: improve addfile docs
          os::exec: drop docs from exec::command
          unix: add getgroups, setgroups
          rt+freebsd: fix NGROUP_MAX
          unix::passwd: add get*id, improve *_finish
          rt+linux: add sync wrapper
          rt::sleep: this sycall always succeeds
          os::errno_to_fs: style
          hare::module: incorporate tags into manifest
          hare::module: fix false cache busts
          README.md: clarify DCO policy
          config.example.mk: install to /usr/local by default
          fs::readdir: fix dirfd leak
          driver: drop bell on completion
          format::tar: implement seek within entries
          Revert unix buffered I/O changes
          unix::tty: fix bugs and update gen-stdlib
          encoding::json: move to extlib
          rt+libc+test: add __fini_start & __fini_end symbols
          slices: fix static_deletefrom length
          rt: fix rt::backtrace
          strings::template: support ${var} syntax
          Revert "Add location parameter to rc::_abort."
          strings::template: improve README
          rt::epoll_ctl: set return value to void
          hare build: accept -N flag for namespace
          net::udp: add recv
          net::tcp::connect: handle NONBLOCK
          unix::signal: add signame
          rt: add TFD_{CLOEXEC,NONBLOCK}
          crypto::blowfish: minor style fixes
          Makefile: add workaround for parallel build bugs
          rt: epoll_event is @packed on x86_64
          io: remove {read,write}item{s,}
          io::copy: return on zero-byte read
          io::limit*: fix behavior on underread/underwrite
          rt: remove -x86_64.ha
          Revert "haredoc: make submodules reference relative"
          io: drop obsolete doc reference
          Revert time/hash shell syntax change
          rt: add ftruncate wrapper
          net::uri: add dup
          net::uri::dup: fix issue with IPs
          net::dial: add dial_uri
          io::copy: use fallback if unsupported
          bufio: implement improved scanner
          README.md: drop "real-name" for sign-offs
          Add MAINTAINERS
          Add Willow Barraco as aarch64 maintainer
          MAINTAINERS: Drop Sebastian
          MAINTAINERS: Drop N:, add #hare-dev
          MAINTAINERS: Add Sebastian
          MAINTAINERS: Add bgs as math maintainer
          MAINTAINERS: add bgs at top level
          hare::ast, hare::parse: def/let/const w/o type
          Return tuple directly from strings,bytes::cut,rcut
          haredoc: set LESS to FRX if unset
          docs/maintainers.md: document some maintainer bits
          memio: truncate on reset()
          MAINTAINERS: Add Conrad Hoffmann
          Add TREES
          A note from Hare's BDFL
          docs/rfc.md: introduce RFC process
          shlex::split: fix memory errors
          net::dial: refactor out and export splitaddr
          hare::module: add compatibility non-promise to README
          Add docs/rfc-template.txt
          make bootstrap
          test/+test.ha: remove obsfucated code
          docs/rfc.md: link to template
          io: add dup, dup2 functions
          types::c: add unterminatedstr
          time::date: add month and weekday constants
          wordexp: new module
          make bootstrap
          .builds/*: exit on non-master builds
          cmd/hare: fix cross-compiling qbe arch
          rt: remove backtrace functionality
          rt: add ucontext structures for +linux
          rt: add ucontext structures for +freebsd
          rt: add ucontext structures for +openbsd
          rt: add abort hooks
          rt: add sigaltstack wrappers
          rt::malloc: consolidate global state and add newheap
          os, fs: add fstat
          os::exec: expose [[lookup]] to public API
          unix::signal: add addr to siginfo on +openbsd
          debug::image: new module
          debug::dwarf: new module
          debug: new module
          hare(1): enable debug features, add -R flag
          debug::dwarf::line: support version 2
          rt+openbsd: add missing copyright headers
    
    Dridi Boukelmoune (4):
          Makefile: Pass LDLINKFLAGS to link hare
          Makefile: Print the correct $(AR) utility
          error: Align located messages with other toolchains
          cmd/hare: Bring back LDFLAGS support
    
    Edin Taric (1):
          encoding::hex::encode: Re-added and wrote test
    
    Egor (7):
          net: set CLOEXEC on new sockets atomically
          net: invert the meaning of CLOEXEC in sockflags
          net: add sockflags to connect/accept/socketpair
          unix: invert the meaning of CLOEXEC in pipe_flag
          fs: invert the meaning of NOCTTY/CLOEXEC in flags
          fix dup without CLOEXEC in linux dirfs_clone
          os::exec: clear FD_CLOEXEC when dup2ing fd to itself
    
    Ember Sawady (270):
          make clean: force-remove hare
          Fix rt::realloc
          Add io::seeker interface
          rt: add rt::ensure
          os::init_environ: replace horrible hack with append
          rt: size2bin: fix assertion
          rt: realloc: don't reallocate if s == n
          gen-stdlib: gen_lib all modules upfront
          gen-stdlib.sh: fix target names
          rt::segmalloc: remove obsolete TODO
          strings::concat: remove unused variable
          rt+test: fix typo
          hare::lex::lex_name: use variadic appends
          Regenerate mk/stdlib.mk following stdlib updates
          Add rt::unensure
          Update for switch/match cases being scope expressions
          hare::parse: add slice dependency
          bufio: add dynamic
          hare::parse: implement alternative import syntaxes
          os::exec::cmd: make better use of variadic append
          main.ha: unparse alternative import syntaxes
          rt::{ensure, unensure}: get length from slice
          rt::ensure: remove debugging prototypes
          Add fmt::print et al
          main.ha: use fmt::print when appropriate
          fmt: implement printing of bools
          lex::syntaxerr: remove now-unnecessary casts
          io+test::bs_read: use slice copying
          io: drop now-unnecessary @init func
          crypto::random: drop now-unnecessary @init func
          crypto::sha256+test: s/errorln/errorfln/
          hare::lex+test: s/errorln/errorfln/
          hare::module: use dirs::data as default $HAREPATH
          Refactor hare::lex::literal to be a tagged union
          README.md: fix typo
          getopt: new module
          rt::abort_fixed: update for location printing
          Drop workarounds for lack of forward references
          hare::parse::ident: fix synassert
          hare::lex::literal_type: remove
          hare::lex::lex2: implement ! and !=
          strconv::*tos: return index of first nondigit
          Update for prototype grammar changes
          lex::location: specify ownership semantics of path
          hare::ast: flesh out
          hare::unparse: flesh out
          hare::parse: implement decls parsing
          cmd/harec: initial commit
          hare::module::lock: create cache directory
          cmd/harec: use fmt::error when appropriate
          hare::parse: reimplement void constants
          hash::fnv::fnv*_sum: make use of array allocs
          hash::adler32: new module
          gen-stdlib: move module name printing to gen_srcs
          hare::parse::decls: permit empty subunits
          errors::strerror: fix opaque errors
          Update README.md
          errors::opaque: fix example code
          compress::flate: new module
          compress::zlib: new module
          compress::zlib: add test data
          Refactor hare::lex and hare::parse
          Revert "Refactor hare::lex::literal to be a tagged union"
          hare::lex::token: further improvements
          strconv::f64tos: enable negative exponent test
          strconv::stoz: fix documentation
          strconv: add stoi*b
          strconv::stou+test: use flexible literals more
          hare::lex: implement literals
          lex::literal: fix handling of z/i16/u16 suffixes
          cmd/hare: implement -T and -X
          io: move println.ha to println+linux.ha
          cmd/hare: pass --gc-sections to ld
          hare::parse: test struct autofill
          Further fixes to matches
          unix::setuid: fix build
          hare::parse: disallow null as a primitive type
          os::exec: drop +linux.ha
          cmd/harec: buffer the input stream
          Fix error handling oversights in tests
          Fix further oversights in error handling
          hare::parse: implement ! postfix operator
          crypto: add blake2b
          crypto::blake2b: add test vectors
          Regenerate stdlib.mk
          Revert match syntax changes
          hare::parse: update for reverted match syntax
          Update for error type syntactical changes
          hare::parse: make error types a prefix
          types::hash: add write64 and use when appropriate
          hare::ast: add location to expr
          hare::types: finish data structures and hashing
          hare::types::resolver: make rstate nullable
          hare::types: implement lookup for function types
          Fix implicit casts from *void to nullable pointers
          hare::lex: fix float literals
          hare::parse: add float constant tests
          hare::types: fix string size
          hare::types: implement tagged union lookup
          hare::parse: fix pointer match cases
          hare::lex::next: simplify
          parse::mkloc: drop in favor of lex::mkloc
          lex::mkloc: fix interaction with unget
          lex::prevloc: add
          lex::mkloc: fix interaction with unlex
          lex::lexloc: fix tab width
          hare::lex: add mkloc/prevloc tests
          parse::expression: fix bugs in loc tracking
          ast::_type: track end location
          hare::parse: add location tests
          lex::lex2: refactor
          fmt::formattable: add void
          hare::module: search in . if $HAREPATH is unset
          os::iter: rename from os::iterdir
          Update TESTHAREFLAGS for harec change
          cmd/hare: improve test discovery
          cmd/hare: provide fallbacks for -D constants
          hare::module: incorporate +test into cache
          cmd/hare: test: implement module discovery
          cmd/hare: test: don't schedule root module if it's empty
          cmd/hare: test: add -o option
          all: fix too-small tuple values
          net::unix: fix addrlen
          hare::{lex,parse}: implement yield
          rt: add mlock et al
          rt: add prctl
          hare::parse::append_expr: drop *unary-expression form
          hare::parse::unarithm: allow &unary-expression
          hare::parse: implement insert
          hare::lex: assume float on negative exponent
          hare::types::lookup_builtin: simplify
          Fix bugs caught by match exhaustivity test
          cmd/haredoc: fix typo in usage
          cmd/haredoc: -Ftty, -Fhare: drop trailing newline
          cmd/haredoc: implement ident lookup
          cmd/haredoc: drop const reduction workaround
          crypto::sha512: export variant enum
          compress::*: use caller allocation
          bufio/memstream: drop harec workaround in test
          fs::mem+test: drop harec workaround
          bufio+test: drop invalid TODO
          linux::vdso: don't use pointer arithmetic
          path::{base,dir}name: match {base,dir}name(3p)
          io+linux::fd_read: fix indentation
          cmd/harec: fix match case type
          cmd/harec: implement -o
          unix::umask: don't return an error
          unix: add pipe wrapper for Linux
          iobus: further typo fix in [[done]] docs
          hare::{ast,parse,unparse}: implement offset()
          os::exec: implement FD manipulation
          rt::clone: fix on aarch64
          hare::parse::expr: update match binding syntax
          strconv::ftos: implement f32 case
          net::dial::resolve_addr: drop harec workaround
          linux::io_uring::sqe: drop harec workaround
          net: drop forward references workaround
          math::nearbyint{32,64}: fix a few constants
          Update I64_MIN for lexer changes
          hare::lex: drop -- and ++ from bmap
          haredoc: fix ident parsing errors containing '{'
          rt::cc: drop harec workaround
          math::random: add u32n and u64n
          shlex::quote: fix safe non-alphanumeric chars
          README.md: update build badges
          cmd/haretype: fix compilation
          regex: replace alloc([]) with []
          gen-stdlib: fix linux::timerfd dependencies
          hare::lex: implement labels in tokstr
          cmd/haredoc: fix error message
          .builds/freebsd.yml: use bmake where possible
          dirs::lookup: use fmt::fatalf where appropriate
          hare::module::scan_directory: fix double free
          shlex::quote: fix handling of backslashes
          Add a mailmap
          cmd/hare: permit type inference for -D
          Bump ABI version
          Drop hare::lex::_null
          Update my name in the copyright headers
          os: free envp in @fini
          os::exec::strerror: handle errors::error correctly
          os::exec::setenv: fix memory leak
          os::exec: add chdir
          os::fs_create_file: add O_TRUNC by default
          Simplify lex2 for '-' and ':'
          os::exec: fix errno handling in platform_start
          regex: don't use alloc([])
          rt+riscv64::backtrace: fix
          strings::tokenizer: use strings::fromutf8_unsafe
          cmd/haretype: update for align builtin
          Remove implicit assignment from uintptr to pointer
          Fix FreeBSD CI
          os::exec::{un,}setenv: loosen restrictions on keys
          Update for new typedef environment variables
          cmd/haredoc: fix formatting of types in globals
          strings: fix usage of fully qualified identifiers
          Rename files to avoid naming conflicts
          rt/*.s: use correct per-function sections
          Even more fixes for ambiguous files
          crypto/aes/*.s: use correct per-function sections
          cmd/ioctlgen: fix compilation
          cmd/haretype: fix compilation
          cmd/haredoc: close read end of pipe later
          Improve test runner
          rt: fix platform_abort
          rt/abort*.ha: add missing comma in reasons
          rt+freebsd: _start: don't touch first arg
          rt: update for @noreturn abort
          fs+freebsd::readlink: return wrongtype on EINVAL
          Improve +libc argv/argc/envp initialization
          io+freebsd::fd_copy: return errors::unsupported
          Get rid of rt/+test/ztos.ha
          Rewrite malloc
          linux/*: fix fully-qualified identifiers
          hare::parse::want: unlex token on failure
          hare::parse::ident: disallow empty identifier
          os: add setenv and unsetenv
          rt: make errno constants have type rt::errno
          io+linux::fd_copy: simplify
          Fix chachapoly compilation
          hare::parse::identstr: only parse full ident
          cmd/haretype, cmd/ioctlgen: update for memio
          malloc: improve wording in a comment
          pass -z noexecstack to ld
          drop hare release
          add a pointer to my harec tree
          memio: improve dynamic_from documentation
          net: fix cmsg_len
          Rewrite build driver and hare::module
          rt: replace ztos with u64tos
          update for abort abi change
          rt: run @fini functions in reverse order
          get rid of special case in module3 progress bar
          cmd/hare: respect -N
          make use of -M flag
          format::tar: make use of io::readall
          encoding::base{32,64}+test: make use of io::drain
          linux::timerfd::read: clarify docs
          rename fmt::modifiers to fmt::mods
          simplify copyright headers
          replace scripts/gen-stdlib with cmd/genbootstrap
          get rid of $(RM)
          make linux::* +linux only
          hare::parse::doc: relicense as mpl
          get rid of trailing whitespace
          hare::unparse::constant: fix buffer size
          run make docs/html on patch ci
          strconv: minor style fixes
          strconv::fftosf: return number of bytes written
          crypto::aes: fix a doc typo
          unix::hosts: fix references
          log: export global
          crypto::argon2: fix references
          temp::file: get rid of an invalid free
          run_task: unlock after cleanup
          strings: get rid of an extra newline
          update test runner
          strconv::{ffmt, fflags}: improve default values
          fmt: factor out format string iterator
          fmt: add center-alignment
          fmt: flesh out float formatting
          update for checkless for loops
          drop build status from readme
          OpenBSD: truncate files on creation by default
          scripts/moddirs: ignore configs/
          cmd::hare::build: separate tmpfile from lockfile
          update ci for harec config.mk
          notify hare-dev on ci failure
          .builds/alpine.yml: don't fail if publish fails
          .builds/*: only run for ~sircmpwn/hare
    
    Evan Johnston (1):
          strings::fromc: update documentation about invalid utf8
    
    Evan Vogel (1):
          rt/hare+libc.sc: include .rela.plt section for glibc ELF binaries
    
    Gabriel Schmotzer (1):
          fix fmt::fprintf's '+' and '0' modifiers
    
    George Rose (1):
          Fix rt::accept4
    
    Gusted (1):
          Fix typo in crypto::chachapoly
    
    Haelwenn (lanodan) Monnier (22):
          math: make absi* functions return an unsigned integer
          cmd/haredoc: Fix default HAREPATH
          strings: Fix dupall segfaulting on empty array
          cmd/hare: Do not set progress width to 0
          fs: Fix wrong bitmask for filetype test functions
          datetime: fix parsing nanoseconds
          datetime: add %z parsing (zone offset)
          stdlib: Fix format::tar dependencies
          os/exec: Make setenv return errors::invalid instead of aborting
          os::exec: Add unsetenv function
          datetime: Add %F and %T to format
          datetime: Add %s to format
          strings/template: Give the missing parameter name in the error
          net/uri: Acknowledge the different allowed characters
          net/uri: Fix decoding multi-byte percent-data
          net/uri/+test: Use wanted/got wrapping for all str assertions
          cmd/hare: Stick to POSIX ar(1) flags to avoid requiring ARFLAGS
          cmd/hare: Use LDLINKFLAGS instead of LDFLAGS
          net/uri: Always prefix path with a slash when there's a host
          cmd/hare: Print error with command on exec::nocmd
          docs/hare.1.scd: Document HARECFLAGS
          Makefile,stdlib.mk: Use HARECFLAGS for $(HAREC) commands
    
    Humm (3):
          path::doappend: append separator to short buffer
          make: surround macro definition operators by blanks
          encoding::json: refer to RFC 8259 in README
    
    Joe Finney (11):
          Add location parameter to rc::_abort.
          Free cmd.files in os::exec::finish.
          Fix fd leak in os::exec::platform_start.
          Remove _ from function parameters.
          strconv: make stof and ftos round-trip safe.
          strconv: implement ftosf.
          Add comment to strconv::ffmt and strconv::fflags.
          Test length result of strconv::fftstof.
          Alphebatize imports across the board.
          Strip leading space in rt/+openbsd/syscalls.ha.
          strconv: Fix bug with large inputs to stof32.
    
    John Gabriele (1):
          s/error/errors/ module name
    
    Jon Eskin (1):
          os: add mode to mkdir
    
    Jonathan Halmen (2):
          getopt docs: fix typos
          net/dns: fix typo in types.ha
    
    Jose Lombera (6):
          rt: signal: return error for invalid signal numbers
          rt: signal: change API to more sensible return types
          Makefile: add uninstall target
          log: lfatalf: write to correct logger
          log: add default logger
          log: make default and silent loggers const
    
    Josiah Frentsos (3):
          README.md: Change a comma to a semicolon
          Makefile: Fix quoting of $(VERSION)
          OpenBSD: os::cpucount: Return the number of online CPUs
    
    KAAtheWise (2):
          regex: Convert ranges to use u32 representation of runes
          strings::sub: Remove unneeded iteration
    
    Kirill Primak (6):
          strconv: fix mulshiftall64()
          encoding::utf8: validate rune in encoderune()
          encoding::utf8: improve decoder
          rt/test: fix timespec diff calculation
          rt/test: fix milliseconds formatting
          hare/module: update context.paths initialization
    
    Kiëd Llaentenn (13):
          Add unix::tty::isatty
          Add unix::tty::winsize
          Move unix/tty/isatty.ha to unix/tty/+linux/isatty.ha
          Add unix::tty::open
          Add hash::crc32
          Use user-provided buffer for hash::sum
          hash::crc32: Export SIZE definition
          hash::crc32: Use SIZE constant when initialising new crc32 hash struct
          Add hash::crc16
          hash::crc16: Fix reference to CRC32 tables in docs
          hash::crc32: Fix typo in docs
          Add hash::crc64
          hash::crc32: remove unused fmt import
    
    Lassi Pulkkinen (10):
          net::dns: Rework decode_name
          net::dns: Don't assume rdata to be of a certain length
          net::dns: Don't leak memory when decoding fails
          net::dns: Minor cleanup in destructors
          net::dns: Move (un)parse_domain into their own file
          rt+linux: Use exit_group
          bufio: Fix excessive memmoves in buffered_read
          bufio: Skip flush byte search when none are set
          math::modfracf*: Return integer part as float
          math::powf64: Check for overflowing exponent
    
    Lennart Jablonka (5):
          remove ETIME from errors and rt/+freebsd
          gen-stdlib.sh: reset OPTIND=1 before using getopts
          gen-stdlib: quote 'hash' and 'time'
          hare(1): drop duplicate reference to as(1)
          configs/openbsd.mk: default to /usr/local/man
    
    Lorenz (xha) (66):
          time/+freebsd: s/rt::instant/instant
          TREES: add OpenBSD
          io: return errors::invalid if len(vectors): int overflows
          net::unix: remove unused buf
          rt+freebsd fix getpriority
          cmd::hare arch add comment about values beeing overwritten
          rt: make linker scripts platform-specific
          rt: make start* and initfini platform-specific
          rt: make the signal test platform specific
          os::exec: make cmdfile platform-specific
          unix::tty: make openpty() platform-specific
          remove config.example.mk and add configs/<platform>.mk
          cmd::hare: introduce platform.ha for adding platform-specific setttings
          cmd::hare: introduce ctx.libc
          cmd::hare: add OpenBSD
          OpenBSD: add rt
          OpenBSD: add io
          OpenBSD: add path
          OpenBSD: add time
          OpenBSD: add time::chrono
          OpenBSD: add os
          OpenBSD: add os::exec
          OpenBSD: add unix
          OpenBSD: add unix::signal
          OpenBSD: add unix::tty
          OpenBSD: add unix::poll
          OpenBSD: add unix::hosts
          OpenBSD: add unix::resolveconf
          OpenBSD: add format::elf
          OpenBSD: add crypto::random
          OpenBSD: add net
          OpenBSD: add net::ip
          OpenBSD: add net::tcp
          OpenBSD: add net::udp
          OpenBSD: add net::unix
          OpenBSD: add genbootstrap
          MAINTAINERS: add Lorenz (xha) <me@xha.li> to OpenBSD
          OpenBSD: os::exec update for checkless for loops
          OpenBSD: unix::tty isatty() use fcntl(F_ISATTY)
          OpenBSD: make bootstrap
          OpenBSD: add .builds/openbsd.yml
          configs/openbsd.mk remove my local path
          OpenBSD: rt:: fix readlinkat, renameat
          OpenBSD: rt:: sycalls introduce pathbuf1
          OpenBSD: add rt::pledge()
          OpenBSD: add rt::unveil()
          FreeBSD: truncate files on creation by default
          crypto::aes check for AVX before using the native interface
          remove the fs::flag::TRUNC argument from os::create in cmd::hare
          cmd::hare add comments and cleanup
          OpenBSD: implement os::mkfifo and os::mkfile
          os fs.ha: s/errors::errno/fs_to_errno/
          OpenBSD: fix net/ calls to rt functions
          rt/: prepare for IBT support
          make rt/+{arch}/restore.s platform-specific to +linux
          OpenBSD: fix CI
          OpenBSD: rt fix munmap system call
          configs/*.mk: don't always assume cross-compilation
          *BSD: fsflags_to_bsd return unsupported instead of abort()
          remove harec2 from the makefile all target
          Makefile: more quoting
          .builds/freebsd.yml drop CC=cc workaround again
          OpenBSD: rt fix termios structures
          OpenBSD: rt add kqueue(2) wrappers
          OpenBSD: Use more precise checks in fsflags_to_bsd
          debug: partial +openbsd support
    
    Mallory Adams (1):
          FreeBSD: Use more precise checks in fsflags_to_bsd
    
    Martin Quinson (1):
          More testing of encoding::base64
    
    Miccah Castorina (3):
          net::ip::fillmask: bug fix for ipv6 masks
          net::ip: implement subnet_contains
          strings::iter: Make riter use next to go forward
    
    Michael Forney (2):
          rt: fix riscv64 entry point
          rt: fix riscv64 O_DIRECTORY value
    
    Michael Tilli (1):
          Advance after zero-length regex matches
    
    Mohammed Anas (3):
          strconv: correct `ztos` doc comment
          unix::signal: fix typo in docs
          cmd/haredoc: close read end of pipe after passing it to command
    
    Mykyta Holubakha (33):
          rt/+linux: added poll and timerfd_* syscalls
          timerfd_settime: add const
          rt: add nullability to timer_settime args
          rt: add missing POLL* constants
          rt: add sigset and implement sigsetops
          rt: add signalfd syscall
          rt: add sigprocmask syscall
          rt: implement sigaction for signal handling
          gen-stdlib: signals
          rt: implement socket syscall
          rt: connect, bind, listen and accept syscalls
          rt: add send(to), recv(from) syscalls
          rt: {get,set}sockopt syscalls
          rt: epoll syscalls
          rt: fix epoll_event layout for compat with kernel
          format::elf: add definitions for auxv/vDSO parsing
          linux: new module for linux-specific stuff
          linux: implement getting symbols from vDSO
          time::now: use vdso
          rt/socket: sockaddr_in6 definition fix
          net/ip: new module
          net::ip: add conversion to rt::sockaddr
          net/ip: added from_native function
          rt: added getsockname syscall
          rt: added getpeername syscall
          net: add a high-level TCP server & client API
          rt: add readv, writev, readmsg, sendmsg syscalls
          rt: add umask syscall
          rt: fix UNIX_PATH_MAX type
          net::unix: unix socket address type
          net: add high-level UNIX socket interface
          Build fixup
          rt: add functions to walk stack frames
    
    Nihal Jere (6):
          fs: fix typo
          crypto: fix typo in README
          datetime: remove obsolete todo
          datetime: fix week of the year calculation and add test
          datetime: implement %U format specifier and add a test
          time::chrono: treat presence of both utcnt and stdcnt as invalid
    
    Nikola (5):
          Handling hash collisions by comparing both hashes and idents
          Added regex::strerror
          sort::search now returns an index to the element instead of a pointer
          driver: make progress bar width fixed
          rt: Fix stack alignment in _start
    
    Nixon Enraght-Moony (2):
          Makefile: propagate HAREC and QBE variable
          time::chrono: Buffer read_leapsecfile
    
    Noah Altunian (2):
          errors: Fix misspelling in code comment
          haredoc: update man page wording to be more clear
    
    Noah Loomans (1):
          cmd/hare: fix not erroring on unsupported target
    
    Noah Pederson (2):
          include glob and regex in install-mods
          Add CLOEXEC, NONBLOCK flags to net::accept
    
    Noam Preil (3):
          cmd/hare: bell the terminal when build completes
          strings::template: fix typo in README
          strings::template: reject left braces
    
    Nolan Prescott (2):
          regex: require quantifier minimum in range
          regex: trailing hyphen not a range
    
    Patrick Widmer (1):
          encoding::json: fix infinite loop in iterator next
    
    Pedro Lucas Porcellis (1):
          strings: fix typo in the suffix doc
    
    Pierre Curto (11):
          math: add trailing_zeros_u*
          bytes: implement special cases for 2, 3 and 4 needle sizes in index
          strings: update riter and remove push
          net::ip: minor code updates
          net::dial: handle IPv6 address with port
          os::exec: fix pipe documentation
          unix: use buffered I/O
          sort::sorted: fix invalid results and add tests
          haredoc: make submodules reference relative
          hare/lex: handle threadlocal attribute on global declarations
          hare::parse: remove duplicate tokens when checking types
    
    Pinghao Wu (2):
          linux::timerfd: read: report read errors
          crypto::argon2: fix zeroing of h0
    
    Romain Reignier (1):
          strings::tokenize: fix example
    
    Scott Little (1):
          Display an error when lookup's mkdirs() fails
    
    Sebastian (676):
          xml: fix memory leak
          hex: fix memory leak
          unparse: add documentation for decl
          socket: add missing IPROTO_* constants
          unparse: more accurately format switch/match expressions
          ast: add number_constant type
          unparse: add parantheses when needed to show precedence
          mime: remove unused io import
          rt: rename sigval_t to sigval
          module: fix typo in README
          unparse: unparse documentation comments
          haredoc: lookup functions by @symbol
          dirs: add state functions
          strings: s/dup_all/dupall/g
          lex: add support for `raw strings`
          shlex: use `raw strings` in tests
          strings: add strcmp function
          fs: move strerror from util.ha to types.ha
          ascii: improve strcasecmp docs
          ascii: always check if strings are ASCII in strcmp funcs
          ascii: improve strcmp tests
          Minor fixes in copyright.sh
          rt: update malloc+debug.ha
          lex: add support for `raw strings`
          parse: use `raw strings` in tests
          strings: more optimal `replace` design
          strings: add additional tests for `replace`
          bytes: correct typo in README
          strings: add README
          strconv: add README
          strings: remove unused import
          Update README.md early development secrecy section
          sort: remove unused function declarations
          strconv: fix double-space typo in comment
          strconv: fix inaccurate doc comments
          crypto::random: fix typos
          all: remove trailing whitespace
          bytes: add security warning to equal function
          haredoc: add -a flag to manpage
          strings: improve `replace` docs
          ast: store both start and end location in decl
          ast: store location in enum_field
          haredoc: improve -Ftty syntax highlighting
          ast: add copy allocation form
          strings: clarify `join` ownership behavior
          haredoc: remove unnecessary error types
          haredoc: remove builtin type function
          ascii: wrap isgraph doc comment at 80 columns
          parse: rename expression to expr
          module: add docs for strerror
          lex: remove PLUSPLUS and MINUSMINUS tokens
          unparse, haredoc: linewrap long tagged/tuple types
          unparse: backslash-escaping in string/rune literals
          strings: add multireplace
          strings: rename iter_str to iterstr
          ast: update docs for (switch|match)_(case|expr)
          all: remove unnecessary imports
          path: improve PATHSEP doc comments
          all: fix typos and misc grammatical issues
          types: fix string data comment
          ip: style fix
          ast: improve fndecl_attrs documentation
          path: improve docs for dirname and basename
          Remove unnecessary void returns
          utf8: add README
          all: s/package/module/g
          parse: allow switch/match/compound within cast expr
          parse: permit trailing comma in switch case
          strings: add trimprefix and trimsuffix
          types: don't export BUCKETS
          lex: remove TODO in ncmp
          unit: remove fndecl_attrs
          rt+freebsd: implement strerror and errname
          path: fix basename behavior
          lex: handle try() failure in lex_unicode
          lex: use lex_unicode buffer with length 8 instead of 9
          parse: don't treat synassert msg as format string
          parse: remove unused nametype function
          all/README: don't surround module name in [[brackets]]
          rt: style
          ast: free docs in decl_free
          fmt: remove fmt:: prefix in README link
          hare::types: add more builtin types
          hare::types: add documentation for builtin types
          hare::types: add arch configuration for riscv64
          slice: add more void functions
          io: clarify documentation for writeitems
          io: fix parameters for writeitem and writeitems
          os: improve resolve documentation
          fs: improve resolve documentation
          haretype: flesh out program
          format::ini: add README
          endian: add README
          hare: add hare::types to README
          strings: remove c_empty
          Rename module slice to slices
          utf8sz: return void for invalid instead of SIZE_MAX
          strings: account for NUL-terminator in fromc capacity
          fnmatch: remove unnecessary cast
          lex: rename ltoks GREATER/GREATEREQ to GT/GTEQ
          parse: allow enums with rune storage
          Always keep type specifier on same line as declaration
          parse: assert that insert object is indexing expr
          strings: add byteindex
          lex, parse, unparse, haredoc: parse comments in structs, unions, and enums
          all: remove unnecessary module prefixes in docs
          sort: const `in` param and return value for search
          sort: add types.ha
          sort: improve documentation
          sort: add README
          sort: add bisect functions
          sort: add strings and sortstrings
          .builds/*.yml: switch to upstream qbe
          argon2: use alloc instead of rt::malloc
          unparse: print empty line between declarations
          fmt: abort bsprint if buffer is too small
          fmt: test bsprint
          bufio: make fixed write stream seekable
          slices, strings: add cap function
          lex: more efficient comment building
          format::xml: more informative error in xmltest
          format::xml: return line number of syntax error
          rt: account for NUL byte in from_c_unsafe capacity
          sort: add sorted and strings_sorted
          net::unix: s/null-terminated/NUL-terminated/g
          unparse: better type_test
          unparse: return correct size from struct_constant
          parse: test returned unparse size in roundtrip
          unparse: return correct size for tagged and tuple
          parse: add tests for tagged/tuple types
          unparse, haredoc: linewrap long function prototypes
          parse: test long function prototype
          install-mods: add datetime and log
          ascii: rename isascii to valid
          ascii: add validstr
          ascii: remove strcmp
          ascii: abort strcasecmp when non-ASCII encountered
          ascii: add more strcasecmp tests
          regex: remove ASCII charclass
          regex: remove WORD charclass
          gen-stdlib: add datetime dependency for log
          ast: fix outdated docs
          fmt: abort if too many parameters are given
          gen-stdlib: add io dependency for dirs
          ast: rename import_free to import_finish
          hare::types: add strerror
          hare::types: update builtin to match ast::builtin
          hare::parse: test long tuple type
          haredoc: show type-internal docs in HTML backend
          hare::parse: fix imports
          gen-stdlib: add missing dependencies for shlex
          hare::ast: rename subunit_free to subunit_finish
          hare::ast: rename decl_free to decl_finish
          hare::unit: rename unit_free to unit_finish
          unix::{hosts,resolvconf}: platform-specific file path
          hare::parse: accept EOF after return or yield
          ast, lex, parse, unparse: vaargs updates
          hare::parse: add more loc tests
          hare::parse: better error message for expr_testloc
          hare::ast: rename type_free to type_finish
          hare::ast: rename expr_free to expr_finish
          hare::ast: struct_constant_free -> struct_constant_finish
          regex: style
          time::chrono: platform-specific file paths
          crypto::random: add README
          cmd/hare: add release to help text
          haretype: use types::strerror
          time+linux: don't export VDSO constants
          gen-stdlib: remove duplicate dependency
          hare::module: fix typo in struct comment
          rt: fix C macro comment
          path: add ownership info to "string" docs
          haredoc: test parseident with keyword
          hare::types: type assert instead of cast
          hare::types: don't show implementation comments in haredoc
          hare::module: more efficient identpath
          fnmatch: style fixes
          encoding::base{32,64}: style
          hare::parse: grammatical fix for peek doc comment
          exec: proper error handling in lookup
          exec: fix documentation for pipe
          docs/hare.scd: add riscv64 to arch list
          docs/hare.scd: add haredoc to SEE ALSO
          docs/hare.scd: document hare version -v
          docs/hare.scd: fix typo
          docs/hare.scd: more accurate HARECACHE summary
          hare::module: document filetype
          cmd/hare: reword the help text for hare version -v
          base64: new_{decoder,encoder} -> new{decoder,encoder}
          Allow returning an error from io::closer
          all: don't use io::write when full write is required
          all: use io::readall when full read is required
          hare::ast: remove void from value
          shlex: return number of bytes written for quote
          hare::module: rename module_not_found to notfound
          path: use PATHSEP where applicable
          regex: remove regex:: prefix from links in README
          regex: capitalize Hare in README
          fmt: add fatalf
          log: add fatalf and lfatalf
          Change all strings::strcmp references to compare
          haredoc: use object allocation in sort_decls
          cmd/hare: make git_error an error type
          os, fs: fix resolve doc comment
          hare::ast: use label type for yield_expr label
          haredoc: free interior state of decls
          haredoc: free imports after parsing
          cmd/hare: tagged union style
          path: fix typo in dirname docs
          hare::ast: remove label from for_expr doc comment
          fs: rename dirent_free to dirent_finish
          io: fix typo in zero doc comment
          io: correct io::file docs
          strio: clarify dynamic and string docs
          hare::module: ignore unrecognized filetypes
          hare::module: use strings::freeall in scan
          getopt: migrate long doc comment to README
          haredoc: fix submodule list within submodules
          hare::module: superceeded -> superceded
          hare::module: style
          rt+linux: make cmsghdr arch-dependent
          io: add docs for io::off
          os: update stat docs to match fs::stat
          haretype: use implicit subtyping for stream
          hare::parse: remove unnecessary double cast
          log: add period in doc comment
          strings: style fix
          regex: pass by pointer
          Makefile: don't suppress output of rm in clean
          Makefile: add scripts as dependencies
          Makefile: add docs/html target
          rt+test: remove NUL from ztos string
          types: fix internal docs of string type
          encoding::json: add strerror
          slices: add static_* functions
          hare::lex: properly lex strings separated by comments
          strings: remove unicode module references
          rt+linux: make __ADDR_BND_PKEY_PAD arch-specific
          haredoc: handle module::error
          hare::lex+test: better error message
          hare::lex: use raw strings in string tests
          rt::{memcpy,memmove}: make src const
          cmd/hare: free defines and libs slices
          haredoc: move utility functions from html.ha to util.ha
          linux::keyctl: add strerror
          linux::keyctl: document error
          hare::parse: permit suffix on tuple access index
          hare::parse: allow static binding in for expression
          hare::module: rename parse_name to parsename
          hare::lex: fix nested tuple access lexing
          ascii: style
          encoding::json: drop bufstream
          encoding::json: fix number lexing
          encoding::json: export unlex
          encoding::json: return invalid on invalid escape
          encoding::json: disallow unescaped control char in string
          encoding::json: don't treat formfeed as whitespace
          encoding::json: fix doc comments
          encoding::json: use fnv::string instead of fnv::string64
          encoding::json: disallow trailing comma
          Makefile: add docs to .PHONY
          encoding::json: clarify set docs
          cmd/hare: use shlex to quote environ
          encoding::json: add extension info to README
          encoding::json: make del take in multiple keys
          encoding::json: allow setting nesting limit for load
          encoding::json: add equal function
          encoding::json: add dump and dumpstr
          encoding::json: add loadstr
          encoding::json: add reset function
          encoding::json: store location in invalid
          encoding::json: expand tests
          Handle negation in parse instead of lex
          cmd/harec: remove unused imports
          cmd/hare: free deleted tags in deltags
          math: use isclose in tests
          math: export more constants
          math: add hypotf64
          math: add atan2f64
          math::complex: initial commit
          encoding::utf8: use buffer of size 4
          Export BUCKETS constants
          Remove hare.sh
          Remove scripts/platform
          Makefile: don't use var in printf format str
          Makefile: make hare.ssa depend on scripts/version
          haredoc: highlight submodules bold in tty
          config.mk: add BINOUT
          Makefile: use $(HARECACHE) and $(BINOUT) in clean
          math: don't reference UINT_SIZE in doc comments
          math: remove isneginf and isposinf
          math::complex: add some c64 functions
          math::complex: add generic equal function
          math: style fixes
          os: ignore io::close error in fini_stdfd
          haredoc: add -T and -X flags
          net: add socket type
          net: replace net::shutdown with net::close
          log: fix README
          temp: remove unused import and update gen-stdlib
          docs/hare.scd: more user-friendly man page
          linux::keyctl: fix undefined reference
          rt: add STD*_FILENO constants
          hare release: use tuple unpacking
          hare::unit: use tuple unpacking
          hare::module: use tuple unpacking
          Parse labels in hare::parse instead of hare::lex
          Makefile: remove docs/html in clean
          hash::fnv: style: use ALL_CAPS for constants
          hash::fnv: make string arch-dependent
          gen-stdlib: update hash::fnv dependencies
          hare::lex: fix number lexing
          crypto: remove crypto:: prefix in doc comment
          hare::lex: disallow f suffix on non-base-10 literals
          encoding::utf8: move utf8sz to rune.ha
          encoding::utf8: don't recognize 5/6 octet sequences as valid
          bufio: return utf8::invalid in more cases
          scripts/gen-docs.sh: use $(BINOUT)/haredoc
          scripts/gen-docs.sh: quote $srcdir
          rt+linux: add memfd_create
          rt+linux: add splice
          rt+linux: add tee
          rt+linux: add alarm
          rt: add fallocate and posix_fallocate
          rt: fix lseek parameter type
          rt: add SEEK_* constants
          unix: make getuid, setuid, and groups platform specific
          rt+linux: add EWOULDBLOCK
          rt+freebsd: remove duplicates from strerror switch
          rt+linux: add ENOTSUP
          rt+linux: add EDEADLOCK
          io: use writeall in copy_fallback
          hare::lex: disallow leading zeros in number literal
          haredoc: resolve symbols in root namespace
          io: add note about infinite handles in drain docs
          hare::parse: add missing error propagation
          all: only type assert into direct members of tagged union
          driver: use terminal escape instead of carriage return
          rt: export jmpbuf, setjmp, and longjmp
          rt: fix mknodat syscall
          os: add link and symlink
          rt: use path type for more syscalls
          net::dial: remove harec bug workaround
          all: don't autofill fields without a default value
          bytes::contains: accept multiple needles
          regex+test: print to stderr and abort on error
          regex: make find and findall return [][]capture
          os::exec: update and fix doc comments
          path: update README
          math: add pop_count functions
          net::ip: remove rt dependency
          os: make stderr a handle instead of a file
          fmt: fix typo in abort message
          strings: return utf8::invalid from fromc on invalid UTF-8
          strconv: fix doc comment
          os::exec: update doc comment
          net::unix: fix imports
          os::exec: add lifetime info to exitstr docs
          gen-stdlib: update dependencies
          os::exec+freebsd: update pipe docs to match +linux
          haredoc: get default tags from `hare version`
          rt: use path type for more syscalls
          os::exec+linux: use signal name in exitstr
          haredoc: separate highlighting for functions, globals, and typedefs
          unix::signal: add code enum
          fs: re-use path buffer in rmdirall
          regex: add replace and rawreplace
          regex: find consecutive matches in findall
          os+linux: only call uname once
          hare::types: platform-specific hash calculation
          driver: handle invalid namespace identifier error
          contrib: remove copyright.sh
          contrib: add contributors.sh
          docs/stdlib.md: remove extlib protocols
          {bytes, strings}::tokenize: fix param name in docs
          os+freebsd: don't autofill fields without default value
          rt+linux: add sched_getaffinity and sched_setaffinity
          unix: fix pipe documentation
          time: add reference to `instant` documentation
          time: fix reference
          rt: make wait4 pointer params nullable
          unix::signal: fix typo
          unix::signal: add abort for unreachable switch case in signame
          os: add cpucount function
          unix::signal: add resetall
          hare::ast: add align expression
          unix::poll: add error type
          haredoc: remove -Fgemtext
          crypto/conventions.txt: recommend bytes::zero
          gen-stdlib: print correct $(AR) utility
          rt: add getrlimit and setrlimit
          unix::tty: rename pty.ha to pty_common.ha
          types::c: initial commit
          Move C string funcs from strings to types::c
          Remove char from language; add char to types::c
          hare::*: remove char
          types::c: fix typo
          unix: pluralize flag in type names
          rt+freebsd: add more signal functions and constants
          unix::signal: implement on FreeBSD
          Rewrite test runner
          fs: fix memory leak
          os::exec: fix peekany docs
          rt+libc: fix typo
          getopt: make switch in README exhaustive
          test: print abort_fixed failure location
          hare::*: permit C-style variadism with no named params
          strconv: give base type a default value
          net::unix: replace memcpy with slice assignment
          os: use libc exit when linking with libc
          os: move status type to separate file
          hare::ast: add error_assert_expr
          rt: implement shutdown
          net: implement shutdown
          types::c: add strings test
          math::random: add assertions that n != 0
          all: reorder tagged union fields to put error last
          os::exec: split kill into kill and sig
          ascii: allocate new string in strupper+strlower
          ascii: consistent capitalization in docs
          os::exec+freebsd: use unix::signal::signame
          rt: fix typo
          types::c: add limits
          net: remove slices dependency
          contributors.sh: read Co-authored-by
          contributors.sh: use git ls-tree instead of find
          unix::signal: replace signal type with sig enum
          types::c: add tostrn and tostrn_unsafe
          temp: require mode param for "file" and "named"
          regex: add replacen and rawreplacen
          types::c: add nulstr
          strconv: recognize - and + in stou*
          strconv: improve error messages
          strconv: remove zch variable
          strconv: append ".0" when float is representable as integer
          hare::unparse: add newline between imports and decls
          hare::unparse: add README
          math::complex: add README
          hare::ast: add README
          math::checked: initial commit
          hare::parse+test: add and use roundtrip_reparse
          hare::parse: improve struct/union/enum comments
          hare::parse: fix abort in name_list
          hare::parse: allow return and yield in more places
          Use cap builtin
          Remove slices:: and strings::cap
          hare::*: remove implicit const flag from functions
          hare::lex: add static assertion for bmap length
          Don't rely on loose pointer assignability semantics
          mime: fix compilation on +libc
          format::ini: fix and test error line numbering
          test: reset environment before first test is run
          Stop using unary +
          hare::*: remove unary +
          path: fix capitalization of docstring
          rt: remove syscallsarch+*.ha
          Remove unused imports
          Use opaque type
          hare::*: add opaque
          hare::types: remove builtin_null
          math::complex: re-enable test
          types::c: remove tables from README
          hare::*: add rconst
          hare::types: precompute builtin hashes
          Remove assignments from f64 to f32
          sort: stop using void array
          all: take advantage of loosened rune castability rules
          path: exclude nul terminator from PATH_MAX
          path: remove PATH prefix from constants
          crypto: s/SIZE/SZ/g in READMEs
          unix::signal+freebsd: add SIGIOT
          unix::signal+freebsd: s/POLL/IO/g
          types::c: add more static assert tests
          time::chrono: return statically-allocated slices
          rt: fix getmeta docs
          hare::lex: test \x, \u, and \U in strings
          Use never type
          hare::*: add never and remove @noreturn
          os::exec: remove free
          os::exec: don't allocate in unsetenv
          Remove some unnecessary casts
          strings: fix typo
          dirs: remove *fs functions
          rt: add RLIM_INFINITY
          crypto: remove comma after ... in prototypes
          hare::types: add VALIST to storage enum
          all: make switches exhaustive
          os::exec: add check for \0 in value
          rt+linux: use iconst for PR_* constants
          crypto::bigint: fix unresolved references
          io: remove unused strings import
          path: statically allocate result
          rt: print unknown errno number in strerror/errname
          rt: don't add 1 to PATH_MAX
          test: reset working directory after every test
          time::date: fix typo in docs
          math: remove non-u64 popcount variants
          hare::parse: add ident_test helper function
          hare::parse: measure ident length correctly
          hare::parse: improve location in ident length error msg
          getopt: remove unnecessary null check
          hare deps: remove always true condition
          hare::module: improve find error message
          unix::tty+freebsd: add noecho
          encoding::base*: use slice assignment instead of for-loop
          hare::unparse: fix reference in README
          all: use os::status in os::exit calls
          os: make cpucount return size
          bufio: rename old scan* functions to read_*
          bufio: update README
          fs, os: improve some docs
          rt: drop wrap_errno
          Remove unnecessary rt::errno->int casts
          rt+linux: use sa_family_t for AF_* constants
          sort::cmp: initial commit
          hare::parse: disallow comma after ... in prototype
          hare::parse: disallow comma after ... in array literal
          hare::parse: disallow comma after ... in struct literal
          hare::parse: disallow comma after ... in call expr
          all: don't use invalid UTF-8 in runes
          cmd/hare: improve some help text
          driver: add -F freestanding flag
          hare version: remove machine-readable output
          glob: use os:: fs wrappers
          glob: recognize escapes in last path component
          all: document when strerror statically allocates
          getopt: add strerror
          glob: add strerror
          time::chrono: use static buffer in strerror
          time::date: improve parsefail error message
          cmd/hare: only allow one ^ in -T
          hare.1: update and split up
          hare::unparse: overhaul with synfunc
          haredoc: refactor to use unparse::syn
          hare::unparse: unexport prototype function
          haredoc: don't exit early on emit error
          haredoc: don't emit escape sequences when NO_COLOR is set
          haredoc: distinguish between modules and decls better
          haredoc: check symbol of globals
          haredoc: allow path to be a file
          hare::*: update append/insert parsing
          hare::ast: remove default field from match_expr
          hare::parse: disallow empty expression lists
          hare::unparse: fix inexhaustive match
          hare::ast: remove indirect field from assign_expr
          hare::parse+test: add more assignment tests
          hare::parse+test: use errorfln instead of fatalf
          hare::parse: disallow binding/defer outside compound/for
          hare::parse+test: add more switch/match case tests
          hare::parse+test: test switch/match as unary operand
          hare::parse: use objsel for vaarg/vaend operand
          hare::unit: pass around pointers
          hare::unparse: use strings::tokenizer for comments
          hare::ast: pass around pointers
          crypto: clarify doc comment
          types::c: make schar and uchar not arch specific
          hare::*: implement local constant definitions
          Revert "time::date: move def to global scope"
          Makefile: add more quotes
          hare::parse: allow ident for all functions
          cmd::hare::build: unexport job
          fmt: fix reference in README
          io: use writeall for teestream
          bufio: document that scan result omits delimiter
          cmd/haredoc: fix help text
          hare::parse: statically allocate error msg
          fs: skip . and .. when iterating
          bufio: allow unreading more than scan.readout
          haredoc: remove -Fhare
          haredoc: show initializer functions for types
          haredoc: only show undocumented submodules with -a
          haredoc: print message when no decls are exported
          hare::*: support top-level static assertions
          hare::lex: use top-level static assertion
          haredoc: fix memory leak
          encoding::pem: restructure decoder
          sort: replace rt::memmove with slice assignment
          haredoc: fix HAREDOC_COLORS bugs
          hare::lex: take in scanner
          hare::parse: export ident_trailing
          all: add trailing :: to module references in docs
          hare::parse::doc: rewrite
          hare-doc(5): document trailing :: for modules
          scripts/genbootstrap: quote $BINOUT
          rt: deduplicate init and fini
          glob+test: use == for string equality checks
          hare::unparse: pass around pointers
          hare::ast: store ptrs in decl_func and decl_type
          hare::ast: s/fndecl_attrs/fndecl_attr/g
          encoding::utf8: add strerror
          strings::template: add invalid type
          shlex: add strerror
          driver: remove #875 workaround
          all: remove self-namespace from doc refs
          mime: simplify and improve load_systemdb
          os: remove finish
          cmd/parsechk: initial commit
          time::chrono: drop unused leapsecs parameter
          all: fix test failure memory leaks
          all: style fix
          test: disallow expectabort outside @test
          test: implement skip function
          crypto: use test::skip
          hare::*: remove unused import forms
          crypto::sha1: document BLOCKSZ
          rt: simplify frame-walking functions
          hare cache: exit after printing usage text
          encoding::utf8: operate exclusively on byte slices
          strings: drop pad functions
          strings: use static append where applicable
          strings: consistently use fromutf8_unsafe
          strings: take direction into account in iterstr
          strings: remove duplicate allocation in multireplace
          strings: simplify sub
          strings: improve docstrings
          strings: remove pre-allocation
          strings: simplify ltrim and rtrim
          bytes: simplify reverse
          bytes: replace if expressions with logical and
          bytes: improve tests style and add test
          cmd/hare: fix memory leaks
          test: hexdump non-printable ASCII
          wordexp: correctly handle string containing only whitespace
          math::complex: clarify isnan behavior
          Fix FreeBSD CI
          all: update labelled loop syntax
          hare::*: support for/switch/match labels
          hare::parse+test: add labelled compound test
          hare build: only overwrite executable files
          hare::ast: s/constant/literal/g
          hare::parse: disallow mixing @init, @fini, and @test
          ascii: add strlower_buf and strupper_buf
          cmd/*: fix memory leaks
          memio+test: use defer for closing streams
          docs/rfc-template: wrap at 72 columns
          path: mention fs::resolve in README
          hare::ast: remove inaccurate comment
          strings: test concat with only one argument
          strings: test join with only one variadic argument
          strings: test contains with no variadic arguments
          strings: use type assertion in iter tests
          hare::parse: improve assign expr error message
          rt+linux: fix some types
          os+openbsd: remove extra License: header
          docs: rename hare-doc(5) to haredoc(5)
          haredoc: error out when more than one arg supplied
          hare::parse::doc: add docs
          all: always use tabs for indentation
          getopt: improve docs
          hare build: fix order of flags
          haredoc: submodules newline fixes
          os+linux: s/Unix/Unix-like/
          os+linux: add mkfile
          hare deps: print more intuitive msg when no deps
          test: display special msg when no tests are run
          io: improve seek and whence docs
          cmd/haredoc: replace split with rtokenize
          os: add arch type and functions
          haretype: use system architecture
          cmd/{hare,haredoc}: Don't allocate tags
          cmd/{hare,haredoc}: remove unused imports
          time: change signature of *_to_timespec funcs
          regex: use types::SIZE_MAX instead of 9999999
          rt: add exported syscall function
          types::c: minor fix for unterminatedstr docs
          types::c: add nullptr_t to README
          types::c: add info about unsupported types to README
          strings: replace O(n^2) algorithm in rsplitn
          hare::module: add rationale for linear search
          os::exec: add reference to doc comment
          encoding::utf8: minor README fix
          time::date: fix weird formatting in doc comment
          time::date: add reference to doc comment
          unix: document ownership for unix::getgroups
          unix: add getpid
          unix: add getpid (fix makefiles)
    
    Sebastian LaVine (13):
          Provide more descriptive "not implemented" abort messages
          hare::ast: Add start, end fields to import
          Fix indentation
          Rename strings::try_fromutf8 to strings::fromutf8
          Add os::status
          regex: Document when the caller must free the return value
          io: make io::writeall take const []u8
          unix::tty: add noncanonical
          unix::tty: Add README
          strings: Further simplify sub
          encoding::utf8: Rename valid() to validate() and change return type
          fmt: Fix fmt::mods documentation
          strings: Simplify fromutf8
    
    Seedo Paul (1):
          gen-stdlib: fix missing dependencies
    
    Sertonix (6):
          hash: remove unused fmt dependency
          io: bounds check readv/writev
          memio: return io::EOF on 0 bytes read
          *: remove full module name usage
          scripts/genbootstrap: reset platformtags
          os: handle errors on file system iteration
    
    Simon Ser (2):
          dirs/xdg: ignore relative paths
          dirs/xdg: add runtime
    
    Stacy Harper (6):
          hare::ast: Make struct_type a struct on its own
          Add @packed to lexers/parsers
          Add @packed to haredoc
          Fix memory leak on os::diropen
          Add flock syscalls wrappers
          Add inotify syscalls wrappers
    
    Steven Guikal (6):
          stdlib: add math::random
          math::random: new module
          Update more references in READMEs
          sort: use binary insertion sort
          encoding::base64: new module
          encoding::base64: fixup documentation
    
    Sudipto Mallick (10):
          strconv: implement f64 to string conversion
          fs::rmdirall: relocate repetitive path::join calls
          strconv: implement string to floating-point number conversion
          hare::lex: fix exponent of floating-point literal
          types/limits.ha: fix typo in constants
          strconv: implement f32 to string conversion
          math/floats.ha: functions and constants related to floats
          strings: add ltrim, rtrim and trim
          strconv: implement Eisel-Lemire fast float parsing algorithm
          Match/switch syntax change in aarch64 specific files in rt/
    
    Thomas Bracht Laumann Jespersen (21):
          crypto: Add sha1
          crypto/math: Add rot{l,r}64
          minor: Fix typos in README.md
          crypto: Add sha512
          crypto: Add MD5
          fs: Change is_something functions to issomething
          crypto/curve25519: New module
          crypto: testing: use encoding::hex::encodestr()
          rt: Add socketpair() syscall (both linux and freebsd)
          net/unix: Add socketpair()
          bytes: Add hasprefix() and hassuffix()
          strings: Rename has_{prefix,suffix} -> has{prefix,suffix}
          rt/+freebsd: Rename start*.s files to include -libc
          io/stream: Fix syntax in comment
          crypto/math: Add constant-time byte slice comparison
          encoding/base64: Provide a decoder as an io::stream
          encoding/base64: Use error propagation in decodestream_reader()
          os/freebsd: Remove duplicate BUFSIZ declaration
          hare::parse: free lexer.comment to avoid duplication
          rt/+linux/syscalls: fix small typo
          encoding/base64: fix partial write bug
    
    Tilman Sauerbeck (2):
          hare/lex: Use buffered IO
          bufio/scanner: Decode all bytes in the input buffer
    
    Tim Culverhouse (1):
          bufio::scan_rune: properly read last 3 bytes
    
    Tobias Heider (1):
          OpenBSD: arm64 is called aarch64 in hare
    
    Tom Lebreux (13):
          bufio::dynamic: free resources on io::close
          hare::module: fix fd leak when walking directories
          net::uri: Fix missing fmt::printf arguments
          net::uri: surround ipv6 host with [ and ]
          net::uri: add ? before query element
          net::uri: fix missing // for file uri
          net::uri: add fmt tests
          fs: add missing cases to strerror
          net: add getflags
          net: add setname
          rt/+linux/socket: add sockaddr_nl
          bufio: allow borrowedread up to last byte
          linux::keyctl: Add chown and setperm
    
    Tom Regner (3):
          strings: splitn: don't add non existing tokens
          Fix memory leaks in time::chrono @init
          Fix crash when timezone is unspecified
    
    Umar Getagazov (13):
          fs::chmod: fix the permission mask
          unix: add umask wrapper for Linux
          fs, unix::umask: don't clear file mode bits
          haredoc: skip reserved directories and non-modules
          net::uri: fix documentation reference
          haredoc: use uri::parse for link detection
          haredoc: multi-line lists, references in lists
          contrib: fix copyright.sh
          haredoc: fix newline trimming
          all: various documentation fixes
          haredoc: fix extraneous newline after reference
          haredoc: fix lists parsed as text in decl docs
          haredoc: don't linkify <word> and comma
    
    Vincent Dagonneau (3):
          rt/linux: add {get,set}sid syscalls and a couple of tty related constants.
          linux/timerfd: interface for Linux's timerfd
          rt/+linux: add execve syscall
    
    Vlad-Stefan Harbuz (58):
          Add a variety of float functions to math/floats.ha
          Add math.ha and clean up floats.ha
          Add trig functions, uint functions and various other math functions
          Add strings::replace,padleft,padright,index_string
          fix missing case in absi() and signi()
          strings: add to_cbuf()
          add copyright.sh
          copyright.sh: add ability to ignore commits
          add regex
          fix typo s/nonexistant/nonexistent/
          add strptime()
          correct datetime::new() docstring
          update gen-stdlib
          comment out format tests
          add ISO8601 format constant
          add datetime comparison functions
          add print_period()
          add period_eq()
          add calc_n_days_in_month() and calc_n_days_in_year()
          add is_ymd_valid()
          add clone()
          add is_valid_ymd()
          fix bug in calc_yearday()
          add calc_epochal_from_yd()
          simplify clone()
          add calc_epochal_from_ywd()
          add long date format options e.g. {year}
          remove long format specifiers
          remove superfluous specifiers from format()
          remove superfluous specifiers from parse()
          remove formatting localization TODOs
          add arithmetic functions
          correct tests, use new chrono::UTC
          datetime: add copyright
          regex: rename regex_free to regex_finish and have it take pointer, fixes #625
          correct regex::find and ::findall docstrings
          regex: correct arguments in README
          regex: fix line length in README
          regex: add some printing to README example to make usage clearer
          regex: rename "matchgroup" to "capture"
          regex: correct [] usage
          regex: update free_*() functions
          regex: add test()
          regex: add test() example to README
          regex: remove now-unused imports
          regex: rename regex_finish to finish
          ioctlgen: update with regex_finish name change
          regex: find/findall/test can no longer error
          ioctlgen: update with regex error handling changes
          strings::contains: accept multiple needles. Fixes #570
          regex: release memory in tests
          regex: improve performance
          regex: fix subcapture content and add tests
          haredoc: break long names on narrow screens
          regex: fix typo
          regex: clarify returned result in README
          regex: add replace() to README
          regex: improve README examples
    
    Willow Barraco (2):
          rt: Add flock LOCK_NB (and fix LOCK_UN value)
          bufio/scanner: fix slice or array access out of bounds
    
    Yasumasa Tada (15):
          fnmatch: don't match brackets incorrectly
          strio: use io::writeall
          glob: new module
          glob: consistent style
          glob: support NOSORT
          glob: handle a leading period correctly
          glob: style
          glob: handle search failure
          glob: support GLOB_NOCHECK
          glob: support NOESCAPE
          glob: support MARK
          glob: handle errors explicitly
          glob: rename functions
          glob: handle patterns ending with slash
          glob: escape characters correctly
    
    grobe0ba (1):
          cmd/hare: accept build arguments from environment
    
    iamthenoname (2):
          time::chrono: fix memory leak in load_tzif()
          unix::passwd: improve getuid and getgid performance
    
    illiliti (14):
          make: fix build for bmake
          crypto::chacha20: add hchacha20
          os::exec: add cmdfile function
          hare/module: use buffered io
          rt: add missing SIG_* constants
          unix::signal: add reset and ignore functions
          net::udp: add reuseaddr/reuseport support
          crypto::salsa20: add hsalsa20
          rt+freebsd: add fstat, AT_EMPTY_PATH, S_IF*
          os::exec+freebsd: only open() regular files
          os::exec: fix TOCTOU
          rt+linux: add low-level io_uring constants and definitions
          rt+linux: change io_uring_setup params to accept io_uring_params
          rt+linux: add io_uring_enter2
    
    khac (1):
          Add math::random::f64rand
    
    lukechampine (2):
          crypto::ed25519: add package
          crypto::ed25519: fix bugs in point_decode
    
    minus (1):
          strings::template: Optimize escaped dollar sign
    
    the lemons (3):
          fmt::fatal - exit with 255
          path::extension: make the extension begin from the last dot rather than the first
          unix::tty: implement pty handling
    
  • 0.24.0
    hare 0.24.0
    
    This is the initial versioned pre-release of the Hare programming
    language.
  • 0.24.0-rc2
    hare 0.24.0-rc2
    
    This is the second release candidate of hare 0.24.0. The following
    patches have been added since -rc2:
    
    Bor Grošelj Simić (1):
          ascii: fix compare-by-subtraction in strcasecmp
  • 0.24.0-rc1
    hare 0.24.0-rc1
    
    This is the first release candidate for Hare 0.24.0.