- 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. - 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> --- bin/stdc | 101 +++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 68 insertions(+), 33 deletions(-) diff --git a/bin/stdc b/bin/stdc index 8c725a2..375be76 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 pcregrep)" +if [[ -z "$pcregrep" ]]; then + pcregrep="$(type -P pcre2grep)" +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 "pcregrep or pcre2grep 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