]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Maintenance: Improve stability of gperf-generated sources (#1099)
authorAlex Rousskov <rousskov@measurement-factory.com>
Tue, 2 Aug 2022 23:24:40 +0000 (23:24 +0000)
committerSquid Anubis <squid-anubis@squid-cache.org>
Thu, 4 Aug 2022 17:38:40 +0000 (17:38 +0000)
Control gperf from source-maintenance.sh: Existing Makefile rule did not
use (and should not use) primary "make" functionality -- we do not want
to automatically trigger RegisteredHeadersHash.cci regeneration based on
file timestamps alone because most users will not have (the right
version of) gperf and (the right version of) astyle available. The rule
did use Makefile variables, but that resulted in unstable gperf output
because variables like $src change depending on the developer build
environment. This change finishes the move started by commit 3d50bea.

Simplify formater.pl, making its interface similar to other formatting
tools used by source-maintenance.sh: The script now sends its results to
stdout. Renamed the script to reduce surprises, fix the old naming typo,
and to improve consistency with format-makefile-am.pl. The script needs
more polishing; we avoided otherwise unmodified lines except removing an
unused buggy $pfx line that triggered warnings.

Move "astyle did not corrupt code" checks from source-maintenance.sh to
formater.pl, where they belong and are easier to implement. This move
simplifies reuse of the Perl script inside source-maintenance.sh. It
also removes dependency on md5sum/etc. $CppFormatter now contains the
exact command to (re)use.

Fix "Generated by.." marker. Its old location in .cci was hard to
notice. The marker was also present in hand-edited .gperf file!

Report RegisteredHeadersHash.cci changes.

Also stopped stripping "register" from gperf output. Gperf v3.1 stopped
adding "register" to C++ output. We (should) use that gperf version.
Removing "register" complicated gperf error handling because a pipe to
sed ate gperf exit code.

scripts/format-cpp.pl [moved from scripts/formater.pl with 59% similarity]
scripts/source-maintenance.sh
src/http/Makefile.am
src/http/RegisteredHeadersHash.cci
src/http/RegisteredHeadersHash.gperf

similarity index 59%
rename from scripts/formater.pl
rename to scripts/format-cpp.pl
index 7824c8e66f9d251ef271afb1964b45846b0a4bad..d32fa7cc2c64a0e58c268082cc8fe75d55c1ff89 100755 (executable)
@@ -6,27 +6,9 @@
 ## contributions from numerous individuals and organizations.
 ## Please see the COPYING and CONTRIBUTORS files for details.
 ##
-#
-# Author: Tsantilas Christos
-# email:  christos@chtsanti.net
-#
-# Distributed 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.
-#
-# 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
-# Library 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-#
-# See COPYING or http://www.gnu.org/licenses/gpl.html for details.
-#
 
 use strict;
+use warnings;
 use IPC::Open2;
 use Getopt::Long;
 
@@ -42,40 +24,33 @@ GetOptions(
 
 $ASTYLE_BIN=$ASTYLE_BIN." ".$ASTYLE_ARGS;
 
-my $INDENT = "";
-
-my $out = shift @ARGV;
-while($out){
-
-    if( $out !~ /\.cc$|\.cci$|\.h$|\.c$/) {
-        print "Unknown suffix for file $out, ignoring....\n";
-        $out = shift @ARGV;
-        next;
-    }
-
-    die("Cannot format a non-existent file: $out\n") unless -e $out;
+if (@ARGV <= 0) {
+    usage($0);
+    die("ERROR: Missing required filename parameter.\n");
+} elsif (@ARGV == 1) {
+    &main(shift @ARGV);
+    exit 0;
+} else {
+    usage($0);
+    die("ERROR: Too many filename parameters.\n");
+}
 
-    my $backup = "$out.astylebak";
-    &moveAway($backup);
-    &safeRename($out, $backup);
-    my $in = $backup;
+sub main
+{
+    my ($out) = @_;
 
     local (*FROM_ASTYLE, *TO_ASTYLE);
     my $pid_style=open2(\*FROM_ASTYLE, \*TO_ASTYLE, $ASTYLE_BIN);
-
-    if(!$pid_style){
-        print "An error while running $ASTYLE_BIN\n";
-        exit -1;
-    }
+    die() unless $pid_style; # paranoid: open2() does not return on failures
 
     my $pid;
     if($pid=fork()){
         #do parent staf
         close(FROM_ASTYLE);
 
+        my $in = $out;
         if (!open(IN, "<$in")) {
-            print "Can not open input file: $in\n";
-            exit -1;
+            die("ERROR: Cannot open input file: $in\n");
         }
         my $line = '';
         while (<IN>) {
@@ -91,63 +66,71 @@ while($out){
         }
         close(TO_ASTYLE);
         waitpid($pid,0);
+        waitpid($pid_style, 0);
     }
     else{
         # child staf
         close(TO_ASTYLE);
 
-        if(!open(OUT,">$out")){
-            print "Can't open output file: $out\n";
-            exit -1;
-        }
+        my $formattedCode = '';
         my($line)='';
         while(<FROM_ASTYLE>){
             $line = $line.$_;
             if(output_filter(\$line)==0){
                 next;
             }
-            print OUT $line;
+            $formattedCode .= $line;
             $line = '';
         }
         if($line){
-            print OUT $line;
+            $formattedCode .= $line;
         }
-        close(OUT);
-        exit 0;
-    }
 
-    $out = shift @ARGV;
-}
+        my $originalCode = &slurpFile($out);
 
-# renames while ensuring the destination is not clobbered
-sub safeRename
-{
-    my ($from, $to) = @_;
-    die() if -e $to;
-    rename($from, $to) or die("Failed to rename $from to $to: $!, stopped");
-}
+        if (!length $formattedCode) {
+            warn("ERROR: Running astyle produced no output while formatting $out\n".
+                 "    astyle command: $ASTYLE_BIN\n");
+            print $originalCode;
+            return;
+        }
 
-# "numbered backup" filename at a given backup depth
-# no ".n" suffix for the freshest/latest (i.e. zero depth) backup
-sub backupFilename
-{
-    my ($basename, $depth) = @_;
-    return $basename unless $depth;
-    return $basename . '.' . $depth;
+        my $originalEssence = &sourceCodeEssense($originalCode);
+        my $formattedEssence = &sourceCodeEssense($formattedCode);
+        if ($originalEssence eq $formattedEssence) {
+            print $formattedCode;
+            return;
+        }
+
+        warn("ERROR: Unexpected source code changes while formatting $out\n");
+        eval { &createFile($formattedCode, "$out.astylebad") };
+        warn("WARNING: Cannot keep a copy of malformed $out: $@\n") if $@;
+        print $originalCode;
+    }
 }
 
-# Renames the given backup file, moving it out of the way for the new backup.
-# Works recursively to ensure that no backup file is overwritten.
-sub moveAway
+# strips all space characters from the given input
+sub sourceCodeEssense
 {
-    my ($basename, $depth) = (@_, 0);
+    my ($sourceCode) = @_;
+    $sourceCode =~ s/\s+//g;
+    return $sourceCode;
+}
 
-    my $filename = &backupFilename($basename, $depth);
-    return unless -e $filename; # nothing to move away
+# reads and returns the entire file contents
+sub slurpFile {
+    my ($fname) = @_;
+    local $/ = undef;
+    open(my $input, "<", $fname) or die("Cannot open $fname for reading: $!\n");
+    return <$input>;
+}
 
-    my $spot = &backupFilename($basename, $depth + 1);
-    &moveAway($basename, $depth + 1); # free the spot if needed
-    &safeRename($filename, $spot); # move into the free spot
+# (re)creates a file with the given name, filling it with the given content
+sub createFile {
+    my ($content, $fname) = @_;
+    open(my $output, ">", $fname) or die("Cannot create $fname: $!\n");
+    print($output $content) or die("Cannot write to $fname: $!\n");
+    close($output) or die("Cannot finalize $fname: $!\n");
 }
 
 sub input_filter{
@@ -178,7 +161,6 @@ sub input_filter{
         elsif($$line =~ /\s*unsigned\s+([^:]*):\s*(\w+)\s*\;(.*)/s){
             # print ">>>>> ".$$line."    ($1)\n";
             my ($name,$val,$extra)=($1,$2,$3);
-            my $prx =~ s/\s*$//g;
             $$line= "unsigned ".$name."__FORASTYLE__".$val.";".$extra;
             # print "----->".$$line."\n";
         }
@@ -229,7 +211,7 @@ sub output_filter{
 sub usage{
     my($name)=@_;
     print "Usage:\n";
-    print "   $name [options] file1 file2 file3 ....\n";
+    print "   $name [options] <filename-to-format>\n";
     print "\n";
     print "Options:\n";
     print "    --help              This usage text.\n";
index ea35b4fc82ba4a42e485d8deaee4cbfd1aee3b69..1369ca5b248eaed2bc5d46d877c70a3eb4e33423 100755 (executable)
 # on Squid
 #
 
-## Source Code Format Enforcement
-#
-# A checker to recursively reformat all source files: .h .c .cc .cci
-# using a custom astyle formatter and to use MD5 to validate that
-# the formatter has not altered the code syntax.
-#
-# If code alteration takes place the process is halted for manual intervention.
-#
-
 # whether to continue execution after a failure
 # TODO: Expand the subset of failures covered by this feature; see run_().
 KeepGoing="no"
@@ -111,14 +102,6 @@ fi
 made="generated" # a hack: prevents $GeneratedByMe searches matching this file
 GeneratedByMe="This file is $made by scripts/source-maintenance.sh."
 
-# On squid-cache.org we have to use the python scripted md5sum
-HOST=`hostname`
-if test "$HOST" = "squid-cache.org" ; then
-       MD5="md5"
-else
-       MD5="md5sum"
-fi
-
 ${ASTYLE} --version >/dev/null 2>/dev/null
 result=$?
 if test $result -gt 0 ; then
@@ -138,6 +121,10 @@ if test "${ASVER}" != "${TargetAstyleVersion}" ; then
 else
        echo "Found astyle ${ASVER}. Formatting..."
 fi
+CppFormatter=''
+if test "${ASVER}"; then
+    CppFormatter="./scripts/format-cpp.pl --with-astyle ${ASTYLE}"
+fi
 
 if test $CheckAndUpdateCopyright = yes
 then
@@ -343,6 +330,11 @@ for FILENAME in `git ls-files`; do
     # skip subdirectories, git ls-files is recursive
     test -d $FILENAME && continue
 
+    # generated files are formatted during their generation
+    if grep -q -F "$GeneratedByMe" ${FILENAME}; then
+        continue
+    fi
+
     case ${FILENAME} in
 
     *.h|*.c|*.cc|*.cci)
@@ -351,21 +343,12 @@ for FILENAME in `git ls-files`; do
        # Code Style formatting maintenance
        #
        applyPluginsTo ${FILENAME} scripts/maintenance/ || return
-       if test "${ASVER}"; then
-               ./scripts/formater.pl --with-astyle ${ASTYLE} ${FILENAME}
-               if test -e $FILENAME -a -e "$FILENAME.astylebak"; then
-                       md51=`cat  $FILENAME| tr -d "\n \t\r" | $MD5`;
-                       md52=`cat  $FILENAME.astylebak| tr -d "\n \t\r" | $MD5`;
-
-                       if test "$md51" != "$md52"; then
-                               echo "ERROR: File $FILENAME not formatting well";
-                               mv $FILENAME $FILENAME.astylebad
-                               mv $FILENAME.astylebak $FILENAME
-                               git checkout -- ${FILENAME}
-                       else
-                               rm -f $FILENAME.astylebak
-                       fi
-               fi
+       if test "$CppFormatter"; then
+               if $CppFormatter $FILENAME > $FILENAME.new; then
+                       updateIfChanged $FILENAME $FILENAME.new 'by astyle'
+               else
+                       rm $FILENAME.new
+               fi
        fi
 
        #
@@ -444,10 +427,7 @@ for FILENAME in `git ls-files`; do
        ;;
 
     *.am)
-        # generated automake files are formatted during their generation
-        if ! grep -q -F "$GeneratedByMe" ${FILENAME}; then
-            applyPluginsTo ${FILENAME} scripts/format-makefile-am.pl || return
-        fi
+        applyPluginsTo ${FILENAME} scripts/format-makefile-am.pl || return
         ;;
 
     ChangeLog|CREDITS|CONTRIBUTORS|COPYING|*.png|*.po|*.pot|rfcs/|*.txt|test-suite/squidconf/empty|.bzrignore)
@@ -532,8 +512,41 @@ generateAmFile doc/manuals/language.am LANGUAGE_FILES "doc/manuals/" "*.po"
 # Build STUB framework include from current stub_* available
 generateAmFile src/tests/Stub.am STUB_SOURCE "src/" "tests/stub_*.cc"
 
-# Build the GPERF generated content
-make -C src/http gperf-files
+generateRawGperfFile ()
+{
+    gperfFile="$1"
+
+    echo "/* $GeneratedByMe */"
+    echo
+
+    (cd `dirname $gperfFile` && gperf -m 100000 `basename $gperfFile`)
+}
+
+generateGperfFile ()
+{
+    gperfFile="$1"
+    cciFile=`echo $gperfFile | sed 's/[.]gperf$/.cci/'`
+
+    if test $gperfFile -ot $cciFile; then
+        return 0;
+    fi
+
+    generateRawGperfFile $gperfFile > $cciFile.unformatted || return
+
+    if test "$CppFormatter"; then
+        # generateAmFile() explains why we format immediately/here
+        $CppFormatter $cciFile.unformatted > $cciFile.new || return
+        rm $cciFile.unformatted
+    else
+        echo "ERROR: Source code formatting disabled, but regenerated $cciFile needs formatting"
+        mv $cciFile.unformatted $cciFile.new || return
+    fi
+
+    # generateAmFile() explains why we only check/report cumulative changes
+    updateIfChanged $cciFile $cciFile.new 'by generateGperfFile()'
+}
+
+run_ generateGperfFile src/http/RegisteredHeadersHash.gperf || exit 1
 
 run_ checkMakeNamedErrorDetails || exit 1
 
index 081dbd58c72db3168cb96e22e2cc0a112e2a4c28..2ae8e6399a6be9ea786354a92cee8a322d3211d8 100644 (file)
@@ -43,9 +43,4 @@ MethodType.cc: MethodType.h $(top_srcdir)/src/mk-string-arrays.awk
 
 CLEANFILES += MethodType.cc
 
-gperf-files: RegisteredHeadersHash.gperf
-       if test $(srcdir)/RegisteredHeadersHash.gperf -nt $(srcdir)/RegisteredHeadersHash.cci; then gperf -m 100000 $(srcdir)/RegisteredHeadersHash.gperf | sed 's/register //g' > $(srcdir)/RegisteredHeadersHash.cci; fi
-
 EXTRA_DIST = RegisteredHeadersHash.gperf
-
-.PHONY: gperf-files
index cbbf2fe50a6e95dbfebcc53701a181a4e35c1d0a..233c4f6d2feedbb2d70f4f3e05ba9e1f6eccd1c5 100644 (file)
@@ -1,3 +1,5 @@
+/* This file is generated by scripts/source-maintenance.sh. */
+
 /* C++ code produced by gperf version 3.1 */
 /* Command-line: gperf -m 100000 RegisteredHeadersHash.gperf  */
 /* Computed positions: -k'3,9,$' */
@@ -31,8 +33,6 @@
 
 #line 1 "RegisteredHeadersHash.gperf"
 
-/* AUTO GENERATED FROM RegisteredHeadersHash.gperf. DO NOT EDIT */
-
 /*
  * Copyright (C) 1996-2022 The Squid Software Foundation and contributors
  *
@@ -40,7 +40,7 @@
  * contributions from numerous individuals and organizations.
  * Please see the COPYING and CONTRIBUTORS files for details.
  */
-#line 24 "RegisteredHeadersHash.gperf"
+#line 22 "RegisteredHeadersHash.gperf"
 class HeaderTableRecord;
     enum
 {
@@ -176,184 +176,184 @@ static const class HeaderTableRecord HttpHeaderDefinitionsTable[] =
 {
     {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
     {""}, {""}, {""},
-#line 87 "RegisteredHeadersHash.gperf"
+#line 85 "RegisteredHeadersHash.gperf"
     {"TE", Http::HdrType::TE, Http::HdrFieldType::ftStr, HdrKind::RequestHeader|HdrKind::HopByHopHeader},
     {""}, {""}, {""},
-#line 66 "RegisteredHeadersHash.gperf"
+#line 64 "RegisteredHeadersHash.gperf"
     {"Link", Http::HdrType::LINK, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::EntityHeader},
     {""}, {""}, {""}, {""},
-#line 80 "RegisteredHeadersHash.gperf"
+#line 78 "RegisteredHeadersHash.gperf"
     {"Range", Http::HdrType::RANGE, Http::HdrFieldType::ftPRange, HdrKind::RequestHeader},
-#line 49 "RegisteredHeadersHash.gperf"
+#line 47 "RegisteredHeadersHash.gperf"
     {"Cookie", Http::HdrType::COOKIE, Http::HdrFieldType::ftStr, HdrKind::None},
-#line 31 "RegisteredHeadersHash.gperf"
+#line 29 "RegisteredHeadersHash.gperf"
     {"Age", Http::HdrType::AGE, Http::HdrFieldType::ftInt, HdrKind::ReplyHeader},
     {""}, {""},
-#line 51 "RegisteredHeadersHash.gperf"
+#line 49 "RegisteredHeadersHash.gperf"
     {"Date", Http::HdrType::DATE, Http::HdrFieldType::ftDate_1123, HdrKind::GeneralHeader},
-#line 88 "RegisteredHeadersHash.gperf"
+#line 86 "RegisteredHeadersHash.gperf"
     {"Title", Http::HdrType::TITLE, Http::HdrFieldType::ftStr, HdrKind::None},
-#line 39 "RegisteredHeadersHash.gperf"
+#line 37 "RegisteredHeadersHash.gperf"
     {"Connection", Http::HdrType::CONNECTION, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::GeneralHeader|HdrKind::HopByHopHeader},
-#line 111 "RegisteredHeadersHash.gperf"
+#line 109 "RegisteredHeadersHash.gperf"
     {"Other:", Http::HdrType::OTHER, Http::HdrFieldType::ftStr, HdrKind::EntityHeader},
     {""},
-#line 61 "RegisteredHeadersHash.gperf"
+#line 59 "RegisteredHeadersHash.gperf"
     {"If-Range", Http::HdrType::IF_RANGE, Http::HdrFieldType::ftDate_1123_or_ETag, HdrKind::None},
-#line 57 "RegisteredHeadersHash.gperf"
+#line 55 "RegisteredHeadersHash.gperf"
     {"Host", Http::HdrType::HOST, Http::HdrFieldType::ftStr, HdrKind::RequestHeader},
-#line 38 "RegisteredHeadersHash.gperf"
+#line 36 "RegisteredHeadersHash.gperf"
     {"CDN-Loop", Http::HdrType::CDN_LOOP, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::RequestHeader},
-#line 77 "RegisteredHeadersHash.gperf"
+#line 75 "RegisteredHeadersHash.gperf"
     {"Proxy-Connection", Http::HdrType::PROXY_CONNECTION, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::GeneralHeader|HdrKind::HopByHopHeader},
-#line 58 "RegisteredHeadersHash.gperf"
+#line 56 "RegisteredHeadersHash.gperf"
     {"If-Match", Http::HdrType::IF_MATCH, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::RequestHeader},
-#line 108 "RegisteredHeadersHash.gperf"
+#line 106 "RegisteredHeadersHash.gperf"
     {"FTP-Pre", Http::HdrType::FTP_PRE, Http::HdrFieldType::ftStr, HdrKind::None},
-#line 53 "RegisteredHeadersHash.gperf"
+#line 51 "RegisteredHeadersHash.gperf"
     {"Expect", Http::HdrType::EXPECT, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::RequestHeader},
-#line 94 "RegisteredHeadersHash.gperf"
+#line 92 "RegisteredHeadersHash.gperf"
     {"User-Agent", Http::HdrType::USER_AGENT, Http::HdrFieldType::ftStr, HdrKind::RequestHeader},
-#line 50 "RegisteredHeadersHash.gperf"
-    {"Cookie2", Http::HdrType::COOKIE2, Http::HdrFieldType::ftStr, HdrKind::None},
 #line 48 "RegisteredHeadersHash.gperf"
+    {"Cookie2", Http::HdrType::COOKIE2, Http::HdrFieldType::ftStr, HdrKind::None},
+#line 46 "RegisteredHeadersHash.gperf"
     {"Content-Type", Http::HdrType::CONTENT_TYPE, Http::HdrFieldType::ftStr, HdrKind::EntityHeader},
-#line 110 "RegisteredHeadersHash.gperf"
+#line 108 "RegisteredHeadersHash.gperf"
     {"FTP-Reason", Http::HdrType::FTP_REASON, Http::HdrFieldType::ftStr, HdrKind::None},
-#line 54 "RegisteredHeadersHash.gperf"
+#line 52 "RegisteredHeadersHash.gperf"
     {"Expires", Http::HdrType::EXPIRES, Http::HdrFieldType::ftDate_1123, HdrKind::EntityHeader},
-#line 76 "RegisteredHeadersHash.gperf"
+#line 74 "RegisteredHeadersHash.gperf"
     {"Proxy-Authorization", Http::HdrType::PROXY_AUTHORIZATION, Http::HdrFieldType::ftStr, HdrKind::RequestHeader|HdrKind::HopByHopHeader},
-#line 67 "RegisteredHeadersHash.gperf"
+#line 65 "RegisteredHeadersHash.gperf"
     {"Location", Http::HdrType::LOCATION, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader},
-#line 64 "RegisteredHeadersHash.gperf"
+#line 62 "RegisteredHeadersHash.gperf"
     {"Key", Http::HdrType::KEY, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::ReplyHeader},
-#line 74 "RegisteredHeadersHash.gperf"
+#line 72 "RegisteredHeadersHash.gperf"
     {"Proxy-Authenticate", Http::HdrType::PROXY_AUTHENTICATE, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader},
-#line 102 "RegisteredHeadersHash.gperf"
+#line 100 "RegisteredHeadersHash.gperf"
     {"X-Next-Services", Http::HdrType::X_NEXT_SERVICES, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::ReplyHeader},
-#line 26 "RegisteredHeadersHash.gperf"
+#line 24 "RegisteredHeadersHash.gperf"
     {"Accept", Http::HdrType::ACCEPT, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::RequestHeader},
-#line 75 "RegisteredHeadersHash.gperf"
+#line 73 "RegisteredHeadersHash.gperf"
     {"Proxy-Authentication-Info", Http::HdrType::PROXY_AUTHENTICATION_INFO, Http::HdrFieldType::ftStr, HdrKind::ListHeader},
-#line 78 "RegisteredHeadersHash.gperf"
+#line 76 "RegisteredHeadersHash.gperf"
     {"Proxy-support", Http::HdrType::PROXY_SUPPORT, Http::HdrFieldType::ftStr, HdrKind::ListHeader},
-#line 96 "RegisteredHeadersHash.gperf"
+#line 94 "RegisteredHeadersHash.gperf"
     {"Via", Http::HdrType::VIA, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::GeneralHeader},
-#line 95 "RegisteredHeadersHash.gperf"
+#line 93 "RegisteredHeadersHash.gperf"
     {"Vary", Http::HdrType::VARY, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::ReplyHeader},
-#line 91 "RegisteredHeadersHash.gperf"
+#line 89 "RegisteredHeadersHash.gperf"
     {"Translate", Http::HdrType::TRANSLATE, Http::HdrFieldType::ftStr, HdrKind::None},
-#line 72 "RegisteredHeadersHash.gperf"
+#line 70 "RegisteredHeadersHash.gperf"
     {"Pragma", Http::HdrType::PRAGMA, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::GeneralHeader},
-#line 35 "RegisteredHeadersHash.gperf"
+#line 33 "RegisteredHeadersHash.gperf"
     {"Authorization", Http::HdrType::AUTHORIZATION, Http::HdrFieldType::ftStr, HdrKind::RequestHeader},
-#line 47 "RegisteredHeadersHash.gperf"
+#line 45 "RegisteredHeadersHash.gperf"
     {"Content-Range", Http::HdrType::CONTENT_RANGE, Http::HdrFieldType::ftPContRange, HdrKind::EntityHeader},
-#line 41 "RegisteredHeadersHash.gperf"
+#line 39 "RegisteredHeadersHash.gperf"
     {"Content-Disposition", Http::HdrType::CONTENT_DISPOSITION, Http::HdrFieldType::ftStr, HdrKind::None},
-#line 89 "RegisteredHeadersHash.gperf"
+#line 87 "RegisteredHeadersHash.gperf"
     {"Trailer", Http::HdrType::TRAILER, Http::HdrFieldType::ftStr, HdrKind::HopByHopHeader},
-#line 68 "RegisteredHeadersHash.gperf"
+#line 66 "RegisteredHeadersHash.gperf"
     {"Max-Forwards", Http::HdrType::MAX_FORWARDS, Http::HdrFieldType::ftInt64, HdrKind::RequestHeader},
-#line 84 "RegisteredHeadersHash.gperf"
+#line 82 "RegisteredHeadersHash.gperf"
     {"Server", Http::HdrType::SERVER, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader},
-#line 93 "RegisteredHeadersHash.gperf"
+#line 91 "RegisteredHeadersHash.gperf"
     {"Upgrade", Http::HdrType::UPGRADE, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::GeneralHeader|HdrKind::HopByHopHeader},
-#line 83 "RegisteredHeadersHash.gperf"
+#line 81 "RegisteredHeadersHash.gperf"
     {"Retry-After", Http::HdrType::RETRY_AFTER, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader},
-#line 105 "RegisteredHeadersHash.gperf"
+#line 103 "RegisteredHeadersHash.gperf"
     {"Front-End-Https", Http::HdrType::FRONT_END_HTTPS, Http::HdrFieldType::ftStr, HdrKind::None},
-#line 71 "RegisteredHeadersHash.gperf"
+#line 69 "RegisteredHeadersHash.gperf"
     {"Origin", Http::HdrType::ORIGIN, Http::HdrFieldType::ftStr, HdrKind::RequestHeader},
-#line 45 "RegisteredHeadersHash.gperf"
+#line 43 "RegisteredHeadersHash.gperf"
     {"Content-Location", Http::HdrType::CONTENT_LOCATION, Http::HdrFieldType::ftStr, HdrKind::EntityHeader},
-#line 100 "RegisteredHeadersHash.gperf"
+#line 98 "RegisteredHeadersHash.gperf"
     {"X-Squid-Error", Http::HdrType::X_SQUID_ERROR, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader},
-#line 34 "RegisteredHeadersHash.gperf"
+#line 32 "RegisteredHeadersHash.gperf"
     {"Authentication-Info", Http::HdrType::AUTHENTICATION_INFO, Http::HdrFieldType::ftStr, HdrKind::ListHeader},
-#line 81 "RegisteredHeadersHash.gperf"
+#line 79 "RegisteredHeadersHash.gperf"
     {"Referer", Http::HdrType::REFERER, Http::HdrFieldType::ftStr, HdrKind::RequestHeader},
-#line 43 "RegisteredHeadersHash.gperf"
+#line 41 "RegisteredHeadersHash.gperf"
     {"Content-Language", Http::HdrType::CONTENT_LANGUAGE, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::EntityHeader},
-#line 27 "RegisteredHeadersHash.gperf"
+#line 25 "RegisteredHeadersHash.gperf"
     {"Accept-Charset", Http::HdrType::ACCEPT_CHARSET, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::RequestHeader},
-#line 44 "RegisteredHeadersHash.gperf"
+#line 42 "RegisteredHeadersHash.gperf"
     {"Content-Length", Http::HdrType::CONTENT_LENGTH, Http::HdrFieldType::ftInt64, HdrKind::EntityHeader},
-#line 52 "RegisteredHeadersHash.gperf"
+#line 50 "RegisteredHeadersHash.gperf"
     {"ETag", Http::HdrType::ETAG, Http::HdrFieldType::ftETag, HdrKind::EntityHeader},
-#line 70 "RegisteredHeadersHash.gperf"
+#line 68 "RegisteredHeadersHash.gperf"
     {"Negotiate", Http::HdrType::NEGOTIATE, Http::HdrFieldType::ftStr, HdrKind::None},
-#line 92 "RegisteredHeadersHash.gperf"
+#line 90 "RegisteredHeadersHash.gperf"
     {"Unless-Modified-Since", Http::HdrType::UNLESS_MODIFIED_SINCE, Http::HdrFieldType::ftStr, HdrKind::None},
-#line 56 "RegisteredHeadersHash.gperf"
+#line 54 "RegisteredHeadersHash.gperf"
     {"From", Http::HdrType::FROM, Http::HdrFieldType::ftStr, HdrKind::RequestHeader},
-#line 42 "RegisteredHeadersHash.gperf"
+#line 40 "RegisteredHeadersHash.gperf"
     {"Content-Encoding", Http::HdrType::CONTENT_ENCODING, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::EntityHeader},
-#line 33 "RegisteredHeadersHash.gperf"
+#line 31 "RegisteredHeadersHash.gperf"
     {"Alternate-Protocol", Http::HdrType::ALTERNATE_PROTOCOL, Http::HdrFieldType::ftStr, HdrKind::HopByHopHeader},
-#line 103 "RegisteredHeadersHash.gperf"
+#line 101 "RegisteredHeadersHash.gperf"
     {"Surrogate-Capability", Http::HdrType::SURROGATE_CAPABILITY, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::RequestHeader},
-#line 29 "RegisteredHeadersHash.gperf"
+#line 27 "RegisteredHeadersHash.gperf"
     {"Accept-Language", Http::HdrType::ACCEPT_LANGUAGE, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::RequestHeader},
-#line 106 "RegisteredHeadersHash.gperf"
+#line 104 "RegisteredHeadersHash.gperf"
     {"FTP-Command", Http::HdrType::FTP_COMMAND, Http::HdrFieldType::ftStr, HdrKind::None},
-#line 73 "RegisteredHeadersHash.gperf"
+#line 71 "RegisteredHeadersHash.gperf"
     {"Priority", Http::HdrType::PRIORITY, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::GeneralHeader},
-#line 37 "RegisteredHeadersHash.gperf"
+#line 35 "RegisteredHeadersHash.gperf"
     {"Cache-Status", Http::HdrType::CACHE_STATUS, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::ReplyHeader},
-#line 30 "RegisteredHeadersHash.gperf"
+#line 28 "RegisteredHeadersHash.gperf"
     {"Accept-Ranges", Http::HdrType::ACCEPT_RANGES, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::ReplyHeader},
-#line 85 "RegisteredHeadersHash.gperf"
+#line 83 "RegisteredHeadersHash.gperf"
     {"Set-Cookie", Http::HdrType::SET_COOKIE, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader},
-#line 63 "RegisteredHeadersHash.gperf"
+#line 61 "RegisteredHeadersHash.gperf"
     {"Keep-Alive", Http::HdrType::KEEP_ALIVE, Http::HdrFieldType::ftStr, HdrKind::HopByHopHeader},
-#line 36 "RegisteredHeadersHash.gperf"
+#line 34 "RegisteredHeadersHash.gperf"
     {"Cache-Control", Http::HdrType::CACHE_CONTROL, Http::HdrFieldType::ftPCc, HdrKind::ListHeader|HdrKind::GeneralHeader},
-#line 97 "RegisteredHeadersHash.gperf"
+#line 95 "RegisteredHeadersHash.gperf"
     {"WWW-Authenticate", Http::HdrType::WWW_AUTHENTICATE, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::ReplyHeader},
-#line 55 "RegisteredHeadersHash.gperf"
+#line 53 "RegisteredHeadersHash.gperf"
     {"Forwarded", Http::HdrType::FORWARDED, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::GeneralHeader},
-#line 40 "RegisteredHeadersHash.gperf"
+#line 38 "RegisteredHeadersHash.gperf"
     {"Content-Base", Http::HdrType::CONTENT_BASE, Http::HdrFieldType::ftStr, HdrKind::EntityHeader},
-#line 101 "RegisteredHeadersHash.gperf"
+#line 99 "RegisteredHeadersHash.gperf"
     {"X-Accelerator-Vary", Http::HdrType::HDR_X_ACCELERATOR_VARY, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::ReplyHeader},
-#line 104 "RegisteredHeadersHash.gperf"
+#line 102 "RegisteredHeadersHash.gperf"
     {"Surrogate-Control", Http::HdrType::SURROGATE_CONTROL, Http::HdrFieldType::ftPSc, HdrKind::ListHeader|HdrKind::ReplyHeader},
-#line 59 "RegisteredHeadersHash.gperf"
+#line 57 "RegisteredHeadersHash.gperf"
     {"If-Modified-Since", Http::HdrType::IF_MODIFIED_SINCE, Http::HdrFieldType::ftDate_1123, HdrKind::RequestHeader},
-#line 32 "RegisteredHeadersHash.gperf"
+#line 30 "RegisteredHeadersHash.gperf"
     {"Allow", Http::HdrType::ALLOW, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::EntityHeader},
-#line 62 "RegisteredHeadersHash.gperf"
+#line 60 "RegisteredHeadersHash.gperf"
     {"If-Unmodified-Since", Http::HdrType::IF_UNMODIFIED_SINCE, Http::HdrFieldType::ftDate_1123, HdrKind::None},
-#line 28 "RegisteredHeadersHash.gperf"
+#line 26 "RegisteredHeadersHash.gperf"
     {"Accept-Encoding", Http::HdrType::ACCEPT_ENCODING, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::RequestHeader|HdrKind::ReplyHeader},
-#line 109 "RegisteredHeadersHash.gperf"
+#line 107 "RegisteredHeadersHash.gperf"
     {"FTP-Status", Http::HdrType::FTP_STATUS, Http::HdrFieldType::ftInt, HdrKind::None},
-#line 79 "RegisteredHeadersHash.gperf"
+#line 77 "RegisteredHeadersHash.gperf"
     {"Public", Http::HdrType::PUBLIC, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader},
-#line 90 "RegisteredHeadersHash.gperf"
+#line 88 "RegisteredHeadersHash.gperf"
     {"Transfer-Encoding", Http::HdrType::TRANSFER_ENCODING, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::GeneralHeader|HdrKind::HopByHopHeader},
-#line 69 "RegisteredHeadersHash.gperf"
+#line 67 "RegisteredHeadersHash.gperf"
     {"Mime-Version", Http::HdrType::MIME_VERSION, Http::HdrFieldType::ftStr, HdrKind::GeneralHeader},
-#line 82 "RegisteredHeadersHash.gperf"
+#line 80 "RegisteredHeadersHash.gperf"
     {"Request-Range", Http::HdrType::REQUEST_RANGE, Http::HdrFieldType::ftPRange, HdrKind::None},
-#line 86 "RegisteredHeadersHash.gperf"
+#line 84 "RegisteredHeadersHash.gperf"
     {"Set-Cookie2", Http::HdrType::SET_COOKIE2, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader},
-#line 98 "RegisteredHeadersHash.gperf"
+#line 96 "RegisteredHeadersHash.gperf"
     {"X-Forwarded-For", Http::HdrType::X_FORWARDED_FOR, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::GeneralHeader},
-#line 46 "RegisteredHeadersHash.gperf"
+#line 44 "RegisteredHeadersHash.gperf"
     {"Content-MD5", Http::HdrType::CONTENT_MD5, Http::HdrFieldType::ftStr, HdrKind::EntityHeader},
-#line 99 "RegisteredHeadersHash.gperf"
+#line 97 "RegisteredHeadersHash.gperf"
     {"X-Request-URI", Http::HdrType::X_REQUEST_URI, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader},
-#line 60 "RegisteredHeadersHash.gperf"
+#line 58 "RegisteredHeadersHash.gperf"
     {"If-None-Match", Http::HdrType::IF_NONE_MATCH, Http::HdrFieldType::ftStr, HdrKind::ListHeader},
-#line 112 "RegisteredHeadersHash.gperf"
+#line 110 "RegisteredHeadersHash.gperf"
     {"*INVALID*:", Http::HdrType::BAD_HDR, Http::HdrFieldType::ftInvalid, HdrKind::None},
-#line 65 "RegisteredHeadersHash.gperf"
+#line 63 "RegisteredHeadersHash.gperf"
     {"Last-Modified", Http::HdrType::LAST_MODIFIED, Http::HdrFieldType::ftDate_1123, HdrKind::EntityHeader},
     {""}, {""}, {""}, {""}, {""},
-#line 107 "RegisteredHeadersHash.gperf"
+#line 105 "RegisteredHeadersHash.gperf"
     {"FTP-Arguments", Http::HdrType::FTP_ARGUMENTS, Http::HdrFieldType::ftStr, HdrKind::None}
 };
 
@@ -373,7 +373,7 @@ const class HeaderTableRecord *
                     return &HttpHeaderDefinitionsTable[key];
             }
     }
-    return nullptr;
+    return 0;
 }
-#line 113 "RegisteredHeadersHash.gperf"
+#line 111 "RegisteredHeadersHash.gperf"
 
index accb39e43da2cb19aa4b3c4cb629fe024c917e05..3cf41372fece2deeb8baa8f0c347f6e9f3c22979 100644 (file)
@@ -1,6 +1,4 @@
 %{
-/* AUTO GENERATED FROM RegisteredHeadersHash.gperf. DO NOT EDIT */
-
 /*
  * Copyright (C) 1996-2022 The Squid Software Foundation and contributors
  *