* this makes dcgen work when building corutils on a system without perl * I also added comments to help the next person who looks at this file
* there is a minor difference in the output between the original dcgen and this version, lines that start with a [:blank:] don't have that blank in the dircolors header. In practice this means that the line starting with '# numerical' doesn't have one space at the start, this obviously won't negatively affect dircolors. * in this situation, the shellcheck warnings SC1003 and SC1143 are false positives, remove them to see for yourself. :) Signed-off-by: Christopher Bayliss <cjb...@icloud.com> --- src/dcgen | 61 +++++++++++++++++++++------------------------------- src/local.mk | 3 +-- 2 files changed, 25 insertions(+), 39 deletions(-) diff --git a/src/dcgen b/src/dcgen index 957427370..3e9db50ee 100755 --- a/src/dcgen +++ b/src/dcgen @@ -1,4 +1,4 @@ -#!/usr/bin/perl -w +#!/bin/sh # dcgen -- convert dircolors.hin to dircolors.h. # Copyright (C) 1996-2024 Free Software Foundation, Inc. @@ -16,40 +16,27 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see <https://www.gnu.org/licenses/>. -# written by Jim Meyering +# written by Christopher Bayliss +# based on the original perl script by Jim Meyering -require 5.002; -use strict; -(my $ME = $0) =~ s|.*/||; - -# A global destructor to close standard output with error checking. -sub END -{ - defined fileno STDOUT - or return; - close STDOUT - and return; - warn "$ME: closing standard output: $!\n"; - $? ||= 1; -} - -my @line; -while (<>) - { - chomp; - s/[[:blank:]]+/ /g; - $_ - and push @line, $_; - } - -my $indent = ' '; - -print "static char const G_line[] =\n{\n"; -foreach (@line) - { - s/./'$&',/g; - s/'\\'/'\\\\'/g; - s/'''/'\\''/g; - print "$indent${_}0,\n"; - } -print "};\n"; +echo "static char const G_line[] =" +echo "{" +# shellcheck disable=SC1003,SC1143 +while read -r line; + do echo "$line" |\ + # match multiple blanks and compact them down to one space + sed 's/[[:blank:]]\+/ /g' |\ + # match each character and wrap it like: '<char>', + sed "s/./'&',/g" |\ + # delete empty lines + sed '/^$/d' |\ + # escape backslashes like: \\ + sed 's/''\\''/''\\\\''/g' |\ + # escape single quotes inside single quotes like so: '\'' + sed "s/'''/'\\\''/g" |\ + # indent the lines with two spaces + sed 's/^/ /g' |\ + # add a zero terminator for each line + sed 's/$/0,/' +done < "$1" +echo "};" diff --git a/src/local.mk b/src/local.mk index 8133925ac..e78ee0389 100644 --- a/src/local.mk +++ b/src/local.mk @@ -525,8 +525,7 @@ BUILT_SOURCES += src/dircolors.h src/dircolors.h: src/dcgen src/dircolors.hin $(AM_V_GEN)rm -f $@ $@-t $(AM_V_at)${MKDIR_P} src - $(AM_V_at)$(PERL) -w -- $(srcdir)/src/dcgen \ - $(srcdir)/src/dircolors.hin > $@-t + $(AM_V_at)$(srcdir)/src/dcgen $(srcdir)/src/dircolors.hin > $@-t $(AM_V_at)chmod a-w $@-t $(AM_V_at)mv $@-t $@ -- 2.44.1