Patch title: Release 90 bulk changes
Abstract:
File: /protocol/smtp/spam.pli
Key:
    Removed line
    Added line
   
module "/pliant/admin/file.pli"
module "/pliant/language/unsafe.pli"
module "/pliant/language/stream.pli"
module "/pliant/math/functions.pli"
module "/pliant/util/encoding/html.pli"
module "mime.pli"


module "/pliant/admin/file.pli"
module "/pliant/language/unsafe.pli"
module "/pliant/language/stream.pli"
module "/pliant/math/functions.pli"
module "/pliant/util/encoding/html.pli"
module "mime.pli"


function spam_write_dictionary spam nspam mail nmail filter 
  arg Str filename ; arg (Dictionary Str Int) spam ; arg Int
function spam_write_dictionary spam nspam mail nmail filter html_adjust suspicious_adjust unknown_threshold spam_threshold filename
  arg Str filename ; arg (Dictionary Str Int) spam ; arg Int nspam ; arg (Dictionary Str Int) mail ; arg Int nmail ; arg CBool filter ; arg Float html_adjust suspicious_adjust unknown_threshold spam_threshold ; arg Str filename
  var Str w ; var Int fspam fmail
  var (Index Float Str) all
  each c spam
    w := spam key c
    fspam := c
    if exists:(mail first w)
      fmail := mail w
    else
      fmail := 0
    if not spam_shrink_dictionary or (abs 0.5-(probability f
      all insert (probability fspam (max nspam 1) fmail (max
  each c mail
    w := mail key c
    fmail := c
    if not exists:(spam first w)
      fspam := 0
      if not spam_shrink_dictionary or (abs 0.5-(probability
        all insert (probability fspam (max nspam 1) fmail (m
  (var Stream s) open filename out+safe
  var Str w ; var Int fspam fmail
  var (Index Float Str) all
  each c spam
    w := spam key c
    fspam := c
    if exists:(mail first w)
      fmail := mail w
    else
      fmail := 0
    if not spam_shrink_dictionary or (abs 0.5-(probability f
      all insert (probability fspam (max nspam 1) fmail (max
  each c mail
    w := mail key c
    fmail := c
    if not exists:(spam first w)
      fspam := 0
      if not spam_shrink_dictionary or (abs 0.5-(probability
        all insert (probability fspam (max nspam 1) fmail (m
  (var Stream s) open filename out+safe
  s writeline "html_adjust "+string:html_adjust
  s writeline "suspicious_adjust "+string:suspicious_adjust
  s writeline "unknown_threshold "+string:unknown_threshold
  s writeline "spam_threshold "+string:spam_threshold
  each a all
    if exists:(spam first a)
      fspam := spam a
    else
      fspam := 0
    if exists:(mail first a)
      fmail := mail a
    else
      fmail := 0
    s writeline (string (all key a) "fixed 6")+" "+string:a+

  s writeline "unknown_threshold "+string:unknown_threshold
  s writeline "spam_threshold "+string:spam_threshold
  each a all
    if exists:(spam first a)
      fspam := spam a
    else
      fspam := 0
    if exists:(mail first a)
      fmail := mail a
    else
      fmail := 0
    s writeline (string (all key a) "fixed 6")+" "+string:a+

function spam_load_dictionary filename dict unkown_threshold
  arg Str filename ; arg_w (Dictionary Str Float) dict ; arg
function spam_load_dictionary filename dict html_adjust suspicious_adjust unkown_threshold spam_threshold
  arg Str filename ; arg_w (Dictionary Str Float) dict ; arg_w Float html_adjust suspicious_adjust unkown_threshold spam_threshold
  dict := gvar (Dictionary Str Float) empty_dict
  dict := gvar (Dictionary Str Float) empty_dict
  html_adjust := 0.5
  suspicious_adjust := 0.5
  unkown_threshold := 0.5
  spam_threshold := 0.9
  (var Stream s) open filename in+safe
  while not s:atend
    var Str l := s readline
    if (l parse (var Float p) (var Str w) any)
      dict insert w p
  unkown_threshold := 0.5
  spam_threshold := 0.9
  (var Stream s) open filename in+safe
  while not s:atend
    var Str l := s readline
    if (l parse (var Float p) (var Str w) any)
      dict insert w p
    eif (l parse word:"html_adjust" (var Float f))
      html_adjust := f
    eif (l parse word:"suspicious_adjust" (var Float f))
      suspicious_adjust := f
    eif (l parse word:"unknown_threshold" (var Float f))
      unkown_threshold := f
    eif (l parse word:"spam_threshold" (var Float f))
      spam_threshold := f



    eif (l parse word:"unknown_threshold" (var Float f))
      unkown_threshold := f
    eif (l parse word:"spam_threshold" (var Float f))
      spam_threshold := f



function word_count_file filename words
  arg Str filename ; arg_rw (Dictionary Str Int) words
function word_count_file filename words html suspicious
  arg Str filename ; arg_rw (Dictionary Str Int) words ; arg_w CBool html suspicious
  suspicious := false
  var (Dictionary Str Int) w
  (var Stream s) open filename in+safe
  (var MimeStream ms) bind s true
  while (ms header_line (var Str l))
    if (l parse any:(var Str id) ":" any:(var Str value))
  var (Dictionary Str Int) w
  (var Stream s) open filename in+safe
  (var MimeStream ms) bind s true
  while (ms header_line (var Str l))
    if (l parse any:(var Str id) ":" any:(var Str value))
      ms_decode value
      word_count_line lower:id+" " id+": "+value w
      if id="Suspicious"
        suspicious := true
      else
        ms_decode value
        word_count_line lower:id+" " id+": "+value w
  html := ms:mime="text/html"
  suspicious := false
  while (ms body_line2 l)
    word_count_line "" l w
  if ms:multipart
    while not s:atend
      ms bind s false
      while (ms header_line l)
        if (l parse any:(var Str id) ":" any:(var Str value)
          ms_decode value
          word_count_line lower:id+" " id+": "+value w
  while (ms body_line2 l)
    word_count_line "" l w
  if ms:multipart
    while not s:atend
      ms bind s false
      while (ms header_line l)
        if (l parse any:(var Str id) ":" any:(var Str value)
          ms_decode value
          word_count_line lower:id+" " id+": "+value w
      if ms:mime="text/html"
        html := true
      if ms:mime="text/html" or ms:mime="text/plain"
        while (ms body_line2 l)
          word_count_line "" l w
      else
        while (ms body_line l)
          void
  each p w
    var Str word := w key p
    var Pointer:Int c :> words first word
    if not exists:c
      word_shrink words
      words insert word 0
      c :> words first word
    c += 1

      if ms:mime="text/html" or ms:mime="text/plain"
        while (ms body_line2 l)
          word_count_line "" l w
      else
        while (ms body_line l)
          void
  each p w
    var Str word := w key p
    var Pointer:Int c :> words first word
    if not exists:c
      word_shrink words
      words insert word 0
      c :> words first word
    c += 1

function spam_study path since unknown_threshold spam_thresh
  arg Array:Str path ; arg DateTime since ; arg Float unknow
function spam_study path since html_adjust suspicious_adjust unknown_threshold spam_threshold list
  arg Array:Str path ; arg DateTime since ; arg Float html_adjust suspicious_adjust unknown_threshold spam_threshold ; arg Str list
  var (Dictionary Str Int) spam_s ; var Int nspam := 0
  var (Dictionary Str Int) mail_words ; var Int nmail := 0
  var Int count := 0
  for (var Int p) 0 path:size-1
    var Array:FileInfo files := file_list path:p standard+re
    for (var Int i) 0 files:size-1
      if files:i:datetime>=since
        count += 1
  var Int current := 0
  for (var Int p) 0 path:size-1
    var Array:FileInfo files := file_list path:p standard+re
    for (var Int i) 0 files:size-1
      if files:i:datetime>=since
        current += 1
        part study "set mail filter "+string:current+"/"+str
          var Pointer:(Dictionary Str Int) words
          (var Stream s) open files:i:name in+safe
          if (s:readline parse word:"spam" any)
  var (Dictionary Str Int) spam_s ; var Int nspam := 0
  var (Dictionary Str Int) mail_words ; var Int nmail := 0
  var Int count := 0
  for (var Int p) 0 path:size-1
    var Array:FileInfo files := file_list path:p standard+re
    for (var Int i) 0 files:size-1
      if files:i:datetime>=since
        count += 1
  var Int current := 0
  for (var Int p) 0 path:size-1
    var Array:FileInfo files := file_list path:p standard+re
    for (var Int i) 0 files:size-1
      if files:i:datetime>=since
        current += 1
        part study "set mail filter "+string:current+"/"+str
          var Pointer:(Dictionary Str Int) words
          (var Stream s) open files:i:name in+safe
          if (s:readline parse word:"spam" any)
            word_count_file files:i:name spam_s ; nspam += 1
            word_count_file files:i:name spam_s (var CBool html) (var CBool suspicious) ; nspam += 1
          else
          else
            word_count_file files:i:name mail_words ; nmail 
  spam_write_dictionary spam_s nspam mail_words nmail false 
            word_count_file files:i:name mail_words (var CBool html) (var CBool suspicious) ; nmail += 1
  spam_write_dictionary spam_s nspam mail_words nmail false html_adjust suspicious_adjust unknown_threshold spam_threshold list




function spam_filter filename words report -> spam
  arg Str filename ; arg (Dictionary Str Float) words ; arg_
  word_count_file filename (var (Dictionary Str Int) mw)
function spam_filter filename words html_adjust suspicious_adjust report -> spam
  arg Str filename ; arg (Dictionary Str Float) words ; arg Float html_adjust suspicious_adjust ; arg_w Str report ; arg Float spam
  word_count_file filename (var (Dictionary Str Int) mw) (var CBool html) (var CBool suspicious)
  var (Index Float Str) sorted
  each c mw
    var Str w := mw key c
    if exists:(words first w)
      var Float p := words w
      sorted insert -(abs 0.5-p) (string p "fixed 6")+" "+st
  spam := 0 ; var Int n := 0 ; var Float last := -1
  var (Index Float Str) details
  part compute
    each s sorted
      s parse (var Float p) (var Str w) any
      if n>=spam_select_count and (spam_select_fixed or 0.5-
        leave compute
      spam += transform p ; n += 1
      details insert -p s
      last := p
  if n<>0
    spam := reverse spam/n
  else
    spam := 0.5
  var (Index Float Str) sorted
  each c mw
    var Str w := mw key c
    if exists:(words first w)
      var Float p := words w
      sorted insert -(abs 0.5-p) (string p "fixed 6")+" "+st
  spam := 0 ; var Int n := 0 ; var Float last := -1
  var (Index Float Str) details
  part compute
    each s sorted
      s parse (var Float p) (var Str w) any
      if n>=spam_select_count and (spam_select_fixed or 0.5-
        leave compute
      spam += transform p ; n += 1
      details insert -p s
      last := p
  if n<>0
    spam := reverse spam/n
  else
    spam := 0.5
  spam := reverse transform:spam + transform:(shunt html html_adjust 0.5) + transform:(shunt suspicious suspicious_adjust 0.5)
  report := ""
  each d details
    report += d+"[lf]"

function spam_filter filename list -> level # -1 = regular m
  arg Str filename list ; arg Int level
  report := ""
  each d details
    report += d+"[lf]"

function spam_filter filename list -> level # -1 = regular m
  arg Str filename list ; arg Int level
  spam_load_dictionary list (var (Dictionary Str Float) word
  var Float rating := spam_filter filename words (var Str re
  spam_load_dictionary list (var (Dictionary Str Float) words) (var Float html_adjust) (var Float suspicious_adjust) (var Float unknown_threshold) (var Float spam_threshold)
  var Float rating := spam_filter filename words html_adjust suspicious_adjust (var Str report)
  level := shunt rating>spam_threshold 1 rating>unknown_thre



  level := shunt rating>spam_threshold 1 rating>unknown_thre