(*************************************************************************

:Program.    XSum.mod
:Contents.   sums up all bytes in a compressed or uncompressed file
:Author.     Hartmut Goebel [hG]
:Language.   Oberon
:Translator. Amiga Oberon V2.25
:History.    V0.9, 09 Jan 1992 Hartmut Goebel [hG]
:History.    V1.0, 11 Jul 1992 [hG] ·now more Oberon-like :-)
:Date.       11 Jul 1992 15:12:20

*************************************************************************)

MODULE XSum;

IMPORT
  io,
  arg:= Arguments,
  e  := Exec,
  s  := SYSTEM,
  u  := Utility,
  xpk:= XpkMaster;

(* This is a typical read-and-process xpk application. Try it out... XSum a
 * file, then compress it and XSum it again. The result should be the same.
 *)

VAR
  OutBuf: POINTER TO ARRAY MAX(LONGINT)-1 OF CHAR;
  OutLen, OutBufLen, i: LONGINT;
  Sum: LONGINT;
  Arg: e.STRING;
  ErrBuf: ARRAY xpk.errMsgSize+1 OF CHAR;


PROCEDURE End(text: ARRAY OF CHAR);
BEGIN
  io.WriteString(text); io.WriteLn;
  HALT(10);
END End;

BEGIN
  Sum := 0; i := 0;

  IF arg.NumArgs() # 1 THEN End("Usage: XSum <filename>"); END;
  arg.GetArg(1,Arg);

  IF 0 # xpk.UnpackTags(
           xpk.inName,      s.ADR(Arg),      (* The file name to be read              *)
           xpk.getError,    s.ADR(ErrBuf),   (* A pointer to the error message buffer *)
           xpk.getOutBuf,   s.ADR(OutBuf),   (* Sets a pointer to the output buffer   *)
           xpk.getOutLen,   s.ADR(OutLen),   (* Sets the number of bytes written      *)
           xpk.getOutBufLen,s.ADR(OutBufLen),(* Sets the length of the output buffer  *)
           xpk.passThru,    e.true,          (* Will pass through uncompressed data   *)
           u.done)
  THEN End(ErrBuf); END;

  REPEAT
    INC(Sum,ORD(OutBuf[i]));
    INC(i);
  UNTIL i = OutLen;
  io.WriteInt(Sum,0); io.WriteLn;

CLOSE
  IF OutBuf # NIL THEN e.FreeMem(OutBuf,OutBufLen); END;

END XSum.

