Full Code of jqlang/jq for AI

master cec6b0f34603 cached
387 files
3.1 MB
830.2k tokens
1104 symbols
1 requests
Download .txt
Showing preview only (3,312K chars total). Download the full file or copy to clipboard to get everything.
Repository: jqlang/jq
Branch: master
Commit: cec6b0f34603
Files: 387
Total size: 3.1 MB

Directory structure:
gitextract_tfjw1qrz/

├── .gitattributes
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   └── bug_report.md
│   ├── dependabot.yml
│   └── workflows/
│       ├── ci.yml
│       ├── decnum.yml
│       ├── manpage.yml
│       ├── oniguruma.yml
│       ├── scanbuild.yml
│       ├── valgrind.yml
│       └── website.yml
├── .gitignore
├── .gitmodules
├── AUTHORS
├── COPYING
├── ChangeLog
├── Dockerfile
├── KEYS
├── Makefile.am
├── NEWS.md
├── README.md
├── SECURITY.md
├── compile-ios.sh
├── config/
│   ├── .gitignore
│   └── m4/
│       ├── .gitignore
│       ├── check-math-func.m4
│       ├── find-func-no-libs.m4
│       ├── find-func-no-libs2.m4
│       ├── find-func.m4
│       └── misc.m4
├── configure.ac
├── docs/
│   ├── Pipfile
│   ├── README.md
│   ├── build_manpage.py
│   ├── build_mantests.py
│   ├── build_website.py
│   ├── content/
│   │   ├── download/
│   │   │   └── default.yml
│   │   ├── index.yml
│   │   ├── manual/
│   │   │   ├── dev/
│   │   │   │   └── manual.yml
│   │   │   ├── v1.3/
│   │   │   │   └── manual.yml
│   │   │   ├── v1.4/
│   │   │   │   └── manual.yml
│   │   │   ├── v1.5/
│   │   │   │   └── manual.yml
│   │   │   ├── v1.6/
│   │   │   │   └── manual.yml
│   │   │   ├── v1.7/
│   │   │   │   └── manual.yml
│   │   │   └── v1.8/
│   │   │       └── manual.yml
│   │   └── tutorial/
│   │       └── default.yml
│   ├── manual_schema.yml
│   ├── public/
│   │   ├── .htaccess
│   │   ├── CNAME
│   │   ├── css/
│   │   │   └── style.css
│   │   ├── js/
│   │   │   └── manual-search.js
│   │   └── robots.txt
│   ├── templates/
│   │   ├── default.html.j2
│   │   ├── index.html.j2
│   │   ├── manual.html.j2
│   │   └── shared/
│   │       ├── _footer.html.j2
│   │       ├── _head.html.j2
│   │       └── _navbar.html.j2
│   └── validate_manual_schema.py
├── jq.1.prebuilt
├── jq.spec
├── libjq.pc.in
├── m4/
│   ├── ax_compare_version.m4
│   ├── ax_prog_bison_version.m4
│   └── ax_pthread.m4
├── scripts/
│   ├── crosscompile
│   ├── gen_utf8_tables.py
│   └── version
├── sig/
│   ├── jq-release-new.key
│   ├── jq-release-old.key
│   ├── v1.3/
│   │   ├── jq-linux-x86.asc
│   │   ├── jq-linux-x86_64.asc
│   │   ├── jq-osx-x86.asc
│   │   ├── jq-osx-x86_64.asc
│   │   ├── jq-win32.exe.asc
│   │   ├── jq-win64.exe.asc
│   │   └── sha256sum.txt
│   ├── v1.4/
│   │   ├── jq-linux-x86.asc
│   │   ├── jq-linux-x86_64.asc
│   │   ├── jq-osx-x86.asc
│   │   ├── jq-osx-x86_64.asc
│   │   ├── jq-solaris11-32.asc
│   │   ├── jq-solaris11-64.asc
│   │   ├── jq-win32.exe.asc
│   │   ├── jq-win64.exe.asc
│   │   └── sha256sum.txt
│   ├── v1.5/
│   │   ├── jq-linux32-no-oniguruma.asc
│   │   ├── jq-linux32.asc
│   │   ├── jq-linux64.asc
│   │   ├── jq-osx-amd64.asc
│   │   ├── jq-win32.exe.asc
│   │   ├── jq-win64.exe.asc
│   │   └── sha256sum.txt
│   ├── v1.5rc1/
│   │   ├── jq-linux-x86_64-static.asc
│   │   ├── jq-win32.exe.asc
│   │   ├── jq-win64.exe.asc
│   │   └── sha256sum.txt
│   ├── v1.5rc2/
│   │   ├── jq-linux-x86.asc
│   │   ├── jq-linux-x86_64.asc
│   │   ├── jq-osx-x86_64.asc
│   │   ├── jq-win32.exe.asc
│   │   ├── jq-win64.exe.asc
│   │   └── sha256sum.txt
│   ├── v1.6/
│   │   ├── jq-linux32.asc
│   │   ├── jq-linux64.asc
│   │   ├── jq-osx-amd64.asc
│   │   ├── jq-win32.exe.asc
│   │   ├── jq-win64.exe.asc
│   │   └── sha256sum.txt
│   ├── v1.7/
│   │   ├── jq-1.7.tar.gz.asc
│   │   ├── jq-1.7.zip.asc
│   │   ├── jq-linux-amd64.asc
│   │   ├── jq-linux-arm64.asc
│   │   ├── jq-linux-armel.asc
│   │   ├── jq-linux-armhf.asc
│   │   ├── jq-linux-i386.asc
│   │   ├── jq-linux-mips.asc
│   │   ├── jq-linux-mips64.asc
│   │   ├── jq-linux-mips64el.asc
│   │   ├── jq-linux-mips64r6.asc
│   │   ├── jq-linux-mips64r6el.asc
│   │   ├── jq-linux-mipsel.asc
│   │   ├── jq-linux-mipsr6.asc
│   │   ├── jq-linux-mipsr6el.asc
│   │   ├── jq-linux-powerpc.asc
│   │   ├── jq-linux-ppc64el.asc
│   │   ├── jq-linux-riscv64.asc
│   │   ├── jq-linux-s390x.asc
│   │   ├── jq-linux32.asc
│   │   ├── jq-linux64.asc
│   │   ├── jq-macos-amd64.asc
│   │   ├── jq-macos-arm64.asc
│   │   ├── jq-osx-amd64.asc
│   │   ├── jq-win32.exe.asc
│   │   ├── jq-win64.exe.asc
│   │   ├── jq-windows-amd64.exe.asc
│   │   ├── jq-windows-i386.exe.asc
│   │   └── sha256sum.txt
│   ├── v1.7.1/
│   │   ├── jq-1.7.1.tar.gz.asc
│   │   ├── jq-1.7.1.zip.asc
│   │   ├── jq-linux-amd64.asc
│   │   ├── jq-linux-arm64.asc
│   │   ├── jq-linux-armel.asc
│   │   ├── jq-linux-armhf.asc
│   │   ├── jq-linux-i386.asc
│   │   ├── jq-linux-mips.asc
│   │   ├── jq-linux-mips64.asc
│   │   ├── jq-linux-mips64el.asc
│   │   ├── jq-linux-mips64r6.asc
│   │   ├── jq-linux-mips64r6el.asc
│   │   ├── jq-linux-mipsel.asc
│   │   ├── jq-linux-mipsr6.asc
│   │   ├── jq-linux-mipsr6el.asc
│   │   ├── jq-linux-powerpc.asc
│   │   ├── jq-linux-ppc64el.asc
│   │   ├── jq-linux-riscv64.asc
│   │   ├── jq-linux-s390x.asc
│   │   ├── jq-linux64.asc
│   │   ├── jq-macos-amd64.asc
│   │   ├── jq-macos-arm64.asc
│   │   ├── jq-osx-amd64.asc
│   │   ├── jq-win64.exe.asc
│   │   ├── jq-windows-amd64.exe.asc
│   │   ├── jq-windows-i386.exe.asc
│   │   └── sha256sum.txt
│   ├── v1.7rc1/
│   │   ├── jq-1.7rc1.tar.gz.asc
│   │   ├── jq-1.7rc1.zip.asc
│   │   ├── jq-linux-amd64.asc
│   │   ├── jq-linux-arm64.asc
│   │   ├── jq-linux-armel.asc
│   │   ├── jq-linux-armhf.asc
│   │   ├── jq-linux-i386.asc
│   │   ├── jq-linux-mips.asc
│   │   ├── jq-linux-mips64.asc
│   │   ├── jq-linux-mips64el.asc
│   │   ├── jq-linux-mips64r6.asc
│   │   ├── jq-linux-mips64r6el.asc
│   │   ├── jq-linux-mipsel.asc
│   │   ├── jq-linux-mipsr6.asc
│   │   ├── jq-linux-mipsr6el.asc
│   │   ├── jq-linux-powerpc.asc
│   │   ├── jq-linux-ppc64el.asc
│   │   ├── jq-linux-riscv64.asc
│   │   ├── jq-linux-s390x.asc
│   │   ├── jq-macos-amd64.asc
│   │   ├── jq-macos-arm64.asc
│   │   ├── jq-windows-amd64.exe.asc
│   │   ├── jq-windows-i386.exe.asc
│   │   └── sha256sum.txt
│   ├── v1.7rc2/
│   │   ├── jq-1.7rc2.tar.gz.asc
│   │   ├── jq-1.7rc2.zip.asc
│   │   ├── jq-linux-amd64.asc
│   │   ├── jq-linux-arm64.asc
│   │   ├── jq-linux-armel.asc
│   │   ├── jq-linux-armhf.asc
│   │   ├── jq-linux-i386.asc
│   │   ├── jq-linux-mips.asc
│   │   ├── jq-linux-mips64.asc
│   │   ├── jq-linux-mips64el.asc
│   │   ├── jq-linux-mips64r6.asc
│   │   ├── jq-linux-mips64r6el.asc
│   │   ├── jq-linux-mipsel.asc
│   │   ├── jq-linux-mipsr6.asc
│   │   ├── jq-linux-mipsr6el.asc
│   │   ├── jq-linux-powerpc.asc
│   │   ├── jq-linux-ppc64el.asc
│   │   ├── jq-linux-riscv64.asc
│   │   ├── jq-linux-s390x.asc
│   │   ├── jq-macos-amd64.asc
│   │   ├── jq-macos-arm64.asc
│   │   ├── jq-windows-amd64.exe.asc
│   │   ├── jq-windows-i386.exe.asc
│   │   └── sha256sum.txt
│   ├── v1.8.0/
│   │   ├── jq-1.8.0.tar.gz.asc
│   │   ├── jq-1.8.0.zip.asc
│   │   ├── jq-linux-amd64.asc
│   │   ├── jq-linux-arm64.asc
│   │   ├── jq-linux-armel.asc
│   │   ├── jq-linux-armhf.asc
│   │   ├── jq-linux-i386.asc
│   │   ├── jq-linux-mips.asc
│   │   ├── jq-linux-mips64.asc
│   │   ├── jq-linux-mips64el.asc
│   │   ├── jq-linux-mips64r6.asc
│   │   ├── jq-linux-mips64r6el.asc
│   │   ├── jq-linux-mipsel.asc
│   │   ├── jq-linux-mipsr6.asc
│   │   ├── jq-linux-mipsr6el.asc
│   │   ├── jq-linux-powerpc.asc
│   │   ├── jq-linux-ppc64el.asc
│   │   ├── jq-linux-riscv64.asc
│   │   ├── jq-linux-s390x.asc
│   │   ├── jq-linux64.asc
│   │   ├── jq-macos-amd64.asc
│   │   ├── jq-macos-arm64.asc
│   │   ├── jq-osx-amd64.asc
│   │   ├── jq-win64.exe.asc
│   │   ├── jq-windows-amd64.exe.asc
│   │   ├── jq-windows-i386.exe.asc
│   │   └── sha256sum.txt
│   └── v1.8.1/
│       ├── jq-1.8.1.tar.gz.asc
│       ├── jq-1.8.1.zip.asc
│       ├── jq-linux-amd64.asc
│       ├── jq-linux-arm64.asc
│       ├── jq-linux-armel.asc
│       ├── jq-linux-armhf.asc
│       ├── jq-linux-i386.asc
│       ├── jq-linux-mips.asc
│       ├── jq-linux-mips64.asc
│       ├── jq-linux-mips64el.asc
│       ├── jq-linux-mips64r6.asc
│       ├── jq-linux-mips64r6el.asc
│       ├── jq-linux-mipsel.asc
│       ├── jq-linux-mipsr6.asc
│       ├── jq-linux-mipsr6el.asc
│       ├── jq-linux-powerpc.asc
│       ├── jq-linux-ppc64el.asc
│       ├── jq-linux-riscv64.asc
│       ├── jq-linux-s390x.asc
│       ├── jq-linux64.asc
│       ├── jq-macos-amd64.asc
│       ├── jq-macos-arm64.asc
│       ├── jq-osx-amd64.asc
│       ├── jq-win64.exe.asc
│       ├── jq-windows-amd64.exe.asc
│       ├── jq-windows-i386.exe.asc
│       └── sha256sum.txt
├── src/
│   ├── builtin.c
│   ├── builtin.h
│   ├── builtin.jq
│   ├── bytecode.c
│   ├── bytecode.h
│   ├── compile.c
│   ├── compile.h
│   ├── exec_stack.h
│   ├── execute.c
│   ├── inject_errors.c
│   ├── jq.h
│   ├── jq_parser.h
│   ├── jq_test.c
│   ├── jv.c
│   ├── jv.h
│   ├── jv_alloc.c
│   ├── jv_alloc.h
│   ├── jv_aux.c
│   ├── jv_dtoa.c
│   ├── jv_dtoa.h
│   ├── jv_dtoa_tsd.c
│   ├── jv_dtoa_tsd.h
│   ├── jv_file.c
│   ├── jv_parse.c
│   ├── jv_print.c
│   ├── jv_private.h
│   ├── jv_thread.h
│   ├── jv_unicode.c
│   ├── jv_unicode.h
│   ├── jv_utf8_tables.h
│   ├── lexer.c
│   ├── lexer.h
│   ├── lexer.l
│   ├── libm.h
│   ├── linker.c
│   ├── linker.h
│   ├── locfile.c
│   ├── locfile.h
│   ├── main.c
│   ├── opcode_list.h
│   ├── parser.c
│   ├── parser.h
│   ├── parser.y
│   ├── util.c
│   └── util.h
├── tests/
│   ├── base64.test
│   ├── base64test
│   ├── jq-f-test.sh
│   ├── jq.test
│   ├── jq_fuzz_compile.c
│   ├── jq_fuzz_execute.cpp
│   ├── jq_fuzz_fixed.cpp
│   ├── jq_fuzz_load_file.c
│   ├── jq_fuzz_parse.c
│   ├── jq_fuzz_parse_extended.c
│   ├── jq_fuzz_parse_stream.c
│   ├── jqtest
│   ├── local.supp
│   ├── man.test
│   ├── manonig.test
│   ├── manonigtest
│   ├── mantest
│   ├── modules/
│   │   ├── a.jq
│   │   ├── b/
│   │   │   └── b.jq
│   │   ├── c/
│   │   │   ├── c.jq
│   │   │   └── d.jq
│   │   ├── data.json
│   │   ├── home1/
│   │   │   └── .jq
│   │   ├── home2/
│   │   │   └── .jq/
│   │   │       └── g.jq
│   │   ├── shadow1.jq
│   │   ├── shadow2.jq
│   │   ├── syntaxerror/
│   │   │   └── syntaxerror.jq
│   │   ├── test_bind_order.jq
│   │   ├── test_bind_order0.jq
│   │   ├── test_bind_order1.jq
│   │   └── test_bind_order2.jq
│   ├── no-main-program.jq
│   ├── onig.supp
│   ├── onig.test
│   ├── onigtest
│   ├── optional.test
│   ├── optionaltest
│   ├── setup
│   ├── shtest
│   ├── torture/
│   │   └── input0.json
│   ├── uri.test
│   ├── uritest
│   ├── utf8test
│   └── yes-main-program.jq
└── vendor/
    └── decNumber/
        ├── ICU-license.html
        ├── decBasic.c
        ├── decCommon.c
        ├── decContext.c
        ├── decContext.h
        ├── decDPD.h
        ├── decDouble.c
        ├── decDouble.h
        ├── decNumber.c
        ├── decNumber.h
        ├── decNumberLocal.h
        ├── decPacked.c
        ├── decPacked.h
        ├── decQuad.c
        ├── decQuad.h
        ├── decSingle.c
        ├── decSingle.h
        ├── decimal128.c
        ├── decimal128.h
        ├── decimal32.c
        ├── decimal32.h
        ├── decimal64.c
        ├── decimal64.h
        ├── example1.c
        ├── example2.c
        ├── example3.c
        ├── example4.c
        ├── example5.c
        ├── example6.c
        ├── example7.c
        ├── example8.c
        └── readme.txt

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitattributes
================================================
.gitattributes export-ignore
.gitignore export-ignore
* text=auto eol=lf
vendor/** linguist-vendored

# generated files
src/lexer.[ch] linguist-generated=true
src/parser.[ch] linguist-generated=true
tests/man.test linguist-generated=true
tests/manonig.test linguist-generated=true
jq.1.prebuilt linguist-generated=true
docs/Pipfile.lock linguist-generated=true


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve

---

<!--
READ THIS FIRST!

If you have a usage question, please ask us on [Stack Overflow](https://stackoverflow.com/questions/tagged/jq), in the [#jq channel](https://web.libera.chat/#jq) on [Libera.Chat](https://libera.chat/), or in our [Discord server](https://discord.gg/yg6yjNmgAC).

-->

**Describe the bug**
A clear and concise description of what the bug is.

**To Reproduce**
Provide a minimal test case to reproduce the behavior.
If the input is large, either attach it as a file, or [create a gist](https://gist.github.com) and link to it here.

**Expected behavior**
A clear and concise description of what you expected to happen.

**Environment (please complete the following information):**

- OS and Version: [e.g. macOS, Windows, Linux (please specify distro)]
- jq version [e.g. 1.5]

**Additional context**
Add any other context about the problem here.


================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
  - package-ecosystem: "pip"
    directory: "docs/"
    schedule:
      interval: "monthly"
  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "weekly"
    groups:
      official-actions:
        patterns: ["actions/*"]
      docker-actions:
        patterns: ["docker/*"]


================================================
FILE: .github/workflows/ci.yml
================================================
name: CI
on:
  push:
    branches:
      - master
    tags:
      - "jq-*"
  pull_request:

jobs:
  linux:
    strategy:
      fail-fast: false
      matrix:
        arch:
          - amd64
          - arm64
          - armel
          - armhf
          - i386
          - mips
          - mips64
          - mips64el
          - mips64r6
          - mips64r6el
          - mipsel
          - mipsr6
          - mipsr6el
          - powerpc
          - ppc64el
          - riscv64
          - s390x
        include:
          - arch: amd64
            CC: x86_64-linux-gnu
          - arch: arm64
            CC: aarch64-linux-gnu
          - arch: armel
            CC: arm-linux-gnueabi
          - arch: armhf
            CC: arm-linux-gnueabihf
          - arch: i386
            CC: i686-linux-gnu
          - arch: mips
            CC: mips-linux-gnu
          - arch: mips64
            CC: mips64-linux-gnuabi64
          - arch: mips64el
            CC: mips64el-linux-gnuabi64
          - arch: mips64r6
            CC: mipsisa64r6-linux-gnuabi64
          - arch: mips64r6el
            CC: mipsisa64r6el-linux-gnuabi64
          - arch: mipsel
            CC: mipsel-linux-gnu
          - arch: mipsr6
            CC: mipsisa32r6-linux-gnu
          - arch: mipsr6el
            CC: mipsisa32r6el-linux-gnu
          - arch: powerpc
            CC: powerpc-linux-gnu
          - arch: ppc64el
            CC: powerpc64le-linux-gnu
          - arch: riscv64
            CC: riscv64-linux-gnu
          - arch: s390x
            CC: s390x-linux-gnu
    runs-on: ${{ matrix.arch == 'i386' && 'ubuntu-22.04' || 'ubuntu-24.04' }}
    env:
      AR: ${{ matrix.CC }}-ar
      CHOST: ${{ matrix.CC }}
      CC: ${{ matrix.CC }}-gcc
      CPP: ${{ matrix.CC }}-cpp
      LDFLAGS: -s
      SUFFIX: linux-${{ matrix.arch }}
    steps:
      - name: Clone repository
        uses: actions/checkout@v6
        with:
          submodules: true
      - name: Install packages
        run: |
          sudo apt-get update
          sudo apt-get install -y automake autoconf libtool crossbuild-essential-${{ matrix.arch }}
      - name: Build
        run: |
          autoreconf -i
          ./configure \
            --host=${{ matrix.CC }} \
            --disable-docs \
            --with-oniguruma=builtin \
            --enable-static \
            --enable-all-static \
            CFLAGS="-O2 -pthread -fstack-protector-all"
          make -j"$(nproc)"
          file ./jq
          cp ./jq jq-${{ env.SUFFIX }}
      - name: Test
        # Only run tests for amd64 matching the CI machine arch
        if: ${{ matrix.arch == 'amd64' }}
        run: |
          make check VERBOSE=yes
          git diff --exit-code
      - name: Upload Test Logs
        if: ${{ failure() }}
        uses: actions/upload-artifact@v7
        with:
          name: test-logs-${{ env.SUFFIX }}
          retention-days: 7
          path: |
            test-suite.log
            tests/*.log
      - name: Upload artifacts
        uses: actions/upload-artifact@v7
        with:
          name: jq-${{ env.SUFFIX }}
          path: jq-${{ env.SUFFIX }}
          if-no-files-found: error
          retention-days: 7

  macos:
    strategy:
      fail-fast: false
      matrix:
        arch:
          - amd64
          - arm64
        include:
          - arch: amd64
            target: x86_64-apple-darwin
          - arch: arm64
            target: arm64-apple-darwin
    runs-on: macos-14
    env:
      LDFLAGS: -dead_strip
      SUFFIX: macos-${{ matrix.arch }}
    steps:
      - name: Clone repository
        uses: actions/checkout@v6
        with:
          submodules: true
      - name: Install packages
        run: |
          # brew update sometimes fails with "Fetching /usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask failed!"
          brew update || brew update-reset
          brew install autoconf automake libtool
      - name: Set CC
        run: |
          echo "CC=clang -target ${{ matrix.target }}$(uname -r)" >> "$GITHUB_ENV"
      - name: Build
        run: |
          autoreconf -i
          ./configure \
            --host="${{ matrix.target }}$(uname -r)" \
            --disable-docs \
            --with-oniguruma=builtin \
            --disable-shared \
            --enable-static \
            --enable-all-static \
            CFLAGS="-O2 -pthread -fstack-protector-all"
          make -j"$(sysctl -n hw.logicalcpu)"
          strip ./jq
          file ./jq
          cp ./jq jq-${{ env.SUFFIX }}
      - name: Test
        run: |
          make check VERBOSE=yes
          git diff --exit-code
      - name: Upload Test Logs
        if: ${{ failure() }}
        uses: actions/upload-artifact@v7
        with:
          name: test-logs-${{ env.SUFFIX }}
          retention-days: 7
          path: |
            test-suite.log
            tests/*.log
      - name: Upload artifacts
        uses: actions/upload-artifact@v7
        with:
          name: jq-${{ env.SUFFIX }}
          path: jq-${{ env.SUFFIX }}
          if-no-files-found: error
          retention-days: 7

  windows:
    strategy:
      fail-fast: false
      matrix:
        arch:
          - amd64
          - i386
          - arm64
        include:
          - arch: amd64
            msystem: UCRT64
            os: windows-2022
          - arch: i386
            msystem: MINGW32
            os: windows-2022
          - arch: arm64
            msystem: CLANGARM64
            os: windows-11-arm
    runs-on: ${{ matrix.os }}
    env:
      LDFLAGS: -s
      SUFFIX: windows-${{ matrix.arch }}
    defaults:
      run:
        shell: msys2 {0}
    steps:
      - name: Prepare git config
        run: git config --system core.autocrlf false
        shell: bash
      - name: Clone repository
        uses: actions/checkout@v6
        with:
          submodules: true
      - uses: msys2/setup-msys2@v2
        with:
          update: true
          msystem: ${{ matrix.msystem }}
          install: >-
            base-devel
            git
            autoconf
            automake
            libtool
          pacboy: >-
            toolchain:p
      - name: Build
        run: |
          autoreconf -i
          ./configure \
            --disable-docs \
            --with-oniguruma=builtin \
            --disable-shared \
            --enable-static \
            --enable-all-static \
            CFLAGS="-O2 -pthread -fstack-protector-all -Wl,--stack,8388608"
          make -j$(nproc)
          file ./jq.exe
          cp ./jq.exe jq-${{ env.SUFFIX }}.exe
      - name: Test
        run: |
          make check VERBOSE=yes
          git diff --exit-code
      - name: Upload Test Logs
        if: ${{ failure() }}
        uses: actions/upload-artifact@v7
        with:
          name: test-logs-${{ env.SUFFIX }}
          retention-days: 7
          path: |
            test-suite.log
            tests/*.log
      - name: Upload artifacts
        uses: actions/upload-artifact@v7
        with:
          name: jq-${{ env.SUFFIX }}
          path: jq-${{ env.SUFFIX }}.exe
          if-no-files-found: error
          retention-days: 7

  dist:
    runs-on: ubuntu-latest
    steps:
      - name: Clone repository
        uses: actions/checkout@v6
        with:
          submodules: true
      - name: Install packages
        run: |
          sudo apt-get update -qq
          sudo apt-get install -y automake autoconf
      - name: Create dist
        run: |
          autoreconf -i
          ./configure \
            --disable-docs \
            --with-oniguruma=builtin
          make distcheck
          make dist dist-zip
          git diff --exit-code
      - name: Upload artifacts
        uses: actions/upload-artifact@v7
        with:
          name: jq-dist
          if-no-files-found: error
          retention-days: 7
          path: |
            jq-*.tar.gz
            jq-*.zip

  docker:
    runs-on: ubuntu-latest
    permissions:
      id-token: write
      contents: read
      attestations: write
      packages: write
    needs: linux
    steps:
      - name: Clone repository
        uses: actions/checkout@v6
      - name: Download executables
        uses: actions/download-artifact@v8
        with:
          pattern: jq-linux-*
          merge-multiple: true
      - name: Move executables
        run: |
          mkdir -p linux/{386,amd64,arm64,arm/v7,mips64le,ppc64le,riscv64,s390x}
          chmod +x jq-linux-*
          mv jq-linux-i386 linux/386/jq
          mv jq-linux-amd64 linux/amd64/jq
          mv jq-linux-arm64 linux/arm64/jq
          mv jq-linux-armhf linux/arm/v7/jq
          mv jq-linux-mips64el linux/mips64le/jq
          mv jq-linux-ppc64el linux/ppc64le/jq
          mv jq-linux-riscv64 linux/riscv64/jq
          mv jq-linux-s390x linux/s390x/jq
      - name: Create Dockerfile
        run: |
          cat <<'EOF' >Dockerfile
          FROM scratch
          ARG TARGETPLATFORM
          COPY AUTHORS COPYING $TARGETPLATFORM/jq /
          RUN ["/jq", "--version"]
          ENTRYPOINT ["/jq"]
          EOF
      - name: Docker metadata
        uses: docker/metadata-action@v6
        id: metadata
        with:
          images: ghcr.io/${{ github.repository }}
          tags: >
            ${{ startsWith(github.ref, 'refs/tags/jq-')
            && format('type=match,pattern=jq-(.*),group=1,value={0}', github.ref_name)
            || 'type=sha,format=long' }}
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v4
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v4
      - name: Login to GitHub Container Registry
        uses: docker/login-action@v4
        with:
          registry: ghcr.io
          username: ${{ github.repository_owner }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - name: Build and release Docker image
        uses: docker/build-push-action@v7
        id: build-push
        with:
          context: .
          push: ${{ startsWith(github.ref, 'refs/tags/jq-') }}
          provenance: false
          platforms: linux/386,linux/amd64,linux/arm64,linux/arm/v7,linux/mips64le,linux/ppc64le,linux/riscv64,linux/s390x
          tags: ${{ steps.metadata.outputs.tags }}
          labels: ${{ steps.metadata.outputs.labels }}
      - name: Generate signed attestations
        if: startsWith(github.ref, 'refs/tags/jq-')
        uses: actions/attest@v4
        with:
          subject-name: ghcr.io/${{ github.repository }}
          subject-digest: ${{ steps.build-push.outputs.digest }}
          push-to-registry: true

  release:
    runs-on: ubuntu-latest
    permissions:
      contents: write
      id-token: write
      attestations: write
      pull-requests: write
    environment: release
    needs: [linux, macos, windows, dist, docker]
    if: startsWith(github.ref, 'refs/tags/jq-')
    steps:
      - name: Clone repository
        uses: actions/checkout@v6
      - name: Download artifacts
        uses: actions/download-artifact@v8
        with:
          pattern: jq-*
          merge-multiple: true
      - name: Upload release
        env:
          TAG_NAME: ${{ github.ref_name }}
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          cp jq-linux-amd64 jq-linux64
          cp jq-macos-amd64 jq-osx-amd64
          cp jq-windows-amd64.exe jq-win64.exe
          sha256sum jq-* > sha256sum.txt
          gh release create "$TAG_NAME" --draft --title "jq ${TAG_NAME#jq-}" --generate-notes
          gh release upload "$TAG_NAME" --clobber jq-* sha256sum.txt
      - name: Generate signed attestations
        uses: actions/attest@v4
        with:
          subject-path: jq-*
      - name: Import GPG key
        uses: crazy-max/ghaction-import-gpg@v7
        with:
          gpg_private_key: ${{ secrets.JQ_RELEASE_GPG_PRIVATE_KEY }}
          passphrase: ${{ secrets.JQ_RELEASE_GPG_PASSPHRASE }}
      - name: Update signatures
        env:
          TAG_NAME: ${{ github.ref_name }}
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          sig_dir="sig/v${TAG_NAME#jq-}"
          mkdir -p "$sig_dir"
          mv sha256sum.txt "$sig_dir"
          for file in jq-*; do
            gpg --detach-sign --armor --batch --output "${sig_dir}/${file#*/}.asc" "$file"
          done
          git add sig
          git config user.name 'github-actions[bot]'
          git config user.email 'github-actions[bot]@users.noreply.github.com'
          title="Update signatures of ${TAG_NAME#jq-}"
          git commit -m "$title"
          branch="update-signatures-${TAG_NAME#jq-}"
          git push origin "HEAD:refs/heads/$branch"
          gh pr create --title "$title" --body "" --head "$branch"


================================================
FILE: .github/workflows/decnum.yml
================================================
name: decnum
on:
  push:
    branches:
      - master
  pull_request:

jobs:
  disabled:
    runs-on: ubuntu-24.04
    steps:
      - name: Clone repository
        uses: actions/checkout@v6
        with:
          submodules: true
      - name: Install packages
        run: |
          sudo apt-get update
          sudo apt-get install -y automake autoconf libtool
      - name: Build
        run: |
          autoreconf -i
          ./configure \
            --disable-docs \
            --disable-maintainer-mode \
            --disable-decnum
          make -j"$(nproc)"
          file ./jq
      - name: Test
        run: |
          diff <(echo 100000000000000000000 | ./jq) <(echo 1e+20)
          make check VERBOSE=yes
          git diff --exit-code
      - name: Upload Test Logs
        if: ${{ failure() }}
        uses: actions/upload-artifact@v7
        with:
          name: test-logs-decnum-disabled
          retention-days: 7
          path: |
            test-suite.log
            tests/*.log


================================================
FILE: .github/workflows/manpage.yml
================================================
name: Building man page, man.test, manonig.test
on:
  push:
    paths:
      - '.github/workflows/manpage.yml'
      - 'docs/**'
      - 'tests/man.test'
      - 'tests/manonig.test'
      - 'jq.1.prebuilt'
  pull_request:
    paths:
      - '.github/workflows/manpage.yml'
      - 'docs/**'
      - 'tests/man.test'
      - 'tests/manonig.test'
      - 'jq.1.prebuilt'

jobs:
  manpages:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v6
      - name: Setup Python
        uses: actions/setup-python@v6
        with:
          python-version: '3.11'
          cache: pipenv
      - name: Install pipenv
        run: pip install pipenv
      - name: Install dependencies
        run: pipenv sync
        working-directory: docs
      - name: Validate manual schema
        run: pipenv run python3 validate_manual_schema.py content/manual/**/*.yml
        working-directory: docs
      - name: Configure
        run: |
          autoreconf -i
          ./configure --enable-docs
      - name: Build man page, man.test, manonig.test
        run: |
          mv jq.1.prebuilt jq.1.old
          rm -f tests/man.test manonig.test
          make jq.1.prebuilt tests/man.test tests/manonig.test
      - name: Make sure that jq.1.prebuilt, man.test, manonig.test are up to date
        run: |
          git diff --exit-code tests/man.test tests/manonig.test
          # skip build date in jq.1.prebuilt
          test -s jq.1.prebuilt
          diff -- <(tail -n +3 jq.1.old) <(tail -n +3 jq.1.prebuilt)


================================================
FILE: .github/workflows/oniguruma.yml
================================================
name: oniguruma
on:
  push:
    branches:
      - master
  pull_request:

# Since builtin oniguruma is tested in the CI workflow,
# we test other options for --with-oniguruma here.
jobs:
  installed:
    runs-on: ubuntu-24.04
    steps:
      - name: Clone repository
        uses: actions/checkout@v6
      - name: Install packages
        run: |
          sudo apt-get update
          sudo apt-get install -y automake autoconf libtool valgrind libonig-dev
      - name: Build
        run: |
          autoreconf -i
          ./configure \
            --disable-docs \
            --enable-valgrind \
            --with-oniguruma=yes
          make -j"$(nproc)"
          file ./jq
      - name: Test
        run: |
          ./jq -n '"" | test("")'
          make check VERBOSE=yes
          git diff --exit-code
      - name: Upload Test Logs
        if: ${{ failure() }}
        uses: actions/upload-artifact@v7
        with:
          name: test-logs-oniguruma-installed
          retention-days: 7
          path: |
            test-suite.log
            tests/*.log

  disabled:
    runs-on: ubuntu-24.04
    steps:
      - name: Clone repository
        uses: actions/checkout@v6
      - name: Install packages
        run: |
          sudo apt-get update
          sudo apt-get install -y automake autoconf libtool valgrind
      - name: Build
        run: |
          autoreconf -i
          ./configure \
            --disable-docs \
            --enable-valgrind \
            --with-oniguruma=no
          make -j"$(nproc)"
          file ./jq
      - name: Test
        run: |
          ! ./jq -n '"" | test("")'
          make check VERBOSE=yes
          git diff --exit-code
      - name: Upload Test Logs
        if: ${{ failure() }}
        uses: actions/upload-artifact@v7
        with:
          name: test-logs-oniguruma-disabled
          retention-days: 7
          path: |
            test-suite.log
            tests/*.log


================================================
FILE: .github/workflows/scanbuild.yml
================================================
name: Clang scan-build Static Analyzer Build

on:
  push:
    branches:
      - master

jobs:
  scan-build:
    runs-on: ubuntu-latest
    steps:
      - name: Clone repository
        uses: actions/checkout@v6
        with:
          submodules: true
      - name: Install packages
        run: |
          sudo apt-get update -qq
          sudo apt-get install -y automake autoconf gdb valgrind clang clang-tools
          echo "CC=clang" >> "$GITHUB_ENV"
      - name: Build
        run: |
          autoreconf -i
          ./configure --enable-valgrind CFLAGS="-g -O0"
          scan-build --keep-going --exclude vendor/ make -j"$(nproc)"
      - name: Test
        run: |
          ulimit -c unlimited
          scan-build --keep-going --exclude vendor/ make -j"$(nproc)" check
      - name: Core dump stacks
        run: |
          if [[ -f core ]]; then
            gdb -batch -ex "thread apply all bt" \
              "$(file core | sed "s/^[^']*'//; s/[ '].*$//")" core
            exit 1
          fi
      - name: Test logs
        if: ${{ failure() }}
        run: |
          cat test-suite.log tests/*.log
      - name: Upload Logs
        uses: actions/upload-artifact@v7
        with:
          name: Scan-Build Reports
          path: /tmp/scan-build*
          if-no-files-found: ignore
          retention-days: 7


================================================
FILE: .github/workflows/valgrind.yml
================================================
name: valgrind
on:
  push:
    branches:
      - master
  pull_request:

jobs:
  linux:
    runs-on: ubuntu-24.04
    steps:
      - name: Clone repository
        uses: actions/checkout@v6
        with:
          submodules: true
      - name: Install packages
        run: |
          sudo apt-get update
          sudo apt-get install -y automake autoconf libtool valgrind
      - name: Build
        run: |
          autoreconf -i
          ./configure \
            --disable-docs \
            --enable-valgrind \
            --with-oniguruma=builtin
          make -j"$(nproc)"
          file ./jq
      - name: Test
        run: |
          make check VERBOSE=yes
          git diff --exit-code
      - name: Upload Test Logs
        if: ${{ failure() }}
        uses: actions/upload-artifact@v7
        with:
          name: test-logs-valgrind-linux
          retention-days: 7
          path: |
            test-suite.log
            tests/*.log


================================================
FILE: .github/workflows/website.yml
================================================
name: Update website
on:
  push:
    branches:
      - master
    paths:
      - 'docs/**'
concurrency: website

jobs:
  build:
    runs-on: ubuntu-latest
    defaults:
      run:
        working-directory: docs
    steps:
      - name: Checkout code
        uses: actions/checkout@v6
      - name: Setup Python
        uses: actions/setup-python@v6
        with:
          python-version: '3.11'
          cache: pipenv
      - name: Install pipenv
        run: pip install pipenv
      - name: Install dependencies
        run: pipenv sync
      - name: Build website
        run: pipenv run python3 build_website.py
      - name: Upload pages artifact
        uses: actions/upload-pages-artifact@v4
        with:
          path: docs/output/

  deploy:
    needs: build
    permissions:
      pages: write
      id-token: write
    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}
    runs-on: ubuntu-latest
    steps:
      - name: Deploy to GitHub Pages
        uses: actions/deploy-pages@v4
        id: deployment


================================================
FILE: .gitignore
================================================
*.o
*.a
*.lo
*.la
*.lai
*.so
*.so.*
*.gcda
*.gcno
*.gcov
*~
.*.sw[a-p]
tags

jq
!tests/modules/lib/jq/
jq.1

# Generated source
src/builtin.inc
src/config_opts.inc
*.pc

# Autotools junk
.libs
.deps
.dirstamp
libtool
*.log
stamp-h1
config.log
config.status
autom4te.cache
confdefs.h
conftest*
INSTALL
Makefile
jq-*.tar.gz
jq-*.zip
configure
aclocal.m4
Makefile.in
version.h
.remake-version-h
config.cache
*.rpm
m4/libtool.m4
m4/ltoptions.m4
m4/ltsugar.m4
m4/ltversion.m4
m4/lt~obsolete.m4
tests/*.trs

# Docs output
docs/output

cscope.in.out
cscope.out
cscope.po.out
jq.dSYM


================================================
FILE: .gitmodules
================================================
[submodule "vendor/oniguruma"]
	path = vendor/oniguruma
	url = https://github.com/kkos/oniguruma.git


================================================
FILE: AUTHORS
================================================
Created By:
Stephen Dolan        <mu@netsoc.tcd.ie>

Maintained by:
David Tolnay         <dtolnay@gmail.com>
Emanuele Torre       <torreemanuele6@gmail.com>
Leonid S. Usov       <leonid@practi.net>
Mattias Wadman       <mattias.wadman@gmail.com>
Muh Muhten           <muh.muhten@gmail.com>
Nicolas Williams     <nico@cryptonector.com>
Owen Ou              <o@owenou.com>
William Langford     <wlangfor@gmail.com>
itchyny              <itchyny@cybozu.co.jp>
pkoppstein           <pkoppstein@gmail.com>

Contributions by:
13ren                <melbourne.research@gmail.com>
AJ Jordan            <alex@strugee.net>
Aaron Peschel        <apeschel@zendesk.com>
Adam Lindberg        <hello@alind.io>
Alanscut             <wp_scut@163.com>
Aleksey Tsalolikhin  <atsalolikhin@spokeo.com>
Alex Chamberlain     <alex@alexchamberlain.co.uk>
Alex Jurkiewicz      <alex@jurkiewi.cz>
Alex Ozdemir         <aozdemir@hmc.edu>
Alex Wilson          <gpg@probablyfine.co.uk>
Alexandre Jasmin     <ajasmin@transtex-llc.com>
Allan Clark          <allanc@chickenandporn.com>
Andreas Heiduk       <asheiduk@users.noreply.github.com>
Andrew O'Brien       <obrien.andrew@gmail.com>
Andrew Rodland       <andrew@cleverdomain.org>
Andrew Speed         <andrew.cspeed@gmail.com>
Andy Lester          <andy@petdance.com>
Ankur                <ankz.kothari@gmail.com>
Anthony Shortland    <anthony@dtosolutions.com>
Anthony Sottile      <asottile@umich.edu>
Assaf Gordon         <assafgordon@gmail.com>
Attila Fülöp         <attila@fueloep.org>
Benjamin Wuethrich   <benjamin@koho.ca>
Benoit de Chezelles  <bew@users.noreply.github.com>
Bernard Niset        <bernard.niset@gmail.com>
Bhargava Mummadireddy <kishoreinvits@gmail.com>
Binbin Qian          <qianbinbin@hotmail.com>
Bradley Skaggs       <bskaggs@acm.org>
Brahm Lower          <bplower@gmail.com>
Brendan Macmillan    <melbourne.research@gmail.com>
Cameron Sparr        <cameronsparr@gmail.com>
Chance Zibolski      <czibolsk@redhat.com>
Charles Merriam      <charles.merriam@gmail.com>
Chris LaRose         <cjlarose@gmail.com>
Chris Moore          <dooglus@gmail.com>
Christoph Anton Mitterer <calestyo@scientia.org>
Christopher Degawa   <ccom@randomderp.com>
Ciaran McNamara      <1372986+ciaranmcnamara@users.noreply.github.com>
Clément MATHIEU      <clement@unportant.info>
Colin Leroy-Mira     <colin@colino.net>
Colin von Heuring    <colin@janrain.com>
Dag-Erling Smørgrav  <des@des.no>
Damian Gryski        <damian@gryski.com>
Dan Church           <h3xx@users.noreply.github.com>
Daniel Lange         <DLange@git.local>
David Biesack        <David.Biesack@apiture.com>
David Fetter         <david@fetter.org>
David Haguenauer     <ml@kurokatta.org>
David Korczynski     <david@adalogics.com>
David R. MacIver     <david@drmaciver.com>
DavidKorczynski      <david@adalogics.com>
Dawid Ferenczy Rogožan <ferenczy@users.noreply.github.com>
Derrick Pallas       <derrick@pallas.us>
Doug Luce            <doug@github.con.com>
Eiichi Sato          <sato.eiichi@gmail.com>
Eli Schwartz         <eschwartz@archlinux.org>
Eloy Coto            <eloy.coto@gmail.com>
Eric Bréchemier      <eric@egull.co>
Erik Brinkman        <erik.brinkman@gmail.com>
Eugen                <EugenGez@gmail.com>
Evan Zacks           <zackse@gmail.com>
Fabian Dellwing      <fabian.dellwing@mbconnectline.de>
Felix Wolfsteller    <felix.wolfsteller@gmail.com>
Filippo Giunchedi    <fgiunchedi@gmail.com>
Filippo Valsorda     <filippo.valsorda@gmail.com>
Florian Weimer       <fweimer@redhat.com>
Frederic Cambus      <fcambus@users.sourceforge.net>
Gabriel Marin        <gbrlmarn@gmail.com>
Gaelan Steele        <gbs@canishe.com>
George Hopkins       <george-hopkins@null.net>
Gert Van Gool        <gertvangool@gmail.com>
Gijs Kunze           <gwkunze@gmail.com>
Gustav               <gustav@invoke.se>
HE, Tao              <sighingnow@gmail.com>
Han Jiang            <jhcarl0814@gmail.com>
Hanfei Shen          <qqshfox@gmail.com>
Hanson Char          <hanson.char@gmail.com>
Haochen Xie          <haochenx@acm.org>
Helmut K. C. Tessarek <tessarek@evermeet.cx>
Henré Botha          <henrebotha@gmail.com>
Ian Miell            <ian.miell@gmail.com>
Ikko Ashimine        <eltociear@gmail.com>
J Phani Mahesh       <github@phanimahesh.me>
J. B. Rainsberger    <me@jbrains.ca>
Jack Pearkes         <jackpearkes@gmail.com>
Jakub Jirutka        <jakub@jirutka.cz>
Jakub Wilk           <jwilk@jwilk.net>
James Andariese      <james.andariese@locationlabs.com>
James Pearson Hughes <xiong.chiamiov@gmail.com>
Jan Schulz           <jasc@gmx.net>
Janne Cederberg      <janne.cederberg@gmail.com>
Jason Hood           <jadoxa@yahoo.com.au>
Jay Satiro           <raysatiro@yahoo.com>
Jesper Rønn-Jensen   <jesperrr@gmail.com>
Jingwen Owen Ou      <jingweno@gmail.com>
Joe Littlejohn       <joe.littlejohn@nokia.com>
Joel Nothman         <joel.nothman@gmail.com>
Joel Purra           <code+github@joelpurra.com>
Jonathan Chan Kwan Yin <sofe2038@gmail.com>
Jonathan Word        <argoday@argoday.com>
Josh Soref           <2119212+jsoref@users.noreply.github.com>
Juan Guerrero        <juan.guerrero.lozano@gmail.com>
Kamontat Chantrachirathumrong <14089557+kamontat@users.noreply.github.com>
Kenny Shen           <kenny.shen@zalora.com>
Kim De Mey           <kim.demey@gmail.com>
Kim Toms             <kim.toms@bplglobal.net>
Kirk McKelvey        <kirkoman@gmail.com>
Klemens Nanni        <kn@openbsd.org>
LCD 47               <lcd047@gmail.com>
Larry Aasen          <larryaasen@gmail.com>
Lee Thompson         <stagr.lee@gmail.com>
Loamhoof             <soeren.medard@gmail.com>
Lucas Trzesniewski   <lucas.trzesniewski@gmail.com>
Lukas Lansky         <lukas.lansky@suse.com>
MCApollo             <34170230+MCApollo@users.noreply.github.com>
Marc Abramowitz      <marc@marc-abramowitz.com>
Marc Bruggmann       <marcbr@spotify.com>
Marcin Kłopotek      <marcin.klopotek@gmail.com>
Marcin Serwin        <marcin@serwin.dev>
Mark Feit            <mfeit@internet2.edu>
Mark McKinstry       <mmckinst@umich.edu>
Markus Lanthaler     <mark_lanthaler@gmx.net>
Matt Clegg           <m@cle.gg>
Matt Meyers          <matt@mattmeyers.dev>
Matti Åstrand        <mattiastr@gmail.com>
Mattias Hansson      <hansson.mattias@gmail.com>
Maxime Biais         <maxime.biais@gmail.com>
Maximilian Roos      <5635139+max-sixty@users.noreply.github.com>
Michael Daines       <michael@mdaines.com>
Michael Färber       <01mf02@gmail.com>
Mike Daines          <mdaines@users.noreply.github.com>
Mike Fletcher        <john.m.fletcher@bankofamerica.com>
Mike McCabe          <mccabe@archive.org>
Nathan Baulch        <nathan.baulch@gmail.com>
Naïm Favier          <n@monade.li>
Nicolas Pouillard    <nicolas.pouillard@gmail.com>
Nicole Wren          <nicole@wren.systems>
Paul Chvostek        <paul+gitkraken@it.ca>
Paul Wise            <pabs3@bonedaddy.net>
Peter van Dijk       <peter@7bits.nl>
Philipp Hagemeister  <phihag@phihag.de>
Ricardo Constantino  <wiiaboo@gmail.com>
Richard Groves       <richard@noodlfroot.com>
Richard H Lee        <richard@webdezign.co.uk>
Riley Avron          <riley.avron@gmail.com>
Rob Wills            <rob.wills@gmail.com>
Robert Aboukhalil    <robert.aboukhalil@gmail.com>
Roland C. Dowdeswell <roland.dowdeswell@twosigma.com>
Roman Inflianskas    <rominf@users.noreply.github.com>
Romero Malaquias     <romero.malaquias@gmail.com>
Ryoichi KATO         <ryo1kato@gmail.com>
Rémy Léone           <remy.leone@gmail.com>
SArpnt               <sarpnt@ficial.net>
Samar Sunkaria       <sameesunkaria@me.com>
Santiago Lapresta    <santiago.lapresta@gmail.com>
Sean Wei             <me@sean.taipei>
Sebastian Freundt    <freundt@ga-group.nl>
Shaun Guth           <sguth@practicefusion.com>
Shay Elkin           <shay@everything.me>
Simon Elsbrock       <simon@iodev.org>
Stefan               <stefan.haubenthal@gmail.com>
Stefan Seemayer      <stefan@seemayer.de>
Stephen Roantree     <stroantree@gmail.com>
Stephen Shaw         <stesh@netsoc.tcd.ie>
Steven Ihde          <sihde@hamachi.us>
Steven Maude         <StevenMaude@users.noreply.github.com>
Steven Penny         <svnpenn@gmail.com>
Thalia Archibald     <thalia@archibald.dev>
TheOdd               <owenhines@protonmail.com>
Thomas Bozeman th026106 <thomas.bozeman@digitalglobe.com>
Thomas R. Hall       <trhall@trhall.org>
Thomas Sibley        <tom@zulutango.org>
Tim McCormack        <cortex@brainonfire.net>
Timothy John Perisho Eccleston <combinatorist@users.noreply.github.com>
Tom Wolf             <github@incognitox.org>
Tomas Halman         <thalman@redhat.com>
Travis Gockel        <travis@gockelhut.com>
Tyler Rockwood       <rockwotj@users.noreply.github.com>
Ulrich Eckhardt      <ulrich.eckhardt@base-42.de>
W-Mark Kubacki       <wmark@hurrikane.de>
William Chargin      <wchargin@gmail.com>
Yasuhiro Matsumoto   <mattn.jp@gmail.com>
Yeikel               <email@yeikel.com>
Yoichi Nakayama      <yoichi.nakayama@gmail.com>
Zhaohui Mei          <mzh.whut@gmail.com>
Zhiming Wang         <zmwangx@gmail.com>
calpeconsulting      <61429736+calpeconsulting@users.noreply.github.com>
cdnbacon             <mike@busbud.com>
dak180               <dak180@users.sf.net>
davkor               <david@adalogics.com>
dependabot[bot]      <49699333+dependabot[bot]@users.noreply.github.com>
eitsupi              <50911393+eitsupi@users.noreply.github.com>
fletcher gornick     <fletcher@gornick.dev>
github-actions[bot]  <41898282+github-actions[bot]@users.noreply.github.com>
goodactive           <167312449+goodactive@users.noreply.github.com>
i                    <isomorphisms@sdf.org>
jkleint              <jkleint@gmail.com>
lectrical            <14344693+lectrical@users.noreply.github.com>
liviubobocu          <liviu.bobocu@uipath.com>
maflcko              <6399679+maflcko@users.noreply.github.com>
mail6543210          <mail6543210@yahoo.com.tw>
mjarosie             <mjarosie@users.noreply.github.com>
myaaaaaaaaa          <103326468+myaaaaaaaaa@users.noreply.github.com>
nmulcahey            <nmulcahey@gmail.com>
orbea                <orbea@riseup.net>
polyester            <paul@cleanclothes.org>
rain1                <rain1@airmail.cc>
riastradh            <campbell+github@mumble.net>
sachint              <32639496+sachintu47@users.noreply.github.com>
sheepster            <omer531998@gmail.com>
tal@whatexit.org     <tal@whatexit.org>
taoky                <taoky99@outlook.com>
trantor              <trantorvega@gmail.com>
wellweek             <148746285+wellweek@users.noreply.github.com>
wllm-rbnt            <william.robinet@conostix.com>
zstadler             <zeev.stadler@gmail.com>
наб                  <nabijaczleweli@nabijaczleweli.xyz>
엄태용               <lg65438805@gmail.com>


================================================
FILE: COPYING
================================================
jq is copyright (C) 2012 Stephen Dolan

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.



jq's documentation (everything found under the docs/ subdirectory in
the source tree) is licensed under the Creative Commons CC BY 3.0
license, which can be found at:

         https://creativecommons.org/licenses/by/3.0/

The documentation website includes a copy of Twitter's Bootstrap and
relies on Bonsai, Liquid templates and various other projects, look
them up for detailed licensing conditions.



jq incorporates David M. Gay's dtoa.c and g_fmt.c, which bear the
following notices:

dtoa.c:
The author of this software is David M. Gay.

Copyright (c) 1991, 2000, 2001 by Lucent Technologies.

Permission to use, copy, modify, and distribute this software for any
purpose without fee is hereby granted, provided that this entire notice
is included in all copies of any software which is or includes a copy
or modification of this software and in all copies of the supporting
documentation for such software.

THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
WARRANTY.  IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY
REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.

g_fmt.c:
The author of this software is David M. Gay.

Copyright (c) 1991, 1996 by Lucent Technologies.

Permission to use, copy, modify, and distribute this software for any
purpose without fee is hereby granted, provided that this entire notice
is included in all copies of any software which is or includes a copy
or modification of this software and in all copies of the supporting
documentation for such software.

THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
WARRANTY.  IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY
REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.



jq uses parts of the open source C library "decNumber", which is distributed
under the following license:


ICU License - ICU 1.8.1 and later

COPYRIGHT AND PERMISSION NOTICE

Copyright (c) 1995-2005 International Business Machines Corporation and others
All rights reserved.

Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, and/or sell copies of the Software, and to permit persons
to whom the Software is furnished to do so, provided that the above
copyright notice(s) and this permission notice appear in all copies of
the Software and that both the above copyright notice(s) and this
permission notice appear in supporting documentation.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

Except as contained in this notice, the name of a copyright holder
shall not be used in advertising or otherwise to promote the sale, use
or other dealings in this Software without prior written authorization
of the copyright holder.

--------------------------------------------------------------------------------
All trademarks and registered trademarks mentioned herein are the property of their respective owners.



jv_thread.h is copied from Heimdal's lib/base/heimbase.h and some code
in jv.c is copied from Heimdal's lib/base/dll.c:


Portions Copyright (c) 2016 Kungliga Tekniska Högskolan
(Royal Institute of Technology, Stockholm, Sweden).
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:

1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
OF THE POSSIBILITY OF SUCH DAMAGE.



jq uses a modified version of NetBSD implementation strptime(),
which is distributed under the following license:

Copyright (c) 1997, 1998, 2005, 2008 The NetBSD Foundation, Inc.
All rights reserved.

This code was contributed to The NetBSD Foundation by Klaus Klein.
Heavily optimised by David Laight

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.


================================================
FILE: ChangeLog
================================================
2015-07-10  Nicolas Williams  nico@cryptonector.com

	Use `include` for import into namespace

	Simplify import docs

	Fix typo in docs

2015-07-06  James Andariese  james.andariese@locationlabs.com

	Dockerfile reorganized

2015-07-04  David Tolnay  dtolnay@gmail.com

	Make jq.h usable from C++

2015-07-03  Nicolas Williams  nico@cryptonector.com

	Document math support

2015-06-30  David Tolnay  dtolnay@gmail.com

	strftime wrong day-of-week (fix #838)

2015-06-28  Nicolas Williams  nico@cryptonector.com

	Document --run-tests

	Make --run-tests' jv_test() quiet

2015-06-27  Nicolas Williams  nico@cryptonector.com

	Make --run-tests less verbose by default

	Add more basic number tests

	Add `pow`, better libm detection (fix #443)

2015-06-27  David Tolnay  dtolnay@gmail.com

	gcov exclusions

	flag to enable gcov and coveralls

	add configure option to run tests without valgrind

2015-06-20  David Tolnay  dtolnay@gmail.com

	get Travis CI working

2015-06-26  Nicolas Williams  nico@cryptonector.com

	Add `{$var}` `. as {$var}` syntax (fix #831)

	Add streaming utilities (fix #827)

2015-06-04  Santiago Lapresta  santiago@typeform.com

	Add combinations/0 and combinations/1

2015-06-22  Nicolas Williams  nico@cryptonector.com

	WriteFile() on WIN32 when stdout isatty (fix #824)

2015-06-19  David Tolnay  dtolnay@gmail.com

	fix errors flagged by clang static analyzer

2015-06-19  Nicolas Williams  nico@cryptonector.com

	Fix #811: use CommandLineToArgvW() and _wfopen()

2015-06-18  David Tolnay  dtolnay@gmail.com

	fix use after free in f_strptime

	separate jq, oniguruma, sh, and man tests

2015-06-18  Nicolas Williams  nico@cryptonector.com

	argv[] may not be UTF-8 (fix #811)

2015-06-18  Doug Luce  doug@github.con.com

	Add alloca() discovery to configure.ac

2015-06-18  Nicolas Williams  nico@cryptonector.com

	Fix `finites`

2015-06-17  David Tolnay  dtolnay@gmail.com

	fix broken tests in manual.yml

2015-06-17  Nicolas Williams  nico@cryptonector.com

	Add isnormal and related, rename *inf

2015-06-17  Nicolas Williams  nico@cryptonector.com

	Fix #814: raise on div-0, add inf isinf nan isnan

2015-06-17  Nicolas Williams  nico@cryptonector.com

	Sequence parser: wait for RS on startup (fix #687)

2015-06-07  David Tolnay  dtolnay@gmail.com

	array and object destructuring (fix #533)

2015-06-03  Nicolas Williams  nico@cryptonector.com

	Add --tab and -indent n options

2015-05-29  Nicolas Williams  nico@cryptonector.com

	Fixup --slurpfile/argile docs

	Add --slurpfile

	Better handling of stdout errors

2015-05-25  Nicolas Williams  nico@cryptonector.com

	Add ./configure --enable-all-static

2015-05-25  Nicolas Williams  nico@cryptonector.com

	Keywords should be OK as object keys (fix #794)

2015-03-04  Travis Gockel  travis@gockelhut.com

	Add wrapping and clamping to jv_array_slice

2015-04-17  Assaf Gordon  assafgordon@gmail.com

	Print offending object in runtime error messages

	Add filename/line functions to jq (fix #753)

2015-04-17  Assaf Gordon  assafgordon@gmail.com

	Report filename:line on runtime errors (fix #752)

2015-05-19  Nicolas Williams  nico@cryptonector.com

	Document gsub/3

2015-05-03  Nicolas Williams  nico@cryptonector.com

	Add error injection library

2015-04-28  Nicolas Williams  nico@cryptonector.com

	Report read errors too (and fix #772)

2015-05-02  Nicolas Williams  nico@cryptonector.com

	README: send questions to SO and Freenode

2015-04-28  Nicolas Williams  nico@cryptonector.com

	usage() should check fprintf() result (fix #771)

2015-04-28  Nicolas Williams  nico@cryptonector.com

	Fix header guards (fix #770)

2015-04-24  Nicolas Williams  nico@cryptonector.com

	--raw-input wrongly adds NULs (fix #761)

2015-04-23  Nicolas Williams  nico@cryptonector.com

	With `inputs` builtin, -n and -R can now coexist

	--raw-input ought to read NULs (partial fix #760)

	--slurp --raw-input is broken (fix #761)

	from_entries is broken (fix #767)

2015-04-22  Assaf Gordon  assafgordon@gmail.com

	regex functions: report informative error if not available.

2015-04-21  Andrew O'Brien  obrien.andrew@gmail.com

	Fixes manual generation with psych

2015-04-20  Assaf Gordon  assafgordon@gmail.com

	Handle NUL in escaped-string output

2015-04-03  tal@whatexit.org  tal@whatexit.org

	manual.yml: Clarify how to specify keys with ":" and special chars.

2015-04-15  Assaf Gordon  assafgordon@gmail.com

	docs: expand @tsv section - add escape sequences.

	@tsv: escape \r, \n, \\

2015-03-30  Nicolas Williams  nico@cryptonector.com

	Add `$__loc__` (fix #740)

2015-03-29  Nicolas Williams  nico@cryptonector.com

	Include filename and lineno in error messages

2015-03-06  Assaf Gordon  assafgordon@gmail.com

	detect and report output writing errors

2015-03-18  Santiago Lapresta  santiago.lapresta@gmail.com

	Adds Dockerfile

2015-03-10  Assaf Gordon  assafgordon@gmail.com

	partial handling of input errors

2015-03-09  Assaf Gordon  assafgordon@gmail.com

	always propagate input errors to exit code

2015-03-23  William Langford  wlangfor@gmail.com

	Fix #735 (SIGFPE on modulo by 0)

2015-03-08  Nicolas Williams  nico@cryptonector.com

	Add more date builtins

	Automake: jq depends on version.h (fix #721)

2015-03-06  Assaf Gordon  assafgordon@gmail.com

	exit with non-zero code on runtime exceptions

2015-03-06  Nicolas Williams  nico@cryptonector.com

	Add date builtins (fix #364)

2015-02-18  Stefan Seemayer  stefan@seemayer.de

	Correct automake and autoconf version requirements

2015-02-17  Nicolas Williams  nico@cryptonector.com

	Mention --disable-maintainer-mode in bison error

2015-02-16  Sebastian Freundt  freundt@ga-group.nl

	Fix oniguruma detection logic

2015-02-15  Nicolas Williams  nico@cryptonector.com

	Add --disable-maintainer-mode; make bison optional

2015-02-14  Nicolas Williams  nico@cryptonector.com

	Make Oniguruma/regexp optional

2015-02-01  Nicolas Williams  nico@cryptonector.com

	Refactor moar: move parts of main.c into libjq

2014-12-27  Nicolas Williams  nico@cryptonector.com

	Refactor handling of inputs in main() (fix #667)

2015-02-10  Kim Toms  kim.toms@bplglobal.net

	Enhance from_entries to better deal with Amazon AWS Tags

2015-01-26  Nicolas Williams  nico@cryptonector.com

	Usage message for -h should go to stdout

2015-01-27  i  isomorphisms@sdf.org

	readability

2015-01-14  Joel Purra  code+github@joelpurra.com

	Empty arrays join/1 to an empty string, fixes #668 bug introduced by 9760245

2014-12-27  Nicolas Williams  nico@cryptonector.com

	Add `debug` and `stderr` builtins

2015-01-13  Nicolas Williams  nico@cryptonector.com

	join/1: respect empty strings (fix #668)

2015-01-13  Nicolas Williams  nico@cryptonector.com

	Split on empty sep: fix #552 moar

2015-01-12  Nicolas Williams  nico@cryptonector.com

	Fix docs for `split/0`

2015-01-12  Nicolas Williams  nico@cryptonector.com

	Fix #552

2015-01-02  Nicolas Williams  nico@cryptonector.com

	Look for jq/main.jq for imports

2015-01-01  Nicolas Williams  nico@cryptonector.com

	Add static build instructions (fix #294)

2014-12-30  Nicolas Williams  nico@cryptonector.com

	Further module system revamp (fix #659)

2014-12-28  Nicolas Williams  nico@cryptonector.com

	Add `label $name | EXP`; fix `break`

2014-12-30  Nicolas Williams  nico@cryptonector.com

	Remove string indexing by string (fix #454)

2014-12-30  Nicolas Williams  nico@cryptonector.com

	Add support for testing erroneous programs

2014-12-30  Nicolas Williams  nico@cryptonector.com

	Make --run-tests more informative

2014-10-06  pkoppstein  pkoppstein@gmail.com

	transpose/0 for possibly jagged matrices

2014-10-07  pkoppstein  pkoppstein@gmail.com

	bsearch(x) (binary search): builtin.c (tested), with documentation and test case. Always yields an integer (even if input is unsorted); returns (-1 - ix) if x is not in input array.

2014-10-06  pkoppstein  pkoppstein@gmail.com

	ascii_upcase/0 and ascii_downcase/0

2014-12-27  Nicolas Williams  nico@cryptonector.com

	Add `debug` builtin

	Don't force C API users to set input cb

2014-12-26  Nicolas Williams  nico@cryptonector.com

	Make jq --run-tests show test line numbers

	Streaming parser torture tests

	Fuzz JSON parser

2014-12-22  Nicolas Williams  nico@cryptonector.com

	Add Streaming parser (--stream)

2014-12-26  Nicolas Williams  nico@cryptonector.com

	Allow C-coded functions to `empty`

	Add BLOCK_8() macro

	Fix `foreach` non-propagation of errors

	Allow zero-length buffers in jv_parser_set_buf()

2014-12-24  Nicolas Williams  nico@cryptonector.com

	Add @tsv; fix #645

	Module search revamp for pkg managers

	Fix #348: reject unescaped control chars

2014-12-23  Nicolas Williams  nico@cryptonector.com

	Use __attribute__ __printf__ with GCC

	Make `values` faster (fix #652)

2014-12-22  Marc Abramowitz  marc@marc-abramowitz.com

	.travis.yml: Set sudo false; use containers

2014-12-22  Santiago Lapresta  santiago.lapresta@gmail.com

	Define `map_values`

2014-05-21  Santiago Lapresta  santiago.lapresta@gmail.com

	`in` is now `inside`, added `in` as inverse of `has`

2014-05-20  Santiago Lapresta  santiago.lapresta@gmail.com

	Added `in` command

2014-12-21  Eiichi Sato  sato.eiichi@gmail.com

	Fix examples in manual

	Fix indents in manual.yml

	HTML-escape jq programs in manual

	Fix examples in manual

2014-12-12  Nicolas Williams  nico@cryptonector.com

	Add until(cond; next); fix #639

	Add --argjson, fix #648

2014-11-29  Nicolas Williams  nico@cryptonector.com

	Fix refcount leak, fix #618

2014-11-28  Nicolas Williams  nico@cryptonector.com

	STOREV/LOADV* should also print refcnts

	Enable printing of stack val refcnts

	Print stack value refcounts when tracing (#636)

2014-11-23  Colin von Heuring  colin@janrain.com

	Doc correction

2014-11-11  Ian Miell  ian.miell@gmail.com

	Requirements made slightly more complete: cf https://github.com/ianmiell/shutit/blob/master/library/jq/jq.py

2014-11-05  Steven Maude  StevenMaude@users.noreply.github.com

	Fix typos in tutorial

2014-10-21  Santiago Lapresta  santiago.lapresta@gmail.com

	Define {any,all}/2 independently from {any,all}/0

2014-10-20  Santiago Lapresta  santiago.lapresta@gmail.com

	Define {any,all}/{0,1} in terms of {any,all}/2

2014-10-10  Nicolas Williams  nico@cryptonector.com

	Add support for JSON sequence MIME type

2014-10-06  William Langford  wlangfor@gmail.com

	Properly call onig_error_code_to_str

2014-10-06  pkoppstein  pkoppstein@gmail.com

	fix sub (#586); add gsub/3; add transpose/0.

2014-10-03  Nicolas Williams  nico@cryptonector.com

	Update docs about sort/group/min/max/unique

	from-entries should work with EC2 (fix #592)

	Remove sort/1 and group/1

2014-09-30  Nicolas Williams  nico@cryptonector.com

	to_entries should not sort keys (fix #561)

2014-09-22  William Langford  wlangfor@gmail.com

	Properly handle when objects cannot be folded

2014-08-30  Nicolas Williams  nico@cryptonector.com

	Drop the jq version directory from search path

	Never close stdin; allow multiple `-` arguments

	Handle invalid inputs in argument files (fix #562)

2014-08-28  William Langford  wlangfor@gmail.com

	Properly handle incomplete json when input is file

2014-08-10  Nicolas Williams  nico@cryptonector.com

	Add `module` directive, `modulemeta` builtin

2014-08-09  Nicolas Williams  nico@cryptonector.com

	Constant fold objects

	Fold constant arrays

	More constant folding: null, true, and false

	`.foo[-1] = ...` trips assertion (fix #490)

	Allow any number of jq-coded function arguments

2014-08-08  Nicolas Williams  nico@cryptonector.com

	Make regexp builtins and range/3 use #524 too

	Use `def f($a): ...;` syntax for builtins

	Add `def f($arg):` syntax (fix #524)

2014-07-31  pkoppstein  pkoppstein@gmail.com

	regex filters (#432): scan, splits, split, sub, gsub

2014-08-06  Nicolas Williams  nico@cryptonector.com

	Better error msg for bad shell quoting (fix #538)

2014-08-04  William Langford  wlangfor@gmail.com

	Actually check version for bison.

2014-08-03  pkoppstein  pkoppstein@gmail.com

	Apply TCO to recurse/1, add recurse/2; tweak docs

2014-08-01  Adam Lindberg  hello@alind.io

	Add example of selecting object with keys

2014-07-19  pkoppstein  pkoppstein@gmail.com

	Add capture; document regular expression filters

2014-07-28  Nicolas Williams  nico@cryptonector.com

	Add `first`, `nth`, `last` (fix #510)

2014-07-27  Nicolas Williams  nico@cryptonector.com

	Fold constants (fix #504)

2014-07-21  William Langford  wlangfor@gmail.com

	Changing color codes to fix #495

2014-07-09  William Langford  wlangfor@gmail.com

	Added library system with -l, -L, and JQ_LIBRARY_PATH

2014-07-14  Simon Elsbrock  simon@iodev.org

	jq 1.4 is in Debian

2014-07-13  Marc Bruggmann  marcbr@spotify.com

	Fix manual example for `endswith`.

2014-07-09  Hanfei Shen  qqshfox@gmail.com

	Fix examples for `del` in manual

2014-07-08  Zhiming Wang  zmwangx@gmail.com

	Fix invalid YAML in manual.yml

	Add tests/all.trs to .gitignore

2014-07-09  Nicolas Williams  nico@cryptonector.com

	Better document `path()`'s power; also `|=`

	Add `foreach EXP as $var (INIT; UPDATE)` form

	Make `while()` handle `break`

2014-07-07  Nicolas Williams  nico@cryptonector.com

	Make C-coded built-ins take `jq_state *` argument

	`error(x)` should not `tostring` its arg; fix #466

	`limit` should use `break`

	Make `any/2` and `all/2` efficient using `foreach`

2013-12-24  Nicolas Williams  nico@cryptonector.com

	jv_invalid() shouldn't allocate

2013-12-31  Nicolas Williams  nico@cryptonector.com

	jv_show() should be able to display invalid values

2014-07-07  Nicolas Williams  nico@cryptonector.com

	Add `break` builtin for `foreach`

	Explain `foreach`'s powers a bit more

	Document `path(path_expression)` builtin

	$var["foo"]=1 can't work as expected; doc fix #236

	Better check for lib has only functions (fix #138)

2014-07-06  Nicolas Williams  nico@cryptonector.com

	Add `any/N` and `all/N` x N in (1, 2) (fix #455)

	Add `foreach` and `limit`

2014-07-04  William Langford  wlangfor@gmail.com

	Add support for negative indices for .[]; fix #462

2014-07-06  Nicolas Williams  nico@cryptonector.com

	Add general `?` operator

2014-07-05  Nicolas Williams  nico@cryptonector.com

	Add `try EXP catch EXP`

2014-07-06  Nicolas Williams  nico@cryptonector.com

	Document `error/1`

2014-07-02  Nicolas Williams  nico@cryptonector.com

	Add `while(cond; update)` (fix #314)

	Add `range(init;upto;by)` (fix #317)

2014-07-01  Nicolas Williams  nico@cryptonector.com

	Describe generators, range() with by to manual

2014-07-01  William Langford  wlangfor@gmail.com

	Fixed base64 issue with UTF-8 strings

2014-06-30  Nicolas Williams  nico@cryptonector.com

	TCO to the max!

2014-06-25  William Langford  wlangfor@gmail.com

	Added cross-compilation script to build libjq for iOS.

2014-06-29  Zhiming Wang  zmwangx@gmail.com

	Let @uri produce uppercase hexadecimal digits...

2014-06-24  Nicolas Williams  nico@cryptonector.com

	Get "Try Online" button working (fix #440)

2014-06-22  Nicolas Williams  nico@cryptonector.com

	Tail call optimization (close #437)

2014-06-20  Nicolas Williams  nico@cryptonector.com

	Allow stacking of short options (fix #346)

2014-06-18  William Langford  wlangfor@gmail.com

	Added regex support as per issue #164.

2014-06-17  Nicolas Williams  nico@cryptonector.com

	Add `-j` / `--join-output` option, similar to `-r`

2014-06-18  Santiago Lapresta  santiago.lapresta@gmail.com

	Simplified standard library

2014-06-16  Nicolas Williams  nico@cryptonector.com

	Fix #280: from_entries of [] is null, should be {}

2014-06-16  Nicolas Williams  nico@cryptonector.com

	No args default w/ tty stdout, not tty stdin #220

2014-06-16  Santiago Lapresta  santiago.lapresta@gmail.com

	Added `flatten` and `flatten(x)` functions

2014-06-16  Nicolas Williams  nico@cryptonector.com

	Add ChangeLog and NEWS files

2014-06-14  Nicolas Williams  nico@cryptonector.com

	Allow multiple functions with different arities

2014-06-13  Nicolas Williams  nico@cryptonector.com

	Add `env` builtin

2014-06-13  Nicolas Williams  nico@cryptonector.com

	Document the lambda nature of function args #391

2014-06-13  Nicolas Williams  nico@cryptonector.com

	Add jqplay link to the site

2014-06-12  Jingwen Owen Ou  jingweno@gmail.com

	jqplay has a domain now

2014-06-12  Nicolas Williams  nico@cryptonector.com

	Make a better jq.1 when Ruby deps missing

2014-06-11  Kim De Mey  kim.demey@gmail.com

	Detect endianness at configuration with Autoconf AC_C_BIGENDIAN feature

2014-06-09  Nicolas Williams  <nico@cryptonector.com>

	Add libm.h to dist file list

	Add note about cmd.exe quoting

	Building docs fails on powerpc (#349)

2014-06-08  Nicolas Williams  <nico@cryptonector.com>

	Update site news

	Also fix configure.ac to use git describe --tags

	Fix scripts/version: use git describe --tags ...
	After tagging as 1.4 scripts/version was still producing jq-1.3-....

	Add `indices(s)`, improve `index(s)`, `rindex(s)`
	Now these deal with arrays as input and `s` being an array or a scalar.

	Improve `index` and `rindex` examples

	Remove reference to `getpath` from docs

	Document `index` and `rindex` (#389)

2014-06-07  Santiago Lapresta  <santiago.lapresta@gmail.com>

	Added `join` function

2014-06-07  Nicolas Williams  <nico@cryptonector.com>

	String * number should be commutative

2014-06-04  Nicolas Williams  <nico@cryptonector.com>

	Add cross-compilation notes to README
	A detailed set of instruction as to how to setup a cross-compilation
	environment for OS X and Win32/64 would be nice.

	Add -j option to scripts/crosscompile

	Add flags argument to jv_parser_new()
	For extensibility.  We might add streaming parser options, even binary
	JSON encoding options.

2014-06-02  Nicolas Williams  <nico@cryptonector.com>

	Fix tests failures on Windows
	And Solaris 8 and 9 too, no doubt.  The problem was that non-standard
	vsnprintf()s that return -1 when the buffer is too small were not
	properly supported.

2014-05-20  Santiago Lapresta  <santiago.lapresta@gmail.com>

	Documented `del` command

2014-05-11  Santiago Lapresta  <santiago.lapresta@gmail.com>

	Added texts/examples to unique_by function

	Added unique_by function

2014-04-17  Nicolas Williams  <nico@cryptonector.com>

	Make pthread tls configurable for Mingw build
	For the Mingw build we don't want to pull in the pthread DLL just
	because we can autodetect pthread support.  That would make the jq.exe
	binary not self-contained.

2014-04-16  Nicolas Williams  <nico@cryptonector.com>

	Add autoconf checks for pthreads; fix #340

2014-03-20  Jingwen Owen Ou  <jingweno@gmail.com>

	Add link to jqplay

2014-03-13  Nicolas Williams  <nico@cryptonector.com>

	Fix for #303 in the sources

2014-03-13  Santiago Lapresta  <santiago.lapresta@gmail.com>

	Added `arrays` and other filters
	Arrays, objects, numbers, strings, booleans, nulls, values (non-nulls)
	-- these builtins filter out those inputs that don't match the name of
	the builtin.

	This fixes #322 and #324.

2014-03-07  Filippo Valsorda  <filippo.valsorda@gmail.com>

	Add a recursive object merge strategy and bind it to *
	This commit adds a jv_object_merge_recursive function, that performs
	recursive object merging, and binds it to multiply when applied to
	two objects.

	Closes #320

2014-03-06  Nicolas Williams  <nico@cryptonector.com>

	Make libm tests more portable

2014-02-26  Andrew Rodland  <andrew@cleverdomain.org>

	Repair jv_show

2014-02-26  Andrew Rodland  <andrew@cleverdomain.org>

	Make jq --raw-output --unbuffered work
	--unbuffered was only affecting the normal output case, not the --raw-output case. Make the two of them play together.

	This also makes sure that the output is flushed *after* printing the newline, so a consumer doesn't lag a line behind.

2014-02-21  Nicolas Williams  <nico@cryptonector.com>

	Add cbrt (cube root)

	Add missing trig functions and barebones test

	Remove non-standard exp10()

2014-02-21  Mike McCabe  <mccabe@archive.org>

	Initial add of math functions.

2014-02-20  Nicolas Williams  <nico@cryptonector.com>

	Add `?`, `.[]?`, and `..` operators
	Make XPath-like `//a/b` recursive structure traversal easier in jq,
	which then becomes:

	    ..|.a?.b?

	The `?` operator suppresses errors about . not being an array or object.
	The `..` operator is equivalent to calling the new `recurse_down`
	built-in, which in turn is equivalent to

	    recurse(.[]?)

	Note that `..a` is not supported; neither is `...a`.  That could be add
	added, but it doesn't seem worth the trouble of saving the need to type
	a '|'.

2014-02-16  Santiago Lapresta  <santiago.lapresta@gmail.com>

	Added `all` and `any` builtins

2014-01-25  polyester  <paul@cleanclothes.org>

	work with newer versions of automake
	when using a newer automake, the autoreconf step fails with warnings:
	"linking libtool libraries using a non-POSIX archiver requires 'AM_PROG_AR' in 'configure.ac' "

	This happens for instance on ubuntu 13.10.
	Doing just that, adding 'AM_PROG_AR' to configure.ac fixes the problem.

2014-01-01  Nicolas Williams  <nico@cryptonector.com>

	Fix #201; check that bison accepts --warnings

2013-12-27  Joe Littlejohn  <joe.littlejohn@nokia.com>

	Fix rpm build (`make rpm`)
	* Re-add VERSION as it's required for `./setup superclean`
	  and `make rpm`.
	* Add *.rpm to git ignore, we never want them under version control.

2013-12-27  Filippo Giunchedi  <fgiunchedi@gmail.com>

	include additional files in jq.spec
	this will probably need changing upon SONAME bump

	fix rpm Makefile target and prerequisites
	depend on dist and the specfile, plus use automake's variables

2013-12-26  Nicolas Williams  <nico@cryptonector.com>

	Document --version

2013-12-26  Nicolas Williams  <nico@cryptonector.com>

	Add jv_dumpf() and jv_show()
	jv_dumpf() takes a FILE *.

	jv_show() is intended for use in debuggers, so it dumps the jv to stderr
	and it does not jv_free() the jv, so it's safe to
	"call jv_show(some_jv, -1)" in a debugger.  If flags == -1 then the jv
	will be shown pretty-printed and in color.

2013-12-26  Nicolas Williams  <nico@cryptonector.com>

	Document .foo.bar in manual

	Document exit numbers

	Normalize errors for -e

2013-12-25  Nicolas Williams  <nico@cryptonector.com>

	Fix doc typos (.[foo] wanted to be .["foo"])

	Add note to jq.1 about shell quoting

2013-12-20  Philipp Hagemeister  <phihag@phihag.de>

	Ignore the config/test-driver file
	This file is automatically generated and does not need to be committed.

	Fix @uri example
	Previously, the @uri example didn't match the actual behavior of the current jq, as exclamation marks do not need to be encoded in URIs.
	Replace the example with an input that needs encoding, and is encoded by jq.

2013-12-17  Stephen Dolan  <mu@netsoc.tcd.ie>

	Allow negated object values without parens. Fixes #247

2013-12-17  Nicolas Williams  <nico@cryptonector.com>

	Fix memmem() error

2013-12-13  Rémy Léone  <remy.leone@gmail.com>

	Adding a .travis.yml file to use the travis-ci.org
	From wikipedia:

	Travis CI is a hosted, distributed continuous integration service used
	to build and test projects hosted at GitHub.

	Travis CI is configured by adding a file named .travis.yml, which is a
	YAML format text file, to the root directory of the GitHub repository.

	Travis CI automatically detects when a commit has been made and pushed
	to a GitHub repository that is using Travis CI, and each time this
	happens, it will try to build the project and run tests. This includes
	commits to all branches, not just to the master branch. When that
	process has completed, it will notify a developer in the way it has been
	configured to do so — for example, by sending an email containing the
	test results (showing success or failure), or by posting a message on an
	IRC channel. It can be configured to run the tests on a range of
	different machines, with different software installed (such as older
	versions of a programming language, to test for compatibility).

2013-12-13  Stephen Dolan  <mu@netsoc.tcd.ie>

	Make the testsuite run on machines without valgrind

	Format more integers as integers, not scientific notation.
	jq is now willing to put up to 15 zeros after an integer before
	moving to scientific notation.

2013-12-11  Nicolas Williams  <nico@cryptonector.com>

	Complete more-arity feature not complete
	And test

2013-12-10  David R. MacIver  <david@drmaciver.com>

	convert range bounds to integers in a way that avoids undefined behaviour

	add checking of numeric indices to an array to see if they can reasonably be considered integers. Avoid undefined behaviour if out of bounds

2013-12-09  David R. MacIver  <david@drmaciver.com>

	some functions were missing prototypes. Add them

2013-12-08  David R. MacIver  <david@drmaciver.com>

	These vfprintfs are being used as if they were printfs. Fix that

	consistent use of goto out in main

2013-12-08  Stephen Dolan  <mu@netsoc.tcd.ie>

	Refactor jv structure.
	New structure layout is simpler and also faster.  In particular, it's
	now small enough to be passed in registers on amd64.

	Make testsuite not leak when compiled with -DNDEBUG.

2013-12-08  David R. MacIver  <david@drmaciver.com>

	test for losing memory on compile errors

	args to jq_compile_args were not getting freed when there were errors in the compile

2013-12-06  Nicolas Williams  <nico@cryptonector.com>

	Fix double-free typo in print_error()

	Fix manual.yml

2013-12-04  Nicolas Williams  <nico@cryptonector.com>

	Conditionally #define _GNU_SOURCE in compile.c

	Add tests for string index by string and builtins

	Add index and rindex builtins

	Add index strings by string; return string indexes
	    % jq '.[","]'
	    "a,bc,def,ghij,klmno"
	    [1,4,8,13]
	    %

	Make length return abs value of numeric inputs

	Add callback interface for errors
	Printing to stderr is not the right answer for a library.

	Add jv_string_vfmt()

	Document ltrimstr and rtrimstr

	Test ltrimstr and rtrimstr functions

	Add ltrimstr and rtrimstr functions

	Document -e / --exit-status argument

	Add -e | --exit-status CLI option

	Document tojson and fromjson builtins

	Test tojson and fromjson

	Add tojson and fromjson builtins

	Document split function

	Document string multiplication and division

	Document string functions and slicing

	Test string slicing

	Add string slicing

	Add tests for string division/splitting

	Add string division by string (split on separator)

	Test starts/endswith and string multiplication

	Add string multiplication by number

	Add startswith/endswith

	Add explode/implode jq functions to match jv API

	Use uint32_t for codepoint in  jv_string_append_codepoint()

	Add jv string utility functions
	    jv_string_empty()
	        -> return an empty string with given allocated length (for fast
	           appends)
	    jv_string_append_codepoint
	        -> append a single codepoint (int) to the given string
	    jv_string_explode
	        -> return an array of codepoints making up a string
	    jv_string_implode
	        -> return the UTF-8 encoding of an array of codepoint numbers

	Support more arguments for defs

2013-12-04  Stephen Dolan  <mu@netsoc.tcd.ie>

	Preserve insertion order in objects. Closes #169.

2013-11-30  Nicolas Pouillard  <nicolas.pouillard@gmail.com>

	Add a few more test cases (from the man page)

2013-11-08  Stephen Dolan  <mu@netsoc.tcd.ie>

	Add a --unbuffered option. Closes #206

2013-11-07  Peter van Dijk  <peter@7bits.nl>

	count should be length
	Example refers to a count function, which does not exist. Replacing it with length works.

2013-11-07  Stephen Dolan  <mu@netsoc.tcd.ie>

	Fix a crash on group_by of empty list. Fixes #208.

2013-10-16  Ryoichi KATO  <ryo1kato@gmail.com>

	Docs: add description of --from-file option

2013-10-06  Juan Guerrero  <juan.guerrero.lozano@gmail.com>

	Fix typo on error message

2013-09-19  Kenny Shen  <kenny.shen@zalora.com>

	Add missing -i flag in build instructions

2013-09-14  Michael Daines  <michael@mdaines.com>

	Add test showing calculation of standard deviation

2013-09-13  Mike Daines  <michael@mdaines.com>

	Fix typo

2013-09-11  Michael Daines  <michael@mdaines.com>

	Add sqrt operator

2013-09-04  Jack Pearkes  <jackpearkes@gmail.com>

	docs: update the tutorial to use GitHub's API

2013-09-01  Ankur  <ankz.kothari@gmail.com>

	Call AM_INIT_AUTOMAKE once only
	Fixes build with automake-1.14

2013-08-19  Joe Littlejohn  <joe.littlejohn@nokia.com>

	Fix Makefile after refactoring of stacks in 05d90517b02

2013-06-23  Stephen Dolan  <mu@netsoc.tcd.ie>

	Remove #includes from jv.h

	Fix the jv_parser interface.

	Use libtool's built-in symbol exporting rather than a mapfile.

	Move gen_utf8_tables to scripts

	Move libtool m4 junk to config/ and delete some autogenerated files.

	Remove Autoconf-generated config.h.

2013-06-22  Stephen Dolan  <mu@netsoc.tcd.ie>

	Build libjq only once, and link it statically to ./jq
	This means ./jq is a real binary rather than a libtool turd.

	Fix distcheck.
	Update list of files to be distributed.

	Utf8 fixes. Closes #161

	Reject all overlong UTF8 sequences.

	Fix various UTF8 parsing bugs.
	In particular, parse bad UTF8 by replacing the broken bits with U+FFFD
	and resynchronise correctly after broken sequences.

	Fix example in manual for `floor`. See #155.

2013-06-21  Nicolas Williams  <nico@cryptonector.com>

	Document floor

	Add floor operator

	Document mod

	Add mod (and setmod) operators

	Update .gitignore

	Add libjq autoconf goo

	Quiet setup.sh re: tmp dir

2013-06-21  Stephen Dolan  <mu@netsoc.tcd.ie>

	Move cfunction invocation code to the interpreter loop.

2013-06-18  Nicolas Williams  <nico@cryptonector.com>

	Fix serious bug in handling of --argfile

	Fix leaks in jv_load_file()

2013-06-17  Stephen Dolan  <mu@netsoc.tcd.ie>

	Fold opcode.{c,h} into bytecode.{c,h}

	Simplify block functions for variables

	Saner build instructions in README.md
	Closes #144

	Remove some initialise-to-zero code.
	This lets valgrind find more bugs - if a field isn't given a
	well-defined value valgrind will now find it instead of seeing it
	set to zero with memset.

2013-06-17  Nicolas Williams  <nico@cryptonector.com>

	Remove accidentally introduced use of fopen "e"

2013-06-16  Stephen Dolan  <mu@netsoc.tcd.ie>

	Merge pull request #114 from nicowilliams/nomem_handler
	Add jv_nomem_handler()

2013-06-16  Nicolas Williams  <nico@cryptonector.com>

	Remove last remnant of main.h

2013-06-15  Nicolas Williams  <nico@cryptonector.com>

	Allow --run-tests to take a file argument

	Fixup API to get closer to a libjq

2013-06-15  Nicolas Williams  <nico@cryptonector.com>

	Move slurp_file() into library as jv_load_file()
	Needed as part of creating a libjq.

2013-06-14  Stephen Dolan  <mu@netsoc.tcd.ie>

	Clean up lots of stack and frame logic.
	Move frame defs to execute.c

2013-06-13  Stephen Dolan  <mu@netsoc.tcd.ie>

	Simplify frame logic.

	Unify all stacks. Passes tests, but needs cleanup.

2013-06-11  Stephen Dolan  <mu@netsoc.tcd.ie>

	Support ."foo" syntax for accessing fields. See #141.

2013-06-09  Stephen Dolan  <mu@netsoc.tcd.ie>

	Unify frame and data stacks

2013-06-05  Stephen Dolan  <mu@netsoc.tcd.ie>

	Speed up cached configure (./configure -C)

	Clean up flex lines in build

	Lex and parse .foo better.
	'.as' is now valid, '. foo' is now invalid. See #141.

2013-06-04  Markus Lanthaler  <mark_lanthaler@gmx.net>

	Update README.md
	Update the link to the documentation. All GitHub pages are now using the github.io domain.

2013-06-03  Stephen Dolan  <mu@netsoc.tcd.ie>

	Make jq --version print to stdout, not stderr

	Better error handling for .foo case in parser. See #141.

	Let the parser rather than the lexer handle invalid characters.

	Add command-line option to sort object keys.
	Closes #79.

	Clean up Makefile.am (distcheck, rebuild version.h less often)

2013-05-31  Brendan Macmillan  <melbourne.research@gmail.com>

	Stop warning on fgets, simple version

	Stop warning on fgets, complex version

2013-05-31  Stephen Dolan  <mu@netsoc.tcd.ie>

	Squash a warning on some GCC versions

2013-05-29  Stephen Dolan  <mu@netsoc.tcd.ie>

	Support for printing object keys in sorted order.
	No command-line option to enable this yet. See #79.

2013-05-29  Brendan Macmillan  <melbourne.research@gmail.com>

	Bugfix multiline off-by-one (locfile.c)

	locfile.h -> locfile.h + locfile.c
	clean up includes of a few files

	Hack bugfix for multiline off-by-one (locfile.c)

	Load library from ~/.jq

2013-05-24  Stephen Dolan  <mu@netsoc.tcd.ie>

	Make jq --version report an actual git revision.
	Closes #129.

2013-05-23  Nicolas Williams  <nico@cryptonector.com>

	Add --argfile variant of --arg (issue #117)
	This is useful when one has a database (in JSON form) to query using jq
	input data.

	    % echo '{"a":1, "c":5}' > db.json
	    % echo '"c"'|./jq --argfile f /tmp/a '$f[.]'
	    5
	    % echo '"a"'|./jq --argfile f /tmp/a '$f[.]'
	    1
	    % echo '"b"'|./jq --argfile f /tmp/a '$f[.]'
	    null
	    %

2013-05-23  Stephen Dolan  <mu@netsoc.tcd.ie>

	'make clean' won't delete jq.1 if it can't be rebuilt.
	See #131


================================================
FILE: Dockerfile
================================================
FROM debian:12-slim AS builder

ENV DEBIAN_FRONTEND=noninteractive \
    DEBCONF_NONINTERACTIVE_SEEN=true \
    LC_ALL=C.UTF-8 \
    LANG=C.UTF-8

RUN apt-get update \
 && apt-get install -y \
      build-essential \
      autoconf \
      libtool \
      git \
 && apt-get clean \
 && rm -rf /var/lib/apt/lists/*

WORKDIR /app
COPY . /app
RUN autoreconf -i \
 && ./configure \
      --disable-docs \
      --with-oniguruma=builtin \
      --enable-static \
      --enable-all-static \
      --prefix=/usr/local \
 && make -j$(nproc) \
 && make check VERBOSE=yes \
 && make install-strip

FROM scratch

COPY --from=builder /app/AUTHORS /app/COPYING /usr/local/bin/jq /
RUN ["/jq", "--version"]
ENTRYPOINT ["/jq"]


================================================
FILE: KEYS
================================================
pub   4096R/71523402 2015-10-11
      Key fingerprint = 4FD7 01D6 FA9B 3D2D F5AC  935D AF19 040C 7152 3402
uid                  jq Release Signing Key <jq@stedolan.github.io>

pub   2048R/D15684DB 2015-10-12 [expires: 2017-10-11]
      Key fingerprint = 7F6C 7BD3 0412 AFD5 8C1A  5007 EB26 A4F8 D156 84DB
uid                  Nicolas Williams <nico@cryptonector.com>
sub   2048R/9C9CCD6A 2015-10-12 [expires: 2017-10-11]


================================================
FILE: Makefile.am
================================================

### C source files to be built and distributed.

LIBJQ_INCS = src/builtin.h src/bytecode.h src/compile.h                 \
        src/exec_stack.h src/jq_parser.h src/jv_alloc.h src/jv_dtoa.h   \
        src/jv_unicode.h src/jv_utf8_tables.h src/lexer.l src/libm.h    \
        src/linker.h src/locfile.h src/opcode_list.h src/parser.y       \
        src/util.h src/jv_dtoa_tsd.h src/jv_thread.h src/jv_private.h   \
        vendor/decNumber/decContext.h vendor/decNumber/decNumber.h      \
        vendor/decNumber/decNumberLocal.h

LIBJQ_SRC = src/builtin.c src/bytecode.c src/compile.c src/execute.c    \
        src/jq_test.c src/jv.c src/jv_alloc.c src/jv_aux.c              \
        src/jv_dtoa.c src/jv_file.c src/jv_parse.c src/jv_print.c       \
        src/jv_unicode.c src/linker.c src/locfile.c src/util.c          \
        src/jv_dtoa_tsd.c                                               \
        vendor/decNumber/decContext.c vendor/decNumber/decNumber.c      \
        ${LIBJQ_INCS}

### C build options

AM_CFLAGS = -Wextra -Wall -Wno-unused-parameter -Wno-unused-function \
            -Woverlength-strings -Wstrict-prototypes

if WIN32
AM_CFLAGS += -municode
endif

ACLOCAL_AMFLAGS = -I config/m4

### Generating the lexer and parser

# While there is some autoconf macro support for lex/flex, it doesn't support
# header file creation so we'll use good old make
if MAINTAINER_MODE
BUILT_SOURCES = src/lexer.h src/lexer.c src/parser.h src/parser.c \
                src/builtin.inc src/config_opts.inc src/version.h
src/lexer.c: src/lexer.l
	$(AM_V_LEX) flex -o src/lexer.c --header-file=src/lexer.h $<
src/lexer.h: src/lexer.c
else
BUILT_SOURCES = src/builtin.inc src/config_opts.inc src/version.h
.y.c:
	$(AM_V_YACC) echo "NOT building parser.c!"
.l.c:
	$(AM_V_LEX) echo "NOT building lexer.c!"
endif

# Tell YACC (Bison) autoconf macros that you want a header file created.
# If the --warnings=all fails, you probably have an old version of Bison
# macOS ships an old Bison, so update with Homebrew or MacPorts.
AM_YFLAGS = --warnings=all -Wno-yacc -d

### libjq

lib_LTLIBRARIES = libjq.la
libjq_la_SOURCES = ${LIBJQ_SRC}
libjq_la_LIBADD = -lm
libjq_la_LDFLAGS = $(onig_LDFLAGS) -export-symbols-regex '^j[qv]_' -version-info 1:4:0

if WIN32
libjq_la_LIBADD += -lshlwapi
libjq_la_LDFLAGS += -no-undefined
endif

include_HEADERS = src/jv.h src/jq.h

AM_CPPFLAGS = -I$(srcdir)/src -I$(srcdir)/vendor

### Address sanitizer (ASan)

if ENABLE_ASAN
AM_CFLAGS += -fsanitize=address
endif

### Undefined Behavior Sanitizer

if ENABLE_UBSAN
AM_CFLAGS += -fsanitize=undefined
endif

### Code coverage with gcov

if ENABLE_GCOV
AM_CFLAGS += --coverage --no-inline
endif

### Error injection for testing

if ENABLE_ERROR_INJECTION
lib_LTLIBRARIES += libinject_errors.la
libinject_errors_la_SOURCES = src/inject_errors.c
libinject_errors_la_LIBADD = -ldl
libinject_errors_la_LDFLAGS = -module
endif

### Building the jq binary

# Remake the version.h header file if, and only if, the git ID has changed
.PHONY: .FORCE
.FORCE:
generate_ver = ver="`{ $(srcdir)/scripts/version || echo '$(VERSION)' ; } | xargs printf '\043define JQ_VERSION \"%s\"\n'`"
.remake-version-h: .FORCE
	@ $(generate_ver); test "x`cat src/version.h 2>/dev/null`" = "x$$ver" || touch .remake-version-h
src/version.h: .remake-version-h
	mkdir -p src
	$(AM_V_GEN) $(generate_ver); echo "$$ver" > $@
src/config_opts.inc:
	mkdir -p src
	$(AM_V_GEN) if test -x ./config.status; then \
	  ./config.status --config; \
	else echo "(unknown)"; \
	fi | sed -e 's/\\/\\\\/g' -e 's/"/\\"/g' -e 's/^/"/' -e 's/$$/"/' -e 's/^/#define JQ_CONFIG /' > $@
src/main.c: src/version.h src/config_opts.inc

src/builtin.inc: $(srcdir)/src/builtin.jq
	mkdir -p src
	$(AM_V_GEN) od -v -A n -t o1 -- $< | \
	sed -e 's/$$/ /' \
	    -e 's/\([0123456789]\) /\1, /g' \
	    -e 's/ $$//' \
	    -e 's/ 0/  0/g' \
	    -e 's/ \([123456789]\)/ 0\1/g' > $@
src/builtin.o: src/builtin.inc

CLEANFILES = src/version.h .remake-version-h src/builtin.inc src/config_opts.inc

bin_PROGRAMS = jq
jq_SOURCES = src/main.c
jq_LDADD = libjq.la -lm

if ENABLE_ALL_STATIC
jq_LDFLAGS = -all-static
endif

### Tests (make check)

TESTS = tests/mantest tests/jqtest tests/shtest tests/utf8test tests/base64test tests/uritest
if !WIN32
TESTS += tests/optionaltest
endif

AM_TESTS_ENVIRONMENT = JQ=$(abs_builddir)/jq
if ENABLE_VALGRIND
AM_TESTS_ENVIRONMENT += ENABLE_VALGRIND=1
endif

# This is a magic make variable that causes it to treat tests/man.test as a
# DATA-type dependency for the check target. As a result, it will attempt to
# run any defined targets for tests/man.test as a dependency for check. This
# allows us to ensure that the tests are up-to-date if the manual has been updated
check_DATA = tests/man.test

### Building the man tests

# We use the examples in the manual as additional tests, to ensure they always work.
# As a result, we need to rebuild the tests if the manual has been updated.
# Making changes to the manpage without having the python deps means your
# tests won't run. If you aren't making changes to the examples, you probably
# don't care. But if you are, then you need to run the tests anyway.
tests/man.test tests/manonig.test: $(srcdir)/docs/content/manual/dev/manual.yml
if ENABLE_DOCS
	$(AM_V_GEN) ( cd ${abs_srcdir}/docs && \
	  $(PIPENV) run python validate_manual_schema.py content/manual/dev/manual.yml && \
	  $(PIPENV) run python build_mantests.py )
else
	@echo Changes to the manual.yml require docs to be enabled to update the manual test.
	@echo As a result, the manual test is out of date.
endif

### Building the manpage

# We build the docs from the manpage yml. If no changes have been made to the
# manpage, then we'll end up using the cached version. Otherwise, we need to
# rebuild it.
man_MANS = jq.1
jq.1.prebuilt: $(srcdir)/docs/content/manual/dev/manual.yml
if ENABLE_DOCS
	$(AM_V_GEN) ( cd ${abs_srcdir}/docs && \
	  $(PIPENV) run python validate_manual_schema.py content/manual/dev/manual.yml && \
	  $(PIPENV) run python build_manpage.py ) > $@
else
	@echo Changes to the manual.yml require docs to be enabled to update the manpage.
	@echo As a result, the manpage is out of date.
endif

jq.1: jq.1.prebuilt
	$(AM_V_GEN) cp $(srcdir)/jq.1.prebuilt $@

CLEANFILES += jq.1

### Build oniguruma

if BUILD_ONIGURUMA
libjq_la_LIBADD += vendor/oniguruma/src/.libs/libonig.la
jq_LDADD += vendor/oniguruma/src/.libs/libonig.la
SUBDIRS = vendor/oniguruma
endif

AM_CFLAGS += $(onig_CFLAGS)

if WITH_ONIGURUMA
TESTS += tests/onigtest tests/manonigtest
endif

### Packaging

install-binaries: $(BUILT_SOURCES)
	$(MAKE) $(AM_MAKEFLAGS) install-exec

DOC_FILES = docs/content docs/public docs/templates                     \
        docs/Pipfile docs/Pipfile.lock docs/build_manpage.py            \
        docs/build_mantests.py docs/build_website.py docs/README.md     \
        docs/validate_manual_schema.py docs/manual_schema.yml

EXTRA_DIST = $(DOC_FILES) $(man_MANS) $(TESTS) $(TEST_LOG_COMPILER)     \
        jq.1.prebuilt jq.spec src/lexer.c src/lexer.h src/parser.c      \
        src/parser.h src/version.h src/builtin.jq scripts/version       \
        libjq.pc                                                        \
        tests/modules/a.jq tests/modules/b/b.jq tests/modules/c/c.jq    \
        tests/modules/c/d.jq tests/modules/data.json                    \
        tests/modules/home1/.jq tests/modules/home2/.jq/g.jq            \
        tests/modules/lib/jq/e/e.jq tests/modules/lib/jq/f.jq           \
        tests/modules/shadow1.jq tests/modules/shadow2.jq               \
        tests/modules/syntaxerror/syntaxerror.jq                        \
        tests/modules/test_bind_order.jq                                \
        tests/modules/test_bind_order0.jq                               \
        tests/modules/test_bind_order1.jq                               \
        tests/modules/test_bind_order2.jq                               \
        tests/onig.supp tests/local.supp                                \
        tests/setup tests/torture/input0.json                           \
        tests/optional.test tests/man.test tests/manonig.test           \
        tests/jq.test tests/onig.test tests/base64.test tests/uri.test  \
        tests/jq-f-test.sh                                              \
        tests/no-main-program.jq tests/yes-main-program.jq

AM_DISTCHECK_CONFIGURE_FLAGS=--with-oniguruma=builtin

# README.md is expected in GitHub projects, good stuff in it, so we'll
# distribute it and install it with the package in the doc directory.
dist_doc_DATA = README.md NEWS.md COPYING AUTHORS

pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = libjq.pc

RELEASE ?= 1
rpm: dist jq.spec
	@echo "Packaging jq as an RPM ..."
	mkdir -p rpm/SOURCES rpm/BUILD rpm/BUILDROOT rpm/RPMS rpm/SPECS
	cp jq-$(VERSION).tar.gz rpm/SOURCES/
	rpmbuild -tb --define "_topdir ${PWD}/rpm" --define "_prefix /usr" --define "myver $(VERSION)" --define "myrel ${RELEASE}" rpm/SOURCES/jq-$(VERSION).tar.gz
	find rpm/RPMS/ -name "*.rpm" -exec mv {} ./ \;
	rm -rf rpm


================================================
FILE: NEWS.md
================================================
# 1.8.1

This is a patch release to fix security, performance, and build issues found in 1.8.0.
Full commit log can be found at <https://github.com/jqlang/jq/compare/jq-1.8.0...jq-1.8.1>.

## Security fixes

- CVE-2025-49014: Fix heap use after free in `f_strftime`, `f_strflocaltime`.
  @wader 499c91bca9d4d027833bc62787d1bb075c03680e
- GHSA-f946-j5j2-4w5m: Fix stack overflow in `node_min_byte_len` of oniguruma.
  @wader 5e159b34b179417e3e0404108190a2ac7d65611c

## CLI changes

- Fix assertion failure when syntax error happens at the end of the query. @itchyny #3350

## Changes to existing functions

- Fix portability of `strptime/1` especially for Windows. @itchyny #3342

## Language changes

- Revert the change of `reduce`/`foreach` state variable in 1.8.0 (#3205).
  This change was reverted due to serious performance regression. @itchyny #3349

## Documentation changes

- Add LICENSE notice of NetBSD's `strptime()` to COPYING. @itchyny #3344

## Build improvements

- Fix build on old Mac with old sed. @qianbinbin #3336

# 1.8.0

We are pleased to announce the release of version 1.8.0.
This release includes a number of improvements since the last version.
Note that some changes may introduce breaking changes to existing scripts,
so be sure to read the following information carefully.
Full commit log can be found at <https://github.com/jqlang/jq/compare/jq-1.7.1...jq-1.8.0>.

## Releasing

- Change the version number pattern to `1.X.Y` (`1.8.0` instead of `1.8`). @itchyny #2999
- Generate provenance attestations for release artifacts and docker image. @lectrical #3225

  ```sh
  gh attestation verify --repo jqlang/jq jq-linux-amd64
  gh attestation verify --repo jqlang/jq oci://ghcr.io/jqlang/jq:1.8.0
  ```

## Security fixes

- CVE-2024-23337: Fix signed integer overflow in `jvp_array_write` and `jvp_object_rehash`.
  @itchyny de21386681c0df0104a99d9d09db23a9b2a78b1e
  - The fix for this issue now limits the maximum size of arrays and objects to 536870912 (`2^29`) elements.
- CVE-2024-53427: Reject NaN with payload while parsing JSON.
  @itchyny a09a4dfd55e6c24d04b35062ccfe4509748b1dd3
  - The fix for this issue now drops support for NaN with payload in JSON (like `NaN123`).
    Other JSON extensions like `NaN` and `Infinity` are still supported.
- CVE-2025-48060: Fix heap buffer overflow in `jv_string_vfmt`.
  @itchyny c6e041699d8cd31b97375a2596217aff2cfca85b
- Fix use of uninitialized value in `check_literal`. @itchyny #3324
- Fix segmentation fault on `strftime/1`, `strflocaltime/1`. @itchyny #3271
- Fix unhandled overflow in `@base64d`. @emanuele6 #3080

## CLI changes

- Fix `--indent 0` implicitly enabling `--compact-output`. @amarshall @gbrlmarn @itchyny #3232

  ```sh
  $ jq --indent 0 . <<< '{ "foo": ["hello", "world"] }'
  {
  "foo": [
  "hello",
  "world"
  ]
  }
  # Previously, this implied --compact-output, but now outputs with new lines.
  ```

- Improve error messages to show problematic position in the filter. @itchyny #3292

  ```sh
  $ jq -n '1 + $foo + 2'
  jq: error: $foo is not defined at <top-level>, line 1, column 5:
      1 + $foo + 2
          ^^^^
  jq: 1 compile error
  ```

- Include column number in parser and compiler error messages. @liviubobocu #3257
- Fix error message for string literal beginning with single quote. @mattmeyers #2964

  ```sh
  $ jq .foo <<< "{'foo':'bar'}"
  jq: parse error: Invalid string literal; expected ", but got ' at line 1, column 7
  # Previously, the error message was Invalid numeric literal at line 1, column 7.
  ```

- Improve `JQ_COLORS` environment variable to support larger escapes like truecolor. @SArpnt #3282

  ```sh
  JQ_COLORS="38;2;255;173;173:38;2;255;214;165:38;2;253;255;182:38;2;202;255;191:38;2;155;246;255:38;2;160;196;255:38;2;189;178;255:38;2;255;198;255" jq -nc '[null,false,true,42,{"a":"bc"}]'
  ```

- Add `--library-path` long option for `-L`. @thaliaarchi #3194
- Fix `--slurp --stream` when input has no trailing newline character. @itchyny #3279
- Fix `--indent` option to error for malformed values. @thaliaarchi #3195
- Fix option parsing of `--binary` on non-Windows platforms. @calestyo #3131
- Fix issue with `~/.jq` on Windows where `$HOME` is not set. @kirkoman #3114
- Fix broken non-Latin output in the command help on Windows. @itchyny #3299
- Increase the maximum parsing depth for JSON to 10000. @itchyny #3328
- Parse short options in order given. @thaliaarchi #3194
- Consistently reset color formatting. @thaliaarchi #3034

## New functions

- Add `trim/0`, `ltrim/0` and `rtrim/0` to trim leading and trailing white spaces. @wader #3056

  ```sh
  $ jq -n '" hello " | trim, ltrim, rtrim'
  "hello"
  "hello "
  " hello"
  ```

- Add `trimstr/1` to trim string from both ends. @gbrlmarn #3319

  ```sh
  $ jq -n '"foobarfoo" | trimstr("foo")'
  "bar"
  ```

- Add `add/1`. Generator variant of `add/0`. @myaaaaaaaaa #3144

  ```sh
  $ jq -c '.sum = add(.xs[])' <<< '{"xs":[1,2,3]}'
  {"xs":[1,2,3],"sum":6}
  ```

- Add `skip/2` as the counterpart to `limit/2`. @itchyny #3181

  ```sh
  $ jq -nc '[1,2,3,4,5] | [skip(2; .[])]'
  [3,4,5]
  ```

- Add `toboolean/0` to convert strings to booleans. @brahmlower @itchyny #2098

  ```sh
  $ jq -n '"true", "false" | toboolean'
  true
  false
  ```

- Add `@urid` format. Reverse of `@uri`. @fmgornick #3161

  ```sh
  $ jq -Rr '@urid' <<< '%6a%71'
  jq
  ```

## Changes to existing functions

- Use code point index for `indices/1`, `index/1` and `rindex/1`. @wader #3065
  - This is a breaking change. Use `utf8bytelength/0` to get byte index.
- Improve `tonumber/0` performance and rejects numbers with leading or trailing
  white spaces. @itchyny @thaliaarchi #3055 #3195
  - This is a breaking change. Use `trim/0` to remove leading and trailing white spaces.
- Populate timezone data when formatting time. This fixes timezone name in
  `strftime/1`, `strflocaltime/1` for DST. @marcin-serwin @sihde #3203 #3264 #3323
- Preserve numerical precision on unary negation, `abs/0`, `length/0`. @itchyny #3242 #3275
- Make `last(empty)` yield no output values like `first(empty)`. @itchyny #3179
- Make `ltrimstr/1` and `rtrimstr/1` error for non-string inputs. @emanuele6 #2969
- Make `limit/2` error for negative count. @itchyny #3181
- Fix `mktime/0` overflow and allow fewer elements in date-time representation array. @emanuele6 #3070 #3162
- Fix non-matched optional capture group. @wader #3238
- Provide `strptime/1` on all systems. @george-hopkins @fdellwing  #3008 #3094
- Fix `_WIN32` port of `strptime`. @emanuele6 #3071
- Improve `bsearch/1` performance by implementing in C. @eloycoto #2945
- Improve `unique/0` and `unique_by/1` performance. @itchyny @emanuele6 #3254 #3304
- Fix error messages including long string literal not to break Unicode characters. @itchyny #3249
- Remove `pow10/0` as it has been deprecated in glibc 2.27. Use `exp10/0` instead. @itchyny #3059
- Remove private (and undocumented) `_nwise` filter. @itchyny #3260

## Language changes

- Fix precedence of binding syntax against unary and binary operators.
  Also, allow some expressions as object values. @itchyny #3053 #3326
  - This is a breaking change that may change the output of filters with binding syntax as follows.

  ```sh
  $ jq -nc '[-1 as $x | 1,$x]'
  [1,-1]    # previously, [-1,-1]
  $ jq -nc '1 | . + 2 as $x | -$x'
  -3        # previously, -1
  $ jq -nc '{x: 1 + 2, y: false or true, z: null // 3}'
  {"x":3,"y":true,"z":3}    # previously, syntax error
  ```

- Support Tcl-style multiline comments. @emanuele6 #2989

  ```sh
  #!/bin/sh --
  # Can be use to do shebang scripts.
  # Next line will be seen as a comment be of the trailing backslash. \
  exec jq ...
  # this jq expression will result in [1]
  [
    1,
    # \
    2
  ]
  ```

- Fix `foreach` not to break init backtracking with `DUPN`. @kanwren #3266

  ```sh
  $ jq -n '[1, 2] | foreach .[] as $x (0, 1; . + $x)'
  1
  3
  2
  4
  ```

- Fix `reduce`/`foreach` state variable should not be reset each iteration. @itchyny #3205

  ```sh
  $ jq -n 'reduce range(5) as $x (0; .+$x | select($x!=2))'
  8
  $ jq -nc '[foreach range(5) as $x (0; .+$x | select($x!=2); [$x,.])]'
  [[0,0],[1,1],[3,4],[4,8]]
  ```

- Support CRLF line breaks in filters. @itchyny #3274
- Improve performance of repeating strings. @itchyny #3272

## Documentation changes

- Switch the homepage to custom domain [jqlang.org](https://jqlang.org). @itchyny @owenthereal #3243
- Make latest release instead of development version the default manual. @wader #3130
- Add opengraph meta tags. @wader #3247
- Replace jqplay.org with play.jqlang.org @owenthereal #3265
- Add missing line from decNumber's licence to `COPYING`. @emanuele6 #3106
- Various document improvements. @tsibley #3322, @itchyny #3240, @jhcarl0814 #3239,
  @01mf02 #3184, @thaliaarchi #3199, @NathanBaulch #3173, @cjlarose #3164,
  @sheepster1 #3105, #3103, @kishoreinvits #3042, @jbrains #3035, @thalman #3033,
  @SOF3 #3017, @wader #3015, @wllm-rbnt #3002

## Build improvements

- Fix build with GCC 15 (C23). @emanuele6 #3209
- Fix build with `-Woverlength-strings` @emanuele6 #3019
- Fix compiler warning `type-limits` in `found_string`. @itchyny #3263
- Fix compiler error in `jv_dtoa.c` and `builtin.c`. @UlrichEckhardt #3036
- Fix warning: a function definition without a prototype is deprecated. @itchyny #3259
- Define `_BSD_SOURCE` in `builtin.c` for OpenBSD support. @itchyny #3278
- Define empty `JV_{,V}PRINTF_LIKE` macros if `__GNUC__` is not defined. @emanuele6 #3160
- Avoid `ctype.h` abuse: cast `char` to `unsigned char` first. @riastradh #3152
- Remove multiple calls to free when successively calling `jq_reset`. @Sameesunkaria #3134
- Enable IBM z/OS support. @sachintu47 #3277
- Fix insecure `RUNPATH`. @orbea #3212
- Avoid zero-length `calloc`. @itchyny #3280
- Move oniguruma and decNumber to vendor directory. @itchyny #3234

## Test improvements

- Run tests in C locale. @emanuele6 #3039
- Improve reliability of `NO_COLOR` tests. @dag-erling #3188
- Improve `shtest` not to fail if `JQ_COLORS` and `NO_COLOR` are already set. @SArpnt #3283
- Refactor constant folding tests. @itchyny #3233
- Make tests pass when `--disable-decnum`. @nicowilliams 6d02d53f515bf1314d644eee93ba30b0d11c7d2b
- Disable Valgrind by default during testing. @itchyny #3269

# 1.7.1

## Security

- CVE-2023-50246: Fix heap buffer overflow in jvp\_literal\_number\_literal
- CVE-2023-50268: fix stack-buffer-overflow if comparing nan with payload

## CLI changes

- Make the default background color more suitable for bright backgrounds. @mjarosie @taoky @nicowilliams @itchyny #2904
- Allow passing the inline jq script after `--`. @emanuele6 #2919
- Restrict systems operations on OpenBSD and remove unused `mkstemp`. @klemensn #2934
- Fix possible uninitialised value dereference if `jq_init()` fails. @emanuele6 @nicowilliams #2935

## Language changes

- Simplify `paths/0` and `paths/1`. @asheiduk @emanuele6 #2946
- Reject `U+001F` in string literals. @torsten-schenk @itchyny @wader #2911
- Remove unused nref accumulator in `block_bind_library`. @emanuele6 #2914
- Remove a bunch of unused variables, and useless assignments. @emanuele6 #2914
- main.c: Remove unused EXIT\_STATUS\_EXACT option. @emanuele6 #2915
- Actually use the number correctly casted from double to int as index. @emanuele6 #2916
- src/builtin.c: remove unnecessary jv\_copy-s in type\_error/type\_error2. @emanuele6 #2937
- Remove undefined behavior caught by LLVM 10 UBSAN. @Gaelan @emanuele6 #2926
- Convert decnum to binary64 (double) instead of decimal64. This makes jq behave like the JSON specification suggests and more similar to other languages. @wader @leonid-s-usov #2949
- Fix memory leaks on invalid input for `ltrimstr/1` and `rtrimstr/1`. @emanuele6 #2977
- Fix memory leak on failed get for `setpath/2`. @emanuele6 #2970
- Fix nan from json parsing also for nans with payload that start with 'n'. @emanuele6 #2985
- Allow carriage return characters in comments. @emanuele6 #2942 #2984

## Documentation changes

- Generate links in the man page. @emanuele6 #2931
- Standardize arch types to AMD64 & ARM64 from index page download dropdown. @owenthereal #2884

## libjq

- Add extern C for C++. @rockwotj #2953

## Build and test changes

- Fix incorrect syntax for checksum file. @kamontat @wader #2899
- Remove `-dirty` version suffix for windows release build. @itchyny #2888
- Make use of `od` in tests more compatible. @nabijaczleweli @emanuele6 @nicowilliams #2922
- Add dependabot. @yeikel #2889
- Extend fuzzing setup to fuzz parser and JSON serializer. @DavidKorczynski @emanuele6 #2952
- Keep releasing executables with legacy names. @itchyny #2951

# 1.7

After a five year hiatus we're back with a GitHub organization, with new admins and new maintainers who have brought a great deal of energy to make a long-awaited and long-needed new release.  We're very grateful for all the new owners, admins, and maintainers.  Special thanks go to Owen Ou (@owenthereal) for pushing to set up a new GitHub organization for jq, Stephen Dolan (@stedolan) for transferring the jq repository to the new organization, @itchyny for doing a great deal of work to get the release done, Mattias Wadman (@wader) and Emanuele Torre (@emanuele6) for many PRs and code reviews.  Many others also contributed PRs, issues, and code reviews as well, and you can find their contributions in the Git log and on the [closed issues and PRs page](https://github.com/jqlang/jq/issues?q=is%3Aclosed+sort%3Aupdated-desc).

Since the last stable release many things have happened:

- jq now lives at <https://github.com/jqlang>
- New maintainers, admins, and owners have been recruited.
  - A list of [current maintainers](https://github.com/jqlang/jq/blob/jq-1.7/AUTHORS#L4-L14)
- NEWS file is replaced by NEWS.md with Markdown format. @wader #2599
- CI, scan builds, release, website builds etc now use GitHub actions. @owenthereal @wader @itchyny #2596 #2603 #2620 #2723
- Lots of documentation improvements and fixes.
- Website updated with new section search box, better section ids for linking, dark mode, etc. @itchyny #2628
- Release builds for:
  - Linux `amd64`, `arm64`, `armel`, `armhf`, `i386`, `mips`, `mips64`, `mips64el`, `mips64r6`, `mips64r6el`, `mipsel`, `mipsr6`, `mipsr6el`, `powerpc`, `ppc64el`, `riscv64` and `s390x`
  - macOS `amd64` and `arm64`
  - Windows `i386` and `amd64`
  - Docker `linux/386`, `linux/amd64`, `linux/arm64`, `linux/mips64le`, `linux/ppc64le`, `linux/riscv64` and `linux/s390x`
  - More details see @owenthereal #2665
- Docker images are now available from `ghcr.io/jqlang/jq` instead of Docker Hub. @itchyny #2652 #2686
- OSS-fuzz. @DavidKorczynski #2760 #2762

Full commit log can be found at <https://github.com/jqlang/jq/compare/jq-1.6...jq-1.7> but here are some highlights:

## CLI changes

- Make object key color configurable using `JQ_COLORS` environment variable. @itchyny @haguenau @ericpruitt #2703

  ```sh
  # this would make "field" bold yellow (`1;33`, the last value)
  $ JQ_COLORS="0;90:0;37:0;37:0;37:0;32:1;37:1;37:1;33" ./jq -n '{field: 123}'
  {
    "field": 123
  }
  ```

- Change the default color of null to Bright Black. @itchyny #2824
- Respect `NO_COLOR` environment variable to disable color output. See <https://no-color.org> for details. @itchyny #2728
- Improved `--help` output. Now mentions all options and nicer order. @itchyny @wader #2747 #2766 #2799
- Fix multiple issues of exit code using `--exit-code`/`-e` option. @ryo1kato #1697

  ```sh
  # true-ish last output value exits with zero
  $ jq -ne true ; echo $?
  true
  0
  # false-ish last output value (false and null) exits with 1
  $ jq -ne false ; echo $?
  false
  1
  # no output value exists with 4
  $ jq -ne empty ; echo $?
  4
  ```

- Add `--binary`/`-b` on Windows for binary output. To get `\n` instead of `\r\n` line endings. @nicowilliams 0dab2b1
- Add `--raw-output0` for NUL (zero byte) separated output. @asottile @pabs3 @itchyny #1990 #2235 #2684

  ```sh
  # will output a zero byte after each output
  $ jq -n --raw-output0 '1,2,3' | xxd
  00000000: 3100 3200 3300                           1.2.3.
  # can be used with xargs -0
  $ jq -n --raw-output0 '"a","b","c"' | xargs -0 -n1
  a
  b
  c
  $ jq -n --raw-output0 '"a b c", "d\ne\nf"' | xargs -0 printf '[%s]\n'
  [a b c]
  [d
  e
  f]
  # can be used with read -d ''
  $ while IFS= read -r -d '' json; do
  >   jq '.name' <<< "$json"
  > done < <(jq -n --raw-output0 '{name:"a b c"},{name:"d\ne\nf"}')
  "a b c"
  "d\ne\nf"
  # also it's an error to output a string containing a NUL when using NUL separator
  $ jq -n --raw-output0 '"\u0000"'
  jq: error (at <unknown>): Cannot dump a string containing NUL with --raw-output0 option
  ```

- Fix assert crash and validate JSON for `--jsonarg`. @wader #2658
- Remove deprecated `--argfile` option. @itchyny #2768
- Enable stack protection. @nicowilliams #2801

## Language changes

- Use decimal number literals to preserve precision. Comparison operations respects precision but arithmetic operations might truncate. @leonid-s-usov #1752

  ```sh
  # precision is preserved
  $ echo '100000000000000000' | jq .
  100000000000000000
  # comparison respects precision (this is false in JavaScript)
  $ jq -n '100000000000000000 < 100000000000000001'
  true
  # sort/0 works
  $ jq -n -c '[100000000000000001, 100000000000000003, 100000000000000004, 100000000000000002] | sort'
  [100000000000000001,100000000000000002,100000000000000003,100000000000000004]
  # arithmetic operations might truncate (same as JavaScript)
  $ jq -n '100000000000000000 + 10'
  100000000000000020
  ```

- Adds new builtin `pick(stream)` to emit a projection of the input object or array. @pkoppstein #2656 #2779

  ```sh
  $ jq -n '{"a": 1, "b": {"c": 2, "d": 3}, "e": 4} | pick(.a, .b.c, .x)'
  {
    "a": 1,
    "b": {
      "c": 2
    },
    "x": null
  }
  ```

- Adds new builtin `debug(msgs)` that works like `debug` but applies a filter on the input before writing to stderr. @pkoppstein #2710

  ```sh
  $ jq -n '1 as $x | 2 | debug("Entering function foo with $x == \($x)", .) | (.+1)'
  ["DEBUG:","Entering function foo with $x == 1"]
  ["DEBUG:",2]
  3
  $ jq -n '{a: 1, b: 2, c: 3} | debug({a, b, sum: (.a+.b)})'
  ["DEBUG:",{"a":1,"b":2,"sum":3}]
  {
    "a": 1,
    "b": 2,
    "c": 3
  }
  ```

- Adds new builtin `scan($re; $flags)`. Was documented but not implemented. @itchyny #1961

  ```sh
  # look for pattern "ab" in "abAB" ignoring casing
  $ jq -n '"abAB" | scan("ab"; "i")'
  "ab"
  "AB"
  ```

- Adds new builtin `abs` to get absolute value. This potentially allows the literal value of numbers to be preserved as `length` and `fabs` convert to float. @pkoppstein #2767
- Allow `if` without `else`-branch. When skipped the `else`-branch will be `.` (identity). @chancez @wader #1825 #2481

  ```sh
  # convert 1 to "one" otherwise keep as is
  $ jq -n '1,2 | if . == 1 then "one" end'
  "one"
  2
  # behaves the same as
  $ jq -n '1,2 | if . == 1 then "one" else . end'
  "one"
  2
  # also works with elif
  $ jq -n '1,2,3 | if . == 1 then "one" elif . == 2 then "two" end
  "one"
  "two"
  3
  ```

- Allow use of `$binding` as key in object literals. @nicowilliams 8ea4a55

  ```sh
  $ jq -n '"a" as $key | {$key: 123}'
  {
    "a": 123
  }
  # previously parentheses were needed
  $ jq -n '"a" as $key | {($key): 123}'
  {
    "a": 123
  }
  ```

- Allow dot between chained indexes when using `.["index"]` @nicowilliams #1168

  ```sh
  $ jq -n '{"a": {"b": 123}} | .a["b"]'
  123
  # now this also works
  $ jq -n '{"a": {"b": 123}} | .a.["b"]'
  123
  ```

- Allow dot for chained value iterator `.[]`, `.[]?` @wader #2650

  ```sh
  $ jq -n '{"a": [123]} | .a[]'
  123
  # now this also works
  $ jq -n '{"a": [123]} | .a.[]'
  123
  ```

- Fix try/catch catches more than it should. @nicowilliams #2750
- Speed up and refactor some builtins, also remove `scalars_or_empty/0`. @muhmuhten #1845
- Now `halt` and `halt_error` exit immediately instead of continuing to the next input. @emanuele6 #2667
- Fix issue converting string to number after previous convert error. @thalman #2400
- Fix issue representing large numbers on some platforms causing invalid JSON output. @itchyny #2661
- Fix deletion using assigning empty against arrays. @itchyny #2133

  ```sh
  # now this works as expected, filter out all values over 2 by assigning empty
  $ jq -c '(.[] | select(. >= 2)) |= empty' <<< '[1,5,3,0,7]'
  [1,0]
  ```

- Allow keywords to be used as binding name in more places. @emanuele6 #2681
- Allow using `nan` as NaN in JSON. @emanuele6 #2712
- Expose a module's function names in `modulemeta`. @mrwilson #2837
- Fix `contains/1` to handle strings with NUL. @nicowilliams 61cd6db
- Fix `stderr/0` to output raw text without any decoration. @itchyny #2751
- Fix `nth/2` to emit empty on index out of range. @itchyny #2674
- Fix `implode` to not assert and instead replace invalid Unicode codepoints. @wader #2646
- Fix `indices/1` and `rindex/1` in case of overlapping matches in strings. @emanuele6 #2718
- Fix `sub/3` to resolve issues involving global search-and-replace (gsub) operations. @pkoppstein #2641
- Fix `significand/0`, `gamma/0` and `drem/2` to be available on macOS. @itchyny #2756 #2775
- Fix empty regular expression matches. @itchyny #2677
- Fix overflow exception of the modulo operator. @itchyny #2629
- Fix string multiplication by 0 (and less than 1) to emit empty string. @itchyny #2142
- Fix segfault when using libjq and threads. @thalman #2546
- Fix constant folding of division and reminder with zero divisor. @itchyny #2797
- Fix `error/0`, `error/1` to throw null error. @emanuele6 #2823
- Simpler and faster `transpose`. @pkoppstein #2758
- Simple and efficient implementation of `walk/1`. @pkoppstein #2795
- Remove deprecated filters `leaf_paths`, `recurse_down`. @itchyny #2666

# Previous releases

Release history

- jq version 1.6 was released on Fri Nov 2 2018
- jq version 1.5 was released on Sat Aug 15 2015
- jq version 1.4 was released on Mon Jun 9 2014
- jq version 1.3 was released on Sun May 19 2013
- jq version 1.2 was released on Thu Dec 20 2012
- jq version 1.1 was released on Sun Oct 21 2012
- jq version 1.0 was released on Sun Oct 21 2012

New features in 1.6 since 1.5:

- Destructuring Alternation

- New Builtins:
  - builtins/0
  - stderr/0
  - halt/0, halt_error/1
  - isempty/1
  - walk/1
  - utf8bytelength/1
  - localtime/0, strflocaltime/1
  - SQL-style builtins
  - and more!

- Add support for ASAN and UBSAN

- Make it easier to use jq with shebangs (8f6f28c)

- Add $ENV builtin variable to access environment

- Add JQ_COLORS env var for configuring the output colors

New features in 1.5 since 1.4:

- regular expressions (with Oniguruma)

- a library/module system

- many new builtins

  - datetime builtins
  - math builtins
  - regexp-related builtins
  - stream-related builtins (e.g., all/1, any/1)
  - minimal I/O builtins (`inputs`, `debug`)

- new syntactic features, including:

  - destructuring (`. as [$first, $second] | ...`)
  - try/catch, generalized `?` operator, and label/break
  - `foreach`
  - multiple definitions of a function with different numbers of
      arguments

- command-line arguments

  - --join-lines / -j for raw output
  - --argjson and --slurpfile
  - --tab and --indent
  - --stream (streaming JSON parser)
  - --seq (RFC7464 JSON text sequence)
  - --run-tests improvements

- optimizations:

  - tail-call optimization
  - reduce and foreach no longer leak a reference to .

New features in 1.4 since 1.3:

- command-line arguments

  - jq --arg-file variable file
  - jq --unbuffered
  - jq -e / --exit-status (set exit status based on outputs)
  - jq -S / --sort-keys (now jq no longer sorts object keys by
      default

- syntax

  - .. -> like // in XPath (recursive traversal)
  - question mark (e.g., .a?) to suppress errors
  - ."foo" syntax (equivalent to .["foo"])
  - better error handling for .foo
  - added % operator (modulo)
  - allow negation without requiring extra parenthesis
  - more function arguments (up to six)

- filters:

  - any, all
  - iterables, arrays, objects, scalars, nulls, booleans, numbers,
      strings, values

- string built-ins:

  - split
  - join (join an array of strings with a given separator string)
  - ltrimstr, rtrimstr
  - startswith, endswith
  - explode, implode
  - fromjson, tojson
  - index, rindex, indices

- math functions

  - floor, sqrt, cbrt, etcetera (depends on what's available from libm)

- libjq -- a C API interface to jq's JSON representation and for
   running jq programs from C applications


================================================
FILE: README.md
================================================
# jq

`jq` is a lightweight and flexible command-line JSON processor akin to `sed`,`awk`,`grep`, and friends for JSON data. It's written in portable C and has zero runtime dependencies, allowing you to easily slice, filter, map, and transform structured data.

## Documentation

- **Official Documentation**: [jqlang.org](https://jqlang.org)
- **Try jq Online**: [play.jqlang.org](https://play.jqlang.org)

## Installation

### Prebuilt Binaries

Download the latest releases from the [GitHub release page](https://github.com/jqlang/jq/releases).

### Docker Image

Pull the [jq image](https://github.com/jqlang/jq/pkgs/container/jq) to start quickly with Docker.

#### Run with Docker

##### Example: Extracting the version from a `package.json` file

```bash
docker run --rm -i ghcr.io/jqlang/jq:latest < package.json '.version'
```

##### Example: Extracting the version from a `package.json` file with a mounted volume

```bash
docker run --rm -i -v "$PWD:$PWD" -w "$PWD" ghcr.io/jqlang/jq:latest '.version' package.json
```

### Building from source

#### Dependencies

- libtool
- make
- automake
- autoconf

#### Instructions

```console
git submodule update --init    # if building from git to get oniguruma
autoreconf -i                  # if building from git
./configure --with-oniguruma=builtin
make clean                     # if upgrading from a version previously built from source
make -j8
make check
sudo make install
```

Build a statically linked version:

```console
make LDFLAGS=-all-static
```

If you're not using the latest git version but instead building a released tarball (available on the release page), skip the `autoreconf` step, and flex or bison won't be needed.

##### Cross-Compilation

For details on cross-compilation, check out the [GitHub Actions file](.github/workflows/ci.yml) and the [cross-compilation wiki page](https://github.com/jqlang/jq/wiki/Cross-compilation).

## Community & Support

- Questions & Help: [Stack Overflow (jq tag)](https://stackoverflow.com/questions/tagged/jq)
- Chat & Community: [Join us on Discord](https://discord.gg/yg6yjNmgAC)
- Wiki & Advanced Topics: [Explore the Wiki](https://github.com/jqlang/jq/wiki)

## License

`jq` is released under the [MIT License](COPYING). `jq`'s documentation is
licensed under the [Creative Commons CC BY 3.0](COPYING).
`jq` uses parts of the open source C library "decNumber", which is distributed
under [ICU License](COPYING)


================================================
FILE: SECURITY.md
================================================
# How to report security vulnerabilities in `jq`

GitHub has a [mechanism for private disclosure of vulnerabilities](https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing/privately-reporting-a-security-vulnerability) to repository owners and authorized persons such as maintainers.  The `jqlang/jq` repository now has this feature enabled.

## Reporting a Vulnerability

See [Privately Reporting a Security Vulnerability](https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing/privately-reporting-a-security-vulnerability).  Click on [`jqlang/jq`](https://github.com/jqlang/jq)'s [Security page](https://github.com/jqlang/jq/security) and click on [Report a vulnerability](https://github.com/jqlang/jq/security/advisories/new).  This will notify the owners and maintainers.  After submitting you'll get an option to start a private clone of `jqlang/jq` for collaboration with the maintainers.


================================================
FILE: compile-ios.sh
================================================
#!/usr/bin/env bash
# Mac C. compile-ios.sh for JQ.

# Defaults
set -e
oniguruma='6.9.10'

unset CFLAGS
unset CXXFLAGS
unset LDFLAGS

# Parse args. 
usage(){
cat << EOF
${0##*/}: usage

    Description:
       This simple script builds oniguruma and jq for all *-apple-darwin devices.

    Arguments:
    --extra-cflags <arg>: Pass defines or includes to clang.
    --extra-ldflags <arg>: Pass libs or includes to ld64.

    --with-oniguruma <arg>: Change default version of onigurma from ${oniguruma}.
EOF
exit 1
}

while (( $# )); do
   case "$1" in
      --with-oniguruma) shift; oniguruma="${1}" ;;

      --extra-cflags) shift; export CFLAGS_="${1}" ;;
      --extra-ldflags) shift; export LDFLAGS_="${1}" ;;

      --help) usage ;;
      *) echo -e "Unknown option: ${1}\n"; usage ;;
   esac
   shift
done 

# Start building.
echo "Building..."
MAKEJOBS="$(sysctl -n hw.ncpu || echo 1)"
CC_="$(xcrun -f clang || echo clang)"

onig_url="https://github.com/kkos/oniguruma/releases/download/v${oniguruma}/onig-${oniguruma}.tar.gz"
builddir="${TMPDIR:-/tmp}/${RANDOM:-'xxxxx'}-compile-ios-build"
cwd="$(realpath ${PWD} 2>/dev/null || echo ${PWD})"

t_exit() {
cat << EOF

A error as occurred.
    oniguruma location: ${builddir}/onig/onig-${oniguruma}
    jq location: ${cwd}

    Provide config.log and console logs when posting a issue.

EOF
}
trap t_exit ERR

#  Onig.
mkdir -p "${builddir}/onig"
cd "${builddir}/"
 curl -L ${onig_url} | tar xz
 for arch in i386 x86_64 armv7 armv7s arm64; do
     if [[ "$arch" = "i386" || "$arch" = "x86_64" ]]; then
         SYSROOT=$(xcrun -f --sdk iphonesimulator --show-sdk-path)
     else
         SYSROOT=$(xcrun -f --sdk iphoneos --show-sdk-path)
     fi
     HOST="${arch}-apple-darwin"
     [[ "${arch}" = "arm64" ]] && HOST="aarch64-apple-darwin"

     CFLAGS="-arch ${arch} -miphoneos-version-min=9.0 -isysroot ${SYSROOT} ${CFLAGS_} -D_REENTRANT"
     LDFLAGS="-arch ${arch} -miphoneos-version-min=9.0 -isysroot ${SYSROOT} ${LDFLAGS_}"
     CC="${CC_} ${CFLAGS}"

     # ./configure; make install
     cd "${builddir}/onig-${oniguruma}"
     CC=${CC} LDFLAGS=${LDFLAGS} \
     ./configure --host=${HOST} --build=$(./config.guess) --enable-shared=no --enable-static=yes --prefix=/
     make -j${MAKEJOBS} install DESTDIR="${cwd}/ios/onig/${arch}"
     make clean
     
     # Jump back to JQ.
     cd ${cwd}
     [[ ! -f ./configure ]] && autoreconf -ivf
     CC=${CC} LDFLAGS=${LDFLAGS} \
     ./configure --host=${HOST} --build=$(./config/config.guess) --enable-docs=no --enable-shared=no --enable-static=yes --prefix=/ --with-oniguruma=${cwd}/ios/onig/${arch} $(test -z ${BISON+x} || echo '--enable-maintainer-mode')
     make -j${MAKEJOBS} install DESTDIR="${cwd}/ios/jq/${arch}"
     make clean
 done

mkdir -p "${cwd}/ios/dest/lib"
# lipo, make a static lib.
lipo -create -output ${cwd}/ios/dest/lib/libonig.a ${cwd}/ios/onig/{i386,x86_64,armv7,armv7s,arm64}/lib/libonig.a
lipo -create -output ${cwd}/ios/dest/lib/libjq.a ${cwd}/ios/jq/{i386,x86_64,armv7,armv7s,arm64}/lib/libjq.a

# Take the arm64 headers- the most common target.
cp -r ${cwd}/ios/jq/arm64/include ${cwd}/ios/dest/
rm -rf ${cwd}/build/ios/{i386,x86_64,armv7,armv7s,arm64}

echo "Output to ${cwd}/ios/dest"


================================================
FILE: config/.gitignore
================================================
config.guess
config.sub
compile
depcomp
install-sh
ltmain.sh
missing
ylwrap
test-driver
ar-lib


================================================
FILE: config/m4/.gitignore
================================================
libtool.m4
lt*.m4

================================================
FILE: config/m4/check-math-func.m4
================================================
dnl AC_CHECK_MATH_FUNC(func)
AC_DEFUN([AC_CHECK_MATH_FUNC], [
  AC_LANG(C)
  AC_CHECK_LIB([m],[$1],[
    m4_define([ac_tr_func], [HAVE_]m4_toupper($1))
    AC_DEFINE(ac_tr_func, 1, [Define if you have the $1 math function.])
  ],[
  ])
])


================================================
FILE: config/m4/find-func-no-libs.m4
================================================
dnl Shamelessly stolen from Heimdal
dnl
dnl Look for function in any of the specified libraries
dnl

dnl AC_FIND_FUNC_NO_LIBS(func, libraries, includes, arguments, extra libs, extra args)
AC_DEFUN([AC_FIND_FUNC_NO_LIBS], [
AC_FIND_FUNC_NO_LIBS2([$1], ["" $2], [$3], [$4], [$5], [$6])])


================================================
FILE: config/m4/find-func-no-libs2.m4
================================================
dnl Shamelessly stolen from Heimdal
dnl
dnl Look for function in any of the specified libraries
dnl

dnl AC_FIND_FUNC_NO_LIBS2(func, libraries, includes, arguments, extra libs, extra args)
AC_DEFUN([AC_FIND_FUNC_NO_LIBS2], [

AC_MSG_CHECKING([for $1])
AC_CACHE_VAL(ac_cv_funclib_$1,
[
if eval "test \"\$ac_cv_func_$1\" != yes" ; then
	ac_save_LIBS="$LIBS"
	for ac_lib in $2; do
		case "$ac_lib" in
		"") ;;
		yes) ac_lib="" ;;
		no) continue ;;
		-l*) ;;
		*) ac_lib="-l$ac_lib" ;;
		esac
		LIBS="$6 $ac_lib $5 $ac_save_LIBS"
		AC_LINK_IFELSE([AC_LANG_PROGRAM([[$3]],[[$1($4)]])],[eval "if test -n \"$ac_lib\";then ac_cv_funclib_$1=$ac_lib; else ac_cv_funclib_$1=yes; fi";break])
	done
	eval "ac_cv_funclib_$1=\${ac_cv_funclib_$1-no}"
	LIBS="$ac_save_LIBS"
fi
])

eval "ac_res=\$ac_cv_funclib_$1"

if false; then
	AC_CHECK_FUNCS($1)
dnl	AC_CHECK_LIBS($2, foo)
fi
# $1
eval "ac_tr_func=HAVE_[]upcase($1)"
eval "ac_tr_lib=HAVE_LIB[]upcase($ac_res | sed -e 's/-l//')"
eval "LIB_$1=$ac_res"

case "$ac_res" in
	yes)
	eval "ac_cv_func_$1=yes"
	eval "LIB_$1="
	AC_DEFINE_UNQUOTED($ac_tr_func, 1, [Define if the $1 function is available.])
	AC_MSG_RESULT([yes])
	;;
	no)
	eval "ac_cv_func_$1=no"
	eval "LIB_$1="
	AC_MSG_RESULT([no])
	;;
	*)
	eval "ac_cv_func_$1=yes"
	eval "ac_cv_lib_`echo "$ac_res" | sed 's/-l//'`=yes"
	AC_DEFINE_UNQUOTED($ac_tr_func, 1, [Define if you have the $1 function.])
	AC_DEFINE_UNQUOTED($ac_tr_lib, 1, [Define if you have the $2 library.])
	AC_MSG_RESULT([yes, in $ac_res])
	;;
esac
AC_SUBST(LIB_$1)
])


================================================
FILE: config/m4/find-func.m4
================================================
dnl Shamelessly stolen from Heimdal
dnl
dnl AC_FIND_FUNC(func, libraries, includes, arguments)
AC_DEFUN([AC_FIND_FUNC], [
AC_FIND_FUNC_NO_LIBS([$1], [$2], [$3], [$4])
if test -n "$LIB_$1"; then
	LIBS="$LIB_$1 $LIBS"
fi
])


================================================
FILE: config/m4/misc.m4
================================================

dnl Shamelessly stolen from Heimdal
AC_DEFUN([upcase],[`echo $1 | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`])dnl


================================================
FILE: configure.ac
================================================
m4_define([jq_version], m4_esyscmd_s([scripts/version])))

AC_INIT([jq],[jq_version],[https://github.com/jqlang/jq/issues],[jq],[https://jqlang.org])

dnl Created autoconf implementation thompson@dtosolutions, 26NOV12
AC_PREREQ([2.65])
AC_CONFIG_AUX_DIR([config])
AC_USE_SYSTEM_EXTENSIONS
AM_INIT_AUTOMAKE([1.11.2 subdir-objects parallel-tests foreign -Wall])
AM_SILENT_RULES([yes])
AM_PROG_AR
AM_MAINTAINER_MODE([disable])
AC_PROG_CC
m4_version_prereq([2.70], [], [AC_PROG_CC_STDC])
AC_PROG_CPP_WERROR
AC_PROG_YACC
AC_OBJEXT
AC_EXEEXT
LT_INIT([shared static win32-dll])
AM_PROG_CC_C_O

AC_SYS_LARGEFILE # issue 2167

dnl couldn't use AM_PROG_LEX as it doesn't support header files like the
dnl AC_PROG_YACC macros...

dnl check bison version

if test "$USE_MAINTAINER_MODE" = yes; then
  if test "$YACC" != "bison -y"; then
    AC_MSG_CHECKING([bison version])
    AC_MSG_RESULT([not bison])
  else
    AX_PROG_BISON_VERSION([3],
      [],
      [AC_MSG_ERROR([You need bison version 3.0 or greater])])
  fi

  AC_CHECK_PROGS(LEX, flex lex)
fi

AC_CHECK_FUNCS(memmem)

AC_CHECK_HEADER("sys/cygwin.h", [have_cygwin=1;])
AC_CHECK_HEADER("shlwapi.h",[have_shlwapi=1;])
AM_CONDITIONAL([WIN32], [test "x$have_shlwapi" = x1 && test ! "x$have_cygwin" = x1])

dnl Running tests with Valgrind is slow. It is faster to iterate on
dnl code without Valgrind until tests pass, then enable Valgrind and
dnl fix leaks.
AC_ARG_ENABLE([valgrind],
   AS_HELP_STRING([--enable-valgrind],[enable Valgrind during testing]))

dnl Address sanitizer (ASan)
AC_ARG_ENABLE([asan],
   AS_HELP_STRING([--enable-asan],[enable address sanitizer]))

dnl Undefined Behavior Sanitizer
AC_ARG_ENABLE([ubsan],
   AS_HELP_STRING([--enable-ubsan],[enable undefined behavior sanitizer]))

dnl Code coverage
AC_ARG_ENABLE([gcov],
   AS_HELP_STRING([--enable-gcov],[enable gcov code coverage tool]))

dnl Don't attempt to build docs if python deps aren't installed
AC_ARG_ENABLE([docs],
   AS_HELP_STRING([--disable-docs],[do not build docs]), [], [enable_docs=yes])

dnl Don't attempt to build the error injection object (if there is no LD_PRELOAD support)
AC_ARG_ENABLE([error-injection],
   AS_HELP_STRING([--enable-error-injection],[build and test with error injection]))

dnl Enable building all static
AC_ARG_ENABLE([all-static],
   AS_HELP_STRING([--enable-all-static],[link jq with static libraries only]))

dnl find pipenv
AC_ARG_VAR([PIPENV], [pipenv command])
AC_CHECK_PROGS([PIPENV], pipenv)

AS_IF([test "x$enable_docs" != "xno"],[
   AC_CACHE_CHECK([for Python dependencies], [jq_cv_python_deps],[
      jq_cv_python_deps=yes
      AS_IF([test "x$PIPENV" = "x" || \
      ! bmsg="`cd ${srcdir}/docs; LC_ALL=$LANG "$PIPENV" --venv`"],[
         jq_cv_python_deps=no
      ])
   ])

   AS_IF([test "x$jq_cv_python_deps" != "xyes"], [
      AC_MSG_WARN([Error checking python dependencies: $bmsg
*****************************************************************
*  Python dependencies for building jq documentation not found. *
*  You can still build, install and hack on jq, but the manpage *
*  will not be rebuilt and new manpage tests will not be run.   *
*  See docs/README.md for how to install the docs dependencies. *
*****************************************************************])
      enable_docs=no
   ])
])

dnl Disable decNumber support
AC_ARG_ENABLE([decnum],
   AS_HELP_STRING([--disable-decnum],[disable decnum support]))

AS_IF([test "x$enable_decnum" != "xno"],[
   AC_DEFINE([USE_DECNUM], 1, [Define to enable decnum support.])
])

AM_CONDITIONAL([ENABLE_VALGRIND], [test "x$enable_valgrind" = xyes])
AM_CONDITIONAL([ENABLE_ASAN], [test "x$enable_asan" = xyes])
AM_CONDITIONAL([ENABLE_UBSAN], [test "x$enable_ubsan" = xyes])
AM_CONDITIONAL([ENABLE_GCOV], [test "x$enable_gcov" = xyes])
AM_CONDITIONAL([ENABLE_DOCS], [test "x$enable_docs" != xno])
AM_CONDITIONAL([ENABLE_ERROR_INJECTION], [test "x$enable_error_injection" = xyes])
AM_CONDITIONAL([ENABLE_ALL_STATIC], [test "x$enable_all_static" = xyes])

dnl Find pthread, if we have it. We do this first because we may set -pthread on CFLAGS
dnl which can cause various macros to be defined (__REENTRANT on Darwin, for example)
AX_PTHREAD([
   AC_DEFINE([HAVE_PTHREAD], [1], [Define to enable POSIX threads support.])
   LIBS="$PTHREAD_LIBS $LIBS"
   CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
   CC="$PTHREAD_CC"
])

AC_FUNC_ALLOCA

AC_FIND_FUNC([isatty], [c], [#include <unistd.h>], [0])
AC_FIND_FUNC([_isatty], [c], [#include <io.h>], [0])
AC_FIND_FUNC([strptime], [c], [#include <time.h>], [0, 0, 0])
AC_FIND_FUNC([strftime], [c], [#include <time.h>], [0, 0, 0, 0])
AC_FIND_FUNC([setenv], [c], [#include <stdlib.h>], [0, 0, 0])
AC_FIND_FUNC([timegm], [c], [#include <time.h>], [0])
AC_FIND_FUNC([gmtime_r], [c], [#include <time.h>], [0, 0])
AC_FIND_FUNC([gmtime], [c], [#include <time.h>], [0])
AC_FIND_FUNC([localtime_r], [c], [#include <time.h>], [0, 0])
AC_FIND_FUNC([localtime], [c], [#include <time.h>], [0])
AC_FIND_FUNC([gettimeofday], [c], [#include <sys/time.h>], [0, 0])
AC_CHECK_MEMBER([struct tm.tm_gmtoff], [AC_DEFINE([HAVE_TM_TM_GMT_OFF],1,[Define to 1 if the system has the tm_gmt_off field in struct tm])],
                [], [[#include <time.h>]])
AC_CHECK_MEMBER([struct tm.__tm_gmtoff], [AC_DEFINE([HAVE_TM___TM_GMT_OFF],1,[Define to 1 if the system has the __tm_gmt_off field in struct tm])],
                [], [[#include <time.h>]])
AC_FIND_FUNC([setlocale], [c], [#include <locale.h>], [0,0])

dnl Figure out if we have the pthread functions we actually need
AC_FIND_FUNC_NO_LIBS([pthread_key_create], [], [#include <pthread.h>], [NULL, NULL])
AC_FIND_FUNC_NO_LIBS([pthread_once], [], [#include <pthread.h>], [NULL, NULL])
AC_FIND_FUNC_NO_LIBS([atexit], [], [#include <stdlib.h>], [NULL])

dnl libm math.h functions
AC_CHECK_MATH_FUNC(acos)
AC_CHECK_MATH_FUNC(acosh)
AC_CHECK_MATH_FUNC(asin)
AC_CHECK_MATH_FUNC(asinh)
AC_CHECK_MATH_FUNC(atan2)
AC_CHECK_MATH_FUNC(atan)
AC_CHECK_MATH_FUNC(atanh)
AC_CHECK_MATH_FUNC(cbrt)
AC_CHECK_MATH_FUNC(ceil)
AC_CHECK_MATH_FUNC(copysign)
AC_CHECK_MATH_FUNC(cos)
AC_CHECK_MATH_FUNC(cosh)
AC_CHECK_MATH_FUNC(drem)
AC_CHECK_MATH_FUNC(erf)
AC_CHECK_MATH_FUNC(erfc)
AC_CHECK_MATH_FUNC(exp10)
AC_CHECK_MATH_FUNC(__exp10) dnl macOS has an __exp10
AC_CHECK_MATH_FUNC(exp2)
AC_CHECK_MATH_FUNC(exp)
AC_CHECK_MATH_FUNC(expm1)
AC_CHECK_MATH_FUNC(fabs)
AC_CHECK_MATH_FUNC(fdim)
AC_CHECK_MATH_FUNC(floor)
AC_CHECK_MATH_FUNC(fma)
AC_CHECK_MATH_FUNC(fmax)
AC_CHECK_MATH_FUNC(fmin)
AC_CHECK_MATH_FUNC(fmod)
AC_CHECK_MATH_FUNC(frexp)
AC_CHECK_MATH_FUNC(gamma)
AC_CHECK_MATH_FUNC(hypot)
AC_CHECK_MATH_FUNC(j0)
AC_CHECK_MATH_FUNC(j1)
AC_CHECK_MATH_FUNC(jn)
AC_CHECK_MATH_FUNC(ldexp)
AC_CHECK_MATH_FUNC(lgamma)
AC_CHECK_MATH_FUNC(log10)
AC_CHECK_MATH_FUNC(log1p)
AC_CHECK_MATH_FUNC(log2)
AC_CHECK_MATH_FUNC(log)
AC_CHECK_MATH_FUNC(logb)
AC_CHECK_MATH_FUNC(modf)
AC_CHECK_MATH_FUNC(lgamma_r)
AC_CHECK_MATH_FUNC(nearbyint)
AC_CHECK_MATH_FUNC(nextafter)
AC_CHECK_MATH_FUNC(nexttoward)
AC_CHECK_MATH_FUNC(pow)
AC_CHECK_MATH_FUNC(remainder)
AC_CHECK_MATH_FUNC(rint)
AC_CHECK_MATH_FUNC(round)
AC_CHECK_MATH_FUNC(scalb)
AC_CHECK_MATH_FUNC(scalbln)
AC_CHECK_MATH_FUNC(significand)
dnl scalbn and ilogb are used on macos to replace significand if we don't have frexp
AC_CHECK_MATH_FUNC(scalbn)
AC_CHECK_MATH_FUNC(ilogb)

AC_CHECK_MATH_FUNC(sin)
AC_CHECK_MATH_FUNC(sinh)
AC_CHECK_MATH_FUNC(sqrt)
AC_CHECK_MATH_FUNC(tan)
AC_CHECK_MATH_FUNC(tanh)
AC_CHECK_MATH_FUNC(tgamma)
AC_CHECK_MATH_FUNC(trunc)
AC_CHECK_MATH_FUNC(y0)
AC_CHECK_MATH_FUNC(y1)
AC_CHECK_MATH_FUNC(yn)

dnl Thread local storage
have___thread=no
AC_MSG_CHECKING(for thread-local storage)
AC_LINK_IFELSE([AC_LANG_SOURCE([
static __thread int x ;
int main () { x = 123; return x; }
])], have___thread=yes)
if test $have___thread = yes; then
   AC_DEFINE([HAVE___THREAD],1,[Define to 1 if the system supports __thread])
fi
AC_MSG_RESULT($have___thread)

AC_C_BIGENDIAN(
   AC_DEFINE([IEEE_MC68k], 1, [machine is bigendian]),
   AC_DEFINE([IEEE_8087], 1, [machine is littleendian]),
   AC_MSG_ERROR(unknown endianness),
   AC_MSG_ERROR(universal endianness not supported)
)

dnl Oniguruma
AC_ARG_WITH([oniguruma],
   [AS_HELP_STRING([--with-oniguruma=prefix],
      [try this for a non-standard install prefix of the oniguruma library])], ,
   [with_oniguruma=yes])

onig_CFLAGS=
onig_LDFLAGS=
build_oniguruma=no
AS_IF([test "x$with_oniguruma" != xno], [
   save_CFLAGS="$CFLAGS"
   save_LDFLAGS="$LDFLAGS"
   AS_IF([test "x$with_oniguruma" != xyes], [
      AS_IF([test "x$with_oniguruma" = xbuiltin], [
          build_oniguruma=yes
      ], [
          onig_CFLAGS="-I${with_oniguruma}/include"
          onig_LDFLAGS="-L${with_oniguruma}/lib"
      ])
   ])
   AS_IF([test "x$build_oniguruma" = xno], [
       # check for ONIGURUMA library, either in /usr or where requested
       CFLAGS="$CFLAGS $onig_CFLAGS"
       LDFLAGS="$LDFLAGS $onig_LDFLAGS"
       AC_CHECK_HEADER("oniguruma.h",
          AC_CHECK_LIB([onig],[onig_version]))
       # handle check results
       AS_IF([test "x$ac_cv_lib_onig_onig_version" != "xyes"], [
          build_oniguruma=yes
          AC_MSG_NOTICE([Oniguruma was not found. Will use the packaged oniguruma.])
       ])
   ])
   AS_IF([test "x$build_oniguruma" = xyes && test -f "${srcdir}/vendor/oniguruma/configure.ac" ], [
       onig_CFLAGS="-I${srcdir}/vendor/oniguruma/src"
       onig_LDFLAGS="-L${srcdir}/vendor/oniguruma/src -Wl,-rpath,${libdir}"
       AC_CONFIG_SUBDIRS([vendor/oniguruma])
       AC_DEFINE([HAVE_LIBONIG],1,[Define to 1 if the system includes libonig])
   ])
   CFLAGS="$save_CFLAGS"
   LDFLAGS="$save_LDFLAGS"
])
AC_SUBST(onig_CFLAGS)
AC_SUBST(onig_LDFLAGS)

AM_CONDITIONAL([BUILD_ONIGURUMA], [test "x$build_oniguruma" = xyes])
AM_CONDITIONAL([WITH_ONIGURUMA], [test "x$with_oniguruma" != xno])

AC_CONFIG_MACRO_DIRS([config/m4 m4])
AC_CONFIG_FILES([Makefile libjq.pc])
AC_OUTPUT



================================================
FILE: docs/Pipfile
================================================
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]

[packages]
jinja2 = "*"
pyyaml = "*"
markdown = "*"
lxml = "*"
jsonschema = "*"
importlib_resources = "*"


================================================
FILE: docs/README.md
================================================
Documentation
=============

The jq website, manpages and some of the tests are generated from this
directory. The manual is a YAML file in `content/manual`.

To build the documentation (including building the jq manpage), you'll
need `python3` and `pipenv`. You can install `pipenv` like so:

    pip install pipenv

Though, you may need to say `pip3` instead, depending on your system. Once
you have `pipenv` installed, you can install the dependencies by running
`pipenv sync` from the `docs/` directory.

Also, you may need to run `virtualenv -p /usr/bin/python3 venv/` and
then `source venv/bin/activate`, and only then `pipenv sync`.

Once this is done, rerun `./configure --enable-docs` in the jq root directory and then
the `Makefile` will be able to generate the jq manpage.  You can just run
`make jq.1` to build the manpage manually, and `make tests/man.test` to
update the manual tests.

To build the website, run `pipenv run python3 build_website.py` in the `docs/` directory.
To serve them locally, you can run `python3 -m http.server -d output`.


================================================
FILE: docs/build_manpage.py
================================================
#!/usr/bin/env python3
from datetime import date
from io import StringIO
from lxml import etree
import markdown
from markdown.extensions import Extension
import re
import sys
import yaml


# Prevent our markdown parser from trying to help by interpreting things in angle brackets as HTML tags.
class EscapeHtml(Extension):

    def extendMarkdown(self, md):
        md.preprocessors.deregister('html_block')
        md.inlinePatterns.deregister('html')


class RoffWalker(object):

    def __init__(self, tree, output=sys.stdout):
        self.tree = tree
        self.target = output
        self.f = StringIO()

    def walk(self):
        self._walk(self.tree, parent_tag=None)
        # We don't want to start lines with \. because that can confuse man
        # For lines that start with \., we need to prefix them with \& so it
        # knows not to treat that line as a directive
        data = re.sub(r'^\\\.', r'\&.', self.f.getvalue(), flags=re.MULTILINE)
        self.target.write(data)

    def _ul_is_special(self, root):
        if len(root) != 1:
            return False
        child = root[0]
        if child.tag != 'li':
            return False
        msg = ''.join(child.itertext()).strip()
        return msg.endswith(':')

    def _walk_child(self, root):
        if len(root) > 0:
            self._walk(root[0], parent_tag=root.tag)

    def _write_element(self, root, ensure_newline=True):
        if root.text is not None:
            text = self._sanitize(root.text)
            self.__write_raw(text)
        self._walk_child(root)
        self._write_tail(root, ensure_newline=ensure_newline)

    def _write_tail(self, root, ensure_newline=False, inline=False):
        if root.tail is not None:
            if inline or root.tail != '\n':
                text = self._sanitize(root.tail)
                if text.endswith('\n'):
                    ensure_newline = False
                self.__write_raw(text)
        if ensure_newline:
            self.__write_raw('\n')

    def _walk(self, root, parent_tag=None):
        last_tag = None
        while root is not None:
            if root.tag == 'h1':
                self.__write_cmd('.TH "JQ" "1" "{}" "" ""'.format(
                    date.today().strftime('%B %Y')))
                self.__write_cmd('.SH "NAME"')
                # TODO: properly parse this
                self.__write_raw(r'\fBjq\fR \- Command\-line JSON processor' +
                                 "\n")

            elif root.tag == 'h2':
                self.__write_cmd('.SH "{}"'.format(''.join(
                    root.itertext()).strip()))

            elif root.tag == 'h3':
                text = ''.join(root.itertext()).strip()
                self.__write_cmd('.SS "{}"'.format(self._h3_sanitize(text)))

            elif root.tag == 'p':
                if last_tag not in ['h2', 'h3'] and parent_tag not in ['li']:
                    self.__write_cmd('.P')
                self._write_element(root, ensure_newline=(parent_tag != 'li'))

            elif root.tag == 'a':
                self._write_element(root, ensure_newline=(parent_tag != 'li'))

            elif root.tag == 'ul':
                if self._ul_is_special(root):
                    li = root[0]
                    self.__write_cmd('.TP')
                    self._write_element(li)
                    next = root.getnext()
                    while next is not None and next.tag == 'p':
                        if next.getnext() is not None and next.getnext(
                        ).tag == 'pre':
                            # we don't want to .IP these, because it'll look funny with the code indent
                            break
                        self.__write_cmd('.IP')
                        self._write_element(next)
                        root = next
                        next = root.getnext()
                else:
                    self._walk_child(root)
                    self._write_tail(root)
                    # A pre tag after the end of a list doesn't want two of the indentation commands
                    if root.getnext() is None or root.getnext().tag != 'pre':
                        self.__write_cmd('.IP "" 0')

            elif root.tag == 'li':
                self.__write_cmd(r'.IP "\(bu" 4')
                if root.text is not None and root.text.strip() != '':
                    text = self._sanitize(root.text)
                    self.__write_raw(text)
                self._walk_child(root)
                self._write_tail(root, ensure_newline=True)

            elif root.tag == 'strong':
                if root.text is not None:
                    text = self._sanitize(root.text)
                    self.__write_raw('\\fB{}\\fR'.format(text))

                self._write_tail(root, inline=True)

            elif root.tag == 'em':
                if root.text is not None:
                    text = self._sanitize(root.text)
                    self.__write_raw('\\fI{}\\fR'.format(text))
                self._write_tail(root, inline=True)

            elif root.tag == 'code':
                if root.text is not None:
                    text = self._code_sanitize(root.text)
                    self.__write_raw('\\fB{}\\fR'.format(text))
                self._write_tail(root, inline=True)

            elif root.tag == 'pre':
                self.__write_cmd('.IP "" 4')
                self.__write_cmd('.nf\n')  # extra newline for spacing reasons
                next = root
                first = True
                while next is not None and next.tag == 'pre':
                    if not first:
                        self.__write_raw('\n')
                    text = ''.join(next.itertext(with_tail=False))
                    self.__write_raw(self._pre_sanitize(text))
                    first = False
                    root = next
                    next = next.getnext()
                self.__write_cmd('.fi')
                self.__write_cmd('.IP "" 0')

            else:
                self._walk_child(root)

            last_tag = root.tag
            root = root.getnext()

    def _base_sanitize(self, text):
        text = re.sub(r'\\', r'\\e', text)
        text = re.sub(r'\.', r'\\.', text)
        text = re.sub("'", r"\'", text)
        text = re.sub('-', r'\-', text)
        return text

    def _pre_sanitize(self, text):
        return self._base_sanitize(text)

    def _code_sanitize(self, text):
        text = self._base_sanitize(text)
        text = re.sub(r'\s', ' ', text)
        return text

    def _h3_sanitize(self, text):
        text = self._base_sanitize(text)
        text = re.sub(' \n|\n ', ' ', text)
        text = re.sub('\n', ' ', text)
        return text

    def _sanitize(self, text):
        text = self._base_sanitize(text)
        text = re.sub(r'<([^>]+)>', r'\\fI\1\\fR', text)
        text = re.sub(r' +', ' ', text)
        text = re.sub('\n', ' ', text)
        return text

    def __write_cmd(self, dat):
        print('.', dat, sep='\n', file=self.f)
        pass

    def __write_raw(self, dat):
        print(dat, sep='', end='', file=self.f)
        pass


def load_yml_file(fn):
    with open(fn) as f:
        return yaml.safe_load(f)


def dedent_body(body):
    lines = [re.sub(r'^  (\S)', r'\1', l) for l in body.split('\n')]
    return '\n'.join(lines)


def convert_manual_to_markdown():
    f = StringIO()
    manual = load_yml_file("content/manual/dev/manual.yml")
    f.write(manual.get('manpage_intro', '\n'))
    f.write(dedent_body(manual.get('body', '\n')))
    for section in manual.get('sections', []):
        f.write('## {}\n'.format(section.get('title', '').upper()))
        f.write(dedent_body(section.get('body', '\n')))
        f.write('\n')
        for entry in section.get('entries', []):
            f.write('### {}\n'.format(entry.get('title', '')))
            f.write(dedent_body(entry.get('body', '\n')))
            f.write('\n')
            if entry.get('examples') is not None:
                f.write("~~~~\n")
                first = True
                for example in entry.get('examples'):
                    if not first:
                        f.write('\n')
                    f.write("jq '{}'\n".format(example.get('program', '')))
                    f.write("   {}\n".format(example.get('input', '')))
                    output = [str(x) for x in example.get('output', [])]
                    f.write("=> {}\n".format(', '.join(output)))
                    first = False
                f.write("~~~~\n")
        f.write('\n')
    f.write(manual.get('manpage_epilogue', ''))
    return f.getvalue()


# Convert manual.yml to our special markdown format
markdown_data = convert_manual_to_markdown()

# Convert markdown to html
html_data = markdown.markdown(markdown_data,
                              extensions=[EscapeHtml(), 'fenced_code'])

# Parse the html into a tree so we can walk it
tr = etree.HTML(html_data, etree.HTMLParser())

# Convert the markdown to ROFF
RoffWalker(tr).walk()


================================================
FILE: docs/build_mantests.py
================================================
#!/usr/bin/env python3
import yaml
import re

regex_program_pattern = re.compile(
    r'\b(?:test|match|capture|scan|split|splits|sub|gsub)\s*\(')

with open('content/manual/dev/manual.yml') as source, \
        open('../tests/man.test', 'w') as man, \
        open('../tests/manonig.test', 'w') as manonig:
    manual = yaml.safe_load(source)
    for section in manual.get('sections', []):
        for entry in section.get('entries', []):
            for example in entry.get('examples', []):
                program = example.get('program', '').replace('\n', ' ')
                out = manonig if regex_program_pattern.search(program) else man
                print(program, file=out)
                print(example.get('input', ''), file=out)
                for s in example.get('output', []):
                    print(s, file=out)
                print('', file=out)


================================================
FILE: docs/build_website.py
================================================
#!/usr/bin/env python3
import glob
import itertools
from jinja2 import Environment, FileSystemLoader, select_autoescape, pass_context
from markdown import markdown
from markupsafe import Markup
import os
import os.path
import re
import shutil
import yaml

env = Environment(
    loader=FileSystemLoader('templates'),
    autoescape=select_autoescape(['html.j2']),
)


def load_yml_file(fn):
    with open(fn) as f:
        return yaml.safe_load(f)


env.globals['url'] = 'https://jqlang.org'
env.filters['search_id'] = lambda input: input.replace(r'`', '')
env.filters['section_id'] = lambda input: re.sub(
    r'[^-a-zA-Z0-9_]', '', input.replace(' ', '-')).lower()
env.filters['entry_id'] = lambda input: re.sub(
    r'^(split|first-last-nth)$',
    r'\1' + ('-1' if ';' not in input else '-2'),  # avoid id conflict
    re.sub(
        r'\b([^-]+)(?:-\1)+\b',
        r'\1',  # e.g. range-range-range -> range
        re.sub(r' ?/ ?|,? ', '-',
               re.sub(r'[`;]|: .*|\(.*?\)| \[.+\]', '', input)))).lower()
env.filters['markdownify'] = lambda input: Markup(markdown(input))
env.filters['no_paragraph'] = lambda input: Markup(re.sub(r'</?p>', '', input))

env.globals['unique_id'] = pass_context(
    lambda ctx: str(next(ctx['unique_ctr'])))


def raise_handler(message):
    raise Exception(message)


env.globals['raise'] = raise_handler


def generate_file(env, fname):
    path, base = os.path.split(fname)
    path = os.path.relpath(path, 'content')
    if path == '.':
        path = ''
        permalink = ''
    else:
        permalink = path + '/'

    output_dir = os.path.join('output', path)
    output_path = os.path.join(output_dir, 'index.html')

    template_name = re.sub(r'.yml$', '.html.j2', base)

    ctx = load_yml_file(fname)
    ctx.update(unique_ctr=itertools.count(1),
               permalink=permalink,
               navitem=path)
    os.makedirs(output_dir, exist_ok=True)
    env.get_template(template_name).stream(ctx).dump(output_path,
                                                     encoding='utf-8')


def copy_public_files(root=''):
    for f in os.scandir(os.path.join('public', root)):
        src = os.path.join(root, f.name)
        dst = os.path.join('output', src)
        if f.is_dir():
            os.makedirs(dst, exist_ok=True)
            copy_public_files(src)
        else:
            shutil.copyfile(f.path, dst)


os.makedirs('output', exist_ok=True)
copy_public_files()

for fn in glob.glob('content/**/*.yml', recursive=True):
    generate_file(env, fn)


================================================
FILE: docs/content/download/default.yml
================================================
headline: Download jq
body:
  - text: |

      jq is written in C and has no runtime dependencies, so it should be
      possible to build it for nearly any platform. Prebuilt binaries are
      available for Linux, macOS and Windows.

      The binaries should just run, but on macOS and Linux you may need
      to make them executable first using `chmod +x jq`.

      jq is licensed under the MIT license. For all of the gory
      details, read the file `COPYING` in the source distribution.

      jq uses a C library for decimal number support. This is an ICU 1.8.1
      licensed code obtained from the ICU downloads archive.  
      <https://download.icu-project.org/files/decNumber/decNumber-icu-368.zip>


      ### Linux

       * jq is in the official [Debian](https://packages.debian.org/jq) and
         [Ubuntu](https://packages.ubuntu.com/jq) repositories. Install using
         `sudo apt-get install jq`.

       * jq is in the official [Fedora](https://src.fedoraproject.org/rpms/jq) repository.
         Install using `sudo dnf install jq`.

       * jq is in the official [openSUSE](https://software.opensuse.org/package/jq) repository.
         Install using `sudo zypper install jq`.

       * jq is in the official [Arch](https://archlinux.org/packages/?q=jq) repository.
         Install using `sudo pacman -S jq`.

       * jq 1.8.1 binaries for
         [AMD64](https://github.com/jqlang/jq/releases/download/jq-1.8.1/jq-linux-amd64)
         or
         [ARM64](https://github.com/jqlang/jq/releases/download/jq-1.8.1/jq-linux-arm64)
         or
         [i386](https://github.com/jqlang/jq/releases/download/jq-1.8.1/jq-linux-i386).

       * jq 1.8.0 binaries for
         [AMD64](https://github.com/jqlang/jq/releases/download/jq-1.8.0/jq-linux-amd64)
         or
         [ARM64](https://github.com/jqlang/jq/releases/download/jq-1.8.0/jq-linux-arm64)
         or
         [i386](https://github.com/jqlang/jq/releases/download/jq-1.8.0/jq-linux-i386).

       * jq 1.7.1 binaries for
         [AMD64](https://github.com/jqlang/jq/releases/download/jq-1.7.1/jq-linux-amd64)
         or
         [ARM64](https://github.com/jqlang/jq/releases/download/jq-1.7.1/jq-linux-arm64)
         or
         [i386](https://github.com/jqlang/jq/releases/download/jq-1.7.1/jq-linux-i386).

       * jq 1.7 binaries for
         [AMD64](https://github.com/jqlang/jq/releases/download/jq-1.7/jq-linux-amd64)
         or
         [ARM64](https://github.com/jqlang/jq/releases/download/jq-1.7/jq-linux-arm64)
         or
         [i386](https://github.com/jqlang/jq/releases/download/jq-1.7/jq-linux-i386).

       * jq 1.6 binaries for
         [AMD64](https://github.com/jqlang/jq/releases/download/jq-1.6/jq-linux64)
         or
         [i386](https://github.com/jqlang/jq/releases/download/jq-1.6/jq-linux32).

       * jq 1.5 binaries for
         [AMD64](https://github.com/jqlang/jq/releases/download/jq-1.5/jq-linux64)
         or
         [i386](https://github.com/jqlang/jq/releases/download/jq-1.5/jq-linux32).

       * jq 1.4 binaries for
         [AMD64](https://github.com/jqlang/jq/releases/download/jq-1.4/jq-linux-x86_64)
         or
         [i386](https://github.com/jqlang/jq/releases/download/jq-1.4/jq-linux-x86).

       * jq 1.3 binaries for
         [AMD64](https://github.com/jqlang/jq/releases/download/jq-1.3/jq-linux-x86_64)
         or
         [i386](https://github.com/jqlang/jq/releases/download/jq-1.3/jq-linux-x86).

      ### macOS

       * Use [Homebrew](https://brew.sh/) to install jq with `brew install jq`.

       * Use [MacPorts](https://www.macports.org) to install jq with `port install jq`.

       * Use [Fink](https://finkproject.org) to install jq with `fink install jq`.

       * jq 1.8.1 binaries for
         [Apple Silicon](https://github.com/jqlang/jq/releases/download/jq-1.8.1/jq-macos-arm64)
         or
         [Intel Mac](https://github.com/jqlang/jq/releases/download/jq-1.8.1/jq-macos-amd64).

       * jq 1.8.0 binaries for
         [Apple Silicon](https://github.com/jqlang/jq/releases/download/jq-1.8.0/jq-macos-arm64)
         or
         [Intel Mac](https://github.com/jqlang/jq/releases/download/jq-1.8.0/jq-macos-amd64).

       * jq 1.7.1 binaries for
         [Apple Silicon](https://github.com/jqlang/jq/releases/download/jq-1.7.1/jq-macos-arm64)
         or
         [Intel Mac](https://github.com/jqlang/jq/releases/download/jq-1.7.1/jq-macos-amd64).

       * jq 1.7 binaries for
         [Apple Silicon](https://github.com/jqlang/jq/releases/download/jq-1.7/jq-macos-arm64)
         or
         [Intel Mac](https://github.com/jqlang/jq/releases/download/jq-1.7/jq-macos-amd64).

       * jq 1.6 binary for
         [AMD64](https://github.com/jqlang/jq/releases/download/jq-1.6/jq-osx-amd64).

       * jq 1.5 binary for
         [AMD64](https://github.com/jqlang/jq/releases/download/jq-1.5/jq-osx-amd64).

       * jq 1.4 binaries for
         [AMD64](https://github.com/jqlang/jq/releases/download/jq-1.4/jq-osx-x86_64)
         or
         [i386](https://github.com/jqlang/jq/releases/download/jq-1.4/jq-osx-x86).

       * jq 1.3 binaries for
         [AMD64](https://github.com/jqlang/jq/releases/download/jq-1.3/jq-osx-x86_64)
         or
         [i386](https://github.com/jqlang/jq/releases/download/jq-1.3/jq-osx-x86).

      ### FreeBSD

       * `pkg install jq` as root installs a pre-built
         [binary package](https://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/pkgng-intro.html).

       * `make -C /usr/ports/textproc/jq install clean` as root installs the
         [jq](https://www.freshports.org/textproc/jq/)
         [port](https://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/ports-using.html)
         from source.

      ### Solaris

       * `pkgutil -i jq` in [OpenCSW](https://www.opencsw.org/p/jq) for Solaris
         10+, Sparc and x86.

       * jq 1.4 binaries for Solaris 11
         [AMD64](https://github.com/jqlang/jq/releases/download/jq-1.4/jq-solaris11-64)
         or
         [i386](https://github.com/jqlang/jq/releases/download/jq-1.4/jq-solaris11-32).

      ### Windows

       * Use [winget](https://learn.microsoft.com/en-us/windows/package-manager/winget/)
         to install jq with `winget install jqlang.jq`.

       * Use [scoop](https://scoop.sh/) to install jq with `scoop install jq`.

       * Use [Chocolatey NuGet](https://chocolatey.org/) to install jq with
         `choco install jq`.

       * jq 1.8.1 executables for
         [AMD64](https://github.com/jqlang/jq/releases/download/jq-1.8.1/jq-windows-amd64.exe)
         or
         [i386](https://github.com/jqlang/jq/releases/download/jq-1.8.1/jq-windows-i386.exe).

       * jq 1.8.0 executables for
         [AMD64](https://github.com/jqlang/jq/releases/download/jq-1.8.0/jq-windows-amd64.exe)
         or
         [i386](https://github.com/jqlang/jq/releases/download/jq-1.8.0/jq-windows-i386.exe).

       * jq 1.7.1 executables for
         [AMD64](https://github.com/jqlang/jq/releases/download/jq-1.7.1/jq-windows-amd64.exe)
         or
         [i386](https://github.com/jqlang/jq/releases/download/jq-1.7.1/jq-windows-i386.exe).

       * jq 1.7 executables for
         [AMD64](https://github.com/jqlang/jq/releases/download/jq-1.7/jq-windows-amd64.exe)
         or
         [i386](https://github.com/jqlang/jq/releases/download/jq-1.7/jq-windows-i386.exe).

       * jq 1.6 executables for
         [AMD64](https://github.com/jqlang/jq/releases/download/jq-1.6/jq-win64.exe)
         or
         [i386](https://github.com/jqlang/jq/releases/download/jq-1.6/jq-win32.exe).

       * jq 1.5 executables for
         [AMD64](https://github.com/jqlang/jq/releases/download/jq-1.5/jq-win64.exe)
         or
         [i386](https://github.com/jqlang/jq/releases/download/jq-1.5/jq-win32.exe).

       * jq 1.4 executables for
         [AMD64](https://github.com/jqlang/jq/releases/download/jq-1.4/jq-win64.exe)
         or
         [i386](https://github.com/jqlang/jq/releases/download/jq-1.4/jq-win32.exe).

       * jq 1.3 executables for
         [AMD64](https://github.com/jqlang/jq/releases/download/jq-1.3/jq-win64.exe)
         or
         [i386](https://github.com/jqlang/jq/releases/download/jq-1.3/jq-win32.exe).

      ### Checksums and signatures

      SHA-256 checksums are provided for all release and pre-release binaries.
      The checksums for jq 1.8.1 are in
      [sig/v1.8.1/sha256sum.txt](https://raw.githubusercontent.com/jqlang/jq/master/sig/v1.8.1/sha256sum.txt).
      The checksums for jq 1.8.0 are in
      [sig/v1.8.0/sha256sum.txt](https://raw.githubusercontent.com/jqlang/jq/master/sig/v1.8.0/sha256sum.txt).
      The checksums for jq 1.7.1 are in
      [sig/v1.7.1/sha256sum.txt](https://raw.githubusercontent.com/jqlang/jq/master/sig/v1.7.1/sha256sum.txt).
      The checksums for jq 1.7 are in
      [sig/v1.7/sha256sum.txt](https://raw.githubusercontent.com/jqlang/jq/master/sig/v1.7/sha256sum.txt).
      The checksums for jq 1.6 are in
      [sig/v1.6/sha256sum.txt](https://raw.githubusercontent.com/jqlang/jq/master/sig/v1.6/sha256sum.txt).
      The checksums for jq 1.5 are in
      [sig/v1.5/sha256sum.txt](https://raw.githubusercontent.com/jqlang/jq/master/sig/v1.5/sha256sum.txt).

      Additionally, all release artifacts are signed by a jq release key.  We have two release keys, [one for 1.6 and older releases](https://raw.githubusercontent.com/jqlang/jq/master/sig/jq-release-old.key), and [one for 1.7 and newer releases](https://raw.githubusercontent.com/jqlang/jq/master/sig/jq-release-new.key).
      The signatures for jq 1.8.1 are in
      [sig/v1.8.1/\*.asc](https://github.com/jqlang/jq/tree/master/sig/v1.8.1).
      The signatures for jq 1.8.0 are in
      [sig/v1.8.0/\*.asc](https://github.com/jqlang/jq/tree/master/sig/v1.8.0).
      The signatures for jq 1.7.1 are in
      [sig/v1.7.1/\*.asc](https://github.com/jqlang/jq/tree/master/sig/v1.7.1).
      The signatures for jq 1.7 are in
      [sig/v1.7/\*.asc](https://github.com/jqlang/jq/tree/master/sig/v1.7).
      The signatures for jq 1.6 are in
      [sig/v1.6/\*.asc](https://github.com/jqlang/jq/tree/master/sig/v1.6).
      The signatures for jq 1.5 are in
      [sig/v1.5/\*.asc](https://github.com/jqlang/jq/tree/master/sig/v1.5).
      You can use [GnuPG](https://gnupg.org/) to verify a signature by downloading
      the signature and running `gpg --verify signature.asc`.

      ### From source on Linux, macOS, Cygwin, and other POSIX-like operating systems

       * [Source tarball for jq 1.8.1](https://github.com/jqlang/jq/releases/download/jq-1.8.1/jq-1.8.1.tar.gz)
       * [Source tarball for jq 1.8.0](https://github.com/jqlang/jq/releases/download/jq-1.8.0/jq-1.8.0.tar.gz)
       * [Source tarball for jq 1.7.1](https://github.com/jqlang/jq/releases/download/jq-1.7.1/jq-1.7.1.tar.gz)
       * [Source tarball for jq 1.7](https://github.com/jqlang/jq/releases/download/jq-1.7/jq-1.7.tar.gz)
       * [Source tarball for jq 1.6](https://github.com/jqlang/jq/releases/download/jq-1.6/jq-1.6.tar.gz)
       * [Source tarball for jq 1.5](https://github.com/jqlang/jq/releases/download/jq-1.5/jq-1.5.tar.gz)

      You can build it using the usual `./configure && make && sudo
      make install` rigmarole.

      If you're interested in using the latest development version, try:

          git clone --recursive https://github.com/jqlang/jq.git
          cd jq
          autoreconf -i
          ./configure
          make
          sudo make install

      To build it from a git clone, you'll need to install a few
      packages first:

       * [GCC](https://gcc.gnu.org)
       * [Make](https://www.gnu.org/software/make/)
       * [Autotools](https://www.gnu.org/software/automake/)

      For Linux systems, these will all be in your system's package
      manager, and if you do development on the machine they're most
      likely already installed.

      On macOS, these are all included in Apple's command line tools, which can
      be installed from [Xcode](https://developer.apple.com/xcode/). However,
      you may find that you need a newer version of Bison than the one provided
      by Apple. This can be found in [Homebrew](https://brew.sh/) or
      [MacPorts](https://macports.org/).

      If you want to generate the lexer and parser from source you can use the
      `--enable-maintainer-mode` configure flag. This requires bison to be installed.
      [Flex](https://github.com/westes/flex) and
      [Bison](https://www.gnu.org/software/bison/).

      ### Docker

      Docker image is available from
      [GitHub Container Registry](https://github.com/jqlang/jq/pkgs/container/jq).

          docker run -i --rm ghcr.io/jqlang/jq -n 'range(3)'

      #### Building the documentation

      jq's documentation is compiled into static HTML using Python.
      To build the docs, run `pipenv run python3 build_website.py`
      in the `docs/` directory. To serve them locally, you can run
      `python3 -m http.server -d output`. You'll need a few Python dependencies,
      which can be installed by following the instructions in `docs/README.md`.

      The man page is built by `make jq.1`, or just `make`, also from
      the YAML docs, and you'll still need the Python dependencies to
      build the manpage.


================================================
FILE: docs/content/index.yml
================================================
headline: jq

blurb: |

  jq is a lightweight and flexible command-line JSON processor.

body1: |

  jq is like `sed` for JSON data - you can use it to slice and filter
  and map and transform structured data with the same ease that `sed`,
  `awk`, `grep` and friends let you play with text.

body2: |

  jq is written in portable C, and it has zero runtime
  dependencies. You can download a single binary, `scp` it to a far away
  machine of the same type, and expect it to work.

body3: |

  jq can mangle the data format that you have into the one that you
  want with very little effort, and the program to do so is often
  shorter and simpler than you'd expect.

tail: |

  Go read the [tutorial](./tutorial/) for more, or the [manual](./manual/)
  for *way* more.

  Have a question related to jq? You can seek answers on [Stack Overflow](https://stackoverflow.com/)
  by using the [jq tag](https://stackoverflow.com/questions/tagged/jq), or in the [#jq channel](https://web.libera.chat/#jq)
  on [Libera.Chat](https://libera.chat/). For more interactive discussions, feel free to join our [Discord server](https://discord.gg/yg6yjNmgAC).

news:
  - date: 1 July 2025
    body: |
      jq 1.8.1 released. See [release notes](https://github.com/jqlang/jq/releases/tag/jq-1.8.1) for details.

  - date: 1 June 2025
    body: |
      jq 1.8.0 released. See [release notes](https://github.com/jqlang/jq/releases/tag/jq-1.8.0) for details.

  - date: 13 December 2023
    body: |
      jq 1.7.1 released. Security (CVE-2023-50246, CVE-2023-50268) and bug fixes.
      See [release notes](https://github.com/jqlang/jq/releases/tag/jq-1.7.1) for details.

  - date: 7 September 2023
    body: |
      After a five-year hiatus, we've returned with a revitalized [GitHub organization](https://github.com/jqlang)
      and a much-anticipated 1.7 release, thanks to our new admins and maintainers.
      Check out the [download](./download/) page for installation options and see the
      [release notes](https://github.com/jqlang/jq/releases/tag/jq-1.7) for details.

  - date: 1 November 2018
    body: |
      jq 1.6 released. See installation options on the [download](./download/)
      page, and the [release notes](https://github.com/jqlang/jq/releases/tag/jq-1.6)
      for details.

  - date: 15 August 2015
    body: |

      jq 1.5 released, including new datetime, math, and regexp functions,
      try/catch syntax, array and object destructuring, a streaming parser,
      and a module system. See installation options on the
      [download](./download/) page, and the
      [release notes](https://github.com/jqlang/jq/releases/tag/jq-1.5)
      for details.

  - date: 26 July 2015
    body: |

      jq 1.5rc2 is available. Get it on the
      [releases](https://github.com/jqlang/jq/releases) page.

  - date: 01 January 2015
    body: |

      jq 1.5rc1 is available. Get it on the
      [releases](https://github.com/jqlang/jq/releases) page.

  - date: 09 June 2014
    body: |

      jq 1.4 (finally) released! Get it on the [download](./download/) page.

  - date: 19 May 2013
    body: |

      jq 1.3 released.


================================================
FILE: docs/content/manual/dev/manual.yml
================================================
---
headline: jq Manual (development version)

body: |

  A jq program is a "filter": it takes an input, and produces an
  output. There are a lot of builtin filters for extracting a
  particular field of an object, or converting a number to a string,
  or various other standard tasks.

  Filters can be combined in various ways - you can pipe the output of
  one filter into another filter, or collect the output of a filter
  into an array.

  Some filters produce multiple results, for instance there's one that
  produces all the elements of its input array. Piping that filter
  into a second runs the second filter for each element of the
  array. Generally, things that would be done with loops and iteration
  in other languages are just done by gluing filters together in jq.

  It's important to remember that every filter has an input and an
  output. Even literals like "hello" or 42 are filters - they take an
  input but always produce the same literal as output. Operations that
  combine two filters, like addition, generally feed the same input to
  both and combine the results. So, you can implement an averaging
  filter as `add / length` - feeding the input array both to the `add`
  filter and the `length` filter and then performing the division.

  But that's getting ahead of ourselves. :) Let's start with something
  simpler:

manpage_intro: |
  jq(1) -- Command-line JSON processor
  ====================================

  ## SYNOPSIS

  `jq` [<options>...] <filter> [<files>...]

  `jq` can transform JSON in various ways, by selecting, iterating,
  reducing and otherwise mangling JSON documents. For instance,
  running the command `jq 'map(.price) | add'` will take an array of
  JSON objects as input and return the sum of their "price" fields.

  `jq` can accept text input as well, but by default, `jq` reads a
  stream of JSON entities (including numbers and other literals) from
  `stdin`. Whitespace is only needed to separate entities such as 1
  and 2, and true and false.  One or more <files> may be specified, in
  which case `jq` will read input from those instead.

  The <options> are described in the [INVOKING JQ] section; they
  mostly concern input and output formatting. The <filter> is written
  in the jq language and specifies how to transform the input
  file or document.

  ## FILTERS

manpage_epilogue: |
  ## BUGS

  Presumably. Report them or discuss them at:

      https://github.com/jqlang/jq/issues

  ## AUTHOR

  Stephen Dolan `<mu@netsoc.tcd.ie>`

sections:
  - title: Invoking jq
    body: |

      jq filters run on a stream of JSON data. The input to jq is
      parsed as a sequence of whitespace-separated JSON values which
      are passed through the provided filter one at a time. The
      output(s) of the filter are written to standard output, as a
      sequence of newline-separated JSON data.

      The simplest and most common filter (or jq program) is `.`,
      which is the identity operator, copying the inputs of the jq
      processor to the output stream.  Because the default behavior of
      the jq processor is to read JSON texts from the input stream,
      and to pretty-print outputs, the `.` program's main use is to
      validate and pretty-print the inputs.  The jq programming
      language is quite rich and allows for much more than just
      validation and pretty-printing.

      Note: it is important to mind the shell's quoting rules.  As a
      general rule it's best to always quote (with single-quote
      characters on Unix shells) the jq program, as too many characters with special
      meaning to jq are also shell meta-characters.  For example, `jq
      "foo"` will fail on most Unix shells because that will be the same
      as `jq foo`, which will generally fail because `foo is not
      defined`.  When using the Windows command shell (cmd.exe) it's
      best to use double quotes around your jq program when given on the
      command-line (instead of the `-f program-file` option), but then
      double-quotes in the jq program need backslash escaping. When using
      the Powershell (`powershell.exe`) or the Powershell Core
      (`pwsh`/`pwsh.exe`), use single-quote characters around the jq
      program and backslash-escaped double-quotes (`\"`) inside the jq
      program.

      * Unix shells: `jq '.["foo"]'`
      * Powershell: `jq '.[\"foo\"]'`
      * Windows command shell: `jq ".[\"foo\"]"`

      Note: jq allows user-defined functions, but every jq program
      must have a top-level expression.

      You can affect how jq reads and writes its input and output
      using some command-line options:

      * `--null-input` / `-n`:

        Don't read any input at all. Instead, the filter is run once
        using `null` as the input. This is useful when using jq as a
        simple calculator or to construct JSON data from scratch.

      * `--raw-input` / `-R`:

        Don't parse the input as JSON. Instead, each line of text is
        passed to the filter as a string. If combined with `--slurp`,
        then the entire input is passed to the filter as a single long
        string.

      * `--slurp` / `-s`:

        Instead of running the filter for each JSON object in the
        input, read the entire input stream into a large array and run
        the filter just once.

      * `--compact-output` / `-c`:

        By default, jq pretty-prints JSON output. Using this option
        will result in more compact output by instead putting each
        JSON object on a single line.

      * `--raw-output` / `-r`:

        With this option, if the filter's result is a string then it
        will be written directly to standard output rather than being
        formatted as a JSON string with quotes. This can be useful for
        making jq filters talk to non-JSON-based systems.

      * `--raw-output0`:

        Like `-r` but jq will print NUL instead of newline after each output.
        This can be useful when the values being output can contain newlines.
        When the output value contains NUL, jq exits with non-zero code.

      * `--join-output` / `-j`:

        Like `-r` but jq won't print a newline after each output.

      * `--ascii-output` / `-a`:

        jq usually outputs non-ASCII Unicode codepoints as UTF-8, even
        if the input specified them as escape sequences (like
        "\u03bc"). Using this option, you can force jq to produce pure
        ASCII output with every non-ASCII character replaced with the
        equivalent escape sequence.

      * `--sort-keys` / `-S`:

        Output the fields of each object with the keys in sorted order.

      * `--color-output` / `-C` and `--monochrome-output` / `-M`:

        By default, jq outputs colored JSON if writing to a
        terminal. You can force it to produce color even if writing to
        a pipe or a file using `-C`, and disable color with `-M`.
        When the `NO_COLOR` environment variable is not empty, jq disables
        colored output by default, but you can enable it by `-C`.

        Colors can be configured with the `JQ_COLORS` environment
        variable (see below).

      * `--tab`:

        Use a tab for each indentation level instead of two spaces.

      * `--indent n`:

        Use the given number of spaces (no more than 7) for indentation.

      * `--unbuffered`:

        Flush the output after each JSON object is printed (useful if
        you're piping a slow data source into jq and piping jq's
        output elsewhere).

      * `--stream`:

        Parse the input in streaming fashion, outputting arrays of path
        and leaf values (scalars and empty arrays or empty objects).
        For example, `"a"` becomes `[[],"a"]`, and `[[],"a",["b"]]`
        becomes `[[0],[]]`, `[[1],"a"]`, and `[[2,0],"b"]`.

        This is useful for processing very large inputs.  Use this in
        conjunction with filtering and the `reduce` and `foreach` syntax
        to reduce large inputs incrementally.

      * `--stream-errors`:

        Like `--stream`, but invalid JSON inputs yield array values
        where the first element is the error and the second is a path.
        For example, `["a",n]` produces `["Invalid literal at line 1,
        column 7",[1]]`.

        Implies `--stream`.  Invalid JSON inputs produce no error values
        when `--stream` without `--stream-errors`.

      * `--seq`:

        Use the `application/json-seq` MIME type scheme for separating
        JSON texts in jq's input and output.  This means that an ASCII
        RS (record separator) character is printed before each value on
        output and an ASCII LF (line feed) is printed after every
        output.  Input JSON texts that fail to parse are ignored (but
        warned about), discarding all subsequent input until the next
        RS.  This mode also parses the output of jq without the `--seq`
        option.

      * `-f` / `--from-file`:

        Read the filter from a file rather than from a command line,
        like awk's -f option. This changes the filter argument to be
        interpreted as a filename, instead of the source of a program.

      * `-L directory` / `--library-path directory`:

        Prepend `directory` to the search list for modules.  If this
        option is used then no builtin search list is used.  See the
        section on modules below.

      * `--arg name value`:

        This option passes a value to the jq program as a predefined
        variable. If you run jq with `--arg foo bar`, then `$foo` is
        available in the program and has the value `"bar"`. Note that
        `value` will be treated as a string, so `--arg foo 123` will
        bind `$foo` to `"123"`.

        Named arguments are also available to the jq program as
        `$ARGS.named`. When the name is not a valid identifier, this is
        the only way to access it.

      * `--argjson name JSON-text`:

        This option passes a JSON-encoded value to the jq program as a
        predefined variable. If you run jq with `--argjson foo 123`, then
        `$foo` is available in the program and has the value `123`.

      * `--slurpfile variable-name filename`:

        This option reads all the JSON texts in the named file and binds
        an array of the parsed JSON values to the given global variable.
        If you run jq with `--slurpfile foo bar`, then `$foo` is available
        in the program and has an array whose elements correspond to the
        texts in the file named `bar`.

      * `--rawfile variable-name filename`:

        This option reads in the named file and binds its content to the given
        global variable.  If you run jq with `--rawfile foo bar`, then `$foo` is
        available in the program and has a string whose content is set to the text
        in the file named `bar`.

      * `--args`:

        Remaining arguments are positional string arguments.  These are
        available to the jq program as `$ARGS.positional[]`.

      * `--jsonargs`:

        Remaining arguments are positional JSON text arguments.  These
        are available to the jq program as `$ARGS.positional[]`.

      * `--exit-status` / `-e`:

        Sets the exit status of jq to 0 if the last output value was
        neither `false` nor `null`, 1 if the last output value was
        either `false` or `null`, or 4 if no valid result was ever
        produced.  Normally jq exits with 2 if there was any usage
        problem or system error, 3 if there was a jq program compile
        error, or 0 if the jq program ran.

        Another way to set the exit status is with the `halt_error`
        builtin function.

      * `--binary` / `-b`:

        Windows users using WSL, MSYS2, or Cygwin, should use this option
        when using a native jq.exe, otherwise jq will turn newlines (LFs)
        into carriage-return-then-newline (CRLF).

      * `--version` / `-V`:

        Output the jq version and exit with zero.

      * `--build-configuration`:

        Output the build configuration of jq and exit with zero.
        This output has no supported format or structure and may change
        without notice in future releases.

      * `--help` / `-h`:

        Output the jq help and exit with zero.

      * `--`:

        Terminates argument processing.  Remaining arguments are not
        interpreted as options.

      * `--run-tests [filename]`:

        Runs the tests in the given file or standard input.  This must
        be the last option given and does not honor all preceding
        options.  The input consists of comment lines, empty lines, and
        program lines followed by one input line, as many lines of
        output as are expected (one per output), and a terminating empty
        line.  Compilation failure tests start with a line containing
        only `%%FAIL`, then a line containing the program to compile,
        then a line containing an error message to compare to the
        actual.

        Be warned that this option can change backwards-incompatibly.

  - title: Basic filters
    entries:
      - title: "Identity: `.`"
        body: |

          The absolute simplest filter is `.` .  This filter takes its
          input and produces the same value as output.  That is, this
          is the identity operator.

          Since jq by default pretty-prints all output, a trivial
          program consisting of nothing but `.` can be used to format
          JSON output from, say, `curl`.

          Although the identity filter never modifies the value of its
          input, jq processing can sometimes make it appear as though
          it does.  For example, using the current implementation of
          jq, we would see that the expression:

              1E1234567890 | .

          produces `1.7976931348623157e+308` on at least one platform.
          This is because, in the process of parsing the number, this
          particular version of jq has converted it to an IEEE754
          double-precision representation, losing precision.

          The way in which jq handles numbers has changed over time
          and further changes are likely within the parameters set by
          the relevant JSON standards.  Moreover, build configuration
          options can alter how jq processes numbers.

          The following remarks are therefore offered with the
          understanding that they are intended to be descriptive of the
          current version of jq and should not be interpreted as being
          prescriptive:

          (1) Any arithmetic operation on a number that has not
          already been converted to an IEEE754 double precision
          representation will trigger a conversion to the IEEE754
          representation.

          (2) jq will attempt to maintain the original decimal
          precision of number literals (if the `--disable-decnum`
          build configuration option was not used), but in expressions
          such `1E1234567890`, precision will be lost if the exponent
          is too large.

          (3) Comparisons are carried out using the untruncated
          big decimal representation of numbers if available, as
          illustrated in one of the following examples.

          The examples below use the builtin function `have_decnum` in
          order to demonstrate the expected effects of using / not
          using the `--disable-decnum` build configuration option, and
          also to allow automated tests derived from these examples to
          pass regardless of whether that option is used.

        examples:
          - program: '.'
            input: '"Hello, world!"'
            output: ['"Hello, world!"']

          - program: '.'
            input: '0.12345678901234567890123456789'
            output: ['0.12345678901234567890123456789']

          - program: '[., tojson] == if have_decnum then [12345678909876543212345,"12345678909876543212345"] else [12345678909876543000000,"12345678909876543000000"] end'
            input: '12345678909876543212345'
            output: ['true']

          - program: '[1234567890987654321,-1234567890987654321 | tojson] == if have_decnum then ["1234567890987654321","-1234567890987654321"] else ["1234567890987654400","-1234567890987654400"] end'
            input: 'null'
            output: ['true']

          - program: '. < 0.12345678901234567890123456788'
            input: '0.12345678901234567890123456789'
            output: ['false']

          - program: 'map([., . == 1]) | tojson == if have_decnum then "[[1,true],[1.000,true],[1.0,true],[1.00,true]]" else "[[1,true],[1,true],[1,true],[1,true]]" end'
            input: '[1, 1.000, 1.0, 100e-2]'
            output: ['true']

          - program: '. as $big | [$big, $big + 1] | map(. > 10000000000000000000000000000000) | . == if have_decnum then [true, false] else [false, false] end'
            input: '10000000000000000000000000000001'
            output: ['true']

      - title: "Object Identifier-Index: `.foo`, `.foo.bar`"
        body: |

          The simplest *useful* filter has the form `.foo`. When given a
          JSON object (aka dictionary or hash) as input, `.foo` produces
          the value at the key "foo" if the key is present, or null otherwise.

          A filter of the form `.foo.bar` is equivalent to `.foo | .bar`.

          The `.foo` syntax only works for simple, identifier-like keys, that
          is, keys that are all made of alphanumeric characters and
          underscore, and which do not start with a digit.

          If the key contains special characters or starts with a digit,
          you need to surround it with double quotes like this:
          `."foo$"`, or else `.["foo$"]`.

          For example `.["foo::bar"]` and `.["foo.bar"]` work while
          `.foo::bar` does not.

        examples:
          - program: '.foo'
            input: '{"foo": 42, "bar": "less interesting data"}'
            output: ['42']

          - program: '.foo'
            input: '{"notfoo": true, "alsonotfoo": false}'
            output: ['null']

          - program: '.["foo"]'
            input: '{"foo": 42}'
            output: ['42']

      - title: "Optional Object Identifier-Index: `.foo?`"
        body: |

          Just like `.foo`, but does not output an error when `.` is not an
          object.

        examples:
          - program: '.foo?'
            input: '{"foo": 42, "bar": "less interesting data"}'
            output: ['42']
          - program: '.foo?'
            input: '{"notfoo": true, "alsonotfoo": false}'
            output: ['null']
          - program: '.["foo"]?'
            input: '{"foo": 42}'
            output: ['42']
          - program: '[.foo?]'
            input: '[1,2]'
            output: ['[]']

      - title: "Object Index: `.[<string>]`"
        body: |

          You can also look up fields of an object using syntax like
          `.["foo"]` (`.foo` above is a shorthand version of this, but
          only for identifier-like strings).

      - title: "Array Index: `.[<number>]`"
        body: |

          When the index value is an integer, `.[<number>]` can index
          arrays.  Arrays are zero-based, so `.[2]` returns the third
          element.

          Negative indices are allowed, with -1 referring to the last
          element, -2 referring to the next to last element, and so on.

        examples:
          - program: '.[0]'
            input: '[{"name":"JSON", "good":true}, {"name":"XML", "good":false}]'
            output: ['{"name":"JSON", "good":true}']

          - program: '.[2]'
            input: '[{"name":"JSON", "good":true}, {"name":"XML", "good":false}]'
            output: ['null']

          - program: '.[-2]'
            input: '[1,2,3]'
            output: ['2']

      - title: "Array/String Slice: `.[<number>:<number>]`"
        body: |

          The `.[<number>:<number>]` syntax can be used to return a
          subarray of an array or substring of a string. The array
          returned by `.[10:15]` will be of length 5, containing the
          elements from index 10 (inclusive) to index 15 (exclusive).
          Either index may be negative (in which case it counts
          backwards from the end of the array), or omitted (in which
          case it refers to the start or end of the array).
          Indices are zero-based.

        examples:
          - program: '.[2:4]'
            input: '["a","b","c","d","e"]'
            output: ['["c", "d"]']

          - program: '.[2:4]'
            input: '"abcdefghi"'
            output: ['"cd"']

          - program: '.[:3]'
            input: '["a","b","c","d","e"]'
            output: ['["a", "b", "c"]']

          - program: '.[-2:]'
            input: '["a","b","c","d","e"]'
            output: ['["d", "e"]']

      - title: "Array/Object Value Iterator: `.[]`"
        body: |

          If you use the `.[index]` syntax, but omit the index
          entirely, it will return *all* of the elements of an
          array. Running `.[]` with the input `[1,2,3]` will produce the
          numbers as three separate results, rather than as a single
          array. A filter of the form `.foo[]` is equivalent to
          `.foo | .[]`.

          You can also use this on an object, and it will return all
          the values of the object.

          Note that the iterator operator is a generator of values.

        examples:
          - program: '.[]'
            input: '[{"name":"JSON", "good":true}, {"name":"XML", "good":false}]'
            output:
              - '{"name":"JSON", "good":true}'
              - '{"name":"XML", "good":false}'

          - program: '.[]'
            input: '[]'
            output: []

          - program: '.foo[]'
            input: '{"foo":[1,2,3]}'
            output: ['1','2','3']

          - program: '.[]'
            input: '{"a": 1, "b": 1}'
            output: ['1', '1']

      - title: "`.[]?`"
        body: |

          Like `.[]`, but no errors will be output if . is not an array
          or object. A filter of the form `.foo[]?` is equivalent to
          `.foo | .[]?`.

      - title: "Comma: `,`"
        body: |

          If two filters are separated by a comma, then the
          same input will be fed into both and the two filters' output
          value streams will be concatenated in order: first, all of the
          outputs produced by the left expression, and then all of the
          outputs produced by the right. For instance, filter `.foo,
          .bar`, produces both the "foo" fields and "bar" fields as
          separate outputs.

          The `,` operator is one way to construct generators.

        examples:
          - program: '.foo, .bar'
            input: '{"foo": 42, "bar": "something else", "baz": true}'
            output: ['42', '"something else"']

          - program: ".user, .projects[]"
            input: '{"user":"stedolan", "projects": ["jq", "wikiflow"]}'
            output: ['"stedolan"', '"jq"', '"wikiflow"']

          - program: '.[4,2]'
            input: '["a","b","c","d","e"]'
            output: ['"e"', '"c"']

      - title: "Pipe: `|`"
        body: |

          The | operator combines two filters by feeding the output(s) of
          the one on the left into the input of the one on the right. It's
          similar to the Unix shell's pipe, if you're used to that.

          If the one on the left produces multiple results, the one on
          the right will be run for each of those results. So, the
          expression `.[] | .foo` retrieves the "foo" field of each
          element of the input array.  This is a cartesian product,
          which can be surprising.

          Note that `.a.b.c` is the same as `.a | .b | .c`.

          Note too that `.` is the input value at the particular stage
          in a "pipeline", specifically: where the `.` expression appears.
          Thus `.a | . | .b` is the same as `.a.b`, as the `.` in the
          middle refers to whatever value `.a` produced.

        examples:
          - program: '.[] | .name'
            input: '[{"name":"JSON", "good":true}, {"name":"XML", "good":false}]'
            output: ['"JSON"', '"XML"']

      - title: "Parenthesis"
        body: |

          Parenthesis work as a grouping operator just as in any typical
          programming language.

        examples:
          - program: '(. + 2) * 5'
            input: '1'
            output: ['15']

  - title: Types and Values
    body: |

      jq supports the same set of datatypes as JSON - numbers,
      strings, booleans, arrays, objects (which in JSON-speak are
      hashes with only string keys), and "null".

      Booleans, null, strings and numbers are written the same way as
      in JSON. Just like everything else in jq, these simple
      values take an input and produce an output - `42` is a valid jq
      expression that takes an input, ignores it, and returns 42
      instead.

      Numbers in jq are internally represented by their IEEE754 double
      precision approximation. Any arithmetic operation with numbers,
      whether they are literals or results of previous filters, will
      produce a double precision floating point result.

      However, when parsing a literal jq will store the original literal
      string. If no mutation is applied to this value then it will make
      to the output in its original form, even if conversion to double
      would result in a loss.

    entries:
      - title: "Array construction: `[]`"
        body: |

          As in JSON, `[]` is used to construct arrays, as in
          `[1,2,3]`. The elements of the arrays can be any jq
          expression, including a pipeline. All of the results produced
          by all of the expressions are collected into one big array.
          You can use it to construct an array out of a known quantity
          of values (as in `[.foo, .bar, .baz]`) or to "collect" all the
          results of a filter into an array (as in `[.items[].name]`)

          Once you understand the "," operator, you can look at jq's array
          syntax in a different light: the expression `[1,2,3]` is not using a
          built-in syntax for comma-separated arrays, but is instead applying
          the `[]` operator (collect results) to the expression 1,2,3 (which
          produces three different results).

          If you have a filter `X` that produces four results,
          then the expression `[X]` will produce a single result, an
          array of four elements.

        examples:
          - program: "[.user, .projects[]]"
            input: '{"user":"stedolan", "projects": ["jq", "wikiflow"]}'
            output: ['["stedolan", "jq", "wikiflow"]']
          - program: "[ .[] | . * 2]"
            input: '[1, 2, 3]'
            output: ['[2, 4, 6]']

      - title: "Object Construction: `{}`"
        body: |

          Like JSON, `{}` is for constructing objects (aka
          dictionaries or hashes), as in: `{"a": 42, "b": 17}`.

          If the keys are "identifier-like", then the quotes can be left
          off, as in `{a:42, b:17}`.  Variable references as key
          expressions use the value of the variable as the key.  Key
          expressions other than constant literals, identifiers, or
          variable references, need to be parenthesized, e.g.,
          `{("a"+"b"):59}`.

          The value can be any expression (although you may need to wrap
          it in parentheses if, for example, it contains colons), which
          gets applied to the {} expression's input (remember, all
          filters have an input and an output).

              {foo: .bar}

          will produce the JSON object `{"foo": 42}` if given the JSON
          object `{"bar":42, "baz":43}` as its input. You can use this
          to select particular fields of an object: if the input is an
          object with "user", "title", "id", and "content" fields and
          you just want "user" and "title", you can write

              {user: .user, title: .title}

          Because that is so common, there's a shortcut syntax for it:
          `{user, title}`.

          If one of the expressions produces multiple results,
          multiple dictionaries will be produced. If the input's

              {"user":"stedolan","titles":["JQ Primer", "More JQ"]}

          then the expression

              {user, title: .titles[]}

          will produce two outputs:

              {"user":"stedolan", "title": "JQ Primer"}
              {"user":"stedolan", "title": "More JQ"}

          Putting parentheses around the key means it will be evaluated as an
          expression. With the same input as above,

              {(.user): .titles}

          produces

              {"stedolan": ["JQ Primer", "More JQ"]}

          Variable references as keys use the value of the variable as
          the key.  Without a value then the variable's name becomes the
          key and its value becomes the value,

              "f o o" as $foo | "b a r" as $bar | {$foo, $bar:$foo}

          produces

              {"foo":"f o o","b a r":"f o o"}

        examples:
          - program: '{user, title: .titles[]}'
            input: '{"user":"stedolan","titles":["JQ Primer", "More JQ"]}'
            output:
              - '{"user":"stedolan", "title": "JQ Primer"}'
              - '{"user":"stedolan", "title": "More JQ"}'
          - program: '{(.user): .titles}'
            input: '{"user":"stedolan","titles":["JQ Primer", "More JQ"]}'
            output: ['{"stedolan": ["JQ Primer", "More JQ"]}']

      - title: "Recursive Descent: `..`"
        body: |

          Recursively descends `.`, producing every value.  This is the
          same as the zero-argument `recurse` builtin (see below).  This
          is intended to resemble the XPath `//` operator.  Note that
          `..a` does not work; use `.. | .a` instead.  In the example
          below we use `.. | .a?` to find all the values of object keys
          "a" in any object found "below" `.`.

          This is particularly useful in conjunction with `path(EXP)`
          (also see below) and the `?` operator.

        examples:
          - program: '.. | .a?'
            input: '[[{"a":1}]]'
            output: ['1']

  - title: Builtin operators and functions
    body: |

      Some jq operators (for instance, `+`) do different things
      depending on the type of their arguments (arrays, numbers,
      etc.). However, jq never does implicit type conversions. If you
      try to add a string to an object you'll get an error message and
      no result.

      Please note that all numbers are converted to IEEE754 double precision
      floating point representation. Arithmetic and logical operators are working
      with these converted doubles. Results of all such operations are also limited
      to the double precision.

      The only exception to this behaviour of number is a snapshot of original number
      literal. When a number which originally was provided as a literal is never
      mutated until the end of the program then it is printed to the output in its
      original literal form. This also includes cases when the original literal
      would be truncated when converted to the IEEE754 double precision floating point
      number.

    entries:
      - title: "Addition: `+`"
        body: |

          The operator `+` takes two filters, applies them both
          to the same input, and adds the results together. What
          "adding" means depends on the types involved:

          - **Numbers** are added by normal arithmetic.

          - **Arrays** are added by being concatenated into a larger array.

          - **Strings** are added by being joined into a larger string.

          - **Objects** are added by merging, that is, inserting all
            the key-value pairs from both objects into a single
            combined object. If both objects contain a value for the
            same key, the object on the right of the `+` wins. (For
            recursive merge use the `*` operator.)

          `null` can be added to any value, and returns the other
          value unchanged.

        examples:
          - program: '.a + 1'
            input: '{"a": 7}'
            output: ['8']
          - program: '.a + .b'
            input: '{"a": [1,2], "b": [3,4]}'
            output: ['[1,2,3,4]']
          - program: '.a + null'
            input: '{"a": 1}'
            output: ['1']
          - program: '.a + 1'
            input: '{}'
            output: ['1']
          - program: '{a: 1} + {b: 2} + {c: 3} + {a: 42}'
            input: 'null'
            output: ['{"a": 42, "b": 2, "c": 3}']

      - title: "Subtraction: `-`"
        body: |

          As well as normal arithmetic subtraction on numbers, the `-`
          operator can be used on arrays to remove all occurrences of
          the second array's elements from the first array.

        examples:
          - program: '4 - .a'
            input: '{"a":3}'
            output: ['1']
          - program: . - ["xml", "yaml"]
            input: '["xml", "yaml", "json"]'
            output: ['["json"]']

      - title: "Multiplication, division, modulo: `*`, `/`, `%`"
        body: |

          These infix operators behave as expected when given two numbers.
          Division by zero raises an error. `x % y` computes x modulo y.

          Multiplying a string by a number produces the concatenation of
          that string that many times. `"x" * 0` produces `""`.

          Dividing a string by another splits the first using the second
          as separators.

          Multiplying two objects will merge them recursively: this works
          like addition but if both objects contain a value for the
          same key, and the values are objects, the two are merged with
          the same strategy.

        examples:
          - program: '10 / . * 3'
            input: '5'
            output: ['6']
          - program: '. / ", "'
            input: '"a, b,c,d, e"'
            output: ['["a","b,c,d","e"]']
          - program: '{"k": {"a": 1, "b": 2}} * {"k": {"a": 0,"c": 3}}'
            input: 'null'
            output: ['{"k": {"a": 0, "b": 2, "c": 3}}']
          - program: '.[] | (1 / .)?'
            input: '[1,0,-1]'
            output: ['1', '-1']

      - title: "`abs`"
        body: |

          The builtin function `abs` is defined naively as: `if . < 0 then - . else . end`.

          For numeric input, this is the absolute value.  See the
          section on the identity filter for the implications of this
          definition for numeric input.

          To compute the absolute value of a number as a floating point number, you may wish use `fabs`.

        examples:
          - program: 'map(abs)'
            input: '[-10, -1.1, -1e-1]'
            output: ['[10,1.1,1e-1]']

      - title: "`length`"
        body: |

          The builtin function `length` gets the length of various
          different types of value:

          - The length of a **string** is the number of Unicode
            codepoints it contains (which will be the same as its
            JSON-encoded length in bytes if it's pure ASCII).

          - The length of a **number** is its absolute value.

          - The length of an **array** is the number of elements.

          - The length of an **object** is the number of key-value pairs.

          - The length of **null** is zero.

          - It is an error to use `length` on a **boolean**.

        examples:
          - program: '.[] | length'
            input: '[[1,2], "string", {"a":2}, null, -5]'
            output: ['2', '6', '1', '0', '5']


      - title: "`utf8bytelength`"
        body: |

          The builtin function `utf8bytelength` outputs the number of
          bytes used to encode a string in UTF-8.

        examples:
          - program: 'utf8bytelength'
            input: '"\u03bc"'
            output: ['2']

      - title: "`keys`, `keys_unsorted`"
        body: |

          The builtin function `keys`, when given an object, returns
          its keys in an array.

          The keys are sorted "alphabetically", by unicode codepoint
          order. This is not an order that makes particular sense in
     
Download .txt
gitextract_tfjw1qrz/

├── .gitattributes
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   └── bug_report.md
│   ├── dependabot.yml
│   └── workflows/
│       ├── ci.yml
│       ├── decnum.yml
│       ├── manpage.yml
│       ├── oniguruma.yml
│       ├── scanbuild.yml
│       ├── valgrind.yml
│       └── website.yml
├── .gitignore
├── .gitmodules
├── AUTHORS
├── COPYING
├── ChangeLog
├── Dockerfile
├── KEYS
├── Makefile.am
├── NEWS.md
├── README.md
├── SECURITY.md
├── compile-ios.sh
├── config/
│   ├── .gitignore
│   └── m4/
│       ├── .gitignore
│       ├── check-math-func.m4
│       ├── find-func-no-libs.m4
│       ├── find-func-no-libs2.m4
│       ├── find-func.m4
│       └── misc.m4
├── configure.ac
├── docs/
│   ├── Pipfile
│   ├── README.md
│   ├── build_manpage.py
│   ├── build_mantests.py
│   ├── build_website.py
│   ├── content/
│   │   ├── download/
│   │   │   └── default.yml
│   │   ├── index.yml
│   │   ├── manual/
│   │   │   ├── dev/
│   │   │   │   └── manual.yml
│   │   │   ├── v1.3/
│   │   │   │   └── manual.yml
│   │   │   ├── v1.4/
│   │   │   │   └── manual.yml
│   │   │   ├── v1.5/
│   │   │   │   └── manual.yml
│   │   │   ├── v1.6/
│   │   │   │   └── manual.yml
│   │   │   ├── v1.7/
│   │   │   │   └── manual.yml
│   │   │   └── v1.8/
│   │   │       └── manual.yml
│   │   └── tutorial/
│   │       └── default.yml
│   ├── manual_schema.yml
│   ├── public/
│   │   ├── .htaccess
│   │   ├── CNAME
│   │   ├── css/
│   │   │   └── style.css
│   │   ├── js/
│   │   │   └── manual-search.js
│   │   └── robots.txt
│   ├── templates/
│   │   ├── default.html.j2
│   │   ├── index.html.j2
│   │   ├── manual.html.j2
│   │   └── shared/
│   │       ├── _footer.html.j2
│   │       ├── _head.html.j2
│   │       └── _navbar.html.j2
│   └── validate_manual_schema.py
├── jq.1.prebuilt
├── jq.spec
├── libjq.pc.in
├── m4/
│   ├── ax_compare_version.m4
│   ├── ax_prog_bison_version.m4
│   └── ax_pthread.m4
├── scripts/
│   ├── crosscompile
│   ├── gen_utf8_tables.py
│   └── version
├── sig/
│   ├── jq-release-new.key
│   ├── jq-release-old.key
│   ├── v1.3/
│   │   ├── jq-linux-x86.asc
│   │   ├── jq-linux-x86_64.asc
│   │   ├── jq-osx-x86.asc
│   │   ├── jq-osx-x86_64.asc
│   │   ├── jq-win32.exe.asc
│   │   ├── jq-win64.exe.asc
│   │   └── sha256sum.txt
│   ├── v1.4/
│   │   ├── jq-linux-x86.asc
│   │   ├── jq-linux-x86_64.asc
│   │   ├── jq-osx-x86.asc
│   │   ├── jq-osx-x86_64.asc
│   │   ├── jq-solaris11-32.asc
│   │   ├── jq-solaris11-64.asc
│   │   ├── jq-win32.exe.asc
│   │   ├── jq-win64.exe.asc
│   │   └── sha256sum.txt
│   ├── v1.5/
│   │   ├── jq-linux32-no-oniguruma.asc
│   │   ├── jq-linux32.asc
│   │   ├── jq-linux64.asc
│   │   ├── jq-osx-amd64.asc
│   │   ├── jq-win32.exe.asc
│   │   ├── jq-win64.exe.asc
│   │   └── sha256sum.txt
│   ├── v1.5rc1/
│   │   ├── jq-linux-x86_64-static.asc
│   │   ├── jq-win32.exe.asc
│   │   ├── jq-win64.exe.asc
│   │   └── sha256sum.txt
│   ├── v1.5rc2/
│   │   ├── jq-linux-x86.asc
│   │   ├── jq-linux-x86_64.asc
│   │   ├── jq-osx-x86_64.asc
│   │   ├── jq-win32.exe.asc
│   │   ├── jq-win64.exe.asc
│   │   └── sha256sum.txt
│   ├── v1.6/
│   │   ├── jq-linux32.asc
│   │   ├── jq-linux64.asc
│   │   ├── jq-osx-amd64.asc
│   │   ├── jq-win32.exe.asc
│   │   ├── jq-win64.exe.asc
│   │   └── sha256sum.txt
│   ├── v1.7/
│   │   ├── jq-1.7.tar.gz.asc
│   │   ├── jq-1.7.zip.asc
│   │   ├── jq-linux-amd64.asc
│   │   ├── jq-linux-arm64.asc
│   │   ├── jq-linux-armel.asc
│   │   ├── jq-linux-armhf.asc
│   │   ├── jq-linux-i386.asc
│   │   ├── jq-linux-mips.asc
│   │   ├── jq-linux-mips64.asc
│   │   ├── jq-linux-mips64el.asc
│   │   ├── jq-linux-mips64r6.asc
│   │   ├── jq-linux-mips64r6el.asc
│   │   ├── jq-linux-mipsel.asc
│   │   ├── jq-linux-mipsr6.asc
│   │   ├── jq-linux-mipsr6el.asc
│   │   ├── jq-linux-powerpc.asc
│   │   ├── jq-linux-ppc64el.asc
│   │   ├── jq-linux-riscv64.asc
│   │   ├── jq-linux-s390x.asc
│   │   ├── jq-linux32.asc
│   │   ├── jq-linux64.asc
│   │   ├── jq-macos-amd64.asc
│   │   ├── jq-macos-arm64.asc
│   │   ├── jq-osx-amd64.asc
│   │   ├── jq-win32.exe.asc
│   │   ├── jq-win64.exe.asc
│   │   ├── jq-windows-amd64.exe.asc
│   │   ├── jq-windows-i386.exe.asc
│   │   └── sha256sum.txt
│   ├── v1.7.1/
│   │   ├── jq-1.7.1.tar.gz.asc
│   │   ├── jq-1.7.1.zip.asc
│   │   ├── jq-linux-amd64.asc
│   │   ├── jq-linux-arm64.asc
│   │   ├── jq-linux-armel.asc
│   │   ├── jq-linux-armhf.asc
│   │   ├── jq-linux-i386.asc
│   │   ├── jq-linux-mips.asc
│   │   ├── jq-linux-mips64.asc
│   │   ├── jq-linux-mips64el.asc
│   │   ├── jq-linux-mips64r6.asc
│   │   ├── jq-linux-mips64r6el.asc
│   │   ├── jq-linux-mipsel.asc
│   │   ├── jq-linux-mipsr6.asc
│   │   ├── jq-linux-mipsr6el.asc
│   │   ├── jq-linux-powerpc.asc
│   │   ├── jq-linux-ppc64el.asc
│   │   ├── jq-linux-riscv64.asc
│   │   ├── jq-linux-s390x.asc
│   │   ├── jq-linux64.asc
│   │   ├── jq-macos-amd64.asc
│   │   ├── jq-macos-arm64.asc
│   │   ├── jq-osx-amd64.asc
│   │   ├── jq-win64.exe.asc
│   │   ├── jq-windows-amd64.exe.asc
│   │   ├── jq-windows-i386.exe.asc
│   │   └── sha256sum.txt
│   ├── v1.7rc1/
│   │   ├── jq-1.7rc1.tar.gz.asc
│   │   ├── jq-1.7rc1.zip.asc
│   │   ├── jq-linux-amd64.asc
│   │   ├── jq-linux-arm64.asc
│   │   ├── jq-linux-armel.asc
│   │   ├── jq-linux-armhf.asc
│   │   ├── jq-linux-i386.asc
│   │   ├── jq-linux-mips.asc
│   │   ├── jq-linux-mips64.asc
│   │   ├── jq-linux-mips64el.asc
│   │   ├── jq-linux-mips64r6.asc
│   │   ├── jq-linux-mips64r6el.asc
│   │   ├── jq-linux-mipsel.asc
│   │   ├── jq-linux-mipsr6.asc
│   │   ├── jq-linux-mipsr6el.asc
│   │   ├── jq-linux-powerpc.asc
│   │   ├── jq-linux-ppc64el.asc
│   │   ├── jq-linux-riscv64.asc
│   │   ├── jq-linux-s390x.asc
│   │   ├── jq-macos-amd64.asc
│   │   ├── jq-macos-arm64.asc
│   │   ├── jq-windows-amd64.exe.asc
│   │   ├── jq-windows-i386.exe.asc
│   │   └── sha256sum.txt
│   ├── v1.7rc2/
│   │   ├── jq-1.7rc2.tar.gz.asc
│   │   ├── jq-1.7rc2.zip.asc
│   │   ├── jq-linux-amd64.asc
│   │   ├── jq-linux-arm64.asc
│   │   ├── jq-linux-armel.asc
│   │   ├── jq-linux-armhf.asc
│   │   ├── jq-linux-i386.asc
│   │   ├── jq-linux-mips.asc
│   │   ├── jq-linux-mips64.asc
│   │   ├── jq-linux-mips64el.asc
│   │   ├── jq-linux-mips64r6.asc
│   │   ├── jq-linux-mips64r6el.asc
│   │   ├── jq-linux-mipsel.asc
│   │   ├── jq-linux-mipsr6.asc
│   │   ├── jq-linux-mipsr6el.asc
│   │   ├── jq-linux-powerpc.asc
│   │   ├── jq-linux-ppc64el.asc
│   │   ├── jq-linux-riscv64.asc
│   │   ├── jq-linux-s390x.asc
│   │   ├── jq-macos-amd64.asc
│   │   ├── jq-macos-arm64.asc
│   │   ├── jq-windows-amd64.exe.asc
│   │   ├── jq-windows-i386.exe.asc
│   │   └── sha256sum.txt
│   ├── v1.8.0/
│   │   ├── jq-1.8.0.tar.gz.asc
│   │   ├── jq-1.8.0.zip.asc
│   │   ├── jq-linux-amd64.asc
│   │   ├── jq-linux-arm64.asc
│   │   ├── jq-linux-armel.asc
│   │   ├── jq-linux-armhf.asc
│   │   ├── jq-linux-i386.asc
│   │   ├── jq-linux-mips.asc
│   │   ├── jq-linux-mips64.asc
│   │   ├── jq-linux-mips64el.asc
│   │   ├── jq-linux-mips64r6.asc
│   │   ├── jq-linux-mips64r6el.asc
│   │   ├── jq-linux-mipsel.asc
│   │   ├── jq-linux-mipsr6.asc
│   │   ├── jq-linux-mipsr6el.asc
│   │   ├── jq-linux-powerpc.asc
│   │   ├── jq-linux-ppc64el.asc
│   │   ├── jq-linux-riscv64.asc
│   │   ├── jq-linux-s390x.asc
│   │   ├── jq-linux64.asc
│   │   ├── jq-macos-amd64.asc
│   │   ├── jq-macos-arm64.asc
│   │   ├── jq-osx-amd64.asc
│   │   ├── jq-win64.exe.asc
│   │   ├── jq-windows-amd64.exe.asc
│   │   ├── jq-windows-i386.exe.asc
│   │   └── sha256sum.txt
│   └── v1.8.1/
│       ├── jq-1.8.1.tar.gz.asc
│       ├── jq-1.8.1.zip.asc
│       ├── jq-linux-amd64.asc
│       ├── jq-linux-arm64.asc
│       ├── jq-linux-armel.asc
│       ├── jq-linux-armhf.asc
│       ├── jq-linux-i386.asc
│       ├── jq-linux-mips.asc
│       ├── jq-linux-mips64.asc
│       ├── jq-linux-mips64el.asc
│       ├── jq-linux-mips64r6.asc
│       ├── jq-linux-mips64r6el.asc
│       ├── jq-linux-mipsel.asc
│       ├── jq-linux-mipsr6.asc
│       ├── jq-linux-mipsr6el.asc
│       ├── jq-linux-powerpc.asc
│       ├── jq-linux-ppc64el.asc
│       ├── jq-linux-riscv64.asc
│       ├── jq-linux-s390x.asc
│       ├── jq-linux64.asc
│       ├── jq-macos-amd64.asc
│       ├── jq-macos-arm64.asc
│       ├── jq-osx-amd64.asc
│       ├── jq-win64.exe.asc
│       ├── jq-windows-amd64.exe.asc
│       ├── jq-windows-i386.exe.asc
│       └── sha256sum.txt
├── src/
│   ├── builtin.c
│   ├── builtin.h
│   ├── builtin.jq
│   ├── bytecode.c
│   ├── bytecode.h
│   ├── compile.c
│   ├── compile.h
│   ├── exec_stack.h
│   ├── execute.c
│   ├── inject_errors.c
│   ├── jq.h
│   ├── jq_parser.h
│   ├── jq_test.c
│   ├── jv.c
│   ├── jv.h
│   ├── jv_alloc.c
│   ├── jv_alloc.h
│   ├── jv_aux.c
│   ├── jv_dtoa.c
│   ├── jv_dtoa.h
│   ├── jv_dtoa_tsd.c
│   ├── jv_dtoa_tsd.h
│   ├── jv_file.c
│   ├── jv_parse.c
│   ├── jv_print.c
│   ├── jv_private.h
│   ├── jv_thread.h
│   ├── jv_unicode.c
│   ├── jv_unicode.h
│   ├── jv_utf8_tables.h
│   ├── lexer.c
│   ├── lexer.h
│   ├── lexer.l
│   ├── libm.h
│   ├── linker.c
│   ├── linker.h
│   ├── locfile.c
│   ├── locfile.h
│   ├── main.c
│   ├── opcode_list.h
│   ├── parser.c
│   ├── parser.h
│   ├── parser.y
│   ├── util.c
│   └── util.h
├── tests/
│   ├── base64.test
│   ├── base64test
│   ├── jq-f-test.sh
│   ├── jq.test
│   ├── jq_fuzz_compile.c
│   ├── jq_fuzz_execute.cpp
│   ├── jq_fuzz_fixed.cpp
│   ├── jq_fuzz_load_file.c
│   ├── jq_fuzz_parse.c
│   ├── jq_fuzz_parse_extended.c
│   ├── jq_fuzz_parse_stream.c
│   ├── jqtest
│   ├── local.supp
│   ├── man.test
│   ├── manonig.test
│   ├── manonigtest
│   ├── mantest
│   ├── modules/
│   │   ├── a.jq
│   │   ├── b/
│   │   │   └── b.jq
│   │   ├── c/
│   │   │   ├── c.jq
│   │   │   └── d.jq
│   │   ├── data.json
│   │   ├── home1/
│   │   │   └── .jq
│   │   ├── home2/
│   │   │   └── .jq/
│   │   │       └── g.jq
│   │   ├── shadow1.jq
│   │   ├── shadow2.jq
│   │   ├── syntaxerror/
│   │   │   └── syntaxerror.jq
│   │   ├── test_bind_order.jq
│   │   ├── test_bind_order0.jq
│   │   ├── test_bind_order1.jq
│   │   └── test_bind_order2.jq
│   ├── no-main-program.jq
│   ├── onig.supp
│   ├── onig.test
│   ├── onigtest
│   ├── optional.test
│   ├── optionaltest
│   ├── setup
│   ├── shtest
│   ├── torture/
│   │   └── input0.json
│   ├── uri.test
│   ├── uritest
│   ├── utf8test
│   └── yes-main-program.jq
└── vendor/
    └── decNumber/
        ├── ICU-license.html
        ├── decBasic.c
        ├── decCommon.c
        ├── decContext.c
        ├── decContext.h
        ├── decDPD.h
        ├── decDouble.c
        ├── decDouble.h
        ├── decNumber.c
        ├── decNumber.h
        ├── decNumberLocal.h
        ├── decPacked.c
        ├── decPacked.h
        ├── decQuad.c
        ├── decQuad.h
        ├── decSingle.c
        ├── decSingle.h
        ├── decimal128.c
        ├── decimal128.h
        ├── decimal32.c
        ├── decimal32.h
        ├── decimal64.c
        ├── decimal64.h
        ├── example1.c
        ├── example2.c
        ├── example3.c
        ├── example4.c
        ├── example5.c
        ├── example6.c
        ├── example7.c
        ├── example8.c
        └── readme.txt
Download .txt
SYMBOL INDEX (1104 symbols across 70 files)

FILE: docs/build_manpage.py
  class EscapeHtml (line 13) | class EscapeHtml(Extension):
    method extendMarkdown (line 15) | def extendMarkdown(self, md):
  class RoffWalker (line 20) | class RoffWalker(object):
    method __init__ (line 22) | def __init__(self, tree, output=sys.stdout):
    method walk (line 27) | def walk(self):
    method _ul_is_special (line 35) | def _ul_is_special(self, root):
    method _walk_child (line 44) | def _walk_child(self, root):
    method _write_element (line 48) | def _write_element(self, root, ensure_newline=True):
    method _write_tail (line 55) | def _write_tail(self, root, ensure_newline=False, inline=False):
    method _walk (line 65) | def _walk(self, root, parent_tag=None):
    method _base_sanitize (line 163) | def _base_sanitize(self, text):
    method _pre_sanitize (line 170) | def _pre_sanitize(self, text):
    method _code_sanitize (line 173) | def _code_sanitize(self, text):
    method _h3_sanitize (line 178) | def _h3_sanitize(self, text):
    method _sanitize (line 184) | def _sanitize(self, text):
    method __write_cmd (line 191) | def __write_cmd(self, dat):
    method __write_raw (line 195) | def __write_raw(self, dat):
  function load_yml_file (line 200) | def load_yml_file(fn):
  function dedent_body (line 205) | def dedent_body(body):
  function convert_manual_to_markdown (line 210) | def convert_manual_to_markdown():

FILE: docs/build_website.py
  function load_yml_file (line 19) | def load_yml_file(fn):
  function raise_handler (line 43) | def raise_handler(message):
  function generate_file (line 50) | def generate_file(env, fname):
  function copy_public_files (line 73) | def copy_public_files(root=''):

FILE: scripts/gen_utf8_tables.py
  function print_table (line 8) | def print_table(type, name, t):
  function utf8info (line 16) | def utf8info(c):

FILE: src/builtin.c
  function jv (line 52) | static jv type_error(jv bad, const char* msg) {
  function jv (line 61) | static jv type_error2(jv bad1, jv bad2, const char* msg) {
  function jv (line 73) | static inline jv ret_error(jv bad, jv msg) {
  function jv (line 78) | static inline jv ret_error2(jv bad1, jv bad2, jv msg) {
  function jv (line 84) | jv binop_plus(jv a, jv b) {
  function __jq_significand (line 125) | static double __jq_significand(double x) {
  function __jq_significand (line 132) | static double __jq_significand(double x) {
  function jv (line 245) | static jv f_negate(jq_state *jq, jv input) {
  function jv (line 254) | static jv f_startswith(jq_state *jq, jv a, jv b) {
  function jv (line 270) | static jv f_endswith(jq_state *jq, jv a, jv b) {
  function jv (line 289) | jv binop_minus(jv a, jv b) {
  function jv (line 317) | jv binop_multiply(jv a, jv b) {
  function jv (line 344) | jv binop_divide(jv a, jv b) {
  function jv (line 360) | jv binop_mod(jv a, jv b) {
  function jv (line 383) | jv binop_equal(jv a, jv b) {
  function jv (line 387) | jv binop_notequal(jv a, jv b) {
  type cmp_op (line 391) | enum cmp_op {
  function jv (line 398) | static jv order_cmp(jv a, jv b, enum cmp_op op) {
  function jv (line 406) | jv binop_less(jv a, jv b) {
  function jv (line 410) | jv binop_greater(jv a, jv b) {
  function jv (line 414) | jv binop_lesseq(jv a, jv b) {
  function jv (line 418) | jv binop_greatereq(jv a, jv b) {
  function jv (line 422) | static jv f_contains(jq_state *jq, jv a, jv b) {
  function jv (line 430) | static jv f_dump(jq_state *jq, jv input) {
  function jv (line 434) | static jv f_json_parse(jq_state *jq, jv input) {
  function jv (line 443) | static jv f_tonumber(jq_state *jq, jv input) {
  function jv (line 472) | static jv f_toboolean(jq_state *jq, jv input) {
  function jv (line 493) | static jv f_length(jq_state *jq, jv input) {
  function jv (line 512) | static jv f_tostring(jq_state *jq, jv input) {
  function jv (line 520) | static jv f_utf8bytelength(jq_state *jq, jv input) {
  function jv (line 558) | static jv escape_string(jv input, const char* escapings) {
  function jv (line 588) | static jv f_format(jq_state *jq, jv input, jv fmt) {
  function jv (line 817) | static jv f_keys(jq_state *jq, jv input) {
  function jv (line 825) | static jv f_keys_unsorted(jq_state *jq, jv input) {
  function jv (line 833) | static jv f_sort(jq_state *jq, jv input){
  function jv (line 841) | static jv f_sort_by_impl(jq_state *jq, jv input, jv keys) {
  function jv (line 857) | static jv f_bsearch(jq_state *jq, jv input, jv target) {
  function jv (line 885) | static jv f_group_by_impl(jq_state *jq, jv input, jv keys) {
  function jv (line 895) | static jv f_unique(jq_state *jq, jv input) {
  function jv (line 903) | static jv f_unique_by_impl(jq_state *jq, jv input, jv keys) {
  function f_match_name_iter (line 914) | static int f_match_name_iter(const UChar* name, const UChar *name_end, i...
  function jv (line 930) | static jv f_match(jq_state *jq, jv input, jv regex, jv modifiers, jv tes...
  function jv (line 1132) | static jv f_match(jq_state *jq, jv input, jv regex, jv modifiers, jv tes...
  function jv (line 1141) | static jv minmax_by(jv values, jv keys, int is_min) {
  function jv (line 1174) | static jv f_min(jq_state *jq, jv x) {
  function jv (line 1178) | static jv f_max(jq_state *jq, jv x) {
  function jv (line 1182) | static jv f_min_by_impl(jq_state *jq, jv x, jv y) {
  function jv (line 1186) | static jv f_max_by_impl(jq_state *jq, jv x, jv y) {
  function jv (line 1191) | static jv f_type(jq_state *jq, jv input) {
  function jv (line 1197) | static jv f_isinfinite(jq_state *jq, jv input) {
  function jv (line 1208) | static jv f_isnan(jq_state *jq, jv input) {
  function jv (line 1219) | static jv f_isnormal(jq_state *jq, jv input) {
  function jv (line 1230) | static jv f_infinite(jq_state *jq, jv input) {
  function jv (line 1235) | static jv f_nan(jq_state *jq, jv input) {
  function jv (line 1240) | static jv f_error(jq_state *jq, jv input) {
  function jv (line 1249) | static jv f_env(jq_state *jq, jv input) {
  function jv (line 1264) | static jv f_halt(jq_state *jq, jv input) {
  function jv (line 1270) | static jv f_halt_error(jq_state *jq, jv input, jv a) {
  function jv (line 1279) | static jv f_get_search_list(jq_state *jq, jv input) {
  function jv (line 1284) | static jv f_get_prog_origin(jq_state *jq, jv input) {
  function jv (line 1289) | static jv f_get_jq_origin(jq_state *jq, jv input) {
  function jv (line 1294) | static jv f_string_split(jq_state *jq, jv a, jv b) {
  function jv (line 1301) | static jv f_string_explode(jq_state *jq, jv a) {
  function jv (line 1308) | static jv f_string_indexes(jq_state *jq, jv a, jv b) {
  type trim_op (line 1312) | enum trim_op {
  function jv (line 1317) | static jv string_trim(jv a, int op) {
  function jv (line 1360) | static jv f_string_trim(jq_state *jq, jv a)  { return string_trim(a, TRI...
  function jv (line 1361) | static jv f_string_ltrim(jq_state *jq, jv a) { return string_trim(a, TRI...
  function jv (line 1362) | static jv f_string_rtrim(jq_state *jq, jv a) { return string_trim(a, TRI...
  function jv (line 1364) | static jv f_string_implode(jq_state *jq, jv a) {
  function jv (line 1392) | static jv f_setpath(jq_state *jq, jv a, jv b, jv c) { return jv_setpath(...
  function jv (line 1394) | static jv f_getpath(jq_state *jq, jv a, jv b) {
  function jv (line 1397) | static jv f_delpaths(jq_state *jq, jv a, jv b) { return jv_delpaths(a, b...
  function jv (line 1398) | static jv f_has(jq_state *jq, jv a, jv b) { return jv_has(a, b); }
  function jv (line 1400) | static jv f_modulemeta(jq_state *jq, jv a) {
  function jv (line 1407) | static jv f_input(jq_state *jq, jv input) {
  function jv (line 1420) | static jv f_debug(jq_state *jq, jv input) {
  function jv (line 1429) | static jv f_stderr(jq_state *jq, jv input) {
  function jv (line 1438) | static jv tm2jv(struct tm *tm, double fsecs) {
  function setenv (line 1450) | static int setenv(const char *var, const char *val, int ovr)
  function time_t (line 1485) | static time_t my_mktime(struct tm *tm) {
  function set_tm_wday (line 1517) | static void set_tm_wday(struct tm *tm) {
  function set_tm_yday (line 1553) | static void set_tm_yday(struct tm *tm) {
  function jv (line 1573) | static jv f_strptime(jq_state *jq, jv a, jv b) {
  function jv2tm (line 1625) | static int jv2tm(jv a, struct tm *tm, int localtime) {
  function jv (line 1681) | static jv f_mktime(jq_state *jq, jv a) {
  function jv (line 1696) | static jv f_gmtime(jq_state *jq, jv a) {
  function jv (line 1710) | static jv f_gmtime(jq_state *jq, jv a) {
  function jv (line 1724) | static jv f_gmtime(jq_state *jq, jv a) {
  function jv (line 1731) | static jv f_localtime(jq_state *jq, jv a) {
  function jv (line 1745) | static jv f_localtime(jq_state *jq, jv a) {
  function jv (line 1759) | static jv f_localtime(jq_state *jq, jv a) {
  function jv (line 1766) | static jv f_strftime(jq_state *jq, jv a, jv b) {
  function jv (line 1813) | static jv f_strftime(jq_state *jq, jv a, jv b) {
  function jv (line 1821) | static jv f_strflocaltime(jq_state *jq, jv a, jv b) {
  function jv (line 1852) | static jv f_strflocaltime(jq_state *jq, jv a, jv b) {
  function jv (line 1860) | static jv f_now(jq_state *jq, jv a) {
  function jv (line 1868) | static jv f_now(jq_state *jq, jv a) {
  function jv (line 1874) | static jv f_current_filename(jq_state *jq, jv a) {
  function jv (line 1883) | static jv f_current_line(jq_state *jq, jv a) {
  function jv (line 1888) | static jv f_have_decnum(jq_state *jq, jv a) {
  type cfunction (line 1914) | struct cfunction
  type bytecoded_builtin (line 2024) | struct bytecoded_builtin
  type bytecoded_builtin (line 2035) | struct bytecoded_builtin
  function block (line 2073) | static block gen_builtin_list(block builtins) {
  function builtins_bind (line 2078) | int builtins_bind(jq_state *jq, block* bb) {

FILE: src/bytecode.c
  type opcode_description (line 22) | struct opcode_description
  type opcode_description (line 26) | struct opcode_description
  type opcode_description (line 31) | struct opcode_description
  function bytecode_operation_length (line 40) | int bytecode_operation_length(uint16_t* codeptr) {
  function dump_code (line 48) | static void dump_code(int indent, struct bytecode* bc) {
  function symbol_table_free (line 58) | static void symbol_table_free(struct symbol_table* syms) {
  function dump_disassembly (line 64) | void dump_disassembly(int indent, struct bytecode* bc) {
  type bytecode (line 87) | struct bytecode
  type bytecode (line 87) | struct bytecode
  function dump_operation (line 95) | void dump_operation(struct bytecode* bc, uint16_t* codeptr) {
  function bytecode_free (line 149) | void bytecode_free(struct bytecode* bc) {

FILE: src/bytecode.h
  type opcode_description (line 32) | struct opcode_description {
  type opcode_description (line 44) | struct opcode_description
  type cfunction (line 48) | struct cfunction {
  type symbol_table (line 59) | struct symbol_table {
  type bytecode (line 72) | struct bytecode {
  type bytecode (line 90) | struct bytecode
  type bytecode (line 91) | struct bytecode
  type bytecode (line 94) | struct bytecode

FILE: src/compile.c
  type inst (line 23) | struct inst {
  function inst (line 67) | static inst* inst_new(opcode op) {
  function inst_free (line 85) | static void inst_free(struct inst* i) {
  function block (line 97) | static block inst_block(inst* i) {
  function block_is_single (line 102) | int block_is_single(block b) {
  function inst (line 106) | static inst* block_take(block* b) {
  function block (line 120) | block gen_location(location loc, struct locfile* l, block b) {
  function block (line 131) | block gen_noop(void) {
  function block_is_noop (line 136) | int block_is_noop(block b) {
  function block (line 140) | block gen_op_simple(opcode op) {
  function block (line 146) | block gen_error(jv constant) {
  function block (line 153) | block gen_const(jv constant) {
  function block (line 160) | block gen_const_global(jv constant, const char *name) {
  function block (line 170) | block gen_op_pushk_under(jv constant) {
  function block_is_const (line 177) | int block_is_const(block b) {
  function jv_kind (line 181) | jv_kind block_const_kind(block b) {
  function jv (line 186) | jv block_const(block b) {
  function block (line 191) | block gen_op_target(opcode op, block target) {
  function block (line 199) | block gen_op_targetlater(opcode op) {
  function inst_set_target (line 205) | void inst_set_target(block b, block target) {
  function block (line 212) | block gen_op_unbound(opcode op, const char* name) {
  function block (line 220) | block gen_op_var_fresh(opcode op, const char* name) {
  function block (line 227) | block gen_op_bound(opcode op, block binder) {
  function block (line 235) | block gen_dictpair(block k, block v) {
  function inst_join (line 240) | static void inst_join(inst* a, inst* b) {
  function block_append (line 248) | void block_append(block* b, block b2) {
  function block (line 259) | block block_join(block a, block b) {
  function block_has_only_binders_and_imports (line 265) | int block_has_only_binders_and_imports(block binders, int bindflags) {
  function inst_is_binder (line 275) | static int inst_is_binder(inst *i, int bindflags) {
  function block_has_only_binders (line 279) | int block_has_only_binders(block binders, int bindflags) {
  function block_count_actuals (line 291) | static int block_count_actuals(block b) {
  function block_bind_subblock_inner (line 306) | static int block_bind_subblock_inner(int* any_unbound, block binder, blo...
  function block_bind_subblock (line 352) | static int block_bind_subblock(block binder, block body, int bindflags, ...
  function block_bind_each (line 357) | static int block_bind_each(block binder, block body, int bindflags) {
  function block (line 367) | static block block_bind(block binder, block body, int bindflags) {
  function block (line 372) | block block_bind_library(block binder, block body, int bindflags, const ...
  function inst (line 404) | static inst* block_take_last(block* b) {
  function block (line 421) | block block_bind_referenced(block binder, block body, int bindflags) {
  function block (line 437) | block block_bind_self(block binder, int bindflags) {
  function block_mark_referenced (line 451) | static void block_mark_referenced(block body) {
  function block (line 468) | block block_drop_unreferenced(block body) {
  function jv (line 483) | jv block_take_imports(block* body) {
  function jv (line 500) | jv block_list_funcs(block body, int omit_underscores) {
  function block (line 512) | block gen_module(block metadata) {
  function jv (line 522) | jv block_module_meta(block b) {
  function block (line 528) | block gen_import(const char* name, const char* as, int is_data) {
  function block (line 539) | block gen_import_meta(block import, block metadata) {
  function block (line 548) | block gen_function(const char* name, block formals, block body) {
  function block (line 570) | block gen_param_regular(const char* name) {
  function block (line 574) | block gen_param(const char* name) {
  function block (line 578) | block gen_lambda(block body) {
  function block (line 582) | block gen_call(const char* name, block args) {
  function block (line 589) | block gen_subexp(block a) {
  function block (line 601) | block gen_both(block a, block b) {
  function block (line 609) | block gen_const_object(block expr) {
  function block (line 667) | static block gen_const_array(block expr) {
  function block (line 726) | block gen_collect(block expr) {
  function block (line 744) | static block bind_matcher(block matcher, block body) {
  function block_get_unbound_vars (line 758) | static void block_get_unbound_vars(block b, jv *vars) {
  function block (line 778) | static block bind_alternation_matchers(block matchers, block body) {
  function block (line 829) | block gen_reduce(block source, block matcher, block init, block body) {
  function block (line 846) | block gen_foreach(block source, block matcher, block init, block update,...
  function block (line 869) | block gen_definedor(block a, block b) {
  function block_has_main (line 901) | int block_has_main(block top) {
  function block_is_funcdef (line 909) | int block_is_funcdef(block b) {
  function block (line 915) | block gen_condbranch(block iftrue, block iffalse) {
  function block (line 920) | block gen_and(block a, block b) {
  function block (line 930) | block gen_or(block a, block b) {
  function block (line 940) | block gen_destructure_alt(block matcher) {
  function block (line 951) | block gen_var_binding(block var, const char* name, block body) {
  function block (line 955) | block gen_array_matcher(block left, block curr) {
  function block (line 980) | block gen_object_matcher(block name, block curr) {
  function block (line 985) | block gen_destructure(block var, block matchers, block body) {
  function block (line 1001) | static block gen_wildvar_binding(block var, const char* name, block body) {
  function block (line 1007) | block gen_cond(block cond, block iftrue, block iffalse) {
  function block (line 1013) | block gen_try(block exp, block handler) {
  function block (line 1049) | block gen_label(const char *label, block exp) {
  function block (line 1068) | block gen_cbinding(const struct cfunction* cfunctions, int ncfunctions, ...
  function nesting_level (line 1080) | static uint16_t nesting_level(struct bytecode* bc, inst* target) {
  function count_cfunctions (line 1091) | static int count_cfunctions(block b) {
  function jv (line 1104) | static jv
  function expand_call_arglist (line 1124) | static int expand_call_arglist(block* b, jv args, jv *env) {
  function compile (line 1214) | static int compile(struct bytecode* bc, block b, struct locfile* lf, jv ...
  function block_compile (line 1363) | int block_compile(block b, struct bytecode** out, struct locfile* lf, jv...
  function block_free (line 1387) | void block_free(block b) {

FILE: src/compile.h
  type inst (line 8) | struct inst
  type inst (line 9) | typedef struct inst inst;
  type block (line 12) | typedef struct block {
  type locfile (line 17) | struct locfile
  type cfunction (line 65) | struct cfunction
  type bytecode (line 82) | struct bytecode
  type locfile (line 82) | struct locfile

FILE: src/exec_stack.h
  type determine_alignment (line 38) | struct determine_alignment {
  type determine_alignment (line 42) | struct determine_alignment
  function align_round_up (line 44) | static size_t align_round_up(size_t sz) {
  type stack_ptr (line 48) | typedef int stack_ptr;
  type stack (line 50) | struct stack {
  function stack_init (line 56) | static void stack_init(struct stack* s) {
  function stack_reset (line 62) | static void stack_reset(struct stack* s) {
  function stack_pop_will_free (line 71) | static int stack_pop_will_free(struct stack* s, stack_ptr p) {
  type stack (line 75) | struct stack
  function stack_ptr (line 79) | static stack_ptr* stack_block_next(struct stack* s, stack_ptr p) {
  function stack_reallocate (line 83) | static void stack_reallocate(struct stack* s, size_t sz) {
  function stack_ptr (line 95) | static stack_ptr stack_push_block(struct stack* s, stack_ptr p, size_t s...
  function stack_ptr (line 106) | static stack_ptr stack_pop_block(struct stack* s, stack_ptr p, size_t sz) {

FILE: src/execute.c
  type jq_state (line 19) | struct jq_state {
  type closure (line 53) | struct closure {
  type closure (line 60) | struct closure
  type frame (line 65) | struct frame {
  function frame_size (line 73) | static int frame_size(struct bytecode* bc) {
  type frame (line 77) | struct frame
  type jq_state (line 77) | struct jq_state
  type frame (line 78) | struct frame
  type frame (line 82) | struct frame
  type bytecode (line 83) | struct bytecode
  function stack_ptr (line 91) | static stack_ptr frame_get_level(struct jq_state* jq, int level) {
  function jv (line 100) | static jv* frame_local_var(struct jq_state* jq, int var, int level) {
  function make_closure (line 107) | static struct closure make_closure(struct jq_state* jq, uint16_t* pc) {
  type frame (line 130) | struct frame
  type jq_state (line 130) | struct jq_state
  type closure (line 130) | struct closure
  type frame (line 133) | struct frame
  function frame_pop (line 150) | static void frame_pop(struct jq_state* jq) {
  function stack_push (line 162) | void stack_push(jq_state *jq, jv val) {
  function jv (line 169) | jv stack_pop(jq_state *jq) {
  function jv (line 182) | jv stack_popn(jq_state *jq) {
  type forkpoint (line 194) | struct forkpoint {
  type stack_pos (line 202) | struct stack_pos {
  function stack_get_pos (line 206) | struct stack_pos stack_get_pos(jq_state* jq) {
  function stack_save (line 211) | void stack_save(jq_state *jq, uint16_t* retaddr, struct stack_pos sp){
  function path_intact (line 225) | static int path_intact(jq_state *jq, jv curr) {
  function path_append (line 234) | static void path_append(jq_state* jq, jv component, jv value_at_path) {
  function jv (line 249) | jv
  type forkpoint (line 285) | struct forkpoint
  type forkpoint (line 299) | struct forkpoint
  function jq_reset (line 303) | static void jq_reset(jq_state *jq) {
  function jq_report_error (line 326) | void jq_report_error(jq_state *jq, jv value) {
  function set_error (line 332) | static void set_error(jq_state *jq, jv value) {
  function jv (line 340) | jv jq_next(jq_state *jq) {
  function jv (line 1005) | jv jq_format_error(jv msg) {
  function default_err_cb (line 1048) | static void default_err_cb(void *data, jv msg) {
  function jq_state (line 1054) | jq_state *jq_init(void) {
  function jq_set_error_cb (line 1094) | void jq_set_error_cb(jq_state *jq, jq_msg_cb cb, void *data) {
  function jq_get_error_cb (line 1104) | void jq_get_error_cb(jq_state *jq, jq_msg_cb *cb, void **data) {
  function jq_set_nomem_handler (line 1109) | void jq_set_nomem_handler(jq_state *jq, void (*nomem_handler)(void *), v...
  function jq_start (line 1116) | void jq_start(jq_state *jq, jv input, int flags) {
  function jq_teardown (line 1131) | void jq_teardown(jq_state **jq) {
  function ret_follows (line 1145) | static int ret_follows(uint16_t *pc) {
  function tail_call_analyze (line 1177) | static uint16_t tail_call_analyze(uint16_t *pc) {
  type bytecode (line 1190) | struct bytecode
  type bytecode (line 1190) | struct bytecode
  type bytecode (line 1208) | struct bytecode
  type bytecode (line 1208) | struct bytecode
  function jv (line 1215) | static jv
  function jq_compile_args (line 1232) | int jq_compile_args(jq_state *jq, const char* str, jv args) {
  function jq_compile (line 1260) | int jq_compile(jq_state *jq, const char* str) {
  function jv (line 1264) | jv jq_get_jq_origin(jq_state *jq) {
  function jv (line 1268) | jv jq_get_prog_origin(jq_state *jq) {
  function jv (line 1272) | jv jq_get_lib_dirs(jq_state *jq) {
  function jq_set_attrs (line 1277) | void jq_set_attrs(jq_state *jq, jv attrs) {
  function jq_set_attr (line 1283) | void jq_set_attr(jq_state *jq, jv attr, jv val) {
  function jv (line 1287) | jv jq_get_attr(jq_state *jq, jv attr) {
  function jq_dump_disassembly (line 1291) | void jq_dump_disassembly(jq_state *jq, int indent) {
  function jq_set_input_cb (line 1295) | void jq_set_input_cb(jq_state *jq, jq_input_cb cb, void *data) {
  function jq_get_input_cb (line 1300) | void jq_get_input_cb(jq_state *jq, jq_input_cb *cb, void **data) {
  function jq_set_debug_cb (line 1305) | void jq_set_debug_cb(jq_state *jq, jq_msg_cb cb, void *data) {
  function jq_get_debug_cb (line 1310) | void jq_get_debug_cb(jq_state *jq, jq_msg_cb *cb, void **data) {
  function jq_set_stderr_cb (line 1315) | void jq_set_stderr_cb(jq_state *jq, jq_msg_cb cb, void *data) {
  function jq_get_stderr_cb (line 1320) | void jq_get_stderr_cb(jq_state *jq, jq_msg_cb *cb, void **data) {
  function jq_halt (line 1325) | void
  function jq_halted (line 1334) | int
  function jv (line 1340) | jv jq_get_exit_code(jq_state *jq)
  function jv (line 1345) | jv jq_get_error_message(jq_state *jq)

FILE: src/inject_errors.c
  function FILE (line 39) | FILE *fopen(const char *path, const char *mode) {
  function fclose (line 59) | int fclose(FILE *f) {
  function fread (line 77) | size_t fread(void *buf, size_t sz, size_t nemb, FILE *f) {
  function fwrite (line 85) | size_t fwrite(const void *buf, size_t sz, size_t nemb, FILE *f) {
  function ferror (line 93) | int ferror(FILE *f) {
  function clearerr (line 103) | void clearerr(FILE *f) {

FILE: src/jq.h
  type jq_state (line 17) | typedef struct jq_state jq_state;
  type jv (line 38) | typedef jv (*jq_input_cb)(jq_state *, void *);
  type jq_util_input_state (line 60) | typedef struct jq_util_input_state jq_util_input_state;

FILE: src/jq_parser.h
  type locfile (line 6) | struct locfile
  type locfile (line 7) | struct locfile

FILE: src/jq_test.c
  function jq_testsuite (line 21) | int jq_testsuite(jv libdirs, int verbose, int argc, char* argv[]) {
  function skipline (line 63) | static int skipline(const char* buf) {
  function checkerrormsg (line 70) | static int checkerrormsg(const char* buf) {
  function checkfail (line 74) | static int checkfail(const char* buf) {
  type err_data (line 78) | struct err_data {
  function test_err_cb (line 82) | static void test_err_cb(void *data, jv e) {
  function run_jq_tests (line 91) | static void run_jq_tests(jv lib_dirs, int verbose, FILE *testdata, int s...
  function test_start_state (line 277) | static int test_start_state(jq_state *jq, char *prog) {
  function test_jq_start_resets_state (line 302) | static void test_jq_start_resets_state(char *prog, const char *input) {
  function run_jq_start_state_tests (line 331) | static void run_jq_start_state_tests(void) {
  function compile_args_and_check (line 336) | static void compile_args_and_check(jq_state *jq, const char *prog,
  function run_jq_compile_args_tests (line 355) | static void run_jq_compile_args_tests(void) {
  function run_jq_recompile_tests (line 401) | static void run_jq_recompile_tests(void) {
  function run_jq_exhaust_and_reuse_tests (line 464) | static void run_jq_exhaust_and_reuse_tests(void) {
  type test_pthread_data (line 521) | struct test_pthread_data {
  function test_pthread_jq_parse (line 525) | static int test_pthread_jq_parse(jq_state *jq, struct jv_parser *parser)
  type test_pthread_data (line 551) | struct test_pthread_data
  type jv_parser (line 559) | struct jv_parser
  type test_pthread_data (line 572) | struct test_pthread_data
  function jv_test (line 604) | static void jv_test(void) {

FILE: src/jv.c
  type jv_refcnt (line 53) | typedef struct jv_refcnt {
  function jvp_refcnt_inc (line 59) | static void jvp_refcnt_inc(jv_refcnt* c) {
  function jvp_refcnt_dec (line 63) | static int jvp_refcnt_dec(jv_refcnt* c) {
  function jvp_refcnt_unshared (line 68) | static int jvp_refcnt_unshared(jv_refcnt* c) {
  type payload_flags (line 77) | typedef enum {
  function jv_kind (line 98) | jv_kind jv_get_kind(jv x) {
  function jv (line 122) | jv jv_true(void) {
  function jv (line 126) | jv jv_false(void) {
  function jv (line 130) | jv jv_null(void) {
  function jv (line 134) | jv jv_bool(int x) {
  type jvp_invalid (line 144) | typedef struct {
  function jv (line 149) | jv jv_invalid_with_msg(jv err) {
  function jv (line 158) | jv jv_invalid(void) {
  function jv (line 162) | jv jv_invalid_get_msg(jv inv) {
  function jv_invalid_has_msg (line 177) | int jv_invalid_has_msg(jv inv) {
  function jvp_invalid_free (line 184) | static void jvp_invalid_free(jv x) {
  type tls_keys (line 238) | typedef struct tls_keys tls_keys;
  type tls_keys (line 239) | struct tls_keys {
  type tls_values (line 254) | struct tls_values {
  type nomem_handler (line 260) | struct nomem_handler
  type tls_values (line 262) | struct tls_values
  function w32_service_thread_detach (line 267) | static void
  function BOOL (line 304) | BOOL WINAPI DllMain(HINSTANCE hinstDLL,
  function pthread_key_create (line 326) | int
  function key_lookup (line 400) | static void
  function pthread_setspecific (line 437) | int
  function jv_tsd_dec_ctx_fini (line 495) | void jv_tsd_dec_ctx_fini(void) {
  function jv_tsd_dec_ctx_init (line 500) | void jv_tsd_dec_ctx_init(void) {
  function decContext (line 508) | static decContext* tsd_dec_ctx_get(pthread_key_t *key) {
  type jvp_literal_number (line 533) | typedef struct {
  type decNumberDoublePrecision (line 540) | typedef struct {
  function jvp_number_is_literal (line 546) | static inline int jvp_number_is_literal(jv n) {
  function jvp_literal_number (line 551) | static jvp_literal_number* jvp_literal_number_ptr(jv j) {
  function decNumber (line 556) | static decNumber* jvp_dec_number_ptr(jv j) {
  function jvp_literal_number (line 561) | static jvp_literal_number* jvp_literal_number_alloc(unsigned literal_len...
  function jv (line 576) | static jv jvp_literal_number_new(const char * literal) {
  function jvp_literal_number_to_double (line 601) | static double jvp_literal_number_to_double(jv j) {
  function jv_number_has_literal (line 654) | int jv_number_has_literal(jv n) {
  function jv (line 669) | jv jv_number_with_literal(const char * literal) {
  function jv (line 674) | jv jv_number(double x) {
  function jvp_number_free (line 686) | static void jvp_number_free(jv j) {
  function jv_number_value (line 699) | double jv_number_value(jv j) {
  function jv_is_integer (line 715) | int jv_is_integer(jv j){
  function jvp_number_is_nan (line 728) | int jvp_number_is_nan(jv n) {
  function jv (line 740) | jv jv_number_abs(jv n) {
  function jv (line 755) | jv jv_number_negate(jv n) {
  function jvp_number_cmp (line 770) | int jvp_number_cmp(jv a, jv b) {
  function jvp_number_equal (line 805) | static int jvp_number_equal(jv a, jv b) {
  function imax (line 816) | static int imax(int a, int b) {
  type jvp_array (line 822) | typedef struct {
  function jvp_array (line 828) | static jvp_array* jvp_array_ptr(jv a) {
  function jvp_array (line 833) | static jvp_array* jvp_array_alloc(unsigned size) {
  function jv (line 841) | static jv jvp_array_new(unsigned size) {
  function jvp_array_free (line 846) | static void jvp_array_free(jv a) {
  function jvp_array_length (line 857) | static int jvp_array_length(jv a) {
  function jvp_array_offset (line 862) | static int jvp_array_offset(jv a) {
  function jv (line 867) | static jv* jvp_array_read(jv a, int i) {
  function jv (line 878) | static jv* jvp_array_write(jv* a, int i) {
  function jvp_array_equal (line 911) | static int jvp_array_equal(jv a, jv b) {
  function jvp_clamp_slice_params (line 925) | static void jvp_clamp_slice_params(int len, int *pstart, int *pend)
  function jvp_array_contains (line 937) | static int jvp_array_contains(jv a, jv b) {
  function jv (line 961) | static jv jvp_array_slice(jv a, int start, int end) {
  function jv (line 990) | jv jv_array_sized(int n) {
  function jv (line 994) | jv jv_array(void) {
  function jv_array_length (line 998) | int jv_array_length(jv j) {
  function jv (line 1005) | jv jv_array_get(jv j, int idx) {
  function jv (line 1018) | jv jv_array_set(jv j, int idx, jv val) {
  function jv (line 1040) | jv jv_array_append(jv j, jv val) {
  function jv (line 1045) | jv jv_array_concat(jv a, jv b) {
  function jv (line 1058) | jv jv_array_slice(jv a, int start, int end) {
  function jv (line 1064) | jv jv_array_indexes(jv a, jv b) {
  type jvp_string (line 1090) | typedef struct {
  function jvp_string (line 1100) | static jvp_string* jvp_string_ptr(jv a) {
  function jvp_string (line 1105) | static jvp_string* jvp_string_alloc(uint32_t size) {
  function jv (line 1113) | static jv jvp_string_copy_replace_bad(const char* data, uint32_t length) {
  function jv (line 1137) | static jv jvp_string_new(const char* data, uint32_t length) {
  function jv (line 1147) | static jv jvp_string_empty_new(uint32_t length) {
  function jvp_string_free (line 1157) | static void jvp_string_free(jv js) {
  function jvp_string_length (line 1164) | static uint32_t jvp_string_length(jvp_string* s) {
  function jvp_string_remaining_space (line 1168) | static uint32_t jvp_string_remaining_space(jvp_string* s) {
  function jv (line 1174) | static jv jvp_string_append(jv string, const char* data, uint32_t len) {
  function rotl32 (line 1202) | static uint32_t rotl32 (uint32_t x, int8_t r){
  function jvp_string_hash (line 1206) | static uint32_t jvp_string_hash(jv jstr) {
  function jvp_string_equal (line 1265) | static int jvp_string_equal(jv a, jv b) {
  function jv (line 1278) | jv jv_string_sized(const char* str, int len) {
  function jv (line 1285) | jv jv_string_empty(int len) {
  function jv (line 1289) | jv jv_string(const char* str) {
  function jv_string_length_bytes (line 1293) | int jv_string_length_bytes(jv j) {
  function jv_string_length_codepoints (line 1300) | int jv_string_length_codepoints(jv j) {
  function jv (line 1311) | jv jv_string_indexes(jv j, jv k) {
  function jv (line 1340) | jv jv_string_repeat(jv j, int n) {
  function jv (line 1366) | jv jv_string_split(jv j, jv sep) {
  function jv (line 1401) | jv jv_string_explode(jv j) {
  function jv (line 1416) | jv jv_string_implode(jv j) {
  function jv_string_hash (line 1439) | unsigned long jv_string_hash(jv j) {
  function jv (line 1451) | jv jv_string_slice(jv j, int start, int end) {
  function jv (line 1500) | jv jv_string_concat(jv a, jv b) {
  function jv (line 1507) | jv jv_string_append_buf(jv a, const char* buf, int len) {
  function jv (line 1517) | jv jv_string_append_codepoint(jv a, uint32_t c) {
  function jv (line 1524) | jv jv_string_append_str(jv a, const char* str) {
  function jv (line 1528) | jv jv_string_vfmt(const char* fmt, va_list ap) {
  function jv (line 1551) | jv jv_string_fmt(const char* fmt, ...) {
  type object_slot (line 1565) | struct object_slot {
  type jvp_object (line 1572) | typedef struct {
  function jv (line 1580) | static jv jvp_object_new(int size) {
  function jvp_object (line 1605) | static jvp_object* jvp_object_ptr(jv o) {
  function jvp_object_mask (line 1610) | static uint32_t jvp_object_mask(jv o) {
  function jvp_object_size (line 1615) | static int jvp_object_size(jv o) {
  type object_slot (line 1628) | struct object_slot
  type object_slot (line 1634) | struct object_slot
  type object_slot (line 1634) | struct object_slot
  type object_slot (line 1638) | struct object_slot
  type object_slot (line 1640) | struct object_slot
  type object_slot (line 1650) | struct object_slot
  type object_slot (line 1654) | struct object_slot
  function jv (line 1663) | static jv* jvp_object_read(jv object, jv key) {
  function jvp_object_free (line 1671) | static void jvp_object_free(jv o) {
  function jvp_object_rehash (line 1685) | static int jvp_object_rehash(jv *objectp) {
  function jv (line 1708) | static jv jvp_object_unshare(jv object) {
  function jvp_object_write (line 1734) | static int jvp_object_write(jv* object, jv key, jv **valpp) {
  function jvp_object_delete (line 1763) | static int jvp_object_delete(jv* object, jv key) {
  function jvp_object_length (line 1784) | static int jvp_object_length(jv object) {
  function jvp_object_equal (line 1793) | static int jvp_object_equal(jv o1, jv o2) {
  function jvp_object_contains (line 1808) | static int jvp_object_contains(jv a, jv b) {
  function jv (line 1827) | jv jv_object(void) {
  function jv (line 1831) | jv jv_object_get(jv object, jv key) {
  function jv_object_has (line 1846) | int jv_object_has(jv object, jv key) {
  function jv (line 1856) | jv jv_object_set(jv object, jv key, jv value) {
  function jv (line 1871) | jv jv_object_delete(jv object, jv key) {
  function jv_object_length (line 1879) | int jv_object_length(jv object) {
  function jv (line 1886) | jv jv_object_merge(jv a, jv b) {
  function jv (line 1896) | jv jv_object_merge_recursive(jv a, jv b) {
  function jv_object_iter_valid (line 1922) | int jv_object_iter_valid(jv object, int i) {
  function jv_object_iter (line 1926) | int jv_object_iter(jv object) {
  function jv_object_iter_next (line 1931) | int jv_object_iter_next(jv object, int iter) {
  function jv (line 1946) | jv jv_object_iter_key(jv object, int iter) {
  function jv (line 1952) | jv jv_object_iter_value(jv object, int iter) {
  function jv (line 1959) | jv jv_copy(jv j) {
  function jv_free (line 1966) | void jv_free(jv j) {
  function jv_get_refcnt (line 1986) | int jv_get_refcnt(jv j) {
  function jv_equal (line 1998) | int jv_equal(jv a, jv b) {
  function jv_identical (line 2032) | int jv_identical(jv a, jv b) {
  function jv_contains (line 2050) | int jv_contains(jv a, jv b) {

FILE: src/jv.h
  type jv_kind (line 19) | typedef enum {
  type jv_refcnt (line 30) | struct jv_refcnt
  type jv (line 34) | typedef struct {
  function jv_is_valid (line 52) | static int jv_is_valid(jv x) { return jv_get_kind(x) != JV_KIND_INVALID; }
  type jv_print_flags (line 218) | enum jv_print_flags {
  type jv_parser (line 254) | typedef struct jv_parser jv_parser;

FILE: src/jv_alloc.c
  type nomem_handler (line 7) | struct nomem_handler {
  type nomem_handler (line 20) | struct nomem_handler
  type nomem_handler (line 25) | struct nomem_handler
  function jv_nomem_handler (line 33) | void jv_nomem_handler(jv_nomem_handler_f handler, void *data) {
  function memory_exhausted (line 37) | static void memory_exhausted(void) {
  function tsd_fini (line 54) | static void tsd_fini(void) {
  function tsd_fini_thread (line 66) | static void tsd_fini_thread(void *nomem_handler) {
  function tsd_init (line 70) | static void tsd_init(void) {
  function tsd_init_nomem_handler (line 81) | static void tsd_init_nomem_handler(void)
  function jv_nomem_handler (line 92) | void jv_nomem_handler(jv_nomem_handler_f handler, void *data) {
  function memory_exhausted (line 108) | static void memory_exhausted(void) {
  type nomem_handler (line 126) | struct nomem_handler
  function jv_nomem_handler (line 127) | void jv_nomem_handler(jv_nomem_handler_f handler, void *data) {
  function memory_exhausted (line 132) | static void memory_exhausted(void) {
  function jv_mem_free (line 179) | void jv_mem_free(void* p) {

FILE: src/jv_aux.c
  function jv_number_get_value_and_consume (line 13) | static double jv_number_get_value_and_consume(jv number) {
  function jv (line 19) | static jv parse_slice(jv j, jv slice, int* pstart, int* pend) {
  function jv (line 80) | jv jv_get(jv t, jv k) {
  function jv (line 146) | jv jv_set(jv t, jv k, jv v) {
  function jv (line 230) | jv jv_has(jv t, jv k) {
  function jv (line 265) | static jv jv_dels(jv t, jv keys) {
  function jv (line 368) | jv jv_setpath(jv root, jv path, jv value) {
  function jv (line 421) | jv jv_getpath(jv root, jv path) {
  function jv (line 441) | static jv delpaths_sorted(jv object, jv paths, int start) {
  function jv (line 489) | jv jv_delpaths(jv object, jv paths) {
  function string_cmp (line 522) | static int string_cmp(const void* pa, const void* pb){
  function jv (line 533) | jv jv_keys_unsorted(jv x) {
  function jv (line 545) | jv jv_keys(jv x) {
  function jv_cmp (line 579) | int jv_cmp(jv a, jv b) {
  type sort_entry (line 654) | struct sort_entry {
  function sort_cmp (line 660) | static int sort_cmp(const void* pa, const void* pb) {
  type sort_entry (line 668) | struct sort_entry
  type sort_entry (line 678) | struct sort_entry
  type sort_entry (line 678) | struct sort_entry
  type sort_entry (line 686) | struct sort_entry
  function jv (line 690) | jv jv_sort(jv objects, jv keys) {
  function jv (line 705) | jv jv_group(jv objects, jv keys) {
  function jv (line 733) | jv jv_unique(jv objects, jv keys) {

FILE: src/jv_dtoa.c
  type ULong (line 208) | typedef unsigned Long ULong;
  type U (line 305) | typedef union { double d; ULong L[2]; } U;
  type BCinfo (line 485) | typedef struct BCinfo BCinfo;
  type BCinfo (line 486) | struct
  type Bigint (line 512) | struct
  type Bigint (line 519) | typedef struct Bigint Bigint;
  function jvp_dtoa_context_init (line 522) | void jvp_dtoa_context_init(struct dtoa_context* C) {
  function Bigint (line 530) | static Bigint *
  function Bfree (line 550) | static void
  function jvp_dtoa_context_free (line 569) | void jvp_dtoa_context_free(struct dtoa_context* C) {
  function Bigint (line 589) | static Bigint *
  function Bigint (line 642) | static Bigint *
  function hi0bits (line 676) | static int
  function lo0bits (line 706) | static int
  function Bigint (line 750) | static Bigint *
  function Bigint (line 762) | static Bigint *
  function Bigint (line 869) | static Bigint *
  function Bigint (line 904) | static Bigint *
  function cmp (line 960) | static int
  function Bigint (line 990) | static Bigint *
  type dtoa_context (line 1082) | struct dtoa_context
  function b2d (line 1118) | static double
  function Bigint (line 1184) | static Bigint *
  function ratio (line 1314) | static double
  function htinit (line 1404) | static void
  function hexdig_init (line 1412) | static void
  function match (line 1432) | static int
  function hexnan (line 1450) | static void
  function Bigint (line 1526) | static Bigint *
  function rshift (line 1557) | static void
  function ULong (line 1586) | static ULong
  type dtoa_context (line 1620) | struct dtoa_context
  function dshift (line 1976) | static int
  type dtoa_context (line 1987) | struct dtoa_context
  function sulp (line 2106) | static double
  type dtoa_context (line 2126) | struct dtoa_context
  type dtoa_context (line 2330) | struct dtoa_context
  function else (line 2621) | else if (e >= -Ten_pmax) {
  type dtoa_context (line 3395) | struct dtoa_context
  type dtoa_context (line 3411) | struct dtoa_context
  function jvp_freedtoa (line 3428) | void
  type dtoa_context (line 3472) | struct dtoa_context
  type dtoa_context (line 4206) | struct dtoa_context

FILE: src/jv_dtoa.h
  type Bigint (line 5) | struct Bigint
  type dtoa_context (line 6) | struct dtoa_context {
  type dtoa_context (line 11) | struct dtoa_context
  type dtoa_context (line 12) | struct dtoa_context
  type dtoa_context (line 14) | struct dtoa_context
  type dtoa_context (line 17) | struct dtoa_context
  type dtoa_context (line 18) | struct dtoa_context
  type dtoa_context (line 21) | struct dtoa_context

FILE: src/jv_dtoa_tsd.c
  function tsd_dtoa_ctx_dtor (line 12) | static void tsd_dtoa_ctx_dtor(void *ctx) {
  function jv_tsd_dtoa_ctx_fini (line 22) | void jv_tsd_dtoa_ctx_fini(void) {
  function jv_tsd_dtoa_ctx_init (line 31) | void jv_tsd_dtoa_ctx_init(void) {
  type dtoa_context (line 39) | struct dtoa_context
  type dtoa_context (line 41) | struct dtoa_context
  type dtoa_context (line 41) | struct dtoa_context
  type dtoa_context (line 43) | struct dtoa_context

FILE: src/jv_dtoa_tsd.h
  type dtoa_context (line 3) | struct dtoa_context

FILE: src/jv_file.c
  function jv (line 12) | jv jv_load_file(const char* filename, int raw) {

FILE: src/jv_parse.c
  type last_seen (line 24) | enum last_seen {
  type jv_parser (line 33) | struct jv_parser {
  function parser_init (line 69) | static void parser_init(struct jv_parser* p, int flags) {
  function parser_reset (line 99) | static void parser_reset(struct jv_parser* p) {
  function parser_free (line 117) | static void parser_free(struct jv_parser* p) {
  function pfunc (line 126) | static pfunc value(struct jv_parser* p, jv val) {
  function push (line 147) | static void push(struct jv_parser* p, jv v) {
  function pfunc (line 157) | static pfunc parse_token(struct jv_parser* p, char ch) {
  function pfunc (line 242) | static pfunc stream_token(struct jv_parser* p, char ch) {
  function tokenadd (line 422) | static void tokenadd(struct jv_parser* p, char c) {
  function unhex4 (line 432) | static int unhex4(char* hex) {
  function pfunc (line 447) | static pfunc found_string(struct jv_parser* p) {
  function pfunc (line 507) | static pfunc check_literal(struct jv_parser* p) {
  type chclass (line 552) | typedef enum {
  function chclass (line 560) | static chclass classify(char c) {
  function parse_check_done (line 584) | static int parse_check_done(struct jv_parser* p, jv* out) {
  function stream_check_done (line 594) | static int stream_check_done(struct jv_parser* p, jv* out) {
  function seq_check_truncation (line 616) | static int seq_check_truncation(struct jv_parser* p) {
  function stream_seq_check_truncation (line 620) | static int stream_seq_check_truncation(struct jv_parser* p) {
  function parse_is_top_num (line 625) | static int parse_is_top_num(struct jv_parser* p) {
  function stream_is_top_num (line 629) | static int stream_is_top_num(struct jv_parser* p) {
  function pfunc (line 645) | static pfunc scan(struct jv_parser* p, char ch, jv* out) {
  type jv_parser (line 711) | struct jv_parser
  type jv_parser (line 712) | struct jv_parser
  type jv_parser (line 712) | struct jv_parser
  function jv_parser_free (line 718) | void jv_parser_free(struct jv_parser* p) {
  function jv_parser_remaining (line 725) | int jv_parser_remaining(struct jv_parser* p) {
  function jv_parser_set_buf (line 731) | void jv_parser_set_buf(struct jv_parser* p, const char* buf, int length,...
  type jv_parser (line 756) | struct jv_parser
  function jv (line 758) | static jv make_error(struct jv_parser* p, const char *fmt, ...) {
  function jv (line 768) | jv jv_parser_next(struct jv_parser* p) {
  function jv (line 865) | jv jv_parse_sized_custom_flags(const char* string, int length, int flags) {
  function jv (line 904) | jv jv_parse_sized(const char* string, int length) {
  function jv (line 908) | jv jv_parse(const char* string) {
  function jv (line 912) | jv jv_parse_custom_flags(const char* string, int flags) {

FILE: src/jv_print.c
  function jq_set_colors (line 40) | int jq_set_colors(const char *code_str) {
  function put_buf (line 98) | static void put_buf(const char *s, int len, FILE *fout, jv *strout, int ...
  function put_char (line 125) | static void put_char(char c, FILE* fout, jv* strout, int T) {
  function put_str (line 129) | static void put_str(const char* s, FILE* fout, jv* strout, int T) {
  function put_indent (line 133) | static void put_indent(int n, int flags, FILE* fout, jv* strout, int T) {
  function jvp_dump_string (line 144) | static void jvp_dump_string(jv str, int ascii_only, FILE* F, jv* S, int ...
  function put_refcnt (line 211) | static void put_refcnt(struct dtoa_context* C, int refcnt, FILE *F, jv* ...
  function jv_dump_term (line 219) | static void jv_dump_term(struct dtoa_context* C, jv x, int flags, int in...

FILE: src/jv_thread.h
  type pthread_mutex_t (line 11) | typedef struct pthread_mutex {
  function pthread_mutex_init (line 17) | static inline int
  function pthread_mutex_lock (line 26) | static inline int
  function pthread_mutex_unlock (line 48) | static inline int
  function pthread_mutex_destroy (line 55) | static inline int
  type pthread_key_t (line 66) | typedef unsigned long pthread_key_t;

FILE: src/jv_unicode.c
  function jvp_utf8_is_valid (line 77) | int jvp_utf8_is_valid(const char* in, const char* end) {
  function jvp_utf8_decode_length (line 86) | int jvp_utf8_decode_length(char startchar) {
  function jvp_utf8_encode_length (line 93) | int jvp_utf8_encode_length(int codepoint) {
  function jvp_utf8_encode (line 100) | int jvp_utf8_encode(int codepoint, char* out) {
  function jvp_codepoint_is_whitespace (line 124) | int jvp_codepoint_is_whitespace(int c) {

FILE: src/lexer.c
  type flex_int8_t (line 278) | typedef int8_t flex_int8_t;
  type flex_uint8_t (line 279) | typedef uint8_t flex_uint8_t;
  type flex_int16_t (line 280) | typedef int16_t flex_int16_t;
  type flex_uint16_t (line 281) | typedef uint16_t flex_uint16_t;
  type flex_int32_t (line 282) | typedef int32_t flex_int32_t;
  type flex_uint32_t (line 283) | typedef uint32_t flex_uint32_t;
  type flex_int8_t (line 285) | typedef signed char flex_int8_t;
  type flex_int16_t (line 286) | typedef short int flex_int16_t;
  type flex_int32_t (line 287) | typedef int flex_int32_t;
  type flex_uint8_t (line 288) | typedef unsigned char flex_uint8_t;
  type flex_uint16_t (line 289) | typedef unsigned short int flex_uint16_t;
  type flex_uint32_t (line 290) | typedef unsigned int flex_uint32_t;
  type yy_buffer_state (line 401) | struct yy_buffer_state
  type yy_size_t (line 406) | typedef size_t yy_size_t;
  type yy_buffer_state (line 433) | struct yy_buffer_state
  type flex_uint8_t (line 556) | typedef flex_uint8_t YY_CHAR;
  type yy_state_type (line 558) | typedef int yy_state_type;
  type yy_trans_info (line 580) | struct yy_trans_info
  type lexer_param (line 806) | struct lexer_param
  type yyguts_t (line 845) | struct yyguts_t
  type yyguts_t (line 1083) | struct yyguts_t
  type yyguts_t (line 1083) | struct yyguts_t
  function YY_RESTORE_YY_MORE_OFFSET (line 1497) | YY_RESTORE_YY_MORE_OFFSET
  function yy_get_next_buffer (line 1627) | static int yy_get_next_buffer (yyscan_t yyscanner)
  function yy_state_type (line 1766) | static yy_state_type yy_get_previous_state (yyscan_t yyscanner)
  function yy_state_type (line 1799) | static yy_state_type yy_try_NUL_trans  (yy_state_type yy_current_state ,...
  function input (line 1832) | static int input  (yyscan_t yyscanner)
  function yyrestart (line 1908) | void yyrestart  (FILE * input_file , yyscan_t yyscanner)
  function yy_switch_to_buffer (line 1926) | void yy_switch_to_buffer  (YY_BUFFER_STATE  new_buffer , yyscan_t yyscan...
  function yy_load_buffer_state (line 1958) | static void yy_load_buffer_state  (yyscan_t yyscanner)
  function YY_BUFFER_STATE (line 1973) | YY_BUFFER_STATE yy_create_buffer  (FILE * file, int  size , yyscan_t yys...
  function yy_delete_buffer (line 2001) | void yy_delete_buffer (YY_BUFFER_STATE  b , yyscan_t yyscanner)
  function yy_init_buffer (line 2021) | static void yy_init_buffer  (YY_BUFFER_STATE  b, FILE * file , yyscan_t ...
  function yy_flush_buffer (line 2050) | void yy_flush_buffer (YY_BUFFER_STATE  b , yyscan_t yyscanner)
  function yypush_buffer_state (line 2080) | void yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner)
  function yypop_buffer_state (line 2111) | void yypop_buffer_state (yyscan_t yyscanner)
  function yyensure_buffer_stack (line 2131) | static void yyensure_buffer_stack (yyscan_t yyscanner)
  function YY_BUFFER_STATE (line 2181) | YY_BUFFER_STATE yy_scan_buffer  (char * base, yy_size_t  size , yyscan_t...
  function YY_BUFFER_STATE (line 2218) | YY_BUFFER_STATE yy_scan_string (const char * yystr , yyscan_t yyscanner)
  function YY_BUFFER_STATE (line 2231) | YY_BUFFER_STATE yy_scan_bytes  (const char * yybytes, int  _yybytes_len ...
  function yy_push_state (line 2261) | static void yy_push_state (int  _new_state , yyscan_t yyscanner)
  function yy_pop_state (line 2287) | static void yy_pop_state  (yyscan_t yyscanner)
  function yy_top_state (line 2296) | static int yy_top_state  (yyscan_t yyscanner)
  function yy_fatal_error (line 2306) | static void yynoreturn yy_fatal_error (const char* msg , yyscan_t yyscan...
  function YY_EXTRA_TYPE (line 2336) | YY_EXTRA_TYPE yyget_extra  (yyscan_t yyscanner)
  function yyget_lineno (line 2345) | int yyget_lineno  (yyscan_t yyscanner)
  function yyget_column (line 2358) | int yyget_column  (yyscan_t yyscanner)
  function FILE (line 2371) | FILE *yyget_in  (yyscan_t yyscanner)
  function FILE (line 2380) | FILE *yyget_out  (yyscan_t yyscanner)
  function yyget_leng (line 2389) | int yyget_leng  (yyscan_t yyscanner)
  type yyguts_t (line 2401) | struct yyguts_t
  type yyguts_t (line 2401) | struct yyguts_t
  function yyset_extra (line 2409) | void yyset_extra (YY_EXTRA_TYPE  user_defined , yyscan_t yyscanner)
  function yyset_lineno (line 2419) | void yyset_lineno (int  _line_number , yyscan_t yyscanner)
  function yyset_column (line 2434) | void yyset_column (int  _column_no , yyscan_t yyscanner)
  function yyset_in (line 2451) | void yyset_in (FILE *  _in_str , yyscan_t yyscanner)
  function yyset_out (line 2457) | void yyset_out (FILE *  _out_str , yyscan_t yyscanner)
  function yyget_debug (line 2463) | int yyget_debug  (yyscan_t yyscanner)
  function yyset_debug (line 2469) | void yyset_debug (int  _bdebug , yyscan_t yyscanner)
  function YYSTYPE (line 2477) | YYSTYPE * yyget_lval  (yyscan_t yyscanner)
  function yyset_lval (line 2483) | void yyset_lval (YYSTYPE *  yylval_param , yyscan_t yyscanner)
  function YYLTYPE (line 2489) | YYLTYPE *yyget_lloc  (yyscan_t yyscanner)
  function yyset_lloc (line 2495) | void yyset_lloc (YYLTYPE *  yylloc_param , yyscan_t yyscanner)
  function yylex_init (line 2507) | int yylex_init(yyscan_t* ptr_yy_globals)
  function yylex_init_extra (line 2534) | int yylex_init_extra( YY_EXTRA_TYPE yy_user_defined, yyscan_t* ptr_yy_gl...
  function yy_init_globals (line 2561) | static int yy_init_globals (yyscan_t yyscanner)
  function yylex_destroy (line 2595) | int yylex_destroy  (yyscan_t yyscanner)
  function yy_flex_strncpy (line 2629) | static void yy_flex_strncpy (char* s1, const char * s2, int n , yyscan_t...
  function yy_flex_strlen (line 2641) | static int yy_flex_strlen (const char * s , yyscan_t yyscanner)
  function try_exit (line 2661) | static int try_exit(int c, int state, yyscan_t yyscanner) {
  function enter (line 2688) | static int enter(int c, int currstate, yyscan_t yyscanner) {
  function yyfree (line 2707) | void yyfree(void* p, void* extra) {

FILE: src/lexer.h
  type flex_int8_t (line 282) | typedef int8_t flex_int8_t;
  type flex_uint8_t (line 283) | typedef uint8_t flex_uint8_t;
  type flex_int16_t (line 284) | typedef int16_t flex_int16_t;
  type flex_uint16_t (line 285) | typedef uint16_t flex_uint16_t;
  type flex_int32_t (line 286) | typedef int32_t flex_int32_t;
  type flex_uint32_t (line 287) | typedef uint32_t flex_uint32_t;
  type flex_int8_t (line 289) | typedef signed char flex_int8_t;
  type flex_int16_t (line 290) | typedef short int flex_int16_t;
  type flex_int32_t (line 291) | typedef int flex_int32_t;
  type flex_uint8_t (line 292) | typedef unsigned char flex_uint8_t;
  type flex_uint16_t (line 293) | typedef unsigned short int flex_uint16_t;
  type flex_uint32_t (line 294) | typedef unsigned int flex_uint32_t;
  type yy_buffer_state (line 376) | struct yy_buffer_state
  type yy_size_t (line 381) | typedef size_t yy_size_t;
  type yy_buffer_state (line 386) | struct yy_buffer_state

FILE: src/linker.c
  type lib_loading_state (line 23) | struct lib_loading_state {
  type lib_loading_state (line 31) | struct lib_loading_state
  function path_is_relative (line 33) | static int path_is_relative(jv p) {
  function jv (line 50) | static jv build_lib_search_chain(jq_state *jq, jv search_path, jv jq_ori...
  function jv (line 94) | static jv validate_relpath(jv name) {
  function jv (line 125) | static jv jv_basename(jv name) {
  function jv (line 136) | static jv find_lib(jq_state *jq, jv rel_path, jv search, const char *suf...
  function jv (line 232) | static jv default_search(jq_state *jq, jv value) {
  function process_dependencies (line 244) | static int process_dependencies(jq_state *jq, jv jq_origin, jv lib_origi...
  function load_library (line 331) | static int load_library(jq_state *jq, jv lib_path, int is_data, int raw,...
  function jv (line 385) | jv load_module_meta(jq_state *jq, jv mod_relpath) {
  function load_program (line 411) | int load_program(jq_state *jq, struct locfile* src, block *out_block) {

FILE: src/linker.h
  type locfile (line 4) | struct locfile

FILE: src/locfile.c
  type locfile (line 12) | struct locfile
  type locfile (line 13) | struct locfile
  type locfile (line 13) | struct locfile
  type locfile (line 37) | struct locfile
  type locfile (line 37) | struct locfile
  function locfile_free (line 41) | void locfile_free(struct locfile* l) {
  function locfile_get_line (line 50) | int locfile_get_line(struct locfile* l, int pos) {
  function locfile_line_length (line 58) | static int locfile_line_length(struct locfile* l, int line) {
  function locfile_locate (line 63) | void locfile_locate(struct locfile* l, location loc, const char* fmt, .....

FILE: src/locfile.h
  type location (line 6) | typedef struct {
  type locfile (line 12) | struct locfile {
  type locfile (line 23) | struct locfile
  type locfile (line 24) | struct locfile
  type locfile (line 24) | struct locfile
  type locfile (line 25) | struct locfile
  type locfile (line 26) | struct locfile
  type locfile (line 27) | struct locfile

FILE: src/main.c
  function usage (line 49) | static void usage(int code, int keep_it_short) {
  function die (line 119) | static void die(void) {
  function isoptish (line 125) | static int isoptish(const char* text) {
  function isoption (line 129) | static int isoption(const char** text, char shortopt, const char* longop...
  function process (line 175) | static int process(jq_state *jq, jv value, int flags, int dumpopts, int ...
  function debug_cb (line 253) | static void debug_cb(void *data, jv input) {
  function stderr_cb (line 259) | static void stderr_cb(void *data, jv input) {
  function wmain (line 274) | int wmain(int argc, wchar_t* wargv[]) {
  function main (line 289) | int main(int argc, char* argv[]) {

FILE: src/parser.c
  type lexer_param (line 120) | struct lexer_param
  type yytokentype (line 139) | enum yytokentype
  type yytoken_kind_t (line 192) | typedef enum yytokentype yytoken_kind_t;
  type YYSTYPE (line 258) | typedef union YYSTYPE YYSTYPE;
  type YYLTYPE (line 265) | typedef struct YYLTYPE YYLTYPE;
  type YYLTYPE (line 266) | struct YYLTYPE
  type locfile (line 280) | struct locfile
  type lexer_param (line 280) | struct lexer_param
  type yysymbol_kind_t (line 285) | enum yysymbol_kind_t
  type yysymbol_kind_t (line 389) | typedef enum yysymbol_kind_t yysymbol_kind_t;
  type lexer_param (line 396) | struct lexer_param {
  type locfile (line 407) | struct locfile
  function yylex (line 412) | int yylex(YYSTYPE* yylval, YYLTYPE* yylloc, block* answer, int* errors,
  function jv (line 432) | static jv check_object_key(block k) {
  function block (line 442) | static block gen_index(block obj, block key) {
  function block (line 446) | static block gen_index_opt(block obj, block key) {
  function block (line 450) | static block gen_slice_index(block obj, block start, block end, opcode i...
  function block (line 461) | static block constant_fold(block a, block b, int op) {
  function block (line 492) | static block gen_binop(block a, block b, int op) {
  function block (line 516) | static block gen_format(block a, jv fmt) {
  function block (line 520) | static block gen_definedor_assign(block object, block val) {
  function block (line 529) | static block gen_update(block object, block val, int optype) {
  function block (line 540) | static block gen_loc_object(location *loc, struct locfile *locations) {
  type __INT_LEAST8_TYPE__ (line 571) | typedef __INT_LEAST8_TYPE__ yytype_int8;
  type int_least8_t (line 573) | typedef int_least8_t yytype_int8;
  type yytype_int8 (line 575) | typedef signed char yytype_int8;
  type __INT_LEAST16_TYPE__ (line 579) | typedef __INT_LEAST16_TYPE__ yytype_int16;
  type int_least16_t (line 581) | typedef int_least16_t yytype_int16;
  type yytype_int16 (line 583) | typedef short yytype_int16;
  type __UINT_LEAST8_TYPE__ (line 599) | typedef __UINT_LEAST8_TYPE__ yytype_uint8;
  type uint_least8_t (line 602) | typedef uint_least8_t yytype_uint8;
  type yytype_uint8 (line 604) | typedef unsigned char yytype_uint8;
  type yytype_uint8 (line 606) | typedef short yytype_uint8;
  type __UINT_LEAST16_TYPE__ (line 610) | typedef __UINT_LEAST16_TYPE__ yytype_uint16;
  type uint_least16_t (line 613) | typedef uint_least16_t yytype_uint16;
  type yytype_uint16 (line 615) | typedef unsigned short yytype_uint16;
  type yytype_uint16 (line 617) | typedef int yytype_uint16;
  type yytype_int16 (line 659) | typedef yytype_int16 yy_state_t;
  type yy_state_fast_t (line 662) | typedef int yy_state_fast_t;
  function YY_ATTRIBUTE_UNUSED (line 1529) | YY_ATTRIBUTE_UNUSED
  function yy_symbol_value_print (line 1588) | static void
  function yy_symbol_print (line 1611) | static void
  function yy_stack_print (line 1629) | static void
  function yy_reduce_print (line 1652) | static void
  type yypcontext_t (line 1708) | typedef struct
  function yypcontext_expected_tokens (line 1721) | static int
  function YYPTRDIFF_T (line 1763) | static YYPTRDIFF_T
  function YYPTRDIFF_T (line 1802) | static YYPTRDIFF_T
  function yy_syntax_error_arguments (line 1845) | static int
  function yysyntax_error (line 1898) | static int
  function yydestruct (line 1983) | static void
  function yyparse (line 2219) | int
  function jq_parse (line 4162) | int jq_parse(struct locfile* locations, block* answer) {
  function jq_parse_library (line 4179) | int jq_parse_library(struct locfile* locations, block* answer) {

FILE: src/parser.h
  type lexer_param (line 51) | struct lexer_param
  type yytokentype (line 70) | enum yytokentype
  type yytoken_kind_t (line 123) | typedef enum yytokentype yytoken_kind_t;
  type YYSTYPE (line 189) | typedef union YYSTYPE YYSTYPE;
  type YYLTYPE (line 196) | typedef struct YYLTYPE YYLTYPE;
  type YYLTYPE (line 197) | struct YYLTYPE
  type locfile (line 211) | struct locfile
  type lexer_param (line 211) | struct lexer_param

FILE: src/util.c
  function FILE (line 71) | FILE *fopen(const char *fname, const char *mode) {
  function jv (line 83) | jv expand_path(jv path) {
  function jv (line 102) | jv get_home(void) {
  function jv (line 130) | jv jq_realpath(jv path) {
  type jq_util_input_state (line 182) | struct jq_util_input_state {
  function fprinter (line 198) | static void fprinter(void *data, const char *fname) {
  function jq_util_input_state (line 203) | jq_util_input_state *jq_util_input_init(jq_util_msg_cb err_cb, void *err...
  function jq_util_input_set_parser (line 217) | void jq_util_input_set_parser(jq_util_input_state *state, jv_parser *par...
  function jq_util_input_free (line 229) | void jq_util_input_free(jq_util_input_state **state) {
  function jq_util_input_add_input (line 245) | void jq_util_input_add_input(jq_util_input_state *state, const char *fna...
  function jq_util_input_errors (line 250) | int jq_util_input_errors(jq_util_input_state *state) {
  function jq_util_input_read_more (line 260) | static int jq_util_input_read_more(jq_util_input_state *state) {
  function jv (line 356) | jv jq_util_input_next_input_cb(jq_state *jq, void *data) {
  function jv (line 361) | jv jq_util_input_get_position(jq_state *jq) {
  function jv (line 380) | jv jq_util_input_get_current_filename(jq_state* jq) {
  function jv (line 391) | jv jq_util_input_get_current_line(jq_state* jq) {
  function jv (line 405) | jv jq_util_input_next_input(jq_util_input_state *state) {
  function first_wday_of (line 582) | static int
  function fromzone (line 591) | static int
  type tm (line 623) | struct tm

FILE: src/util.h
  function priv_fwrite (line 33) | static void priv_fwrite(const char *s, size_t len, FILE *fout, int is_tt...
  type tm (line 63) | struct tm

FILE: tests/jq_fuzz_compile.c
  function LLVMFuzzerTestOneInput (line 7) | int LLVMFuzzerTestOneInput(uint8_t *data, size_t size) {

FILE: tests/jq_fuzz_execute.cpp
  function LLVMFuzzerInitialize (line 8) | int LLVMFuzzerInitialize(int *argc, char ***argv) {
  function LLVMFuzzerTestOneInput (line 16) | int LLVMFuzzerTestOneInput(uint8_t *data, size_t size) {

FILE: tests/jq_fuzz_fixed.cpp
  function LLVMFuzzerTestOneInput (line 263) | int LLVMFuzzerTestOneInput(uint8_t *data, size_t size) {

FILE: tests/jq_fuzz_load_file.c
  function LLVMFuzzerTestOneInput (line 7) | int LLVMFuzzerTestOneInput(uint8_t *data, size_t size) {

FILE: tests/jq_fuzz_parse.c
  function LLVMFuzzerTestOneInput (line 7) | int LLVMFuzzerTestOneInput(uint8_t *data, size_t size) {

FILE: tests/jq_fuzz_parse_extended.c
  function LLVMFuzzerTestOneInput (line 7) | int LLVMFuzzerTestOneInput(uint8_t *data, size_t size) {

FILE: tests/jq_fuzz_parse_stream.c
  function LLVMFuzzerTestOneInput (line 7) | int LLVMFuzzerTestOneInput(uint8_t *data, size_t size) {

FILE: vendor/decNumber/decBasic.c
  type rounding (line 61) | enum rounding
  type rounding (line 62) | enum rounding
  function decFloat (line 75) | static decFloat * decCanonical(decFloat *result, const decFloat *df) {
  function decFloat (line 167) | static decFloat * decDivide(decFloat *result, const decFloat *dfl,
  function decFiniteMultiply (line 708) | static void decFiniteMultiply(bcdnum *num, uByte *bcdacc,
  function decFloat (line 1069) | decFloat * decFloatAbs(decFloat *result, const decFloat *df,
  function decFloat (line 1102) | decFloat * decFloatAdd(decFloat *result,
  function decFloat (line 1582) | decFloat * decFloatAnd(decFloat *result,
  function decFloat (line 1611) | decFloat * decFloatCanonical(decFloat *result, const decFloat *df) {
  function decFloatClass (line 1621) | enum decClass decFloatClass(const decFloat *df) {
  type decClass (line 1654) | enum decClass
  function decFloat (line 1677) | decFloat * decFloatCompare(decFloat *result,
  function decFloat (line 1701) | decFloat * decFloatCompareSignal(decFloat *result,
  function decFloat (line 1727) | decFloat * decFloatCompareTotal(decFloat *result,
  function decFloat (line 1793) | decFloat * decFloatCompareTotalMag(decFloat *result,
  function decFloat (line 1817) | decFloat * decFloatCopy(decFloat *result, const decFloat *dfl) {
  function decFloat (line 1831) | decFloat * decFloatCopyAbs(decFloat *result, const decFloat *dfl) {
  function decFloat (line 1846) | decFloat * decFloatCopyNegate(decFloat *result, const decFloat *dfl) {
  function decFloat (line 1862) | decFloat * decFloatCopySign(decFloat *result,
  function uInt (line 1891) | uInt decFloatDigits(const decFloat *df) {
  function decFloat (line 1963) | decFloat * decFloatDivide(decFloat *result,
  function decFloat (line 1979) | decFloat * decFloatDivideInteger(decFloat *result,
  function decFloat (line 1996) | decFloat * decFloatFMA(decFloat *result, const decFloat *dfl,
  function decFloat (line 2274) | decFloat * decFloatFromInt32(decFloat *result, Int n) {
  function decFloat (line 2309) | decFloat * decFloatFromUInt32(decFloat *result, uInt u) {
  function decFloat (line 2339) | decFloat * decFloatInvert(decFloat *result, const decFloat *df,
  function uInt (line 2367) | uInt decFloatIsCanonical(const decFloat *df) {
  function uInt (line 2409) | uInt decFloatIsFinite(const decFloat *df) {
  function uInt (line 2412) | uInt decFloatIsInfinite(const decFloat *df) {
  function uInt (line 2415) | uInt decFloatIsInteger(const decFloat *df) {
  function uInt (line 2418) | uInt decFloatIsLogical(const decFloat *df) {
  function uInt (line 2421) | uInt decFloatIsNaN(const decFloat *df) {
  function uInt (line 2424) | uInt decFloatIsNegative(const decFloat *df) {
  function uInt (line 2427) | uInt decFloatIsNormal(const decFloat *df) {
  function uInt (line 2436) | uInt decFloatIsPositive(const decFloat *df) {
  function uInt (line 2439) | uInt decFloatIsSignaling(const decFloat *df) {
  function uInt (line 2442) | uInt decFloatIsSignalling(const decFloat *df) {
  function uInt (line 2445) | uInt decFloatIsSigned(const decFloat *df) {
  function uInt (line 2448) | uInt decFloatIsSubnormal(const decFloat *df) {
  function uInt (line 2456) | uInt decFloatIsZero(const decFloat *df) {
  function decFloat (line 2475) | decFloat * decFloatLogB(decFloat *result, const decFloat *df,
  function decFloat (line 2519) | decFloat * decFloatMax(decFloat *result,
  function decFloat (line 2552) | decFloat * decFloatMaxMag(decFloat *result,
  function decFloat (line 2578) | decFloat * decFloatMin(decFloat *result,
  function decFloat (line 2611) | decFloat * decFloatMinMag(decFloat *result,
  function decFloat (line 2640) | decFloat * decFloatMinus(decFloat *result, const decFloat *df,
  function decFloat (line 2659) | decFloat * decFloatMultiply(decFloat *result,
  function decFloat (line 2692) | decFloat * decFloatNextMinus(decFloat *result, const decFloat *dfl,
  function decFloat (line 2735) | decFloat * decFloatNextPlus(decFloat *result, const decFloat *dfl,
  function decFloat (line 2781) | decFloat * decFloatNextToward(decFloat *result,
  function decFloat (line 2845) | decFloat * decFloatOr(decFloat *result,
  function decFloat (line 2879) | decFloat * decFloatPlus(decFloat *result, const decFloat *df,
  function decFloat (line 2899) | decFloat * decFloatQuantize(decFloat *result,
  function decFloat (line 3189) | decFloat * decFloatReduce(decFloat *result, const decFloat *df,
  function decFloat (line 3226) | decFloat * decFloatRemainder(decFloat *result,
  function decFloat (line 3243) | decFloat * decFloatRemainderNear(decFloat *result,
  function decFloat (line 3268) | decFloat * decFloatRotate(decFloat *result,
  function uInt (line 3328) | uInt decFloatSameQuantum(const decFloat *dfl, const decFloat *dfr) {
  function decFloat (line 3353) | decFloat * decFloatScaleB(decFloat *result,
  function decFloat (line 3398) | decFloat * decFloatShift(decFloat *result,
  function decFloat (line 3457) | decFloat * decFloatSubtract(decFloat *result,
  function uInt (line 3480) | uInt decFloatToUInt32(const decFloat *df, decContext *set,
  function uInt (line 3484) | uInt decFloatToUInt32Exact(const decFloat *df, decContext *set,
  function Int (line 3488) | Int decFloatToInt32(const decFloat *df, decContext *set,
  function Int (line 3492) | Int decFloatToInt32Exact(const decFloat *df, decContext *set,
  function decFloat (line 3508) | decFloat * decFloatToIntegralValue(decFloat *result, const decFloat *df,
  function decFloat (line 3512) | decFloat * decFloatToIntegralExact(decFloat *result, const decFloat *df,
  function decFloat (line 3528) | decFloat * decFloatXor(decFloat *result,
  function decFloat (line 3557) | static decFloat *decInvalid(decFloat *result, decContext *set) {
  function decFloat (line 3573) | static decFloat *decInfinity(decFloat *result, const decFloat *df) {
  function decFloat (line 3595) | static decFloat *decNaNs(decFloat *result,
  function Int (line 3621) | static Int decNumCompare(const decFloat *dfl, const decFloat *dfr, Flag ...
  type rounding (line 3788) | enum rounding
  type rounding (line 3806) | enum rounding
  function decFloat (line 3874) | static decFloat * decToIntegral(decFloat *result, const decFloat *df,

FILE: vendor/decNumber/decCommon.c
  function Flag (line 190) | static Flag decBiStr(const char *targ, const char *str1, const char *str...
  function decFloat (line 230) | static decFloat * decFinalize(decFloat *df, bcdnum *num,
  function decFloat (line 577) | decFloat * decFloatFromBCD(decFloat *df, Int exp, const uByte *bcdar,
  function decFloat (line 664) | decFloat * decFloatFromPacked(decFloat *df, Int exp, const uByte *packed) {
  function decFloat (line 708) | decFloat * decFloatFromPackedChecked(decFloat *df, Int exp,
  function decFloat (line 776) | decFloat * decFloatFromString(decFloat *result, const char *string,
  function decFloat (line 1018) | decFloat * decFloatFromWider(decFloat *result, const decFloatWider *wider,
  function Int (line 1058) | Int decFloatGetCoefficient(const decFloat *df, uByte *bcdar) {
  function Int (line 1078) | Int decFloatGetExponent(const decFloat *df) {
  function decFloat (line 1095) | decFloat * decFloatSetCoefficient(decFloat *df, const uByte *bcdar,
  function decFloat (line 1123) | decFloat * decFloatSetExponent(decFloat *df, decContext *set, Int exp) {
  function uInt (line 1142) | uInt decFloatRadix(const decFloat *df) {
  function decFloatShow (line 1156) | void decFloatShow(const decFloat *df, const char *tag) {
  function Int (line 1191) | Int decFloatToBCD(const decFloat *df, Int *exp, uByte *bcdar) {
  function Int (line 1456) | Int decFloatToPacked(const decFloat *df, Int *exp, uByte *packed) {
  function decFloatWider (line 1714) | decFloatWider * decFloatToWider(const decFloat *source, decFloatWider *w...
  function decFloat (line 1760) | decFloat * decFloatZero(decFloat *df){
  function decShowNum (line 1784) | void decShowNum(const bcdnum *num, const char *tag) {

FILE: vendor/decNumber/decContext.c
  function decContext (line 54) | decContext *decContextClearStatus(decContext *context, uInt mask) {
  function decContext (line 72) | decContext * decContextDefault(decContext *context, Int kind) {
  function decContextGetRounding (line 137) | enum rounding decContextGetRounding(decContext *context) {
  function uInt (line 149) | uInt decContextGetStatus(decContext *context) {
  function decContext (line 165) | decContext *decContextRestoreStatus(decContext *context,
  function uInt (line 182) | uInt decContextSaveStatus(decContext *context, uInt mask) {
  function decContext (line 195) | decContext *decContextSetRounding(decContext *context,
  function decContext (line 211) | decContext * decContextSetStatus(decContext *context, uInt status) {
  function decContext (line 230) | decContext * decContextSetStatusFromString(decContext *context,
  function decContext (line 281) | decContext * decContextSetStatusFromStringQuiet(decContext *context,
  function decContext (line 327) | decContext * decContextSetStatusQuiet(decContext *context, uInt status) {
  function Int (line 377) | Int decContextTestEndian(Flag quiet) {
  function uInt (line 407) | uInt decContextTestSavedStatus(uInt oldstatus, uInt mask) {
  function uInt (line 421) | uInt decContextTestStatus(decContext *context, uInt mask) {
  function decContext (line 433) | decContext *decContextZeroStatus(decContext *context) {

FILE: vendor/decNumber/decContext.h
  type rounding (line 61) | enum rounding {
  type decContext (line 74) | typedef struct {
  type decClass (line 99) | enum decClass {
  type rounding (line 239) | enum rounding
  type rounding (line 243) | enum rounding

FILE: vendor/decNumber/decDouble.h
  type decDouble (line 45) | typedef union {
  type rounding (line 73) | enum rounding
  type rounding (line 74) | enum rounding
  type rounding (line 77) | enum rounding
  type rounding (line 78) | enum rounding
  type rounding (line 110) | enum rounding
  type decClass (line 128) | enum decClass

FILE: vendor/decNumber/decNumber.c
  function decNumber (line 334) | decNumber * decNumberFromInt32(decNumber *dn, Int in) {
  function decNumber (line 347) | decNumber * decNumberFromUInt32(decNumber *dn, uInt uin) {
  function Int (line 369) | Int decNumberToInt32(const decNumber *dn, decContext *set) {
  function uInt (line 405) | uInt decNumberToUInt32(const decNumber *dn, decContext *set) {
  function decNumber (line 478) | decNumber * decNumberFromString(decNumber *dn, const char chars[],
  function decNumber (line 729) | decNumber * decNumberAbs(decNumber *res, const decNumber *rhs,
  function decNumber (line 761) | decNumber * decNumberAdd(decNumber *res, const decNumber *lhs,
  function decNumber (line 787) | decNumber * decNumberAnd(decNumber *res, const decNumber *lhs,
  function decNumber (line 855) | decNumber * decNumberCompare(decNumber *res, const decNumber *lhs,
  function decNumber (line 875) | decNumber * decNumberCompareSignal(decNumber *res, const decNumber *lhs,
  function decNumber (line 896) | decNumber * decNumberCompareTotal(decNumber *res, const decNumber *lhs,
  function decNumber (line 917) | decNumber * decNumberCompareTotalMag(decNumber *res, const decNumber *lhs,
  function decNumber (line 982) | decNumber * decNumberDivide(decNumber *res, const decNumber *lhs,
  function decNumber (line 1005) | decNumber * decNumberDivideInteger(decNumber *res, const decNumber *lhs,
  function decNumber (line 1038) | decNumber * decNumberExp(decNumber *res, const decNumber *rhs,
  function decNumber (line 1094) | decNumber * decNumberFMA(decNumber *res, const decNumber *lhs,
  function decNumber (line 1185) | decNumber * decNumberInvert(decNumber *res, const decNumber *rhs,
  function decNumber (line 1258) | decNumber * decNumberLn(decNumber *res, const decNumber *rhs,
  function decNumber (line 1324) | decNumber * decNumberLogB(decNumber *res, const decNumber *rhs,
  function decNumber (line 1386) | decNumber * decNumberLog10(decNumber *res, const decNumber *rhs,
  function decNumber (line 1534) | decNumber * decNumberMax(decNumber *res, const decNumber *lhs,
  function decNumber (line 1557) | decNumber * decNumberMaxMag(decNumber *res, const decNumber *lhs,
  function decNumber (line 1580) | decNumber * decNumberMin(decNumber *res, const decNumber *lhs,
  function decNumber (line 1603) | decNumber * decNumberMinMag(decNumber *res, const decNumber *lhs,
  function decNumber (line 1628) | decNumber * decNumberMinus(decNumber *res, const decNumber *rhs,
  function decNumber (line 1658) | decNumber * decNumberNextMinus(decNumber *res, const decNumber *rhs,
  function decNumber (line 1694) | decNumber * decNumberNextPlus(decNumber *res, const decNumber *rhs,
  function decNumber (line 1734) | decNumber * decNumberNextToward(decNumber *res, const decNumber *lhs,
  function decNumber (line 1802) | decNumber * decNumberOr(decNumber *res, const decNumber *lhs,
  function decNumber (line 1872) | decNumber * decNumberPlus(decNumber *res, const decNumber *rhs,
  function decNumber (line 1902) | decNumber * decNumberMultiply(decNumber *res, const decNumber *lhs,
  function decNumber (line 5227) | decNumber * decExpOp(decNumber *res, const decNumber *rhs,
  function decNumber (line 5831) | static decNumber * decQuantizeOp(decNumber *res, const decNumber *lhs,
  function decNumber (line 6004) | decNumber * decCompareOp(decNumber *res, const decNumber *lhs,
  function Int (line 6169) | static Int decCompare(const decNumber *lhs, const decNumber *rhs,
  function Int (line 6233) | static Int decUnitCompare(const Unit *a, Int alength,
  function Int (line 6337) | static Int decUnitAddSub(const Unit *a, Int alength,
  function decNumber (line 6591) | static decNumber * decTrim(decNumber *dn, decContext *set, Flag all,
  function decReverse (line 6662) | static void decReverse(Unit *ulo, Unit *uhi) {
  function Int (line 6685) | static Int decShiftToMost(Unit *uar, Int digits, Int shift) {
  function Int (line 6741) | static Int decShiftToLeast(Unit *uar, Int units, Int shift) {
  function decNumber (line 6807) | static decNumber *decRoundOperand(const decNumber *dn, decContext *set,
  function decCopyFit (line 6843) | static void decCopyFit(decNumber *dest, const decNumber *src,
  function decSetCoeff (line 6889) | static void decSetCoeff(decNumber *dn, decContext *set, const Unit *lsu,
  function decApplyRound (line 7070) | static void decApplyRound(decNumber *dn, decContext *set, Int residue,
  function decFinish (line 7239) | static void decFinish(decNumber *dn, decContext *set, Int *residue,
  function decFinalize (line 7274) | static void decFinalize(decNumber *dn, decContext *set, Int *residue,
  function decSetOverflow (line 7348) | static void decSetOverflow(decNumber *dn, decContext *set, uInt *status) {
  function decSetMaxValue (line 7394) | static void decSetMaxValue(decNumber *dn, decContext *set) {
  function decSetSubnormal (line 7428) | static void decSetSubnormal(decNumber *dn, decContext *set, Int *residue,
  function uInt (line 7514) | static uInt decCheckMath(const decNumber *rhs, decContext *set,
  function Int (line 7542) | static Int decGetInt(const decNumber *dn) {
  function decNumber (line 7631) | static decNumber *decDecap(decNumber *dn, Int drop) {
  function Flag (line 7667) | static Flag decBiStr(const char *targ, const char *str1, const char *str...
  function decNumber (line 7690) | static decNumber * decNaNs(decNumber *res, const decNumber *lhs,
  function decStatus (line 7741) | static void decStatus(decNumber *dn, uInt status, decContext *set) {
  function Int (line 7767) | static Int decGetDigits(Unit *uar, Int len) {
  function decNumberShow (line 7813) | void decNumberShow(const decNumber *dn) {
  function decDumpAr (line 7865) | static void decDumpAr(char name, const Unit *ar, Int len) {
  function Flag (line 7910) | static Flag decCheckOperands(decNumber *res, const decNumber *lhs,
  function Flag (line 7956) | static Flag decCheckNumber(const decNumber *dn) {
  function decCheckInexact (line 8057) | static void decCheckInexact(const decNumber *dn, decContext *set) {
  function decFree (line 8122) | static void decFree(void *alloc) {

FILE: vendor/decNumber/decNumber.h
  type decNumber (line 67) | typedef struct {
  type decClass (line 151) | enum decClass
  type decClass (line 152) | enum decClass

FILE: vendor/decNumber/decNumberLocal.h
  type LI (line 101) | typedef long int LI;
  type bcdnum (line 310) | typedef struct {

FILE: vendor/decNumber/decPacked.c
  function uByte (line 59) | uByte * decPackedFromNumber(uByte *bcd, Int length, Int *scale,
  function decNumber (line 147) | decNumber * decPackedToNumber(const uByte *bcd, Int length,

FILE: vendor/decNumber/decQuad.h
  type decQuad (line 46) | typedef union {
  type rounding (line 96) | enum rounding
  type rounding (line 97) | enum rounding
  type rounding (line 100) | enum rounding
  type rounding (line 101) | enum rounding
  type rounding (line 132) | enum rounding
  type decClass (line 150) | enum decClass

FILE: vendor/decNumber/decSingle.h
  type decSingle (line 46) | typedef union {

FILE: vendor/decNumber/decimal128.c
  function decimal128 (line 74) | decimal128 * decimal128FromNumber(decimal128 *d128, const decNumber *dn,
  function decNumber (line 189) | decNumber * decimal128ToNumber(const decimal128 *d128, decNumber *dn) {
  function decimal128 (line 451) | decimal128 * decimal128FromString(decimal128 *result, const char *string,
  function uInt (line 473) | uInt decimal128IsCanonical(const decimal128 *d128) {
  function decimal128 (line 490) | decimal128 * decimal128Canonical(decimal128 *result, const decimal128 *d...
  function decimal128Show (line 531) | void decimal128Show(const decimal128 *d128) {

FILE: vendor/decNumber/decimal128.h
  type decimal128 (line 52) | typedef struct {

FILE: vendor/decNumber/decimal32.c
  function decimal32 (line 74) | decimal32 * decimal32FromNumber(decimal32 *d32, const decNumber *dn,
  function decNumber (line 179) | decNumber * decimal32ToNumber(const decimal32 *d32, decNumber *dn) {
  function decimal32 (line 378) | decimal32 * decimal32FromString(decimal32 *result, const char *string,
  function uInt (line 400) | uInt decimal32IsCanonical(const decimal32 *d32) {
  function decimal32 (line 417) | decimal32 * decimal32Canonical(decimal32 *result, const decimal32 *d32) {
  function decimal32Show (line 456) | void decimal32Show(const decimal32 *d32) {

FILE: vendor/decNumber/decimal32.h
  type decimal32 (line 52) | typedef struct {

FILE: vendor/decNumber/decimal64.c
  function decimal64 (line 80) | decimal64 * decimal64FromNumber(decimal64 *d64, const decNumber *dn,
  function decNumber (line 206) | decNumber * decimal64ToNumber(const decimal64 *d64, decNumber *dn) {
  function decimal64 (line 439) | decimal64 * decimal64FromString(decimal64 *result, const char *string,
  function uInt (line 462) | uInt decimal64IsCanonical(const decimal64 *d64) {
  function decimal64 (line 479) | decimal64 * decimal64Canonical(decimal64 *result, const decimal64 *d64) {
  function decimal64Show (line 518) | void decimal64Show(const decimal64 *d64) {
  function decDigitsToDPD (line 608) | void decDigitsToDPD(const decNumber *dn, uInt *targ, Int shift) {
  function decDigitsFromDPD (line 734) | void decDigitsFromDPD(decNumber *dn, const uInt *sour, Int declets) {

FILE: vendor/decNumber/decimal64.h
  type decimal64 (line 54) | typedef struct {

FILE: vendor/decNumber/example1.c
  function main (line 15) | int main(int argc, char *argv[]) {

FILE: vendor/decNumber/example2.c
  function main (line 15) | int main(int argc, char *argv[]) {

FILE: vendor/decNumber/example3.c
  function main (line 15) | int main(int argc, char *argv[]) {

FILE: vendor/decNumber/example4.c
  function signalHandler (line 22) | void signalHandler(int sig) {
  function main (line 27) | int main(int argc, char *argv[]) {

FILE: vendor/decNumber/example5.c
  function main (line 13) | int main(int argc, char *argv[]) {

FILE: vendor/decNumber/example6.c
  function main (line 14) | int main(int argc, char *argv[]) {

FILE: vendor/decNumber/example7.c
  function main (line 15) | int main(int argc, char *argv[]) {

FILE: vendor/decNumber/example8.c
  function main (line 17) | int main(int argc, char *argv[]) {
Condensed preview — 387 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,431K chars).
[
  {
    "path": ".gitattributes",
    "chars": 361,
    "preview": ".gitattributes export-ignore\n.gitignore export-ignore\n* text=auto eol=lf\nvendor/** linguist-vendored\n\n# generated files\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 936,
    "preview": "---\nname: Bug report\nabout: Create a report to help us improve\n\n---\n\n<!--\nREAD THIS FIRST!\n\nIf you have a usage question"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 331,
    "preview": "version: 2\nupdates:\n  - package-ecosystem: \"pip\"\n    directory: \"docs/\"\n    schedule:\n      interval: \"monthly\"\n  - pack"
  },
  {
    "path": ".github/workflows/ci.yml",
    "chars": 12700,
    "preview": "name: CI\non:\n  push:\n    branches:\n      - master\n    tags:\n      - \"jq-*\"\n  pull_request:\n\njobs:\n  linux:\n    strategy:"
  },
  {
    "path": ".github/workflows/decnum.yml",
    "chars": 1015,
    "preview": "name: decnum\non:\n  push:\n    branches:\n      - master\n  pull_request:\n\njobs:\n  disabled:\n    runs-on: ubuntu-24.04\n    s"
  },
  {
    "path": ".github/workflows/manpage.yml",
    "chars": 1547,
    "preview": "name: Building man page, man.test, manonig.test\non:\n  push:\n    paths:\n      - '.github/workflows/manpage.yml'\n      - '"
  },
  {
    "path": ".github/workflows/oniguruma.yml",
    "chars": 1949,
    "preview": "name: oniguruma\non:\n  push:\n    branches:\n      - master\n  pull_request:\n\n# Since builtin oniguruma is tested in the CI "
  },
  {
    "path": ".github/workflows/scanbuild.yml",
    "chars": 1334,
    "preview": "name: Clang scan-build Static Analyzer Build\n\non:\n  push:\n    branches:\n      - master\n\njobs:\n  scan-build:\n    runs-on:"
  },
  {
    "path": ".github/workflows/valgrind.yml",
    "chars": 956,
    "preview": "name: valgrind\non:\n  push:\n    branches:\n      - master\n  pull_request:\n\njobs:\n  linux:\n    runs-on: ubuntu-24.04\n    st"
  },
  {
    "path": ".github/workflows/website.yml",
    "chars": 1061,
    "preview": "name: Update website\non:\n  push:\n    branches:\n      - master\n    paths:\n      - 'docs/**'\nconcurrency: website\n\njobs:\n "
  },
  {
    "path": ".gitignore",
    "chars": 576,
    "preview": "*.o\n*.a\n*.lo\n*.la\n*.lai\n*.so\n*.so.*\n*.gcda\n*.gcno\n*.gcov\n*~\n.*.sw[a-p]\ntags\n\njq\n!tests/modules/lib/jq/\njq.1\n\n# Generated"
  },
  {
    "path": ".gitmodules",
    "chars": 101,
    "preview": "[submodule \"vendor/oniguruma\"]\n\tpath = vendor/oniguruma\n\turl = https://github.com/kkos/oniguruma.git\n"
  },
  {
    "path": "AUTHORS",
    "chars": 10663,
    "preview": "Created By:\nStephen Dolan        <mu@netsoc.tcd.ie>\n\nMaintained by:\nDavid Tolnay         <dtolnay@gmail.com>\nEmanuele To"
  },
  {
    "path": "COPYING",
    "chars": 7886,
    "preview": "jq is copyright (C) 2012 Stephen Dolan\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of "
  },
  {
    "path": "ChangeLog",
    "chars": 33281,
    "preview": "2015-07-10  Nicolas Williams  nico@cryptonector.com\n\n\tUse `include` for import into namespace\n\n\tSimplify import docs\n\n\tF"
  },
  {
    "path": "Dockerfile",
    "chars": 713,
    "preview": "FROM debian:12-slim AS builder\n\nENV DEBIAN_FRONTEND=noninteractive \\\n    DEBCONF_NONINTERACTIVE_SEEN=true \\\n    LC_ALL=C"
  },
  {
    "path": "KEYS",
    "chars": 421,
    "preview": "pub   4096R/71523402 2015-10-11\n      Key fingerprint = 4FD7 01D6 FA9B 3D2D F5AC  935D AF19 040C 7152 3402\nuid          "
  },
  {
    "path": "Makefile.am",
    "chars": 9090,
    "preview": "\n### C source files to be built and distributed.\n\nLIBJQ_INCS = src/builtin.h src/bytecode.h src/compile.h               "
  },
  {
    "path": "NEWS.md",
    "chars": 24670,
    "preview": "# 1.8.1\n\nThis is a patch release to fix security, performance, and build issues found in 1.8.0.\nFull commit log can be f"
  },
  {
    "path": "README.md",
    "chars": 2434,
    "preview": "# jq\n\n`jq` is a lightweight and flexible command-line JSON processor akin to `sed`,`awk`,`grep`, and friends for JSON da"
  },
  {
    "path": "SECURITY.md",
    "chars": 974,
    "preview": "# How to report security vulnerabilities in `jq`\n\nGitHub has a [mechanism for private disclosure of vulnerabilities](htt"
  },
  {
    "path": "compile-ios.sh",
    "chars": 3230,
    "preview": "#!/usr/bin/env bash\n# Mac C. compile-ios.sh for JQ.\n\n# Defaults\nset -e\noniguruma='6.9.10'\n\nunset CFLAGS\nunset CXXFLAGS\nu"
  },
  {
    "path": "config/.gitignore",
    "chars": 95,
    "preview": "config.guess\nconfig.sub\ncompile\ndepcomp\ninstall-sh\nltmain.sh\nmissing\nylwrap\ntest-driver\nar-lib\n"
  },
  {
    "path": "config/m4/.gitignore",
    "chars": 17,
    "preview": "libtool.m4\nlt*.m4"
  },
  {
    "path": "config/m4/check-math-func.m4",
    "chars": 239,
    "preview": "dnl AC_CHECK_MATH_FUNC(func)\nAC_DEFUN([AC_CHECK_MATH_FUNC], [\n  AC_LANG(C)\n  AC_CHECK_LIB([m],[$1],[\n    m4_define([ac_t"
  },
  {
    "path": "config/m4/find-func-no-libs.m4",
    "chars": 286,
    "preview": "dnl Shamelessly stolen from Heimdal\ndnl\ndnl Look for function in any of the specified libraries\ndnl\n\ndnl AC_FIND_FUNC_NO"
  },
  {
    "path": "config/m4/find-func-no-libs2.m4",
    "chars": 1525,
    "preview": "dnl Shamelessly stolen from Heimdal\ndnl\ndnl Look for function in any of the specified libraries\ndnl\n\ndnl AC_FIND_FUNC_NO"
  },
  {
    "path": "config/m4/find-func.m4",
    "chars": 222,
    "preview": "dnl Shamelessly stolen from Heimdal\ndnl\ndnl AC_FIND_FUNC(func, libraries, includes, arguments)\nAC_DEFUN([AC_FIND_FUNC], "
  },
  {
    "path": "config/m4/misc.m4",
    "chars": 130,
    "preview": "\ndnl Shamelessly stolen from Heimdal\nAC_DEFUN([upcase],[`echo $1 | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVW"
  },
  {
    "path": "configure.ac",
    "chars": 9881,
    "preview": "m4_define([jq_version], m4_esyscmd_s([scripts/version])))\n\nAC_INIT([jq],[jq_version],[https://github.com/jqlang/jq/issue"
  },
  {
    "path": "docs/Pipfile",
    "chars": 198,
    "preview": "[[source]]\nname = \"pypi\"\nurl = \"https://pypi.org/simple\"\nverify_ssl = true\n\n[dev-packages]\n\n[packages]\njinja2 = \"*\"\npyya"
  },
  {
    "path": "docs/README.md",
    "chars": 1061,
    "preview": "Documentation\n=============\n\nThe jq website, manpages and some of the tests are generated from this\ndirectory. The manua"
  },
  {
    "path": "docs/build_manpage.py",
    "chars": 9042,
    "preview": "#!/usr/bin/env python3\nfrom datetime import date\nfrom io import StringIO\nfrom lxml import etree\nimport markdown\nfrom mar"
  },
  {
    "path": "docs/build_mantests.py",
    "chars": 872,
    "preview": "#!/usr/bin/env python3\nimport yaml\nimport re\n\nregex_program_pattern = re.compile(\n    r'\\b(?:test|match|capture|scan|spl"
  },
  {
    "path": "docs/build_website.py",
    "chars": 2527,
    "preview": "#!/usr/bin/env python3\nimport glob\nimport itertools\nfrom jinja2 import Environment, FileSystemLoader, select_autoescape,"
  },
  {
    "path": "docs/content/download/default.yml",
    "chars": 13318,
    "preview": "headline: Download jq\nbody:\n  - text: |\n\n      jq is written in C and has no runtime dependencies, so it should be\n     "
  },
  {
    "path": "docs/content/index.yml",
    "chars": 3134,
    "preview": "headline: jq\n\nblurb: |\n\n  jq is a lightweight and flexible command-line JSON processor.\n\nbody1: |\n\n  jq is like `sed` fo"
  },
  {
    "path": "docs/content/manual/dev/manual.yml",
    "chars": 147295,
    "preview": "---\nheadline: jq Manual (development version)\n\nbody: |\n\n  A jq program is a \"filter\": it takes an input, and produces an"
  },
  {
    "path": "docs/content/manual/v1.3/manual.yml",
    "chars": 46893,
    "preview": "---\nheadline: jq 1.3 Manual\n\nbody: |\n\n  A jq program is a \"filter\": it takes an input, and produces an\n  output. There a"
  },
  {
    "path": "docs/content/manual/v1.4/manual.yml",
    "chars": 59927,
    "preview": "---\nheadline: jq 1.4 Manual\n\nbody: |\n\n  A jq program is a \"filter\": it takes an input, and produces an\n  output. There a"
  },
  {
    "path": "docs/content/manual/v1.5/manual.yml",
    "chars": 110177,
    "preview": "---\nheadline: jq 1.5 Manual\n\nbody: |\n\n  A jq program is a \"filter\": it takes an input, and produces an\n  output. There a"
  },
  {
    "path": "docs/content/manual/v1.6/manual.yml",
    "chars": 127183,
    "preview": "---\nheadline: jq 1.6 Manual\n\nbody: |\n\n  A jq program is a \"filter\": it takes an input, and produces an\n  output. There a"
  },
  {
    "path": "docs/content/manual/v1.7/manual.yml",
    "chars": 141593,
    "preview": "---\nheadline: jq 1.7 Manual\n\nbody: |\n\n  A jq program is a \"filter\": it takes an input, and produces an\n  output. There a"
  },
  {
    "path": "docs/content/manual/v1.8/manual.yml",
    "chars": 147277,
    "preview": "---\nheadline: jq 1.8 Manual\n\nbody: |\n\n  A jq program is a \"filter\": it takes an input, and produces an\n  output. There a"
  },
  {
    "path": "docs/content/tutorial/default.yml",
    "chars": 14452,
    "preview": "headline: Tutorial\nbody:\n  - text: |\n\n      GitHub has a JSON API, so let's play with that. This URL gets us the last\n  "
  },
  {
    "path": "docs/manual_schema.yml",
    "chars": 1339,
    "preview": "type: object\nrequired:\n  - headline\n  - body\n  - manpage_intro\n  - manpage_epilogue\n  - sections\nadditionalProperties: f"
  },
  {
    "path": "docs/public/.htaccess",
    "chars": 735,
    "preview": "DirectoryIndex index.html\nFileETag All\n\n# Compress all static assets\n<IfModule mod_deflate.c>\n\t# compress content with t"
  },
  {
    "path": "docs/public/CNAME",
    "chars": 11,
    "preview": "jqlang.org\n"
  },
  {
    "path": "docs/public/css/style.css",
    "chars": 1579,
    "preview": "main {\n  padding: 1rem;\n\n  & * {\n    scroll-margin-top: 4rem;\n  }\n\n  @media print {\n    width: 100%!important;\n    --bs-"
  },
  {
    "path": "docs/public/js/manual-search.js",
    "chars": 1365,
    "preview": "(() => {\n  const searchInput = document.querySelector('input#searchbox');\n  const sectionIDs = JSON.parse(document.query"
  },
  {
    "path": "docs/public/robots.txt",
    "chars": 22,
    "preview": "User-agent: *\nAllow: /"
  },
  {
    "path": "docs/templates/default.html.j2",
    "chars": 1269,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n{% include \"shared/_head.html.j2\" %}\n\n  <body>\n{% include \"shared/_navbar.html.j2\" %}\n\n"
  },
  {
    "path": "docs/templates/index.html.j2",
    "chars": 3094,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n{% include \"shared/_head.html.j2\" %}\n\n  <body>\n{% include \"shared/_navbar.html.j2\" %}\n\n"
  },
  {
    "path": "docs/templates/manual.html.j2",
    "chars": 6175,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n{% include \"shared/_head.html.j2\" %}\n\n  <body>\n{% include \"shared/_navbar.html.j2\" %}\n\n"
  },
  {
    "path": "docs/templates/shared/_footer.html.j2",
    "chars": 788,
    "preview": "    <footer class=\"bd-footer bg-body-tertiary\">\n      <div class=\"py-3 text-center\">\n        <p>\n          This website "
  },
  {
    "path": "docs/templates/shared/_head.html.j2",
    "chars": 1622,
    "preview": "  <head>\n    <meta charset=\"utf-8\">\n    <title>{{ headline }}</title>\n    <meta name=\"viewport\" content=\"width=device-wi"
  },
  {
    "path": "docs/templates/shared/_navbar.html.j2",
    "chars": 3317,
    "preview": "    <div class=\"container visually-hidden-focusable\">\n      <a class=\"d-inline-flex p-2\" href=\"#main\">Skip to main conte"
  },
  {
    "path": "docs/validate_manual_schema.py",
    "chars": 584,
    "preview": "#!/usr/bin/env python3\nimport jsonschema\nimport sys\nimport yaml\n\nif len(sys.argv) < 2:\n    sys.exit(\"Usage: {} MANUAL_FI"
  },
  {
    "path": "jq.1.prebuilt",
    "chars": 124252,
    "preview": ".\n.TH \"JQ\" \"1\" \"May 2025\" \"\" \"\"\n.\n.SH \"NAME\"\n\\fBjq\\fR \\- Command\\-line JSON processor\n.\n.SH \"SYNOPSIS\"\n\\fBjq\\fR [\\fIopti"
  },
  {
    "path": "jq.spec",
    "chars": 1431,
    "preview": "# This is spec file maintained by developers of JQ, not by a OS distro.\n# Your OS of choice will likely ignore this RPM "
  },
  {
    "path": "libjq.pc.in",
    "chars": 246,
    "preview": "prefix=@prefix@\nexec_prefix=@exec_prefix@\nlibdir=@libdir@\nincludedir=@includedir@\n\nName: libjq\nURL: https://jqlang.org/\n"
  },
  {
    "path": "m4/ax_compare_version.m4",
    "chars": 6570,
    "preview": "# ===========================================================================\n#    http://www.gnu.org/software/autoconf-"
  },
  {
    "path": "m4/ax_prog_bison_version.m4",
    "chars": 2013,
    "preview": "# ===========================================================================\n#   Modified from\n#   http://www.gnu.org/s"
  },
  {
    "path": "m4/ax_pthread.m4",
    "chars": 22556,
    "preview": "# ===========================================================================\n#        https://www.gnu.org/software/auto"
  },
  {
    "path": "scripts/crosscompile",
    "chars": 854,
    "preview": "#!/bin/sh\n\n# This script is used to cross-compile binaries for\n# platforms other than the current one\n\n# Usage: $0 <plat"
  },
  {
    "path": "scripts/gen_utf8_tables.py",
    "chars": 1000,
    "preview": "#!/usr/bin/python\n\n# This program was used to generate jv_utf8_tables.gen.h\n\nmask = lambda n: (1 << n) - 1\n\n\ndef print_t"
  },
  {
    "path": "scripts/version",
    "chars": 313,
    "preview": "#!/bin/sh\nset -eu\n\ncd \"$(dirname \"$0\")/../\"\ntest -e .git || exit 1\n\nif git describe --tags --match 'jq-*' >/dev/null 2>&"
  },
  {
    "path": "sig/jq-release-new.key",
    "chars": 3167,
    "preview": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBGiLapUBEADQOs2nBPkTE+kvvYlBwLo87W1sfMmj6Vf/HCzdCiQs3oye26d2\n3rLHvgpr3Tyst3bp1"
  },
  {
    "path": "sig/jq-release-old.key",
    "chars": 2422,
    "preview": "-----BEGIN PGP PUBLIC KEY BLOCK-----\nComment: jq Release Signing Key 0xAF19040C71523402\n\nmQINBFYayakBEADL6biudAZ3V1//e3g"
  },
  {
    "path": "sig/v1.3/jq-linux-x86.asc",
    "chars": 819,
    "preview": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJWGzhJAAoJEK8ZBAxxUjQC8xMQAMgSl+2aYa/c/LuYKDWtVnHO\nG16rAq"
  },
  {
    "path": "sig/v1.3/jq-linux-x86_64.asc",
    "chars": 819,
    "preview": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJWGzhxAAoJEK8ZBAxxUjQCb2EP/08Lgfoc0rDv5IirCjXIFWxM\n8C56aV"
  },
  {
    "path": "sig/v1.3/jq-osx-x86.asc",
    "chars": 819,
    "preview": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJWGzh+AAoJEK8ZBAxxUjQCyb4QALrsqZ/QkI2a/uVPnwAh22B4\nmtbplx"
  },
  {
    "path": "sig/v1.3/jq-osx-x86_64.asc",
    "chars": 819,
    "preview": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJWGziCAAoJEK8ZBAxxUjQCkGcQAMpxoK6aHzDIeVjp5kQ4MOFu\ndOE0xj"
  },
  {
    "path": "sig/v1.3/jq-win32.exe.asc",
    "chars": 819,
    "preview": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJWGziHAAoJEK8ZBAxxUjQCG6cP/RNQd9g+Te+fgpFvnFDhAVyW\nEKZ+2B"
  },
  {
    "path": "sig/v1.3/jq-win64.exe.asc",
    "chars": 819,
    "preview": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJWGziKAAoJEK8ZBAxxUjQCP14P/jkKiLUgiZkXYVQs+hBJqJD2\nrOsHVG"
  },
  {
    "path": "sig/v1.3/sha256sum.txt",
    "chars": 476,
    "preview": "cf4b0b3e505958843375ac153d84ad6ee40196aa76ee373b0409f858b3cbf925  jq-linux-x86\ndbacac81ebc00a7387e4c5e539a7a475981a1ac6a"
  },
  {
    "path": "sig/v1.4/jq-linux-x86.asc",
    "chars": 819,
    "preview": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJWGzjvAAoJEK8ZBAxxUjQC5KsQAMt1IwBrIn8dvTe44djO3QYk\nH/qaNS"
  },
  {
    "path": "sig/v1.4/jq-linux-x86_64.asc",
    "chars": 819,
    "preview": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJWGzjzAAoJEK8ZBAxxUjQCTVwQAKoTbAddyfciZzgaxSWqc0Yz\nf9njjv"
  },
  {
    "path": "sig/v1.4/jq-osx-x86.asc",
    "chars": 819,
    "preview": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJWGzjzAAoJEK8ZBAxxUjQCmKQQAIei/vszKSXY7gyirM1FmUEO\njPEzjH"
  },
  {
    "path": "sig/v1.4/jq-osx-x86_64.asc",
    "chars": 819,
    "preview": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJWGzj0AAoJEK8ZBAxxUjQCeTYP/jt8hRyHNKtFfahjW50EcAab\nnSqUr5"
  },
  {
    "path": "sig/v1.4/jq-solaris11-32.asc",
    "chars": 819,
    "preview": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJWGzj1AAoJEK8ZBAxxUjQC7PUP/3J4uNx0zpw4SlnB+yBzrKqn\nZk2Jah"
  },
  {
    "path": "sig/v1.4/jq-solaris11-64.asc",
    "chars": 819,
    "preview": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJWGzj1AAoJEK8ZBAxxUjQCZ9UQAIlJSA4wU8lFakjVI1QfJ8AA\nv0FUY8"
  },
  {
    "path": "sig/v1.4/jq-win32.exe.asc",
    "chars": 819,
    "preview": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJWGzj2AAoJEK8ZBAxxUjQCJygQAJfXI0fZjCgdicjtwN2RbKP4\nnLpao2"
  },
  {
    "path": "sig/v1.4/jq-win64.exe.asc",
    "chars": 819,
    "preview": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJWGzj2AAoJEK8ZBAxxUjQCao4QALTCDd7W7SZ8tyVNSmOsILmi\n7OcRdE"
  },
  {
    "path": "sig/v1.4/sha256sum.txt",
    "chars": 720,
    "preview": "998c41babeb57b4304e65b4eb73094279b3ab1e63801b6b4bddd487ce009b39d  jq-1.4.tar.gz\n1dee4bd2516f699723f373b2629c9173ce123b92"
  },
  {
    "path": "sig/v1.5/jq-linux32-no-oniguruma.asc",
    "chars": 819,
    "preview": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJWGzltAAoJEK8ZBAxxUjQCbHIQAMU3mjBvi24X5CfTkyOmDOb9\nsxxsuT"
  },
  {
    "path": "sig/v1.5/jq-linux32.asc",
    "chars": 819,
    "preview": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJWKaLsAAoJEK8ZBAxxUjQCv7UQAIEPihgkz3swMhxQVsRSd/dy\nd8sQMu"
  },
  {
    "path": "sig/v1.5/jq-linux64.asc",
    "chars": 819,
    "preview": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJWGzlxAAoJEK8ZBAxxUjQCFqIQAL2JdiZNp9GZm+SK115N5Twz\nmjI66f"
  },
  {
    "path": "sig/v1.5/jq-osx-amd64.asc",
    "chars": 819,
    "preview": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJWGzlyAAoJEK8ZBAxxUjQCiLMQAKBpyaj6un1mLebzt4JDQmEf\nqzzYK/"
  },
  {
    "path": "sig/v1.5/jq-win32.exe.asc",
    "chars": 819,
    "preview": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJWGzlyAAoJEK8ZBAxxUjQCopgQAIII75ovkAQmCS2aU5Ph2Yfk\nxLj40C"
  },
  {
    "path": "sig/v1.5/jq-win64.exe.asc",
    "chars": 819,
    "preview": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIbBAABAgAGBQJWGzlzAAoJEK8ZBAxxUjQCW1AP9j8jyZcTFFzBAqLbxrn5Ljbj\n6VXIDr"
  },
  {
    "path": "sig/v1.5/sha256sum.txt",
    "chars": 548,
    "preview": "c4d2bfec6436341113419debf479d833692cc5cdab7eb0326b5a4d4fbe9f493c  jq-1.5.tar.gz\n77c2e4dd9e92c58a662582a24109330a8a94562c"
  },
  {
    "path": "sig/v1.5rc1/jq-linux-x86_64-static.asc",
    "chars": 819,
    "preview": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJWGzk2AAoJEK8ZBAxxUjQCJ8cQAJJQoCwUiFf5MHqGHGaSC07L\nbKyvm2"
  },
  {
    "path": "sig/v1.5rc1/jq-win32.exe.asc",
    "chars": 819,
    "preview": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJWGzk5AAoJEK8ZBAxxUjQCJZ8QAIlRnnKW3A6yLpAGSNsQ/Rm1\n34ElcC"
  },
  {
    "path": "sig/v1.5rc1/jq-win64.exe.asc",
    "chars": 819,
    "preview": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJWGzk6AAoJEK8ZBAxxUjQC2tMP/jitj5yEkh4PL/apImNJBZSd\nPPRWhO"
  },
  {
    "path": "sig/v1.5rc1/sha256sum.txt",
    "chars": 330,
    "preview": "5c33ac16152344893f596d2c9f256b6cee6e925e53718c94d24049b640ea955f  jq-1.5rc1.tar.gz\ndfbb2d073d2df9ee0bec44b60bd81e213b788"
  },
  {
    "path": "sig/v1.5rc2/jq-linux-x86.asc",
    "chars": 819,
    "preview": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJWGzlUAAoJEK8ZBAxxUjQC6acQAIREc1GPBwDiL3STKWVEUYC5\nr+Cti+"
  },
  {
    "path": "sig/v1.5rc2/jq-linux-x86_64.asc",
    "chars": 819,
    "preview": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJWGzlWAAoJEK8ZBAxxUjQCmrMP/1jfOkKVG7FZgArN0ZYBgJiR\njP5L6/"
  },
  {
    "path": "sig/v1.5rc2/jq-osx-x86_64.asc",
    "chars": 819,
    "preview": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJWGzlXAAoJEK8ZBAxxUjQC3YwP/23mNNa+XscTIWHKPihfNoNn\nTIgGXP"
  },
  {
    "path": "sig/v1.5rc2/jq-win32.exe.asc",
    "chars": 819,
    "preview": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJWGzlXAAoJEK8ZBAxxUjQCwSQP/3hRFwE5XzTNpBbMFiThq8GP\nxON/4/"
  },
  {
    "path": "sig/v1.5rc2/jq-win64.exe.asc",
    "chars": 819,
    "preview": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJWGzlYAAoJEK8ZBAxxUjQC6bQP/3WzIL/KgnUmI3ziUJcaKgLx\nEOkMA7"
  },
  {
    "path": "sig/v1.5rc2/sha256sum.txt",
    "chars": 562,
    "preview": "2fd209ca34d0891499bd32f59ec332b0b3048c449c388d428e5c5e8132a13e81  jq-1.5rc2.tar.gz\nfb7c57cbce7073ec18f669a313e956864dfaf"
  },
  {
    "path": "sig/v1.6/jq-linux32.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEET9cB1vqbPS31rJNdrxkEDHFSNAIFAlvbqFAACgkQrxkEDHFS\nNAIQNRAArTVuw4JwSbxKzC4Y"
  },
  {
    "path": "sig/v1.6/jq-linux64.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEET9cB1vqbPS31rJNdrxkEDHFSNAIFAlvbqF8ACgkQrxkEDHFS\nNAK+UhAAx+mFwf7XRYLznTU4"
  },
  {
    "path": "sig/v1.6/jq-osx-amd64.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEET9cB1vqbPS31rJNdrxkEDHFSNAIFAlvbqGUACgkQrxkEDHFS\nNAJT0hAAvuHiFUoXoHh6fJ16"
  },
  {
    "path": "sig/v1.6/jq-win32.exe.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEET9cB1vqbPS31rJNdrxkEDHFSNAIFAlvbqGgACgkQrxkEDHFS\nNAKFsQ//fWWzw7pWIt2v0vCn"
  },
  {
    "path": "sig/v1.6/jq-win64.exe.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEET9cB1vqbPS31rJNdrxkEDHFSNAIFAlvbqGsACgkQrxkEDHFS\nNAK2Sg/+O0nHwVg185EwKoOR"
  },
  {
    "path": "sig/v1.6/sha256sum.txt",
    "chars": 548,
    "preview": "5de8c8e29aaa3fb9cc6b47bb27299f271354ebb72514e3accadc7d38b5bbaa72  jq-1.6.tar.gz\ne33f9219cd8c3851b411215dbac51d7fcca4a2b1"
  },
  {
    "path": "sig/v1.7/jq-1.7.tar.gz.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcr0ACgkQsNpg+0VL\nrxi2/BAAqwq1ZsOqkHK5Mtga"
  },
  {
    "path": "sig/v1.7/jq-1.7.zip.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcr0ACgkQsNpg+0VL\nrxhU5RAAiHPJPvbbkt4cAwDu"
  },
  {
    "path": "sig/v1.7/jq-linux-amd64.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcr0ACgkQsNpg+0VL\nrxjhhA/+JzlKXLwKeyLTweYO"
  },
  {
    "path": "sig/v1.7/jq-linux-arm64.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcr4ACgkQsNpg+0VL\nrxhmQg/9GD7+72ljIgOti8mu"
  },
  {
    "path": "sig/v1.7/jq-linux-armel.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcr4ACgkQsNpg+0VL\nrxg1jxAAjxjU8b1TImyQZOag"
  },
  {
    "path": "sig/v1.7/jq-linux-armhf.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcr4ACgkQsNpg+0VL\nrxiIWw/9EZ5FUJTf6B50+ewt"
  },
  {
    "path": "sig/v1.7/jq-linux-i386.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcr4ACgkQsNpg+0VL\nrxiuzhAAgpI963y51Oi4DGDH"
  },
  {
    "path": "sig/v1.7/jq-linux-mips.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcr4ACgkQsNpg+0VL\nrxgmwRAAkSckwt0TU79Xugwn"
  },
  {
    "path": "sig/v1.7/jq-linux-mips64.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcr4ACgkQsNpg+0VL\nrxht/xAAjF4ylq0qxdS/A/fV"
  },
  {
    "path": "sig/v1.7/jq-linux-mips64el.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcr4ACgkQsNpg+0VL\nrxipcRAArhIRURauqvYE2BT0"
  },
  {
    "path": "sig/v1.7/jq-linux-mips64r6.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcr4ACgkQsNpg+0VL\nrxjCahAArur1py1oRs+EwF1d"
  },
  {
    "path": "sig/v1.7/jq-linux-mips64r6el.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcr8ACgkQsNpg+0VL\nrxjOOQ/+MqpkUSs5vAVOziON"
  },
  {
    "path": "sig/v1.7/jq-linux-mipsel.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcr8ACgkQsNpg+0VL\nrxilxw//XVx7z8DBeI31/3yg"
  },
  {
    "path": "sig/v1.7/jq-linux-mipsr6.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcr8ACgkQsNpg+0VL\nrxgTHQ/9F+fhyRkb35aIPmZc"
  },
  {
    "path": "sig/v1.7/jq-linux-mipsr6el.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcr8ACgkQsNpg+0VL\nrxiwWhAAzBVIQxjaiQwEVOZr"
  },
  {
    "path": "sig/v1.7/jq-linux-powerpc.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcr8ACgkQsNpg+0VL\nrxhpiw//WVObFLj1blZODLF2"
  },
  {
    "path": "sig/v1.7/jq-linux-ppc64el.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcr8ACgkQsNpg+0VL\nrxik7RAAxSJA91SLUMARACed"
  },
  {
    "path": "sig/v1.7/jq-linux-riscv64.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcr8ACgkQsNpg+0VL\nrxgHFBAAx63JRicBn12SzDlV"
  },
  {
    "path": "sig/v1.7/jq-linux-s390x.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcr8ACgkQsNpg+0VL\nrxg2xBAAnGkQwRwRkf5c9yRt"
  },
  {
    "path": "sig/v1.7/jq-linux32.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcr8ACgkQsNpg+0VL\nrxiUSw/6A5cxFQlyX0y7LjUS"
  },
  {
    "path": "sig/v1.7/jq-linux64.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcsAACgkQsNpg+0VL\nrxj83g/8DAa+uDh+Fkj2nTf3"
  },
  {
    "path": "sig/v1.7/jq-macos-amd64.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcsAACgkQsNpg+0VL\nrxihPBAAr9jG+Whevk0q1jxT"
  },
  {
    "path": "sig/v1.7/jq-macos-arm64.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcsAACgkQsNpg+0VL\nrxjPIxAAqOKp1eAIvkBcjHkJ"
  },
  {
    "path": "sig/v1.7/jq-osx-amd64.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcsAACgkQsNpg+0VL\nrxihPBAAr9jG+Whevk0q1jxT"
  },
  {
    "path": "sig/v1.7/jq-win32.exe.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcsAACgkQsNpg+0VL\nrxhlExAAyCOnfSnt50GJrk8A"
  },
  {
    "path": "sig/v1.7/jq-win64.exe.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcsAACgkQsNpg+0VL\nrxiaEw/+PytIQU+uIi0XE3cx"
  },
  {
    "path": "sig/v1.7/jq-windows-amd64.exe.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcsAACgkQsNpg+0VL\nrxiaEw/+PytIQU+uIi0XE3cx"
  },
  {
    "path": "sig/v1.7/jq-windows-i386.exe.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcsAACgkQsNpg+0VL\nrxhlExAAyCOnfSnt50GJrk8A"
  },
  {
    "path": "sig/v1.7/sha256sum.txt",
    "chars": 1890,
    "preview": "402a0d6975d946e6f4e484d1a84320414a0ff8eb6cf49d2c11d144d4d344db62  jq-1.7.tar.gz\nea21e5402983d0e351f37fee72c2d456192c734f"
  },
  {
    "path": "sig/v1.7.1/jq-1.7.1.tar.gz.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcd4ACgkQsNpg+0VL\nrxhEhQ//Y2Eeo5cOdVdpd1TX"
  },
  {
    "path": "sig/v1.7.1/jq-1.7.1.zip.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcd4ACgkQsNpg+0VL\nrxjSxxAAxez+Ag1zwobaMD0Q"
  },
  {
    "path": "sig/v1.7.1/jq-linux-amd64.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcd4ACgkQsNpg+0VL\nrxiHhw//TBEUiVj7hRN2sgAo"
  },
  {
    "path": "sig/v1.7.1/jq-linux-arm64.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIyBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcd4ACgkQsNpg+0VL\nrxi9PQ/3UjtaLAq4pQUQt1Ne"
  },
  {
    "path": "sig/v1.7.1/jq-linux-armel.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcd4ACgkQsNpg+0VL\nrxh9bA//feLBpnr8Qi62Jy4q"
  },
  {
    "path": "sig/v1.7.1/jq-linux-armhf.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcd8ACgkQsNpg+0VL\nrxgZDBAAioN1WXgi3onDx6Sd"
  },
  {
    "path": "sig/v1.7.1/jq-linux-i386.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcd8ACgkQsNpg+0VL\nrxiUfg//RIvFDrv+ie8dzd3P"
  },
  {
    "path": "sig/v1.7.1/jq-linux-mips.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcd8ACgkQsNpg+0VL\nrxgcGRAAwEp2asToQT7ejK/d"
  },
  {
    "path": "sig/v1.7.1/jq-linux-mips64.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcd8ACgkQsNpg+0VL\nrxgCFw//Rsxw9x76y+iOqgoD"
  },
  {
    "path": "sig/v1.7.1/jq-linux-mips64el.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcd8ACgkQsNpg+0VL\nrxh5cA//c4nMQ2cFJWWbiZ8E"
  },
  {
    "path": "sig/v1.7.1/jq-linux-mips64r6.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcd8ACgkQsNpg+0VL\nrxhB7g//UwWwAWCzjIIHrjCC"
  },
  {
    "path": "sig/v1.7.1/jq-linux-mips64r6el.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcd8ACgkQsNpg+0VL\nrxi3fQ/+OFDEzY2396qJS9gK"
  },
  {
    "path": "sig/v1.7.1/jq-linux-mipsel.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcd8ACgkQsNpg+0VL\nrxjp/hAAgwlPF0DYTZPquduW"
  },
  {
    "path": "sig/v1.7.1/jq-linux-mipsr6.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLceAACgkQsNpg+0VL\nrxiWKg//TpJChosdrGdCiEFo"
  },
  {
    "path": "sig/v1.7.1/jq-linux-mipsr6el.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLceAACgkQsNpg+0VL\nrxgpxQ//R+95Bn2kKcghpgJn"
  },
  {
    "path": "sig/v1.7.1/jq-linux-powerpc.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLceAACgkQsNpg+0VL\nrxiXVw/9F2CgcLQKF74V3KEO"
  },
  {
    "path": "sig/v1.7.1/jq-linux-ppc64el.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLceAACgkQsNpg+0VL\nrxjAaw/9HtCptIOmxpfbz29e"
  },
  {
    "path": "sig/v1.7.1/jq-linux-riscv64.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLceAACgkQsNpg+0VL\nrxhxCw//TRcytUiUuQ4yjdCP"
  },
  {
    "path": "sig/v1.7.1/jq-linux-s390x.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLceAACgkQsNpg+0VL\nrxiDcA//ecc7FbMqqVhrICDL"
  },
  {
    "path": "sig/v1.7.1/jq-linux64.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLceAACgkQsNpg+0VL\nrxhBkxAAj9b99EVI4eIbHthB"
  },
  {
    "path": "sig/v1.7.1/jq-macos-amd64.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLceAACgkQsNpg+0VL\nrxg3xQ//Z2VE6wRM6rIHWnT9"
  },
  {
    "path": "sig/v1.7.1/jq-macos-arm64.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLceAACgkQsNpg+0VL\nrxgxvg//X+TyO3SdT94jlBn0"
  },
  {
    "path": "sig/v1.7.1/jq-osx-amd64.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLceEACgkQsNpg+0VL\nrxjqlxAAsKcs/5wnGUfL3DBu"
  },
  {
    "path": "sig/v1.7.1/jq-win64.exe.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLceEACgkQsNpg+0VL\nrxiYtw/9FETxa8Nx91lb6WKS"
  },
  {
    "path": "sig/v1.7.1/jq-windows-amd64.exe.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLceEACgkQsNpg+0VL\nrxiYtw/9FETxa8Nx91lb6WKS"
  },
  {
    "path": "sig/v1.7.1/jq-windows-i386.exe.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLceEACgkQsNpg+0VL\nrxi3Aw/+KIV4xZdceYNHNsSQ"
  },
  {
    "path": "sig/v1.7.1/sha256sum.txt",
    "chars": 2129,
    "preview": "478c9ca129fd2e3443fe27314b455e211e0d8c60bc8ff7df703873deeee580c2  jq-1.7.1.tar.gz\nc9fab0ed0ce278dabc0606462ab9c4c3385bc8"
  },
  {
    "path": "sig/v1.7rc1/jq-1.7rc1.tar.gz.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcmYACgkQsNpg+0VL\nrxgqOg/+Pj4c5lo05Ei10+d/"
  },
  {
    "path": "sig/v1.7rc1/jq-1.7rc1.zip.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcmYACgkQsNpg+0VL\nrxjMuQ//Sn0UEuZkY1HYXZoc"
  },
  {
    "path": "sig/v1.7rc1/jq-linux-amd64.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcmcACgkQsNpg+0VL\nrxhUHxAAi49m2xrVlN//CHhh"
  },
  {
    "path": "sig/v1.7rc1/jq-linux-arm64.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcmcACgkQsNpg+0VL\nrxgLhxAAg1d0RMrOEi6rdT7A"
  },
  {
    "path": "sig/v1.7rc1/jq-linux-armel.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcmcACgkQsNpg+0VL\nrxhn5BAAgwJtpctwGgMXltgM"
  },
  {
    "path": "sig/v1.7rc1/jq-linux-armhf.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcmcACgkQsNpg+0VL\nrxgZexAAvccUklYZ9yShEkTA"
  },
  {
    "path": "sig/v1.7rc1/jq-linux-i386.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcmcACgkQsNpg+0VL\nrxhwqw/8Da2dK18NsmwECjZ5"
  },
  {
    "path": "sig/v1.7rc1/jq-linux-mips.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcmcACgkQsNpg+0VL\nrxhFqRAAzyNAw+SMQ5qOTrGk"
  },
  {
    "path": "sig/v1.7rc1/jq-linux-mips64.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcmcACgkQsNpg+0VL\nrxiF0BAAgdGoAA76AdTueDlt"
  },
  {
    "path": "sig/v1.7rc1/jq-linux-mips64el.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcmcACgkQsNpg+0VL\nrxhhWA/5AYDVBWeLyXTLuX0o"
  },
  {
    "path": "sig/v1.7rc1/jq-linux-mips64r6.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcmgACgkQsNpg+0VL\nrxg6LQ//V4+w0x9VGTJmLT0D"
  },
  {
    "path": "sig/v1.7rc1/jq-linux-mips64r6el.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcmgACgkQsNpg+0VL\nrxh0Tw//cYM3SASF5CQyPZSg"
  },
  {
    "path": "sig/v1.7rc1/jq-linux-mipsel.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcmgACgkQsNpg+0VL\nrxgbUg/+Mrnx1ob+WACO9L9i"
  },
  {
    "path": "sig/v1.7rc1/jq-linux-mipsr6.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcmgACgkQsNpg+0VL\nrxhh8w/+PB4r3/JmzvOfEzyR"
  },
  {
    "path": "sig/v1.7rc1/jq-linux-mipsr6el.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcmgACgkQsNpg+0VL\nrxgsBA/+PewQy0cuEYaVXixN"
  },
  {
    "path": "sig/v1.7rc1/jq-linux-powerpc.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcmgACgkQsNpg+0VL\nrxiDnhAAmNuWQ4GrXoWWIaLE"
  },
  {
    "path": "sig/v1.7rc1/jq-linux-ppc64el.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcmgACgkQsNpg+0VL\nrxhWzg//Xp84TAC6nKex2ltA"
  },
  {
    "path": "sig/v1.7rc1/jq-linux-riscv64.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcmgACgkQsNpg+0VL\nrxiiEQ/8CPwASVeAhBg50Drc"
  },
  {
    "path": "sig/v1.7rc1/jq-linux-s390x.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcmkACgkQsNpg+0VL\nrxhT7hAAuOrde3Dk3GIT4LAc"
  },
  {
    "path": "sig/v1.7rc1/jq-macos-amd64.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcmkACgkQsNpg+0VL\nrxin4g//RcbIWxy1MlVquBec"
  },
  {
    "path": "sig/v1.7rc1/jq-macos-arm64.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcmkACgkQsNpg+0VL\nrxjuHRAAll/Lz/hjYoVdwKRN"
  },
  {
    "path": "sig/v1.7rc1/jq-windows-amd64.exe.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcmkACgkQsNpg+0VL\nrxjghg//a3k8YL1fMg8gJu4K"
  },
  {
    "path": "sig/v1.7rc1/jq-windows-i386.exe.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcmkACgkQsNpg+0VL\nrxj/ZhAAxVJ3mXqCkmk7/6Cx"
  },
  {
    "path": "sig/v1.7rc1/sha256sum.txt",
    "chars": 1873,
    "preview": "a6a7837cb46c61a8666467fef06754fe53b95c1626b5416ada58edfe1393dac3 jq-1.7rc1.tar.gz\na552843335c2939741ae4b52979d6a3ef6057d"
  },
  {
    "path": "sig/v1.7rc2/jq-1.7rc2.tar.gz.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcnIACgkQsNpg+0VL\nrxjNAw//YHABP13K1tpHrvkU"
  },
  {
    "path": "sig/v1.7rc2/jq-1.7rc2.zip.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcnIACgkQsNpg+0VL\nrxjjAg//SjVeth+bv/MCkT5Z"
  },
  {
    "path": "sig/v1.7rc2/jq-linux-amd64.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcnIACgkQsNpg+0VL\nrxhSnA/+KGGXVk8TgZD5dS4k"
  },
  {
    "path": "sig/v1.7rc2/jq-linux-arm64.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcnIACgkQsNpg+0VL\nrxjDNw//Q90Z3WIulbkc3hiF"
  },
  {
    "path": "sig/v1.7rc2/jq-linux-armel.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcnIACgkQsNpg+0VL\nrxgNOA/+PCuuLzpM8J5D3lIJ"
  },
  {
    "path": "sig/v1.7rc2/jq-linux-armhf.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcnIACgkQsNpg+0VL\nrxgyAhAAqHyDyFZcoX3JD6Bm"
  },
  {
    "path": "sig/v1.7rc2/jq-linux-i386.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcnIACgkQsNpg+0VL\nrxg9HxAAipIB4LUOyRgT09im"
  },
  {
    "path": "sig/v1.7rc2/jq-linux-mips.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcnMACgkQsNpg+0VL\nrxh2OQ/+I8uvLk/WJmfGggLc"
  },
  {
    "path": "sig/v1.7rc2/jq-linux-mips64.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcnMACgkQsNpg+0VL\nrxhorhAAsTr+XX32+V9lKVdD"
  },
  {
    "path": "sig/v1.7rc2/jq-linux-mips64el.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcnMACgkQsNpg+0VL\nrxh12g/8Dui2XSC8rdM9ruvp"
  },
  {
    "path": "sig/v1.7rc2/jq-linux-mips64r6.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcnMACgkQsNpg+0VL\nrxi/SQ/9FByl5/uAtnMzjWYV"
  },
  {
    "path": "sig/v1.7rc2/jq-linux-mips64r6el.asc",
    "chars": 833,
    "preview": "-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCAAdFiEEkwealRHvwLfWzb+1sNpg+0VLrxgFAmiLcnMACgkQsNpg+0VL\nrxjsuhAAySYBBPWV7hEQ/1qF"
  }
]

// ... and 187 more files (download for full content)

About this extraction

This page contains the full source code of the jqlang/jq GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 387 files (3.1 MB), approximately 830.2k tokens, and a symbol index with 1104 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!