HEX
Server: Apache
System: Linux pdx1-shared-a1-38 6.6.104-grsec-jammy+ #3 SMP Tue Sep 16 00:28:11 UTC 2025 x86_64
User: mmickelson (3396398)
PHP: 8.1.31
Disabled: NONE
Upload Files
File: //usr/share/slrn/slang/multipart.sl
% This macro makes use of subject_compare_hook to put multipart binary
% postings into the same thread.
% Contributed by Jurriaan Kalkman <thunder7@xs4all.nl>

% try to determine if two headers belong to the same multipart
% posting. Return 0 if they do, 1 if they don't
%
% we assume headers use a number in [] or in () to tell us what
% part of a multipart-posting this is.
%
% there are three possible header-types we like:
%
% 1) blablabla <part-number>
% 2) blablabla <file-number> blabla <part-number>
% 3) blablabla <part-number> blabla <file-number>
%
define subject_compare_hook ( subject1, subject2)
{
   variable pattern;
   variable pos1, pos2, orgpos1, orgpos2, len1, len2, tmp;

% Do both headers match the template for a multi-part header?
   pattern = "[(\\[][0-9]+/[0-9]+[)\\]]";

   pos1 = string_match(subject1, pattern, 1);
   if (pos1 == 0) return 1;
% junk the position, but keep the length!
   (tmp, len1) = string_match_nth(0);
   orgpos1 = pos1;

   pos2 = string_match(subject2, pattern, 1);
   if (pos2 == 0) return 1;
% junk the position, but keep the length!
   (tmp, len2) = string_match_nth(0);
   orgpos2 = pos2;

% make sure we have the last possible match for hdr1
% 5 is the minimum length from the regexp pattern
   tmp = string_match(subject1, pattern, pos1 + 5);

   while (tmp > 0)
   {
      %pos1 = pos1 + 4 + tmp;
      pos1 = tmp;
      tmp = string_match(subject1, pattern, pos1 + 5);
   }

% make sure we have the last possible match for hdr2
   tmp = string_match(subject2, pattern, pos2 + 5);
   while (tmp > 0)
   {
      %pos2 = pos2 + 4 + tmp;
      pos2 = tmp;
      tmp = string_match(subject2, pattern, pos2 + 5);
   }

% if the part before the matching pattern is the same, they
% belong to the same thread
   if ( 0 == strcmp(substr(subject1, 1, pos1), substr(subject2, 1, pos2)))
   {
      return 0;
   }

% we have handled header-type 1) and 2) until now.
% now if the first parts match
   if ( 0 == strcmp(substr(subject1, 1, orgpos1), substr(subject2, 1, orgpos2)))
   {
% and the parts after them match
      if ( 0 == strcmp(substr(subject1, orgpos1 + len1, -1),
                       substr(subject2, orgpos2 + len2, -1)))
      {
         return 0;
      }
   }

   return 1;
}