~sircmpwn/hare

0.24.2 6 months ago .tar.gz browse log

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 6 months ago .tar.gz browse log

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 6 months ago .tar.gz browse log

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 11 months ago .tar.gz browse log

hare 0.24.0

This is the initial versioned pre-release of the Hare programming
language.

0.24.0-rc2 11 months ago .tar.gz browse log

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 11 months ago .tar.gz browse log

hare 0.24.0-rc1

This is the first release candidate for Hare 0.24.0.