From acd49f242c867583856973fd8644a45e53f56489 Mon Sep 17 00:00:00 2001 From: Kevin McCarthy Date: Wed, 8 Jan 2020 19:09:33 -0800 Subject: [PATCH] Convert hcachever.sh.in to hcachever.pl. Use Digest::MD5 to remove build-time dependency on mutt_md5, for cross-compilation support. Signed-off-by: Fabrice Fontaine [Retrieved (and slightly updated to remove .gitignore) from: https://gitlab.com/muttmua/mutt/commit/acd49f242c867583856973fd8644a45e53f56489] --- .gitignore | 2 - Makefile.am | 14 +++--- configure.ac | 7 +-- hcachever.pl | 112 ++++++++++++++++++++++++++++++++++++++++++++++++ hcachever.sh.in | 89 -------------------------------------- 5 files changed, 118 insertions(+), 106 deletions(-) create mode 100644 hcachever.pl delete mode 100755 hcachever.sh.in diff --git a/Makefile.am b/Makefile.am index cede1adb..e46f6544 100644 --- a/Makefile.am +++ b/Makefile.am @@ -3,7 +3,7 @@ include $(top_srcdir)/flymake.am AUTOMAKE_OPTIONS = 1.6 foreign -EXTRA_PROGRAMS = mutt_dotlock mutt_pgpring pgpewrap mutt_md5 +EXTRA_PROGRAMS = mutt_dotlock mutt_pgpring pgpewrap if BUILD_IMAP IMAP_SUBDIR = imap @@ -80,7 +80,7 @@ EXTRA_DIST = COPYRIGHT GPL OPS OPS.PGP OPS.CRYPT OPS.SMIME TODO UPDATING \ README.SSL smime.h group.h mutt_zstrm.h \ muttbug pgppacket.h depcomp ascii.h BEWARE PATCHES patchlist.sh \ ChangeLog mkchangelog.sh mkreldate.sh mutt_idna.h sidebar.h OPS.SIDEBAR \ - snprintf.c regex.c crypt-gpgme.h hcachever.sh.in \ + snprintf.c regex.c crypt-gpgme.h hcachever.pl \ txt2c.c txt2c.sh version.sh check_sec.sh EXTRA_SCRIPTS = smime_keys @@ -93,14 +93,10 @@ mutt_pgpring_SOURCES = pgppubring.c pgplib.c lib.c extlib.c sha1.c md5.c pgppack mutt_pgpring_LDADD = $(LIBOBJS) $(INTLLIBS) mutt_pgpring_DEPENDENCIES = $(LIBOBJS) $(INTLDEPS) -mutt_md5_SOURCES = md5.c -mutt_md5_CFLAGS = -DMD5UTIL -mutt_md5_LDADD = - txt2c_SOURCES = txt2c.c txt2c_LDADD = -noinst_PROGRAMS = $(MUTT_MD5) txt2c +noinst_PROGRAMS = txt2c mutt_dotlock.c: dotlock.c cp $(srcdir)/dotlock.c mutt_dotlock.c @@ -166,9 +162,9 @@ reldate.h: $(srcdir)/mkreldate.sh $(srcdir)/ChangeLog # If configured with --with-included-gettext this means that intl will # not have generated libintl.h yet, and mutt.h -> lib.h will generate # an error. -hcversion.h: $(srcdir)/mutt.h $(srcdir)/rfc822.h hcachever.sh $(MUTT_MD5) +hcversion.h: $(srcdir)/mutt.h $(srcdir)/rfc822.h config.h $(srcdir)/hcachever.pl ( echo '#include "config.h"'; echo '#undef ENABLE_NLS'; echo '#include "mutt.h"'; ) \ - | $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) - | sh ./hcachever.sh hcversion.h + | $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) - | perl $(srcdir)/hcachever.pl > hcversion.h patchlist.c: $(srcdir)/PATCHES $(srcdir)/patchlist.sh $(srcdir)/patchlist.sh < $(srcdir)/PATCHES > patchlist.c diff --git a/configure.ac b/configure.ac index 7fe55402..7906ce35 100644 --- a/configure.ac +++ b/configure.ac @@ -1283,11 +1283,6 @@ then MUTT_LIB_OBJECTS="$MUTT_LIB_OBJECTS md5.o" fi -if test x$db_found != xno ; then - MUTT_MD5="mutt_md5$EXEEXT" -fi -AC_SUBST(MUTT_MD5) - AC_SUBST(MUTTLIBS) AC_SUBST(MUTT_LIB_OBJECTS) AC_SUBST(LIBIMAP) @@ -1677,5 +1672,5 @@ fi AC_CONFIG_FILES(Makefile contrib/Makefile doc/Makefile imap/Makefile intl/Makefile m4/Makefile po/Makefile.in autocrypt/Makefile - hcachever.sh doc/instdoc.sh) + doc/instdoc.sh) AC_OUTPUT diff --git a/hcachever.pl b/hcachever.pl new file mode 100644 index 00000000..be630a82 --- /dev/null +++ b/hcachever.pl @@ -0,0 +1,112 @@ +#!/usr/bin/perl -w +# +# Copyright (C) 2020 Kevin J. McCarthy +# +# 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 2 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, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# This file is a rewrite of hcachever.sh.in in perl. +# The rewrite removes the dependency on mutt_md5, in order to +# improve cross-compilation support. + +use strict; +use warnings; +# note Digest::MD5 is standard in perl since 5.8.0 (July 18, 2002) +use Digest::MD5; + + +sub read_line() { + my $line; + + while (1) { + $line = ; + return "" if (!$line); + + chomp($line); + $line =~ s/^\s+//; + $line =~ s/\s+$//; + $line =~ s/\s{2,}//g; + + return $line if ($line ne ""); + } +} + + +sub process_struct($$) { + my ($line, $md5) = @_; + my $struct = ""; + my @body; + my $bodytxt; + my $inbody = 0; + + return if $line =~ /;$/; + if ($line =~ /{$/) { + $inbody = 1; + } + + while (($line = read_line()) ne "") { + if (!$inbody) { + return if $line =~ /;$/; + if ($line =~ /{$/) { + $inbody = 1; + } + } + + if ($line =~ /^} (.*);$/) { + $struct = $1; + last; + } + elsif ($line =~ /^}/) { + $struct = read_line(); + if ($struct ne "") { + $struct =~ s/;$//; + } + last; + } + elsif (($line !~ /^#/) && ($line !~ /^{/)) { + if ($inbody) { + push @body, $line; + } + } + } + + if ($struct =~ /^(ADDRESS|LIST|BUFFER|PARAMETER|BODY|ENVELOPE|HEADER)$/) { + $bodytxt = join(" ", @body); + print " * ${struct}: ${bodytxt}\n"; + + $md5->add(" ${struct} {${bodytxt}}"); + } +} + + +my $md5; +my $line; +my $BASEVERSION = "2"; + +$md5 = Digest::MD5->new; + +$md5->add($BASEVERSION); +print "/* base version: $BASEVERSION\n"; + +while (($line = read_line()) ne "") { + if ($line =~ /^typedef struct/) { + process_struct($line, $md5); + } +} + +$md5->add("\n"); +my $digest = substr($md5->hexdigest, 0, 8); + +print " */\n"; +print "#define HCACHEVER 0x${digest}\n"; diff --git a/hcachever.sh.in b/hcachever.sh.in deleted file mode 100755 index 730ca76b..00000000 --- a/hcachever.sh.in +++ /dev/null @@ -1,89 +0,0 @@ -#!/bin/sh - -BASEVERSION=2 - -cleanstruct () { - echo "$1" | sed -e 's/} *//' -e 's/;$//' -} - -cleanbody () { - echo "$1" | sed -e 's/{ *//' -} - -getstruct () { - STRUCT="" - BODY='' - inbody=0 - case "$1" in - *'{') inbody=1 ;; - *';') return ;; - esac - - while read line - do - if test $inbody -eq 0 - then - case "$line" in - '{'*) inbody=1 ;; - *';') return ;; - esac - fi - - case "$line" in - '} '*) - STRUCT=`cleanstruct "$line"` - break - ;; - '}') - read line - STRUCT=`cleanstruct "$line"` - break - ;; - '#'*) continue ;; - *) - if test $inbody -ne 0 - then - BODY="$BODY $line" - fi - ;; - esac - done - - case $STRUCT in - ADDRESS|LIST|BUFFER|PARAMETER|BODY|ENVELOPE|HEADER) - BODY=`cleanbody "$BODY"` - echo "$STRUCT: $BODY" - ;; - esac - return -} - -DEST="$1" -TMPD="$DEST.tmp" - -TEXT="$BASEVERSION" - -echo "/* base version: $BASEVERSION" > $TMPD -while read line -do - case "$line" in - 'typedef struct'*) - STRUCT=`getstruct "$line"` - if test -n "$STRUCT" - then - NAME=`echo $STRUCT | cut -d: -f1` - BODY=`echo $STRUCT | cut -d' ' -f2-` - echo " * $NAME:" $BODY >> $TMPD - TEXT="$TEXT $NAME {$BODY}" - fi - ;; - esac -done -echo " */" >> $TMPD - -MD5TEXT=`echo "$TEXT" | ./mutt_md5` -echo "#define HCACHEVER 0x"`echo $MD5TEXT | cut -c-8` >> $TMPD - -# TODO: validate we have all structs - -mv $TMPD $DEST -- 2.24.1