aboutsummaryrefslogtreecommitdiff
path: root/gdb/contrib
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/contrib')
-rw-r--r--gdb/contrib/ari/create-web-ari-in-src.sh4
-rwxr-xr-xgdb/contrib/ari/gdb_ari.sh6
-rw-r--r--gdb/contrib/ari/gdb_find.sh2
-rw-r--r--gdb/contrib/ari/update-web-ari.sh8
-rwxr-xr-xgdb/contrib/cc-with-tweaks.sh7
-rw-r--r--gdb/contrib/codespell-dictionary.txt1
-rw-r--r--gdb/contrib/codespell-ignore-words.txt4
-rwxr-xr-xgdb/contrib/codespell-log.sh95
-rw-r--r--gdb/contrib/common-misspellings.txt30
-rw-r--r--gdb/contrib/expect-read1.c2
-rwxr-xr-xgdb/contrib/expect-read1.sh2
-rwxr-xr-xgdb/contrib/gdb-add-index.sh6
-rwxr-xr-xgdb/contrib/license-check-new-files.sh149
-rw-r--r--gdb/contrib/setup.cfg19
-rwxr-xr-xgdb/contrib/spellcheck.sh536
-rw-r--r--gdb/contrib/test_pubnames_and_indexes.py2
-rwxr-xr-xgdb/contrib/words.sh2
17 files changed, 288 insertions, 587 deletions
diff --git a/gdb/contrib/ari/create-web-ari-in-src.sh b/gdb/contrib/ari/create-web-ari-in-src.sh
index 64d3c73..b479ce5 100644
--- a/gdb/contrib/ari/create-web-ari-in-src.sh
+++ b/gdb/contrib/ari/create-web-ari-in-src.sh
@@ -2,7 +2,7 @@
# GDB script to create web ARI page directly from within gdb/ari directory.
#
-# Copyright (C) 2012-2024 Free Software Foundation, Inc.
+# Copyright (C) 2012-2025 Free Software Foundation, Inc.
#
# This file is part of GDB.
#
@@ -50,7 +50,7 @@ if [ -z "${tempdir}" ] ; then
fi
fi
-# Default location of generate index.hmtl web page.
+# Default location of generated index.html web page.
if [ -z "${webdir}" ] ; then
# Use 'branch' subdir name if Tag contains branch
if [ -f "${srcdir}/gdb/CVS/Tag" ] ; then
diff --git a/gdb/contrib/ari/gdb_ari.sh b/gdb/contrib/ari/gdb_ari.sh
index 5ed7d61..e10bbe0 100755
--- a/gdb/contrib/ari/gdb_ari.sh
+++ b/gdb/contrib/ari/gdb_ari.sh
@@ -2,7 +2,7 @@
# GDB script to list of problems using awk.
#
-# Copyright (C) 2002-2024 Free Software Foundation, Inc.
+# Copyright (C) 2002-2025 Free Software Foundation, Inc.
#
# This file is part of GDB.
#
@@ -60,7 +60,7 @@ Options:
-Werror Treat all problems as errors.
-Wall Report all problems.
-Wari Report problems that should be fixed in new code.
- -WCATEGORY Report problems in the specifed category. The category
+ -WCATEGORY Report problems in the specified category. The category
can be prefixed with "no-". Valid categories
are: ${all}
EOF
@@ -159,7 +159,7 @@ BEGIN {
PWD = "'`pwd`'"
}
-# Print the error message for BUG. Append SUPLEMENT if non-empty.
+# Print the error message for BUG. Append SUPPLEMENT if non-empty.
function print_bug(file,line,prefix,category,bug,doc,supplement, suffix,idx) {
if (print_idx) {
idx = bug ": "
diff --git a/gdb/contrib/ari/gdb_find.sh b/gdb/contrib/ari/gdb_find.sh
index f0aa6d1..b6bd3f9 100644
--- a/gdb/contrib/ari/gdb_find.sh
+++ b/gdb/contrib/ari/gdb_find.sh
@@ -2,7 +2,7 @@
# GDB script to create list of files to check using gdb_ari.sh.
#
-# Copyright (C) 2003-2024 Free Software Foundation, Inc.
+# Copyright (C) 2003-2025 Free Software Foundation, Inc.
#
# This file is part of GDB.
#
diff --git a/gdb/contrib/ari/update-web-ari.sh b/gdb/contrib/ari/update-web-ari.sh
index 75ab029..b9ef184 100644
--- a/gdb/contrib/ari/update-web-ari.sh
+++ b/gdb/contrib/ari/update-web-ari.sh
@@ -2,7 +2,7 @@
# GDB script to create GDB ARI web page.
#
-# Copyright (C) 2001-2024 Free Software Foundation, Inc.
+# Copyright (C) 2001-2025 Free Software Foundation, Inc.
#
# This file is part of GDB.
#
@@ -176,7 +176,7 @@ fi
# THIS HAS SUFFERED BIT ROT
if ${check_indent_p} && test -d "${srcdir}"
then
- printf "Analizing file indentation:" 1>&2
+ printf "Analyzing file indentation:" 1>&2
( cd "${srcdir}" && /bin/sh ${aridir}/gdb_find.sh ${project} | while read f
do
if /bin/sh ${aridir}/gdb_indent.sh < ${f} 2>/dev/null | cmp -s - ${f}
@@ -550,7 +550,7 @@ function print_heading (nb_file, where, bug_i) {
for (bug_i = 1; bug_i <= nr_bug; bug_i++) {
bug = i2bug[bug_i];
printf "<th>"
- # The title names are offset by one. Otherwize, when the browser
+ # The title names are offset by one. Otherwise, when the browser
# jumps to the name it leaves out half the relevant column.
#printf "<a name=\",%s\">&nbsp;</a>", bug
printf "<a name=\",%s\">&nbsp;</a>", i2bug[bug_i-1]
@@ -851,7 +851,7 @@ EOF
print_toc 0 -1 deprecate Deprecate <<EOF
Mechanisms that are a candidate for being made obsolete. Once core
GDB no longer depends on these mechanisms and/or there is a
-replacement available, these mechanims can be deprecated (adding the
+replacement available, these mechanisms can be deprecated (adding the
deprecated prefix) obsoleted (put into category obsolete) or deleted.
See obsolete and deprecated.
EOF
diff --git a/gdb/contrib/cc-with-tweaks.sh b/gdb/contrib/cc-with-tweaks.sh
index 4214b92..930ba5c 100755
--- a/gdb/contrib/cc-with-tweaks.sh
+++ b/gdb/contrib/cc-with-tweaks.sh
@@ -2,7 +2,7 @@
# Wrapper around gcc to tweak the output in various ways when running
# the testsuite.
-# Copyright (C) 2010-2024 Free Software Foundation, Inc.
+# Copyright (C) 2010-2025 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
@@ -42,6 +42,7 @@
# -Z invoke objcopy --compress-debug-sections
# -z compress using dwz
# -m compress using dwz -m
+# -5 compress using dwz -m -5
# -i make an index (.gdb_index)
# -c make an index (currently .gdb_index) in a cache dir
# -n make a dwarf5 index (.debug_names)
@@ -88,6 +89,7 @@ want_index=false
index_options=""
want_index_cache=false
want_dwz=false
+dwz_5flag=
want_multi=false
want_dwp=false
want_objcopy_compress=false
@@ -101,6 +103,7 @@ while [ $# -gt 0 ]; do
-n) want_index=true; index_options=-dwarf-5;;
-c) want_index_cache=true ;;
-m) want_multi=true ;;
+ -5) want_multi=true; dwz_5flag=-5 ;;
-p) want_dwp=true ;;
-l) want_gnu_debuglink=true ;;
*) break ;;
@@ -269,7 +272,7 @@ elif [ "$want_multi" = true ]; then
rm -f "$dwz_file"
cp "$output_file" "${output_file}.alt"
- $DWZ -m "$dwz_file" "$output_file" "${output_file}.alt" > /dev/null
+ $DWZ $dwz_5flag -m "$dwz_file" "$output_file" "${output_file}.alt" > /dev/null
rm -f "${output_file}.alt"
# Validate dwz's work by checking if the expected output file exists.
diff --git a/gdb/contrib/codespell-dictionary.txt b/gdb/contrib/codespell-dictionary.txt
new file mode 100644
index 0000000..09bc309
--- /dev/null
+++ b/gdb/contrib/codespell-dictionary.txt
@@ -0,0 +1 @@
+gdbsever->gdbserver
diff --git a/gdb/contrib/codespell-ignore-words.txt b/gdb/contrib/codespell-ignore-words.txt
index a8287f7..881b1d2 100644
--- a/gdb/contrib/codespell-ignore-words.txt
+++ b/gdb/contrib/codespell-ignore-words.txt
@@ -1,3 +1,3 @@
configury
-invokable
-useable
+SME
+Synopsys
diff --git a/gdb/contrib/codespell-log.sh b/gdb/contrib/codespell-log.sh
new file mode 100755
index 0000000..10780f8
--- /dev/null
+++ b/gdb/contrib/codespell-log.sh
@@ -0,0 +1,95 @@
+#!/usr/bin/env bash
+
+# Copyright (C) 2025 Free Software Foundation, Inc.
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it 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.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Script to be used as pre-commit commit-msg hook to spell-check the commit
+# log using codespell.
+#
+# Using codespell directly as a pre-commit commit-msg hook has the drawback
+# that:
+# - if codespell fails, the commit fails
+# - if the commit log mentions a typo correction, it'll require a
+# codespell:ignore annotation.
+#
+# This script works around these problems by treating codespell output as a
+# hint, and ignoring codespell exit status.
+#
+# Implementation note: rather than using codespell directly, this script uses
+# pre-commit to call codespell, because it allows us to control the codespell
+# version that is used.
+
+# Exit on error.
+set -e
+
+# Initialize temporary file names.
+cfg=""
+output=""
+
+cleanup()
+{
+ for f in "$cfg" "$output"; do
+ if [ "$f" != "" ]; then
+ rm -f "$f"
+ fi
+ done
+}
+
+# Schedule cleanup.
+trap cleanup EXIT
+
+# Create temporary files.
+cfg=$(mktemp)
+output=$(mktemp)
+
+gen_cfg ()
+{
+ cat > "$1" <<EOF
+repos:
+- repo: https://github.com/codespell-project/codespell
+ rev: v2.4.1
+ hooks:
+ - id: codespell
+ name: codespell-log-internal
+ stages: [manual]
+ args: [--config, gdb/contrib/setup.cfg]
+EOF
+}
+
+# Generate pre-commit configuration file.
+gen_cfg "$cfg"
+
+# Setup pre-commit command to run.
+cmd=(pre-commit \
+ run \
+ -c "$cfg" \
+ codespell \
+ --hook-stage manual \
+ --files "$@")
+
+# Run pre-commit command.
+if "${cmd[@]}" \
+ > "$output" \
+ 2>&1; then
+ # Command succeeded quietly, we're done.
+ exit 0
+fi
+
+# Command failed quietly, now show the output.
+#
+# Simply doing "cat $output" doesn't produce colored output, so we just
+# run the command again, that should be fast enough.
+#
+# Ignore codespell exit status.
+"${cmd[@]}" || true
diff --git a/gdb/contrib/common-misspellings.txt b/gdb/contrib/common-misspellings.txt
deleted file mode 100644
index 5772f66..0000000
--- a/gdb/contrib/common-misspellings.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright (C) 2024 Free Software Foundation, Inc.
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it 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.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-# This file contains additions to and overrides for
-# wikipedia-common-misspellings.txt.
-
-# Common spelling mistakes.
-
-inbetween->between, in between, in-between
-sofar->so far
-doens't->doesn't
-behavour->behavior
-behaviour->behavior
-arrithemetic->arithmetic
-electricaly->electrically
-
-# Identity rules.
-
-thru->thru
diff --git a/gdb/contrib/expect-read1.c b/gdb/contrib/expect-read1.c
index 454ecda..bb7317b 100644
--- a/gdb/contrib/expect-read1.c
+++ b/gdb/contrib/expect-read1.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2013-2024 Free Software Foundation, Inc.
+/* Copyright (C) 2013-2025 Free Software Foundation, Inc.
This file is part of GDB.
diff --git a/gdb/contrib/expect-read1.sh b/gdb/contrib/expect-read1.sh
index 82c638c..e8589a2 100755
--- a/gdb/contrib/expect-read1.sh
+++ b/gdb/contrib/expect-read1.sh
@@ -1,7 +1,7 @@
#! /bin/sh
# runtest wrapper to reliably reproduce racy incomplete reads in the testsuite.
-# Copyright (C) 2013-2024 Free Software Foundation, Inc.
+# Copyright (C) 2013-2025 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
diff --git a/gdb/contrib/gdb-add-index.sh b/gdb/contrib/gdb-add-index.sh
index 4db1234..d2c523f 100755
--- a/gdb/contrib/gdb-add-index.sh
+++ b/gdb/contrib/gdb-add-index.sh
@@ -2,7 +2,7 @@
# Add a .gdb_index section to a file.
-# Copyright (C) 2010-2024 Free Software Foundation, Inc.
+# Copyright (C) 2010-2025 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
@@ -22,8 +22,8 @@ GDB=${GDB:=gdb}
OBJCOPY=${OBJCOPY:=objcopy}
READELF=${READELF:=readelf}
-PKGVERSION=@PKGVERSION@
-VERSION=@VERSION@
+PKGVERSION="@PKGVERSION@"
+VERSION="@VERSION@"
myname="${0##*/}"
diff --git a/gdb/contrib/license-check-new-files.sh b/gdb/contrib/license-check-new-files.sh
new file mode 100755
index 0000000..710afa1
--- /dev/null
+++ b/gdb/contrib/license-check-new-files.sh
@@ -0,0 +1,149 @@
+#!/usr/bin/env python3
+
+# Copyright (C) 2025 Free Software Foundation, Inc.
+#
+# This file is part of GDB.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it 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.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# This program requires the python modules GitPython (git) and scancode-toolkit.
+# It builds a list of all the newly added files to the repository and scans
+# each file for a license, printing it to the terminal. If "--skip" is used,
+# it will only output non-"common" licenses, e.g., omitting "GPL-3.0-or-later".
+# This makes it a little bit easier to detect any possible new licenses.
+#
+# Example:
+# bash$ cd /path/to/binutils-gdb/gdb
+# bash$ ./contrib/license-check-new-files.sh -s gdb-15-branchpoint gdb-16-branchpoint
+# Scanning directories gdb*/...
+# gdb/contrib/common-misspellings.txt: no longer in repo?
+# gdb/contrib/spellcheck.sh: no longer in repo?
+# gdbsupport/unordered_dense.h: MIT
+
+import os
+import sys
+import argparse
+from pathlib import PurePath
+from git import Repo
+from scancode import api
+
+# A list of "common" licenses. If "--skip" is used, any file
+# with a license in this list will be omitted from the output.
+COMMON_LICENSES = ["GPL-2.0-or-later", "GPL-3.0-or-later"]
+
+# Default list of directories to scan. Default scans are limited to
+# gdb-specific git directories because much of the rest of binutils-gdb
+# is actually owned by other projects/packages.
+DEFAULT_SCAN_DIRS = "gdb*"
+
+
+# Get the commit object associated with the string commit CSTR
+# from the git repository REPO.
+#
+# Returns the object or prints an error and exits.
+def get_commit(repo, cstr):
+ try:
+ return repo.commit(cstr)
+ except:
+ print(f'unknown commit "{cstr}"')
+ sys.exit(2)
+
+
+# Uses scancode-toolkit package to scan FILE's licenses.
+# Returns the full license dict from scancode on success or
+# propagates any exceptions.
+def get_licenses_for_file(file):
+ return api.get_licenses(file)
+
+
+# Helper function to print FILE to the terminal if skipping
+# common licenses.
+def skip_print_file(skip, file):
+ if skip:
+ print(f"{file}: ", end="")
+
+
+def main(argv):
+ parser = argparse.ArgumentParser()
+ parser.add_argument("from_commit")
+ parser.add_argument("to_commit")
+ parser.add_argument(
+ "-s", "--skip", help="skip common licenses in output", action="store_true"
+ )
+ parser.add_argument(
+ "-p",
+ "--paths",
+ help=f'paths to scan (default is "{DEFAULT_SCAN_DIRS}")',
+ type=str,
+ default=DEFAULT_SCAN_DIRS,
+ )
+ args = parser.parse_args()
+
+ # Commit boundaries to search for new files
+ from_commit = args.from_commit
+ to_commit = args.to_commit
+
+ # Get the list of new files from git. Try the current directory,
+ # looping up to the root attempting to find a valid git repository.
+ path = PurePath(os.getcwd())
+ paths = list(path.parents)
+ paths.insert(0, path)
+ for dir in paths:
+ try:
+ repo = Repo(dir)
+ break
+ except:
+ pass
+
+ if dir == path.parents[-1]:
+ print(f'not a git repository (or any parent up to mount point "{dir}")')
+ sys.exit(2)
+
+ # Get from/to commits
+ fc = get_commit(repo, from_commit)
+ tc = get_commit(repo, to_commit)
+
+ # Loop over new files
+ paths = [str(dir) for dir in args.paths.split(",")]
+ print(f'Scanning directories {",".join(f"{s}/" for s in paths)}...')
+ for file in fc.diff(tc, paths=paths).iter_change_type("A"):
+ filename = file.a_path
+ if not args.skip:
+ print(f"checking licenses for {filename}... ", end="", flush=True)
+ try:
+ f = dir.joinpath(dir, filename).as_posix()
+ lic = get_licenses_for_file(f)
+ if len(lic["license_clues"]) > 1:
+ print("multiple licenses detected")
+ elif (
+ not args.skip
+ or lic["detected_license_expression_spdx"] not in COMMON_LICENSES
+ ):
+ skip_print_file(args.skip, filename)
+ print(f"{lic['detected_license_expression_spdx']}")
+ except OSError:
+ # Likely hit a file that was added to the repo and subsequently removed.
+ skip_print_file(args.skip, filename)
+ print("no longer in repo?")
+ except KeyboardInterrupt:
+ print("interrupted")
+ break
+ except Exception as e:
+ # If scanning fails, there is little we can do but print an error.
+ skip_print_file(args.skip, filename)
+ print(e)
+
+
+if __name__ == "__main__":
+ main(sys.argv)
diff --git a/gdb/contrib/setup.cfg b/gdb/contrib/setup.cfg
new file mode 100644
index 0000000..5541a01
--- /dev/null
+++ b/gdb/contrib/setup.cfg
@@ -0,0 +1,19 @@
+[codespell]
+
+# Skip ChangeLogs and generated files.
+skip = */ChangeLog*,*/configure,gdbsupport/Makefile.in,*.dat,*.eps,gdb/features/*.c,gdb/ada-casefold.h,gdb/copying.c,gdb/gdbarch-gen.h,gdb/gdbarch-gen.c,gdb/target-delegates-gen.c
+
+ignore-words = gdb/contrib/codespell-ignore-words.txt
+dictionary = gdb/contrib/codespell-dictionary.txt,-
+
+# Ignore all URLs.
+uri-ignore-words-list = *
+
+# This codespell issue (
+# https://github.com/codespell-project/codespell/issues/3381 ) reports the
+# need to have support for ignoring blocks of code.
+# A suggestion there is to use ignore-multiline-regex, which does work, but
+# has a bug: using -w drops all newlines in the updated files (
+# https://github.com/codespell-project/codespell/issues/3642 ).
+# Consequently, disabled. To be enabled when the bug is fixed.
+#ignore-multiline-regex = codespell:ignore-begin.*codespell:ignore-end
diff --git a/gdb/contrib/spellcheck.sh b/gdb/contrib/spellcheck.sh
deleted file mode 100755
index 420891f..0000000
--- a/gdb/contrib/spellcheck.sh
+++ /dev/null
@@ -1,536 +0,0 @@
-#!/bin/bash
-
-# Copyright (C) 2024 Free Software Foundation, Inc.
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it 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.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-# Script to auto-correct common spelling mistakes.
-#
-# Example usage:
-# $ ./gdb/contrib/spellcheck.sh gdb*
-
-scriptdir=$(cd "$(dirname "$0")" || exit; pwd -P)
-this_script=$scriptdir/$(basename "$0")
-
-url=https://en.wikipedia.org/wiki/Wikipedia:Lists_of_common_misspellings/For_machines
-cache_dir=$scriptdir/../../.git
-cache_file=wikipedia-common-misspellings.txt
-dictionary=$cache_dir/$cache_file
-local_dictionary=$scriptdir/common-misspellings.txt
-cache_file2=spell-check.pat1
-
-bash_version_at_least ()
-{
- local major
- major="$1"
- local minor
- minor="$2"
-
- if [ "$bash_major" = "" ]; then
- bash_major=$(echo "$BASH_VERSION" | awk -F '.' '{print $1}')
- bash_minor=$(echo "$BASH_VERSION" | awk -F '.' '{print $2}')
- fi
-
- if [ "$bash_major" -lt "$major" ]; then
- # Major version less then required, return false.
- return 1
- fi
-
- if [ "$bash_major" -gt "$major" ]; then
- # Major version more then required, return true.
- return 0
- fi
-
- # Check minor version.
- [ "$bash_minor" -ge "$minor" ]
-}
-
-# Separators: space, slash, tab, colon, comma.
-declare -a grep_separators
-grep_separators=(
- " "
- "/"
- " "
- ":"
- ","
- "\""
-)
-declare -a sed_separators
-sed_separators=(
- " "
- "/"
- "\t"
- ":"
- ","
- "\""
-)
-
-# Pre: start of line, left parenthesis.
-declare -a grep_pre
-grep_pre=(
- "^"
- "\("
-)
-declare -a sed_pre
-sed_pre=(
- "^"
- "("
-)
-
-# Post: dot, right parenthesis, end of line.
-declare -a grep_post
-grep_post=(
- "\."
- "\)"
- "$"
-)
-declare -a sed_post
-sed_post=(
- "\."
- ")"
- "$"
-)
-
-join ()
-{
- local or
- or="$1"
- shift
-
- local res
- res=""
-
- local first
- first=true
-
- for item in "$@"; do
- if $first; then
- first=false
- res="$item"
- else
- res="$res$or$item"
- fi
- done
-
- echo "$res"
-}
-
-grep_or="|"
-sed_or="\|"
-
-grep_join ()
-{
- local res
- res=$(join $grep_or "$@")
- echo "($res)"
-}
-
-sed_join ()
-{
- local res
- res=$(join $sed_or "$@")
- echo "\($res\)"
-}
-
-usage ()
-{
- echo "usage: $(basename "$0") [--check] <file|dir>+"
- echo " $(basename "$0") --print-dictionary"
-}
-
-make_absolute ()
-{
- local arg
- arg="$1"
-
- case "$arg" in
- /*)
- ;;
- *)
- arg=$(pwd -P)/"$arg"
- ;;
- esac
-
- echo "$arg"
-}
-
-parse_args ()
-{
- local files
- files=$(mktemp)
- trap 'rm -f "$files"' EXIT
-
- if [ $# -eq 1 ] && [ "$1" = "--print-dictionary" ]; then
- print_dictionary=true
- return
- fi
-
- while true; do
- case " $1 " in
- " --check ")
- check=true
- shift
- ;;
- *)
- break
- ;;
- esac
- done
-
- if [ $# -eq -0 ]; then
- usage
- exit 1
- fi
-
- local arg
- for arg in "$@"; do
- if [ -f "$arg" ]; then
- arg=$(make_absolute "$arg")
- readlink -e "$arg" \
- >> "$files"
- elif [ -d "$arg" ]; then
- arg=$(make_absolute "$arg")
- local f
- find "$arg" -type f -exec readlink -e {} \; \
- >> "$files"
- else
- echo "Not a file or directory: $arg"
- exit 1
- fi
- done
-
- mapfile -t unique_files \
- < <(sort -u "$files" \
- | grep -v ChangeLog)
-
- rm -f "$files"
- trap "" EXIT
-}
-
-get_dictionary ()
-{
- if [ -f "$dictionary" ]; then
- return
- fi
-
- local webpage
- webpage=$(mktemp)
- trap 'rm -f "$webpage"' EXIT
-
- # Download web page containing table.
- wget $url -O "$webpage"
-
- # Extract table from web page.
- awk '/<pre>/,/<\/pre>/' "$webpage" \
- | sed 's/<pre>//;s/<\/pre>//' \
- | grep -E -v "^$" \
- > "$dictionary"
-
- rm -f "$webpage"
- trap "" EXIT
-}
-
-output_local_dictionary ()
-{
- # Filter out comments and empty lines.
- grep -E -v \
- "^#|^$" \
- "$local_dictionary"
-}
-
-output_dictionaries ()
-{
- (
- output_local_dictionary
- cat "$dictionary"
- ) | grep -E -v "[A-Z]"
-}
-
-parse_dictionary ()
-{
- # Parse dictionary.
- mapfile -t words \
- < <(awk -F '->' '{print $1}' <(output_dictionaries))
- mapfile -t replacements \
- < <(awk -F '->' '{print $2}' <(output_dictionaries))
-
- local words_done
- declare -A words_done
- local i word replacement
- i=0
- for word in "${words[@]}"; do
- replacement=${replacements[i]}
-
- # Skip words that are already handled. This ensures that the local
- # dictionary overrides the wiki dictionary.
- if [ "${words_done[$word]}" == 1 ]; then
- words[i]=""
- replacements[i]=""
- i=$((i + 1))
- continue
- fi
- words_done[$word]=1
-
- # Skip identity rules.
- if [ "$word" = "$replacement" ]; then
- words[i]=""
- replacements[i]=""
- fi
-
- i=$((i + 1))
- done
-}
-
-print_dictionary ()
-{
- local i word replacement
- i=0
- for word in "${words[@]}"; do
- replacement=${replacements[i]}
- i=$((i + 1))
-
- if [ "$word" == "" ]; then
- continue
- fi
-
- echo "$word -> $replacement"
- done
-}
-
-find_files_matching_words ()
-{
- local cache_id
- cache_id=$(cat "$local_dictionary" "$dictionary" "$this_script" \
- | md5sum \
- | awk '{print $1}')
-
- local patfile
- patfile="$cache_dir/$cache_file2".$cache_id
-
- local pat
- if [ -f "$patfile" ]; then
- pat=$(cat "$patfile")
- else
- rm -f "$cache_dir/$cache_file2".*
-
- declare -a re_words
- mapfile -t re_words \
- < <(for f in "${words[@]}"; do
- if [ "$f" = "" ]; then
- continue
- fi
- echo "$f"
- done \
- | sed "s/^\(.\)/[\u\1\1]/")
-
- pat=$(grep_join "${re_words[@]}")
-
- local before after
- before=$(grep_join \
- "${grep_pre[@]}" \
- "${grep_separators[@]}")
- after=$(grep_join \
- "${grep_separators[@]}" \
- "${grep_post[@]}")
-
- pat="$before$pat$after"
-
- echo "$pat" \
- > "$patfile"
- fi
-
- grep -E \
- -l \
- "$pat" \
- "$@"
-}
-
-find_files_matching_word ()
-{
- local pat
- pat="$1"
- shift
-
- local before after
- before=$(grep_join \
- "${grep_pre[@]}" \
- "${grep_separators[@]}")
- after=$(grep_join \
- "${grep_separators[@]}" \
- "${grep_post[@]}")
-
- if bash_version_at_least 5 1; then
- patc=${pat@u}
- else
- # shellcheck disable=SC2001
- patc=$(echo "$pat" | sed 's/^\(.\)/\u\1/')
- fi
- pat="($patc|$pat)"
-
- pat="$before$pat$after"
-
- grep -E \
- -l \
- "$pat" \
- "$@"
-}
-
-replace_word_in_file ()
-{
- local word
- word="$1"
-
- local replacement
- replacement="$2"
-
- local file
- file="$3"
-
- local before after
- before=$(sed_join \
- "${sed_pre[@]}" \
- "${sed_separators[@]}")
- after=$(sed_join \
- "${sed_separators[@]}" \
- "${sed_post[@]}")
-
- if bash_version_at_least 5 1; then
- wordc=${word@u}
- replacementc=${replacement@u}
- else
- # shellcheck disable=SC2001
- wordc=$(echo "$word" | sed 's/^\(.\)/\u\1/')
- # shellcheck disable=SC2001
- replacementc=$(echo "$replacement" | sed 's/^\(.\)/\u\1/')
- fi
-
- local repl1
- local repl2
- repl1="s%$before$word$after%\1$replacement\2%g"
- repl2="s%$before$wordc$after%\1$replacementc\2%g"
-
- sed -i \
- "$repl1;$repl2" \
- "$file"
-}
-
-replace_word_in_files ()
-{
- local word
- word="$1"
-
- local replacement
- replacement="$2"
-
- shift 2
-
- local id
- id="$word -> $replacement"
-
- # Reduce set of files for sed to operate on.
- local files_matching_word
- declare -a files_matching_word
- mapfile -t files_matching_word \
- < <(find_files_matching_word "$word" "$@")
-
- if [ ${#files_matching_word[@]} -eq 0 ]; then
- return
- fi
-
- if echo "$replacement"| grep -q ","; then
- echo "TODO: $id"
- return
- fi
-
- declare -A md5sums
-
- local changed f before after
- changed=false
- for f in "${files_matching_word[@]}"; do
- if [ "${md5sums[$f]}" = "" ]; then
- md5sums[$f]=$(md5sum "$f")
- fi
-
- before="${md5sums[$f]}"
-
- replace_word_in_file \
- "$word" \
- "$replacement" \
- "$f"
-
- after=$(md5sum "$f")
-
- if [ "$after" != "$before" ]; then
- md5sums[$f]="$after"
- changed=true
- fi
- done
-
- if $changed; then
- echo "$id"
- fi
-
- find_files_matching_word "$word" "${files_matching_word[@]}" \
- | awk "{ printf \"TODO: $id: replacement failed: %s\n\", \$0}"
-}
-
-main ()
-{
- declare -a unique_files
- check=false
- print_dictionary=false
- parse_args "$@"
-
- get_dictionary
-
- declare -a words
- declare -a replacements
- parse_dictionary
-
- if $print_dictionary; then
- print_dictionary
- exit 0
- fi
-
- # Reduce set of files for sed to operate on.
- local files_matching_words
- declare -a files_matching_words
- mapfile -t files_matching_words \
- < <(find_files_matching_words "${unique_files[@]}")
-
- if [ ${#files_matching_words[@]} -eq 0 ]; then
- return
- fi
-
- if $check; then
- exit 1
- fi
-
- local i word replacement
- i=0
- for word in "${words[@]}"; do
- replacement=${replacements[i]}
- i=$((i + 1))
-
- if [ "$word" = "" ]; then
- continue
- fi
-
- replace_word_in_files \
- "$word" \
- "$replacement" \
- "${files_matching_words[@]}"
- done
-}
-
-main "$@"
diff --git a/gdb/contrib/test_pubnames_and_indexes.py b/gdb/contrib/test_pubnames_and_indexes.py
index a3f5c92..7a3dec6 100644
--- a/gdb/contrib/test_pubnames_and_indexes.py
+++ b/gdb/contrib/test_pubnames_and_indexes.py
@@ -1,6 +1,6 @@
#! /usr/bin/env python3
-# Copyright (C) 2011-2024 Free Software Foundation, Inc.
+# Copyright (C) 2011-2025 Free Software Foundation, Inc.
#
# This file is part of GDB.
#
diff --git a/gdb/contrib/words.sh b/gdb/contrib/words.sh
index 90b1bd9..a4bb2c7 100755
--- a/gdb/contrib/words.sh
+++ b/gdb/contrib/words.sh
@@ -1,6 +1,6 @@
#!/bin/sh
-# Copyright (C) 2019-2024 Free Software Foundation, Inc.
+# Copyright (C) 2019-2025 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or