%begin

{MOCOMP - compare files specified in a file-file in the form
{filename filestorename datestamp timestamp

%externalroutinespec connectfile(%string(255)f,%integer m,%integername s,l)
%recordformat f(%string(31)name,filestore,date,time,
                (%bytename b %or %integer start,size))
%record(f)file1,file2
%string(31)in,out

%predicate equal(%bytename a,b,%integer n)
  %cycle
    %trueif n<=0; n = n-1
    %falseunless a=b; a == a[1]; b == b[1]
  %repeat
%end

%on 9 %start
  %stop
%finish

out = ":" %and in = cliparam %unless cliparam -> in.("/").out
openinput(1,in); selectinput(1)
openoutput(1,out); selectoutput(1)
file1 = 0
%cycle
  file2_size = 0
  read(file2_name;file2_filestore;file2_date;file2_time)
  %if file1_name=file2_name %start
    printstring(file1_name;" : ")
    connectfile(file1_filestore."::".file1_name,0,file1_start,file1_size)-
    %if file1_size=0
    printstring(file1_filestore); printsymbol('-')
    connectfile(file2_filestore."::".file2_name,0,file2_start,file2_size)
    printstring(file2_filestore)
    %if file1_size-file2_size=0 %start
      printstring("=0, files are ")
      %if equal(file1_b,file2_b,file1_size) %start
        printstring("equal")
      %else
        printstring("different")
      %finish
    %elseif file1_size-file2_size>0
      printstring(">0, files are ")
      %if equal(file1_b,file2_b,file2_size) -
      %or equal(file1_b[file1_size-file2_size],file2_b,file2_size) -
      %then printstring("nearly equal") %else printstring("different")
    %else
      printstring("<0, files are ")
      %if equal(file1_b,file2_b,file1_size) -
      %or equal(file1_b,file2_b[file2_size-file1_size],file1_size) -
      %then printstring("nearly equal") %else printstring("different")
    %finish
    newline
  %finish
  dispose(file1_b) %unless file1_size=0
  file1 = file2
%repeat
%end
