- Some small stylistic changes such as removing trailing semicolons and noisy `shift` calls. - Ensure pcregrep exists. It is installed as pcre2grep on my machine, so check for both and error out if neither is found. Prefer pcre2grep (installed by libpcre2) because libpcre is EOL. - Make libc_summ() standard-agnostics by passing in the filter expression and the path to the doc as arguments. - Make libc_summ() error out if the doc is not found. - Give basic usage information on usage errors. - Make the standard version match case insensitive. Signed-off-by: Oskari Pirhonen <xxc3ncoredxx@xxxxxxxxx> --- v1 -> v2: - Prefer pcre2grep from libpcre2. Suggested by Sam on IRC. bin/stdc | 101 +++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 68 insertions(+), 33 deletions(-) diff --git a/bin/stdc b/bin/stdc index 8c725a2..0d322af 100755 --- a/bin/stdc +++ b/bin/stdc @@ -1,65 +1,100 @@ -#!/bin/bash +#!/usr/bin/env bash -set -Eefuo pipefail; +set -Efuo pipefail -prefix="/usr/local"; -datarootdir="$prefix/share"; -docdir="$datarootdir/doc"; +prefix="/usr/local" +datarootdir="$prefix/share" +docdir="$datarootdir/doc" + +c89_filter='/A.3 LIBRARY SUMMARY/,$p' +c89_doc="$docdir/c/c89/c89-draft.txt" +c99_filter='/Library summary$/,/Sequence points$/p' +c99_doc="$docdir/c/c99/n1256.txt" +c11_filter='/Library summary$/,/Sequence points$/p' +c11_doc="$docdir/c/c11/n1570.txt" + +pcregrep="$(type -P pcre2grep)" +if [[ -z "$pcregrep" ]]; then + pcregrep="$(type -P pcregrep)" +fi err() { - >&2 echo "$(basename "$0"): error: $*"; - exit 1; + >&2 echo "$*" } -grep_proto() +die() +{ + err "$(basename "$0"): error: $*" + exit 1 +} + +# Args: +# 1: usage error +usage() { - pcregrep -M "(?s)\b$1 *\([[:alnum:]*,._\s\(\)-]*\);$"; + err "$*" + err + err "usage: $(basename "$0") <version> <function>" + err + err " version ISO C version. Supported versions:" + err " C89, C99, C11" + err " (case insensitive)" + err " function Function to look for" + exit 1 } -libc_summ_c89() +# Args: +# 1: declaration to look for +grep_proto() { - sed -n '/A.3 LIBRARY SUMMARY/,$p' <"$docdir/c/c89/c89-draft.txt"; + "$pcregrep" -M "(?s)\b$1 *\([[:alnum:]*,._\s\(\)-]*\);\$" } +# Args: +# 1: filter expression +# 2: path to plaintext standard libc_summ() { - sed -n '/Library summary$/,/Sequence points$/p'; + if [[ ! -r "$2" ]]; then + die "cannot find or read '$2'" + fi + sed -n -e "$1" "$2" } +if [[ -z "$pcregrep" ]]; then + die "pcre2grep or pcregrep required but is not installed" +fi + case $# in -0) - err "missing ISO C version."; - ;; -1) - err "missing function name."; +0|1) + usage "missing ISO C version and/or function name." ;; 2) ;; *) - shift; - shift; - err "unsupported extra argument(s): $*"; + shift + shift + usage "unsupported extra argument(s): ${*@Q}" ;; -esac; +esac -case "$1" in +case "${1@L}" in c89) - shift; - libc_summ_c89 \ - | grep_proto $@; + libc_summ "$c89_filter" "$c89_doc" \ + | grep_proto "$2" ;; c99) - shift; - libc_summ <"$docdir/c/c99/n1256.txt" \ - | grep_proto $@; + libc_summ "$c99_filter" "$c99_doc" \ + | grep_proto "$2" ;; c11) - shift; - libc_summ <"$docdir/c/c11/n1570.txt" \ - | grep_proto $@; + libc_summ "$c11_filter" "$c11_doc" \ + | grep_proto "$2" ;; *) - err "$1: unsupported ISO C version."; + usage "$1: unsupported ISO C version." ;; -esac; +esac + +# vim: set noexpandtab: -- 2.39.2