diff options
Diffstat (limited to 'scripts/bash_aliases')
-rw-r--r-- | scripts/bash_aliases | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/scripts/bash_aliases b/scripts/bash_aliases new file mode 100644 index 0000000..e461707 --- /dev/null +++ b/scripts/bash_aliases @@ -0,0 +1,153 @@ +# SPDX-License-Identifier: GPL-2.0-only +######################################################################## +# +# (C) Copyright 2020-2022, Alejandro Colomar +# These functions are free software; you can redistribute them and/or +# modify them under the terms of the GNU General Public License +# as published by the Free Software Foundation; version 2. +# +# These functions are distributed in the hope that they will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details +# (http://www.gnu.org/licenses/gpl-2.0.html). +# +######################################################################## + +######################################################################## +# Exit status + +EX_USAGE=64; + +######################################################################## +# C + +# sed_rm_ccomments() removes C comments. +# It can't handle mixed //... and /*...*/ comments. +# Use as a filter (see man_lsfunc() in this file). + +sed_rm_ccomments() +{ + perl -p -e 's%/\*.*?\*/%%g' \ + |sed -E '\%/\*%, \%\*/% {\%(\*/|/\*)%!d}' \ + |sed -E '\%/\*% {s%/\*.*%%; n; s%.*\*/%%;}' \ + |sed -E '\%/\*% {s%/\*.*%%; n; s%.*\*/%%;}' \ + |sed 's%//.*%%'; +} + +######################################################################## +# Linux man-pages + +# man_section() prints specific manual page sections (DESCRIPTION, SYNOPSIS, +# ...) of all manual pages in a directory (or in a single manual page file). +# Usage example: .../man-pages$ man_section man2 SYNOPSIS 'SEE ALSO'; + +man_section() +{ + if [ $# -lt 2 ]; then + >&2 echo "Usage: ${FUNCNAME[0]} <dir> <section>..."; + return $EX_USAGE; + fi + + local page="$1"; + shift; + local sect="$*"; + + find "$page" -type f \ + |xargs wc -l \ + |grep -v -e '\b1 ' -e '\btotal\b' \ + |awk '{ print $2 }' \ + |sort \ + |while read -r manpage; do + (sed -n '/^\.TH/,/^\.SH/{/^\.SH/!p}' <"$manpage"; + for s in $sect; do + <"$manpage" \ + sed -n \ + -e "/^\.SH $s/p" \ + -e "/^\.SH $s/,/^\.SH/{/^\.SH/!p}"; + done;) \ + |mandoc -Tutf8 2>/dev/null \ + |col -pbx; + done; +} + +# man_lsfunc() prints the name of all C functions declared in the SYNOPSIS +# of all manual pages in a directory (or in a single manual page file). +# Each name is printed in a separate line +# Usage example: .../man-pages$ man_lsfunc man2; + +man_lsfunc() +{ + if [ $# -lt 1 ]; then + >&2 echo "Usage: ${FUNCNAME[0]} <manpage|manNdir>..."; + return $EX_USAGE; + fi + + for arg in "$@"; do + man_section "$arg" 'SYNOPSIS'; + done \ + |sed_rm_ccomments \ + |pcregrep -Mn '(?s)^ [\w ]+ \**\w+\([\w\s(,)[\]*]*?(...)?\s*\); *$' \ + |grep '^[0-9]' \ + |sed -E 's/syscall\(SYS_(\w*),?/\1(/' \ + |sed -E 's/^[^(]+ \**(\w+)\(.*/\1/' \ + |uniq; +} + +# man_lsvar() prints the name of all C variables declared in the SYNOPSIS +# of all manual pages in a directory (or in a single manual page file). +# Each name is printed in a separate line +# Usage example: .../man-pages$ man_lsvar man3; + +man_lsvar() +{ + if [ $# -lt 1 ]; then + >&2 echo "Usage: ${FUNCNAME[0]} <manpage|manNdir>..."; + return $EX_USAGE; + fi + + for arg in "$@"; do + man_section "$arg" 'SYNOPSIS'; + done \ + |sed_rm_ccomments \ + |pcregrep -Mv '(?s)^ [\w ]+ \**\w+\([\w\s(,)[\]*]+?(...)?\s*\); *$' \ + |pcregrep -Mn \ + -e '(?s)^ +extern [\w ]+ \**\(\*+[\w ]+\)\([\w\s(,)[\]*]+?\s*\); *$' \ + -e '^ +extern [\w ]+ \**[\w ]+; *$' \ + |grep '^[0-9]' \ + |grep -v 'typedef' \ + |sed -E 's/^[0-9]+: +extern [^(]+ \**\(\*+(\w* )?(\w+)\)\(.*/\2/' \ + |sed 's/^[0-9]\+: \+extern .* \**\(\w\+\); */\1/' \ + |uniq; +} + +# pdfman() renders a manual page in PDF +# Usage example: .../man-pages$ pdfman man2/membarrier.2; + +pdfman() +{ + if [ $# -eq 0 ]; then + >&2 echo "Usage: ${FUNCNAME[0]} [man(1) options] [section] page"; + return $EX_USAGE; + fi; + + local tmp="$(mktemp -t "${!###*/}.XXXXXX")"; + + man -Tps "$@" \ + |ps2pdf - - \ + >"$tmp"; + xdg-open "$tmp"; +} + +# man_gitstaged prints a list of all files with changes staged for commit +# (basename only if the files are within <man?/>), separated by ", ". +# Usage example: .../man-pages$ git commit -m "$(man_gitstaged): msg"; + +man_gitstaged() +{ + git diff --staged --name-only \ + |sed 's/$/, /' \ + |sed 's%.*/%%' \ + |tr -d '\n' \ + |sed 's/, $//' +} |