#!/usr/bin/perl
#
-## Copyright (C) 1996-2016 The Squid Software Foundation and contributors
+## Copyright (C) 1996-2021 The Squid Software Foundation and contributors
##
## Squid software is distributed under GPLv2+ license and includes
## contributions from numerous individuals and organizations.
#
# Author: Tsantilas Christos
# (C) 2010 The Measurement Factory
-#
-# Usage:
+#
+# Usage:
# calc-must-ids.pl file1 file2 ...
# Compute the ids of Must expressions of the given files.
# It returns one line per Must expression in the form:
}
sub FileNameHash
{
-# Please keep in sync this function with the FileNameHash function in
-# src/base/TextException.cc file
my($name) = @_;
+
+ # Keep in sync with FileNameHash() in src/base/Here.cc!
+
$name =~ s/.*\///g;
my($i) = 0;
my($j) =0;
my($n) = 0;
my(@na) = split(//, $name);
for($j=0; $j < @na; $j++) {
- $n = $n ^ (271 * ord($na[$j]));
+ $n = $n ^ (271 * ord($na[$j]));
}
- $i = $n ^ ($j *271);
-
- # Currently 18bits of a 32 bit integer used for filename hash
- # (max hash=262143), and 14 bits for storing line number
- $i = $i % 262143;
- return $i;
+ return $n ^ ($j *271);
}
sub ComputeMustIds
{
my($file) = @_;
- my($hash) = FileNameHash($file);
+
+ # Keep in sync with SourceLocation::id() in src/base/Here.cc!
+
+ my $fullHash = &FileNameHash($file);
+ my $hash = $fullHash % 0x3FFFF;
+
if(!open(IN, "<$file")) {
printf STDERR "error opening file $file. Ignore ...";
return;
}
while(<IN>) {
my($line) = $_;
+
+ next if $line =~ /^\s*#/; # ignore simple single-line C++ macros
+ $line =~ s@//.*@@; # strip simple // comments
+ $line =~ s@/[*].*?[*]/@@; # strip simple single-line /* comments */
+
my($id);
- if ( $line =~ /^\s*Must\s*\(/ || $line =~ /^\s*throw\s*TexcHere\s*\(/){
+ if ($line =~ /\bMust\s*\(/ || # Must(...)
+ $line =~ /\bTexcHere\s*\(/ || # TexcHere(...)
+ $line =~ /\bHere\s*\(\s*\)/) { # Here()
$line =~ s/^\s*//;
$id= ($hash <<14) | ($. & 0x3FFF);
$id += ERR_DETAIL_EXCEPTION_START;
# print "$file:$.: $id $line";
printf "%s:%d: 0x%X %s", $file, $., $id, $line;
- }
- }
+ }
+ }
close(IN);
}