{Routines to read NEWS.SEEN files}

{Richard M. Marshall 13-February-85}

%external %string (255) Copyright %alias "NEWS_SEEN_(C)_RMM_85" = -
   "Copyright (C) 1985 Richard M. Marshall"

%include "News.Inc"
%include "Inc:util.Imp"

{-READ SEEN FILE-}

%external %record (Seen fm) %map Read Seen File (%string (255) File Name)

   {RUBBISH}

   %routine Rubbish
      Close Input
      %signal 15, 0, 0, "Not a valid NEWS.SEEN"
   %end {Rubbish}

   {READ TOPIC}

   %routine Read Topic (%string (255) %name T)
      %byte Ch

      T = ""
      %cycle
         Ch = Next Symbol
         %exit %if Ch = ':' %or -
                   Ch = '!'
         %unless 'A' <= Ch <= 'Z' %or -
                 Ch = '.' %or -
                 Ch = '_' %start
            Rubbish
         %finish
         Skip Symbol
         T = T . To String (Ch)
      %repeat
   %end {Read Topic}

   {READ RANGES}

   %record (Range fm) %map Read Ranges
      %record (Range fm) Range Pattern
      %record (Range fm) %name Head Range == Nil,
                               Last Range,
                               Current Range

      %on 4 %start
         Rubbish
      %finish

      %cycle
         Current Range == New (Range Pattern)
         Read (Current Range_From)
         %if Next Symbol = '-' %start
            Skip Symbol             {minus}
            Read (Current Range_To)
         %else
            Current Range_To = Current Range_From
         %finish
         Current Range_Next == Nil
         %if Head Range == Nil %start
            Head Range == Current Range
            Last Range == Current Range
         %else
            Last Range_Next == Current Range
         %finish
         Last Range == Current Range
         %if Next Symbol = NL %start
            %exit
         %else %if Next Symbol = ','
            Skip Symbol          {comma}
            Skip Symbol %if Next Symbol = ' '
         %else
            Rubbish
         %finish
      %repeat
      %result == Head Range
   %end {Read Ranges}

   {-MAIN CODE OF READ SEEN FILE-}

   %record (Seen fm) Seen Pattern
   %record (Seen fm) %name Head Topic == Nil,
                           Last Topic,
                           Current Topic
   %string (255) Topic Name
   %byte Subs

   %on 9 %start
      Close Input
      %result == Head Topic
   %finish

   Open Input (Seen Stream, File Name)
   Select Input (Seen Stream)
   %cycle
      Read Topic (Topic Name)
      Read Symbol (Subs)
      Current Topic == New (Seen Pattern)
      Current Topic_Topic = Topic Name
      %if Subs = '!' %start
         Current Topic_Subscribed = No
      %else
         Current Topic_Subscribed = Yes
      %finish
      Current Topic_Ranges == Read Ranges
      Current Topic_Next == Nil
      Skip Symbol       {the NL}
      %if Head Topic == Nil %start
         Head Topic == Current Topic
         Last Topic == Current Topic
         Current Topic_Last == Nil
      %else
         Last Topic_Next == Current Topic
         Current Topic_Last == Last Topic
      %finish
      Last Topic == Current Topic
   %repeat
%end {Load Seen File}

%end %of %file
