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
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
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.